@openc3/vue-common 7.1.1 → 7.2.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.
Files changed (448) hide show
  1. package/dist/{ArrayWidget-CmKZQfWB.js → ArrayWidget-D1PArcGr.js} +5 -5
  2. package/dist/{ArrayWidget-CmKZQfWB.js.map → ArrayWidget-D1PArcGr.js.map} +1 -1
  3. package/dist/{ArrayWidget-D_zfyp9k.cjs → ArrayWidget-sQ40q9fv.cjs} +2 -2
  4. package/dist/{ArrayWidget-D_zfyp9k.cjs.map → ArrayWidget-sQ40q9fv.cjs.map} +1 -1
  5. package/dist/{ArrayplotWidget-CK5o4lO8.cjs → ArrayplotWidget-CEBmTpZH.cjs} +2 -2
  6. package/dist/{ArrayplotWidget-CK5o4lO8.cjs.map → ArrayplotWidget-CEBmTpZH.cjs.map} +1 -1
  7. package/dist/{ArrayplotWidget-D5McM1rY.js → ArrayplotWidget-DPUPy0qM.js} +5 -5
  8. package/dist/{ArrayplotWidget-D5McM1rY.js.map → ArrayplotWidget-DPUPy0qM.js.map} +1 -1
  9. package/dist/{BarColumn-BsS8Fdyl.cjs → BarColumn-BHCgIHhm.cjs} +2 -2
  10. package/dist/{BarColumn-BsS8Fdyl.cjs.map → BarColumn-BHCgIHhm.cjs.map} +1 -1
  11. package/dist/{BarColumn-BtP1cQcf.js → BarColumn-BpdscDQf.js} +3 -3
  12. package/dist/{BarColumn-BtP1cQcf.js.map → BarColumn-BpdscDQf.js.map} +1 -1
  13. package/dist/{BlockWidget-CtBgkMYu.cjs → BlockWidget-BzUgw2-i.cjs} +2 -2
  14. package/dist/{BlockWidget-CtBgkMYu.cjs.map → BlockWidget-BzUgw2-i.cjs.map} +1 -1
  15. package/dist/{BlockWidget-BKMse4hP.js → BlockWidget-_VUsK5T9.js} +5 -5
  16. package/dist/{BlockWidget-BKMse4hP.js.map → BlockWidget-_VUsK5T9.js.map} +1 -1
  17. package/dist/{ButtonWidget-hNa6zzSd.cjs → ButtonWidget-D8BhMKz_.cjs} +3 -3
  18. package/dist/{ButtonWidget-hNa6zzSd.cjs.map → ButtonWidget-D8BhMKz_.cjs.map} +1 -1
  19. package/dist/{ButtonWidget-BLNVL46w.js → ButtonWidget-DE41o-cg.js} +7 -7
  20. package/dist/{ButtonWidget-BLNVL46w.js.map → ButtonWidget-DE41o-cg.js.map} +1 -1
  21. package/dist/{CanvasWidget-1jy1JskS.js → CanvasWidget-BEi8h3Mq.js} +2 -2
  22. package/dist/{CanvasWidget-1jy1JskS.js.map → CanvasWidget-BEi8h3Mq.js.map} +1 -1
  23. package/dist/{CanvasWidget-BldZDkOl.cjs → CanvasWidget-DplsGt-k.cjs} +2 -2
  24. package/dist/{CanvasWidget-BldZDkOl.cjs.map → CanvasWidget-DplsGt-k.cjs.map} +1 -1
  25. package/dist/{CanvasdotWidget-D1yQLRDN.cjs → CanvasdotWidget-CLzrz9dr.cjs} +2 -2
  26. package/dist/{CanvasdotWidget-D1yQLRDN.cjs.map → CanvasdotWidget-CLzrz9dr.cjs.map} +1 -1
  27. package/dist/{CanvasdotWidget-DxuFGoWt.js → CanvasdotWidget-eZuMgkhL.js} +2 -2
  28. package/dist/{CanvasdotWidget-DxuFGoWt.js.map → CanvasdotWidget-eZuMgkhL.js.map} +1 -1
  29. package/dist/{CanvasimageWidget-D8DConb8.cjs → CanvasimageWidget-66HcpffG.cjs} +2 -2
  30. package/dist/{CanvasimageWidget-D8DConb8.cjs.map → CanvasimageWidget-66HcpffG.cjs.map} +1 -1
  31. package/dist/{CanvasimageWidget-B_JxCI_f.js → CanvasimageWidget-COv_Qnc8.js} +3 -3
  32. package/dist/{CanvasimageWidget-B_JxCI_f.js.map → CanvasimageWidget-COv_Qnc8.js.map} +1 -1
  33. package/dist/{CanvasimagevalueWidget-DwHIZzWo.js → CanvasimagevalueWidget-BhuUqLOo.js} +3 -3
  34. package/dist/{CanvasimagevalueWidget-DwHIZzWo.js.map → CanvasimagevalueWidget-BhuUqLOo.js.map} +1 -1
  35. package/dist/{CanvasimagevalueWidget-BL08pdLh.cjs → CanvasimagevalueWidget-DcoH1Rzz.cjs} +2 -2
  36. package/dist/{CanvasimagevalueWidget-BL08pdLh.cjs.map → CanvasimagevalueWidget-DcoH1Rzz.cjs.map} +1 -1
  37. package/dist/CanvaslabelWidget-DtvbgeYH.js +27 -0
  38. package/dist/CanvaslabelWidget-DtvbgeYH.js.map +1 -0
  39. package/dist/CanvaslabelWidget-wcraOzwr.cjs +2 -0
  40. package/dist/CanvaslabelWidget-wcraOzwr.cjs.map +1 -0
  41. package/dist/{CanvaslabelvalueWidget-D1-kZsi-.js → CanvaslabelvalueWidget-C_FRIeNb.js} +2 -2
  42. package/dist/{CanvaslabelvalueWidget-D1-kZsi-.js.map → CanvaslabelvalueWidget-C_FRIeNb.js.map} +1 -1
  43. package/dist/{CanvaslabelvalueWidget-BhL55tjO.cjs → CanvaslabelvalueWidget-CkkDoL8i.cjs} +2 -2
  44. package/dist/{CanvaslabelvalueWidget-BhL55tjO.cjs.map → CanvaslabelvalueWidget-CkkDoL8i.cjs.map} +1 -1
  45. package/dist/{CanvaslineWidget-Din8LMyF.js → CanvaslineWidget-D1K_6mAY.js} +2 -2
  46. package/dist/{CanvaslineWidget-Din8LMyF.js.map → CanvaslineWidget-D1K_6mAY.js.map} +1 -1
  47. package/dist/{CanvaslineWidget-DtkdP3Bb.cjs → CanvaslineWidget-Da1Bf4Df.cjs} +2 -2
  48. package/dist/{CanvaslineWidget-DtkdP3Bb.cjs.map → CanvaslineWidget-Da1Bf4Df.cjs.map} +1 -1
  49. package/dist/{CanvaslinevalueWidget-ELgzjZeY.cjs → CanvaslinevalueWidget-ChY93jQz.cjs} +2 -2
  50. package/dist/{CanvaslinevalueWidget-ELgzjZeY.cjs.map → CanvaslinevalueWidget-ChY93jQz.cjs.map} +1 -1
  51. package/dist/{CanvaslinevalueWidget-DOrasE2j.js → CanvaslinevalueWidget-D4eaxWhR.js} +2 -2
  52. package/dist/{CanvaslinevalueWidget-DOrasE2j.js.map → CanvaslinevalueWidget-D4eaxWhR.js.map} +1 -1
  53. package/dist/{CheckbuttonWidget-A07FryqU.js → CheckbuttonWidget-ByxMDkiS.js} +2 -2
  54. package/dist/{CheckbuttonWidget-A07FryqU.js.map → CheckbuttonWidget-ByxMDkiS.js.map} +1 -1
  55. package/dist/{CheckbuttonWidget-BFjaAmt-.cjs → CheckbuttonWidget-C1iDNOXO.cjs} +2 -2
  56. package/dist/{CheckbuttonWidget-BFjaAmt-.cjs.map → CheckbuttonWidget-C1iDNOXO.cjs.map} +1 -1
  57. package/dist/{ClassificationBanners-ClraI2Ns.js → ClassificationBanners-By6aaadq.js} +2 -2
  58. package/dist/{ClassificationBanners-ClraI2Ns.js.map → ClassificationBanners-By6aaadq.js.map} +1 -1
  59. package/dist/{ClassificationBanners-DCL0KBCW.cjs → ClassificationBanners-D0wqqFTp.cjs} +2 -2
  60. package/dist/{ClassificationBanners-DCL0KBCW.cjs.map → ClassificationBanners-D0wqqFTp.cjs.map} +1 -1
  61. package/dist/{ComboboxWidget-CqZ79bCh.cjs → ComboboxWidget-B6kRwkHm.cjs} +2 -2
  62. package/dist/{ComboboxWidget-CqZ79bCh.cjs.map → ComboboxWidget-B6kRwkHm.cjs.map} +1 -1
  63. package/dist/{ComboboxWidget-xayce-aY.js → ComboboxWidget-CAGxGv2r.js} +2 -2
  64. package/dist/{ComboboxWidget-xayce-aY.js.map → ComboboxWidget-CAGxGv2r.js.map} +1 -1
  65. package/dist/{CriticalCmdDialog-ne9rOh2L.js → CriticalCmdDialog-BOA6-qrE.js} +4 -4
  66. package/dist/{CriticalCmdDialog-ne9rOh2L.js.map → CriticalCmdDialog-BOA6-qrE.js.map} +1 -1
  67. package/dist/{CriticalCmdDialog-DmhxVXdn.cjs → CriticalCmdDialog-DB9iMK3r.cjs} +2 -2
  68. package/dist/{CriticalCmdDialog-DmhxVXdn.cjs.map → CriticalCmdDialog-DB9iMK3r.cjs.map} +1 -1
  69. package/dist/{DateWidget-xU2zuIE3.cjs → DateWidget-C3iCuWog.cjs} +2 -2
  70. package/dist/{DateWidget-xU2zuIE3.cjs.map → DateWidget-C3iCuWog.cjs.map} +1 -1
  71. package/dist/{DateWidget-DrYZJta_.js → DateWidget-DkNWx28s.js} +4 -4
  72. package/dist/{DateWidget-DrYZJta_.js.map → DateWidget-DkNWx28s.js.map} +1 -1
  73. package/dist/{DetailsDialog-V6X078bY.cjs → DetailsDialog-C0q3d_JF.cjs} +2 -2
  74. package/dist/{DetailsDialog-V6X078bY.cjs.map → DetailsDialog-C0q3d_JF.cjs.map} +1 -1
  75. package/dist/{DetailsDialog-CFCaJZWz.js → DetailsDialog-F4KgYM6m.js} +10 -10
  76. package/dist/{DetailsDialog-CFCaJZWz.js.map → DetailsDialog-F4KgYM6m.js.map} +1 -1
  77. package/dist/EventListDialog-CDZFdKNU.cjs +2 -0
  78. package/dist/EventListDialog-CDZFdKNU.cjs.map +1 -0
  79. package/dist/{EventListDialog-CIc8RCyY.js → EventListDialog-g0Y3PS7i.js} +26 -23
  80. package/dist/EventListDialog-g0Y3PS7i.js.map +1 -0
  81. package/dist/{FilechecksumWidget-CTf0XGST.js → FilechecksumWidget-DSfNEnDJ.js} +6 -6
  82. package/dist/{FilechecksumWidget-CTf0XGST.js.map → FilechecksumWidget-DSfNEnDJ.js.map} +1 -1
  83. package/dist/{FilechecksumWidget-JeWqA6dh.cjs → FilechecksumWidget-DxpkQwol.cjs} +2 -2
  84. package/dist/{FilechecksumWidget-JeWqA6dh.cjs.map → FilechecksumWidget-DxpkQwol.cjs.map} +1 -1
  85. package/dist/{FiledisplayWidget-DLJuesmU.js → FiledisplayWidget-D2cxMmrP.js} +5 -5
  86. package/dist/{FiledisplayWidget-DLJuesmU.js.map → FiledisplayWidget-D2cxMmrP.js.map} +1 -1
  87. package/dist/{FiledisplayWidget-B6XFz4P6.cjs → FiledisplayWidget-DZ186686.cjs} +2 -2
  88. package/dist/{FiledisplayWidget-B6XFz4P6.cjs.map → FiledisplayWidget-DZ186686.cjs.map} +1 -1
  89. package/dist/{FormatvalueWidget-DODmUWPH.js → FormatvalueWidget-6-bj_PJO.js} +3 -3
  90. package/dist/{FormatvalueWidget-DODmUWPH.js.map → FormatvalueWidget-6-bj_PJO.js.map} +1 -1
  91. package/dist/{FormatvalueWidget-DHHKnH8A.cjs → FormatvalueWidget-DYvEvnXQ.cjs} +2 -2
  92. package/dist/{FormatvalueWidget-DHHKnH8A.cjs.map → FormatvalueWidget-DYvEvnXQ.cjs.map} +1 -1
  93. package/dist/{Graph-Cwghj5Pc.js → Graph-Cz0Ns1FD.js} +9 -9
  94. package/dist/{Graph-Cwghj5Pc.js.map → Graph-Cz0Ns1FD.js.map} +1 -1
  95. package/dist/{Graph-BtMRutcx.cjs → Graph-Dz9GecGm.cjs} +2 -2
  96. package/dist/{Graph-BtMRutcx.cjs.map → Graph-Dz9GecGm.cjs.map} +1 -1
  97. package/dist/{GraphWidget-Rc-fnHCt.js → GraphWidget-COXK3Dab.js} +5 -5
  98. package/dist/{GraphWidget-Rc-fnHCt.js.map → GraphWidget-COXK3Dab.js.map} +1 -1
  99. package/dist/{GraphWidget-CROq9BtI.cjs → GraphWidget-Duz0GLrA.cjs} +2 -2
  100. package/dist/{GraphWidget-CROq9BtI.cjs.map → GraphWidget-Duz0GLrA.cjs.map} +1 -1
  101. package/dist/{HorizontalWidget-CZqN6UYp.js → HorizontalWidget-C9UFBPsk.js} +2 -2
  102. package/dist/{HorizontalWidget-CZqN6UYp.js.map → HorizontalWidget-C9UFBPsk.js.map} +1 -1
  103. package/dist/{HorizontalWidget-TdOhYEM1.cjs → HorizontalWidget-DXqgBfii.cjs} +2 -2
  104. package/dist/{HorizontalWidget-TdOhYEM1.cjs.map → HorizontalWidget-DXqgBfii.cjs.map} +1 -1
  105. package/dist/{HorizontalboxWidget-JzKHl3o_.cjs → HorizontalboxWidget-B-7LJM-K.cjs} +2 -2
  106. package/dist/{HorizontalboxWidget-JzKHl3o_.cjs.map → HorizontalboxWidget-B-7LJM-K.cjs.map} +1 -1
  107. package/dist/{HorizontalboxWidget-BV7cyhwN.js → HorizontalboxWidget-CWLfmRtr.js} +5 -5
  108. package/dist/{HorizontalboxWidget-BV7cyhwN.js.map → HorizontalboxWidget-CWLfmRtr.js.map} +1 -1
  109. package/dist/{HorizontallineWidget-Bln3Q-pv.cjs → HorizontallineWidget-CQ_PbiXH.cjs} +2 -2
  110. package/dist/{HorizontallineWidget-Bln3Q-pv.cjs.map → HorizontallineWidget-CQ_PbiXH.cjs.map} +1 -1
  111. package/dist/{HorizontallineWidget-ChDLR_8D.js → HorizontallineWidget-DeFkOaYO.js} +2 -2
  112. package/dist/{HorizontallineWidget-ChDLR_8D.js.map → HorizontallineWidget-DeFkOaYO.js.map} +1 -1
  113. package/dist/{IframeWidget-DmCr3YW6.cjs → IframeWidget-BAIs-bzc.cjs} +2 -2
  114. package/dist/{IframeWidget-DmCr3YW6.cjs.map → IframeWidget-BAIs-bzc.cjs.map} +1 -1
  115. package/dist/{IframeWidget-BdOS5sm_.js → IframeWidget-Bn9eGzrq.js} +2 -2
  116. package/dist/{IframeWidget-BdOS5sm_.js.map → IframeWidget-Bn9eGzrq.js.map} +1 -1
  117. package/dist/{ImageLoader-D0-l7mY3.cjs → ImageLoader-C8ZJSOzF.cjs} +2 -2
  118. package/dist/{ImageLoader-D0-l7mY3.cjs.map → ImageLoader-C8ZJSOzF.cjs.map} +1 -1
  119. package/dist/{ImageLoader-CnlQ4xLd.js → ImageLoader-_gAudhVo.js} +2 -2
  120. package/dist/{ImageLoader-CnlQ4xLd.js.map → ImageLoader-_gAudhVo.js.map} +1 -1
  121. package/dist/{ImageviewerWidget-B-TRYlMs.cjs → ImageviewerWidget-BDxMpWzy.cjs} +2 -2
  122. package/dist/{ImageviewerWidget-B-TRYlMs.cjs.map → ImageviewerWidget-BDxMpWzy.cjs.map} +1 -1
  123. package/dist/{ImageviewerWidget-DoJBe5eZ.js → ImageviewerWidget-BUWhF32Z.js} +2 -2
  124. package/dist/{ImageviewerWidget-DoJBe5eZ.js.map → ImageviewerWidget-BUWhF32Z.js.map} +1 -1
  125. package/dist/{InterfacesTab-CITUnMac.js → InterfacesTab-CZsnR6xB.js} +4 -4
  126. package/dist/{InterfacesTab-CITUnMac.js.map → InterfacesTab-CZsnR6xB.js.map} +1 -1
  127. package/dist/{InterfacesTab-CIg-DS_I.cjs → InterfacesTab-oFTUZfti.cjs} +2 -2
  128. package/dist/{InterfacesTab-CIg-DS_I.cjs.map → InterfacesTab-oFTUZfti.cjs.map} +1 -1
  129. package/dist/{LabelWidget-DYwcB_S4.js → LabelWidget-BhzkN06D.js} +2 -2
  130. package/dist/{LabelWidget-DYwcB_S4.js.map → LabelWidget-BhzkN06D.js.map} +1 -1
  131. package/dist/{LabelWidget-B695rUxB.cjs → LabelWidget-agzCO9Rx.cjs} +2 -2
  132. package/dist/{LabelWidget-B695rUxB.cjs.map → LabelWidget-agzCO9Rx.cjs.map} +1 -1
  133. package/dist/{LabelledWidget-ubrlqe_n.cjs → LabelledWidget-CmlB3Yd-.cjs} +2 -2
  134. package/dist/{LabelledWidget-ubrlqe_n.cjs.map → LabelledWidget-CmlB3Yd-.cjs.map} +1 -1
  135. package/dist/{LabelledWidget-D4N2gPxJ.js → LabelledWidget-vx8NvW1b.js} +4 -4
  136. package/dist/{LabelledWidget-D4N2gPxJ.js.map → LabelledWidget-vx8NvW1b.js.map} +1 -1
  137. package/dist/{LabelprogressbarWidget-y__BgVQk.cjs → LabelprogressbarWidget-BB-420i0.cjs} +2 -2
  138. package/dist/{LabelprogressbarWidget-y__BgVQk.cjs.map → LabelprogressbarWidget-BB-420i0.cjs.map} +1 -1
  139. package/dist/{LabelprogressbarWidget-CRnteLAo.js → LabelprogressbarWidget-t5PvKuS4.js} +4 -4
  140. package/dist/{LabelprogressbarWidget-CRnteLAo.js.map → LabelprogressbarWidget-t5PvKuS4.js.map} +1 -1
  141. package/dist/{LabelsparklineWidget-B7h0ndrm.cjs → LabelsparklineWidget-CGg51THo.cjs} +2 -2
  142. package/dist/{LabelsparklineWidget-B7h0ndrm.cjs.map → LabelsparklineWidget-CGg51THo.cjs.map} +1 -1
  143. package/dist/{LabelsparklineWidget-Bbjjio1S.js → LabelsparklineWidget-CebbEH-j.js} +4 -4
  144. package/dist/{LabelsparklineWidget-Bbjjio1S.js.map → LabelsparklineWidget-CebbEH-j.js.map} +1 -1
  145. package/dist/{LabelvalueWidget-Bc6HtTMO.js → LabelvalueWidget-Cbs1DBK2.js} +4 -4
  146. package/dist/{LabelvalueWidget-Bc6HtTMO.js.map → LabelvalueWidget-Cbs1DBK2.js.map} +1 -1
  147. package/dist/{LabelvalueWidget-BE8r18n2.cjs → LabelvalueWidget-xIp1W4ZB.cjs} +2 -2
  148. package/dist/{LabelvalueWidget-BE8r18n2.cjs.map → LabelvalueWidget-xIp1W4ZB.cjs.map} +1 -1
  149. package/dist/{LabelvaluedescWidget-D5aDNr1o.js → LabelvaluedescWidget-B7OIOGc0.js} +5 -5
  150. package/dist/{LabelvaluedescWidget-D5aDNr1o.js.map → LabelvaluedescWidget-B7OIOGc0.js.map} +1 -1
  151. package/dist/{LabelvaluedescWidget-CEZeqLAB.cjs → LabelvaluedescWidget-DE5cZcfN.cjs} +2 -2
  152. package/dist/{LabelvaluedescWidget-CEZeqLAB.cjs.map → LabelvaluedescWidget-DE5cZcfN.cjs.map} +1 -1
  153. package/dist/{LabelvaluelimitsbarWidget-CMnJoNKz.js → LabelvaluelimitsbarWidget-C57kf-oQ.js} +4 -4
  154. package/dist/{LabelvaluelimitsbarWidget-CMnJoNKz.js.map → LabelvaluelimitsbarWidget-C57kf-oQ.js.map} +1 -1
  155. package/dist/{LabelvaluelimitsbarWidget-BhLZsBy5.cjs → LabelvaluelimitsbarWidget-RlJt1ReS.cjs} +2 -2
  156. package/dist/{LabelvaluelimitsbarWidget-BhLZsBy5.cjs.map → LabelvaluelimitsbarWidget-RlJt1ReS.cjs.map} +1 -1
  157. package/dist/{LabelvaluelimitscolumnWidget-7MEUPhe4.cjs → LabelvaluelimitscolumnWidget-B-TbUVpY.cjs} +2 -2
  158. package/dist/{LabelvaluelimitscolumnWidget-7MEUPhe4.cjs.map → LabelvaluelimitscolumnWidget-B-TbUVpY.cjs.map} +1 -1
  159. package/dist/{LabelvaluelimitscolumnWidget-R5ofG4q1.js → LabelvaluelimitscolumnWidget-BRlNDEqp.js} +5 -5
  160. package/dist/{LabelvaluelimitscolumnWidget-R5ofG4q1.js.map → LabelvaluelimitscolumnWidget-BRlNDEqp.js.map} +1 -1
  161. package/dist/{LabelvaluerangebarWidget-49fO9s25.cjs → LabelvaluerangebarWidget-BK08A6_N.cjs} +2 -2
  162. package/dist/{LabelvaluerangebarWidget-49fO9s25.cjs.map → LabelvaluerangebarWidget-BK08A6_N.cjs.map} +1 -1
  163. package/dist/{LabelvaluerangebarWidget-Qa3R2_4p.js → LabelvaluerangebarWidget-Pt_evm3v.js} +4 -4
  164. package/dist/{LabelvaluerangebarWidget-Qa3R2_4p.js.map → LabelvaluerangebarWidget-Pt_evm3v.js.map} +1 -1
  165. package/dist/{Layout-BBLYT0gE.js → Layout-CKmC50QZ.js} +2 -2
  166. package/dist/{Layout-BBLYT0gE.js.map → Layout-CKmC50QZ.js.map} +1 -1
  167. package/dist/{Layout-CilReWuB.cjs → Layout-CkSElGRo.cjs} +2 -2
  168. package/dist/{Layout-CilReWuB.cjs.map → Layout-CkSElGRo.cjs.map} +1 -1
  169. package/dist/{LedWidget-CL2dOxb7.js → LedWidget-D1lmNXpi.js} +5 -5
  170. package/dist/{LedWidget-CL2dOxb7.js.map → LedWidget-D1lmNXpi.js.map} +1 -1
  171. package/dist/{LedWidget-CioTReXJ.cjs → LedWidget-DaFZrKbt.cjs} +2 -2
  172. package/dist/{LedWidget-CioTReXJ.cjs.map → LedWidget-DaFZrKbt.cjs.map} +1 -1
  173. package/dist/{LimitsBar-Akh9OBX8.cjs → LimitsBar-Bkv0A0XE.cjs} +2 -2
  174. package/dist/{LimitsBar-Akh9OBX8.cjs.map → LimitsBar-Bkv0A0XE.cjs.map} +1 -1
  175. package/dist/{LimitsBar-59_qNqi8.js → LimitsBar-D5IZu7eX.js} +2 -2
  176. package/dist/{LimitsBar-59_qNqi8.js.map → LimitsBar-D5IZu7eX.js.map} +1 -1
  177. package/dist/{LimitsbarWidget-Bs2svA1K.cjs → LimitsbarWidget-B_cIeVXW.cjs} +2 -2
  178. package/dist/{LimitsbarWidget-Bs2svA1K.cjs.map → LimitsbarWidget-B_cIeVXW.cjs.map} +1 -1
  179. package/dist/{LimitsbarWidget-C0N2611W.js → LimitsbarWidget-VpxQXE-e.js} +3 -3
  180. package/dist/{LimitsbarWidget-C0N2611W.js.map → LimitsbarWidget-VpxQXE-e.js.map} +1 -1
  181. package/dist/{LimitscolorWidget-GfNCPo3i.js → LimitscolorWidget-79P41CX7.js} +5 -5
  182. package/dist/{LimitscolorWidget-GfNCPo3i.js.map → LimitscolorWidget-79P41CX7.js.map} +1 -1
  183. package/dist/{LimitscolorWidget-G_3Sc7Y3.cjs → LimitscolorWidget-z2tnAyFH.cjs} +2 -2
  184. package/dist/{LimitscolorWidget-G_3Sc7Y3.cjs.map → LimitscolorWidget-z2tnAyFH.cjs.map} +1 -1
  185. package/dist/{LimitscolumnWidget-ut6NX68S.js → LimitscolumnWidget-BFDXhJeZ.js} +2 -2
  186. package/dist/{LimitscolumnWidget-ut6NX68S.js.map → LimitscolumnWidget-BFDXhJeZ.js.map} +1 -1
  187. package/dist/{LimitscolumnWidget-B3OcZYau.cjs → LimitscolumnWidget-ClnN8sMJ.cjs} +2 -2
  188. package/dist/{LimitscolumnWidget-B3OcZYau.cjs.map → LimitscolumnWidget-ClnN8sMJ.cjs.map} +1 -1
  189. package/dist/{LinegraphWidget-BDda9hjY.cjs → LinegraphWidget-C-yffvsK.cjs} +2 -2
  190. package/dist/{LinegraphWidget-BDda9hjY.cjs.map → LinegraphWidget-C-yffvsK.cjs.map} +1 -1
  191. package/dist/{LinegraphWidget-DaCyvdnI.js → LinegraphWidget-VqkpOlws.js} +5 -5
  192. package/dist/{LinegraphWidget-DaCyvdnI.js.map → LinegraphWidget-VqkpOlws.js.map} +1 -1
  193. package/dist/{MatrixbycolumnsWidget-Cni63alW.js → MatrixbycolumnsWidget--ihvirDP.js} +3 -3
  194. package/dist/{MatrixbycolumnsWidget-Cni63alW.js.map → MatrixbycolumnsWidget--ihvirDP.js.map} +1 -1
  195. package/dist/{MatrixbycolumnsWidget-DibzZkF7.cjs → MatrixbycolumnsWidget-DGqVDsdg.cjs} +2 -2
  196. package/dist/{MatrixbycolumnsWidget-DibzZkF7.cjs.map → MatrixbycolumnsWidget-DGqVDsdg.cjs.map} +1 -1
  197. package/dist/{MicroservicesTab-CV_35ag8.cjs → MicroservicesTab-BEGNdUG3.cjs} +3 -3
  198. package/dist/{MicroservicesTab-CV_35ag8.cjs.map → MicroservicesTab-BEGNdUG3.cjs.map} +1 -1
  199. package/dist/{MicroservicesTab-gCXt9Jlh.js → MicroservicesTab-CQPpb7j1.js} +15 -15
  200. package/dist/{MicroservicesTab-gCXt9Jlh.js.map → MicroservicesTab-CQPpb7j1.js.map} +1 -1
  201. package/dist/{OpenC3TimePicker-WVlNQdKk.js → OpenC3TimePicker-B0lAIU91.js} +3 -3
  202. package/dist/{OpenC3TimePicker-WVlNQdKk.js.map → OpenC3TimePicker-B0lAIU91.js.map} +1 -1
  203. package/dist/{OpenC3TimePicker-BAzvaP-g.cjs → OpenC3TimePicker-DXhyDkOv.cjs} +2 -2
  204. package/dist/{OpenC3TimePicker-BAzvaP-g.cjs.map → OpenC3TimePicker-DXhyDkOv.cjs.map} +1 -1
  205. package/dist/{Openc3Screen-GLWnn7RG.cjs → Openc3Screen-051vwmN8.cjs} +5 -5
  206. package/dist/{Openc3Screen-GLWnn7RG.cjs.map → Openc3Screen-051vwmN8.cjs.map} +1 -1
  207. package/dist/{Openc3Screen-C4DL3LBY.js → Openc3Screen-Bew5BPgc.js} +8 -8
  208. package/dist/{Openc3Screen-C4DL3LBY.js.map → Openc3Screen-Bew5BPgc.js.map} +1 -1
  209. package/dist/{OutputDialog-DN4Qy6LH.cjs → OutputDialog-CgnRA-f-.cjs} +2 -2
  210. package/dist/{OutputDialog-DN4Qy6LH.cjs.map → OutputDialog-CgnRA-f-.cjs.map} +1 -1
  211. package/dist/{OutputDialog-wOewjnk2.js → OutputDialog-DtrpwjGL.js} +3 -3
  212. package/dist/{OutputDialog-wOewjnk2.js.map → OutputDialog-DtrpwjGL.js.map} +1 -1
  213. package/dist/{PackagesTab-D6UNkpw9.cjs → PackagesTab-BBFiRQN-.cjs} +2 -2
  214. package/dist/{PackagesTab-D6UNkpw9.cjs.map → PackagesTab-BBFiRQN-.cjs.map} +1 -1
  215. package/dist/{PackagesTab-DmsuQSmU.js → PackagesTab-DQ5s3nfh.js} +21 -21
  216. package/dist/{PackagesTab-DmsuQSmU.js.map → PackagesTab-DQ5s3nfh.js.map} +1 -1
  217. package/dist/{PluginsTab-CLQ0EbDl.js → PluginsTab-1tlTx4k1.js} +7 -7
  218. package/dist/{PluginsTab-CLQ0EbDl.js.map → PluginsTab-1tlTx4k1.js.map} +1 -1
  219. package/dist/{PluginsTab-D_cFEd7L.cjs → PluginsTab-DN_iK1D9.cjs} +4 -4
  220. package/dist/{PluginsTab-D_cFEd7L.cjs.map → PluginsTab-DN_iK1D9.cjs.map} +1 -1
  221. package/dist/{ProgressbarWidget-CYyOjBLI.cjs → ProgressbarWidget-B-ScYWwv.cjs} +2 -2
  222. package/dist/{ProgressbarWidget-CYyOjBLI.cjs.map → ProgressbarWidget-B-ScYWwv.cjs.map} +1 -1
  223. package/dist/{ProgressbarWidget-BWqCsk87.js → ProgressbarWidget-BIB3r9SL.js} +2 -2
  224. package/dist/{ProgressbarWidget-BWqCsk87.js.map → ProgressbarWidget-BIB3r9SL.js.map} +1 -1
  225. package/dist/{RadiobuttonWidget-Dza2r34f.js → RadiobuttonWidget-C5rxLM7K.js} +2 -2
  226. package/dist/{RadiobuttonWidget-Dza2r34f.js.map → RadiobuttonWidget-C5rxLM7K.js.map} +1 -1
  227. package/dist/{RadiobuttonWidget-zyCcviRt.cjs → RadiobuttonWidget-EBzI13by.cjs} +2 -2
  228. package/dist/{RadiobuttonWidget-zyCcviRt.cjs.map → RadiobuttonWidget-EBzI13by.cjs.map} +1 -1
  229. package/dist/{RadiogroupWidget-BK-b4dDV.cjs → RadiogroupWidget-BnT62bxt.cjs} +2 -2
  230. package/dist/{RadiogroupWidget-BK-b4dDV.cjs.map → RadiogroupWidget-BnT62bxt.cjs.map} +1 -1
  231. package/dist/{RadiogroupWidget-DWmZMNmr.js → RadiogroupWidget-CciTCv1U.js} +2 -2
  232. package/dist/{RadiogroupWidget-DWmZMNmr.js.map → RadiogroupWidget-CciTCv1U.js.map} +1 -1
  233. package/dist/{RangebarWidget-BKTLrzKd.cjs → RangebarWidget-Can_BQBL.cjs} +2 -2
  234. package/dist/{RangebarWidget-BKTLrzKd.cjs.map → RangebarWidget-Can_BQBL.cjs.map} +1 -1
  235. package/dist/{RangebarWidget-DsGCC1x7.js → RangebarWidget-MPQYi2Km.js} +2 -2
  236. package/dist/{RangebarWidget-DsGCC1x7.js.map → RangebarWidget-MPQYi2Km.js.map} +1 -1
  237. package/dist/{RedisTab-2wFbDYIY.cjs → RedisTab-Bkj57lOf.cjs} +2 -2
  238. package/dist/{RedisTab-2wFbDYIY.cjs.map → RedisTab-Bkj57lOf.cjs.map} +1 -1
  239. package/dist/{RedisTab-9hUKvLT7.js → RedisTab-DAeGow_e.js} +2 -2
  240. package/dist/{RedisTab-9hUKvLT7.js.map → RedisTab-DAeGow_e.js.map} +1 -1
  241. package/dist/{RollupWidget-DGElKXm3.js → RollupWidget-CfjGAhzg.js} +2 -2
  242. package/dist/{RollupWidget-DGElKXm3.js.map → RollupWidget-CfjGAhzg.js.map} +1 -1
  243. package/dist/{RollupWidget-B7x7pcGm.cjs → RollupWidget-IDDWGLom.cjs} +2 -2
  244. package/dist/{RollupWidget-B7x7pcGm.cjs.map → RollupWidget-IDDWGLom.cjs.map} +1 -1
  245. package/dist/{RoutersTab-PRDpocd3.cjs → RoutersTab-BtfVCL1C.cjs} +2 -2
  246. package/dist/{RoutersTab-PRDpocd3.cjs.map → RoutersTab-BtfVCL1C.cjs.map} +1 -1
  247. package/dist/{RoutersTab-Dpq_F5it.js → RoutersTab-G4WKtUOo.js} +4 -4
  248. package/dist/{RoutersTab-Dpq_F5it.js.map → RoutersTab-G4WKtUOo.js.map} +1 -1
  249. package/dist/{ScriptChooser-BIPvMV1Z.cjs → ScriptChooser-B6qtMbkx.cjs} +2 -2
  250. package/dist/{ScriptChooser-BIPvMV1Z.cjs.map → ScriptChooser-B6qtMbkx.cjs.map} +1 -1
  251. package/dist/{ScriptChooser-DSb-nUOY.js → ScriptChooser-BwYB6FOa.js} +16 -16
  252. package/dist/{ScriptChooser-DSb-nUOY.js.map → ScriptChooser-BwYB6FOa.js.map} +1 -1
  253. package/dist/{ScrollwindowWidget-CxCp6zl7.cjs → ScrollwindowWidget-BPTaWCGg.cjs} +2 -2
  254. package/dist/{ScrollwindowWidget-CxCp6zl7.cjs.map → ScrollwindowWidget-BPTaWCGg.cjs.map} +1 -1
  255. package/dist/{ScrollwindowWidget-BvKT59rV.js → ScrollwindowWidget-CupaygNN.js} +2 -2
  256. package/dist/{ScrollwindowWidget-BvKT59rV.js.map → ScrollwindowWidget-CupaygNN.js.map} +1 -1
  257. package/dist/{SecretsTab-DAZeb63H.js → SecretsTab-C9xAxuwO.js} +4 -4
  258. package/dist/{SecretsTab-DAZeb63H.js.map → SecretsTab-C9xAxuwO.js.map} +1 -1
  259. package/dist/{SecretsTab-CY-73DBl.cjs → SecretsTab-CRC8DUz8.cjs} +2 -2
  260. package/dist/{SecretsTab-CY-73DBl.cjs.map → SecretsTab-CRC8DUz8.cjs.map} +1 -1
  261. package/dist/{SettingsTab-CHcHYnay.js → SettingsTab-BUdeAh4o.js} +5 -5
  262. package/dist/{SettingsTab-CHcHYnay.js.map → SettingsTab-BUdeAh4o.js.map} +1 -1
  263. package/dist/{SettingsTab-BBi3rofi.cjs → SettingsTab-CXoTKykc.cjs} +2 -2
  264. package/dist/{SettingsTab-BBi3rofi.cjs.map → SettingsTab-CXoTKykc.cjs.map} +1 -1
  265. package/dist/{SignalWidget-NxN9VFAv.cjs → SignalWidget-BbXnGcy9.cjs} +2 -2
  266. package/dist/{SignalWidget-NxN9VFAv.cjs.map → SignalWidget-BbXnGcy9.cjs.map} +1 -1
  267. package/dist/{SignalWidget-DRAFunW0.js → SignalWidget-C-qecoTO.js} +2 -2
  268. package/dist/{SignalWidget-DRAFunW0.js.map → SignalWidget-C-qecoTO.js.map} +1 -1
  269. package/dist/{SimpleTextDialog-B9KuFMP5.cjs → SimpleTextDialog-5wMXYOXj.cjs} +2 -2
  270. package/dist/{SimpleTextDialog-B9KuFMP5.cjs.map → SimpleTextDialog-5wMXYOXj.cjs.map} +1 -1
  271. package/dist/{SimpleTextDialog-B7XASoZh.js → SimpleTextDialog-C-0ZC2bs.js} +2 -2
  272. package/dist/{SimpleTextDialog-B7XASoZh.js.map → SimpleTextDialog-C-0ZC2bs.js.map} +1 -1
  273. package/dist/{SpacerWidget-DnRV7NSQ.cjs → SpacerWidget-BSJsjARt.cjs} +2 -2
  274. package/dist/{SpacerWidget-DnRV7NSQ.cjs.map → SpacerWidget-BSJsjARt.cjs.map} +1 -1
  275. package/dist/{SpacerWidget-CUGpXBpA.js → SpacerWidget-VVkOCb6N.js} +2 -2
  276. package/dist/{SpacerWidget-CUGpXBpA.js.map → SpacerWidget-VVkOCb6N.js.map} +1 -1
  277. package/dist/{SparklineWidget-XWxWkTZw.cjs → SparklineWidget-COGPJfbo.cjs} +2 -2
  278. package/dist/{SparklineWidget-XWxWkTZw.cjs.map → SparklineWidget-COGPJfbo.cjs.map} +1 -1
  279. package/dist/{SparklineWidget-SBWjRrqq.js → SparklineWidget-Dsmn38z_.js} +5 -5
  280. package/dist/{SparklineWidget-SBWjRrqq.js.map → SparklineWidget-Dsmn38z_.js.map} +1 -1
  281. package/dist/{TabbookWidget-yfZK_n_2.cjs → TabbookWidget-B2geV2Qi.cjs} +2 -2
  282. package/dist/{TabbookWidget-yfZK_n_2.cjs.map → TabbookWidget-B2geV2Qi.cjs.map} +1 -1
  283. package/dist/{TabbookWidget-7l6fPoRA.js → TabbookWidget-CXklff-l.js} +2 -2
  284. package/dist/{TabbookWidget-7l6fPoRA.js.map → TabbookWidget-CXklff-l.js.map} +1 -1
  285. package/dist/{TargetPacketItemChooser-QPHy-p2u.js → TargetPacketItemChooser-DDHuygCl.js} +3 -3
  286. package/dist/{TargetPacketItemChooser-QPHy-p2u.js.map → TargetPacketItemChooser-DDHuygCl.js.map} +1 -1
  287. package/dist/{TargetPacketItemChooser-CvDABqt7.cjs → TargetPacketItemChooser-DgO3VgdY.cjs} +2 -2
  288. package/dist/{TargetPacketItemChooser-CvDABqt7.cjs.map → TargetPacketItemChooser-DgO3VgdY.cjs.map} +1 -1
  289. package/dist/{TargetsTab-DcHwCcSU.js → TargetsTab-Ci4cOsIa.js} +13 -13
  290. package/dist/{TargetsTab-DcHwCcSU.js.map → TargetsTab-Ci4cOsIa.js.map} +1 -1
  291. package/dist/{TargetsTab-GpduFeiA.cjs → TargetsTab-DSSFGLD_.cjs} +2 -2
  292. package/dist/{TargetsTab-GpduFeiA.cjs.map → TargetsTab-DSSFGLD_.cjs.map} +1 -1
  293. package/dist/{TextboxWidget-CcvPtdyE.cjs → TextboxWidget-B9vBiTFU.cjs} +2 -2
  294. package/dist/{TextboxWidget-CcvPtdyE.cjs.map → TextboxWidget-B9vBiTFU.cjs.map} +1 -1
  295. package/dist/{TextboxWidget-Qb0TNt4Y.js → TextboxWidget-CHs2VYIv.js} +5 -5
  296. package/dist/{TextboxWidget-Qb0TNt4Y.js.map → TextboxWidget-CHs2VYIv.js.map} +1 -1
  297. package/dist/{TextfieldWidget-D5v1Endh.cjs → TextfieldWidget-CHf6ER_G.cjs} +2 -2
  298. package/dist/{TextfieldWidget-D5v1Endh.cjs.map → TextfieldWidget-CHf6ER_G.cjs.map} +1 -1
  299. package/dist/{TextfieldWidget-DcSGRfnF.js → TextfieldWidget-CdANAW-6.js} +2 -2
  300. package/dist/{TextfieldWidget-DcSGRfnF.js.map → TextfieldWidget-CdANAW-6.js.map} +1 -1
  301. package/dist/{TimeWidget-j18gWgF-.cjs → TimeWidget-C8Za7zUx.cjs} +2 -2
  302. package/dist/{TimeWidget-j18gWgF-.cjs.map → TimeWidget-C8Za7zUx.cjs.map} +1 -1
  303. package/dist/{TimeWidget-aoMkDgRR.js → TimeWidget-D0xT1wXR.js} +5 -5
  304. package/dist/{TimeWidget-aoMkDgRR.js.map → TimeWidget-D0xT1wXR.js.map} +1 -1
  305. package/dist/{TitleWidget-C8b9Vp5r.js → TitleWidget-68NWCcXB.js} +2 -2
  306. package/dist/{TitleWidget-C8b9Vp5r.js.map → TitleWidget-68NWCcXB.js.map} +1 -1
  307. package/dist/{TitleWidget-CNZqa48C.cjs → TitleWidget-D0PYh7V7.cjs} +2 -2
  308. package/dist/{TitleWidget-CNZqa48C.cjs.map → TitleWidget-D0PYh7V7.cjs.map} +1 -1
  309. package/dist/{ToolsTab-MCjy5Bf6.js → ToolsTab-BCvmMDIZ.js} +4 -4
  310. package/dist/{ToolsTab-MCjy5Bf6.js.map → ToolsTab-BCvmMDIZ.js.map} +1 -1
  311. package/dist/{ToolsTab-C7ldaGOD.cjs → ToolsTab-UwVIeP-J.cjs} +2 -2
  312. package/dist/{ToolsTab-C7ldaGOD.cjs.map → ToolsTab-UwVIeP-J.cjs.map} +1 -1
  313. package/dist/{TopBar-Dv9AvR6L.cjs → TopBar-BhrJBXut.cjs} +2 -2
  314. package/dist/{TopBar-Dv9AvR6L.cjs.map → TopBar-BhrJBXut.cjs.map} +1 -1
  315. package/dist/{TopBar-S3ydRxjf.js → TopBar-Cg0kJvmG.js} +2 -2
  316. package/dist/{TopBar-S3ydRxjf.js.map → TopBar-Cg0kJvmG.js.map} +1 -1
  317. package/dist/{TsdbTab-4OaejSum.js → TsdbTab-BytqwnkN.js} +2 -2
  318. package/dist/{TsdbTab-4OaejSum.js.map → TsdbTab-BytqwnkN.js.map} +1 -1
  319. package/dist/{TsdbTab-d1l9Ak2R.cjs → TsdbTab-DatsFS_R.cjs} +2 -2
  320. package/dist/{TsdbTab-d1l9Ak2R.cjs.map → TsdbTab-DatsFS_R.cjs.map} +1 -1
  321. package/dist/{UpgradeToEnterpriseDialog-CkHl-BAB.js → UpgradeToEnterpriseDialog-B0lZup6_.js} +2 -2
  322. package/dist/{UpgradeToEnterpriseDialog-CkHl-BAB.js.map → UpgradeToEnterpriseDialog-B0lZup6_.js.map} +1 -1
  323. package/dist/{UpgradeToEnterpriseDialog-Cd1ulQkq.cjs → UpgradeToEnterpriseDialog-BFhTiNXm.cjs} +2 -2
  324. package/dist/{UpgradeToEnterpriseDialog-Cd1ulQkq.cjs.map → UpgradeToEnterpriseDialog-BFhTiNXm.cjs.map} +1 -1
  325. package/dist/{UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-hv0QWZ6Z.cjs → UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-DOidODWT.cjs} +76 -76
  326. package/dist/{UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-hv0QWZ6Z.cjs.map → UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-DOidODWT.cjs.map} +1 -1
  327. package/dist/{UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-C6eLx1ow.js → UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-JHbHqvBt.js} +1862 -1862
  328. package/dist/{UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-C6eLx1ow.js.map → UpgradeToEnterpriseDialog.vue_vue_type_style_index_0_scoped_c790a82f_lang-JHbHqvBt.js.map} +1 -1
  329. package/dist/{VWidget-CMHOOByt.cjs → VWidget-BZqlpdEk.cjs} +2 -2
  330. package/dist/{VWidget-CMHOOByt.cjs.map → VWidget-BZqlpdEk.cjs.map} +1 -1
  331. package/dist/{VWidget-BgNciXK1.js → VWidget-oMbywhLA.js} +5 -5
  332. package/dist/{VWidget-BgNciXK1.js.map → VWidget-oMbywhLA.js.map} +1 -1
  333. package/dist/{ValueWidget-B1OvCmXK.js → ValueWidget-B1aGUBP7.js} +5 -5
  334. package/dist/{ValueWidget-B1OvCmXK.js.map → ValueWidget-B1aGUBP7.js.map} +1 -1
  335. package/dist/{ValueWidget-C3T9tAUT.cjs → ValueWidget-CuMPXR-z.cjs} +2 -2
  336. package/dist/{ValueWidget-C3T9tAUT.cjs.map → ValueWidget-CuMPXR-z.cjs.map} +1 -1
  337. package/dist/{ValuelimitsbarWidget-CUd9P_Xg.js → ValuelimitsbarWidget-B7KcRjLS.js} +4 -4
  338. package/dist/{ValuelimitsbarWidget-CUd9P_Xg.js.map → ValuelimitsbarWidget-B7KcRjLS.js.map} +1 -1
  339. package/dist/{ValuelimitsbarWidget-DzJYkWOa.cjs → ValuelimitsbarWidget-elJnDGWA.cjs} +2 -2
  340. package/dist/{ValuelimitsbarWidget-DzJYkWOa.cjs.map → ValuelimitsbarWidget-elJnDGWA.cjs.map} +1 -1
  341. package/dist/{ValuelimitscolumnWidget-CbThSMma.js → ValuelimitscolumnWidget-BVt6nLXq.js} +4 -4
  342. package/dist/{ValuelimitscolumnWidget-CbThSMma.js.map → ValuelimitscolumnWidget-BVt6nLXq.js.map} +1 -1
  343. package/dist/{ValuelimitscolumnWidget-Dx_im9Qk.cjs → ValuelimitscolumnWidget-DyQjC-h-.cjs} +2 -2
  344. package/dist/{ValuelimitscolumnWidget-Dx_im9Qk.cjs.map → ValuelimitscolumnWidget-DyQjC-h-.cjs.map} +1 -1
  345. package/dist/{ValuerangebarWidget-C8n2hb3N.cjs → ValuerangebarWidget-E1xvTwhi.cjs} +2 -2
  346. package/dist/{ValuerangebarWidget-C8n2hb3N.cjs.map → ValuerangebarWidget-E1xvTwhi.cjs.map} +1 -1
  347. package/dist/{ValuerangebarWidget-DjL4ze3d.js → ValuerangebarWidget-uVZEI32U.js} +4 -4
  348. package/dist/{ValuerangebarWidget-DjL4ze3d.js.map → ValuerangebarWidget-uVZEI32U.js.map} +1 -1
  349. package/dist/{VerticalWidget-C81rZFvu.cjs → VerticalWidget-BxL_5yEC.cjs} +2 -2
  350. package/dist/{VerticalWidget-C81rZFvu.cjs.map → VerticalWidget-BxL_5yEC.cjs.map} +1 -1
  351. package/dist/{VerticalWidget-V5-vGq7l.js → VerticalWidget-DlftYBjH.js} +2 -2
  352. package/dist/{VerticalWidget-V5-vGq7l.js.map → VerticalWidget-DlftYBjH.js.map} +1 -1
  353. package/dist/{VerticalboxWidget-DQerkhfd.cjs → VerticalboxWidget-BHP0SPpV.cjs} +2 -2
  354. package/dist/{VerticalboxWidget-DQerkhfd.cjs.map → VerticalboxWidget-BHP0SPpV.cjs.map} +1 -1
  355. package/dist/{VerticalboxWidget-OigMLjH8.js → VerticalboxWidget-C7RrkfY0.js} +5 -5
  356. package/dist/{VerticalboxWidget-OigMLjH8.js.map → VerticalboxWidget-C7RrkfY0.js.map} +1 -1
  357. package/dist/{Widget-BiaunQ83.js → Widget-D_HaosJK.js} +3 -3
  358. package/dist/{Widget-BiaunQ83.js.map → Widget-D_HaosJK.js.map} +1 -1
  359. package/dist/{Widget-D23R5IBP.cjs → Widget-a5Y50rAX.cjs} +2 -2
  360. package/dist/{Widget-D23R5IBP.cjs.map → Widget-a5Y50rAX.cjs.map} +1 -1
  361. package/dist/{addMonths-DI1YMeKj.js → addMonths-8x2Zqxlu.js} +2 -2
  362. package/dist/{addMonths-DI1YMeKj.js.map → addMonths-8x2Zqxlu.js.map} +1 -1
  363. package/dist/{addMonths-SOmDn5_g.cjs → addMonths-BKZ-wlfT.cjs} +2 -2
  364. package/dist/{addMonths-SOmDn5_g.cjs.map → addMonths-BKZ-wlfT.cjs.map} +1 -1
  365. package/dist/components.cjs +1 -1
  366. package/dist/components.js +71 -71
  367. package/dist/{format-DMO5vfrX.cjs → format-MMgAFAGt.cjs} +10 -10
  368. package/dist/format-MMgAFAGt.cjs.map +1 -0
  369. package/dist/{format-BJTVXrSU.js → format-mcuVCYue.js} +921 -911
  370. package/dist/format-mcuVCYue.js.map +1 -0
  371. package/dist/getDefaultOptions-DFvSlHOQ.cjs +2 -0
  372. package/dist/{getDefaultOptions-DM-1w6JL.cjs.map → getDefaultOptions-DFvSlHOQ.cjs.map} +1 -1
  373. package/dist/getDefaultOptions-iOY0zDuv.js +8 -0
  374. package/dist/{getDefaultOptions-CK1Ea9CA.js.map → getDefaultOptions-iOY0zDuv.js.map} +1 -1
  375. package/dist/{index-0c3bHqHD.js → index-AU71Em-T.js} +683 -681
  376. package/dist/index-AU71Em-T.js.map +1 -0
  377. package/dist/{index-fyIAHTXk.js → index-CbFUkAzJ.js} +482 -471
  378. package/dist/index-CbFUkAzJ.js.map +1 -0
  379. package/dist/index-DpGzPeGX.cjs +10 -0
  380. package/dist/index-DpGzPeGX.cjs.map +1 -0
  381. package/dist/index-jFVMElAV.cjs +7 -0
  382. package/dist/index-jFVMElAV.cjs.map +1 -0
  383. package/dist/{parse-DVpJm282.cjs → parse-VYeg4sm9.cjs} +2 -2
  384. package/dist/parse-VYeg4sm9.cjs.map +1 -0
  385. package/dist/{parse-BDajhNCa.js → parse-tBX2kWMh.js} +3 -3
  386. package/dist/parse-tBX2kWMh.js.map +1 -0
  387. package/dist/plugins.cjs +2 -2
  388. package/dist/plugins.cjs.map +1 -1
  389. package/dist/plugins.js +362 -376
  390. package/dist/plugins.js.map +1 -1
  391. package/dist/purify.es-BgN5W7Gm.cjs +4 -0
  392. package/dist/purify.es-BgN5W7Gm.cjs.map +1 -0
  393. package/dist/purify.es-XBlcheTS.js +663 -0
  394. package/dist/purify.es-XBlcheTS.js.map +1 -0
  395. package/dist/{settings-TnQjO9IR.cjs → settings-CekhMYoq.cjs} +2 -2
  396. package/dist/{settings-TnQjO9IR.cjs.map → settings-CekhMYoq.cjs.map} +1 -1
  397. package/dist/{settings-08OS6cx2.js → settings-DZ910lLo.js} +2 -2
  398. package/dist/{settings-08OS6cx2.js.map → settings-DZ910lLo.js.map} +1 -1
  399. package/dist/settingsCache-BTZ8CWTD.js +28 -0
  400. package/dist/{settingsCache-CriaPeNM.js.map → settingsCache-BTZ8CWTD.js.map} +1 -1
  401. package/dist/{settingsCache-Bm4JOm9j.cjs → settingsCache-DmIdInSd.cjs} +2 -2
  402. package/dist/{settingsCache-Bm4JOm9j.cjs.map → settingsCache-DmIdInSd.cjs.map} +1 -1
  403. package/dist/{timeFilters-BacGikeM.cjs → timeFilters-DdEvgzim.cjs} +2 -2
  404. package/dist/{timeFilters-BacGikeM.cjs.map → timeFilters-DdEvgzim.cjs.map} +1 -1
  405. package/dist/{timeFilters-BjNif-pu.js → timeFilters-a8Cma3bj.js} +10 -10
  406. package/dist/{timeFilters-BjNif-pu.js.map → timeFilters-a8Cma3bj.js.map} +1 -1
  407. package/dist/tools/admin.cjs +1 -1
  408. package/dist/tools/admin.js +1 -1
  409. package/dist/tools/base.cjs +1 -1
  410. package/dist/tools/base.cjs.map +1 -1
  411. package/dist/tools/base.js +18 -18
  412. package/dist/tools/base.js.map +1 -1
  413. package/dist/tools/calendar.cjs +1 -1
  414. package/dist/tools/calendar.js +1 -1
  415. package/dist/tools/scriptrunner.cjs +8 -8
  416. package/dist/tools/scriptrunner.cjs.map +1 -1
  417. package/dist/tools/scriptrunner.js +1443 -1389
  418. package/dist/tools/scriptrunner.js.map +1 -1
  419. package/dist/util.cjs +1 -1
  420. package/dist/util.js +2 -2
  421. package/dist/vue-common.css +1 -1
  422. package/dist/widgets.cjs +1 -1
  423. package/dist/widgets.js +64 -64
  424. package/package.json +11 -11
  425. package/dist/CanvaslabelWidget-SuEi9yf4.cjs +0 -2
  426. package/dist/CanvaslabelWidget-SuEi9yf4.cjs.map +0 -1
  427. package/dist/CanvaslabelWidget-Tt4dmAOI.js +0 -23
  428. package/dist/CanvaslabelWidget-Tt4dmAOI.js.map +0 -1
  429. package/dist/EventListDialog-C57w2AlC.cjs +0 -2
  430. package/dist/EventListDialog-C57w2AlC.cjs.map +0 -1
  431. package/dist/EventListDialog-CIc8RCyY.js.map +0 -1
  432. package/dist/format-BJTVXrSU.js.map +0 -1
  433. package/dist/format-DMO5vfrX.cjs.map +0 -1
  434. package/dist/getDefaultOptions-CK1Ea9CA.js +0 -8
  435. package/dist/getDefaultOptions-DM-1w6JL.cjs +0 -2
  436. package/dist/index-0c3bHqHD.js.map +0 -1
  437. package/dist/index-BwjFEWGT.cjs +0 -10
  438. package/dist/index-BwjFEWGT.cjs.map +0 -1
  439. package/dist/index-D3OfXI7H.cjs +0 -7
  440. package/dist/index-D3OfXI7H.cjs.map +0 -1
  441. package/dist/index-fyIAHTXk.js.map +0 -1
  442. package/dist/parse-BDajhNCa.js.map +0 -1
  443. package/dist/parse-DVpJm282.cjs.map +0 -1
  444. package/dist/purify.es-C8CCt8xk.cjs +0 -3
  445. package/dist/purify.es-C8CCt8xk.cjs.map +0 -1
  446. package/dist/purify.es-cZjWcAUR.js +0 -595
  447. package/dist/purify.es-cZjWcAUR.js.map +0 -1
  448. package/dist/settingsCache-CriaPeNM.js +0 -28
