cancan-microstack 0.0.1__py3-none-any.whl

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 (440) hide show
  1. cancan_microstack/__init__.py +14 -0
  2. cancan_microstack/__version__.py +10 -0
  3. cancan_microstack/assets/__init__.py +6 -0
  4. cancan_microstack/assets/builds/caddy/Caddyfile +187 -0
  5. cancan_microstack/assets/builds/caddy/DEPLOYMENT.md +303 -0
  6. cancan_microstack/assets/builds/caddy/Dockerfile +46 -0
  7. cancan_microstack/assets/builds/caddy/README.md +343 -0
  8. cancan_microstack/assets/builds/caddy/geoip/README.md +5 -0
  9. cancan_microstack/assets/builds/caddy/start.sh +78 -0
  10. cancan_microstack/assets/builds/caddy/waf/coraza.conf +179 -0
  11. cancan_microstack/assets/builds/service/Dockerfile +59 -0
  12. cancan_microstack/assets/builds/service/README.md +13 -0
  13. cancan_microstack/assets/ddl/create_db.sql +22 -0
  14. cancan_microstack/assets/ddl/infra/execution_log_tbl.sql +46 -0
  15. cancan_microstack/assets/ddl/infra/node_instance_tbl.sql +56 -0
  16. cancan_microstack/assets/ddl/infra/service_action_log_tbl.sql +36 -0
  17. cancan_microstack/assets/ddl/infra/service_config_tbl.sql +26 -0
  18. cancan_microstack/assets/ddl/infra/service_info_tbl.sql +45 -0
  19. cancan_microstack/assets/ddl/infra/service_instance_tbl.sql +54 -0
  20. cancan_microstack/assets/ddl/infra/service_operation_tbl.sql +47 -0
  21. cancan_microstack/assets/ddl/infra/workflow_definition_tbl.sql +60 -0
  22. cancan_microstack/assets/ddl/infra/workflow_definition_version_tbl.sql +35 -0
  23. cancan_microstack/assets/ddl/infra/workflow_engine_alert_tbl.sql +34 -0
  24. cancan_microstack/assets/ddl/infra/workflow_run_tbl.sql +52 -0
  25. cancan_microstack/assets/ddl/ops/admin_user_tbl.sql +34 -0
  26. cancan_microstack/assets/ddl/ops/caddy_access_log_tbl.sql +91 -0
  27. cancan_microstack/assets/ddl/ops/caddy_certificate_tbl.sql +59 -0
  28. cancan_microstack/assets/ddl/ops/caddy_rate_limit_tbl.sql +64 -0
  29. cancan_microstack/assets/ddl/ops/caddy_route_tbl.sql +63 -0
  30. cancan_microstack/assets/ddl/ops/caddy_stats_tbl.sql +77 -0
  31. cancan_microstack/assets/ddl/trigger.sql +21 -0
  32. cancan_microstack/assets/docker/docker-compose.infra.yml +401 -0
  33. cancan_microstack/assets/scripts/README.md +195 -0
  34. cancan_microstack/assets/scripts/docker/build_images.sh +44 -0
  35. cancan_microstack/assets/scripts/docker/force_rebuild_images.sh +38 -0
  36. cancan_microstack/assets/scripts/docker/rebuild_all.sh +34 -0
  37. cancan_microstack/assets/scripts/docker/rebuild_compose.sh +61 -0
  38. cancan_microstack/assets/scripts/docker/restart.sh +35 -0
  39. cancan_microstack/assets/scripts/docker/restart_compose.sh +35 -0
  40. cancan_microstack/assets/scripts/docker/start.sh +78 -0
  41. cancan_microstack/assets/scripts/docker/start_all.sh +46 -0
  42. cancan_microstack/assets/scripts/docker/start_compose.sh +66 -0
  43. cancan_microstack/assets/scripts/docker/stop.sh +67 -0
  44. cancan_microstack/assets/scripts/docker/stop_all.sh +38 -0
  45. cancan_microstack/assets/scripts/docker/stop_compose.sh +38 -0
  46. cancan_microstack/assets/scripts/podman/build_images_podman.sh +59 -0
  47. cancan_microstack/assets/scripts/podman/cleanup_podman.sh +25 -0
  48. cancan_microstack/assets/scripts/podman/force_rebuild_images_podman.sh +56 -0
  49. cancan_microstack/assets/scripts/podman/rebuild_all_podman.sh +37 -0
  50. cancan_microstack/assets/scripts/podman/rebuild_compose_podman.sh +60 -0
  51. cancan_microstack/assets/scripts/podman/restart_compose_podman.sh +73 -0
  52. cancan_microstack/assets/scripts/podman/start_all_podman.sh +66 -0
  53. cancan_microstack/assets/scripts/podman/start_compose_podman.sh +80 -0
  54. cancan_microstack/assets/scripts/podman/start_podman.sh +91 -0
  55. cancan_microstack/assets/scripts/podman/stop.sh +73 -0
  56. cancan_microstack/assets/scripts/podman/stop_all_podman.sh +34 -0
  57. cancan_microstack/assets/scripts/podman/stop_compose_podman.sh +58 -0
  58. cancan_microstack/assets/scripts/start_controllersrv.sh +9 -0
  59. cancan_microstack/assets/scripts/utils/check_all_db_tables.sh +104 -0
  60. cancan_microstack/assets/scripts/utils/check_env.sh +177 -0
  61. cancan_microstack/assets/scripts/utils/check_service_management_deployment.sh +225 -0
  62. cancan_microstack/assets/scripts/utils/deploy_service_management.sh +176 -0
  63. cancan_microstack/assets/scripts/utils/force_reload_infrasrv.sh +52 -0
  64. cancan_microstack/assets/scripts/utils/monitor_service_management.sh +187 -0
  65. cancan_microstack/assets/scripts/utils/reset_postgres_volume.sh +68 -0
  66. cancan_microstack/assets/scripts/utils/test_async_operations.sh +141 -0
  67. cancan_microstack/assets/scripts/utils/verify_real_operations.sh +76 -0
  68. cancan_microstack/assets/service/Dockerfile +65 -0
  69. cancan_microstack/assets/www/adminops/assets/AppEmpty.vue_vue_type_script_setup_true_lang-BOKUurnM.js +1 -0
  70. cancan_microstack/assets/www/adminops/assets/ConfigManage-DKV5YOUz.js +1 -0
  71. cancan_microstack/assets/www/adminops/assets/ConfigManage-Y5bhy7wG.css +1 -0
  72. cancan_microstack/assets/www/adminops/assets/ConsoleManage-8ljYvCW2.js +1 -0
  73. cancan_microstack/assets/www/adminops/assets/ConsoleManage-BWpyqbuQ.css +1 -0
  74. cancan_microstack/assets/www/adminops/assets/DashboardNew-B9Nf1OPl.js +1 -0
  75. cancan_microstack/assets/www/adminops/assets/DashboardNew-DYWZKQ1V.css +1 -0
  76. cancan_microstack/assets/www/adminops/assets/LogSearch-CA0Jhe78.js +1 -0
  77. cancan_microstack/assets/www/adminops/assets/LogSearch-CCZfTNPF.css +1 -0
  78. cancan_microstack/assets/www/adminops/assets/LoginView-BId3kP3M.css +1 -0
  79. cancan_microstack/assets/www/adminops/assets/LoginView-BQZTV_Qy.js +1 -0
  80. cancan_microstack/assets/www/adminops/assets/OperationProgressDialog-BdEYwqFq.js +1 -0
  81. cancan_microstack/assets/www/adminops/assets/OperationProgressDialog-D-pASR8G.css +1 -0
  82. cancan_microstack/assets/www/adminops/assets/PageContainer-Byss-yUC.js +1 -0
  83. cancan_microstack/assets/www/adminops/assets/PageContainer-C3nSZwM7.css +1 -0
  84. cancan_microstack/assets/www/adminops/assets/RateLimitManage-BDI8jLpC.css +1 -0
  85. cancan_microstack/assets/www/adminops/assets/RateLimitManage-DJY4NiF-.js +1 -0
  86. cancan_microstack/assets/www/adminops/assets/RouteManage-DaUQ4QLw.css +1 -0
  87. cancan_microstack/assets/www/adminops/assets/RouteManage-w9XCU0UA.js +1 -0
  88. cancan_microstack/assets/www/adminops/assets/ServiceCard-BFzHe6Tw.css +1 -0
  89. cancan_microstack/assets/www/adminops/assets/ServiceCard-BJUhWnA-.js +1 -0
  90. cancan_microstack/assets/www/adminops/assets/ServiceDetail-Cw24WuKp.js +1 -0
  91. cancan_microstack/assets/www/adminops/assets/ServiceDetail-Yum47zdB.css +1 -0
  92. cancan_microstack/assets/www/adminops/assets/ServiceList-C7ryvbhE.js +1 -0
  93. cancan_microstack/assets/www/adminops/assets/ServiceList-Cgd01fUx.css +1 -0
  94. cancan_microstack/assets/www/adminops/assets/ServiceLogs-COpG9H0h.js +1 -0
  95. cancan_microstack/assets/www/adminops/assets/ServiceLogs-H_Alq0cf.css +1 -0
  96. cancan_microstack/assets/www/adminops/assets/StatsOverview-D0TwMQkA.js +39 -0
  97. cancan_microstack/assets/www/adminops/assets/StatsOverview-lqAN6pqM.css +1 -0
  98. cancan_microstack/assets/www/adminops/assets/TotpBindView-CWlAmzFt.js +1 -0
  99. cancan_microstack/assets/www/adminops/assets/TotpBindView-HoQC1lhx.css +1 -0
  100. cancan_microstack/assets/www/adminops/assets/TotpVerifyView-BHN1VtX1.css +1 -0
  101. cancan_microstack/assets/www/adminops/assets/TotpVerifyView-D3w_lZk8.js +1 -0
  102. cancan_microstack/assets/www/adminops/assets/WorkflowCenter-DU_mpIA0.css +1 -0
  103. cancan_microstack/assets/www/adminops/assets/WorkflowCenter-i50rZyxN.js +1 -0
  104. cancan_microstack/assets/www/adminops/assets/WorkflowDesigner-CnHokPL9.js +1 -0
  105. cancan_microstack/assets/www/adminops/assets/WorkflowDesigner-DaZaZpLd.css +1 -0
  106. cancan_microstack/assets/www/adminops/assets/WorkflowRuns-B09hK48c.js +1 -0
  107. cancan_microstack/assets/www/adminops/assets/WorkflowRuns-wGutKIIU.css +1 -0
  108. cancan_microstack/assets/www/adminops/assets/caddy-nnCKf8fG.js +1 -0
  109. cancan_microstack/assets/www/adminops/assets/format-Cuzxgna9.js +1 -0
  110. cancan_microstack/assets/www/adminops/assets/index-CiFlm8oc.js +64 -0
  111. cancan_microstack/assets/www/adminops/assets/index-UW0T1Dkc.css +1 -0
  112. cancan_microstack/assets/www/adminops/assets/service-BYlgGPs_.js +1 -0
  113. cancan_microstack/assets/www/adminops/assets/service-operation-6GzLw2Z1.js +1 -0
  114. cancan_microstack/assets/www/adminops/assets/style-CcIXnQ5y.css +1 -0
  115. cancan_microstack/assets/www/adminops/assets/style-lRnStdGu.js +39 -0
  116. cancan_microstack/assets/www/adminops/assets/useDebounce-BRlqfXqf.js +1 -0
  117. cancan_microstack/assets/www/adminops/assets/workflow-CUXs39Ac.js +1 -0
  118. cancan_microstack/assets/www/adminops/index.html +16 -0
  119. cancan_microstack/assets/www/adminops/vite.svg +1 -0
  120. cancan_microstack/cli/__init__.py +14 -0
  121. cancan_microstack/cli/__main__.py +9 -0
  122. cancan_microstack/cli/main.py +552 -0
  123. cancan_microstack/cmd/__init__.py +54 -0
  124. cancan_microstack/cmd/cancan/__init__.py +12 -0
  125. cancan_microstack/cmd/cancan/run.py +395 -0
  126. cancan_microstack/cmd/controllersrv/__init__.py +0 -0
  127. cancan_microstack/cmd/controllersrv/run.py +131 -0
  128. cancan_microstack/cmd/infrasrv/__init__.py +5 -0
  129. cancan_microstack/cmd/infrasrv/run.py +100 -0
  130. cancan_microstack/cmd/opsbffsrv/__init__.py +5 -0
  131. cancan_microstack/cmd/opsbffsrv/run.py +96 -0
  132. cancan_microstack/core/__init__.py +5 -0
  133. cancan_microstack/core/assets.py +123 -0
  134. cancan_microstack/core/compose_builder.py +102 -0
  135. cancan_microstack/core/doctor.py +152 -0
  136. cancan_microstack/core/microstack.py +71 -0
  137. cancan_microstack/core/runner.py +56 -0
  138. cancan_microstack/core/stack_manager.py +186 -0
  139. cancan_microstack/public/__init__.py +7 -0
  140. cancan_microstack/public/api/__init__.py +1 -0
  141. cancan_microstack/public/api/controllersrv_client.py +277 -0
  142. cancan_microstack/public/api/infrasrv_client.py +404 -0
  143. cancan_microstack/public/const/__init__.py +1 -0
  144. cancan_microstack/public/const/action_consts.py +18 -0
  145. cancan_microstack/public/const/app_consts.py +42 -0
  146. cancan_microstack/public/const/caddy_consts.py +22 -0
  147. cancan_microstack/public/const/controllersrv_consts.py +163 -0
  148. cancan_microstack/public/const/docker_consts.py +15 -0
  149. cancan_microstack/public/const/error.py +56 -0
  150. cancan_microstack/public/const/health_consts.py +52 -0
  151. cancan_microstack/public/const/hook_enums.py +56 -0
  152. cancan_microstack/public/const/logging_enums.py +13 -0
  153. cancan_microstack/public/const/metrics_enums.py +36 -0
  154. cancan_microstack/public/const/monitor_enums.py +26 -0
  155. cancan_microstack/public/const/operation_consts.py +53 -0
  156. cancan_microstack/public/const/opsbffsrv_error.py +92 -0
  157. cancan_microstack/public/const/overrides_consts.py +13 -0
  158. cancan_microstack/public/const/redis.py +17 -0
  159. cancan_microstack/public/const/service_consts.py +15 -0
  160. cancan_microstack/public/const/workflow_consts.py +65 -0
  161. cancan_microstack/public/error.py +41 -0
  162. cancan_microstack/public/logging/__init__.py +0 -0
  163. cancan_microstack/public/logging/initializer.py +109 -0
  164. cancan_microstack/public/logging/mq_handler.py +279 -0
  165. cancan_microstack/public/schemas/__init__.py +1 -0
  166. cancan_microstack/public/schemas/caddy/__init__.py +381 -0
  167. cancan_microstack/public/schemas/caddy/analysis.py +90 -0
  168. cancan_microstack/public/schemas/caddy/route.py +18 -0
  169. cancan_microstack/public/schemas/common.py +79 -0
  170. cancan_microstack/public/schemas/controllersrv/__init__.py +3 -0
  171. cancan_microstack/public/schemas/controllersrv/async_requests.py +30 -0
  172. cancan_microstack/public/schemas/controllersrv/compose_models.py +47 -0
  173. cancan_microstack/public/schemas/controllersrv/const.py +24 -0
  174. cancan_microstack/public/schemas/controllersrv/docker_models.py +45 -0
  175. cancan_microstack/public/schemas/controllersrv/docker_responses.py +104 -0
  176. cancan_microstack/public/schemas/controllersrv/requests.py +54 -0
  177. cancan_microstack/public/schemas/controllersrv/responses.py +124 -0
  178. cancan_microstack/public/schemas/controllersrv/task_models.py +102 -0
  179. cancan_microstack/public/schemas/controllersrv/validation.py +23 -0
  180. cancan_microstack/public/schemas/hook_metrics.py +124 -0
  181. cancan_microstack/public/schemas/hooks.py +39 -0
  182. cancan_microstack/public/schemas/infra/__init__.py +0 -0
  183. cancan_microstack/public/schemas/infra/cleanup.py +25 -0
  184. cancan_microstack/public/schemas/infra/container.py +74 -0
  185. cancan_microstack/public/schemas/infra/enums.py +135 -0
  186. cancan_microstack/public/schemas/infra/health_check.py +42 -0
  187. cancan_microstack/public/schemas/infra/hook_log.py +42 -0
  188. cancan_microstack/public/schemas/infra/operation.py +90 -0
  189. cancan_microstack/public/schemas/infra/overview.py +25 -0
  190. cancan_microstack/public/schemas/infra/push.py +33 -0
  191. cancan_microstack/public/schemas/infra/service_action_log.py +47 -0
  192. cancan_microstack/public/schemas/infra/service_config.py +10 -0
  193. cancan_microstack/public/schemas/infra/service_info.py +69 -0
  194. cancan_microstack/public/schemas/infra/service_instance.py +93 -0
  195. cancan_microstack/public/schemas/infra/service_management.py +152 -0
  196. cancan_microstack/public/schemas/infra/service_operation.py +79 -0
  197. cancan_microstack/public/schemas/infra/service_registry.py +158 -0
  198. cancan_microstack/public/schemas/infra/status_types.py +19 -0
  199. cancan_microstack/public/schemas/infra/workflow.py +566 -0
  200. cancan_microstack/public/schemas/logging/__init__.py +1 -0
  201. cancan_microstack/public/schemas/logging/log_event.py +121 -0
  202. cancan_microstack/public/schemas/opsbffsrv/__init__.py +1 -0
  203. cancan_microstack/public/schemas/opsbffsrv/async_ops.py +17 -0
  204. cancan_microstack/public/schemas/opsbffsrv/db_admin.py +147 -0
  205. cancan_microstack/public/schemas/opsbffsrv/db_init.py +48 -0
  206. cancan_microstack/public/schemas/opsbffsrv/service_config.py +89 -0
  207. cancan_microstack/public/schemas/opsbffsrv/service_logs.py +54 -0
  208. cancan_microstack/public/schemas/service_operation.py +24 -0
  209. cancan_microstack/public/schemas/service_registry.py +40 -0
  210. cancan_microstack/public/types/__init__.py +7 -0
  211. cancan_microstack/public/web/__init__.py +0 -0
  212. cancan_microstack/public/web/config_value.py +105 -0
  213. cancan_microstack/public/web/server.py +385 -0
  214. cancan_microstack/py.typed +0 -0
  215. cancan_microstack/runtime/__init__.py +0 -0
  216. cancan_microstack/runtime/compose_cmd.py +228 -0
  217. cancan_microstack/runtime/host_daemon.py +318 -0
  218. cancan_microstack/runtime/overrides.py +103 -0
  219. cancan_microstack/runtime/resources.py +25 -0
  220. cancan_microstack/runtime/workspace.py +94 -0
  221. cancan_microstack/services/__init__.py +0 -0
  222. cancan_microstack/services/controllersrv/__init__.py +8 -0
  223. cancan_microstack/services/controllersrv/application/__init__.py +0 -0
  224. cancan_microstack/services/controllersrv/application/docker_compose_app.py +427 -0
  225. cancan_microstack/services/controllersrv/conf/__init__.py +0 -0
  226. cancan_microstack/services/controllersrv/conf/config.py +76 -0
  227. cancan_microstack/services/controllersrv/conf/settings.py +54 -0
  228. cancan_microstack/services/controllersrv/domain/__init__.py +0 -0
  229. cancan_microstack/services/controllersrv/domain/docker_compose/__init__.py +0 -0
  230. cancan_microstack/services/controllersrv/domain/docker_compose/docker_compose_domain.py +278 -0
  231. cancan_microstack/services/controllersrv/domain/service_validator.py +327 -0
  232. cancan_microstack/services/controllersrv/domain/task/__init__.py +17 -0
  233. cancan_microstack/services/controllersrv/domain/task/task_queue.py +286 -0
  234. cancan_microstack/services/controllersrv/domain/task/task_worker.py +495 -0
  235. cancan_microstack/services/controllersrv/infrastructure/__init__.py +0 -0
  236. cancan_microstack/services/controllersrv/interface/__init__.py +0 -0
  237. cancan_microstack/services/controllersrv/interface/api/__init__.py +0 -0
  238. cancan_microstack/services/controllersrv/interface/api/docker_control_api.py +470 -0
  239. cancan_microstack/services/controllersrv/router.py +132 -0
  240. cancan_microstack/services/infrasrv/__init__.py +4 -0
  241. cancan_microstack/services/infrasrv/application/__init__.py +0 -0
  242. cancan_microstack/services/infrasrv/application/health_check_app.py +24 -0
  243. cancan_microstack/services/infrasrv/application/logging/__init__.py +1 -0
  244. cancan_microstack/services/infrasrv/application/logging/log_ingestion_service.py +183 -0
  245. cancan_microstack/services/infrasrv/application/service_config.py +22 -0
  246. cancan_microstack/services/infrasrv/application/service_logs_app.py +53 -0
  247. cancan_microstack/services/infrasrv/application/service_management_app.py +689 -0
  248. cancan_microstack/services/infrasrv/application/service_operation_tracker.py +251 -0
  249. cancan_microstack/services/infrasrv/application/service_registry.py +53 -0
  250. cancan_microstack/services/infrasrv/application/workflow/__init__.py +0 -0
  251. cancan_microstack/services/infrasrv/application/workflow/workflow_app.py +991 -0
  252. cancan_microstack/services/infrasrv/application/workflow/workflow_queue.py +302 -0
  253. cancan_microstack/services/infrasrv/application/workflow/workflow_tasks.py +46 -0
  254. cancan_microstack/services/infrasrv/application/workflow/workflow_worker_runtime.py +122 -0
  255. cancan_microstack/services/infrasrv/conf/__init__.py +0 -0
  256. cancan_microstack/services/infrasrv/conf/config.py +98 -0
  257. cancan_microstack/services/infrasrv/domain/__init__.py +0 -0
  258. cancan_microstack/services/infrasrv/domain/health_check/__init__.py +3 -0
  259. cancan_microstack/services/infrasrv/domain/health_check/health_check_domain.py +576 -0
  260. cancan_microstack/services/infrasrv/domain/hooks/__init__.py +19 -0
  261. cancan_microstack/services/infrasrv/domain/hooks/builtin_hooks.py +308 -0
  262. cancan_microstack/services/infrasrv/domain/hooks/hook_registry.py +43 -0
  263. cancan_microstack/services/infrasrv/domain/hooks/hooks_log_utils.py +275 -0
  264. cancan_microstack/services/infrasrv/domain/hooks/init.py +17 -0
  265. cancan_microstack/services/infrasrv/domain/hooks/metrics.py +205 -0
  266. cancan_microstack/services/infrasrv/domain/hooks/pre_registration_hooks.py +490 -0
  267. cancan_microstack/services/infrasrv/domain/registry/__init__.py +0 -0
  268. cancan_microstack/services/infrasrv/domain/registry/service_registry.py +509 -0
  269. cancan_microstack/services/infrasrv/domain/service_config/__init__.py +0 -0
  270. cancan_microstack/services/infrasrv/domain/service_config/service_config.py +50 -0
  271. cancan_microstack/services/infrasrv/domain/service_logs/__init__.py +0 -0
  272. cancan_microstack/services/infrasrv/domain/service_logs/service_logs_domain.py +51 -0
  273. cancan_microstack/services/infrasrv/domain/workflow/__init__.py +4 -0
  274. cancan_microstack/services/infrasrv/domain/workflow/engine.py +159 -0
  275. cancan_microstack/services/infrasrv/domain/workflow/node_handlers.py +509 -0
  276. cancan_microstack/services/infrasrv/domain/workflow/workflow_domain.py +164 -0
  277. cancan_microstack/services/infrasrv/infrastructure/__init__.py +0 -0
  278. cancan_microstack/services/infrasrv/infrastructure/api/__init__.py +0 -0
  279. cancan_microstack/services/infrasrv/infrastructure/api/controllersrv_api.py +165 -0
  280. cancan_microstack/services/infrasrv/infrastructure/cache/__init__.py +0 -0
  281. cancan_microstack/services/infrasrv/infrastructure/cache/service_registry_cache.py +174 -0
  282. cancan_microstack/services/infrasrv/infrastructure/db/__init__.py +0 -0
  283. cancan_microstack/services/infrasrv/infrastructure/db/model/__init__.py +0 -0
  284. cancan_microstack/services/infrasrv/infrastructure/db/model/execution_log_tbl.py +53 -0
  285. cancan_microstack/services/infrasrv/infrastructure/db/model/node_instance_tbl.py +55 -0
  286. cancan_microstack/services/infrasrv/infrastructure/db/model/service_action_log_tbl.py +44 -0
  287. cancan_microstack/services/infrasrv/infrastructure/db/model/service_config_tbl.py +30 -0
  288. cancan_microstack/services/infrasrv/infrastructure/db/model/service_info_tbl.py +59 -0
  289. cancan_microstack/services/infrasrv/infrastructure/db/model/service_instance_tbl.py +88 -0
  290. cancan_microstack/services/infrasrv/infrastructure/db/model/service_operation_tbl.py +73 -0
  291. cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_definition_tbl.py +55 -0
  292. cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_definition_version_tbl.py +43 -0
  293. cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_engine_alert_tbl.py +57 -0
  294. cancan_microstack/services/infrasrv/infrastructure/db/model/workflow_run_tbl.py +56 -0
  295. cancan_microstack/services/infrasrv/infrastructure/db/operate/__init__.py +0 -0
  296. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_action_log_op.py +239 -0
  297. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_config.py +80 -0
  298. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_config_manager.py +198 -0
  299. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_info_op.py +297 -0
  300. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_instance_op.py +688 -0
  301. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_operation_op.py +387 -0
  302. cancan_microstack/services/infrasrv/infrastructure/db/operate/service_registry.py +124 -0
  303. cancan_microstack/services/infrasrv/infrastructure/db/operate/workflow_op.py +804 -0
  304. cancan_microstack/services/infrasrv/infrastructure/ddl_manager.py +31 -0
  305. cancan_microstack/services/infrasrv/infrastructure/mongo/__init__.py +1 -0
  306. cancan_microstack/services/infrasrv/infrastructure/mongo/log_repository.py +129 -0
  307. cancan_microstack/services/infrasrv/interface/__init__.py +0 -0
  308. cancan_microstack/services/infrasrv/interface/api/__init__.py +0 -0
  309. cancan_microstack/services/infrasrv/interface/api/health_check_api.py +29 -0
  310. cancan_microstack/services/infrasrv/interface/api/hooks.py +284 -0
  311. cancan_microstack/services/infrasrv/interface/api/internal.py +49 -0
  312. cancan_microstack/services/infrasrv/interface/api/internal_instance_api.py +265 -0
  313. cancan_microstack/services/infrasrv/interface/api/internal_operation_api.py +206 -0
  314. cancan_microstack/services/infrasrv/interface/api/service_config.py +50 -0
  315. cancan_microstack/services/infrasrv/interface/api/service_logs_api.py +49 -0
  316. cancan_microstack/services/infrasrv/interface/api/service_management_api.py +113 -0
  317. cancan_microstack/services/infrasrv/interface/api/service_registry.py +117 -0
  318. cancan_microstack/services/infrasrv/interface/api/workflow_api.py +303 -0
  319. cancan_microstack/services/infrasrv/interface/schedule/__init__.py +0 -0
  320. cancan_microstack/services/infrasrv/interface/schedule/cleanup.py +13 -0
  321. cancan_microstack/services/infrasrv/interface/schedule/health_check.py +27 -0
  322. cancan_microstack/services/infrasrv/interface/schedule/log_cleanup.py +26 -0
  323. cancan_microstack/services/infrasrv/interface/schedule/operation_tracker.py +25 -0
  324. cancan_microstack/services/infrasrv/interface/schedule/scheduler.py +39 -0
  325. cancan_microstack/services/infrasrv/interface/schedule/workflow_scheduler.py +115 -0
  326. cancan_microstack/services/infrasrv/router.py +341 -0
  327. cancan_microstack/services/opsbffsrv/__init__.py +4 -0
  328. cancan_microstack/services/opsbffsrv/application/__init__.py +0 -0
  329. cancan_microstack/services/opsbffsrv/application/async_operation_app.py +150 -0
  330. cancan_microstack/services/opsbffsrv/application/auth_app.py +285 -0
  331. cancan_microstack/services/opsbffsrv/application/caddy/__init__.py +0 -0
  332. cancan_microstack/services/opsbffsrv/application/caddy/access_log_analysis_app.py +344 -0
  333. cancan_microstack/services/opsbffsrv/application/caddy/access_log_ingestion_service.py +169 -0
  334. cancan_microstack/services/opsbffsrv/application/caddy/certificate_management_app.py +355 -0
  335. cancan_microstack/services/opsbffsrv/application/caddy/rate_limit_management_app.py +496 -0
  336. cancan_microstack/services/opsbffsrv/application/caddy/route_management_app.py +401 -0
  337. cancan_microstack/services/opsbffsrv/application/caddy/stats_aggregation_app.py +364 -0
  338. cancan_microstack/services/opsbffsrv/application/db_admin_app.py +103 -0
  339. cancan_microstack/services/opsbffsrv/application/db_init_app.py +283 -0
  340. cancan_microstack/services/opsbffsrv/application/logging/__init__.py +1 -0
  341. cancan_microstack/services/opsbffsrv/application/logging/log_query_app.py +28 -0
  342. cancan_microstack/services/opsbffsrv/application/service_config.py +158 -0
  343. cancan_microstack/services/opsbffsrv/application/service_logs_app.py +74 -0
  344. cancan_microstack/services/opsbffsrv/application/service_registry.py +36 -0
  345. cancan_microstack/services/opsbffsrv/application/workflow_ops_app.py +730 -0
  346. cancan_microstack/services/opsbffsrv/conf/__init__.py +0 -0
  347. cancan_microstack/services/opsbffsrv/conf/config.py +224 -0
  348. cancan_microstack/services/opsbffsrv/domain/__init__.py +0 -0
  349. cancan_microstack/services/opsbffsrv/domain/auth/__init__.py +0 -0
  350. cancan_microstack/services/opsbffsrv/domain/auth/admin_init.py +38 -0
  351. cancan_microstack/services/opsbffsrv/domain/auth/auth_domain.py +108 -0
  352. cancan_microstack/services/opsbffsrv/domain/caddy/__init__.py +0 -0
  353. cancan_microstack/services/opsbffsrv/domain/caddy/access_log_analysis.py +358 -0
  354. cancan_microstack/services/opsbffsrv/domain/caddy/certificate_management.py +325 -0
  355. cancan_microstack/services/opsbffsrv/domain/caddy/default_routes.py +53 -0
  356. cancan_microstack/services/opsbffsrv/domain/caddy/rate_limit_management.py +308 -0
  357. cancan_microstack/services/opsbffsrv/domain/caddy/route_management.py +279 -0
  358. cancan_microstack/services/opsbffsrv/domain/caddy/stats_aggregation.py +654 -0
  359. cancan_microstack/services/opsbffsrv/domain/db_admin/__init__.py +0 -0
  360. cancan_microstack/services/opsbffsrv/domain/db_admin/db_admin_domain.py +118 -0
  361. cancan_microstack/services/opsbffsrv/domain/db_init/__init__.py +3 -0
  362. cancan_microstack/services/opsbffsrv/domain/db_init/db_init_domain.py +358 -0
  363. cancan_microstack/services/opsbffsrv/domain/logging/__init__.py +1 -0
  364. cancan_microstack/services/opsbffsrv/domain/logging/log_query_domain.py +99 -0
  365. cancan_microstack/services/opsbffsrv/domain/service_config/__init__.py +0 -0
  366. cancan_microstack/services/opsbffsrv/domain/service_config/service_config.py +81 -0
  367. cancan_microstack/services/opsbffsrv/domain/service_registry/__init__.py +0 -0
  368. cancan_microstack/services/opsbffsrv/domain/service_registry/service_registry.py +292 -0
  369. cancan_microstack/services/opsbffsrv/infrastructure/__init__.py +0 -0
  370. cancan_microstack/services/opsbffsrv/infrastructure/api/__init__.py +0 -0
  371. cancan_microstack/services/opsbffsrv/infrastructure/api/infrasrv_api.py +242 -0
  372. cancan_microstack/services/opsbffsrv/infrastructure/auth/__init__.py +0 -0
  373. cancan_microstack/services/opsbffsrv/infrastructure/auth/captcha_service.py +67 -0
  374. cancan_microstack/services/opsbffsrv/infrastructure/auth/password_service.py +12 -0
  375. cancan_microstack/services/opsbffsrv/infrastructure/auth/redis_store.py +131 -0
  376. cancan_microstack/services/opsbffsrv/infrastructure/auth/totp_service.py +59 -0
  377. cancan_microstack/services/opsbffsrv/infrastructure/caddy/__init__.py +0 -0
  378. cancan_microstack/services/opsbffsrv/infrastructure/caddy/access_log_parser.py +307 -0
  379. cancan_microstack/services/opsbffsrv/infrastructure/caddy/admin_api_client.py +678 -0
  380. cancan_microstack/services/opsbffsrv/infrastructure/caddy/ip_geo_locator.py +176 -0
  381. cancan_microstack/services/opsbffsrv/infrastructure/db/__init__.py +0 -0
  382. cancan_microstack/services/opsbffsrv/infrastructure/db/model/__init__.py +0 -0
  383. cancan_microstack/services/opsbffsrv/infrastructure/db/model/admin_user_tbl.py +33 -0
  384. cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_access_log_tbl.py +90 -0
  385. cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_certificate_tbl.py +65 -0
  386. cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_rate_limit_tbl.py +69 -0
  387. cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_route_tbl.py +66 -0
  388. cancan_microstack/services/opsbffsrv/infrastructure/db/model/caddy_stats_tbl.py +78 -0
  389. cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_action_log_tbl.py +44 -0
  390. cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_config_tbl.py +30 -0
  391. cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_info_tbl.py +51 -0
  392. cancan_microstack/services/opsbffsrv/infrastructure/db/model/service_instance_tbl.py +68 -0
  393. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/__init__.py +0 -0
  394. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/admin_user_operate.py +59 -0
  395. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_access_log.py +531 -0
  396. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_certificate.py +451 -0
  397. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_rate_limit.py +360 -0
  398. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_route.py +271 -0
  399. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/caddy_stats.py +343 -0
  400. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_action_log_op.py +57 -0
  401. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_config.py +86 -0
  402. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_info_op.py +79 -0
  403. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_instance.py +58 -0
  404. cancan_microstack/services/opsbffsrv/infrastructure/db/operate/service_registry.py +138 -0
  405. cancan_microstack/services/opsbffsrv/infrastructure/ddl_manager.py +31 -0
  406. cancan_microstack/services/opsbffsrv/infrastructure/mongo/__init__.py +1 -0
  407. cancan_microstack/services/opsbffsrv/infrastructure/mongo/log_query_repository.py +87 -0
  408. cancan_microstack/services/opsbffsrv/interface/__init__.py +0 -0
  409. cancan_microstack/services/opsbffsrv/interface/api/__init__.py +0 -0
  410. cancan_microstack/services/opsbffsrv/interface/api/async_operation_api.py +137 -0
  411. cancan_microstack/services/opsbffsrv/interface/api/auth_api.py +113 -0
  412. cancan_microstack/services/opsbffsrv/interface/api/caddy/__init__.py +3 -0
  413. cancan_microstack/services/opsbffsrv/interface/api/caddy/access_log_api.py +174 -0
  414. cancan_microstack/services/opsbffsrv/interface/api/caddy/certificate_api.py +235 -0
  415. cancan_microstack/services/opsbffsrv/interface/api/caddy/rate_limit_api.py +302 -0
  416. cancan_microstack/services/opsbffsrv/interface/api/caddy/route_api.py +250 -0
  417. cancan_microstack/services/opsbffsrv/interface/api/caddy/stats_api.py +243 -0
  418. cancan_microstack/services/opsbffsrv/interface/api/db_admin_api.py +62 -0
  419. cancan_microstack/services/opsbffsrv/interface/api/db_init_api.py +109 -0
  420. cancan_microstack/services/opsbffsrv/interface/api/instance_management_api.py +165 -0
  421. cancan_microstack/services/opsbffsrv/interface/api/log_query_api.py +41 -0
  422. cancan_microstack/services/opsbffsrv/interface/api/mongo_express_proxy_api.py +181 -0
  423. cancan_microstack/services/opsbffsrv/interface/api/pgweb_proxy_api.py +154 -0
  424. cancan_microstack/services/opsbffsrv/interface/api/rabbitmq_mgmt_proxy_api.py +518 -0
  425. cancan_microstack/services/opsbffsrv/interface/api/redis_commander_proxy_api.py +133 -0
  426. cancan_microstack/services/opsbffsrv/interface/api/service_config.py +146 -0
  427. cancan_microstack/services/opsbffsrv/interface/api/service_logs_api.py +81 -0
  428. cancan_microstack/services/opsbffsrv/interface/api/service_registry.py +66 -0
  429. cancan_microstack/services/opsbffsrv/interface/api/workflow_ops_api.py +413 -0
  430. cancan_microstack/services/opsbffsrv/interface/middleware/__init__.py +0 -0
  431. cancan_microstack/services/opsbffsrv/interface/middleware/auth_middleware.py +52 -0
  432. cancan_microstack/services/opsbffsrv/router.py +901 -0
  433. cancan_microstack/utils/__init__.py +1 -0
  434. cancan_microstack/utils/container_env.py +218 -0
  435. cancan_microstack-0.0.1.dist-info/METADATA +155 -0
  436. cancan_microstack-0.0.1.dist-info/RECORD +440 -0
  437. cancan_microstack-0.0.1.dist-info/WHEEL +5 -0
  438. cancan_microstack-0.0.1.dist-info/entry_points.txt +2 -0
  439. cancan_microstack-0.0.1.dist-info/licenses/LICENSE +21 -0
  440. cancan_microstack-0.0.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1 @@
