plugin-cluster-manager 1.1.15 → 1.1.17

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 (49) hide show
  1. package/dist/client/index.js +1 -1
  2. package/dist/client-v2/376.cd1d86e85a50088e.js +10 -0
  3. package/dist/client-v2/index.js +1 -1
  4. package/dist/externalVersion.js +6 -6
  5. package/dist/locale/en-US.json +16 -6
  6. package/dist/locale/vi-VN.json +16 -6
  7. package/dist/locale/zh-CN.json +16 -6
  8. package/dist/server/actions/cluster-nodes.js +44 -11
  9. package/dist/server/actions/doctor.js +73 -7
  10. package/dist/server/actions/event-queue-monitor.js +33 -3
  11. package/dist/server/actions/orchestrator.js +48 -32
  12. package/dist/server/actions/queue-mappings.js +1 -0
  13. package/dist/server/actions/tasks.js +8 -8
  14. package/dist/server/adapters/redis-event-queue-adapter.js +188 -0
  15. package/dist/server/adapters/redis-node-registry.js +44 -10
  16. package/dist/server/collections/orchestrator-stacks.js +6 -0
  17. package/dist/server/collections/worker-queue-mappings.js +1 -1
  18. package/dist/server/orchestrator/PackageManager.js +47 -12
  19. package/dist/server/plugin.js +37 -6
  20. package/dist/server/queue-scanner.js +54 -34
  21. package/dist/server/utils/node.js +3 -7
  22. package/dist/server/utils/redis.js +37 -9
  23. package/dist/shared/worker-processes.js +233 -0
  24. package/package.json +1 -1
  25. package/src/client/ClusterNodes.tsx +76 -10
  26. package/src/client/ContainerOrchestrator.tsx +146 -8
  27. package/src/client/QueueAssignment.tsx +10 -2
  28. package/src/locale/en-US.json +16 -6
  29. package/src/locale/vi-VN.json +16 -6
  30. package/src/locale/zh-CN.json +16 -6
  31. package/src/server/__tests__/worker-processes.test.ts +42 -0
  32. package/src/server/actions/cluster-nodes.ts +43 -8
  33. package/src/server/actions/doctor.ts +77 -0
  34. package/src/server/actions/event-queue-monitor.ts +34 -3
  35. package/src/server/actions/orchestrator.ts +58 -38
  36. package/src/server/actions/queue-mappings.ts +1 -0
  37. package/src/server/actions/tasks.ts +142 -142
  38. package/src/server/adapters/redis-event-queue-adapter.ts +189 -0
  39. package/src/server/adapters/redis-node-registry.ts +44 -4
  40. package/src/server/collections/orchestrator-stacks.ts +6 -0
  41. package/src/server/collections/worker-queue-mappings.ts +3 -3
  42. package/src/server/orchestrator/PackageManager.ts +48 -11
  43. package/src/server/orchestrator/types.ts +5 -4
  44. package/src/server/plugin.ts +40 -6
  45. package/src/server/queue-scanner.ts +65 -51
  46. package/src/server/utils/node.ts +3 -10
  47. package/src/server/utils/redis.ts +39 -4
  48. package/src/shared/worker-processes.ts +216 -0
  49. package/dist/client-v2/914.c0bce51908fd81d7.js +0 -10