@@ -1 +1 @@
1
- {"version":3,"file":"TsdbTab-4OaejSum.js","sources":["../src/tools/admin/tabs/tsdb/RepairGapDialog.vue","../src/tools/admin/tabs/tsdb/tsdbApi.js","../src/tools/admin/tabs/tsdb/TsdbMetrics.vue","../src/tools/admin/tabs/tsdb/TsdbQueries.vue","../src/tools/admin/tabs/TsdbTab.vue"],"sourcesContent":["<!--\n# Copyright 2026 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-dialog :model-value=\"modelValue\" max-width=\"900\" persistent>\n <v-card>\n <v-card-title class=\"d-flex align-center\">\n Repair Gap: {{ context.target }} {{ context.packet }}\n </v-card-title>\n <v-card-subtitle v-if=\"context.gap\">\n {{ context.gap.start }} &mdash; {{ context.gap.end }} ({{\n context.gap.duration\n }})\n </v-card-subtitle>\n\n <v-card-text style=\"max-height: 75vh; overflow-y: auto\">\n <div v-if=\"errorMessage\" class=\"text-red monospace mb-4\">\n Error: {{ errorMessage }}\n </div>\n\n <!-- Candidate listing phase -->\n <template v-if=\"!jobId\">\n <div v-if=\"loadingCandidates\" class=\"d-flex align-center mb-4\">\n <v-progress-circular indeterminate size=\"24\" class=\"mr-3\" />\n Searching bucket for raw log files that cover this gap…\n </div>\n\n <template v-else>\n <div v-if=\"candidates.length === 0\" class=\"text-medium-emphasis\">\n No raw log files cover this gap window. Reingest is not available\n &mdash; the data may have been written from a source that skipped\n raw logging, or the logs have been deleted.\n </div>\n\n <template v-else>\n <div class=\"mb-2\">\n {{ candidates.length }} raw log file(s) overlap this window.\n Select which to reingest:\n </div>\n <v-data-table\n v-model=\"selectedKeys\"\n :headers=\"candidateHeaders\"\n :items=\"candidates\"\n item-value=\"key\"\n show-select\n class=\"monospace\"\n :items-per-page=\"20\"\n density=\"compact\"\n data-test=\"repair-candidates\"\n />\n\n <div class=\"mt-4\">\n <div class=\"text-subtitle-2 font-weight-bold mb-1\">\n Target Definition Version\n </div>\n <v-radio-group\n v-model=\"targetVersion\"\n hide-details\n density=\"compact\"\n data-test=\"repair-version\"\n >\n <v-radio\n value=\"as_logged\"\n data-test=\"repair-version-as-logged\"\n >\n <template #label>\n <div style=\"padding-left: 10px\">\n <div>As logged (default)</div>\n <div class=\"text-caption text-medium-emphasis\">\n Decode each file with the cmd/tlm definition that was\n in effect when the data was originally logged. Safest\n for historical fidelity — preserves packet layouts as\n they existed at that time.\n </div>\n <div class=\"text-caption text-medium-emphasis mt-1\">\n If an item's type has changed since the log was\n written (e.g. STRING &rarr; FLOAT), QuestDB column\n types are kept as-is; historical values are cast to\n fit the current column, and any values that can't cast\n are stored as NULL.\n </div>\n </div>\n </template>\n </v-radio>\n <v-radio value=\"current\" data-test=\"repair-version-current\">\n <template #label>\n <div style=\"padding-left: 10px\">\n <div>Current</div>\n <div class=\"text-caption text-medium-emphasis\">\n Decode all files with the latest cmd/tlm definition.\n Choose this when the historical definition had a bug\n that you've since fixed, and you want the reingested\n data decoded with the corrected layout.\n </div>\n </div>\n </template>\n </v-radio>\n </v-radio-group>\n </div>\n </template>\n </template>\n </template>\n\n <!-- Job polling phase -->\n <template v-else-if=\"jobStatus\">\n <v-table density=\"compact\" class=\"monospace mb-4\">\n <tbody>\n <tr>\n <td class=\"font-weight-bold\">Job</td>\n <td>{{ jobId }}</td>\n </tr>\n <tr>\n <td class=\"font-weight-bold\">State</td>\n <td>{{ jobStatus.state }}</td>\n </tr>\n <tr>\n <td class=\"font-weight-bold\">Phase</td>\n <td>{{ phaseLabel }}</td>\n </tr>\n <tr v-if=\"jobStatus.target_version\">\n <td class=\"font-weight-bold\">Target Version</td>\n <td>{{ jobStatus.target_version }}</td>\n </tr>\n <tr v-if=\"jobStatus.packets_written !== undefined\">\n <td class=\"font-weight-bold\">Packets Written</td>\n <td>{{ jobStatus.packets_written.toLocaleString() }}</td>\n </tr>\n <tr v-if=\"jobStatus.error\">\n <td class=\"font-weight-bold text-red\">Error</td>\n <td class=\"text-red\">{{ jobStatus.error }}</td>\n </tr>\n <tr v-if=\"jobStatus.warnings && jobStatus.warnings.length\">\n <td class=\"font-weight-bold text-orange\">Warnings</td>\n <td class=\"text-orange\">\n <div v-for=\"(w, idx) in jobStatus.warnings\" :key=\"idx\">\n {{ w }}\n </div>\n </td>\n </tr>\n </tbody>\n </v-table>\n <v-progress-linear\n :model-value=\"progressPercent\"\n :indeterminate=\"progressPercent === 0 && isRunning\"\n class=\"mb-2\"\n />\n </template>\n </v-card-text>\n\n <v-card-actions class=\"px-4 pb-4\">\n <v-spacer />\n <v-btn\n v-if=\"!jobId\"\n color=\"warning\"\n variant=\"elevated\"\n :disabled=\"\n loadingCandidates ||\n candidates.length === 0 ||\n selectedKeys.length === 0\n \"\n data-test=\"repair-reingest\"\n @click=\"startReingest\"\n >\n Reingest {{ selectedKeys.length }}\n </v-btn>\n <v-btn variant=\"text\" data-test=\"repair-close\" @click=\"attemptClose\">\n Close\n </v-btn>\n </v-card-actions>\n </v-card>\n\n <v-dialog v-model=\"confirmCloseOpen\" max-width=\"500\" persistent>\n <v-card>\n <v-card-title>Reingest Still Running</v-card-title>\n <v-card-text>\n The reingest job is still in progress. Closing this dialog will not\n stop the job, but you will lose visibility into its status. Are you\n sure you want to close?\n </v-card-text>\n <v-card-actions class=\"px-4 pb-4\">\n <v-spacer />\n <v-btn\n variant=\"text\"\n data-test=\"repair-close-cancel\"\n @click=\"confirmCloseOpen = false\"\n >\n Keep Watching\n </v-btn>\n <v-btn\n color=\"warning\"\n variant=\"elevated\"\n data-test=\"repair-close-confirm\"\n @click=\"confirmClose\"\n >\n Close Anyway\n </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n </v-dialog>\n</template>\n\n<script>\nimport { Api } from '@openc3/js-common/services'\n\nconst PHASE_LABELS = {\n downloading: 'Downloading files…',\n enabling_dedup: 'Enabling DEDUP…',\n ingesting: 'Ingesting packets…',\n dedup_cooldown: 'Waiting for DEDUP cooldown…',\n disabling_dedup: 'Disabling DEDUP…',\n}\n\nexport default {\n props: {\n modelValue: {\n type: Boolean,\n default: false,\n },\n context: {\n type: Object,\n required: true,\n },\n },\n emits: ['update:modelValue', 'complete'],\n data() {\n return {\n loadingCandidates: false,\n candidates: [],\n selectedKeys: [],\n targetVersion: 'as_logged',\n bucketEnv: null,\n path: null,\n candidateHeaders: [\n { title: 'File', key: 'filename' },\n { title: 'Key', key: 'key' },\n ],\n jobId: null,\n jobStatus: null,\n pollHandle: null,\n errorMessage: null,\n confirmCloseOpen: false,\n }\n },\n computed: {\n isRunning() {\n if (!this.jobStatus) return false\n return ['Queued', 'Running'].includes(this.jobStatus.state)\n },\n phaseLabel() {\n const phase = this.jobStatus?.progress_phase\n if (!phase) return this.jobStatus?.state || ''\n if (phase === 'dedup_cooldown') {\n const remaining = this.cooldownRemaining\n if (remaining != null) {\n return `Waiting for DEDUP cooldown (${remaining}s)…`\n }\n }\n return PHASE_LABELS[phase] || phase\n },\n cooldownRemaining() {\n const enabledAt = this.jobStatus?.dedup_enabled_at\n const cooldown = this.jobStatus?.dedup_cooldown_seconds\n if (!enabledAt || !cooldown) return null\n const nowSec = Date.now() / 1000\n const enabledSec = new Date(enabledAt).getTime() / 1000\n const remaining = Math.round(enabledSec + cooldown - nowSec)\n return Math.max(remaining, 0)\n },\n progressPercent() {\n const s = this.jobStatus\n if (!s) return 0\n if (s.state === 'Complete') return 100\n if (!s.progress_total || s.progress_total === 0) return 0\n return Math.round((s.progress_current / s.progress_total) * 100)\n },\n },\n watch: {\n modelValue(open) {\n if (open) this.fetchCandidates()\n },\n },\n mounted() {\n if (this.modelValue) this.fetchCandidates()\n },\n beforeUnmount() {\n this.stopPolling()\n },\n methods: {\n close() {\n this.stopPolling()\n const completed = this.jobStatus?.state === 'Complete'\n this.resetState()\n this.$emit('update:modelValue', false)\n if (completed) this.$emit('complete')\n },\n attemptClose() {\n if (this.isRunning) {\n this.confirmCloseOpen = true\n } else {\n this.close()\n }\n },\n confirmClose() {\n this.confirmCloseOpen = false\n this.close()\n },\n resetState() {\n this.candidates = []\n this.selectedKeys = []\n this.targetVersion = 'as_logged'\n this.bucketEnv = null\n this.path = null\n this.jobId = null\n this.jobStatus = null\n this.errorMessage = null\n this.loadingCandidates = false\n this.confirmCloseOpen = false\n },\n async fetchCandidates() {\n this.resetState()\n this.loadingCandidates = true\n try {\n const response = await Api.get(\n '/openc3-api/storage/repair_candidates',\n {\n params: {\n scope: this.context.scope,\n target: this.context.target,\n packet: this.context.packet,\n cmd_or_tlm: this.context.cmdOrTlm,\n start_time: this.context.gap.startIso,\n end_time: this.context.gap.endIso,\n },\n },\n )\n this.candidates = response.data.files || []\n this.bucketEnv = response.data.bucket\n this.path = response.data.path\n this.selectedKeys = this.candidates.map((c) => c.key)\n } catch (error) {\n this.errorMessage = error.response?.data?.message || error.message\n } finally {\n this.loadingCandidates = false\n }\n },\n async startReingest() {\n this.errorMessage = null\n // The controller expects filenames relative to `path`, not full keys.\n const filenames = this.selectedKeys.map((key) => {\n if (this.path && key.startsWith(this.path)) {\n return key.slice(this.path.length)\n }\n return key.split('/').pop()\n })\n try {\n const response = await Api.post('/openc3-api/storage/reingest', {\n data: {\n scope: this.context.scope,\n bucket: this.bucketEnv,\n path: this.path,\n files: filenames,\n target_version: this.targetVersion,\n },\n })\n this.jobId = response.data.job_id\n this.jobStatus = { state: response.data.state }\n this.startPolling()\n } catch (error) {\n this.errorMessage = error.response?.data?.message || error.message\n }\n },\n startPolling() {\n this.stopPolling()\n this.pollHandle = setInterval(this.pollStatus, 2000)\n this.pollStatus()\n },\n stopPolling() {\n if (this.pollHandle) {\n clearInterval(this.pollHandle)\n this.pollHandle = null\n }\n },\n async pollStatus() {\n if (!this.jobId) return\n try {\n const response = await Api.get(\n `/openc3-api/storage/reingest/${this.jobId}`,\n { params: { scope: this.context.scope } },\n )\n this.jobStatus = response.data\n if (!this.isRunning) this.stopPolling()\n } catch (error) {\n this.errorMessage = error.response?.data?.message || error.message\n this.stopPolling()\n }\n },\n },\n}\n</script>\n\n<style scoped>\n.monospace {\n font-family: monospace;\n font-size: 14px;\n}\n.text-red {\n color: rgb(var(--v-theme-error));\n}\n.text-orange {\n color: rgb(var(--v-theme-warning));\n}\n</style>\n","/*\n# Copyright 2026 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n*/\n\nimport { Api } from '@openc3/js-common/services'\n\n// QuestDB's PG wire occasionally drops idle connections; retry with backoff\n// so transient PQconsumeInput / \"server closed the connection\" errors from\n// the backend don't surface to the user.\nexport async function execSql(sql, db_shard, retries = 3) {\n for (let attempt = 1; attempt <= retries; attempt++) {\n try {\n let url = '/openc3-api/tsdb/exec'\n if (db_shard && db_shard !== '0') {\n url += `?db_shard=${db_shard}`\n }\n return await Api.post(url, {\n data: sql,\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'text/plain',\n },\n })\n } catch (error) {\n const msg = error.response?.data?.message || error.message || ''\n const isConnectionError =\n msg.includes('PQconsumeInput') ||\n msg.includes('server closed the connection')\n if (isConnectionError && attempt < retries) {\n await new Promise((r) => setTimeout(r, 1000 * attempt))\n continue\n }\n throw error\n }\n }\n}\n","<!--\n# Copyright 2026 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <div>\n <v-card>\n <v-card-title> QuestDB Table Storage Metrics </v-card-title>\n <v-card-text>\n <div v-if=\"metricsError\" class=\"mt-2 text-red monospace\">\n Error: {{ metricsError }}\n </div>\n </v-card-text>\n <v-card-actions class=\"px-2\">\n <v-btn\n :loading=\"metricsLoading\"\n color=\"success\"\n variant=\"text\"\n data-test=\"tsdb-metrics-refresh\"\n @click=\"fetchMetrics\"\n >\n Refresh\n </v-btn>\n <v-text-field\n v-model=\"db_shard\"\n type=\"number\"\n min=\"0\"\n label=\"DB Shard\"\n hint=\"DB Shard is N/A in Core\"\n hide-details\n density=\"compact\"\n style=\"max-width: 100px\"\n class=\"ml-4\"\n />\n <v-spacer />\n <v-text-field\n v-model=\"gapSampleInterval\"\n label=\"Data Gap Sample Interval\"\n hint=\"QuestDB SAMPLE BY duration (e.g. 5s, 1m, 10m, 1h)\"\n persistent-hint\n density=\"compact\"\n hide-details=\"auto\"\n style=\"max-width: 260px\"\n data-test=\"gap-sample-interval\"\n />\n </v-card-actions>\n\n <div v-if=\"metricsRows.length\">\n <template v-for=\"(section, idx) in sections\" :key=\"section.title\">\n <h3 class=\"text-h6 ml-2\" :class=\"idx === 0 ? 'mt-4' : 'mt-6'\">\n {{ section.title }}\n </h3>\n <v-data-table\n :headers=\"metricsHeaders\"\n :items=\"section.items\"\n :group-by=\"metricsGroupBy\"\n class=\"monospace\"\n :items-per-page=\"50\"\n density=\"compact\"\n >\n <template\n #group-header=\"{ item, columns, toggleGroup, isGroupOpen }\"\n >\n <tr>\n <td :colspan=\"columns.length - 1\">\n <v-btn\n :icon=\"isGroupOpen(item) ? '$expand' : '$next'\"\n size=\"small\"\n variant=\"text\"\n @click=\"toggleGroup(item)\"\n />\n <span class=\"font-weight-bold\">\n {{ item.value }}\n </span>\n <span class=\"ml-4 text-medium-emphasis\">\n Packets: {{ item.items.length }} &mdash; Rows:\n {{ groupRowCount(item.items).toLocaleString() }} &mdash;\n Disk: {{ formatBytes(groupDiskSize(item.items)) }}\n </span>\n </td>\n <td>\n <v-menu>\n <template #activator=\"{ props }\">\n <v-icon\n v-bind=\"props\"\n icon=\"mdi-dots-horizontal\"\n data-test=\"group-actions\"\n />\n </template>\n <v-list>\n <v-list-item\n title=\"Analyze Data Gaps\"\n prepend-icon=\"mdi-chart-timeline-variant-shimmer\"\n data-test=\"group-analyze-gap\"\n @click=\"analyzeGroupDataGap(item.items)\"\n />\n <v-list-item\n title=\"Delete All\"\n prepend-icon=\"mdi-delete\"\n data-test=\"group-delete\"\n @click=\"deleteGroup(item.items)\"\n />\n </v-list>\n </v-menu>\n </td>\n </tr>\n </template>\n <template #item.diskSize=\"{ item }\">\n {{ formatBytes(item.diskSize) }}\n </template>\n <template #item.rowCount=\"{ item }\">\n {{ Number(item.rowCount).toLocaleString() }}\n </template>\n <template #item.actions=\"{ item }\">\n <v-menu>\n <template #activator=\"{ props }\">\n <v-icon\n v-bind=\"props\"\n icon=\"mdi-dots-horizontal\"\n data-test=\"row-actions\"\n />\n </template>\n <v-list>\n <v-list-item\n title=\"Analyze Data Gap\"\n prepend-icon=\"mdi-chart-timeline-variant-shimmer\"\n data-test=\"row-analyze-gap\"\n @click=\"analyzeDataGap(item.tableName)\"\n />\n <v-list-item\n title=\"Delete\"\n prepend-icon=\"mdi-delete\"\n data-test=\"row-delete\"\n @click=\"deleteTable(item.tableName)\"\n />\n </v-list>\n </v-menu>\n </template>\n </v-data-table>\n </template>\n </div>\n </v-card>\n\n <!-- Data Gap Analysis Dialog -->\n <v-dialog v-model=\"gapDialog\" max-width=\"900\">\n <v-card>\n <v-card-title class=\"d-flex align-center\">\n Data Gap Analysis: {{ gapDialogTitle }}\n <v-spacer />\n <v-btn icon=\"mdi-close\" variant=\"text\" @click=\"gapDialog = false\" />\n </v-card-title>\n <v-card-text style=\"max-height: 80vh; overflow-y: auto\">\n <v-progress-linear\n v-if=\"gapLoading\"\n :model-value=\"gapProgress\"\n :indeterminate=\"gapProgress === 0\"\n class=\"mb-4\"\n />\n <div v-if=\"gapError\" class=\"text-red monospace mb-4\">\n Error: {{ gapError }}\n </div>\n\n <!-- Single table result -->\n <template v-if=\"!gapLoading && !gapError && gapSummary\">\n <v-table density=\"compact\" class=\"monospace mb-4\">\n <tbody>\n <tr>\n <td class=\"font-weight-bold\">First Record</td>\n <td>{{ gapSummary.firstTs }}</td>\n </tr>\n <tr>\n <td class=\"font-weight-bold\">Last Record</td>\n <td>{{ gapSummary.lastTs }}</td>\n </tr>\n <tr>\n <td class=\"font-weight-bold\">Total Time Span</td>\n <td>{{ gapSummary.timeSpan }}</td>\n </tr>\n <tr>\n <td class=\"font-weight-bold\">Gaps Found</td>\n <td>{{ gapSummary.gaps.length }}</td>\n </tr>\n </tbody>\n </v-table>\n <div v-if=\"gapSummary.gaps.length\">\n <h4 class=\"text-subtitle-1 font-weight-bold mb-2\">\n Data Gaps (periods with no data)\n </h4>\n <v-data-table\n :headers=\"gapHeaders\"\n :items=\"gapSummary.gaps\"\n class=\"monospace\"\n :items-per-page=\"20\"\n density=\"compact\"\n >\n <template #item.actions=\"{ item }\">\n <v-btn\n v-if=\"isTlmTable(gapDialogTitle)\"\n icon=\"mdi-wrench\"\n size=\"small\"\n variant=\"text\"\n data-test=\"gap-repair\"\n title=\"Repair (reingest raw logs)\"\n @click=\"openRepair(item, gapDialogTitle)\"\n />\n </template>\n </v-data-table>\n </div>\n <div v-else class=\"text-medium-emphasis\">\n No data gaps detected (sampled at {{ gapSampleInterval }}\n intervals).\n </div>\n </template>\n\n <!-- Group results (only tables with gaps) -->\n <template v-if=\"!gapLoading && !gapError && gapGroupResults\">\n <div\n v-if=\"gapGroupResults.withGaps.length === 0\"\n class=\"text-medium-emphasis\"\n >\n No data gaps detected across\n {{ gapGroupResults.totalTables }} tables (sampled at\n {{ gapSampleInterval }} intervals).\n </div>\n <div v-else>\n <div class=\"mb-4 text-medium-emphasis\">\n {{ gapGroupResults.withGaps.length }} of\n {{ gapGroupResults.totalTables }} tables have data gaps.\n </div>\n <div\n v-for=\"result in gapGroupResults.withGaps\"\n :key=\"result.tableName\"\n class=\"mb-6\"\n >\n <h4 class=\"text-subtitle-1 font-weight-bold mb-1\">\n {{ result.packet }}\n </h4>\n <div class=\"text-medium-emphasis monospace mb-2\">\n {{ result.firstTs }} to {{ result.lastTs }} ({{\n result.timeSpan\n }}) &mdash; {{ result.gaps.length }} gap(s)\n </div>\n <v-data-table\n :headers=\"gapHeaders\"\n :items=\"result.gaps\"\n class=\"monospace\"\n :items-per-page=\"10\"\n density=\"compact\"\n >\n <template #item.actions=\"{ item }\">\n <v-btn\n v-if=\"isTlmTable(result.tableName)\"\n icon=\"mdi-wrench\"\n size=\"small\"\n variant=\"text\"\n data-test=\"gap-repair\"\n title=\"Repair (reingest raw logs)\"\n @click=\"openRepair(item, result.tableName)\"\n />\n </template>\n </v-data-table>\n </div>\n </div>\n </template>\n </v-card-text>\n </v-card>\n </v-dialog>\n\n <repair-gap-dialog\n v-if=\"repairContext\"\n v-model=\"repairDialog\"\n :context=\"repairContext\"\n @complete=\"onRepairComplete\"\n />\n </div>\n</template>\n\n<script>\nimport RepairGapDialog from './RepairGapDialog.vue'\nimport { execSql } from './tsdbApi'\n\nexport default {\n components: {\n RepairGapDialog,\n },\n data() {\n return {\n metricsRows: [],\n metricsError: null,\n metricsLoading: false,\n metricsGroupBy: [{ key: 'target', order: 'asc' }],\n metricsHeaders: [\n { title: 'Packet', key: 'packet' },\n { title: 'Table Name', key: 'tableName' },\n { title: 'Partition Count', key: 'partitionCount' },\n { title: 'Row Count', key: 'rowCount' },\n { title: 'Disk Size', key: 'diskSize' },\n { title: 'Actions', key: 'actions', sortable: false },\n ],\n gapDialog: false,\n gapDialogTitle: '',\n gapLoading: false,\n gapProgress: 0,\n gapError: null,\n gapSummary: null,\n gapGroupResults: null,\n gapHeaders: [\n { title: 'Gap Start', key: 'start' },\n { title: 'Gap End', key: 'end' },\n { title: 'Duration', key: 'duration' },\n { title: 'Actions', key: 'actions', sortable: false, width: 80 },\n ],\n repairDialog: false,\n repairContext: null,\n gapSampleInterval: '1m',\n db_shard: '0',\n }\n },\n computed: {\n sections() {\n return [\n {\n title: 'Telemetry',\n items: this.metricsRows.filter((row) => row.type === 'TLM'),\n },\n {\n title: 'Commands',\n items: this.metricsRows.filter((row) => row.type === 'CMD'),\n },\n ]\n },\n },\n mounted() {\n this.fetchMetrics()\n },\n methods: {\n groupRowCount(items) {\n return items.reduce(\n (sum, row) => sum + Number((row.raw || row).rowCount || 0),\n 0,\n )\n },\n groupDiskSize(items) {\n return items.reduce(\n (sum, row) => sum + Number((row.raw || row).diskSize || 0),\n 0,\n )\n },\n formatBytes(bytes) {\n if (bytes === 0) return '0 B'\n const units = ['B', 'KB', 'MB', 'GB', 'TB']\n const k = 1024\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n const value = bytes / Math.pow(k, i)\n return `${value.toFixed(i === 0 ? 0 : 1)} ${units[i]}`\n },\n fetchMetrics() {\n this.metricsError = null\n this.metricsRows = []\n this.metricsLoading = true\n execSql(\n 'SELECT tableName, partitionCount, rowCount, diskSize FROM table_storage;',\n this.db_shard,\n )\n .then((response) => {\n const cols = response.data.columns\n this.metricsRows = response.data.rows.map((row) => {\n const obj = {}\n cols.forEach((col, i) => {\n obj[col] = row[i]\n })\n const parts = (obj.tableName || '').split('__')\n obj.type = parts[1] || ''\n obj.target = parts[2] || ''\n obj.packet = parts[3] || ''\n return obj\n })\n })\n .catch((error) => {\n if (error.response && error.response.data) {\n this.metricsError = error.response.data.message\n } else {\n this.metricsError = error.message\n }\n })\n .finally(() => {\n this.metricsLoading = false\n })\n },\n dropTable(tableName) {\n return execSql(`DROP TABLE '${tableName}';`, this.db_shard)\n },\n deleteTable(tableName) {\n let target = tableName.split('__')[2] || tableName\n let packet = tableName.split('__')[3] || tableName\n this.$dialog\n .confirm(\n `Are you sure you want to drop table: ${tableName}? This removes ALL decommutated data for ${target} ${packet}!`,\n {\n okText: 'Delete',\n cancelText: 'Cancel',\n },\n )\n .then(() => {\n this.dropTable(tableName)\n .then(() => {\n this.metricsRows = this.metricsRows.filter(\n (row) => row.tableName !== tableName,\n )\n })\n .catch((error) => {\n if (error.response && error.response.data) {\n this.metricsError = error.response.data.message\n } else {\n this.metricsError = error.message\n }\n })\n })\n },\n deleteGroup(items) {\n const tableNames = items.map((item) => (item.raw || item).tableName)\n let target = tableNames[0].split('__')[2]\n this.$dialog\n .confirm(\n `Are you sure you want to drop ${tableNames.length} tables? This removes ALL decommutated data for ${target}!\\n\\n${tableNames.join('\\n')}`,\n {\n okText: 'Delete',\n cancelText: 'Cancel',\n },\n )\n .then(() => {\n const nameSet = new Set(tableNames)\n Promise.all(tableNames.map((name) => this.dropTable(name)))\n .then(() => {\n this.metricsRows = this.metricsRows.filter(\n (row) => !nameSet.has(row.tableName),\n )\n })\n .catch((error) => {\n if (error.response && error.response.data) {\n this.metricsError = error.response.data.message\n } else {\n this.metricsError = error.message\n }\n })\n })\n },\n formatDuration(ms) {\n const seconds = Math.floor(ms / 1000)\n const days = Math.floor(seconds / 86400)\n const hours = Math.floor((seconds % 86400) / 3600)\n const minutes = Math.floor((seconds % 3600) / 60)\n const parts = []\n if (days) parts.push(`${days}d`)\n if (hours) parts.push(`${hours}h`)\n if (minutes) parts.push(`${minutes}m`)\n if (!parts.length) parts.push(`${seconds}s`)\n return parts.join(' ')\n },\n formatTimestamp(ts) {\n return new Date(ts).toISOString().replace('T', ' ').replace('.000Z', 'Z')\n },\n // Parse a QuestDB SAMPLE BY duration like \"1m\", \"30s\", \"2h\" into ms.\n // Returns null if malformed.\n parseSampleIntervalMs(input) {\n const match = String(input || '')\n .trim()\n .match(/^(\\d+)\\s*([smhd])$/i)\n if (!match) return null\n const value = Number.parseInt(match[1], 10)\n const multipliers = { s: 1_000, m: 60_000, h: 3_600_000, d: 86_400_000 }\n return value * multipliers[match[2].toLowerCase()]\n },\n async fetchTableGaps(tableName) {\n const interval = (this.gapSampleInterval || '1m').trim()\n const bucketMs = this.parseSampleIntervalMs(interval)\n if (!bucketMs) {\n throw new Error(\n `Invalid sample interval '${interval}'. Use a number followed by s, m, h, or d (e.g. 5s, 1m, 2h).`,\n )\n }\n\n // Get first and last timestamps\n const rangeResp = await execSql(\n `SELECT first(PACKET_TIMESECONDS) as first_ts, last(PACKET_TIMESECONDS) as last_ts FROM '${tableName}';`,\n this.db_shard,\n )\n const rangeCols = rangeResp.data.columns\n const rangeRow = rangeResp.data.rows[0]\n const rangeObj = {}\n rangeCols.forEach((col, i) => {\n rangeObj[col] = rangeRow[i]\n })\n const firstTs = rangeObj.first_ts\n const lastTs = rangeObj.last_ts\n const totalMs = new Date(lastTs) - new Date(firstTs)\n\n // Sample by the user-chosen interval with FILL(NULL) to detect gaps.\n const gapResp = await execSql(\n `(SELECT PACKET_TIMESECONDS, count() as cnt FROM '${tableName}' SAMPLE BY ${interval} FILL(NULL)) WHERE cnt IS NULL`,\n this.db_shard,\n )\n const gapCols = gapResp.data.columns\n const gapRows = gapResp.data.rows.map((row) => {\n const obj = {}\n gapCols.forEach((col, i) => {\n obj[col] = row[i]\n })\n return obj\n })\n\n // Group contiguous null-bucket timestamps into gaps. A delta > bucketMs\n // between consecutive empty buckets means a new gap has started.\n const gaps = []\n const buildGap = (startRaw, endRaw) => {\n const startMs = new Date(startRaw).getTime()\n const endMs = new Date(endRaw).getTime() + bucketMs\n return {\n start: this.formatTimestamp(startRaw),\n end: this.formatTimestamp(new Date(endMs)),\n duration: this.formatDuration(endMs - startMs),\n // ISO strings avoid the JS precision cliff on nsec integers.\n startIso: new Date(startMs).toISOString(),\n endIso: new Date(endMs).toISOString(),\n }\n }\n if (gapRows.length > 0) {\n let gapStart = gapRows[0].PACKET_TIMESECONDS\n let gapEnd = gapStart\n for (let i = 1; i < gapRows.length; i++) {\n const prev = new Date(gapEnd)\n const curr = new Date(gapRows[i].PACKET_TIMESECONDS)\n if (curr - prev > bucketMs) {\n gaps.push(buildGap(gapStart, gapEnd))\n gapStart = gapRows[i].PACKET_TIMESECONDS\n }\n gapEnd = gapRows[i].PACKET_TIMESECONDS\n }\n gaps.push(buildGap(gapStart, gapEnd))\n }\n\n return {\n firstTs: this.formatTimestamp(firstTs),\n lastTs: this.formatTimestamp(lastTs),\n timeSpan: this.formatDuration(totalMs),\n gaps,\n }\n },\n async analyzeDataGap(tableName) {\n this.gapDialogTitle = tableName\n this.gapDialog = true\n this.gapLoading = true\n this.gapProgress = 0\n this.gapError = null\n this.gapSummary = null\n this.gapGroupResults = null\n try {\n this.gapSummary = await this.fetchTableGaps(tableName)\n } catch (error) {\n this.gapError = error.response?.data?.message || error.message\n } finally {\n this.gapLoading = false\n }\n },\n async analyzeGroupDataGap(items) {\n const tableNames = items.map((item) => (item.raw || item).tableName)\n const target = (items[0].raw || items[0]).target\n this.gapDialogTitle = `${target} (${tableNames.length} tables)`\n this.gapDialog = true\n this.gapLoading = true\n this.gapProgress = 0\n this.gapError = null\n this.gapSummary = null\n this.gapGroupResults = null\n try {\n const withGaps = []\n for (let i = 0; i < tableNames.length; i++) {\n this.gapProgress = Math.round(((i + 1) / tableNames.length) * 100)\n try {\n const result = await this.fetchTableGaps(tableNames[i])\n if (result.gaps.length > 0) {\n const parts = tableNames[i].split('__')\n withGaps.push({\n tableName: tableNames[i],\n packet: parts[3] || tableNames[i],\n ...result,\n })\n }\n } catch {\n // Skip tables that error (e.g. empty tables)\n }\n }\n this.gapGroupResults = {\n totalTables: tableNames.length,\n withGaps,\n }\n } catch (error) {\n this.gapError = error.response?.data?.message || error.message\n } finally {\n this.gapLoading = false\n }\n },\n // scope__TLM|CMD__TARGET__PACKET → { scope, cmdOrTlm, target, packet }\n parseTableName(tableName) {\n const parts = tableName.split('__')\n if (parts.length < 4) return null\n return {\n scope: parts[0],\n cmdOrTlm: parts[1],\n target: parts[2],\n packet: parts[3],\n }\n },\n isTlmTable(tableName) {\n const parsed = this.parseTableName(tableName)\n return parsed?.cmdOrTlm === 'TLM'\n },\n openRepair(gap, tableName) {\n const parsed = this.parseTableName(tableName)\n if (!parsed) return\n this.repairContext = {\n tableName,\n ...parsed,\n gap,\n }\n this.repairDialog = true\n },\n onRepairComplete() {\n // Re-run gap analysis on whichever view is currently showing.\n if (this.gapGroupResults) return // group analysis is expensive; let the user re-run manually\n if (this.gapDialogTitle) this.analyzeDataGap(this.gapDialogTitle)\n },\n },\n}\n</script>\n\n<style scoped>\n.monospace {\n font-family: monospace;\n font-size: 14px;\n}\n.text-red {\n color: rgb(var(--v-theme-error));\n}\n</style>\n","<!--\n# Copyright 2026 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-card>\n <v-card-title> Send SQL Queries to QuestDB </v-card-title>\n <v-card-subtitle>\n THIS IS DANGEROUS! This allows you to interact directly with the\n underlying QuestDB time series database, making it easy to modify or\n delete data.\n <br /><br />\n Enter SQL queries like:\n <code> SELECT * FROM DEFAULT__TLM__INST__HEALTH_STATUS LIMIT 10 </code>\n or\n <code>SHOW TABLES</code>\n </v-card-subtitle>\n <v-card-text class=\"pb-0 ml-2\">\n <v-textarea\n v-model=\"sqlText\"\n hide-details\n label=\"SQL query\"\n class=\"monospace\"\n rows=\"3\"\n @keydown=\"commandKeydown\"\n />\n <div v-if=\"errorMessage\" class=\"mt-2 text-red monospace\">\n Error: {{ errorMessage }}\n </div>\n </v-card-text>\n <v-card-actions class=\"px-2\">\n <v-btn\n :disabled=\"!sqlText.length\"\n :loading=\"loading\"\n color=\"success\"\n variant=\"text\"\n data-test=\"tsdb-execute\"\n @click=\"executeQuery\"\n >\n Execute\n </v-btn>\n <v-text-field\n v-model=\"db_shard\"\n type=\"number\"\n min=\"0\"\n label=\"DB Shard\"\n hide-details\n density=\"compact\"\n style=\"max-width: 100px\"\n class=\"ml-4\"\n />\n </v-card-actions>\n\n <v-data-table\n v-if=\"columns.length\"\n :headers=\"tableHeaders\"\n :items=\"rows\"\n class=\"monospace\"\n :items-per-page=\"50\"\n density=\"compact\"\n >\n </v-data-table>\n </v-card>\n</template>\n\n<script>\nimport { execSql } from './tsdbApi'\n\nexport default {\n data() {\n return {\n sqlText: '',\n db_shard: '0',\n columns: [],\n rows: [],\n errorMessage: null,\n loading: false,\n }\n },\n computed: {\n tableHeaders() {\n return this.columns.map((col) => ({\n title: col,\n key: col,\n }))\n },\n },\n methods: {\n commandKeydown($event) {\n if (($event.metaKey || $event.ctrlKey) && $event.key === 'Enter') {\n this.executeQuery()\n }\n },\n executeQuery() {\n this.errorMessage = null\n this.columns = []\n this.rows = []\n this.loading = true\n execSql(this.sqlText, this.db_shard)\n .then((response) => {\n this.columns = response.data.columns\n this.rows = response.data.rows.map((row) => {\n const obj = {}\n this.columns.forEach((col, i) => {\n obj[col] = row[i]\n })\n return obj\n })\n })\n .catch((error) => {\n if (error.response && error.response.data) {\n this.errorMessage = error.response.data.message\n } else {\n this.errorMessage = error.message\n }\n })\n .finally(() => {\n this.loading = false\n })\n },\n },\n}\n</script>\n\n<style scoped>\n.monospace {\n font-family: monospace;\n font-size: 14px;\n}\n.text-red {\n color: rgb(var(--v-theme-error));\n}\n</style>\n","<!--\n# Copyright 2026 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <div>\n <v-tabs v-model=\"activeTab\">\n <v-tab value=\"metrics\" data-test=\"tsdb-metrics-tab\">Metrics</v-tab>\n <v-tab value=\"queries\" data-test=\"tsdb-queries-tab\">Queries</v-tab>\n </v-tabs>\n <v-window v-model=\"activeTab\">\n <v-window-item value=\"metrics\">\n <tsdb-metrics />\n </v-window-item>\n <v-window-item value=\"queries\">\n <tsdb-queries />\n </v-window-item>\n </v-window>\n </div>\n</template>\n\n<script>\nimport TsdbMetrics from './tsdb/TsdbMetrics.vue'\nimport TsdbQueries from './tsdb/TsdbQueries.vue'\n\nexport default {\n components: {\n TsdbMetrics,\n TsdbQueries,\n },\n data() {\n return {\n activeTab: 'metrics',\n }\n },\n}\n</script>\n"],"names":["PHASE_LABELS","_sfc_main","phase","remaining","enabledAt","cooldown","nowSec","enabledSec","open","completed","response","Api","c","error","filenames","key","_hoisted_4","_hoisted_5","_hoisted_9","_hoisted_11","_createBlock","_component_v_dialog","$props","_createVNode","_component_v_card","_component_v_card_title","_toDisplayString","_component_v_card_subtitle","_component_v_card_text","$data","_openBlock","_createElementBlock","_hoisted_1","_Fragment","_component_v_table","_createElementVNode","_cache","$options","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_10","w","idx","_component_v_progress_linear","_hoisted_2","_component_v_progress_circular","_hoisted_3","_component_v_data_table","$event","_component_v_radio_group","_component_v_radio","_component_v_card_actions","_component_v_spacer","_component_v_btn","execSql","sql","db_shard","retries","attempt","url","msg","r","RepairGapDialog","row","items","sum","bytes","units","k","i","cols","obj","col","parts","tableName","target","packet","tableNames","item","nameSet","name","ms","seconds","days","hours","minutes","ts","input","match","interval","bucketMs","rangeResp","rangeCols","rangeRow","rangeObj","firstTs","lastTs","totalMs","gapResp","gapCols","gapRows","gaps","buildGap","startRaw","endRaw","startMs","endMs","gapStart","gapEnd","prev","withGaps","result","gap","parsed","_hoisted_12","_hoisted_13","_component_v_text_field","_renderList","section","_normalizeClass","_withCtx","columns","toggleGroup","isGroupOpen","_component_v_menu","props","_component_v_icon","_mergeProps","_component_v_list","_component_v_list_item","_createTextVNode","_component_repair_gap_dialog","_component_v_textarea","TsdbMetrics","TsdbQueries","_component_v_tabs","_component_v_tab","_component_v_window","_component_v_window_item","_component_tsdb_metrics","_component_tsdb_queries"],"mappings":"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"}
1
+ {"version":3,"file":"TsdbTab-BytqwnkN.js","sources":["../src/tools/admin/tabs/tsdb/RepairGapDialog.vue","../src/tools/admin/tabs/tsdb/tsdbApi.js","../src/tools/admin/tabs/tsdb/TsdbMetrics.vue","../src/tools/admin/tabs/tsdb/TsdbQueries.vue","../src/tools/admin/tabs/TsdbTab.vue"],"sourcesContent":["<!--\n# Copyright 2026 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-dialog :model-value=\"modelValue\" max-width=\"900\" persistent>\n <v-card>\n <v-card-title class=\"d-flex align-center\">\n Repair Gap: {{ context.target }} {{ context.packet }}\n </v-card-title>\n <v-card-subtitle v-if=\"context.gap\">\n {{ context.gap.start }} &mdash; {{ context.gap.end }} ({{\n context.gap.duration\n }})\n </v-card-subtitle>\n\n <v-card-text style=\"max-height: 75vh; overflow-y: auto\">\n <div v-if=\"errorMessage\" class=\"text-red monospace mb-4\">\n Error: {{ errorMessage }}\n </div>\n\n <!-- Candidate listing phase -->\n <template v-if=\"!jobId\">\n <div v-if=\"loadingCandidates\" class=\"d-flex align-center mb-4\">\n <v-progress-circular indeterminate size=\"24\" class=\"mr-3\" />\n Searching bucket for raw log files that cover this gap…\n </div>\n\n <template v-else>\n <div v-if=\"candidates.length === 0\" class=\"text-medium-emphasis\">\n No raw log files cover this gap window. Reingest is not available\n &mdash; the data may have been written from a source that skipped\n raw logging, or the logs have been deleted.\n </div>\n\n <template v-else>\n <div class=\"mb-2\">\n {{ candidates.length }} raw log file(s) overlap this window.\n Select which to reingest:\n </div>\n <v-data-table\n v-model=\"selectedKeys\"\n :headers=\"candidateHeaders\"\n :items=\"candidates\"\n item-value=\"key\"\n show-select\n class=\"monospace\"\n :items-per-page=\"20\"\n density=\"compact\"\n data-test=\"repair-candidates\"\n />\n\n <div class=\"mt-4\">\n <div class=\"text-subtitle-2 font-weight-bold mb-1\">\n Target Definition Version\n </div>\n <v-radio-group\n v-model=\"targetVersion\"\n hide-details\n density=\"compact\"\n data-test=\"repair-version\"\n >\n <v-radio\n value=\"as_logged\"\n data-test=\"repair-version-as-logged\"\n >\n <template #label>\n <div style=\"padding-left: 10px\">\n <div>As logged (default)</div>\n <div class=\"text-caption text-medium-emphasis\">\n Decode each file with the cmd/tlm definition that was\n in effect when the data was originally logged. Safest\n for historical fidelity — preserves packet layouts as\n they existed at that time.\n </div>\n <div class=\"text-caption text-medium-emphasis mt-1\">\n If an item's type has changed since the log was\n written (e.g. STRING &rarr; FLOAT), QuestDB column\n types are kept as-is; historical values are cast to\n fit the current column, and any values that can't cast\n are stored as NULL.\n </div>\n </div>\n </template>\n </v-radio>\n <v-radio value=\"current\" data-test=\"repair-version-current\">\n <template #label>\n <div style=\"padding-left: 10px\">\n <div>Current</div>\n <div class=\"text-caption text-medium-emphasis\">\n Decode all files with the latest cmd/tlm definition.\n Choose this when the historical definition had a bug\n that you've since fixed, and you want the reingested\n data decoded with the corrected layout.\n </div>\n </div>\n </template>\n </v-radio>\n </v-radio-group>\n </div>\n </template>\n </template>\n </template>\n\n <!-- Job polling phase -->\n <template v-else-if=\"jobStatus\">\n <v-table density=\"compact\" class=\"monospace mb-4\">\n <tbody>\n <tr>\n <td class=\"font-weight-bold\">Job</td>\n <td>{{ jobId }}</td>\n </tr>\n <tr>\n <td class=\"font-weight-bold\">State</td>\n <td>{{ jobStatus.state }}</td>\n </tr>\n <tr>\n <td class=\"font-weight-bold\">Phase</td>\n <td>{{ phaseLabel }}</td>\n </tr>\n <tr v-if=\"jobStatus.target_version\">\n <td class=\"font-weight-bold\">Target Version</td>\n <td>{{ jobStatus.target_version }}</td>\n </tr>\n <tr v-if=\"jobStatus.packets_written !== undefined\">\n <td class=\"font-weight-bold\">Packets Written</td>\n <td>{{ jobStatus.packets_written.toLocaleString() }}</td>\n </tr>\n <tr v-if=\"jobStatus.error\">\n <td class=\"font-weight-bold text-red\">Error</td>\n <td class=\"text-red\">{{ jobStatus.error }}</td>\n </tr>\n <tr v-if=\"jobStatus.warnings && jobStatus.warnings.length\">\n <td class=\"font-weight-bold text-orange\">Warnings</td>\n <td class=\"text-orange\">\n <div v-for=\"(w, idx) in jobStatus.warnings\" :key=\"idx\">\n {{ w }}\n </div>\n </td>\n </tr>\n </tbody>\n </v-table>\n <v-progress-linear\n :model-value=\"progressPercent\"\n :indeterminate=\"progressPercent === 0 && isRunning\"\n class=\"mb-2\"\n />\n </template>\n </v-card-text>\n\n <v-card-actions class=\"px-4 pb-4\">\n <v-spacer />\n <v-btn\n v-if=\"!jobId\"\n color=\"warning\"\n variant=\"elevated\"\n :disabled=\"\n loadingCandidates ||\n candidates.length === 0 ||\n selectedKeys.length === 0\n \"\n data-test=\"repair-reingest\"\n @click=\"startReingest\"\n >\n Reingest {{ selectedKeys.length }}\n </v-btn>\n <v-btn variant=\"text\" data-test=\"repair-close\" @click=\"attemptClose\">\n Close\n </v-btn>\n </v-card-actions>\n </v-card>\n\n <v-dialog v-model=\"confirmCloseOpen\" max-width=\"500\" persistent>\n <v-card>\n <v-card-title>Reingest Still Running</v-card-title>\n <v-card-text>\n The reingest job is still in progress. Closing this dialog will not\n stop the job, but you will lose visibility into its status. Are you\n sure you want to close?\n </v-card-text>\n <v-card-actions class=\"px-4 pb-4\">\n <v-spacer />\n <v-btn\n variant=\"text\"\n data-test=\"repair-close-cancel\"\n @click=\"confirmCloseOpen = false\"\n >\n Keep Watching\n </v-btn>\n <v-btn\n color=\"warning\"\n variant=\"elevated\"\n data-test=\"repair-close-confirm\"\n @click=\"confirmClose\"\n >\n Close Anyway\n </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n </v-dialog>\n</template>\n\n<script>\nimport { Api } from '@openc3/js-common/services'\n\nconst PHASE_LABELS = {\n downloading: 'Downloading files…',\n enabling_dedup: 'Enabling DEDUP…',\n ingesting: 'Ingesting packets…',\n dedup_cooldown: 'Waiting for DEDUP cooldown…',\n disabling_dedup: 'Disabling DEDUP…',\n}\n\nexport default {\n props: {\n modelValue: {\n type: Boolean,\n default: false,\n },\n context: {\n type: Object,\n required: true,\n },\n },\n emits: ['update:modelValue', 'complete'],\n data() {\n return {\n loadingCandidates: false,\n candidates: [],\n selectedKeys: [],\n targetVersion: 'as_logged',\n bucketEnv: null,\n path: null,\n candidateHeaders: [\n { title: 'File', key: 'filename' },\n { title: 'Key', key: 'key' },\n ],\n jobId: null,\n jobStatus: null,\n pollHandle: null,\n errorMessage: null,\n confirmCloseOpen: false,\n }\n },\n computed: {\n isRunning() {\n if (!this.jobStatus) return false\n return ['Queued', 'Running'].includes(this.jobStatus.state)\n },\n phaseLabel() {\n const phase = this.jobStatus?.progress_phase\n if (!phase) return this.jobStatus?.state || ''\n if (phase === 'dedup_cooldown') {\n const remaining = this.cooldownRemaining\n if (remaining != null) {\n return `Waiting for DEDUP cooldown (${remaining}s)…`\n }\n }\n return PHASE_LABELS[phase] || phase\n },\n cooldownRemaining() {\n const enabledAt = this.jobStatus?.dedup_enabled_at\n const cooldown = this.jobStatus?.dedup_cooldown_seconds\n if (!enabledAt || !cooldown) return null\n const nowSec = Date.now() / 1000\n const enabledSec = new Date(enabledAt).getTime() / 1000\n const remaining = Math.round(enabledSec + cooldown - nowSec)\n return Math.max(remaining, 0)\n },\n progressPercent() {\n const s = this.jobStatus\n if (!s) return 0\n if (s.state === 'Complete') return 100\n if (!s.progress_total || s.progress_total === 0) return 0\n return Math.round((s.progress_current / s.progress_total) * 100)\n },\n },\n watch: {\n modelValue(open) {\n if (open) this.fetchCandidates()\n },\n },\n mounted() {\n if (this.modelValue) this.fetchCandidates()\n },\n beforeUnmount() {\n this.stopPolling()\n },\n methods: {\n close() {\n this.stopPolling()\n const completed = this.jobStatus?.state === 'Complete'\n this.resetState()\n this.$emit('update:modelValue', false)\n if (completed) this.$emit('complete')\n },\n attemptClose() {\n if (this.isRunning) {\n this.confirmCloseOpen = true\n } else {\n this.close()\n }\n },\n confirmClose() {\n this.confirmCloseOpen = false\n this.close()\n },\n resetState() {\n this.candidates = []\n this.selectedKeys = []\n this.targetVersion = 'as_logged'\n this.bucketEnv = null\n this.path = null\n this.jobId = null\n this.jobStatus = null\n this.errorMessage = null\n this.loadingCandidates = false\n this.confirmCloseOpen = false\n },\n async fetchCandidates() {\n this.resetState()\n this.loadingCandidates = true\n try {\n const response = await Api.get(\n '/openc3-api/storage/repair_candidates',\n {\n params: {\n scope: this.context.scope,\n target: this.context.target,\n packet: this.context.packet,\n cmd_or_tlm: this.context.cmdOrTlm,\n start_time: this.context.gap.startIso,\n end_time: this.context.gap.endIso,\n },\n },\n )\n this.candidates = response.data.files || []\n this.bucketEnv = response.data.bucket\n this.path = response.data.path\n this.selectedKeys = this.candidates.map((c) => c.key)\n } catch (error) {\n this.errorMessage = error.response?.data?.message || error.message\n } finally {\n this.loadingCandidates = false\n }\n },\n async startReingest() {\n this.errorMessage = null\n // The controller expects filenames relative to `path`, not full keys.\n const filenames = this.selectedKeys.map((key) => {\n if (this.path && key.startsWith(this.path)) {\n return key.slice(this.path.length)\n }\n return key.split('/').pop()\n })\n try {\n const response = await Api.post('/openc3-api/storage/reingest', {\n data: {\n scope: this.context.scope,\n bucket: this.bucketEnv,\n path: this.path,\n files: filenames,\n target_version: this.targetVersion,\n },\n })\n this.jobId = response.data.job_id\n this.jobStatus = { state: response.data.state }\n this.startPolling()\n } catch (error) {\n this.errorMessage = error.response?.data?.message || error.message\n }\n },\n startPolling() {\n this.stopPolling()\n this.pollHandle = setInterval(this.pollStatus, 2000)\n this.pollStatus()\n },\n stopPolling() {\n if (this.pollHandle) {\n clearInterval(this.pollHandle)\n this.pollHandle = null\n }\n },\n async pollStatus() {\n if (!this.jobId) return\n try {\n const response = await Api.get(\n `/openc3-api/storage/reingest/${this.jobId}`,\n { params: { scope: this.context.scope } },\n )\n this.jobStatus = response.data\n if (!this.isRunning) this.stopPolling()\n } catch (error) {\n this.errorMessage = error.response?.data?.message || error.message\n this.stopPolling()\n }\n },\n },\n}\n</script>\n\n<style scoped>\n.monospace {\n font-family: monospace;\n font-size: 14px;\n}\n.text-red {\n color: rgb(var(--v-theme-error));\n}\n.text-orange {\n color: rgb(var(--v-theme-warning));\n}\n</style>\n","/*\n# Copyright 2026 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n*/\n\nimport { Api } from '@openc3/js-common/services'\n\n// QuestDB's PG wire occasionally drops idle connections; retry with backoff\n// so transient PQconsumeInput / \"server closed the connection\" errors from\n// the backend don't surface to the user.\nexport async function execSql(sql, db_shard, retries = 3) {\n for (let attempt = 1; attempt <= retries; attempt++) {\n try {\n let url = '/openc3-api/tsdb/exec'\n if (db_shard && db_shard !== '0') {\n url += `?db_shard=${db_shard}`\n }\n return await Api.post(url, {\n data: sql,\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'text/plain',\n },\n })\n } catch (error) {\n const msg = error.response?.data?.message || error.message || ''\n const isConnectionError =\n msg.includes('PQconsumeInput') ||\n msg.includes('server closed the connection')\n if (isConnectionError && attempt < retries) {\n await new Promise((r) => setTimeout(r, 1000 * attempt))\n continue\n }\n throw error\n }\n }\n}\n","<!--\n# Copyright 2026 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <div>\n <v-card>\n <v-card-title> QuestDB Table Storage Metrics </v-card-title>\n <v-card-text>\n <div v-if=\"metricsError\" class=\"mt-2 text-red monospace\">\n Error: {{ metricsError }}\n </div>\n </v-card-text>\n <v-card-actions class=\"px-2\">\n <v-btn\n :loading=\"metricsLoading\"\n color=\"success\"\n variant=\"text\"\n data-test=\"tsdb-metrics-refresh\"\n @click=\"fetchMetrics\"\n >\n Refresh\n </v-btn>\n <v-text-field\n v-model=\"db_shard\"\n type=\"number\"\n min=\"0\"\n label=\"DB Shard\"\n hint=\"DB Shard is N/A in Core\"\n hide-details\n density=\"compact\"\n style=\"max-width: 100px\"\n class=\"ml-4\"\n />\n <v-spacer />\n <v-text-field\n v-model=\"gapSampleInterval\"\n label=\"Data Gap Sample Interval\"\n hint=\"QuestDB SAMPLE BY duration (e.g. 5s, 1m, 10m, 1h)\"\n persistent-hint\n density=\"compact\"\n hide-details=\"auto\"\n style=\"max-width: 260px\"\n data-test=\"gap-sample-interval\"\n />\n </v-card-actions>\n\n <div v-if=\"metricsRows.length\">\n <template v-for=\"(section, idx) in sections\" :key=\"section.title\">\n <h3 class=\"text-h6 ml-2\" :class=\"idx === 0 ? 'mt-4' : 'mt-6'\">\n {{ section.title }}\n </h3>\n <v-data-table\n :headers=\"metricsHeaders\"\n :items=\"section.items\"\n :group-by=\"metricsGroupBy\"\n class=\"monospace\"\n :items-per-page=\"50\"\n density=\"compact\"\n >\n <template\n #group-header=\"{ item, columns, toggleGroup, isGroupOpen }\"\n >\n <tr>\n <td :colspan=\"columns.length - 1\">\n <v-btn\n :icon=\"isGroupOpen(item) ? '$expand' : '$next'\"\n size=\"small\"\n variant=\"text\"\n @click=\"toggleGroup(item)\"\n />\n <span class=\"font-weight-bold\">\n {{ item.value }}\n </span>\n <span class=\"ml-4 text-medium-emphasis\">\n Packets: {{ item.items.length }} &mdash; Rows:\n {{ groupRowCount(item.items).toLocaleString() }} &mdash;\n Disk: {{ formatBytes(groupDiskSize(item.items)) }}\n </span>\n </td>\n <td>\n <v-menu>\n <template #activator=\"{ props }\">\n <v-icon\n v-bind=\"props\"\n icon=\"mdi-dots-horizontal\"\n data-test=\"group-actions\"\n />\n </template>\n <v-list>\n <v-list-item\n title=\"Analyze Data Gaps\"\n prepend-icon=\"mdi-chart-timeline-variant-shimmer\"\n data-test=\"group-analyze-gap\"\n @click=\"analyzeGroupDataGap(item.items)\"\n />\n <v-list-item\n title=\"Delete All\"\n prepend-icon=\"mdi-delete\"\n data-test=\"group-delete\"\n @click=\"deleteGroup(item.items)\"\n />\n </v-list>\n </v-menu>\n </td>\n </tr>\n </template>\n <template #item.diskSize=\"{ item }\">\n {{ formatBytes(item.diskSize) }}\n </template>\n <template #item.rowCount=\"{ item }\">\n {{ Number(item.rowCount).toLocaleString() }}\n </template>\n <template #item.actions=\"{ item }\">\n <v-menu>\n <template #activator=\"{ props }\">\n <v-icon\n v-bind=\"props\"\n icon=\"mdi-dots-horizontal\"\n data-test=\"row-actions\"\n />\n </template>\n <v-list>\n <v-list-item\n title=\"Analyze Data Gap\"\n prepend-icon=\"mdi-chart-timeline-variant-shimmer\"\n data-test=\"row-analyze-gap\"\n @click=\"analyzeDataGap(item.tableName)\"\n />\n <v-list-item\n title=\"Delete\"\n prepend-icon=\"mdi-delete\"\n data-test=\"row-delete\"\n @click=\"deleteTable(item.tableName)\"\n />\n </v-list>\n </v-menu>\n </template>\n </v-data-table>\n </template>\n </div>\n </v-card>\n\n <!-- Data Gap Analysis Dialog -->\n <v-dialog v-model=\"gapDialog\" max-width=\"900\">\n <v-card>\n <v-card-title class=\"d-flex align-center\">\n Data Gap Analysis: {{ gapDialogTitle }}\n <v-spacer />\n <v-btn icon=\"mdi-close\" variant=\"text\" @click=\"gapDialog = false\" />\n </v-card-title>\n <v-card-text style=\"max-height: 80vh; overflow-y: auto\">\n <v-progress-linear\n v-if=\"gapLoading\"\n :model-value=\"gapProgress\"\n :indeterminate=\"gapProgress === 0\"\n class=\"mb-4\"\n />\n <div v-if=\"gapError\" class=\"text-red monospace mb-4\">\n Error: {{ gapError }}\n </div>\n\n <!-- Single table result -->\n <template v-if=\"!gapLoading && !gapError && gapSummary\">\n <v-table density=\"compact\" class=\"monospace mb-4\">\n <tbody>\n <tr>\n <td class=\"font-weight-bold\">First Record</td>\n <td>{{ gapSummary.firstTs }}</td>\n </tr>\n <tr>\n <td class=\"font-weight-bold\">Last Record</td>\n <td>{{ gapSummary.lastTs }}</td>\n </tr>\n <tr>\n <td class=\"font-weight-bold\">Total Time Span</td>\n <td>{{ gapSummary.timeSpan }}</td>\n </tr>\n <tr>\n <td class=\"font-weight-bold\">Gaps Found</td>\n <td>{{ gapSummary.gaps.length }}</td>\n </tr>\n </tbody>\n </v-table>\n <div v-if=\"gapSummary.gaps.length\">\n <h4 class=\"text-subtitle-1 font-weight-bold mb-2\">\n Data Gaps (periods with no data)\n </h4>\n <v-data-table\n :headers=\"gapHeaders\"\n :items=\"gapSummary.gaps\"\n class=\"monospace\"\n :items-per-page=\"20\"\n density=\"compact\"\n >\n <template #item.actions=\"{ item }\">\n <v-btn\n v-if=\"isTlmTable(gapDialogTitle)\"\n icon=\"mdi-wrench\"\n size=\"small\"\n variant=\"text\"\n data-test=\"gap-repair\"\n title=\"Repair (reingest raw logs)\"\n @click=\"openRepair(item, gapDialogTitle)\"\n />\n </template>\n </v-data-table>\n </div>\n <div v-else class=\"text-medium-emphasis\">\n No data gaps detected (sampled at {{ gapSampleInterval }}\n intervals).\n </div>\n </template>\n\n <!-- Group results (only tables with gaps) -->\n <template v-if=\"!gapLoading && !gapError && gapGroupResults\">\n <div\n v-if=\"gapGroupResults.withGaps.length === 0\"\n class=\"text-medium-emphasis\"\n >\n No data gaps detected across\n {{ gapGroupResults.totalTables }} tables (sampled at\n {{ gapSampleInterval }} intervals).\n </div>\n <div v-else>\n <div class=\"mb-4 text-medium-emphasis\">\n {{ gapGroupResults.withGaps.length }} of\n {{ gapGroupResults.totalTables }} tables have data gaps.\n </div>\n <div\n v-for=\"result in gapGroupResults.withGaps\"\n :key=\"result.tableName\"\n class=\"mb-6\"\n >\n <h4 class=\"text-subtitle-1 font-weight-bold mb-1\">\n {{ result.packet }}\n </h4>\n <div class=\"text-medium-emphasis monospace mb-2\">\n {{ result.firstTs }} to {{ result.lastTs }} ({{\n result.timeSpan\n }}) &mdash; {{ result.gaps.length }} gap(s)\n </div>\n <v-data-table\n :headers=\"gapHeaders\"\n :items=\"result.gaps\"\n class=\"monospace\"\n :items-per-page=\"10\"\n density=\"compact\"\n >\n <template #item.actions=\"{ item }\">\n <v-btn\n v-if=\"isTlmTable(result.tableName)\"\n icon=\"mdi-wrench\"\n size=\"small\"\n variant=\"text\"\n data-test=\"gap-repair\"\n title=\"Repair (reingest raw logs)\"\n @click=\"openRepair(item, result.tableName)\"\n />\n </template>\n </v-data-table>\n </div>\n </div>\n </template>\n </v-card-text>\n </v-card>\n </v-dialog>\n\n <repair-gap-dialog\n v-if=\"repairContext\"\n v-model=\"repairDialog\"\n :context=\"repairContext\"\n @complete=\"onRepairComplete\"\n />\n </div>\n</template>\n\n<script>\nimport RepairGapDialog from './RepairGapDialog.vue'\nimport { execSql } from './tsdbApi'\n\nexport default {\n components: {\n RepairGapDialog,\n },\n data() {\n return {\n metricsRows: [],\n metricsError: null,\n metricsLoading: false,\n metricsGroupBy: [{ key: 'target', order: 'asc' }],\n metricsHeaders: [\n { title: 'Packet', key: 'packet' },\n { title: 'Table Name', key: 'tableName' },\n { title: 'Partition Count', key: 'partitionCount' },\n { title: 'Row Count', key: 'rowCount' },\n { title: 'Disk Size', key: 'diskSize' },\n { title: 'Actions', key: 'actions', sortable: false },\n ],\n gapDialog: false,\n gapDialogTitle: '',\n gapLoading: false,\n gapProgress: 0,\n gapError: null,\n gapSummary: null,\n gapGroupResults: null,\n gapHeaders: [\n { title: 'Gap Start', key: 'start' },\n { title: 'Gap End', key: 'end' },\n { title: 'Duration', key: 'duration' },\n { title: 'Actions', key: 'actions', sortable: false, width: 80 },\n ],\n repairDialog: false,\n repairContext: null,\n gapSampleInterval: '1m',\n db_shard: '0',\n }\n },\n computed: {\n sections() {\n return [\n {\n title: 'Telemetry',\n items: this.metricsRows.filter((row) => row.type === 'TLM'),\n },\n {\n title: 'Commands',\n items: this.metricsRows.filter((row) => row.type === 'CMD'),\n },\n ]\n },\n },\n mounted() {\n this.fetchMetrics()\n },\n methods: {\n groupRowCount(items) {\n return items.reduce(\n (sum, row) => sum + Number((row.raw || row).rowCount || 0),\n 0,\n )\n },\n groupDiskSize(items) {\n return items.reduce(\n (sum, row) => sum + Number((row.raw || row).diskSize || 0),\n 0,\n )\n },\n formatBytes(bytes) {\n if (bytes === 0) return '0 B'\n const units = ['B', 'KB', 'MB', 'GB', 'TB']\n const k = 1024\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n const value = bytes / Math.pow(k, i)\n return `${value.toFixed(i === 0 ? 0 : 1)} ${units[i]}`\n },\n fetchMetrics() {\n this.metricsError = null\n this.metricsRows = []\n this.metricsLoading = true\n execSql(\n 'SELECT tableName, partitionCount, rowCount, diskSize FROM table_storage;',\n this.db_shard,\n )\n .then((response) => {\n const cols = response.data.columns\n this.metricsRows = response.data.rows.map((row) => {\n const obj = {}\n cols.forEach((col, i) => {\n obj[col] = row[i]\n })\n const parts = (obj.tableName || '').split('__')\n obj.type = parts[1] || ''\n obj.target = parts[2] || ''\n obj.packet = parts[3] || ''\n return obj\n })\n })\n .catch((error) => {\n if (error.response && error.response.data) {\n this.metricsError = error.response.data.message\n } else {\n this.metricsError = error.message\n }\n })\n .finally(() => {\n this.metricsLoading = false\n })\n },\n dropTable(tableName) {\n return execSql(`DROP TABLE '${tableName}';`, this.db_shard)\n },\n deleteTable(tableName) {\n let target = tableName.split('__')[2] || tableName\n let packet = tableName.split('__')[3] || tableName\n this.$dialog\n .confirm(\n `Are you sure you want to drop table: ${tableName}? This removes ALL decommutated data for ${target} ${packet}!`,\n {\n okText: 'Delete',\n cancelText: 'Cancel',\n },\n )\n .then(() => {\n this.dropTable(tableName)\n .then(() => {\n this.metricsRows = this.metricsRows.filter(\n (row) => row.tableName !== tableName,\n )\n })\n .catch((error) => {\n if (error.response && error.response.data) {\n this.metricsError = error.response.data.message\n } else {\n this.metricsError = error.message\n }\n })\n })\n },\n deleteGroup(items) {\n const tableNames = items.map((item) => (item.raw || item).tableName)\n let target = tableNames[0].split('__')[2]\n this.$dialog\n .confirm(\n `Are you sure you want to drop ${tableNames.length} tables? This removes ALL decommutated data for ${target}!\\n\\n${tableNames.join('\\n')}`,\n {\n okText: 'Delete',\n cancelText: 'Cancel',\n },\n )\n .then(() => {\n const nameSet = new Set(tableNames)\n Promise.all(tableNames.map((name) => this.dropTable(name)))\n .then(() => {\n this.metricsRows = this.metricsRows.filter(\n (row) => !nameSet.has(row.tableName),\n )\n })\n .catch((error) => {\n if (error.response && error.response.data) {\n this.metricsError = error.response.data.message\n } else {\n this.metricsError = error.message\n }\n })\n })\n },\n formatDuration(ms) {\n const seconds = Math.floor(ms / 1000)\n const days = Math.floor(seconds / 86400)\n const hours = Math.floor((seconds % 86400) / 3600)\n const minutes = Math.floor((seconds % 3600) / 60)\n const parts = []\n if (days) parts.push(`${days}d`)\n if (hours) parts.push(`${hours}h`)\n if (minutes) parts.push(`${minutes}m`)\n if (!parts.length) parts.push(`${seconds}s`)\n return parts.join(' ')\n },\n formatTimestamp(ts) {\n return new Date(ts).toISOString().replace('T', ' ').replace('.000Z', 'Z')\n },\n // Parse a QuestDB SAMPLE BY duration like \"1m\", \"30s\", \"2h\" into ms.\n // Returns null if malformed.\n parseSampleIntervalMs(input) {\n const match = String(input || '')\n .trim()\n .match(/^(\\d+)\\s*([smhd])$/i)\n if (!match) return null\n const value = Number.parseInt(match[1], 10)\n const multipliers = { s: 1_000, m: 60_000, h: 3_600_000, d: 86_400_000 }\n return value * multipliers[match[2].toLowerCase()]\n },\n async fetchTableGaps(tableName) {\n const interval = (this.gapSampleInterval || '1m').trim()\n const bucketMs = this.parseSampleIntervalMs(interval)\n if (!bucketMs) {\n throw new Error(\n `Invalid sample interval '${interval}'. Use a number followed by s, m, h, or d (e.g. 5s, 1m, 2h).`,\n )\n }\n\n // Get first and last timestamps\n const rangeResp = await execSql(\n `SELECT first(PACKET_TIMESECONDS) as first_ts, last(PACKET_TIMESECONDS) as last_ts FROM '${tableName}';`,\n this.db_shard,\n )\n const rangeCols = rangeResp.data.columns\n const rangeRow = rangeResp.data.rows[0]\n const rangeObj = {}\n rangeCols.forEach((col, i) => {\n rangeObj[col] = rangeRow[i]\n })\n const firstTs = rangeObj.first_ts\n const lastTs = rangeObj.last_ts\n const totalMs = new Date(lastTs) - new Date(firstTs)\n\n // Sample by the user-chosen interval with FILL(NULL) to detect gaps.\n const gapResp = await execSql(\n `(SELECT PACKET_TIMESECONDS, count() as cnt FROM '${tableName}' SAMPLE BY ${interval} FILL(NULL)) WHERE cnt IS NULL`,\n this.db_shard,\n )\n const gapCols = gapResp.data.columns\n const gapRows = gapResp.data.rows.map((row) => {\n const obj = {}\n gapCols.forEach((col, i) => {\n obj[col] = row[i]\n })\n return obj\n })\n\n // Group contiguous null-bucket timestamps into gaps. A delta > bucketMs\n // between consecutive empty buckets means a new gap has started.\n const gaps = []\n const buildGap = (startRaw, endRaw) => {\n const startMs = new Date(startRaw).getTime()\n const endMs = new Date(endRaw).getTime() + bucketMs\n return {\n start: this.formatTimestamp(startRaw),\n end: this.formatTimestamp(new Date(endMs)),\n duration: this.formatDuration(endMs - startMs),\n // ISO strings avoid the JS precision cliff on nsec integers.\n startIso: new Date(startMs).toISOString(),\n endIso: new Date(endMs).toISOString(),\n }\n }\n if (gapRows.length > 0) {\n let gapStart = gapRows[0].PACKET_TIMESECONDS\n let gapEnd = gapStart\n for (let i = 1; i < gapRows.length; i++) {\n const prev = new Date(gapEnd)\n const curr = new Date(gapRows[i].PACKET_TIMESECONDS)\n if (curr - prev > bucketMs) {\n gaps.push(buildGap(gapStart, gapEnd))\n gapStart = gapRows[i].PACKET_TIMESECONDS\n }\n gapEnd = gapRows[i].PACKET_TIMESECONDS\n }\n gaps.push(buildGap(gapStart, gapEnd))\n }\n\n return {\n firstTs: this.formatTimestamp(firstTs),\n lastTs: this.formatTimestamp(lastTs),\n timeSpan: this.formatDuration(totalMs),\n gaps,\n }\n },\n async analyzeDataGap(tableName) {\n this.gapDialogTitle = tableName\n this.gapDialog = true\n this.gapLoading = true\n this.gapProgress = 0\n this.gapError = null\n this.gapSummary = null\n this.gapGroupResults = null\n try {\n this.gapSummary = await this.fetchTableGaps(tableName)\n } catch (error) {\n this.gapError = error.response?.data?.message || error.message\n } finally {\n this.gapLoading = false\n }\n },\n async analyzeGroupDataGap(items) {\n const tableNames = items.map((item) => (item.raw || item).tableName)\n const target = (items[0].raw || items[0]).target\n this.gapDialogTitle = `${target} (${tableNames.length} tables)`\n this.gapDialog = true\n this.gapLoading = true\n this.gapProgress = 0\n this.gapError = null\n this.gapSummary = null\n this.gapGroupResults = null\n try {\n const withGaps = []\n for (let i = 0; i < tableNames.length; i++) {\n this.gapProgress = Math.round(((i + 1) / tableNames.length) * 100)\n try {\n const result = await this.fetchTableGaps(tableNames[i])\n if (result.gaps.length > 0) {\n const parts = tableNames[i].split('__')\n withGaps.push({\n tableName: tableNames[i],\n packet: parts[3] || tableNames[i],\n ...result,\n })\n }\n } catch {\n // Skip tables that error (e.g. empty tables)\n }\n }\n this.gapGroupResults = {\n totalTables: tableNames.length,\n withGaps,\n }\n } catch (error) {\n this.gapError = error.response?.data?.message || error.message\n } finally {\n this.gapLoading = false\n }\n },\n // scope__TLM|CMD__TARGET__PACKET → { scope, cmdOrTlm, target, packet }\n parseTableName(tableName) {\n const parts = tableName.split('__')\n if (parts.length < 4) return null\n return {\n scope: parts[0],\n cmdOrTlm: parts[1],\n target: parts[2],\n packet: parts[3],\n }\n },\n isTlmTable(tableName) {\n const parsed = this.parseTableName(tableName)\n return parsed?.cmdOrTlm === 'TLM'\n },\n openRepair(gap, tableName) {\n const parsed = this.parseTableName(tableName)\n if (!parsed) return\n this.repairContext = {\n tableName,\n ...parsed,\n gap,\n }\n this.repairDialog = true\n },\n onRepairComplete() {\n // Re-run gap analysis on whichever view is currently showing.\n if (this.gapGroupResults) return // group analysis is expensive; let the user re-run manually\n if (this.gapDialogTitle) this.analyzeDataGap(this.gapDialogTitle)\n },\n },\n}\n</script>\n\n<style scoped>\n.monospace {\n font-family: monospace;\n font-size: 14px;\n}\n.text-red {\n color: rgb(var(--v-theme-error));\n}\n</style>\n","<!--\n# Copyright 2026 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <v-card>\n <v-card-title> Send SQL Queries to QuestDB </v-card-title>\n <v-card-subtitle>\n THIS IS DANGEROUS! This allows you to interact directly with the\n underlying QuestDB time series database, making it easy to modify or\n delete data.\n <br /><br />\n Enter SQL queries like:\n <code> SELECT * FROM DEFAULT__TLM__INST__HEALTH_STATUS LIMIT 10 </code>\n or\n <code>SHOW TABLES</code>\n </v-card-subtitle>\n <v-card-text class=\"pb-0 ml-2\">\n <v-textarea\n v-model=\"sqlText\"\n hide-details\n label=\"SQL query\"\n class=\"monospace\"\n rows=\"3\"\n @keydown=\"commandKeydown\"\n />\n <div v-if=\"errorMessage\" class=\"mt-2 text-red monospace\">\n Error: {{ errorMessage }}\n </div>\n </v-card-text>\n <v-card-actions class=\"px-2\">\n <v-btn\n :disabled=\"!sqlText.length\"\n :loading=\"loading\"\n color=\"success\"\n variant=\"text\"\n data-test=\"tsdb-execute\"\n @click=\"executeQuery\"\n >\n Execute\n </v-btn>\n <v-text-field\n v-model=\"db_shard\"\n type=\"number\"\n min=\"0\"\n label=\"DB Shard\"\n hide-details\n density=\"compact\"\n style=\"max-width: 100px\"\n class=\"ml-4\"\n />\n </v-card-actions>\n\n <v-data-table\n v-if=\"columns.length\"\n :headers=\"tableHeaders\"\n :items=\"rows\"\n class=\"monospace\"\n :items-per-page=\"50\"\n density=\"compact\"\n >\n </v-data-table>\n </v-card>\n</template>\n\n<script>\nimport { execSql } from './tsdbApi'\n\nexport default {\n data() {\n return {\n sqlText: '',\n db_shard: '0',\n columns: [],\n rows: [],\n errorMessage: null,\n loading: false,\n }\n },\n computed: {\n tableHeaders() {\n return this.columns.map((col) => ({\n title: col,\n key: col,\n }))\n },\n },\n methods: {\n commandKeydown($event) {\n if (($event.metaKey || $event.ctrlKey) && $event.key === 'Enter') {\n this.executeQuery()\n }\n },\n executeQuery() {\n this.errorMessage = null\n this.columns = []\n this.rows = []\n this.loading = true\n execSql(this.sqlText, this.db_shard)\n .then((response) => {\n this.columns = response.data.columns\n this.rows = response.data.rows.map((row) => {\n const obj = {}\n this.columns.forEach((col, i) => {\n obj[col] = row[i]\n })\n return obj\n })\n })\n .catch((error) => {\n if (error.response && error.response.data) {\n this.errorMessage = error.response.data.message\n } else {\n this.errorMessage = error.message\n }\n })\n .finally(() => {\n this.loading = false\n })\n },\n },\n}\n</script>\n\n<style scoped>\n.monospace {\n font-family: monospace;\n font-size: 14px;\n}\n.text-red {\n color: rgb(var(--v-theme-error));\n}\n</style>\n","<!--\n# Copyright 2026 OpenC3, Inc.\n# All Rights Reserved.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See LICENSE.md for more details.\n#\n# This file may also be used under the terms of a commercial license\n# if purchased from OpenC3, Inc.\n-->\n\n<template>\n <div>\n <v-tabs v-model=\"activeTab\">\n <v-tab value=\"metrics\" data-test=\"tsdb-metrics-tab\">Metrics</v-tab>\n <v-tab value=\"queries\" data-test=\"tsdb-queries-tab\">Queries</v-tab>\n </v-tabs>\n <v-window v-model=\"activeTab\">\n <v-window-item value=\"metrics\">\n <tsdb-metrics />\n </v-window-item>\n <v-window-item value=\"queries\">\n <tsdb-queries />\n </v-window-item>\n </v-window>\n </div>\n</template>\n\n<script>\nimport TsdbMetrics from './tsdb/TsdbMetrics.vue'\nimport TsdbQueries from './tsdb/TsdbQueries.vue'\n\nexport default {\n components: {\n TsdbMetrics,\n TsdbQueries,\n },\n data() {\n return {\n activeTab: 'metrics',\n }\n },\n}\n</script>\n"],"names":["PHASE_LABELS","_sfc_main","phase","remaining","enabledAt","cooldown","nowSec","enabledSec","open","completed","response","Api","c","error","filenames","key","_hoisted_4","_hoisted_5","_hoisted_9","_hoisted_11","_createBlock","_component_v_dialog","$props","_createVNode","_component_v_card","_component_v_card_title","_toDisplayString","_component_v_card_subtitle","_component_v_card_text","$data","_openBlock","_createElementBlock","_hoisted_1","_Fragment","_component_v_table","_createElementVNode","_cache","$options","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_10","w","idx","_component_v_progress_linear","_hoisted_2","_component_v_progress_circular","_hoisted_3","_component_v_data_table","$event","_component_v_radio_group","_component_v_radio","_component_v_card_actions","_component_v_spacer","_component_v_btn","execSql","sql","db_shard","retries","attempt","url","msg","r","RepairGapDialog","row","items","sum","bytes","units","k","i","cols","obj","col","parts","tableName","target","packet","tableNames","item","nameSet","name","ms","seconds","days","hours","minutes","ts","input","match","interval","bucketMs","rangeResp","rangeCols","rangeRow","rangeObj","firstTs","lastTs","totalMs","gapResp","gapCols","gapRows","gaps","buildGap","startRaw","endRaw","startMs","endMs","gapStart","gapEnd","prev","withGaps","result","gap","parsed","_hoisted_12","_hoisted_13","_component_v_text_field","_renderList","section","_normalizeClass","_withCtx","columns","toggleGroup","isGroupOpen","_component_v_menu","props","_component_v_icon","_mergeProps","_component_v_list","_component_v_list_item","_createTextVNode","_component_repair_gap_dialog","_component_v_textarea","TsdbMetrics","TsdbQueries","_component_v_tabs","_component_v_tab","_component_v_window","_component_v_window_item","_component_tsdb_metrics","_component_tsdb_queries"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const S=require("./format-DMO5vfrX.cjs"),e=require("vue"),T=require("./CustomIcon-8F08upeg.cjs"),M={downloading:"Downloading files…",enabling_dedup:"Enabling DEDUP…",ingesting:"Ingesting packets…",dedup_cooldown:"Waiting for DEDUP cooldown…",disabling_dedup:"Disabling DEDUP…"},L={props:{modelValue:{type:Boolean,default:!1},context:{type:Object,required:!0}},emits:["update:modelValue","complete"],data(){return{loadingCandidates:!1,candidates:[],selectedKeys:[],targetVersion:"as_logged",bucketEnv:null,path:null,candidateHeaders:[{title:"File",key:"filename"},{title:"Key",key:"key"}],jobId:null,jobStatus:null,pollHandle:null,errorMessage:null,confirmCloseOpen:!1}},computed:{isRunning(){return this.jobStatus?["Queued","Running"].includes(this.jobStatus.state):!1},phaseLabel(){const s=this.jobStatus?.progress_phase;if(!s)return this.jobStatus?.state||"";if(s==="dedup_cooldown"){const t=this.cooldownRemaining;if(t!=null)return`Waiting for DEDUP cooldown (${t}s)…`}return M[s]||s},cooldownRemaining(){const s=this.jobStatus?.dedup_enabled_at,t=this.jobStatus?.dedup_cooldown_seconds;if(!s||!t)return null;const n=Date.now()/1e3,a=new Date(s).getTime()/1e3,o=Math.round(a+t-n);return Math.max(o,0)},progressPercent(){const s=this.jobStatus;return s?s.state==="Complete"?100:!s.progress_total||s.progress_total===0?0:Math.round(s.progress_current/s.progress_total*100):0}},watch:{modelValue(s){s&&this.fetchCandidates()}},mounted(){this.modelValue&&this.fetchCandidates()},beforeUnmount(){this.stopPolling()},methods:{close(){this.stopPolling();const s=this.jobStatus?.state==="Complete";this.resetState(),this.$emit("update:modelValue",!1),s&&this.$emit("complete")},attemptClose(){this.isRunning?this.confirmCloseOpen=!0:this.close()},confirmClose(){this.confirmCloseOpen=!1,this.close()},resetState(){this.candidates=[],this.selectedKeys=[],this.targetVersion="as_logged",this.bucketEnv=null,this.path=null,this.jobId=null,this.jobStatus=null,this.errorMessage=null,this.loadingCandidates=!1,this.confirmCloseOpen=!1},async fetchCandidates(){this.resetState(),this.loadingCandidates=!0;try{const s=await S.es.get("/openc3-api/storage/repair_candidates",{params:{scope:this.context.scope,target:this.context.target,packet:this.context.packet,cmd_or_tlm:this.context.cmdOrTlm,start_time:this.context.gap.startIso,end_time:this.context.gap.endIso}});this.candidates=s.data.files||[],this.bucketEnv=s.data.bucket,this.path=s.data.path,this.selectedKeys=this.candidates.map(t=>t.key)}catch(s){this.errorMessage=s.response?.data?.message||s.message}finally{this.loadingCandidates=!1}},async startReingest(){this.errorMessage=null;const s=this.selectedKeys.map(t=>this.path&&t.startsWith(this.path)?t.slice(this.path.length):t.split("/").pop());try{const t=await S.es.post("/openc3-api/storage/reingest",{data:{scope:this.context.scope,bucket:this.bucketEnv,path:this.path,files:s,target_version:this.targetVersion}});this.jobId=t.data.job_id,this.jobStatus={state:t.data.state},this.startPolling()}catch(t){this.errorMessage=t.response?.data?.message||t.message}},startPolling(){this.stopPolling(),this.pollHandle=setInterval(this.pollStatus,2e3),this.pollStatus()},stopPolling(){this.pollHandle&&(clearInterval(this.pollHandle),this.pollHandle=null)},async pollStatus(){if(this.jobId)try{const s=await S.es.get(`/openc3-api/storage/reingest/${this.jobId}`,{params:{scope:this.context.scope}});this.jobStatus=s.data,this.isRunning||this.stopPolling()}catch(s){this.errorMessage=s.response?.data?.message||s.message,this.stopPolling()}}}},I={key:0,class:"text-red monospace mb-4"},j={key:0,class:"d-flex align-center mb-4"},G={key:0,class:"text-medium-emphasis"},P={class:"mb-2"},A={class:"mt-4"},O={key:0},z={key:1},K={key:2},U={class:"text-red"},F={key:3},H={class:"text-orange"};function q(s,t,n,a,o,l){const d=e.resolveComponent("v-card-title"),h=e.resolveComponent("v-card-subtitle"),g=e.resolveComponent("v-progress-circular"),C=e.resolveComponent("v-data-table"),_=e.resolveComponent("v-radio"),w=e.resolveComponent("v-radio-group"),m=e.resolveComponent("v-table"),v=e.resolveComponent("v-progress-linear"),b=e.resolveComponent("v-card-text"),i=e.resolveComponent("v-spacer"),c=e.resolveComponent("v-btn"),p=e.resolveComponent("v-card-actions"),f=e.resolveComponent("v-card"),V=e.resolveComponent("v-dialog");return e.openBlock(),e.createBlock(V,{"model-value":n.modelValue,"max-width":"900",persistent:""},{default:e.withCtx(()=>[e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(d,{class:"d-flex align-center"},{default:e.withCtx(()=>[e.createTextVNode(" Repair Gap: "+e.toDisplayString(n.context.target)+" "+e.toDisplayString(n.context.packet),1)]),_:1}),n.context.gap?(e.openBlock(),e.createBlock(h,{key:0},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(n.context.gap.start)+" — "+e.toDisplayString(n.context.gap.end)+" ("+e.toDisplayString(n.context.gap.duration)+") ",1)]),_:1})):e.createCommentVNode("",!0),e.createVNode(b,{style:{"max-height":"75vh","overflow-y":"auto"}},{default:e.withCtx(()=>[o.errorMessage?(e.openBlock(),e.createElementBlock("div",I," Error: "+e.toDisplayString(o.errorMessage),1)):e.createCommentVNode("",!0),o.jobId?o.jobStatus?(e.openBlock(),e.createElementBlock(e.Fragment,{key:2},[e.createVNode(m,{density:"compact",class:"monospace mb-4"},{default:e.withCtx(()=>[e.createElementVNode("tbody",null,[e.createElementVNode("tr",null,[t[8]||(t[8]=e.createElementVNode("td",{class:"font-weight-bold"},"Job",-1)),e.createElementVNode("td",null,e.toDisplayString(o.jobId),1)]),e.createElementVNode("tr",null,[t[9]||(t[9]=e.createElementVNode("td",{class:"font-weight-bold"},"State",-1)),e.createElementVNode("td",null,e.toDisplayString(o.jobStatus.state),1)]),e.createElementVNode("tr",null,[t[10]||(t[10]=e.createElementVNode("td",{class:"font-weight-bold"},"Phase",-1)),e.createElementVNode("td",null,e.toDisplayString(l.phaseLabel),1)]),o.jobStatus.target_version?(e.openBlock(),e.createElementBlock("tr",O,[t[11]||(t[11]=e.createElementVNode("td",{class:"font-weight-bold"},"Target Version",-1)),e.createElementVNode("td",null,e.toDisplayString(o.jobStatus.target_version),1)])):e.createCommentVNode("",!0),o.jobStatus.packets_written!==void 0?(e.openBlock(),e.createElementBlock("tr",z,[t[12]||(t[12]=e.createElementVNode("td",{class:"font-weight-bold"},"Packets Written",-1)),e.createElementVNode("td",null,e.toDisplayString(o.jobStatus.packets_written.toLocaleString()),1)])):e.createCommentVNode("",!0),o.jobStatus.error?(e.openBlock(),e.createElementBlock("tr",K,[t[13]||(t[13]=e.createElementVNode("td",{class:"font-weight-bold text-red"},"Error",-1)),e.createElementVNode("td",U,e.toDisplayString(o.jobStatus.error),1)])):e.createCommentVNode("",!0),o.jobStatus.warnings&&o.jobStatus.warnings.length?(e.openBlock(),e.createElementBlock("tr",F,[t[14]||(t[14]=e.createElementVNode("td",{class:"font-weight-bold text-orange"},"Warnings",-1)),e.createElementVNode("td",H,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.jobStatus.warnings,(y,D)=>(e.openBlock(),e.createElementBlock("div",{key:D},e.toDisplayString(y),1))),128))])])):e.createCommentVNode("",!0)])]),_:1}),e.createVNode(v,{"model-value":l.progressPercent,indeterminate:l.progressPercent===0&&l.isRunning,class:"mb-2"},null,8,["model-value","indeterminate"])],64)):e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[o.loadingCandidates?(e.openBlock(),e.createElementBlock("div",j,[e.createVNode(g,{indeterminate:"",size:"24",class:"mr-3"}),t[4]||(t[4]=e.createTextVNode(" Searching bucket for raw log files that cover this gap… ",-1))])):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[o.candidates.length===0?(e.openBlock(),e.createElementBlock("div",G," No raw log files cover this gap window. Reingest is not available — the data may have been written from a source that skipped raw logging, or the logs have been deleted. ")):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createElementVNode("div",P,e.toDisplayString(o.candidates.length)+" raw log file(s) overlap this window. Select which to reingest: ",1),e.createVNode(C,{modelValue:o.selectedKeys,"onUpdate:modelValue":t[0]||(t[0]=y=>o.selectedKeys=y),headers:o.candidateHeaders,items:o.candidates,"item-value":"key","show-select":"",class:"monospace","items-per-page":20,density:"compact","data-test":"repair-candidates"},null,8,["modelValue","headers","items"]),e.createElementVNode("div",A,[t[7]||(t[7]=e.createElementVNode("div",{class:"text-subtitle-2 font-weight-bold mb-1"}," Target Definition Version ",-1)),e.createVNode(w,{modelValue:o.targetVersion,"onUpdate:modelValue":t[1]||(t[1]=y=>o.targetVersion=y),"hide-details":"",density:"compact","data-test":"repair-version"},{default:e.withCtx(()=>[e.createVNode(_,{value:"as_logged","data-test":"repair-version-as-logged"},{label:e.withCtx(()=>[...t[5]||(t[5]=[e.createElementVNode("div",{style:{"padding-left":"10px"}},[e.createElementVNode("div",null,"As logged (default)"),e.createElementVNode("div",{class:"text-caption text-medium-emphasis"}," Decode each file with the cmd/tlm definition that was in effect when the data was originally logged. Safest for historical fidelity — preserves packet layouts as they existed at that time. "),e.createElementVNode("div",{class:"text-caption text-medium-emphasis mt-1"}," If an item's type has changed since the log was written (e.g. STRING → FLOAT), QuestDB column types are kept as-is; historical values are cast to fit the current column, and any values that can't cast are stored as NULL. ")],-1)])]),_:1}),e.createVNode(_,{value:"current","data-test":"repair-version-current"},{label:e.withCtx(()=>[...t[6]||(t[6]=[e.createElementVNode("div",{style:{"padding-left":"10px"}},[e.createElementVNode("div",null,"Current"),e.createElementVNode("div",{class:"text-caption text-medium-emphasis"}," Decode all files with the latest cmd/tlm definition. Choose this when the historical definition had a bug that you've since fixed, and you want the reingested data decoded with the corrected layout. ")],-1)])]),_:1})]),_:1},8,["modelValue"])])],64))],64))],64))]),_:1}),e.createVNode(p,{class:"px-4 pb-4"},{default:e.withCtx(()=>[e.createVNode(i),o.jobId?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(c,{key:0,color:"warning",variant:"elevated",disabled:o.loadingCandidates||o.candidates.length===0||o.selectedKeys.length===0,"data-test":"repair-reingest",onClick:l.startReingest},{default:e.withCtx(()=>[e.createTextVNode(" Reingest "+e.toDisplayString(o.selectedKeys.length),1)]),_:1},8,["disabled","onClick"])),e.createVNode(c,{variant:"text","data-test":"repair-close",onClick:l.attemptClose},{default:e.withCtx(()=>[...t[15]||(t[15]=[e.createTextVNode(" Close ",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1}),e.createVNode(V,{modelValue:o.confirmCloseOpen,"onUpdate:modelValue":t[3]||(t[3]=y=>o.confirmCloseOpen=y),"max-width":"500",persistent:""},{default:e.withCtx(()=>[e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(d,null,{default:e.withCtx(()=>[...t[16]||(t[16]=[e.createTextVNode("Reingest Still Running",-1)])]),_:1}),e.createVNode(b,null,{default:e.withCtx(()=>[...t[17]||(t[17]=[e.createTextVNode(" The reingest job is still in progress. Closing this dialog will not stop the job, but you will lose visibility into its status. Are you sure you want to close? ",-1)])]),_:1}),e.createVNode(p,{class:"px-4 pb-4"},{default:e.withCtx(()=>[e.createVNode(i),e.createVNode(c,{variant:"text","data-test":"repair-close-cancel",onClick:t[2]||(t[2]=y=>o.confirmCloseOpen=!1)},{default:e.withCtx(()=>[...t[18]||(t[18]=[e.createTextVNode(" Keep Watching ",-1)])]),_:1}),e.createVNode(c,{color:"warning",variant:"elevated","data-test":"repair-close-confirm",onClick:l.confirmClose},{default:e.withCtx(()=>[...t[19]||(t[19]=[e.createTextVNode(" Close Anyway ",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1})]),_:1},8,["modelValue"])]),_:1},8,["model-value"])}const Q=T._export_sfc(L,[["render",q],["__scopeId","data-v-2ab87eb9"]]);async function x(s,t,n=3){for(let a=1;a<=n;a++)try{let o="/openc3-api/tsdb/exec";return t&&t!=="0"&&(o+=`?db_shard=${t}`),await S.es.post(o,{data:s,headers:{Accept:"application/json","Content-Type":"text/plain"}})}catch(o){const l=o.response?.data?.message||o.message||"";if((l.includes("PQconsumeInput")||l.includes("server closed the connection"))&&a<n){await new Promise(h=>setTimeout(h,1e3*a));continue}throw o}}const W={components:{RepairGapDialog:Q},data(){return{metricsRows:[],metricsError:null,metricsLoading:!1,metricsGroupBy:[{key:"target",order:"asc"}],metricsHeaders:[{title:"Packet",key:"packet"},{title:"Table Name",key:"tableName"},{title:"Partition Count",key:"partitionCount"},{title:"Row Count",key:"rowCount"},{title:"Disk Size",key:"diskSize"},{title:"Actions",key:"actions",sortable:!1}],gapDialog:!1,gapDialogTitle:"",gapLoading:!1,gapProgress:0,gapError:null,gapSummary:null,gapGroupResults:null,gapHeaders:[{title:"Gap Start",key:"start"},{title:"Gap End",key:"end"},{title:"Duration",key:"duration"},{title:"Actions",key:"actions",sortable:!1,width:80}],repairDialog:!1,repairContext:null,gapSampleInterval:"1m",db_shard:"0"}},computed:{sections(){return[{title:"Telemetry",items:this.metricsRows.filter(s=>s.type==="TLM")},{title:"Commands",items:this.metricsRows.filter(s=>s.type==="CMD")}]}},mounted(){this.fetchMetrics()},methods:{groupRowCount(s){return s.reduce((t,n)=>t+Number((n.raw||n).rowCount||0),0)},groupDiskSize(s){return s.reduce((t,n)=>t+Number((n.raw||n).diskSize||0),0)},formatBytes(s){if(s===0)return"0 B";const t=["B","KB","MB","GB","TB"],n=1024,a=Math.floor(Math.log(s)/Math.log(n));return`${(s/Math.pow(n,a)).toFixed(a===0?0:1)} ${t[a]}`},fetchMetrics(){this.metricsError=null,this.metricsRows=[],this.metricsLoading=!0,x("SELECT tableName, partitionCount, rowCount, diskSize FROM table_storage;",this.db_shard).then(s=>{const t=s.data.columns;this.metricsRows=s.data.rows.map(n=>{const a={};t.forEach((l,d)=>{a[l]=n[d]});const o=(a.tableName||"").split("__");return a.type=o[1]||"",a.target=o[2]||"",a.packet=o[3]||"",a})}).catch(s=>{s.response&&s.response.data?this.metricsError=s.response.data.message:this.metricsError=s.message}).finally(()=>{this.metricsLoading=!1})},dropTable(s){return x(`DROP TABLE '${s}';`,this.db_shard)},deleteTable(s){let t=s.split("__")[2]||s,n=s.split("__")[3]||s;this.$dialog.confirm(`Are you sure you want to drop table: ${s}? This removes ALL decommutated data for ${t} ${n}!`,{okText:"Delete",cancelText:"Cancel"}).then(()=>{this.dropTable(s).then(()=>{this.metricsRows=this.metricsRows.filter(a=>a.tableName!==s)}).catch(a=>{a.response&&a.response.data?this.metricsError=a.response.data.message:this.metricsError=a.message})})},deleteGroup(s){const t=s.map(a=>(a.raw||a).tableName);let n=t[0].split("__")[2];this.$dialog.confirm(`Are you sure you want to drop ${t.length} tables? This removes ALL decommutated data for ${n}!
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const S=require("./format-MMgAFAGt.cjs"),e=require("vue"),T=require("./CustomIcon-8F08upeg.cjs"),M={downloading:"Downloading files…",enabling_dedup:"Enabling DEDUP…",ingesting:"Ingesting packets…",dedup_cooldown:"Waiting for DEDUP cooldown…",disabling_dedup:"Disabling DEDUP…"},L={props:{modelValue:{type:Boolean,default:!1},context:{type:Object,required:!0}},emits:["update:modelValue","complete"],data(){return{loadingCandidates:!1,candidates:[],selectedKeys:[],targetVersion:"as_logged",bucketEnv:null,path:null,candidateHeaders:[{title:"File",key:"filename"},{title:"Key",key:"key"}],jobId:null,jobStatus:null,pollHandle:null,errorMessage:null,confirmCloseOpen:!1}},computed:{isRunning(){return this.jobStatus?["Queued","Running"].includes(this.jobStatus.state):!1},phaseLabel(){const s=this.jobStatus?.progress_phase;if(!s)return this.jobStatus?.state||"";if(s==="dedup_cooldown"){const t=this.cooldownRemaining;if(t!=null)return`Waiting for DEDUP cooldown (${t}s)…`}return M[s]||s},cooldownRemaining(){const s=this.jobStatus?.dedup_enabled_at,t=this.jobStatus?.dedup_cooldown_seconds;if(!s||!t)return null;const n=Date.now()/1e3,a=new Date(s).getTime()/1e3,o=Math.round(a+t-n);return Math.max(o,0)},progressPercent(){const s=this.jobStatus;return s?s.state==="Complete"?100:!s.progress_total||s.progress_total===0?0:Math.round(s.progress_current/s.progress_total*100):0}},watch:{modelValue(s){s&&this.fetchCandidates()}},mounted(){this.modelValue&&this.fetchCandidates()},beforeUnmount(){this.stopPolling()},methods:{close(){this.stopPolling();const s=this.jobStatus?.state==="Complete";this.resetState(),this.$emit("update:modelValue",!1),s&&this.$emit("complete")},attemptClose(){this.isRunning?this.confirmCloseOpen=!0:this.close()},confirmClose(){this.confirmCloseOpen=!1,this.close()},resetState(){this.candidates=[],this.selectedKeys=[],this.targetVersion="as_logged",this.bucketEnv=null,this.path=null,this.jobId=null,this.jobStatus=null,this.errorMessage=null,this.loadingCandidates=!1,this.confirmCloseOpen=!1},async fetchCandidates(){this.resetState(),this.loadingCandidates=!0;try{const s=await S.Fi.get("/openc3-api/storage/repair_candidates",{params:{scope:this.context.scope,target:this.context.target,packet:this.context.packet,cmd_or_tlm:this.context.cmdOrTlm,start_time:this.context.gap.startIso,end_time:this.context.gap.endIso}});this.candidates=s.data.files||[],this.bucketEnv=s.data.bucket,this.path=s.data.path,this.selectedKeys=this.candidates.map(t=>t.key)}catch(s){this.errorMessage=s.response?.data?.message||s.message}finally{this.loadingCandidates=!1}},async startReingest(){this.errorMessage=null;const s=this.selectedKeys.map(t=>this.path&&t.startsWith(this.path)?t.slice(this.path.length):t.split("/").pop());try{const t=await S.Fi.post("/openc3-api/storage/reingest",{data:{scope:this.context.scope,bucket:this.bucketEnv,path:this.path,files:s,target_version:this.targetVersion}});this.jobId=t.data.job_id,this.jobStatus={state:t.data.state},this.startPolling()}catch(t){this.errorMessage=t.response?.data?.message||t.message}},startPolling(){this.stopPolling(),this.pollHandle=setInterval(this.pollStatus,2e3),this.pollStatus()},stopPolling(){this.pollHandle&&(clearInterval(this.pollHandle),this.pollHandle=null)},async pollStatus(){if(this.jobId)try{const s=await S.Fi.get(`/openc3-api/storage/reingest/${this.jobId}`,{params:{scope:this.context.scope}});this.jobStatus=s.data,this.isRunning||this.stopPolling()}catch(s){this.errorMessage=s.response?.data?.message||s.message,this.stopPolling()}}}},I={key:0,class:"text-red monospace mb-4"},j={key:0,class:"d-flex align-center mb-4"},G={key:0,class:"text-medium-emphasis"},P={class:"mb-2"},A={class:"mt-4"},O={key:0},F={key:1},z={key:2},K={class:"text-red"},U={key:3},H={class:"text-orange"};function q(s,t,n,a,o,l){const d=e.resolveComponent("v-card-title"),h=e.resolveComponent("v-card-subtitle"),g=e.resolveComponent("v-progress-circular"),C=e.resolveComponent("v-data-table"),_=e.resolveComponent("v-radio"),w=e.resolveComponent("v-radio-group"),m=e.resolveComponent("v-table"),v=e.resolveComponent("v-progress-linear"),b=e.resolveComponent("v-card-text"),i=e.resolveComponent("v-spacer"),c=e.resolveComponent("v-btn"),p=e.resolveComponent("v-card-actions"),f=e.resolveComponent("v-card"),V=e.resolveComponent("v-dialog");return e.openBlock(),e.createBlock(V,{"model-value":n.modelValue,"max-width":"900",persistent:""},{default:e.withCtx(()=>[e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(d,{class:"d-flex align-center"},{default:e.withCtx(()=>[e.createTextVNode(" Repair Gap: "+e.toDisplayString(n.context.target)+" "+e.toDisplayString(n.context.packet),1)]),_:1}),n.context.gap?(e.openBlock(),e.createBlock(h,{key:0},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(n.context.gap.start)+" — "+e.toDisplayString(n.context.gap.end)+" ("+e.toDisplayString(n.context.gap.duration)+") ",1)]),_:1})):e.createCommentVNode("",!0),e.createVNode(b,{style:{"max-height":"75vh","overflow-y":"auto"}},{default:e.withCtx(()=>[o.errorMessage?(e.openBlock(),e.createElementBlock("div",I," Error: "+e.toDisplayString(o.errorMessage),1)):e.createCommentVNode("",!0),o.jobId?o.jobStatus?(e.openBlock(),e.createElementBlock(e.Fragment,{key:2},[e.createVNode(m,{density:"compact",class:"monospace mb-4"},{default:e.withCtx(()=>[e.createElementVNode("tbody",null,[e.createElementVNode("tr",null,[t[8]||(t[8]=e.createElementVNode("td",{class:"font-weight-bold"},"Job",-1)),e.createElementVNode("td",null,e.toDisplayString(o.jobId),1)]),e.createElementVNode("tr",null,[t[9]||(t[9]=e.createElementVNode("td",{class:"font-weight-bold"},"State",-1)),e.createElementVNode("td",null,e.toDisplayString(o.jobStatus.state),1)]),e.createElementVNode("tr",null,[t[10]||(t[10]=e.createElementVNode("td",{class:"font-weight-bold"},"Phase",-1)),e.createElementVNode("td",null,e.toDisplayString(l.phaseLabel),1)]),o.jobStatus.target_version?(e.openBlock(),e.createElementBlock("tr",O,[t[11]||(t[11]=e.createElementVNode("td",{class:"font-weight-bold"},"Target Version",-1)),e.createElementVNode("td",null,e.toDisplayString(o.jobStatus.target_version),1)])):e.createCommentVNode("",!0),o.jobStatus.packets_written!==void 0?(e.openBlock(),e.createElementBlock("tr",F,[t[12]||(t[12]=e.createElementVNode("td",{class:"font-weight-bold"},"Packets Written",-1)),e.createElementVNode("td",null,e.toDisplayString(o.jobStatus.packets_written.toLocaleString()),1)])):e.createCommentVNode("",!0),o.jobStatus.error?(e.openBlock(),e.createElementBlock("tr",z,[t[13]||(t[13]=e.createElementVNode("td",{class:"font-weight-bold text-red"},"Error",-1)),e.createElementVNode("td",K,e.toDisplayString(o.jobStatus.error),1)])):e.createCommentVNode("",!0),o.jobStatus.warnings&&o.jobStatus.warnings.length?(e.openBlock(),e.createElementBlock("tr",U,[t[14]||(t[14]=e.createElementVNode("td",{class:"font-weight-bold text-orange"},"Warnings",-1)),e.createElementVNode("td",H,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.jobStatus.warnings,(y,D)=>(e.openBlock(),e.createElementBlock("div",{key:D},e.toDisplayString(y),1))),128))])])):e.createCommentVNode("",!0)])]),_:1}),e.createVNode(v,{"model-value":l.progressPercent,indeterminate:l.progressPercent===0&&l.isRunning,class:"mb-2"},null,8,["model-value","indeterminate"])],64)):e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[o.loadingCandidates?(e.openBlock(),e.createElementBlock("div",j,[e.createVNode(g,{indeterminate:"",size:"24",class:"mr-3"}),t[4]||(t[4]=e.createTextVNode(" Searching bucket for raw log files that cover this gap… ",-1))])):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[o.candidates.length===0?(e.openBlock(),e.createElementBlock("div",G," No raw log files cover this gap window. Reingest is not available — the data may have been written from a source that skipped raw logging, or the logs have been deleted. ")):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createElementVNode("div",P,e.toDisplayString(o.candidates.length)+" raw log file(s) overlap this window. Select which to reingest: ",1),e.createVNode(C,{modelValue:o.selectedKeys,"onUpdate:modelValue":t[0]||(t[0]=y=>o.selectedKeys=y),headers:o.candidateHeaders,items:o.candidates,"item-value":"key","show-select":"",class:"monospace","items-per-page":20,density:"compact","data-test":"repair-candidates"},null,8,["modelValue","headers","items"]),e.createElementVNode("div",A,[t[7]||(t[7]=e.createElementVNode("div",{class:"text-subtitle-2 font-weight-bold mb-1"}," Target Definition Version ",-1)),e.createVNode(w,{modelValue:o.targetVersion,"onUpdate:modelValue":t[1]||(t[1]=y=>o.targetVersion=y),"hide-details":"",density:"compact","data-test":"repair-version"},{default:e.withCtx(()=>[e.createVNode(_,{value:"as_logged","data-test":"repair-version-as-logged"},{label:e.withCtx(()=>[...t[5]||(t[5]=[e.createElementVNode("div",{style:{"padding-left":"10px"}},[e.createElementVNode("div",null,"As logged (default)"),e.createElementVNode("div",{class:"text-caption text-medium-emphasis"}," Decode each file with the cmd/tlm definition that was in effect when the data was originally logged. Safest for historical fidelity — preserves packet layouts as they existed at that time. "),e.createElementVNode("div",{class:"text-caption text-medium-emphasis mt-1"}," If an item's type has changed since the log was written (e.g. STRING → FLOAT), QuestDB column types are kept as-is; historical values are cast to fit the current column, and any values that can't cast are stored as NULL. ")],-1)])]),_:1}),e.createVNode(_,{value:"current","data-test":"repair-version-current"},{label:e.withCtx(()=>[...t[6]||(t[6]=[e.createElementVNode("div",{style:{"padding-left":"10px"}},[e.createElementVNode("div",null,"Current"),e.createElementVNode("div",{class:"text-caption text-medium-emphasis"}," Decode all files with the latest cmd/tlm definition. Choose this when the historical definition had a bug that you've since fixed, and you want the reingested data decoded with the corrected layout. ")],-1)])]),_:1})]),_:1},8,["modelValue"])])],64))],64))],64))]),_:1}),e.createVNode(p,{class:"px-4 pb-4"},{default:e.withCtx(()=>[e.createVNode(i),o.jobId?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(c,{key:0,color:"warning",variant:"elevated",disabled:o.loadingCandidates||o.candidates.length===0||o.selectedKeys.length===0,"data-test":"repair-reingest",onClick:l.startReingest},{default:e.withCtx(()=>[e.createTextVNode(" Reingest "+e.toDisplayString(o.selectedKeys.length),1)]),_:1},8,["disabled","onClick"])),e.createVNode(c,{variant:"text","data-test":"repair-close",onClick:l.attemptClose},{default:e.withCtx(()=>[...t[15]||(t[15]=[e.createTextVNode(" Close ",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1}),e.createVNode(V,{modelValue:o.confirmCloseOpen,"onUpdate:modelValue":t[3]||(t[3]=y=>o.confirmCloseOpen=y),"max-width":"500",persistent:""},{default:e.withCtx(()=>[e.createVNode(f,null,{default:e.withCtx(()=>[e.createVNode(d,null,{default:e.withCtx(()=>[...t[16]||(t[16]=[e.createTextVNode("Reingest Still Running",-1)])]),_:1}),e.createVNode(b,null,{default:e.withCtx(()=>[...t[17]||(t[17]=[e.createTextVNode(" The reingest job is still in progress. Closing this dialog will not stop the job, but you will lose visibility into its status. Are you sure you want to close? ",-1)])]),_:1}),e.createVNode(p,{class:"px-4 pb-4"},{default:e.withCtx(()=>[e.createVNode(i),e.createVNode(c,{variant:"text","data-test":"repair-close-cancel",onClick:t[2]||(t[2]=y=>o.confirmCloseOpen=!1)},{default:e.withCtx(()=>[...t[18]||(t[18]=[e.createTextVNode(" Keep Watching ",-1)])]),_:1}),e.createVNode(c,{color:"warning",variant:"elevated","data-test":"repair-close-confirm",onClick:l.confirmClose},{default:e.withCtx(()=>[...t[19]||(t[19]=[e.createTextVNode(" Close Anyway ",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1})]),_:1},8,["modelValue"])]),_:1},8,["model-value"])}const Q=T._export_sfc(L,[["render",q],["__scopeId","data-v-2ab87eb9"]]);async function x(s,t,n=3){for(let a=1;a<=n;a++)try{let o="/openc3-api/tsdb/exec";return t&&t!=="0"&&(o+=`?db_shard=${t}`),await S.Fi.post(o,{data:s,headers:{Accept:"application/json","Content-Type":"text/plain"}})}catch(o){const l=o.response?.data?.message||o.message||"";if((l.includes("PQconsumeInput")||l.includes("server closed the connection"))&&a<n){await new Promise(h=>setTimeout(h,1e3*a));continue}throw o}}const W={components:{RepairGapDialog:Q},data(){return{metricsRows:[],metricsError:null,metricsLoading:!1,metricsGroupBy:[{key:"target",order:"asc"}],metricsHeaders:[{title:"Packet",key:"packet"},{title:"Table Name",key:"tableName"},{title:"Partition Count",key:"partitionCount"},{title:"Row Count",key:"rowCount"},{title:"Disk Size",key:"diskSize"},{title:"Actions",key:"actions",sortable:!1}],gapDialog:!1,gapDialogTitle:"",gapLoading:!1,gapProgress:0,gapError:null,gapSummary:null,gapGroupResults:null,gapHeaders:[{title:"Gap Start",key:"start"},{title:"Gap End",key:"end"},{title:"Duration",key:"duration"},{title:"Actions",key:"actions",sortable:!1,width:80}],repairDialog:!1,repairContext:null,gapSampleInterval:"1m",db_shard:"0"}},computed:{sections(){return[{title:"Telemetry",items:this.metricsRows.filter(s=>s.type==="TLM")},{title:"Commands",items:this.metricsRows.filter(s=>s.type==="CMD")}]}},mounted(){this.fetchMetrics()},methods:{groupRowCount(s){return s.reduce((t,n)=>t+Number((n.raw||n).rowCount||0),0)},groupDiskSize(s){return s.reduce((t,n)=>t+Number((n.raw||n).diskSize||0),0)},formatBytes(s){if(s===0)return"0 B";const t=["B","KB","MB","GB","TB"],n=1024,a=Math.floor(Math.log(s)/Math.log(n));return`${(s/Math.pow(n,a)).toFixed(a===0?0:1)} ${t[a]}`},fetchMetrics(){this.metricsError=null,this.metricsRows=[],this.metricsLoading=!0,x("SELECT tableName, partitionCount, rowCount, diskSize FROM table_storage;",this.db_shard).then(s=>{const t=s.data.columns;this.metricsRows=s.data.rows.map(n=>{const a={};t.forEach((l,d)=>{a[l]=n[d]});const o=(a.tableName||"").split("__");return a.type=o[1]||"",a.target=o[2]||"",a.packet=o[3]||"",a})}).catch(s=>{s.response&&s.response.data?this.metricsError=s.response.data.message:this.metricsError=s.message}).finally(()=>{this.metricsLoading=!1})},dropTable(s){return x(`DROP TABLE '${s}';`,this.db_shard)},deleteTable(s){let t=s.split("__")[2]||s,n=s.split("__")[3]||s;this.$dialog.confirm(`Are you sure you want to drop table: ${s}? This removes ALL decommutated data for ${t} ${n}!`,{okText:"Delete",cancelText:"Cancel"}).then(()=>{this.dropTable(s).then(()=>{this.metricsRows=this.metricsRows.filter(a=>a.tableName!==s)}).catch(a=>{a.response&&a.response.data?this.metricsError=a.response.data.message:this.metricsError=a.message})})},deleteGroup(s){const t=s.map(a=>(a.raw||a).tableName);let n=t[0].split("__")[2];this.$dialog.confirm(`Are you sure you want to drop ${t.length} tables? This removes ALL decommutated data for ${n}!
2
2
 
3
3
  ${t.join(`
4
4
  `)}`,{okText:"Delete",cancelText:"Cancel"}).then(()=>{const a=new Set(t);Promise.all(t.map(o=>this.dropTable(o))).then(()=>{this.metricsRows=this.metricsRows.filter(o=>!a.has(o.tableName))}).catch(o=>{o.response&&o.response.data?this.metricsError=o.response.data.message:this.metricsError=o.message})})},formatDuration(s){const t=Math.floor(s/1e3),n=Math.floor(t/86400),a=Math.floor(t%86400/3600),o=Math.floor(t%3600/60),l=[];return n&&l.push(`${n}d`),a&&l.push(`${a}h`),o&&l.push(`${o}m`),l.length||l.push(`${t}s`),l.join(" ")},formatTimestamp(s){return new Date(s).toISOString().replace("T"," ").replace(".000Z","Z")},parseSampleIntervalMs(s){const t=String(s||"").trim().match(/^(\d+)\s*([smhd])$/i);return t?Number.parseInt(t[1],10)*{s:1e3,m:6e4,h:36e5,d:864e5}[t[2].toLowerCase()]:null},async fetchTableGaps(s){const t=(this.gapSampleInterval||"1m").trim(),n=this.parseSampleIntervalMs(t);if(!n)throw new Error(`Invalid sample interval '${t}'. Use a number followed by s, m, h, or d (e.g. 5s, 1m, 2h).`);const a=await x(`SELECT first(PACKET_TIMESECONDS) as first_ts, last(PACKET_TIMESECONDS) as last_ts FROM '${s}';`,this.db_shard),o=a.data.columns,l=a.data.rows[0],d={};o.forEach((i,c)=>{d[i]=l[c]});const h=d.first_ts,g=d.last_ts,C=new Date(g)-new Date(h),_=await x(`(SELECT PACKET_TIMESECONDS, count() as cnt FROM '${s}' SAMPLE BY ${t} FILL(NULL)) WHERE cnt IS NULL`,this.db_shard),w=_.data.columns,m=_.data.rows.map(i=>{const c={};return w.forEach((p,f)=>{c[p]=i[f]}),c}),v=[],b=(i,c)=>{const p=new Date(i).getTime(),f=new Date(c).getTime()+n;return{start:this.formatTimestamp(i),end:this.formatTimestamp(new Date(f)),duration:this.formatDuration(f-p),startIso:new Date(p).toISOString(),endIso:new Date(f).toISOString()}};if(m.length>0){let i=m[0].PACKET_TIMESECONDS,c=i;for(let p=1;p<m.length;p++){const f=new Date(c);new Date(m[p].PACKET_TIMESECONDS)-f>n&&(v.push(b(i,c)),i=m[p].PACKET_TIMESECONDS),c=m[p].PACKET_TIMESECONDS}v.push(b(i,c))}return{firstTs:this.formatTimestamp(h),lastTs:this.formatTimestamp(g),timeSpan:this.formatDuration(C),gaps:v}},async analyzeDataGap(s){this.gapDialogTitle=s,this.gapDialog=!0,this.gapLoading=!0,this.gapProgress=0,this.gapError=null,this.gapSummary=null,this.gapGroupResults=null;try{this.gapSummary=await this.fetchTableGaps(s)}catch(t){this.gapError=t.response?.data?.message||t.message}finally{this.gapLoading=!1}},async analyzeGroupDataGap(s){const t=s.map(a=>(a.raw||a).tableName),n=(s[0].raw||s[0]).target;this.gapDialogTitle=`${n} (${t.length} tables)`,this.gapDialog=!0,this.gapLoading=!0,this.gapProgress=0,this.gapError=null,this.gapSummary=null,this.gapGroupResults=null;try{const a=[];for(let o=0;o<t.length;o++){this.gapProgress=Math.round((o+1)/t.length*100);try{const l=await this.fetchTableGaps(t[o]);if(l.gaps.length>0){const d=t[o].split("__");a.push({tableName:t[o],packet:d[3]||t[o],...l})}}catch{}}this.gapGroupResults={totalTables:t.length,withGaps:a}}catch(a){this.gapError=a.response?.data?.message||a.message}finally{this.gapLoading=!1}},parseTableName(s){const t=s.split("__");return t.length<4?null:{scope:t[0],cmdOrTlm:t[1],target:t[2],packet:t[3]}},isTlmTable(s){return this.parseTableName(s)?.cmdOrTlm==="TLM"},openRepair(s,t){const n=this.parseTableName(t);n&&(this.repairContext={tableName:t,...n,gap:s},this.repairDialog=!0)},onRepairComplete(){this.gapGroupResults||this.gapDialogTitle&&this.analyzeDataGap(this.gapDialogTitle)}}},Y={key:0,class:"mt-2 text-red monospace"},Z={key:0},J=["colspan"],X={class:"font-weight-bold"},$={class:"ml-4 text-medium-emphasis"},ee={key:1,class:"text-red monospace mb-4"},te={key:0},oe={key:1,class:"text-medium-emphasis"},se={key:0,class:"text-medium-emphasis"},ae={key:1},ne={class:"mb-4 text-medium-emphasis"},le={class:"text-subtitle-1 font-weight-bold mb-1"},re={class:"text-medium-emphasis monospace mb-2"};function ie(s,t,n,a,o,l){const d=e.resolveComponent("v-card-title"),h=e.resolveComponent("v-card-text"),g=e.resolveComponent("v-btn"),C=e.resolveComponent("v-text-field"),_=e.resolveComponent("v-spacer"),w=e.resolveComponent("v-card-actions"),m=e.resolveComponent("v-icon"),v=e.resolveComponent("v-list-item"),b=e.resolveComponent("v-list"),i=e.resolveComponent("v-menu"),c=e.resolveComponent("v-data-table"),p=e.resolveComponent("v-card"),f=e.resolveComponent("v-progress-linear"),V=e.resolveComponent("v-table"),y=e.resolveComponent("v-dialog"),D=e.resolveComponent("repair-gap-dialog");return e.openBlock(),e.createElementBlock("div",null,[e.createVNode(p,null,{default:e.withCtx(()=>[e.createVNode(d,null,{default:e.withCtx(()=>[...t[5]||(t[5]=[e.createTextVNode(" QuestDB Table Storage Metrics ",-1)])]),_:1}),e.createVNode(h,null,{default:e.withCtx(()=>[o.metricsError?(e.openBlock(),e.createElementBlock("div",Y," Error: "+e.toDisplayString(o.metricsError),1)):e.createCommentVNode("",!0)]),_:1}),e.createVNode(w,{class:"px-2"},{default:e.withCtx(()=>[e.createVNode(g,{loading:o.metricsLoading,color:"success",variant:"text","data-test":"tsdb-metrics-refresh",onClick:l.fetchMetrics},{default:e.withCtx(()=>[...t[6]||(t[6]=[e.createTextVNode(" Refresh ",-1)])]),_:1},8,["loading","onClick"]),e.createVNode(C,{modelValue:o.db_shard,"onUpdate:modelValue":t[0]||(t[0]=r=>o.db_shard=r),type:"number",min:"0",label:"DB Shard",hint:"DB Shard is N/A in Core","hide-details":"",density:"compact",style:{"max-width":"100px"},class:"ml-4"},null,8,["modelValue"]),e.createVNode(_),e.createVNode(C,{modelValue:o.gapSampleInterval,"onUpdate:modelValue":t[1]||(t[1]=r=>o.gapSampleInterval=r),label:"Data Gap Sample Interval",hint:"QuestDB SAMPLE BY duration (e.g. 5s, 1m, 10m, 1h)","persistent-hint":"",density:"compact","hide-details":"auto",style:{"max-width":"260px"},"data-test":"gap-sample-interval"},null,8,["modelValue"])]),_:1}),o.metricsRows.length?(e.openBlock(),e.createElementBlock("div",Z,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.sections,(r,k)=>(e.openBlock(),e.createElementBlock(e.Fragment,{key:r.title},[e.createElementVNode("h3",{class:e.normalizeClass(["text-h6 ml-2",k===0?"mt-4":"mt-6"])},e.toDisplayString(r.title),3),e.createVNode(c,{headers:o.metricsHeaders,items:r.items,"group-by":o.metricsGroupBy,class:"monospace","items-per-page":50,density:"compact"},{"group-header":e.withCtx(({item:u,columns:N,toggleGroup:B,isGroupOpen:R})=>[e.createElementVNode("tr",null,[e.createElementVNode("td",{colspan:N.length-1},[e.createVNode(g,{icon:R(u)?"$expand":"$next",size:"small",variant:"text",onClick:E=>B(u)},null,8,["icon","onClick"]),e.createElementVNode("span",X,e.toDisplayString(u.value),1),e.createElementVNode("span",$," Packets: "+e.toDisplayString(u.items.length)+" — Rows: "+e.toDisplayString(l.groupRowCount(u.items).toLocaleString())+" — Disk: "+e.toDisplayString(l.formatBytes(l.groupDiskSize(u.items))),1)],8,J),e.createElementVNode("td",null,[e.createVNode(i,null,{activator:e.withCtx(({props:E})=>[e.createVNode(m,e.mergeProps({ref_for:!0},E,{icon:"mdi-dots-horizontal","data-test":"group-actions"}),null,16)]),default:e.withCtx(()=>[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(v,{title:"Analyze Data Gaps","prepend-icon":"mdi-chart-timeline-variant-shimmer","data-test":"group-analyze-gap",onClick:E=>l.analyzeGroupDataGap(u.items)},null,8,["onClick"]),e.createVNode(v,{title:"Delete All","prepend-icon":"mdi-delete","data-test":"group-delete",onClick:E=>l.deleteGroup(u.items)},null,8,["onClick"])]),_:2},1024)]),_:2},1024)])])]),"item.diskSize":e.withCtx(({item:u})=>[e.createTextVNode(e.toDisplayString(l.formatBytes(u.diskSize)),1)]),"item.rowCount":e.withCtx(({item:u})=>[e.createTextVNode(e.toDisplayString(Number(u.rowCount).toLocaleString()),1)]),"item.actions":e.withCtx(({item:u})=>[e.createVNode(i,null,{activator:e.withCtx(({props:N})=>[e.createVNode(m,e.mergeProps({ref_for:!0},N,{icon:"mdi-dots-horizontal","data-test":"row-actions"}),null,16)]),default:e.withCtx(()=>[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(v,{title:"Analyze Data Gap","prepend-icon":"mdi-chart-timeline-variant-shimmer","data-test":"row-analyze-gap",onClick:N=>l.analyzeDataGap(u.tableName)},null,8,["onClick"]),e.createVNode(v,{title:"Delete","prepend-icon":"mdi-delete","data-test":"row-delete",onClick:N=>l.deleteTable(u.tableName)},null,8,["onClick"])]),_:2},1024)]),_:2},1024)]),_:1},8,["headers","items","group-by"])],64))),128))])):e.createCommentVNode("",!0)]),_:1}),e.createVNode(y,{modelValue:o.gapDialog,"onUpdate:modelValue":t[3]||(t[3]=r=>o.gapDialog=r),"max-width":"900"},{default:e.withCtx(()=>[e.createVNode(p,null,{default:e.withCtx(()=>[e.createVNode(d,{class:"d-flex align-center"},{default:e.withCtx(()=>[e.createTextVNode(" Data Gap Analysis: "+e.toDisplayString(o.gapDialogTitle)+" ",1),e.createVNode(_),e.createVNode(g,{icon:"mdi-close",variant:"text",onClick:t[2]||(t[2]=r=>o.gapDialog=!1)})]),_:1}),e.createVNode(h,{style:{"max-height":"80vh","overflow-y":"auto"}},{default:e.withCtx(()=>[o.gapLoading?(e.openBlock(),e.createBlock(f,{key:0,"model-value":o.gapProgress,indeterminate:o.gapProgress===0,class:"mb-4"},null,8,["model-value","indeterminate"])):e.createCommentVNode("",!0),o.gapError?(e.openBlock(),e.createElementBlock("div",ee," Error: "+e.toDisplayString(o.gapError),1)):e.createCommentVNode("",!0),!o.gapLoading&&!o.gapError&&o.gapSummary?(e.openBlock(),e.createElementBlock(e.Fragment,{key:2},[e.createVNode(V,{density:"compact",class:"monospace mb-4"},{default:e.withCtx(()=>[e.createElementVNode("tbody",null,[e.createElementVNode("tr",null,[t[7]||(t[7]=e.createElementVNode("td",{class:"font-weight-bold"},"First Record",-1)),e.createElementVNode("td",null,e.toDisplayString(o.gapSummary.firstTs),1)]),e.createElementVNode("tr",null,[t[8]||(t[8]=e.createElementVNode("td",{class:"font-weight-bold"},"Last Record",-1)),e.createElementVNode("td",null,e.toDisplayString(o.gapSummary.lastTs),1)]),e.createElementVNode("tr",null,[t[9]||(t[9]=e.createElementVNode("td",{class:"font-weight-bold"},"Total Time Span",-1)),e.createElementVNode("td",null,e.toDisplayString(o.gapSummary.timeSpan),1)]),e.createElementVNode("tr",null,[t[10]||(t[10]=e.createElementVNode("td",{class:"font-weight-bold"},"Gaps Found",-1)),e.createElementVNode("td",null,e.toDisplayString(o.gapSummary.gaps.length),1)])])]),_:1}),o.gapSummary.gaps.length?(e.openBlock(),e.createElementBlock("div",te,[t[11]||(t[11]=e.createElementVNode("h4",{class:"text-subtitle-1 font-weight-bold mb-2"}," Data Gaps (periods with no data) ",-1)),e.createVNode(c,{headers:o.gapHeaders,items:o.gapSummary.gaps,class:"monospace","items-per-page":20,density:"compact"},{"item.actions":e.withCtx(({item:r})=>[l.isTlmTable(o.gapDialogTitle)?(e.openBlock(),e.createBlock(g,{key:0,icon:"mdi-wrench",size:"small",variant:"text","data-test":"gap-repair",title:"Repair (reingest raw logs)",onClick:k=>l.openRepair(r,o.gapDialogTitle)},null,8,["onClick"])):e.createCommentVNode("",!0)]),_:1},8,["headers","items"])])):(e.openBlock(),e.createElementBlock("div",oe," No data gaps detected (sampled at "+e.toDisplayString(o.gapSampleInterval)+" intervals). ",1))],64)):e.createCommentVNode("",!0),!o.gapLoading&&!o.gapError&&o.gapGroupResults?(e.openBlock(),e.createElementBlock(e.Fragment,{key:3},[o.gapGroupResults.withGaps.length===0?(e.openBlock(),e.createElementBlock("div",se," No data gaps detected across "+e.toDisplayString(o.gapGroupResults.totalTables)+" tables (sampled at "+e.toDisplayString(o.gapSampleInterval)+" intervals). ",1)):(e.openBlock(),e.createElementBlock("div",ae,[e.createElementVNode("div",ne,e.toDisplayString(o.gapGroupResults.withGaps.length)+" of "+e.toDisplayString(o.gapGroupResults.totalTables)+" tables have data gaps. ",1),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(o.gapGroupResults.withGaps,r=>(e.openBlock(),e.createElementBlock("div",{key:r.tableName,class:"mb-6"},[e.createElementVNode("h4",le,e.toDisplayString(r.packet),1),e.createElementVNode("div",re,e.toDisplayString(r.firstTs)+" to "+e.toDisplayString(r.lastTs)+" ("+e.toDisplayString(r.timeSpan)+") — "+e.toDisplayString(r.gaps.length)+" gap(s) ",1),e.createVNode(c,{headers:o.gapHeaders,items:r.gaps,class:"monospace","items-per-page":10,density:"compact"},{"item.actions":e.withCtx(({item:k})=>[l.isTlmTable(r.tableName)?(e.openBlock(),e.createBlock(g,{key:0,icon:"mdi-wrench",size:"small",variant:"text","data-test":"gap-repair",title:"Repair (reingest raw logs)",onClick:u=>l.openRepair(k,r.tableName)},null,8,["onClick"])):e.createCommentVNode("",!0)]),_:2},1032,["headers","items"])]))),128))]))],64)):e.createCommentVNode("",!0)]),_:1})]),_:1})]),_:1},8,["modelValue"]),o.repairContext?(e.openBlock(),e.createBlock(D,{key:0,modelValue:o.repairDialog,"onUpdate:modelValue":t[4]||(t[4]=r=>o.repairDialog=r),context:o.repairContext,onComplete:l.onRepairComplete},null,8,["modelValue","context","onComplete"])):e.createCommentVNode("",!0)])}const ce=T._export_sfc(W,[["render",ie],["__scopeId","data-v-25188e19"]]),de={data(){return{sqlText:"",db_shard:"0",columns:[],rows:[],errorMessage:null,loading:!1}},computed:{tableHeaders(){return this.columns.map(s=>({title:s,key:s}))}},methods:{commandKeydown(s){(s.metaKey||s.ctrlKey)&&s.key==="Enter"&&this.executeQuery()},executeQuery(){this.errorMessage=null,this.columns=[],this.rows=[],this.loading=!0,x(this.sqlText,this.db_shard).then(s=>{this.columns=s.data.columns,this.rows=s.data.rows.map(t=>{const n={};return this.columns.forEach((a,o)=>{n[a]=t[o]}),n})}).catch(s=>{s.response&&s.response.data?this.errorMessage=s.response.data.message:this.errorMessage=s.message}).finally(()=>{this.loading=!1})}}},me={key:0,class:"mt-2 text-red monospace"};function pe(s,t,n,a,o,l){const d=e.resolveComponent("v-card-title"),h=e.resolveComponent("v-card-subtitle"),g=e.resolveComponent("v-textarea"),C=e.resolveComponent("v-card-text"),_=e.resolveComponent("v-btn"),w=e.resolveComponent("v-text-field"),m=e.resolveComponent("v-card-actions"),v=e.resolveComponent("v-data-table"),b=e.resolveComponent("v-card");return e.openBlock(),e.createBlock(b,null,{default:e.withCtx(()=>[e.createVNode(d,null,{default:e.withCtx(()=>[...t[2]||(t[2]=[e.createTextVNode(" Send SQL Queries to QuestDB ",-1)])]),_:1}),e.createVNode(h,null,{default:e.withCtx(()=>[...t[3]||(t[3]=[e.createTextVNode(" THIS IS DANGEROUS! This allows you to interact directly with the underlying QuestDB time series database, making it easy to modify or delete data. ",-1),e.createElementVNode("br",null,null,-1),e.createElementVNode("br",null,null,-1),e.createTextVNode(" Enter SQL queries like: ",-1),e.createElementVNode("code",null," SELECT * FROM DEFAULT__TLM__INST__HEALTH_STATUS LIMIT 10 ",-1),e.createTextVNode(" or ",-1),e.createElementVNode("code",null,"SHOW TABLES",-1)])]),_:1}),e.createVNode(C,{class:"pb-0 ml-2"},{default:e.withCtx(()=>[e.createVNode(g,{modelValue:o.sqlText,"onUpdate:modelValue":t[0]||(t[0]=i=>o.sqlText=i),"hide-details":"",label:"SQL query",class:"monospace",rows:"3",onKeydown:l.commandKeydown},null,8,["modelValue","onKeydown"]),o.errorMessage?(e.openBlock(),e.createElementBlock("div",me," Error: "+e.toDisplayString(o.errorMessage),1)):e.createCommentVNode("",!0)]),_:1}),e.createVNode(m,{class:"px-2"},{default:e.withCtx(()=>[e.createVNode(_,{disabled:!o.sqlText.length,loading:o.loading,color:"success",variant:"text","data-test":"tsdb-execute",onClick:l.executeQuery},{default:e.withCtx(()=>[...t[4]||(t[4]=[e.createTextVNode(" Execute ",-1)])]),_:1},8,["disabled","loading","onClick"]),e.createVNode(w,{modelValue:o.db_shard,"onUpdate:modelValue":t[1]||(t[1]=i=>o.db_shard=i),type:"number",min:"0",label:"DB Shard","hide-details":"",density:"compact",style:{"max-width":"100px"},class:"ml-4"},null,8,["modelValue"])]),_:1}),o.columns.length?(e.openBlock(),e.createBlock(v,{key:0,headers:l.tableHeaders,items:o.rows,class:"monospace","items-per-page":50,density:"compact"},null,8,["headers","items"])):e.createCommentVNode("",!0)]),_:1})}const ue=T._export_sfc(de,[["render",pe],["__scopeId","data-v-4c0d0a5c"]]),ge={components:{TsdbMetrics:ce,TsdbQueries:ue},data(){return{activeTab:"metrics"}}};function he(s,t,n,a,o,l){const d=e.resolveComponent("v-tab"),h=e.resolveComponent("v-tabs"),g=e.resolveComponent("tsdb-metrics"),C=e.resolveComponent("v-window-item"),_=e.resolveComponent("tsdb-queries"),w=e.resolveComponent("v-window");return e.openBlock(),e.createElementBlock("div",null,[e.createVNode(h,{modelValue:o.activeTab,"onUpdate:modelValue":t[0]||(t[0]=m=>o.activeTab=m)},{default:e.withCtx(()=>[e.createVNode(d,{value:"metrics","data-test":"tsdb-metrics-tab"},{default:e.withCtx(()=>[...t[2]||(t[2]=[e.createTextVNode("Metrics",-1)])]),_:1}),e.createVNode(d,{value:"queries","data-test":"tsdb-queries-tab"},{default:e.withCtx(()=>[...t[3]||(t[3]=[e.createTextVNode("Queries",-1)])]),_:1})]),_:1},8,["modelValue"]),e.createVNode(w,{modelValue:o.activeTab,"onUpdate:modelValue":t[1]||(t[1]=m=>o.activeTab=m)},{default:e.withCtx(()=>[e.createVNode(C,{value:"metrics"},{default:e.withCtx(()=>[e.createVNode(g)]),_:1}),e.createVNode(C,{value:"queries"},{default:e.withCtx(()=>[e.createVNode(_)]),_:1})]),_:1},8,["modelValue"])])}const _e=T._export_sfc(ge,[["render",he]]);exports.default=_e;
5
- //# sourceMappingURL=TsdbTab-d1l9Ak2R.cjs.map
5
+ //# sourceMappingURL=TsdbTab-DatsFS_R.cjs.map