tide-commander 1.216.0 → 1.217.0
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.
- package/CHANGELOG.md +18 -0
- package/dist/assets/{AudioPlayer-Chu8I0tg.js → AudioPlayer-wYzUPbI7.js} +1 -1
- package/dist/assets/{BossLogsModal-DR0ejza7.js → BossLogsModal-CmZNDIpu.js} +1 -1
- package/dist/assets/{BossSpawnModal-LqXBwD2F.js → BossSpawnModal-DtVfSG5G.js} +1 -1
- package/dist/assets/{ControlsModal-BItvxY7x.js → ControlsModal-C0tQf4xy.js} +1 -1
- package/dist/assets/{DockerLogsModal-DfR1XadQ.js → DockerLogsModal-DL_eRO-m.js} +1 -1
- package/dist/assets/{EmbeddedEditor-dMOVrrnl.js → EmbeddedEditor-DAr7_QUH.js} +1 -1
- package/dist/assets/{FcStdViewer-CXDb_hmK.js → FcStdViewer-MDGJiz2T.js} +1 -1
- package/dist/assets/{GcodeViewer-BJGaDLF8.js → GcodeViewer-BHVydtrp.js} +1 -1
- package/dist/assets/{GlbViewer-CrLi0LWd.js → GlbViewer-Bwr_Tayz.js} +1 -1
- package/dist/assets/{GmailOAuthSetup-CzinZ6aZ.js → GmailOAuthSetup-D_uF2cyB.js} +1 -1
- package/dist/assets/{GoogleOAuthSetup-DhVaIj11.js → GoogleOAuthSetup-BCmzQl5e.js} +1 -1
- package/dist/assets/{IframeModal-NJJxvrBg.js → IframeModal-CQmCu_P4.js} +1 -1
- package/dist/assets/{IntegrationsPanel-DDht5-zS.js → IntegrationsPanel-BmRLC7dz.js} +2 -2
- package/dist/assets/{LogViewerModal-DobAgsRk.js → LogViewerModal-CrnaI78u.js} +1 -1
- package/dist/assets/{MonitoringModal-ugppuuGW.js → MonitoringModal-C6J4g3Jf.js} +1 -1
- package/dist/assets/{PM2LogsModal-C28LrhXo.js → PM2LogsModal-Ds3dRnuE.js} +1 -1
- package/dist/assets/{PluginsPanel-BrllpLPF.js → PluginsPanel-BWG2NKdJ.js} +1 -1
- package/dist/assets/{RestoreArchivedAreaModal-DUjvqOIA.js → RestoreArchivedAreaModal-BNccBE4Z.js} +1 -1
- package/dist/assets/{Scene2DCanvas-IHlXkbK5.js → Scene2DCanvas-CPvMvm9m.js} +1 -1
- package/dist/assets/{SceneManager-BzRqBmgj.js → SceneManager-lb8uiOCO.js} +1 -1
- package/dist/assets/{SkillsPanel-B7ePWL4w.js → SkillsPanel-BTO2Ow7t.js} +1 -1
- package/dist/assets/{SlackMultiInstanceSetup-bpmQ5yCA.js → SlackMultiInstanceSetup-Da_GWe5W.js} +1 -1
- package/dist/assets/{SpawnModal-Bu7udoPb.js → SpawnModal-JbFRYxZa.js} +1 -1
- package/dist/assets/{StatisticsModal-teyupFGW.js → StatisticsModal-ChSnL5yu.js} +1 -1
- package/dist/assets/{StlViewer-DTuw4IoN.js → StlViewer-BFr-I14v.js} +1 -1
- package/dist/assets/{SubordinateAssignmentModal-De7mzS6q.js → SubordinateAssignmentModal-DchdwFLE.js} +1 -1
- package/dist/assets/{ThreeAreaSelector-B4FdXGTQ.js → ThreeAreaSelector-D18G4udc.js} +1 -1
- package/dist/assets/{ThreeViewShortcuts-C50gwWcg.js → ThreeViewShortcuts-vNiMNFPJ.js} +1 -1
- package/dist/assets/{TriggerManagerPanel-NhdLnKIE.js → TriggerManagerPanel-DjpLl7cf.js} +1 -1
- package/dist/assets/{VideoPlayer-DR13OKH9.js → VideoPlayer-Drj9r9Dx.js} +1 -1
- package/dist/assets/{WorkflowEditorPanel-HR2fDtcS.js → WorkflowEditorPanel-DLwkYQ8M.js} +1 -1
- package/dist/assets/{abnfDiagram-VRR7QNED-Q73b9mfz.js → abnfDiagram-VRR7QNED-BVuUyMTx.js} +1 -1
- package/dist/assets/{arc-CVKFmkgP.js → arc-_phD079o.js} +1 -1
- package/dist/assets/{architectureDiagram-ZJ3FMSHR-Bbf_Qcjn.js → architectureDiagram-ZJ3FMSHR-B7fAK4WF.js} +1 -1
- package/dist/assets/{area-logos-gYv8s8T3.js → area-logos-RCA-q_Vf.js} +1 -1
- package/dist/assets/{blockDiagram-677ZJIJ3-DaheCa8j.js → blockDiagram-677ZJIJ3-C-OlY0-3.js} +1 -1
- package/dist/assets/{c4Diagram-LMCZKHZV-UZ1L_YBs.js → c4Diagram-LMCZKHZV-DrwXTZgK.js} +1 -1
- package/dist/assets/channel-BWg1ErwG.js +1 -0
- package/dist/assets/{chunk-2Q5K7J3B-D8YOZZA-.js → chunk-2Q5K7J3B-DCcJNg3d.js} +1 -1
- package/dist/assets/{chunk-32BRIVSS-BQmKdeF2.js → chunk-32BRIVSS-CZZkOSIs.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-CT5m9OBR.js → chunk-5VM5RSS4-BCFrP-q5.js} +1 -1
- package/dist/assets/{chunk-EX3LRPZG-BwQ_dYOl.js → chunk-EX3LRPZG-Bjnq5732.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-DVPlE4Zc.js → chunk-JWPE2WC7-CPjRN_WZ.js} +1 -1
- package/dist/assets/{chunk-MOJQB5TN-DGrSLKap.js → chunk-MOJQB5TN-B6jVWpSe.js} +1 -1
- package/dist/assets/{chunk-RYQCIY6F-BGpC2Lvw.js → chunk-RYQCIY6F-0QrHhHTV.js} +1 -1
- package/dist/assets/{chunk-V7JOEXUC-T5kHrm0m.js → chunk-V7JOEXUC-DwLSEIop.js} +1 -1
- package/dist/assets/{chunk-VR4S4FIN-DsjgCLci.js → chunk-VR4S4FIN-R-sa6MjG.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-CeisNHDz.js → chunk-XXDRQBXY-FuYmcHPd.js} +1 -1
- package/dist/assets/classDiagram-OUVF2IWQ-Cdy8Clus.js +1 -0
- package/dist/assets/classDiagram-v2-EOCWNBFH-Cdy8Clus.js +1 -0
- package/dist/assets/{cose-bilkent-JH36ORCC-DGc7pmnL.js → cose-bilkent-JH36ORCC-CvD5NdQ_.js} +1 -1
- package/dist/assets/{cynefin-VYW2F7L2-B4WOzgxr.js → cynefin-VYW2F7L2-C8_VnooS.js} +1 -1
- package/dist/assets/{cynefinDiagram-TSTJHNR4-C_DBldqW.js → cynefinDiagram-TSTJHNR4-SD_F8ul6.js} +1 -1
- package/dist/assets/{dagre-VKFMJZFB-CLbdjSVi.js → dagre-VKFMJZFB-Cpeo3cpw.js} +1 -1
- package/dist/assets/{diagram-FQU43EPY-rFdDLhQC.js → diagram-FQU43EPY-DsBnlRvM.js} +1 -1
- package/dist/assets/{diagram-G47NLZAW-B7IY4xJj.js → diagram-G47NLZAW-BHMRe5db.js} +1 -1
- package/dist/assets/{diagram-NH7WQ7WH-Dffo88fG.js → diagram-NH7WQ7WH-D8Rm6qlg.js} +1 -1
- package/dist/assets/{diagram-OA4YK3LP-CI24r0oP.js → diagram-OA4YK3LP-C4Svb0Zw.js} +1 -1
- package/dist/assets/{diagram-WEI45ONY-CpYaSMOz.js → diagram-WEI45ONY-BbFXrI2b.js} +1 -1
- package/dist/assets/{ebnfDiagram-CCIWWBDH-CVE6IpE1.js → ebnfDiagram-CCIWWBDH-CCBonTYH.js} +1 -1
- package/dist/assets/{erDiagram-Q63AITRT-BfedFNid.js → erDiagram-Q63AITRT-CGGw9uIx.js} +1 -1
- package/dist/assets/{flowDiagram-23GEKE2U-BMSNxq_P.js → flowDiagram-23GEKE2U-DWxHXzyo.js} +1 -1
- package/dist/assets/{ganttDiagram-NO4QXBWP-CFmNsZuP.js → ganttDiagram-NO4QXBWP-D74TSIvX.js} +1 -1
- package/dist/assets/{gitGraphDiagram-IHSO6WYX-BPZCZyak.js → gitGraphDiagram-IHSO6WYX-Cwv5rBxw.js} +1 -1
- package/dist/assets/{index-CE74eZqz.js → index-6lLWOBQK.js} +1 -1
- package/dist/assets/{index-DAKI-8ry.js → index-B9rURqfo.js} +1 -1
- package/dist/assets/{index-DYtuoGp_.js → index-BMXP1Yd8.js} +3 -3
- package/dist/assets/{index-DbOvHwxP.js → index-BZztJf0b.js} +1 -1
- package/dist/assets/{index-BZPSXTAd.js → index-D-5PhYjN.js} +1 -1
- package/dist/assets/{index-CHl4bmrT.js → index-DOcVAWbZ.js} +1 -1
- package/dist/assets/{index-DjYjfA28.js → index-DW1gJ5Cs.js} +1 -1
- package/dist/assets/{index-DKoidOEn.js → index-DrIXfMcD.js} +1 -1
- package/dist/assets/{index-BRdYSHCt.js → index-s33Ke8oj.js} +2 -2
- package/dist/assets/{infoDiagram-FWYZ7A6U-i4zJwolP.js → infoDiagram-FWYZ7A6U-VSfMHDx9.js} +1 -1
- package/dist/assets/{ishikawaDiagram-FXEZZL3T-Mx_Omxks.js → ishikawaDiagram-FXEZZL3T-CgWr16Qr.js} +1 -1
- package/dist/assets/{journeyDiagram-5HDEW3XC-3Rokfnmf.js → journeyDiagram-5HDEW3XC-Bv4ioJyG.js} +1 -1
- package/dist/assets/{kanban-definition-HUTT4EX6-CEPx7BrA.js → kanban-definition-HUTT4EX6-DsUoZOQz.js} +1 -1
- package/dist/assets/{linear-DNXvsxYb.js → linear-_3oDVafz.js} +1 -1
- package/dist/assets/{main-BBvM-_Ia.js → main-BKRg0DBA.js} +160 -160
- package/dist/assets/{mermaid.core-0qDPsI0T.js → mermaid.core-spKo10MG.js} +4 -4
- package/dist/assets/{mindmap-definition-LN4V7U3C-DwCHykip.js → mindmap-definition-LN4V7U3C-C6uCJ4IN.js} +1 -1
- package/dist/assets/{pegDiagram-2B236MQR-DO7OR5bN.js → pegDiagram-2B236MQR-BTIBB-Uw.js} +1 -1
- package/dist/assets/{pieDiagram-ENE6RG2P--1xKfxMr.js → pieDiagram-ENE6RG2P-D7oP-ve7.js} +1 -1
- package/dist/assets/{quadrantDiagram-ABIIQ3AL-rBNhtAik.js → quadrantDiagram-ABIIQ3AL-BfmcdARc.js} +1 -1
- package/dist/assets/{railroadDiagram-RFXS5EU6-Bh0AsgK_.js → railroadDiagram-RFXS5EU6-CplgjUu4.js} +1 -1
- package/dist/assets/{requirementDiagram-TGXJPOKE-2oc4ih2c.js → requirementDiagram-TGXJPOKE-BiRTuy5B.js} +1 -1
- package/dist/assets/{sankeyDiagram-HTMAVEWB-B-ysEqL4.js → sankeyDiagram-HTMAVEWB-C81HtBjy.js} +1 -1
- package/dist/assets/{sequenceDiagram-DBY2YBRQ-6kNR0UNq.js → sequenceDiagram-DBY2YBRQ-DFhPtqpN.js} +1 -1
- package/dist/assets/{sizeCapture-X5ZJPWSS-C6PbumMD.js → sizeCapture-X5ZJPWSS-BkT4qJkY.js} +1 -1
- package/dist/assets/{stateDiagram-2N3HPSRC-CvLiUbMc.js → stateDiagram-2N3HPSRC-CKvn1pfo.js} +1 -1
- package/dist/assets/stateDiagram-v2-6OUMAXLB-blzdlH4v.js +1 -0
- package/dist/assets/{swimlanes-5IMT3BWC-dAgZbHOX.js → swimlanes-5IMT3BWC-D5WhCwkM.js} +2 -2
- package/dist/assets/swimlanesDiagram-G3AALYLV-BiOWb3s9.js +8 -0
- package/dist/assets/{timeline-definition-FHXFAJF6-B4uBF1kH.js → timeline-definition-FHXFAJF6-B-UTX_B8.js} +1 -1
- package/dist/assets/{vennDiagram-L72KCM5P-DmICWssw.js → vennDiagram-L72KCM5P-DelObiCK.js} +1 -1
- package/dist/assets/{wardleyDiagram-EHGQE667-CmKrH6Q5.js → wardleyDiagram-EHGQE667-DCWJdXij.js} +1 -1
- package/dist/assets/{web-DC2SNPaM.js → web-BOFBvPGv.js} +1 -1
- package/dist/assets/{web-eQSHkDHy.js → web-C2DocoQz.js} +1 -1
- package/dist/assets/{web-CnrzUv_G.js → web-qtcj3i0F.js} +1 -1
- package/dist/assets/{xychartDiagram-FW5EYKEG-B9wmI4CY.js → xychartDiagram-FW5EYKEG-CzbE79ZQ.js} +1 -1
- package/dist/build-info.json +1 -1
- package/dist/index.html +1 -1
- package/dist/src/packages/server/data/builtin-skills/image-generation.js +64 -0
- package/dist/src/packages/server/data/builtin-skills/index.js +2 -0
- package/dist/src/packages/server/integrations/slack/slack-client.js +3 -0
- package/dist/src/packages/server/integrations/slack/slack-instance.js +12 -0
- package/dist/src/packages/server/integrations/slack/slack-routes.js +19 -0
- package/dist/src/packages/server/integrations/slack/slack-skill.js +13 -1
- package/dist/src/packages/server/routes/files.js +4 -0
- package/dist/src/packages/server/routes/images.js +53 -0
- package/dist/src/packages/server/routes/index.js +2 -0
- package/dist/src/packages/server/services/image-service.js +364 -0
- package/dist/src/packages/server/services/index.js +1 -0
- package/dist/src/packages/shared/image-types.js +11 -0
- package/dist/src/packages/shared/types.js +1 -0
- package/package.json +1 -1
- package/dist/assets/channel-BgIK1LRk.js +0 -1
- package/dist/assets/classDiagram-OUVF2IWQ-DqGhAOej.js +0 -1
- package/dist/assets/classDiagram-v2-EOCWNBFH-DqGhAOej.js +0 -1
- package/dist/assets/stateDiagram-v2-6OUMAXLB-Ds464XsG.js +0 -1
- package/dist/assets/swimlanesDiagram-G3AALYLV-B1Qwmr49.js +0 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as Qe,r as e,c as Je,Q as Ze,d as _e,a8 as et,j as i}from"./main-BBvM-_Ia.js";import{V as D,c as tt,d as we,e as nt,W as rt,f as st,n as ot,H as at,D as Fe,o as it,j as Te,p as lt,q as ct,l as ut,E as dt,L as ft,k as pt,A as mt,b as ht,a as gt,m as wt,r as yt}from"./vendor-three-DSCAlQQW.js";import{O as bt}from"./OrbitControls-BF6MpdhX.js";import{g as xt,v as Mt,u as Ct,a as St,d as ze,s as vt,c as Et,T as Rt,b as At}from"./ThreeAreaSelector-B4FdXGTQ.js";import{T as jt,a as Lt}from"./ThreeViewShortcuts-C50gwWcg.js";import"./vendor-react--Eh9ivFN.js";function kt(l){const A=new Map;return l.map((L,O)=>{const a=L.name.trim()||`Animation ${O+1}`,j=(A.get(a)??0)+1;return A.set(a,j),{index:O,label:j===1?a:`${a} (${j})`,duration:L.duration}})}function Ie(l){return"color"in l&&l.color instanceof we}function Ot(l){return Number.isFinite(l)?l>=100?l.toFixed(0):l>=10?l.toFixed(1):l.toFixed(2):"0"}function Vt(l,A){const L=l.replace(/\\/g,"/"),O=L.lastIndexOf("/"),a=O>=0?L.slice(0,O+1):"",j=A.split(/[?#]/,1)[0];let x=j;try{x=decodeURIComponent(j)}catch{}if(x.startsWith("/"))return x;const V=`${a}${x}`.split("/"),c=[];for(const M of V)!M||M==="."||(M===".."?c.pop():c.push(M));return`${L.startsWith("/")?"/":""}${c.join("/")}`}function $t({url:l,filename:A,filePath:L,onFileSelect:O}){const{t:a}=Qe("terminal"),j=e.useRef(null),x=e.useRef(null),V=e.useRef(null),c=e.useRef(null),M=e.useRef(null),ne=e.useRef(null),re=e.useRef(null),U=e.useRef(null),B=e.useRef([]),se=e.useRef(new D),Se=e.useRef(1),F=e.useRef(null),oe=e.useRef([]),ae=e.useRef([]),ye=e.useRef(null),ie=e.useRef(null),le=e.useRef([]),[ve,T]=e.useState(!0),[be,H]=e.useState(null),[C,Ee]=e.useState(null),[Re,Ae]=e.useState([]),[ce,xe]=e.useState(null),[je,$e]=e.useState(!1),[z]=e.useState(xt),[q,Ge]=e.useState(z.modelColor),[K,Ne]=e.useState(z.backgroundColor),[X,We]=e.useState(z.lightIntensity),[Y,Ue]=e.useState(z.modelOpacity),[Q,Be]=e.useState(z.showEdges),[J,Le]=e.useState(z.preserveModelColors),[ke,Me]=e.useState(!1),[P,ue]=e.useState(null),[I,de]=e.useState([]),[Ce,fe]=e.useState(null),Z=L||Mt(l),He=Ct(Z,A,"glb");St({enabled:!!C&&P===null,rendererRef:re,cameraRef:ne,controlsRef:U,modelObjectsRef:B,modelCenterRef:se,markerGroupRef:F,renderRef:c,setAreas:de,setSelectedId:fe}),e.useEffect(()=>{const t=j.current;if(!t)return;const u=new AbortController;let n=!1,p=null,m=null,$=0;const S=new ct;let g=null;const pe=[],_=[];T(!0),H(null),Ee(null),Ae([]),xe(null),ie.current=null,le.current=[],oe.current=[],ae.current=[],B.current=[];const h=new tt;h.background=new we(1119258),M.current=h;const d=new nt(40,1,.01,1e5);d.up.set(0,1,0),ne.current=d;let o;try{o=new rt({antialias:!0})}catch{T(!1),H(a("fileViewerModal.webglUnavailable"));return}o.setPixelRatio(Math.min(window.devicePixelRatio||1,2)),o.outputColorSpace=st,o.toneMapping=ot,o.toneMappingExposure=1.05,o.domElement.className="stl-viewer-canvas",o.domElement.setAttribute("aria-label",a("fileViewerModal.glbPreviewLabel",{filename:A})),re.current=o,t.appendChild(o.domElement);const y=new bt(d,o.domElement);y.screenSpacePanning=!0,y.addEventListener("change",()=>o.render(h,d)),U.current=y;const ee=new at(16777215,2502724,2.1),G=new Fe(16777215,2.3);G.position.set(3,-4,6);const te=new Fe(8040191,.9);te.position.set(-4,3,1),h.add(ee,G,te),ye.current={hemisphere:ee,key:G,fill:te},c.current=()=>o.render(h,d);const Oe=()=>{const r=Math.max(t.clientWidth,1),v=Math.max(t.clientHeight,1);d.aspect=r/v,d.updateProjectionMatrix(),o.setSize(r,v,!1),o.render(h,d)},Ve=new ResizeObserver(Oe);Ve.observe(t),Oe();const Xe=(r,v)=>{if(n)return;p=r;const E=[],k=new Set;let R=0;if(r.traverse(s=>{var W;if(!(s instanceof Te))return;E.push(s),B.current.push(s);const f=s.geometry;R+=f.index?f.index.count/3:(((W=f.getAttribute("position"))==null?void 0:W.count)??0)/3,(Array.isArray(s.material)?s.material:[s.material]).forEach(b=>{k.has(b)||(k.add(b),b.userData.originalOpacity=b.opacity,b.userData.originalTransparent=b.transparent,b.userData.originalDepthWrite=b.depthWrite,Ie(b)&&(b.userData.originalColor=b.color.clone()))})}),E.length===0){H(a("fileViewerModal.emptyGlb")),T(!1);return}if(oe.current=[...k],h.add(r),le.current=v,Ae(kt(v)),v.length>0){m=new lt(r),ie.current=m,xe(0);const s=()=>{n||(m==null||m.update(Math.min(S.getDelta(),.1)),o.render(h,d),$=requestAnimationFrame(s))};S.start(),$=requestAnimationFrame(s)}const me=new ut().setFromObject(r),w=me.getSize(new D),Pe=me.getCenter(new D);if(se.current.copy(Pe),Se.current=Math.max(w.x,w.y,w.z,.001)*.12,r.position.sub(Pe),R<=25e4)for(const s of E){const f=new dt(s.geometry,28),N=new ft({color:1516076,transparent:!0,opacity:.5}),W=new pt(f,N);W.visible=!1,s.add(W),pe.push(f),_.push(N),ae.current.push(W)}const Ye=Math.max(w.x,w.y,w.z,.001)*.3;g=new mt(Ye),g.position.set(-w.x/2,-w.y/2,-w.z/2),h.add(g);const De=Math.max(w.length()/2,.001),he=Math.max(De/Math.sin(ht.degToRad(d.fov/2))*1.18,.01),ge=s=>{const f=s==="x"?new D(1,0,0):s==="y"?new D(0,1,0):s==="z"?new D(0,0,1):new D(1,.8,1).normalize();d.up.set(0,s==="y"?0:1,s==="y"?-1:0),d.near=Math.max(he/1e3,1e-4),d.far=Math.max(he*100,10),d.position.copy(f.multiplyScalar(he)),d.updateProjectionMatrix(),y.target.set(0,0,0),y.minDistance=De*.05,y.maxDistance=he*20,y.update(),o.render(h,d)};V.current=ge,x.current=()=>ge("iso"),ge("iso"),o.domElement.tabIndex=0,o.domElement.addEventListener("pointerdown",()=>o.domElement.focus()),o.domElement.addEventListener("keydown",s=>{if(s.ctrlKey||s.metaKey||s.altKey)return;const f=s.key.toLowerCase(),N=f==="x"||f==="1"?"x":f==="y"||f==="2"?"y":f==="z"||f==="3"?"z":f==="i"||f==="4"?"iso":null;N&&(s.preventDefault(),ge(N))}),Ee({objects:E.length,triangles:Math.floor(R),dimensions:[w.x,w.y,w.z]}),T(!1)};return Je(l,{signal:u.signal}).then(r=>{if(!r.ok)throw new Error(`HTTP ${r.status}`);return r.arrayBuffer()}).then(r=>{if(n)return;const v=new it,E=Ze(),k=l.includes("/git-original-binary")?"/api/files/git-original-binary":"/api/files/binary";v.setURLModifier(R=>{if(/^(?:blob:|data:|https?:)/i.test(R))return R;const me=Vt(Z,R);return _e(`${k}?path=${encodeURIComponent(me)}${E?`&token=${encodeURIComponent(E)}`:""}`)}),new et(v).parse(r,"",R=>Xe(R.scene,R.animations),()=>{n||(H(a("fileViewerModal.glbLoadError")),T(!1))})}).catch(()=>{!n&&!u.signal.aborted&&(H(a("fileViewerModal.glbLoadError")),T(!1))}),()=>{n=!0,u.abort(),cancelAnimationFrame($),m==null||m.stopAllAction(),p&&m&&m.uncacheRoot(p),ze(F.current),F.current=null,Ve.disconnect(),y.dispose(),p==null||p.traverse(r=>{if(!(r instanceof Te))return;r.geometry.dispose(),(Array.isArray(r.material)?r.material:[r.material]).forEach(E=>{for(const k of Object.values(E))k instanceof yt&&k.dispose();E.dispose()})}),pe.forEach(r=>r.dispose()),_.forEach(r=>r.dispose()),g==null||g.geometry.dispose(),g&&(Array.isArray(g.material)?g.material:[g.material]).forEach(r=>r.dispose()),o.dispose(),o.domElement.remove(),M.current=null,ne.current=null,re.current=null,U.current=null,c.current=null,B.current=[],oe.current=[],ae.current=[],ye.current=null,ie.current=null,le.current=[],x.current=null,V.current=null}},[l,A,Z,a]),e.useEffect(()=>{var u;const t=ie.current;if(t){if(t.stopAllAction(),ce!==null){const n=le.current[ce];n&&t.clipAction(n).reset().play()}(u=c.current)==null||u.call(c)}},[ce]),e.useEffect(()=>{var u;M.current&&(M.current.background=new we(K));for(const n of oe.current){if(Ie(n)){const m=n.userData.originalColor;J&&m instanceof we?n.color.copy(m):n.color.set(q)}const p=typeof n.userData.originalOpacity=="number"?n.userData.originalOpacity:1;n.opacity=p*Y/100,n.transparent=n.userData.originalTransparent===!0||n.opacity<1,n.depthWrite=n.userData.originalDepthWrite!==!1&&n.opacity>=1,n.needsUpdate=!0}ae.current.forEach(n=>{n.visible=Q});const t=ye.current;if(t){const n=X/100;t.hemisphere.intensity=2.1*n,t.key.intensity=2.3*n,t.fill.intensity=.9*n}(u=c.current)==null||u.call(c)},[q,K,X,Y,Q,J,C]),e.useEffect(()=>{vt({modelColor:q,backgroundColor:K,lightIntensity:X,modelOpacity:Y,showEdges:Q,preserveModelColors:J})},[q,K,X,Y,Q,J]),e.useEffect(()=>{de([]),fe(null),ue(null),Me(!1)},[l]),e.useEffect(()=>{U.current&&(U.current.enabled=P===null);const t=re.current,u=ne.current;if(!t||!u||!C||!P)return;const n=t.domElement;let p=null;const m=S=>{p=[S.clientX,S.clientY]},$=S=>{var G;if(!p||Math.hypot(S.clientX-p[0],S.clientY-p[1])>5)return;const g=n.getBoundingClientRect(),pe=new gt((S.clientX-g.left)/g.width*2-1,-((S.clientY-g.top)/g.height)*2+1),_=new wt;_.setFromCamera(pe,u);const h=_.intersectObjects(B.current,!1)[0];if(!h)return;const d=h.point.clone().add(se.current).toArray(),o=(G=h.face)==null?void 0:G.normal.clone().transformDirection(h.object.matrixWorld).toArray(),y=Se.current,ee=`area-${Date.now()}-${Math.random().toString(36).slice(2,7)}`;de(te=>[...te,{id:ee,shape:P,center:d,size:[y,y,y],objectName:h.object.name||void 0,surfaceNormal:o}]),fe(ee)};return n.addEventListener("pointerdown",m),n.addEventListener("pointerup",$),()=>{n.removeEventListener("pointerdown",m),n.removeEventListener("pointerup",$)}},[P,C]),e.useEffect(()=>{var n,p;ze(F.current),F.current=null;const t=M.current;if(!t||I.length===0){(n=c.current)==null||n.call(c);return}const u=Et(I,se.current,Ce);F.current=u,t.add(u),(p=c.current)==null||p.call(c)},[I,Ce,C]);const qe=e.useCallback(()=>{var t;return(t=x.current)==null?void 0:t.call(x)},[]),Ke=e.useCallback(t=>{var u;return(u=V.current)==null?void 0:u.call(V,t)},[]);return i.jsxs("div",{className:`stl-viewer glb-viewer${P?" area-placement-active":""}`,ref:j,children:[ve&&i.jsx("div",{className:"stl-viewer-status",children:a("fileViewerModal.loadingGlb")}),be&&i.jsx("div",{className:"stl-viewer-status stl-viewer-error",children:be}),!ve&&!be&&C&&i.jsxs(i.Fragment,{children:[i.jsxs("div",{className:"stl-viewer-toolbar",children:[i.jsxs("span",{className:"stl-viewer-info",children:[a("fileViewerModal.glbStats",{objects:C.objects.toLocaleString(),triangles:C.triangles.toLocaleString()})," · ",C.dimensions.map(Ot).join(" × ")]}),Re.length>0&&i.jsxs("label",{className:"glb-animation-selector",children:[i.jsx("span",{children:a("fileViewerModal.animation")}),i.jsxs("select",{value:ce??"",onChange:t=>xe(t.target.value===""?null:Number(t.target.value)),"aria-label":a("fileViewerModal.animation"),children:[i.jsx("option",{value:"",children:a("fileViewerModal.staticPose")}),Re.map(t=>i.jsxs("option",{value:t.index,children:[t.label," · ",t.duration.toFixed(2),"s"]},t.index))]})]}),i.jsx(jt,{onView:Ke}),i.jsx("button",{type:"button",onClick:qe,children:a("fileViewerModal.resetView")}),i.jsxs("button",{type:"button",className:ke?"active":void 0,onClick:()=>{Me(t=>!t),ue(null)},children:[a("fileViewerModal.areas"),I.length?` (${I.length})`:""]}),i.jsx("button",{type:"button",className:je?"active":void 0,onClick:()=>$e(t=>!t),children:a("fileViewerModal.viewerSettings")})]}),je&&i.jsx(Rt,{modelColor:q,onModelColorChange:t=>{Ge(t),Le(!1)},backgroundColor:K,onBackgroundColorChange:Ne,lightIntensity:X,onLightIntensityChange:We,modelOpacity:Y,onModelOpacityChange:Ue,showEdges:Q,onShowEdgesChange:Be,preserveModelColors:J,onPreserveModelColorsChange:Le,recentFiles:He,currentFilePath:Z,onRecentFileSelect:O}),ke&&i.jsx(At,{areas:I,selectedId:Ce,placementShape:P,filename:A,filePath:Z,modelExtent:Math.max(...C.dimensions),onPlacementShapeChange:ue,onSelectedIdChange:fe,onAreasChange:de,onClose:()=>{Me(!1),ue(null)}}),i.jsx("div",{className:"stl-viewer-hint",children:a("fileViewerModal.controlsHint")}),i.jsx(Lt,{})]})]})}export{$t as GlbViewer,kt as buildGlbAnimationOptions,Vt as resolveGlbResourcePath};
|
|
1
|
+
import{u as Qe,r as e,c as Je,Q as Ze,d as _e,a8 as et,j as i}from"./main-BKRg0DBA.js";import{V as D,c as tt,d as we,e as nt,W as rt,f as st,n as ot,H as at,D as Fe,o as it,j as Te,p as lt,q as ct,l as ut,E as dt,L as ft,k as pt,A as mt,b as ht,a as gt,m as wt,r as yt}from"./vendor-three-DSCAlQQW.js";import{O as bt}from"./OrbitControls-BF6MpdhX.js";import{g as xt,v as Mt,u as Ct,a as St,d as ze,s as vt,c as Et,T as Rt,b as At}from"./ThreeAreaSelector-D18G4udc.js";import{T as jt,a as Lt}from"./ThreeViewShortcuts-vNiMNFPJ.js";import"./vendor-react--Eh9ivFN.js";function kt(l){const A=new Map;return l.map((L,O)=>{const a=L.name.trim()||`Animation ${O+1}`,j=(A.get(a)??0)+1;return A.set(a,j),{index:O,label:j===1?a:`${a} (${j})`,duration:L.duration}})}function Ie(l){return"color"in l&&l.color instanceof we}function Ot(l){return Number.isFinite(l)?l>=100?l.toFixed(0):l>=10?l.toFixed(1):l.toFixed(2):"0"}function Vt(l,A){const L=l.replace(/\\/g,"/"),O=L.lastIndexOf("/"),a=O>=0?L.slice(0,O+1):"",j=A.split(/[?#]/,1)[0];let x=j;try{x=decodeURIComponent(j)}catch{}if(x.startsWith("/"))return x;const V=`${a}${x}`.split("/"),c=[];for(const M of V)!M||M==="."||(M===".."?c.pop():c.push(M));return`${L.startsWith("/")?"/":""}${c.join("/")}`}function $t({url:l,filename:A,filePath:L,onFileSelect:O}){const{t:a}=Qe("terminal"),j=e.useRef(null),x=e.useRef(null),V=e.useRef(null),c=e.useRef(null),M=e.useRef(null),ne=e.useRef(null),re=e.useRef(null),U=e.useRef(null),B=e.useRef([]),se=e.useRef(new D),Se=e.useRef(1),F=e.useRef(null),oe=e.useRef([]),ae=e.useRef([]),ye=e.useRef(null),ie=e.useRef(null),le=e.useRef([]),[ve,T]=e.useState(!0),[be,H]=e.useState(null),[C,Ee]=e.useState(null),[Re,Ae]=e.useState([]),[ce,xe]=e.useState(null),[je,$e]=e.useState(!1),[z]=e.useState(xt),[q,Ge]=e.useState(z.modelColor),[K,Ne]=e.useState(z.backgroundColor),[X,We]=e.useState(z.lightIntensity),[Y,Ue]=e.useState(z.modelOpacity),[Q,Be]=e.useState(z.showEdges),[J,Le]=e.useState(z.preserveModelColors),[ke,Me]=e.useState(!1),[P,ue]=e.useState(null),[I,de]=e.useState([]),[Ce,fe]=e.useState(null),Z=L||Mt(l),He=Ct(Z,A,"glb");St({enabled:!!C&&P===null,rendererRef:re,cameraRef:ne,controlsRef:U,modelObjectsRef:B,modelCenterRef:se,markerGroupRef:F,renderRef:c,setAreas:de,setSelectedId:fe}),e.useEffect(()=>{const t=j.current;if(!t)return;const u=new AbortController;let n=!1,p=null,m=null,$=0;const S=new ct;let g=null;const pe=[],_=[];T(!0),H(null),Ee(null),Ae([]),xe(null),ie.current=null,le.current=[],oe.current=[],ae.current=[],B.current=[];const h=new tt;h.background=new we(1119258),M.current=h;const d=new nt(40,1,.01,1e5);d.up.set(0,1,0),ne.current=d;let o;try{o=new rt({antialias:!0})}catch{T(!1),H(a("fileViewerModal.webglUnavailable"));return}o.setPixelRatio(Math.min(window.devicePixelRatio||1,2)),o.outputColorSpace=st,o.toneMapping=ot,o.toneMappingExposure=1.05,o.domElement.className="stl-viewer-canvas",o.domElement.setAttribute("aria-label",a("fileViewerModal.glbPreviewLabel",{filename:A})),re.current=o,t.appendChild(o.domElement);const y=new bt(d,o.domElement);y.screenSpacePanning=!0,y.addEventListener("change",()=>o.render(h,d)),U.current=y;const ee=new at(16777215,2502724,2.1),G=new Fe(16777215,2.3);G.position.set(3,-4,6);const te=new Fe(8040191,.9);te.position.set(-4,3,1),h.add(ee,G,te),ye.current={hemisphere:ee,key:G,fill:te},c.current=()=>o.render(h,d);const Oe=()=>{const r=Math.max(t.clientWidth,1),v=Math.max(t.clientHeight,1);d.aspect=r/v,d.updateProjectionMatrix(),o.setSize(r,v,!1),o.render(h,d)},Ve=new ResizeObserver(Oe);Ve.observe(t),Oe();const Xe=(r,v)=>{if(n)return;p=r;const E=[],k=new Set;let R=0;if(r.traverse(s=>{var W;if(!(s instanceof Te))return;E.push(s),B.current.push(s);const f=s.geometry;R+=f.index?f.index.count/3:(((W=f.getAttribute("position"))==null?void 0:W.count)??0)/3,(Array.isArray(s.material)?s.material:[s.material]).forEach(b=>{k.has(b)||(k.add(b),b.userData.originalOpacity=b.opacity,b.userData.originalTransparent=b.transparent,b.userData.originalDepthWrite=b.depthWrite,Ie(b)&&(b.userData.originalColor=b.color.clone()))})}),E.length===0){H(a("fileViewerModal.emptyGlb")),T(!1);return}if(oe.current=[...k],h.add(r),le.current=v,Ae(kt(v)),v.length>0){m=new lt(r),ie.current=m,xe(0);const s=()=>{n||(m==null||m.update(Math.min(S.getDelta(),.1)),o.render(h,d),$=requestAnimationFrame(s))};S.start(),$=requestAnimationFrame(s)}const me=new ut().setFromObject(r),w=me.getSize(new D),Pe=me.getCenter(new D);if(se.current.copy(Pe),Se.current=Math.max(w.x,w.y,w.z,.001)*.12,r.position.sub(Pe),R<=25e4)for(const s of E){const f=new dt(s.geometry,28),N=new ft({color:1516076,transparent:!0,opacity:.5}),W=new pt(f,N);W.visible=!1,s.add(W),pe.push(f),_.push(N),ae.current.push(W)}const Ye=Math.max(w.x,w.y,w.z,.001)*.3;g=new mt(Ye),g.position.set(-w.x/2,-w.y/2,-w.z/2),h.add(g);const De=Math.max(w.length()/2,.001),he=Math.max(De/Math.sin(ht.degToRad(d.fov/2))*1.18,.01),ge=s=>{const f=s==="x"?new D(1,0,0):s==="y"?new D(0,1,0):s==="z"?new D(0,0,1):new D(1,.8,1).normalize();d.up.set(0,s==="y"?0:1,s==="y"?-1:0),d.near=Math.max(he/1e3,1e-4),d.far=Math.max(he*100,10),d.position.copy(f.multiplyScalar(he)),d.updateProjectionMatrix(),y.target.set(0,0,0),y.minDistance=De*.05,y.maxDistance=he*20,y.update(),o.render(h,d)};V.current=ge,x.current=()=>ge("iso"),ge("iso"),o.domElement.tabIndex=0,o.domElement.addEventListener("pointerdown",()=>o.domElement.focus()),o.domElement.addEventListener("keydown",s=>{if(s.ctrlKey||s.metaKey||s.altKey)return;const f=s.key.toLowerCase(),N=f==="x"||f==="1"?"x":f==="y"||f==="2"?"y":f==="z"||f==="3"?"z":f==="i"||f==="4"?"iso":null;N&&(s.preventDefault(),ge(N))}),Ee({objects:E.length,triangles:Math.floor(R),dimensions:[w.x,w.y,w.z]}),T(!1)};return Je(l,{signal:u.signal}).then(r=>{if(!r.ok)throw new Error(`HTTP ${r.status}`);return r.arrayBuffer()}).then(r=>{if(n)return;const v=new it,E=Ze(),k=l.includes("/git-original-binary")?"/api/files/git-original-binary":"/api/files/binary";v.setURLModifier(R=>{if(/^(?:blob:|data:|https?:)/i.test(R))return R;const me=Vt(Z,R);return _e(`${k}?path=${encodeURIComponent(me)}${E?`&token=${encodeURIComponent(E)}`:""}`)}),new et(v).parse(r,"",R=>Xe(R.scene,R.animations),()=>{n||(H(a("fileViewerModal.glbLoadError")),T(!1))})}).catch(()=>{!n&&!u.signal.aborted&&(H(a("fileViewerModal.glbLoadError")),T(!1))}),()=>{n=!0,u.abort(),cancelAnimationFrame($),m==null||m.stopAllAction(),p&&m&&m.uncacheRoot(p),ze(F.current),F.current=null,Ve.disconnect(),y.dispose(),p==null||p.traverse(r=>{if(!(r instanceof Te))return;r.geometry.dispose(),(Array.isArray(r.material)?r.material:[r.material]).forEach(E=>{for(const k of Object.values(E))k instanceof yt&&k.dispose();E.dispose()})}),pe.forEach(r=>r.dispose()),_.forEach(r=>r.dispose()),g==null||g.geometry.dispose(),g&&(Array.isArray(g.material)?g.material:[g.material]).forEach(r=>r.dispose()),o.dispose(),o.domElement.remove(),M.current=null,ne.current=null,re.current=null,U.current=null,c.current=null,B.current=[],oe.current=[],ae.current=[],ye.current=null,ie.current=null,le.current=[],x.current=null,V.current=null}},[l,A,Z,a]),e.useEffect(()=>{var u;const t=ie.current;if(t){if(t.stopAllAction(),ce!==null){const n=le.current[ce];n&&t.clipAction(n).reset().play()}(u=c.current)==null||u.call(c)}},[ce]),e.useEffect(()=>{var u;M.current&&(M.current.background=new we(K));for(const n of oe.current){if(Ie(n)){const m=n.userData.originalColor;J&&m instanceof we?n.color.copy(m):n.color.set(q)}const p=typeof n.userData.originalOpacity=="number"?n.userData.originalOpacity:1;n.opacity=p*Y/100,n.transparent=n.userData.originalTransparent===!0||n.opacity<1,n.depthWrite=n.userData.originalDepthWrite!==!1&&n.opacity>=1,n.needsUpdate=!0}ae.current.forEach(n=>{n.visible=Q});const t=ye.current;if(t){const n=X/100;t.hemisphere.intensity=2.1*n,t.key.intensity=2.3*n,t.fill.intensity=.9*n}(u=c.current)==null||u.call(c)},[q,K,X,Y,Q,J,C]),e.useEffect(()=>{vt({modelColor:q,backgroundColor:K,lightIntensity:X,modelOpacity:Y,showEdges:Q,preserveModelColors:J})},[q,K,X,Y,Q,J]),e.useEffect(()=>{de([]),fe(null),ue(null),Me(!1)},[l]),e.useEffect(()=>{U.current&&(U.current.enabled=P===null);const t=re.current,u=ne.current;if(!t||!u||!C||!P)return;const n=t.domElement;let p=null;const m=S=>{p=[S.clientX,S.clientY]},$=S=>{var G;if(!p||Math.hypot(S.clientX-p[0],S.clientY-p[1])>5)return;const g=n.getBoundingClientRect(),pe=new gt((S.clientX-g.left)/g.width*2-1,-((S.clientY-g.top)/g.height)*2+1),_=new wt;_.setFromCamera(pe,u);const h=_.intersectObjects(B.current,!1)[0];if(!h)return;const d=h.point.clone().add(se.current).toArray(),o=(G=h.face)==null?void 0:G.normal.clone().transformDirection(h.object.matrixWorld).toArray(),y=Se.current,ee=`area-${Date.now()}-${Math.random().toString(36).slice(2,7)}`;de(te=>[...te,{id:ee,shape:P,center:d,size:[y,y,y],objectName:h.object.name||void 0,surfaceNormal:o}]),fe(ee)};return n.addEventListener("pointerdown",m),n.addEventListener("pointerup",$),()=>{n.removeEventListener("pointerdown",m),n.removeEventListener("pointerup",$)}},[P,C]),e.useEffect(()=>{var n,p;ze(F.current),F.current=null;const t=M.current;if(!t||I.length===0){(n=c.current)==null||n.call(c);return}const u=Et(I,se.current,Ce);F.current=u,t.add(u),(p=c.current)==null||p.call(c)},[I,Ce,C]);const qe=e.useCallback(()=>{var t;return(t=x.current)==null?void 0:t.call(x)},[]),Ke=e.useCallback(t=>{var u;return(u=V.current)==null?void 0:u.call(V,t)},[]);return i.jsxs("div",{className:`stl-viewer glb-viewer${P?" area-placement-active":""}`,ref:j,children:[ve&&i.jsx("div",{className:"stl-viewer-status",children:a("fileViewerModal.loadingGlb")}),be&&i.jsx("div",{className:"stl-viewer-status stl-viewer-error",children:be}),!ve&&!be&&C&&i.jsxs(i.Fragment,{children:[i.jsxs("div",{className:"stl-viewer-toolbar",children:[i.jsxs("span",{className:"stl-viewer-info",children:[a("fileViewerModal.glbStats",{objects:C.objects.toLocaleString(),triangles:C.triangles.toLocaleString()})," · ",C.dimensions.map(Ot).join(" × ")]}),Re.length>0&&i.jsxs("label",{className:"glb-animation-selector",children:[i.jsx("span",{children:a("fileViewerModal.animation")}),i.jsxs("select",{value:ce??"",onChange:t=>xe(t.target.value===""?null:Number(t.target.value)),"aria-label":a("fileViewerModal.animation"),children:[i.jsx("option",{value:"",children:a("fileViewerModal.staticPose")}),Re.map(t=>i.jsxs("option",{value:t.index,children:[t.label," · ",t.duration.toFixed(2),"s"]},t.index))]})]}),i.jsx(jt,{onView:Ke}),i.jsx("button",{type:"button",onClick:qe,children:a("fileViewerModal.resetView")}),i.jsxs("button",{type:"button",className:ke?"active":void 0,onClick:()=>{Me(t=>!t),ue(null)},children:[a("fileViewerModal.areas"),I.length?` (${I.length})`:""]}),i.jsx("button",{type:"button",className:je?"active":void 0,onClick:()=>$e(t=>!t),children:a("fileViewerModal.viewerSettings")})]}),je&&i.jsx(Rt,{modelColor:q,onModelColorChange:t=>{Ge(t),Le(!1)},backgroundColor:K,onBackgroundColorChange:Ne,lightIntensity:X,onLightIntensityChange:We,modelOpacity:Y,onModelOpacityChange:Ue,showEdges:Q,onShowEdgesChange:Be,preserveModelColors:J,onPreserveModelColorsChange:Le,recentFiles:He,currentFilePath:Z,onRecentFileSelect:O}),ke&&i.jsx(At,{areas:I,selectedId:Ce,placementShape:P,filename:A,filePath:Z,modelExtent:Math.max(...C.dimensions),onPlacementShapeChange:ue,onSelectedIdChange:fe,onAreasChange:de,onClose:()=>{Me(!1),ue(null)}}),i.jsx("div",{className:"stl-viewer-hint",children:a("fileViewerModal.controlsHint")}),i.jsx(Lt,{})]})]})}export{$t as GlbViewer,kt as buildGlbAnimationOptions,Vt as resolveGlbResourcePath};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as t,c as S,d as y,j as e,I as B}from"./main-BBvM-_Ia.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-DSCAlQQW.js";function oe({integration:o,onSave:f,onCancel:z}){const[r,I]=t.useState(o.values.authMethod||"oauth2"),[g,L]=t.useState(o.values.clientId||""),[v,q]=t.useState(""),[w,K]=t.useState(o.values.redirectBaseUrl||""),[m,$]=t.useState(""),[j,Y]=t.useState(o.values.impersonateEmail||""),[p,E]=t.useState(String(o.values.pollingIntervalMs??3e4)),[x,O]=t.useState(o.values.defaultApprovalKeywords||"approved,aprobado,autorizado,yes,ok"),[M,G]=t.useState(null),[n,T]=t.useState(null),[c,d]=t.useState(!1),[P,i]=t.useState(null),[U,F]=t.useState(!1),[H,J]=t.useState(!1),[N,W]=t.useState(!1),[b,h]=t.useState(o.status.connected?"connected":"credentials"),k=r==="oauth2"&&o.values.clientId==="********"&&o.values.clientSecret==="********",s=t.useRef(null),_=t.useRef(o.status.connected),u=t.useCallback(async()=>{try{const a=await S(y("/api/email/status"));if(a.ok){const l=await a.json();T(l),l.authenticated&&(h("connected"),s.current&&(clearInterval(s.current),s.current=null))}}catch(a){console.error("Failed to fetch Gmail status:",a)}},[]);t.useEffect(()=>{const a=o.status.connected,l=_.current;a&&!l&&b!=="connected"?h("connected"):!a&&l&&b==="connected"&&h("credentials"),_.current=a},[o.status.connected]),t.useEffect(()=>(u(),()=>{s.current&&clearInterval(s.current)}),[u]);const R=async()=>{const a=await S(y("/api/email/auth/url"));if(!a.ok){const A=await a.json().catch(()=>({}));throw new Error(A.error||`HTTP ${a.status}`)}const l=await a.json();if(!l.url)throw new Error("OAuth URL is empty");G(l.url),i(null),h("authorize"),s.current&&clearInterval(s.current),s.current=setInterval(u,3e3)},X=async()=>{d(!0),i(null);try{await R()}catch(a){i(a instanceof Error?a.message:"Failed to get OAuth URL")}finally{d(!1)}},Q=async()=>{if(!g.trim()){i("Client ID is required");return}d(!0),i(null);try{const a={authMethod:"oauth2",redirectBaseUrl:w.trim(),pollingIntervalMs:parseInt(p)||3e4,defaultApprovalKeywords:x};g.trim()&&g.trim()!=="********"&&(a.clientId=g.trim()),v.trim()&&v.trim()!=="********"&&(a.clientSecret=v.trim()),await f(a),await R()}catch(a){const l=a instanceof Error?a.message:"Failed to get OAuth URL";i(l)}finally{d(!1)}},V=async()=>{if(!m.trim()){i("Service Account JSON is required");return}if(!j.trim()){i("Impersonate Email is required");return}try{const a=JSON.parse(m.trim());if(!a.client_email||!a.private_key){i("Service Account JSON must contain client_email and private_key");return}}catch{i("Invalid JSON in Service Account field");return}d(!0),i(null);try{await f({authMethod:"service_account",serviceAccountJson:m.trim(),impersonateEmail:j.trim(),pollingIntervalMs:parseInt(p)||3e4,defaultApprovalKeywords:x}),await new Promise(a=>setTimeout(a,1e3)),await u()}catch(a){const l=a instanceof Error?a.message:"Failed to save service account";i(l)}finally{d(!1)}},Z=async()=>{F(!0),i(null);try{await f({pollingIntervalMs:parseInt(p)||3e4,defaultApprovalKeywords:x})}catch(a){i(a instanceof Error?a.message:"Failed to save settings")}finally{F(!1)}},ee=async()=>{const a=!(n!=null&&n.pollingActive);J(!0),i(null);try{const l=a?"/api/email/polling/start":"/api/email/polling/stop",A=a?{intervalMs:parseInt(p)||3e4}:{},C=await S(y(l),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(A)});if(!C.ok){const te=await C.json().catch(()=>({}));throw new Error(te.error||`HTTP ${C.status}`)}await u()}catch(l){i(l instanceof Error?l.message:"Failed to toggle polling")}finally{J(!1)}},ae=async()=>{d(!0),i(null);try{await f({refreshToken:"",serviceAccountJson:"",impersonateEmail:""}),T(null),G(null),h("credentials"),await u()}catch(a){i(a instanceof Error?a.message:"Failed to disconnect")}finally{d(!1)}},D=!!o.values.serviceAccountJson;return e.jsxs("div",{className:"gmail-oauth-setup",children:[P&&e.jsx("div",{className:"gmail-oauth-error",children:P}),b==="credentials"&&e.jsxs("div",{className:"gmail-oauth-section",children:[e.jsxs("div",{className:"gmail-oauth-field",style:{marginBottom:24},children:[e.jsx("label",{className:"integration-field-label",children:"Authentication Method"}),e.jsxs("div",{className:"gmail-auth-method-selector",children:[e.jsxs("button",{type:"button",className:`gmail-auth-method-btn ${r==="oauth2"?"active":""}`,onClick:()=>{I("oauth2"),i(null)},children:[e.jsx("span",{className:"gmail-auth-method-icon",children:e.jsx(B,{name:"key",size:14})}),e.jsx("span",{className:"gmail-auth-method-label",children:"OAuth 2.0"}),e.jsx("span",{className:"gmail-auth-method-desc",children:"Browser login flow"})]}),e.jsxs("button",{type:"button",className:`gmail-auth-method-btn ${r==="service_account"?"active":""}`,onClick:()=>{I("service_account"),i(null)},children:[e.jsx("span",{className:"gmail-auth-method-icon",children:e.jsx(B,{name:"robot",size:14})}),e.jsx("span",{className:"gmail-auth-method-label",children:"Service Account"}),e.jsx("span",{className:"gmail-auth-method-desc",children:"Domain-wide delegation"})]})]})]}),r==="oauth2"&&k&&!N&&e.jsxs(e.Fragment,{children:[e.jsx("h4",{className:"gmail-oauth-section-title",children:"Google OAuth Credentials"}),e.jsxs("div",{className:"gmail-oauth-shared-banner",children:[e.jsxs("div",{className:"gmail-oauth-shared-title",children:[e.jsx("span",{children:"✓"}),e.jsx("span",{children:"Credentials already configured"})]}),e.jsx("div",{className:"gmail-oauth-shared-body",children:"Existing Google OAuth credentials (Client ID and Secret) are saved in your secrets store — they're shared between Gmail, Calendar, and Drive. You may still need to re-authorize once so the refresh token grants Gmail access."})]})]}),r==="oauth2"&&(!k||N)&&e.jsxs(e.Fragment,{children:[e.jsx("h4",{className:"gmail-oauth-section-title",children:"Google OAuth Credentials"}),e.jsxs("p",{className:"gmail-oauth-help",children:["Create OAuth2 credentials in the"," ",e.jsx("a",{href:"https://console.cloud.google.com/apis/credentials",target:"_blank",rel:"noopener noreferrer",className:"gmail-oauth-link",children:"Google Cloud Console"}),". Enable the Gmail API and (optionally) the Calendar API. Set the redirect URI to:"," ",e.jsx("code",{className:"gmail-oauth-code",children:w.trim()?`${w.trim().replace(/\/$/,"")}/api/email/auth/callback`:y("/api/email/auth/callback")})]}),e.jsxs("div",{className:"gmail-oauth-field",children:[e.jsxs("label",{className:"integration-field-label",children:["OAuth Client ID ",e.jsx("span",{className:"integration-field-required",children:"*"})]}),e.jsx("input",{type:"text",className:"integration-field-input",value:g,placeholder:"xxxx.apps.googleusercontent.com",onChange:a=>L(a.target.value)})]}),e.jsxs("div",{className:"gmail-oauth-field",children:[e.jsxs("label",{className:"integration-field-label",children:["OAuth Client Secret ",e.jsx("span",{className:"integration-field-required",children:"*"})]}),e.jsx("input",{type:"password",className:"integration-field-input",value:v,placeholder:o.values.clientSecret?"(saved)":"Enter client secret",onChange:a=>q(a.target.value),autoComplete:"off"})]}),e.jsxs("div",{className:"gmail-oauth-field",children:[e.jsx("label",{className:"integration-field-label",children:"OAuth Redirect Base URL"}),e.jsx("input",{type:"text",className:"integration-field-input",value:w,placeholder:"http://localhost:6200",onChange:a=>K(a.target.value),autoComplete:"off"}),e.jsxs("span",{className:"integration-field-description",children:["Override the base URL used to build the OAuth redirect (e.g. ",e.jsx("code",{children:"http://commander.local:10003"}),"). Leave empty to use the server's local address. Google does not accept raw IPs — use a domain (you can map one in ",e.jsx("code",{children:"/etc/hosts"}),")."]})]})]}),r==="service_account"&&e.jsxs(e.Fragment,{children:[e.jsx("h4",{className:"gmail-oauth-section-title",children:"Service Account Credentials"}),e.jsxs("p",{className:"gmail-oauth-help",children:["Use a Google service account with"," ",e.jsx("a",{href:"https://admin.google.com/ac/owl/domainwidedelegation",target:"_blank",rel:"noopener noreferrer",className:"gmail-oauth-link",children:"domain-wide delegation"})," ","enabled. The service account must be authorized for Gmail scopes in Google Workspace Admin."]}),e.jsxs("div",{className:"gmail-oauth-field",children:[e.jsxs("label",{className:"integration-field-label",children:["Service Account JSON ",e.jsx("span",{className:"integration-field-required",children:"*"})]}),e.jsx("textarea",{className:"integration-field-input integration-field-textarea",value:m,placeholder:D?"(saved — paste new JSON to replace)":"Paste the full service account JSON key file contents",onChange:a=>$(a.target.value),rows:6,spellCheck:!1}),e.jsx("span",{className:"integration-field-description",children:"The JSON key file downloaded from Google Cloud Console containing client_email and private_key."})]}),e.jsxs("div",{className:"gmail-oauth-field",children:[e.jsxs("label",{className:"integration-field-label",children:["Impersonate Email ",e.jsx("span",{className:"integration-field-required",children:"*"})]}),e.jsx("input",{type:"email",className:"integration-field-input",value:j,placeholder:"user@yourdomain.com",onChange:a=>Y(a.target.value)}),e.jsx("span",{className:"integration-field-description",children:"The email address to impersonate via domain-wide delegation. Must be a user in your Google Workspace domain."})]})]}),e.jsxs("div",{className:"gmail-oauth-field",children:[e.jsx("label",{className:"integration-field-label",children:"Polling Interval (ms)"}),e.jsx("input",{type:"number",className:"integration-field-input",value:p,onChange:a=>E(a.target.value)}),e.jsx("span",{className:"integration-field-description",children:"How often to check for new emails. Default: 30000 (30s)."})]}),e.jsxs("div",{className:"gmail-oauth-field",children:[e.jsx("label",{className:"integration-field-label",children:"Approval Keywords"}),e.jsx("textarea",{className:"integration-field-input integration-field-textarea",value:x,onChange:a=>O(a.target.value),rows:2}),e.jsx("span",{className:"integration-field-description",children:"Comma-separated keywords that indicate email approval."})]}),e.jsxs("div",{className:"integration-form-actions",children:[e.jsx("button",{type:"button",className:"integration-btn cancel",onClick:z,children:"Cancel"}),r==="oauth2"&&k&&!N?e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:"integration-btn secondary",onClick:()=>W(!0),disabled:c,children:"Edit credentials"}),e.jsx("button",{type:"button",className:"integration-btn save",onClick:X,disabled:c,children:c?"Loading...":"Authorize with existing credentials"})]}):r==="oauth2"?e.jsx("button",{type:"button",className:"integration-btn save",onClick:Q,disabled:c||!g.trim(),children:c?"Saving...":"Save & Authorize"}):e.jsx("button",{type:"button",className:"integration-btn save",onClick:V,disabled:c||!j.trim()||!m.trim()&&!D,children:c?"Connecting...":"Save & Connect"})]})]}),b==="authorize"&&e.jsxs("div",{className:"gmail-oauth-section",children:[e.jsx("h4",{className:"gmail-oauth-section-title",children:"Authorize Gmail Access"}),e.jsx("p",{className:"gmail-oauth-help",children:"Click the link below to authorize Tide Commander to access your Gmail account. After granting access, you will be redirected back and the connection will be established automatically."}),M&&e.jsx("a",{href:M,target:"_blank",rel:"noopener noreferrer",className:"gmail-oauth-authorize-btn",children:"Authorize with Google"}),e.jsxs("div",{className:"gmail-oauth-waiting",children:[e.jsx("span",{className:"gmail-oauth-spinner"}),e.jsx("span",{children:"Waiting for authorization to complete..."})]}),e.jsx("div",{className:"integration-form-actions",children:e.jsx("button",{type:"button",className:"integration-btn cancel",onClick:()=>{s.current&&(clearInterval(s.current),s.current=null),h("credentials")},children:"Back"})})]}),b==="connected"&&e.jsxs("div",{className:"gmail-oauth-section",children:[e.jsx("h4",{className:"gmail-oauth-section-title",children:"Gmail Connected"}),e.jsxs("div",{className:"gmail-oauth-connected-info",children:[e.jsx("span",{className:"gmail-oauth-connected-badge",children:"Connected"}),(n==null?void 0:n.emailAddress)&&e.jsx("span",{className:"gmail-oauth-email",children:n.emailAddress}),e.jsx("span",{className:"gmail-oauth-auth-type",children:r==="service_account"?"Service Account":"OAuth 2.0"})]}),e.jsxs("div",{className:"gmail-polling-toggle-row",children:[e.jsxs("div",{className:"gmail-polling-toggle-info",children:[e.jsx("div",{className:"gmail-polling-toggle-label",children:"Automatic Polling"}),e.jsx("div",{className:"gmail-polling-toggle-status",children:n!=null&&n.pollingActive?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"gmail-polling-dot active"}),"Active",n.lastChecked&&e.jsxs("span",{className:"gmail-polling-last",children:["— last checked ",new Date(n.lastChecked).toLocaleTimeString()]})]}):e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"gmail-polling-dot paused"}),"Paused — new emails will not be ingested"]})})]}),e.jsx("button",{type:"button",role:"switch","aria-checked":!!(n!=null&&n.pollingActive),"aria-label":"Toggle automatic polling",className:`gmail-polling-switch ${n!=null&&n.pollingActive?"on":"off"}`,onClick:ee,disabled:H,children:e.jsx("span",{className:"gmail-polling-switch-thumb"})})]}),e.jsxs("div",{className:"gmail-oauth-field",children:[e.jsx("label",{className:"integration-field-label",children:"Polling Interval (ms)"}),e.jsx("input",{type:"number",className:"integration-field-input",value:p,onChange:a=>E(a.target.value)})]}),e.jsxs("div",{className:"gmail-oauth-field",children:[e.jsx("label",{className:"integration-field-label",children:"Approval Keywords"}),e.jsx("textarea",{className:"integration-field-input integration-field-textarea",value:x,onChange:a=>O(a.target.value),rows:2})]}),e.jsxs("div",{className:"integration-form-actions",children:[e.jsx("button",{type:"button",className:"integration-btn cancel",onClick:z,children:"Close"}),e.jsx("button",{type:"button",className:"integration-btn",style:{backgroundColor:"#f38ba8",color:"#1e1e2e"},onClick:ae,disabled:c,children:c?"Disconnecting...":"Disconnect"}),e.jsx("button",{type:"button",className:"integration-btn save",onClick:Z,disabled:U,children:U?"Saving...":"Save Settings"})]})]}),e.jsx("style",{children:`
|
|
1
|
+
import{r as t,c as S,d as y,j as e,I as B}from"./main-BKRg0DBA.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-DSCAlQQW.js";function oe({integration:o,onSave:f,onCancel:z}){const[r,I]=t.useState(o.values.authMethod||"oauth2"),[g,L]=t.useState(o.values.clientId||""),[v,q]=t.useState(""),[w,K]=t.useState(o.values.redirectBaseUrl||""),[m,$]=t.useState(""),[j,Y]=t.useState(o.values.impersonateEmail||""),[p,E]=t.useState(String(o.values.pollingIntervalMs??3e4)),[x,O]=t.useState(o.values.defaultApprovalKeywords||"approved,aprobado,autorizado,yes,ok"),[M,G]=t.useState(null),[n,T]=t.useState(null),[c,d]=t.useState(!1),[P,i]=t.useState(null),[U,F]=t.useState(!1),[H,J]=t.useState(!1),[N,W]=t.useState(!1),[b,h]=t.useState(o.status.connected?"connected":"credentials"),k=r==="oauth2"&&o.values.clientId==="********"&&o.values.clientSecret==="********",s=t.useRef(null),_=t.useRef(o.status.connected),u=t.useCallback(async()=>{try{const a=await S(y("/api/email/status"));if(a.ok){const l=await a.json();T(l),l.authenticated&&(h("connected"),s.current&&(clearInterval(s.current),s.current=null))}}catch(a){console.error("Failed to fetch Gmail status:",a)}},[]);t.useEffect(()=>{const a=o.status.connected,l=_.current;a&&!l&&b!=="connected"?h("connected"):!a&&l&&b==="connected"&&h("credentials"),_.current=a},[o.status.connected]),t.useEffect(()=>(u(),()=>{s.current&&clearInterval(s.current)}),[u]);const R=async()=>{const a=await S(y("/api/email/auth/url"));if(!a.ok){const A=await a.json().catch(()=>({}));throw new Error(A.error||`HTTP ${a.status}`)}const l=await a.json();if(!l.url)throw new Error("OAuth URL is empty");G(l.url),i(null),h("authorize"),s.current&&clearInterval(s.current),s.current=setInterval(u,3e3)},X=async()=>{d(!0),i(null);try{await R()}catch(a){i(a instanceof Error?a.message:"Failed to get OAuth URL")}finally{d(!1)}},Q=async()=>{if(!g.trim()){i("Client ID is required");return}d(!0),i(null);try{const a={authMethod:"oauth2",redirectBaseUrl:w.trim(),pollingIntervalMs:parseInt(p)||3e4,defaultApprovalKeywords:x};g.trim()&&g.trim()!=="********"&&(a.clientId=g.trim()),v.trim()&&v.trim()!=="********"&&(a.clientSecret=v.trim()),await f(a),await R()}catch(a){const l=a instanceof Error?a.message:"Failed to get OAuth URL";i(l)}finally{d(!1)}},V=async()=>{if(!m.trim()){i("Service Account JSON is required");return}if(!j.trim()){i("Impersonate Email is required");return}try{const a=JSON.parse(m.trim());if(!a.client_email||!a.private_key){i("Service Account JSON must contain client_email and private_key");return}}catch{i("Invalid JSON in Service Account field");return}d(!0),i(null);try{await f({authMethod:"service_account",serviceAccountJson:m.trim(),impersonateEmail:j.trim(),pollingIntervalMs:parseInt(p)||3e4,defaultApprovalKeywords:x}),await new Promise(a=>setTimeout(a,1e3)),await u()}catch(a){const l=a instanceof Error?a.message:"Failed to save service account";i(l)}finally{d(!1)}},Z=async()=>{F(!0),i(null);try{await f({pollingIntervalMs:parseInt(p)||3e4,defaultApprovalKeywords:x})}catch(a){i(a instanceof Error?a.message:"Failed to save settings")}finally{F(!1)}},ee=async()=>{const a=!(n!=null&&n.pollingActive);J(!0),i(null);try{const l=a?"/api/email/polling/start":"/api/email/polling/stop",A=a?{intervalMs:parseInt(p)||3e4}:{},C=await S(y(l),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(A)});if(!C.ok){const te=await C.json().catch(()=>({}));throw new Error(te.error||`HTTP ${C.status}`)}await u()}catch(l){i(l instanceof Error?l.message:"Failed to toggle polling")}finally{J(!1)}},ae=async()=>{d(!0),i(null);try{await f({refreshToken:"",serviceAccountJson:"",impersonateEmail:""}),T(null),G(null),h("credentials"),await u()}catch(a){i(a instanceof Error?a.message:"Failed to disconnect")}finally{d(!1)}},D=!!o.values.serviceAccountJson;return e.jsxs("div",{className:"gmail-oauth-setup",children:[P&&e.jsx("div",{className:"gmail-oauth-error",children:P}),b==="credentials"&&e.jsxs("div",{className:"gmail-oauth-section",children:[e.jsxs("div",{className:"gmail-oauth-field",style:{marginBottom:24},children:[e.jsx("label",{className:"integration-field-label",children:"Authentication Method"}),e.jsxs("div",{className:"gmail-auth-method-selector",children:[e.jsxs("button",{type:"button",className:`gmail-auth-method-btn ${r==="oauth2"?"active":""}`,onClick:()=>{I("oauth2"),i(null)},children:[e.jsx("span",{className:"gmail-auth-method-icon",children:e.jsx(B,{name:"key",size:14})}),e.jsx("span",{className:"gmail-auth-method-label",children:"OAuth 2.0"}),e.jsx("span",{className:"gmail-auth-method-desc",children:"Browser login flow"})]}),e.jsxs("button",{type:"button",className:`gmail-auth-method-btn ${r==="service_account"?"active":""}`,onClick:()=>{I("service_account"),i(null)},children:[e.jsx("span",{className:"gmail-auth-method-icon",children:e.jsx(B,{name:"robot",size:14})}),e.jsx("span",{className:"gmail-auth-method-label",children:"Service Account"}),e.jsx("span",{className:"gmail-auth-method-desc",children:"Domain-wide delegation"})]})]})]}),r==="oauth2"&&k&&!N&&e.jsxs(e.Fragment,{children:[e.jsx("h4",{className:"gmail-oauth-section-title",children:"Google OAuth Credentials"}),e.jsxs("div",{className:"gmail-oauth-shared-banner",children:[e.jsxs("div",{className:"gmail-oauth-shared-title",children:[e.jsx("span",{children:"✓"}),e.jsx("span",{children:"Credentials already configured"})]}),e.jsx("div",{className:"gmail-oauth-shared-body",children:"Existing Google OAuth credentials (Client ID and Secret) are saved in your secrets store — they're shared between Gmail, Calendar, and Drive. You may still need to re-authorize once so the refresh token grants Gmail access."})]})]}),r==="oauth2"&&(!k||N)&&e.jsxs(e.Fragment,{children:[e.jsx("h4",{className:"gmail-oauth-section-title",children:"Google OAuth Credentials"}),e.jsxs("p",{className:"gmail-oauth-help",children:["Create OAuth2 credentials in the"," ",e.jsx("a",{href:"https://console.cloud.google.com/apis/credentials",target:"_blank",rel:"noopener noreferrer",className:"gmail-oauth-link",children:"Google Cloud Console"}),". Enable the Gmail API and (optionally) the Calendar API. Set the redirect URI to:"," ",e.jsx("code",{className:"gmail-oauth-code",children:w.trim()?`${w.trim().replace(/\/$/,"")}/api/email/auth/callback`:y("/api/email/auth/callback")})]}),e.jsxs("div",{className:"gmail-oauth-field",children:[e.jsxs("label",{className:"integration-field-label",children:["OAuth Client ID ",e.jsx("span",{className:"integration-field-required",children:"*"})]}),e.jsx("input",{type:"text",className:"integration-field-input",value:g,placeholder:"xxxx.apps.googleusercontent.com",onChange:a=>L(a.target.value)})]}),e.jsxs("div",{className:"gmail-oauth-field",children:[e.jsxs("label",{className:"integration-field-label",children:["OAuth Client Secret ",e.jsx("span",{className:"integration-field-required",children:"*"})]}),e.jsx("input",{type:"password",className:"integration-field-input",value:v,placeholder:o.values.clientSecret?"(saved)":"Enter client secret",onChange:a=>q(a.target.value),autoComplete:"off"})]}),e.jsxs("div",{className:"gmail-oauth-field",children:[e.jsx("label",{className:"integration-field-label",children:"OAuth Redirect Base URL"}),e.jsx("input",{type:"text",className:"integration-field-input",value:w,placeholder:"http://localhost:6200",onChange:a=>K(a.target.value),autoComplete:"off"}),e.jsxs("span",{className:"integration-field-description",children:["Override the base URL used to build the OAuth redirect (e.g. ",e.jsx("code",{children:"http://commander.local:10003"}),"). Leave empty to use the server's local address. Google does not accept raw IPs — use a domain (you can map one in ",e.jsx("code",{children:"/etc/hosts"}),")."]})]})]}),r==="service_account"&&e.jsxs(e.Fragment,{children:[e.jsx("h4",{className:"gmail-oauth-section-title",children:"Service Account Credentials"}),e.jsxs("p",{className:"gmail-oauth-help",children:["Use a Google service account with"," ",e.jsx("a",{href:"https://admin.google.com/ac/owl/domainwidedelegation",target:"_blank",rel:"noopener noreferrer",className:"gmail-oauth-link",children:"domain-wide delegation"})," ","enabled. The service account must be authorized for Gmail scopes in Google Workspace Admin."]}),e.jsxs("div",{className:"gmail-oauth-field",children:[e.jsxs("label",{className:"integration-field-label",children:["Service Account JSON ",e.jsx("span",{className:"integration-field-required",children:"*"})]}),e.jsx("textarea",{className:"integration-field-input integration-field-textarea",value:m,placeholder:D?"(saved — paste new JSON to replace)":"Paste the full service account JSON key file contents",onChange:a=>$(a.target.value),rows:6,spellCheck:!1}),e.jsx("span",{className:"integration-field-description",children:"The JSON key file downloaded from Google Cloud Console containing client_email and private_key."})]}),e.jsxs("div",{className:"gmail-oauth-field",children:[e.jsxs("label",{className:"integration-field-label",children:["Impersonate Email ",e.jsx("span",{className:"integration-field-required",children:"*"})]}),e.jsx("input",{type:"email",className:"integration-field-input",value:j,placeholder:"user@yourdomain.com",onChange:a=>Y(a.target.value)}),e.jsx("span",{className:"integration-field-description",children:"The email address to impersonate via domain-wide delegation. Must be a user in your Google Workspace domain."})]})]}),e.jsxs("div",{className:"gmail-oauth-field",children:[e.jsx("label",{className:"integration-field-label",children:"Polling Interval (ms)"}),e.jsx("input",{type:"number",className:"integration-field-input",value:p,onChange:a=>E(a.target.value)}),e.jsx("span",{className:"integration-field-description",children:"How often to check for new emails. Default: 30000 (30s)."})]}),e.jsxs("div",{className:"gmail-oauth-field",children:[e.jsx("label",{className:"integration-field-label",children:"Approval Keywords"}),e.jsx("textarea",{className:"integration-field-input integration-field-textarea",value:x,onChange:a=>O(a.target.value),rows:2}),e.jsx("span",{className:"integration-field-description",children:"Comma-separated keywords that indicate email approval."})]}),e.jsxs("div",{className:"integration-form-actions",children:[e.jsx("button",{type:"button",className:"integration-btn cancel",onClick:z,children:"Cancel"}),r==="oauth2"&&k&&!N?e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:"integration-btn secondary",onClick:()=>W(!0),disabled:c,children:"Edit credentials"}),e.jsx("button",{type:"button",className:"integration-btn save",onClick:X,disabled:c,children:c?"Loading...":"Authorize with existing credentials"})]}):r==="oauth2"?e.jsx("button",{type:"button",className:"integration-btn save",onClick:Q,disabled:c||!g.trim(),children:c?"Saving...":"Save & Authorize"}):e.jsx("button",{type:"button",className:"integration-btn save",onClick:V,disabled:c||!j.trim()||!m.trim()&&!D,children:c?"Connecting...":"Save & Connect"})]})]}),b==="authorize"&&e.jsxs("div",{className:"gmail-oauth-section",children:[e.jsx("h4",{className:"gmail-oauth-section-title",children:"Authorize Gmail Access"}),e.jsx("p",{className:"gmail-oauth-help",children:"Click the link below to authorize Tide Commander to access your Gmail account. After granting access, you will be redirected back and the connection will be established automatically."}),M&&e.jsx("a",{href:M,target:"_blank",rel:"noopener noreferrer",className:"gmail-oauth-authorize-btn",children:"Authorize with Google"}),e.jsxs("div",{className:"gmail-oauth-waiting",children:[e.jsx("span",{className:"gmail-oauth-spinner"}),e.jsx("span",{children:"Waiting for authorization to complete..."})]}),e.jsx("div",{className:"integration-form-actions",children:e.jsx("button",{type:"button",className:"integration-btn cancel",onClick:()=>{s.current&&(clearInterval(s.current),s.current=null),h("credentials")},children:"Back"})})]}),b==="connected"&&e.jsxs("div",{className:"gmail-oauth-section",children:[e.jsx("h4",{className:"gmail-oauth-section-title",children:"Gmail Connected"}),e.jsxs("div",{className:"gmail-oauth-connected-info",children:[e.jsx("span",{className:"gmail-oauth-connected-badge",children:"Connected"}),(n==null?void 0:n.emailAddress)&&e.jsx("span",{className:"gmail-oauth-email",children:n.emailAddress}),e.jsx("span",{className:"gmail-oauth-auth-type",children:r==="service_account"?"Service Account":"OAuth 2.0"})]}),e.jsxs("div",{className:"gmail-polling-toggle-row",children:[e.jsxs("div",{className:"gmail-polling-toggle-info",children:[e.jsx("div",{className:"gmail-polling-toggle-label",children:"Automatic Polling"}),e.jsx("div",{className:"gmail-polling-toggle-status",children:n!=null&&n.pollingActive?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"gmail-polling-dot active"}),"Active",n.lastChecked&&e.jsxs("span",{className:"gmail-polling-last",children:["— last checked ",new Date(n.lastChecked).toLocaleTimeString()]})]}):e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"gmail-polling-dot paused"}),"Paused — new emails will not be ingested"]})})]}),e.jsx("button",{type:"button",role:"switch","aria-checked":!!(n!=null&&n.pollingActive),"aria-label":"Toggle automatic polling",className:`gmail-polling-switch ${n!=null&&n.pollingActive?"on":"off"}`,onClick:ee,disabled:H,children:e.jsx("span",{className:"gmail-polling-switch-thumb"})})]}),e.jsxs("div",{className:"gmail-oauth-field",children:[e.jsx("label",{className:"integration-field-label",children:"Polling Interval (ms)"}),e.jsx("input",{type:"number",className:"integration-field-input",value:p,onChange:a=>E(a.target.value)})]}),e.jsxs("div",{className:"gmail-oauth-field",children:[e.jsx("label",{className:"integration-field-label",children:"Approval Keywords"}),e.jsx("textarea",{className:"integration-field-input integration-field-textarea",value:x,onChange:a=>O(a.target.value),rows:2})]}),e.jsxs("div",{className:"integration-form-actions",children:[e.jsx("button",{type:"button",className:"integration-btn cancel",onClick:z,children:"Close"}),e.jsx("button",{type:"button",className:"integration-btn",style:{backgroundColor:"#f38ba8",color:"#1e1e2e"},onClick:ae,disabled:c,children:c?"Disconnecting...":"Disconnect"}),e.jsx("button",{type:"button",className:"integration-btn save",onClick:Z,disabled:U,children:U?"Saving...":"Save Settings"})]})]}),e.jsx("style",{children:`
|
|
2
2
|
.gmail-oauth-setup {
|
|
3
3
|
padding: 0;
|
|
4
4
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r,c as E,d as y,j as e}from"./main-
|
|
1
|
+
import{r,c as E,d as y,j as e}from"./main-BKRg0DBA.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-DSCAlQQW.js";function F({integration:o,onSave:k,onCancel:x}){const[g,G]=r.useState(o.values.GOOGLE_CLIENT_ID||""),[f,O]=r.useState(""),[m,A]=r.useState(o.values.GOOGLE_REDIRECT_BASE_URL||""),[N,z]=r.useState(null),[a,S]=r.useState(null),[l,h]=r.useState(!1),[C,s]=r.useState(null),[L,w]=r.useState(!1),I=o.values.GOOGLE_CLIENT_ID==="********"&&o.values.GOOGLE_CLIENT_SECRET==="********",[b,p]=r.useState(o.status.needsReauth?"expired":o.status.connected?"connected":"credentials"),n=r.useRef(null),j=r.useCallback(async(t=!1)=>{try{const d={gmail:"/api/email/status","google-calendar":"/api/calendar/status","google-drive":"/api/drive/status"}[o.id]||"/api/calendar/status",u=await E(y(t?`${d}?probe=1`:d));if(u.ok){const c=await u.json();S(c),c.needsReauth?p("expired"):c.authenticated&&p("connected"),(c.authenticated||c.needsReauth)&&n.current&&(clearInterval(n.current),n.current=null)}}catch(i){console.error("Failed to fetch Google auth status:",i)}},[o.id]);r.useEffect(()=>(j(!0),()=>{n.current&&clearInterval(n.current)}),[j]);const v=async()=>{const i={gmail:"/api/email/auth/url","google-calendar":"/api/calendar/auth/url","google-drive":"/api/drive/auth/url"}[o.id]||"/api/calendar/auth/url",d=await E(y(i));if(!d.ok){const c=await d.json().catch(()=>({}));throw new Error(c.error||`HTTP ${d.status}`)}const u=await d.json();if(!u.url)throw new Error("OAuth URL is empty");z(u.url),s(null),p("authorize"),n.current&&clearInterval(n.current),n.current=setInterval(j,3e3)},R=async()=>{h(!0),s(null);try{await v()}catch(t){s(t instanceof Error?t.message:"Failed to get OAuth URL")}finally{h(!1)}},_=async()=>{if(!g.trim()){s("Client ID is required");return}h(!0),s(null);try{const t={GOOGLE_REDIRECT_BASE_URL:m.trim()};g.trim()&&g.trim()!=="********"&&(t.GOOGLE_CLIENT_ID=g.trim()),f.trim()&&(t.GOOGLE_CLIENT_SECRET=f.trim()),console.log("Saving Google OAuth config...",t),await k(t),console.log("Config saved successfully"),await v()}catch(t){const i=t instanceof Error?t.message:"Failed to get OAuth URL";console.error("Error in handleSaveCredentials:",i,t),s(i)}finally{h(!1)}};return e.jsxs("div",{className:"google-oauth-setup",children:[C&&e.jsx("div",{className:"google-oauth-error",children:C}),b==="credentials"&&e.jsxs("div",{className:"google-oauth-section",children:[e.jsx("h4",{className:"google-oauth-section-title",children:"Google OAuth Credentials"}),I&&!L?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"google-oauth-shared-banner",children:[e.jsxs("div",{className:"google-oauth-shared-title",children:[e.jsx("span",{children:"✓"}),e.jsx("span",{children:"Credentials already configured"})]}),e.jsx("div",{className:"google-oauth-shared-body",children:"Existing Google OAuth credentials (Client ID and Secret) are saved in your secrets store — they're shared between Gmail, Calendar, and Drive. You may still need to re-authorize once so the refresh token grants access to this service."})]}),e.jsxs("div",{className:"integration-form-actions",children:[e.jsx("button",{type:"button",className:"integration-btn cancel",onClick:x,children:"Cancel"}),e.jsx("button",{type:"button",className:"integration-btn secondary",onClick:()=>w(!0),disabled:l,children:"Edit credentials"}),e.jsx("button",{type:"button",className:"integration-btn save",onClick:R,disabled:l,children:l?"Loading...":"Authorize with existing credentials"})]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("p",{className:"google-oauth-help",children:["Create OAuth2 credentials in the"," ",e.jsx("a",{href:"https://console.cloud.google.com/apis/credentials",target:"_blank",rel:"noopener noreferrer",className:"google-oauth-link",children:"Google Cloud Console"}),". Enable the relevant API (Gmail, Calendar, or Drive). Set the redirect URI to:"," ",e.jsx("code",{className:"google-oauth-code",children:(()=>{const t=o.id==="gmail"?"/api/email/auth/callback":o.id==="google-drive"?"/api/drive/auth/callback":"/api/calendar/auth/callback",i=m.trim();return i?`${i.replace(/\/$/,"")}${t}`:y(t)})()})]}),e.jsxs("div",{className:"google-oauth-field",children:[e.jsxs("label",{className:"integration-field-label",children:["OAuth Client ID ",e.jsx("span",{className:"integration-field-required",children:"*"})]}),e.jsx("input",{type:"text",className:"integration-field-input",value:g,placeholder:"xxxx.apps.googleusercontent.com",onChange:t=>G(t.target.value)})]}),e.jsxs("div",{className:"google-oauth-field",children:[e.jsxs("label",{className:"integration-field-label",children:["OAuth Client Secret ",e.jsx("span",{className:"integration-field-required",children:"*"})]}),e.jsx("input",{type:"password",className:"integration-field-input",value:f,placeholder:o.values.GOOGLE_CLIENT_SECRET?"(saved)":"Enter client secret",onChange:t=>O(t.target.value),autoComplete:"off"})]}),e.jsxs("div",{className:"google-oauth-field",children:[e.jsx("label",{className:"integration-field-label",children:"OAuth Redirect Base URL"}),e.jsx("input",{type:"text",className:"integration-field-input",value:m,placeholder:"http://localhost:6200",onChange:t=>A(t.target.value),autoComplete:"off"}),e.jsxs("span",{className:"integration-field-description",style:{display:"block",marginTop:7,color:"#7f849c",fontSize:12},children:["Override the base URL used to build the OAuth redirect (e.g. ",e.jsx("code",{children:"http://commander.local:10003"}),"). Shared across Gmail, Calendar, and Drive. Leave empty to use the server's local address. Google does not accept raw IPs — use a domain (you can map one in ",e.jsx("code",{children:"/etc/hosts"}),")."]})]}),e.jsxs("div",{className:"integration-form-actions",children:[e.jsx("button",{type:"button",className:"integration-btn cancel",onClick:x,children:"Cancel"}),e.jsx("button",{type:"button",className:"integration-btn save",onClick:_,disabled:l||!g.trim(),children:l?"Saving...":"Save & Authorize"})]})]})]}),b==="authorize"&&e.jsxs("div",{className:"google-oauth-section",children:[e.jsx("h4",{className:"google-oauth-section-title",children:"Authorize Google Access"}),e.jsx("p",{className:"google-oauth-help",children:"Click the link below to authorize Tide Commander to access your Google account. After granting access, you will be redirected back and the connection will be established automatically."}),N&&e.jsx("a",{href:N,target:"_blank",rel:"noopener noreferrer",className:"google-oauth-authorize-btn",children:"Authorize with Google"}),e.jsxs("div",{className:"google-oauth-waiting",children:[e.jsx("span",{className:"google-oauth-spinner"}),e.jsx("span",{children:"Waiting for authorization to complete..."})]}),e.jsx("div",{className:"integration-form-actions",children:e.jsx("button",{type:"button",className:"integration-btn cancel",onClick:()=>{n.current&&(clearInterval(n.current),n.current=null),p("credentials")},children:"Back"})})]}),b==="expired"&&e.jsxs("div",{className:"google-oauth-section",children:[e.jsx("h4",{className:"google-oauth-section-title",children:"Google Authorization Expired"}),e.jsxs("div",{className:"google-oauth-expired-banner",children:[e.jsxs("div",{className:"google-oauth-expired-title",children:[e.jsx("span",{children:"⚠"}),e.jsx("span",{children:(a==null?void 0:a.tokenState)==="invalid_client"?"OAuth credentials rejected":"Token expired — reconnect required"})]}),e.jsx("div",{className:"google-oauth-expired-body",children:(a==null?void 0:a.tokenState)==="invalid_client"?e.jsx(e.Fragment,{children:"Google rejected the Client ID / Client Secret. Confirm the OAuth client still exists in the Google Cloud Console, then re-enter the credentials."}):e.jsxs(e.Fragment,{children:["Google rejected the stored refresh token, so Gmail, Calendar, and Drive can no longer act on your account — they all share this one token. This normally happens when access is revoked, the account password changed, or the OAuth consent screen is still in ",e.jsx("strong",{children:"Testing"})," mode (Google expires those refresh tokens after 7 days — publish the app to stop it recurring)."]})}),(a==null?void 0:a.error)&&e.jsx("div",{className:"google-oauth-expired-detail",children:a.error})]}),e.jsxs("div",{className:"integration-form-actions",children:[e.jsx("button",{type:"button",className:"integration-btn cancel",onClick:x,children:"Close"}),e.jsx("button",{type:"button",className:"integration-btn secondary",onClick:()=>{w(!0),p("credentials")},disabled:l,children:"Edit credentials"}),e.jsx("button",{type:"button",className:"integration-btn save",onClick:async()=>{h(!0),s(null);try{await v()}catch(t){s(t instanceof Error?t.message:"Failed to get OAuth URL")}finally{h(!1)}},disabled:l,children:l?"Loading...":"Reconnect Google"})]})]}),b==="connected"&&e.jsxs("div",{className:"google-oauth-section",children:[e.jsx("h4",{className:"google-oauth-section-title",children:"Google Connected"}),e.jsxs("div",{className:"google-oauth-connected-info",children:[e.jsx("span",{className:"google-oauth-connected-badge",children:"Connected"}),(a==null?void 0:a.emailAddress)&&e.jsx("span",{className:"google-oauth-email",children:a.emailAddress})]}),e.jsx("p",{className:"google-oauth-help",children:"Your Google account has been successfully connected."}),e.jsx("div",{className:"integration-form-actions",children:e.jsx("button",{type:"button",className:"integration-btn cancel",onClick:async()=>{await k({}),x()},children:"Close"})})]}),e.jsx("style",{children:`
|
|
2
2
|
.google-oauth-setup {
|
|
3
3
|
padding: 0;
|
|
4
4
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as K,r as a,j as e}from"./main-
|
|
1
|
+
import{u as K,r as a,j as e}from"./main-BKRg0DBA.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-DSCAlQQW.js";function se({url:l,title:W,isOpen:g,onClose:I,initialWidth:H=480,initialHeight:B=360,minWidth:M=320,minHeight:b=240}){const{t:n}=K(["terminal","common"]),[Z,h]=a.useState(!0),[L,k]=a.useState(!1),[o,$]=a.useState({width:H,height:B}),[s,y]=a.useState(null),[f,z]=a.useState(1),[O,R]=a.useState(!1),[T,X]=a.useState(!1),N=a.useRef(null),U=a.useRef(null),d=a.useRef(null),r=a.useRef(null);a.useEffect(()=>{if(g&&!s){const t=Math.max(50,(window.innerWidth-o.width)/2),c=Math.max(50,(window.innerHeight-o.height)/2);y({x:t,y:c})}},[g,s,o.width,o.height]),a.useEffect(()=>{h(!0),k(!1)},[l]);const A=a.useCallback(()=>{h(!1)},[]),V=a.useCallback(()=>{h(!1),k(!0)},[]),Y=a.useCallback(()=>{N.current&&(h(!0),k(!1),N.current.src=l)},[l]),_=a.useCallback(()=>{window.open(l,"_blank")},[l]),q=a.useCallback(()=>{z(t=>Math.min(2,t+.25))},[]),F=a.useCallback(()=>{z(t=>Math.max(.25,t-.25))},[]),G=a.useCallback(()=>{z(1)},[]),J=a.useCallback(t=>{if(t.target.closest(".iframe-modal-btn"))return;t.preventDefault(),R(!0),d.current={startX:t.clientX,startY:t.clientY,startPosX:(s==null?void 0:s.x)??0,startPosY:(s==null?void 0:s.y)??0};const c=m=>{if(!d.current)return;const w=m.clientX-d.current.startX,j=m.clientY-d.current.startY;y({x:Math.max(0,Math.min(window.innerWidth-100,d.current.startPosX+w)),y:Math.max(0,Math.min(window.innerHeight-50,d.current.startPosY+j))})},x=()=>{d.current=null,R(!1),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",x)};document.addEventListener("mousemove",c),document.addEventListener("mouseup",x)},[s]),i=a.useCallback((t,c)=>{t.preventDefault(),t.stopPropagation(),X(!0);const x={startX:t.clientX,startY:t.clientY,startW:o.width,startH:o.height,startPosX:(s==null?void 0:s.x)??0,startPosY:(s==null?void 0:s.y)??0,direction:c};r.current=x;const m=j=>{if(!r.current)return;const p=j.clientX-r.current.startX,C=j.clientY-r.current.startY,v=r.current.direction;let E=r.current.startW,D=r.current.startH,P=r.current.startPosX,S=r.current.startPosY;if(v.includes("e")&&(E=Math.max(M,r.current.startW+p)),v.includes("w")){const u=r.current.startW-p;u>=M&&(E=u,P=r.current.startPosX+p)}if(v.includes("s")&&(D=Math.max(b,r.current.startH+C)),v.includes("n")){const u=r.current.startH-C;u>=b&&(D=u,S=r.current.startPosY+C)}$({width:E,height:D}),y({x:P,y:S})},w=()=>{r.current=null,X(!1),document.removeEventListener("mousemove",m),document.removeEventListener("mouseup",w)};document.addEventListener("mousemove",m),document.addEventListener("mouseup",w)},[o,s,M,b]);return g?e.jsxs("div",{ref:U,className:`iframe-modal ${O?"dragging":""} ${T?"resizing":""}`,style:{left:(s==null?void 0:s.x)??0,top:(s==null?void 0:s.y)??0,width:o.width,height:o.height},children:[e.jsxs("div",{className:"iframe-modal-toolbar",onMouseDown:J,children:[e.jsx("div",{className:"iframe-modal-title",title:l,children:W||l}),e.jsxs("div",{className:"iframe-modal-actions",children:[e.jsx("button",{className:"iframe-modal-btn",onClick:F,title:n("terminal:iframeModal.zoomOut"),children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("circle",{cx:"11",cy:"11",r:"8"}),e.jsx("line",{x1:"8",y1:"11",x2:"14",y2:"11"})]})}),e.jsxs("button",{className:"iframe-modal-btn iframe-modal-zoom-label",onClick:G,title:n("terminal:iframeModal.resetZoom"),children:[Math.round(f*100),"%"]}),e.jsx("button",{className:"iframe-modal-btn",onClick:q,title:n("terminal:iframeModal.zoomIn"),children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("circle",{cx:"11",cy:"11",r:"8"}),e.jsx("line",{x1:"11",y1:"8",x2:"11",y2:"14"}),e.jsx("line",{x1:"8",y1:"11",x2:"14",y2:"11"})]})}),e.jsx("div",{className:"iframe-modal-separator"}),e.jsx("button",{className:"iframe-modal-btn",onClick:Y,title:n("terminal:iframeModal.refresh"),children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M23 4v6h-6M1 20v-6h6"}),e.jsx("path",{d:"M3.51 9a9 9 0 0114.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0020.49 15"})]})}),e.jsx("button",{className:"iframe-modal-btn",onClick:_,title:n("terminal:iframeModal.openInBrowser"),children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"}),e.jsx("polyline",{points:"15 3 21 3 21 9"}),e.jsx("line",{x1:"10",y1:"14",x2:"21",y2:"3"})]})}),e.jsx("button",{className:"iframe-modal-btn iframe-modal-close",onClick:I,title:n("common:buttons.close"),children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]})]}),e.jsxs("div",{className:"iframe-modal-content",children:[Z&&e.jsxs("div",{className:"iframe-modal-loading",children:[e.jsx("div",{className:"iframe-modal-spinner"}),e.jsx("span",{children:n("common:status.loading")})]}),L&&e.jsxs("div",{className:"iframe-modal-error",children:[e.jsx("span",{children:n("terminal:iframeModal.failedToLoad")}),e.jsx("button",{onClick:Y,children:n("terminal:iframeModal.retry")})]}),e.jsx("iframe",{ref:N,src:l,className:"iframe-modal-frame",onLoad:A,onError:V,style:{display:L?"none":"block",transform:`scale(${f})`,transformOrigin:"top left",width:`${100/f}%`,height:`${100/f}%`}})]}),e.jsx("div",{className:"iframe-modal-resize-handle iframe-modal-resize-n",onMouseDown:t=>i(t,"n")}),e.jsx("div",{className:"iframe-modal-resize-handle iframe-modal-resize-s",onMouseDown:t=>i(t,"s")}),e.jsx("div",{className:"iframe-modal-resize-handle iframe-modal-resize-e",onMouseDown:t=>i(t,"e")}),e.jsx("div",{className:"iframe-modal-resize-handle iframe-modal-resize-w",onMouseDown:t=>i(t,"w")}),e.jsx("div",{className:"iframe-modal-resize-handle iframe-modal-resize-ne",onMouseDown:t=>i(t,"ne")}),e.jsx("div",{className:"iframe-modal-resize-handle iframe-modal-resize-nw",onMouseDown:t=>i(t,"nw")}),e.jsx("div",{className:"iframe-modal-resize-handle iframe-modal-resize-se",onMouseDown:t=>i(t,"se")}),e.jsx("div",{className:"iframe-modal-resize-handle iframe-modal-resize-sw",onMouseDown:t=>i(t,"sw")})]}):null}export{se as IframeModal,se as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/GmailOAuthSetup-
|
|
2
|
-
import{r as d,c as w,d as A,j as e,V as P,a2 as R}from"./main-BBvM-_Ia.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-DSCAlQQW.js";const z={"gmail-oauth":d.lazy(()=>R(()=>import("./GmailOAuthSetup-CzinZ6aZ.js"),__vite__mapDeps([0,1,2,3,4])).then(n=>({default:n.GmailOAuthSetup}))),"google-oauth":d.lazy(()=>R(()=>import("./GoogleOAuthSetup-DhVaIj11.js"),__vite__mapDeps([5,1,2,3,4])).then(n=>({default:n.GoogleOAuthSetup}))),"slack-multi-instance":d.lazy(()=>R(()=>import("./SlackMultiInstanceSetup-bpmQ5yCA.js"),__vite__mapDeps([6,1,2,3,4])).then(n=>({default:n.SlackMultiInstanceSetup})))},E={gmail:"✉️",slack:"💬",jira:"📋","google-calendar":"📅","google-drive":"📁",docx:"📄"},B={gmail:"Send and receive emails through Gmail. Supports OAuth 2.0 authentication for secure access to your inbox.",slack:"Connect to Slack workspaces. Send messages, receive notifications, and integrate with channels.",jira:"Manage Jira issues and projects. Create tickets, track progress, and handle service desk requests.","google-calendar":"Access Google Calendar events. Create, update, and monitor calendar entries.","google-drive":"Read, create, and edit files in Google Drive. Search and manage folders.",docx:"Generate and manipulate DOCX documents. Create reports, templates, and formatted documents."},_={gmail:["Google Cloud Console project","OAuth 2.0 credentials (Client ID & Secret)","Gmail API enabled"],slack:["Bot token (xoxb-) with App-Level Token for real-time Socket Mode, OR User token (xoxp-) for polling mode (~30-60s lag, no Slack app config needed)","For Socket Mode: enable Socket Mode + Event Subscriptions; subscribe to bot events message.channels, message.groups, message.im","Required scopes: channels:history, channels:read, chat:write, groups:history, groups:read, im:history, im:read, users:read","Polling mode (xoxp-) mirrors all channels/groups/DMs the user is a member of — supports xoxp- user tokens that cannot use Socket Mode"],jira:["Jira Cloud instance URL","API Token (from Atlassian account)","Account email address"],"google-calendar":["Google Cloud Console project","OAuth 2.0 credentials","Calendar API enabled"],"google-drive":["Google Cloud Console project","OAuth 2.0 credentials (Client ID & Secret)","Google Drive API enabled"],docx:["No external credentials required","Templates directory (optional)"]},s={overlay:{position:"fixed",inset:0,background:"rgba(0, 0, 0, 0.6)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:1e4,backdropFilter:"blur(4px)",animation:"fadeIn 0.15s ease-out"},modal:{background:"var(--surface-0, #1e1e2e)",borderRadius:12,border:"1px solid var(--border, #313244)",width:"90vw",maxWidth:720,maxHeight:"85vh",display:"flex",flexDirection:"column",overflow:"hidden",boxShadow:"0 20px 60px rgba(0, 0, 0, 0.5)",animation:"slideUp 0.2s ease-out"},header:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"16px 20px",borderBottom:"1px solid var(--border, #313244)",background:"var(--surface-1, #181825)"},headerTitle:{fontSize:16,fontWeight:600,color:"var(--text-primary, #cdd6f4)",display:"flex",alignItems:"center",gap:8},closeBtn:{background:"none",border:"none",color:"var(--text-secondary, #a6adc8)",fontSize:20,cursor:"pointer",padding:"4px 8px",borderRadius:6,lineHeight:1},tabs:{display:"flex",borderBottom:"1px solid var(--border, #313244)",background:"var(--surface-1, #181825)",overflowX:"auto",scrollbarWidth:"none"},tab:n=>({padding:"10px 16px",background:"none",border:"none",borderBottom:n?"2px solid var(--accent, #89b4fa)":"2px solid transparent",color:n?"var(--accent, #89b4fa)":"var(--text-secondary, #a6adc8)",fontSize:13,fontWeight:n?600:400,cursor:"pointer",display:"flex",alignItems:"center",gap:6,whiteSpace:"nowrap",transition:"color 0.15s, border-color 0.15s",flexShrink:0}),tabStatus:(n,c)=>({width:6,height:6,borderRadius:"50%",background:c?"#f38ba8":n?"#a6e3a1":"#fab387",flexShrink:0}),body:{flex:1,overflow:"auto",padding:20},integrationHeader:{display:"flex",alignItems:"flex-start",gap:12,marginBottom:16},iconCircle:{width:44,height:44,borderRadius:10,background:"var(--surface-1, #181825)",border:"1px solid var(--border, #313244)",display:"flex",alignItems:"center",justifyContent:"center",fontSize:22,flexShrink:0},integrationMeta:{flex:1},integrationName:{fontSize:15,fontWeight:600,color:"var(--text-primary, #cdd6f4)",marginBottom:4,display:"flex",alignItems:"center",gap:8},description:{fontSize:13,color:"var(--text-secondary, #a6adc8)",lineHeight:1.5},statusBadge:(n,c)=>({display:"inline-flex",alignItems:"center",gap:4,padding:"2px 8px",borderRadius:10,fontSize:11,fontWeight:600,background:c?"rgba(243, 139, 168, 0.15)":n?"rgba(166, 227, 161, 0.15)":"rgba(250, 179, 135, 0.15)",color:c?"#f38ba8":n?"#a6e3a1":"#fab387"}),section:{marginTop:16,padding:12,borderRadius:8,background:"var(--surface-1, #181825)",border:"1px solid var(--border, #313244)"},sectionTitle:{fontSize:12,fontWeight:600,color:"var(--text-secondary, #a6adc8)",textTransform:"uppercase",letterSpacing:"0.5px",marginBottom:8},requirementList:{listStyle:"none",margin:0,padding:0,display:"flex",flexDirection:"column",gap:4},requirementItem:{fontSize:12,color:"var(--text-secondary, #a6adc8)",display:"flex",alignItems:"center",gap:6},formSection:{marginTop:16},formSectionTitle:{fontSize:12,fontWeight:600,color:"var(--text-secondary, #a6adc8)",textTransform:"uppercase",letterSpacing:"0.5px",marginBottom:12}};function O({integration:n,onSave:c,onCancel:g}){const[x,b]=d.useState({...n.values}),[S,v]=d.useState({}),[y,j]=d.useState(!1),[k,h]=d.useState(!1);d.useEffect(()=>{b({...n.values}),v({}),h(!1)},[n.id]);const f=(r,l)=>{b(o=>({...o,[r]:l})),v(o=>{const i={...o};return delete i[r],i}),h(!1)},T=async r=>{r.preventDefault();const l={};for(const o of n.schema)if(o.required&&!x[o.key]&&x[o.key]!==0&&x[o.key]!==!1&&(l[o.key]=`${o.label} is required`),o.validate){const i=o.validate(x[o.key]);i&&(l[o.key]=i)}if(Object.keys(l).length>0){v(l);return}j(!0);try{await c(x),h(!0),setTimeout(()=>h(!1),3e3)}catch(o){v({_form:String(o)})}finally{j(!1)}},m=new Map;for(const r of n.schema){const l=r.group||"";m.has(l)||m.set(l,[]),m.get(l).push(r)}const I={display:"flex",flexDirection:"column",gap:4,marginBottom:12},a={fontSize:13,fontWeight:500,color:"var(--text-primary, #cdd6f4)"},t={padding:"8px 10px",borderRadius:6,border:"1px solid var(--border, #313244)",background:"var(--surface-0, #1e1e2e)",color:"var(--text-primary, #cdd6f4)",fontSize:13,outline:"none",width:"100%",boxSizing:"border-box"},u={fontSize:11,color:"var(--text-secondary, #a6adc8)"},p={fontSize:11,color:"#f38ba8"},C=r=>{var o;const l=x[r.key]??r.defaultValue??"";switch(r.type){case"boolean":return e.jsxs("label",{style:{display:"flex",alignItems:"center",gap:8,fontSize:13,color:"var(--text-primary, #cdd6f4)",cursor:"pointer"},children:[e.jsx("input",{type:"checkbox",checked:!!l,onChange:i=>f(r.key,i.target.checked)}),r.label]});case"select":return e.jsxs("select",{style:t,value:String(l),onChange:i=>f(r.key,i.target.value),children:[e.jsx("option",{value:"",children:r.placeholder||"Select..."}),(o=r.options)==null?void 0:o.map(i=>e.jsx("option",{value:i.value,children:i.label},i.value))]});case"textarea":return e.jsx("textarea",{style:{...t,resize:"vertical",minHeight:80},value:String(l),placeholder:r.placeholder,onChange:i=>f(r.key,i.target.value),rows:4});case"number":return e.jsx("input",{type:"number",style:t,value:l===""?"":Number(l),placeholder:r.placeholder,onChange:i=>f(r.key,i.target.value===""?"":Number(i.target.value))});case"password":return e.jsx("input",{type:"password",style:t,value:String(l),placeholder:r.placeholder,onChange:i=>f(r.key,i.target.value),autoComplete:"off"});default:return e.jsx("input",{type:r.type,style:t,value:String(l),placeholder:r.placeholder,onChange:i=>f(r.key,i.target.value)})}};return e.jsxs("form",{onSubmit:T,children:[S._form&&e.jsx("div",{style:{...p,marginBottom:12,padding:"8px 10px",borderRadius:6,background:"rgba(243, 139, 168, 0.1)"},children:S._form}),Array.from(m.entries()).map(([r,l])=>e.jsxs("div",{children:[r&&e.jsx("div",{style:{...s.sectionTitle,marginTop:16,marginBottom:8},children:r}),l.map(o=>e.jsxs("div",{style:I,children:[o.type!=="boolean"&&e.jsxs("label",{style:a,children:[o.label,o.required&&e.jsx("span",{style:{color:"#f38ba8",marginLeft:2},children:"*"})]}),C(o),o.description&&e.jsx("span",{style:u,children:o.description}),S[o.key]&&e.jsx("span",{style:p,children:S[o.key]})]},o.key))]},r||"_default")),e.jsxs("div",{style:{display:"flex",gap:8,justifyContent:"flex-end",marginTop:16,paddingTop:12,borderTop:"1px solid var(--border, #313244)"},children:[e.jsx("button",{type:"button",onClick:g,style:{padding:"8px 16px",borderRadius:6,border:"1px solid var(--border, #313244)",background:"none",color:"var(--text-secondary, #a6adc8)",fontSize:13,cursor:"pointer"},children:"Cancel"}),e.jsx("button",{type:"submit",disabled:y,style:{padding:"8px 16px",borderRadius:6,border:"none",background:k?"#a6e3a1":"var(--accent, #89b4fa)",color:"#1e1e2e",fontSize:13,fontWeight:600,cursor:y?"wait":"pointer",opacity:y?.7:1},children:y?"Saving...":k?"Saved":"Save Configuration"})]})]})}function M({isOpen:n,onClose:c,initialTab:g,zIndex:x}){const[b,S]=d.useState([]),[v,y]=d.useState(g||null),[j,k]=d.useState(!0),[h,f]=d.useState(null),T=d.useRef(g||null),m=d.useCallback(async()=>{try{const t=await w(A("/api/integrations"));if(!t.ok)throw new Error(`HTTP ${t.status}`);const u=await t.json();S(u),f(null),y(p=>{const C=p||g||(u.length>0?u[0].id:null);return T.current=C,C})}catch(t){f(`Failed to load integrations: ${t}`)}finally{k(!1)}},[g]);d.useEffect(()=>{n&&(k(!0),m(),g&&y(g))},[n,g]);const I=d.useCallback(async(t,u)=>{const p=await w(A(`/api/integrations/${t}/config`),{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(u)});if(!p.ok){const C=await p.json().catch(()=>({}));throw new Error(C.error||`HTTP ${p.status}`)}await m()},[m]);if(!n)return null;const a=b.find(t=>t.id===v);return e.jsx("div",{style:{...s.overlay,...x===void 0?{}:{zIndex:x}},onClick:c,children:e.jsxs("div",{style:s.modal,onClick:t=>t.stopPropagation(),children:[e.jsxs("div",{style:s.header,children:[e.jsxs("div",{style:s.headerTitle,children:[e.jsx("span",{children:"🔌"}),e.jsx("span",{children:"Integrations"})]}),e.jsx("button",{style:s.closeBtn,onClick:c,title:"Close",children:"×"})]}),j&&e.jsx("div",{style:{padding:40,textAlign:"center",color:"var(--text-secondary, #a6adc8)"},children:"Loading integrations..."}),h&&e.jsxs("div",{style:{padding:20,textAlign:"center"},children:[e.jsx("div",{style:{color:"#f38ba8",marginBottom:8},children:h}),e.jsx("button",{onClick:m,style:{padding:"6px 12px",borderRadius:6,border:"1px solid var(--border, #313244)",background:"none",color:"var(--text-primary, #cdd6f4)",cursor:"pointer",fontSize:13},children:"Retry"})]}),!j&&!h&&b.length>0&&e.jsxs(e.Fragment,{children:[e.jsx("div",{style:s.tabs,children:b.map(t=>e.jsxs("button",{style:s.tab(v===t.id),onClick:()=>y(t.id),children:[e.jsx("span",{children:E[t.id]||"🔌"}),e.jsx("span",{children:t.name}),e.jsx("span",{style:s.tabStatus(t.status.connected,!!t.status.error)})]},t.id))}),e.jsx("div",{style:s.body,children:a&&e.jsxs("div",{children:[e.jsxs("div",{style:s.integrationHeader,children:[e.jsx("div",{style:s.iconCircle,children:E[a.id]||"🔌"}),e.jsxs("div",{style:s.integrationMeta,children:[e.jsxs("div",{style:s.integrationName,children:[a.name,e.jsx("span",{style:s.statusBadge(a.status.connected,!!a.status.error),children:a.status.needsReauth?"⚠ Token Expired — Reconnect":a.status.error?"✗ Error":a.status.connected?"✓ Connected":"⚠ Not Configured"}),a.id==="slack"&&(()=>{var p;const t=((p=a.values)==null?void 0:p.currentMode)||"none";if(t==="none")return null;const u=t==="polling"?"Polling":"Socket";return e.jsx("span",{style:{marginLeft:8,padding:"2px 8px",borderRadius:4,fontSize:11,fontWeight:500,background:"rgba(137, 180, 250, 0.15)",color:"#89b4fa",border:"1px solid rgba(137, 180, 250, 0.3)"},title:t==="polling"?"Web API polling (xoxp- user token)":"Real-time Socket Mode (xoxb- bot token)",children:u})})()]}),e.jsx("div",{style:s.description,children:B[a.id]||a.description})]})]}),a.status.error&&e.jsxs("div",{style:{...s.section,borderColor:"rgba(243, 139, 168, 0.3)",background:"rgba(243, 139, 168, 0.05)"},children:[e.jsx("div",{style:{...s.sectionTitle,color:"#f38ba8"},children:"Error"}),e.jsx("div",{style:{fontSize:12,color:"#f38ba8"},children:a.status.error})]}),_[a.id]&&e.jsxs("div",{style:s.section,children:[e.jsx("div",{style:s.sectionTitle,children:"Requirements"}),e.jsx("ul",{style:s.requirementList,children:_[a.id].map((t,u)=>e.jsxs("li",{style:s.requirementItem,children:[e.jsx("span",{style:{color:"var(--accent, #89b4fa)"},children:"•"}),t]},u))})]}),e.jsxs("div",{style:s.formSection,children:[e.jsx("div",{style:s.formSectionTitle,children:"Configuration"}),a.customComponent&&z[a.customComponent]?e.jsx(d.Suspense,{fallback:e.jsx("div",{style:{color:"var(--text-secondary)",fontSize:13},children:"Loading..."}),children:P.createElement(z[a.customComponent],{key:a.id,integration:a,onSave:t=>I(a.id,t),onCancel:c})}):e.jsx(O,{integration:a,onSave:t=>I(a.id,t),onCancel:c})]})]})})]}),!j&&!h&&b.length===0&&e.jsx("div",{style:{padding:40,textAlign:"center",color:"var(--text-secondary, #a6adc8)"},children:"No integrations available."})]})})}export{M as IntegrationsPanel};
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/GmailOAuthSetup-D_uF2cyB.js","assets/main-BKRg0DBA.js","assets/vendor-react--Eh9ivFN.js","assets/vendor-three-DSCAlQQW.js","assets/main-DvKatbZ4.css","assets/GoogleOAuthSetup-BCmzQl5e.js","assets/SlackMultiInstanceSetup-Da_GWe5W.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{r as d,c as w,d as A,j as e,V as P,a2 as R}from"./main-BKRg0DBA.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-DSCAlQQW.js";const z={"gmail-oauth":d.lazy(()=>R(()=>import("./GmailOAuthSetup-D_uF2cyB.js"),__vite__mapDeps([0,1,2,3,4])).then(n=>({default:n.GmailOAuthSetup}))),"google-oauth":d.lazy(()=>R(()=>import("./GoogleOAuthSetup-BCmzQl5e.js"),__vite__mapDeps([5,1,2,3,4])).then(n=>({default:n.GoogleOAuthSetup}))),"slack-multi-instance":d.lazy(()=>R(()=>import("./SlackMultiInstanceSetup-Da_GWe5W.js"),__vite__mapDeps([6,1,2,3,4])).then(n=>({default:n.SlackMultiInstanceSetup})))},E={gmail:"✉️",slack:"💬",jira:"📋","google-calendar":"📅","google-drive":"📁",docx:"📄"},B={gmail:"Send and receive emails through Gmail. Supports OAuth 2.0 authentication for secure access to your inbox.",slack:"Connect to Slack workspaces. Send messages, receive notifications, and integrate with channels.",jira:"Manage Jira issues and projects. Create tickets, track progress, and handle service desk requests.","google-calendar":"Access Google Calendar events. Create, update, and monitor calendar entries.","google-drive":"Read, create, and edit files in Google Drive. Search and manage folders.",docx:"Generate and manipulate DOCX documents. Create reports, templates, and formatted documents."},_={gmail:["Google Cloud Console project","OAuth 2.0 credentials (Client ID & Secret)","Gmail API enabled"],slack:["Bot token (xoxb-) with App-Level Token for real-time Socket Mode, OR User token (xoxp-) for polling mode (~30-60s lag, no Slack app config needed)","For Socket Mode: enable Socket Mode + Event Subscriptions; subscribe to bot events message.channels, message.groups, message.im","Required scopes: channels:history, channels:read, chat:write, groups:history, groups:read, im:history, im:read, users:read","Polling mode (xoxp-) mirrors all channels/groups/DMs the user is a member of — supports xoxp- user tokens that cannot use Socket Mode"],jira:["Jira Cloud instance URL","API Token (from Atlassian account)","Account email address"],"google-calendar":["Google Cloud Console project","OAuth 2.0 credentials","Calendar API enabled"],"google-drive":["Google Cloud Console project","OAuth 2.0 credentials (Client ID & Secret)","Google Drive API enabled"],docx:["No external credentials required","Templates directory (optional)"]},s={overlay:{position:"fixed",inset:0,background:"rgba(0, 0, 0, 0.6)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:1e4,backdropFilter:"blur(4px)",animation:"fadeIn 0.15s ease-out"},modal:{background:"var(--surface-0, #1e1e2e)",borderRadius:12,border:"1px solid var(--border, #313244)",width:"90vw",maxWidth:720,maxHeight:"85vh",display:"flex",flexDirection:"column",overflow:"hidden",boxShadow:"0 20px 60px rgba(0, 0, 0, 0.5)",animation:"slideUp 0.2s ease-out"},header:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"16px 20px",borderBottom:"1px solid var(--border, #313244)",background:"var(--surface-1, #181825)"},headerTitle:{fontSize:16,fontWeight:600,color:"var(--text-primary, #cdd6f4)",display:"flex",alignItems:"center",gap:8},closeBtn:{background:"none",border:"none",color:"var(--text-secondary, #a6adc8)",fontSize:20,cursor:"pointer",padding:"4px 8px",borderRadius:6,lineHeight:1},tabs:{display:"flex",borderBottom:"1px solid var(--border, #313244)",background:"var(--surface-1, #181825)",overflowX:"auto",scrollbarWidth:"none"},tab:n=>({padding:"10px 16px",background:"none",border:"none",borderBottom:n?"2px solid var(--accent, #89b4fa)":"2px solid transparent",color:n?"var(--accent, #89b4fa)":"var(--text-secondary, #a6adc8)",fontSize:13,fontWeight:n?600:400,cursor:"pointer",display:"flex",alignItems:"center",gap:6,whiteSpace:"nowrap",transition:"color 0.15s, border-color 0.15s",flexShrink:0}),tabStatus:(n,c)=>({width:6,height:6,borderRadius:"50%",background:c?"#f38ba8":n?"#a6e3a1":"#fab387",flexShrink:0}),body:{flex:1,overflow:"auto",padding:20},integrationHeader:{display:"flex",alignItems:"flex-start",gap:12,marginBottom:16},iconCircle:{width:44,height:44,borderRadius:10,background:"var(--surface-1, #181825)",border:"1px solid var(--border, #313244)",display:"flex",alignItems:"center",justifyContent:"center",fontSize:22,flexShrink:0},integrationMeta:{flex:1},integrationName:{fontSize:15,fontWeight:600,color:"var(--text-primary, #cdd6f4)",marginBottom:4,display:"flex",alignItems:"center",gap:8},description:{fontSize:13,color:"var(--text-secondary, #a6adc8)",lineHeight:1.5},statusBadge:(n,c)=>({display:"inline-flex",alignItems:"center",gap:4,padding:"2px 8px",borderRadius:10,fontSize:11,fontWeight:600,background:c?"rgba(243, 139, 168, 0.15)":n?"rgba(166, 227, 161, 0.15)":"rgba(250, 179, 135, 0.15)",color:c?"#f38ba8":n?"#a6e3a1":"#fab387"}),section:{marginTop:16,padding:12,borderRadius:8,background:"var(--surface-1, #181825)",border:"1px solid var(--border, #313244)"},sectionTitle:{fontSize:12,fontWeight:600,color:"var(--text-secondary, #a6adc8)",textTransform:"uppercase",letterSpacing:"0.5px",marginBottom:8},requirementList:{listStyle:"none",margin:0,padding:0,display:"flex",flexDirection:"column",gap:4},requirementItem:{fontSize:12,color:"var(--text-secondary, #a6adc8)",display:"flex",alignItems:"center",gap:6},formSection:{marginTop:16},formSectionTitle:{fontSize:12,fontWeight:600,color:"var(--text-secondary, #a6adc8)",textTransform:"uppercase",letterSpacing:"0.5px",marginBottom:12}};function O({integration:n,onSave:c,onCancel:g}){const[x,b]=d.useState({...n.values}),[S,v]=d.useState({}),[y,j]=d.useState(!1),[k,h]=d.useState(!1);d.useEffect(()=>{b({...n.values}),v({}),h(!1)},[n.id]);const f=(r,l)=>{b(o=>({...o,[r]:l})),v(o=>{const i={...o};return delete i[r],i}),h(!1)},T=async r=>{r.preventDefault();const l={};for(const o of n.schema)if(o.required&&!x[o.key]&&x[o.key]!==0&&x[o.key]!==!1&&(l[o.key]=`${o.label} is required`),o.validate){const i=o.validate(x[o.key]);i&&(l[o.key]=i)}if(Object.keys(l).length>0){v(l);return}j(!0);try{await c(x),h(!0),setTimeout(()=>h(!1),3e3)}catch(o){v({_form:String(o)})}finally{j(!1)}},m=new Map;for(const r of n.schema){const l=r.group||"";m.has(l)||m.set(l,[]),m.get(l).push(r)}const I={display:"flex",flexDirection:"column",gap:4,marginBottom:12},a={fontSize:13,fontWeight:500,color:"var(--text-primary, #cdd6f4)"},t={padding:"8px 10px",borderRadius:6,border:"1px solid var(--border, #313244)",background:"var(--surface-0, #1e1e2e)",color:"var(--text-primary, #cdd6f4)",fontSize:13,outline:"none",width:"100%",boxSizing:"border-box"},u={fontSize:11,color:"var(--text-secondary, #a6adc8)"},p={fontSize:11,color:"#f38ba8"},C=r=>{var o;const l=x[r.key]??r.defaultValue??"";switch(r.type){case"boolean":return e.jsxs("label",{style:{display:"flex",alignItems:"center",gap:8,fontSize:13,color:"var(--text-primary, #cdd6f4)",cursor:"pointer"},children:[e.jsx("input",{type:"checkbox",checked:!!l,onChange:i=>f(r.key,i.target.checked)}),r.label]});case"select":return e.jsxs("select",{style:t,value:String(l),onChange:i=>f(r.key,i.target.value),children:[e.jsx("option",{value:"",children:r.placeholder||"Select..."}),(o=r.options)==null?void 0:o.map(i=>e.jsx("option",{value:i.value,children:i.label},i.value))]});case"textarea":return e.jsx("textarea",{style:{...t,resize:"vertical",minHeight:80},value:String(l),placeholder:r.placeholder,onChange:i=>f(r.key,i.target.value),rows:4});case"number":return e.jsx("input",{type:"number",style:t,value:l===""?"":Number(l),placeholder:r.placeholder,onChange:i=>f(r.key,i.target.value===""?"":Number(i.target.value))});case"password":return e.jsx("input",{type:"password",style:t,value:String(l),placeholder:r.placeholder,onChange:i=>f(r.key,i.target.value),autoComplete:"off"});default:return e.jsx("input",{type:r.type,style:t,value:String(l),placeholder:r.placeholder,onChange:i=>f(r.key,i.target.value)})}};return e.jsxs("form",{onSubmit:T,children:[S._form&&e.jsx("div",{style:{...p,marginBottom:12,padding:"8px 10px",borderRadius:6,background:"rgba(243, 139, 168, 0.1)"},children:S._form}),Array.from(m.entries()).map(([r,l])=>e.jsxs("div",{children:[r&&e.jsx("div",{style:{...s.sectionTitle,marginTop:16,marginBottom:8},children:r}),l.map(o=>e.jsxs("div",{style:I,children:[o.type!=="boolean"&&e.jsxs("label",{style:a,children:[o.label,o.required&&e.jsx("span",{style:{color:"#f38ba8",marginLeft:2},children:"*"})]}),C(o),o.description&&e.jsx("span",{style:u,children:o.description}),S[o.key]&&e.jsx("span",{style:p,children:S[o.key]})]},o.key))]},r||"_default")),e.jsxs("div",{style:{display:"flex",gap:8,justifyContent:"flex-end",marginTop:16,paddingTop:12,borderTop:"1px solid var(--border, #313244)"},children:[e.jsx("button",{type:"button",onClick:g,style:{padding:"8px 16px",borderRadius:6,border:"1px solid var(--border, #313244)",background:"none",color:"var(--text-secondary, #a6adc8)",fontSize:13,cursor:"pointer"},children:"Cancel"}),e.jsx("button",{type:"submit",disabled:y,style:{padding:"8px 16px",borderRadius:6,border:"none",background:k?"#a6e3a1":"var(--accent, #89b4fa)",color:"#1e1e2e",fontSize:13,fontWeight:600,cursor:y?"wait":"pointer",opacity:y?.7:1},children:y?"Saving...":k?"Saved":"Save Configuration"})]})]})}function M({isOpen:n,onClose:c,initialTab:g,zIndex:x}){const[b,S]=d.useState([]),[v,y]=d.useState(g||null),[j,k]=d.useState(!0),[h,f]=d.useState(null),T=d.useRef(g||null),m=d.useCallback(async()=>{try{const t=await w(A("/api/integrations"));if(!t.ok)throw new Error(`HTTP ${t.status}`);const u=await t.json();S(u),f(null),y(p=>{const C=p||g||(u.length>0?u[0].id:null);return T.current=C,C})}catch(t){f(`Failed to load integrations: ${t}`)}finally{k(!1)}},[g]);d.useEffect(()=>{n&&(k(!0),m(),g&&y(g))},[n,g]);const I=d.useCallback(async(t,u)=>{const p=await w(A(`/api/integrations/${t}/config`),{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(u)});if(!p.ok){const C=await p.json().catch(()=>({}));throw new Error(C.error||`HTTP ${p.status}`)}await m()},[m]);if(!n)return null;const a=b.find(t=>t.id===v);return e.jsx("div",{style:{...s.overlay,...x===void 0?{}:{zIndex:x}},onClick:c,children:e.jsxs("div",{style:s.modal,onClick:t=>t.stopPropagation(),children:[e.jsxs("div",{style:s.header,children:[e.jsxs("div",{style:s.headerTitle,children:[e.jsx("span",{children:"🔌"}),e.jsx("span",{children:"Integrations"})]}),e.jsx("button",{style:s.closeBtn,onClick:c,title:"Close",children:"×"})]}),j&&e.jsx("div",{style:{padding:40,textAlign:"center",color:"var(--text-secondary, #a6adc8)"},children:"Loading integrations..."}),h&&e.jsxs("div",{style:{padding:20,textAlign:"center"},children:[e.jsx("div",{style:{color:"#f38ba8",marginBottom:8},children:h}),e.jsx("button",{onClick:m,style:{padding:"6px 12px",borderRadius:6,border:"1px solid var(--border, #313244)",background:"none",color:"var(--text-primary, #cdd6f4)",cursor:"pointer",fontSize:13},children:"Retry"})]}),!j&&!h&&b.length>0&&e.jsxs(e.Fragment,{children:[e.jsx("div",{style:s.tabs,children:b.map(t=>e.jsxs("button",{style:s.tab(v===t.id),onClick:()=>y(t.id),children:[e.jsx("span",{children:E[t.id]||"🔌"}),e.jsx("span",{children:t.name}),e.jsx("span",{style:s.tabStatus(t.status.connected,!!t.status.error)})]},t.id))}),e.jsx("div",{style:s.body,children:a&&e.jsxs("div",{children:[e.jsxs("div",{style:s.integrationHeader,children:[e.jsx("div",{style:s.iconCircle,children:E[a.id]||"🔌"}),e.jsxs("div",{style:s.integrationMeta,children:[e.jsxs("div",{style:s.integrationName,children:[a.name,e.jsx("span",{style:s.statusBadge(a.status.connected,!!a.status.error),children:a.status.needsReauth?"⚠ Token Expired — Reconnect":a.status.error?"✗ Error":a.status.connected?"✓ Connected":"⚠ Not Configured"}),a.id==="slack"&&(()=>{var p;const t=((p=a.values)==null?void 0:p.currentMode)||"none";if(t==="none")return null;const u=t==="polling"?"Polling":"Socket";return e.jsx("span",{style:{marginLeft:8,padding:"2px 8px",borderRadius:4,fontSize:11,fontWeight:500,background:"rgba(137, 180, 250, 0.15)",color:"#89b4fa",border:"1px solid rgba(137, 180, 250, 0.3)"},title:t==="polling"?"Web API polling (xoxp- user token)":"Real-time Socket Mode (xoxb- bot token)",children:u})})()]}),e.jsx("div",{style:s.description,children:B[a.id]||a.description})]})]}),a.status.error&&e.jsxs("div",{style:{...s.section,borderColor:"rgba(243, 139, 168, 0.3)",background:"rgba(243, 139, 168, 0.05)"},children:[e.jsx("div",{style:{...s.sectionTitle,color:"#f38ba8"},children:"Error"}),e.jsx("div",{style:{fontSize:12,color:"#f38ba8"},children:a.status.error})]}),_[a.id]&&e.jsxs("div",{style:s.section,children:[e.jsx("div",{style:s.sectionTitle,children:"Requirements"}),e.jsx("ul",{style:s.requirementList,children:_[a.id].map((t,u)=>e.jsxs("li",{style:s.requirementItem,children:[e.jsx("span",{style:{color:"var(--accent, #89b4fa)"},children:"•"}),t]},u))})]}),e.jsxs("div",{style:s.formSection,children:[e.jsx("div",{style:s.formSectionTitle,children:"Configuration"}),a.customComponent&&z[a.customComponent]?e.jsx(d.Suspense,{fallback:e.jsx("div",{style:{color:"var(--text-secondary)",fontSize:13},children:"Loading..."}),children:P.createElement(z[a.customComponent],{key:a.id,integration:a,onSave:t=>I(a.id,t),onCancel:c})}):e.jsx(O,{integration:a,onSave:t=>I(a.id,t),onCancel:c})]})]})})]}),!j&&!h&&b.length===0&&e.jsx("div",{style:{padding:40,textAlign:"center",color:"var(--text-secondary, #a6adc8)"},children:"No integrations available."})]})})}export{M as IntegrationsPanel};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as me,r as l,g as ge,j as e,I as xe,h as fe}from"./main-
|
|
1
|
+
import{u as me,r as l,g as ge,j as e,I as xe,h as fe}from"./main-BKRg0DBA.js";function je({isOpen:E,onClose:L,onMinimize:P,title:B,icon:U,lines:c,isStreaming:F,onClear:J,emptyMessage:V,streamingIndicatorLabel:X,headerInfo:Y,isLoading:W,extraToolbar:Z,extraFooter:O,modalClassName:ee}){const{t:a}=me(["terminal","common"]),[u,$]=l.useState(""),[h,w]=l.useState(!1),[f,S]=l.useState(!1),[M,I]=l.useState(""),[k,p]=l.useState(!0),[R,te]=l.useState(!0),[se,Q]=l.useState(null),[r,le]=l.useState([]),[m,j]=l.useState(0),[v,ne]=l.useState(!1),[T,re]=l.useState(5),[_,C]=l.useState(null),[y,ae]=l.useState(!0),o=l.useRef(null),D=l.useRef(null),A=l.useRef(null),H=l.useRef(!1),q=l.useRef(0),K=l.useMemo(()=>c.map(t=>t.text),[c]),b=l.useMemo(()=>{if(!u)return C(null),null;try{const t=v?u:u.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),s=new RegExp(t,"gi");return C(null),s}catch(t){return C(t.message),null}},[u,v]),N=l.useMemo(()=>{if(!b)return[];const t=[];for(let s=0;s<K.length;s++)b.test(K[s])&&t.push(s),b.lastIndex=0;return t},[K,b]);l.useEffect(()=>{le(N),m>=N.length&&j(Math.max(0,N.length-1))},[N]);const oe=l.useMemo(()=>{const t=c.map((i,x)=>({entry:i,originalIndex:x}));if(!u||!b||y)return t;if(N.length===0)return[];const s=new Set;for(const i of N){const x=Math.max(0,i-T),de=Math.min(c.length-1,i+T);for(let G=x;G<=de;G++)s.add(G)}const n=Array.from(s).sort((i,x)=>i-x),d=[];for(let i=0;i<n.length;i++){const x=n[i];i>0&&x-n[i-1]>1&&d.push({entry:{text:"",lineNumber:-1},originalIndex:-1,isSeparator:!0}),d.push({entry:c[x],originalIndex:x})}return d},[c,u,b,N,T,y]);l.useEffect(()=>{k&&o.current&&c.length>q.current&&(H.current=!0,requestAnimationFrame(()=>{o.current&&(o.current.scrollTop=o.current.scrollHeight),setTimeout(()=>{H.current=!1},50)})),q.current=c.length},[c.length,k]),l.useEffect(()=>{h&&D.current&&D.current.focus()},[h]),l.useEffect(()=>{f&&A.current&&A.current.focus()},[f]);const g=l.useCallback(t=>{if(!o.current)return;const n=t*18;o.current.scrollTop=n-100,Q(t),setTimeout(()=>Q(null),2e3)},[]);l.useEffect(()=>{if(!E)return;const t=s=>{if(s.key==="Escape"){s.preventDefault(),s.stopPropagation(),s.stopImmediatePropagation(),h?w(!1):f?S(!1):L();return}if(s.key==="/"&&!h&&!f&&(s.preventDefault(),w(!0)),s.key==="g"&&s.ctrlKey&&(s.preventDefault(),S(!0)),s.key==="End"&&s.ctrlKey&&o.current&&(o.current.scrollTop=o.current.scrollHeight),s.key==="Home"&&s.ctrlKey&&o.current&&(o.current.scrollTop=0),(s.key==="F3"||s.key==="Enter"&&h)&&r.length>0)if(s.preventDefault(),s.shiftKey){const n=(m-1+r.length)%r.length;j(n),g(r[n])}else{const n=(m+1)%r.length;j(n),g(r[n])}if(!h&&!f&&r.length>0){if(s.key==="n"&&!s.ctrlKey){s.preventDefault();const n=(m+1)%r.length;j(n),g(r[n])}else if(s.key==="N"){s.preventDefault();const n=(m-1+r.length)%r.length;j(n),g(r[n])}}!h&&!f&&o.current&&(s.key==="j"?(s.preventDefault(),o.current.scrollTop+=60,p(!1)):s.key==="k"?(s.preventDefault(),o.current.scrollTop-=60,p(!1)):s.key==="G"&&!s.ctrlKey?(s.preventDefault(),o.current.scrollTop=o.current.scrollHeight,p(!0)):s.key==="g"&&!s.ctrlKey&&(s.preventDefault(),o.current.scrollTop=0,p(!1)))};return window.addEventListener("keydown",t,{capture:!0}),()=>window.removeEventListener("keydown",t,{capture:!0})},[E,h,f,r,m,L,g]);const z=l.useCallback(()=>{const t=parseInt(M,10);!isNaN(t)&&t>0&&t<=c.length&&(g(t-1),p(!1)),S(!1),I("")},[M,c.length,g]),ce=l.useCallback(()=>{if(H.current||!o.current)return;const{scrollTop:t,scrollHeight:s,clientHeight:n}=o.current,d=s-t-n<50;!d&&k&&p(!1),d&&!k&&p(!0)},[k]),ie=l.useCallback(t=>{if(!u||!b)return t;const s=v?u:u.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");try{const n=new RegExp(`(${s})`,"gi");return t.replace(n,'<mark class="search-highlight">$1</mark>')}catch{return t}},[u,b,v]),{handleMouseDown:ue,handleClick:he}=ge(L);return E?e.jsx("div",{className:"pm2-logs-modal-overlay",onMouseDown:ue,onClick:he,children:e.jsxs("div",{className:`pm2-logs-modal ${ee||""}`,children:[e.jsxs("div",{className:"pm2-logs-modal-header",children:[e.jsxs("div",{className:"header-left",children:[e.jsx("span",{className:"modal-icon",children:U}),e.jsx("span",{className:"modal-title",title:B,children:B}),F&&e.jsxs("span",{className:"streaming-indicator",title:"Live streaming",children:[e.jsx("span",{className:"pulse"}),X||a("terminal:logs.live")]}),Y]}),e.jsxs("div",{className:"header-right",children:[e.jsx("span",{className:"line-count",children:a("terminal:logs.lines",{count:c.length})}),P&&e.jsx("button",{className:"modal-close",onClick:P,title:"Minimize — dock below the terminal input",children:e.jsx(xe,{name:"arrow-down",size:14})}),e.jsx("button",{className:"modal-close",onClick:L,title:a("terminal:logs.closeEsc"),children:"×"})]})]}),e.jsxs("div",{className:"pm2-logs-modal-toolbar",children:[e.jsxs("div",{className:"toolbar-left",children:[e.jsxs("button",{className:`toolbar-btn ${h?"active":""}`,onClick:()=>w(!h),title:a("terminal:logs.searchShortcut"),children:["🔍 ",a("terminal:logs.search")]}),e.jsxs("button",{className:"toolbar-btn",onClick:()=>S(!0),title:a("terminal:logs.goToLineShortcut"),children:["⏬ ",a("terminal:logs.goToLine")]}),Z,e.jsxs("button",{className:`toolbar-btn ${R?"active":""}`,onClick:()=>te(!R),title:a("terminal:logs.toggleWrap"),children:["↩ ",a("terminal:logs.wrap")]}),e.jsxs("button",{className:`toolbar-btn ${k?"active":""}`,onClick:()=>p(!k),title:a("terminal:logs.autoScrollToBottom"),children:["↓ ",a("terminal:logs.auto")]})]}),e.jsx("div",{className:"toolbar-right",children:e.jsxs("button",{className:"toolbar-btn danger",onClick:J,title:a("terminal:logs.clear"),children:["🗑 ",a("terminal:logs.clear")]})})]}),h&&e.jsxs("div",{className:"pm2-logs-search-bar",children:[e.jsx("input",{ref:D,type:"text",placeholder:a(v?"terminal:logs.regexPlaceholder":"terminal:logs.searchPlaceholder"),value:u,onChange:t=>{$(t.target.value),j(0)},onKeyDown:t=>{t.key==="Escape"&&(w(!1),$(""),C(null))}}),e.jsx("button",{className:`toolbar-btn small ${v?"active":""}`,onClick:()=>ne(!v),title:"Toggle regex mode",children:".*"}),e.jsx("button",{className:`toolbar-btn small ${y?"active":""}`,onClick:()=>ae(!y),title:y?"Show all lines (highlight matches)":"Show only context around matches",children:y?"All":"Ctx"}),e.jsxs("div",{className:`context-control ${y?"hidden":""}`,title:"Lines of context around matches",children:[e.jsx("label",{children:"±"}),e.jsx("input",{type:"number",min:"0",max:"100",value:T,onChange:t=>re(Math.max(0,parseInt(t.target.value)||0)),className:"context-input"})]}),e.jsx("button",{className:"toolbar-btn small",onClick:()=>{if(r.length===0)return;const t=(m-1+r.length)%r.length;j(t),g(r[t])},disabled:r.length===0,title:"Previous match (Shift+F3)",children:"▲"}),e.jsx("button",{className:"toolbar-btn small",onClick:()=>{if(r.length===0)return;const t=(m+1)%r.length;j(t),g(r[t])},disabled:r.length===0,title:"Next match (F3)",children:"▼"}),u&&e.jsx("span",{className:"match-count",children:_?e.jsx("span",{className:"regex-error",title:_,children:a("terminal:logs.invalidRegex")}):r.length>0?`${m+1}/${r.length}`:a("terminal:logs.noMatches")}),e.jsx("button",{className:"search-close",onClick:()=>{w(!1),$(""),C(null)},children:"×"})]}),f&&e.jsxs("div",{className:"pm2-logs-goto-line",children:[e.jsxs("label",{children:[a("terminal:logs.goToLineLabel"),":"]}),e.jsx("input",{ref:A,type:"number",min:"1",max:c.length,placeholder:`1-${c.length}`,value:M,onChange:t=>I(t.target.value),onKeyDown:t=>{t.key==="Enter"?z():t.key==="Escape"&&(S(!1),I(""))}}),e.jsx("button",{onClick:z,children:a("terminal:logs.go")}),e.jsx("button",{onClick:()=>S(!1),children:a("common:buttons.cancel")})]}),e.jsx("div",{ref:o,className:`pm2-logs-content ${R?"wrap":"nowrap"}`,onScroll:ce,children:c.length===0?e.jsx("div",{className:"logs-empty",children:W||F?e.jsxs("div",{className:"logs-loading",children:[e.jsx("span",{className:"logs-loading-spinner","aria-hidden":"true"}),e.jsx("span",{children:V||a(W?"terminal:logs.loadingLogs":"terminal:logs.waitingForLogs")})]}):e.jsx("span",{children:V||a("terminal:logs.noLogs")})}):e.jsx("div",{className:"logs-lines",children:oe.map((t,s)=>{if("isSeparator"in t&&t.isSeparator)return e.jsxs("div",{className:"log-separator",children:[e.jsx("span",{className:"separator-line"}),e.jsx("span",{className:"separator-label",children:"…"}),e.jsx("span",{className:"separator-line"})]},`sep-${s}`);const{entry:n,originalIndex:d}=t,i=u&&N.includes(d);return e.jsxs("div",{className:`log-line ${se===d?"highlighted":""} ${r[m]===d?"current-match":""} ${i?"match-line":""} ${n.isError?"error-line":""}`,children:[e.jsx("span",{className:"line-number",children:n.lineNumber}),n.sourceLabel&&e.jsxs("span",{className:"boss-log-source",style:{color:n.sourceColor},children:["[",n.sourceLabel,"]"]}),e.jsx("span",{className:"line-content",dangerouslySetInnerHTML:{__html:ie(fe(n.text))}})]},d)})})}),e.jsxs("div",{className:"pm2-logs-modal-footer",children:[e.jsxs("span",{className:"shortcut",children:[e.jsx("kbd",{children:"j"}),"/",e.jsx("kbd",{children:"k"})," Scroll"]}),e.jsxs("span",{className:"shortcut",children:[e.jsx("kbd",{children:"g"}),"/",e.jsx("kbd",{children:"G"})," Top/Bottom"]}),e.jsxs("span",{className:"shortcut",children:[e.jsx("kbd",{children:"/"})," Search"]}),e.jsxs("span",{className:"shortcut",children:[e.jsx("kbd",{children:"n"}),"/",e.jsx("kbd",{children:"N"})," Next/Prev match"]}),e.jsxs("span",{className:"shortcut",children:[e.jsx("kbd",{children:"Ctrl+G"})," Go to line"]}),e.jsxs("span",{className:"shortcut",children:[e.jsx("kbd",{children:"Esc"})," Close"]}),O]})]})}):null}export{je as L};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as g,c as D,d as O,j as e,I as H,s as se}from"./main-BBvM-_Ia.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-DSCAlQQW.js";const ae=[{id:"triggers",label:"Triggers",icon:"bolt"},{id:"workflows",label:"Workflows",icon:"gear"},{id:"instances",label:"Instances",icon:"refresh"},{id:"messages",label:"Messages",icon:"chat"},{id:"stats",label:"Stats",icon:"dashboard"}],ne={trigger:"#89b4fa",slack:"#cba6f7",email:"#f9e2af",calendar:"#a6e3a1",document:"#fab387",jira:"#89dceb",workflow:"#f38ba8",system:"#6c7086",step:"#f38ba8",variable_change:"#cba6f7",approval:"#a6e3a1",audit:"#6c7086"},re={trigger:"Trigger",slack:"Slack",email:"Email",calendar:"Calendar",document:"Document",jira:"Jira",workflow:"Workflow",system:"System",step:"Step",variable_change:"Variable",approval:"Approval",audit:"Audit"};function he({isOpen:r,onClose:s}){const[n,B]=g.useState("triggers"),[T,M]=g.useState([]),[y,x]=g.useState(!0),[_,j]=g.useState(null),[z,F]=g.useState("24h"),[R,$]=g.useState(""),[W,N]=g.useState(null),[m,p]=g.useState({}),[i,C]=g.useState(!1),[t,c]=g.useState(null),[d,b]=g.useState([]),l=g.useCallback(async()=>{if(!(n==="stats"||n==="instances")){x(!0);try{const o=Date.now(),h={"1h":36e5,"6h":216e5,"24h":864e5,"7d":6048e5,all:0},w=h[z]>0?String(o-h[z]):void 0;let k=[];if(n==="triggers"){const v=new URLSearchParams({limit:"200"});w&&v.set("since",w);const S=await D(O(`/api/events/triggers?${v}`));if(!S.ok){j(`HTTP ${S.status}`);return}k=((await S.json()).events||[]).map(E=>({type:"trigger",timestamp:E.firedAt,data:E}))}else if(n==="workflows"){const v=new URLSearchParams({limit:"200",category:"workflow"});w&&v.set("since",w);const S=await D(O(`/api/events/audit?${v}`));if(!S.ok){j(`HTTP ${S.status}`);return}k=((await S.json()).entries||[]).map(E=>({type:"workflow",timestamp:E.createdAt,data:E}))}else if(n==="messages"){const v=new URLSearchParams({limit:"200"}),S=new URLSearchParams({limit:"200"}),V=new URLSearchParams({limit:"200"});w&&(v.set("since",w),S.set("since",w));const[E,X,q]=await Promise.all([D(O(`/api/events/slack?${v}`)),D(O(`/api/events/email?${S}`)),D(O(`/api/events/approvals?${V}`))]);if(E.ok){const P=await E.json();for(const I of P.messages||[])k.push({type:"slack",timestamp:I.receivedAt,data:I})}if(X.ok){const P=await X.json();for(const I of P.messages||[])k.push({type:"email",timestamp:I.receivedAt,data:I})}if(q.ok){const P=await q.json();for(const I of P.events||[])k.push({type:"approval",timestamp:I.recordedAt,data:I})}k.sort((P,I)=>I.timestamp-P.timestamp)}M(k),j(null)}catch(o){j(`Failed to load events: ${o}`)}finally{x(!1)}}},[n,z]),f=g.useCallback(async()=>{x(!0);try{const[o,h]=await Promise.all([D(O("/api/events/stats")),D(O("/api/integrations"))]);if(o.ok&&c(await o.json()),h.ok){const w=await h.json();b(Array.isArray(w)?w:[])}j(null)}catch(o){j(`Failed to load stats: ${o}`)}finally{x(!1)}},[]);g.useEffect(()=>{r&&(n==="stats"?f():l())},[r,n,l,f]);const u=T.filter(o=>{if(!R)return!0;const h=R.toLowerCase();return JSON.stringify(o.data).toLowerCase().includes(h)});if(!r)return null;const A=d.filter(o=>o.status.connected).length;return e.jsx("div",{style:a.overlay,onClick:s,children:e.jsxs("div",{style:a.modal,onClick:o=>o.stopPropagation(),children:[e.jsxs("div",{style:a.header,children:[e.jsxs("div",{style:a.headerTitle,children:[e.jsx(H,{name:"dashboard",size:16}),e.jsx("span",{children:"Monitoring & Logs"})]}),e.jsx("button",{style:a.closeBtn,onClick:s,title:"Close",children:"×"})]}),e.jsx("div",{style:a.tabs,children:ae.map(o=>e.jsxs("button",{style:a.tab(n===o.id),onClick:()=>{B(o.id),$(""),N(null)},children:[e.jsx(H,{name:o.icon,size:14}),e.jsx("span",{children:o.label})]},o.id))}),n!=="stats"&&n!=="instances"&&e.jsxs("div",{style:a.filters,children:[e.jsx("div",{style:{display:"flex",gap:4},children:["1h","6h","24h","7d","all"].map(o=>e.jsx("button",{style:{...a.timeBtn,background:z===o?"#89b4fa":"transparent",color:z===o?"#1e1e2e":"#a6adc8"},onClick:()=>F(o),children:o},o))}),e.jsx("input",{style:a.searchInput,placeholder:"Search events...",value:R,onChange:o=>$(o.target.value)}),e.jsx("button",{style:a.refreshBtn,onClick:l,children:"Refresh"})]}),e.jsx("div",{style:a.content,children:n==="stats"?e.jsx(ie,{loading:y,error:_,stats:t,integrations:d,connectedCount:A,onRefresh:f}):n==="instances"?e.jsx(de,{}):e.jsx(oe,{loading:y,error:_,entries:u,expandedId:W,matcherResults:m,loadingMatchers:i,onToggleExpand:async(o,h)=>{var w;if(W===o){N(null);return}if(N(o),!m[o]){C(!0);try{let k="";if((h==null?void 0:h.type)==="trigger"&&((w=h==null?void 0:h.data)!=null&&w.id))k=`/api/triggers/events/${h.data.id}/matchers`;else if(h&&["slack","email","approval"].includes(h.type)){const v=h.data,S=v.ts||v.messageId||v.email_id;S&&h.type&&(k=`/api/triggers/matchers/by-source/${h.type}/${encodeURIComponent(S)}`)}if(k){const v=await D(O(k));if(v.ok){const S=await v.json();p(V=>({...V,[o]:S.matchers||[]}))}}}catch(k){console.error("Failed to fetch matchers:",k)}finally{C(!1)}}}})}),n!=="stats"&&n!=="instances"&&e.jsx("div",{style:a.footer,children:e.jsxs("span",{style:{color:"#6c7086",fontSize:11},children:[u.length," event",u.length!==1?"s":""," shown",R&&` (filtered from ${T.length})`]})})]})})}function oe({loading:r,error:s,entries:n,expandedId:B,matcherResults:T,loadingMatchers:M,onToggleExpand:y}){return r?e.jsx("div",{style:{color:"#a6adc8",padding:20},children:"Loading events..."}):s?e.jsx("div",{style:{color:"#f38ba8",padding:20},children:s}):n.length===0?e.jsx("div",{style:{color:"#6c7086",textAlign:"center",padding:40},children:"No events found for the selected filters."}):e.jsx(e.Fragment,{children:n.map((x,_)=>{var W;const j=`${x.type}-${x.timestamp}-${_}`,z=B===j,F=ne[x.type]||"#6c7086",R=le(x),$=new Date(x.timestamp);return e.jsxs("div",{style:{...a.eventRow,borderLeft:`3px solid ${F}`,background:z?"rgba(137,180,250,0.05)":"transparent"},onClick:()=>y(j,x),children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[e.jsx("span",{style:{...a.tag,background:`${F}22`,color:F},children:re[x.type]||x.type}),e.jsx("span",{style:{color:"#cdd6f4",fontSize:12,flex:1},children:R}),e.jsxs("span",{style:{color:"#6c7086",fontSize:10,whiteSpace:"nowrap"},children:[$.toLocaleTimeString()," ",$.toLocaleDateString()]})]}),z&&e.jsxs(e.Fragment,{children:[e.jsx("pre",{style:a.detail,children:JSON.stringify(x.data,null,2)}),T[j]&&e.jsxs("div",{style:{marginTop:12,borderTop:"1px solid #313244",paddingTop:12},children:[e.jsx("div",{style:{color:"#a6adc8",fontSize:11,fontWeight:600,textTransform:"uppercase",letterSpacing:.5,marginBottom:8},children:x.type==="trigger"?"Matcher Results":"Trigger Evaluations"}),M?e.jsx("div",{style:{color:"#6c7086",fontSize:12},children:"Loading matchers..."}):((W=T[j])==null?void 0:W.length)===0?e.jsx("div",{style:{color:"#6c7086",fontSize:12},children:"No matchers evaluated"}):(()=>{const N=T[j];if(x.type!=="trigger"){const m=new Map;for(const p of N){const i=String(p.trigger_id||"unknown");m.has(i)||m.set(i,[]),m.get(i).push(p)}return Array.from(m.entries()).map(([p,i])=>{var C;return e.jsxs("div",{style:{marginBottom:12},children:[e.jsxs("div",{style:{color:"#cdd6f4",fontSize:11,fontWeight:500,marginBottom:6,paddingBottom:4,borderBottom:"1px solid #45475a"},children:["Trigger: ",String(((C=i[0])==null?void 0:C.trigger_name)||p)]}),i.map((t,c)=>{const d=t.matched===1||t.matched===!0,b=d?"#a6e3a1":"#f38ba8",l=t.confidence??null,f=String(t.matcher_name||"unknown"),u=t.reason?String(t.reason):"";return e.jsxs("div",{style:{display:"flex",gap:8,padding:"6px 10px",background:"#313244",borderRadius:4,marginBottom:4,fontSize:11},children:[e.jsx("span",{style:{color:b,fontWeight:600,minWidth:50},children:d?e.jsx(H,{name:"check",size:12}):e.jsx(H,{name:"cross",size:12})}),e.jsx("span",{style:{color:"#cdd6f4",flex:1},children:f}),l!==null&&e.jsxs("span",{style:{color:"#a6adc8"},children:["(",(l*100).toFixed(0),"%)"]}),u&&e.jsx("span",{style:{color:"#6c7086",fontSize:10},children:u})]},c)})]},p)})}else return N.map((m,p)=>{const i=m.matched===1||m.matched===!0,C=i?"#a6e3a1":"#f38ba8",t=m.confidence??null,c=String(m.matcher_name||"unknown"),d=m.reason?String(m.reason):"";return e.jsxs("div",{style:{display:"flex",gap:8,padding:"6px 10px",background:"#313244",borderRadius:4,marginBottom:4,fontSize:11},children:[e.jsx("span",{style:{color:C,fontWeight:600,minWidth:50},children:i?e.jsxs(e.Fragment,{children:[e.jsx(H,{name:"check",size:12})," MATCH"]}):e.jsxs(e.Fragment,{children:[e.jsx(H,{name:"cross",size:12})," FAIL"]})}),e.jsx("span",{style:{color:"#cdd6f4",flex:1},children:c}),t!==null&&e.jsxs("span",{style:{color:"#a6adc8"},children:["(",(t*100).toFixed(0),"%)"]}),d&&e.jsx("span",{style:{color:"#6c7086",fontSize:10},children:d})]},p)})})()]})]})]},j)})})}function ie({loading:r,error:s,stats:n,integrations:B,connectedCount:T,onRefresh:M}){return r?e.jsx("div",{style:{color:"#a6adc8",padding:20},children:"Loading stats..."}):s?e.jsx("div",{style:{color:"#f38ba8",padding:20},children:s}):e.jsxs("div",{style:{padding:20},children:[e.jsx("div",{style:{display:"flex",justifyContent:"flex-end",marginBottom:16},children:e.jsx("button",{style:a.refreshBtn,onClick:M,children:"Refresh"})}),n&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{style:a.section,children:[e.jsx("h3",{style:a.sectionTitle,children:"Workflows"}),e.jsxs("div",{style:a.grid,children:[e.jsx(U,{label:"Active",value:n.activeWorkflows,color:"#89b4fa"}),e.jsx(U,{label:"Completed",value:n.completedWorkflows,color:"#a6e3a1"}),e.jsx(U,{label:"Failed",value:n.failedWorkflows,color:"#f38ba8"})]})]}),e.jsxs("div",{style:a.section,children:[e.jsx("h3",{style:a.sectionTitle,children:"Events (Today)"}),e.jsxs("div",{style:a.grid,children:[e.jsx(U,{label:"Triggers Fired",value:n.triggersFiredToday,color:"#f9e2af"}),e.jsx(U,{label:"Slack Messages",value:n.slackMessageCount,color:"#cba6f7"}),e.jsx(U,{label:"Emails",value:n.emailCount,color:"#fab387"})]})]}),e.jsxs("div",{style:a.section,children:[e.jsxs("h3",{style:a.sectionTitle,children:["Integrations (",T,"/",B.length," connected)"]}),e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:6},children:[B.map(y=>e.jsxs("div",{style:a.integrationRow,children:[e.jsx("span",{style:{color:"#cdd6f4",fontSize:13},children:y.name}),e.jsx("span",{style:{...a.statusBadge,background:y.status.connected?"rgba(166,227,161,0.15)":"rgba(108,112,134,0.15)",color:y.status.connected?"#a6e3a1":"#6c7086"},children:y.status.error?"Error":y.status.connected?"Connected":"Disconnected"})]},y.id)),B.length===0&&e.jsx("div",{style:{color:"#6c7086",fontSize:12},children:"No integrations configured"})]})]})]}),!n&&e.jsx("div",{style:{color:"#6c7086",textAlign:"center",padding:40},children:"No stats available. The event store may not have any data yet."})]})}function U({label:r,value:s,color:n}){return e.jsxs("div",{style:a.card,children:[e.jsx("div",{style:{color:n,fontSize:28,fontWeight:700,lineHeight:1},children:s}),e.jsx("div",{style:{color:"#a6adc8",fontSize:11,marginTop:4},children:r})]})}function le(r){const s=r.data;switch(r.type){case"trigger":return`Trigger "${s.triggerName||s.triggerId}" ${s.status||"fired"}`;case"slack":return`${s.direction==="outbound"?"Sent":"Received"} in #${s.channelName||s.channelId}: ${K(s.text,60)}`;case"email":return`${s.direction==="outbound"?"Sent to":"From"} ${s.direction==="outbound"?s.toAddresses:s.fromAddress}: ${K(s.subject,50)}`;case"approval":return`${s.approved?"Approved":"Rejected"} by ${s.approverEmail}`;case"document":return`Generated "${s.outputFilename}" from template "${s.templateName}"`;case"calendar":return`Calendar event ${s.action}: "${s.summary}"`;case"jira":return`${s.ticketKey} ${s.action}: ${K(s.summary,50)}`;case"step":return`Workflow step: ${s.toStateName} (${s.status})`;case"variable_change":return`Variable "${s.variableName}" changed by ${s.changedBy}`;case"audit":return`[${(s.level||"info").toUpperCase()}] ${s.category}: ${s.action}`;default:return JSON.stringify(s).slice(0,80)}}function K(r,s){return r?r.length>s?r.slice(0,s)+"...":r:""}const G={running:"#a6e3a1",paused:"#f9e2af",completed:"#89b4fa",failed:"#f38ba8",cancelled:"#6c7086"},Q={action:"#89b4fa",wait:"#f9e2af",decision:"#cba6f7",end:"#6c7086"};let Y=null,Z,ee;function te(){const r=se.getState(),s=r.workflowDefinitions??new Map,n=r.workflowInstances??new Map;return Y&&Z===s&&ee===n||(Z=s,ee=n,Y={definitions:s,instances:n}),Y}function ce(){return g.useSyncExternalStore(r=>se.subscribe(r),te,te)}function de(){var C;const{definitions:r,instances:s}=ce(),[n,B]=g.useState("all"),[T,M]=g.useState("all"),[y,x]=g.useState(""),[_,j]=g.useState(null),[z,F]=g.useState(null),[R,$]=g.useState(null),W=g.useMemo(()=>Array.from(s.values()),[s]),N=g.useMemo(()=>Array.from(r.values()),[r]),m=g.useMemo(()=>W.filter(t=>{if(n!=="all"&&t.status!==n||T!=="all"&&t.workflowDefId!==T)return!1;if(y){const c=y.toLowerCase();return t.workflowName.toLowerCase().includes(c)||t.id.toLowerCase().includes(c)||JSON.stringify(t.variables).toLowerCase().includes(c)}return!0}).sort((t,c)=>c.updatedAt-t.updatedAt),[W,n,T,y]),p=_?s.get(_):null,i=R?s.get(R):null;if(i){const t=r.get(i.workflowDefId),c=t==null?void 0:t.states.find(f=>f.id===i.currentStateId),d=G[i.status]||"#6c7086",b={},l={};for(const[f,u]of Object.entries(i.variables))f.startsWith("wi_")?b[f]=u:l[f]=u;return e.jsxs("div",{style:{padding:"12px 0"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:12},children:[e.jsx("button",{style:{...a.refreshBtn,fontSize:12},onClick:()=>$(null),children:"Back"}),e.jsxs("span",{style:{color:"#cdd6f4",fontSize:13,fontWeight:500},children:["Debug: ",i.workflowName]}),e.jsx("span",{style:{...a.tag,background:`${d}22`,color:d},children:i.status})]}),e.jsxs("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(200px, 1fr))",gap:8,marginBottom:16},children:[e.jsx(L,{label:"ID",value:i.id}),e.jsx(L,{label:"Def ID",value:i.workflowDefId}),e.jsx(L,{label:"Current State",value:(c==null?void 0:c.name)||i.currentStateId}),e.jsx(L,{label:"State Type",value:(c==null?void 0:c.type)||"unknown"}),e.jsx(L,{label:"Created",value:J(i.createdAt)}),e.jsx(L,{label:"Updated",value:J(i.updatedAt)}),i.completedAt&&e.jsx(L,{label:"Completed",value:J(i.completedAt)}),i.error&&e.jsx(L,{label:"Error",value:i.error,color:"#f38ba8"}),e.jsx(L,{label:"Steps",value:String(((C=i.history)==null?void 0:C.length)??0)})]}),Object.keys(l).length>0&&e.jsxs("div",{style:{marginBottom:16},children:[e.jsx("div",{style:{color:"#a6adc8",fontSize:11,fontWeight:600,textTransform:"uppercase",letterSpacing:1,marginBottom:6},children:"User Variables"}),e.jsx("pre",{style:a.detail,children:JSON.stringify(l,null,2)})]}),Object.keys(b).length>0&&e.jsxs("div",{style:{marginBottom:16},children:[e.jsx("div",{style:{color:"#a6adc8",fontSize:11,fontWeight:600,textTransform:"uppercase",letterSpacing:1,marginBottom:6},children:"Internal Variables (wi_*)"}),e.jsx("pre",{style:a.detail,children:JSON.stringify(b,null,2)})]}),c&&c.transitions.length>0&&e.jsxs("div",{style:{marginBottom:16},children:[e.jsx("div",{style:{color:"#a6adc8",fontSize:11,fontWeight:600,textTransform:"uppercase",letterSpacing:1,marginBottom:6},children:"Available Transitions"}),c.transitions.map(f=>{var u;return e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",padding:"4px 10px",background:"#313244",borderRadius:4,marginBottom:4},children:[e.jsx("span",{style:{color:"#cdd6f4",fontSize:12},children:f.name}),e.jsxs("span",{style:{color:"#6c7086",fontSize:10},children:[f.condition.type," → ",((u=t==null?void 0:t.states.find(A=>A.id===f.targetStateId))==null?void 0:u.name)||f.targetStateId]})]},f.id)})]}),e.jsxs("div",{children:[e.jsx("div",{style:{color:"#a6adc8",fontSize:11,fontWeight:600,textTransform:"uppercase",letterSpacing:1,marginBottom:6},children:"Raw JSON"}),e.jsx("pre",{style:{...a.detail,maxHeight:400},children:JSON.stringify(i,null,2)})]})]})}if(p){const t=r.get(p.workflowDefId),c=G[p.status]||"#6c7086";return e.jsxs("div",{style:{padding:"12px 0"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:8},children:[e.jsx("button",{style:{...a.refreshBtn,fontSize:12},onClick:()=>{j(null),F(null)},children:"Back"}),e.jsx("span",{style:{color:"#cdd6f4",fontSize:13,fontWeight:500},children:p.workflowName}),e.jsxs("span",{style:{color:"#6c7086",fontSize:10,fontFamily:"monospace"},children:["(",p.id.slice(0,8),")"]}),e.jsx("span",{style:{...a.tag,background:`${c}22`,color:c},children:p.status}),e.jsx("div",{style:{flex:1}}),e.jsx("button",{style:{...a.refreshBtn,fontFamily:"monospace",fontSize:10},onClick:()=>$(p.id),children:"{..}"})]}),e.jsxs("div",{style:{display:"flex",gap:16,color:"#6c7086",fontSize:11,marginBottom:12},children:[e.jsxs("span",{children:["Created: ",J(p.createdAt)]}),e.jsxs("span",{children:["Updated: ",J(p.updatedAt)]}),p.error&&e.jsxs("span",{style:{color:"#f38ba8"},children:["Error: ",p.error]})]}),e.jsxs("div",{style:{color:"#a6adc8",fontSize:11,fontWeight:600,textTransform:"uppercase",letterSpacing:1,marginBottom:8},children:["Timeline (",p.history.length," step",p.history.length!==1?"s":"",")"]}),p.history.length===0&&e.jsx("div",{style:{color:"#6c7086",fontSize:12,padding:16},children:"No steps recorded yet."}),p.history.map((d,b)=>{const l=t==null?void 0:t.states.find(A=>A.id===d.toStateId),f=z===b,u=l&&Q[l.type]||"#6c7086";return e.jsxs("div",{style:{padding:"10px 12px",borderLeft:`3px solid ${u}`,borderBottom:"1px solid #313244",cursor:"pointer",background:f?"rgba(137,180,250,0.05)":"transparent",marginLeft:8},onClick:()=>F(f?null:b),children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[e.jsx("span",{style:{width:6,height:6,borderRadius:"50%",background:u,flexShrink:0}}),e.jsx("span",{style:{color:"#cdd6f4",fontSize:12,fontWeight:500},children:(l==null?void 0:l.name)||d.toStateId}),l&&e.jsx("span",{style:{...a.tag,background:`${u}22`,color:u},children:l.type}),d.transitionName&&e.jsxs("span",{style:{color:"#6c7086",fontSize:10},children:['via "',d.transitionName,'"']}),e.jsx("div",{style:{flex:1}}),e.jsx("span",{style:{color:"#6c7086",fontSize:10,whiteSpace:"nowrap"},children:J(d.timestamp)})]}),f&&e.jsxs("div",{style:{marginTop:8,paddingLeft:20},children:[d.fromStateId&&e.jsxs("div",{style:{color:"#6c7086",fontSize:11,marginBottom:2},children:[e.jsx("span",{style:{fontWeight:600,fontSize:10,textTransform:"uppercase"},children:"From: "}),e.jsx("span",{style:{fontFamily:"monospace"},children:d.fromStateId})]}),d.details&&e.jsxs("div",{style:{marginTop:6},children:[e.jsx("div",{style:{color:"#6c7086",fontSize:10,fontWeight:600,textTransform:"uppercase",marginBottom:4},children:"Agent Reasoning / Summary"}),e.jsx("div",{style:{padding:10,background:"#181825",borderRadius:6,border:"1px solid #313244",fontSize:12,color:"#cdd6f4",lineHeight:1.5,whiteSpace:"pre-wrap"},children:d.details})]}),(l==null?void 0:l.description)&&e.jsxs("div",{style:{marginTop:6,color:"#a6adc8",fontSize:11},children:[e.jsx("span",{style:{color:"#6c7086",fontWeight:600,fontSize:10,textTransform:"uppercase"},children:"Description: "}),l.description]}),d.variables&&Object.keys(d.variables).length>0&&e.jsxs("div",{style:{marginTop:6},children:[e.jsx("div",{style:{color:"#6c7086",fontSize:10,fontWeight:600,textTransform:"uppercase",marginBottom:4},children:"Variables at this step"}),e.jsx("pre",{style:a.detail,children:JSON.stringify(d.variables,null,2)})]}),(l==null?void 0:l.action)&&e.jsxs("div",{style:{marginTop:6},children:[e.jsxs("div",{style:{color:"#6c7086",fontSize:10,fontWeight:600,textTransform:"uppercase",marginBottom:4},children:["Action (",l.action.type,")"]}),e.jsx("pre",{style:a.detail,children:JSON.stringify(l.action,null,2)})]})]})]},b)})]})}return e.jsxs("div",{style:{padding:"12px 0"},children:[e.jsxs("div",{style:{display:"flex",gap:8,alignItems:"center",marginBottom:12,flexWrap:"wrap"},children:[e.jsxs("select",{style:{background:"#313244",border:"1px solid #45475a",borderRadius:6,padding:"5px 10px",color:"#cdd6f4",fontSize:12,outline:"none"},value:T,onChange:t=>M(t.target.value),children:[e.jsx("option",{value:"all",children:"All Workflows"}),N.map(t=>e.jsx("option",{value:t.id,children:t.name},t.id))]}),e.jsx("div",{style:{display:"flex",gap:4},children:["all","running","paused","completed","failed","cancelled"].map(t=>e.jsx("button",{style:{...a.timeBtn,background:n===t?t==="all"?"#89b4fa":G[t]||"#89b4fa":"transparent",color:n===t?"#1e1e2e":"#a6adc8",borderColor:n===t?"transparent":"#45475a",textTransform:"capitalize"},onClick:()=>B(t),children:t},t))}),e.jsx("input",{style:a.searchInput,placeholder:"Search instances...",value:y,onChange:t=>x(t.target.value)}),e.jsxs("span",{style:{color:"#6c7086",fontSize:11},children:[m.length,"/",W.length]})]}),m.length===0?e.jsx("div",{style:{color:"#6c7086",textAlign:"center",padding:40},children:"No workflow instances found."}):m.map(t=>{var f,u;const c=r.get(t.workflowDefId),d=G[t.status]||"#6c7086",b=c==null?void 0:c.states.find(A=>A.id===t.currentStateId),l=b&&Q[b.type]||"#6c7086";return e.jsxs("div",{style:{...a.eventRow,display:"flex",alignItems:"center",gap:12,borderLeft:`3px solid ${d}`},onClick:()=>j(t.id),children:[e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6},children:[e.jsx("span",{style:{color:"#cdd6f4",fontSize:13,fontWeight:500},children:t.workflowName}),e.jsx("span",{style:{...a.tag,background:`${d}22`,color:d},children:t.status})]}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,marginTop:2},children:[e.jsx("span",{style:{color:"#6c7086",fontSize:10,fontFamily:"monospace"},children:t.id.slice(0,8)}),b&&e.jsxs("span",{style:{color:l,fontSize:10},children:["@ ",b.name]}),e.jsxs("span",{style:{color:"#45475a",fontSize:10},children:[((f=t.history)==null?void 0:f.length)??0," step",(((u=t.history)==null?void 0:u.length)??0)!==1?"s":""]})]})]}),e.jsx("span",{style:{color:"#6c7086",fontSize:10,whiteSpace:"nowrap"},children:pe(t.updatedAt)}),e.jsx("button",{style:{background:"transparent",border:"1px solid #45475a",borderRadius:4,padding:"3px 6px",color:"#6c7086",fontSize:10,fontFamily:"monospace",cursor:"pointer"},onClick:A=>{A.stopPropagation(),$(t.id)},title:"Debug view",children:"{..}"})]},t.id)})]})}function L({label:r,value:s,color:n}){return e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:2,padding:"8px 10px",background:"#313244",borderRadius:6},children:[e.jsx("span",{style:{color:"#6c7086",fontSize:10,textTransform:"uppercase",letterSpacing:.5},children:r}),e.jsx("span",{style:{color:n||"#cdd6f4",fontSize:12,fontFamily:"monospace",wordBreak:"break-all"},children:s})]})}function pe(r){return new Date(r).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}function J(r){const s=new Date(r);return`${s.toLocaleDateString()} ${s.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})}`}const a={overlay:{position:"fixed",inset:0,background:"rgba(0, 0, 0, 0.6)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:1e4,backdropFilter:"blur(4px)"},modal:{background:"var(--surface-0, #1e1e2e)",borderRadius:12,border:"1px solid var(--border, #313244)",width:"90vw",maxWidth:1e3,height:"85vh",display:"flex",flexDirection:"column",overflow:"hidden",boxShadow:"0 20px 60px rgba(0, 0, 0, 0.5)"},header:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"16px 20px",borderBottom:"1px solid var(--border, #313244)",background:"var(--surface-1, #181825)"},headerTitle:{fontSize:16,fontWeight:600,color:"var(--text-primary, #cdd6f4)",display:"flex",alignItems:"center",gap:8},closeBtn:{background:"none",border:"none",color:"var(--text-secondary, #a6adc8)",fontSize:20,cursor:"pointer",padding:"4px 8px",borderRadius:6,lineHeight:1},tabs:{display:"flex",borderBottom:"1px solid var(--border, #313244)",background:"var(--surface-1, #181825)",overflowX:"auto",scrollbarWidth:"none"},tab:r=>({padding:"10px 16px",background:"none",border:"none",borderBottom:r?"2px solid var(--accent, #89b4fa)":"2px solid transparent",color:r?"var(--accent, #89b4fa)":"var(--text-secondary, #a6adc8)",fontSize:13,fontWeight:r?600:400,cursor:"pointer",display:"flex",alignItems:"center",gap:6,whiteSpace:"nowrap",transition:"color 0.15s, border-color 0.15s",flexShrink:0}),filters:{display:"flex",gap:8,alignItems:"center",padding:"10px 20px",borderBottom:"1px solid var(--border, #313244)",flexWrap:"wrap"},timeBtn:{border:"1px solid #45475a",borderRadius:4,padding:"4px 8px",fontSize:10,fontWeight:600,cursor:"pointer"},searchInput:{background:"#313244",border:"1px solid #45475a",borderRadius:6,padding:"5px 10px",color:"#cdd6f4",fontSize:12,flex:1,minWidth:120,outline:"none"},refreshBtn:{background:"transparent",border:"1px solid #45475a",borderRadius:6,padding:"5px 12px",color:"#a6adc8",fontSize:11,cursor:"pointer"},content:{flex:1,overflow:"auto",padding:"0 20px"},eventRow:{padding:"8px 12px",borderBottom:"1px solid #313244",cursor:"pointer",transition:"background 0.1s"},tag:{fontSize:10,fontWeight:600,padding:"2px 6px",borderRadius:4,whiteSpace:"nowrap"},detail:{marginTop:8,padding:10,background:"#181825",borderRadius:6,fontSize:11,fontFamily:"monospace",color:"#a6adc8",overflow:"auto",maxHeight:300,whiteSpace:"pre-wrap",wordBreak:"break-all"},footer:{padding:"8px 20px",borderTop:"1px solid #313244"},section:{marginBottom:24},sectionTitle:{color:"#a6adc8",fontSize:12,fontWeight:600,textTransform:"uppercase",letterSpacing:1,marginBottom:12,margin:0},grid:{display:"grid",gridTemplateColumns:"repeat(3, 1fr)",gap:12},card:{background:"#313244",borderRadius:8,padding:"16px 14px",textAlign:"center"},integrationRow:{display:"flex",justifyContent:"space-between",alignItems:"center",padding:"8px 12px",background:"#313244",borderRadius:6},statusBadge:{fontSize:10,fontWeight:600,padding:"3px 8px",borderRadius:4}};export{he as MonitoringModal};
|
|
1
|
+
import{r as g,c as D,d as O,j as e,I as H,s as se}from"./main-BKRg0DBA.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-DSCAlQQW.js";const ae=[{id:"triggers",label:"Triggers",icon:"bolt"},{id:"workflows",label:"Workflows",icon:"gear"},{id:"instances",label:"Instances",icon:"refresh"},{id:"messages",label:"Messages",icon:"chat"},{id:"stats",label:"Stats",icon:"dashboard"}],ne={trigger:"#89b4fa",slack:"#cba6f7",email:"#f9e2af",calendar:"#a6e3a1",document:"#fab387",jira:"#89dceb",workflow:"#f38ba8",system:"#6c7086",step:"#f38ba8",variable_change:"#cba6f7",approval:"#a6e3a1",audit:"#6c7086"},re={trigger:"Trigger",slack:"Slack",email:"Email",calendar:"Calendar",document:"Document",jira:"Jira",workflow:"Workflow",system:"System",step:"Step",variable_change:"Variable",approval:"Approval",audit:"Audit"};function he({isOpen:r,onClose:s}){const[n,B]=g.useState("triggers"),[T,M]=g.useState([]),[y,x]=g.useState(!0),[_,j]=g.useState(null),[z,F]=g.useState("24h"),[R,$]=g.useState(""),[W,N]=g.useState(null),[m,p]=g.useState({}),[i,C]=g.useState(!1),[t,c]=g.useState(null),[d,b]=g.useState([]),l=g.useCallback(async()=>{if(!(n==="stats"||n==="instances")){x(!0);try{const o=Date.now(),h={"1h":36e5,"6h":216e5,"24h":864e5,"7d":6048e5,all:0},w=h[z]>0?String(o-h[z]):void 0;let k=[];if(n==="triggers"){const v=new URLSearchParams({limit:"200"});w&&v.set("since",w);const S=await D(O(`/api/events/triggers?${v}`));if(!S.ok){j(`HTTP ${S.status}`);return}k=((await S.json()).events||[]).map(E=>({type:"trigger",timestamp:E.firedAt,data:E}))}else if(n==="workflows"){const v=new URLSearchParams({limit:"200",category:"workflow"});w&&v.set("since",w);const S=await D(O(`/api/events/audit?${v}`));if(!S.ok){j(`HTTP ${S.status}`);return}k=((await S.json()).entries||[]).map(E=>({type:"workflow",timestamp:E.createdAt,data:E}))}else if(n==="messages"){const v=new URLSearchParams({limit:"200"}),S=new URLSearchParams({limit:"200"}),V=new URLSearchParams({limit:"200"});w&&(v.set("since",w),S.set("since",w));const[E,X,q]=await Promise.all([D(O(`/api/events/slack?${v}`)),D(O(`/api/events/email?${S}`)),D(O(`/api/events/approvals?${V}`))]);if(E.ok){const P=await E.json();for(const I of P.messages||[])k.push({type:"slack",timestamp:I.receivedAt,data:I})}if(X.ok){const P=await X.json();for(const I of P.messages||[])k.push({type:"email",timestamp:I.receivedAt,data:I})}if(q.ok){const P=await q.json();for(const I of P.events||[])k.push({type:"approval",timestamp:I.recordedAt,data:I})}k.sort((P,I)=>I.timestamp-P.timestamp)}M(k),j(null)}catch(o){j(`Failed to load events: ${o}`)}finally{x(!1)}}},[n,z]),f=g.useCallback(async()=>{x(!0);try{const[o,h]=await Promise.all([D(O("/api/events/stats")),D(O("/api/integrations"))]);if(o.ok&&c(await o.json()),h.ok){const w=await h.json();b(Array.isArray(w)?w:[])}j(null)}catch(o){j(`Failed to load stats: ${o}`)}finally{x(!1)}},[]);g.useEffect(()=>{r&&(n==="stats"?f():l())},[r,n,l,f]);const u=T.filter(o=>{if(!R)return!0;const h=R.toLowerCase();return JSON.stringify(o.data).toLowerCase().includes(h)});if(!r)return null;const A=d.filter(o=>o.status.connected).length;return e.jsx("div",{style:a.overlay,onClick:s,children:e.jsxs("div",{style:a.modal,onClick:o=>o.stopPropagation(),children:[e.jsxs("div",{style:a.header,children:[e.jsxs("div",{style:a.headerTitle,children:[e.jsx(H,{name:"dashboard",size:16}),e.jsx("span",{children:"Monitoring & Logs"})]}),e.jsx("button",{style:a.closeBtn,onClick:s,title:"Close",children:"×"})]}),e.jsx("div",{style:a.tabs,children:ae.map(o=>e.jsxs("button",{style:a.tab(n===o.id),onClick:()=>{B(o.id),$(""),N(null)},children:[e.jsx(H,{name:o.icon,size:14}),e.jsx("span",{children:o.label})]},o.id))}),n!=="stats"&&n!=="instances"&&e.jsxs("div",{style:a.filters,children:[e.jsx("div",{style:{display:"flex",gap:4},children:["1h","6h","24h","7d","all"].map(o=>e.jsx("button",{style:{...a.timeBtn,background:z===o?"#89b4fa":"transparent",color:z===o?"#1e1e2e":"#a6adc8"},onClick:()=>F(o),children:o},o))}),e.jsx("input",{style:a.searchInput,placeholder:"Search events...",value:R,onChange:o=>$(o.target.value)}),e.jsx("button",{style:a.refreshBtn,onClick:l,children:"Refresh"})]}),e.jsx("div",{style:a.content,children:n==="stats"?e.jsx(ie,{loading:y,error:_,stats:t,integrations:d,connectedCount:A,onRefresh:f}):n==="instances"?e.jsx(de,{}):e.jsx(oe,{loading:y,error:_,entries:u,expandedId:W,matcherResults:m,loadingMatchers:i,onToggleExpand:async(o,h)=>{var w;if(W===o){N(null);return}if(N(o),!m[o]){C(!0);try{let k="";if((h==null?void 0:h.type)==="trigger"&&((w=h==null?void 0:h.data)!=null&&w.id))k=`/api/triggers/events/${h.data.id}/matchers`;else if(h&&["slack","email","approval"].includes(h.type)){const v=h.data,S=v.ts||v.messageId||v.email_id;S&&h.type&&(k=`/api/triggers/matchers/by-source/${h.type}/${encodeURIComponent(S)}`)}if(k){const v=await D(O(k));if(v.ok){const S=await v.json();p(V=>({...V,[o]:S.matchers||[]}))}}}catch(k){console.error("Failed to fetch matchers:",k)}finally{C(!1)}}}})}),n!=="stats"&&n!=="instances"&&e.jsx("div",{style:a.footer,children:e.jsxs("span",{style:{color:"#6c7086",fontSize:11},children:[u.length," event",u.length!==1?"s":""," shown",R&&` (filtered from ${T.length})`]})})]})})}function oe({loading:r,error:s,entries:n,expandedId:B,matcherResults:T,loadingMatchers:M,onToggleExpand:y}){return r?e.jsx("div",{style:{color:"#a6adc8",padding:20},children:"Loading events..."}):s?e.jsx("div",{style:{color:"#f38ba8",padding:20},children:s}):n.length===0?e.jsx("div",{style:{color:"#6c7086",textAlign:"center",padding:40},children:"No events found for the selected filters."}):e.jsx(e.Fragment,{children:n.map((x,_)=>{var W;const j=`${x.type}-${x.timestamp}-${_}`,z=B===j,F=ne[x.type]||"#6c7086",R=le(x),$=new Date(x.timestamp);return e.jsxs("div",{style:{...a.eventRow,borderLeft:`3px solid ${F}`,background:z?"rgba(137,180,250,0.05)":"transparent"},onClick:()=>y(j,x),children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[e.jsx("span",{style:{...a.tag,background:`${F}22`,color:F},children:re[x.type]||x.type}),e.jsx("span",{style:{color:"#cdd6f4",fontSize:12,flex:1},children:R}),e.jsxs("span",{style:{color:"#6c7086",fontSize:10,whiteSpace:"nowrap"},children:[$.toLocaleTimeString()," ",$.toLocaleDateString()]})]}),z&&e.jsxs(e.Fragment,{children:[e.jsx("pre",{style:a.detail,children:JSON.stringify(x.data,null,2)}),T[j]&&e.jsxs("div",{style:{marginTop:12,borderTop:"1px solid #313244",paddingTop:12},children:[e.jsx("div",{style:{color:"#a6adc8",fontSize:11,fontWeight:600,textTransform:"uppercase",letterSpacing:.5,marginBottom:8},children:x.type==="trigger"?"Matcher Results":"Trigger Evaluations"}),M?e.jsx("div",{style:{color:"#6c7086",fontSize:12},children:"Loading matchers..."}):((W=T[j])==null?void 0:W.length)===0?e.jsx("div",{style:{color:"#6c7086",fontSize:12},children:"No matchers evaluated"}):(()=>{const N=T[j];if(x.type!=="trigger"){const m=new Map;for(const p of N){const i=String(p.trigger_id||"unknown");m.has(i)||m.set(i,[]),m.get(i).push(p)}return Array.from(m.entries()).map(([p,i])=>{var C;return e.jsxs("div",{style:{marginBottom:12},children:[e.jsxs("div",{style:{color:"#cdd6f4",fontSize:11,fontWeight:500,marginBottom:6,paddingBottom:4,borderBottom:"1px solid #45475a"},children:["Trigger: ",String(((C=i[0])==null?void 0:C.trigger_name)||p)]}),i.map((t,c)=>{const d=t.matched===1||t.matched===!0,b=d?"#a6e3a1":"#f38ba8",l=t.confidence??null,f=String(t.matcher_name||"unknown"),u=t.reason?String(t.reason):"";return e.jsxs("div",{style:{display:"flex",gap:8,padding:"6px 10px",background:"#313244",borderRadius:4,marginBottom:4,fontSize:11},children:[e.jsx("span",{style:{color:b,fontWeight:600,minWidth:50},children:d?e.jsx(H,{name:"check",size:12}):e.jsx(H,{name:"cross",size:12})}),e.jsx("span",{style:{color:"#cdd6f4",flex:1},children:f}),l!==null&&e.jsxs("span",{style:{color:"#a6adc8"},children:["(",(l*100).toFixed(0),"%)"]}),u&&e.jsx("span",{style:{color:"#6c7086",fontSize:10},children:u})]},c)})]},p)})}else return N.map((m,p)=>{const i=m.matched===1||m.matched===!0,C=i?"#a6e3a1":"#f38ba8",t=m.confidence??null,c=String(m.matcher_name||"unknown"),d=m.reason?String(m.reason):"";return e.jsxs("div",{style:{display:"flex",gap:8,padding:"6px 10px",background:"#313244",borderRadius:4,marginBottom:4,fontSize:11},children:[e.jsx("span",{style:{color:C,fontWeight:600,minWidth:50},children:i?e.jsxs(e.Fragment,{children:[e.jsx(H,{name:"check",size:12})," MATCH"]}):e.jsxs(e.Fragment,{children:[e.jsx(H,{name:"cross",size:12})," FAIL"]})}),e.jsx("span",{style:{color:"#cdd6f4",flex:1},children:c}),t!==null&&e.jsxs("span",{style:{color:"#a6adc8"},children:["(",(t*100).toFixed(0),"%)"]}),d&&e.jsx("span",{style:{color:"#6c7086",fontSize:10},children:d})]},p)})})()]})]})]},j)})})}function ie({loading:r,error:s,stats:n,integrations:B,connectedCount:T,onRefresh:M}){return r?e.jsx("div",{style:{color:"#a6adc8",padding:20},children:"Loading stats..."}):s?e.jsx("div",{style:{color:"#f38ba8",padding:20},children:s}):e.jsxs("div",{style:{padding:20},children:[e.jsx("div",{style:{display:"flex",justifyContent:"flex-end",marginBottom:16},children:e.jsx("button",{style:a.refreshBtn,onClick:M,children:"Refresh"})}),n&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{style:a.section,children:[e.jsx("h3",{style:a.sectionTitle,children:"Workflows"}),e.jsxs("div",{style:a.grid,children:[e.jsx(U,{label:"Active",value:n.activeWorkflows,color:"#89b4fa"}),e.jsx(U,{label:"Completed",value:n.completedWorkflows,color:"#a6e3a1"}),e.jsx(U,{label:"Failed",value:n.failedWorkflows,color:"#f38ba8"})]})]}),e.jsxs("div",{style:a.section,children:[e.jsx("h3",{style:a.sectionTitle,children:"Events (Today)"}),e.jsxs("div",{style:a.grid,children:[e.jsx(U,{label:"Triggers Fired",value:n.triggersFiredToday,color:"#f9e2af"}),e.jsx(U,{label:"Slack Messages",value:n.slackMessageCount,color:"#cba6f7"}),e.jsx(U,{label:"Emails",value:n.emailCount,color:"#fab387"})]})]}),e.jsxs("div",{style:a.section,children:[e.jsxs("h3",{style:a.sectionTitle,children:["Integrations (",T,"/",B.length," connected)"]}),e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:6},children:[B.map(y=>e.jsxs("div",{style:a.integrationRow,children:[e.jsx("span",{style:{color:"#cdd6f4",fontSize:13},children:y.name}),e.jsx("span",{style:{...a.statusBadge,background:y.status.connected?"rgba(166,227,161,0.15)":"rgba(108,112,134,0.15)",color:y.status.connected?"#a6e3a1":"#6c7086"},children:y.status.error?"Error":y.status.connected?"Connected":"Disconnected"})]},y.id)),B.length===0&&e.jsx("div",{style:{color:"#6c7086",fontSize:12},children:"No integrations configured"})]})]})]}),!n&&e.jsx("div",{style:{color:"#6c7086",textAlign:"center",padding:40},children:"No stats available. The event store may not have any data yet."})]})}function U({label:r,value:s,color:n}){return e.jsxs("div",{style:a.card,children:[e.jsx("div",{style:{color:n,fontSize:28,fontWeight:700,lineHeight:1},children:s}),e.jsx("div",{style:{color:"#a6adc8",fontSize:11,marginTop:4},children:r})]})}function le(r){const s=r.data;switch(r.type){case"trigger":return`Trigger "${s.triggerName||s.triggerId}" ${s.status||"fired"}`;case"slack":return`${s.direction==="outbound"?"Sent":"Received"} in #${s.channelName||s.channelId}: ${K(s.text,60)}`;case"email":return`${s.direction==="outbound"?"Sent to":"From"} ${s.direction==="outbound"?s.toAddresses:s.fromAddress}: ${K(s.subject,50)}`;case"approval":return`${s.approved?"Approved":"Rejected"} by ${s.approverEmail}`;case"document":return`Generated "${s.outputFilename}" from template "${s.templateName}"`;case"calendar":return`Calendar event ${s.action}: "${s.summary}"`;case"jira":return`${s.ticketKey} ${s.action}: ${K(s.summary,50)}`;case"step":return`Workflow step: ${s.toStateName} (${s.status})`;case"variable_change":return`Variable "${s.variableName}" changed by ${s.changedBy}`;case"audit":return`[${(s.level||"info").toUpperCase()}] ${s.category}: ${s.action}`;default:return JSON.stringify(s).slice(0,80)}}function K(r,s){return r?r.length>s?r.slice(0,s)+"...":r:""}const G={running:"#a6e3a1",paused:"#f9e2af",completed:"#89b4fa",failed:"#f38ba8",cancelled:"#6c7086"},Q={action:"#89b4fa",wait:"#f9e2af",decision:"#cba6f7",end:"#6c7086"};let Y=null,Z,ee;function te(){const r=se.getState(),s=r.workflowDefinitions??new Map,n=r.workflowInstances??new Map;return Y&&Z===s&&ee===n||(Z=s,ee=n,Y={definitions:s,instances:n}),Y}function ce(){return g.useSyncExternalStore(r=>se.subscribe(r),te,te)}function de(){var C;const{definitions:r,instances:s}=ce(),[n,B]=g.useState("all"),[T,M]=g.useState("all"),[y,x]=g.useState(""),[_,j]=g.useState(null),[z,F]=g.useState(null),[R,$]=g.useState(null),W=g.useMemo(()=>Array.from(s.values()),[s]),N=g.useMemo(()=>Array.from(r.values()),[r]),m=g.useMemo(()=>W.filter(t=>{if(n!=="all"&&t.status!==n||T!=="all"&&t.workflowDefId!==T)return!1;if(y){const c=y.toLowerCase();return t.workflowName.toLowerCase().includes(c)||t.id.toLowerCase().includes(c)||JSON.stringify(t.variables).toLowerCase().includes(c)}return!0}).sort((t,c)=>c.updatedAt-t.updatedAt),[W,n,T,y]),p=_?s.get(_):null,i=R?s.get(R):null;if(i){const t=r.get(i.workflowDefId),c=t==null?void 0:t.states.find(f=>f.id===i.currentStateId),d=G[i.status]||"#6c7086",b={},l={};for(const[f,u]of Object.entries(i.variables))f.startsWith("wi_")?b[f]=u:l[f]=u;return e.jsxs("div",{style:{padding:"12px 0"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:12},children:[e.jsx("button",{style:{...a.refreshBtn,fontSize:12},onClick:()=>$(null),children:"Back"}),e.jsxs("span",{style:{color:"#cdd6f4",fontSize:13,fontWeight:500},children:["Debug: ",i.workflowName]}),e.jsx("span",{style:{...a.tag,background:`${d}22`,color:d},children:i.status})]}),e.jsxs("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fill, minmax(200px, 1fr))",gap:8,marginBottom:16},children:[e.jsx(L,{label:"ID",value:i.id}),e.jsx(L,{label:"Def ID",value:i.workflowDefId}),e.jsx(L,{label:"Current State",value:(c==null?void 0:c.name)||i.currentStateId}),e.jsx(L,{label:"State Type",value:(c==null?void 0:c.type)||"unknown"}),e.jsx(L,{label:"Created",value:J(i.createdAt)}),e.jsx(L,{label:"Updated",value:J(i.updatedAt)}),i.completedAt&&e.jsx(L,{label:"Completed",value:J(i.completedAt)}),i.error&&e.jsx(L,{label:"Error",value:i.error,color:"#f38ba8"}),e.jsx(L,{label:"Steps",value:String(((C=i.history)==null?void 0:C.length)??0)})]}),Object.keys(l).length>0&&e.jsxs("div",{style:{marginBottom:16},children:[e.jsx("div",{style:{color:"#a6adc8",fontSize:11,fontWeight:600,textTransform:"uppercase",letterSpacing:1,marginBottom:6},children:"User Variables"}),e.jsx("pre",{style:a.detail,children:JSON.stringify(l,null,2)})]}),Object.keys(b).length>0&&e.jsxs("div",{style:{marginBottom:16},children:[e.jsx("div",{style:{color:"#a6adc8",fontSize:11,fontWeight:600,textTransform:"uppercase",letterSpacing:1,marginBottom:6},children:"Internal Variables (wi_*)"}),e.jsx("pre",{style:a.detail,children:JSON.stringify(b,null,2)})]}),c&&c.transitions.length>0&&e.jsxs("div",{style:{marginBottom:16},children:[e.jsx("div",{style:{color:"#a6adc8",fontSize:11,fontWeight:600,textTransform:"uppercase",letterSpacing:1,marginBottom:6},children:"Available Transitions"}),c.transitions.map(f=>{var u;return e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",padding:"4px 10px",background:"#313244",borderRadius:4,marginBottom:4},children:[e.jsx("span",{style:{color:"#cdd6f4",fontSize:12},children:f.name}),e.jsxs("span",{style:{color:"#6c7086",fontSize:10},children:[f.condition.type," → ",((u=t==null?void 0:t.states.find(A=>A.id===f.targetStateId))==null?void 0:u.name)||f.targetStateId]})]},f.id)})]}),e.jsxs("div",{children:[e.jsx("div",{style:{color:"#a6adc8",fontSize:11,fontWeight:600,textTransform:"uppercase",letterSpacing:1,marginBottom:6},children:"Raw JSON"}),e.jsx("pre",{style:{...a.detail,maxHeight:400},children:JSON.stringify(i,null,2)})]})]})}if(p){const t=r.get(p.workflowDefId),c=G[p.status]||"#6c7086";return e.jsxs("div",{style:{padding:"12px 0"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:8},children:[e.jsx("button",{style:{...a.refreshBtn,fontSize:12},onClick:()=>{j(null),F(null)},children:"Back"}),e.jsx("span",{style:{color:"#cdd6f4",fontSize:13,fontWeight:500},children:p.workflowName}),e.jsxs("span",{style:{color:"#6c7086",fontSize:10,fontFamily:"monospace"},children:["(",p.id.slice(0,8),")"]}),e.jsx("span",{style:{...a.tag,background:`${c}22`,color:c},children:p.status}),e.jsx("div",{style:{flex:1}}),e.jsx("button",{style:{...a.refreshBtn,fontFamily:"monospace",fontSize:10},onClick:()=>$(p.id),children:"{..}"})]}),e.jsxs("div",{style:{display:"flex",gap:16,color:"#6c7086",fontSize:11,marginBottom:12},children:[e.jsxs("span",{children:["Created: ",J(p.createdAt)]}),e.jsxs("span",{children:["Updated: ",J(p.updatedAt)]}),p.error&&e.jsxs("span",{style:{color:"#f38ba8"},children:["Error: ",p.error]})]}),e.jsxs("div",{style:{color:"#a6adc8",fontSize:11,fontWeight:600,textTransform:"uppercase",letterSpacing:1,marginBottom:8},children:["Timeline (",p.history.length," step",p.history.length!==1?"s":"",")"]}),p.history.length===0&&e.jsx("div",{style:{color:"#6c7086",fontSize:12,padding:16},children:"No steps recorded yet."}),p.history.map((d,b)=>{const l=t==null?void 0:t.states.find(A=>A.id===d.toStateId),f=z===b,u=l&&Q[l.type]||"#6c7086";return e.jsxs("div",{style:{padding:"10px 12px",borderLeft:`3px solid ${u}`,borderBottom:"1px solid #313244",cursor:"pointer",background:f?"rgba(137,180,250,0.05)":"transparent",marginLeft:8},onClick:()=>F(f?null:b),children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[e.jsx("span",{style:{width:6,height:6,borderRadius:"50%",background:u,flexShrink:0}}),e.jsx("span",{style:{color:"#cdd6f4",fontSize:12,fontWeight:500},children:(l==null?void 0:l.name)||d.toStateId}),l&&e.jsx("span",{style:{...a.tag,background:`${u}22`,color:u},children:l.type}),d.transitionName&&e.jsxs("span",{style:{color:"#6c7086",fontSize:10},children:['via "',d.transitionName,'"']}),e.jsx("div",{style:{flex:1}}),e.jsx("span",{style:{color:"#6c7086",fontSize:10,whiteSpace:"nowrap"},children:J(d.timestamp)})]}),f&&e.jsxs("div",{style:{marginTop:8,paddingLeft:20},children:[d.fromStateId&&e.jsxs("div",{style:{color:"#6c7086",fontSize:11,marginBottom:2},children:[e.jsx("span",{style:{fontWeight:600,fontSize:10,textTransform:"uppercase"},children:"From: "}),e.jsx("span",{style:{fontFamily:"monospace"},children:d.fromStateId})]}),d.details&&e.jsxs("div",{style:{marginTop:6},children:[e.jsx("div",{style:{color:"#6c7086",fontSize:10,fontWeight:600,textTransform:"uppercase",marginBottom:4},children:"Agent Reasoning / Summary"}),e.jsx("div",{style:{padding:10,background:"#181825",borderRadius:6,border:"1px solid #313244",fontSize:12,color:"#cdd6f4",lineHeight:1.5,whiteSpace:"pre-wrap"},children:d.details})]}),(l==null?void 0:l.description)&&e.jsxs("div",{style:{marginTop:6,color:"#a6adc8",fontSize:11},children:[e.jsx("span",{style:{color:"#6c7086",fontWeight:600,fontSize:10,textTransform:"uppercase"},children:"Description: "}),l.description]}),d.variables&&Object.keys(d.variables).length>0&&e.jsxs("div",{style:{marginTop:6},children:[e.jsx("div",{style:{color:"#6c7086",fontSize:10,fontWeight:600,textTransform:"uppercase",marginBottom:4},children:"Variables at this step"}),e.jsx("pre",{style:a.detail,children:JSON.stringify(d.variables,null,2)})]}),(l==null?void 0:l.action)&&e.jsxs("div",{style:{marginTop:6},children:[e.jsxs("div",{style:{color:"#6c7086",fontSize:10,fontWeight:600,textTransform:"uppercase",marginBottom:4},children:["Action (",l.action.type,")"]}),e.jsx("pre",{style:a.detail,children:JSON.stringify(l.action,null,2)})]})]})]},b)})]})}return e.jsxs("div",{style:{padding:"12px 0"},children:[e.jsxs("div",{style:{display:"flex",gap:8,alignItems:"center",marginBottom:12,flexWrap:"wrap"},children:[e.jsxs("select",{style:{background:"#313244",border:"1px solid #45475a",borderRadius:6,padding:"5px 10px",color:"#cdd6f4",fontSize:12,outline:"none"},value:T,onChange:t=>M(t.target.value),children:[e.jsx("option",{value:"all",children:"All Workflows"}),N.map(t=>e.jsx("option",{value:t.id,children:t.name},t.id))]}),e.jsx("div",{style:{display:"flex",gap:4},children:["all","running","paused","completed","failed","cancelled"].map(t=>e.jsx("button",{style:{...a.timeBtn,background:n===t?t==="all"?"#89b4fa":G[t]||"#89b4fa":"transparent",color:n===t?"#1e1e2e":"#a6adc8",borderColor:n===t?"transparent":"#45475a",textTransform:"capitalize"},onClick:()=>B(t),children:t},t))}),e.jsx("input",{style:a.searchInput,placeholder:"Search instances...",value:y,onChange:t=>x(t.target.value)}),e.jsxs("span",{style:{color:"#6c7086",fontSize:11},children:[m.length,"/",W.length]})]}),m.length===0?e.jsx("div",{style:{color:"#6c7086",textAlign:"center",padding:40},children:"No workflow instances found."}):m.map(t=>{var f,u;const c=r.get(t.workflowDefId),d=G[t.status]||"#6c7086",b=c==null?void 0:c.states.find(A=>A.id===t.currentStateId),l=b&&Q[b.type]||"#6c7086";return e.jsxs("div",{style:{...a.eventRow,display:"flex",alignItems:"center",gap:12,borderLeft:`3px solid ${d}`},onClick:()=>j(t.id),children:[e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6},children:[e.jsx("span",{style:{color:"#cdd6f4",fontSize:13,fontWeight:500},children:t.workflowName}),e.jsx("span",{style:{...a.tag,background:`${d}22`,color:d},children:t.status})]}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,marginTop:2},children:[e.jsx("span",{style:{color:"#6c7086",fontSize:10,fontFamily:"monospace"},children:t.id.slice(0,8)}),b&&e.jsxs("span",{style:{color:l,fontSize:10},children:["@ ",b.name]}),e.jsxs("span",{style:{color:"#45475a",fontSize:10},children:[((f=t.history)==null?void 0:f.length)??0," step",(((u=t.history)==null?void 0:u.length)??0)!==1?"s":""]})]})]}),e.jsx("span",{style:{color:"#6c7086",fontSize:10,whiteSpace:"nowrap"},children:pe(t.updatedAt)}),e.jsx("button",{style:{background:"transparent",border:"1px solid #45475a",borderRadius:4,padding:"3px 6px",color:"#6c7086",fontSize:10,fontFamily:"monospace",cursor:"pointer"},onClick:A=>{A.stopPropagation(),$(t.id)},title:"Debug view",children:"{..}"})]},t.id)})]})}function L({label:r,value:s,color:n}){return e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:2,padding:"8px 10px",background:"#313244",borderRadius:6},children:[e.jsx("span",{style:{color:"#6c7086",fontSize:10,textTransform:"uppercase",letterSpacing:.5},children:r}),e.jsx("span",{style:{color:n||"#cdd6f4",fontSize:12,fontFamily:"monospace",wordBreak:"break-all"},children:s})]})}function pe(r){return new Date(r).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}function J(r){const s=new Date(r);return`${s.toLocaleDateString()} ${s.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})}`}const a={overlay:{position:"fixed",inset:0,background:"rgba(0, 0, 0, 0.6)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:1e4,backdropFilter:"blur(4px)"},modal:{background:"var(--surface-0, #1e1e2e)",borderRadius:12,border:"1px solid var(--border, #313244)",width:"90vw",maxWidth:1e3,height:"85vh",display:"flex",flexDirection:"column",overflow:"hidden",boxShadow:"0 20px 60px rgba(0, 0, 0, 0.5)"},header:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"16px 20px",borderBottom:"1px solid var(--border, #313244)",background:"var(--surface-1, #181825)"},headerTitle:{fontSize:16,fontWeight:600,color:"var(--text-primary, #cdd6f4)",display:"flex",alignItems:"center",gap:8},closeBtn:{background:"none",border:"none",color:"var(--text-secondary, #a6adc8)",fontSize:20,cursor:"pointer",padding:"4px 8px",borderRadius:6,lineHeight:1},tabs:{display:"flex",borderBottom:"1px solid var(--border, #313244)",background:"var(--surface-1, #181825)",overflowX:"auto",scrollbarWidth:"none"},tab:r=>({padding:"10px 16px",background:"none",border:"none",borderBottom:r?"2px solid var(--accent, #89b4fa)":"2px solid transparent",color:r?"var(--accent, #89b4fa)":"var(--text-secondary, #a6adc8)",fontSize:13,fontWeight:r?600:400,cursor:"pointer",display:"flex",alignItems:"center",gap:6,whiteSpace:"nowrap",transition:"color 0.15s, border-color 0.15s",flexShrink:0}),filters:{display:"flex",gap:8,alignItems:"center",padding:"10px 20px",borderBottom:"1px solid var(--border, #313244)",flexWrap:"wrap"},timeBtn:{border:"1px solid #45475a",borderRadius:4,padding:"4px 8px",fontSize:10,fontWeight:600,cursor:"pointer"},searchInput:{background:"#313244",border:"1px solid #45475a",borderRadius:6,padding:"5px 10px",color:"#cdd6f4",fontSize:12,flex:1,minWidth:120,outline:"none"},refreshBtn:{background:"transparent",border:"1px solid #45475a",borderRadius:6,padding:"5px 12px",color:"#a6adc8",fontSize:11,cursor:"pointer"},content:{flex:1,overflow:"auto",padding:"0 20px"},eventRow:{padding:"8px 12px",borderBottom:"1px solid #313244",cursor:"pointer",transition:"background 0.1s"},tag:{fontSize:10,fontWeight:600,padding:"2px 6px",borderRadius:4,whiteSpace:"nowrap"},detail:{marginTop:8,padding:10,background:"#181825",borderRadius:6,fontSize:11,fontFamily:"monospace",color:"#a6adc8",overflow:"auto",maxHeight:300,whiteSpace:"pre-wrap",wordBreak:"break-all"},footer:{padding:"8px 20px",borderTop:"1px solid #313244"},section:{marginBottom:24},sectionTitle:{color:"#a6adc8",fontSize:12,fontWeight:600,textTransform:"uppercase",letterSpacing:1,marginBottom:12,margin:0},grid:{display:"grid",gridTemplateColumns:"repeat(3, 1fr)",gap:12},card:{background:"#313244",borderRadius:8,padding:"16px 14px",textAlign:"center"},integrationRow:{display:"flex",justifyContent:"space-between",alignItems:"center",padding:"8px 12px",background:"#313244",borderRadius:6},statusBadge:{fontSize:10,fontWeight:600,padding:"3px 8px",borderRadius:4}};export{he as MonitoringModal};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as E,a as F,b as B,r as o,s as d,c as M,d as w,j as a}from"./main-
|
|
1
|
+
import{u as E,a as F,b as B,r as o,s as d,c as M,d as w,j as a}from"./main-BKRg0DBA.js";import{L as I}from"./LogViewerModal-CrnaI78u.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-DSCAlQQW.js";function V({building:t,isOpen:i,onClose:N,onMinimize:b}){var S,j,k,L;const{t:s}=E(["terminal"]),C=F(),$=B(),p=C.get(t.id)||"",y=$.has(t.id),[m,g]=o.useState(null),[c,n]=o.useState(null);o.useEffect(()=>{var e;return i&&((e=t.pm2)!=null&&e.enabled)&&d.startLogStreaming(t.id,200),()=>{t.id&&d.stopLogStreaming(t.id)}},[i,t.id,(S=t.pm2)==null?void 0:S.enabled]),o.useEffect(()=>{if(!c)return;const e=setTimeout(()=>n(null),4e3);return()=>clearTimeout(e)},[c]),o.useEffect(()=>{n(null),g(null)},[t.id,i]);const h=o.useMemo(()=>p?p.split(`
|
|
2
2
|
`).map((e,r)=>({text:e,lineNumber:r+1})):[],[p]),f=o.useCallback(async e=>{g(e),n(null);try{const r=await M(w(`/api/buildings/${t.id}/command`),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({command:e})}),l=await r.json().catch(()=>({}));r.ok&&(l==null?void 0:l.success)!==!1?n({kind:"success",text:s(e==="restart"?"terminal:logs.restartSuccess":"terminal:logs.stopSuccess")}):n({kind:"error",text:(l==null?void 0:l.error)||s("terminal:logs.actionFailed")})}catch(r){n({kind:"error",text:r.message||s("terminal:logs.actionFailed")})}finally{g(null)}},[t.id,s]),u=((j=t.pm2Status)==null?void 0:j.status)||t.status,x=((k=t.pm2Status)==null?void 0:k.ports)??[],P=a.jsxs(a.Fragment,{children:[u&&a.jsx("span",{className:`pm2-status-badge status-${u}`,title:s("terminal:logs.status"),children:u}),x.length>0?a.jsxs("span",{className:"pm2-ports-badge",title:s("terminal:logs.ports"),children:[s("terminal:logs.ports"),":",x.map(e=>a.jsx("a",{className:"pm2-port-link",href:`http://localhost:${e}`,target:"_blank",rel:"noopener noreferrer",title:`http://localhost:${e}`,onClick:r=>r.stopPropagation(),children:e},e))]}):a.jsx("span",{className:"pm2-ports-badge",title:s("terminal:logs.ports"),children:s("terminal:logs.noPorts")})]}),T=a.jsxs("span",{className:"pm2-process-controls",children:[a.jsxs("button",{className:"toolbar-btn",onClick:()=>f("restart"),disabled:m!==null,title:s("terminal:logs.restart"),children:["↻ ",s(m==="restart"?"terminal:logs.restarting":"terminal:logs.restart")]}),a.jsxs("button",{className:"toolbar-btn danger",onClick:()=>f("stop"),disabled:m!==null,title:s("terminal:logs.stop"),children:["■ ",s(m==="stop"?"terminal:logs.stopping":"terminal:logs.stop")]}),c&&a.jsx("span",{className:`pm2-action-feedback ${c.kind}`,role:"status",children:c.text})]});return a.jsx(I,{isOpen:i,onClose:N,onMinimize:b,title:`${t.name} - ${s("terminal:logs.pm2Logs")}`,icon:"📄",lines:h,isStreaming:y,isLoading:i&&((L=t.pm2)==null?void 0:L.enabled)===!0&&h.length===0,headerInfo:P,extraToolbar:T,onClear:()=>d.clearStreamingLogs(t.id)})}export{V as PM2LogsModal};
|