@@ -0,0 +1,10 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ "use strict";(self.webpackChunkplugin_cluster_manager_client_v2=self.webpackChunkplugin_cluster_manager_client_v2||[]).push([["376"],{315:function(e,t,n){n.d(t,{ClusterManagerLayout:function(){return tY}});var r=n(155),a=n.n(r),l=n(59),o=n(375),i=n(485),c=n(185),u=n.n(c);function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function d(e,t,n,r,a,l,o){try{var i=e[l](o),c=i.value}catch(e){n(e);return}i.done?t(c):Promise.resolve(c).then(r,a)}function m(e){return function(){var t=this,n=arguments;return new Promise(function(r,a){var l=e.apply(t,n);function o(e){d(l,r,a,o,i,"next",e)}function i(e){d(l,r,a,o,i,"throw",e)}o(void 0)})}}function p(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){var r;r=n[t],t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r})}return e}function f(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):(function(e){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t.push.apply(t,n)}return t})(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}),e}function y(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,a=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var l=[],o=!0,i=!1;try{for(a=a.call(e);!(o=(n=a.next()).done)&&(l.push(n.value),!t||l.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==a.return||a.return()}finally{if(i)throw r}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return s(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return s(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function g(e,t){var n,r,a,l={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},o=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),i=Object.defineProperty;return i(o,"next",{value:c(0)}),i(o,"throw",{value:c(1)}),i(o,"return",{value:c(2)}),"function"==typeof Symbol&&i(o,Symbol.iterator,{value:function(){return this}}),o;function c(i){return function(c){var u=[i,c];if(n)throw TypeError("Generator is already executing.");for(;o&&(o=0,u[0]&&(l=0)),l;)try{if(n=1,r&&(a=2&u[0]?r.return:u[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,u[1])).done)return a;switch(r=0,a&&(u=[2&u[0],a.value]),u[0]){case 0:case 1:a=u;break;case 4:return l.label++,{value:u[1],done:!1};case 5:l.label++,r=u[1],u=[0];continue;case 7:u=l.ops.pop(),l.trys.pop();continue;default:if(!(a=(a=l.trys).length>0&&a[a.length-1])&&(6===u[0]||2===u[0])){l=0;continue}if(3===u[0]&&(!a||u[1]>a[0]&&u[1]<a[3])){l.label=u[1];break}if(6===u[0]&&l.label<a[1]){l.label=a[1],a=u;break}if(a&&l.label<a[2]){l.label=a[2],l.ops.push(u);break}a[2]&&l.ops.pop(),l.trys.pop();continue}u=t.call(e,l)}catch(e){u=[6,e],r=0}finally{n=a=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}var h={null:{label:"Pending",color:"default"},0:{label:"Running",color:"processing"},1:{label:"Succeeded",color:"success"},"-1":{label:"Failed",color:"error"},"-2":{label:"Canceled",color:"warning"}};function v(){var e=(0,i.useApp)().apiClient,t=y((0,r.useState)([]),2),n=t[0],c=t[1],s=y((0,r.useState)(!1),2),d=s[0],v=s[1],b=y((0,r.useState)({current:1,pageSize:20,total:0}),2),E=b[0],w=b[1],S=y((0,r.useState)(void 0),2),k=S[0],C=S[1],x=(0,r.useCallback)(function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:E.current,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:E.pageSize;return m(function(){var r,a;return g(this,function(o){switch(o.label){case 0:v(!0),o.label=1;case 1:return o.trys.push([1,3,4,5]),[4,e.request({url:"clusterManager:list",params:{page:t,pageSize:n,statusFilter:void 0===k?"":k}})];case 2:return c(Array.isArray(null==(a=o.sent().data)||null==(r=a.data)?void 0:r.data)?a.data.data:Array.isArray(null==a?void 0:a.data)?a.data:Array.isArray(a)?a:[]),w(function(e){var n,r;return f(p({},e),{current:(null==(n=a.meta)?void 0:n.page)||t,total:(null==(r=a.meta)?void 0:r.count)||0})}),[3,5];case 3:return o.sent(),l.message.error("Failed to load tasks"),[3,5];case 4:return v(!1),[7];case 5:return[2]}})})()},[e,E.current,E.pageSize,k]);(0,r.useEffect)(function(){x()},[k]);var O=function(t){return m(function(){var n,r;return g(this,function(a){switch(a.label){case 0:return a.trys.push([0,2,,3]),[4,e.request({url:"clusterManager:purge",method:"post",data:{days:t}})];case 1:return r=a.sent(),l.message.success("Purged ".concat((null==r||null==(n=r.data)?void 0:n.deletedCount)||0," tasks")),x(),[3,3];case 2:return a.sent(),l.message.error("Failed to purge tasks"),[3,3];case 3:return[2]}})})()},I=[{title:"Title",dataIndex:"title",width:200,ellipsis:!0},{title:"Type",dataIndex:"type",width:120},{title:"Status",dataIndex:"status",width:100,render:function(e){var t=h[String(e)]||{label:String(e),color:"default"};return a().createElement(l.Tag,{color:t.color},t.label)}},{title:"Progress",key:"progress",width:150,render:function(e,t){if(0!==t.status||!t.progressTotal)return"-";var n=Math.round(t.progressCurrent/t.progressTotal*100);return a().createElement(l.Progress,{percent:n,size:"small"})}},{title:"User",key:"user",width:120,render:function(e,t){var n;return(null==(n=t.createdBy)?void 0:n.nickname)||"-"}},{title:"Created",dataIndex:"createdAt",width:160,render:function(e){return e?u()(e).format("YYYY-MM-DD HH:mm:ss"):"-"}},{title:"Duration",key:"duration",width:100,render:function(e,t){if(!t.startedAt)return"-";var n=t.doneAt||new Date().toISOString(),r=u()(n).diff(u()(t.startedAt),"second");return r<60?"".concat(r,"s"):"".concat(Math.floor(r/60),"m ").concat(r%60,"s")}},{title:"Actions",key:"actions",width:120,render:function(t,n){return a().createElement(l.Space,null,(0===n.status||null===n.status)&&a().createElement(l.Popconfirm,{title:"Cancel this task?",onConfirm:function(){var t;return t=n.id,m(function(){return g(this,function(n){switch(n.label){case 0:return[4,e.request({url:"clusterManager:cancel",params:{filterByTk:t}})];case 1:return n.sent(),l.message.success("Task canceled"),x(),[2]}})})()}},a().createElement(l.Button,{type:"link",size:"small",icon:a().createElement(o.StopOutlined,null),danger:!0})),(-1===n.status||-2===n.status)&&a().createElement(l.Popconfirm,{title:"Retry this task?",onConfirm:function(){var t;return t=n.id,m(function(){return g(this,function(n){switch(n.label){case 0:return[4,e.request({url:"clusterManager:retry",params:{filterByTk:t}})];case 1:return n.sent(),l.message.success("Task re-queued"),x(),[2]}})})()}},a().createElement(l.Button,{type:"link",size:"small",icon:a().createElement(o.RedoOutlined,null)})))}}];return a().createElement("div",null,a().createElement(l.Space,{style:{marginBottom:16}},a().createElement(l.Select,{placeholder:"Filter by status",allowClear:!0,style:{width:160},value:k,onChange:C,options:Object.entries(h).map(function(e){var t=y(e,2);return{value:t[0],label:t[1].label}})}),a().createElement(l.Button,{icon:a().createElement(o.ReloadOutlined,null),onClick:function(){return x()}},"Refresh"),a().createElement(l.Dropdown,{menu:{items:[{key:"7",label:"Older than 7 days",onClick:function(){return O(7)}},{key:"30",label:"Older than 30 days",onClick:function(){return O(30)}},{key:"0",label:"All completed/failed",danger:!0,onClick:function(){return O(0)}}]},trigger:["click"]},a().createElement(l.Button,{danger:!0},"Purge Tasks"))),a().createElement(l.Table,{rowKey:"id",columns:I,dataSource:n,loading:d,size:"small",scroll:{x:"max-content"},pagination:f(p({},E),{showSizeChanger:!0,showTotal:function(e){return"Total ".concat(e)},onChange:function(e,t){return x(e,t)}})}))}function b(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function E(e,t,n,r,a,l,o){try{var i=e[l](o),c=i.value}catch(e){n(e);return}i.done?t(c):Promise.resolve(c).then(r,a)}function w(e){return function(){var t=this,n=arguments;return new Promise(function(r,a){var l=e.apply(t,n);function o(e){E(l,r,a,o,i,"next",e)}function i(e){E(l,r,a,o,i,"throw",e)}o(void 0)})}}function S(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function k(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){S(e,t,n[t])})}return e}function C(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):(function(e){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t.push.apply(t,n)}return t})(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}),e}function x(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,a=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var l=[],o=!0,i=!1;try{for(a=a.call(e);!(o=(n=a.next()).done)&&(l.push(n.value),!t||l.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==a.return||a.return()}finally{if(i)throw r}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return b(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return b(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function O(e,t){var n,r,a,l={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},o=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),i=Object.defineProperty;return i(o,"next",{value:c(0)}),i(o,"throw",{value:c(1)}),i(o,"return",{value:c(2)}),"function"==typeof Symbol&&i(o,Symbol.iterator,{value:function(){return this}}),o;function c(i){return function(c){var u=[i,c];if(n)throw TypeError("Generator is already executing.");for(;o&&(o=0,u[0]&&(l=0)),l;)try{if(n=1,r&&(a=2&u[0]?r.return:u[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,u[1])).done)return a;switch(r=0,a&&(u=[2&u[0],a.value]),u[0]){case 0:case 1:a=u;break;case 4:return l.label++,{value:u[1],done:!1};case 5:l.label++,r=u[1],u=[0];continue;case 7:u=l.ops.pop(),l.trys.pop();continue;default:if(!(a=(a=l.trys).length>0&&a[a.length-1])&&(6===u[0]||2===u[0])){l=0;continue}if(3===u[0]&&(!a||u[1]>a[0]&&u[1]<a[3])){l.label=u[1];break}if(6===u[0]&&l.label<a[1]){l.label=a[1],a=u;break}if(a&&l.label<a[2]){l.label=a[2],l.ops.push(u);break}a[2]&&l.ops.pop(),l.trys.pop();continue}u=t.call(e,l)}catch(e){u=[6,e],r=0}finally{n=a=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}var I={null:{label:"Queueing",color:"default"},0:{label:"Started",color:"processing"},1:{label:"Resolved",color:"success"},"-1":{label:"Failed",color:"error"},"-2":{label:"Error",color:"error"},"-3":{label:"Aborted",color:"warning"},"-4":{label:"Canceled",color:"warning"},"-5":{label:"Rejected",color:"warning"},"-6":{label:"Retry Needed",color:"orange"}},A={0:{label:"Pending",color:"default"},1:{label:"Resolved",color:"success"},"-1":{label:"Failed",color:"error"},"-2":{label:"Error",color:"error"},"-3":{label:"Aborted",color:"warning"},"-4":{label:"Canceled",color:"warning"}};function P(){var e=(0,i.useApp)().apiClient,t=x((0,r.useState)([]),2),n=t[0],c=t[1],s=x((0,r.useState)(!1),2),d=s[0],m=s[1],p=x((0,r.useState)({current:1,pageSize:20,total:0}),2),f=p[0],y=p[1],g=x((0,r.useState)(void 0),2),h=g[0],v=g[1],b=x((0,r.useState)({}),2),E=b[0],P=b[1],T=x((0,r.useState)({}),2),R=T[0],j=T[1],z=(0,r.useCallback)(function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:f.current,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:f.pageSize;return w(function(){var r,a;return O(this,function(o){switch(o.label){case 0:m(!0),o.label=1;case 1:return o.trys.push([1,3,4,5]),[4,e.request({url:"clusterManagerWorkflow:list",params:{page:t,pageSize:n,statusFilter:void 0===h?"":h}})];case 2:return c(Array.isArray(null==(a=o.sent().data)||null==(r=a.data)?void 0:r.data)?a.data.data:Array.isArray(null==a?void 0:a.data)?a.data:Array.isArray(a)?a:[]),y(function(e){var n,r;return C(k({},e),{current:(null==(n=a.meta)?void 0:n.page)||t,total:(null==(r=a.meta)?void 0:r.count)||0})}),[3,5];case 3:return o.sent(),l.message.error("Failed to load executions"),[3,5];case 4:return m(!1),[7];case 5:return[2]}})})()},[e,f.current,f.pageSize,h]);(0,r.useEffect)(function(){z()},[h]);var M=function(t){return w(function(){var n,r;return O(this,function(a){switch(a.label){case 0:return a.trys.push([0,2,,3]),[4,e.request({url:"clusterManagerWorkflow:purge",method:"post",data:{days:t}})];case 1:return r=a.sent(),l.message.success("Purged ".concat((null==r||null==(n=r.data)?void 0:n.deletedCount)||0," executions")),z(),[3,3];case 2:return a.sent(),l.message.error("Failed to purge executions"),[3,3];case 3:return[2]}})})()},D=[{title:"Job ID",dataIndex:"id",width:100},{title:"Node",key:"node",width:200,render:function(e,t){var n;return(null==(n=t.node)?void 0:n.title)||t.nodeKey||"-"}},{title:"Status",dataIndex:"status",width:100,render:function(e){var t=A[String(e)]||{label:String(e),color:"default"};return a().createElement(l.Tag,{color:t.color},t.label)}},{title:"Result",dataIndex:"result",ellipsis:!0,render:function(e){return e?JSON.stringify(e).slice(0,120):"-"}}],N=[{title:"ID",dataIndex:"id",width:100},{title:"Workflow",key:"workflow",width:200,render:function(e,t){var n;return(null==(n=t.workflow)?void 0:n.title)||"-"}},{title:"Status",dataIndex:"status",width:120,render:function(e){var t=I[String(e)]||{label:String(e),color:"default"};return a().createElement(l.Tag,{color:t.color},t.label)}},{title:"Executing Node",dataIndex:"workerNode",width:150,render:function(e){return e&&"-"!==e?a().createElement(l.Tag,{color:"blue"},e):a().createElement(l.Tag,null,e||"-")}},{title:"Manual",dataIndex:"manually",width:80,render:function(e){return e?a().createElement(l.Tag,{color:"blue"},"Yes"):"-"}},{title:"Triggered At",dataIndex:"createdAt",width:160,render:function(e){return e?u()(e).format("YYYY-MM-DD HH:mm:ss"):"-"}},{title:"Actions",key:"actions",width:120,render:function(t,n){return a().createElement(l.Space,null,a().createElement(l.Button,{type:"link",size:"small",icon:a().createElement(o.UnorderedListOutlined,null),onClick:function(){var t;return t=n.id,w(function(){var n,r,a,o,i;return O(this,function(c){switch(c.label){case 0:if(E[t])return[2];j(function(e){return C(k({},e),S({},t,!0))}),c.label=1;case 1:return c.trys.push([1,3,4,5]),[4,e.request({url:"clusterManagerWorkflow:getJobs",params:{filterByTk:t}})];case 2:return i=Array.isArray(null==(o=c.sent())||null==(r=o.data)||null==(n=r.data)?void 0:n.data)?o.data.data.data:Array.isArray(null==o||null==(a=o.data)?void 0:a.data)?o.data.data:Array.isArray(null==o?void 0:o.data)?o.data:[],P(function(e){return C(k({},e),S({},t,i))}),[3,5];case 3:return c.sent(),l.message.error("Failed to load jobs"),[3,5];case 4:return j(function(e){return C(k({},e),S({},t,!1))}),[7];case 5:return[2]}})})()},loading:R[n.id]},"Jobs"),(0===n.status||null===n.status)&&a().createElement(l.Popconfirm,{title:"Cancel execution?",onConfirm:function(){var t;return t=n.id,w(function(){return O(this,function(n){switch(n.label){case 0:return[4,e.request({url:"clusterManagerWorkflow:cancel",params:{filterByTk:t}})];case 1:return n.sent(),l.message.success("Execution canceled"),z(),[2]}})})()}},a().createElement(l.Button,{type:"link",size:"small",icon:a().createElement(o.StopOutlined,null),danger:!0})))}}];return a().createElement("div",null,a().createElement(l.Space,{style:{marginBottom:16}},a().createElement(l.Select,{placeholder:"Filter by status",allowClear:!0,style:{width:160},value:h,onChange:v,options:Object.entries(I).map(function(e){var t=x(e,2);return{value:t[0],label:t[1].label}})}),a().createElement(l.Button,{icon:a().createElement(o.ReloadOutlined,null),onClick:function(){return z()}},"Refresh"),a().createElement(l.Dropdown,{menu:{items:[{key:"7",label:"Older than 7 days",onClick:function(){return M(7)}},{key:"30",label:"Older than 30 days",onClick:function(){return M(30)}},{key:"0",label:"All completed/failed",danger:!0,onClick:function(){return M(0)}}]},trigger:["click"]},a().createElement(l.Button,{danger:!0},"Clear History"))),a().createElement(l.Table,{rowKey:"id",columns:N,dataSource:n,loading:d,size:"small",scroll:{x:"max-content"},expandable:{expandedRowRender:function(e){var t=E[e.id];return t?a().createElement(l.Table,{rowKey:"id",columns:D,dataSource:t,size:"small",pagination:!1}):a().createElement("div",{style:{padding:8}},'Click "Jobs" to load')}},pagination:C(k({},f),{showSizeChanger:!0,showTotal:function(e){return"Total ".concat(e)},onChange:function(e,t){return z(e,t)}})}))}function T(){var e=(0,i.useApp)();return(0,r.useCallback)(function(t){return e.i18n.t(t,{ns:"cluster-manager"})},[e.i18n])}function R(e){if(0===e)return"0 B";var t=Math.floor(Math.log(e)/Math.log(1024));return parseFloat((e/Math.pow(1024,t)).toFixed(1))+" "+["B","KB","MB","GB"][t]}function j(e){var t=Math.floor(e/86400),n=Math.floor(e%86400/3600),r=Math.floor(e%3600/60),a=[];return t>0&&a.push("".concat(t,"d")),n>0&&a.push("".concat(n,"h")),a.push("".concat(r,"m")),a.join(" ")}var z=[{name:"workflow:process",label:"Workflow",description:"Process workflow executions",kind:"event-queue",aliases:["workflow.pendingExecution","@nocobase/plugin-workflow.pendingExecution"],common:!0},{name:"async-task:process",label:"Async Tasks",description:"Execute async tasks",kind:"event-queue",aliases:["async-task-manager.task","@nocobase/plugin-async-task-manager.task"],common:!0},{name:"notification:send",label:"Notifications",description:"Send notification messages",kind:"event-queue",aliases:["notification-manager.send","@nocobase/plugin-notification-manager.send"],common:!0},{name:"knowledge-base:document-vectorize",label:"Document Vectorization",description:"Vectorize knowledge base documents",kind:"event-queue",aliases:["knowledge-base:document-vectorize"],pluginName:"plugin-knowledge-base",common:!0},{name:"git-review:process",label:"Git Review",description:"AI code review jobs",kind:"redis-list",aliases:["plugin-git-manager.review"],redisKeySuffixes:[":plugin-git-manager:review:queue"],pluginName:"plugin-git-manager",common:!0},{name:"build-guide:process",label:"Build Guide",description:"Build user guide pages",kind:"redis-list",aliases:["plugin-build-guide-block.build"],redisKeySuffixes:[":plugin-build-guide-block:build:queue"],pluginName:"plugin-build-guide-block",common:!0},{name:"build-visualization:process",label:"Build Visualization",description:"Build visualization blocks",kind:"redis-list",aliases:["plugin-build-visualization-block.build"],redisKeySuffixes:[":plugin-build-visualization-block:build:queue"],pluginName:"plugin-build-visualization-block",common:!0},{name:"build-ui-template:process",label:"Build UI Template",description:"Build UI template pages",kind:"event-queue",aliases:["plugin-build-ui-template.build"],pluginName:"plugin-build-ui-template",common:!0},{name:"file-preview-auth:ocr",label:"File Preview OCR",description:"Run OCR extraction for authenticated file previews",kind:"redis-list",aliases:["file-preview-auth.ocr.queue"],redisKeySuffixes:["file-preview-auth.ocr.queue"],pluginName:"plugin-file-preview-auth",common:!0},{name:"skill-hub:sandbox",label:"Skill Sandbox",description:"Execute Skill Hub sandbox tasks",kind:"pubsub",aliases:["skill-hub.task"],pluginName:"plugin-agent-orchestrator",sandbox:!0}];z.map(function(e){return[e.name,e]});var M=new Map,D=!0,N=!1,F=void 0;try{for(var B,q=z[Symbol.iterator]();!(D=(B=q.next()).done);D=!0){var L=B.value;M.set(L.name,L.name);var U=!0,K=!1,_=void 0;try{for(var W,V=(L.aliases||[])[Symbol.iterator]();!(U=(W=V.next()).done);U=!0){var H=W.value;M.set(H,L.name)}}catch(e){K=!0,_=e}finally{try{U||null==V.return||V.return()}finally{if(K)throw _}}}}catch(e){N=!0,F=e}finally{try{D||null==q.return||q.return()}finally{if(N)throw F}}function Q(e){var t=String(e||"").trim();if(!t||"*"===t||"!"===t||"-"===t)return t;var n=M.get(t);if(n)return n;var r=!0,a=!1,l=void 0;try{for(var o,i,c,u,s=(o=[t],(i=t.indexOf("."))>0&&o.push(t.slice(i+1)),(c=t.indexOf(":"))>0&&o.push(t.slice(c+1)),Array.from(new Set(o)))[Symbol.iterator]();!(r=(u=s.next()).done);r=!0){var d=u.value,m=M.get(d);if(m)return m}}catch(e){a=!0,l=e}finally{try{r||null==s.return||s.return()}finally{if(a)throw l}}var p=!0,f=!1,y=void 0;try{for(var g,h=z[Symbol.iterator]();!(p=(g=h.next()).done);p=!0){var v=g.value;if((v.redisKeySuffixes||[]).some(function(e){return t.endsWith(e)}))return v.name}}catch(e){f=!0,y=e}finally{try{p||null==h.return||h.return()}finally{if(f)throw y}}return t}function G(e){var t=(Array.isArray(e)?e:String(e||"").split(",")).map(function(e){return String(e).trim()}).filter(Boolean).map(Q);if(t.includes("*"))return"*";var n=Array.from(new Set(t.filter(Boolean)));return n.length?n.join(","):void 0}function J(e){var t=G(e);return!!t&&"main"!==t&&"app"!==t&&"-"!==t&&!t.split(",").includes("!")}function $(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function Y(e,t,n,r,a,l,o){try{var i=e[l](o),c=i.value}catch(e){n(e);return}i.done?t(c):Promise.resolve(c).then(r,a)}function X(e){return function(){var t=this,n=arguments;return new Promise(function(r,a){var l=e.apply(t,n);function o(e){Y(l,r,a,o,i,"next",e)}function i(e){Y(l,r,a,o,i,"throw",e)}o(void 0)})}}function Z(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){var r;r=n[t],t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r})}return e}function ee(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):(function(e){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t.push.apply(t,n)}return t})(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}),e}function et(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,a=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var l=[],o=!0,i=!1;try{for(a=a.call(e);!(o=(n=a.next()).done)&&(l.push(n.value),!t||l.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==a.return||a.return()}finally{if(i)throw r}}return l}}(e,t)||er(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function en(e){return function(e){if(Array.isArray(e))return $(e)}(e)||function(e){if("u">typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||er(e)||function(){throw TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function er(e,t){if(e){if("string"==typeof e)return $(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return $(e,t)}}function ea(e,t){var n,r,a,l={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},o=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),i=Object.defineProperty;return i(o,"next",{value:c(0)}),i(o,"throw",{value:c(1)}),i(o,"return",{value:c(2)}),"function"==typeof Symbol&&i(o,Symbol.iterator,{value:function(){return this}}),o;function c(i){return function(c){var u=[i,c];if(n)throw TypeError("Generator is already executing.");for(;o&&(o=0,u[0]&&(l=0)),l;)try{if(n=1,r&&(a=2&u[0]?r.return:u[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,u[1])).done)return a;switch(r=0,a&&(u=[2&u[0],a.value]),u[0]){case 0:case 1:a=u;break;case 4:return l.label++,{value:u[1],done:!1};case 5:l.label++,r=u[1],u=[0];continue;case 7:u=l.ops.pop(),l.trys.pop();continue;default:if(!(a=(a=l.trys).length>0&&a[a.length-1])&&(6===u[0]||2===u[0])){l=0;continue}if(3===u[0]&&(!a||u[1]>a[0]&&u[1]<a[3])){l.label=u[1];break}if(6===u[0]&&l.label<a[1]){l.label=a[1],a=u;break}if(a&&l.label<a[2]){l.label=a[2],l.ops.push(u);break}a[2]&&l.ops.pop(),l.trys.pop();continue}u=t.call(e,l)}catch(e){u=[6,e],r=0}finally{n=a=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}function el(e){var t=e.open,n=e.node,c=e.onClose,u=T(),s=(0,i.useApp)().apiClient,d=et((0,r.useState)([]),2),m=d[0],p=d[1],f=et((0,r.useState)(null),2),y=f[0],g=f[1],h=et((0,r.useState)(!1),2),v=h[0],b=h[1],E=et((0,r.useState)(!0),2),w=E[0],S=E[1],k=et((0,r.useState)(""),2),C=k[0],x=k[1],O=(0,r.useRef)(null),I=(0,r.useCallback)(function(){return X(function(){var e,r,a;return ea(this,function(o){switch(o.label){case 0:if(!t)return[2];b(!0),o.label=1;case 1:return o.trys.push([1,3,4,5]),[4,s.request({url:"clusterManagerCluster:logs",params:{lines:200,targetNodeId:null==n?void 0:n.id}})];case 2:return(a=null==(r=o.sent())||null==(e=r.data)?void 0:e.data)&&(a._error&&l.message.warning(a._error),p(a.lines||[]),g(a.node)),[3,5];case 3:return o.sent(),l.message.error("Failed to load logs"),[3,5];case 4:return b(!1),[7];case 5:return[2]}})})()},[s,t,n]);(0,r.useEffect)(function(){t&&(p([]),x(""),S(!0),I())},[t,I]),(0,r.useEffect)(function(){if(t&&w){var e=setInterval(I,5e3);return function(){return clearInterval(e)}}},[t,w,I]),(0,r.useEffect)(function(){O.current&&!C&&O.current.scrollIntoView({behavior:"smooth"})},[m,C]);var A=C?m.filter(function(e){return e.toLowerCase().includes(C.toLowerCase())}):m;return a().createElement(l.Modal,{title:a().createElement(l.Space,null,a().createElement(o.FileTextOutlined,null),u("Instance Logs")," — ",(null==n?void 0:n.name)||"",y&&a().createElement(l.Tag,null,y.hostname,":",y.pid," (",y.workerMode,")")),open:t,onCancel:c,footer:null,width:"80vw",styles:{body:{height:"70vh",display:"flex",flexDirection:"column",padding:"12px 24px"}},destroyOnClose:!0},a().createElement(l.Space,{style:{marginBottom:8,flexShrink:0}},a().createElement(l.Input,{placeholder:u("Search logs..."),prefix:a().createElement(o.SearchOutlined,null),value:C,onChange:function(e){return x(e.target.value)},allowClear:!0,style:{width:300}}),a().createElement(l.Switch,{checked:w,onChange:S,checkedChildren:u("Auto 5s"),unCheckedChildren:u("Paused")}),a().createElement(l.Button,{icon:a().createElement(o.ReloadOutlined,null),onClick:I,loading:v,size:"small"},u("Refresh")),a().createElement("span",{style:{fontSize:12,color:"#888"}},A.length," / ",m.length," ",u("lines"))),a().createElement("div",{style:{flex:1,overflow:"auto",background:"#1e1e1e",color:"#d4d4d4",fontFamily:'Consolas, Monaco, "Courier New", monospace',fontSize:12,lineHeight:1.5,padding:12,borderRadius:6,whiteSpace:"pre-wrap",wordBreak:"break-all"}},0===A.length&&!v&&a().createElement("div",{style:{color:"#888",textAlign:"center",paddingTop:40}},u(0===m.length?"No logs available":"No matching logs")),A.map(function(e,t){var n="#d4d4d4";return/\berror\b/i.test(e)?n="#f5222d":/\bwarn(ing)?\b/i.test(e)?n="#faad14":/\bdebug\b/i.test(e)&&(n="#8c8c8c"),a().createElement("div",{key:t,style:{padding:"1px 0",color:n}},e)}),a().createElement("div",{ref:O})))}var eo={ok:"green",connected:"green",online:"green",warning:"orange",disconnected:"red",offline:"red",error:"red",not_configured:"default"};function ei(e){return(null==e?void 0:e.length)?a().createElement(l.Space,{wrap:!0,size:[4,2]},e.map(function(e){return a().createElement(l.Tag,{key:e},e)})):a().createElement(l.Typography.Text,{type:"secondary"},"-")}function ec(){var e,t,n=T(),c=(0,i.useApp)().apiClient,u=et((0,r.useState)(!1),2),s=u[0],d=u[1],m=et((0,r.useState)(null),2),p=m[0],f=m[1],y=et((0,r.useState)([]),2),g=y[0],h=y[1],v=et((0,r.useState)(null),2),b=v[0],E=v[1],w=et((0,r.useState)(null),2),S=w[0],k=w[1],C=et((0,r.useState)(null),2),x=C[0],O=C[1],I=et((0,r.useState)(null),2),A=I[0],P=I[1],z=et((0,r.useState)(null),2),M=z[0],D=z[1],N=et((0,r.useState)(null),2),F=N[0],B=N[1],q=et((0,r.useState)("worker"),2),L=q[0],U=q[1],K=et((0,r.useState)("soft"),2),_=K[0],W=K[1],V=et((0,r.useState)(5e3),2),H=V[0],Q=V[1],G=et((0,r.useState)(!1),2),$=G[0],Y=G[1],er=(0,r.useCallback)(function(){return X(function(){var e,t,n,r,a,l,o,i,u,s,m;return ea(this,function(p){switch(p.label){case 0:d(!0),p.label=1;case 1:return p.trys.push([1,3,4,5]),[4,Promise.all([c.request({url:"clusterManagerCluster:current"}),c.request({url:"clusterManagerCluster:list"}),c.request({url:"clusterManagerCluster:health"}),c.request({url:"clusterManagerCluster:drift"}),c.request({url:"clusterManagerCluster:legacyDiagnostics"})])];case 2:var y,g;return l=(a=et.apply(void 0,[p.sent(),5]))[0],o=a[1],i=a[2],u=a[3],s=a[4],m=Array.isArray(g=null==(y=null==o?void 0:o.data)?void 0:y.data)?{rows:g,meta:(null==y?void 0:y.meta)||{}}:Array.isArray(null==g?void 0:g.data)?{rows:g.data,meta:g.meta||{}}:Array.isArray(null==y?void 0:y.rows)?{rows:y.rows,meta:(null==y?void 0:y.meta)||{}}:{rows:[],meta:{}},f(null==l||null==(e=l.data)?void 0:e.data),h(m.rows),E(m.meta),k(null==i||null==(t=i.data)?void 0:t.data),O(null==u||null==(n=u.data)?void 0:n.data),P(null==s||null==(r=s.data)?void 0:r.data),[3,5];case 3:return p.sent(),[3,5];case 4:return d(!1),[7];case 5:return[2]}})})()},[c]),ec=function(e,t){return X(function(){return ea(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,c.request({url:"clusterManagerCluster:restart",method:"POST",data:{hostname:e,mode:t}})];case 1:return n.sent(),l.message.success("[".concat(t,"] Restart signal sent to ").concat("*"===e?"all nodes":e)),setTimeout(er,3e3),[3,3];case 2:return n.sent(),l.message.error("Failed to send restart signal to ".concat(e)),[3,3];case 3:return[2]}})})()};(0,r.useEffect)(function(){er()},[er]),(0,r.useEffect)(function(){if(M){var e=setInterval(er,1e3*M);return function(){return clearInterval(e)}}},[M,er]);var eu=g.filter(function(e){return"online"===e.status}).length,es=[{title:n("Name"),dataIndex:"name",key:"name",width:200},{title:n("Status"),dataIndex:"status",key:"status",width:100,render:function(e){return a().createElement(l.Tag,{color:eo[e]||"default",icon:"online"===e?a().createElement(o.CheckCircleOutlined,null):"warning"===e?a().createElement(o.WarningOutlined,null):a().createElement(o.CloseCircleOutlined,null)},e.toUpperCase())}},{title:n("Type"),dataIndex:"workerMode",key:"workerMode",width:150,render:function(e,t){var n=(null==t?void 0:t.appRole)==="app"||(null==t?void 0:t.appRole)==="worker"||(null==t?void 0:t.appRole)==="sandbox"?t.appRole:(null==t?void 0:t.isSandbox)?"sandbox":J(null==t?void 0:t.workerMode)?"worker":"app";return"sandbox"===n?a().createElement(l.Tag,{color:"purple"},"SANDBOX"):"app"===n&&J(e)?a().createElement(l.Space,{size:4},a().createElement(l.Tag,{color:"green"},"APP"),a().createElement(l.Tag,{color:"blue"},"QUEUES")):a().createElement(l.Tag,{color:"worker"===n?"blue":"green"},"worker"===n?"WORKER":"APP")}},{title:n("PID"),dataIndex:"pid",key:"pid",width:80},{title:n("Version"),dataIndex:"appVersion",key:"appVersion",width:120},{title:n("Last Heartbeat"),dataIndex:"lastHeartbeatAt",key:"lastHeartbeatAt",width:200},{title:"Action",key:"action",width:100,render:function(e,t){return a().createElement(l.Space,{size:"small"},a().createElement(l.Button,{type:"link",icon:a().createElement(o.FileTextOutlined,null),onClick:function(){return B(t)},disabled:"offline"===t.status},n("Logs")))}}],ed=(null==S?void 0:S.checks)||{},em=(null==x?void 0:x.summary)||{},ep=(null==x?void 0:x.packageDrifts)||[],ef=(null==x?void 0:x.versionDrifts)||[],ey=(null==x?void 0:x.runtimeDrifts)||[],eg=(null==A?void 0:A.findings)||[],eh=(null==b?void 0:b.registry)||{},ev=!!((null==b?void 0:b.fallback)||eh.lastHeartbeatError||eh.lastReadError),eb=function(e){var t=e.messageKey?n(e.messageKey):e.message;return e.messageArgs?Object.entries(e.messageArgs).reduce(function(e,t){var n=et(t,2),r=n[0],a=n[1];return e.replace("{".concat(r,"}"),String(a))},t):t};return a().createElement(l.Spin,{spinning:s},a().createElement(l.Space,{direction:"vertical",style:{width:"100%"},size:"middle"},a().createElement(l.Space,null,a().createElement(l.Button,{icon:a().createElement(o.ReloadOutlined,null),onClick:er},n("Refresh")),a().createElement(l.Select,{placeholder:n("Auto Refresh"),allowClear:!0,value:M,onChange:D,style:{width:140},options:[{value:5,label:"5s"},{value:10,label:"10s"},{value:30,label:"30s"}]}),a().createElement(l.Space,null,a().createElement(l.Popconfirm,{title:"Soft Restart ALL Nodes?",description:"Sends a soft reload signal to all active Nodes simultaneously.",onConfirm:function(){return ec("*","soft")}},a().createElement(l.Button,{style:{color:"#faad14",borderColor:"#ffe58f"},icon:a().createElement(o.ReloadOutlined,null)},n("Soft Restart Cluster"))),a().createElement(l.Popconfirm,{title:"Hard Restart ALL Nodes?",description:"Sends a lethal signal. Docker will reboot ALL container infrastructure.",onConfirm:function(){return ec("*","hard")}},a().createElement(l.Button,{danger:!0,icon:a().createElement(o.ReloadOutlined,null)},n("Hard Restart Cluster"))))),a().createElement(l.Row,{gutter:16},a().createElement(l.Col,{span:6},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:n("Nodes Online"),value:eu,suffix:"/ ".concat(g.length),prefix:a().createElement(o.ClusterOutlined,null),valueStyle:{color:eu===g.length?"#3f8600":"#cf1322"}}))),a().createElement(l.Col,{span:6},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:n("Worker Nodes"),value:g.filter(function(e){return(null==e?void 0:e.appRole)==="worker"||J(null==e?void 0:e.workerMode)}).length,prefix:a().createElement(o.ClusterOutlined,null)}))),a().createElement(l.Col,{span:6},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:n("Process Uptime"),value:p?j(p.node.uptime):"-"}))),a().createElement(l.Col,{span:6},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:n("Memory (Heap)"),value:p?R(p.memory.heapUsed):"-",suffix:p?"/ ".concat(R(p.memory.heapTotal)):""})))),a().createElement(l.Card,{title:n("Rolling Restart"),size:"small"},a().createElement(l.Space,{wrap:!0},a().createElement(l.Select,{value:L,onChange:U,style:{width:180},options:[{value:"worker",label:n("Worker nodes only")},{value:"app",label:n("App nodes only")},{value:"sandbox",label:n("Sandbox nodes only")},{value:"all",label:n("All nodes")}]}),a().createElement(l.Select,{value:_,onChange:W,style:{width:150},options:[{value:"soft",label:n("Soft restart")},{value:"hard",label:n("Hard restart")}]}),a().createElement(l.InputNumber,{min:1e3,max:6e4,step:1e3,value:H,onChange:function(e){return Q(Number(e)||5e3)},addonAfter:"ms",style:{width:150}}),a().createElement(l.Popconfirm,{title:n("Start rolling restart?"),description:n("Nodes will receive restart commands one-by-one with the configured delay."),onConfirm:function(){return X(function(){var e,t,r,a,o,i,u,s,d,m;return ea(this,function(p){switch(p.label){case 0:Y(!0),p.label=1;case 1:return p.trys.push([1,3,4,5]),[4,c.request({url:"clusterManagerCluster:rollingRestart",method:"POST",data:{role:L,mode:_,delayMs:H}})];case 2:return o=(null==(a=p.sent())||null==(r=a.data)||null==(t=r.data)||null==(e=t.published)?void 0:e.length)||0,l.message.success(n("Rolling restart dispatched for {count} node(s)").replace("{count}",String(o))),setTimeout(er,3e3),[3,5];case 3:return i=p.sent(),l.message.error((null==i||null==(m=i.response)||null==(d=m.data)||null==(s=d.errors)||null==(u=s[0])?void 0:u.message)||n("Failed to dispatch rolling restart")),[3,5];case 4:return Y(!1),[7];case 5:return[2]}})})()},okText:n("Start"),cancelText:n("Cancel")},a().createElement(l.Button,{icon:a().createElement(o.ReloadOutlined,null),loading:$},n("Rolling Restart"))))),a().createElement(l.Card,{title:n("Health Checks"),size:"small"},S&&!S.healthy&&a().createElement(l.Alert,{type:"warning",message:n("Some subsystems are unhealthy"),showIcon:!0,style:{marginBottom:12}}),a().createElement(l.Row,{gutter:[16,8]},Object.entries(ed).map(function(e){var t=et(e,2),n=t[0],r=t[1];return a().createElement(l.Col,{span:4,key:n},a().createElement(l.Card,{size:"small",style:{textAlign:"center"}},a().createElement(l.Tag,{color:eo[r.status]||"default"},r.status),a().createElement("div",{style:{marginTop:4,fontWeight:500}},n),void 0!==r.latency&&a().createElement("div",{style:{fontSize:11,color:"#888"}},r.latency,"ms"),r.detail&&a().createElement("div",{style:{fontSize:11,color:"#888"}},r.detail)))}))),a().createElement(l.Card,{title:n("Cluster Drift"),size:"small",extra:(null==x?void 0:x.checkedAt)?a().createElement(l.Typography.Text,{type:"secondary",style:{fontSize:12}},new Date(x.checkedAt).toLocaleString()):null},a().createElement(l.Space,{direction:"vertical",style:{width:"100%"},size:"middle"},a().createElement(l.Alert,{type:(null==x?void 0:x.healthy)?"success":"warning",showIcon:!0,message:(null==x?void 0:x.healthy)?n("No cluster drift detected"):n("Cluster drift detected"),description:(null==x?void 0:x.referenceVersion)?"".concat(n("Reference version"),": ").concat(x.referenceVersion):n("No reference version available")}),a().createElement(l.Row,{gutter:16},a().createElement(l.Col,{span:6},a().createElement(l.Statistic,{title:n("Checked Nodes"),value:em.nodes||0})),a().createElement(l.Col,{span:6},a().createElement(l.Statistic,{title:n("Version Drift"),value:em.versionDrifts||0})),a().createElement(l.Col,{span:6},a().createElement(l.Statistic,{title:n("Runtime Drift"),value:em.runtimeDrifts||0})),a().createElement(l.Col,{span:6},a().createElement(l.Statistic,{title:n("Package Drift"),value:em.packageDrifts||0}))),(ef.length>0||ey.length>0)&&a().createElement(l.Table,{size:"small",rowKey:function(e){var t;return"".concat(e.id||e.name,":").concat(e.actualVersion||(null==(t=e.actual)?void 0:t.nodeVersion))},pagination:!1,dataSource:en(ef.map(function(e){return ee(Z({},e),{driftType:n("Version")})})).concat(en(ey.map(function(e){var t,r;return ee(Z({},e),{driftType:n("Runtime"),expectedVersion:null==(t=e.expected)?void 0:t.nodeVersion,actualVersion:null==(r=e.actual)?void 0:r.nodeVersion})}))),columns:[{title:n("Type"),dataIndex:"driftType",width:120},{title:n("Name"),dataIndex:"name"},{title:n("Role"),dataIndex:"role",width:120},{title:n("Expected"),dataIndex:"expectedVersion"},{title:n("Actual"),dataIndex:"actualVersion"}]}),ep.length>0&&a().createElement(l.Table,{size:"small",rowKey:function(e){return e.id||e.name},pagination:{pageSize:5},dataSource:ep,columns:[{title:n("Name"),dataIndex:"name"},{title:n("Role"),dataIndex:"role",width:110},{title:n("Package Status"),dataIndex:"status",width:130,render:function(e){return a().createElement(l.Tag,{color:"succeeded"===e?"green":"orange"},e)}},{title:n("Missing Packages"),dataIndex:"missingPackages",render:function(e){var t,r,o;return 0===((null==e||null==(t=e.apt)?void 0:t.length)||0)+((null==e||null==(r=e.npm)?void 0:r.length)||0)+((null==e||null==(o=e.python)?void 0:o.length)||0)?a().createElement(l.Typography.Text,{type:"secondary"},n("No missing packages")):a().createElement(l.Space,{direction:"vertical",size:2},a().createElement("div",null,"APT: ",ei(null==e?void 0:e.apt)),a().createElement("div",null,"NPM: ",ei(null==e?void 0:e.npm)),a().createElement("div",null,"Python: ",ei(null==e?void 0:e.python)))}}]}))),a().createElement(l.Card,{title:n("Legacy Multi-app Diagnostics"),size:"small"},a().createElement(l.Space,{direction:"vertical",style:{width:"100%"}},a().createElement(l.Alert,{type:(null==A?void 0:A.healthy)?"success":"warning",showIcon:!0,message:(null==A?void 0:A.healthy)?n("No legacy multi-app risk detected"):n("Legacy multi-app risk detected")}),eg.map(function(e){return a().createElement(l.Alert,{key:e.code,type:"warning"===e.level?"warning":"info",showIcon:!0,message:eb(e)})}),a().createElement(l.Space,{wrap:!0},((null==A?void 0:A.plugins)||[]).map(function(e){return a().createElement(l.Tag,{key:e.name,color:e.enabled||e.loaded?"orange":"default"},e.name,": ",e.enabled?n("Enabled"):n("Disabled"))}),a().createElement(l.Tag,{color:(null==A||null==(e=A.appSupervisor)?void 0:e.enabled)?"green":"default"},"app-supervisor: ",(null==A||null==(t=A.appSupervisor)?void 0:t.enabled)?n("Enabled"):n("Disabled")),a().createElement(l.Tag,null,n("Legacy app records"),": ",(null==A?void 0:A.legacyApplicationCount)||0)))),a().createElement(l.Card,{title:n("Cluster Nodes"),size:"small"},ev&&a().createElement(l.Alert,{type:eh.configured?"warning":"info",showIcon:!0,style:{marginBottom:12},message:eh.configured?n("Cluster registry has no worker heartbeats"):n("Cluster registry Redis is not configured"),description:eh.configured?n("Cluster Nodes reads Redis heartbeats, not the container runtime. Check worker boot, plugin-cluster-manager, and shared Redis configuration."):n("Set REDIS_URL or CLUSTER_MANAGER_REDIS_URL on every app and worker to enable cluster node discovery.")}),a().createElement(l.Table,{dataSource:g,columns:es,rowKey:"id",size:"small",pagination:!1,scroll:{x:"max-content"}})),p&&a().createElement(l.Card,{title:a().createElement(l.Space,null,n("Current Node Details"),a().createElement(l.Tag,{color:"green"},"APP")),size:"small"},p._fallback&&a().createElement(l.Alert,{type:"warning",message:n("APP node not found in cluster registry. Showing data from the responding worker node."),showIcon:!0,style:{marginBottom:12}}),a().createElement(l.Descriptions,{size:"small",column:3},a().createElement(l.Descriptions.Item,{label:n("Hostname")},p.node.hostname),a().createElement(l.Descriptions.Item,{label:"PID"},p.node.pid),a().createElement(l.Descriptions.Item,{label:"Node.js"},p.node.nodeVersion),a().createElement(l.Descriptions.Item,{label:n("Worker Mode")},p.node.workerMode||"(default)"),a().createElement(l.Descriptions.Item,{label:n("App Port")},p.node.appPort),a().createElement(l.Descriptions.Item,{label:n("Cluster Mode")},p.node.clusterMode||"(disabled)"),a().createElement(l.Descriptions.Item,{label:n("RSS Memory")},R(p.memory.rss)),a().createElement(l.Descriptions.Item,{label:n("OS Memory")},R(p.os.freeMemory)," free / ",R(p.os.totalMemory)),a().createElement(l.Descriptions.Item,{label:n("CPU Cores")},p.os.cpuCount))),a().createElement(el,{open:!!F,node:F,onClose:function(){return B(null)}})))}function eu(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function es(e,t,n,r,a,l,o){try{var i=e[l](o),c=i.value}catch(e){n(e);return}i.done?t(c):Promise.resolve(c).then(r,a)}function ed(e){return function(){var t=this,n=arguments;return new Promise(function(r,a){var l=e.apply(t,n);function o(e){es(l,r,a,o,i,"next",e)}function i(e){es(l,r,a,o,i,"throw",e)}o(void 0)})}}function em(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,a=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var l=[],o=!0,i=!1;try{for(a=a.call(e);!(o=(n=a.next()).done)&&(l.push(n.value),!t||l.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==a.return||a.return()}finally{if(i)throw r}}return l}}(e,t)||ep(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ep(e,t){if(e){if("string"==typeof e)return eu(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return eu(e,t)}}function ef(e,t){var n,r,a,l={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},o=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),i=Object.defineProperty;return i(o,"next",{value:c(0)}),i(o,"throw",{value:c(1)}),i(o,"return",{value:c(2)}),"function"==typeof Symbol&&i(o,Symbol.iterator,{value:function(){return this}}),o;function c(i){return function(c){var u=[i,c];if(n)throw TypeError("Generator is already executing.");for(;o&&(o=0,u[0]&&(l=0)),l;)try{if(n=1,r&&(a=2&u[0]?r.return:u[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,u[1])).done)return a;switch(r=0,a&&(u=[2&u[0],a.value]),u[0]){case 0:case 1:a=u;break;case 4:return l.label++,{value:u[1],done:!1};case 5:l.label++,r=u[1],u=[0];continue;case 7:u=l.ops.pop(),l.trys.pop();continue;default:if(!(a=(a=l.trys).length>0&&a[a.length-1])&&(6===u[0]||2===u[0])){l=0;continue}if(3===u[0]&&(!a||u[1]>a[0]&&u[1]<a[3])){l.label=u[1];break}if(6===u[0]&&l.label<a[1]){l.label=a[1],a=u;break}if(a&&l.label<a[2]){l.label=a[2],l.ops.push(u);break}a[2]&&l.ops.pop(),l.trys.pop();continue}u=t.call(e,l)}catch(e){u=[6,e],r=0}finally{n=a=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}var ey=l.Typography.Text;function eg(){var e,t=(0,i.useApp)().apiClient,n=T(),c=em((0,r.useState)(null),2),u=c[0],s=c[1],d=em((0,r.useState)([]),2),m=d[0],p=d[1],f=em((0,r.useState)(!1),2),y=f[0],g=f[1],h=em((0,r.useState)(null),2),v=h[0],b=h[1],E=(0,r.useCallback)(function(){return ed(function(){var e,n,r,a,o,i,c;return ef(this,function(u){switch(u.label){case 0:g(!0),u.label=1;case 1:return u.trys.push([1,3,4,5]),[4,Promise.all([t.request({url:"clusterManagerAclCache:stats"}),t.request({url:"clusterManagerAclCache:listKeys"})])];case 2:return i=(o=em.apply(void 0,[u.sent(),2]))[0],c=o[1],s((null==i||null==(e=i.data)?void 0:e.data)||(null==i?void 0:i.data)||{}),p(Array.isArray(null==c||null==(r=c.data)||null==(n=r.data)?void 0:n.data)?c.data.data.data:Array.isArray(null==c||null==(a=c.data)?void 0:a.data)?c.data.data:Array.isArray(null==c?void 0:c.data)?c.data:[]),[3,5];case 3:return u.sent(),l.message.error("Failed to load ACL cache data"),[3,5];case 4:return g(!1),[7];case 5:return[2]}})})()},[t]);if((0,r.useEffect)(function(){E()},[]),(0,r.useEffect)(function(){if(v){var e=setInterval(E,1e3*v);return function(){return clearInterval(e)}}},[v,E]),!u)return null;var w=Object.entries(u.detailByRole||{}).map(function(e){var t,n,r=em(e,2),a=r[0],l=r[1];return t=function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){var r;r=n[t],t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r})}return e}({role:a},l),n=n={hitRate:l.checks>0?Math.round(l.hits/l.checks*1e4)/100:0},Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):(function(e){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t.push.apply(t,n)}return t})(Object(n)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))}),t}),S=[{title:n("Role"),dataIndex:"role",width:120,filters:((function(e){if(Array.isArray(e))return eu(e)})(e=new Set(m.map(function(e){return e.role})))||function(e){if("u">typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||ep(e)||function(){throw TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()).map(function(e){return{text:e,value:e}}),onFilter:function(e,t){return t.role===e}},{title:n("Resource"),dataIndex:"resource",width:200},{title:n("Action"),dataIndex:"action",width:120},{title:n("Cache Key"),dataIndex:"key",ellipsis:!0,render:function(e){return a().createElement(ey,{code:!0,style:{fontSize:11}},e)}}],k=[{title:n("Role"),dataIndex:"role",width:150},{title:n("Checks"),dataIndex:"checks",width:100,sorter:function(e,t){return e.checks-t.checks}},{title:n("Hits"),dataIndex:"hits",width:100,render:function(e){return a().createElement(ey,{type:"success"},e)}},{title:n("Misses"),dataIndex:"misses",width:100,render:function(e){return a().createElement(ey,{type:"danger"},e)}},{title:n("Hit Rate"),dataIndex:"hitRate",width:100,render:function(e){return a().createElement(l.Tag,{color:e>80?"green":e>50?"orange":"red"},e,"%")},sorter:function(e,t){return e.hitRate-t.hitRate}},{title:n("Actions"),width:80,render:function(e,r){return a().createElement(l.Popconfirm,{title:"".concat(n("Clear cache for role"),' "').concat(r.role,'"?'),onConfirm:function(){var e;return e=r.role,ed(function(){var n,r;return ef(this,function(a){switch(a.label){case 0:return a.trys.push([0,2,,3]),[4,t.request({url:"clusterManagerAclCache:clearRole",method:"post",data:{roleName:e}})];case 1:return r=a.sent(),l.message.success("Cleared ".concat((null==(n=r.data)?void 0:n.deletedCount)||0,' entries for role "').concat(e,'"')),E(),[3,3];case 2:return a.sent(),l.message.error("Failed to clear role cache"),[3,3];case 3:return[2]}})})()}},a().createElement(l.Button,{type:"link",size:"small",icon:a().createElement(o.DeleteOutlined,null),danger:!0}))}}];return a().createElement("div",null,a().createElement(l.Space,{style:{marginBottom:16}},a().createElement(l.Button,{icon:a().createElement(o.ReloadOutlined,null),onClick:E,loading:y},n("Refresh")),a().createElement(l.Select,{placeholder:n("Auto refresh"),allowClear:!0,style:{width:160},value:v,onChange:b,options:[{value:5,label:n("Every 5s")},{value:10,label:n("Every 10s")},{value:30,label:n("Every 30s")}]}),a().createElement(l.Popconfirm,{title:n("Clear all ACL cache entries?"),onConfirm:function(){return ed(function(){var e,n;return ef(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,t.request({url:"clusterManagerAclCache:clear",method:"post"})];case 1:return n=r.sent(),l.message.success("Cleared ".concat((null==(e=n.data)?void 0:e.deletedCount)||0," cache entries")),E(),[3,3];case 2:return r.sent(),l.message.error("Failed to clear cache"),[3,3];case 3:return[2]}})})()}},a().createElement(l.Button,{icon:a().createElement(o.DeleteOutlined,null),danger:!0},n("Clear All Cache"))),a().createElement(l.Popconfirm,{title:n("Reset ACL stats counters?"),onConfirm:function(){return ed(function(){return ef(this,function(e){switch(e.label){case 0:return e.trys.push([0,2,,3]),[4,t.request({url:"clusterManagerAclCache:resetStats",method:"post"})];case 1:return e.sent(),l.message.success("Stats reset"),E(),[3,3];case 2:return e.sent(),l.message.error("Failed to reset stats"),[3,3];case 3:return[2]}})})()}},a().createElement(l.Button,null,n("Reset Stats"))),a().createElement(l.Tag,null,"TTL: ",u.ttlSeconds,"s"),a().createElement(l.Tag,null,n("Since"),": ",new Date(u.startedAt).toLocaleString())),a().createElement(l.Row,{gutter:[16,16]},a().createElement(l.Col,{span:6},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:n("Total ACL Checks"),value:u.totalChecks,prefix:a().createElement(o.SafetyCertificateOutlined,null)}))),a().createElement(l.Col,{span:6},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:n("Cache Hits"),value:u.cacheHits,prefix:a().createElement(o.CheckCircleOutlined,null),valueStyle:{color:"#3f8600"}}))),a().createElement(l.Col,{span:6},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:n("Cache Misses"),value:u.cacheMisses,prefix:a().createElement(o.CloseCircleOutlined,null),valueStyle:{color:"#cf1322"}}))),a().createElement(l.Col,{span:6},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:n("Hit Rate"),value:u.hitRate,suffix:"%",prefix:a().createElement(o.ThunderboltOutlined,null),valueStyle:{color:u.hitRate>80?"#3f8600":u.hitRate>50?"#faad14":"#cf1322"}}),a().createElement(ey,{type:"secondary"},n("Cached keys"),": ",u.cachedKeys)))),a().createElement(l.Row,{gutter:[16,16],style:{marginTop:16}},a().createElement(l.Col,{span:12},a().createElement(l.Card,{title:n("Stats by Role"),size:"small"},0===w.length?a().createElement(ey,{type:"secondary"},n("No ACL checks recorded yet")):a().createElement(l.Table,{rowKey:"role",size:"small",pagination:!1,dataSource:w,columns:k,scroll:{x:"max-content"}}))),a().createElement(l.Col,{span:12},a().createElement(l.Card,{title:"".concat(n("Cached Permission Keys")," (").concat(m.length,")"),size:"small"},0===m.length?a().createElement(ey,{type:"secondary"},n("No cached keys")):a().createElement(l.Table,{rowKey:"key",size:"small",pagination:{pageSize:10,size:"small"},dataSource:m,columns:S})))))}function eh(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function ev(e,t,n,r,a,l,o){try{var i=e[l](o),c=i.value}catch(e){n(e);return}i.done?t(c):Promise.resolve(c).then(r,a)}function eb(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,a=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var l=[],o=!0,i=!1;try{for(a=a.call(e);!(o=(n=a.next()).done)&&(l.push(n.value),!t||l.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==a.return||a.return()}finally{if(i)throw r}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return eh(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return eh(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var eE=l.Typography.Text;function ew(){var e=(0,i.useApp)().apiClient,t=eb((0,r.useState)(null),2),n=t[0],c=t[1],u=eb((0,r.useState)({}),2),s=u[0],d=u[1],m=eb((0,r.useState)(0),2),p=m[0],f=m[1],y=eb((0,r.useState)([]),2),g=y[0],h=y[1],v=eb((0,r.useState)([]),2),b=v[0],E=v[1],w=eb((0,r.useState)(!1),2),S=w[0],k=w[1],C=eb((0,r.useState)(null),2),x=C[0],O=C[1],I=eb((0,r.useState)(null),2),A=I[0],P=I[1],T=(0,r.useCallback)(function(){var t;return(t=function(){var t,n,r,a,l,o,i,u,s,m,p,y,g,v,b,w,S,C,x;return function(e,t){var n,r,a,l={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},o=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),i=Object.defineProperty;return i(o,"next",{value:c(0)}),i(o,"throw",{value:c(1)}),i(o,"return",{value:c(2)}),"function"==typeof Symbol&&i(o,Symbol.iterator,{value:function(){return this}}),o;function c(i){return function(c){var u=[i,c];if(n)throw TypeError("Generator is already executing.");for(;o&&(o=0,u[0]&&(l=0)),l;)try{if(n=1,r&&(a=2&u[0]?r.return:u[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,u[1])).done)return a;switch(r=0,a&&(u=[2&u[0],a.value]),u[0]){case 0:case 1:a=u;break;case 4:return l.label++,{value:u[1],done:!1};case 5:l.label++,r=u[1],u=[0];continue;case 7:u=l.ops.pop(),l.trys.pop();continue;default:if(!(a=(a=l.trys).length>0&&a[a.length-1])&&(6===u[0]||2===u[0])){l=0;continue}if(3===u[0]&&(!a||u[1]>a[0]&&u[1]<a[3])){l.label=u[1];break}if(6===u[0]&&l.label<a[1]){l.label=a[1],a=u;break}if(a&&l.label<a[2]){l.label=a[2],l.ops.push(u);break}a[2]&&l.ops.pop(),l.trys.pop();continue}u=t.call(e,l)}catch(e){u=[6,e],r=0}finally{n=a=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}(this,function(O){switch(O.label){case 0:k(!0),P(null),O.label=1;case 1:return O.trys.push([1,3,4,5]),[4,Promise.all([e.request({url:"clusterManagerRedis:info"}),e.request({url:"clusterManagerRedis:pubsub"}),e.request({url:"clusterManagerRedis:clients"}),e.request({url:"clusterManagerRedis:slowlog",params:{count:10}})])];case 2:return m=(s=eb.apply(void 0,[O.sent(),4]))[0],p=s[1],y=s[2],g=s[3],c((null==m||null==(t=m.data)?void 0:t.data)||(null==m?void 0:m.data)||{}),d((v=(null==p||null==(n=p.data)?void 0:n.data)||(null==p?void 0:p.data)||{}).channels||{}),f(v.total_channels||0),h(Array.isArray(null==y||null==(a=y.data)||null==(r=a.data)?void 0:r.data)?y.data.data.data:Array.isArray(null==y||null==(l=y.data)?void 0:l.data)?y.data.data:Array.isArray(null==y?void 0:y.data)?y.data:[]),E(Array.isArray(null==g||null==(i=g.data)||null==(o=i.data)?void 0:o.data)?g.data.data.data:Array.isArray(null==g||null==(u=g.data)?void 0:u.data)?g.data.data:Array.isArray(null==g?void 0:g.data)?g.data:[]),[3,5];case 3:return P((null==(b=O.sent())||null==(x=b.response)||null==(C=x.data)||null==(S=C.errors)||null==(w=S[0])?void 0:w.message)||"Failed to connect to Redis"),[3,5];case 4:return k(!1),[7];case 5:return[2]}})},function(){var e=this,n=arguments;return new Promise(function(r,a){var l=t.apply(e,n);function o(e){ev(l,r,a,o,i,"next",e)}function i(e){ev(l,r,a,o,i,"throw",e)}o(void 0)})})()},[e]);if((0,r.useEffect)(function(){T()},[]),(0,r.useEffect)(function(){if(x){var e=setInterval(T,1e3*x);return function(){return clearInterval(e)}}},[x,T]),A)return a().createElement(l.Card,null,a().createElement(eE,{type:"danger"},A),a().createElement("br",null),a().createElement(l.Button,{style:{marginTop:8},onClick:T},"Retry"));if(!n)return null;var R="unlimited"!==n.memory.max_memory&&n.memory.peak_bytes>0?Math.round(n.memory.used_bytes/n.memory.peak_bytes*100):null;return a().createElement("div",null,a().createElement(l.Space,{style:{marginBottom:16}},a().createElement(l.Button,{icon:a().createElement(o.ReloadOutlined,null),onClick:T,loading:S},"Refresh"),a().createElement(l.Select,{placeholder:"Auto refresh",allowClear:!0,style:{width:160},value:x,onChange:O,options:[{value:5,label:"Every 5s"},{value:10,label:"Every 10s"},{value:30,label:"Every 30s"}]}),a().createElement(l.Tag,{color:"blue"},"Redis ",n.server.version),a().createElement(l.Tag,null,"Uptime: ",j(n.server.uptime_seconds))),a().createElement(l.Row,{gutter:[16,16]},a().createElement(l.Col,{span:6},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:"Memory Used",value:n.memory.used,prefix:a().createElement(o.DatabaseOutlined,null),suffix:null!==R?"(".concat(R,"%)"):void 0}),a().createElement(eE,{type:"secondary"},"Peak: ",n.memory.peak),a().createElement("br",null),a().createElement(eE,{type:"secondary"},"Max: ",n.memory.max_memory),a().createElement("br",null),a().createElement(eE,{type:"secondary"},"Policy: ",n.memory.max_memory_policy))),a().createElement(l.Col,{span:6},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:"Ops/sec",value:n.stats.ops_per_sec,prefix:a().createElement(o.ThunderboltOutlined,null)}),a().createElement(eE,{type:"secondary"},"Total commands: ",n.stats.total_commands.toLocaleString()))),a().createElement(l.Col,{span:6},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:"Connected Clients",value:n.clients.connected,prefix:a().createElement(o.CloudServerOutlined,null)}),a().createElement(eE,{type:"secondary"},"Blocked: ",n.clients.blocked))),a().createElement(l.Col,{span:6},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:"Cache Hit Rate",value:n.stats.hit_rate,suffix:"%",prefix:a().createElement(o.FieldTimeOutlined,null),valueStyle:{color:n.stats.hit_rate>90?"#3f8600":n.stats.hit_rate>50?"#faad14":"#cf1322"}}),a().createElement(eE,{type:"secondary"},"Hits: ",n.stats.keyspace_hits.toLocaleString()," / Misses:"," ",n.stats.keyspace_misses.toLocaleString()),a().createElement("br",null),a().createElement(eE,{type:"secondary"},"Expired: ",n.stats.expired_keys.toLocaleString()," / Evicted:"," ",n.stats.evicted_keys.toLocaleString())))),a().createElement(l.Row,{gutter:[16,16],style:{marginTop:16}},a().createElement(l.Col,{span:12},a().createElement(l.Card,{title:"Keyspace",size:"small"},0===Object.keys(n.keyspace).length?a().createElement(eE,{type:"secondary"},"No databases in use"):a().createElement(l.Table,{rowKey:function(e,t){return String(t)},size:"small",pagination:!1,dataSource:Object.entries(n.keyspace).map(function(e){var t=eb(e,2),n=t[0],r=t[1];return{db:n,keys:r.keys,expires:r.expires,avg_ttl:r.avg_ttl}}),columns:[{title:"Database",dataIndex:"db",width:80},{title:"Keys",dataIndex:"keys",width:80},{title:"Expires",dataIndex:"expires",width:80},{title:"Avg TTL",dataIndex:"avg_ttl",render:function(e){return e?"".concat((Number(e)/1e3).toFixed(1),"s"):"-"}}]}))),a().createElement(l.Col,{span:12},a().createElement(l.Card,{title:"Pub/Sub Channels (".concat(p,")"),size:"small"},0===p?a().createElement(eE,{type:"secondary"},"No active channels"):a().createElement(l.Table,{rowKey:function(e,t){return String(t)},size:"small",pagination:!1,dataSource:Object.entries(s).map(function(e){var t=eb(e,2);return{name:t[0],subs:t[1]}}),columns:[{title:"Channel",dataIndex:"name",ellipsis:!0},{title:"Subscribers",dataIndex:"subs",width:100}]})))),a().createElement(l.Row,{gutter:[16,16],style:{marginTop:16}},a().createElement(l.Col,{span:12},a().createElement(l.Card,{title:"Slow Log (recent)",size:"small"},0===b.length?a().createElement(eE,{type:"secondary"},"No slow queries"):a().createElement(l.Table,{rowKey:"id",size:"small",pagination:!1,dataSource:b,columns:[{title:"ID",dataIndex:"id",width:60},{title:"Duration",dataIndex:"duration_us",width:100,render:function(e){return"".concat((e/1e3).toFixed(1),"ms")}},{title:"Command",dataIndex:"command",ellipsis:!0}]}))),a().createElement(l.Col,{span:12},a().createElement(l.Card,{title:"Connected Clients (".concat(g.length,")"),size:"small"},a().createElement(l.Table,{rowKey:function(e,t){return String(t)},size:"small",pagination:{pageSize:5,size:"small"},dataSource:g,columns:[{title:"Addr",dataIndex:"addr",width:140},{title:"Age",dataIndex:"age",width:60,render:function(e){return"".concat(e,"s")}},{title:"Idle",dataIndex:"idle",width:60,render:function(e){return"".concat(e,"s")}},{title:"DB",dataIndex:"db",width:40},{title:"Cmd",dataIndex:"cmd",width:80},{title:"Flags",dataIndex:"flags",width:60,render:function(e){return a().createElement(l.Tag,null,e)}}]})))),a().createElement(l.Row,{gutter:16,style:{marginTop:16}},a().createElement(l.Col,{span:24},a().createElement(eS,null))))}function eS(){var e=(0,i.useApp)().apiClient,t=eb((0,r.useState)(null),2),n=t[0],o=t[1];return((0,r.useEffect)(function(){e.request({url:"clusterManagerRedis:syncMessages"}).then(function(e){var t;return o(null==e||null==(t=e.data)?void 0:t.data)}).catch(function(){})},[e]),n)?a().createElement(l.Card,{title:"Sync Messages (PubSub ".concat(n.pubSubConnected?"Connected":"Disconnected",")"),size:"small"},a().createElement(l.Table,{rowKey:"channel",size:"small",pagination:!1,dataSource:n.channels||[],columns:[{title:"Channel",dataIndex:"channel",key:"channel"}]})):null}function ek(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function eC(e,t,n,r,a,l,o){try{var i=e[l](o),c=i.value}catch(e){n(e);return}i.done?t(c):Promise.resolve(c).then(r,a)}function ex(e){return function(){var t=this,n=arguments;return new Promise(function(r,a){var l=e.apply(t,n);function o(e){eC(l,r,a,o,i,"next",e)}function i(e){eC(l,r,a,o,i,"throw",e)}o(void 0)})}}function eO(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,a=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var l=[],o=!0,i=!1;try{for(a=a.call(e);!(o=(n=a.next()).done)&&(l.push(n.value),!t||l.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==a.return||a.return()}finally{if(i)throw r}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return ek(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return ek(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function eI(e,t){var n,r,a,l={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},o=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),i=Object.defineProperty;return i(o,"next",{value:c(0)}),i(o,"throw",{value:c(1)}),i(o,"return",{value:c(2)}),"function"==typeof Symbol&&i(o,Symbol.iterator,{value:function(){return this}}),o;function c(i){return function(c){var u=[i,c];if(n)throw TypeError("Generator is already executing.");for(;o&&(o=0,u[0]&&(l=0)),l;)try{if(n=1,r&&(a=2&u[0]?r.return:u[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,u[1])).done)return a;switch(r=0,a&&(u=[2&u[0],a.value]),u[0]){case 0:case 1:a=u;break;case 4:return l.label++,{value:u[1],done:!1};case 5:l.label++,r=u[1],u=[0];continue;case 7:u=l.ops.pop(),l.trys.pop();continue;default:if(!(a=(a=l.trys).length>0&&a[a.length-1])&&(6===u[0]||2===u[0])){l=0;continue}if(3===u[0]&&(!a||u[1]>a[0]&&u[1]<a[3])){l.label=u[1];break}if(6===u[0]&&l.label<a[1]){l.label=a[1],a=u;break}if(a&&l.label<a[2]){l.label=a[2],l.ops.push(u);break}a[2]&&l.ops.pop(),l.trys.pop();continue}u=t.call(e,l)}catch(e){u=[6,e],r=0}finally{n=a=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}function eA(){var e,t=T(),n=(0,i.useApp)().apiClient,c=eO((0,r.useState)(!1),2),u=c[0],s=c[1],d=eO((0,r.useState)(null),2),m=d[0],p=d[1],f=eO((0,r.useState)([]),2),y=f[0],g=f[1],h=eO((0,r.useState)(null),2),v=h[0],b=h[1],E=(0,r.useCallback)(function(){return ex(function(){var e,t,r,a,l,o;return eI(this,function(i){switch(i.label){case 0:s(!0),i.label=1;case 1:return i.trys.push([1,3,4,5]),[4,Promise.all([n.request({url:"clusterManagerLock:info"}),n.request({url:"clusterManagerLock:list"})])];case 2:return l=(a=eO.apply(void 0,[i.sent(),2]))[0],o=a[1],p(null==l||null==(e=l.data)?void 0:e.data),g((null==o||null==(r=o.data)||null==(t=r.data)?void 0:t.data)||[]),[3,5];case 3:return i.sent(),[3,5];case 4:return s(!1),[7];case 5:return[2]}})})()},[n]);(0,r.useEffect)(function(){E()},[E]),(0,r.useEffect)(function(){if(v){var e=setInterval(E,1e3*v);return function(){return clearInterval(e)}}},[v,E]);var w=[{title:t("Lock Key"),dataIndex:"key",key:"key",render:function(e){return a().createElement("code",{style:{fontSize:12}},e)}},{title:t("Adapter"),dataIndex:"adapter",key:"adapter",width:100,render:function(e){return a().createElement(l.Tag,null,e)}},{title:t("TTL"),dataIndex:"ttl",key:"ttl",width:120,render:function(e){return e?"".concat(e,"ms"):"-"}},{title:t("Actions"),key:"actions",width:120,render:function(e,r){return a().createElement(l.Popconfirm,{title:t("Force release this lock?"),description:t("This may cause data inconsistency. Use with caution."),onConfirm:function(){var e;return e=r.key,ex(function(){return eI(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,n.request({url:"clusterManagerLock:release",method:"post",data:{key:e}})];case 1:return r.sent(),l.message.success(t("Lock released")),E(),[3,3];case 2:return r.sent(),l.message.error(t("Failed to release lock")),[3,3];case 3:return[2]}})})()},okText:t("Release"),cancelText:t("Cancel")},a().createElement(l.Button,{size:"small",danger:!0,icon:a().createElement(o.UnlockOutlined,null)},t("Release")))}}];return a().createElement(l.Spin,{spinning:u},a().createElement(l.Space,{direction:"vertical",style:{width:"100%"},size:"middle"},a().createElement(l.Space,null,a().createElement(l.Button,{icon:a().createElement(o.ReloadOutlined,null),onClick:E},t("Refresh")),a().createElement(l.Select,{placeholder:t("Auto Refresh"),allowClear:!0,value:v,onChange:b,style:{width:140},options:[{value:5,label:"5s"},{value:10,label:"10s"},{value:30,label:"30s"}]})),a().createElement(l.Row,{gutter:16},a().createElement(l.Col,{span:8},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:t("Adapter Type"),value:(null==m?void 0:m.adapter)||"-",prefix:a().createElement(o.LockOutlined,null),valueStyle:{fontSize:16}}))),a().createElement(l.Col,{span:8},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:t("Active Locks"),value:null!=(e=null==m?void 0:m.activeLocks)?e:0,prefix:a().createElement(o.LockOutlined,null),valueStyle:{color:((null==m?void 0:m.activeLocks)||0)>0?"#cf1322":"#3f8600"}}))),a().createElement(l.Col,{span:8},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:t("Total Listed"),value:y.length})))),a().createElement(l.Card,{title:t("Active Locks"),size:"small"},0===y.length?a().createElement("div",{style:{textAlign:"center",padding:24,color:"#999"}},t("No active locks")):a().createElement(l.Table,{dataSource:y,columns:w,rowKey:"key",size:"small",pagination:{pageSize:20}}))))}function eP(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function eT(e,t,n,r,a,l,o){try{var i=e[l](o),c=i.value}catch(e){n(e);return}i.done?t(c):Promise.resolve(c).then(r,a)}function eR(e){return function(){var t=this,n=arguments;return new Promise(function(r,a){var l=e.apply(t,n);function o(e){eT(l,r,a,o,i,"next",e)}function i(e){eT(l,r,a,o,i,"throw",e)}o(void 0)})}}function ej(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,a=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var l=[],o=!0,i=!1;try{for(a=a.call(e);!(o=(n=a.next()).done)&&(l.push(n.value),!t||l.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==a.return||a.return()}finally{if(i)throw r}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return eP(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return eP(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ez(e,t){var n,r,a,l={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},o=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),i=Object.defineProperty;return i(o,"next",{value:c(0)}),i(o,"throw",{value:c(1)}),i(o,"return",{value:c(2)}),"function"==typeof Symbol&&i(o,Symbol.iterator,{value:function(){return this}}),o;function c(i){return function(c){var u=[i,c];if(n)throw TypeError("Generator is already executing.");for(;o&&(o=0,u[0]&&(l=0)),l;)try{if(n=1,r&&(a=2&u[0]?r.return:u[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,u[1])).done)return a;switch(r=0,a&&(u=[2&u[0],a.value]),u[0]){case 0:case 1:a=u;break;case 4:return l.label++,{value:u[1],done:!1};case 5:l.label++,r=u[1],u=[0];continue;case 7:u=l.ops.pop(),l.trys.pop();continue;default:if(!(a=(a=l.trys).length>0&&a[a.length-1])&&(6===u[0]||2===u[0])){l=0;continue}if(3===u[0]&&(!a||u[1]>a[0]&&u[1]<a[3])){l.label=u[1];break}if(6===u[0]&&l.label<a[1]){l.label=a[1],a=u;break}if(a&&l.label<a[2]){l.label=a[2],l.ops.push(u);break}a[2]&&l.ops.pop(),l.trys.pop();continue}u=t.call(e,l)}catch(e){u=[6,e],r=0}finally{n=a=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}function eM(){var e,t,n,c=T(),u=(0,i.useApp)().apiClient,s=ej((0,r.useState)(!1),2),d=s[0],m=s[1],p=ej((0,r.useState)(null),2),f=p[0],y=p[1],g=ej((0,r.useState)(null),2),h=g[0],v=g[1],b=ej((0,r.useState)(null),2),E=b[0],w=b[1],S=ej((0,r.useState)(null),2),k=S[0],C=S[1],x=ej((0,r.useState)([]),2),O=x[0],I=x[1],A=ej((0,r.useState)({}),2),P=A[0],R=A[1],j=ej((0,r.useState)([]),2),z=j[0],M=j[1],D=ej((0,r.useState)({}),2),N=D[0],F=D[1],B=(0,r.useCallback)(function(){return eR(function(){var e,t;return ez(this,function(n){switch(n.label){case 0:m(!0),n.label=1;case 1:return n.trys.push([1,3,4,5]),[4,u.request({url:"clusterManagerQueue:stats"})];case 2:return y(null==(t=n.sent())||null==(e=t.data)?void 0:e.data),[3,5];case 3:return n.sent(),[3,5];case 4:return m(!1),[7];case 5:return[2]}})})()},[u]),q=(0,r.useCallback)(function(e){return eR(function(){var t,n,r,a,l;return ez(this,function(o){switch(o.label){case 0:return o.trys.push([0,2,,3]),[4,u.request({url:"clusterManagerQueue:messages",params:{channel:e}})];case 1:return I((null==(l=o.sent())||null==(n=l.data)||null==(t=n.data)?void 0:t.data)||[]),R((null==l||null==(a=l.data)||null==(r=a.data)?void 0:r.meta)||{}),[3,3];case 2:return o.sent(),[3,3];case 3:return[2]}})})()},[u]),L=(0,r.useCallback)(function(e){return eR(function(){var t,n,r,a,l;return ez(this,function(o){switch(o.label){case 0:if(!(null==e?void 0:e.key))return[2];o.label=1;case 1:return o.trys.push([1,3,,4]),[4,u.request({url:"clusterManagerQueue:messages",params:{source:"redis",key:e.key}})];case 2:return M((null==(l=o.sent())||null==(n=l.data)||null==(t=n.data)?void 0:t.data)||[]),F((null==l||null==(a=l.data)||null==(r=a.data)?void 0:r.meta)||{}),[3,4];case 3:return o.sent(),[3,4];case 4:return[2]}})})()},[u]);(0,r.useEffect)(function(){B()},[B]),(0,r.useEffect)(function(){if(h){var e=setInterval(B,1e3*h);return function(){return clearInterval(e)}}},[h,B]);var U=[{title:c("Channel"),dataIndex:"channel",key:"channel"},{title:c("Pending"),dataIndex:"pending",key:"pending",width:100,render:function(e){return null===e?a().createElement(l.Tag,null,"N/A"):a().createElement(l.Tag,{color:e>0?"orange":"green"},e)}},{title:c("Concurrency"),dataIndex:"concurrency",key:"concurrency",width:120},{title:c("Interval"),dataIndex:"interval",key:"interval",width:100,render:function(e){return"".concat(e,"ms")}},{title:c("Actions"),key:"actions",width:100,render:function(e,t){return a().createElement(l.Button,{size:"small",type:"link",onClick:function(){w(t.channel),q(t.channel)}},c("Messages"))}}],K=[{title:"ID",dataIndex:"id",key:"id",width:280,ellipsis:!0},{title:c("Content"),dataIndex:"content",key:"content",ellipsis:!0,render:function(e){return a().createElement("code",{style:{fontSize:11}},JSON.stringify(e))}},{title:c("Retried"),dataIndex:"retried",key:"retried",width:80},{title:c("Timestamp"),dataIndex:"timestamp",key:"timestamp",width:180,render:function(e){return e?new Date(e).toLocaleString():"-"}}],_=[{title:c("Queue"),dataIndex:"channel",key:"channel",width:240},{title:c("Redis Key"),dataIndex:"key",key:"key",ellipsis:!0},{title:c("App"),dataIndex:"appName",key:"appName",width:120},{title:c("Pending"),dataIndex:"pending",key:"pending",width:100,render:function(e){return a().createElement(l.Tag,{color:e>0?"orange":"green"},e)}},{title:c("Actions"),key:"actions",width:100,render:function(e,t){return a().createElement(l.Button,{size:"small",type:"link",onClick:function(){C(t),L(t)}},c("Items"))}}],W=[{title:"#",dataIndex:"index",key:"index",width:80},{title:c("Content"),dataIndex:"content",key:"content",ellipsis:!0,render:function(e){return a().createElement("code",{style:{fontSize:11}},JSON.stringify(e))}},{title:c("Queued At"),dataIndex:"timestamp",key:"timestamp",width:180,render:function(e){return e?new Date(e).toLocaleString():"-"}}];return a().createElement(l.Spin,{spinning:d},a().createElement(l.Space,{direction:"vertical",style:{width:"100%"},size:"middle"},a().createElement(l.Space,null,a().createElement(l.Button,{icon:a().createElement(o.ReloadOutlined,null),onClick:B},c("Refresh")),a().createElement(l.Select,{placeholder:c("Auto Refresh"),allowClear:!0,value:h,onChange:v,style:{width:140},options:[{value:5,label:"5s"},{value:10,label:"10s"},{value:30,label:"30s"}]}),f&&a().createElement(l.Tag,{color:f.connected?"green":"red"},f.adapter)),f&&a().createElement(l.Row,{gutter:16},a().createElement(l.Col,{span:6},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:c("Adapter"),value:f.adapter,prefix:a().createElement(o.ApiOutlined,null),valueStyle:{fontSize:16}}))),a().createElement(l.Col,{span:6},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:c("Total Channels"),value:f.totalChannels,prefix:a().createElement(o.UnorderedListOutlined,null)}))),a().createElement(l.Col,{span:6},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:c("Total Pending"),value:f.totalPending,prefix:a().createElement(o.ClockCircleOutlined,null),valueStyle:{color:f.totalPending>0?"#cf1322":"#3f8600"}}))),a().createElement(l.Col,{span:6},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:c("Connected"),value:f.connected?"Yes":"No",prefix:a().createElement(o.ThunderboltOutlined,null),valueStyle:{color:f.connected?"#3f8600":"#cf1322"}})))),(null==f?void 0:f.redisQueues)&&a().createElement(l.Row,{gutter:16},a().createElement(l.Col,{span:8},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:c("Redis Queue Pending"),value:f.redisQueues.totalPending||0,prefix:a().createElement(o.DatabaseOutlined,null),valueStyle:{color:(f.redisQueues.totalPending||0)>0?"#cf1322":"#3f8600"}}))),a().createElement(l.Col,{span:8},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:c("Redis Queues"),value:(null==(e=f.redisQueues.queues)?void 0:e.length)||0,prefix:a().createElement(o.UnorderedListOutlined,null)}))),a().createElement(l.Col,{span:8},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:c("Redis Connected"),value:f.redisQueues.connected?"Yes":"No",prefix:a().createElement(o.ThunderboltOutlined,null),valueStyle:{color:f.redisQueues.connected?"#3f8600":"#cf1322"}})))),a().createElement(l.Card,{title:c("Event Channels"),size:"small"},a().createElement(l.Table,{dataSource:(null==f?void 0:f.channels)||[],columns:U,rowKey:"channel",size:"small",pagination:!1})),a().createElement(l.Card,{title:c("Redis Queues"),size:"small"},(null==f||null==(t=f.redisQueues)?void 0:t.note)&&a().createElement(l.Tag,{style:{marginBottom:8}},f.redisQueues.note),a().createElement(l.Table,{dataSource:(null==f||null==(n=f.redisQueues)?void 0:n.queues)||[],columns:_,rowKey:"key",size:"small",pagination:!1})),E&&a().createElement(l.Card,{title:"".concat(c("Messages"),": ").concat(E),size:"small",extra:a().createElement(l.Button,{size:"small",onClick:function(){return w(null)}},"Close")},P.note&&a().createElement(l.Tag,{style:{marginBottom:8}},P.note),a().createElement(l.Table,{dataSource:O,columns:K,rowKey:"id",size:"small",pagination:{pageSize:10,total:P.count}})),k&&a().createElement(l.Card,{title:"".concat(c("Redis Queue Items"),": ").concat(k.channel),size:"small",extra:a().createElement(l.Space,null,a().createElement(l.Button,{size:"small",onClick:function(){return L(k)}},c("Refresh")),a().createElement(l.Button,{size:"small",onClick:function(){return C(null)}},c("Close")))},a().createElement(l.Tag,{style:{marginBottom:8}},k.key),N.note&&a().createElement(l.Tag,{style:{marginBottom:8}},N.note),a().createElement(l.Table,{dataSource:z,columns:W,rowKey:"id",size:"small",pagination:{pageSize:10,total:N.count}}))))}function eD(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function eN(e,t,n,r,a,l,o){try{var i=e[l](o),c=i.value}catch(e){n(e);return}i.done?t(c):Promise.resolve(c).then(r,a)}function eF(e){return function(){var t=this,n=arguments;return new Promise(function(r,a){var l=e.apply(t,n);function o(e){eN(l,r,a,o,i,"next",e)}function i(e){eN(l,r,a,o,i,"throw",e)}o(void 0)})}}function eB(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,a=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var l=[],o=!0,i=!1;try{for(a=a.call(e);!(o=(n=a.next()).done)&&(l.push(n.value),!t||l.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==a.return||a.return()}finally{if(i)throw r}}return l}}(e,t)||eq(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function eq(e,t){if(e){if("string"==typeof e)return eD(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return eD(e,t)}}function eL(e,t){var n,r,a,l={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},o=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),i=Object.defineProperty;return i(o,"next",{value:c(0)}),i(o,"throw",{value:c(1)}),i(o,"return",{value:c(2)}),"function"==typeof Symbol&&i(o,Symbol.iterator,{value:function(){return this}}),o;function c(i){return function(c){var u=[i,c];if(n)throw TypeError("Generator is already executing.");for(;o&&(o=0,u[0]&&(l=0)),l;)try{if(n=1,r&&(a=2&u[0]?r.return:u[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,u[1])).done)return a;switch(r=0,a&&(u=[2&u[0],a.value]),u[0]){case 0:case 1:a=u;break;case 4:return l.label++,{value:u[1],done:!1};case 5:l.label++,r=u[1],u=[0];continue;case 7:u=l.ops.pop(),l.trys.pop();continue;default:if(!(a=(a=l.trys).length>0&&a[a.length-1])&&(6===u[0]||2===u[0])){l=0;continue}if(3===u[0]&&(!a||u[1]>a[0]&&u[1]<a[3])){l.label=u[1];break}if(6===u[0]&&l.label<a[1]){l.label=a[1],a=u;break}if(a&&l.label<a[2]){l.label=a[2],l.ops.push(u);break}a[2]&&l.ops.pop(),l.trys.pop();continue}u=t.call(e,l)}catch(e){u=[6,e],r=0}finally{n=a=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}var eU=l.Input.TextArea,eK=l.Typography.Title,e_=l.Typography.Text;function eW(){var e,t=T(),n=(0,i.useApp)().apiClient,c=eB((0,r.useState)(!1),2),u=c[0],s=c[1],d=eB((0,r.useState)(!1),2),m=d[0],p=d[1],f=eB((0,r.useState)(null),2),y=f[0],g=f[1],h=eB((0,r.useState)("directory"),2),v=h[0],b=h[1],E=eB((0,r.useState)("custom"),2),w=E[0],S=E[1],k=eB((0,r.useState)(""),2),C=k[0],x=k[1],O=eB((0,r.useState)(""),2),I=O[0],A=O[1],P=eB((0,r.useState)("PURGE"),2),R=P[0],j=P[1],z=eB((0,r.useState)('{\n "X-Purge": "1"\n}'),2),M=z[0],D=z[1],N=eB((0,r.useState)(""),2),F=N[0],B=N[1],q=a().useCallback(function(){return eF(function(){var e,r;return eL(this,function(a){switch(a.label){case 0:s(!0),a.label=1;case 1:return a.trys.push([1,3,4,5]),[4,n.request({url:"clusterManagerCacheMgr:nginxCacheStatus"})];case 2:return g(null==(r=a.sent())||null==(e=r.data)?void 0:e.data),[3,5];case 3:return a.sent(),l.message.error(t("Failed to load Nginx status")),[3,5];case 4:return s(!1),[7];case 5:return[2]}})})()},[n,t]);(0,r.useEffect)(function(){q()},[q]),(0,r.useEffect)(function(){var e;(null==y||null==(e=y.detectedPaths)?void 0:e.length)>0?S(y.detectedPaths[0]):S("custom")},[y]);var L=(null==y?void 0:y.detectedPaths)||[],U=(null==y?void 0:y.nginxInstalled)||!1;return a().createElement(l.Card,{bordered:!1,loading:u},a().createElement(l.Space,{direction:"vertical",style:{width:"100%"},size:"large"},a().createElement(l.Alert,{type:U?"success":"warning",showIcon:!0,icon:U?a().createElement(o.CheckCircleOutlined,null):a().createElement(o.CloseCircleOutlined,null),message:a().createElement("span",{style:{fontWeight:600}},t("Nginx Cache Status")),description:a().createElement("div",{style:{marginTop:8}},a().createElement("div",null,a().createElement("span",{style:{fontWeight:500}},t("Status"),":")," ",U?a().createElement(l.Tag,{color:"success"},t("Nginx is installed")):a().createElement(l.Tag,{color:"warning"},t("Nginx is NOT installed"))),(null==y?void 0:y.mainConfigPath)&&a().createElement("div",{style:{marginTop:4}},a().createElement("span",{style:{fontWeight:500}},t("Nginx configuration file found at"),":")," ",a().createElement("code",{style:{fontSize:12}},y.mainConfigPath)),L.length>0&&a().createElement("div",{style:{marginTop:4}},a().createElement("span",{style:{fontWeight:500}},t("Nginx cache paths detected"),":"),a().createElement("div",{style:{marginTop:4,display:"flex",flexWrap:"wrap",gap:6}},L.map(function(e){return a().createElement(l.Tag,{key:e,color:"blue",style:{fontSize:11}},e)}))),!U&&a().createElement("div",{style:{marginTop:4,fontStyle:"italic",opacity:.8}},t("Nginx is not detected on this node. You can still input a custom cache directory."))),action:a().createElement(l.Button,{size:"small",icon:a().createElement(o.ReloadOutlined,null),onClick:q},t("Refresh"))}),a().createElement("div",null,a().createElement(eK,{level:5,style:{fontSize:14}},t("Nginx cache clearing method")),a().createElement(l.Radio.Group,{value:v,onChange:function(e){return b(e.target.value)},style:{width:"100%",marginTop:8}},a().createElement(l.Row,{gutter:16},a().createElement(l.Col,{span:12},a().createElement(l.Radio.Button,{value:"directory",style:{width:"100%",height:"auto",padding:"16px 24px",display:"flex",flexDirection:"column",borderRadius:8,textAlign:"left",boxShadow:"none",lineHeight:"normal",border:"directory"===v?"2px solid #1677ff":"1px solid #d9d9d9"}},a().createElement(l.Space,{align:"start",size:"middle"},a().createElement(o.DeleteOutlined,{style:{fontSize:24,color:"directory"===v?"#1677ff":"inherit",marginTop:4}}),a().createElement("div",null,a().createElement("div",{style:{fontWeight:600,fontSize:15,color:"directory"===v?"#1677ff":"inherit"}},t("Physical Files")),a().createElement("div",{style:{fontSize:12,opacity:.65,marginTop:4}},t("Directly deletes all cache files inside the nginx cache directory on this server node.")))))),a().createElement(l.Col,{span:12},a().createElement(l.Radio.Button,{value:"purgeRequest",style:{width:"100%",height:"auto",padding:"16px 24px",display:"flex",flexDirection:"column",borderRadius:8,textAlign:"left",boxShadow:"none",lineHeight:"normal",border:"purgeRequest"===v?"2px solid #1677ff":"1px solid #d9d9d9"}},a().createElement(l.Space,{align:"start",size:"middle"},a().createElement(o.SendOutlined,{style:{fontSize:24,color:"purgeRequest"===v?"#1677ff":"inherit",marginTop:4}}),a().createElement("div",null,a().createElement("div",{style:{fontWeight:600,fontSize:15,color:"purgeRequest"===v?"#1677ff":"inherit"}},t("HTTP Purge Request")),a().createElement("div",{style:{fontSize:12,opacity:.65,marginTop:4}},t("Sends a custom HTTP request (like PURGE or bypass headers) to let Nginx clear specific URLs."))))))))),a().createElement(l.Card,{bordered:!0,size:"small",style:{backgroundColor:"#fafafa"}},"directory"===v?a().createElement(l.Form,{layout:"vertical"},a().createElement(l.Form.Item,{label:a().createElement("span",{style:{fontWeight:500}},t("Select Cache Path")),required:!0},a().createElement(l.Select,{value:w,onChange:function(e){return S(e)},style:{width:"100%"},options:((function(e){if(Array.isArray(e))return eD(e)})(e=L.map(function(e){return{label:e,value:e}}))||function(e){if("u">typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||eq(e)||function(){throw TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()).concat([{label:t("Custom Path"),value:"custom"}])})),"custom"===w&&a().createElement(l.Form.Item,{label:a().createElement("span",{style:{fontWeight:500}},t("Custom Cache Path")),required:!0},a().createElement(l.Input,{placeholder:"/var/cache/nginx",value:C,onChange:function(e){return x(e.target.value)}}),a().createElement(e_,{type:"secondary",style:{fontSize:11,display:"block",marginTop:4}},t("Provide the full absolute path of the directory. Restricted system paths will be rejected for safety.")))):a().createElement(l.Form,{layout:"vertical"},a().createElement(l.Row,{gutter:16},a().createElement(l.Col,{span:18},a().createElement(l.Form.Item,{label:a().createElement("span",{style:{fontWeight:500}},t("Purge URL")),required:!0},a().createElement(l.Input,{placeholder:"http://127.0.0.1/purge/*",value:I,onChange:function(e){return A(e.target.value)}}))),a().createElement(l.Col,{span:6},a().createElement(l.Form.Item,{label:a().createElement("span",{style:{fontWeight:500}},t("HTTP Method")),required:!0},a().createElement(l.Select,{value:R,onChange:function(e){return j(e)},options:[{label:"PURGE",value:"PURGE"},{label:"GET",value:"GET"},{label:"POST",value:"POST"},{label:"DELETE",value:"DELETE"}]})))),a().createElement(l.Form.Item,{label:a().createElement("span",{style:{fontWeight:500}},t("Headers (JSON)"))},a().createElement(eU,{rows:4,value:M,onChange:function(e){return D(e.target.value)},placeholder:'{\n "X-Purge": "1"\n}',style:{fontFamily:"monospace",fontSize:12}})))),a().createElement("div",null,a().createElement(l.Popconfirm,{title:t("Clear Nginx Cache?"),description:"directory"===v?t("Are you sure you want to clear Nginx cache? This will permanently delete all files in this directory."):t("Are you sure you want to trigger this HTTP Purge request?"),onConfirm:function(){return eF(function(){var e,r,a,o,i,c,u,s,d,m,f,y;return eL(this,function(g){switch(g.label){case 0:p(!0),B(""),g.label=1;case 1:if(g.trys.push([1,3,4,5]),r={method:v},"directory"===v){if(!(a="custom"===w?C:w))return l.message.error(t("Nginx cache path is required")),p(!1),[2];r.directory=a,B("[INFO] Clearing physical cache files in: ".concat(a,"\n"))}else{if(!I)return l.message.error(t("Please enter a valid Purge URL")),p(!1),[2];r.url=I,r.httpMethod=R,o={};try{M.trim()&&(o=JSON.parse(M))}catch(e){return l.message.error(t("Invalid headers JSON structure")),p(!1),[2]}r.headers=o,B("[INFO] Sending HTTP Purge request:\n[INFO] Method: ".concat(R,"\n[INFO] URL: ").concat(I,"\n[INFO] Headers: ").concat(JSON.stringify(o,null,2),"\n"))}return[4,n.request({url:"clusterManagerCacheMgr:clearNginxCache",method:"post",data:{values:r}})];case 2:return c=null==(i=g.sent())||null==(e=i.data)?void 0:e.data,"directory"===v?(u=t("Cache cleared successfully. Cleared {count} items.").replace("{count}",String((null==c?void 0:c.clearedCount)||0)),l.message.success(u),B(function(e){return e+"[SUCCESS] ".concat(u,"\n")})):(s=t("HTTP Purge request completed. Status: {status}").replace("{status}",String((null==c?void 0:c.status)||200)),l.message.success(s),B(function(e){var t;return e+"[SUCCESS] ".concat(s,"\n[RESPONSE BODY]\n").concat("object"==((t=null==c?void 0:c.data)&&"u">typeof Symbol&&t.constructor===Symbol?"symbol":typeof t)?JSON.stringify(c.data,null,2):String((null==c?void 0:c.data)||""),"\n")})),[3,5];case 3:return y=(null==(d=g.sent())||null==(f=d.response)||null==(m=f.data)?void 0:m.message)||(null==d?void 0:d.message)||String(d),l.message.error(y),B(function(e){return e+"[ERROR] Failed: ".concat(y,"\n")}),[3,5];case 4:return p(!1),[7];case 5:return[2]}})})()},okButtonProps:{loading:m}},a().createElement(l.Button,{type:"primary",danger:"directory"===v,size:"large",icon:"directory"===v?a().createElement(o.DeleteOutlined,null):a().createElement(o.SendOutlined,null),loading:m},"directory"===v?t("Clear Nginx Cache"):t("Send Purge Request")))),F&&a().createElement("div",null,a().createElement(eK,{level:5,style:{fontSize:13,marginBottom:8}},t("Execution Logs")),a().createElement("pre",{style:{backgroundColor:"#1e1e1e",color:"#d4d4d4",padding:"12px 16px",borderRadius:6,fontFamily:"monospace",fontSize:12,overflowX:"auto",whiteSpace:"pre-wrap",maxHeight:"300px"}},F))))}function eV(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function eH(e,t,n,r,a,l,o){try{var i=e[l](o),c=i.value}catch(e){n(e);return}i.done?t(c):Promise.resolve(c).then(r,a)}function eQ(e){return function(){var t=this,n=arguments;return new Promise(function(r,a){var l=e.apply(t,n);function o(e){eH(l,r,a,o,i,"next",e)}function i(e){eH(l,r,a,o,i,"throw",e)}o(void 0)})}}function eG(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,a=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var l=[],o=!0,i=!1;try{for(a=a.call(e);!(o=(n=a.next()).done)&&(l.push(n.value),!t||l.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==a.return||a.return()}finally{if(i)throw r}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return eV(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return eV(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function eJ(e,t){var n,r,a,l={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},o=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),i=Object.defineProperty;return i(o,"next",{value:c(0)}),i(o,"throw",{value:c(1)}),i(o,"return",{value:c(2)}),"function"==typeof Symbol&&i(o,Symbol.iterator,{value:function(){return this}}),o;function c(i){return function(c){var u=[i,c];if(n)throw TypeError("Generator is already executing.");for(;o&&(o=0,u[0]&&(l=0)),l;)try{if(n=1,r&&(a=2&u[0]?r.return:u[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,u[1])).done)return a;switch(r=0,a&&(u=[2&u[0],a.value]),u[0]){case 0:case 1:a=u;break;case 4:return l.label++,{value:u[1],done:!1};case 5:l.label++,r=u[1],u=[0];continue;case 7:u=l.ops.pop(),l.trys.pop();continue;default:if(!(a=(a=l.trys).length>0&&a[a.length-1])&&(6===u[0]||2===u[0])){l=0;continue}if(3===u[0]&&(!a||u[1]>a[0]&&u[1]<a[3])){l.label=u[1];break}if(6===u[0]&&l.label<a[1]){l.label=a[1],a=u;break}if(a&&l.label<a[2]){l.label=a[2],l.ops.push(u);break}a[2]&&l.ops.pop(),l.trys.pop();continue}u=t.call(e,l)}catch(e){u=[6,e],r=0}finally{n=a=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}function e$(){var e=T(),t=(0,i.useApp)().apiClient,n=eG((0,r.useState)(!1),2),c=n[0],u=n[1],s=eG((0,r.useState)([]),2),d=s[0],m=s[1],p=eG((0,r.useState)([]),2),f=p[0],y=p[1],g=eG((0,r.useState)(null),2),h=g[0],v=g[1],b=(0,r.useCallback)(function(){return eQ(function(){var e,n,r,a,l,o,i,c,s;return eJ(this,function(d){switch(d.label){case 0:u(!0),d.label=1;case 1:return d.trys.push([1,3,4,5]),[4,Promise.all([t.request({url:"clusterManagerCacheMgr:stores"}),t.request({url:"clusterManagerCacheMgr:caches"}),t.request({url:"clusterManagerCacheMgr:redisMemory"})])];case 2:return i=(o=eG.apply(void 0,[d.sent(),3]))[0],c=o[1],s=o[2],m((null==i||null==(n=i.data)||null==(e=n.data)?void 0:e.data)||[]),y((null==c||null==(a=c.data)||null==(r=a.data)?void 0:r.data)||[]),v(null==s||null==(l=s.data)?void 0:l.data),[3,5];case 3:return d.sent(),[3,5];case 4:return u(!1),[7];case 5:return[2]}})})()},[t]);(0,r.useEffect)(function(){b()},[b]);var E=[{title:e("Store Name"),dataIndex:"name",key:"name"},{title:e("Type"),dataIndex:"type",key:"type",width:120,render:function(e){return a().createElement(l.Tag,{color:"redis"===e?"blue":"default"},e)}},{title:e("Default"),dataIndex:"isDefault",key:"isDefault",width:100,render:function(e){return e?a().createElement(l.Tag,{color:"green"},"Yes"):"-"}}],w=[{title:e("Cache Name"),dataIndex:"name",key:"name"},{title:e("Prefix"),dataIndex:"prefix",key:"prefix",render:function(e){return e?a().createElement("code",{style:{fontSize:11}},e):"-"}}];return a().createElement(l.Tabs,{defaultActiveKey:"overview",items:[{key:"overview",label:e("Cache Stores"),children:a().createElement(l.Spin,{spinning:c},a().createElement(l.Space,{direction:"vertical",style:{width:"100%"},size:"middle"},a().createElement(l.Space,null,a().createElement(l.Button,{icon:a().createElement(o.ReloadOutlined,null),onClick:b},e("Refresh")),a().createElement(l.Popconfirm,{title:e("Flush all caches?"),description:e("This will clear all cached data across all stores."),onConfirm:function(){return eQ(function(){return eJ(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,t.request({url:"clusterManagerCacheMgr:flushAll",method:"post"})];case 1:return n.sent(),l.message.success(e("All caches flushed")),b(),[3,3];case 2:return n.sent(),l.message.error(e("Failed to flush caches")),[3,3];case 3:return[2]}})})()}},a().createElement(l.Button,{danger:!0,icon:a().createElement(o.DeleteOutlined,null)},e("Flush All")))),a().createElement(l.Row,{gutter:16},a().createElement(l.Col,{span:8},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:e("Cache Stores"),value:d.length,prefix:a().createElement(o.DatabaseOutlined,null)}))),a().createElement(l.Col,{span:8},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:e("Named Caches"),value:f.length}))),a().createElement(l.Col,{span:8},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:e("Redis Keys"),value:(null==h?void 0:h.available)?h.totalKeys:"-",suffix:(null==h?void 0:h.available)?"(".concat(h.usedMemory,")"):""})))),a().createElement(l.Card,{title:e("Registered Stores"),size:"small"},a().createElement(l.Table,{dataSource:d,columns:E,rowKey:"name",size:"small",pagination:!1})),a().createElement(l.Card,{title:e("Named Caches"),size:"small"},a().createElement(l.Table,{dataSource:f,columns:w,rowKey:"name",size:"small",pagination:!1}))))},{key:"acl",label:e("ACL Cache"),children:a().createElement(eg,null)},{key:"redis",label:e("Redis Monitor"),children:a().createElement(ew,null)},{key:"locks",label:e("Locks"),children:a().createElement(eA,null)},{key:"queue",label:e("Event Queue"),children:a().createElement(eM,null)},{key:"nginx",label:e("Nginx Cache"),children:a().createElement(eW,null)}]})}function eY(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function eX(e,t,n,r,a,l,o){try{var i=e[l](o),c=i.value}catch(e){n(e);return}i.done?t(c):Promise.resolve(c).then(r,a)}function eZ(e){return function(){var t=this,n=arguments;return new Promise(function(r,a){var l=e.apply(t,n);function o(e){eX(l,r,a,o,i,"next",e)}function i(e){eX(l,r,a,o,i,"throw",e)}o(void 0)})}}function e0(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function e1(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){e0(e,t,n[t])})}return e}function e2(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):(function(e){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t.push.apply(t,n)}return t})(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}),e}function e3(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,a=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var l=[],o=!0,i=!1;try{for(a=a.call(e);!(o=(n=a.next()).done)&&(l.push(n.value),!t||l.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==a.return||a.return()}finally{if(i)throw r}}return l}}(e,t)||e6(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function e4(e){return function(e){if(Array.isArray(e))return eY(e)}(e)||function(e){if("u">typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||e6(e)||function(){throw TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function e6(e,t){if(e){if("string"==typeof e)return eY(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return eY(e,t)}}function e5(e,t){var n,r,a,l={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},o=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),i=Object.defineProperty;return i(o,"next",{value:c(0)}),i(o,"throw",{value:c(1)}),i(o,"return",{value:c(2)}),"function"==typeof Symbol&&i(o,Symbol.iterator,{value:function(){return this}}),o;function c(i){return function(c){var u=[i,c];if(n)throw TypeError("Generator is already executing.");for(;o&&(o=0,u[0]&&(l=0)),l;)try{if(n=1,r&&(a=2&u[0]?r.return:u[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,u[1])).done)return a;switch(r=0,a&&(u=[2&u[0],a.value]),u[0]){case 0:case 1:a=u;break;case 4:return l.label++,{value:u[1],done:!1};case 5:l.label++,r=u[1],u=[0];continue;case 7:u=l.ops.pop(),l.trys.pop();continue;default:if(!(a=(a=l.trys).length>0&&a[a.length-1])&&(6===u[0]||2===u[0])){l=0;continue}if(3===u[0]&&(!a||u[1]>a[0]&&u[1]<a[3])){l.label=u[1];break}if(6===u[0]&&l.label<a[1]){l.label=a[1],a=u;break}if(a&&l.label<a[2]){l.label=a[2],l.ops.push(u);break}a[2]&&l.ops.pop(),l.trys.pop();continue}u=t.call(e,l)}catch(e){u=[6,e],r=0}finally{n=a=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}var e8=l.Typography.Text;l.Typography.Title;var e7="workflow:process,async-task:process",e9=z.filter(function(e){return e.common&&!e.sandbox}),te={name:"*",label:"All processes",description:"Consume every worker process"},tt={APP_ROLE:"worker",WORKER_MODE:e7,APP_PORT:"13000",SKILL_HUB_SANDBOX:"false"},tn=[{configMapRef:{name:"nocobase-config"}},{secretRef:{name:"nocobase-secret"}}],tr=[{name:"app-storage",mountPath:"/app/nocobase/storage"},{name:"script-volume",mountPath:"/hotfix-license.js",subPath:"hotfix-license.js"}],ta=[{name:"app-storage",persistentVolumeClaim:{claimName:"app-storage"}},{name:"script-volume",configMap:{name:"nocobase-scripts"}}],tl={running:"green",stopped:"orange",exited:"red",pending:"blue",creating:"cyan",error:"red"};function to(e,t){return JSON.stringify(null!=e?e:t,null,2)}function ti(e,t,n){var r=String(e||"").trim();if(!r)return t;try{return JSON.parse(r)}catch(e){throw Error("".concat(n," must be valid JSON"))}}function tc(e){var t;return(t=G(e))?t.split(","):[]}function tu(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"*";return G((null==e?void 0:e.workerMode)||(null==e||null==(t=e.envVars)?void 0:t.WORKER_MODE)||n)||""}function ts(){var e,t=T(),n=(0,i.useApp)().apiClient,c=e3((0,r.useState)(!1),2),u=c[0],s=c[1],d=e3((0,r.useState)([]),2),m=d[0],p=d[1],f=e3((0,r.useState)({}),2),y=f[0],g=f[1],h=e3((0,r.useState)({}),2),v=h[0],b=h[1],E=e3((0,r.useState)({}),2),w=E[0],S=E[1],k=e3((0,r.useState)({visible:!1,containerId:"",logs:[]}),2),C=k[0],x=k[1],O=e3((0,r.useState)({visible:!1,containerName:"",logs:""}),2),I=O[0],A=O[1],P=e3((0,r.useState)(null),2),R=P[0],j=P[1],z=e3((0,r.useState)(!1),2),M=z[0],D=z[1],N=e3((0,r.useState)({visible:!1,stack:null}),2),F=N[0],B=N[1],q=e3(l.Form.useForm(),1)[0],L=e3(l.Form.useForm(),1)[0],U=e3((0,r.useState)([]),2),K=U[0],_=U[1],W=e3((0,r.useState)([]),2),V=W[0],H=W[1],J=e3((0,r.useState)(!1),2),$=J[0],Y=J[1],X=(0,r.useCallback)(function(){return eZ(function(){var e,t,r;return e5(this,function(a){switch(a.label){case 0:Y(!0),a.label=1;case 1:return a.trys.push([1,3,4,5]),[4,n.request({url:"/workerQueueMappings:scanQueues"})];case 2:return H(Array.isArray(null==(r=(null==(e=(t=a.sent()).data)?void 0:e.data)||t.data)?void 0:r.discovered)?r.discovered:[]),[3,5];case 3:return a.sent(),H([]),[3,5];case 4:return Y(!1),[7];case 5:return[2]}})})()},[n]),Z=(0,r.useCallback)(function(){return eZ(function(){var e,t,r;return e5(this,function(a){switch(a.label){case 0:return a.trys.push([0,2,,3]),[4,n.request({url:"/workerOrchestrator:networks"})];case 1:return Array.isArray(r=(null==(e=(t=a.sent()).data)?void 0:e.data)||t.data)||(r=[]),_(r),[3,3];case 2:return a.sent(),_([]),[3,3];case 3:return[2]}})})()},[n]),ee=(0,r.useCallback)(function(){return eZ(function(){var e,t;return e5(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,n.request({url:"/workerOrchestrator:ping"})];case 1:return j((null==(e=(t=r.sent()).data)?void 0:e.data)||t.data),[3,3];case 2:return r.sent(),j({connected:!1,adapter:"unknown"}),[3,3];case 3:return[2]}})})()},[n]),et=(0,r.useCallback)(function(){return eZ(function(){var e,t,r;return e5(this,function(a){switch(a.label){case 0:return a.trys.push([0,2,,3]),[4,n.request({url:"/orchestratorStacks:list",params:{pageSize:50}})];case 1:return p(t=(null==(e=a.sent().data)?void 0:e.data)||[]),r={},t.forEach(function(e){r[e.id]=e.desiredReplicas}),S(r),[3,3];case 2:return a.sent(),[3,3];case 3:return[2]}})})()},[n]),en=(0,r.useCallback)(function(e){return eZ(function(){var t,r,a,o;return e5(this,function(i){switch(i.label){case 0:return i.trys.push([0,2,,3]),[4,n.request({url:"/workerOrchestrator:containers",params:{stackId:e}})];case 1:return a=(null==(t=(r=i.sent()).data)?void 0:t.data)||r.data,g(function(t){return e2(e1({},t),e0({},e,a.data||[]))}),b(function(t){return e2(e1({},t),e0({},e,a.meta||{}))}),[3,3];case 2:return o=i.sent(),l.message.error("Failed to load containers: ".concat(o.message)),[3,3];case 3:return[2]}})})()},[n]),er=(0,r.useCallback)(function(){return eZ(function(){var e,t;return e5(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,n.request({url:"/workerOrchestrator:getSettings"})];case 1:return t=r.sent(),q.setFieldsValue((null==(e=t.data)?void 0:e.data)||t.data),[3,3];case 2:return r.sent(),[3,3];case 3:return[2]}})})()},[n,q]),ea=function(e){B({visible:!0,stack:e||null}),L.setFieldsValue(e?e2(e1({},e),{workerMode:tc(tu(e)),envVars:to(e.envVars,{}),resourceLimits:to(e.resourceLimits,{}),k8sEnv:to(e.k8sEnv,[]),k8sEnvFrom:to(e.k8sEnvFrom,[]),k8sVolumeMounts:to(e.k8sVolumeMounts,[]),k8sVolumes:to(e.k8sVolumes,[])}):{name:"app-workers",adapter:"kubernetes",image:"nocobase/nocobase:2.1.6-full",command:"export NOCOBASE_RUNNING_IN_DOCKER=true\nif ! command -v git >/dev/null; then echo \"Installing git...\"; if command -v apt-get >/dev/null; then apt-get update && apt-get install -y git; elif command -v apk >/dev/null; then apk add git; fi; fi\nif [ ! -d /app/nocobase ]; then mkdir -p /app/nocobase; fi\nif [ ! -f /app/nocobase/package.json ]; then\n echo \"copying...\"\n tar -zxf /app/nocobase.tar.gz --absolute-names -C /app/nocobase\n touch /app/nocobase/node_modules/@nocobase/app/dist/client/index.html\nfi\necho \"Applying license hotfix...\"\ncd /app/nocobase && echo \"module.exports={getEnvAsync:async()=>({sys:'mock',osVer:'mock',db:{id:'mock'}}),getInstanceIdWithPublicKeyAsync:async()=>'mock',getInstanceIdAsync:async()=>'mock',instanceIdDecrypt:()=>'mock',createKeyPair:()=>({publicKey:'mock',privateKey:'mock'}),encryptWithPublicKey:()=>'mock',encrypt:()=>'mock',decryptWithPrivateKey:()=>'mock',createSignature:()=>'mock',verifySignature:()=>true,keyEncrypt:()=>'mock',keyDecrypt:()=>JSON.stringify({licenseKey:{domain:'*'}})}\" > node_modules/@nocobase/license-kit/index.js\ncd /app/nocobase && yarn nocobase postinstall\nPRIMARY_URL=\"http://app-1:13000/api/app:getInfo\"\nMAX_WAIT=900\nWAITED=0\nwhile [ $WAITED -lt $MAX_WAIT ]; do\n if wget -q --spider \"$PRIMARY_URL\" 2>/dev/null; then\n echo \"Primary ready after ${WAITED}s. Waiting an additional 15s...\"\n sleep 15\n break\n fi\n sleep 5\n WAITED=$((WAITED + 5))\ndone\nexec yarn --cwd /app/nocobase start",workerMode:tc(e7),envVars:to(tt,{}),resourceLimits:to({memory:"1536Mi"},{}),desiredReplicas:1,enabled:!0,namespace:"nocobase",deploymentName:"app-workers",serviceAccountName:"nocobase-orchestrator",imagePullPolicy:"IfNotPresent",k8sContainerName:"worker",k8sEnv:to([],[]),k8sEnvFrom:to(tn,[]),k8sVolumeMounts:to(tr,[]),k8sVolumes:to(ta,[]),networkMode:""}),Z(),X()},el=function(){B({visible:!1,stack:null}),L.resetFields()};(0,r.useEffect)(function(){ee(),et(),er(),X()},[ee,et,er,X]),(0,r.useEffect)(function(){var e=function(){m.forEach(function(e){return en(e.id)})};e();var t=setInterval(function(){et(),e()},1e4);return function(){return clearInterval(t)}},[m,en,et]);var eo=function(e,t,r){return eZ(function(){var a,o,i,c,u;return e5(this,function(d){switch(d.label){case 0:s(!0),d.label=1;case 1:return d.trys.push([1,4,5,6]),[4,n.request({url:"/workerOrchestrator:".concat(e),method:"POST",data:{stackId:r,containerId:t}})];case 2:return d.sent(),l.message.success("".concat(e," ").concat(t," successful")),[4,en(r)];case 3:return d.sent(),[3,6];case 4:return a=d.sent(),l.message.error((null==(u=a.response)||null==(c=u.data)||null==(i=c.errors)||null==(o=i[0])?void 0:o.message)||a.message),[3,6];case 5:return s(!1),[7];case 6:return[2]}})})()},ei=[{title:t("Container"),dataIndex:"name",key:"name",render:function(e,t){return a().createElement(l.Space,null,a().createElement(e8,{code:!0,style:{fontSize:11}},t.id),a().createElement(e8,null,e))}},{title:t("Status"),dataIndex:"status",key:"status",width:100,render:function(e){return a().createElement(l.Tag,{color:tl[e]||"default"},e.toUpperCase())}},{title:t("Packages"),key:"packages",width:140,render:function(e,t){var n=t.packageStatus;if(!n)return a().createElement(e8,{type:"secondary"},"-");var r="processing";return"succeeded"===n.initStatus&&(r="success"),"failed"===n.initStatus&&(r="error"),a().createElement(l.Tooltip,{title:n.initProgressLog||"Click to view logs"},a().createElement(l.Tag,{color:r,style:{cursor:"pointer"},onClick:function(){return A({visible:!0,containerName:t.name,logs:n.lastInitLog||""})}},"running"===n.initStatus&&a().createElement(o.ReloadOutlined,{spin:!0,style:{marginRight:4}}),"succeeded"===n.initStatus?"Installed":"failed"===n.initStatus?"Failed":"".concat(n.initProgressPercent||0,"%")))}},{title:t("Image"),dataIndex:"image",key:"image",ellipsis:!0,render:function(e){return a().createElement(e8,{type:"secondary",style:{fontSize:12}},e)}},{title:t("Age"),dataIndex:"createdAt",key:"age",width:80,render:function(e){return e?function(e){var t=Math.floor((Date.now()-new Date(e).getTime())/6e4);if(t<60)return"".concat(t,"m");var n=Math.floor(t/60);if(n<24)return"".concat(n,"h ").concat(t%60,"m");var r=Math.floor(n/24);return"".concat(r,"d ").concat(n%24,"h")}(e):"-"}},{title:t("Actions"),key:"actions",width:160,render:function(e,r){var i=(null==R?void 0:R.adapter)==="kubernetes",c=r._stackId;return c?a().createElement(l.Space,{size:"small"},!i&&("running"===r.status?a().createElement(l.Tooltip,{title:t("Stop")},a().createElement(l.Button,{size:"small",type:"text",icon:a().createElement(o.PauseCircleOutlined,null),onClick:function(){return eo("stop",r.id,c)}})):a().createElement(l.Tooltip,{title:t("Start")},a().createElement(l.Button,{size:"small",type:"text",icon:a().createElement(o.PlayCircleOutlined,{style:{color:"#52c41a"}}),onClick:function(){return eo("start",r.id,c)}}))),a().createElement(l.Tooltip,{title:t("Logs")},a().createElement(l.Button,{size:"small",type:"text",icon:a().createElement(o.FileTextOutlined,null),onClick:function(){var e;return e=r.id,eZ(function(){var t,r,a;return e5(this,function(o){switch(o.label){case 0:return o.trys.push([0,2,,3]),[4,n.request({url:"/workerOrchestrator:logs",params:{stackId:c,containerId:e,tail:200}})];case 1:return x({visible:!0,containerId:e,logs:((null==(t=(r=o.sent()).data)?void 0:t.data)||r.data).lines||[]}),[3,3];case 2:return a=o.sent(),l.message.error("Failed to get logs: ".concat(a.message)),[3,3];case 3:return[2]}})})()}})),a().createElement(l.Popconfirm,{title:t("Remove this container?"),onConfirm:function(){return eo("remove",r.id,c)}},a().createElement(l.Tooltip,{title:t("Remove")},a().createElement(l.Button,{size:"small",type:"text",danger:!0,icon:a().createElement(o.DeleteOutlined,null)})))):null}}],ec=Array.from(new Map([te].concat(e4(e9),e4(V)).map(function(e){var t=("workerProcessName"in e?e.workerProcessName:void 0)||Q(e.name);return[t,{value:t,label:"".concat(e.label," (").concat(t,")"),title:e.name===t?e.description:"".concat(e.description," - alias: ").concat(e.name)}]})).values());return R?a().createElement("div",null,a().createElement(l.Card,{size:"small",style:{marginBottom:16}},a().createElement(l.Row,{justify:"space-between",align:"middle"},a().createElement(l.Col,null,a().createElement(l.Space,null,a().createElement(o.ApiOutlined,{style:{fontSize:18}}),a().createElement(e8,{strong:!0},t("Adapter"),": "),a().createElement(l.Tag,{color:"blue"},(null==(e=R.adapter)?void 0:e.toUpperCase())||"NONE"),a().createElement(l.Badge,{status:R.connected?"success":"error",text:R.connected?t("Connected"):t("Disconnected")}),void 0!==R.leader&&a().createElement(a().Fragment,null,a().createElement(e8,{type:"secondary"},"|"),a().createElement(l.Badge,{status:R.leader?"success":"default",text:R.leader?t("Leader (this node)"):t("Follower")})))),a().createElement(l.Col,null,a().createElement(l.Space,null,a().createElement(l.Button,{type:"primary",icon:a().createElement(o.PlusOutlined,null),onClick:function(){return ea()}},t("New worker stack")),a().createElement(l.Button,{icon:a().createElement(o.SettingOutlined,null),onClick:function(){return D(!0)}},t("Settings")),a().createElement(l.Button,{icon:a().createElement(o.ReloadOutlined,null),onClick:function(){ee(),et()}},t("Refresh")))))),R.connected?a().createElement(a().Fragment,null,0===m.length&&a().createElement(l.Alert,{type:"info",showIcon:!0,message:t("No stacks configured"),description:t("Create a worker stack here, then scale it to start worker pods."),style:{marginBottom:16}}),m.map(function(e){var r,i,c,d,m=(y[e.id]||[]).map(function(t){return e2(e1({},t),{_stackId:e.id})}),p=v[e.id]||{},f=tu(e);return a().createElement(l.Card,{key:e.id,title:a().createElement(l.Space,null,a().createElement(o.CloudServerOutlined,null),a().createElement("span",null,e.name),a().createElement(l.Tag,null,e.adapter),a().createElement(l.Tooltip,{title:f},a().createElement(l.Tag,{color:"*"===f?"orange":"geekblue"},f.length<=46?f:"".concat(f.slice(0,43),"...")))),extra:a().createElement(l.Space,null,a().createElement(e8,{type:"secondary",style:{fontSize:12}},e.image),a().createElement(l.Tooltip,{title:t("Edit worker stack")},a().createElement(l.Button,{size:"small",type:"text",icon:a().createElement(o.EditOutlined,null),onClick:function(){return ea(e)}}))),style:{marginBottom:16}},a().createElement("div",{style:{marginBottom:16,display:"flex",alignItems:"center",gap:12}},a().createElement(e8,null,t("Replicas"),":"),a().createElement(l.Button,{size:"small",icon:a().createElement(o.ShrinkOutlined,null),disabled:u||0>=(w[e.id]||0),onClick:function(){return S(function(t){return e2(e1({},t),e0({},e.id,Math.max(0,(t[e.id]||0)-1)))})}}),a().createElement(l.InputNumber,{min:0,max:20,value:null!=(r=w[e.id])?r:e.desiredReplicas,onChange:function(t){return S(function(n){return e2(e1({},n),e0({},e.id,null!=t?t:0))})},style:{width:70}}),a().createElement(l.Button,{size:"small",icon:a().createElement(o.ExpandAltOutlined,null),disabled:u||(w[e.id]||0)>=20,onClick:function(){return S(function(t){return e2(e1({},t),e0({},e.id,Math.min(20,(t[e.id]||0)+1)))})}}),a().createElement(l.Button,{type:"primary",loading:u,onClick:function(){var t;return t=e.id,eZ(function(){var e,r,a,o,i,c,u,d,m;return e5(this,function(p){switch(p.label){case 0:if(void 0===(e=w[t]))return[2];s(!0),p.label=1;case 1:return p.trys.push([1,5,6,7]),[4,n.request({url:"/workerOrchestrator:scale",method:"POST",data:{stackId:t,replicas:e}})];case 2:return o=(null==(r=(a=p.sent()).data)?void 0:r.data)||a.data,l.message.success("Scaled: ".concat(o.previousReplicas," → ").concat(o.currentReplicas," replicas")),[4,en(t)];case 3:return p.sent(),[4,et()];case 4:return p.sent(),[3,7];case 5:return i=p.sent(),l.message.error((null==(m=i.response)||null==(d=m.data)||null==(u=d.errors)||null==(c=u[0])?void 0:c.message)||i.message),[3,7];case 6:return s(!1),[7];case 7:return[2]}})})()},disabled:(null!=(i=w[e.id])?i:e.desiredReplicas)===p.running},t("Scale")),a().createElement(e8,{type:"secondary"},null!=(c=p.running)?c:"?"," / ",null!=(d=w[e.id])?d:e.desiredReplicas," ",t("running")),a().createElement(l.Button,{size:"small",icon:a().createElement(o.ReloadOutlined,null),onClick:function(){return en(e.id)}})),a().createElement(l.Table,{dataSource:m,columns:ei,rowKey:"id",size:"small",pagination:!1,locale:{emptyText:t("No containers")}}))})):a().createElement(l.Alert,{type:"warning",showIcon:!0,message:t("Orchestrator Not Connected"),description:t("Please configure the adapter settings and ensure the container runtime is accessible."),style:{marginBottom:16},action:a().createElement(l.Button,{size:"small",type:"primary",onClick:function(){return D(!0)}},t("Configure Settings"))}),a().createElement(l.Modal,{title:"".concat(t("Logs"),": ").concat(C.containerId),open:C.visible,onCancel:function(){return x({visible:!1,containerId:"",logs:[]})},footer:null,width:900},a().createElement("pre",{style:{maxHeight:500,overflow:"auto",background:"#1e1e1e",color:"#d4d4d4",padding:12,borderRadius:6,fontSize:11,lineHeight:1.6,fontFamily:"Consolas, Monaco, monospace"}},C.logs.length>0?C.logs.join("\n"):t("No logs available"))),a().createElement(l.Modal,{title:"".concat(t("Package Logs"),": ").concat(I.containerName),open:I.visible,onCancel:function(){return A({visible:!1,containerName:"",logs:""})},footer:null,width:900},a().createElement("pre",{style:{maxHeight:500,overflow:"auto",background:"#1e1e1e",color:"#d4d4d4",padding:12,borderRadius:6,fontSize:11,lineHeight:1.6,fontFamily:"Consolas, Monaco, monospace",whiteSpace:"pre-wrap"}},I.logs||t("No logs available"))),a().createElement(l.Modal,{title:F.stack?t("Edit worker stack"):t("New worker stack"),open:F.visible,onCancel:el,onOk:function(){return L.submit()},okText:t("Save"),confirmLoading:u,width:860,destroyOnClose:!0},a().createElement(l.Form,{form:L,layout:"vertical",onFinish:function(e){return eZ(function(){var r,a,o,i,c,u,d;return e5(this,function(m){switch(m.label){case 0:s(!0),m.label=1;case 1:if(m.trys.push([1,7,8,9]),a=function(e){var t=G(e.workerMode);if(!t)throw Error("Select at least one process or queue");if(t.split(",").includes("!"))throw Error('Container worker stacks cannot include app process "!"');var n=ti(e.envVars,{},"Environment variables");return n.APP_ROLE=n.APP_ROLE||"worker",n.WORKER_MODE=t,void 0===n.SKILL_HUB_SANDBOX&&(n.SKILL_HUB_SANDBOX="false"),e2(e1({},e),{workerMode:t,envVars:n,resourceLimits:ti(e.resourceLimits,{},"Resource limits"),k8sEnv:ti(e.k8sEnv,[],"Kubernetes env"),k8sEnvFrom:ti(e.k8sEnvFrom,[],"Kubernetes envFrom"),k8sVolumeMounts:ti(e.k8sVolumeMounts,[],"Kubernetes volume mounts"),k8sVolumes:ti(e.k8sVolumes,[],"Kubernetes volumes"),desiredReplicas:Number(e.desiredReplicas||0),replicas:Number(e.replicas||0)})}(e),!(null==(r=F.stack)?void 0:r.id))return[3,3];return[4,n.request({url:"/orchestratorStacks:update",method:"put",params:{filterByTk:F.stack.id},data:a})];case 2:return m.sent(),l.message.success(t("Worker stack updated")),[3,5];case 3:return[4,n.request({url:"/orchestratorStacks:create",method:"post",data:a})];case 4:m.sent(),l.message.success(t("Worker stack created")),m.label=5;case 5:return el(),[4,et()];case 6:return m.sent(),[3,9];case 7:return o=m.sent(),l.message.error((null==o||null==(d=o.response)||null==(u=d.data)||null==(c=u.errors)||null==(i=c[0])?void 0:i.message)||o.message||t("Failed to save worker stack")),[3,9];case 8:return s(!1),[7];case 9:return[2]}})})()}},a().createElement(l.Row,{gutter:12},a().createElement(l.Col,{span:12},a().createElement(l.Form.Item,{name:"name",label:t("Stack name"),rules:[{required:!0,message:t("Stack name is required")},{pattern:/^[a-z0-9]([-a-z0-9]*[a-z0-9])?$/,message:t("Use a lowercase Kubernetes-safe name")}]},a().createElement(l.Input,{placeholder:"app-workers"}))),a().createElement(l.Col,{span:12},a().createElement(l.Form.Item,{name:"image",label:t("Image"),rules:[{required:!0}]},a().createElement(l.Input,{placeholder:"nocobase/nocobase:2.0.46-full"})))),a().createElement(l.Row,{gutter:12},a().createElement(l.Col,{span:8},a().createElement(l.Form.Item,{name:"adapter",label:t("Adapter"),rules:[{required:!0}]},a().createElement(l.Select,null,a().createElement(l.Select.Option,{value:"kubernetes"},t("Kubernetes")),a().createElement(l.Select.Option,{value:"docker"},t("Docker"))))),a().createElement(l.Col,{span:8},a().createElement(l.Form.Item,{name:"desiredReplicas",label:t("Desired replicas"),rules:[{required:!0}]},a().createElement(l.InputNumber,{min:0,max:20,style:{width:"100%"}}))),a().createElement(l.Col,{span:8},a().createElement(l.Form.Item,{name:"enabled",label:t("Enabled"),valuePropName:"checked"},a().createElement(l.Switch,null)))),a().createElement(l.Form.Item,{name:"workerMode",label:t("Processes / queues"),extra:t("Saved as WORKER_MODE. Use tags for custom process keys that are not discovered yet."),rules:[{validator:function(e,n){return G(n)?Promise.resolve():Promise.reject(Error(t("Select at least one process or queue")))}}]},a().createElement(l.Select,{mode:"tags",loading:$,options:ec,placeholder:e7,tokenSeparators:[","],showSearch:!0})),a().createElement(l.Form.Item,{noStyle:!0,shouldUpdate:function(e,t){return e.workerMode!==t.workerMode}},function(){return(G(L.getFieldValue("workerMode"))||"").includes("*")?a().createElement(l.Alert,{type:"warning",showIcon:!0,style:{marginBottom:16},message:t("WORKER_MODE=* makes this stack consume every queue. Prefer explicit queues in HA.")}):null}),a().createElement(l.Row,{gutter:12},a().createElement(l.Col,{span:8},a().createElement(l.Form.Item,{name:"deploymentName",label:t("Deployment name")},a().createElement(l.Input,{placeholder:"app-workers"}))),a().createElement(l.Col,{span:8},a().createElement(l.Form.Item,{name:"serviceAccountName",label:t("Service account")},a().createElement(l.Input,{placeholder:"nocobase-orchestrator"}))),a().createElement(l.Col,{span:8},a().createElement(l.Form.Item,{name:"imagePullPolicy",label:t("Image pull policy")},a().createElement(l.Select,null,a().createElement(l.Select.Option,{value:"IfNotPresent"},"IfNotPresent"),a().createElement(l.Select.Option,{value:"Always"},"Always"),a().createElement(l.Select.Option,{value:"Never"},"Never"))))),a().createElement(l.Row,{gutter:12},a().createElement(l.Col,{span:8},a().createElement(l.Form.Item,{name:"k8sContainerName",label:t("Container name")},a().createElement(l.Input,{placeholder:"worker"}))),a().createElement(l.Col,{span:8},a().createElement(l.Form.Item,{name:"namespace",label:t("Namespace")},a().createElement(l.Input,{placeholder:"nocobase"}))),a().createElement(l.Col,{span:8},a().createElement(l.Form.Item,{noStyle:!0,shouldUpdate:function(e,t){return e.adapter!==t.adapter}},function(){return"docker"===L.getFieldValue("adapter")?a().createElement(l.Form.Item,{name:"networkMode",label:t("Docker Network"),extra:t("Main network. Workers also inherit app networks.")},a().createElement(l.Select,{allowClear:!0,placeholder:t("Default (bridge)")},a().createElement(l.Select.Option,{value:"bridge"},"bridge"),a().createElement(l.Select.Option,{value:"host"},"host"),(Array.isArray(K)?K:[]).map(function(e){return a().createElement(l.Select.Option,{key:e.id,value:e.name},e.name)}))):null}))),a().createElement(l.Form.Item,{name:"command",label:t("Command")},a().createElement(l.Input.TextArea,{rows:10})),a().createElement(l.Row,{gutter:12},a().createElement(l.Col,{span:12},a().createElement(l.Form.Item,{name:"envVars",label:t("Environment variables JSON"),extra:t("WORKER_MODE is managed by Processes / queues above.")},a().createElement(l.Input.TextArea,{rows:8}))),a().createElement(l.Col,{span:12},a().createElement(l.Form.Item,{name:"resourceLimits",label:t("Resource limits JSON")},a().createElement(l.Input.TextArea,{rows:8})))),a().createElement(l.Row,{gutter:12},a().createElement(l.Col,{span:12},a().createElement(l.Form.Item,{name:"k8sEnvFrom",label:t("Kubernetes envFrom JSON")},a().createElement(l.Input.TextArea,{rows:7}))),a().createElement(l.Col,{span:12},a().createElement(l.Form.Item,{name:"k8sEnv",label:t("Kubernetes env JSON")},a().createElement(l.Input.TextArea,{rows:7})))),a().createElement(l.Row,{gutter:12},a().createElement(l.Col,{span:12},a().createElement(l.Form.Item,{name:"k8sVolumeMounts",label:t("Kubernetes volumeMounts JSON")},a().createElement(l.Input.TextArea,{rows:7}))),a().createElement(l.Col,{span:12},a().createElement(l.Form.Item,{name:"k8sVolumes",label:t("Kubernetes volumes JSON")},a().createElement(l.Input.TextArea,{rows:7})))))),a().createElement(l.Modal,{title:t("Orchestrator Settings"),open:M,onCancel:function(){return D(!1)},footer:null,width:600},a().createElement(l.Form,{form:q,layout:"vertical",onFinish:function(e){return eZ(function(){var r;return e5(this,function(a){switch(a.label){case 0:s(!0),a.label=1;case 1:return a.trys.push([1,5,6,7]),[4,n.request({url:"/workerOrchestrator:saveSettings",method:"POST",data:e})];case 2:return a.sent(),l.message.success(t("Settings saved successfully. Reconnecting...")),D(!1),[4,ee()];case 3:return a.sent(),[4,et()];case 4:return a.sent(),[3,7];case 5:return r=a.sent(),l.message.error("Failed to save settings: ".concat(r.message)),[3,7];case 6:return s(!1),[7];case 7:return[2]}})})()},initialValues:{adapterType:"none",k8sNamespace:"nocobase",workerLabelSelector:"role=worker"}},a().createElement(l.Form.Item,{name:"adapterType",label:t("Adapter"),rules:[{required:!0}]},a().createElement(l.Select,null,a().createElement(l.Select.Option,{value:"none"},t("Disabled")),a().createElement(l.Select.Option,{value:"docker"},t("Docker")),a().createElement(l.Select.Option,{value:"kubernetes"},t("Kubernetes")))),a().createElement(l.Form.Item,{noStyle:!0,shouldUpdate:function(e,t){return e.adapterType!==t.adapterType}},function(){var e=q.getFieldValue("adapterType");return"docker"===e?a().createElement(l.Card,{size:"small",title:t("Docker Configuration"),style:{marginBottom:16}},a().createElement(l.Form.Item,{name:"dockerSocketPath",label:t("Socket Path"),extra:"/var/run/docker.sock"},a().createElement(l.Input,null)),a().createElement(l.Form.Item,{name:"dockerHost",label:t("TCP Host"),extra:"e.g. tcp://192.168.1.10:2376 (Overrides socket)"},a().createElement(l.Input,null))):"kubernetes"===e?a().createElement(l.Card,{size:"small",title:t("Kubernetes Configuration"),style:{marginBottom:16}},a().createElement(l.Form.Item,{name:"k8sNamespace",label:t("Namespace"),extra:"nocobase"},a().createElement(l.Input,null)),a().createElement(l.Form.Item,{name:"k8sKubeconfig",label:t("Kubeconfig"),extra:"Paste kubeconfig YAML or enter a file path. Leave empty to use in-cluster ServiceAccount."},a().createElement(l.Input.TextArea,{rows:4}))):null}),a().createElement(l.Form.Item,{name:"workerLabelSelector",label:t("Worker Label Selector"),extra:"Only containers with this label will be managed. Example: role=worker"},a().createElement(l.Input,null)),a().createElement(l.Form.Item,{style:{marginBottom:0}},a().createElement(l.Button,{type:"primary",htmlType:"submit",icon:a().createElement(o.SaveOutlined,null),loading:u,block:!0},t("Save Settings & Reconnect")))))):a().createElement(l.Spin,{tip:t("Connecting to orchestrator..."),style:{display:"flex",justifyContent:"center",padding:48}})}var td=["python3","python3-pip","python3-venv"],tm=["python-docx","openpyxl","pandas","matplotlib","Pillow","reportlab","jinja2","pyyaml","tabulate","xlsxwriter"],tp=["xlsx","docx","pdfkit","csv-parse","archiver","sharp","lodash","dayjs"];function tf(e){return Array.isArray(e)?Array.from(new Set(e.filter(function(e){return"string"==typeof e}).map(function(e){return e.trim()}).filter(Boolean))):[]}function ty(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Array.isArray(e)?tf(e):"string"!=typeof e?tf(t):tf(e.split(/[\n,]/).map(function(e){return e.trim()}).filter(Boolean))}function tg(e){return tf(e).join("\n")}function th(e){return{apt:ty(e.aptPackages,td),python:ty(e.pythonPackages,tm),npm:ty(e.npmPackages,tp)}}function tv(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function tb(e,t,n,r,a,l,o){try{var i=e[l](o),c=i.value}catch(e){n(e);return}i.done?t(c):Promise.resolve(c).then(r,a)}function tE(e){return function(){var t=this,n=arguments;return new Promise(function(r,a){var l=e.apply(t,n);function o(e){tb(l,r,a,o,i,"next",e)}function i(e){tb(l,r,a,o,i,"throw",e)}o(void 0)})}}function tw(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,a=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var l=[],o=!0,i=!1;try{for(a=a.call(e);!(o=(n=a.next()).done)&&(l.push(n.value),!t||l.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==a.return||a.return()}finally{if(i)throw r}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return tv(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return tv(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function tS(e,t){var n,r,a,l={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},o=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),i=Object.defineProperty;return i(o,"next",{value:c(0)}),i(o,"throw",{value:c(1)}),i(o,"return",{value:c(2)}),"function"==typeof Symbol&&i(o,Symbol.iterator,{value:function(){return this}}),o;function c(i){return function(c){var u=[i,c];if(n)throw TypeError("Generator is already executing.");for(;o&&(o=0,u[0]&&(l=0)),l;)try{if(n=1,r&&(a=2&u[0]?r.return:u[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,u[1])).done)return a;switch(r=0,a&&(u=[2&u[0],a.value]),u[0]){case 0:case 1:a=u;break;case 4:return l.label++,{value:u[1],done:!1};case 5:l.label++,r=u[1],u=[0];continue;case 7:u=l.ops.pop(),l.trys.pop();continue;default:if(!(a=(a=l.trys).length>0&&a[a.length-1])&&(6===u[0]||2===u[0])){l=0;continue}if(3===u[0]&&(!a||u[1]>a[0]&&u[1]<a[3])){l.label=u[1];break}if(6===u[0]&&l.label<a[1]){l.label=a[1],a=u;break}if(a&&l.label<a[2]){l.label=a[2],l.ops.push(u);break}a[2]&&l.ops.pop(),l.trys.pop();continue}u=t.call(e,l)}catch(e){u=[6,e],r=0}finally{n=a=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}var tk=l.Typography.Text,tC={pending:{color:"default",text:"Not initialized"},running:{color:"processing",text:"Running..."},succeeded:{color:"success",text:"Succeeded"},failed:{color:"error",text:"Failed"}};function tx(e,t){return e.length?e.map(function(e){return a().createElement(l.Tag,{key:e,color:t,style:{marginBottom:2}},e)}):a().createElement(tk,{type:"secondary"},"-")}var tO=function(){var e,t,n,c,u,s,d=T(),m=(0,i.useApp)().apiClient,p=tw(l.Form.useForm(),1)[0],f=tw((0,r.useState)(!1),2),y=f[0],g=f[1],h=tw((0,r.useState)(!1),2),v=h[0],b=h[1],E=tw((0,r.useState)(!1),2),w=E[0],S=E[1],k=tw((0,r.useState)(null),2),C=k[0],x=k[1],O=tw((0,r.useState)(null),2),I=O[0],A=O[1],P=tw((0,r.useState)("all"),2),R=P[0],j=P[1],z=l.Form.useWatch("aptPackages",p),M=l.Form.useWatch("pythonPackages",p),D=l.Form.useWatch("npmPackages",p),N=(0,r.useRef)(!1),F=(0,r.useCallback)(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return tE(function(){var t,n,r,a;return tS(this,function(l){switch(l.label){case 0:if(N.current)return[2];N.current=!0,e||g(!0),l.label=1;case 1:return l.trys.push([1,3,4,5]),[4,m.request({url:"workerPackages:getPackageConfig"})];case 2:if(r=(null==(n=l.sent().data)||null==(t=n.data)?void 0:t.data)||(null==n?void 0:n.data))try{r.packageWhitelist="string"==typeof r.packageWhitelist?JSON.parse(r.packageWhitelist):r.packageWhitelist}catch(e){r.packageWhitelist={python:[],node:[],apt:[]}}return x(r),r&&(p.setFieldsValue({npmRegistryUrl:r.npmRegistryUrl,npmAuthToken:r.npmAuthToken,pypiIndexUrl:r.pypiIndexUrl,pypiTrustedHost:r.pypiTrustedHost,aptMirrorUrl:r.aptMirrorUrl,aptGpgKeyUrl:r.aptGpgKeyUrl,aptPackages:ty(r.aptPackages,td),pythonPackages:ty(r.pythonPackages,tm),npmPackages:ty(r.npmPackages,tp),retentionHours:null!=(a=r.retentionHours)?a:24}),"running"===r.initStatus?(S(!0),A({percent:r.initProgressPercent||0,log:r.initProgressLog||d("Processing...")})):(S(!1),A(null))),[3,5];case 3:return l.sent(),[3,5];case 4:return e||g(!1),N.current=!1,[7];case 5:return[2]}})})()},[m,p,d]);(0,r.useEffect)(function(){F()},[F]),(0,r.useEffect)(function(){var e=setInterval(function(){return F(!0)},1e4);return function(){return clearInterval(e)}},[F]);var B=function(e){return tE(function(){var t;return tS(this,function(n){switch(n.label){case 0:var r,a;if(r=function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){var r;r=n[t],t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r})}return e}({},e),a=a={aptPackages:tg(e.aptPackages),pythonPackages:tg(e.pythonPackages),npmPackages:tg(e.npmPackages)},Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(a)):(function(e){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t.push.apply(t,n)}return t})(Object(a)).forEach(function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(a,e))}),t=r,!(null==C?void 0:C.id))return[3,2];return[4,m.request({url:"workerPackages:savePackageConfig",method:"post",params:{filterByTk:C.id},data:t})];case 1:return n.sent(),[3,4];case 2:return[4,m.request({url:"workerPackages:savePackageConfig",method:"post",data:t})];case 3:n.sent(),n.label=4;case 4:return[2]}})})()},q=tC[null==C?void 0:C.initStatus]||tC.pending,L=(null==C?void 0:C.packageWhitelist)||{},U=(null==L||null==(e=L.python)?void 0:e.length)>0||(null==L||null==(t=L.node)?void 0:t.length)>0||(null==L||null==(n=L.apt)?void 0:n.length)>0,K=th({aptPackages:null!=z?z:td,pythonPackages:null!=M?M:tm,npmPackages:null!=D?D:tp});return a().createElement("div",{style:{padding:16,maxWidth:920}},a().createElement(l.Card,{title:a().createElement(l.Space,null,a().createElement(o.CloudServerOutlined,null),a().createElement("span",null,d("Cluster Package Installer"))),size:"small",style:{marginBottom:16},extra:a().createElement(l.Button,{icon:a().createElement(o.ReloadOutlined,null),size:"small",onClick:function(){return F(!1)},loading:y},d("Refresh"))},a().createElement(l.Space,{direction:"vertical",style:{width:"100%"}},a().createElement("div",null,a().createElement(tk,{strong:!0},d("Status"),": "),a().createElement(l.Tag,{color:q.color},d(q.text)),(null==C?void 0:C.lastInitAt)&&a().createElement(tk,{type:"secondary",style:{fontSize:12}},"(",new Date(C.lastInitAt).toLocaleString(),")")),a().createElement("div",null,a().createElement(tk,{strong:!0,style:{marginRight:8}},d("Target"),": "),a().createElement(l.Select,{value:R,onChange:j,style:{width:240},options:[{label:d("All app and worker nodes"),value:"all"},{label:d("App nodes only"),value:"app"},{label:d("Worker nodes only"),value:"worker"}]})),a().createElement(l.Alert,{type:"info",showIcon:!0,message:d("Each target node checks whether a package/module is already installed before installing it.")}),a().createElement(l.Space,null,a().createElement(l.Button,{type:"primary",icon:w?a().createElement(o.ReloadOutlined,{spin:!0}):a().createElement(o.CloudServerOutlined,null),onClick:function(){return tE(function(){var e,t;return tS(this,function(n){switch(n.label){case 0:S(!0),A({percent:0,log:d("Dispatching to target nodes...")}),n.label=1;case 1:return n.trys.push([1,5,,6]),[4,B(e=p.getFieldsValue())];case 2:return n.sent(),[4,m.request({url:"workerPackages:installPackages",method:"post",data:{targetRole:R,packages:th(e||{}),registryConfig:{aptMirrorUrl:e.aptMirrorUrl,npmRegistryUrl:e.npmRegistryUrl,pypiIndexUrl:e.pypiIndexUrl,pypiTrustedHost:e.pypiTrustedHost}}})];case 3:return n.sent(),l.message.info(d("Install task dispatched")),[4,F()];case 4:return n.sent(),[3,6];case 5:return t=n.sent(),l.message.error((null==t?void 0:t.message)||d("Failed to install packages/modules")),S(!1),A(null),[3,6];case 6:return[2]}})})()},size:"large"},w?d("Installing... (Click to Force Run)"):d("Install packages/modules")),w&&a().createElement(l.Button,{danger:!0,onClick:function(){return tE(function(){return tS(this,function(e){switch(e.label){case 0:return e.trys.push([0,3,,4]),[4,m.request({url:"workerPackages:resetInitStatus",method:"post"})];case 1:return e.sent(),l.message.success(d("Install status reset to stopped")),[4,F()];case 2:return e.sent(),[3,4];case 3:return e.sent(),l.message.error(d("Failed to stop installation")),[3,4];case 4:return[2]}})})()},size:"large"},d("Stop / Reset Status"))),w&&I&&a().createElement("div",null,a().createElement(l.Progress,{percent:I.percent,status:"active"}),a().createElement(tk,{type:"secondary"},I.log)),(null==C?void 0:C.lastInitLog)&&"running"!==C.initStatus&&a().createElement("div",null,a().createElement(tk,{strong:!0},d("Last Install Log"),":"),a().createElement("pre",{style:{background:"#f5f5f5",padding:8,borderRadius:4,fontSize:11,maxHeight:220,overflow:"auto",whiteSpace:"pre-wrap",marginTop:4}},C.lastInitLog)))),a().createElement(l.Card,{title:d("Package/module settings"),size:"small",style:{marginBottom:16}},a().createElement(l.Form,{form:p,layout:"vertical"},a().createElement(l.Form.Item,{name:"aptPackages",label:d("OS packages (APT)")},a().createElement(l.Select,{mode:"tags",style:{width:"100%"},placeholder:"python3, python3-pip",tokenSeparators:[",","\n"," "]})),a().createElement(l.Form.Item,{name:"pythonPackages",label:d("Python modules (pip)")},a().createElement(l.Select,{mode:"tags",style:{width:"100%"},placeholder:"python-docx, openpyxl",tokenSeparators:[",","\n"," "]})),a().createElement(l.Form.Item,{name:"npmPackages",label:d("Node modules (npm global)")},a().createElement(l.Select,{mode:"tags",style:{width:"100%"},placeholder:"xlsx, docx",tokenSeparators:[",","\n"," "]})),a().createElement(l.Divider,{style:{margin:"8px 0 16px"}}),a().createElement(l.Form.Item,{name:"aptMirrorUrl",label:d("APT mirror URL")},a().createElement(l.Input,{placeholder:"https://deb.debian.org/debian"})),a().createElement(l.Form.Item,{name:"npmRegistryUrl",label:d("NPM registry URL")},a().createElement(l.Input,{placeholder:"https://registry.npmjs.org/"})),a().createElement(l.Form.Item,{name:"pypiIndexUrl",label:d("PyPI index URL")},a().createElement(l.Input,{placeholder:"https://pypi.org/simple"})),a().createElement(l.Button,{type:"primary",onClick:function(){return tE(function(){return tS(this,function(e){switch(e.label){case 0:b(!0),e.label=1;case 1:return e.trys.push([1,4,5,6]),[4,B(p.getFieldsValue())];case 2:return e.sent(),l.message.success(d("Config saved")),[4,F()];case 3:return e.sent(),[3,6];case 4:return e.sent(),l.message.error(d("Failed to save config")),[3,6];case 5:return b(!1),[7];case 6:return[2]}})})()},loading:v},d("Save settings"))),a().createElement(l.Divider,{style:{margin:"16px 0"}}),a().createElement(tk,{strong:!0},d("Install plan"),":"),a().createElement("div",{style:{marginTop:8}},a().createElement(tk,{type:"secondary"},"APT: "),tx(K.apt||[])),a().createElement("div",{style:{marginTop:4}},a().createElement(tk,{type:"secondary"},"Python: "),tx(K.python||[],"blue")),a().createElement("div",{style:{marginTop:4}},a().createElement(tk,{type:"secondary"},"Node: "),tx(K.npm||[],"green"))),a().createElement(l.Card,{title:a().createElement(l.Space,null,a().createElement(o.SafetyOutlined,null),a().createElement("span",null,d("Installed package/module whitelist"))),size:"small"},U?a().createElement(l.Space,{direction:"vertical",style:{width:"100%"}},(null==L||null==(c=L.apt)?void 0:c.length)>0&&a().createElement("div",null,a().createElement(tk,{strong:!0},"APT: "),tx(L.apt)),(null==L||null==(u=L.python)?void 0:u.length)>0&&a().createElement("div",null,a().createElement(tk,{strong:!0},"Python: "),tx(L.python,"blue")),(null==L||null==(s=L.node)?void 0:s.length)>0&&a().createElement("div",null,a().createElement(tk,{strong:!0},"Node: "),tx(L.node,"green"))):a().createElement(l.Alert,{type:"warning",showIcon:!0,message:d("No successful install has generated a whitelist yet.")})))};function tI(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function tA(e,t,n,r,a,l,o){try{var i=e[l](o),c=i.value}catch(e){n(e);return}i.done?t(c):Promise.resolve(c).then(r,a)}function tP(e){return function(){var t=this,n=arguments;return new Promise(function(r,a){var l=e.apply(t,n);function o(e){tA(l,r,a,o,i,"next",e)}function i(e){tA(l,r,a,o,i,"throw",e)}o(void 0)})}}function tT(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,a=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var l=[],o=!0,i=!1;try{for(a=a.call(e);!(o=(n=a.next()).done)&&(l.push(n.value),!t||l.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==a.return||a.return()}finally{if(i)throw r}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return tI(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return tI(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function tR(e,t){var n,r,a,l={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},o=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),i=Object.defineProperty;return i(o,"next",{value:c(0)}),i(o,"throw",{value:c(1)}),i(o,"return",{value:c(2)}),"function"==typeof Symbol&&i(o,Symbol.iterator,{value:function(){return this}}),o;function c(i){return function(c){var u=[i,c];if(n)throw TypeError("Generator is already executing.");for(;o&&(o=0,u[0]&&(l=0)),l;)try{if(n=1,r&&(a=2&u[0]?r.return:u[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,u[1])).done)return a;switch(r=0,a&&(u=[2&u[0],a.value]),u[0]){case 0:case 1:a=u;break;case 4:return l.label++,{value:u[1],done:!1};case 5:l.label++,r=u[1],u=[0];continue;case 7:u=l.ops.pop(),l.trys.pop();continue;default:if(!(a=(a=l.trys).length>0&&a[a.length-1])&&(6===u[0]||2===u[0])){l=0;continue}if(3===u[0]&&(!a||u[1]>a[0]&&u[1]<a[3])){l.label=u[1];break}if(6===u[0]&&l.label<a[1]){l.label=a[1],a=u;break}if(a&&l.label<a[2]){l.label=a[2],l.ops.push(u);break}a[2]&&l.ops.pop(),l.trys.pop();continue}u=t.call(e,l)}catch(e){u=[6,e],r=0}finally{n=a=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}function tj(e,t){var n,r,a,l;return(null==e||null==(l=e.response)||null==(a=l.data)||null==(r=a.errors)||null==(n=r[0])?void 0:n.message)||(null==e?void 0:e.message)||t}function tz(){var e=T(),t=(0,i.useApp)().apiClient,n=tT((0,r.useState)(!1),2),c=n[0],u=n[1],s=tT((0,r.useState)(null),2),d=s[0],m=s[1],p=tT((0,r.useState)(""),2),f=p[0],y=p[1],g=tT((0,r.useState)([]),2),h=g[0],v=g[1],b=(0,r.useCallback)(function(){return tP(function(){var n,r,a,o,i;return tR(this,function(c){switch(c.label){case 0:u(!0),c.label=1;case 1:return c.trys.push([1,3,4,5]),[4,t.request({url:"clusterManagerPlugins:list"})];case 2:return v(Array.isArray(null==(o=c.sent())||null==(r=o.data)||null==(n=r.data)?void 0:n.data)?o.data.data.data:Array.isArray(null==o||null==(a=o.data)?void 0:a.data)?o.data.data:Array.isArray(null==o?void 0:o.data)?o.data:[]),[3,5];case 3:return i=c.sent(),l.message.error(tj(i,e("Failed to load plugins"))),[3,5];case 4:return u(!1),[7];case 5:return[2]}})})()},[t,e]);(0,r.useEffect)(function(){b()},[b]);var E=(0,r.useMemo)(function(){var e=f.trim().toLowerCase(),t=Array.isArray(h)?h:[];return e?t.filter(function(t){return[t.name,t.packageName,t.displayName,t.description].filter(Boolean).some(function(t){return String(t).toLowerCase().includes(e)})}):t},[h,f]),w=[{title:e("Plugin"),dataIndex:"displayName",key:"displayName",render:function(e,t){return a().createElement(l.Space,{direction:"vertical",size:0},a().createElement(l.Typography.Text,{strong:!0},t.displayName||t.name),a().createElement(l.Typography.Text,{type:"secondary",style:{fontSize:12}},t.packageName||t.name))}},{title:e("Name"),dataIndex:"name",key:"name",width:220,render:function(e){return a().createElement("code",{style:{fontSize:12}},e)}},{title:e("Status"),key:"status",width:260,render:function(t,n){return a().createElement(l.Space,{wrap:!0,size:[4,4]},a().createElement(l.Tag,{color:n.enabled?"green":"default"},n.enabled?e("Enabled"):e("Disabled")),a().createElement(l.Tag,{color:n.installed?"blue":"default"},n.installed?e("Installed"):e("Not installed")),a().createElement(l.Tag,{color:n.loaded?"processing":"default"},n.loaded?e("Loaded"):e("Not loaded")),n.protected&&a().createElement(l.Tag,{color:"red"},e("Protected")))}},{title:e("Version"),dataIndex:"version",key:"version",width:120,render:function(e){return e||"-"}},{title:e("Description"),dataIndex:"description",key:"description",ellipsis:!0,render:function(e){return e||"-"}},{title:e("Actions"),key:"actions",width:250,render:function(n,r){return a().createElement(l.Space,null,a().createElement(l.Popconfirm,{title:e("Force disable this plugin?"),description:e("This updates the plugin registry directly. Restart or reload is required to fully unload runtime hooks."),disabled:r.protected||!r.enabled,onConfirm:function(){return tP(function(){var n,a,o,i,c;return tR(this,function(u){switch(u.label){case 0:m("".concat(r.name,":disable")),u.label=1;case 1:return u.trys.push([1,4,5,6]),[4,t.request({url:"clusterManagerPlugins:forceDisable",method:"post",data:{name:r.name}})];case 2:return i=u.sent(),l.message.success((null==i||null==(a=i.data)||null==(n=a.data)?void 0:n.message)||(null==i||null==(o=i.data)?void 0:o.message)||e("Plugin force disabled")),[4,b()];case 3:return u.sent(),[3,6];case 4:return c=u.sent(),l.message.error(tj(c,e("Failed to force disable plugin"))),[3,6];case 5:return m(null),[7];case 6:return[2]}})})()},okText:e("Force disable"),cancelText:e("Cancel")},a().createElement(l.Button,{size:"small",icon:a().createElement(o.StopOutlined,null),disabled:r.protected||!r.enabled,loading:d==="".concat(r.name,":disable")},e("Force disable"))),a().createElement(l.Popconfirm,{title:e("Force remove this plugin?"),description:e("This removes the plugin registry record. Package files are not deleted. Restart or reload is required."),disabled:r.protected,onConfirm:function(){return tP(function(){var n,a,o,i,c;return tR(this,function(u){switch(u.label){case 0:m("".concat(r.name,":remove")),u.label=1;case 1:return u.trys.push([1,4,5,6]),[4,t.request({url:"clusterManagerPlugins:forceRemove",method:"post",data:{name:r.name}})];case 2:return i=u.sent(),l.message.success((null==i||null==(a=i.data)||null==(n=a.data)?void 0:n.message)||(null==i||null==(o=i.data)?void 0:o.message)||e("Plugin force removed")),[4,b()];case 3:return u.sent(),[3,6];case 4:return c=u.sent(),l.message.error(tj(c,e("Failed to force remove plugin"))),[3,6];case 5:return m(null),[7];case 6:return[2]}})})()},okText:e("Force remove"),cancelText:e("Cancel")},a().createElement(l.Button,{size:"small",danger:!0,icon:a().createElement(o.DeleteOutlined,null),disabled:r.protected,loading:d==="".concat(r.name,":remove")},e("Force remove"))))}}];return a().createElement(l.Spin,{spinning:c},a().createElement(l.Space,{direction:"vertical",style:{width:"100%"},size:"middle"},a().createElement(l.Alert,{type:"warning",showIcon:!0,icon:a().createElement(o.ExclamationCircleOutlined,null),message:e("Force operations bypass plugin lifecycle hooks"),description:e("Use this only when the normal plugin manager cannot disable or remove a broken plugin. Restart or reload the app after a successful operation.")}),a().createElement(l.Space,null,a().createElement(l.Button,{icon:a().createElement(o.ReloadOutlined,null),onClick:b},e("Refresh")),a().createElement(l.Input.Search,{allowClear:!0,placeholder:e("Search plugins"),value:f,onChange:function(e){return y(e.target.value)},style:{width:320}})),a().createElement(l.Table,{rowKey:"name",size:"small",dataSource:E,columns:w,pagination:{pageSize:20},scroll:{x:1100}})))}function tM(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function tD(e,t,n,r,a,l,o){try{var i=e[l](o),c=i.value}catch(e){n(e);return}i.done?t(c):Promise.resolve(c).then(r,a)}function tN(e){return function(){var t=this,n=arguments;return new Promise(function(r,a){var l=e.apply(t,n);function o(e){tD(l,r,a,o,i,"next",e)}function i(e){tD(l,r,a,o,i,"throw",e)}o(void 0)})}}function tF(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,a=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var l=[],o=!0,i=!1;try{for(a=a.call(e);!(o=(n=a.next()).done)&&(l.push(n.value),!t||l.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==a.return||a.return()}finally{if(i)throw r}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return tM(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return tM(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function tB(e,t){var n,r,a,l={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},o=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),i=Object.defineProperty;return i(o,"next",{value:c(0)}),i(o,"throw",{value:c(1)}),i(o,"return",{value:c(2)}),"function"==typeof Symbol&&i(o,Symbol.iterator,{value:function(){return this}}),o;function c(i){return function(c){var u=[i,c];if(n)throw TypeError("Generator is already executing.");for(;o&&(o=0,u[0]&&(l=0)),l;)try{if(n=1,r&&(a=2&u[0]?r.return:u[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,u[1])).done)return a;switch(r=0,a&&(u=[2&u[0],a.value]),u[0]){case 0:case 1:a=u;break;case 4:return l.label++,{value:u[1],done:!1};case 5:l.label++,r=u[1],u=[0];continue;case 7:u=l.ops.pop(),l.trys.pop();continue;default:if(!(a=(a=l.trys).length>0&&a[a.length-1])&&(6===u[0]||2===u[0])){l=0;continue}if(3===u[0]&&(!a||u[1]>a[0]&&u[1]<a[3])){l.label=u[1];break}if(6===u[0]&&l.label<a[1]){l.label=a[1],a=u;break}if(a&&l.label<a[2]){l.label=a[2],l.ops.push(u);break}a[2]&&l.ops.pop(),l.trys.pop();continue}u=t.call(e,l)}catch(e){u=[6,e],r=0}finally{n=a=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}var tq=l.Typography.Text;function tL(e){var t;return(null==e?void 0:e.data)&&"object"==((t=e.data)&&"u">typeof Symbol&&t.constructor===Symbol?"symbol":typeof t)&&"data"in e.data?e.data.data:null==e?void 0:e.data}function tU(e,t){var n,r,a,l;return(null==e||null==(l=e.response)||null==(a=l.data)||null==(r=a.errors)||null==(n=r[0])?void 0:n.message)||(null==e?void 0:e.message)||t}function tK(e){var t=Math.max(0,Math.ceil(e/1e3)),n=Math.floor(t/60),r=t%60;return n>0?"".concat(n,"m ").concat(r,"s"):"".concat(r,"s")}function t_(){var e,t,n,c,u=T(),s=(0,i.useApp)().apiClient,d=tF((0,r.useState)(!1),2),m=d[0],p=d[1],f=tF((0,r.useState)(!1),2),y=f[0],g=f[1],h=tF((0,r.useState)(!1),2),v=h[0],b=h[1],E=tF((0,r.useState)(12e4),2),w=E[0],S=E[1],k=tF((0,r.useState)(null),2),C=k[0],x=k[1],O=tF((0,r.useState)(null),2),I=O[0],A=O[1],P=tF((0,r.useState)(null),2),R=P[0],j=P[1],z=tF((0,r.useState)(Date.now()),2),M=z[0],D=z[1],N=!!C||(null==I?void 0:I.status)==="running",F=(null==C?void 0:C.runId)||(null==I?void 0:I.runId),B=(null==R?void 0:R.summary)||(null==I?void 0:I.summary),q=(null==C?void 0:C.deadlineAt)||(null==I?void 0:I.deadlineAt),L=q?Math.max(0,Date.parse(q)-M):0,U=(0,r.useCallback)(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return tN(function(){var t,n,r,a,o;return tB(this,function(i){switch(i.label){case 0:e||p(!0),i.label=1;case 1:return i.trys.push([1,6,7,8]),[4,s.request({url:"clusterManagerDoctor:status"})];case 2:if(x((null==(a=tL(i.sent()))?void 0:a.activeRun)||null),A((null==a?void 0:a.run)||null),!(null==a||null==(t=a.run)?void 0:t.report))return[3,3];return j(a.run.report),[3,5];case 3:if(!(!(null==a?void 0:a.activeRun)&&(null==a||null==(n=a.run)?void 0:n.hasReport)&&(null==a||null==(r=a.run)?void 0:r.runId)))return[3,5];return[4,s.request({url:"clusterManagerDoctor:report",params:{runId:a.run.runId}})];case 4:j((null==(o=tL(i.sent()))?void 0:o.report)||null),i.label=5;case 5:return[3,8];case 6:return i.sent(),l.message.error(u("Failed to load diagnostic status")),[3,8];case 7:return e||p(!1),[7];case 8:return[2]}})})()},[s,u]);(0,r.useEffect)(function(){U()},[U]),(0,r.useEffect)(function(){if(N){var e=setInterval(function(){D(Date.now()),U(!0)},3e3);return function(){return clearInterval(e)}}},[N,U]),(0,r.useEffect)(function(){if(N){var e=setInterval(function(){return D(Date.now())},1e3);return function(){return clearInterval(e)}}},[N]);var K=(null==R||null==(t=R.logAnalysis)?void 0:t.topSignatures)||[],_=(null==R||null==(n=R.logAnalysis)?void 0:n.byNode)||[],W=(0,r.useMemo)(function(){var e;return((null==R||null==(e=R.pluginDiagnostics)?void 0:e.plugins)||[]).filter(function(e){return e.versionDrift||e.loadDrift})},[R]),V=(null==R||null==(c=R.packageDiagnostics)?void 0:c.packageDrifts)||[],H=(null==R?void 0:R.recommendations)||[],Q=[{title:u("Level"),dataIndex:"level",width:90,render:function(e){return a().createElement(l.Tag,{color:"error"===e?"red":"orange"},e)}},{title:u("Count"),dataIndex:"count",width:90},{title:u("Signature"),dataIndex:"signature",render:function(e){return a().createElement(tq,{ellipsis:{tooltip:e}},e)}},{title:u("Nodes"),dataIndex:"nodes",width:220,render:function(e){return(e||[]).slice(0,3).join(", ")}}],G=[{title:u("Node"),dataIndex:"hostname"},{title:u("Role"),dataIndex:"role",width:110},{title:u("Errors"),dataIndex:"levels",width:100,render:function(e){return(null==e?void 0:e.error)||0}},{title:u("Warnings"),dataIndex:"levels",width:110,render:function(e){return(null==e?void 0:e.warn)||0}},{title:u("Log Files"),dataIndex:"files",render:function(e){return(null==e?void 0:e.length)?e.map(function(e){return"".concat(e.file," (").concat(e.lineCount,")")}).join(", "):"-"}}];return a().createElement(l.Space,{direction:"vertical",style:{width:"100%"},size:"middle"},a().createElement(l.Card,{size:"small",title:a().createElement(l.Space,null,a().createElement(o.MedicineBoxOutlined,null),u("Doctor")),extra:a().createElement(l.Button,{icon:a().createElement(o.ReloadOutlined,null),onClick:function(){return U(!1)},loading:m,"aria-label":u("Refresh")},u("Refresh"))},a().createElement(l.Space,{direction:"vertical",style:{width:"100%"}},a().createElement(l.Space,{wrap:!0},a().createElement(l.InputNumber,{min:10,max:120,step:10,value:Math.round(w/1e3),onChange:function(e){return S(1e3*(Number(e)||120))},addonAfter:"s",disabled:N,"aria-label":u("Duration"),style:{width:140}}),a().createElement(l.Button,{type:"primary",icon:a().createElement(o.MedicineBoxOutlined,null),onClick:function(){return tN(function(){var e;return tB(this,function(t){switch(t.label){case 0:g(!0),j(null),t.label=1;case 1:return t.trys.push([1,4,5,6]),[4,s.request({url:"clusterManagerDoctor:start",method:"post",data:{durationMs:w}})];case 2:return x(tL(t.sent())),l.message.success(u("Diagnostic session started")),[4,U(!0)];case 3:return t.sent(),[3,6];case 4:return e=t.sent(),l.message.error(tU(e,u("Failed to start diagnostic session"))),[3,6];case 5:return g(!1),[7];case 6:return[2]}})})()},loading:y,disabled:N},u("Start Doctor")),a().createElement(l.Button,{danger:!0,icon:a().createElement(o.StopOutlined,null),onClick:function(){return tN(function(){var e,t;return tB(this,function(n){switch(n.label){case 0:if(!F)return[2];b(!0),n.label=1;case 1:return n.trys.push([1,3,4,5]),[4,s.request({url:"clusterManagerDoctor:stop",method:"post",data:{runId:F}})];case 2:return e=tL(n.sent()),x(null),A(e||null),j((null==e?void 0:e.report)||null),l.message.success(u("Diagnostic report is ready")),[3,5];case 3:return t=n.sent(),l.message.error(tU(t,u("Failed to stop diagnostic session"))),[3,5];case 4:return b(!1),[7];case 5:return[2]}})})()},loading:v,disabled:!N},u("Stop Doctor")),a().createElement(l.Button,{icon:a().createElement(o.DownloadOutlined,null),onClick:function(){return tN(function(){var e,t,n,r;return tB(this,function(a){switch(a.label){case 0:if(!(e=(null==R?void 0:R.runId)||(null==I?void 0:I.runId)))return[2];a.label=1;case 1:return a.trys.push([1,3,,4]),[4,s.request({url:"clusterManagerDoctor:download",params:{runId:e},responseType:"blob"})];case 2:return t=a.sent(),n=window.URL.createObjectURL(new Blob([t.data],{type:"application/json"})),(r=document.createElement("a")).href=n,r.download="doctor-report-".concat(e,".json"),r.click(),r.remove(),window.URL.revokeObjectURL(n),[3,4];case 3:return a.sent(),l.message.error(u("Failed to download diagnostic report")),[3,4];case 4:return[2]}})})()},disabled:!(null==R?void 0:R.runId)&&!(null==I?void 0:I.hasReport),"aria-label":u("Download Report")},u("Download Report"))),N&&a().createElement("div",null,a().createElement(l.Progress,{percent:(null==I?void 0:I.progress)||5,status:"active"}),a().createElement(tq,{type:"secondary"},u("Running")," - ",tK(L))),(null==I?void 0:I.error)&&a().createElement(l.Alert,{type:"error",showIcon:!0,message:I.error}),I&&a().createElement(l.Descriptions,{size:"small",column:3},a().createElement(l.Descriptions.Item,{label:u("Run ID")},I.runId),a().createElement(l.Descriptions.Item,{label:u("Status")},a().createElement(l.Tag,{color:"healthy"===(e=I.status)||"finished"===e?"green":"critical"===e||"failed"===e?"red":"running"===e?"processing":"orange"},u(I.status))),a().createElement(l.Descriptions.Item,{label:u("Started At")},I.startedAt?new Date(I.startedAt).toLocaleString():"-"),a().createElement(l.Descriptions.Item,{label:u("Finished At")},I.finishedAt?new Date(I.finishedAt).toLocaleString():"-"),a().createElement(l.Descriptions.Item,{label:u("Finish Reason")},I.finishReason||"-"),a().createElement(l.Descriptions.Item,{label:u("Duration")},tK((null==R?void 0:R.durationMs)||I.durationMs))))),B&&a().createElement(l.Row,{gutter:16},a().createElement(l.Col,{span:4},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:u("Report Status"),value:u(B.status),valueStyle:{color:"critical"===B.status?"#cf1322":"warning"===B.status?"#d48806":"#3f8600"}}))),a().createElement(l.Col,{span:4},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:u("Nodes"),value:B.nodes}))),a().createElement(l.Col,{span:4},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:u("Errors"),value:B.errors,valueStyle:{color:B.errors?"#cf1322":void 0}}))),a().createElement(l.Col,{span:4},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:u("Warnings"),value:B.warnings}))),a().createElement(l.Col,{span:4},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:u("Plugin Drift"),value:B.pluginVersionDrifts+B.pluginLoadDrifts}))),a().createElement(l.Col,{span:4},a().createElement(l.Card,{size:"small"},a().createElement(l.Statistic,{title:u("Package Drift"),value:B.packageDrifts})))),H.length>0&&a().createElement(l.Card,{title:a().createElement(l.Space,null,a().createElement(o.WarningOutlined,null),u("Findings")),size:"small"},a().createElement(l.Space,{direction:"vertical",style:{width:"100%"}},H.map(function(e){return a().createElement(l.Alert,{key:e.code,type:"critical"===e.level?"error":"warning",showIcon:!0,message:e.message})}))),R&&a().createElement(a().Fragment,null,a().createElement(l.Card,{title:u("Node Log Distribution"),size:"small"},a().createElement(l.Table,{rowKey:"nodeId",size:"small",pagination:{pageSize:5},dataSource:_,columns:G})),a().createElement(l.Card,{title:u("Top Error Signatures"),size:"small"},a().createElement(l.Table,{rowKey:function(e){return"".concat(e.level,":").concat(e.signature)},size:"small",pagination:{pageSize:5},dataSource:K,columns:Q})),a().createElement(l.Card,{title:u("Plugin Drift"),size:"small"},a().createElement(l.Table,{rowKey:function(e){return e.packageName||e.name},size:"small",pagination:{pageSize:6},dataSource:W,columns:[{title:u("Plugin"),dataIndex:"name"},{title:u("Package"),dataIndex:"packageName"},{title:u("DB Version"),dataIndex:"dbVersion",width:140},{title:u("Runtime Versions"),dataIndex:"runtimeVersions",render:function(e){return(null==e?void 0:e.join(", "))||"-"}},{title:u("Type"),key:"type",width:160,render:function(e,t){return a().createElement(l.Space,{size:4},t.versionDrift&&a().createElement(l.Tag,{color:"orange"},u("Version")),t.loadDrift&&a().createElement(l.Tag,{color:"purple"},u("Loaded")))}}]})),a().createElement(l.Card,{title:u("Package Drift"),size:"small"},a().createElement(l.Table,{rowKey:function(e,t){return e.nodeId||e.hostname||String(t)},size:"small",pagination:{pageSize:6},dataSource:V,columns:[{title:u("Node"),dataIndex:"hostname"},{title:u("Role"),dataIndex:"role",width:110},{title:u("Package Status"),dataIndex:"status",width:140},{title:u("Missing Packages"),dataIndex:"missingPackages",render:function(e){var t,n,r;return((null==e||null==(t=e.apt)?void 0:t.length)||0)+((null==e||null==(n=e.npm)?void 0:n.length)||0)+((null==e||null==(r=e.python)?void 0:r.length)||0)||"-"}}]}))))}function tW(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function tV(e,t,n,r,a,l,o){try{var i=e[l](o),c=i.value}catch(e){n(e);return}i.done?t(c):Promise.resolve(c).then(r,a)}function tH(e){return function(){var t=this,n=arguments;return new Promise(function(r,a){var l=e.apply(t,n);function o(e){tV(l,r,a,o,i,"next",e)}function i(e){tV(l,r,a,o,i,"throw",e)}o(void 0)})}}function tQ(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,a=null==e?null:"u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var l=[],o=!0,i=!1;try{for(a=a.call(e);!(o=(n=a.next()).done)&&(l.push(n.value),!t||l.length!==t);o=!0);}catch(e){i=!0,r=e}finally{try{o||null==a.return||a.return()}finally{if(i)throw r}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return tW(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return tW(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function tG(e,t){var n,r,a,l={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]},o=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),i=Object.defineProperty;return i(o,"next",{value:c(0)}),i(o,"throw",{value:c(1)}),i(o,"return",{value:c(2)}),"function"==typeof Symbol&&i(o,Symbol.iterator,{value:function(){return this}}),o;function c(i){return function(c){var u=[i,c];if(n)throw TypeError("Generator is already executing.");for(;o&&(o=0,u[0]&&(l=0)),l;)try{if(n=1,r&&(a=2&u[0]?r.return:u[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,u[1])).done)return a;switch(r=0,a&&(u=[2&u[0],a.value]),u[0]){case 0:case 1:a=u;break;case 4:return l.label++,{value:u[1],done:!1};case 5:l.label++,r=u[1],u=[0];continue;case 7:u=l.ops.pop(),l.trys.pop();continue;default:if(!(a=(a=l.trys).length>0&&a[a.length-1])&&(6===u[0]||2===u[0])){l=0;continue}if(3===u[0]&&(!a||u[1]>a[0]&&u[1]<a[3])){l.label=u[1];break}if(6===u[0]&&l.label<a[1]){l.label=a[1],a=u;break}if(a&&l.label<a[2]){l.label=a[2],l.ops.push(u);break}a[2]&&l.ops.pop(),l.trys.pop();continue}u=t.call(e,l)}catch(e){u=[6,e],r=0}finally{n=a=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}var tJ=l.Typography.Text;function t$(){var e=T(),t=(0,i.useApp)().apiClient,n=tQ((0,r.useState)(!1),2),c=n[0],u=n[1],s=tQ((0,r.useState)(!1),2),d=s[0],m=s[1],p=tQ((0,r.useState)([]),2),f=p[0],y=p[1],g=tQ((0,r.useState)([]),2),h=g[0],v=g[1],b=tQ((0,r.useState)([]),2),E=b[0],w=b[1],S=tQ((0,r.useState)([]),2),k=S[0],C=S[1],x=(0,r.useCallback)(function(){return tH(function(){var e;return tG(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,t.request({url:"/orchestratorStacks:list",params:{pageSize:50}})];case 1:return C((null==(e=n.sent().data)?void 0:e.data)||[]),[3,3];case 2:return n.sent(),[3,3];case 3:return[2]}})})()},[t]),O=(0,r.useCallback)(function(){return tH(function(){var e;return tG(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,t.request({url:"/workerQueueMappings:list",params:{pageSize:200}})];case 1:return v((null==(e=n.sent().data)?void 0:e.data)||[]),[3,3];case 2:return n.sent(),[3,3];case 3:return[2]}})})()},[t]),I=(0,r.useCallback)(function(){return tH(function(){var e,n,r,a;return tG(this,function(o){switch(o.label){case 0:m(!0),o.label=1;case 1:return o.trys.push([1,3,4,5]),[4,t.request({url:"/workerQueueMappings:scanQueues"})];case 2:return y((r=(null==(e=(n=o.sent()).data)?void 0:e.data)||n.data).discovered||[]),v(r.registered||[]),w(r.unmapped||[]),[3,5];case 3:return a=o.sent(),l.message.error("Scan failed: ".concat(a.message)),[3,5];case 4:return m(!1),[7];case 5:return[2]}})})()},[t]),A=function(e,n){return tH(function(){var r;return tG(this,function(a){switch(a.label){case 0:u(!0),a.label=1;case 1:return a.trys.push([1,4,5,6]),[4,t.request({url:"/workerQueueMappings:update",method:"PUT",params:{filterByTk:e},data:n})];case 2:return a.sent(),[4,O()];case 3:return a.sent(),[3,6];case 4:return r=a.sent(),l.message.error("Update failed: ".concat(r.message)),[3,6];case 5:return u(!1),[7];case 6:return[2]}})})()};(0,r.useEffect)(function(){I(),x()},[I,x]);var P=k.map(function(e){return{value:e.id,label:e.name}}),R=new Map(h.map(function(e){return[e.queueName,e]})),j=f.map(function(e){var t,n,r,a,l,o=R.get(e.name);return t=function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){var r;r=n[t],t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r})}return e}({key:e.name},e),n=n={mappingId:null!=(r=null==o?void 0:o.id)?r:null,registered:!!o,stackId:null!=(a=null==o?void 0:o.stackId)?a:null,enabled:null==(l=null==o?void 0:o.enabled)||l},Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):(function(e){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t.push.apply(t,n)}return t})(Object(n)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))}),t}),z=[{title:e("Queue Name"),dataIndex:"name",render:function(e,t){return a().createElement(l.Space,null,"event-queue"===t.type?a().createElement(o.BranchesOutlined,{style:{color:"#1890ff"}}):a().createElement(o.MinusCircleOutlined,{style:{color:"#52c41a"}}),a().createElement(l.Space,{direction:"vertical",size:0},a().createElement(tJ,{code:!0},e),t.workerProcessName&&t.workerProcessName!==e?a().createElement(tJ,{type:"secondary"},t.workerProcessName):null))}},{title:e("Label"),dataIndex:"label",render:function(e){return a().createElement(tJ,null,e)}},{title:e("Type"),dataIndex:"type",width:110,render:function(e){return a().createElement(l.Tag,{color:"event-queue"===e?"blue":"green"},"event-queue"===e?"EventQueue":"Redis List")}},{title:e("Pending"),dataIndex:"pending",width:80,render:function(e){return null!==e?a().createElement(tJ,null,e):a().createElement(tJ,{type:"secondary"},"-")}},{title:e("Assigned Stack"),dataIndex:"stackId",width:160,render:function(t,n){return n.registered?a().createElement(l.Select,{style:{width:150},size:"small",allowClear:!0,placeholder:e("All (default)"),value:t,options:P,onChange:function(e){return A(n.mappingId,{stackId:null!=e?e:null})}}):a().createElement(tJ,{type:"secondary"},"—")}},{title:e("Enabled"),dataIndex:"enabled",width:80,render:function(e,t){return t.registered?a().createElement(l.Switch,{size:"small",checked:e,onChange:function(e){return A(t.mappingId,{enabled:e})}}):a().createElement(tJ,{type:"secondary"},"—")}},{title:e("Actions"),key:"actions",width:200,render:function(n,r){return r.registered?a().createElement(l.Popconfirm,{title:e("Delete this mapping?"),onConfirm:function(){var e;return e=r.mappingId,tH(function(){var n;return tG(this,function(r){switch(r.label){case 0:u(!0),r.label=1;case 1:return r.trys.push([1,4,5,6]),[4,t.request({url:"/workerQueueMappings:destroy",method:"POST",params:{filterByTk:e}})];case 2:return r.sent(),l.message.success("Mapping deleted"),[4,I()];case 3:return r.sent(),[3,6];case 4:return n=r.sent(),l.message.error("Delete failed: ".concat(n.message)),[3,6];case 5:return u(!1),[7];case 6:return[2]}})})()}},a().createElement(l.Button,{size:"small",type:"link",danger:!0},e("Unregister"))):a().createElement(l.Button,{size:"small",type:"link",icon:a().createElement(o.CheckCircleOutlined,{style:{color:"#52c41a"}}),onClick:function(){return tH(function(){var e;return tG(this,function(n){switch(n.label){case 0:u(!0),n.label=1;case 1:return n.trys.push([1,4,5,6]),[4,t.request({url:"/workerQueueMappings:create",method:"POST",data:{queueName:r.name,label:r.label,description:r.description,type:r.type,stackId:null,enabled:!0}})];case 2:return n.sent(),l.message.success('Mapping created for "'.concat(r.name,'"')),[4,I()];case 3:return n.sent(),[3,6];case 4:return e=n.sent(),l.message.error("Create failed: ".concat(e.message)),[3,6];case 5:return u(!1),[7];case 6:return[2]}})})()}},e("Register"))}}];return a().createElement("div",null,a().createElement(l.Card,{size:"small",style:{marginBottom:16}},a().createElement(l.Row,{justify:"space-between",align:"middle"},a().createElement(l.Col,null,a().createElement(l.Space,null,a().createElement(tJ,{strong:!0},e("Queue Assignment")),a().createElement(tJ,{type:"secondary"},e("Fallback mapping for legacy stacks without explicit Processes / queues.")))),a().createElement(l.Col,null,a().createElement(l.Space,null,a().createElement(l.Button,{icon:a().createElement(o.ScanOutlined,null),onClick:I,loading:d},e("Scan Queues")),E.length>0&&a().createElement(l.Button,{onClick:function(){return tH(function(){var e,n,r,a;return tG(this,function(o){switch(o.label){case 0:u(!0),o.label=1;case 1:return o.trys.push([1,4,5,6]),[4,t.request({url:"/workerQueueMappings:autoMap",method:"POST",data:{}})];case 2:return r=((null==(e=(n=o.sent()).data)?void 0:e.data)||n.data).created,l.message.success("Auto-mapped ".concat(r.length," queue(s)")),[4,I()];case 3:return o.sent(),[3,6];case 4:return a=o.sent(),l.message.error("Auto-map failed: ".concat(a.message)),[3,6];case 5:return u(!1),[7];case 6:return[2]}})})()},loading:c},e("Auto-map ({count})",{count:E.length})),a().createElement(l.Button,{icon:a().createElement(o.ReloadOutlined,null),onClick:function(){I(),x()}},e("Refresh")))))),E.length>0&&a().createElement(l.Alert,{type:"info",showIcon:!0,style:{marginBottom:16},message:"".concat(E.length,' queue(s) discovered but not yet registered. Click "Register" on each row or use "Auto-map" to create mappings.')}),a().createElement(l.Table,{dataSource:j,columns:z,rowKey:"key",size:"small",pagination:!1,locale:{emptyText:e('No queues discovered. Click "Scan Queues" to detect registered queues.')}}))}function tY(){var e=T();return a().createElement("div",{style:{padding:24}},a().createElement(l.Tabs,{defaultActiveKey:"cluster",items:[{key:"cluster",label:e("Cluster Nodes"),children:a().createElement(ec,null)},{key:"tasks",label:e("Async Tasks"),children:a().createElement(v,null)},{key:"executions",label:e("Workflow Executions"),children:a().createElement(P,null)},{key:"cache",label:e("Cache Monitor"),children:a().createElement(e$,null)},{key:"orchestrator",label:e("Container Orchestrator"),children:a().createElement(ts,null)},{key:"packages",label:e("Packages"),children:a().createElement(tO,null)},{key:"plugins",label:e("Plugins"),children:a().createElement(tz,null)},{key:"doctor",label:e("Doctor"),children:a().createElement(t_,null)},{key:"queues",label:e("Queue Assignment"),children:a().createElement(t$,null)}]}))}}}]);
@@ -7,4 +7,4 @@
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
9
 
10
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@nocobase/client-v2"),require("dayjs"),require("react"),require("antd"),require("@ant-design/icons")):"function"==typeof define&&define.amd?define("plugin-cluster-manager/client-v2",["@nocobase/client-v2","dayjs","react","antd","@ant-design/icons"],t):"object"==typeof exports?exports["plugin-cluster-manager/client-v2"]=t(require("@nocobase/client-v2"),require("dayjs"),require("react"),require("antd"),require("@ant-design/icons")):e["plugin-cluster-manager/client-v2"]=t(e["@nocobase/client-v2"],e.dayjs,e.react,e.antd,e["@ant-design/icons"])}(self,function(e,t,n,r,o){return function(){"use strict";var i,u,a,c={375:function(e){e.exports=o},485:function(t){t.exports=e},59:function(e){e.exports=r},185:function(e){e.exports=t},155:function(e){e.exports=n}},l={};function s(e){var t=l[e];if(void 0!==t)return t.exports;var n=l[e]={exports:{}};return c[e](n,n.exports,s),n.exports}s.m=c,s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,{a:t}),t},s.d=function(e,t){for(var n in t)s.o(t,n)&&!s.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},s.f={},s.e=function(e){return Promise.all(Object.keys(s.f).reduce(function(t,n){return s.f[n](e,t),t},[]))},s.u=function(e){return""+e+".c0bce51908fd81d7.js"},s.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},f={},s.l=function(e,t,n,r){if(f[e])return void f[e].push(t);if(void 0!==n)for(var o,i,u=document.getElementsByTagName("script"),a=0;a<u.length;a++){var c=u[a];if(c.getAttribute("src")==e||c.getAttribute("data-rspack")=="plugin-cluster-manager/client-v2:"+n){o=c;break}}o||(i=!0,(o=document.createElement("script")).timeout=120,s.nc&&o.setAttribute("nonce",s.nc),o.setAttribute("data-rspack","plugin-cluster-manager/client-v2:"+n),o.src=e),f[e]=[t];var l=function(t,n){o.onerror=o.onload=null,clearTimeout(p);var r=f[e];if(delete f[e],o.parentNode&&o.parentNode.removeChild(o),r&&r.forEach(function(e){return e(n)}),t)return t(n)},p=setTimeout(l.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=l.bind(null,o.onerror),o.onload=l.bind(null,o.onload),i&&document.head.appendChild(o)},s.r=function(e){"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.g.importScripts&&(p=s.g.location+"");var f,p,d=s.g.document;if(!p&&d&&(d.currentScript&&"SCRIPT"===d.currentScript.tagName.toUpperCase()&&(p=d.currentScript.src),!p)){var b=d.getElementsByTagName("script");if(b.length)for(var g=b.length-1;g>-1&&(!p||!/^http(s?):/.test(p));)p=b[g--].src}if(!p)throw Error("Automatic publicPath is not supported in this browser");s.p=p.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),i={889:0},s.f.j=function(e,t){var n=s.o(i,e)?i[e]:void 0;if(0!==n)if(n)t.push(n[2]);else{var r=new Promise(function(t,r){n=i[e]=[t,r]});t.push(n[2]=r);var o=s.p+s.u(e),u=Error();s.l(o,function(t){if(s.o(i,e)&&(0!==(n=i[e])&&(i[e]=void 0),n)){var r=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;u.message="Loading chunk "+e+" failed.\n("+r+": "+o+")",u.name="ChunkLoadError",u.type=r,u.request=o,n[1](u)}},"chunk-"+e,e)}},u=function(e,t){var n,r,o=t[0],u=t[1],a=t[2],c=0;if(o.some(function(e){return 0!==i[e]})){for(n in u)s.o(u,n)&&(s.m[n]=u[n]);a&&a(s)}for(e&&e(t);c<o.length;c++)r=o[c],s.o(i,r)&&i[r]&&i[r][0](),i[r]=0},(a=self.webpackChunkplugin_cluster_manager_client_v2=self.webpackChunkplugin_cluster_manager_client_v2||[]).forEach(u.bind(null,0)),a.push=u.bind(null,a.push.bind(a));var v={};return!function(){var e="",t="u">typeof document?document.currentScript:null;if(t&&t.src&&(e=t.src.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/")),!e){var n=window.__webpack_public_path__||"";n&&("/"!==n.charAt(n.length-1)&&(n+="/"),e=n+"static/plugins/plugin-cluster-manager/dist/client-v2/")}if(!e){var r=window.__nocobase_modern_client_prefix__||"v",o="/"+(r=String(r).replace(/^\/+|\/+$/g,"")||"v")+"/";if(!(e=window.__nocobase_public_path__||"")&&window.location&&window.location.pathname){var i=window.location.pathname||"/",u=i.indexOf(o);e=u>=0?i.slice(0,u+1):"/"}e&&(e=e.replace(RegExp("/"+r+"/?$"),"/")),e||(e="/"),"/"!==e.charAt(e.length-1)&&(e+="/"),e+="static/plugins/plugin-cluster-manager/dist/client-v2/"}s.p=e}(),!function(){s.r(v),s.d(v,{default:function(){return a}});var e=s(485);function t(e,t,n,r,o,i,u){try{var a=e[i](u),c=a.value}catch(e){n(e);return}a.done?t(c):Promise.resolve(c).then(r,o)}function n(e,t,r){return(n=u()?Reflect.construct:function(e,t,n){var r=[null];r.push.apply(r,t);var i=new(Function.bind.apply(e,r));return n&&o(i,n.prototype),i}).apply(null,arguments)}s(155);function r(e){return(r=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function o(e,t){return(o=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function i(e){var t="function"==typeof Map?new Map:void 0;return(i=function(e){if(null===e||-1===Function.toString.call(e).indexOf("[native code]"))return e;if("function"!=typeof e)throw TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,i)}function i(){return n(e,arguments,r(this).constructor)}return i.prototype=Object.create(e.prototype,{constructor:{value:i,enumerable:!1,writable:!0,configurable:!0}}),o(i,e)})(e)}function u(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(u=function(){return!!e})()}var a=function(e){var n;if("function"!=typeof e&&null!==e)throw TypeError("Super expression must either be null or a function");function i(){var e,t;if(!(this instanceof i))throw TypeError("Cannot call a class as a function");return e=i,t=arguments,e=r(e),function(e,t){var n;if(t&&("object"==((n=t)&&"u">typeof Symbol&&n.constructor===Symbol?"symbol":typeof n)||"function"==typeof t))return t;if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this,u()?Reflect.construct(e,t||[],r(this).constructor):e.apply(this,t))}return i.prototype=Object.create(e&&e.prototype,{constructor:{value:i,writable:!0,configurable:!0}}),e&&o(i,e),n=[{key:"load",value:function(){var e;return(e=function(){return function(e,t){var n,r,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},u=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),a=Object.defineProperty;return a(u,"next",{value:c(0)}),a(u,"throw",{value:c(1)}),a(u,"return",{value:c(2)}),"function"==typeof Symbol&&a(u,Symbol.iterator,{value:function(){return this}}),u;function c(a){return function(c){var l=[a,c];if(n)throw TypeError("Generator is already executing.");for(;u&&(u=0,l[0]&&(i=0)),i;)try{if(n=1,r&&(o=2&l[0]?r.return:l[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,l[1])).done)return o;switch(r=0,o&&(l=[2&l[0],o.value]),l[0]){case 0:case 1:o=l;break;case 4:return i.label++,{value:l[1],done:!1};case 5:i.label++,r=l[1],l=[0];continue;case 7:l=i.ops.pop(),i.trys.pop();continue;default:if(!(o=(o=i.trys).length>0&&o[o.length-1])&&(6===l[0]||2===l[0])){i=0;continue}if(3===l[0]&&(!o||l[1]>o[0]&&l[1]<o[3])){i.label=l[1];break}if(6===l[0]&&i.label<o[1]){i.label=o[1],o=l;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(l);break}o[2]&&i.ops.pop(),i.trys.pop();continue}l=t.call(e,i)}catch(e){l=[6,e],r=0}finally{n=o=0}if(5&l[0])throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}}}(this,function(e){return this.pluginSettingsManager.addMenuItem({key:"plugin-cluster-manager",title:this.t("Cluster Manager"),icon:"DashboardOutlined"}),this.pluginSettingsManager.addPageTabItem({menuKey:"plugin-cluster-manager",key:"index",title:this.t("Cluster Manager"),componentLoader:function(){return s.e("914").then(s.bind(s,321)).then(function(e){return{default:e.ClusterManagerLayout}})}}),[2]})},function(){var n=this,r=arguments;return new Promise(function(o,i){var u=e.apply(n,r);function a(e){t(u,o,i,a,c,"next",e)}function c(e){t(u,o,i,a,c,"throw",e)}a(void 0)})}).call(this)}}],function(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(i.prototype,n),i}(i(e.Plugin))}(),v}()});
10
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@nocobase/client-v2"),require("dayjs"),require("react"),require("antd"),require("@ant-design/icons")):"function"==typeof define&&define.amd?define("plugin-cluster-manager/client-v2",["@nocobase/client-v2","dayjs","react","antd","@ant-design/icons"],t):"object"==typeof exports?exports["plugin-cluster-manager/client-v2"]=t(require("@nocobase/client-v2"),require("dayjs"),require("react"),require("antd"),require("@ant-design/icons")):e["plugin-cluster-manager/client-v2"]=t(e["@nocobase/client-v2"],e.dayjs,e.react,e.antd,e["@ant-design/icons"])}(self,function(e,t,n,r,o){return function(){"use strict";var i,u,a,c={375:function(e){e.exports=o},485:function(t){t.exports=e},59:function(e){e.exports=r},185:function(e){e.exports=t},155:function(e){e.exports=n}},l={};function s(e){var t=l[e];if(void 0!==t)return t.exports;var n=l[e]={exports:{}};return c[e](n,n.exports,s),n.exports}s.m=c,s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,{a:t}),t},s.d=function(e,t){for(var n in t)s.o(t,n)&&!s.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},s.f={},s.e=function(e){return Promise.all(Object.keys(s.f).reduce(function(t,n){return s.f[n](e,t),t},[]))},s.u=function(e){return""+e+".cd1d86e85a50088e.js"},s.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},f={},s.l=function(e,t,n,r){if(f[e])return void f[e].push(t);if(void 0!==n)for(var o,i,u=document.getElementsByTagName("script"),a=0;a<u.length;a++){var c=u[a];if(c.getAttribute("src")==e||c.getAttribute("data-rspack")=="plugin-cluster-manager/client-v2:"+n){o=c;break}}o||(i=!0,(o=document.createElement("script")).timeout=120,s.nc&&o.setAttribute("nonce",s.nc),o.setAttribute("data-rspack","plugin-cluster-manager/client-v2:"+n),o.src=e),f[e]=[t];var l=function(t,n){o.onerror=o.onload=null,clearTimeout(p);var r=f[e];if(delete f[e],o.parentNode&&o.parentNode.removeChild(o),r&&r.forEach(function(e){return e(n)}),t)return t(n)},p=setTimeout(l.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=l.bind(null,o.onerror),o.onload=l.bind(null,o.onload),i&&document.head.appendChild(o)},s.r=function(e){"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.g.importScripts&&(p=s.g.location+"");var f,p,d=s.g.document;if(!p&&d&&(d.currentScript&&"SCRIPT"===d.currentScript.tagName.toUpperCase()&&(p=d.currentScript.src),!p)){var b=d.getElementsByTagName("script");if(b.length)for(var g=b.length-1;g>-1&&(!p||!/^http(s?):/.test(p));)p=b[g--].src}if(!p)throw Error("Automatic publicPath is not supported in this browser");s.p=p.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),i={889:0},s.f.j=function(e,t){var n=s.o(i,e)?i[e]:void 0;if(0!==n)if(n)t.push(n[2]);else{var r=new Promise(function(t,r){n=i[e]=[t,r]});t.push(n[2]=r);var o=s.p+s.u(e),u=Error();s.l(o,function(t){if(s.o(i,e)&&(0!==(n=i[e])&&(i[e]=void 0),n)){var r=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;u.message="Loading chunk "+e+" failed.\n("+r+": "+o+")",u.name="ChunkLoadError",u.type=r,u.request=o,n[1](u)}},"chunk-"+e,e)}},u=function(e,t){var n,r,o=t[0],u=t[1],a=t[2],c=0;if(o.some(function(e){return 0!==i[e]})){for(n in u)s.o(u,n)&&(s.m[n]=u[n]);a&&a(s)}for(e&&e(t);c<o.length;c++)r=o[c],s.o(i,r)&&i[r]&&i[r][0](),i[r]=0},(a=self.webpackChunkplugin_cluster_manager_client_v2=self.webpackChunkplugin_cluster_manager_client_v2||[]).forEach(u.bind(null,0)),a.push=u.bind(null,a.push.bind(a));var v={};return!function(){var e="",t="u">typeof document?document.currentScript:null;if(t&&t.src){var n=t.src.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"");n.indexOf("/static/plugins/plugin-cluster-manager/dist/client-v2/")>=0&&(e=n.replace(/\/[^\/]+$/,"/"))}if(!e){var r=window.__webpack_public_path__||"";r&&("/"!==r.charAt(r.length-1)&&(r+="/"),e=r+"static/plugins/plugin-cluster-manager/dist/client-v2/")}if(!e){var o=window.__nocobase_modern_client_prefix__||"v",i="/"+(o=String(o).replace(/^\/+|\/+$/g,"")||"v")+"/";if(!(e=window.__nocobase_public_path__||"")&&window.location&&window.location.pathname){var u=window.location.pathname||"/",a=u.indexOf(i);e=a>=0?u.slice(0,a+1):"/"}e&&(e=e.replace(RegExp("/"+o+"/?$"),"/")),e||(e="/"),"/"!==e.charAt(e.length-1)&&(e+="/"),e+="static/plugins/plugin-cluster-manager/dist/client-v2/"}s.p=e}(),!function(){s.r(v),s.d(v,{default:function(){return a}});var e=s(485);function t(e,t,n,r,o,i,u){try{var a=e[i](u),c=a.value}catch(e){n(e);return}a.done?t(c):Promise.resolve(c).then(r,o)}function n(e,t,r){return(n=u()?Reflect.construct:function(e,t,n){var r=[null];r.push.apply(r,t);var i=new(Function.bind.apply(e,r));return n&&o(i,n.prototype),i}).apply(null,arguments)}s(155);function r(e){return(r=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function o(e,t){return(o=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function i(e){var t="function"==typeof Map?new Map:void 0;return(i=function(e){if(null===e||-1===Function.toString.call(e).indexOf("[native code]"))return e;if("function"!=typeof e)throw TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,i)}function i(){return n(e,arguments,r(this).constructor)}return i.prototype=Object.create(e.prototype,{constructor:{value:i,enumerable:!1,writable:!0,configurable:!0}}),o(i,e)})(e)}function u(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(u=function(){return!!e})()}var a=function(e){var n;if("function"!=typeof e&&null!==e)throw TypeError("Super expression must either be null or a function");function i(){var e,t;if(!(this instanceof i))throw TypeError("Cannot call a class as a function");return e=i,t=arguments,e=r(e),function(e,t){var n;if(t&&("object"==((n=t)&&"u">typeof Symbol&&n.constructor===Symbol?"symbol":typeof n)||"function"==typeof t))return t;if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this,u()?Reflect.construct(e,t||[],r(this).constructor):e.apply(this,t))}return i.prototype=Object.create(e&&e.prototype,{constructor:{value:i,writable:!0,configurable:!0}}),e&&o(i,e),n=[{key:"load",value:function(){var e;return(e=function(){return function(e,t){var n,r,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},u=Object.create(("function"==typeof Iterator?Iterator:Object).prototype),a=Object.defineProperty;return a(u,"next",{value:c(0)}),a(u,"throw",{value:c(1)}),a(u,"return",{value:c(2)}),"function"==typeof Symbol&&a(u,Symbol.iterator,{value:function(){return this}}),u;function c(a){return function(c){var l=[a,c];if(n)throw TypeError("Generator is already executing.");for(;u&&(u=0,l[0]&&(i=0)),i;)try{if(n=1,r&&(o=2&l[0]?r.return:l[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,l[1])).done)return o;switch(r=0,o&&(l=[2&l[0],o.value]),l[0]){case 0:case 1:o=l;break;case 4:return i.label++,{value:l[1],done:!1};case 5:i.label++,r=l[1],l=[0];continue;case 7:l=i.ops.pop(),i.trys.pop();continue;default:if(!(o=(o=i.trys).length>0&&o[o.length-1])&&(6===l[0]||2===l[0])){i=0;continue}if(3===l[0]&&(!o||l[1]>o[0]&&l[1]<o[3])){i.label=l[1];break}if(6===l[0]&&i.label<o[1]){i.label=o[1],o=l;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(l);break}o[2]&&i.ops.pop(),i.trys.pop();continue}l=t.call(e,i)}catch(e){l=[6,e],r=0}finally{n=o=0}if(5&l[0])throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}}}(this,function(e){return this.pluginSettingsManager.addMenuItem({key:"plugin-cluster-manager",title:this.t("Cluster Manager"),icon:"DashboardOutlined"}),this.pluginSettingsManager.addPageTabItem({menuKey:"plugin-cluster-manager",key:"index",title:this.t("Cluster Manager"),componentLoader:function(){return s.e("376").then(s.bind(s,315)).then(function(e){return{default:e.ClusterManagerLayout}})}}),[2]})},function(){var n=this,r=arguments;return new Promise(function(o,i){var u=e.apply(n,r);function a(e){t(u,o,i,a,c,"next",e)}function c(e){t(u,o,i,a,c,"throw",e)}a(void 0)})}).call(this)}}],function(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(i.prototype,n),i}(i(e.Plugin))}(),v}()});
@@ -11,11 +11,11 @@ module.exports = {
11
11
  "react": "18.2.0",
12
12
  "antd": "5.24.2",
13
13
  "@ant-design/icons": "5.6.1",
14
- "@nocobase/client-v2": "2.1.6",
15
- "@nocobase/client": "2.1.6",
14
+ "@nocobase/client-v2": "2.1.9",
15
+ "@nocobase/client": "2.1.9",
16
16
  "dayjs": "1.11.13",
17
- "@nocobase/server": "2.1.6",
18
- "@nocobase/actions": "2.1.6",
19
- "@nocobase/lock-manager": "2.1.6",
20
- "@nocobase/database": "2.1.6"
17
+ "@nocobase/server": "2.1.9",
18
+ "@nocobase/actions": "2.1.9",
19
+ "@nocobase/lock-manager": "2.1.9",
20
+ "@nocobase/database": "2.1.9"
21
21
  };
@@ -188,10 +188,16 @@
188
188
  "Package": "Package",
189
189
  "DB Version": "DB Version",
190
190
  "Runtime Versions": "Runtime Versions",
191
- "Queue Assignment": "Queue Assignment",
192
- "Queue Name": "Queue Name",
193
- "Map queues to worker stacks. Unassigned queues run on all workers.": "Map queues to worker stacks. Unassigned queues run on all workers.",
194
- "Scan Queues": "Scan Queues",
191
+ "Queue Assignment": "Queue Assignment",
192
+ "Queue Name": "Queue Name",
193
+ "Map queues to worker stacks. Unassigned queues run on all workers.": "Map queues to worker stacks. Unassigned queues run on all workers.",
194
+ "Fallback mapping for legacy stacks without explicit Processes / queues.": "Fallback mapping for legacy stacks without explicit Processes / queues.",
195
+ "Processes / queues": "Processes / queues",
196
+ "Saved as WORKER_MODE. Use tags for custom process keys that are not discovered yet.": "Saved as WORKER_MODE. Use tags for custom process keys that are not discovered yet.",
197
+ "Select at least one process or queue": "Select at least one process or queue",
198
+ "WORKER_MODE=* makes this stack consume every queue. Prefer explicit queues in HA.": "WORKER_MODE=* makes this stack consume every queue. Prefer explicit queues in HA.",
199
+ "WORKER_MODE is managed by Processes / queues above.": "WORKER_MODE is managed by Processes / queues above.",
200
+ "Scan Queues": "Scan Queues",
195
201
  "Auto-map ({count})": "Auto-map ({count})",
196
202
  "Register": "Register",
197
203
  "Unregister": "Unregister",
@@ -201,5 +207,9 @@
201
207
  "No queues discovered. Click \"Scan Queues\" to detect registered queues.": "No queues discovered. Click \"Scan Queues\" to detect registered queues.",
202
208
  "Auto-mapped {count} queue(s)": "Auto-mapped {count} queue(s)",
203
209
  "Queue Assignment updated": "Queue Assignment updated",
204
- "Unassigned (worker runs all queues)": "Unassigned (worker runs all queues)"
205
- }
210
+ "Unassigned (worker runs all queues)": "Unassigned (worker runs all queues)",
211
+ "Cluster registry has no worker heartbeats": "Cluster registry has no worker heartbeats",
212
+ "Cluster registry Redis is not configured": "Cluster registry Redis is not configured",
213
+ "Cluster Nodes reads Redis heartbeats, not the container runtime. Check worker boot, plugin-cluster-manager, and shared Redis configuration.": "Cluster Nodes reads Redis heartbeats, not the container runtime. Check worker boot, plugin-cluster-manager, and shared Redis configuration.",
214
+ "Set REDIS_URL or CLUSTER_MANAGER_REDIS_URL on every app and worker to enable cluster node discovery.": "Set REDIS_URL or CLUSTER_MANAGER_REDIS_URL on every app and worker to enable cluster node discovery."
215
+ }