1
+ .stats-overview[data-v-6836137c]{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:var(--spacing-4)}.stat-card[data-v-6836137c]{border:none;background:var(--bg-elevated);transition:all var(--duration-base) var(--ease-in-out)}.stat-card[data-v-6836137c]:hover{transform:translateY(-4px);box-shadow:var(--shadow-hover)}.stat-content[data-v-6836137c]{display:flex;align-items:center;gap:var(--spacing-4)}.stat-icon[data-v-6836137c]{width:56px;height:56px;border-radius:var(--radius-lg);display:flex;align-items:center;justify-content:center;font-size:28px;flex-shrink:0}.stat-icon-primary[data-v-6836137c]{background:linear-gradient(135deg,var(--primary-500),var(--primary-600));color:#fff}.stat-icon-success[data-v-6836137c]{background:linear-gradient(135deg,var(--success-500),var(--success-600));color:#fff}.stat-icon-warning[data-v-6836137c]{background:linear-gradient(135deg,var(--warning-500),var(--warning-600));color:#fff}.stat-icon-info[data-v-6836137c]{background:linear-gradient(135deg,#13c2c2,#1890ff);color:#fff}.stat-icon-danger[data-v-6836137c]{background:linear-gradient(135deg,var(--error-500),var(--error-600));color:#fff}.stat-icon-secondary[data-v-6836137c]{background:linear-gradient(135deg,var(--gray-500),var(--gray-600));color:#fff}.stat-info[data-v-6836137c]{flex:1;min-width:0}.stat-label[data-v-6836137c]{color:var(--text-secondary);font-size:13px;margin:0 0 6px}.stat-value[data-v-6836137c]{color:var(--text-primary);font-size:32px;font-weight:700;margin:0 0 4px;line-height:1}.stat-trend[data-v-6836137c]{color:var(--text-tertiary);font-size:12px;margin:0}.stat-trend.success[data-v-6836137c]{color:var(--success-500)}.card-header[data-v-6836137c]{display:flex;justify-content:space-between;align-items:center}.chart-container[data-v-6836137c]{height:350px}.top-item[data-v-6836137c]{padding:var(--spacing-3) 0;border-bottom:1px solid var(--border-tertiary)}.top-item[data-v-6836137c]:last-child{border-bottom:none}.top-item-info[data-v-6836137c]{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--spacing-2)}.country-name[data-v-6836137c]{font-weight:500;color:var(--text-primary)}.country-code[data-v-6836137c]{font-size:12px;margin-left:var(--spacing-2)}.top-item-stats[data-v-6836137c]{display:flex;align-items:center;gap:var(--spacing-3)}.request-count[data-v-6836137c]{min-width:60px;text-align:right;font-weight:600;color:var(--primary-500)}@media (max-width: 768px){.stats-overview[data-v-6836137c]{grid-template-columns:1fr}.chart-container[data-v-6836137c]{height:250px}}
@@ -0,0 +1 @@
1
+ import{d as N,u as R,r as a,a as A,o as L,c as m,b as i,e as t,f as M,F as U,i as o,g as F,h as I,t as K,j as s,w as l,k as O,l as k,m as P,s as j,q as z,_ as D}from"./index-CiFlm8oc.js";const E={class:"totp-container"},G={class:"totp-card"},$={key:0,class:"loading-wrapper"},H={class:"qr-wrapper"},J=["src"],Q={class:"uri-section"},W={class:"uri-box"},X={class:"uri-text"},Y={key:2,class:"error-wrapper"},Z=N({__name:"TotpBindView",setup(ee){const g=z(),d=R(),v=a(),c=a(!1),f=a(!0),u=a(""),y=a(""),n=a(""),r=A({code:""}),T={code:[{required:!0,message:"请输入验证码",trigger:"blur"},{len:6,message:"验证码为 6 位",trigger:"blur"}]};async function V(){if(!d.tempToken){f.value=!1;return}try{const p=await j({temp_token:d.tempToken});u.value=p.qr_code_base64,y.value=p.otpauth_uri}catch{u.value=""}finally{f.value=!1}}async function _(){if(!(!v.value||!await v.value.validate().catch(()=>!1))){c.value=!0,n.value="";try{await d.doTotpBind(r.code),g.push("/dashboard")}catch(e){n.value=e?.message||"TOTP 绑定失败",r.code=""}finally{c.value=!1}}}function B(){d.logout(),g.push({name:"Login"})}return L(()=>{V()}),(p,e)=>{const C=s("el-divider"),q=s("el-input"),b=s("el-form-item"),h=s("el-button"),S=s("el-form"),w=s("el-alert");return i(),m("div",E,[t("div",G,[e[7]||(e[7]=M('<div class="totp-header" data-v-ae84375f><div class="icon-wrapper" data-v-ae84375f><i class="i-carbon-qr-code text-3xl" style="color:white;" data-v-ae84375f></i></div><h2 class="totp-title" data-v-ae84375f>绑定两步验证</h2><p class="totp-subtitle" data-v-ae84375f> 请使用 Authy 或 Google Authenticator 扫描下方二维码 </p></div>',1)),f.value?(i(),m("div",$,[...e[2]||(e[2]=[t("i",{class:"i-carbon-renew animate-spin text-2xl"},null,-1),t("p",{class:"mt-2 text-sm",style:{color:"var(--text-tertiary)"}},"正在获取绑定信息...",-1)])])):u.value?(i(),m(U,{key:1},[t("div",H,[t("img",{src:u.value,alt:"TOTP 二维码",class:"qr-image"},null,8,J)]),t("div",Q,[e[3]||(e[3]=t("p",{class:"uri-label"},"无法扫码?手动输入以下 URI:",-1)),t("div",W,[t("code",X,K(y.value),1)])]),o(C),o(S,{ref_key:"formRef",ref:v,model:r,rules:T,"label-width":"0",size:"large",onSubmit:P(_,["prevent"])},{default:l(()=>[o(b,{prop:"code"},{default:l(()=>[o(q,{modelValue:r.code,"onUpdate:modelValue":e[0]||(e[0]=x=>r.code=x),placeholder:"请输入 6 位验证码",maxlength:"6",disabled:c.value,onKeyup:O(_,["enter"])},{prefix:l(()=>[...e[4]||(e[4]=[t("i",{class:"i-carbon-password"},null,-1)])]),_:1},8,["modelValue","disabled"])]),_:1}),o(b,null,{default:l(()=>[o(h,{type:"primary",class:"bind-btn",loading:c.value,onClick:_},{default:l(()=>[...e[5]||(e[5]=[k(" 确认绑定 ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"]),n.value?(i(),F(w,{key:0,type:"warning",title:n.value,"show-icon":"",closable:"",class:"mt-2",onClose:e[1]||(e[1]=x=>n.value="")},null,8,["title"])):I("",!0)],64)):(i(),m("div",Y,[o(w,{type:"error",title:"获取绑定信息失败,请重新登录","show-icon":"",closable:!1}),o(h,{class:"mt-4",onClick:B},{default:l(()=>[...e[6]||(e[6]=[k("返回登录",-1)])]),_:1})]))])])}}}),oe=D(Z,[["__scopeId","data-v-ae84375f"]]);export{oe as default};
@@ -0,0 +1 @@
1
+ .totp-container[data-v-ae84375f]{min-height:100vh;display:flex;align-items:center;justify-content:center;background:var(--bg-page);padding:20px}.totp-card[data-v-ae84375f]{width:100%;max-width:440px;padding:40px 36px;border-radius:var(--radius-xl, 16px);background:var(--bg-container, #fff);box-shadow:var(--shadow-lg, 0 8px 32px rgba(0, 0, 0, .08));border:1px solid var(--border-secondary, #e5e7eb)}.totp-header[data-v-ae84375f]{text-align:center;margin-bottom:24px}.icon-wrapper[data-v-ae84375f]{width:56px;height:56px;margin:0 auto 16px;display:flex;align-items:center;justify-content:center;border-radius:var(--radius-lg, 12px);background:var(--gradient-primary, linear-gradient(135deg, #6366f1, #8b5cf6));box-shadow:var(--shadow-sm)}.totp-title[data-v-ae84375f]{font-size:22px;font-weight:600;color:var(--text-primary);margin-bottom:4px}.totp-subtitle[data-v-ae84375f]{font-size:14px;color:var(--text-tertiary);line-height:1.5}.loading-wrapper[data-v-ae84375f]{text-align:center;padding:40px 0}.qr-wrapper[data-v-ae84375f]{display:flex;justify-content:center;margin-bottom:20px}.qr-image[data-v-ae84375f]{width:200px;height:200px;border-radius:var(--radius-base, 8px);border:1px solid var(--border-secondary, #e5e7eb)}.uri-section[data-v-ae84375f]{margin-bottom:8px}.uri-label[data-v-ae84375f]{font-size:12px;color:var(--text-tertiary);margin-bottom:8px}.uri-box[data-v-ae84375f]{padding:10px 12px;border-radius:var(--radius-base, 8px);background:var(--bg-subtle, #f9fafb);border:1px solid var(--border-secondary, #e5e7eb);word-break:break-all}.uri-text[data-v-ae84375f]{font-size:12px;color:var(--text-secondary)}.bind-btn[data-v-ae84375f]{width:100%}.error-wrapper[data-v-ae84375f]{text-align:center;padding:20px 0}
@@ -0,0 +1 @@
1
+ .totp-container[data-v-b5fa4e75]{min-height:100vh;display:flex;align-items:center;justify-content:center;background:var(--bg-page);padding:20px}.totp-card[data-v-b5fa4e75]{width:100%;max-width:420px;padding:40px 36px;border-radius:var(--radius-xl, 16px);background:var(--bg-container, #fff);box-shadow:var(--shadow-lg, 0 8px 32px rgba(0, 0, 0, .08));border:1px solid var(--border-secondary, #e5e7eb)}.totp-header[data-v-b5fa4e75]{text-align:center;margin-bottom:32px}.icon-wrapper[data-v-b5fa4e75]{width:56px;height:56px;margin:0 auto 16px;display:flex;align-items:center;justify-content:center;border-radius:var(--radius-lg, 12px);background:var(--gradient-primary, linear-gradient(135deg, #6366f1, #8b5cf6));box-shadow:var(--shadow-sm)}.totp-title[data-v-b5fa4e75]{font-size:22px;font-weight:600;color:var(--text-primary);margin-bottom:4px}.totp-subtitle[data-v-b5fa4e75]{font-size:14px;color:var(--text-tertiary);line-height:1.5}.verify-btn[data-v-b5fa4e75]{width:100%}
@@ -0,0 +1 @@
1
+ import{d as V,u as x,r as d,a as k,c as C,b as f,e as p,f as T,i as o,g as N,h as B,w as l,j as s,k as S,l as A,m as R,q,_ as K}from"./index-CiFlm8oc.js";const M={class:"totp-container"},j={class:"totp-card"},z=V({__name:"TotpVerifyView",setup(E){const m=q(),v=x(),n=d(),r=d(!1),t=d(""),a=k({code:""}),_={code:[{required:!0,message:"请输入验证码",trigger:"blur"},{len:6,message:"验证码为 6 位",trigger:"blur"}]};async function i(){if(!(!n.value||!await n.value.validate().catch(()=>!1))){r.value=!0,t.value="";try{await v.doTotpVerify(a.code),m.push("/dashboard")}catch(e){t.value=e?.message||"TOTP 验证失败",a.code=""}finally{r.value=!1}}}return(b,e)=>{const y=s("el-input"),c=s("el-form-item"),g=s("el-button"),h=s("el-form"),w=s("el-alert");return f(),C("div",M,[p("div",j,[e[4]||(e[4]=T('<div class="totp-header" data-v-b5fa4e75><div class="icon-wrapper" data-v-b5fa4e75><i class="i-carbon-locked text-3xl" style="color:white;" data-v-b5fa4e75></i></div><h2 class="totp-title" data-v-b5fa4e75>两步验证</h2><p class="totp-subtitle" data-v-b5fa4e75> 请打开 Authy 或 Google Authenticator,输入 6 位验证码 </p></div>',1)),o(h,{ref_key:"formRef",ref:n,model:a,rules:_,"label-width":"0",size:"large",onSubmit:R(i,["prevent"])},{default:l(()=>[o(c,{prop:"code"},{default:l(()=>[o(y,{modelValue:a.code,"onUpdate:modelValue":e[0]||(e[0]=u=>a.code=u),placeholder:"请输入 6 位验证码",maxlength:"6",disabled:r.value,onKeyup:S(i,["enter"])},{prefix:l(()=>[...e[2]||(e[2]=[p("i",{class:"i-carbon-password"},null,-1)])]),_:1},8,["modelValue","disabled"])]),_:1}),o(c,null,{default:l(()=>[o(g,{type:"primary",class:"verify-btn",loading:r.value,onClick:i},{default:l(()=>[...e[3]||(e[3]=[A(" 验 证 ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"]),t.value?(f(),N(w,{key:0,type:"warning",title:t.value,"show-icon":"",closable:"",class:"mt-2",onClose:e[1]||(e[1]=u=>t.value="")},null,8,["title"])):B("",!0)])])}}}),I=K(z,[["__scopeId","data-v-b5fa4e75"]]);export{I as default};
@@ -0,0 +1 @@
1
+ .stats-grid[data-v-27195020]{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.stat-card[data-v-27195020]{background:var(--bg-elevated);border-radius:var(--radius-lg);padding:20px;border:1px solid var(--border-secondary);box-shadow:var(--shadow-sm);transition:transform var(--duration-base) var(--ease-in-out),box-shadow var(--duration-base) var(--ease-in-out)}.stat-card[data-v-27195020]:hover{transform:translateY(-2px);box-shadow:var(--shadow-hover)}.stat-card-header[data-v-27195020]{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.stat-label[data-v-27195020]{font-size:14px;color:var(--text-secondary)}.stat-icon[data-v-27195020]{font-size:20px;color:var(--primary-500)}.stat-value[data-v-27195020]{display:flex;align-items:baseline;gap:8px}.stat-value span[data-v-27195020]{font-size:32px;font-weight:600;color:var(--text-primary)}.stat-value small[data-v-27195020]{font-size:12px;color:var(--text-tertiary)}.stat-description[data-v-27195020]{margin-top:8px;font-size:13px;color:var(--text-secondary)}@media (max-width: 768px){.stat-card[data-v-27195020]{padding:16px}.stat-value span[data-v-27195020]{font-size:24px}}.activity-panel[data-v-35a021b7]{margin-top:24px;display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:16px}.activity-section[data-v-35a021b7]{border:1px solid var(--border-secondary);border-radius:var(--radius-lg);padding:16px;background:var(--bg-elevated);display:flex;flex-direction:column;gap:12px;min-height:160px}.activity-section header[data-v-35a021b7]{display:flex;align-items:center;justify-content:space-between;gap:12px}.section-title[data-v-35a021b7]{font-size:14px;font-weight:600;margin:0}header small[data-v-35a021b7]{font-size:12px;color:var(--text-tertiary)}.progress-line[data-v-35a021b7]{width:100%;height:6px;border-radius:999px;background:var(--border-tertiary);overflow:hidden}.progress-line .bar[data-v-35a021b7]{height:100%;background:linear-gradient(90deg,var(--primary-400),var(--primary-600));transition:width .3s ease}.progress-legend[data-v-35a021b7]{display:flex;justify-content:space-between;font-size:12px;color:var(--text-tertiary)}.metrics[data-v-35a021b7]{display:flex;align-items:center;justify-content:space-between}.metric[data-v-35a021b7]{flex:1;text-align:center}.metric-value[data-v-35a021b7]{font-size:24px;font-weight:600;margin-bottom:4px}.metric-label[data-v-35a021b7]{font-size:12px;color:var(--text-tertiary)}.metric-divider[data-v-35a021b7]{width:1px;height:42px;background:var(--border-secondary)}.status-list[data-v-35a021b7]{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:10px}.status-list li[data-v-35a021b7]{display:grid;grid-template-columns:1fr auto;gap:8px;font-size:13px;align-items:center}.status-name[data-v-35a021b7]{color:var(--text-secondary)}.status-count[data-v-35a021b7]{font-weight:600}.status-bar[data-v-35a021b7]{grid-column:span 2;width:100%;height:4px;background:var(--border-tertiary);border-radius:999px;overflow:hidden}.status-bar .bar[data-v-35a021b7]{height:100%;background:var(--success-500)}.status-list .empty[data-v-35a021b7]{color:var(--text-tertiary);font-style:italic}.list-wrapper[data-v-0c12b660]{display:flex;flex-direction:column;gap:16px;height:100%}.list-header[data-v-0c12b660]{display:flex;gap:12px;align-items:center}.list-body[data-v-0c12b660]{flex:1;min-height:0;border:1px solid var(--border-secondary);border-radius:var(--radius-lg);background:var(--bg-elevated);padding:8px}.definition-item[data-v-0c12b660]{border:1px solid transparent;border-radius:var(--radius-lg);padding:16px;margin-bottom:12px;background:#00000005;cursor:pointer;transition:border var(--duration-base) var(--ease-in-out),background var(--duration-base) var(--ease-in-out)}.definition-item[data-v-0c12b660]:hover,.definition-item.active[data-v-0c12b660]{border-color:var(--primary-400);background:#1677ff14}.item-header[data-v-0c12b660]{display:flex;justify-content:space-between;align-items:flex-start;gap:12px}.item-title[data-v-0c12b660]{font-size:16px;font-weight:600;margin-bottom:4px}.item-subtitle[data-v-0c12b660]{font-size:13px;color:var(--text-secondary)}.status-tag[data-v-0c12b660]{display:inline-flex;align-items:center;gap:4px;font-size:12px;padding:4px 10px;border-radius:var(--radius-base)}.item-meta[data-v-0c12b660]{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:12px;margin:16px 0}.item-meta small[data-v-0c12b660]{font-size:12px;color:var(--text-tertiary)}.item-meta p[data-v-0c12b660]{margin-top:4px;font-size:14px}.tag-group[data-v-0c12b660]{display:flex;flex-wrap:wrap;gap:8px}.item-actions[data-v-0c12b660]{display:flex;align-items:center;gap:8px;justify-content:flex-end}.skeleton-list[data-v-0c12b660]{display:flex;flex-direction:column;gap:16px}.fade-enter-active[data-v-0c12b660],.fade-leave-active[data-v-0c12b660]{transition:all var(--duration-base) var(--ease-in-out)}.fade-enter-from[data-v-0c12b660],.fade-leave-to[data-v-0c12b660]{opacity:0;transform:translateY(8px)}@media (max-width: 1024px){.list-header[data-v-0c12b660]{flex-wrap:wrap}.item-actions[data-v-0c12b660]{flex-wrap:wrap;justify-content:flex-start}}.detail-panel[data-v-a60b6d8b]{border:1px solid var(--border-secondary);border-radius:var(--radius-lg);background:var(--bg-elevated);padding:24px;min-height:420px}.detail-header[data-v-a60b6d8b]{display:flex;justify-content:space-between;gap:16px;align-items:center;margin-bottom:24px}.detail-title[data-v-a60b6d8b]{font-size:22px;font-weight:600}.detail-title-row[data-v-a60b6d8b]{display:flex;align-items:center;gap:8px}.detail-desc[data-v-a60b6d8b]{color:var(--text-secondary);margin-top:4px}.detail-actions[data-v-a60b6d8b]{display:flex;gap:12px;flex-wrap:wrap}.detail-grid[data-v-a60b6d8b]{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.detail-card[data-v-a60b6d8b]{padding:16px;border-radius:var(--radius-lg);border:1px solid var(--border-secondary);background:var(--bg-secondary)}.card-label[data-v-a60b6d8b]{font-size:13px;color:var(--text-tertiary)}.card-value[data-v-a60b6d8b]{font-size:18px;font-weight:600;margin:6px 0}.text-success[data-v-a60b6d8b]{color:var(--success-500)}.text-warning[data-v-a60b6d8b]{color:var(--warning-500)}.detail-section[data-v-a60b6d8b]{margin-top:24px}.section-header[data-v-a60b6d8b]{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.node-list[data-v-a60b6d8b]{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px}.node-chip[data-v-a60b6d8b]{display:flex;align-items:center;gap:12px;padding:12px;border:1px solid var(--border-tertiary);border-radius:var(--radius-lg)}.node-chip i[data-v-a60b6d8b]{font-size:24px;color:var(--primary-500)}.node-chip p[data-v-a60b6d8b]{font-weight:600}.node-chip small[data-v-a60b6d8b]{color:var(--text-tertiary)}.detail-footer[data-v-a60b6d8b]{margin-top:24px;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:12px}.tag-list[data-v-a60b6d8b]{display:flex;flex-wrap:wrap;gap:8px}.footer-actions[data-v-a60b6d8b]{display:flex;gap:12px}@media (max-width: 768px){.detail-panel[data-v-a60b6d8b]{padding:16px}.detail-header[data-v-a60b6d8b]{flex-direction:column;align-items:flex-start}.detail-actions[data-v-a60b6d8b]{width:100%;justify-content:flex-start}}.workflow-alert-drawer[data-v-c9598963]{--el-drawer-padding-primary: 0}.drawer-body[data-v-c9598963]{padding:24px;display:flex;flex-direction:column;gap:16px}.drawer-header[data-v-c9598963]{display:flex;justify-content:space-between;align-items:center}.drawer-title[data-v-c9598963]{font-size:20px;font-weight:600}.drawer-subtitle[data-v-c9598963]{color:var(--text-secondary)}.filter-row[data-v-c9598963]{display:flex;gap:12px;align-items:center}.severity-pill[data-v-c9598963]{display:inline-flex;align-items:center;gap:4px;font-weight:600}.status-tag[data-v-c9598963]{border:none}.node-id[data-v-c9598963]{font-weight:600}.reason-text[data-v-c9598963]{font-weight:500;margin-bottom:4px}.detail-json[data-v-c9598963]{color:var(--text-tertiary);font-size:12px}.table-footer[data-v-c9598963]{display:flex;justify-content:flex-end}.workflow-center-actions[data-v-a359ce7b]{margin-top:16px;padding:12px 16px;border:1px solid var(--border-secondary);border-radius:var(--radius-lg);background:var(--bg-elevated);display:flex;justify-content:space-between;align-items:center;gap:16px}.action-left[data-v-a359ce7b]{display:flex;align-items:center;gap:12px}.action-right[data-v-a359ce7b]{display:flex;align-items:center;gap:16px}.action-label[data-v-a359ce7b]{font-size:13px;color:var(--text-secondary)}.auto-refresh-toggle[data-v-a359ce7b]{display:flex;align-items:center;gap:8px}.alert-badge[data-v-a359ce7b] .el-badge__content{background:var(--error-600);color:#fff;font-weight:600}.version-history[data-v-a359ce7b]{display:flex;flex-direction:column;gap:16px}.version-row[data-v-a359ce7b]{display:flex;justify-content:space-between;gap:12px;align-items:center}.version-title[data-v-a359ce7b]{font-weight:600}.version-summary[data-v-a359ce7b]{font-size:13px;color:var(--text-secondary)}.version-row-actions[data-v-a359ce7b]{display:flex;gap:8px}.version-preview[data-v-a359ce7b]{border:1px solid var(--border-tertiary);border-radius:var(--radius-lg);padding:16px;background:var(--bg-secondary)}.version-preview-header[data-v-a359ce7b]{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.mb-3[data-v-a359ce7b]{margin-bottom:12px}.workflow-layout[data-v-a359ce7b]{display:grid;grid-template-columns:minmax(320px,420px) 1fr;gap:24px;margin-top:24px}.workflow-left[data-v-a359ce7b],.workflow-right[data-v-a359ce7b]{min-height:0}@media (max-width: 1024px){.workflow-layout[data-v-a359ce7b]{grid-template-columns:1fr}}
@@ -0,0 +1 @@
1
+ import{d as H,x as V,c as h,b as p,F as W,B as L,e,t as i,n as j,h as P,_ as q,i as t,j as m,w as s,l as y,U as Z,g as A,V as Ne,y as I,m as Re,r as R,a as ue,G as fe,z as Te,k as Ee,A as ze,E as T,L as ne,o as Se,W as We,q as xe}from"./index-CiFlm8oc.js";import{P as Ie}from"./PageContainer-Byss-yUC.js";import{W as de,a as ce,b as ve,f as Le,c as Pe,r as Be,u as Ue,t as Oe}from"./workflow-CUXs39Ac.js";const Me={class:"stats-grid"},Fe={class:"stat-card-header"},Ke={class:"stat-label"},je={class:"stat-value"},Ge={key:0},He={class:"stat-description"},qe=H({__name:"WorkflowStatsBoard",props:{stats:{},fallbackTotal:{},fallbackActive:{},fallbackRuns:{},fallbackFailed:{}},setup(B){const a=B,c=V(()=>{const d=a.stats?.total_definitions??a.fallbackTotal,l=a.stats?.active_definitions??a.fallbackActive,f=a.stats?.scheduled_definitions??0,b=a.stats?.runs_today??a.fallbackRuns,D=a.stats?.failed_runs_today??a.fallbackFailed,n=a.stats?.success_rate_24h??(b>0?Math.max(0,100-Math.round(D/Math.max(1,b)*100)):100);return{total:d,active:l,scheduled:f,runs:b,failed:D,successRate:n,runningRuns:a.stats?.running_runs??0,pendingRuns:a.stats?.pending_runs??0,activeNodes:a.stats?.active_node_instances??0,waitingNodes:a.stats?.waiting_node_instances??0,inflightAttempts:a.stats?.inflight_attempts??0,next:a.stats?.next_cron_window??"暂无计划"}}),w=V(()=>[{label:"工作流总数",value:`${c.value.total}`,description:"定义的 DAG 工作流",icon:"i-carbon-flow-logs-vpc"},{label:"启用 / 定时",value:`${c.value.active}`,sublabel:c.value.scheduled?`定时 ${c.value.scheduled}`:"未配置定时",description:"可被调度的工作流数量",icon:"i-carbon-batch-job"},{label:"运行中实例",value:`${c.value.runningRuns}`,sublabel:`排队 ${c.value.pendingRuns}`,description:"实时执行的 workflow run",icon:"i-carbon-data-vis-4"},{label:"节点执行",value:`${c.value.activeNodes}`,sublabel:`等待 ${c.value.waitingNodes}`,description:"活跃 / 待调度节点数",icon:"i-carbon-flow-modeler"},{label:"执行尝试",value:`${c.value.inflightAttempts}`,description:"未完成的执行日志/重试",icon:"i-carbon-renew"},{label:"成功率",value:`${c.value.successRate}%`,sublabel:c.value.failed>0?`${c.value.failed} 次失败`:"稳定运行",description:`下一窗口:${c.value.next}`,icon:"i-carbon-chart-line"}]);return(d,l)=>(p(),h("div",Me,[(p(!0),h(W,null,L(w.value,f=>(p(),h("div",{key:f.label,class:"stat-card"},[e("div",Fe,[e("p",Ke,i(f.label),1),e("i",{class:j([f.icon,"stat-icon"])},null,2)]),e("div",je,[e("span",null,i(f.value),1),f.sublabel?(p(),h("small",Ge,i(f.sublabel),1)):P("",!0)]),e("p",He,i(f.description),1)]))),128))]))}}),Je=q(qe,[["__scopeId","data-v-27195020"]]),Ye={class:"activity-panel"},Qe={class:"activity-section"},Xe={class:"progress-line"},Ze={class:"progress-legend"},et={class:"activity-section"},tt={class:"metrics"},lt={class:"metric"},st={class:"metric-value"},nt={class:"metric"},at={class:"metric-value"},ot={class:"activity-section"},it={class:"status-list"},rt={class:"status-name"},dt={class:"status-count"},ut={class:"status-bar"},ct={key:0,class:"empty"},vt=H({__name:"WorkflowActivityPanel",props:{stats:{}},setup(B){const a=B,c=V(()=>({running:a.stats?.running_runs??0,pending:a.stats?.pending_runs??0,activeNodes:a.stats?.active_node_instances??0,waitingNodes:a.stats?.waiting_node_instances??0,attempts:a.stats?.inflight_attempts??0,runsByStatus:a.stats?.runs_by_status||{}})),w=V(()=>c.value.running+c.value.pending||0),d=V(()=>w.value?Math.min(100,Math.round(c.value.running/w.value*100)):0),l=V(()=>Object.entries(c.value.runsByStatus).sort((D,n)=>n[1]-D[1]).slice(0,3)),f=V(()=>l.value.length?l.value[0][1]:0),b=D=>f.value?Math.max(4,Math.round(D/f.value*100)):0;return(D,n)=>{const u=m("el-tag");return p(),h("div",Ye,[e("section",Qe,[e("header",null,[n[0]||(n[0]=e("div",null,[e("p",{class:"section-title"},"运行概览"),e("small",null,"实时 workflow run 状态")],-1)),t(u,{effect:"dark",type:"success",size:"small"},{default:s(()=>[y(i(c.value.running)+" 运行中",1)]),_:1})]),e("div",Xe,[e("div",{class:"bar",style:Z({width:`${d.value}%`})},null,4)]),e("div",Ze,[e("span",null,"排队 "+i(c.value.pending),1),e("span",null,i(d.value)+"% 正在执行",1)])]),e("section",et,[e("header",null,[n[1]||(n[1]=e("div",null,[e("p",{class:"section-title"},"节点并发"),e("small",null,"活跃节点与待调度节点")],-1)),t(u,{effect:"plain",size:"small",type:"info"},{default:s(()=>[y(i(c.value.activeNodes)+" 个活跃",1)]),_:1})]),e("div",tt,[e("div",lt,[e("p",st,i(c.value.activeNodes),1),n[2]||(n[2]=e("p",{class:"metric-label"},"活跃节点",-1))]),n[4]||(n[4]=e("div",{class:"metric-divider"},null,-1)),e("div",nt,[e("p",at,i(c.value.waitingNodes),1),n[3]||(n[3]=e("p",{class:"metric-label"},"等待调度",-1))])])]),e("section",ot,[e("header",null,[n[5]||(n[5]=e("div",null,[e("p",{class:"section-title"},"执行尝试 / 重试"),e("small",null,"Execution Log 与回调状态")],-1)),t(u,{effect:"plain",size:"small",type:"warning"},{default:s(()=>[y(i(c.value.attempts),1)]),_:1})]),e("ul",it,[(p(!0),h(W,null,L(l.value,E=>(p(),h("li",{key:E[0]},[e("span",rt,i(E[0]),1),e("span",dt,i(E[1]),1),e("div",ut,[e("div",{class:"bar",style:Z({width:`${b(E[1])}%`})},null,4)])]))),128)),l.value.length?P("",!0):(p(),h("li",ct,"暂无运行数据"))])])])}}}),pt=q(vt,[["__scopeId","data-v-35a021b7"]]),ft={class:"list-wrapper"},_t={class:"list-header"},mt={class:"list-body"},gt=["onClick"],yt={class:"item-header"},wt={class:"item-title"},bt={class:"item-subtitle"},kt={class:"item-meta"},ht={key:0,class:"tag-group"},$t={key:1,class:"skeleton-list"},Ct=H({__name:"WorkflowDefinitionList",props:{definitions:{default:()=>[]},loading:{type:Boolean,default:!1},selectedId:{default:null},keyword:{default:""},status:{default:null}},emits:["select","create","duplicate","toggle","design","runs","update:keyword","update:status"],setup(B,{emit:a}){const c=B,w=a,d=V({get:()=>c.keyword,set:n=>w("update:keyword",n)}),l=V({get:()=>c.status,set:n=>w("update:status",n||null)}),f=n=>{w("update:keyword",n)},b=n=>{w("update:status",n||null)},D=n=>{const u=new Date(n);return Number.isNaN(u.getTime())?"--":new Intl.DateTimeFormat("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}).format(u)};return(n,u)=>{const E=m("el-input"),z=m("el-option"),N=m("el-select"),$=m("el-button"),O=m("el-empty"),J=m("el-tag"),U=m("el-tooltip"),Y=m("el-switch"),F=m("el-skeleton"),K=m("el-scrollbar");return p(),h("div",ft,[e("div",_t,[t(E,{modelValue:d.value,"onUpdate:modelValue":u[0]||(u[0]=_=>d.value=_),placeholder:"搜索名称/标签",clearable:"",class:"flex-1",onClear:u[1]||(u[1]=_=>f("")),onInput:f},{prefix:s(()=>[...u[6]||(u[6]=[e("i",{class:"i-carbon-search text-gray-500"},null,-1)])]),_:1},8,["modelValue"]),t(N,{modelValue:l.value,"onUpdate:modelValue":u[2]||(u[2]=_=>l.value=_),placeholder:"全部状态",clearable:"",style:{width:"140px"},onChange:b},{default:s(()=>[t(z,{label:"全部状态",value:""}),t(z,{label:"已启用",value:"ACTIVE"}),t(z,{label:"已停用",value:"INACTIVE"})]),_:1},8,["modelValue"]),t($,{type:"primary",onClick:u[3]||(u[3]=_=>w("create"))},{default:s(()=>[...u[7]||(u[7]=[e("i",{class:"i-carbon-add mr-2"},null,-1),y("新建工作流",-1)])]),_:1})]),e("div",mt,[t(K,{height:"100%"},{default:s(()=>[!n.loading&&n.definitions.length===0?(p(),A(O,{key:0,description:"暂无工作流"},{default:s(()=>[t($,{type:"primary",onClick:u[4]||(u[4]=_=>w("create"))},{default:s(()=>[...u[8]||(u[8]=[y("立即创建",-1)])]),_:1})]),_:1})):P("",!0),t(Ne,{name:"fade",tag:"div"},{default:s(()=>[(p(!0),h(W,null,L(n.definitions,_=>(p(),h("div",{key:_.id,class:j(["definition-item",{active:_.id===n.selectedId}]),onClick:v=>w("select",_.id)},[e("div",yt,[e("div",null,[e("p",wt,i(_.name),1),e("p",bt,i(_.description||"暂无描述"),1)]),e("span",{class:"status-tag",style:Z({color:I(de)[_.is_active?"RUNNING":"CANCELLED"].color,background:I(de)[_.is_active?"RUNNING":"CANCELLED"].bgColor})},[e("i",{class:j(I(de)[_.is_active?"RUNNING":"CANCELLED"].icon)},null,2),y(" "+i(_.is_active?"已启用":"已停用"),1)],4)]),e("div",kt,[e("div",null,[u[9]||(u[9]=e("small",null,"最近运行",-1)),e("p",null,i(_.last_run_at?D(_.last_run_at):"暂无"),1)]),e("div",null,[u[10]||(u[10]=e("small",null,"下次运行",-1)),e("p",null,i(_.next_run_at?D(_.next_run_at):"根据 cron 计算"),1)]),_.tags?.length?(p(),h("div",ht,[(p(!0),h(W,null,L(_.tags,v=>(p(),A(J,{key:v,size:"small",effect:"plain"},{default:s(()=>[y(i(v),1)]),_:2},1024))),128))])):P("",!0)]),e("div",{class:"item-actions",onClick:u[5]||(u[5]=Re(()=>{},["stop"]))},[t(U,{content:"设计图编排"},{default:s(()=>[t($,{text:"",onClick:v=>w("design",_)},{default:s(()=>[...u[11]||(u[11]=[e("i",{class:"i-carbon-flow"},null,-1)])]),_:1},8,["onClick"])]),_:2},1024),t(U,{content:"查看执行"},{default:s(()=>[t($,{text:"",onClick:v=>w("runs",_)},{default:s(()=>[...u[12]||(u[12]=[e("i",{class:"i-carbon-chart-network"},null,-1)])]),_:1},8,["onClick"])]),_:2},1024),t(U,{content:"复制"},{default:s(()=>[t($,{text:"",onClick:v=>w("duplicate",_)},{default:s(()=>[...u[13]||(u[13]=[e("i",{class:"i-carbon-copy"},null,-1)])]),_:1},8,["onClick"])]),_:2},1024),t(U,{content:_.is_active?"停用":"启用"},{default:s(()=>[t(Y,{"model-value":_.is_active,size:"small",onChange:()=>w("toggle",_)},null,8,["model-value","onChange"])]),_:2},1032,["content"])])],10,gt))),128))]),_:1}),n.loading?(p(),h("div",$t,[(p(),h(W,null,L(3,_=>t(F,{key:_,animated:"",rows:3})),64))])):P("",!0)]),_:1})])])}}}),Dt=q(Ct,[["__scopeId","data-v-0c12b660"]]),Vt={class:"detail-panel"},At={key:0,class:"detail-content"},Nt={class:"detail-header"},Rt={class:"detail-title-row"},Tt={class:"detail-title"},Et={class:"detail-desc"},zt={class:"detail-actions"},St={class:"detail-grid"},Wt={class:"detail-card"},xt={class:"card-value"},It={class:"detail-card"},Lt={class:"detail-card"},Pt={class:"card-value"},Bt={class:"detail-section"},Ut={class:"section-header"},Ot={class:"node-list"},Mt={class:"detail-footer"},Ft={key:0,class:"tag-list"},Kt={class:"footer-actions"},jt=H({__name:"WorkflowDefinitionDetailPanel",props:{definition:{}},emits:["edit","run","runs","delete","publish","validate","versions"],setup(B,{emit:a}){const c=a,w=d=>{const l=new Date(d);return Number.isNaN(l.getTime())?"--":new Intl.DateTimeFormat("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}).format(l)};return(d,l)=>{const f=m("el-tag"),b=m("el-button"),D=m("el-empty");return p(),h("div",Vt,[d.definition?(p(),h("div",At,[e("div",Nt,[e("div",null,[e("div",Rt,[e("p",Tt,i(d.definition.name),1),d.definition.version?(p(),A(f,{key:0,type:"info",effect:"plain"},{default:s(()=>[y("v"+i(d.definition.version),1)]),_:1})):P("",!0)]),e("p",Et,i(d.definition.description||"暂无描述"),1)]),e("div",zt,[t(b,{type:"primary",onClick:l[0]||(l[0]=n=>c("edit",d.definition))},{default:s(()=>[...l[7]||(l[7]=[e("i",{class:"i-carbon-edit mr-2"},null,-1),y("设计器",-1)])]),_:1}),t(b,{onClick:l[1]||(l[1]=n=>c("run",d.definition))},{default:s(()=>[...l[8]||(l[8]=[e("i",{class:"i-carbon-play mr-2"},null,-1),y("立即运行",-1)])]),_:1}),t(b,{onClick:l[2]||(l[2]=n=>c("runs",d.definition))},{default:s(()=>[...l[9]||(l[9]=[e("i",{class:"i-carbon-analytics mr-2"},null,-1),y("执行记录",-1)])]),_:1})])]),e("div",St,[e("div",Wt,[l[10]||(l[10]=e("p",{class:"card-label"},"Cron 表达式",-1)),e("p",xt,i(d.definition.schedule),1),e("small",null,"时区:"+i(d.definition.timezone||"Asia/Shanghai"),1)]),e("div",It,[l[11]||(l[11]=e("p",{class:"card-label"},"状态",-1)),e("p",{class:j(["card-value",d.definition.is_active?"text-success":"text-warning"])},i(d.definition.is_active?"已启用":"已停用"),3),e("small",null,"下一次触发:"+i(d.definition.next_run_at?w(d.definition.next_run_at):"根据调度计算"),1)]),e("div",Lt,[l[12]||(l[12]=e("p",{class:"card-label"},"最近运行",-1)),e("p",Pt,i(d.definition.last_run_at?w(d.definition.last_run_at):"暂无"),1),e("small",null,"Owner:"+i(d.definition.owner||"未设置"),1)])]),e("div",Bt,[e("div",Ut,[l[13]||(l[13]=e("p",null,"节点配置",-1)),t(f,{size:"small",effect:"plain"},{default:s(()=>[y(i(Object.keys(d.definition.nodes_config||{}).length)+" 个节点",1)]),_:1})]),e("div",Ot,[(p(!0),h(W,null,L(d.definition.graph_data?.nodes||[],n=>(p(),h("div",{key:n.node_id,class:"node-chip"},[e("i",{class:j(n.ui?.icon||"i-carbon-flow-logs-vpc")},null,2),e("div",null,[e("p",null,i(n.label),1),e("small",null,i(n.type),1)])]))),128))])]),e("div",Mt,[d.definition.tags?.length?(p(),h("div",Ft,[(p(!0),h(W,null,L(d.definition.tags,n=>(p(),A(f,{key:n,effect:"plain"},{default:s(()=>[y(i(n),1)]),_:2},1024))),128))])):P("",!0),e("div",Kt,[t(b,{text:"",type:"primary",onClick:l[3]||(l[3]=n=>c("publish",d.definition))},{default:s(()=>[...l[14]||(l[14]=[y("发布版本",-1)])]),_:1}),t(b,{text:"",onClick:l[4]||(l[4]=n=>c("validate",d.definition))},{default:s(()=>[...l[15]||(l[15]=[y("逻辑校验",-1)])]),_:1}),t(b,{text:"",type:"info",onClick:l[5]||(l[5]=n=>c("versions",d.definition))},{default:s(()=>[...l[16]||(l[16]=[y("版本记录",-1)])]),_:1}),t(b,{text:"",type:"danger",onClick:l[6]||(l[6]=n=>c("delete",d.definition))},{default:s(()=>[...l[17]||(l[17]=[y("删除",-1)])]),_:1})])])])):(p(),A(D,{key:1,description:"请选择左侧的工作流"}))])}}}),Gt=q(jt,[["__scopeId","data-v-a60b6d8b"]]),Ht={class:"drawer-body"},qt={class:"drawer-header"},Jt={class:"filter-row"},Yt={class:"node-id"},Qt={class:"reason-text"},Xt={class:"detail-json"},Zt={class:"table-footer"},pe="ops-console",el=H({__name:"WorkflowEngineAlertDrawer",props:{modelValue:{type:Boolean}},emits:["update:modelValue","refresh"],setup(B,{emit:a}){const c=B,w=a,d=R([]),l=R(!1),f=ue({page:1,page_size:10,total:0}),b=ue({status:"OPEN",severity:"",run_id:""}),D=V({get:()=>c.modelValue,set:v=>w("update:modelValue",v)});fe(()=>c.modelValue,v=>{v&&$()});const n=v=>ce[v],u=v=>ve[v],E=v=>({color:n(v).color,background:n(v).bgColor,borderColor:"transparent"}),z=v=>v==="cancel"||v==="close",N=()=>{D.value=!1},$=async()=>{l.value=!0;try{const v=await Le({status:b.status||void 0,severity:b.severity||void 0,run_id:b.run_id||void 0,page:f.page,page_size:f.page_size});d.value=v.list,f.total=v.total}catch{T.error("加载告警失败")}finally{l.value=!1}},O=()=>{f.page=1,$()},J=v=>{f.page=v,$()},U=v=>v?new Date(v).toLocaleString():"--",Y=v=>{if(!v)return"";try{return JSON.stringify(v)}catch{return String(v)}},F=async v=>{await ne.confirm(v,"提示",{confirmButtonText:"继续",cancelButtonText:"取消",type:"warning"})},K=async v=>{try{await F("确认已知晓该告警?"),await Pe(v.id,{operator:pe}),T.success("已标记为已知晓"),w("refresh"),await $()}catch(C){if(z(C))return;T.error("操作失败")}},_=async v=>{try{await F("确认该告警已解决?"),await Be(v.id,{operator:pe}),T.success("已标记为已解决"),w("refresh"),await $()}catch(C){if(z(C))return;T.error("操作失败")}};return(v,C)=>{const ee=m("el-tag"),G=m("el-option"),te=m("el-select"),ae=m("el-input"),Q=m("el-button"),S=m("el-table-column"),le=m("el-table"),X=m("el-pagination"),oe=m("el-drawer"),ie=ze("loading");return p(),A(oe,{class:"workflow-alert-drawer","model-value":D.value,size:"720px","with-header":!1,onClose:N},{default:s(()=>[e("div",Ht,[e("div",qt,[C[4]||(C[4]=e("div",null,[e("p",{class:"drawer-title"},"工作流引擎告警"),e("p",{class:"drawer-subtitle"},"高优先级运行异常统一在此汇总")],-1)),t(ee,{type:"danger",effect:"dark"},{default:s(()=>[C[3]||(C[3]=e("i",{class:"i-carbon-warning-alt-filled mr-1"},null,-1)),y(" "+i(f.total)+" 个告警 ",1)]),_:1})]),e("div",Jt,[t(te,{modelValue:b.status,"onUpdate:modelValue":C[0]||(C[0]=g=>b.status=g),placeholder:"状态",size:"small",onChange:O},{default:s(()=>[t(G,{label:"全部状态",value:""}),(p(!0),h(W,null,L(I(ce),(g,x)=>(p(),A(G,{key:x,label:g.label,value:x},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),t(te,{modelValue:b.severity,"onUpdate:modelValue":C[1]||(C[1]=g=>b.severity=g),placeholder:"严重程度",size:"small",onChange:O},{default:s(()=>[t(G,{label:"全部等级",value:""}),(p(!0),h(W,null,L(I(ve),(g,x)=>(p(),A(G,{key:x,label:g.label,value:x},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),t(ae,{modelValue:b.run_id,"onUpdate:modelValue":C[2]||(C[2]=g=>b.run_id=g),placeholder:"Run ID",size:"small",clearable:"",onClear:O,onKeyup:Ee(O,["enter","native"])},null,8,["modelValue"]),t(Q,{size:"small",onClick:$},{default:s(()=>[...C[5]||(C[5]=[e("i",{class:"i-carbon-renew mr-1"},null,-1),y("刷新",-1)])]),_:1})]),Te((p(),A(le,{data:d.value,height:"420",border:""},{default:s(()=>[t(S,{label:"严重",width:"120"},{default:s(({row:g})=>[e("span",{class:"severity-pill",style:Z({color:u(g.severity).color})},[e("i",{class:j(u(g.severity).icon)},null,2),y(" "+i(u(g.severity).label),1)],4)]),_:1}),t(S,{label:"状态",width:"120"},{default:s(({row:g})=>[t(ee,{style:Z(E(g.status)),class:"status-tag",size:"small"},{default:s(()=>[e("i",{class:j(n(g.status).icon)},null,2),y(" "+i(n(g.status).label),1)]),_:2},1032,["style"])]),_:1}),t(S,{label:"节点","min-width":"160"},{default:s(({row:g})=>[e("p",Yt,i(g.node_id),1),e("small",null,"Loop #"+i(g.loop_index),1)]),_:1}),t(S,{label:"Run ID","min-width":"200"},{default:s(({row:g})=>[e("span",null,i(g.run_id||"N/A"),1)]),_:1}),t(S,{label:"原因","min-width":"220"},{default:s(({row:g})=>[e("p",Qt,i(g.reason),1),e("small",Xt,i(Y(g.detail)),1)]),_:1}),t(S,{label:"创建时间",width:"180"},{default:s(({row:g})=>[y(i(U(g.created_time)),1)]),_:1}),t(S,{label:"操作",fixed:"right",width:"200"},{default:s(({row:g})=>[g.status==="OPEN"?(p(),A(Q,{key:0,size:"small",type:"warning",text:"",onClick:x=>K(g)},{default:s(()=>[...C[6]||(C[6]=[y(" 已知晓 ",-1)])]),_:1},8,["onClick"])):P("",!0),t(Q,{size:"small",type:"success",text:"",disabled:g.status==="RESOLVED",onClick:x=>_(g)},{default:s(()=>[...C[7]||(C[7]=[y(" 标记解决 ",-1)])]),_:1},8,["disabled","onClick"])]),_:1})]),_:1},8,["data"])),[[ie,l.value]]),e("div",Zt,[t(X,{layout:"prev, pager, next",total:f.total,"page-size":f.page_size,"current-page":f.page,onCurrentChange:J},null,8,["total","page-size","current-page"])])])]),_:1},8,["model-value"])}}}),tl=q(el,[["__scopeId","data-v-c9598963"]]),ll={class:"workflow-center-actions"},sl={class:"action-left"},nl={class:"action-right"},al={class:"auto-refresh-toggle"},ol={class:"workflow-layout"},il={class:"workflow-left"},rl={class:"workflow-right"},dl={key:1,class:"version-history"},ul={class:"version-row"},cl={class:"version-title"},vl={class:"version-summary"},pl={class:"version-row-actions"},fl={key:0,class:"version-preview"},_l={class:"version-preview-header"},ml=H({__name:"WorkflowCenter",setup(B){const a=Ue(),c=xe(),w=R(""),d=R(null),l=R(!1),f=R(!0),b=R(null);let D=null;const n=R(!1),u=R(!1),E=R(!1),z=R([]),N=R(null),$=R(null),O=V(()=>a.currentDefinition),J=V(()=>a.definitions.filter(r=>r.is_active).length),U=V(()=>a.stats?.engine_alerts_open??0),Y=V(()=>a.definitions.filter(r=>{const o=w.value?r.name.toLowerCase().includes(w.value.toLowerCase())||(r.tags||[]).some(se=>se.toLowerCase().includes(w.value.toLowerCase())):!0,M=d.value?d.value==="ACTIVE"?r.is_active:!r.is_active:!0;return o&&M})),F=V(()=>b.value?new Intl.DateTimeFormat("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}).format(b.value):""),K=r=>{r?c.push({path:`/workflow/designer/${r}`}):c.push({path:"/workflow/designer"})},_=r=>{c.push({path:"/workflow/runs",query:r?{workflow_id:r}:void 0})},v=async r=>{const{value:o}=await ne.prompt("请输入复制后的名称","复制工作流",{inputValue:`${r.name}-copy`,inputPlaceholder:"新工作流名称"});await a.duplicateDefinitionAction(r.id,o)},C=async r=>{await a.toggleDefinitionStatus(r.id)},ee=async r=>{a.setSelectedId(r);try{await a.fetchDefinitionDetailAction(r)}catch{T.error("获取工作流详情失败")}},G=async r=>{try{const o=await Oe(r.id,{trigger_context:{source:"ops-console",manual:!0}});T.success(o.dispatch_status==="DISPATCHED"?"已触发运行":"已加入队列")}catch{T.error("触发失败")}},te=async r=>{await ne.confirm(`确认删除工作流 “${r.name}” 吗?`,"删除确认",{confirmButtonText:"删除",type:"warning"}),await a.removeDefinition(r.id)},ae=async r=>{await a.publishDefinition(r.id)},Q=async r=>{await a.validateCurrentDesigner(r.id)},S=async(r=!1)=>{if(!l.value){l.value=!0;try{const o=a.selectedId?a.fetchDefinitionDetailAction(a.selectedId):Promise.resolve();await Promise.all([a.fetchDefinitionsAction(),a.fetchWorkflowStatsAction(),o]),b.value=new Date,r&&T.success("数据已刷新")}catch{r&&T.error("刷新失败")}finally{l.value=!1}}},le=()=>{f.value&&(X(),D=window.setInterval(()=>{S(!1)},6e4))},X=()=>{D!==null&&(clearInterval(D),D=null)},oe=()=>{n.value=!0},ie=()=>{a.fetchWorkflowStatsAction()},g=async r=>{u.value=!0,N.value=r,$.value=null,await x(r.id)},x=async r=>{E.value=!0;try{const o=await a.fetchWorkflowVersionsAction(r);z.value=o?.versions||[],$.value=z.value[0]||null}catch{T.error("获取版本记录失败"),z.value=[]}finally{E.value=!1}},_e=r=>{$.value=r},me=async r=>{if(N.value)try{const{value:o}=await ne.prompt(`回滚到 v${r.version},请输入原因(可选)`,"回滚版本",{inputPlaceholder:"记录本次回滚原因 (可选)",confirmButtonText:"回滚",cancelButtonText:"取消",inputType:"textarea"}),M=await a.rollbackWorkflowVersionAction(N.value.id,{target_version:r.version,reason:o||void 0});N.value=M,await x(N.value.id),T.success("回滚成功")}catch(o){if(o==="cancel"||o==="close")return;T.error("回滚失败")}},ge=r=>{const o=new Date(r);return Number.isNaN(o.getTime())?"--":new Intl.DateTimeFormat("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}).format(o)};return Se(async()=>{await S(!1),f.value&&le()}),fe(f,r=>{r?le():X()}),We(()=>{X()}),(r,o)=>{const M=m("el-button"),se=m("el-tag"),ye=m("el-badge"),we=m("el-switch"),be=m("el-skeleton"),ke=m("el-empty"),he=m("el-timeline-item"),$e=m("el-timeline"),re=m("el-descriptions-item"),Ce=m("el-descriptions"),De=m("el-input"),Ve=m("el-drawer");return p(),A(Ie,{title:"定时任务编排中心",subtitle:"可视化图编排 · Cron 定时 · 运行追踪",icon:"i-carbon-workspace"},{default:s(()=>[t(Je,{stats:I(a).stats,"fallback-total":I(a).definitions.length,"fallback-active":J.value,"fallback-runs":0,"fallback-failed":0},null,8,["stats","fallback-total","fallback-active"]),t(pt,{stats:I(a).stats},null,8,["stats"]),e("div",ll,[e("div",sl,[t(M,{loading:l.value,onClick:o[0]||(o[0]=k=>S(!0))},{default:s(()=>[...o[11]||(o[11]=[e("i",{class:"i-carbon-renew mr-2"},null,-1),y(" 刷新数据 ",-1)])]),_:1},8,["loading"]),F.value?(p(),A(se,{key:0,type:"info",effect:"plain"},{default:s(()=>[y(" 上次刷新:"+i(F.value),1)]),_:1})):P("",!0)]),e("div",nl,[t(ye,{class:"alert-badge",value:U.value,hidden:U.value===0},{default:s(()=>[t(M,{type:"danger",plain:"",onClick:oe},{default:s(()=>[...o[12]||(o[12]=[e("i",{class:"i-carbon-warning-alt mr-2"},null,-1),y(" 告警中心 ",-1)])]),_:1})]),_:1},8,["value","hidden"]),e("div",al,[o[13]||(o[13]=e("span",{class:"action-label"},"自动刷新",-1)),t(we,{modelValue:f.value,"onUpdate:modelValue":o[1]||(o[1]=k=>f.value=k)},null,8,["modelValue"])])])]),e("div",ol,[e("div",il,[t(Dt,{definitions:Y.value,loading:I(a).loading,"selected-id":I(a).selectedId,keyword:w.value,"onUpdate:keyword":o[2]||(o[2]=k=>w.value=k),status:d.value,"onUpdate:status":o[3]||(o[3]=k=>d.value=k),onSelect:ee,onCreate:o[4]||(o[4]=k=>K()),onDuplicate:v,onToggle:C,onDesign:o[5]||(o[5]=k=>K(k.id)),onRuns:o[6]||(o[6]=k=>_(k.id))},null,8,["definitions","loading","selected-id","keyword","status"])]),e("div",rl,[t(Gt,{definition:O.value,onEdit:o[7]||(o[7]=k=>K(k.id)),onRun:G,onRuns:o[8]||(o[8]=k=>_(k.id)),onDelete:te,onPublish:ae,onValidate:Q,onVersions:g},null,8,["definition"])])]),t(Ve,{modelValue:u.value,"onUpdate:modelValue":o[9]||(o[9]=k=>u.value=k),direction:"rtl",size:"480px",title:N.value?`${N.value.name} · 版本记录`:"版本记录","destroy-on-close":""},{default:s(()=>[E.value?(p(),A(be,{key:0,animated:"",rows:6})):(p(),h(W,{key:1},[z.value.length?(p(),h("div",dl,[t($e,{class:"version-timeline"},{default:s(()=>[(p(!0),h(W,null,L(z.value,k=>(p(),A(he,{key:k.version,timestamp:ge(k.created_time),type:k.version===N.value?.version?"primary":"info"},{default:s(()=>[e("div",ul,[e("div",null,[e("p",cl,"版本 v"+i(k.version),1),e("p",vl,i(k.change_summary||"未填写说明"),1)]),e("div",pl,[t(M,{size:"small",onClick:Ae=>_e(k)},{default:s(()=>[...o[14]||(o[14]=[y("查看",-1)])]),_:1},8,["onClick"]),t(M,{size:"small",type:"danger",plain:"",disabled:k.version===N.value?.version,onClick:Ae=>me(k)},{default:s(()=>[...o[15]||(o[15]=[y("回滚",-1)])]),_:1},8,["disabled","onClick"])])])]),_:2},1032,["timestamp","type"]))),128))]),_:1}),$.value?(p(),h("div",fl,[e("div",_l,[e("p",null,"版本 v"+i($.value.version)+" 概览",1),t(se,{size:"small",effect:"plain"},{default:s(()=>[y(i($.value.is_active?"启用版本":"停用版本"),1)]),_:1})]),t(Ce,{column:1,border:"",class:"mb-3"},{default:s(()=>[t(re,{label:"Cron 表达式"},{default:s(()=>[y(i($.value.schedule||"未配置"),1)]),_:1}),t(re,{label:"说明"},{default:s(()=>[y(i($.value.change_summary||"未填写"),1)]),_:1}),t(re,{label:"节点数量"},{default:s(()=>[y(i(Object.keys($.value.nodes_config||{}).length),1)]),_:1})]),_:1}),t(De,{type:"textarea",rows:8,readonly:"","model-value":JSON.stringify($.value.graph_data?.nodes||[],null,2)},null,8,["model-value"])])):P("",!0)])):(p(),A(ke,{key:0,description:"暂无版本记录"}))],64))]),_:1},8,["modelValue","title"]),t(tl,{modelValue:n.value,"onUpdate:modelValue":o[10]||(o[10]=k=>n.value=k),onRefresh:ie},null,8,["modelValue"])]),_:1})}}}),bl=q(ml,[["__scopeId","data-v-a359ce7b"]]);export{bl as default};
@@ -0,0 +1 @@
1
+ import{d as Se,c as S,b,e,i as t,j as _,w as s,l as d,F as ae,B as ke,U as et,n as Te,t as ue,_ as Le,x as $,r as le,G as Ce,g as h,h as F,E as H,y as A,o as ut,H as rt,X as Me,D as pt,a as ct,q as ft,m as Xe,L as mt}from"./index-CiFlm8oc.js";import{P as be,_ as ye,u as vt,a as gt,b as bt,c as yt,d as _t}from"./style-lRnStdGu.js";import{P as xt}from"./PageContainer-Byss-yUC.js";import{u as wt,D as Nt}from"./workflow-CUXs39Ac.js";const Ot={class:"designer-meta-panel"},kt={class:"pane-section"},Tt={class:"cron-presets"},Ct={class:"preset-buttons"},St={class:"pane-section"},Lt={class:"palette"},Dt=["onDragstart","onClick"],Et={class:"item-info"},It={class:"item-title"},At={class:"item-desc"},$t=Se({__name:"DesignerMetaPanel",props:{meta:{},globalContextText:{},templates:{}},emits:["update:meta","update:globalContextText","drag-start","add-node"],setup(K,{emit:j}){const a=K,L=j,m=(x,v)=>{L("update:meta",{...a.meta,[x]:v})},p=(x,v)=>{L("drag-start",x,v)},W=x=>{L("update:meta",{...a.meta,schedule:x})};return(x,v)=>{const V=_("el-input"),Y=_("el-form-item"),oe=_("el-select"),re=_("el-tag"),pe=_("el-button"),X=_("el-button-group"),E=_("el-switch"),z=_("el-form");return b(),S("div",Ot,[e("section",kt,[v[15]||(v[15]=e("div",{class:"section-header"},[e("p",null,"工作流配置")],-1)),t(z,{"label-width":"80px","label-position":"top",class:"pane-form"},{default:s(()=>[t(Y,{label:"名称",required:""},{default:s(()=>[t(V,{"model-value":x.meta.name,"onUpdate:modelValue":v[0]||(v[0]=N=>m("name",N)),placeholder:"请输入工作流名称"},null,8,["model-value"])]),_:1}),t(Y,{label:"描述"},{default:s(()=>[t(V,{"model-value":x.meta.description,"onUpdate:modelValue":v[1]||(v[1]=N=>m("description",N)),placeholder:"功能说明",type:"textarea",rows:2},null,8,["model-value"])]),_:1}),t(Y,{label:"标签"},{default:s(()=>[t(oe,{"model-value":x.meta.tags,"onUpdate:modelValue":v[2]||(v[2]=N=>m("tags",N)),multiple:"",filterable:"","allow-create":"","collapse-tags":"",placeholder:"输入标签"},null,8,["model-value"])]),_:1}),t(Y,{label:"全局上下文 (JSON)"},{default:s(()=>[t(V,{"model-value":x.globalContextText,"onUpdate:modelValue":v[3]||(v[3]=N=>x.$emit("update:globalContextText",N)),type:"textarea",rows:4,placeholder:'{"env":"prod"}'},null,8,["model-value"])]),_:1}),t(Y,{label:"Cron 表达式 (秒 分 时 日 月 星期)"},{default:s(()=>[t(V,{"model-value":x.meta.schedule,"onUpdate:modelValue":v[4]||(v[4]=N=>m("schedule",N)),placeholder:"0 0 0 * * *"},null,8,["model-value"]),v[14]||(v[14]=e("p",{class:"cron-hint"},"示例:0 0 0 * * * → 每天 00:00:00 触发;支持 6 字段秒级 Cron。",-1)),e("div",Tt,[v[13]||(v[13]=e("span",null,"常用快捷:",-1)),e("div",Ct,[t(re,{size:"small",type:"info",effect:"plain"},{default:s(()=>[...v[9]||(v[9]=[d("Asia/Shanghai",-1)])]),_:1}),t(X,null,{default:s(()=>[t(pe,{size:"small",text:"",onClick:v[5]||(v[5]=N=>W("0 0 * * * *"))},{default:s(()=>[...v[10]||(v[10]=[d("每小时",-1)])]),_:1}),t(pe,{size:"small",text:"",onClick:v[6]||(v[6]=N=>W("0 0 2 * * *"))},{default:s(()=>[...v[11]||(v[11]=[d("每天 02:00",-1)])]),_:1}),t(pe,{size:"small",text:"",onClick:v[7]||(v[7]=N=>W("0 */5 * * * *"))},{default:s(()=>[...v[12]||(v[12]=[d("每 5 分钟",-1)])]),_:1})]),_:1})])])]),_:1}),t(E,{"model-value":x.meta.is_active,"onUpdate:modelValue":v[8]||(v[8]=N=>m("is_active",N)),"active-text":"启用","inactive-text":"停用"},null,8,["model-value"])]),_:1})]),e("section",St,[v[17]||(v[17]=e("div",{class:"section-header"},[e("p",null,"节点库")],-1)),e("div",Lt,[(b(!0),S(ae,null,ke(x.templates,N=>(b(),S("div",{key:N.type,class:"palette-item",draggable:"true",onDragstart:J=>p(J,N),onClick:J=>x.$emit("add-node",N)},[e("div",{class:"item-icon",style:et({backgroundColor:N.color})},[e("i",{class:Te(N.icon)},null,2)],4),e("div",Et,[e("p",It,ue(N.label),1),e("p",At,ue(N.description),1)]),v[16]||(v[16]=e("i",{class:"i-carbon-add ml-auto md:hidden text-primary"},null,-1))],40,Dt))),128))])])])}}}),Qe=Le($t,[["__scopeId","data-v-3061b725"]]),Rt={class:"designer-config-panel"},Ut={class:"pane-section"},Jt={class:"section-header"},Pt={class:"node-id-row"},Mt={key:0,class:"immutable-hint"},jt={key:4,class:"grid grid-cols-2 gap-2"},Bt={class:"inline-actions"},Ft={class:"expr-template-row"},Vt={class:"expr-template-row"},Ht={key:0,class:"fork-branch-list"},zt={class:"fork-branch-meta"},qt={class:"label"},ht=Se({__name:"DesignerNodeConfigPanel",props:{activeNode:{},config:{},schemaText:{},outgoingTargets:{},availableContextKeys:{},availableNodeRefs:{}},emits:["update:config","sync-label","delete-node"],setup(K,{emit:j}){const a=K,L=j,m=$(()=>a.config.type==="START"||a.config.type==="END"),p=$(()=>a.config.type==="ACTION"?a.config.config:void 0),W=$(()=>a.config.type==="LOGIC"?a.config.config:void 0),x=$(()=>a.config.type==="LOOP"?a.config.config:void 0),v=$(()=>a.config.type==="JOIN"?a.config.config:void 0),V=$(()=>a.config.type==="FORK"?a.config.config:void 0),Y=$(()=>a.config.type==="TRANSFORM"?a.config.config:void 0),oe=(i,n)=>{m.value&&i==="name"||L("update:config",{...a.config,[i]:n})},re=async(i,n)=>{try{if(!i){H.warning("没有可复制内容");return}await navigator.clipboard.writeText(i),H.success(n)}catch{H.error("复制失败,请检查浏览器权限")}},pe=async()=>{const i=a.activeNode?.id||a.config.id;await re(i,"节点 ID 已复制")},X=async()=>{const n=`{{ context.__runtime__.node_outputs['${a.activeNode?.id||a.config.id}'].output }}`;await re(n,"节点输出引用已复制")},E=$(()=>{const i=[{label:"上一步 HTTP 状态码 == 200",value:"{{ context.__runtime__.last_output.status_code == 200 }}"},{label:"上一步执行状态为 SUCCESS",value:"{{ context.__runtime__.last_status == 'SUCCESS' }}"},{label:"当前循环次数 > 10(执行满 10 次后退出)",value:"{{ context.loop_index > 10 }}"}],n=a.activeNode?.id||a.config.id;n&&i.push({label:`当前节点输出(${n})`,value:`{{ context.__runtime__.node_outputs['${n}'].output }}`}),(a.availableContextKeys||[]).forEach(O=>{i.push({label:`业务键:context.${O}`,value:`{{ context.${O} }}`})}),(a.availableNodeRefs||[]).filter(O=>O.id!==n).forEach(O=>{i.push({label:`节点输出:${O.label} (${O.id})`,value:`{{ context.__runtime__.node_outputs['${O.id}'].output }}`})});const I=new Map;return i.forEach(O=>{I.has(O.value)||I.set(O.value,O)}),Array.from(I.values())}),z=le(""),N=()=>{const i=z.value;if(!i){H.warning("请先选择表达式模板");return}if(a.config.type!=="LOGIC"&&a.config.type!=="LOOP"){H.warning("仅 LOGIC / LOOP 节点支持表达式模板插入");return}const g=(a.config.config?.condition||"").trim(),T=g?`${g} and ${i}`:i;Z("condition",T),H.success("表达式模板已插入")},J=async()=>{const i=z.value;await re(i,"表达式模板已复制")},Z=(i,n)=>{a.config.config&&L("update:config",{...a.config,config:{...a.config.config,[i]:n}})},k=(i,n)=>{const g=p.value;g&&L("update:config",{...a.config,config:{...g,request:{...g.request,[i]:n}}})},P=(i,n)=>{const g=p.value;if(g)try{const T=JSON.parse(n);L("update:config",{...a.config,config:{...g,request:{...g.request,[i]:T}}})}catch{}},se=(i,n)=>{const g=p.value;g&&L("update:config",{...a.config,config:{...g,request:{...g.request,[i]:n}}})},R=i=>{const n=p.value;if(!n)return;let g=i;const T=i.trim();if(T.startsWith("{")||T.startsWith("["))try{g=JSON.parse(i)}catch{g=i}L("update:config",{...a.config,config:{...n,request:{...n.request,body:g}}})},me=(i,n)=>{const g=p.value;if(!g)return;const T=g.retry_policy||{enabled:!1,max_attempts:3,interval_seconds:5};L("update:config",{...a.config,config:{...g,retry_policy:{...T,[i]:n}}})},De=i=>{const n=p.value;if(n)try{const g=JSON.parse(i);g&&typeof g=="object"&&!Array.isArray(g)&&L("update:config",{...a.config,config:{...n,context_mappings:g}})}catch{}},Ee=()=>{const i=p.value;i&&(L("update:config",{...a.config,config:{...i,context_mappings:{"biz.user_id":"json_body.data.user.id","biz.order_total":"json_body.data.amount",api_ok:"ok"}}}),H.success("已填充映射示例"))},Ue=()=>{const i=p.value;if(!i)return;const n=i.context_mappings||{},g={};Object.keys(n).sort().forEach(T=>{g[T]=n[T]}),L("update:config",{...a.config,config:{...i,context_mappings:g}}),H.success("映射 JSON 已格式化")},ve=(i,n)=>{try{const g=JSON.parse(n);Z(i,g)}catch{}},we=$(()=>a.outgoingTargets||[]),Ne=$(()=>a.config.type!=="FORK"||!a.config.config?{}:a.config.config.branch_labels||{}),_e=(i,n)=>{if(a.config.type!=="FORK"||!a.config.config)return;const g=a.config.config,T={...g.branch_labels||{}},I=n?.trim();I?T[i]=I:delete T[i],L("update:config",{...a.config,config:{...g,branch_labels:T}})};return Ce(we,i=>{if(a.config.type!=="FORK"||!a.config.config)return;const n=a.config.config,g=i.map(ne=>ne.id),T=n.branch_node_ids||[],I=T.length!==g.length||T.some((ne,Q)=>ne!==g[Q]),O={...n.branch_labels||{}};let C=!1;Object.keys(O).forEach(ne=>{g.includes(ne)||(delete O[ne],C=!0)}),(I||C)&&L("update:config",{...a.config,config:{...n,branch_node_ids:g,branch_labels:O}})},{immediate:!0}),Ce(()=>a.activeNode?.id,()=>{z.value=""}),(i,n)=>{const g=_("el-tag"),T=_("el-empty"),I=_("el-input"),O=_("el-button"),C=_("el-form-item"),ne=_("el-alert"),Q=_("el-option"),ee=_("el-select"),ge=_("el-input-number"),Oe=_("el-divider"),Je=_("el-switch"),Ie=_("el-form");return b(),S("div",Rt,[e("section",Ut,[e("div",Jt,[n[26]||(n[26]=e("p",null,"节点配置",-1)),i.activeNode?(b(),h(g,{key:0,size:"small"},{default:s(()=>[d(ue(i.activeNode.data?.label),1)]),_:1})):F("",!0)]),i.activeNode?(b(),h(Ie,{key:1,"label-width":"90px","label-position":"top",class:"pane-form"},{default:s(()=>[t(C,{label:"节点 ID"},{default:s(()=>[e("div",Pt,[t(I,{"model-value":i.activeNode?.id||i.config.id,readonly:""},null,8,["model-value"]),t(O,{text:"",type:"primary",onClick:pe},{default:s(()=>[...n[27]||(n[27]=[d("复制 ID",-1)])]),_:1}),t(O,{text:"",type:"primary",onClick:X},{default:s(()=>[...n[28]||(n[28]=[d("复制输出引用",-1)])]),_:1})]),n[29]||(n[29]=e("div",{class:"form-tip"},"节点 ID 会在画布节点卡片与本面板同时显示;推荐优先使用 context_mappings 产出的业务键,ID 引用用于排障或临时联调。",-1))]),_:1}),t(C,{label:"节点名称"},{default:s(()=>[t(I,{"model-value":i.config.name,disabled:m.value,"onUpdate:modelValue":n[0]||(n[0]=r=>oe("name",r)),onChange:n[1]||(n[1]=r=>i.$emit("sync-label"))},null,8,["model-value","disabled"]),m.value?(b(),S("p",Mt,"开始/结束节点的名称已固定,无法编辑")):F("",!0)]),_:1}),i.config.type==="START"?(b(),h(ne,{key:0,type:"info",closable:!1,"show-icon":"",class:"mb-3",title:"调度说明 / Scheduling"},{default:s(()=>[...n[30]||(n[30]=[e("p",null,"开始节点遵循左侧“工作流配置”中的 Cron 表达式,无需单独设置。",-1),e("p",{class:"text-xs text-secondary"},"The start node inherits the workflow-level cron schedule; configure triggers via the Workflow Settings panel.",-1)])]),_:1})):i.config.type==="ACTION"&&p.value?(b(),S(ae,{key:1},[n[34]||(n[34]=e("div",{class:"form-section-title"},"请求配置",-1)),t(C,{label:"Method"},{default:s(()=>[t(ee,{"model-value":p.value.request.method,"onUpdate:modelValue":n[2]||(n[2]=r=>k("method",r))},{default:s(()=>[(b(),S(ae,null,ke(["GET","POST","PUT","DELETE","PATCH"],r=>t(Q,{key:r,label:r,value:r},null,8,["label","value"])),64))]),_:1},8,["model-value"])]),_:1}),t(C,{label:"URL"},{default:s(()=>[t(I,{"model-value":p.value.request.url,"onUpdate:modelValue":n[3]||(n[3]=r=>k("url",r)),placeholder:"https://api.example.com/..."},null,8,["model-value"])]),_:1}),t(C,{label:"Timeout (s)"},{default:s(()=>[t(ge,{"model-value":p.value.request.timeout_seconds,"onUpdate:modelValue":n[4]||(n[4]=r=>k("timeout_seconds",r)),min:1,max:60},null,8,["model-value"])]),_:1}),t(C,{label:"Query Params (JSON)"},{default:s(()=>[t(I,{"model-value":JSON.stringify(p.value.request.params||{},null,2),"onUpdate:modelValue":n[5]||(n[5]=r=>P("params",r)),type:"textarea",rows:4,placeholder:'{"page":"1","size":"20"}'},null,8,["model-value"])]),_:1}),t(C,{label:"Headers (JSON)"},{default:s(()=>[t(I,{"model-value":JSON.stringify(p.value.request.headers||{},null,2),"onUpdate:modelValue":n[6]||(n[6]=r=>P("headers",r)),type:"textarea",rows:4,placeholder:'{"Authorization":"Bearer {{ context.token }}"}'},null,8,["model-value"])]),_:1}),t(C,{label:"Body Type"},{default:s(()=>[t(ee,{"model-value":p.value.request.body_type||"auto","onUpdate:modelValue":n[7]||(n[7]=r=>k("body_type",r))},{default:s(()=>[t(Q,{label:"auto",value:"auto"}),t(Q,{label:"json",value:"json"}),t(Q,{label:"form-urlencoded",value:"form-urlencoded"}),t(Q,{label:"multipart",value:"multipart"}),t(Q,{label:"raw",value:"raw"})]),_:1},8,["model-value"])]),_:1}),(p.value.request.body_type||"auto")==="json"?(b(),h(C,{key:0,label:"JSON Body"},{default:s(()=>[t(I,{"model-value":JSON.stringify(p.value.request.json_body??{},null,2),"onUpdate:modelValue":n[8]||(n[8]=r=>P("json_body",r)),type:"textarea",rows:5,placeholder:'{"user_id":"{{ context.user_id }}"}'},null,8,["model-value"])]),_:1})):F("",!0),(p.value.request.body_type||"auto")==="form-urlencoded"||(p.value.request.body_type||"auto")==="multipart"?(b(),h(C,{key:1,label:"Form Body (JSON)"},{default:s(()=>[t(I,{"model-value":JSON.stringify(p.value.request.form_body??{},null,2),"onUpdate:modelValue":n[9]||(n[9]=r=>P("form_body",r)),type:"textarea",rows:5,placeholder:'{"name":"{{ context.name }}"}'},null,8,["model-value"])]),_:1})):F("",!0),(p.value.request.body_type||"auto")==="raw"?(b(),h(C,{key:2,label:"Raw Body"},{default:s(()=>[t(I,{"model-value":String(p.value.request.raw_body??""),"onUpdate:modelValue":n[10]||(n[10]=r=>se("raw_body",r)),type:"textarea",rows:5,placeholder:"plain text / XML / custom payload"},null,8,["model-value"])]),_:1})):F("",!0),(p.value.request.body_type||"auto")==="auto"?(b(),h(C,{key:3,label:"Legacy Body (JSON/String)"},{default:s(()=>[t(I,{"model-value":typeof p.value.request.body=="string"?p.value.request.body:JSON.stringify(p.value.request.body??{},null,2),"onUpdate:modelValue":n[11]||(n[11]=r=>R(r)),type:"textarea",rows:5,placeholder:'{"key":"{{ context.value }}"}'},null,8,["model-value"])]),_:1})):F("",!0),t(Oe),n[35]||(n[35]=e("div",{class:"form-section-title"},"重试策略",-1)),t(C,null,{default:s(()=>[t(Je,{"model-value":p.value.retry_policy?.enabled,"onUpdate:modelValue":n[12]||(n[12]=r=>me("enabled",r)),"active-text":"启用重试"},null,8,["model-value"])]),_:1}),p.value.retry_policy?.enabled?(b(),S("div",jt,[t(C,{label:"最大次数"},{default:s(()=>[t(ge,{"model-value":p.value.retry_policy.max_attempts,"onUpdate:modelValue":n[13]||(n[13]=r=>me("max_attempts",r)),min:1,max:10},null,8,["model-value"])]),_:1}),t(C,{label:"间隔 (s)"},{default:s(()=>[t(ge,{"model-value":p.value.retry_policy.interval_seconds,"onUpdate:modelValue":n[14]||(n[14]=r=>me("interval_seconds",r)),min:1},null,8,["model-value"])]),_:1})])):F("",!0),t(Oe),n[36]||(n[36]=e("div",{class:"form-section-title"},"上下文映射",-1)),e("div",Bt,[t(O,{size:"small",text:"",type:"primary",onClick:Ee},{default:s(()=>[...n[31]||(n[31]=[d("填充示例",-1)])]),_:1}),t(O,{size:"small",text:"",type:"primary",onClick:Ue},{default:s(()=>[...n[32]||(n[32]=[d("格式化 JSON",-1)])]),_:1})]),t(C,{label:"将响应字段映射到 global_context (JSON)"},{default:s(()=>[t(I,{"model-value":JSON.stringify(p.value.context_mappings||{},null,2),"onUpdate:modelValue":n[15]||(n[15]=r=>De(r)),type:"textarea",rows:5,placeholder:'{"biz.user_id": "json_body.data.user.id", "biz.order_total": "json_body.data.amount"}'},null,8,["model-value"]),n[33]||(n[33]=e("div",{class:"form-tip"},"key 为业务上下文路径,value 为 HTTP 输出路径(基于 status_code/headers/text/json_body/ok)。",-1))]),_:1})],64)):i.config.type==="LOGIC"&&W.value?(b(),S(ae,{key:2},[t(C,{label:"表达式模板"},{default:s(()=>[e("div",Ft,[t(ee,{modelValue:z.value,"onUpdate:modelValue":n[16]||(n[16]=r=>z.value=r),placeholder:"选择可插入模板",class:"expr-template-select"},{default:s(()=>[(b(!0),S(ae,null,ke(E.value,r=>(b(),h(Q,{key:r.value,label:r.label,value:r.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),t(O,{text:"",type:"primary",onClick:N},{default:s(()=>[...n[37]||(n[37]=[d("插入",-1)])]),_:1}),t(O,{text:"",type:"primary",onClick:J},{default:s(()=>[...n[38]||(n[38]=[d("复制",-1)])]),_:1})])]),_:1}),t(C,{label:"条件表达式 (Jinja2)"},{default:s(()=>[t(I,{"model-value":W.value.condition,"onUpdate:modelValue":n[17]||(n[17]=r=>Z("condition",r)),type:"textarea",rows:3,placeholder:"{{ context.__runtime__.last_output.status_code == 200 }}"},null,8,["model-value"]),n[39]||(n[39]=e("div",{class:"form-tip"},"支持 Jinja 表达式语法;如需 ID 引用,请点击上方“复制输出引用”按钮自动生成表达式。",-1))]),_:1})],64)):i.config.type==="LOOP"&&x.value?(b(),S(ae,{key:3},[t(ne,{type:"info",closable:!1,"show-icon":"",class:"mb-3",title:"Loop Body / Loop Next / Loop Exit"},{default:s(()=>[...n[40]||(n[40]=[e("p",null,"Loop Body 连接循环体入口;Loop Next 指向循环完成后的下一步;当“退出条件”为 true 时,走 Loop Exit。",-1),e("p",{class:"mt-1"},[d("若按循环次数退出,建议使用 "),e("code",null,"{{ context.loop_index > N }}"),d(",可保证循环体执行满 N 次。")],-1),e("p",{class:"mt-1 text-xs text-secondary"},"Loop Body feeds the iterator, Loop Next continues after completion, and Loop Exit is selected when the exit condition evaluates to true.",-1)])]),_:1}),t(C,{label:"最大循环次数"},{default:s(()=>[t(ge,{"model-value":x.value.max_iterations,"onUpdate:modelValue":n[18]||(n[18]=r=>Z("max_iterations",r)),min:1,max:1e3},null,8,["model-value"])]),_:1}),t(C,{label:"表达式模板"},{default:s(()=>[e("div",Vt,[t(ee,{modelValue:z.value,"onUpdate:modelValue":n[19]||(n[19]=r=>z.value=r),placeholder:"选择可插入模板",class:"expr-template-select"},{default:s(()=>[(b(!0),S(ae,null,ke(E.value,r=>(b(),h(Q,{key:r.value,label:r.label,value:r.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),t(O,{text:"",type:"primary",onClick:N},{default:s(()=>[...n[41]||(n[41]=[d("插入",-1)])]),_:1}),t(O,{text:"",type:"primary",onClick:J},{default:s(()=>[...n[42]||(n[42]=[d("复制",-1)])]),_:1})])]),_:1}),t(C,{label:"退出条件"},{default:s(()=>[t(I,{"model-value":x.value.condition,"onUpdate:modelValue":n[20]||(n[20]=r=>Z("condition",r)),type:"textarea",rows:3,placeholder:"{{ context.loop_index > 10 or context.__runtime__.last_status != 'SUCCESS' }}"},null,8,["model-value"])]),_:1})],64)):i.config.type==="JOIN"&&v.value?(b(),S(ae,{key:4},[t(C,{label:"汇聚模式"},{default:s(()=>[t(ee,{"model-value":v.value.mode,"onUpdate:modelValue":n[21]||(n[21]=r=>Z("mode",r))},{default:s(()=>[t(Q,{label:"所有前置完成 (ALL)",value:"ALL"}),t(Q,{label:"任意前置完成 (ANY)",value:"ANY"})]),_:1},8,["model-value"])]),_:1}),t(C,{label:"超时 (s)"},{default:s(()=>[t(ge,{"model-value":v.value.timeout_seconds,"onUpdate:modelValue":n[22]||(n[22]=r=>Z("timeout_seconds",r)),min:1},null,8,["model-value"])]),_:1})],64)):i.config.type==="FORK"&&V.value?(b(),S(ae,{key:5},[t(ne,{type:"info",closable:!1,"show-icon":"",class:"mb-3",title:"并行分支说明"},{default:s(()=>[...n[43]||(n[43]=[e("p",null,"Fork 节点本身不执行逻辑,连接的每个下游节点会被同时触发。",-1),e("p",{class:"mt-1 text-xs text-secondary"},"可为每条分支配置描述,帮助运行监控与排障。",-1)])]),_:1}),we.value.length?(b(),S("div",Ht,[(b(!0),S(ae,null,ke(we.value,r=>(b(),S("div",{key:r.id,class:"fork-branch-item"},[e("div",zt,[e("span",qt,ue(r.label),1),t(g,{size:"small",effect:"plain"},{default:s(()=>[d(ue(r.id),1)]),_:2},1024)]),t(I,{"model-value":Ne.value[r.id]||"","onUpdate:modelValue":Ae=>_e(r.id,Ae),placeholder:"分支描述(可选)"},null,8,["model-value","onUpdate:modelValue"])]))),128))])):(b(),h(T,{key:1,description:"请先为 Fork 节点连接下游节点","image-size":120}))],64)):i.config.type==="TRANSFORM"&&Y.value?(b(),S(ae,{key:6},[t(C,{label:"引擎"},{default:s(()=>[t(ee,{"model-value":Y.value.engine,"onUpdate:modelValue":n[23]||(n[23]=r=>Z("engine",r))},{default:s(()=>[t(Q,{label:"Jinja2",value:"JINJA2"}),t(Q,{label:"JMESPath",value:"JMESPATH"})]),_:1},8,["model-value"])]),_:1}),t(C,{label:"输出映射 (JSON)"},{default:s(()=>[t(I,{"model-value":JSON.stringify(Y.value.output_schema,null,2),"onUpdate:modelValue":n[24]||(n[24]=r=>ve("output_schema",r)),type:"textarea",rows:6,placeholder:'{"key": "{{ value }}"}'},null,8,["model-value"])]),_:1})],64)):F("",!0),t(Oe),i.config.type!=="START"&&i.config.type!=="END"?(b(),h(O,{key:7,type:"danger",plain:"",class:"w-full",onClick:n[25]||(n[25]=r=>i.$emit("delete-node",i.activeNode.id))},{default:s(()=>[...n[44]||(n[44]=[e("i",{class:"i-carbon-trash-can mr-2"},null,-1),d(" 删除节点 ",-1)])]),_:1})):F("",!0)]),_:1})):(b(),h(T,{key:0,description:"选择画布中的节点","image-size":80}))])])}}}),Ze=Le(ht,[["__scopeId","data-v-6843e49a"]]),Kt={class:"help-content"},Gt={class:"block"},Wt=Se({__name:"DesignerHelpDialog",props:{visible:{type:Boolean}},emits:["update:visible"],setup(K){return(j,a)=>{const L=_("el-alert"),m=_("el-step"),p=_("el-steps"),W=_("el-tab-pane"),x=_("el-descriptions-item"),v=_("el-descriptions"),V=_("el-collapse-item"),Y=_("el-collapse"),oe=_("el-checkbox"),re=_("el-checkbox-group"),pe=_("el-tabs"),X=_("el-divider"),E=_("el-button"),z=_("el-dialog");return b(),h(z,{"model-value":j.visible,title:"工作流设计器详细使用手册",width:"920px",top:"4vh",class:"help-dialog","onUpdate:modelValue":a[1]||(a[1]=N=>j.$emit("update:visible",N))},{footer:s(()=>[t(E,{type:"primary",onClick:a[0]||(a[0]=N=>j.$emit("update:visible",!1))},{default:s(()=>[...a[36]||(a[36]=[d("我知道了",-1)])]),_:1})]),default:s(()=>[e("div",Kt,[t(L,{type:"info",closable:!1,"show-icon":"",title:"面向页面交互的使用说明"},{default:s(()=>[...a[2]||(a[2]=[e("p",null,"本手册完全按页面交互路径组织:怎么搭图、每类节点怎么配、什么时候保存发布、失败了去哪里看。",-1)])]),_:1}),t(pe,{class:"guide-tabs"},{default:s(()=>[t(W,{label:"快速开始"},{default:s(()=>[t(p,{direction:"vertical",active:1},{default:s(()=>[t(m,{title:"1) 先配置工作流元信息"},{description:s(()=>[...a[3]||(a[3]=[e("div",{class:"step-desc"},[e("p",null,[d("在左侧面板先填 "),e("strong",null,"名称"),d("、"),e("strong",null,"Cron"),d("、"),e("strong",null,"全局上下文 JSON"),d("。")]),e("p",null,[d("推荐先放一个最小上下文,例如 "),e("code",null,'{"biz":{}}'),d("。")]),e("p",null,[d("如果你不确定字段名,先统一放到 "),e("code",null,"biz"),d(" 命名空间,后续表达式更清晰。")])],-1)])]),_:1}),t(m,{title:"2) 拖拽/点击添加节点"},{description:s(()=>[...a[4]||(a[4]=[e("div",{class:"step-desc"},[e("p",null,"桌面端可拖拽节点到画布,移动端建议直接点击节点卡片添加。"),e("p",null,"开始/结束节点是固定节点,默认已存在且不能删除。")],-1)])]),_:1}),t(m,{title:"3) 连线并形成执行路径"},{description:s(()=>[...a[5]||(a[5]=[e("div",{class:"step-desc"},[e("p",null,"从节点的 handle 拖到目标节点。连线方向就是执行方向。"),e("p",null,"推荐先走通一条 START → ACTION → END 的主链路再扩展分支。"),e("p",null,"每增加一个分支先保存一次,避免复杂图一次改太多导致难排错。")],-1)])]),_:1}),t(m,{title:"4) 点击节点配置参数"},{description:s(()=>[...a[6]||(a[6]=[e("div",{class:"step-desc"},[e("p",null,"选中节点后右侧配置面板会切换到该节点参数。"),e("p",null,"ACTION 节点可配置请求、重试、上下文映射;LOGIC/LOOP 配表达式。"),e("p",null,"建议优先配 ACTION 的“上下文映射(JSON)”,把关键值提取成业务键供后续复用。")],-1)])]),_:1}),t(m,{title:"5) 保存 → 校验 → 发布"},{description:s(()=>[...a[7]||(a[7]=[e("div",{class:"step-desc"},[e("p",null,"建议固定流程:先保存,再校验结构,最后发布供触发执行。"),e("p",null,"发布前请先手动触发一轮运行,确认日志和分支行为符合预期。")],-1)])]),_:1})]),_:1})]),_:1}),t(W,{label:"交互规则(必读)"},{default:s(()=>[t(v,{column:1,border:""},{default:s(()=>[t(x,{label:"普通节点下游数量"},{default:s(()=>[...a[8]||(a[8]=[d("默认仅一个下游",-1)])]),_:1}),t(x,{label:"FORK"},{default:s(()=>[...a[9]||(a[9]=[d("支持多个下游并行",-1)])]),_:1}),t(x,{label:"JOIN / END 上游数量"},{default:s(()=>[...a[10]||(a[10]=[d("支持多个上游接入",-1)])]),_:1}),t(x,{label:"LOGIC"},{default:s(()=>[...a[11]||(a[11]=[d("必须从 True/False 专用 handle 连线",-1)])]),_:1}),t(x,{label:"LOOP"},{default:s(()=>[...a[12]||(a[12]=[d("建议使用 Loop Body / Loop Next / Loop Exit 专用 handle",-1)])]),_:1}),t(x,{label:"删除连线"},{default:s(()=>[...a[13]||(a[13]=[d("选中连线后按 Backspace/Delete",-1)])]),_:1}),t(x,{label:"不可编辑节点"},{default:s(()=>[...a[14]||(a[14]=[d("START / END 名称固定,不支持删除与改名",-1)])]),_:1}),t(x,{label:"避免重复连线"},{default:s(()=>[...a[15]||(a[15]=[d("同 source + target + handle 组合不允许重复",-1)])]),_:1})]),_:1}),t(L,{class:"mt-3",type:"warning",closable:!1,"show-icon":""},{default:s(()=>[...a[16]||(a[16]=[e("p",null,"看起来“没生效”的大部分问题,都是连线规则与节点配置不一致导致。建议每次修改后立即保存并校验。",-1)])]),_:1})]),_:1}),t(W,{label:"节点配置详解"},{default:s(()=>[t(Y,null,{default:s(()=>[t(V,{title:"节点 ID(显示与使用建议)",name:"nodeid"},{default:s(()=>[...a[17]||(a[17]=[e("ul",{class:"guide-list"},[e("li",null,"节点 ID 已在画布节点卡片展示,同时在右侧“节点配置”顶部可见。"),e("li",null,[d("右侧面板支持一键复制 "),e("strong",null,"节点 ID"),d(" 与 "),e("strong",null,"节点输出引用表达式"),d("。")]),e("li",null,[d("推荐:业务逻辑优先用 "),e("code",null,"context_mappings"),d(" 映射后的业务键,不要让流程长期强依赖节点 ID。")])],-1)])]),_:1}),t(V,{title:"ACTION(HTTP 请求)",name:"action"},{default:s(()=>[...a[18]||(a[18]=[e("ul",{class:"guide-list"},[e("li",null,[e("strong",null,"Method / URL / Timeout"),d(":定义请求基础信息。")]),e("li",null,[e("strong",null,"重试策略"),d(":失败时自动重试,建议先开 2~3 次。")]),e("li",null,[e("strong",null,"上下文映射(JSON)"),d(":把响应字段映射到业务键,供后续节点直接读取。")]),e("li",null,[e("strong",null,"映射 key"),d(":目标业务路径,如 "),e("code",null,"biz.user_id"),d("。")]),e("li",null,[e("strong",null,"映射 value"),d(":响应路径,如 "),e("code",null,"json_body.data.user.id"),d("。")])],-1)])]),_:1}),t(V,{title:"LOGIC(条件分支)",name:"logic"},{default:s(()=>[...a[19]||(a[19]=[e("ul",{class:"guide-list"},[e("li",null,"表达式使用 Jinja2,结果会自动转成布尔值。"),e("li",null,"从 True/False handle 连接不同下游。"),e("li",null,"支持“表达式模板”下拉,一键插入/复制常用表达式,减少手写错误。"),e("li",null,"推荐只做判断,不做复杂转换;复杂加工放 TRANSFORM。")],-1)])]),_:1}),t(V,{title:"LOOP(循环控制)",name:"loop"},{default:s(()=>[...a[20]||(a[20]=[e("ul",{class:"guide-list"},[e("li",null,[e("strong",null,"Loop Body"),d(":循环体入口。")]),e("li",null,[e("strong",null,"Loop Next"),d(":循环结束后的主路径。")]),e("li",null,[e("strong",null,"Loop Exit"),d(":当“退出条件”为 True 时进入的退出路径。")]),e("li",null,[d("请设置 "),e("code",null,"max_iterations"),d(" 防止意外无限循环。")])],-1)])]),_:1}),t(V,{title:"FORK / JOIN(并行与汇聚)",name:"forkjoin"},{default:s(()=>[...a[21]||(a[21]=[e("ul",{class:"guide-list"},[e("li",null,"FORK 负责并行扇出,JOIN 负责收敛。"),e("li",null,"JOIN 可选择 ALL(全部完成)或 ANY(任一完成)。"),e("li",null,"复杂图建议保持“FORK 后一定 JOIN”以降低状态分裂风险。")],-1)])]),_:1})]),_:1})]),_:1}),t(W,{label:"HTTP 与上下文"},{default:s(()=>[a[28]||(a[28]=e("div",{class:"block"},[e("p",{class:"block-title"},"1) 运行时自动写入(系统字段)"),e("p",null,[d("每个节点执行后,系统会自动写入 "),e("code",null,"global_context.__runtime__"),d(":")]),e("pre",{class:"code-block"},"last_output / last_status / last_node_id / node_outputs / node_outputs[节点ID].output")],-1)),a[29]||(a[29]=e("div",{class:"block"},[e("p",{class:"block-title"},"2) ACTION 上下文映射(业务字段)"),e("p",null,"在 ACTION 节点“上下文映射(JSON)”中配置,把响应值映射到业务键:"),e("pre",{class:"code-block"},'{"biz.user_id":"json_body.data.user.id","api_ok":"ok"}'),e("p",null,[d("映射后下游可直接读取 "),e("code",null,"context.biz.user_id"),d("。")])],-1)),a[30]||(a[30]=e("div",{class:"block"},[e("p",{class:"block-title"},"3) 表达式速查(可直接复制)"),e("pre",{class:"code-block"},"{{ context.__runtime__.last_output.status_code == 200 }}"),e("pre",{class:"code-block"},"{{ context.__runtime__.node_outputs['action-user'].output.json_body.code == 0 }}"),e("pre",{class:"code-block"},"{{ context.biz.user_id and context.api_ok }}"),e("pre",{class:"code-block"},"{{ context.loop_index >= 10 or context.__runtime__.last_status != 'SUCCESS' }}"),e("pre",{class:"code-block"},"{{ context.__runtime__.node_outputs['action-pay'].output.ok and context.biz.order_total > 0 }}"),e("p",{class:"text-tip"},[d("建议优先使用 "),e("code",null,"context.biz.*"),d(";仅在排障或过渡阶段使用 "),e("code",null,"node_outputs[节点ID]"),d("。")])],-1)),e("div",Gt,[a[27]||(a[27]=e("p",{class:"block-title"},"4) 可用响应字段",-1)),t(v,{column:1,border:""},{default:s(()=>[t(x,{label:"status_code"},{default:s(()=>[...a[22]||(a[22]=[d("HTTP 状态码",-1)])]),_:1}),t(x,{label:"ok"},{default:s(()=>[...a[23]||(a[23]=[d("请求是否成功(布尔)",-1)])]),_:1}),t(x,{label:"json_body"},{default:s(()=>[...a[24]||(a[24]=[d("JSON 响应体(若可解析)",-1)])]),_:1}),t(x,{label:"text"},{default:s(()=>[...a[25]||(a[25]=[d("原始文本响应",-1)])]),_:1}),t(x,{label:"headers"},{default:s(()=>[...a[26]||(a[26]=[d("响应头",-1)])]),_:1})]),_:1})])]),_:1}),t(W,{label:"发布前检查"},{default:s(()=>[t(re,{"model-value":"[]",class:"checklist"},{default:s(()=>[t(oe,{label:"已配置工作流名称、Cron、全局上下文",disabled:""}),t(oe,{label:"所有关键 ACTION 都配置了上下文映射",disabled:""}),t(oe,{label:"LOGIC / LOOP 分支已连接完整",disabled:""}),t(oe,{label:"至少一条路径可达 END",disabled:""}),t(oe,{label:"手动触发运行并检查了节点日志",disabled:""}),t(oe,{label:"保存 -> 校验 -> 发布流程已执行",disabled:""})]),_:1})]),_:1}),t(W,{label:"排障指南"},{default:s(()=>[t(Y,null,{default:s(()=>[t(V,{title:"条件总是 False",name:"1"},{default:s(()=>[...a[31]||(a[31]=[e("p",null,[d("先到运行页查看该节点日志的 "),e("code",null,"response_snapshot"),d(",确认路径和值类型。")],-1)])]),_:1}),t(V,{title:"映射不生效",name:"2"},{default:s(()=>[...a[32]||(a[32]=[e("p",null,[d("检查映射 value 路径是否命中 HTTP 输出(status_code / headers / text / json_body / ok),并确认 key 不在 "),e("code",null,"__runtime__"),d(" 下。")],-1)])]),_:1}),t(V,{title:"END 节点没有触发",name:"3"},{default:s(()=>[...a[33]||(a[33]=[e("p",null,"确认至少一条路径可达 END,且上游节点未失败或未被条件分支跳过。",-1)])]),_:1}),t(V,{title:"连线逻辑混乱",name:"4"},{default:s(()=>[...a[34]||(a[34]=[e("p",null,"建议先保留主链路,再逐步添加 FORK/JOIN/LOOP;每加一块就保存并校验一次。",-1)])]),_:1})]),_:1})]),_:1})]),_:1}),t(X),a[35]||(a[35]=e("div",{class:"faq"},[e("h4",null,"建议团队约定"),e("p",null,[d("统一用 "),e("code",null,"biz.*"),d(" 保存业务上下文,统一用英文节点 ID,统一发布前做一次手动触发验收。")])],-1))])]),_:1},8,["model-value"])}}}),Yt=Le(Wt,[["__scopeId","data-v-bcd77c2f"]]),Xt={class:"node-card"},Qt={class:"node-icon"},Zt={class:"node-title-box"},eo={class:"node-title"},to={class:"node-subtitle"},oo={key:0,class:"node-status-icon"},lo={class:"node-body"},no=["title"],ao={key:1,class:"node-desc"},so={class:"tag"},io={key:2,class:"node-desc"},uo={key:3,class:"node-desc"},ro={key:4,class:"node-desc"},po=Se({__name:"WorkflowCustomNode",props:{id:{},data:{},selected:{type:Boolean}},setup(K){const j=K,a=$(()=>j.id||j.data.id||""),L=$(()=>{switch(j.data.status){case"SUCCESS":return"i-carbon-checkmark-filled text-white";case"FAILURE":return"i-carbon-warning-filled text-white";case"RUNNING":return"i-carbon-renew text-white animate-spin";case"SKIPPED":return"i-carbon-skip-forward-filled text-white";default:return""}});return(m,p)=>(b(),S("div",{class:Te(["custom-node-wrapper",{selected:m.selected,[m.data.type?.toLowerCase()]:!0}])},[e("div",Xt,[e("div",{class:"node-header",style:et({backgroundColor:m.data.ui?.color||"var(--primary-500)"})},[e("div",Qt,[e("i",{class:Te(m.data.ui?.icon||"i-carbon-cube")},null,2)]),e("div",Zt,[e("span",eo,ue(m.data.label),1),e("span",to,ue(m.data.type),1)]),m.data.status?(b(),S("div",oo,[e("i",{class:Te(L.value)},null,2)])):F("",!0)],4),e("div",lo,[a.value?(b(),S("div",{key:0,class:"node-id",title:a.value},"ID: "+ue(a.value),9,no)):F("",!0),m.data.actionType&&m.data.type==="ACTION"?(b(),S("div",ao,[e("span",so,ue(m.data.actionType),1)])):m.data.type==="LOGIC"?(b(),S("div",io,[...p[0]||(p[0]=[e("span",{class:"tag logic"},"Condition",-1)])])):m.data.type==="LOOP"?(b(),S("div",uo,[...p[1]||(p[1]=[e("span",{class:"tag loop"},"Iterator",-1)])])):m.data.type==="FORK"?(b(),S("div",ro,[...p[2]||(p[2]=[e("span",{class:"tag fork"},"Parallel",-1),e("span",{class:"branch-hint"},"并行分支",-1)])])):F("",!0)])]),m.data.type!=="START"?(b(),h(A(ye),{key:0,id:"input",type:"target",position:A(be).Top,class:"io-handle input"},null,8,["position"])):F("",!0),m.data.type==="LOGIC"?(b(),S(ae,{key:1},[p[3]||(p[3]=e("div",{class:"logic-handle-label true-label"},"True",-1)),t(A(ye),{id:"true",type:"source",position:A(be).Bottom,class:"io-handle logic true",style:{left:"30%"}},null,8,["position"]),p[4]||(p[4]=e("div",{class:"logic-handle-label false-label"},"False",-1)),t(A(ye),{id:"false",type:"source",position:A(be).Bottom,class:"io-handle logic false",style:{left:"70%"}},null,8,["position"])],64)):m.data.type==="LOOP"?(b(),S(ae,{key:2},[p[5]||(p[5]=e("div",{class:"loop-handle-label exit-label"},"Loop Exit",-1)),t(A(ye),{id:"loop-exit",type:"source",position:A(be).Bottom,class:"io-handle loop exit",style:{left:"20%"}},null,8,["position"]),p[6]||(p[6]=e("div",{class:"loop-handle-label body-label"},"Loop Body",-1)),t(A(ye),{id:"loop-body",type:"source",position:A(be).Bottom,class:"io-handle loop body",style:{left:"50%"}},null,8,["position"]),p[7]||(p[7]=e("div",{class:"loop-handle-label next-label"},"Loop Next",-1)),t(A(ye),{id:"loop-next",type:"source",position:A(be).Bottom,class:"io-handle loop next",style:{left:"80%"}},null,8,["position"])],64)):m.data.type!=="END"?(b(),h(A(ye),{key:3,id:"output",type:"source",position:A(be).Bottom,class:"io-handle output"},null,8,["position"])):F("",!0)],2))}}),je=Le(po,[["__scopeId","data-v-a9c05e4c"]]),fe={xs:0,sm:640,md:768,lg:1024,xl:1280,"2xl":1536};function co(){const K=le(0),j=le(0),a=()=>{typeof window>"u"||(K.value=window.innerWidth,j.value=window.innerHeight)},L=$(()=>{const E=K.value;return E>=fe["2xl"]?"2xl":E>=fe.xl?"xl":E>=fe.lg?"lg":E>=fe.md?"md":E>=fe.sm?"sm":"xs"}),m=$(()=>{const E=K.value;return E<fe.md?"mobile":E<fe.lg?"tablet":"desktop"}),p=$(()=>m.value==="mobile"),W=$(()=>m.value==="tablet"),x=$(()=>m.value==="desktop"),v=$(()=>m.value==="mobile"||m.value==="tablet"),V=E=>K.value>=fe[E],Y=E=>K.value<fe[E],oe=(E,z)=>K.value>=fe[E]&&K.value<fe[z],re=$(()=>j.value>K.value),pe=$(()=>K.value>j.value),X=E=>{const z=["2xl","xl","lg","md","sm","xs"],N=L.value,J=z.indexOf(N);for(let Z=J;Z<z.length;Z++){const k=z[Z];if(E[k]!==void 0)return E[k]}};return ut(()=>{a(),window.addEventListener("resize",a)}),rt(()=>{window.removeEventListener("resize",a)}),{windowWidth:K,windowHeight:j,currentBreakpoint:L,deviceType:m,isMobile:p,isTablet:W,isDesktop:x,isSmallScreen:v,isGreaterOrEqual:V,isLessThan:Y,isBetween:oe,isPortrait:re,isLandscape:pe,getResponsiveValue:X}}const fo={class:"designer-toolbar"},mo={class:"toolbar-left"},vo={key:1,class:"text-sm font-bold"},go={class:"toolbar-right"},bo={class:"hidden-xs-only inline-flex gap-2"},yo={key:0,class:"designer-pane left-pane"},_o={key:0,class:"canvas-empty"},xo={key:1,class:"designer-pane right-pane"},$e="start",Re="end",wo=Se({__name:"WorkflowDesigner",setup(K){const j=wt(),a=pt(),L=ft(),{isMobile:m}=co(),p=vt("workflow-designer"),{project:W,onConnect:x,getViewport:v,dimensions:V,fitView:Y}=p,oe=p?.onSelectionChange,re={default:Me(je),input:Me(je),output:Me(je)},pe=new Set(["START","END"]),X=l=>l==="START"?"开始":"结束",E=l=>l?pe.has(l):!1,z={START:{icon:"i-carbon-play-filled",color:"var(--success-500)"},ACTION:{icon:"i-carbon-api",color:"var(--primary-500)"},TRANSFORM:{icon:"i-carbon-data-enrichment",color:"var(--success-500)"},LOGIC:{icon:"i-carbon-direction-fork",color:"var(--warning-500)"},FORK:{icon:"i-carbon-flow-stream",color:"var(--warning-600)"},JOIN:{icon:"i-carbon-arrows-vertical",color:"var(--gray-500)"},LOOP:{icon:"i-carbon-loop",color:"var(--purple-500)"},END:{icon:"i-carbon-stop-filled",color:"var(--text-tertiary)"}},N=l=>z[l]||{icon:"i-carbon-cube",color:"var(--text-secondary)"},J=$(()=>a.params.workflowId),Z=$(()=>J.value?"编辑工作流":"新建工作流"),k=le([]),P=le([]),se=le({}),R=le(""),me=le(!1),De=le(null),Ee=Nt,Ue={animated:!0,type:"smoothstep"},ve=l=>{l&&(l.type==="START"?l.name=X("START"):l.type==="END"&&(l.name=X("END")))},we=l=>{const o=`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`;return`${l.toLowerCase()}-${o}`},Ne=le(!1),_e=le(!1),i=le(!1),n=ct({name:"",description:"",tags:[],is_active:!0,schedule:"0 0 0 * * *"}),g=$({get:()=>n,set:l=>{l&&Object.assign(n,l)}}),T=le("{}"),I=le(""),O=$(()=>k.value.find(l=>l.id===R.value)),C=$(()=>R.value?P.value.filter(l=>l.source===R.value).map(l=>{const o=k.value.find(u=>u.id===l.target);return{id:l.target,label:o?.data?.label||l.target}}):[]),ne=$(()=>k.value.map(l=>({id:l.id,label:l.data?.label||l.id}))),Q=$(()=>{const l=new Set;return Object.values(se.value).forEach(o=>{if(o.type!=="ACTION"||!o.config)return;const f=o.config.context_mappings;!f||typeof f!="object"||Array.isArray(f)||Object.keys(f).forEach(y=>{typeof y=="string"&&y.trim()&&!y.startsWith("__runtime__")&&l.add(y.trim())})}),Array.from(l).sort((o,u)=>o.localeCompare(u))}),ee=$({get:()=>{if(!R.value)return xe(O.value?.data?.type||"ACTION","temp");const l=se.value[R.value];return l||xe(O.value?.data?.type||"ACTION",R.value)},set:l=>{if(R.value){const o=JSON.parse(JSON.stringify(l));ve(o),se.value[R.value]=o}}});x(l=>{const{source:o,target:u,sourceHandle:f,targetHandle:y}=l;if(!o||!u)return;const B=k.value.find(M=>M.id===o),q=k.value.find(M=>M.id===u);if(!B||!q)return;const te=B.data?.type,ie=q.data?.type,D=P.value.filter(M=>M.source===o),c=P.value.filter(M=>M.target===u);if(te==="LOGIC"||te==="LOOP"){if(!f){const de=te==="LOGIC"?"请从 True/False 触点连接条件节点":"请从 Loop Body/Loop Next/Loop Exit 触点连接循环节点";H.warning(de);return}if(D.some(de=>de.sourceHandle===f)){const de=te==="LOGIC"?"该条件分支已连接其他节点":"该循环触点已连接其他节点";H.warning(de);return}}else if(te!=="FORK"&&D.length>=1){H.warning("仅并行节点支持连接多个下游");return}if(ie!=="JOIN"&&ie!=="END"&&c.length>=1){H.warning("仅汇聚节点或结束节点可接收多个上游连接");return}if(P.value.some(M=>M.source===o&&M.target===u&&M.sourceHandle===f)){H.warning("已存在相同的连线");return}const ce=`${o}-${u}-${Date.now()}`;let G;f==="true"&&(G="True"),f==="false"&&(G="False"),f==="loop-body"&&(G="Loop Body"),f==="loop-exit"&&(G="Loop Exit"),f==="loop-next"&&(G="Loop Next"),P.value=[...P.value,{id:ce,source:o,target:u,sourceHandle:f,targetHandle:y,label:G,type:"smoothstep",animated:!0}]});const ge=async()=>{if(!J.value){Oe();return}try{const l=await j.fetchDefinitionDetailAction(J.value);Je(l)}catch{H.error("加载工作流失败")}},Oe=()=>{k.value=[{id:$e,type:"input",position:{x:100,y:200},data:{id:$e,label:X("START"),type:"START",ui:N("START")}},{id:Re,type:"output",position:{x:100,y:600},data:{id:Re,label:X("END"),type:"END",ui:N("END")}}],P.value=[],se.value={[$e]:xe("START",$e),[Re]:xe("END",Re)},Object.assign(n,{name:"",description:"",tags:[],is_active:!0,schedule:"0 0 0 * * *"}),T.value="{}"},Je=l=>{Object.assign(n,{name:l.name,description:l.description,tags:l.tags||[],is_active:l.is_active,schedule:l.schedule||"0 0 0 * * *"}),T.value=JSON.stringify(l.global_context||{},null,2),k.value=(l.graph_data?.nodes||[]).map(o=>{const u=o.type,f=E(u)?X(u):o.label;return{id:o.node_id,type:o.type==="START"?"input":o.type==="END"?"output":"default",position:o.position||{x:0,y:0},data:{id:o.node_id,label:f,type:u,ui:o.ui||N(o.type)}}}),P.value=(l.graph_data?.edges||[]).map(o=>({id:o.id,source:o.source,target:o.target,sourceHandle:o.sourceHandle,targetHandle:o.targetHandle,label:o.label,type:o.type||"smoothstep",animated:o.animated})),tt(l),ot()},Ie=(l,o)=>{l.dataTransfer?.setData("application/vueflow",o.type),l.dataTransfer?.setData("workflow/template",JSON.stringify(o)),l.dataTransfer&&(l.dataTransfer.effectAllowed="move")},r=l=>{const o=l.dataTransfer?.getData("application/vueflow"),u=l.dataTransfer?.getData("workflow/template");if(!o||!u)return;const f=JSON.parse(u),y=De.value?.getBoundingClientRect(),B=W({x:l.clientX-(y?.left||0),y:l.clientY-(y?.top||0)});Be(f,B)},Ae=l=>{const{x:o,y:u,zoom:f}=v(),{width:y,height:B}=V.value,q=(y/2-o)/f,te=(B/2-u)/f,ie={x:Math.random()*20-10,y:Math.random()*20-10};Be(l,{x:q+ie.x,y:te+ie.y})},Be=(l,o)=>{const u=we(l.type),f=xe(l.type,u);ve(f),l.defaultConfig&&f.config&&l.defaultConfig&&Object.assign(f.config,l.defaultConfig),f.name=l.label,se.value[u]=f;const y=l.icon?{icon:l.icon,color:l.color}:N(l.type);k.value=[...k.value,{id:u,type:"default",position:o,data:{id:u,label:l.label,type:l.type,ui:y}}],R.value=u,m.value&&(i.value=!0)},xe=(l,o)=>{const u={id:o,name:l==="START"?X("START"):l==="END"?X("END"):l==="FORK"?"并行分支":`${l}-${o}`,type:l};switch(l){case"ACTION":u.config={async_mode:!1,request:{method:"GET",url:"https://example.com",timeout_seconds:10,body_type:"auto",params:{},headers:{},body:{},json_body:{},form_body:{},raw_body:""},context_mappings:{},retry_policy:{enabled:!0,max_attempts:3,interval_seconds:5},failure_strategy:{action:"FAIL_FLOW",async_wait_timeout:3600}};break;case"LOGIC":u.config={condition:""};break;case"TRANSFORM":u.config={engine:"JINJA2",output_schema:{}};break;case"LOOP":u.config={condition:"",max_iterations:10,loop_next_id:void 0};break;case"JOIN":u.config={mode:"ALL",timeout_seconds:3600,merge_strategy:"MAP"};break;case"FORK":u.config={branch_node_ids:[],branch_labels:{}};break;case"END":u.config={status:"SUCCESS"};break}return u},Pe=l=>JSON.parse(JSON.stringify(l)),Fe=(l,o)=>{if(o==null)return Pe(l??o);if(Array.isArray(o))return Pe(o);if(typeof o=="object"){const u=typeof l=="object"&&l!==null?l:{},f={...u};return Object.keys(o).forEach(y=>{f[y]=Fe(u?.[y],o[y])}),f}return o},Ve=(l,o,u)=>{const f=xe(o,l);if(!u)return f;const y=Pe(u);return{...f,...y,config:Fe(f.config,y.config)}},tt=l=>{const o={},u=l.nodes_config||{};(l.graph_data?.nodes||[]).forEach(y=>{const B=u?.[y.node_id],q=B?.type||y.type;o[y.node_id]=Ve(y.node_id,q,B),ve(o[y.node_id])}),Object.entries(u).forEach(([y,B])=>{if(!o[y]&&B){const q=B.type||"ACTION";o[y]=Ve(y,q,B),ve(o[y])}}),se.value=o},ot=()=>{if(!P.value.length)return;let l=!1;const o=P.value.map(u=>{if(u.sourceHandle)return u;const f=se.value[u.source];if(!f||f.type!=="LOOP"||!f.config)return u;const y=f.config,B=y.body_entry_id||y.jump_target_id,q=y.loop_next_id,te=y.exit_node_id||f.next_node_ids?.find(ie=>ie&&ie!==q);return B&&u.target===B?(l=!0,{...u,sourceHandle:"loop-body"}):q&&u.target===q?(l=!0,{...u,sourceHandle:"loop-next"}):te&&u.target===te?(l=!0,{...u,sourceHandle:"loop-exit"}):u});l&&(P.value=o)},He=l=>{let o=!1;const u=k.value.map(f=>{const y=!!l&&f.id===l;return f.selected!==y?(o=!0,{...f,selected:y}):f});o&&(k.value=u)},ze=l=>{!l||typeof Y!="function"||requestAnimationFrame(()=>{try{Y({nodes:[l],duration:240,padding:.35})}catch{}})},lt=l=>{const o=l.node;R.value=o.id,ze(o.id)};typeof oe=="function"&&oe(l=>{const o=l?.nodes||[];if(o.length){const u=o[o.length-1];u&&u.id!==R.value&&(R.value=u.id)}else R.value&&(R.value="")});const nt=()=>{R.value="",m.value&&(i.value=!1)},at=()=>{k.value=k.value.map(l=>({...l}))},qe=()=>{const l=k.value.find(o=>o.id===R.value);l&&ee.value&&!E(ee.value.type)?l.data={...l.data,label:ee.value.name}:l&&ee.value&&(l.data={...l.data,label:X(ee.value.type)})},he=()=>{},Ke=async l=>{try{await mt.confirm("确定要删除该节点吗?此操作无法撤销。","删除节点",{type:"warning",confirmButtonText:"删除",cancelButtonText:"取消"}),k.value=k.value.filter(o=>o.id!==l),P.value=P.value.filter(o=>o.source!==l&&o.target!==l),delete se.value[l],R.value===l&&(R.value="")}catch{}},st=()=>{let l={};try{l=T.value?JSON.parse(T.value):{}}catch{throw new Error("全局上下文 JSON 格式错误")}const o=new Map,u=new Map,f=new Map,y=new Map,B=new Map,q=new Map;P.value.forEach(D=>{const{source:c,target:w,sourceHandle:U}=D,ce=se.value[c],G=ce?.config,M=G?.body_entry_id||G?.jump_target_id,de=!U&&ce?.type==="LOOP"&&M===w;if(U==="loop-body"||de){y.set(c,w);return}if(U==="loop-next"){q.set(c,w);return}U==="loop-exit"&&B.set(c,w),o.has(c)||o.set(c,[]),o.get(c)?.push(w),U==="true"&&u.set(c,w),U==="false"&&f.set(c,w)});const te={};Object.values(se.value).forEach(D=>{const c=o.get(D.id)||[],w=JSON.parse(JSON.stringify(D));if(ve(w),w.next_node_ids=c,c.length>0&&(w.next_node_id=c[0]),w.type==="LOGIC"&&w.config&&(w.config.true_next_node_id=u.get(w.id),w.config.false_next_node_id=f.get(w.id)),w.type==="FORK"&&w.config){const U=w.config;if(U.branch_node_ids=c,U.branch_labels){const ce={};c.forEach(G=>{const M=U.branch_labels?.[G];M&&(ce[G]=M)}),U.branch_labels=ce}}if(w.type==="LOOP"&&w.config){const U=w.config,ce=y.get(w.id)||U.body_entry_id||U.jump_target_id;if(!ce)throw new Error(`循环节点 ${w.name} 缺少 Loop Body 连线`);U.body_entry_id=ce,U.jump_target_id=ce;const G=B.get(w.id)||U.exit_node_id||w.next_node_ids?.find(Ye=>Ye&&Ye!==U.loop_next_id);if(!G)throw new Error(`循环节点 ${w.name} 缺少 Loop Exit 连线`);U.exit_node_id=G;const M=q.get(w.id)||U.loop_next_id;U.loop_next_id=M;const de=[];M&&de.push(M),G&&G!==M&&de.push(G),w.next_node_ids=de,w.next_node_id=de[0]}te[D.id]=w});const ie=n.schedule?.trim();return{name:n.name,description:n.description,is_active:n.is_active,schedule:ie||void 0,global_context:l,graph_data:{nodes:k.value.map(D=>{const c=te[D.id],w=c?.type||D.data?.type,U=E(w)?X(w):c?.name||D.data?.label;return{node_id:D.id,label:U,type:w,ui:D.data?.ui,position:D.position}}),edges:P.value.map(D=>({id:D.id,source:D.source,target:D.target,sourceHandle:D.sourceHandle,targetHandle:D.targetHandle,label:typeof D.label=="string"?D.label:void 0,type:D.type,animated:D.animated})),version:Date.now()},nodes_config:te}},it=async()=>{if(!n.name){H.warning("请输入名称");return}if(!k.value.length){H.warning("至少需要一个节点");return}me.value=!0;try{const l=st();await j.saveDefinition(l,J.value),H.success("保存成功"),L.push("/workflow")}catch(l){H.error(l.message||"保存失败")}finally{me.value=!1}},Ge=async()=>{if(!J.value){H.warning("请先保存工作流");return}await j.validateCurrentDesigner(J.value)},We=async()=>{if(!J.value){H.warning("请先保存工作流");return}await j.publishDefinition(J.value)},dt=l=>{l==="exit"?L.push("/workflow"):l==="validate"?Ge():l==="publish"&&We()};return Ce(()=>a.params.workflowId,ge,{immediate:!0}),Ce(R,l=>{He(l||null),l?(m.value&&(i.value=!0),ze(l)):m.value&&(i.value=!1)}),Ce(k,()=>{R.value&&!k.value.some(l=>l.id===R.value)?R.value="":He(R.value||null)},{deep:!0}),(l,o)=>{const u=_("el-button"),f=_("el-breadcrumb-item"),y=_("el-breadcrumb"),B=_("el-tag"),q=_("el-dropdown-item"),te=_("el-dropdown-menu"),ie=_("el-dropdown"),D=_("el-drawer");return b(),h(xt,{title:Z.value,subtitle:"拖拽节点编排工作流,配置定时任务与上下文",icon:"i-carbon-flow",class:"workflow-designer-page"},{default:s(()=>[e("div",fo,[e("div",mo,[A(m)?(b(),h(u,{key:0,onClick:o[0]||(o[0]=c=>_e.value=!0),class:"mobile-menu-btn",text:""},{default:s(()=>[...o[20]||(o[20]=[e("i",{class:"i-carbon-settings-adjust text-xl"},null,-1)])]),_:1})):F("",!0),t(y,{separator:"/",class:"hidden-xs-only"},{default:s(()=>[t(f,{onClick:o[1]||(o[1]=c=>A(L).push("/workflow"))},{default:s(()=>[...o[21]||(o[21]=[d("编排中心",-1)])]),_:1}),t(f,null,{default:s(()=>[d(ue(Z.value),1)]),_:1})]),_:1}),A(m)?(b(),S("span",vo,ue(Z.value),1)):F("",!0),J.value?(b(),h(B,{key:2,type:"info",effect:"plain",class:"hidden-xs-only"},{default:s(()=>[d("ID: "+ue(J.value),1)]),_:1})):F("",!0)]),e("div",go,[t(u,{onClick:o[2]||(o[2]=c=>Ne.value=!0),circle:""},{default:s(()=>[...o[22]||(o[22]=[e("i",{class:"i-carbon-help text-lg"},null,-1)])]),_:1}),e("div",bo,[t(u,{onClick:Ge,disabled:!J.value},{default:s(()=>[...o[23]||(o[23]=[e("i",{class:"i-carbon-checkmark mr-2"},null,-1),d("校验",-1)])]),_:1},8,["disabled"]),t(u,{onClick:We,disabled:!J.value},{default:s(()=>[...o[24]||(o[24]=[e("i",{class:"i-carbon-upload mr-2"},null,-1),d("发布",-1)])]),_:1},8,["disabled"]),t(u,{onClick:o[3]||(o[3]=c=>A(L).push("/workflow"))},{default:s(()=>[...o[25]||(o[25]=[d("返回",-1)])]),_:1})]),t(u,{type:"primary",onClick:it,loading:me.value},{default:s(()=>[...o[26]||(o[26]=[e("i",{class:"i-carbon-save mr-1"},null,-1),e("span",{class:"hidden-xs-only"},"保存",-1)])]),_:1},8,["loading"]),A(m)?(b(),h(ie,{key:0,trigger:"click",onCommand:dt},{dropdown:s(()=>[t(te,null,{default:s(()=>[t(q,{command:"validate",disabled:!J.value},{default:s(()=>[...o[28]||(o[28]=[d("校验",-1)])]),_:1},8,["disabled"]),t(q,{command:"publish",disabled:!J.value},{default:s(()=>[...o[29]||(o[29]=[d("发布",-1)])]),_:1},8,["disabled"]),t(q,{command:"exit"},{default:s(()=>[...o[30]||(o[30]=[d("返回列表",-1)])]),_:1})]),_:1})]),default:s(()=>[t(u,{circle:"",class:"ml-2"},{default:s(()=>[...o[27]||(o[27]=[e("i",{class:"i-carbon-overflow-menu-vertical"},null,-1)])]),_:1})]),_:1})):F("",!0)])]),e("div",{class:Te(["designer-layout",{"is-mobile":A(m)}])},[A(m)?F("",!0):(b(),S("aside",yo,[t(Qe,{meta:g.value,"onUpdate:meta":o[4]||(o[4]=c=>g.value=c),"global-context-text":T.value,"onUpdate:globalContextText":o[5]||(o[5]=c=>T.value=c),templates:A(Ee),onDragStart:Ie,onAddNode:Ae},null,8,["meta","global-context-text","templates"])])),e("section",{class:"designer-canvas",ref_key:"canvasRef",ref:De,onDragover:o[8]||(o[8]=Xe(()=>{},["prevent"])),onDrop:Xe(r,["prevent"])},[k.value.length?F("",!0):(b(),S("div",_o,[...o[31]||(o[31]=[e("i",{class:"i-carbon-flow-stream"},null,-1),e("p",null,"初始化中...",-1)])])),t(A(_t),{id:"workflow-designer",nodes:k.value,"onUpdate:nodes":o[6]||(o[6]=c=>k.value=c),edges:P.value,"onUpdate:edges":o[7]||(o[7]=c=>P.value=c),"node-types":re,"fit-view-on-init":"",class:"designer-flow","default-edge-options":Ue,"min-zoom":.2,"max-zoom":4,onNodeClick:lt,onNodeDragStop:at,onPaneClick:nt},{default:s(()=>[t(A(gt),{"pattern-color":"#aaa",gap:20,size:1}),t(A(bt)),t(A(yt),{pannable:""})]),_:1},8,["nodes","edges"])],544),A(m)?F("",!0):(b(),S("aside",xo,[t(Ze,{"active-node":O.value,config:ee.value,"onUpdate:config":o[9]||(o[9]=c=>ee.value=c),"schema-text":I.value,"onUpdate:schemaText":o[10]||(o[10]=c=>I.value=c),"outgoing-targets":C.value,"available-context-keys":Q.value,"available-node-refs":ne.value,onSyncLabel:qe,onSyncSchema:he,onDeleteNode:Ke},null,8,["active-node","config","schema-text","outgoing-targets","available-context-keys","available-node-refs"])]))],2),t(D,{modelValue:_e.value,"onUpdate:modelValue":o[14]||(o[14]=c=>_e.value=c),direction:"ltr",size:"85%",title:"工作流设置",class:"mobile-drawer"},{default:s(()=>[t(Qe,{meta:g.value,"onUpdate:meta":o[11]||(o[11]=c=>g.value=c),"global-context-text":T.value,"onUpdate:globalContextText":o[12]||(o[12]=c=>T.value=c),templates:A(Ee),onDragStart:Ie,onAddNode:o[13]||(o[13]=c=>{Ae(c),_e.value=!1})},null,8,["meta","global-context-text","templates"])]),_:1},8,["modelValue"]),t(D,{modelValue:i.value,"onUpdate:modelValue":o[18]||(o[18]=c=>i.value=c),direction:"rtl",size:"85%",title:O.value?"节点配置":"未选择节点",class:"mobile-drawer"},{default:s(()=>[t(Ze,{"active-node":O.value,config:ee.value,"onUpdate:config":o[15]||(o[15]=c=>ee.value=c),"schema-text":I.value,"onUpdate:schemaText":o[16]||(o[16]=c=>I.value=c),"outgoing-targets":C.value,"available-context-keys":Q.value,"available-node-refs":ne.value,onSyncLabel:qe,onSyncSchema:he,onDeleteNode:o[17]||(o[17]=c=>{Ke(c),i.value=!1})},null,8,["active-node","config","schema-text","outgoing-targets","available-context-keys","available-node-refs"])]),_:1},8,["modelValue","title"]),t(Yt,{visible:Ne.value,"onUpdate:visible":o[19]||(o[19]=c=>Ne.value=c)},null,8,["visible"])]),_:1},8,["title"])}}}),So=Le(wo,[["__scopeId","data-v-0266d73f"]]);export{So as default};
@@ -0,0 +1 @@
1
+ :root{--vf-node-bg: #fff;--vf-node-text: #222;--vf-connection-path: #b1b1b7;--vf-handle: #555}.vue-flow__edge.updating .vue-flow__edge-path{stroke:#777}.vue-flow__edge-text{font-size:10px}.vue-flow__edge-textbg{fill:#fff}.vue-flow__connection-path{stroke:var(--vf-connection-path)}.vue-flow__node{cursor:grab}.vue-flow__node.selectable:focus,.vue-flow__node.selectable:focus-visible{outline:none}.vue-flow__node-default,.vue-flow__node-input,.vue-flow__node-output{padding:10px;border-radius:3px;width:150px;font-size:12px;text-align:center;border-width:1px;border-style:solid;color:var(--vf-node-text);background-color:var(--vf-node-bg);border-color:var(--vf-node-color)}.vue-flow__node-default.selected,.vue-flow__node-default.selected:hover,.vue-flow__node-input.selected,.vue-flow__node-input.selected:hover,.vue-flow__node-output.selected,.vue-flow__node-output.selected:hover{box-shadow:0 0 0 .5px var(--vf-box-shadow)}.vue-flow__node-default.selected,.vue-flow__node-default:focus,.vue-flow__node-default:focus-visible,.vue-flow__node-input.selected,.vue-flow__node-input:focus,.vue-flow__node-input:focus-visible,.vue-flow__node-output.selected,.vue-flow__node-output:focus,.vue-flow__node-output:focus-visible{outline:none;border:1px solid #555}.vue-flow__node-default .vue-flow__handle,.vue-flow__node-input .vue-flow__handle,.vue-flow__node-output .vue-flow__handle{background:var(--vf-handle)}.vue-flow__node-default.selectable:hover,.vue-flow__node-input.selectable:hover,.vue-flow__node-output.selectable:hover{box-shadow:0 1px 4px 1px #00000014}.vue-flow__node-input{--vf-node-color: var(--vf-node-color, #0041d0);--vf-handle: var(--vf-node-color, #0041d0);--vf-box-shadow: var(--vf-node-color, #0041d0);background:var(--vf-node-bg);border-color:var(--vf-node-color, #0041d0)}.vue-flow__node-input.selected,.vue-flow__node-input:focus,.vue-flow__node-input:focus-visible{outline:none;border:1px solid var(--vf-node-color, #0041d0)}.vue-flow__node-default{--vf-handle: var(--vf-node-color, #1a192b);--vf-box-shadow: var(--vf-node-color, #1a192b);background:var(--vf-node-bg);border-color:var(--vf-node-color, #1a192b)}.vue-flow__node-default.selected,.vue-flow__node-default:focus,.vue-flow__node-default:focus-visible{outline:none;border:1px solid var(--vf-node-color, #1a192b)}.vue-flow__node-output{--vf-handle: var(--vf-node-color, #ff0072);--vf-box-shadow: var(--vf-node-color, #ff0072);background:var(--vf-node-bg);border-color:var(--vf-node-color, #ff0072)}.vue-flow__node-output.selected,.vue-flow__node-output:focus,.vue-flow__node-output:focus-visible{outline:none;border:1px solid var(--vf-node-color, #ff0072)}.vue-flow__nodesselection-rect,.vue-flow__selection{background:#0059dc14;border:1px dotted rgba(0,89,220,.8)}.vue-flow__nodesselection-rect:focus,.vue-flow__nodesselection-rect:focus-visible,.vue-flow__selection:focus,.vue-flow__selection:focus-visible{outline:none}.vue-flow__handle{width:6px;height:6px;background:var(--vf-handle);border:1px solid #fff;border-radius:100%}.vue-flow__controls{box-shadow:0 0 2px 1px #00000014}.vue-flow__controls-button{background:#fefefe;border:none;border-bottom:1px solid #eee;box-sizing:content-box;display:flex;justify-content:center;align-items:center;width:16px;height:16px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:5px}.vue-flow__controls-button svg{width:100%;max-width:12px;max-height:12px}.vue-flow__controls-button:hover{background:#f4f4f4}.vue-flow__controls-button:disabled{pointer-events:none}.vue-flow__controls-button:disabled svg{fill-opacity:.4}.vue-flow__minimap{background-color:#fff}.vue-flow__minimap.pannable{cursor:grab}.vue-flow__minimap.dragging{cursor:grabbing}.vue-flow__minimap-mask.pannable{cursor:grab}.designer-meta-panel[data-v-3061b725]{display:flex;flex-direction:column;gap:16px}.section-header[data-v-3061b725]{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;font-weight:600;color:var(--text-primary);font-size:14px}.pane-section[data-v-3061b725]{display:flex;flex-direction:column}.pane-form[data-v-3061b725]{display:flex;flex-direction:column;gap:12px}.cron-hint[data-v-3061b725]{margin:6px 0 0;font-size:12px;color:var(--text-tertiary)}.cron-presets[data-v-3061b725]{display:flex;flex-direction:column;gap:6px;margin-top:6px;font-size:12px;color:var(--text-tertiary)}.preset-buttons[data-v-3061b725]{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.palette[data-v-3061b725]{display:flex;flex-direction:column;gap:10px}.palette-item[data-v-3061b725]{display:flex;align-items:center;gap:12px;padding:10px;background:var(--bg-elevated);border:1px solid var(--border-secondary);border-radius:8px;cursor:grab;transition:all .2s ease}.palette-item[data-v-3061b725]:hover{border-color:var(--primary-400);transform:translateY(-1px);box-shadow:var(--shadow-sm)}.palette-item[data-v-3061b725]:active{cursor:grabbing}.item-icon[data-v-3061b725]{width:32px;height:32px;border-radius:6px;display:flex;align-items:center;justify-content:center;color:#fff;font-size:18px;flex-shrink:0}.item-info[data-v-3061b725]{flex:1;overflow:hidden}.item-title[data-v-3061b725]{font-size:13px;font-weight:600;margin:0;color:var(--text-primary)}.item-desc[data-v-3061b725]{font-size:11px;color:var(--text-tertiary);margin:2px 0 0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@media (max-width: 768px){.palette-item[data-v-3061b725]{padding:14px}}.designer-config-panel[data-v-6843e49a]{display:flex;flex-direction:column}.section-header[data-v-6843e49a]{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;font-weight:600;color:var(--text-primary)}.pane-form[data-v-6843e49a]{display:flex;flex-direction:column;gap:16px}.form-section-title[data-v-6843e49a]{font-size:12px;font-weight:600;color:var(--text-secondary);margin-bottom:8px;text-transform:uppercase}.form-tip[data-v-6843e49a]{font-size:12px;color:var(--text-tertiary);margin-top:4px}.node-id-row[data-v-6843e49a]{display:flex;gap:8px;align-items:center}.inline-actions[data-v-6843e49a]{display:flex;gap:8px;margin-bottom:6px}.expr-template-row[data-v-6843e49a]{display:flex;gap:8px;align-items:center}.expr-template-select[data-v-6843e49a]{flex:1}.fork-branch-list[data-v-6843e49a]{display:flex;flex-direction:column;gap:12px}.fork-branch-item[data-v-6843e49a]{border:1px solid var(--border-tertiary);border-radius:var(--radius-md);padding:12px;background:var(--bg-secondary)}.fork-branch-meta[data-v-6843e49a]{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;font-weight:600;color:var(--text-secondary)}.immutable-hint[data-v-6843e49a]{font-size:12px;color:var(--text-tertiary);margin-top:4px}.help-content[data-v-bcd77c2f]{padding:0 12px;max-height:72vh;overflow-y:auto}.step-desc[data-v-bcd77c2f]{margin:8px 0 16px;line-height:1.6;color:var(--text-secondary)}.guide-tabs[data-v-bcd77c2f]{margin-top:14px}.block[data-v-bcd77c2f]{margin-bottom:16px}.block-title[data-v-bcd77c2f]{font-weight:600;color:var(--text-primary);margin-bottom:6px}.guide-list[data-v-bcd77c2f]{margin:0;padding-left:18px;color:var(--text-secondary);line-height:1.8}.text-tip[data-v-bcd77c2f]{font-size:12px;color:var(--text-tertiary)}.checklist[data-v-bcd77c2f]{display:flex;flex-direction:column;gap:10px;padding:8px 0}.code-block[data-v-bcd77c2f]{background:var(--bg-secondary);border:1px solid var(--border-secondary);border-radius:var(--radius-base);padding:10px;font-size:12px;line-height:1.5;white-space:pre-wrap;margin:8px 0}.faq h4[data-v-bcd77c2f]{margin:12px 0 8px;color:var(--text-primary);font-weight:600}.faq p[data-v-bcd77c2f]{color:var(--text-secondary);font-size:14px}.custom-node-wrapper[data-v-a9c05e4c]{position:relative;min-width:200px;border-radius:12px;transition:all .2s cubic-bezier(.4,0,.2,1)}.custom-node-wrapper.selected .node-card[data-v-a9c05e4c]{box-shadow:0 0 0 2px var(--primary-500),0 8px 16px #0000001a;transform:translateY(-2px)}.node-card[data-v-a9c05e4c]{background:var(--bg-elevated);border-radius:12px;overflow:hidden;box-shadow:0 2px 4px #0000000d,0 1px 2px #0000001a;border:1px solid var(--border-secondary)}.node-header[data-v-a9c05e4c]{display:flex;align-items:center;padding:8px 12px;color:#fff;gap:8px}.node-icon[data-v-a9c05e4c]{width:28px;height:28px;background:#fff3;border-radius:6px;display:flex;align-items:center;justify-content:center;font-size:18px}.node-title-box[data-v-a9c05e4c]{flex:1;display:flex;flex-direction:column;line-height:1.2}.node-title[data-v-a9c05e4c]{font-size:14px;font-weight:600;text-shadow:0 1px 2px rgba(0,0,0,.1)}.node-subtitle[data-v-a9c05e4c]{font-size:10px;opacity:.8;text-transform:uppercase;font-weight:500;letter-spacing:.5px}.node-body[data-v-a9c05e4c]{padding:8px 12px;min-height:46px;display:flex;flex-direction:column;align-items:flex-start;gap:6px}.node-id[data-v-a9c05e4c]{font-size:10px;color:var(--text-tertiary);max-width:176px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tag[data-v-a9c05e4c]{display:inline-block;padding:2px 6px;border-radius:4px;font-size:10px;font-weight:500;background:var(--bg-secondary);color:var(--text-secondary);border:1px solid var(--border-tertiary)}.tag.logic[data-v-a9c05e4c]{color:var(--warning-600);background:var(--warning-100);border-color:var(--warning-200)}.tag.loop[data-v-a9c05e4c]{color:var(--purple-600);background:var(--purple-100);border-color:var(--purple-200)}.tag.fork[data-v-a9c05e4c]{color:var(--warning-700);background:var(--warning-100);border-color:var(--warning-200)}.branch-hint[data-v-a9c05e4c]{font-size:11px;color:var(--text-tertiary);margin-left:6px}[data-v-a9c05e4c] .io-handle{width:12px!important;height:12px!important;background:#fff!important;border:3px solid var(--text-tertiary)!important;transition:all .2s;z-index:10}[data-v-a9c05e4c] .io-handle:hover{border-color:var(--primary-500)!important;transform:scale(1.2)}[data-v-a9c05e4c] .io-handle.input{top:-6px!important}[data-v-a9c05e4c] .io-handle.output{bottom:-6px!important}.logic-handle-label[data-v-a9c05e4c],.loop-handle-label[data-v-a9c05e4c]{position:absolute;bottom:-20px;font-size:10px;font-weight:600;color:var(--text-secondary);width:30px;text-align:center;pointer-events:none}.true-label[data-v-a9c05e4c]{left:calc(30% - 15px);color:var(--success-600)}.false-label[data-v-a9c05e4c]{left:calc(70% - 15px);color:var(--error-600)}.loop-handle-label.exit-label[data-v-a9c05e4c]{left:calc(20% - 20px);color:var(--warning-600);width:56px}.loop-handle-label.body-label[data-v-a9c05e4c]{left:calc(50% - 25px);color:var(--purple-600);width:60px}.loop-handle-label.next-label[data-v-a9c05e4c]{left:calc(80% - 25px);color:var(--cyan-600);width:60px}.custom-node-wrapper.start .node-card[data-v-a9c05e4c],.custom-node-wrapper.end .node-card[data-v-a9c05e4c]{border-radius:20px}.designer-toolbar[data-v-0266d73f]{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;flex-wrap:wrap;gap:12px}.toolbar-left[data-v-0266d73f]{display:flex;align-items:center;gap:12px}.toolbar-right[data-v-0266d73f]{display:flex;gap:12px;flex-wrap:wrap}.designer-layout[data-v-0266d73f]{display:grid;grid-template-columns:280px minmax(340px,1fr) 300px;gap:20px;height:calc(100vh - 180px)}.designer-layout.is-mobile[data-v-0266d73f]{grid-template-columns:1fr;height:calc(100vh - 140px)}.designer-pane[data-v-0266d73f]{border:1px solid var(--border-secondary);border-radius:var(--radius-lg);background:var(--bg-elevated);padding:16px;display:flex;flex-direction:column;gap:16px;max-height:calc(100vh - 220px);overflow-y:auto;height:100%}.designer-canvas[data-v-0266d73f]{border:2px dashed var(--border-secondary);border-radius:var(--radius-xl);min-height:540px;position:relative;background:var(--bg-primary);overflow:hidden}.canvas-empty[data-v-0266d73f]{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;color:var(--text-tertiary);pointer-events:none;z-index:10}.canvas-empty .el-button[data-v-0266d73f]{pointer-events:auto}.designer-flow[data-v-0266d73f]{width:100%;height:100%}[data-v-0266d73f] .mobile-drawer .el-drawer__body{padding:16px}[data-v-0266d73f] .vue-flow__node{border:none!important;box-shadow:none!important;background:transparent!important;padding:0!important;border-radius:0!important}[data-v-0266d73f] .vue-flow__node.selected,[data-v-0266d73f] .vue-flow__node:focus,[data-v-0266d73f] .vue-flow__node:focus-visible{border:none!important;box-shadow:none!important;outline:none!important}[data-v-0266d73f] .vue-flow__controls,[data-v-0266d73f] .vue-flow__minimap{pointer-events:all!important;z-index:100!important}[data-v-0266d73f] .vue-flow__minimap{background:var(--bg-elevated);border:1px solid var(--border-secondary);border-radius:var(--radius-lg);box-shadow:var(--shadow-base)}
@@ -0,0 +1 @@
1
+ import{d as se,r as y,x as J,G as te,g as v,b as r,j as p,w as u,c as g,h as N,e as a,i,t as c,l as w,n as oe,y as q,F as W,B as H,E as z,_ as ne,a as le,z as re,A as ie,U as ue,q as de,D as ce}from"./index-CiFlm8oc.js";import{P as pe}from"./PageContainer-Byss-yUC.js";import{d as _e,a as fe,b as me,c as ge}from"./style-lRnStdGu.js";import{W as K,N as Q,d as ve,e as we,u as ke,g as ye}from"./workflow-CUXs39Ac.js";const he={key:0,class:"drawer-content"},be={class:"drawer-header"},Ce={class:"drawer-title"},$e={class:"drawer-subtitle"},xe={class:"drawer-subtitle reqid-line"},Se={class:"drawer-section"},De={class:"graph-wrapper"},Ne={class:"drawer-section"},Ve={class:"section-header"},Re={key:0,class:"log-panel"},qe={key:1,class:"log-panel"},ze={key:0,class:"history-output"},Te={class:"log-json"},Ue={class:"log-entry-header"},Ie={key:0,class:"log-block"},Ee={class:"log-json"},Fe={key:1,class:"log-block"},Ae={class:"log-json"},Oe={key:2,class:"log-block"},We={class:"log-json"},He={class:"drawer-section"},Le={class:"section-header"},je={key:0,class:"snapshot-panel"},Be={class:"snapshot-node-title"},Ge={class:"log-json"},Me=se({__name:"WorkflowRunDrawer",props:{modelValue:{type:Boolean},run:{}},emits:["update:modelValue"],setup(ae,{emit:I}){const f=ae,X=I,b=y([]),V=y([]),C=y([]),T=y(!1),_=y(null),l=y(null),$=J({get:()=>f.modelValue,set:o=>X("update:modelValue",o)}),x=J(()=>{if(!f.run)return{...K.PENDING,type:"info"};const o=K[f.run.status],t=f.run.status==="SUCCESS"?"success":f.run.status==="FAILURE"?"danger":"info";return{...o,type:t}}),R=()=>{$.value=!1},E=J(()=>f.run&&(f.run.reqid||f.run.trigger_context?.reqid||f.run.global_context?.reqid)||"--"),Y=J(()=>C.value.slice().sort((o,t)=>o.loop_index-t.loop_index).map((o,t)=>({...o,runOrder:t+1})));te(()=>f.run?.id,async o=>{!o||!$.value||await L(o)},{immediate:!0}),te(()=>$.value,async o=>{o&&f.run?.id&&await L(f.run.id)});const L=async o=>{try{const t=await we(o);b.value=t.nodes.map(e=>({id:e.node_id,type:"default",position:e.position??{x:0,y:0},data:{label:e.label||e.node_id,status:e.status,loop:e.loop_index,output:e.last_output,nodeConfigSnapshot:e.node_config_snapshot||null},style:{border:`2px solid ${Q[e.status].color}`,background:Q[e.status].bgColor,color:Q[e.status].color}})),V.value=t.edges.map(e=>({id:e.id,source:e.source,target:e.target,sourceHandle:e.sourceHandle,targetHandle:e.targetHandle,label:e.label,animated:e.animated,type:e.type||"smoothstep"})),_.value=null,l.value=null,C.value=[]}catch{z.error("加载运行图失败")}},F=async({node:o})=>{_.value=o.id,l.value=o.data?.nodeConfigSnapshot||null,await B(o.id)},j=async o=>{if(!o){l.value=null,C.value=[];return}const t=b.value.find(e=>e.id===o);l.value=t?.data?.nodeConfigSnapshot||null,await B(o)},B=async o=>{if(!(!f.run?.id||!o)){T.value=!0;try{const t=await ve(f.run.id,o);C.value=t.histories}catch{z.error("获取节点日志失败")}finally{T.value=!1}}},G=o=>{if(!o)return"--";const t=new Date(o);return Number.isNaN(t.getTime())?"--":new Intl.DateTimeFormat("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}).format(t)},k=o=>{if(!o)return"无数据";try{return typeof o=="string"?o:JSON.stringify(o,null,2)}catch{return String(o)}},A=async(o,t)=>{try{await navigator.clipboard.writeText(o),z.success(`${t} 已复制`)}catch{z.error(`复制 ${t} 失败`)}};return(o,t)=>{const e=p("el-button"),s=p("el-tag"),S=p("el-option"),D=p("el-select"),Z=p("el-skeleton"),M=p("el-empty"),U=p("el-collapse-item"),h=p("el-collapse"),ee=p("el-drawer");return r(),v(ee,{"model-value":$.value,direction:"rtl",size:"520px","with-header":!1,class:"workflow-run-drawer",onClose:R},{default:u(()=>[o.run?(r(),g("div",he,[a("div",be,[a("div",null,[a("p",Ce,"运行 "+c(o.run.id),1),a("p",$e,"工作流:"+c(o.run.workflow_name),1),a("p",xe,[w(" ReqID:"+c(E.value)+" ",1),E.value!=="--"?(r(),v(e,{key:0,link:"",type:"primary",onClick:t[0]||(t[0]=d=>A(E.value,"ReqID"))},{default:u(()=>[...t[5]||(t[5]=[w(" 复制 ",-1)])]),_:1})):N("",!0)])]),i(s,{type:x.value.type,effect:"dark"},{default:u(()=>[a("i",{class:oe(x.value.icon)},null,2),w(" "+c(x.value.label),1)]),_:1},8,["type"])]),a("div",Se,[t[6]||(t[6]=a("p",{class:"section-title"},"DAG 状态",-1)),a("div",De,[i(q(_e),{nodes:b.value,"onUpdate:nodes":t[1]||(t[1]=d=>b.value=d),edges:V.value,"onUpdate:edges":t[2]||(t[2]=d=>V.value=d),class:oe(["run-graph",{empty:!b.value.length}]),"fit-view":"","default-viewport":{zoom:.9,x:0,y:0},onNodeClick:F},{default:u(()=>[i(q(fe),{"pattern-color":"var(--border-tertiary)",gap:16}),i(q(me),{"show-fit-view":"","show-zoom":""}),i(q(ge),{pannable:"",zoomable:""})]),_:1},8,["nodes","edges","class"])])]),a("div",Ne,[a("div",Ve,[t[7]||(t[7]=a("p",{class:"section-title"},"节点日志",-1)),i(D,{modelValue:_.value,"onUpdate:modelValue":t[3]||(t[3]=d=>_.value=d),placeholder:"选择节点",size:"small",onChange:j},{default:u(()=>[(r(!0),g(W,null,H(b.value,d=>(r(),v(S,{key:d.id,label:d.data?.label||d.id,value:d.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),T.value?(r(),g("div",Re,[i(Z,{animated:"",rows:4})])):(r(),g("div",qe,[C.value.length?(r(),v(h,{key:1},{default:u(()=>[(r(!0),g(W,null,H(Y.value,d=>(r(),v(U,{key:`${d.node_id}-${d.loop_index}`,title:`第 ${d.runOrder} 次执行 · Loop #${d.loop_index} · ${q(Q)[d.status].label}`},{default:u(()=>[d.output?(r(),g("div",ze,[t[8]||(t[8]=a("p",{class:"history-output-title"},"节点输出摘要",-1)),a("pre",Te,c(k(d.output)),1)])):N("",!0),(r(!0),g(W,null,H(d.logs,(m,P)=>(r(),g("div",{class:"log-entry",key:`${d.loop_index}-${m.attempt_no}-${P}`},[a("div",Ue,[i(s,{size:"small",type:m.status==="SUCCESS"?"success":m.status==="FAILURE"?"danger":"info"},{default:u(()=>[w(" 尝试 #"+c(m.attempt_no),1)]),_:2},1032,["type"]),i(s,{size:"small",effect:"plain"},{default:u(()=>[w("日志 #"+c(P+1),1)]),_:2},1024),a("span",null,c(G(m.started_at))+" ~ "+c(G(m.finished_at)),1),a("span",null,c(m.duration_ms?`${Math.round(m.duration_ms)}ms`:""),1)]),m.request_snapshot?(r(),g("div",Ie,[t[9]||(t[9]=a("p",{class:"log-block-title"},"请求快照",-1)),a("pre",Ee,c(k(m.request_snapshot)),1)])):N("",!0),m.response_snapshot?(r(),g("div",Fe,[t[10]||(t[10]=a("p",{class:"log-block-title"},"响应快照",-1)),a("pre",Ae,c(k(m.response_snapshot)),1)])):N("",!0),m.error_detail?(r(),g("div",Oe,[t[11]||(t[11]=a("p",{class:"log-block-title"},"错误详情",-1)),a("pre",We,c(k(m.error_detail)),1)])):N("",!0)]))),128))]),_:2},1032,["title"]))),128))]),_:1})):(r(),v(M,{key:0,description:"请选择节点查看日志"}))]))]),a("div",He,[a("div",Le,[t[13]||(t[13]=a("p",{class:"section-title"},"节点配置快照(执行时)",-1)),l.value?(r(),v(e,{key:0,link:"",type:"primary",onClick:t[4]||(t[4]=d=>A(k(l.value),"节点配置快照"))},{default:u(()=>[...t[12]||(t[12]=[w(" 复制快照 ",-1)])]),_:1})):N("",!0)]),_.value?(r(),g("div",je,[a("p",Be,"节点:"+c(_.value),1),a("pre",Ge,c(k(l.value||"该节点无配置快照")),1)])):(r(),v(M,{key:1,description:"请先在上方 DAG 中选择节点"}))])])):N("",!0)]),_:1},8,["model-value"])}}}),Pe=ne(Me,[["__scopeId","data-v-a32a1ece"]]),Je={class:"filter-bar"},Qe={class:"mono-cell"},Ke={class:"mono-cell"},Xe={class:"workflow-cell"},Ye={class:"workflow-name"},Ze={class:"table-footer"},et=se({__name:"WorkflowRuns",setup(ae){const I=ke(),f=ce(),X=de(),b=y([]),V=y(!1),C=y(!1),T=y(null),_=le({page:1,page_size:20,total:0}),l=le({workflow_id:"",status:"",reqid:"",range:[]}),$=y(!1),x=async()=>{V.value=!0;try{const e={page:_.page,page_size:_.page_size};l.workflow_id&&(e.workflow_id=l.workflow_id),l.status&&(e.status=l.status),l.reqid&&(e.reqid=l.reqid.trim()),l.range.length===2&&(e.date_from=l.range[0].toISOString(),e.date_to=l.range[1].toISOString());const s=await ye(e);b.value=s.list,_.total=s.total}catch{z.error("获取运行记录失败")}finally{V.value=!1}},R=()=>{_.page=1,t(),x()},E=e=>{_.page=e,t(),x()},Y=()=>{x()},L=e=>{T.value=e,C.value=!0},F=e=>e.reqid||e.trigger_context?.reqid||e.global_context?.reqid||"--",j=async(e,s)=>{try{await navigator.clipboard.writeText(e),z.success(`${s} 已复制`)}catch{z.error(`复制 ${s} 失败`)}},B=e=>new Intl.DateTimeFormat("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}).format(new Date(e)),G=e=>{if(!e)return"--";if(e<1e3)return`${Math.round(e)} ms`;const s=e/1e3;return s<60?`${s.toFixed(1)} s`:`${(s/60).toFixed(1)} min`},k=e=>K[e],A=e=>{if(typeof e!="string"||!e)return null;const s=new Date(e);return Number.isNaN(s.getTime())?null:s},o=e=>{l.workflow_id=typeof e.workflow_id=="string"?e.workflow_id:"",l.status=typeof e.status=="string"?e.status:"",l.reqid=typeof e.reqid=="string"?e.reqid:"";const s=A(e.date_from),S=A(e.date_to);l.range=s&&S?[s,S]:[];const D=Number(e.page);_.page=Number.isFinite(D)&&D>=1?D:1},t=()=>{if($.value)return;const e={};l.workflow_id&&(e.workflow_id=l.workflow_id),l.status&&(e.status=l.status),l.reqid&&(e.reqid=l.reqid.trim()),l.range.length===2&&(e.date_from=l.range[0].toISOString(),e.date_to=l.range[1].toISOString()),e.page=String(_.page),X.replace({path:"/workflow/runs",query:e})};return te(()=>f.query,async e=>{$.value=!0,o(e),I.definitions.length||await I.fetchDefinitionsAction(),await x(),$.value=!1},{immediate:!0}),(e,s)=>{const S=p("el-option"),D=p("el-select"),Z=p("el-input"),M=p("el-date-picker"),U=p("el-button"),h=p("el-table-column"),ee=p("el-table"),d=p("el-pagination"),m=p("el-card"),P=ie("loading");return r(),v(pe,{title:"任务执行记录",subtitle:"查看定时任务运行历史、状态与节点日志",icon:"i-carbon-chart-network"},{default:u(()=>[a("div",Je,[i(D,{modelValue:l.workflow_id,"onUpdate:modelValue":s[0]||(s[0]=n=>l.workflow_id=n),placeholder:"全部工作流",filterable:"",clearable:"",style:{width:"220px"},onChange:R},{default:u(()=>[(r(!0),g(W,null,H(q(I).definitions,n=>(r(),v(S,{key:n.id,label:n.name,value:n.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),i(D,{modelValue:l.status,"onUpdate:modelValue":s[1]||(s[1]=n=>l.status=n),placeholder:"运行状态",clearable:"",style:{width:"160px"},onChange:R},{default:u(()=>[(r(!0),g(W,null,H(q(K),(n,O)=>(r(),v(S,{key:O,label:n.label,value:O},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),i(Z,{modelValue:l.reqid,"onUpdate:modelValue":s[2]||(s[2]=n=>l.reqid=n),placeholder:"按 ReqID 过滤",clearable:"",style:{width:"240px"},onChange:R,onClear:R},null,8,["modelValue"]),i(M,{modelValue:l.range,"onUpdate:modelValue":s[3]||(s[3]=n=>l.range=n),type:"datetimerange","range-separator":"至","start-placeholder":"开始时间","end-placeholder":"结束时间",onChange:R},null,8,["modelValue"]),i(U,{onClick:Y},{default:u(()=>[...s[5]||(s[5]=[a("i",{class:"i-carbon-renew mr-2"},null,-1),w("刷新",-1)])]),_:1})]),i(m,{shadow:"never",class:"runs-card"},{default:u(()=>[re((r(),v(ee,{data:b.value,stripe:""},{default:u(()=>[i(h,{label:"Run ID","min-width":"240"},{default:u(({row:n})=>[a("div",Qe,[a("span",null,c(n.id),1),i(U,{link:"",type:"primary",onClick:O=>j(n.id,"Run ID")},{default:u(()=>[...s[6]||(s[6]=[w("复制",-1)])]),_:1},8,["onClick"])])]),_:1}),i(h,{label:"ReqID","min-width":"260"},{default:u(({row:n})=>[a("div",Ke,[a("span",null,c(F(n)),1),F(n)!=="--"?(r(),v(U,{key:0,link:"",type:"primary",onClick:O=>j(F(n),"ReqID")},{default:u(()=>[...s[7]||(s[7]=[w(" 复制 ",-1)])]),_:1},8,["onClick"])):N("",!0)])]),_:1}),i(h,{label:"工作流","min-width":"200"},{default:u(({row:n})=>[a("div",Xe,[a("p",Ye,c(n.workflow_name),1),a("small",null,c(n.workflow_id),1)])]),_:1}),i(h,{label:"触发类型",prop:"trigger_type","min-width":"120"}),i(h,{label:"状态",width:"140"},{default:u(({row:n})=>[a("span",{class:"status-chip",style:ue({color:k(n.status).color,background:k(n.status).bgColor})},[a("i",{class:oe(k(n.status).icon)},null,2),w(" "+c(k(n.status).label),1)],4)]),_:1}),i(h,{label:"耗时",width:"120"},{default:u(({row:n})=>[w(c(G(n.duration_ms)),1)]),_:1}),i(h,{label:"开始时间",width:"180"},{default:u(({row:n})=>[w(c(B(n.started_at)),1)]),_:1}),i(h,{fixed:"right",width:"140",label:"操作"},{default:u(({row:n})=>[i(U,{link:"",type:"primary",onClick:O=>L(n)},{default:u(()=>[...s[8]||(s[8]=[w("详情",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])),[[P,V.value]]),a("div",Ze,[i(d,{layout:"prev, pager, next",total:_.total,"page-size":_.page_size,"current-page":_.page,onCurrentChange:E},null,8,["total","page-size","current-page"])])]),_:1}),i(Pe,{modelValue:C.value,"onUpdate:modelValue":s[4]||(s[4]=n=>C.value=n),run:T.value},null,8,["modelValue","run"])]),_:1})}}}),st=ne(et,[["__scopeId","data-v-b580c0d1"]]);export{st as default};
@@ -0,0 +1 @@
1
+ .workflow-run-drawer[data-v-a32a1ece]{--el-drawer-padding-primary: 0}.drawer-content[data-v-a32a1ece]{padding:24px;display:flex;flex-direction:column;gap:20px;height:100%}.drawer-header[data-v-a32a1ece]{display:flex;justify-content:space-between;align-items:center}.drawer-title[data-v-a32a1ece]{font-size:20px;font-weight:600}.drawer-subtitle[data-v-a32a1ece]{color:var(--text-secondary);margin-top:4px}.reqid-line[data-v-a32a1ece]{display:flex;align-items:center;gap:8px;word-break:break-all}.drawer-section[data-v-a32a1ece]{border:1px solid var(--border-secondary);border-radius:var(--radius-lg);padding:16px;background:var(--bg-elevated)}.section-title[data-v-a32a1ece]{font-weight:600;margin-bottom:12px}.section-header[data-v-a32a1ece]{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;gap:12px}.graph-wrapper[data-v-a32a1ece]{height:240px;border:1px dashed var(--border-secondary);border-radius:var(--radius-lg);overflow:hidden}.run-graph.empty[data-v-a32a1ece]{display:flex;align-items:center;justify-content:center;color:var(--text-tertiary)}.log-panel[data-v-a32a1ece]{border:1px solid var(--border-tertiary);border-radius:var(--radius-lg);padding:12px;max-height:300px;overflow-y:auto}.snapshot-panel[data-v-a32a1ece]{border:1px solid var(--border-tertiary);border-radius:var(--radius-lg);padding:12px}.snapshot-node-title[data-v-a32a1ece]{margin-bottom:8px;font-weight:600}.log-entry[data-v-a32a1ece]{border:1px solid var(--border-tertiary);border-radius:var(--radius-base);padding:12px;margin-bottom:12px}.history-output[data-v-a32a1ece]{border:1px dashed var(--border-secondary);border-radius:var(--radius-base);padding:10px;margin-bottom:12px}.history-output-title[data-v-a32a1ece],.log-block-title[data-v-a32a1ece]{font-size:12px;font-weight:600;color:var(--text-secondary);margin-bottom:6px}.log-block[data-v-a32a1ece]{margin-top:8px}.log-entry-header[data-v-a32a1ece]{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin-bottom:8px}.log-json[data-v-a32a1ece]{background:var(--bg-secondary);padding:12px;border-radius:var(--radius-base);font-size:12px;white-space:pre-wrap}@media (max-width: 640px){.drawer-content[data-v-a32a1ece]{padding:16px}.graph-wrapper[data-v-a32a1ece]{height:200px}}.filter-bar[data-v-b580c0d1]{display:flex;gap:12px;flex-wrap:wrap;margin-bottom:16px}.runs-card[data-v-b580c0d1]{border-radius:var(--radius-lg);border:1px solid var(--border-secondary)}.workflow-cell[data-v-b580c0d1]{display:flex;flex-direction:column}.workflow-name[data-v-b580c0d1]{font-weight:600}.mono-cell[data-v-b580c0d1]{display:flex;align-items:center;gap:8px;font-family:var(--font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);word-break:break-all}.status-chip[data-v-b580c0d1]{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border-radius:var(--radius-base);font-size:12px}.table-footer[data-v-b580c0d1]{display:flex;justify-content:flex-end;padding:16px 0}
@@ -0,0 +1 @@
1
+ import{I as r,J as s}from"./index-CiFlm8oc.js";const A=100,R=30,d="round_robin",E="default",m=80,a=t=>t?.trim()||void 0,c=t=>{if(t==null||t==="")return m;const e=typeof t=="string"?Number(t):t;return typeof e=="number"&&Number.isFinite(e)&&e>0&&e<=65535?e:m},L=t=>{if(t.upstream_host)return{host:t.upstream_host.trim(),port:c(t.upstream_port)};const e=t.upstream_address?.trim();if(e){try{const u=e.includes("://")?e:`http://${e}`,_=new URL(u);if(_.hostname)return{host:_.hostname,port:c(_.port||t.upstream_port)}}catch{}const[n,i]=e.split(":");if(n)return{host:n.trim(),port:c(i||t.upstream_port)}}return{host:(t.upstream_service??t.service_name??"localhost").trim()||"localhost",port:c(t.upstream_port)}},h=(t,e,o)=>(t?.trim()||`${e}${o}`||"route").replace(/[^a-zA-Z0-9-_]/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"").slice(0,100)||`route-${Date.now()}`,I=t=>Array.isArray(t)&&t.length>0?t.join(","):E,S=t=>{const e={...t.route_metadata||{},...t.metadata||{}},o={};return t.service_name&&(o.legacy_service_name=t.service_name),t.upstream_address&&(o.legacy_upstream_address=t.upstream_address),Array.isArray(t.waf_rules)&&t.waf_rules.length>0&&(o.legacy_waf_rules=t.waf_rules),t.timeout!==void 0&&(o.legacy_timeout=t.timeout),Object.keys(o).length>0&&(e.legacy=o),Object.keys(e).length>0?e:void 0},p=t=>{if(!t.domain)throw new Error("domain is required for route payload");const e=a(t.path_pattern??t.path)||"/",o=a(t.upstream_service??t.service_name);if(!o)throw new Error("upstream service is required for route payload");const{host:n,port:i}=L(t),u=h(t.route_name,t.domain,e),_=t.enable_waf??t.waf_enabled??!1,T=a(t.waf_rule_set)||I(t.waf_rules),l=S(t);return{route_name:u,domain:t.domain,path_pattern:e,upstream_service:o,upstream_host:n,upstream_port:i,priority:Number.isFinite(t.priority)?Number(t.priority):A,is_enabled:t.is_enabled??!0,enable_https:t.enable_https??!0,force_https:t.force_https??!0,enable_waf:_,waf_rule_set:T,load_balance_strategy:t.load_balance_strategy||t.load_balance_policy||d,health_check_path:a(t.health_check_path),health_check_interval:Number.isFinite(t.health_check_interval)?Number(t.health_check_interval):R,timeout:t.timeout,strip_path_prefix:a(t.strip_path_prefix),add_path_prefix:a(t.add_path_prefix),route_metadata:l,metadata:l,description:a(t.description)}},D=t=>{const e={...t};return e.window_seconds!==void 0&&e.limit_window===void 0&&(e.limit_window=e.window_seconds),e.metadata!==void 0&&e.rule_metadata===void 0&&(e.rule_metadata=e.metadata),delete e.window_seconds,delete e.metadata,e},f=t=>{const e=p(t);return r.Post(s.CADDY_ROUTES,e)},w=(t,e)=>{const o=p(e);return r.Put(s.CADDY_ROUTE_DETAIL(t),o)},y=t=>r.Get(s.CADDY_ROUTE_DETAIL(t),{params:{_t:Date.now()}}),g=t=>r.Get(s.CADDY_ROUTES,{params:{...t,_t:Date.now()}}),b=t=>r.Delete(s.CADDY_ROUTE_DETAIL(t)),Y=t=>r.Post(s.CADDY_ROUTE_TOGGLE(t)),O=()=>r.Post(s.CADDY_ROUTES_SYNC),v=()=>r.Get(s.CADDY_ROUTES_STATISTICS,{params:{_t:Date.now()}}),P=t=>r.Get(s.CADDY_ROUTES_BY_DOMAIN(t),{params:{_t:Date.now()}}),G=t=>{const e=D(t);return r.Post(s.CADDY_RATE_LIMITS,e)},U=(t,e)=>{const o=D(e);return r.Put(s.CADDY_RATE_LIMIT_DETAIL(t),o)},N=t=>r.Get(s.CADDY_RATE_LIMIT_DETAIL(t),{params:{_t:Date.now()}}),M=t=>r.Get(s.CADDY_RATE_LIMITS,{params:{...t,_t:Date.now()}}),k=t=>r.Delete(s.CADDY_RATE_LIMIT_DETAIL(t)),B=t=>r.Post(s.CADDY_RATE_LIMIT_TOGGLE(t)),F=(t,e)=>r.Post(s.CADDY_RATE_LIMIT_WHITELIST(t),e),z=(t,e)=>r.Delete(s.CADDY_RATE_LIMIT_WHITELIST(t),e),H=(t,e)=>r.Post(s.CADDY_RATE_LIMIT_BLACKLIST(t),e),x=(t,e)=>r.Delete(s.CADDY_RATE_LIMIT_BLACKLIST(t),e),W=()=>r.Get(s.CADDY_RATE_LIMITS_STATISTICS,{params:{_t:Date.now()}}),$=()=>r.Get(s.CADDY_STATS_REALTIME_GLOBAL,{params:{_t:Date.now()}}),j=t=>r.Get(s.CADDY_STATS_REALTIME_SERVICE(t),{params:{_t:Date.now()}}),q=t=>r.Get(s.CADDY_STATS_TREND_GLOBAL,{params:{...t,_t:Date.now()}}),K=(t,e)=>r.Get(s.CADDY_STATS_TREND_SERVICE(t),{params:{...e,_t:Date.now()}}),V=(t,e)=>r.Get(s.CADDY_STATS_TREND_ROUTE(t),{params:{...e,_t:Date.now()}}),J=t=>r.Get(s.CADDY_STATS_TOP_COUNTRIES,{params:{...t,_t:Date.now()}}),Z=t=>r.Get(s.CADDY_STATS_TOP_IPS,{params:{...t,_t:Date.now()}});export{W as A,y as a,v as b,f as c,b as d,P as e,$ as f,g,j as h,q as i,K as j,V as k,J as l,Z as m,M as n,N as o,G as p,U as q,k as r,O as s,Y as t,w as u,B as v,F as w,z as x,H as y,x as z};
@@ -0,0 +1 @@
1
+ function u(a,i="full"){const t=new Date(a);if(isNaN(t.getTime()))return"无效日期";const s=t.getFullYear(),r=String(t.getMonth()+1).padStart(2,"0"),e=String(t.getDate()).padStart(2,"0"),n=String(t.getHours()).padStart(2,"0"),o=String(t.getMinutes()).padStart(2,"0"),c=String(t.getSeconds()).padStart(2,"0");switch(i){case"date":return`${s}-${r}-${e}`;case"time":return`${n}:${o}:${c}`;case"full":default:return`${s}-${r}-${e} ${n}:${o}:${c}`}}function f(a){const i=new Date(a),s=new Date().getTime()-i.getTime(),r=Math.floor(s/1e3),e=Math.floor(r/60),n=Math.floor(e/60),o=Math.floor(n/24);return r<60?"刚刚":e<60?`${e}分钟前`:n<24?`${n}小时前`:o<30?`${o}天前`:u(a,"date")}export{f as a,u as f};