@futdevpro/ccap 1.1.3002 → 1.1.3008

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 (186) hide show
  1. package/client-dist/{agent-instances.module-VLGX2Z7Z.js → agent-instances.module-GN4PQAF3.js} +2 -2
  2. package/client-dist/ca.module-CKYKW3JK.js +5 -0
  3. package/client-dist/ca.module-CKYKW3JK.js.map +7 -0
  4. package/client-dist/{cc-usage-dashboard.component-D6CNJHB5.js → cc-usage-dashboard.component-Q5JJBLZ4.js} +2 -2
  5. package/client-dist/{cc.module-T3NJWMZ5.js → cc.module-PWOSEU35.js} +4 -4
  6. package/client-dist/cc.module-PWOSEU35.js.map +7 -0
  7. package/client-dist/{chunk-I4V3JDZC.js → chunk-25I4EVM2.js} +2 -2
  8. package/client-dist/{chunk-E6DWNZNG.js → chunk-2EZEKYOT.js} +2 -2
  9. package/client-dist/{chunk-QXIUTGNM.js → chunk-2UGNMPLF.js} +2 -2
  10. package/client-dist/{chunk-ZZ7RWOLH.js → chunk-3EZGW2AE.js} +2 -2
  11. package/client-dist/{chunk-2IYGO6RM.js → chunk-4KJ53ND4.js} +2 -2
  12. package/client-dist/{chunk-ZZRTMXBT.js → chunk-4UCTQFBQ.js} +2 -2
  13. package/client-dist/{chunk-P7Z33WJF.js → chunk-543UYBGO.js} +2 -2
  14. package/client-dist/{chunk-SJ6KKDJT.js → chunk-5ZSG63JI.js} +2 -2
  15. package/client-dist/{chunk-NCOPOED7.js → chunk-75PLAFQN.js} +2 -2
  16. package/client-dist/{chunk-WNQYZI4D.js → chunk-77DEVH3B.js} +2 -2
  17. package/client-dist/{chunk-W7OH67K2.js → chunk-7SMKTOH2.js} +2 -2
  18. package/client-dist/{chunk-JLF2BDJU.js → chunk-7Y72ZMAB.js} +2 -2
  19. package/client-dist/{chunk-GNWPRBF5.js → chunk-A2QJB3E4.js} +2 -2
  20. package/client-dist/{chunk-DPXSAO23.js → chunk-ALW7KZ7Q.js} +2 -2
  21. package/client-dist/{chunk-IGWJMU5B.js → chunk-AON3XCTS.js} +2 -2
  22. package/client-dist/{chunk-FOL6X3TR.js → chunk-BHJM6S4T.js} +2 -2
  23. package/client-dist/{chunk-7SCYMYZG.js → chunk-EK4MRIFY.js} +2 -2
  24. package/client-dist/{chunk-3JQ2UHMM.js → chunk-FSZ2PEZ2.js} +2 -2
  25. package/client-dist/{chunk-SJTW4HLQ.js → chunk-GE472LIK.js} +2 -2
  26. package/client-dist/{chunk-64K7CP3A.js → chunk-GETS4G5N.js} +2 -2
  27. package/client-dist/{chunk-3SYXOECP.js → chunk-GNA4E3CW.js} +2 -2
  28. package/client-dist/{chunk-XKS3GVP3.js → chunk-H76CW7P3.js} +2 -2
  29. package/client-dist/{chunk-3LPBF4AU.js → chunk-HDAWX2XF.js} +2 -2
  30. package/client-dist/{chunk-A3RMSX34.js → chunk-HJHNE6YH.js} +2 -2
  31. package/client-dist/{chunk-7VUQTBJ2.js → chunk-HJO6XKJU.js} +2 -2
  32. package/client-dist/{chunk-S46BSLUB.js → chunk-HRWESQZ7.js} +2 -2
  33. package/client-dist/{chunk-36LPXL3M.js → chunk-HVP7A2W5.js} +2 -2
  34. package/client-dist/{chunk-YWW2VAZR.js → chunk-HW7NI36G.js} +2 -2
  35. package/client-dist/{chunk-CN76LOPU.js → chunk-IM75ARVA.js} +2 -2
  36. package/client-dist/{chunk-VQSRIIPK.js → chunk-LBCLWTHX.js} +2 -2
  37. package/client-dist/{chunk-AQD6DEHR.js → chunk-LHZIBNFR.js} +2 -2
  38. package/client-dist/{chunk-PTS77H25.js → chunk-LWUIDMNL.js} +2 -2
  39. package/client-dist/{chunk-O6IRGFCX.js → chunk-LYMCPIS7.js} +2 -2
  40. package/client-dist/{chunk-ZW4M7CJ2.js → chunk-NO6TCJGM.js} +2 -2
  41. package/client-dist/{chunk-ZPE6HI3H.js → chunk-NRQ7LIBM.js} +2 -2
  42. package/client-dist/{chunk-SBJAWWHF.js → chunk-NVK2NT5O.js} +2 -2
  43. package/client-dist/{chunk-SBJAWWHF.js.map → chunk-NVK2NT5O.js.map} +3 -3
  44. package/client-dist/{chunk-ZLCRMQAK.js → chunk-O2FA6HNL.js} +2 -2
  45. package/client-dist/{chunk-7YT7BGBD.js → chunk-OASG3NKM.js} +2 -2
  46. package/client-dist/{chunk-KHVPVWG7.js → chunk-OYB4VU7M.js} +2 -2
  47. package/client-dist/{chunk-FID2RUXN.js → chunk-PEEGB2PT.js} +2 -2
  48. package/client-dist/{chunk-SAC7F2CB.js → chunk-PR4Y5XDM.js} +2 -2
  49. package/client-dist/{chunk-7MZ4N75F.js → chunk-RHGTAI5Z.js} +2 -2
  50. package/client-dist/{chunk-OVU6SA42.js → chunk-RUNHLH7T.js} +2 -2
  51. package/client-dist/{chunk-5HYEA5IO.js → chunk-S4CBPEPW.js} +2 -2
  52. package/client-dist/chunk-S5BXJ3N4.js +4 -0
  53. package/client-dist/{chunk-OXEKAYMY.js.map → chunk-S5BXJ3N4.js.map} +3 -3
  54. package/client-dist/{chunk-DB44BUNE.js → chunk-SADTSOZ4.js} +2 -2
  55. package/client-dist/{chunk-PVLRUWUC.js → chunk-SD7AGJZH.js} +2 -2
  56. package/client-dist/{chunk-6227S2CN.js → chunk-TJTRKXZC.js} +2 -2
  57. package/client-dist/{chunk-4AVVQGND.js → chunk-U7HJBEWP.js} +2 -2
  58. package/client-dist/{chunk-W3HNVMKS.js → chunk-UB5YSCWY.js} +2 -2
  59. package/client-dist/{chunk-TNGH7PJP.js → chunk-ULMUGWHO.js} +2 -2
  60. package/client-dist/{chunk-IUCQWZ34.js → chunk-VG3BRAVF.js} +2 -2
  61. package/client-dist/{chunk-EGZ2ZMS3.js → chunk-VZXRS3CY.js} +2 -2
  62. package/client-dist/{chunk-2ZTUWDCN.js → chunk-WCQEVEV6.js} +2 -2
  63. package/client-dist/{chunk-5DUG67IY.js → chunk-YYFQVRYR.js} +2 -2
  64. package/client-dist/{chunk-TIJCR5DW.js → chunk-ZUSKVUGS.js} +2 -2
  65. package/client-dist/{chunk-TIJCR5DW.js.map → chunk-ZUSKVUGS.js.map} +1 -1
  66. package/client-dist/{consultant.module-J2JDO2WS.js → consultant.module-53M2Y4PS.js} +2 -2
  67. package/client-dist/{crd.module-SCW4OTC2.js → crd.module-576N24XD.js} +2 -2
  68. package/client-dist/{dashboard.module-F55QGGVH.js → dashboard.module-D4N6YL4E.js} +2 -2
  69. package/client-dist/{do.module-7FRBSMAA.js → do.module-RYNW2MQK.js} +2 -2
  70. package/client-dist/{document-library.module-B6VXHRG7.js → document-library.module-35GLKIFU.js} +2 -2
  71. package/client-dist/{embedding-eval.module-NPC3TEIO.js → embedding-eval.module-TLH2FYJN.js} +2 -2
  72. package/client-dist/{embedding-registry.module-LIVVEPZY.js → embedding-registry.module-B2CVM2LG.js} +2 -2
  73. package/client-dist/{err.module-YOIHNORT.js → err.module-3Z2NKVJP.js} +2 -2
  74. package/client-dist/{feedback.module-V5KVPNYZ.js → feedback.module-KZ2RUEQ3.js} +2 -2
  75. package/client-dist/{host-runtime-mcp.module-PHWXY4PV.js → host-runtime-mcp.module-B2NZZ76H.js} +2 -2
  76. package/client-dist/index.html +2 -2
  77. package/client-dist/{live-dev-pipeline.module-NGFZQDD3.js → live-dev-pipeline.module-7YGIVZDK.js} +2 -2
  78. package/client-dist/{logs.module-U22RMCHY.js → logs.module-BJM5JU3E.js} +2 -2
  79. package/client-dist/{main-E47XWCXH.js → main-4GMW27ZD.js} +3 -3
  80. package/client-dist/{master-control-remote-poc.module-EBA63OMO.js → master-control-remote-poc.module-NFVYO3TC.js} +2 -2
  81. package/client-dist/{mobile-app.module-SRY6NVNR.js → mobile-app.module-AJXVZHZD.js} +2 -2
  82. package/client-dist/{model-registry.module-UTATZZJR.js → model-registry.module-P3GYIQV5.js} +2 -2
  83. package/client-dist/oc.module-HPRR6R6N.js +3 -0
  84. package/client-dist/oc.module-HPRR6R6N.js.map +7 -0
  85. package/client-dist/{orc.module-MKANMSGC.js → orc.module-M42ZABQO.js} +2 -2
  86. package/client-dist/{project-management.module-4LL5UVW5.js → project-management.module-DFDGNSZI.js} +2 -2
  87. package/client-dist/project-source-routed.module-LCGCSMJZ.js +2 -0
  88. package/client-dist/{scheduler.module-COHLY6ZF.js → scheduler.module-3I7X5DM3.js} +2 -2
  89. package/client-dist/{session.module-JQCXS6ZJ.js → session.module-XLIKQTZZ.js} +9 -9
  90. package/client-dist/session.module-XLIKQTZZ.js.map +7 -0
  91. package/client-dist/{set.module-PUU5N4MJ.js → set.module-2LSG7A5L.js} +2 -2
  92. package/client-dist/{setup.module-HPV5JS3I.js → setup.module-XEGHSWPE.js} +2 -2
  93. package/client-dist/{styles-XKQ3MDLE.css → styles-VMCPLJOS.css} +2 -2
  94. package/client-dist/{styles-XKQ3MDLE.css.map → styles-VMCPLJOS.css.map} +1 -1
  95. package/client-dist/{terminals.module-VIWV443T.js → terminals.module-SCMLUJKP.js} +2 -2
  96. package/client-dist/{voice-notes-poc.module-ZNRSQ6XH.js → voice-notes-poc.module-WJ6RZAXO.js} +2 -2
  97. package/client-dist/{wfs.module-CIG5GOVA.js → wfs.module-EXKZZCJ5.js} +2 -2
  98. package/package.json +1 -1
  99. package/client-dist/ca.module-FMCAOMOB.js +0 -5
  100. package/client-dist/ca.module-FMCAOMOB.js.map +0 -7
  101. package/client-dist/cc.module-T3NJWMZ5.js.map +0 -7
  102. package/client-dist/chunk-OXEKAYMY.js +0 -4
  103. package/client-dist/oc.module-SVMLBM6T.js +0 -3
  104. package/client-dist/oc.module-SVMLBM6T.js.map +0 -7
  105. package/client-dist/project-source-routed.module-DSUCIWHV.js +0 -2
  106. package/client-dist/session.module-JQCXS6ZJ.js.map +0 -7
  107. /package/client-dist/{agent-instances.module-VLGX2Z7Z.js.map → agent-instances.module-GN4PQAF3.js.map} +0 -0
  108. /package/client-dist/{cc-usage-dashboard.component-D6CNJHB5.js.map → cc-usage-dashboard.component-Q5JJBLZ4.js.map} +0 -0
  109. /package/client-dist/{chunk-I4V3JDZC.js.map → chunk-25I4EVM2.js.map} +0 -0
  110. /package/client-dist/{chunk-E6DWNZNG.js.map → chunk-2EZEKYOT.js.map} +0 -0
  111. /package/client-dist/{chunk-QXIUTGNM.js.map → chunk-2UGNMPLF.js.map} +0 -0
  112. /package/client-dist/{chunk-ZZ7RWOLH.js.map → chunk-3EZGW2AE.js.map} +0 -0
  113. /package/client-dist/{chunk-2IYGO6RM.js.map → chunk-4KJ53ND4.js.map} +0 -0
  114. /package/client-dist/{chunk-ZZRTMXBT.js.map → chunk-4UCTQFBQ.js.map} +0 -0
  115. /package/client-dist/{chunk-P7Z33WJF.js.map → chunk-543UYBGO.js.map} +0 -0
  116. /package/client-dist/{chunk-SJ6KKDJT.js.map → chunk-5ZSG63JI.js.map} +0 -0
  117. /package/client-dist/{chunk-NCOPOED7.js.map → chunk-75PLAFQN.js.map} +0 -0
  118. /package/client-dist/{chunk-WNQYZI4D.js.map → chunk-77DEVH3B.js.map} +0 -0
  119. /package/client-dist/{chunk-W7OH67K2.js.map → chunk-7SMKTOH2.js.map} +0 -0
  120. /package/client-dist/{chunk-JLF2BDJU.js.map → chunk-7Y72ZMAB.js.map} +0 -0
  121. /package/client-dist/{chunk-GNWPRBF5.js.map → chunk-A2QJB3E4.js.map} +0 -0
  122. /package/client-dist/{chunk-DPXSAO23.js.map → chunk-ALW7KZ7Q.js.map} +0 -0
  123. /package/client-dist/{chunk-IGWJMU5B.js.map → chunk-AON3XCTS.js.map} +0 -0
  124. /package/client-dist/{chunk-FOL6X3TR.js.map → chunk-BHJM6S4T.js.map} +0 -0
  125. /package/client-dist/{chunk-7SCYMYZG.js.map → chunk-EK4MRIFY.js.map} +0 -0
  126. /package/client-dist/{chunk-3JQ2UHMM.js.map → chunk-FSZ2PEZ2.js.map} +0 -0
  127. /package/client-dist/{chunk-SJTW4HLQ.js.map → chunk-GE472LIK.js.map} +0 -0
  128. /package/client-dist/{chunk-64K7CP3A.js.map → chunk-GETS4G5N.js.map} +0 -0
  129. /package/client-dist/{chunk-3SYXOECP.js.map → chunk-GNA4E3CW.js.map} +0 -0
  130. /package/client-dist/{chunk-XKS3GVP3.js.map → chunk-H76CW7P3.js.map} +0 -0
  131. /package/client-dist/{chunk-3LPBF4AU.js.map → chunk-HDAWX2XF.js.map} +0 -0
  132. /package/client-dist/{chunk-A3RMSX34.js.map → chunk-HJHNE6YH.js.map} +0 -0
  133. /package/client-dist/{chunk-7VUQTBJ2.js.map → chunk-HJO6XKJU.js.map} +0 -0
  134. /package/client-dist/{chunk-S46BSLUB.js.map → chunk-HRWESQZ7.js.map} +0 -0
  135. /package/client-dist/{chunk-36LPXL3M.js.map → chunk-HVP7A2W5.js.map} +0 -0
  136. /package/client-dist/{chunk-YWW2VAZR.js.map → chunk-HW7NI36G.js.map} +0 -0
  137. /package/client-dist/{chunk-CN76LOPU.js.map → chunk-IM75ARVA.js.map} +0 -0
  138. /package/client-dist/{chunk-VQSRIIPK.js.map → chunk-LBCLWTHX.js.map} +0 -0
  139. /package/client-dist/{chunk-AQD6DEHR.js.map → chunk-LHZIBNFR.js.map} +0 -0
  140. /package/client-dist/{chunk-PTS77H25.js.map → chunk-LWUIDMNL.js.map} +0 -0
  141. /package/client-dist/{chunk-O6IRGFCX.js.map → chunk-LYMCPIS7.js.map} +0 -0
  142. /package/client-dist/{chunk-ZW4M7CJ2.js.map → chunk-NO6TCJGM.js.map} +0 -0
  143. /package/client-dist/{chunk-ZPE6HI3H.js.map → chunk-NRQ7LIBM.js.map} +0 -0
  144. /package/client-dist/{chunk-ZLCRMQAK.js.map → chunk-O2FA6HNL.js.map} +0 -0
  145. /package/client-dist/{chunk-7YT7BGBD.js.map → chunk-OASG3NKM.js.map} +0 -0
  146. /package/client-dist/{chunk-KHVPVWG7.js.map → chunk-OYB4VU7M.js.map} +0 -0
  147. /package/client-dist/{chunk-FID2RUXN.js.map → chunk-PEEGB2PT.js.map} +0 -0
  148. /package/client-dist/{chunk-SAC7F2CB.js.map → chunk-PR4Y5XDM.js.map} +0 -0
  149. /package/client-dist/{chunk-7MZ4N75F.js.map → chunk-RHGTAI5Z.js.map} +0 -0
  150. /package/client-dist/{chunk-OVU6SA42.js.map → chunk-RUNHLH7T.js.map} +0 -0
  151. /package/client-dist/{chunk-5HYEA5IO.js.map → chunk-S4CBPEPW.js.map} +0 -0
  152. /package/client-dist/{chunk-DB44BUNE.js.map → chunk-SADTSOZ4.js.map} +0 -0
  153. /package/client-dist/{chunk-PVLRUWUC.js.map → chunk-SD7AGJZH.js.map} +0 -0
  154. /package/client-dist/{chunk-6227S2CN.js.map → chunk-TJTRKXZC.js.map} +0 -0
  155. /package/client-dist/{chunk-4AVVQGND.js.map → chunk-U7HJBEWP.js.map} +0 -0
  156. /package/client-dist/{chunk-W3HNVMKS.js.map → chunk-UB5YSCWY.js.map} +0 -0
  157. /package/client-dist/{chunk-TNGH7PJP.js.map → chunk-ULMUGWHO.js.map} +0 -0
  158. /package/client-dist/{chunk-IUCQWZ34.js.map → chunk-VG3BRAVF.js.map} +0 -0
  159. /package/client-dist/{chunk-EGZ2ZMS3.js.map → chunk-VZXRS3CY.js.map} +0 -0
  160. /package/client-dist/{chunk-2ZTUWDCN.js.map → chunk-WCQEVEV6.js.map} +0 -0
  161. /package/client-dist/{chunk-5DUG67IY.js.map → chunk-YYFQVRYR.js.map} +0 -0
  162. /package/client-dist/{consultant.module-J2JDO2WS.js.map → consultant.module-53M2Y4PS.js.map} +0 -0
  163. /package/client-dist/{crd.module-SCW4OTC2.js.map → crd.module-576N24XD.js.map} +0 -0
  164. /package/client-dist/{dashboard.module-F55QGGVH.js.map → dashboard.module-D4N6YL4E.js.map} +0 -0
  165. /package/client-dist/{do.module-7FRBSMAA.js.map → do.module-RYNW2MQK.js.map} +0 -0
  166. /package/client-dist/{document-library.module-B6VXHRG7.js.map → document-library.module-35GLKIFU.js.map} +0 -0
  167. /package/client-dist/{embedding-eval.module-NPC3TEIO.js.map → embedding-eval.module-TLH2FYJN.js.map} +0 -0
  168. /package/client-dist/{embedding-registry.module-LIVVEPZY.js.map → embedding-registry.module-B2CVM2LG.js.map} +0 -0
  169. /package/client-dist/{err.module-YOIHNORT.js.map → err.module-3Z2NKVJP.js.map} +0 -0
  170. /package/client-dist/{feedback.module-V5KVPNYZ.js.map → feedback.module-KZ2RUEQ3.js.map} +0 -0
  171. /package/client-dist/{host-runtime-mcp.module-PHWXY4PV.js.map → host-runtime-mcp.module-B2NZZ76H.js.map} +0 -0
  172. /package/client-dist/{live-dev-pipeline.module-NGFZQDD3.js.map → live-dev-pipeline.module-7YGIVZDK.js.map} +0 -0
  173. /package/client-dist/{logs.module-U22RMCHY.js.map → logs.module-BJM5JU3E.js.map} +0 -0
  174. /package/client-dist/{main-E47XWCXH.js.map → main-4GMW27ZD.js.map} +0 -0
  175. /package/client-dist/{master-control-remote-poc.module-EBA63OMO.js.map → master-control-remote-poc.module-NFVYO3TC.js.map} +0 -0
  176. /package/client-dist/{mobile-app.module-SRY6NVNR.js.map → mobile-app.module-AJXVZHZD.js.map} +0 -0
  177. /package/client-dist/{model-registry.module-UTATZZJR.js.map → model-registry.module-P3GYIQV5.js.map} +0 -0
  178. /package/client-dist/{orc.module-MKANMSGC.js.map → orc.module-M42ZABQO.js.map} +0 -0
  179. /package/client-dist/{project-management.module-4LL5UVW5.js.map → project-management.module-DFDGNSZI.js.map} +0 -0
  180. /package/client-dist/{project-source-routed.module-DSUCIWHV.js.map → project-source-routed.module-LCGCSMJZ.js.map} +0 -0
  181. /package/client-dist/{scheduler.module-COHLY6ZF.js.map → scheduler.module-3I7X5DM3.js.map} +0 -0
  182. /package/client-dist/{set.module-PUU5N4MJ.js.map → set.module-2LSG7A5L.js.map} +0 -0
  183. /package/client-dist/{setup.module-HPV5JS3I.js.map → setup.module-XEGHSWPE.js.map} +0 -0
  184. /package/client-dist/{terminals.module-VIWV443T.js.map → terminals.module-SCMLUJKP.js.map} +0 -0
  185. /package/client-dist/{voice-notes-poc.module-ZNRSQ6XH.js.map → voice-notes-poc.module-WJ6RZAXO.js.map} +0 -0
  186. /package/client-dist/{wfs.module-CIG5GOVA.js.map → wfs.module-EXKZZCJ5.js.map} +0 -0
@@ -1,2 +1,2 @@
1
- import{a as E}from"./chunk-7MZ4N75F.js";import{a as I}from"./chunk-QXIUTGNM.js";import{e as v}from"./chunk-4AVVQGND.js";import{L,p as F,t as k,w as c}from"./chunk-TIJCR5DW.js";import{C as $,a as _,aa as i,b as S,h as A,hb as T,k as o,y as P}from"./chunk-TBMJSIBB.js";var a=A(F());var D="model-test-run-progress",w="model-test-result-saved",M=5e3,q=(()=>{class d{runPollingInterval=null;modelTestRunProgressSocketSub=null;modelTestResultSavedSocketSub=null;lastListFilters=void 0;list_$=i([]);listLoading_$=i(!1);listLoadError_$=i(null);registryProviderIds_$=i([]);selectedEntryId_$=i("");entryDetail_$=i(null);entryDetailLoading_$=i(!1);entryDetailNotFound_$=i(!1);entryDetailLoadError_$=i(null);prompts_$=i([]);promptsLoading_$=i(!1);results_$=i([]);testRunId_$=i("");testRunStatus_$=i(null);testRunPollingActive_$=i(!1);testRunError_$=i(null);testRunSelectedModelIds_$=i([]);testRunPanelDismissed_$=i(!1);testRunPanelVisible_$=T(()=>{let t=this.testRunId_$(),e=this.testRunStatus_$();return!(!t||e==null||this.testRunPanelDismissed_$())});setupConfigForRegistry_$=i(null);syncing_$=i(!1);modelTestRunProgressCurrentTask_$=i(null);modelRegistry_AS=$(E);settings_AS=$(L);socket_CS=$(v);ngOnDestroy(){this.stopRunPolling(),this.stopModelTestRunProgressSocket(),this.stopModelTestResultSavedSocket()}loadList(t){return o(this,null,function*(){t!==void 0&&(this.lastListFilters=t),this.listLoading_$.set(!0),this.listLoadError_$.set(null);try{let s=(yield this.modelRegistry_AS.getList(t)).list??[];return this.list_$.set(s),s}catch(e){return a.DyFM_Error.logSimple("CCAP_ModelRegistryDS | Failed to load list",e),this.listLoadError_$.set(e),[]}finally{this.listLoading_$.set(!1)}})}loadRegistryProviderIdsUnfiltered(){return o(this,null,function*(){try{let e=(yield this.modelRegistry_AS.getList({})).list??[],s=d.collectSortedUniqueProviderIds(e);this.registryProviderIds_$.set(s)}catch(t){a.DyFM_Error.logSimple("CCAP_ModelRegistryDS | Failed to load registry provider ids for filter UI (unfiltered list)",t)}})}deleteRegistryEntry(t){return o(this,null,function*(){this.listLoadError_$.set(null);try{return yield this.modelRegistry_AS.deleteEntry(t),yield this.loadList(this.lastListFilters),yield this.loadRegistryProviderIdsUnfiltered(),!0}catch(e){return a.DyFM_Error.logSimple("CCAP_ModelRegistryDS | deleteRegistryEntry failed",e),this.listLoadError_$.set(e),!1}})}deleteRegistryEntries(t){return o(this,null,function*(){this.listLoadError_$.set(null);try{let e=yield this.modelRegistry_AS.deleteEntries(t);return yield this.loadList(this.lastListFilters),yield this.loadRegistryProviderIdsUnfiltered(),e}catch(e){return a.DyFM_Error.logSimple("CCAP_ModelRegistryDS | deleteRegistryEntries failed",e),this.listLoadError_$.set(e),null}})}static collectSortedUniqueProviderIds(t){let e=t.map(s=>s.provider??"").filter(s=>s!=="");return[...new Set(e)].sort()}setSelectedEntryId(t){this.selectedEntryId_$.set(t??"")}loadEntry(t){return o(this,null,function*(){this.entryDetailLoading_$.set(!0),this.entryDetailNotFound_$.set(!1),this.entryDetailLoadError_$.set(null),this.selectedEntryId_$()!==t&&(this.entryDetail_$.set(null),this.results_$.set([]));try{let r=((yield this.modelRegistry_AS.getList(this.lastListFilters)).list??[]).find(f=>f.id===t);if(!r)return this.entryDetail_$.set(null),this.entryDetailNotFound_$.set(!0),null;this.entryDetail_$.set(r);let n=r.reasoningLevelForTest?.trim()||"none",l=yield this.modelRegistry_AS.getTestResults({provider:r.provider,model:r.modelName,limit:200,reasoningLevel:n});return this.results_$.set(l.results??[]),r}catch(e){a.DyFM_Error.logSimple("CCAP_ModelRegistryDS | Failed to load entry",e);let s=e instanceof Error?e.message:String(e);return this.entryDetailLoadError_$.set(s),this.selectedEntryId_$()===t&&this.entryDetail_$.set(null),null}finally{this.entryDetailLoading_$.set(!1)}})}loadPrompts(){return o(this,null,function*(){this.promptsLoading_$.set(!0);try{let e=(yield this.modelRegistry_AS.getPrompts()).prompts??[];return this.prompts_$.set(e),e}catch(t){return a.DyFM_Error.logSimple("CCAP_ModelRegistryDS | Failed to load prompts",t),this.prompts_$.set([]),[]}finally{this.promptsLoading_$.set(!1)}})}loadResults(t,e,s){return o(this,null,function*(){try{let n=(yield this.modelRegistry_AS.getTestResults({provider:t,model:e,limit:200,reasoningLevel:s})).results??[];return this.results_$.set(n),n}catch(r){return a.DyFM_Error.logSimple("CCAP_ModelRegistryDS | Failed to load results",r),[]}})}sync(){return o(this,null,function*(){this.syncing_$.set(!0),this.listLoadError_$.set(null);try{let t=yield this.modelRegistry_AS.sync();return yield Promise.all([this.loadSetupConfigForRegistry(),this.loadList(this.lastListFilters),this.loadRegistryProviderIdsUnfiltered()]),t}catch(t){return a.DyFM_Error.logSimple("CCAP_ModelRegistryDS | Sync failed",t),this.listLoadError_$.set(t),null}finally{this.syncing_$.set(!1)}})}setEnabled(t,e){return o(this,null,function*(){this.listLoadError_$.set(null);try{return yield this.modelRegistry_AS.setEnabled(t,e),yield this.loadList(this.lastListFilters),!0}catch(s){return a.DyFM_Error.logSimple("CCAP_ModelRegistryDS | setEnabled failed",s),this.listLoadError_$.set(s),!1}})}patchEntry(t,e){return o(this,null,function*(){this.listLoadError_$.set(null);let s=this.selectedEntryId_$()===t,r=this.entryDetail_$();if(s&&r&&e.reasoningLevelForTest!==void 0&&this.entryDetail_$.update(n=>n?S(_({},n),{reasoningLevelForTest:e.reasoningLevelForTest}):null),s&&r&&e.enabled!==void 0){let n=e.enabled;this.entryDetail_$.update(l=>l?S(_({},l),{enabled:n}):null)}s&&r&&e.capabilities!==void 0&&this.entryDetail_$.update(n=>n?S(_({},n),{capabilities:e.capabilities}):null);try{return yield this.modelRegistry_AS.patchEntry(t,e),yield this.loadList(this.lastListFilters),s&&(e.reasoningLevelForTest!==void 0&&e.enabled===void 0&&e.capabilities===void 0||(yield this.loadEntry(t))),!0}catch(n){return a.DyFM_Error.logSimple("CCAP_ModelRegistryDS | patchEntry failed",n),this.listLoadError_$.set(n),s&&this.entryDetail_$()&&this.loadEntry(t),!1}})}setReasoningLevelForTest(t,e){return o(this,null,function*(){return this.patchEntry(t,{reasoningLevelForTest:e})})}bulkSetEnabled(t,e){return o(this,null,function*(){this.listLoadError_$.set(null);try{let s=yield this.modelRegistry_AS.bulkSetEnabled(t,e);return yield this.loadList(this.lastListFilters),s.updated}catch(s){return a.DyFM_Error.logSimple("CCAP_ModelRegistryDS | bulkSetEnabled failed",s),this.listLoadError_$.set(s),null}})}startTestRun(t,e){return o(this,null,function*(){this.testRunError_$.set(null);try{let s=yield this.modelRegistry_AS.startTestRun(t,e);return this.testRunPanelDismissed_$.set(!1),this.testRunSelectedModelIds_$.set([...t]),this.testRunId_$.set(s.runId),this.testRunStatus_$.set({runId:s.runId,status:c.pending,results:[]}),this.startModelTestRunProgressSocket(),this.startModelTestResultSavedSocket(),this.startRunPolling(s.runId),s.runId}catch(s){return a.DyFM_Error.logSimple("CCAP_ModelRegistryDS | startTestRun failed",s),this.testRunError_$.set(s),null}})}startRunPolling(t){this.clearRunPollingIntervalOnly(),this.testRunPollingActive_$.set(!0);let e=M;this.runPollingInterval=setInterval(()=>{this.pollRunStatus(t)},e),this.pollRunStatus(t)}clearRunPollingIntervalOnly(){this.runPollingInterval&&(clearInterval(this.runPollingInterval),this.runPollingInterval=null)}stopRunPolling(){this.clearRunPollingIntervalOnly(),this.testRunPollingActive_$.set(!1),this.testRunId_$.set(""),this.testRunStatus_$.set(null),this.testRunError_$.set(null),this.modelTestRunProgressCurrentTask_$.set(null),this.testRunSelectedModelIds_$.set([]),this.testRunPanelDismissed_$.set(!1)}dismissTestRunPanel(){this.testRunPanelDismissed_$.set(!0)}pollRunStatus(t){return o(this,null,function*(){try{let e=yield this.modelRegistry_AS.getTestRunStatus(t);this.testRunStatus_$.set(e),(e.status==="completed"||e.status==="failed")&&(this.clearRunPollingIntervalOnly(),this.testRunPollingActive_$.set(!1))}catch(e){this.testRunError_$.set(e),this.clearRunPollingIntervalOnly(),this.testRunPollingActive_$.set(!1)}})}startModelTestRunProgressSocket(){this.modelTestRunProgressSocketSub||(this.modelTestRunProgressSocketSub=this.socket_CS.event$.subscribe(t=>{if(t.event!=="user-notification")return;let e=t.payload??{};if(e.type!==D)return;let s=e.runId,r=e.status,n=e.current,l=e.total,f=e.currentTask,m=e.error,u=e.failedTask,g=e.errorDetails;this.setTestRunProgressFromSocket({runId:typeof s=="string"?s:void 0,status:typeof r=="string"?r:void 0,current:typeof n=="number"?n:void 0,total:typeof l=="number"?l:void 0,currentTask:f,error:typeof m=="string"?m:void 0,failedTask:u,errorDetails:g})}))}stopModelTestRunProgressSocket(){this.modelTestRunProgressSocketSub&&(this.modelTestRunProgressSocketSub.unsubscribe(),this.modelTestRunProgressSocketSub=null)}startModelTestResultSavedSocket(){this.modelTestResultSavedSocketSub||(this.modelTestResultSavedSocketSub=this.socket_CS.event$.subscribe(t=>{if(t.event!=="user-notification")return;let e=t.payload??{};e.type===w&&this.mergeResultFromSocket(e)}))}stopModelTestResultSavedSocket(){this.modelTestResultSavedSocketSub&&(this.modelTestResultSavedSocketSub.unsubscribe(),this.modelTestResultSavedSocketSub=null)}mergeResultFromSocket(t){let e=this.testRunId_$();if(!e||t.runId!==e)return;let s=this.testRunStatus_$();if(!s)return;let r=d.parseResultItemFromSocket(t);if(!r)return;let n=R=>`${R.provider}|${R.model}|${R.promptId}|${R.reasoningLevel??"none"}`,l=n(r),m=[...s.results.filter(R=>n(R)!==l),r],u=t.current,g=t.total,h=typeof u=="number"?u:s.progress?.current,y=typeof g=="number"?g:s.progress?.total;this.testRunStatus_$.set(S(_({},s),{results:m,progress:typeof y=="number"&&y>0&&typeof h=="number"?{current:Math.max(h,s.progress?.current??0),total:y}:s.progress}));let p=this.entryDetail_$();if(p&&r.provider===p.provider&&r.model===p.modelName){let b=this.results_$().filter(C=>n(C)!==l);this.results_$.set([r,...b])}}static parseResultItemFromSocket(t){let e=t.provider,s=t.model,r=t.promptId,n=t.score;return typeof e!="string"||typeof s!="string"||typeof r!="string"?null:{provider:e,model:s,promptId:r,reasoningLevel:typeof t.reasoningLevel=="string"?t.reasoningLevel:void 0,score:typeof n=="number"?n:0,analysis:typeof t.analysis=="string"?t.analysis:void 0,promptText:typeof t.promptText=="string"?t.promptText:void 0,modelOutput:typeof t.modelOutput=="string"?t.modelOutput:void 0,thinking:typeof t.thinking=="string"?t.thinking:void 0,generationTimeMs:typeof t.generationTimeMs=="number"?t.generationTimeMs:void 0,analyzerProvider:typeof t.analyzerProvider=="string"?t.analyzerProvider:void 0,analyzerModel:typeof t.analyzerModel=="string"?t.analyzerModel:void 0,inputTokens:typeof t.inputTokens=="number"?t.inputTokens:void 0,outputTokens:typeof t.outputTokens=="number"?t.outputTokens:void 0,thinkingTokens:typeof t.thinkingTokens=="number"?t.thinkingTokens:void 0,createdAt:typeof t.createdAt=="string"?t.createdAt:void 0}}setTestRunProgressFromSocket(t){let e=this.testRunId_$();if(!e||t.runId!==e)return;let s=this.testRunStatus_$();if(!s)return;let r=d.parseRunStatusFromSocket(t.status,s.status),n=d.parseFailedTaskFromSocketPayload(t.failedTask),l=d.parseErrorDetailsFromSocketPayload(t.errorDetails),f=t.error!==void 0?t.error:s.error;this.testRunStatus_$.set(S(_({},s),{status:r,progress:typeof t.total=="number"&&t.total>0?{current:t.current??0,total:t.total}:s.progress,error:f,failedTask:n??s.failedTask,errorDetails:l??s.errorDetails}));let m=typeof t.status=="string"?t.status:"";if(m===c.completed||m===c.failed){this.modelTestRunProgressCurrentTask_$.set(null);return}let u=t.currentTask;if(u&&typeof u=="object"&&u!==null&&"promptId"in u){let g=u,h=g.promptId,y=g.provider,p=g.modelName;this.modelTestRunProgressCurrentTask_$.set({provider:typeof y=="string"?y:"",modelName:typeof p=="string"?p:"",promptId:typeof h=="string"?h:""});return}this.modelTestRunProgressCurrentTask_$.set(null)}static isPlainObjectRecord(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}static parseFailedTaskFromSocketPayload(t){if(!d.isPlainObjectRecord(t))return;let e=t,s=e.provider,r=e.model,n=e.promptId;if(!(typeof s!="string"||typeof r!="string"||typeof n!="string"))return{provider:s,model:r,promptId:n}}static parseErrorDetailsFromSocketPayload(t){if(!d.isPlainObjectRecord(t))return;let e=t,s=e.message;if(typeof s!="string")return;let r=e.errorCode,n=e.stack;return{message:s,errorCode:typeof r=="string"?r:void 0,stack:typeof n=="string"?n:void 0}}static parseRunStatusFromSocket(t,e){return typeof t!="string"?e:t===c.pending?c.pending:t===c.running?c.running:t===c.completed?c.completed:t===c.failed?c.failed:e}loadSetupConfigForRegistry(){return o(this,null,function*(){try{let t=yield this.settings_AS.getSection(k.llmProviders),e=typeof t.defaultLlmProvider=="string"?t.defaultLlmProvider:void 0,s=typeof t.defaultLlmModel=="string"?t.defaultLlmModel:void 0,r={},n=t.localAiSettings;if(Array.isArray(n))for(let f of n){if(f==null||typeof f!="object"||Array.isArray(f))continue;let m=f,u=m.key,g=m.name;if(typeof u!="string"||!u.trim())continue;let h=typeof g=="string"?g.trim():"",y=h.length>0?h:"Local AI",p=I.build({localAiKey:u.trim()});r[p]={label:y}}let l={defaultLlmProvider:e,defaultLlmModel:s,llmProviderConfig:Object.keys(r).length>0?r:void 0};return this.setupConfigForRegistry_$.set(l),l}catch{return this.setupConfigForRegistry_$.set(null),null}})}getCachedList(){return this.list_$()}getCachedEntryDetail(){return this.entryDetail_$()}getCachedPrompts(){return this.prompts_$()}getCachedResults(){return this.results_$()}getCachedSetupConfigForRegistry(){return this.setupConfigForRegistry_$()}static \u0275fac=function(e){return new(e||d)};static \u0275prov=P({token:d,factory:d.\u0275fac,providedIn:"root"})}return d})();export{q as a};
2
- //# sourceMappingURL=chunk-PTS77H25.js.map
1
+ import{a as E}from"./chunk-RHGTAI5Z.js";import{a as I}from"./chunk-2UGNMPLF.js";import{e as v}from"./chunk-U7HJBEWP.js";import{L,p as F,t as k,w as c}from"./chunk-ZUSKVUGS.js";import{C as $,a as _,aa as i,b as S,h as A,hb as T,k as o,y as P}from"./chunk-TBMJSIBB.js";var a=A(F());var D="model-test-run-progress",w="model-test-result-saved",M=5e3,q=(()=>{class d{runPollingInterval=null;modelTestRunProgressSocketSub=null;modelTestResultSavedSocketSub=null;lastListFilters=void 0;list_$=i([]);listLoading_$=i(!1);listLoadError_$=i(null);registryProviderIds_$=i([]);selectedEntryId_$=i("");entryDetail_$=i(null);entryDetailLoading_$=i(!1);entryDetailNotFound_$=i(!1);entryDetailLoadError_$=i(null);prompts_$=i([]);promptsLoading_$=i(!1);results_$=i([]);testRunId_$=i("");testRunStatus_$=i(null);testRunPollingActive_$=i(!1);testRunError_$=i(null);testRunSelectedModelIds_$=i([]);testRunPanelDismissed_$=i(!1);testRunPanelVisible_$=T(()=>{let t=this.testRunId_$(),e=this.testRunStatus_$();return!(!t||e==null||this.testRunPanelDismissed_$())});setupConfigForRegistry_$=i(null);syncing_$=i(!1);modelTestRunProgressCurrentTask_$=i(null);modelRegistry_AS=$(E);settings_AS=$(L);socket_CS=$(v);ngOnDestroy(){this.stopRunPolling(),this.stopModelTestRunProgressSocket(),this.stopModelTestResultSavedSocket()}loadList(t){return o(this,null,function*(){t!==void 0&&(this.lastListFilters=t),this.listLoading_$.set(!0),this.listLoadError_$.set(null);try{let s=(yield this.modelRegistry_AS.getList(t)).list??[];return this.list_$.set(s),s}catch(e){return a.DyFM_Error.logSimple("CCAP_ModelRegistryDS | Failed to load list",e),this.listLoadError_$.set(e),[]}finally{this.listLoading_$.set(!1)}})}loadRegistryProviderIdsUnfiltered(){return o(this,null,function*(){try{let e=(yield this.modelRegistry_AS.getList({})).list??[],s=d.collectSortedUniqueProviderIds(e);this.registryProviderIds_$.set(s)}catch(t){a.DyFM_Error.logSimple("CCAP_ModelRegistryDS | Failed to load registry provider ids for filter UI (unfiltered list)",t)}})}deleteRegistryEntry(t){return o(this,null,function*(){this.listLoadError_$.set(null);try{return yield this.modelRegistry_AS.deleteEntry(t),yield this.loadList(this.lastListFilters),yield this.loadRegistryProviderIdsUnfiltered(),!0}catch(e){return a.DyFM_Error.logSimple("CCAP_ModelRegistryDS | deleteRegistryEntry failed",e),this.listLoadError_$.set(e),!1}})}deleteRegistryEntries(t){return o(this,null,function*(){this.listLoadError_$.set(null);try{let e=yield this.modelRegistry_AS.deleteEntries(t);return yield this.loadList(this.lastListFilters),yield this.loadRegistryProviderIdsUnfiltered(),e}catch(e){return a.DyFM_Error.logSimple("CCAP_ModelRegistryDS | deleteRegistryEntries failed",e),this.listLoadError_$.set(e),null}})}static collectSortedUniqueProviderIds(t){let e=t.map(s=>s.provider??"").filter(s=>s!=="");return[...new Set(e)].sort()}setSelectedEntryId(t){this.selectedEntryId_$.set(t??"")}loadEntry(t){return o(this,null,function*(){this.entryDetailLoading_$.set(!0),this.entryDetailNotFound_$.set(!1),this.entryDetailLoadError_$.set(null),this.selectedEntryId_$()!==t&&(this.entryDetail_$.set(null),this.results_$.set([]));try{let r=((yield this.modelRegistry_AS.getList(this.lastListFilters)).list??[]).find(f=>f.id===t);if(!r)return this.entryDetail_$.set(null),this.entryDetailNotFound_$.set(!0),null;this.entryDetail_$.set(r);let n=r.reasoningLevelForTest?.trim()||"none",l=yield this.modelRegistry_AS.getTestResults({provider:r.provider,model:r.modelName,limit:200,reasoningLevel:n});return this.results_$.set(l.results??[]),r}catch(e){a.DyFM_Error.logSimple("CCAP_ModelRegistryDS | Failed to load entry",e);let s=e instanceof Error?e.message:String(e);return this.entryDetailLoadError_$.set(s),this.selectedEntryId_$()===t&&this.entryDetail_$.set(null),null}finally{this.entryDetailLoading_$.set(!1)}})}loadPrompts(){return o(this,null,function*(){this.promptsLoading_$.set(!0);try{let e=(yield this.modelRegistry_AS.getPrompts()).prompts??[];return this.prompts_$.set(e),e}catch(t){return a.DyFM_Error.logSimple("CCAP_ModelRegistryDS | Failed to load prompts",t),this.prompts_$.set([]),[]}finally{this.promptsLoading_$.set(!1)}})}loadResults(t,e,s){return o(this,null,function*(){try{let n=(yield this.modelRegistry_AS.getTestResults({provider:t,model:e,limit:200,reasoningLevel:s})).results??[];return this.results_$.set(n),n}catch(r){return a.DyFM_Error.logSimple("CCAP_ModelRegistryDS | Failed to load results",r),[]}})}sync(){return o(this,null,function*(){this.syncing_$.set(!0),this.listLoadError_$.set(null);try{let t=yield this.modelRegistry_AS.sync();return yield Promise.all([this.loadSetupConfigForRegistry(),this.loadList(this.lastListFilters),this.loadRegistryProviderIdsUnfiltered()]),t}catch(t){return a.DyFM_Error.logSimple("CCAP_ModelRegistryDS | Sync failed",t),this.listLoadError_$.set(t),null}finally{this.syncing_$.set(!1)}})}setEnabled(t,e){return o(this,null,function*(){this.listLoadError_$.set(null);try{return yield this.modelRegistry_AS.setEnabled(t,e),yield this.loadList(this.lastListFilters),!0}catch(s){return a.DyFM_Error.logSimple("CCAP_ModelRegistryDS | setEnabled failed",s),this.listLoadError_$.set(s),!1}})}patchEntry(t,e){return o(this,null,function*(){this.listLoadError_$.set(null);let s=this.selectedEntryId_$()===t,r=this.entryDetail_$();if(s&&r&&e.reasoningLevelForTest!==void 0&&this.entryDetail_$.update(n=>n?S(_({},n),{reasoningLevelForTest:e.reasoningLevelForTest}):null),s&&r&&e.enabled!==void 0){let n=e.enabled;this.entryDetail_$.update(l=>l?S(_({},l),{enabled:n}):null)}s&&r&&e.capabilities!==void 0&&this.entryDetail_$.update(n=>n?S(_({},n),{capabilities:e.capabilities}):null);try{return yield this.modelRegistry_AS.patchEntry(t,e),yield this.loadList(this.lastListFilters),s&&(e.reasoningLevelForTest!==void 0&&e.enabled===void 0&&e.capabilities===void 0||(yield this.loadEntry(t))),!0}catch(n){return a.DyFM_Error.logSimple("CCAP_ModelRegistryDS | patchEntry failed",n),this.listLoadError_$.set(n),s&&this.entryDetail_$()&&this.loadEntry(t),!1}})}setReasoningLevelForTest(t,e){return o(this,null,function*(){return this.patchEntry(t,{reasoningLevelForTest:e})})}bulkSetEnabled(t,e){return o(this,null,function*(){this.listLoadError_$.set(null);try{let s=yield this.modelRegistry_AS.bulkSetEnabled(t,e);return yield this.loadList(this.lastListFilters),s.updated}catch(s){return a.DyFM_Error.logSimple("CCAP_ModelRegistryDS | bulkSetEnabled failed",s),this.listLoadError_$.set(s),null}})}startTestRun(t,e){return o(this,null,function*(){this.testRunError_$.set(null);try{let s=yield this.modelRegistry_AS.startTestRun(t,e);return this.testRunPanelDismissed_$.set(!1),this.testRunSelectedModelIds_$.set([...t]),this.testRunId_$.set(s.runId),this.testRunStatus_$.set({runId:s.runId,status:c.pending,results:[]}),this.startModelTestRunProgressSocket(),this.startModelTestResultSavedSocket(),this.startRunPolling(s.runId),s.runId}catch(s){return a.DyFM_Error.logSimple("CCAP_ModelRegistryDS | startTestRun failed",s),this.testRunError_$.set(s),null}})}startRunPolling(t){this.clearRunPollingIntervalOnly(),this.testRunPollingActive_$.set(!0);let e=M;this.runPollingInterval=setInterval(()=>{this.pollRunStatus(t)},e),this.pollRunStatus(t)}clearRunPollingIntervalOnly(){this.runPollingInterval&&(clearInterval(this.runPollingInterval),this.runPollingInterval=null)}stopRunPolling(){this.clearRunPollingIntervalOnly(),this.testRunPollingActive_$.set(!1),this.testRunId_$.set(""),this.testRunStatus_$.set(null),this.testRunError_$.set(null),this.modelTestRunProgressCurrentTask_$.set(null),this.testRunSelectedModelIds_$.set([]),this.testRunPanelDismissed_$.set(!1)}dismissTestRunPanel(){this.testRunPanelDismissed_$.set(!0)}pollRunStatus(t){return o(this,null,function*(){try{let e=yield this.modelRegistry_AS.getTestRunStatus(t);this.testRunStatus_$.set(e),(e.status==="completed"||e.status==="failed")&&(this.clearRunPollingIntervalOnly(),this.testRunPollingActive_$.set(!1))}catch(e){this.testRunError_$.set(e),this.clearRunPollingIntervalOnly(),this.testRunPollingActive_$.set(!1)}})}startModelTestRunProgressSocket(){this.modelTestRunProgressSocketSub||(this.modelTestRunProgressSocketSub=this.socket_CS.event$.subscribe(t=>{if(t.event!=="user-notification")return;let e=t.payload??{};if(e.type!==D)return;let s=e.runId,r=e.status,n=e.current,l=e.total,f=e.currentTask,m=e.error,u=e.failedTask,g=e.errorDetails;this.setTestRunProgressFromSocket({runId:typeof s=="string"?s:void 0,status:typeof r=="string"?r:void 0,current:typeof n=="number"?n:void 0,total:typeof l=="number"?l:void 0,currentTask:f,error:typeof m=="string"?m:void 0,failedTask:u,errorDetails:g})}))}stopModelTestRunProgressSocket(){this.modelTestRunProgressSocketSub&&(this.modelTestRunProgressSocketSub.unsubscribe(),this.modelTestRunProgressSocketSub=null)}startModelTestResultSavedSocket(){this.modelTestResultSavedSocketSub||(this.modelTestResultSavedSocketSub=this.socket_CS.event$.subscribe(t=>{if(t.event!=="user-notification")return;let e=t.payload??{};e.type===w&&this.mergeResultFromSocket(e)}))}stopModelTestResultSavedSocket(){this.modelTestResultSavedSocketSub&&(this.modelTestResultSavedSocketSub.unsubscribe(),this.modelTestResultSavedSocketSub=null)}mergeResultFromSocket(t){let e=this.testRunId_$();if(!e||t.runId!==e)return;let s=this.testRunStatus_$();if(!s)return;let r=d.parseResultItemFromSocket(t);if(!r)return;let n=R=>`${R.provider}|${R.model}|${R.promptId}|${R.reasoningLevel??"none"}`,l=n(r),m=[...s.results.filter(R=>n(R)!==l),r],u=t.current,g=t.total,h=typeof u=="number"?u:s.progress?.current,y=typeof g=="number"?g:s.progress?.total;this.testRunStatus_$.set(S(_({},s),{results:m,progress:typeof y=="number"&&y>0&&typeof h=="number"?{current:Math.max(h,s.progress?.current??0),total:y}:s.progress}));let p=this.entryDetail_$();if(p&&r.provider===p.provider&&r.model===p.modelName){let b=this.results_$().filter(C=>n(C)!==l);this.results_$.set([r,...b])}}static parseResultItemFromSocket(t){let e=t.provider,s=t.model,r=t.promptId,n=t.score;return typeof e!="string"||typeof s!="string"||typeof r!="string"?null:{provider:e,model:s,promptId:r,reasoningLevel:typeof t.reasoningLevel=="string"?t.reasoningLevel:void 0,score:typeof n=="number"?n:0,analysis:typeof t.analysis=="string"?t.analysis:void 0,promptText:typeof t.promptText=="string"?t.promptText:void 0,modelOutput:typeof t.modelOutput=="string"?t.modelOutput:void 0,thinking:typeof t.thinking=="string"?t.thinking:void 0,generationTimeMs:typeof t.generationTimeMs=="number"?t.generationTimeMs:void 0,analyzerProvider:typeof t.analyzerProvider=="string"?t.analyzerProvider:void 0,analyzerModel:typeof t.analyzerModel=="string"?t.analyzerModel:void 0,inputTokens:typeof t.inputTokens=="number"?t.inputTokens:void 0,outputTokens:typeof t.outputTokens=="number"?t.outputTokens:void 0,thinkingTokens:typeof t.thinkingTokens=="number"?t.thinkingTokens:void 0,createdAt:typeof t.createdAt=="string"?t.createdAt:void 0}}setTestRunProgressFromSocket(t){let e=this.testRunId_$();if(!e||t.runId!==e)return;let s=this.testRunStatus_$();if(!s)return;let r=d.parseRunStatusFromSocket(t.status,s.status),n=d.parseFailedTaskFromSocketPayload(t.failedTask),l=d.parseErrorDetailsFromSocketPayload(t.errorDetails),f=t.error!==void 0?t.error:s.error;this.testRunStatus_$.set(S(_({},s),{status:r,progress:typeof t.total=="number"&&t.total>0?{current:t.current??0,total:t.total}:s.progress,error:f,failedTask:n??s.failedTask,errorDetails:l??s.errorDetails}));let m=typeof t.status=="string"?t.status:"";if(m===c.completed||m===c.failed){this.modelTestRunProgressCurrentTask_$.set(null);return}let u=t.currentTask;if(u&&typeof u=="object"&&u!==null&&"promptId"in u){let g=u,h=g.promptId,y=g.provider,p=g.modelName;this.modelTestRunProgressCurrentTask_$.set({provider:typeof y=="string"?y:"",modelName:typeof p=="string"?p:"",promptId:typeof h=="string"?h:""});return}this.modelTestRunProgressCurrentTask_$.set(null)}static isPlainObjectRecord(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}static parseFailedTaskFromSocketPayload(t){if(!d.isPlainObjectRecord(t))return;let e=t,s=e.provider,r=e.model,n=e.promptId;if(!(typeof s!="string"||typeof r!="string"||typeof n!="string"))return{provider:s,model:r,promptId:n}}static parseErrorDetailsFromSocketPayload(t){if(!d.isPlainObjectRecord(t))return;let e=t,s=e.message;if(typeof s!="string")return;let r=e.errorCode,n=e.stack;return{message:s,errorCode:typeof r=="string"?r:void 0,stack:typeof n=="string"?n:void 0}}static parseRunStatusFromSocket(t,e){return typeof t!="string"?e:t===c.pending?c.pending:t===c.running?c.running:t===c.completed?c.completed:t===c.failed?c.failed:e}loadSetupConfigForRegistry(){return o(this,null,function*(){try{let t=yield this.settings_AS.getSection(k.llmProviders),e=typeof t.defaultLlmProvider=="string"?t.defaultLlmProvider:void 0,s=typeof t.defaultLlmModel=="string"?t.defaultLlmModel:void 0,r={},n=t.localAiSettings;if(Array.isArray(n))for(let f of n){if(f==null||typeof f!="object"||Array.isArray(f))continue;let m=f,u=m.key,g=m.name;if(typeof u!="string"||!u.trim())continue;let h=typeof g=="string"?g.trim():"",y=h.length>0?h:"Local AI",p=I.build({localAiKey:u.trim()});r[p]={label:y}}let l={defaultLlmProvider:e,defaultLlmModel:s,llmProviderConfig:Object.keys(r).length>0?r:void 0};return this.setupConfigForRegistry_$.set(l),l}catch{return this.setupConfigForRegistry_$.set(null),null}})}getCachedList(){return this.list_$()}getCachedEntryDetail(){return this.entryDetail_$()}getCachedPrompts(){return this.prompts_$()}getCachedResults(){return this.results_$()}getCachedSetupConfigForRegistry(){return this.setupConfigForRegistry_$()}static \u0275fac=function(e){return new(e||d)};static \u0275prov=P({token:d,factory:d.\u0275fac,providedIn:"root"})}return d})();export{q as a};
2
+ //# sourceMappingURL=chunk-LWUIDMNL.js.map
@@ -1,2 +1,2 @@
1
- import{I as p}from"./chunk-TIJCR5DW.js";import{C as l,G as h,aa as a,hb as b,k as i,p as o,xb as d,y as n}from"./chunk-TBMJSIBB.js";var g=(()=>{class r{http=l(d);baseUrl=`${p.api.baseUrl}/sch`;listJobs(){return o(this.http.get(`${this.baseUrl}/jobs`))}getJob(e){return o(this.http.get(`${this.baseUrl}/jobs/${e}`))}createJob(e){return o(this.http.post(`${this.baseUrl}/jobs`,e))}updateJob(e,t){return o(this.http.patch(`${this.baseUrl}/jobs/${e}`,t))}deleteJob(e){return o(this.http.delete(`${this.baseUrl}/jobs/${e}`))}enableJob(e){return o(this.http.post(`${this.baseUrl}/jobs/${e}/enable`,{}))}disableJob(e){return o(this.http.post(`${this.baseUrl}/jobs/${e}/disable`,{}))}pauseJob(e){return o(this.http.post(`${this.baseUrl}/jobs/${e}/pause`,{}))}resumeJob(e){return o(this.http.post(`${this.baseUrl}/jobs/${e}/resume`,{}))}triggerNow(e){let t=[];e.bypass&&t.push("bypass=true"),e.forcePolicy&&t.push(`forcePolicy=${encodeURIComponent(e.forcePolicy)}`),e.dryRun&&t.push("dryRun=true");let s=t.length?`?${t.join("&")}`:"";return o(this.http.post(`${this.baseUrl}/jobs/${e.jobId}/trigger-now${s}`,{reason:e.reason}))}listExecutions(e){let t=[];e.jobId&&t.push(`jobId=${encodeURIComponent(e.jobId)}`),e.status&&t.push(`status=${encodeURIComponent(e.status)}`),e.targetSessionId&&t.push(`targetSessionId=${encodeURIComponent(e.targetSessionId)}`),e.from&&t.push(`from=${encodeURIComponent(e.from)}`),e.to&&t.push(`to=${encodeURIComponent(e.to)}`);let s=t.length?`?${t.join("&")}`:"";return o(this.http.get(`${this.baseUrl}/executions${s}`))}getExecution(e){return o(this.http.get(`${this.baseUrl}/executions/${e}`))}getDefaults(){return o(this.http.get(`${this.baseUrl}/defaults`))}applyDefaults(){return o(this.http.post(`${this.baseUrl}/defaults/apply`,{}))}static \u0275fac=function(t){return new(t||r)};static \u0275prov=n({token:r,factory:r.\u0275fac,providedIn:"root"})}return r})();var F=(()=>{class r{jobs_AS=l(g);jobs_$=a([]);recentExecutions_$=a(new Map);isLoading_$=a(!1);errorMessage_$=a(null);scheduledSessionIds_$=b(()=>{let e=new Set;for(let t of this.jobs_$()){if(t.enabled===!1)continue;let s=t.target?.payload?.sessionId?.trim();s&&e.add(s)}return e});loadAll(){return i(this,null,function*(){this.isLoading_$.set(!0),this.errorMessage_$.set(null);try{let t=(yield this.jobs_AS.listJobs()).jobs??[];this.jobs_$.set(t),this.loadRecentExecutionsForJobs(t)}catch(e){this.errorMessage_$.set(e?.message??"Failed to load scheduler jobs")}finally{this.isLoading_$.set(!1)}})}loadRecentExecutionsForJobs(e){return i(this,null,function*(){let t=new Map;try{let $=(yield this.jobs_AS.listExecutions({})).executions??[];for(let j of e){let c=j._id??"";if(!c)continue;let y=$.filter(u=>u.jobId===c).sort((u,m)=>(m.scheduledAt??"").localeCompare(u.scheduledAt??"")).slice(0,10);t.set(c,y)}}catch{}this.recentExecutions_$.set(t)})}getJob(e){return i(this,null,function*(){try{return(yield this.jobs_AS.getJob(e)).job}catch(t){return this.errorMessage_$.set(t?.message??"Failed to load job"),null}})}create(e){return i(this,null,function*(){try{let t=yield this.jobs_AS.createJob(e);return yield this.loadAll(),t.job}catch(t){return this.errorMessage_$.set(t?.message??"Failed to create job"),null}})}update(e,t){return i(this,null,function*(){try{let s=yield this.jobs_AS.updateJob(e,t);return yield this.loadAll(),s.job}catch(s){return this.errorMessage_$.set(s?.message??"Failed to update job"),null}})}remove(e){return i(this,null,function*(){try{let t=yield this.jobs_AS.deleteJob(e);return yield this.loadAll(),t.deleted}catch(t){return this.errorMessage_$.set(t?.message??"Failed to delete job"),!1}})}toggleEnabled(e,t){return i(this,null,function*(){try{t?yield this.jobs_AS.enableJob(e):yield this.jobs_AS.disableJob(e),yield this.loadAll()}catch(s){this.errorMessage_$.set(s?.message??"Failed to toggle enabled state")}})}togglePaused(e,t){return i(this,null,function*(){try{t?yield this.jobs_AS.pauseJob(e):yield this.jobs_AS.resumeJob(e),yield this.loadAll()}catch(s){this.errorMessage_$.set(s?.message??"Failed to toggle paused state")}})}triggerNow(e){return i(this,null,function*(){try{return(yield this.jobs_AS.triggerNow(e)).triggered}catch(t){return this.errorMessage_$.set(t?.message??"Failed to trigger job"),!1}})}listExecutions(e){return i(this,null,function*(){try{return(yield this.jobs_AS.listExecutions({jobId:e.jobId})).executions??[]}catch(t){return this.errorMessage_$.set(t?.message??"Failed to load executions"),[]}})}getDefaults(){return i(this,null,function*(){try{return(yield this.jobs_AS.getDefaults()).defaults}catch(e){return this.errorMessage_$.set(e?.message??"Failed to load defaults"),null}})}static \u0275fac=function(t){return new(t||r)};static \u0275prov=n({token:r,factory:r.\u0275fac,providedIn:"root"})}return r})();var E=(()=>{class r{transform(e){if(!e||!e.preset)return"\u2014";let t=e.preset,s=e.intervalValue;if(s===void 0||!isFinite(s))return t;switch(t){case"every-n-minutes":return`every ${s} minutes`;case"every-n-hours":return`every ${s} hours`;case"every-n-days":return`every ${s} days`;case"windowed-interval":return`every ${s} min (window)`;default:return t}}static \u0275fac=function(t){return new(t||r)};static \u0275pipe=h({name:"schSchedulePresetLabel",type:r,pure:!0,standalone:!0})}return r})();export{F as a,E as b};
2
- //# sourceMappingURL=chunk-O6IRGFCX.js.map
1
+ import{I as p}from"./chunk-ZUSKVUGS.js";import{C as l,G as h,aa as a,hb as b,k as i,p as o,xb as d,y as n}from"./chunk-TBMJSIBB.js";var g=(()=>{class r{http=l(d);baseUrl=`${p.api.baseUrl}/sch`;listJobs(){return o(this.http.get(`${this.baseUrl}/jobs`))}getJob(e){return o(this.http.get(`${this.baseUrl}/jobs/${e}`))}createJob(e){return o(this.http.post(`${this.baseUrl}/jobs`,e))}updateJob(e,t){return o(this.http.patch(`${this.baseUrl}/jobs/${e}`,t))}deleteJob(e){return o(this.http.delete(`${this.baseUrl}/jobs/${e}`))}enableJob(e){return o(this.http.post(`${this.baseUrl}/jobs/${e}/enable`,{}))}disableJob(e){return o(this.http.post(`${this.baseUrl}/jobs/${e}/disable`,{}))}pauseJob(e){return o(this.http.post(`${this.baseUrl}/jobs/${e}/pause`,{}))}resumeJob(e){return o(this.http.post(`${this.baseUrl}/jobs/${e}/resume`,{}))}triggerNow(e){let t=[];e.bypass&&t.push("bypass=true"),e.forcePolicy&&t.push(`forcePolicy=${encodeURIComponent(e.forcePolicy)}`),e.dryRun&&t.push("dryRun=true");let s=t.length?`?${t.join("&")}`:"";return o(this.http.post(`${this.baseUrl}/jobs/${e.jobId}/trigger-now${s}`,{reason:e.reason}))}listExecutions(e){let t=[];e.jobId&&t.push(`jobId=${encodeURIComponent(e.jobId)}`),e.status&&t.push(`status=${encodeURIComponent(e.status)}`),e.targetSessionId&&t.push(`targetSessionId=${encodeURIComponent(e.targetSessionId)}`),e.from&&t.push(`from=${encodeURIComponent(e.from)}`),e.to&&t.push(`to=${encodeURIComponent(e.to)}`);let s=t.length?`?${t.join("&")}`:"";return o(this.http.get(`${this.baseUrl}/executions${s}`))}getExecution(e){return o(this.http.get(`${this.baseUrl}/executions/${e}`))}getDefaults(){return o(this.http.get(`${this.baseUrl}/defaults`))}applyDefaults(){return o(this.http.post(`${this.baseUrl}/defaults/apply`,{}))}static \u0275fac=function(t){return new(t||r)};static \u0275prov=n({token:r,factory:r.\u0275fac,providedIn:"root"})}return r})();var F=(()=>{class r{jobs_AS=l(g);jobs_$=a([]);recentExecutions_$=a(new Map);isLoading_$=a(!1);errorMessage_$=a(null);scheduledSessionIds_$=b(()=>{let e=new Set;for(let t of this.jobs_$()){if(t.enabled===!1)continue;let s=t.target?.payload?.sessionId?.trim();s&&e.add(s)}return e});loadAll(){return i(this,null,function*(){this.isLoading_$.set(!0),this.errorMessage_$.set(null);try{let t=(yield this.jobs_AS.listJobs()).jobs??[];this.jobs_$.set(t),this.loadRecentExecutionsForJobs(t)}catch(e){this.errorMessage_$.set(e?.message??"Failed to load scheduler jobs")}finally{this.isLoading_$.set(!1)}})}loadRecentExecutionsForJobs(e){return i(this,null,function*(){let t=new Map;try{let $=(yield this.jobs_AS.listExecutions({})).executions??[];for(let j of e){let c=j._id??"";if(!c)continue;let y=$.filter(u=>u.jobId===c).sort((u,m)=>(m.scheduledAt??"").localeCompare(u.scheduledAt??"")).slice(0,10);t.set(c,y)}}catch{}this.recentExecutions_$.set(t)})}getJob(e){return i(this,null,function*(){try{return(yield this.jobs_AS.getJob(e)).job}catch(t){return this.errorMessage_$.set(t?.message??"Failed to load job"),null}})}create(e){return i(this,null,function*(){try{let t=yield this.jobs_AS.createJob(e);return yield this.loadAll(),t.job}catch(t){return this.errorMessage_$.set(t?.message??"Failed to create job"),null}})}update(e,t){return i(this,null,function*(){try{let s=yield this.jobs_AS.updateJob(e,t);return yield this.loadAll(),s.job}catch(s){return this.errorMessage_$.set(s?.message??"Failed to update job"),null}})}remove(e){return i(this,null,function*(){try{let t=yield this.jobs_AS.deleteJob(e);return yield this.loadAll(),t.deleted}catch(t){return this.errorMessage_$.set(t?.message??"Failed to delete job"),!1}})}toggleEnabled(e,t){return i(this,null,function*(){try{t?yield this.jobs_AS.enableJob(e):yield this.jobs_AS.disableJob(e),yield this.loadAll()}catch(s){this.errorMessage_$.set(s?.message??"Failed to toggle enabled state")}})}togglePaused(e,t){return i(this,null,function*(){try{t?yield this.jobs_AS.pauseJob(e):yield this.jobs_AS.resumeJob(e),yield this.loadAll()}catch(s){this.errorMessage_$.set(s?.message??"Failed to toggle paused state")}})}triggerNow(e){return i(this,null,function*(){try{return(yield this.jobs_AS.triggerNow(e)).triggered}catch(t){return this.errorMessage_$.set(t?.message??"Failed to trigger job"),!1}})}listExecutions(e){return i(this,null,function*(){try{return(yield this.jobs_AS.listExecutions({jobId:e.jobId})).executions??[]}catch(t){return this.errorMessage_$.set(t?.message??"Failed to load executions"),[]}})}getDefaults(){return i(this,null,function*(){try{return(yield this.jobs_AS.getDefaults()).defaults}catch(e){return this.errorMessage_$.set(e?.message??"Failed to load defaults"),null}})}static \u0275fac=function(t){return new(t||r)};static \u0275prov=n({token:r,factory:r.\u0275fac,providedIn:"root"})}return r})();var E=(()=>{class r{transform(e){if(!e||!e.preset)return"\u2014";let t=e.preset,s=e.intervalValue;if(s===void 0||!isFinite(s))return t;switch(t){case"every-n-minutes":return`every ${s} minutes`;case"every-n-hours":return`every ${s} hours`;case"every-n-days":return`every ${s} days`;case"windowed-interval":return`every ${s} min (window)`;default:return t}}static \u0275fac=function(t){return new(t||r)};static \u0275pipe=h({name:"schSchedulePresetLabel",type:r,pure:!0,standalone:!0})}return r})();export{F as a,E as b};
2
+ //# sourceMappingURL=chunk-LYMCPIS7.js.map
@@ -1,2 +1,2 @@
1
- import{b as a}from"./chunk-W7OH67K2.js";var f=class{static extract(t){if(t.toolName)return t.toolName;if(t.rawData){let s=t.rawData.name??t.rawData.tool_name??t.rawData.last_tool_name;if(typeof s=="string")return s}let o=t.bodyText.indexOf(":");return o>0?t.bodyText.substring(0,o).trim():t.bodyText.trim()}};var b=class e{static DEFAULT_GROUPABLE_TOOLS=new Set(["Read","Bash","Grep","Glob"]);static DEFAULT_MIN_GROUP_SIZE=2;static groupSubAgentItems(t,o){let s=new Map;for(let r=0;r<t.length;r++){let n=t[r];if(n.kind===a.tool&&n.toolName==="Agent"){let i=e.resolveAgentId(n);i&&s.set(i,{item:n,index:r})}}if(!s.size)return t;let c=new Map,d=new Set;for(let r=0;r<t.length;r++){let n=t[r];if(n.parentAgentId&&s.has(n.parentAgentId)){let i=c.get(n.parentAgentId)??[];i.push(n),c.set(n.parentAgentId,i),d.add(r)}}let l=[];for(let r=0;r<t.length;r++){if(d.has(r))continue;let n=t[r];if(n.kind===a.tool&&n.toolName==="Agent"){let i=e.resolveAgentId(n),p=c.get(i)??[],g=[n,...p],I=e.buildSubAgentLabel(n),A=e.extractSubagentType(n),y=e.groupConsecutiveToolItems(g,o);l.push({listKey:e.newListKey(),kind:a.subAgentGroup,bodyText:I,groupItems:y,groupToolName:A||"Agent",rawData:n.rawData})}else l.push(n)}return l}static groupConsecutiveToolItems(t,o){let s=o?.groupableTools??e.DEFAULT_GROUPABLE_TOOLS,c=o?.minGroupSize??e.DEFAULT_MIN_GROUP_SIZE,d=[],l=[],r="",n=()=>{if(!l.length)return;let i=l.filter(p=>p.kind===a.tool).length;i>=c?d.push({listKey:e.newListKey(),kind:a.toolGroup,bodyText:`${r} \xD7 ${i}`,groupItems:l,groupToolName:r}):d.push(...l),l=[],r=""};for(let i of t){if(i.kind===a.tool){let p=f.extract(i);if(s.has(p)){r&&r!==p&&n(),r=p,l.push(i);continue}}if(i.kind===a.toolResult&&l.length){l.push(i);continue}n(),d.push(i)}return n(),d}static resolveAgentId(t){return t.toolCallId?t.toolCallId:t.rawData&&typeof t.rawData.id=="string"?t.rawData.id:""}static extractSubagentType(t){let o=t.rawData?.input;if(!o||typeof o!="object")return"";let s=o.subagent_type;return typeof s=="string"?s:""}static extractDescription(t){let o=t.rawData?.input;if(!o||typeof o!="object")return"";let s=o.description;return typeof s=="string"?s:""}static buildSubAgentLabel(t){let o=e.extractSubagentType(t),s=e.extractDescription(t);return o?`${o}: ${s||"..."}`:s||"Sub-agent"}static newListKey(){return globalThis.crypto.randomUUID()}};var u=function(e){return e.user="user",e.assistant="assistant",e.tool="tool",e.toolResult="tool-result",e.status="status",e.error="error",e.info="info",e.result="result",e.thinking="thinking",e.statusUpdate="status-update",e}(u||{});var h=class e{static fromAssembledMessage(t,o){let s=e.mapRoleToKind(t.messageRole),c=t.toolResult?{text:t.toolResult.text,expandableContent:t.toolResult.expandableContent,rawData:t.toolResult.rawData,isError:t.toolResult.isError}:void 0,d=t.messageRole===u.tool&&t.toolName==="Edit"&&!!t.expandableContent;return{listKey:t.messageKey,kind:s,bodyText:t.bodyText,timestampIso:t.timestamp,toolName:t.toolName,expandableContent:t.expandableContent,pairedResult:c,rawData:t.rawData,subtype:t.subtype,isUserAligned:t.isUserAligned,headerStatusDot:t.headerStatusDot==="error"?"error":void 0,flags:{showCopy:!0,showRawInfo:!0,useEditDiffForExpandable:d},tts:e.buildTts(t,o),toolCallId:t.toolCallId,parentAgentId:t.parentAgentId}}static buildTts(t,o){if(!(!o||!(t.messageRole===u.user||t.messageRole===u.assistant)||!t.bodyText.trim().length))return{messageKey:t.messageKey,sessionId:o.sessionId,role:t.messageRole,content:t.bodyText,timestampIso:t.timestamp,hasTtsAudio:o.cachedKeys.has(t.messageKey)}}static mapRoleToKind(t){switch(t){case u.user:return a.userPrompt;case u.assistant:return a.assistant;case u.tool:return a.tool;case u.toolResult:return a.toolResult;case u.status:return a.status;case u.error:return a.error;case u.info:return a.info;case u.result:return a.result;case u.thinking:return a.thinking;case u.statusUpdate:return a.statusUpdate;default:return a.info}}};export{b as a,h as b};
2
- //# sourceMappingURL=chunk-ZW4M7CJ2.js.map
1
+ import{b as a}from"./chunk-7SMKTOH2.js";var f=class{static extract(t){if(t.toolName)return t.toolName;if(t.rawData){let s=t.rawData.name??t.rawData.tool_name??t.rawData.last_tool_name;if(typeof s=="string")return s}let o=t.bodyText.indexOf(":");return o>0?t.bodyText.substring(0,o).trim():t.bodyText.trim()}};var b=class e{static DEFAULT_GROUPABLE_TOOLS=new Set(["Read","Bash","Grep","Glob"]);static DEFAULT_MIN_GROUP_SIZE=2;static groupSubAgentItems(t,o){let s=new Map;for(let r=0;r<t.length;r++){let n=t[r];if(n.kind===a.tool&&n.toolName==="Agent"){let i=e.resolveAgentId(n);i&&s.set(i,{item:n,index:r})}}if(!s.size)return t;let c=new Map,d=new Set;for(let r=0;r<t.length;r++){let n=t[r];if(n.parentAgentId&&s.has(n.parentAgentId)){let i=c.get(n.parentAgentId)??[];i.push(n),c.set(n.parentAgentId,i),d.add(r)}}let l=[];for(let r=0;r<t.length;r++){if(d.has(r))continue;let n=t[r];if(n.kind===a.tool&&n.toolName==="Agent"){let i=e.resolveAgentId(n),p=c.get(i)??[],g=[n,...p],I=e.buildSubAgentLabel(n),A=e.extractSubagentType(n),y=e.groupConsecutiveToolItems(g,o);l.push({listKey:e.newListKey(),kind:a.subAgentGroup,bodyText:I,groupItems:y,groupToolName:A||"Agent",rawData:n.rawData})}else l.push(n)}return l}static groupConsecutiveToolItems(t,o){let s=o?.groupableTools??e.DEFAULT_GROUPABLE_TOOLS,c=o?.minGroupSize??e.DEFAULT_MIN_GROUP_SIZE,d=[],l=[],r="",n=()=>{if(!l.length)return;let i=l.filter(p=>p.kind===a.tool).length;i>=c?d.push({listKey:e.newListKey(),kind:a.toolGroup,bodyText:`${r} \xD7 ${i}`,groupItems:l,groupToolName:r}):d.push(...l),l=[],r=""};for(let i of t){if(i.kind===a.tool){let p=f.extract(i);if(s.has(p)){r&&r!==p&&n(),r=p,l.push(i);continue}}if(i.kind===a.toolResult&&l.length){l.push(i);continue}n(),d.push(i)}return n(),d}static resolveAgentId(t){return t.toolCallId?t.toolCallId:t.rawData&&typeof t.rawData.id=="string"?t.rawData.id:""}static extractSubagentType(t){let o=t.rawData?.input;if(!o||typeof o!="object")return"";let s=o.subagent_type;return typeof s=="string"?s:""}static extractDescription(t){let o=t.rawData?.input;if(!o||typeof o!="object")return"";let s=o.description;return typeof s=="string"?s:""}static buildSubAgentLabel(t){let o=e.extractSubagentType(t),s=e.extractDescription(t);return o?`${o}: ${s||"..."}`:s||"Sub-agent"}static newListKey(){return globalThis.crypto.randomUUID()}};var u=function(e){return e.user="user",e.assistant="assistant",e.tool="tool",e.toolResult="tool-result",e.status="status",e.error="error",e.info="info",e.result="result",e.thinking="thinking",e.statusUpdate="status-update",e}(u||{});var h=class e{static fromAssembledMessage(t,o){let s=e.mapRoleToKind(t.messageRole),c=t.toolResult?{text:t.toolResult.text,expandableContent:t.toolResult.expandableContent,rawData:t.toolResult.rawData,isError:t.toolResult.isError}:void 0,d=t.messageRole===u.tool&&t.toolName==="Edit"&&!!t.expandableContent;return{listKey:t.messageKey,kind:s,bodyText:t.bodyText,timestampIso:t.timestamp,toolName:t.toolName,expandableContent:t.expandableContent,pairedResult:c,rawData:t.rawData,subtype:t.subtype,isUserAligned:t.isUserAligned,headerStatusDot:t.headerStatusDot==="error"?"error":void 0,flags:{showCopy:!0,showRawInfo:!0,useEditDiffForExpandable:d},tts:e.buildTts(t,o),toolCallId:t.toolCallId,parentAgentId:t.parentAgentId}}static buildTts(t,o){if(!(!o||!(t.messageRole===u.user||t.messageRole===u.assistant)||!t.bodyText.trim().length))return{messageKey:t.messageKey,sessionId:o.sessionId,role:t.messageRole,content:t.bodyText,timestampIso:t.timestamp,hasTtsAudio:o.cachedKeys.has(t.messageKey)}}static mapRoleToKind(t){switch(t){case u.user:return a.userPrompt;case u.assistant:return a.assistant;case u.tool:return a.tool;case u.toolResult:return a.toolResult;case u.status:return a.status;case u.error:return a.error;case u.info:return a.info;case u.result:return a.result;case u.thinking:return a.thinking;case u.statusUpdate:return a.statusUpdate;default:return a.info}}};export{b as a,h as b};
2
+ //# sourceMappingURL=chunk-NO6TCJGM.js.map
@@ -1,3 +1,3 @@
1
- import{a as n}from"./chunk-S46BSLUB.js";import{G as o}from"./chunk-TBMJSIBB.js";var u=(()=>{class e{transform(t){return n.formatAbsoluteForTooltip(t)}static \u0275fac=function(i){return new(i||e)};static \u0275pipe=o({name:"sAbsoluteTime",type:e,pure:!0,standalone:!0})}return e})();var d=(()=>{class e{transform(t){return n.formatCompactRelativeTime(t)}static \u0275fac=function(i){return new(i||e)};static \u0275pipe=o({name:"sTimeAgo",type:e,pure:!0,standalone:!0})}return e})();var a=class e{static normalizeForSearch(r){return typeof r!="string"||r.length===0?"":r.trim().toLowerCase().normalize("NFD").replace(new RegExp("\\p{Diacritic}","gu"),"")}static includesText(r,t){let i=e.normalizeForSearch(t);return i.length===0?!0:e.normalizeForSearch(r).includes(i)}};var s=class{static looksLikeJson(r){let t=r.trim();return t.startsWith("{")&&t.endsWith("}")||t.startsWith("[")&&t.endsWith("]")}static formatJson(r){try{let t=JSON.parse(r.trim());return JSON.stringify(t,null,2)}catch{return r}}static lineCount(r){return r.split(`
1
+ import{a as n}from"./chunk-HRWESQZ7.js";import{G as o}from"./chunk-TBMJSIBB.js";var u=(()=>{class e{transform(t){return n.formatAbsoluteForTooltip(t)}static \u0275fac=function(i){return new(i||e)};static \u0275pipe=o({name:"sAbsoluteTime",type:e,pure:!0,standalone:!0})}return e})();var d=(()=>{class e{transform(t){return n.formatCompactRelativeTime(t)}static \u0275fac=function(i){return new(i||e)};static \u0275pipe=o({name:"sTimeAgo",type:e,pure:!0,standalone:!0})}return e})();var a=class e{static normalizeForSearch(r){return typeof r!="string"||r.length===0?"":r.trim().toLowerCase().normalize("NFD").replace(new RegExp("\\p{Diacritic}","gu"),"")}static includesText(r,t){let i=e.normalizeForSearch(t);return i.length===0?!0:e.normalizeForSearch(r).includes(i)}};var s=class{static looksLikeJson(r){let t=r.trim();return t.startsWith("{")&&t.endsWith("}")||t.startsWith("[")&&t.endsWith("]")}static formatJson(r){try{let t=JSON.parse(r.trim());return JSON.stringify(t,null,2)}catch{return r}}static lineCount(r){return r.split(`
2
2
  `).length}};export{a,u as b,d as c,s as d};
3
- //# sourceMappingURL=chunk-ZPE6HI3H.js.map
3
+ //# sourceMappingURL=chunk-NRQ7LIBM.js.map
@@ -1,2 +1,2 @@
1
- import{a as M}from"./chunk-5DUG67IY.js";import{a as z,b as K}from"./chunk-O6IRGFCX.js";import{b as N,c as U}from"./chunk-ZPE6HI3H.js";import{e as H}from"./chunk-4AVVQGND.js";import{a as P}from"./chunk-FLAJXIYW.js";import{a as k}from"./chunk-5UPNU54P.js";import{j as O}from"./chunk-ZLCRMQAK.js";import{I as L,p as Y}from"./chunk-TIJCR5DW.js";import{$a as b,C as m,D as w,Fa as a,Ga as A,Ha as u,T as R,Ta as T,U as f,Z as s,aa as C,ab as g,da as x,ga as _,h as G,hb as $,k as h,la as c,mb as F,na as q,oa as v,p as S,pa as I,qa as r,ra as n,ub as Q,va as D,wa as d,xb as j,y}from"./chunk-TBMJSIBB.js";var J=(t,o)=>o._id;function Z(t,o){t&1&&(r(0,"div",1),a(1,"Nincs kiv\xE1lasztott session."),n())}function ee(t,o){t&1&&(r(0,"div",1),a(1," Ehhez a sessionh\xF6z nincs akt\xEDv schedule job. "),n())}function te(t,o){t&1&&(r(0,"span",7),a(1,"paused"),n())}function ie(t,o){t&1&&(r(0,"span",8),a(1,"disabled"),n())}function ne(t,o){t&1&&(r(0,"span",9),a(1,"dry-run"),n())}function oe(t,o){if(t&1&&(r(0,"div",10),a(1),n()),t&2){let e=d().$implicit;s(),A(e.description)}}function se(t,o){if(t&1&&(r(0,"span")(1,"span",15),a(2,"tz:"),n(),a(3),n()),t&2){let e=d().$implicit;s(3),u(" ",e.timezone,"")}}function ae(t,o){if(t&1&&(r(0,"span",12),b(1,"sAbsoluteTime"),r(2,"span",15),a(3,"next:"),n(),a(4),b(5,"sTimeAgo"),n()),t&2){let e=d().$implicit;_("title",g(1,2,e.nextDueAt)),s(4),u(" ",g(5,4,e.nextDueAt),"")}}function re(t,o){if(t&1&&(r(0,"span",12),b(1,"sAbsoluteTime"),r(2,"span",15),a(3,"last:"),n(),a(4),b(5,"sTimeAgo"),n()),t&2){let e=d().$implicit;_("title",g(1,2,e.lastTriggeredAt)),s(4),u(" ",g(5,4,e.lastTriggeredAt),"")}}function le(t,o){if(t&1&&(r(0,"span",16),a(1),n()),t&2){let e=o.$implicit,i=d(4);_("ngClass",i.getStatusColorClass(e.status))("title",(e.scheduledAt||"\u2014")+" \u2014 "+(e.status||"\u2014")+(e.skipReason?" ("+e.skipReason+")":"")+(e.errorDetails!=null&&e.errorDetails.message?": "+e.errorDetails.message:"")),s(),u(" ",i.getStatusLabel(e.status)," ")}}function de(t,o){if(t&1&&(r(0,"div",13),v(1,le,2,3,"span",16,J),n()),t&2){let e=d().$implicit,i=d(2);s(),I(i.getRecentExecutionsForJob(e._id))}}function ue(t,o){t&1&&(r(0,"div",14),a(1,"M\xE9g nem volt execution."),n())}function ce(t,o){if(t&1&&(r(0,"div",3)(1,"div",4)(2,"span",5),a(3),n(),r(4,"span",6),a(5),b(6,"schSchedulePresetLabel"),n(),x(7,te,2,0,"span",7)(8,ie,2,0,"span",8)(9,ne,2,0,"span",9),n(),x(10,oe,2,1,"div",10),r(11,"div",11),x(12,se,4,1,"span")(13,ae,6,6,"span",12)(14,re,6,6,"span",12),n(),x(15,de,3,0,"div",13)(16,ue,2,0,"div",14),n()),t&2){let e=o.$implicit,i=d(2);s(3),u(" ",e.name||e._id," "),s(2),u(" ",g(6,10,e.schedule)," "),s(2),c(e.paused?7:-1),s(),c(e.enabled===!1?8:-1),s(),c(e.dryRun?9:-1),s(),c(e.description?10:-1),s(2),c(e.timezone?12:-1),s(),c(e.nextDueAt?13:-1),s(),c(e.lastTriggeredAt?14:-1),s(),c(i.getRecentExecutionsForJob(e._id).length>0?15:16)}}function pe(t,o){if(t&1&&(r(0,"div",2),v(1,ce,17,12,"div",3,J),n()),t&2){let e=d();s(),I(e.jobsForSession_$())}}var Be=(()=>{class t{sessionId=f.required();isOpen=f.required();closed=R();jobs_DS=m(z);jobsForSession_$=$(()=>{let e=this.sessionId();return e?this.jobs_DS.jobs_$().filter(i=>i.target?.payload?.sessionId===e):[]});executionsByJob_$=$(()=>this.jobs_DS.recentExecutions_$());ngOnInit(){this.jobs_DS.jobs_$().length===0&&this.jobs_DS.loadAll()}getRecentExecutionsForJob(e){return e?(this.executionsByJob_$().get(e)??[]).slice(0,5):[]}getStatusColorClass(e){switch(e){case"completed":return"bg-green-500/20 text-green-400";case"triggered":return"bg-blue-500/20 text-blue-400";case"skipped":return"bg-yellow-500/20 text-yellow-400";case"failed":return"bg-red-500/20 text-red-400";case"cancelled":return"bg-neutral-500/20 text-neutral-400";case"dry-run":return"bg-purple-500/20 text-purple-400";default:return"bg-neutral-700/30 text-neutral-300"}}getStatusLabel(e){switch(e){case"completed":return"OK";case"triggered":return"RUN";case"skipped":return"SKP";case"failed":return"FAIL";case"cancelled":return"CNL";case"dry-run":return"DRY";default:return e??"\u2014"}}handleClose(){this.closed.emit()}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=w({type:t,selectors:[["app-sch-schedule-popup"]],inputs:{sessionId:[1,"sessionId"],isOpen:[1,"isOpen"]},outputs:{closed:"closed"},standalone:!0,features:[T],decls:4,vars:6,consts:[[3,"closed","isOpen","title","maxWidth","bodyFlexColumn","headerBorderClass"],[1,"p-4","text-center","text-neutral-500","text-sm"],[1,"flex-1","overflow-y-auto","space-y-3","pr-1"],[1,"border","border-neutral-700/60","rounded-md","p-2.5","bg-neutral-900/40"],[1,"flex","items-center","gap-2","mb-1.5"],[1,"text-sm","font-medium","text-neutral-200","truncate"],[1,"text-[10px]","text-neutral-400"],[1,"text-[10px]","px-1","rounded","bg-yellow-500/20","text-yellow-400"],[1,"text-[10px]","px-1","rounded","bg-neutral-500/20","text-neutral-400"],[1,"text-[10px]","px-1","rounded","bg-purple-500/20","text-purple-400"],[1,"text-[11px]","text-neutral-400","mb-1.5","truncate"],[1,"flex","flex-wrap","gap-x-3","gap-y-0.5","text-[10px]","text-neutral-500","mb-2"],[3,"title"],[1,"flex","flex-wrap","gap-1"],[1,"text-[10px]","text-neutral-500"],[1,"text-neutral-600"],[1,"text-[10px]","px-1.5","py-0.5","rounded","font-mono",3,"ngClass","title"]],template:function(i,l){i&1&&(r(0,"app-s-modal",0),D("closed",function(){return l.handleClose()}),x(1,Z,2,0,"div",1)(2,ee,2,0,"div",1)(3,pe,3,0,"div",2),n()),i&2&&(_("isOpen",l.isOpen())("title","Schedule inf\xF3k ehhez a session-h\xF6z")("maxWidth","lg")("bodyFlexColumn",!0)("headerBorderClass","border-neonCyan/50"),s(),c(l.sessionId()?l.jobsForSession_$().length===0?2:3:1))},dependencies:[Q,F,P,N,U,K],encapsulation:2})}return t})();var _e=(t,o)=>o._id;function me(t,o){t&1&&(r(0,"div",1),a(1,"Nincs kiv\xE1lasztott session."),n())}function xe(t,o){t&1&&(r(0,"div",1),a(1," Ehhez a sessionh\xF6z nincs koordin\xE1tor. "),n())}function he(t,o){if(t&1&&(r(0,"span")(1,"span",9),a(2,"provider:"),n(),a(3),n()),t&2){let e=d().$implicit;s(3),u(" ",e.providerName,"")}}function Se(t,o){if(t&1&&(r(0,"span")(1,"span",9),a(2,"model:"),n(),a(3),n()),t&2){let e=d().$implicit;s(3),u(" ",e.model,"")}}function fe(t,o){if(t&1&&(r(0,"span")(1,"span",9),a(2,"project:"),n(),a(3),n()),t&2){let e=d().$implicit;s(3),u(" ",e.projectId,"")}}function Ce(t,o){if(t&1&&(r(0,"div",10)(1,"span",9),a(2,"paused:"),n(),a(3),n()),t&2){let e=d().$implicit;_("title",e.pauseReason),s(3),u(" ",e.pauseReason," ")}}function ve(t,o){if(t&1&&(r(0,"div",11)(1,"span",9),a(2,"last:"),n(),a(3),n()),t&2){let e=d().$implicit;_("title",e.lastResponseSummary),s(3),u(" ",e.lastResponseSummary," ")}}function Ie(t,o){if(t&1&&(r(0,"span",13),a(1),n()),t&2){let e=o.$implicit;_("title",e),s(),u(" blocker: ",e," ")}}function be(t,o){if(t&1&&(r(0,"div",12),v(1,Ie,2,2,"span",13,q),n()),t&2){let e=d().$implicit;s(),I(e.blockers)}}function ge(t,o){if(t&1&&(r(0,"div",3)(1,"div",4)(2,"span",5),a(3),n(),r(4,"span",6),a(5),n()(),r(6,"div",7),x(7,he,4,1,"span")(8,Se,4,1,"span")(9,fe,4,1,"span"),n(),r(10,"div",8)(11,"span",9),a(12,"phase:"),n(),a(13),r(14,"span",9),a(15,"\xB7"),n(),r(16,"span",9),a(17,"phase-step:"),n(),a(18),r(19,"span",9),a(20,"\xB7"),n(),r(21,"span",9),a(22,"total:"),n(),a(23),n(),x(24,Ce,4,2,"div",10)(25,ve,4,2,"div",11)(26,be,3,0,"div",12),n()),t&2){let e=o.$implicit,i=d(2);s(3),u(" ",e.workflowId||e._id," "),s(),_("ngClass",i.getStatusColorClass(e.status)),s(),u(" ",e.status||"\u2014"," "),s(2),c(e.providerName?7:-1),s(),c(e.model?8:-1),s(),c(e.projectId?9:-1),s(4),u(" ",e.currentPhaseIndex," "),s(5),u(" ",e.currentPhaseStepCount," "),s(5),u(" ",e.totalStepCount," "),s(),c(e.pauseReason?24:-1),s(),c(e.lastResponseSummary?25:-1),s(),c(e.blockers&&e.blockers.length>0?26:-1)}}function Ee(t,o){if(t&1&&(r(0,"div",2),v(1,ge,27,12,"div",3,_e),n()),t&2){let e=d();s(),I(e.coordinatorsForSession_$())}}var Ne=(()=>{class t{sessionId=f.required();isOpen=f.required();closed=R();coordinator_DS=m(M);coordinatorsForSession_$=$(()=>{let e=this.sessionId();return e?this.coordinator_DS.globalCoordinatorsList_$().filter(i=>i.sessionId===e):[]});ngOnInit(){this.coordinator_DS.globalCoordinatorsList_$().length===0&&this.coordinator_DS.loadAllCoordinatorsForManagementPage()}getStatusColorClass(e){switch((e??"").trim().toLowerCase()){case"active":return"bg-green-500/20 text-green-400";case"running":return"bg-green-500/20 text-green-400";case"paused":return"bg-yellow-500/20 text-yellow-400";case"idle":return"bg-blue-500/20 text-blue-400";case"stopped":return"bg-neutral-500/20 text-neutral-400";case"completed":return"bg-neutral-600/20 text-neutral-400";case"failed":return"bg-red-500/20 text-red-400";default:return"bg-neutral-700/30 text-neutral-300"}}handleClose(){this.closed.emit()}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=w({type:t,selectors:[["app-crd-info-popup"]],inputs:{sessionId:[1,"sessionId"],isOpen:[1,"isOpen"]},outputs:{closed:"closed"},standalone:!0,features:[T],decls:4,vars:6,consts:[[3,"closed","isOpen","title","maxWidth","bodyFlexColumn","headerBorderClass"],[1,"p-4","text-center","text-neutral-500","text-sm"],[1,"flex-1","overflow-y-auto","space-y-3","pr-1"],[1,"border","border-neutral-700/60","rounded-md","p-2.5","bg-neutral-900/40"],[1,"flex","items-center","gap-2","mb-1.5"],[1,"text-sm","font-medium","text-neutral-200","truncate"],[1,"text-[10px]","px-1.5","py-0.5","rounded","font-mono",3,"ngClass"],[1,"flex","flex-wrap","gap-x-3","gap-y-0.5","text-[10px]","text-neutral-500","mb-2"],[1,"text-[11px]","text-neutral-400","mb-1.5"],[1,"text-neutral-600"],[1,"text-[11px]","text-yellow-400/80","mb-1.5","truncate",3,"title"],[1,"text-[11px]","text-neutral-400","mb-1.5","line-clamp-2",3,"title"],[1,"flex","flex-wrap","gap-1","mt-1"],[1,"text-[10px]","px-1.5","py-0.5","rounded","bg-red-500/15","text-red-400","truncate","max-w-full",3,"title"]],template:function(i,l){i&1&&(r(0,"app-s-modal",0),D("closed",function(){return l.handleClose()}),x(1,me,2,0,"div",1)(2,xe,2,0,"div",1)(3,Ee,3,0,"div",2),n()),i&2&&(_("isOpen",l.isOpen())("title","Koordin\xE1tor inf\xF3k ehhez a session-h\xF6z")("maxWidth","lg")("bodyFlexColumn",!0)("headerBorderClass","border-neonAmber/50"),s(),c(l.sessionId()?l.coordinatorsForSession_$().length===0?2:3:1))},dependencies:[Q,F,P],encapsulation:2})}return t})();var W=(()=>{class t{apiBase=L.api.baseUrl;http=m(j);getQueue(e){let i=`${this.buildUrl(e.baseRoute,e.sessionId)}?_t=${Date.now()}`;return S(this.http.get(i))}editItem(e){let i=`${this.buildUrl(e.baseRoute,e.sessionId)}/${e.queueItemId}`;return S(this.http.patch(i,{text:e.text}))}removeItem(e){let i=`${this.buildUrl(e.baseRoute,e.sessionId)}/${e.queueItemId}`;return S(this.http.delete(i))}sendNow(e){let i=`${this.buildUrl(e.baseRoute,e.sessionId)}/${e.queueItemId}/send-now`;return S(this.http.post(i,{}))}reorderItem(e){let i=`${this.buildUrl(e.baseRoute,e.sessionId)}/${e.queueItemId}/reorder`;return S(this.http.post(i,{direction:e.direction}))}lockQueue(e){let i=`${this.buildUrl(e.baseRoute,e.sessionId)}/lock`;return S(this.http.post(i,{}))}unlockQueue(e){let i=`${this.buildUrl(e.baseRoute,e.sessionId)}/unlock`;return S(this.http.post(i,{}))}buildUrl(e,i){return`${this.apiBase}/${e}-queue/${i}`}static \u0275fac=function(i){return new(i||t)};static \u0275prov=y({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var p=G(Y());var $e="session-queue:updated",ye="session-queue:lock-changed",tt=(()=>{class t{sessionQueue_AS=m(W);socket_CS=m(H);globalError_CS=m(O);eventSubscription=null;reconnectSubscription=null;activeSessionId="";activeBaseRoute="";queueSnapshot_$=C(null);isLocked_$=C(!1);editingItemId_$=C(null);editingText_$=C("");items_$=C([]);constructor(){this.eventSubscription=this.socket_CS.event$.subscribe(e=>{this.handleSocketEvent(e)}),this.reconnectSubscription=this.socket_CS.connected$.subscribe(e=>{e&&this.activeSessionId&&(p.DyFM_Log.info(`ExS_Queue_DS | Socket reconnected, reloading queue | session: ${this.activeSessionId}`),this.loadQueue())})}ngOnDestroy(){this.eventSubscription?.unsubscribe(),this.eventSubscription=null,this.reconnectSubscription?.unsubscribe(),this.reconnectSubscription=null}subscribeToSession(e){this.activeSessionId=e.sessionId,this.activeBaseRoute=e.baseRoute,p.DyFM_Log.info(`ExS_Queue_DS | subscribeToSession | session: ${e.sessionId} | baseRoute: ${e.baseRoute}`),this.loadQueue()}unsubscribe(){this.activeSessionId="",this.activeBaseRoute="",this.queueSnapshot_$.set(null),this.items_$.set([]),this.isLocked_$.set(!1),this.editingItemId_$.set(null),this.editingText_$.set("")}startEditing(e){return h(this,null,function*(){if(!this.activeSessionId||!this.activeBaseRoute)return;if(!this.isItemInCurrentSnapshot(e)){p.DyFM_Log.info(`ExS_Queue_DS | startEditing \u2014 stale item, reloading | queueItemId: ${e}`),yield this.loadQueue();return}try{yield this.sessionQueue_AS.lockQueue({baseRoute:this.activeBaseRoute,sessionId:this.activeSessionId})}catch{return}let i=this.items_$().find(l=>l.queueItemId===e);this.isLocked_$.set(!0),this.editingItemId_$.set(e),this.editingText_$.set(i?.text??"")})}saveEdit(){return h(this,null,function*(){let e=this.editingItemId_$();if(!(!e||!this.activeSessionId||!this.activeBaseRoute)){try{if((yield this.sessionQueue_AS.editItem({baseRoute:this.activeBaseRoute,sessionId:this.activeSessionId,queueItemId:e,text:this.editingText_$()})).item===null){this.globalError_CS.showError(new Error("Queue item not found \u2014 it may have been delivered while editing"),"session-queue-edit"),yield this.finishEditing(),yield this.loadQueue();return}}catch(i){this.globalError_CS.showError(i,"session-queue-edit-save");return}yield this.finishEditing()}})}cancelEdit(){return h(this,null,function*(){yield this.finishEditing()})}removeItem(e){return h(this,null,function*(){if(!(!this.activeSessionId||!this.activeBaseRoute)){if(!this.isItemInCurrentSnapshot(e)){p.DyFM_Log.info(`ExS_Queue_DS | removeItem \u2014 stale item, reloading | queueItemId: ${e}`),yield this.loadQueue();return}try{(yield this.sessionQueue_AS.removeItem({baseRoute:this.activeBaseRoute,sessionId:this.activeSessionId,queueItemId:e})).success===!1&&(p.DyFM_Log.info(`ExS_Queue_DS | removeItem \u2014 server: item not found, reloading | queueItemId: ${e}`),yield this.loadQueue())}catch{yield this.loadQueue()}}})}sendNow(e){return h(this,null,function*(){if(!(!this.activeSessionId||!this.activeBaseRoute)){if(!this.isItemInCurrentSnapshot(e)){p.DyFM_Log.info(`ExS_Queue_DS | sendNow \u2014 stale item, reloading | queueItemId: ${e}`),yield this.loadQueue();return}try{let i=yield this.sessionQueue_AS.sendNow({baseRoute:this.activeBaseRoute,sessionId:this.activeSessionId,queueItemId:e});if(i.success===!1){let l=typeof i.reason=="string"?i.reason:"unknown";l==="Item not found in queue"?p.DyFM_Log.info(`ExS_Queue_DS | sendNow \u2014 server: item already delivered, reloading | queueItemId: ${e}`):this.globalError_CS.showError(new Error(`Send-now delivery failed: ${l}`),"session-queue-send-now"),yield this.loadQueue()}}catch{yield this.loadQueue()}}})}reorderItem(e){return h(this,null,function*(){if(!(!this.activeSessionId||!this.activeBaseRoute)){if(!this.isItemInCurrentSnapshot(e.queueItemId)){p.DyFM_Log.info(`ExS_Queue_DS | reorderItem \u2014 stale item, reloading | queueItemId: ${e.queueItemId}`),yield this.loadQueue();return}try{(yield this.sessionQueue_AS.reorderItem({baseRoute:this.activeBaseRoute,sessionId:this.activeSessionId,queueItemId:e.queueItemId,direction:e.direction})).success===!1&&(p.DyFM_Log.info(`ExS_Queue_DS | reorderItem \u2014 server: item not found, reloading | queueItemId: ${e.queueItemId}`),yield this.loadQueue())}catch{yield this.loadQueue()}}})}isItemInCurrentSnapshot(e){return this.items_$().some(i=>i.queueItemId===e)}loadQueue(){return h(this,null,function*(){let e=this.activeSessionId,i=this.activeBaseRoute;if(!(!e||!i))try{let l=yield this.sessionQueue_AS.getQueue({baseRoute:i,sessionId:e});if(this.activeSessionId!==e){p.DyFM_Log.info(`ExS_Queue_DS | loadQueue result discarded (session changed) | requested: ${e} | current: ${this.activeSessionId}`);return}let E=l?.queue?.items?.length??0;p.DyFM_Log.info(`ExS_Queue_DS | loadQueue OK | session: ${e} | items: ${E}`),this.applySnapshot(l.queue)}catch(l){if(this.activeSessionId!==e)return;p.DyFM_Log.warn(`ExS_Queue_DS | loadQueue FAILED | session: ${e} | baseRoute: ${i} | error: ${l instanceof Error?l.message:String(l)}`),this.queueSnapshot_$.set(null),this.items_$.set([])}})}applySnapshot(e){this.queueSnapshot_$.set(e),this.items_$.set(e.items??[]),this.isLocked_$.set(e.isLocked)}finishEditing(){return h(this,null,function*(){if(this.editingItemId_$.set(null),this.editingText_$.set(""),this.isLocked_$.set(!1),!(!this.activeSessionId||!this.activeBaseRoute))try{yield this.sessionQueue_AS.unlockQueue({baseRoute:this.activeBaseRoute,sessionId:this.activeSessionId})}catch(e){this.globalError_CS.showError(e,"session-queue-unlock")}})}handleSocketEvent(e){let i=e.payload;if((typeof i.sessionId=="string"?i.sessionId:"")===this.activeSessionId&&(e.event===$e&&this.applySnapshot(i),e.event===ye)){let E=typeof i.isLocked=="boolean"?i.isLocked:!1;this.isLocked_$.set(E)}}static \u0275fac=function(i){return new(i||t)};static \u0275prov=y({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var V=class{static saveDraft(o,e,i){!o||!e||k.writeString(`${o}:promptDraft:${e}`,i)}static loadDraft(o,e){return!o||!e?"":k.readString(`${o}:promptDraft:${e}`)??""}static clearDraft(o,e){!o||!e||k.remove(`${o}:promptDraft:${e}`)}};export{Be as a,Ne as b,tt as c,V as d};
2
- //# sourceMappingURL=chunk-SBJAWWHF.js.map
1
+ import{a as M}from"./chunk-YYFQVRYR.js";import{a as z,b as K}from"./chunk-LYMCPIS7.js";import{b as N,c as U}from"./chunk-NRQ7LIBM.js";import{e as H}from"./chunk-U7HJBEWP.js";import{a as P}from"./chunk-FLAJXIYW.js";import{a as k}from"./chunk-5UPNU54P.js";import{j as O}from"./chunk-O2FA6HNL.js";import{I as L,p as Y}from"./chunk-ZUSKVUGS.js";import{$a as b,C as m,D as w,Fa as a,Ga as A,Ha as u,T as D,Ta as T,U as S,Z as s,aa as C,ab as g,da as x,ga as _,h as G,hb as $,k as h,la as c,mb as F,na as q,oa as v,p as f,pa as I,qa as r,ra as n,ub as Q,va as R,wa as d,xb as j,y}from"./chunk-TBMJSIBB.js";var J=(t,o)=>o._id;function Z(t,o){t&1&&(r(0,"div",1),a(1,"Nincs kiv\xE1lasztott session."),n())}function ee(t,o){t&1&&(r(0,"div",1),a(1," Ehhez a sessionh\xF6z nincs akt\xEDv schedule job. "),n())}function te(t,o){t&1&&(r(0,"span",7),a(1,"paused"),n())}function ie(t,o){t&1&&(r(0,"span",8),a(1,"disabled"),n())}function ne(t,o){t&1&&(r(0,"span",9),a(1,"dry-run"),n())}function oe(t,o){if(t&1&&(r(0,"div",10),a(1),n()),t&2){let e=d().$implicit;s(),A(e.description)}}function se(t,o){if(t&1&&(r(0,"span")(1,"span",15),a(2,"tz:"),n(),a(3),n()),t&2){let e=d().$implicit;s(3),u(" ",e.timezone,"")}}function ae(t,o){if(t&1&&(r(0,"span",12),b(1,"sAbsoluteTime"),r(2,"span",15),a(3,"next:"),n(),a(4),b(5,"sTimeAgo"),n()),t&2){let e=d().$implicit;_("title",g(1,2,e.nextDueAt)),s(4),u(" ",g(5,4,e.nextDueAt),"")}}function re(t,o){if(t&1&&(r(0,"span",12),b(1,"sAbsoluteTime"),r(2,"span",15),a(3,"last:"),n(),a(4),b(5,"sTimeAgo"),n()),t&2){let e=d().$implicit;_("title",g(1,2,e.lastTriggeredAt)),s(4),u(" ",g(5,4,e.lastTriggeredAt),"")}}function le(t,o){if(t&1&&(r(0,"span",16),a(1),n()),t&2){let e=o.$implicit,i=d(4);_("ngClass",i.getStatusColorClass(e.status))("title",(e.scheduledAt||"\u2014")+" \u2014 "+(e.status||"\u2014")+(e.skipReason?" ("+e.skipReason+")":"")+(e.errorDetails!=null&&e.errorDetails.message?": "+e.errorDetails.message:"")),s(),u(" ",i.getStatusLabel(e.status)," ")}}function de(t,o){if(t&1&&(r(0,"div",13),v(1,le,2,3,"span",16,J),n()),t&2){let e=d().$implicit,i=d(2);s(),I(i.getRecentExecutionsForJob(e._id))}}function ue(t,o){t&1&&(r(0,"div",14),a(1,"M\xE9g nem volt execution."),n())}function ce(t,o){if(t&1&&(r(0,"div",3)(1,"div",4)(2,"span",5),a(3),n(),r(4,"span",6),a(5),b(6,"schSchedulePresetLabel"),n(),x(7,te,2,0,"span",7)(8,ie,2,0,"span",8)(9,ne,2,0,"span",9),n(),x(10,oe,2,1,"div",10),r(11,"div",11),x(12,se,4,1,"span")(13,ae,6,6,"span",12)(14,re,6,6,"span",12),n(),x(15,de,3,0,"div",13)(16,ue,2,0,"div",14),n()),t&2){let e=o.$implicit,i=d(2);s(3),u(" ",e.name||e._id," "),s(2),u(" ",g(6,10,e.schedule)," "),s(2),c(e.paused?7:-1),s(),c(e.enabled===!1?8:-1),s(),c(e.dryRun?9:-1),s(),c(e.description?10:-1),s(2),c(e.timezone?12:-1),s(),c(e.nextDueAt?13:-1),s(),c(e.lastTriggeredAt?14:-1),s(),c(i.getRecentExecutionsForJob(e._id).length>0?15:16)}}function pe(t,o){if(t&1&&(r(0,"div",2),v(1,ce,17,12,"div",3,J),n()),t&2){let e=d();s(),I(e.jobsForSession_$())}}var Be=(()=>{class t{sessionId=S.required();isOpen=S.required();closed=D();jobs_DS=m(z);jobsForSession_$=$(()=>{let e=this.sessionId();return e?this.jobs_DS.jobs_$().filter(i=>i.target?.payload?.sessionId===e):[]});executionsByJob_$=$(()=>this.jobs_DS.recentExecutions_$());ngOnInit(){this.jobs_DS.jobs_$().length===0&&this.jobs_DS.loadAll()}getRecentExecutionsForJob(e){return e?(this.executionsByJob_$().get(e)??[]).slice(0,5):[]}getStatusColorClass(e){switch(e){case"completed":return"bg-green-500/20 text-green-400";case"triggered":return"bg-blue-500/20 text-blue-400";case"skipped":return"bg-yellow-500/20 text-yellow-400";case"failed":return"bg-red-500/20 text-red-400";case"cancelled":return"bg-neutral-500/20 text-neutral-400";case"dry-run":return"bg-purple-500/20 text-purple-400";default:return"bg-neutral-700/30 text-neutral-300"}}getStatusLabel(e){switch(e){case"completed":return"OK";case"triggered":return"RUN";case"skipped":return"SKP";case"failed":return"FAIL";case"cancelled":return"CNL";case"dry-run":return"DRY";default:return e??"\u2014"}}handleClose(){this.closed.emit()}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=w({type:t,selectors:[["app-sch-schedule-popup"]],inputs:{sessionId:[1,"sessionId"],isOpen:[1,"isOpen"]},outputs:{closed:"closed"},standalone:!0,features:[T],decls:4,vars:6,consts:[[3,"closed","isOpen","title","maxWidth","bodyFlexColumn","headerBorderClass"],[1,"p-4","text-center","text-neutral-500","text-sm"],[1,"flex-1","overflow-y-auto","space-y-3","pr-1"],[1,"border","border-neutral-700/60","rounded-md","p-2.5","bg-neutral-900/40"],[1,"flex","items-center","gap-2","mb-1.5"],[1,"text-sm","font-medium","text-neutral-200","truncate"],[1,"text-[10px]","text-neutral-400"],[1,"text-[10px]","px-1","rounded","bg-yellow-500/20","text-yellow-400"],[1,"text-[10px]","px-1","rounded","bg-neutral-500/20","text-neutral-400"],[1,"text-[10px]","px-1","rounded","bg-purple-500/20","text-purple-400"],[1,"text-[11px]","text-neutral-400","mb-1.5","truncate"],[1,"flex","flex-wrap","gap-x-3","gap-y-0.5","text-[10px]","text-neutral-500","mb-2"],[3,"title"],[1,"flex","flex-wrap","gap-1"],[1,"text-[10px]","text-neutral-500"],[1,"text-neutral-600"],[1,"text-[10px]","px-1.5","py-0.5","rounded","font-mono",3,"ngClass","title"]],template:function(i,l){i&1&&(r(0,"app-s-modal",0),R("closed",function(){return l.handleClose()}),x(1,Z,2,0,"div",1)(2,ee,2,0,"div",1)(3,pe,3,0,"div",2),n()),i&2&&(_("isOpen",l.isOpen())("title","Schedule inf\xF3k ehhez a session-h\xF6z")("maxWidth","lg")("bodyFlexColumn",!0)("headerBorderClass","border-neonCyan/50"),s(),c(l.sessionId()?l.jobsForSession_$().length===0?2:3:1))},dependencies:[Q,F,P,N,U,K],encapsulation:2})}return t})();var _e=(t,o)=>o._id;function me(t,o){t&1&&(r(0,"div",1),a(1,"Nincs kiv\xE1lasztott session."),n())}function xe(t,o){t&1&&(r(0,"div",1),a(1," Ehhez a sessionh\xF6z nincs koordin\xE1tor. "),n())}function he(t,o){if(t&1&&(r(0,"span")(1,"span",9),a(2,"provider:"),n(),a(3),n()),t&2){let e=d().$implicit;s(3),u(" ",e.providerName,"")}}function fe(t,o){if(t&1&&(r(0,"span")(1,"span",9),a(2,"model:"),n(),a(3),n()),t&2){let e=d().$implicit;s(3),u(" ",e.model,"")}}function Se(t,o){if(t&1&&(r(0,"span")(1,"span",9),a(2,"project:"),n(),a(3),n()),t&2){let e=d().$implicit;s(3),u(" ",e.projectId,"")}}function Ce(t,o){if(t&1&&(r(0,"div",10)(1,"span",9),a(2,"paused:"),n(),a(3),n()),t&2){let e=d().$implicit;_("title",e.pauseReason),s(3),u(" ",e.pauseReason," ")}}function ve(t,o){if(t&1&&(r(0,"div",11)(1,"span",9),a(2,"last:"),n(),a(3),n()),t&2){let e=d().$implicit;_("title",e.lastResponseSummary),s(3),u(" ",e.lastResponseSummary," ")}}function Ie(t,o){if(t&1&&(r(0,"span",13),a(1),n()),t&2){let e=o.$implicit;_("title",e),s(),u(" blocker: ",e," ")}}function be(t,o){if(t&1&&(r(0,"div",12),v(1,Ie,2,2,"span",13,q),n()),t&2){let e=d().$implicit;s(),I(e.blockers)}}function ge(t,o){if(t&1&&(r(0,"div",3)(1,"div",4)(2,"span",5),a(3),n(),r(4,"span",6),a(5),n()(),r(6,"div",7),x(7,he,4,1,"span")(8,fe,4,1,"span")(9,Se,4,1,"span"),n(),r(10,"div",8)(11,"span",9),a(12,"phase:"),n(),a(13),r(14,"span",9),a(15,"\xB7"),n(),r(16,"span",9),a(17,"phase-step:"),n(),a(18),r(19,"span",9),a(20,"\xB7"),n(),r(21,"span",9),a(22,"total:"),n(),a(23),n(),x(24,Ce,4,2,"div",10)(25,ve,4,2,"div",11)(26,be,3,0,"div",12),n()),t&2){let e=o.$implicit,i=d(2);s(3),u(" ",e.workflowId||e._id," "),s(),_("ngClass",i.getStatusColorClass(e.status)),s(),u(" ",e.status||"\u2014"," "),s(2),c(e.providerName?7:-1),s(),c(e.model?8:-1),s(),c(e.projectId?9:-1),s(4),u(" ",e.currentPhaseIndex," "),s(5),u(" ",e.currentPhaseStepCount," "),s(5),u(" ",e.totalStepCount," "),s(),c(e.pauseReason?24:-1),s(),c(e.lastResponseSummary?25:-1),s(),c(e.blockers&&e.blockers.length>0?26:-1)}}function Ee(t,o){if(t&1&&(r(0,"div",2),v(1,ge,27,12,"div",3,_e),n()),t&2){let e=d();s(),I(e.coordinatorsForSession_$())}}var Ne=(()=>{class t{sessionId=S.required();isOpen=S.required();closed=D();coordinator_DS=m(M);coordinatorsForSession_$=$(()=>{let e=this.sessionId();return e?this.coordinator_DS.globalCoordinatorsList_$().filter(i=>i.sessionId===e):[]});ngOnInit(){this.coordinator_DS.globalCoordinatorsList_$().length===0&&this.coordinator_DS.loadAllCoordinatorsForManagementPage()}getStatusColorClass(e){switch((e??"").trim().toLowerCase()){case"active":return"bg-green-500/20 text-green-400";case"running":return"bg-green-500/20 text-green-400";case"paused":return"bg-yellow-500/20 text-yellow-400";case"idle":return"bg-blue-500/20 text-blue-400";case"stopped":return"bg-neutral-500/20 text-neutral-400";case"completed":return"bg-neutral-600/20 text-neutral-400";case"failed":return"bg-red-500/20 text-red-400";default:return"bg-neutral-700/30 text-neutral-300"}}handleClose(){this.closed.emit()}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=w({type:t,selectors:[["app-crd-info-popup"]],inputs:{sessionId:[1,"sessionId"],isOpen:[1,"isOpen"]},outputs:{closed:"closed"},standalone:!0,features:[T],decls:4,vars:6,consts:[[3,"closed","isOpen","title","maxWidth","bodyFlexColumn","headerBorderClass"],[1,"p-4","text-center","text-neutral-500","text-sm"],[1,"flex-1","overflow-y-auto","space-y-3","pr-1"],[1,"border","border-neutral-700/60","rounded-md","p-2.5","bg-neutral-900/40"],[1,"flex","items-center","gap-2","mb-1.5"],[1,"text-sm","font-medium","text-neutral-200","truncate"],[1,"text-[10px]","px-1.5","py-0.5","rounded","font-mono",3,"ngClass"],[1,"flex","flex-wrap","gap-x-3","gap-y-0.5","text-[10px]","text-neutral-500","mb-2"],[1,"text-[11px]","text-neutral-400","mb-1.5"],[1,"text-neutral-600"],[1,"text-[11px]","text-yellow-400/80","mb-1.5","truncate",3,"title"],[1,"text-[11px]","text-neutral-400","mb-1.5","line-clamp-2",3,"title"],[1,"flex","flex-wrap","gap-1","mt-1"],[1,"text-[10px]","px-1.5","py-0.5","rounded","bg-red-500/15","text-red-400","truncate","max-w-full",3,"title"]],template:function(i,l){i&1&&(r(0,"app-s-modal",0),R("closed",function(){return l.handleClose()}),x(1,me,2,0,"div",1)(2,xe,2,0,"div",1)(3,Ee,3,0,"div",2),n()),i&2&&(_("isOpen",l.isOpen())("title","Koordin\xE1tor inf\xF3k ehhez a session-h\xF6z")("maxWidth","lg")("bodyFlexColumn",!0)("headerBorderClass","border-neonAmber/50"),s(),c(l.sessionId()?l.coordinatorsForSession_$().length===0?2:3:1))},dependencies:[Q,F,P],encapsulation:2})}return t})();var W=(()=>{class t{apiBase=L.api.baseUrl;http=m(j);getQueue(e){let i=`${this.buildUrl(e.baseRoute,e.sessionId)}?_t=${Date.now()}`;return f(this.http.get(i))}editItem(e){let i=`${this.buildUrl(e.baseRoute,e.sessionId)}/${e.queueItemId}`;return f(this.http.patch(i,{text:e.text}))}removeItem(e){let i=`${this.buildUrl(e.baseRoute,e.sessionId)}/${e.queueItemId}`;return f(this.http.delete(i))}sendNow(e){let i=`${this.buildUrl(e.baseRoute,e.sessionId)}/${e.queueItemId}/send-now`;return f(this.http.post(i,{}))}reorderItem(e){let i=`${this.buildUrl(e.baseRoute,e.sessionId)}/${e.queueItemId}/reorder`;return f(this.http.post(i,{direction:e.direction}))}lockQueue(e){let i=`${this.buildUrl(e.baseRoute,e.sessionId)}/lock`;return f(this.http.post(i,{}))}unlockQueue(e){let i=`${this.buildUrl(e.baseRoute,e.sessionId)}/unlock`;return f(this.http.post(i,{}))}buildUrl(e,i){return`${this.apiBase}/${e}-queue/${i}`}static \u0275fac=function(i){return new(i||t)};static \u0275prov=y({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var p=G(Y());var $e="session-queue:updated",ye="session-queue:lock-changed",tt=(()=>{class t{sessionQueue_AS=m(W);socket_CS=m(H);globalError_CS=m(O);eventSubscription=null;reconnectSubscription=null;activeSessionId="";activeBaseRoute="";queueSnapshot_$=C(null);isLocked_$=C(!1);editingItemId_$=C(null);editingText_$=C("");items_$=C([]);constructor(){this.eventSubscription=this.socket_CS.event$.subscribe(e=>{this.handleSocketEvent(e)}),this.reconnectSubscription=this.socket_CS.connected$.subscribe(e=>{e&&this.activeSessionId&&(p.DyFM_Log.info(`ExS_Queue_DS | Socket reconnected, reloading queue | session: ${this.activeSessionId}`),this.loadQueue())})}ngOnDestroy(){this.eventSubscription?.unsubscribe(),this.eventSubscription=null,this.reconnectSubscription?.unsubscribe(),this.reconnectSubscription=null}subscribeToSession(e){this.activeSessionId=e.sessionId,this.activeBaseRoute=e.baseRoute,p.DyFM_Log.info(`ExS_Queue_DS | subscribeToSession | session: ${e.sessionId} | baseRoute: ${e.baseRoute}`),this.loadQueue()}unsubscribe(){this.activeSessionId="",this.activeBaseRoute="",this.queueSnapshot_$.set(null),this.items_$.set([]),this.isLocked_$.set(!1),this.editingItemId_$.set(null),this.editingText_$.set("")}startEditing(e){return h(this,null,function*(){if(!this.activeSessionId||!this.activeBaseRoute)return;if(!this.isItemInCurrentSnapshot(e)){p.DyFM_Log.info(`ExS_Queue_DS | startEditing \u2014 stale item, reloading | queueItemId: ${e}`),yield this.loadQueue();return}try{yield this.sessionQueue_AS.lockQueue({baseRoute:this.activeBaseRoute,sessionId:this.activeSessionId})}catch{return}let i=this.items_$().find(l=>l.queueItemId===e);this.isLocked_$.set(!0),this.editingItemId_$.set(e),this.editingText_$.set(i?.text??"")})}saveEdit(){return h(this,null,function*(){let e=this.editingItemId_$();if(!(!e||!this.activeSessionId||!this.activeBaseRoute)){try{if((yield this.sessionQueue_AS.editItem({baseRoute:this.activeBaseRoute,sessionId:this.activeSessionId,queueItemId:e,text:this.editingText_$()})).item===null){this.globalError_CS.showError(new Error("Queue item not found \u2014 it may have been delivered while editing"),"session-queue-edit"),yield this.finishEditing(),yield this.loadQueue();return}}catch(i){this.globalError_CS.showError(i,"session-queue-edit-save");return}yield this.finishEditing()}})}cancelEdit(){return h(this,null,function*(){yield this.finishEditing()})}removeItem(e){return h(this,null,function*(){if(!(!this.activeSessionId||!this.activeBaseRoute)){if(!this.isItemInCurrentSnapshot(e)){p.DyFM_Log.info(`ExS_Queue_DS | removeItem \u2014 stale item, reloading | queueItemId: ${e}`),yield this.loadQueue();return}try{(yield this.sessionQueue_AS.removeItem({baseRoute:this.activeBaseRoute,sessionId:this.activeSessionId,queueItemId:e})).success===!1&&(p.DyFM_Log.info(`ExS_Queue_DS | removeItem \u2014 server: item not found, reloading | queueItemId: ${e}`),yield this.loadQueue())}catch{yield this.loadQueue()}}})}sendNow(e){return h(this,null,function*(){if(!(!this.activeSessionId||!this.activeBaseRoute)){if(!this.isItemInCurrentSnapshot(e)){p.DyFM_Log.info(`ExS_Queue_DS | sendNow \u2014 stale item, reloading | queueItemId: ${e}`),yield this.loadQueue();return}try{let i=yield this.sessionQueue_AS.sendNow({baseRoute:this.activeBaseRoute,sessionId:this.activeSessionId,queueItemId:e});if(i.success===!1){let l=typeof i.reason=="string"?i.reason:"unknown";l==="Item not found in queue"?p.DyFM_Log.info(`ExS_Queue_DS | sendNow \u2014 server: item already delivered, reloading | queueItemId: ${e}`):this.globalError_CS.showError(new Error(`Send-now delivery failed: ${l}`),"session-queue-send-now"),yield this.loadQueue()}}catch{yield this.loadQueue()}}})}reorderItem(e){return h(this,null,function*(){if(!(!this.activeSessionId||!this.activeBaseRoute)){if(!this.isItemInCurrentSnapshot(e.queueItemId)){p.DyFM_Log.info(`ExS_Queue_DS | reorderItem \u2014 stale item, reloading | queueItemId: ${e.queueItemId}`),yield this.loadQueue();return}try{(yield this.sessionQueue_AS.reorderItem({baseRoute:this.activeBaseRoute,sessionId:this.activeSessionId,queueItemId:e.queueItemId,direction:e.direction})).success===!1&&(p.DyFM_Log.info(`ExS_Queue_DS | reorderItem \u2014 server: item not found, reloading | queueItemId: ${e.queueItemId}`),yield this.loadQueue())}catch{yield this.loadQueue()}}})}isItemInCurrentSnapshot(e){return this.items_$().some(i=>i.queueItemId===e)}loadQueue(){return h(this,null,function*(){let e=this.activeSessionId,i=this.activeBaseRoute;if(!(!e||!i))try{let l=yield this.sessionQueue_AS.getQueue({baseRoute:i,sessionId:e});if(this.activeSessionId!==e){p.DyFM_Log.info(`ExS_Queue_DS | loadQueue result discarded (session changed) | requested: ${e} | current: ${this.activeSessionId}`);return}let E=l?.queue?.items?.length??0;p.DyFM_Log.info(`ExS_Queue_DS | loadQueue OK | session: ${e} | items: ${E}`),this.applySnapshot(l.queue)}catch(l){if(this.activeSessionId!==e)return;p.DyFM_Log.warn(`ExS_Queue_DS | loadQueue FAILED | session: ${e} | baseRoute: ${i} | error: ${l instanceof Error?l.message:String(l)}`),this.queueSnapshot_$.set(null),this.items_$.set([])}})}applySnapshot(e){this.queueSnapshot_$.set(e),this.items_$.set(e.items??[]),this.isLocked_$.set(e.isLocked)}finishEditing(){return h(this,null,function*(){if(this.editingItemId_$.set(null),this.editingText_$.set(""),this.isLocked_$.set(!1),!(!this.activeSessionId||!this.activeBaseRoute))try{yield this.sessionQueue_AS.unlockQueue({baseRoute:this.activeBaseRoute,sessionId:this.activeSessionId})}catch(e){this.globalError_CS.showError(e,"session-queue-unlock")}})}handleSocketEvent(e){let i=e.payload;if((typeof i.sessionId=="string"?i.sessionId:"")===this.activeSessionId&&(e.event===$e&&this.applySnapshot(i),e.event===ye)){let E=typeof i.isLocked=="boolean"?i.isLocked:!1;this.isLocked_$.set(E)}}static \u0275fac=function(i){return new(i||t)};static \u0275prov=y({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var V=class t{static saveDraft(o,e,i){!o||!e||k.writeString(`${o}:promptDraft:${e}`,i)}static loadDraft(o,e){return!o||!e?"":k.readString(`${o}:promptDraft:${e}`)??""}static clearDraft(o,e){!o||!e||k.remove(`${o}:promptDraft:${e}`)}static hasDraft(o,e){return!o||!e?!1:t.loadDraft(o,e).trim().length>0}};export{V as a,Be as b,Ne as c,tt as d};
2
+ //# sourceMappingURL=chunk-NVK2NT5O.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["src/app/_modules/scheduler/_components/sch-schedule-popup/sch-schedule-popup.component.ts", "src/app/_modules/scheduler/_components/sch-schedule-popup/sch-schedule-popup.component.html", "src/app/_modules/coordinator/_components/crd-info-popup/crd-info-popup.component.ts", "src/app/_modules/coordinator/_components/crd-info-popup/crd-info-popup.component.html", "src/app/_modules/external-sessions/_services/exs-queue.api-service.ts", "src/app/_modules/external-sessions/_services/exs-queue.data-service.ts", "src/app/_modules/shared/_collections/utils/shr-prompt-draft-storage.util.ts"],
4
- "sourcesContent": ["import { CommonModule } from '@angular/common';\nimport { Component, computed, inject, input, InputSignal, OnInit, output, OutputEmitterRef, Signal } from '@angular/core';\n\nimport { S_Modal_Component } from '../../../shared/_components/s-modal/s-modal.component';\nimport { S_AbsoluteTime_Pipe } from '../../../shared/_pipes/s-absolute-time.pipe';\nimport { S_TimeAgo_Pipe } from '../../../shared/_pipes/s-time-ago.pipe';\nimport { SCH_Execution_Response, SCH_Job_Response } from '../../_models/interfaces/sch-job.interface';\nimport { SCH_SchedulePresetLabel_Pipe } from '../../_pipes/sch-schedule-preset-label.pipe';\nimport { SCH_ScheduledJobs_DataService } from '../../_services/data-services/sch-scheduled-jobs.data-service';\n\n/**\n * REQ-SCH-IND-CLICK-001 (cycle 201) — Schedule indicator click → popup info modal.\n *\n * Megjeleníti a megadott `sessionId`-hez tartozó aktív (enabled) schedule job-okat,\n * a per-job utolsó 5 execution rekord státuszával együtt. A popup forrása a\n * `SCH_ScheduledJobs_DataService.jobs_$` + `.recentExecutions_$` signal-pár — a\n * dashboard-ok már `loadAll()`-t hívnak, tehát a popup nyitásakor friss adatra ülünk.\n *\n * A modal layout-jához az s-modal SSOT komponenst használjuk; a job-lista belül\n * scrollolható (overflow-y-auto), így sok job esetén sem nő ki a modal magasság.\n */\n@Component({\n selector: 'app-sch-schedule-popup',\n standalone: true,\n imports: [CommonModule, S_Modal_Component, S_AbsoluteTime_Pipe, S_TimeAgo_Pipe, SCH_SchedulePresetLabel_Pipe],\n templateUrl: './sch-schedule-popup.component.html',\n})\n/** SCH_SchedulePopup_Component class. */\nexport class SCH_SchedulePopup_Component implements OnInit {\n\n /** A megjelenített session-höz tartozó jobs filter kulcsa. `null` → üres lista. */\n readonly sessionId: InputSignal<string | null> = input.required<string | null>();\n\n /** Modal nyitva. */\n readonly isOpen: InputSignal<boolean> = input.required<boolean>();\n\n /** Bezárás esemény. */\n readonly closed: OutputEmitterRef<void> = output<void>();\n\n readonly jobs_DS: SCH_ScheduledJobs_DataService = inject(SCH_ScheduledJobs_DataService);\n\n /** Az aktuális sessionId-hez tartozó job-ok (target.payload.sessionId match). */\n readonly jobsForSession_$: Signal<SCH_Job_Response[]> = computed(\n (): SCH_Job_Response[] => {\n const sid: string | null = this.sessionId();\n if (!sid) {\n return [];\n }\n return this.jobs_DS.jobs_$().filter(\n (job: SCH_Job_Response): boolean => job.target?.payload?.sessionId === sid,\n );\n },\n );\n\n /** Per-job utolsó 5 execution rekord (legújabb elöl) — DS map szerint. */\n readonly executionsByJob_$: Signal<Map<string, SCH_Execution_Response[]>> = computed(\n (): Map<string, SCH_Execution_Response[]> => this.jobs_DS.recentExecutions_$(),\n );\n\n /** Deep-link / first-paint fallback: ha a DS még üres, töltsük be most. */\n ngOnInit(): void {\n if (this.jobs_DS.jobs_$().length === 0) {\n void this.jobs_DS.loadAll();\n }\n }\n\n /** Egy adott job utolsó max 5 execution-jét adja vissza, legújabb elöl. */\n getRecentExecutionsForJob(jobId: string | undefined): SCH_Execution_Response[] {\n if (!jobId) {\n return [];\n }\n const all: SCH_Execution_Response[] = this.executionsByJob_$().get(jobId) ?? [];\n return all.slice(0, 5);\n }\n\n /** Status → Tailwind szín-osztály (zöld OK / sárga skip / piros fail / kék run / szürke egyéb). */\n getStatusColorClass(status: string | undefined): string {\n switch (status) {\n case 'completed': return 'bg-green-500/20 text-green-400';\n case 'triggered': return 'bg-blue-500/20 text-blue-400';\n case 'skipped': return 'bg-yellow-500/20 text-yellow-400';\n case 'failed': return 'bg-red-500/20 text-red-400';\n case 'cancelled': return 'bg-neutral-500/20 text-neutral-400';\n case 'dry-run': return 'bg-purple-500/20 text-purple-400';\n default: return 'bg-neutral-700/30 text-neutral-300';\n }\n }\n\n /** Status label rövidítés. */\n getStatusLabel(status: string | undefined): string {\n switch (status) {\n case 'completed': return 'OK';\n case 'triggered': return 'RUN';\n case 'skipped': return 'SKP';\n case 'failed': return 'FAIL';\n case 'cancelled': return 'CNL';\n case 'dry-run': return 'DRY';\n default: return status ?? '—';\n }\n }\n\n /** Bezárás propagálás. */\n handleClose(): void {\n this.closed.emit();\n }\n}\n", "<app-s-modal [isOpen]=\"isOpen()\"\n [title]=\"'Schedule infók ehhez a session-höz'\"\n [maxWidth]=\"'lg'\"\n [bodyFlexColumn]=\"true\"\n [headerBorderClass]=\"'border-neonCyan/50'\"\n (closed)=\"handleClose()\">\n\n @if (!sessionId()) {\n <div class=\"p-4 text-center text-neutral-500 text-sm\">Nincs kiválasztott session.</div>\n } @else if (jobsForSession_$().length === 0) {\n <div class=\"p-4 text-center text-neutral-500 text-sm\">\n Ehhez a sessionhöz nincs aktív schedule job.\n </div>\n } @else {\n <!-- Job lista — belső scroll a hosszabb listáknak. -->\n <div class=\"flex-1 overflow-y-auto space-y-3 pr-1\">\n @for (job of jobsForSession_$(); track job._id) {\n <div class=\"border border-neutral-700/60 rounded-md p-2.5 bg-neutral-900/40\">\n <!-- Fejléc: név + cron preset + enabled/paused jelző. -->\n <div class=\"flex items-center gap-2 mb-1.5\">\n <span class=\"text-sm font-medium text-neutral-200 truncate\">\n {{ job.name || job._id }}\n </span>\n <span class=\"text-[10px] text-neutral-400\">\n {{ job.schedule | schSchedulePresetLabel }}\n </span>\n @if (job.paused) {\n <span class=\"text-[10px] px-1 rounded bg-yellow-500/20 text-yellow-400\">paused</span>\n }\n @if (job.enabled === false) {\n <span class=\"text-[10px] px-1 rounded bg-neutral-500/20 text-neutral-400\">disabled</span>\n }\n @if (job.dryRun) {\n <span class=\"text-[10px] px-1 rounded bg-purple-500/20 text-purple-400\">dry-run</span>\n }\n </div>\n\n <!-- Description, ha van. -->\n @if (job.description) {\n <div class=\"text-[11px] text-neutral-400 mb-1.5 truncate\">{{ job.description }}</div>\n }\n\n <!-- Meta: timezone + nextDueAt + lastTriggeredAt. -->\n <div class=\"flex flex-wrap gap-x-3 gap-y-0.5 text-[10px] text-neutral-500 mb-2\">\n @if (job.timezone) {\n <span><span class=\"text-neutral-600\">tz:</span> {{ job.timezone }}</span>\n }\n @if (job.nextDueAt) {\n <span [title]=\"job.nextDueAt | sAbsoluteTime\"><span class=\"text-neutral-600\">next:</span> {{ job.nextDueAt | sTimeAgo }}</span>\n }\n @if (job.lastTriggeredAt) {\n <span [title]=\"job.lastTriggeredAt | sAbsoluteTime\"><span class=\"text-neutral-600\">last:</span> {{ job.lastTriggeredAt | sTimeAgo }}</span>\n }\n </div>\n\n <!-- Utolsó max 5 execution badge sor. -->\n @if (getRecentExecutionsForJob(job._id).length > 0) {\n <div class=\"flex flex-wrap gap-1\">\n @for (exec of getRecentExecutionsForJob(job._id); track exec._id) {\n <span\n class=\"text-[10px] px-1.5 py-0.5 rounded font-mono\"\n [ngClass]=\"getStatusColorClass(exec.status)\"\n [title]=\"(exec.scheduledAt || '—')\n + ' — ' + (exec.status || '—')\n + (exec.skipReason ? ' (' + exec.skipReason + ')' : '')\n + (exec.errorDetails?.message ? ': ' + exec.errorDetails!.message : '')\">\n {{ getStatusLabel(exec.status) }}\n </span>\n }\n </div>\n } @else {\n <div class=\"text-[10px] text-neutral-500\">Még nem volt execution.</div>\n }\n </div>\n }\n </div>\n }\n</app-s-modal>\n", "import { CommonModule } from '@angular/common';\nimport { Component, computed, inject, input, InputSignal, OnInit, output, OutputEmitterRef, Signal } from '@angular/core';\n\nimport { CCAP_CoordinatorSession_Response } from '../../../../_models/interfaces/coordinator/ccap-coordinator-session.interface';\nimport { S_Modal_Component } from '../../../shared/_components/s-modal/s-modal.component';\nimport { Coordinator_DataService } from '../../_services/coordinator.data-service';\n\n/**\n * REQ-SES-CRD-IND-001 Slice 3 (cycle 202) — Coordinator indicator click → popup info modal.\n *\n * Megjeleníti a megadott `sessionId`-hez tartozó koordinátorokat (név → workflow / model\n * / státusz / phase progress / blockers / pauseReason) — analóg módon a\n * `SCH_SchedulePopup_Component`-tel (cycle 201). A popup forrása a\n * `Coordinator_DataService.globalCoordinatorsList_$` signal — a dashboard-ok már\n * `loadAllCoordinatorsForManagementPage()`-t hívnak ngOnInit-ben, tehát a popup\n * nyitásakor friss adatra ülünk; deep-link fallback ngOnInit-ben.\n */\n@Component({\n selector: 'app-crd-info-popup',\n standalone: true,\n imports: [CommonModule, S_Modal_Component],\n templateUrl: './crd-info-popup.component.html',\n})\n/** CRD_InfoPopup_Component class. */\nexport class CRD_InfoPopup_Component implements OnInit {\n\n /** A megjelenített session-höz tartozó koordinátorok filter kulcsa. `null` → üres lista. */\n readonly sessionId: InputSignal<string | null> = input.required<string | null>();\n\n /** Modal nyitva. */\n readonly isOpen: InputSignal<boolean> = input.required<boolean>();\n\n /** Bezárás esemény. */\n readonly closed: OutputEmitterRef<void> = output<void>();\n\n readonly coordinator_DS: Coordinator_DataService = inject(Coordinator_DataService);\n\n /**\n * Az aktuális sessionId-hez tartozó koordinátorok (sessionId match).\n * Megtartjuk a stopped/completed státuszúakat is — a user a \"miért fejeződött be\"-t\n * is láthatja, így informatívabb a popup, mint a sima badge-szűrés.\n */\n readonly coordinatorsForSession_$: Signal<CCAP_CoordinatorSession_Response[]> = computed(\n (): CCAP_CoordinatorSession_Response[] => {\n const sid: string | null = this.sessionId();\n if (!sid) {\n return [];\n }\n return this.coordinator_DS.globalCoordinatorsList_$().filter(\n (c: CCAP_CoordinatorSession_Response): boolean => c.sessionId === sid,\n );\n },\n );\n\n /** Deep-link / first-paint fallback: ha a DS még üres, töltsük be most. */\n ngOnInit(): void {\n if (this.coordinator_DS.globalCoordinatorsList_$().length === 0) {\n void this.coordinator_DS.loadAllCoordinatorsForManagementPage();\n }\n }\n\n /** Status → Tailwind szín-osztály (zöld active / sárga paused / kék idle / szürke stopped/completed). */\n getStatusColorClass(status: string | undefined): string {\n const s: string = (status ?? '').trim().toLowerCase();\n switch (s) {\n case 'active': return 'bg-green-500/20 text-green-400';\n case 'running': return 'bg-green-500/20 text-green-400';\n case 'paused': return 'bg-yellow-500/20 text-yellow-400';\n case 'idle': return 'bg-blue-500/20 text-blue-400';\n case 'stopped': return 'bg-neutral-500/20 text-neutral-400';\n case 'completed': return 'bg-neutral-600/20 text-neutral-400';\n case 'failed': return 'bg-red-500/20 text-red-400';\n default: return 'bg-neutral-700/30 text-neutral-300';\n }\n }\n\n /** Bezárás propagálás. */\n handleClose(): void {\n this.closed.emit();\n }\n}\n", "<app-s-modal [isOpen]=\"isOpen()\"\n [title]=\"'Koordinátor infók ehhez a session-höz'\"\n [maxWidth]=\"'lg'\"\n [bodyFlexColumn]=\"true\"\n [headerBorderClass]=\"'border-neonAmber/50'\"\n (closed)=\"handleClose()\">\n\n @if (!sessionId()) {\n <div class=\"p-4 text-center text-neutral-500 text-sm\">Nincs kiválasztott session.</div>\n } @else if (coordinatorsForSession_$().length === 0) {\n <div class=\"p-4 text-center text-neutral-500 text-sm\">\n Ehhez a sessionhöz nincs koordinátor.\n </div>\n } @else {\n <!-- Koordinátor lista — belső scroll a hosszabb listáknak. -->\n <div class=\"flex-1 overflow-y-auto space-y-3 pr-1\">\n @for (crd of coordinatorsForSession_$(); track crd._id) {\n <div class=\"border border-neutral-700/60 rounded-md p-2.5 bg-neutral-900/40\">\n <!-- Fejléc: workflowId + status badge. -->\n <div class=\"flex items-center gap-2 mb-1.5\">\n <span class=\"text-sm font-medium text-neutral-200 truncate\">\n {{ crd.workflowId || crd._id }}\n </span>\n <span class=\"text-[10px] px-1.5 py-0.5 rounded font-mono\"\n [ngClass]=\"getStatusColorClass(crd.status)\">\n {{ crd.status || '—' }}\n </span>\n </div>\n\n <!-- Meta: providerName + model + projectId. -->\n <div class=\"flex flex-wrap gap-x-3 gap-y-0.5 text-[10px] text-neutral-500 mb-2\">\n @if (crd.providerName) {\n <span><span class=\"text-neutral-600\">provider:</span> {{ crd.providerName }}</span>\n }\n @if (crd.model) {\n <span><span class=\"text-neutral-600\">model:</span> {{ crd.model }}</span>\n }\n @if (crd.projectId) {\n <span><span class=\"text-neutral-600\">project:</span> {{ crd.projectId }}</span>\n }\n </div>\n\n <!-- Phase progress + total step count. -->\n <div class=\"text-[11px] text-neutral-400 mb-1.5\">\n <span class=\"text-neutral-600\">phase:</span>\n {{ crd.currentPhaseIndex }}\n <span class=\"text-neutral-600\">·</span>\n <span class=\"text-neutral-600\">phase-step:</span>\n {{ crd.currentPhaseStepCount }}\n <span class=\"text-neutral-600\">·</span>\n <span class=\"text-neutral-600\">total:</span>\n {{ crd.totalStepCount }}\n </div>\n\n <!-- Pause reason, ha paused. -->\n @if (crd.pauseReason) {\n <div class=\"text-[11px] text-yellow-400/80 mb-1.5 truncate\"\n [title]=\"crd.pauseReason\">\n <span class=\"text-neutral-600\">paused:</span> {{ crd.pauseReason }}\n </div>\n }\n\n <!-- Last response summary. -->\n @if (crd.lastResponseSummary) {\n <div class=\"text-[11px] text-neutral-400 mb-1.5 line-clamp-2\"\n [title]=\"crd.lastResponseSummary\">\n <span class=\"text-neutral-600\">last:</span> {{ crd.lastResponseSummary }}\n </div>\n }\n\n <!-- Blockers. -->\n @if (crd.blockers && crd.blockers.length > 0) {\n <div class=\"flex flex-wrap gap-1 mt-1\">\n @for (b of crd.blockers; track b) {\n <span class=\"text-[10px] px-1.5 py-0.5 rounded bg-red-500/15 text-red-400 truncate max-w-full\"\n [title]=\"b\">\n blocker: {{ b }}\n </span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n</app-s-modal>\n", "import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\n\nimport { firstValueFrom } from 'rxjs';\n\nimport { environment } from '../../../../environments/environment';\nimport {\n SQ_Snapshot_Response,\n} from '../../../_models/interfaces/session-queue/ccap-session-queue-snapshot.interface';\n\n/**\n * Session queue REST API service.\n * Session-type agnosztikus: a baseRoute paraméterrel határozzuk meg az útvonalat\n * (pl. 'session', 'ca-session', 'cc-session', 'oc-session').\n */\n@Injectable({ providedIn: 'root' })\nexport class ExS_Queue_ApiService {\n\n private readonly apiBase: string = environment.api.baseUrl;\n\n private readonly http: HttpClient = inject(HttpClient);\n\n /**\n * Queue snapshot lekérdezése.\n * Cache-bust query paraméter: a böngésző ne cache-elje a GET választ\n * (navigáció után stale/üres snapshot-ot adna vissza).\n */\n getQueue(params: {\n baseRoute: string;\n sessionId: string;\n }): Promise<{ queue: SQ_Snapshot_Response }> {\n const url: string = `${this.buildUrl(params.baseRoute, params.sessionId)}?_t=${Date.now()}`;\n return firstValueFrom(\n this.http.get<{ queue: SQ_Snapshot_Response }>(url),\n );\n }\n\n /**\n * Queue elem szerkesztése.\n */\n editItem(params: {\n baseRoute: string;\n sessionId: string;\n queueItemId: string;\n text: string;\n }): Promise<Record<string, unknown>> {\n const url: string =\n `${this.buildUrl(params.baseRoute, params.sessionId)}/${params.queueItemId}`;\n return firstValueFrom(\n this.http.patch<Record<string, unknown>>(url, { text: params.text }),\n );\n }\n\n /**\n * Queue elem törlése.\n */\n removeItem(params: {\n baseRoute: string;\n sessionId: string;\n queueItemId: string;\n }): Promise<Record<string, unknown>> {\n const url: string =\n `${this.buildUrl(params.baseRoute, params.sessionId)}/${params.queueItemId}`;\n return firstValueFrom(\n this.http.delete<Record<string, unknown>>(url),\n );\n }\n\n /**\n * Azonnali küldés.\n */\n sendNow(params: {\n baseRoute: string;\n sessionId: string;\n queueItemId: string;\n }): Promise<Record<string, unknown>> {\n const url: string =\n `${this.buildUrl(params.baseRoute, params.sessionId)}/${params.queueItemId}/send-now`;\n return firstValueFrom(\n this.http.post<Record<string, unknown>>(url, {}),\n );\n }\n\n /**\n * Queue elem sorrend módosítása (up/down).\n */\n reorderItem(params: {\n baseRoute: string;\n sessionId: string;\n queueItemId: string;\n direction: 'up' | 'down';\n }): Promise<Record<string, unknown>> {\n const url: string =\n `${this.buildUrl(params.baseRoute, params.sessionId)}/${params.queueItemId}/reorder`;\n return firstValueFrom(\n this.http.post<Record<string, unknown>>(url, { direction: params.direction }),\n );\n }\n\n /**\n * Queue lock (editing mode).\n */\n lockQueue(params: {\n baseRoute: string;\n sessionId: string;\n }): Promise<Record<string, unknown>> {\n const url: string = `${this.buildUrl(params.baseRoute, params.sessionId)}/lock`;\n return firstValueFrom(\n this.http.post<Record<string, unknown>>(url, {}),\n );\n }\n\n /**\n * Queue unlock.\n */\n unlockQueue(params: {\n baseRoute: string;\n sessionId: string;\n }): Promise<Record<string, unknown>> {\n const url: string = `${this.buildUrl(params.baseRoute, params.sessionId)}/unlock`;\n return firstValueFrom(\n this.http.post<Record<string, unknown>>(url, {}),\n );\n }\n\n /**\n * URL builder: /api/{baseRoute}-queue/{sessionId}\n *\n * A DyNTS Router nem használ mergeParams-ot, ezért a :sessionId param\n * a controller endpoint path-jában van — az API URL struktúra:\n * /api/cc-session-queue/{sessionId} (nem /api/cc-session/{sessionId}/queue).\n */\n private buildUrl(baseRoute: string, sessionId: string): string {\n return `${this.apiBase}/${baseRoute}-queue/${sessionId}`;\n }\n}\n", "import { inject, Injectable, OnDestroy, signal } from '@angular/core';\n\nimport { Subscription } from 'rxjs';\n\nimport {\n SQ_Snapshot_Response,\n SQ_SnapshotItem_Interface,\n} from '../../../_models/interfaces/session-queue/ccap-session-queue-snapshot.interface';\nimport { ExS_Queue_ApiService } from './exs-queue.api-service';\nimport { CCAP_Socket_ControlService } from '../../../_services/control-services/ccap-socket.control-service';\nimport { CCAP_GlobalError_ControlService } from '../../../_services/control-services/ccap-global-error.control-service';\nimport { DyFM_Log } from '@futdevpro/fsm-dynamo';\n\n/** Socket event nevek (szerver konstansokkal szinkronban). */\nconst SOCKET_EVENT_SESSION_QUEUE_UPDATED: string = 'session-queue:updated';\nconst SOCKET_EVENT_SESSION_QUEUE_LOCK_CHANGED: string = 'session-queue:lock-changed';\n\n/**\n * Session queue data-service.\n * Socket.io event-eket figyeli és signal-ben tárolja a queue állapotot.\n * Session-type agnosztikus — a subscribeToSession-ben kapja a baseRoute-ot.\n */\n@Injectable({ providedIn: 'root' })\nexport class ExS_Queue_DataService implements OnDestroy {\n\n private readonly sessionQueue_AS: ExS_Queue_ApiService =\n inject(ExS_Queue_ApiService);\n private readonly socket_CS: CCAP_Socket_ControlService = inject(CCAP_Socket_ControlService);\n private readonly globalError_CS: CCAP_GlobalError_ControlService =\n inject(CCAP_GlobalError_ControlService);\n\n private eventSubscription: Subscription | null = null;\n\n /** Socket reconnect subscription (queue reload triggerhez). */\n private reconnectSubscription: Subscription | null = null;\n\n /** Aktív session azonosító. */\n private activeSessionId: string = '';\n\n /** Aktív session base route (pl. 'session', 'ca-session'). */\n private activeBaseRoute: string = '';\n\n // ── Publikus signal-ek ────────────────────────────────────────────────\n\n /** Aktuális queue snapshot (null ha nincs aktív session vagy üres). */\n readonly queueSnapshot_$ = signal<SQ_Snapshot_Response | null>(null);\n\n /** Queue lock állapot. */\n readonly isLocked_$ = signal<boolean>(false);\n\n /** Szerkesztés alatt álló elem ID-ja (null ha nincs szerkesztés). */\n readonly editingItemId_$ = signal<string | null>(null);\n\n /** Szerkesztés alatti szöveg. */\n readonly editingText_$ = signal<string>('');\n\n /** Queue elemek (convenience getter a snapshot-ból). */\n readonly items_$ = signal<SQ_SnapshotItem_Interface[]>([]);\n\n constructor() {\n this.eventSubscription = this.socket_CS.event$.subscribe(\n (envelope: { event: string; payload: Record<string, unknown> }): void => {\n this.handleSocketEvent(envelope);\n },\n );\n\n // Socket reconnect → queue újratöltése REST-ről (disconnect alatt kiesett socket push-ok pótlása).\n // Ugyanez a minta mint ClaudeCode_DataService.reconnectSubscription.\n this.reconnectSubscription = this.socket_CS.connected$.subscribe(\n (isConnected: boolean): void => {\n if (isConnected && this.activeSessionId) {\n DyFM_Log.info(\n `ExS_Queue_DS | Socket reconnected, reloading queue | session: ${this.activeSessionId}`,\n );\n this.loadQueue();\n }\n },\n );\n }\n\n ngOnDestroy(): void {\n this.eventSubscription?.unsubscribe();\n this.eventSubscription = null;\n this.reconnectSubscription?.unsubscribe();\n this.reconnectSubscription = null;\n }\n\n // ── Subscribe / Unsubscribe ───────────────────────────────────────────\n\n /**\n * Feliratkozás egy session queue-jára.\n * Beállítja az aktív session-t és betölti a queue snapshot-ot a szerverről.\n */\n subscribeToSession(params: {\n sessionId: string;\n baseRoute: string;\n }): void {\n this.activeSessionId = params.sessionId;\n this.activeBaseRoute = params.baseRoute;\n\n DyFM_Log.info(\n `ExS_Queue_DS | subscribeToSession`\n + ` | session: ${params.sessionId}`\n + ` | baseRoute: ${params.baseRoute}`,\n );\n\n // Kezdeti betöltés REST-ről\n this.loadQueue();\n }\n\n /**\n * Leiratkozás (session váltáskor vagy komponens destroy-kor).\n */\n unsubscribe(): void {\n this.activeSessionId = '';\n this.activeBaseRoute = '';\n this.queueSnapshot_$.set(null);\n this.items_$.set([]);\n this.isLocked_$.set(false);\n this.editingItemId_$.set(null);\n this.editingText_$.set('');\n }\n\n // ── Queue CRUD ────────────────────────────────────────────────────────\n\n /**\n * Edit indítás: lock + editingItemId beállítás.\n */\n async startEditing(queueItemId: string): Promise<void> {\n if (!this.activeSessionId || !this.activeBaseRoute) {\n return;\n }\n\n // Stale guard: ha az item már nincs a kliens signal-ben (auto-delivery időközben elvitte),\n // csendben reload-olunk — a DOM még nem frissült, de a szerver már törölte az elemet.\n if (!this.isItemInCurrentSnapshot(queueItemId)) {\n DyFM_Log.info(\n `ExS_Queue_DS | startEditing — stale item, reloading`\n + ` | queueItemId: ${queueItemId}`,\n );\n await this.loadQueue();\n return;\n }\n\n // Lock küldés a szervernek\n try {\n await this.sessionQueue_AS.lockQueue({\n baseRoute: this.activeBaseRoute,\n sessionId: this.activeSessionId,\n });\n } catch {\n // HTTP hibát az interceptor kezeli — ha lock meghiúsult, nem lépünk edit módba\n return;\n }\n\n // UI state beállítás\n const item: SQ_SnapshotItem_Interface | undefined =\n this.items_$().find(\n (i: SQ_SnapshotItem_Interface): boolean =>\n i.queueItemId === queueItemId,\n );\n\n this.isLocked_$.set(true);\n this.editingItemId_$.set(queueItemId);\n this.editingText_$.set(item?.text ?? '');\n }\n\n /**\n * Edit mentés: PATCH + unlock.\n * Hiba esetén az editing mód NEM zárul be — a user szövege megmarad retry-hoz.\n * Csak sikeres mentés után futtatjuk a finishEditing-et (unlock + UI reset).\n */\n async saveEdit(): Promise<void> {\n const itemId: string | null = this.editingItemId_$();\n if (!itemId || !this.activeSessionId || !this.activeBaseRoute) {\n return;\n }\n\n try {\n const result: Record<string, unknown> =\n await this.sessionQueue_AS.editItem({\n baseRoute: this.activeBaseRoute,\n sessionId: this.activeSessionId,\n queueItemId: itemId,\n text: this.editingText_$(),\n });\n\n // item: null → a szerver nem találta az elemet (auto-delivery közben elvitte)\n if (result.item === null) {\n this.globalError_CS.showError(\n new Error('Queue item not found — it may have been delivered while editing'),\n 'session-queue-edit',\n );\n await this.finishEditing();\n await this.loadQueue();\n return;\n }\n } catch (error: unknown) {\n // HTTP hiba → explicit showError; editing mód NEM zárul be, a user szövege megmarad\n this.globalError_CS.showError(error, 'session-queue-edit-save');\n return;\n }\n\n // Sikeres mentés → unlock + UI reset\n await this.finishEditing();\n }\n\n /**\n * Edit visszavonás: unlock, szerkesztés eldobása.\n */\n async cancelEdit(): Promise<void> {\n await this.finishEditing();\n }\n\n /**\n * Queue elem törlése.\n * Stale guard: ha az item már nincs a kliens snapshot-ban (auto-delivery elvitte),\n * csendben reload-olunk hiba popup nélkül.\n */\n async removeItem(queueItemId: string): Promise<void> {\n if (!this.activeSessionId || !this.activeBaseRoute) {\n return;\n }\n\n // Stale guard: kliens-oldali ellenőrzés szerver hívás előtt\n if (!this.isItemInCurrentSnapshot(queueItemId)) {\n DyFM_Log.info(\n `ExS_Queue_DS | removeItem — stale item, reloading`\n + ` | queueItemId: ${queueItemId}`,\n );\n await this.loadQueue();\n return;\n }\n\n try {\n const result: Record<string, unknown> =\n await this.sessionQueue_AS.removeItem({\n baseRoute: this.activeBaseRoute,\n sessionId: this.activeSessionId,\n queueItemId: queueItemId,\n });\n\n // success: false → szerver sem találta (auto-delivery vagy másik kliens közben törölte).\n // Csendben reload — az item eltűnése a kívánt eredmény, nem kell hiba.\n if (result.success === false) {\n DyFM_Log.info(\n `ExS_Queue_DS | removeItem — server: item not found, reloading`\n + ` | queueItemId: ${queueItemId}`,\n );\n await this.loadQueue();\n }\n } catch {\n // HTTP hibát az interceptor kezeli — queue reload, hogy a kliens szinkronban legyen\n await this.loadQueue();\n }\n }\n\n /**\n * Azonnali küldés.\n * Stale guard: ha az item már nincs a kliens snapshot-ban, csendben reload — auto-delivery\n * már elküldte az elemet, ez nem hiba, hanem normál race condition.\n * Valódi delivery hiba (session nem ready, adapter failed) továbbra is error popup-ot kap.\n */\n async sendNow(queueItemId: string): Promise<void> {\n if (!this.activeSessionId || !this.activeBaseRoute) {\n return;\n }\n\n // Stale guard: kliens-oldali ellenőrzés szerver hívás előtt\n if (!this.isItemInCurrentSnapshot(queueItemId)) {\n DyFM_Log.info(\n `ExS_Queue_DS | sendNow — stale item, reloading`\n + ` | queueItemId: ${queueItemId}`,\n );\n await this.loadQueue();\n return;\n }\n\n try {\n const result: Record<string, unknown> =\n await this.sessionQueue_AS.sendNow({\n baseRoute: this.activeBaseRoute,\n sessionId: this.activeSessionId,\n queueItemId: queueItemId,\n });\n\n if (result.success === false) {\n const reason: string =\n typeof result.reason === 'string' ? result.reason : 'unknown';\n\n // \"Item not found in queue\" → auto-delivery már elküldte; csendben reload (nem hiba).\n // Minden más reason (session not ready, adapter error) → valódi hiba, popup.\n if (reason === 'Item not found in queue') {\n DyFM_Log.info(\n `ExS_Queue_DS | sendNow — server: item already delivered, reloading`\n + ` | queueItemId: ${queueItemId}`,\n );\n } else {\n this.globalError_CS.showError(\n new Error(`Send-now delivery failed: ${reason}`),\n 'session-queue-send-now',\n );\n }\n\n await this.loadQueue();\n }\n } catch {\n // HTTP hibát az interceptor kezeli — queue reload, hogy a kliens szinkronban legyen\n await this.loadQueue();\n }\n }\n\n /**\n * Queue elem mozgatása (up/down).\n * Stale guard: ha az item már nincs a kliens snapshot-ban, csendben reload.\n */\n async reorderItem(params: {\n queueItemId: string;\n direction: 'up' | 'down';\n }): Promise<void> {\n if (!this.activeSessionId || !this.activeBaseRoute) {\n return;\n }\n\n // Stale guard: kliens-oldali ellenőrzés szerver hívás előtt\n if (!this.isItemInCurrentSnapshot(params.queueItemId)) {\n DyFM_Log.info(\n `ExS_Queue_DS | reorderItem — stale item, reloading`\n + ` | queueItemId: ${params.queueItemId}`,\n );\n await this.loadQueue();\n return;\n }\n\n try {\n const result: Record<string, unknown> =\n await this.sessionQueue_AS.reorderItem({\n baseRoute: this.activeBaseRoute,\n sessionId: this.activeSessionId,\n queueItemId: params.queueItemId,\n direction: params.direction,\n });\n\n // success: false → item közben eltűnt (auto-delivery vagy másik kliens).\n // Csendben reload — ugyanaz a race condition mint removeItem/sendNow.\n if (result.success === false) {\n DyFM_Log.info(\n `ExS_Queue_DS | reorderItem — server: item not found, reloading`\n + ` | queueItemId: ${params.queueItemId}`,\n );\n await this.loadQueue();\n }\n } catch {\n // HTTP hibát az interceptor kezeli — queue reload, hogy a kliens szinkronban legyen\n await this.loadQueue();\n }\n }\n\n // ── Private ───────────────────────────────────────────────────────────\n\n /**\n * Ellenőrzi, hogy a megadott queueItemId létezik-e az aktuális kliens-oldali snapshot-ban.\n * Stale guard: ha a szerver (auto-delivery / másik kliens) már eltávolította az elemet,\n * a socket push frissítette az items_$ signal-t, de a DOM még nem renderelődött újra —\n * ilyenkor a template-ből emittált queueItemId már stale. A signal SSOT, nem a DOM.\n */\n private isItemInCurrentSnapshot(queueItemId: string): boolean {\n return this.items_$().some(\n (i: SQ_SnapshotItem_Interface): boolean =>\n i.queueItemId === queueItemId,\n );\n }\n\n /**\n * Queue betöltése REST-ről (subscribe és reconnect esetén).\n * A sessionId-t és baseRoute-ot a hívás pillanatában rögzítjük:\n * ha a HTTP válasz ideje alatt session váltás történt, az eredményt eldobjuk (stale guard).\n */\n private async loadQueue(): Promise<void> {\n const capturedSessionId: string = this.activeSessionId;\n const capturedBaseRoute: string = this.activeBaseRoute;\n\n if (!capturedSessionId || !capturedBaseRoute) {\n return;\n }\n\n try {\n const result = await this.sessionQueue_AS.getQueue({\n baseRoute: capturedBaseRoute,\n sessionId: capturedSessionId,\n });\n\n // Stale guard: ha a session időközben megváltozott, az eredményt eldobjuk\n if (this.activeSessionId !== capturedSessionId) {\n DyFM_Log.info(\n `ExS_Queue_DS | loadQueue result discarded (session changed)`\n + ` | requested: ${capturedSessionId}`\n + ` | current: ${this.activeSessionId}`,\n );\n return;\n }\n\n const itemCount: number = result?.queue?.items?.length ?? 0;\n DyFM_Log.info(\n `ExS_Queue_DS | loadQueue OK | session: ${capturedSessionId}`\n + ` | items: ${itemCount}`,\n );\n\n this.applySnapshot(result.queue);\n } catch (error: unknown) {\n // Stale guard: session váltás történt — ne írjuk felül az új session adatait\n if (this.activeSessionId !== capturedSessionId) {\n return;\n }\n\n DyFM_Log.warn(\n `ExS_Queue_DS | loadQueue FAILED | session: ${capturedSessionId}`\n + ` | baseRoute: ${capturedBaseRoute}`\n + ` | error: ${error instanceof Error ? error.message : String(error)}`,\n );\n this.queueSnapshot_$.set(null);\n this.items_$.set([]);\n }\n }\n\n /**\n * Snapshot alkalmazása a signal-ekre.\n */\n private applySnapshot(snapshot: SQ_Snapshot_Response): void {\n this.queueSnapshot_$.set(snapshot);\n this.items_$.set(snapshot.items ?? []);\n this.isLocked_$.set(snapshot.isLocked);\n }\n\n /**\n * Szerkesztés befejezése: unlock + UI state reset.\n * Ha az unlock meghiúsul, a queue locked marad a szerveren (auto-delivery blokkolva) —\n * explicit hibaüzenet szükséges, hogy a user tudja és újra tudja próbálni.\n */\n private async finishEditing(): Promise<void> {\n this.editingItemId_$.set(null);\n this.editingText_$.set('');\n this.isLocked_$.set(false);\n\n if (!this.activeSessionId || !this.activeBaseRoute) {\n return;\n }\n\n try {\n await this.sessionQueue_AS.unlockQueue({\n baseRoute: this.activeBaseRoute,\n sessionId: this.activeSessionId,\n });\n } catch (error: unknown) {\n // Unlock hiba → a queue locked marad a szerveren, auto-delivery blokkolva.\n // Explicit hibaüzenet — a user-nek tudnia kell, hogy a lock aktív maradt.\n this.globalError_CS.showError(error, 'session-queue-unlock');\n }\n }\n\n /**\n * Socket event kezelés — queue snapshot és lock változás.\n */\n private handleSocketEvent(envelope: {\n event: string;\n payload: Record<string, unknown>;\n }): void {\n const payload: Record<string, unknown> = envelope.payload;\n const payloadSessionId: string =\n typeof payload.sessionId === 'string' ? payload.sessionId : '';\n\n // Csak az aktív session-höz tartozó event-eket kezeljük\n if (payloadSessionId !== this.activeSessionId) {\n return;\n }\n\n if (envelope.event === SOCKET_EVENT_SESSION_QUEUE_UPDATED) {\n this.applySnapshot(payload as unknown as SQ_Snapshot_Response);\n }\n\n if (envelope.event === SOCKET_EVENT_SESSION_QUEUE_LOCK_CHANGED) {\n const isLocked: boolean =\n typeof payload.isLocked === 'boolean' ? payload.isLocked : false;\n this.isLocked_$.set(isLocked);\n }\n }\n}\n", "import { Shr_LocalStoragePersistence_Util } from './storage/shr-local-storage-persistence.util';\n\n/**\n * REQ-SES-INPUT-DRAFT-001 follow-up (cycle 217) — egységesített prompt-piszkozat\n * localStorage util session-típustól függetlenül.\n *\n * A `Ses_InputStorage_Util` (CCAP session, prefix `ccap-ccapSession`) és a\n * `CC_InputStorage_Util` (CC session, prefix `ccap-ccSession`) eddig külön-külön\n * implementálta a `savePromptDraft / loadPromptDraft / clearPromptDraft`\n * hármast lényegében ugyanazzal a logikával, csak más prefixszel. Ez a shared\n * util egy közös magot ad — a hívók a prefixet paraméterként adják át, így a\n * localStorage kulcs-formátum (`{prefix}:promptDraft:{sessionId}`) változatlan\n * (backward-compatibility), de a duplikáció megszűnt.\n *\n * Send-flow használat (cycle 189 minta — REQ-CC-INPUT-CLEAR-001):\n * 1. user típus → `saveDraft(prefix, sessionId, content)` minden ngModelChange-en\n * 2. ngOnChanges sessionId váltás → `loadDraft(prefix, sessionId)` → input feltöltés\n * 3. send-START → `clearDraft(prefix, sessionId)` (await ELŐTT, hogy navigálás közben se legyen stuck)\n * 4. await sikeres → in-memory clear (a localStorage már üres)\n * 5. catch → `saveDraft(prefix, sessionId, content)` restore (retry-nál ne vesszen el)\n *\n * REQ-UI-MENU-STATE-001 (cycle 457): a `saveDraft / loadDraft / clearDraft` most\n * a generikus `Shr_LocalStoragePersistence_Util.writeString / readString / remove`\n * metódusokra delegál. A guard-ok (`!prefix || !sessionId` → no-op / üres-string\n * fallback) változatlanok; a try/catch best-effort viselkedés (private mode /\n * quota-exceeded → csendes return) a generikus util-ban van. Két foundation\n * util közül ez a domain-specifikus (prompt-draft) most a generikus\n * (string/boolean/JSON) tetejére költözött.\n */\nexport class SHR_PromptDraftStorage_Util {\n\n /** Per-session prompt piszkozat mentése a megadott prefix-szel. */\n static saveDraft(prefix: string, sessionId: string, content: string): void {\n if (!prefix || !sessionId) {\n return;\n }\n Shr_LocalStoragePersistence_Util.writeString(`${prefix}:promptDraft:${sessionId}`, content);\n }\n\n /** Per-session prompt piszkozat betöltése; üres string ha nincs vagy hiba. */\n static loadDraft(prefix: string, sessionId: string): string {\n if (!prefix || !sessionId) {\n return '';\n }\n return Shr_LocalStoragePersistence_Util.readString(`${prefix}:promptDraft:${sessionId}`) ?? '';\n }\n\n /** Per-session prompt piszkozat törlése (sikeres küldés után). */\n static clearDraft(prefix: string, sessionId: string): void {\n if (!prefix || !sessionId) {\n return;\n }\n Shr_LocalStoragePersistence_Util.remove(`${prefix}:promptDraft:${sessionId}`);\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275textInterpolate", "job_r1", "description", "\u0275\u0275textInterpolate1", "timezone", "\u0275\u0275property", "\u0275\u0275pipeBind1", "nextDueAt", "lastTriggeredAt", "ctx_r2", "getStatusColorClass", "exec_r2", "status", "scheduledAt", "skipReason", "errorDetails", "message", "getStatusLabel", "\u0275\u0275repeaterCreate", "SCH_SchedulePopup_Component_Conditional_3_For_2_Conditional_15_For_2_Template", "_forTrack0", "\u0275\u0275repeater", "getRecentExecutionsForJob", "_id", "\u0275\u0275template", "SCH_SchedulePopup_Component_Conditional_3_For_2_Conditional_7_Template", "SCH_SchedulePopup_Component_Conditional_3_For_2_Conditional_8_Template", "SCH_SchedulePopup_Component_Conditional_3_For_2_Conditional_9_Template", "SCH_SchedulePopup_Component_Conditional_3_For_2_Conditional_10_Template", "SCH_SchedulePopup_Component_Conditional_3_For_2_Conditional_12_Template", "SCH_SchedulePopup_Component_Conditional_3_For_2_Conditional_13_Template", "SCH_SchedulePopup_Component_Conditional_3_For_2_Conditional_14_Template", "SCH_SchedulePopup_Component_Conditional_3_For_2_Conditional_15_Template", "SCH_SchedulePopup_Component_Conditional_3_For_2_Conditional_16_Template", "name", "schedule", "\u0275\u0275conditional", "paused", "enabled", "dryRun", "length", "SCH_SchedulePopup_Component_Conditional_3_For_2_Template", "jobsForSession_$", "SCH_SchedulePopup_Component", "sessionId", "input", "required", "isOpen", "closed", "output", "jobs_DS", "inject", "SCH_ScheduledJobs_DataService", "computed", "sid", "jobs_$", "filter", "job", "target", "payload", "executionsByJob_$", "recentExecutions_$", "ngOnInit", "loadAll", "jobId", "get", "slice", "handleClose", "emit", "selectors", "inputs", "outputs", "standalone", "features", "\u0275\u0275StandaloneFeature", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275listener", "SCH_SchedulePopup_Component_Conditional_1_Template", "SCH_SchedulePopup_Component_Conditional_2_Template", "SCH_SchedulePopup_Component_Conditional_3_Template", "CommonModule", "NgClass", "S_Modal_Component", "S_AbsoluteTime_Pipe", "S_TimeAgo_Pipe", "SCH_SchedulePresetLabel_Pipe", "encapsulation", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "crd_r1", "providerName", "model", "projectId", "\u0275\u0275property", "pauseReason", "lastResponseSummary", "b_r2", "\u0275\u0275repeaterCreate", "CRD_InfoPopup_Component_Conditional_3_For_2_Conditional_26_For_2_Template", "\u0275\u0275repeaterTrackByIdentity", "\u0275\u0275repeater", "blockers", "\u0275\u0275template", "CRD_InfoPopup_Component_Conditional_3_For_2_Conditional_7_Template", "CRD_InfoPopup_Component_Conditional_3_For_2_Conditional_8_Template", "CRD_InfoPopup_Component_Conditional_3_For_2_Conditional_9_Template", "CRD_InfoPopup_Component_Conditional_3_For_2_Conditional_24_Template", "CRD_InfoPopup_Component_Conditional_3_For_2_Conditional_25_Template", "CRD_InfoPopup_Component_Conditional_3_For_2_Conditional_26_Template", "workflowId", "_id", "ctx_r2", "getStatusColorClass", "status", "\u0275\u0275conditional", "currentPhaseIndex", "currentPhaseStepCount", "totalStepCount", "length", "CRD_InfoPopup_Component_Conditional_3_For_2_Template", "_forTrack0", "coordinatorsForSession_$", "CRD_InfoPopup_Component", "sessionId", "input", "required", "isOpen", "closed", "output", "coordinator_DS", "inject", "Coordinator_DataService", "computed", "sid", "globalCoordinatorsList_$", "filter", "c", "ngOnInit", "loadAllCoordinatorsForManagementPage", "trim", "toLowerCase", "handleClose", "emit", "selectors", "inputs", "outputs", "standalone", "features", "\u0275\u0275StandaloneFeature", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275listener", "CRD_InfoPopup_Component_Conditional_1_Template", "CRD_InfoPopup_Component_Conditional_2_Template", "CRD_InfoPopup_Component_Conditional_3_Template", "CommonModule", "NgClass", "S_Modal_Component", "encapsulation", "ExS_Queue_ApiService", "apiBase", "environment", "api", "baseUrl", "http", "inject", "HttpClient", "getQueue", "params", "url", "buildUrl", "baseRoute", "sessionId", "Date", "now", "firstValueFrom", "get", "editItem", "queueItemId", "patch", "text", "removeItem", "delete", "sendNow", "post", "reorderItem", "direction", "lockQueue", "unlockQueue", "factory", "\u0275fac", "providedIn", "import_fsm_dynamo", "SOCKET_EVENT_SESSION_QUEUE_UPDATED", "SOCKET_EVENT_SESSION_QUEUE_LOCK_CHANGED", "ExS_Queue_DataService", "sessionQueue_AS", "inject", "ExS_Queue_ApiService", "socket_CS", "CCAP_Socket_ControlService", "globalError_CS", "CCAP_GlobalError_ControlService", "eventSubscription", "reconnectSubscription", "activeSessionId", "activeBaseRoute", "queueSnapshot_$", "signal", "isLocked_$", "editingItemId_$", "editingText_$", "items_$", "constructor", "event$", "subscribe", "envelope", "handleSocketEvent", "connected$", "isConnected", "DyFM_Log", "info", "loadQueue", "ngOnDestroy", "unsubscribe", "subscribeToSession", "params", "sessionId", "baseRoute", "set", "startEditing", "queueItemId", "__async", "isItemInCurrentSnapshot", "lockQueue", "item", "find", "i", "text", "saveEdit", "itemId", "editItem", "showError", "Error", "finishEditing", "error", "cancelEdit", "removeItem", "success", "sendNow", "result", "reason", "reorderItem", "direction", "some", "capturedSessionId", "capturedBaseRoute", "getQueue", "itemCount", "queue", "items", "length", "applySnapshot", "warn", "message", "String", "snapshot", "isLocked", "unlockQueue", "payload", "event", "factory", "\u0275fac", "providedIn", "SHR_PromptDraftStorage_Util", "saveDraft", "prefix", "sessionId", "content", "Shr_LocalStoragePersistence_Util", "writeString", "loadDraft", "readString", "clearDraft", "remove"]
4
+ "sourcesContent": ["import { CommonModule } from '@angular/common';\nimport { Component, computed, inject, input, InputSignal, OnInit, output, OutputEmitterRef, Signal } from '@angular/core';\n\nimport { S_Modal_Component } from '../../../shared/_components/s-modal/s-modal.component';\nimport { S_AbsoluteTime_Pipe } from '../../../shared/_pipes/s-absolute-time.pipe';\nimport { S_TimeAgo_Pipe } from '../../../shared/_pipes/s-time-ago.pipe';\nimport { SCH_Execution_Response, SCH_Job_Response } from '../../_models/interfaces/sch-job.interface';\nimport { SCH_SchedulePresetLabel_Pipe } from '../../_pipes/sch-schedule-preset-label.pipe';\nimport { SCH_ScheduledJobs_DataService } from '../../_services/data-services/sch-scheduled-jobs.data-service';\n\n/**\n * REQ-SCH-IND-CLICK-001 (cycle 201) — Schedule indicator click → popup info modal.\n *\n * Megjeleníti a megadott `sessionId`-hez tartozó aktív (enabled) schedule job-okat,\n * a per-job utolsó 5 execution rekord státuszával együtt. A popup forrása a\n * `SCH_ScheduledJobs_DataService.jobs_$` + `.recentExecutions_$` signal-pár — a\n * dashboard-ok már `loadAll()`-t hívnak, tehát a popup nyitásakor friss adatra ülünk.\n *\n * A modal layout-jához az s-modal SSOT komponenst használjuk; a job-lista belül\n * scrollolható (overflow-y-auto), így sok job esetén sem nő ki a modal magasság.\n */\n@Component({\n selector: 'app-sch-schedule-popup',\n standalone: true,\n imports: [CommonModule, S_Modal_Component, S_AbsoluteTime_Pipe, S_TimeAgo_Pipe, SCH_SchedulePresetLabel_Pipe],\n templateUrl: './sch-schedule-popup.component.html',\n})\n/** SCH_SchedulePopup_Component class. */\nexport class SCH_SchedulePopup_Component implements OnInit {\n\n /** A megjelenített session-höz tartozó jobs filter kulcsa. `null` → üres lista. */\n readonly sessionId: InputSignal<string | null> = input.required<string | null>();\n\n /** Modal nyitva. */\n readonly isOpen: InputSignal<boolean> = input.required<boolean>();\n\n /** Bezárás esemény. */\n readonly closed: OutputEmitterRef<void> = output<void>();\n\n readonly jobs_DS: SCH_ScheduledJobs_DataService = inject(SCH_ScheduledJobs_DataService);\n\n /** Az aktuális sessionId-hez tartozó job-ok (target.payload.sessionId match). */\n readonly jobsForSession_$: Signal<SCH_Job_Response[]> = computed(\n (): SCH_Job_Response[] => {\n const sid: string | null = this.sessionId();\n if (!sid) {\n return [];\n }\n return this.jobs_DS.jobs_$().filter(\n (job: SCH_Job_Response): boolean => job.target?.payload?.sessionId === sid,\n );\n },\n );\n\n /** Per-job utolsó 5 execution rekord (legújabb elöl) — DS map szerint. */\n readonly executionsByJob_$: Signal<Map<string, SCH_Execution_Response[]>> = computed(\n (): Map<string, SCH_Execution_Response[]> => this.jobs_DS.recentExecutions_$(),\n );\n\n /** Deep-link / first-paint fallback: ha a DS még üres, töltsük be most. */\n ngOnInit(): void {\n if (this.jobs_DS.jobs_$().length === 0) {\n void this.jobs_DS.loadAll();\n }\n }\n\n /** Egy adott job utolsó max 5 execution-jét adja vissza, legújabb elöl. */\n getRecentExecutionsForJob(jobId: string | undefined): SCH_Execution_Response[] {\n if (!jobId) {\n return [];\n }\n const all: SCH_Execution_Response[] = this.executionsByJob_$().get(jobId) ?? [];\n return all.slice(0, 5);\n }\n\n /** Status → Tailwind szín-osztály (zöld OK / sárga skip / piros fail / kék run / szürke egyéb). */\n getStatusColorClass(status: string | undefined): string {\n switch (status) {\n case 'completed': return 'bg-green-500/20 text-green-400';\n case 'triggered': return 'bg-blue-500/20 text-blue-400';\n case 'skipped': return 'bg-yellow-500/20 text-yellow-400';\n case 'failed': return 'bg-red-500/20 text-red-400';\n case 'cancelled': return 'bg-neutral-500/20 text-neutral-400';\n case 'dry-run': return 'bg-purple-500/20 text-purple-400';\n default: return 'bg-neutral-700/30 text-neutral-300';\n }\n }\n\n /** Status label rövidítés. */\n getStatusLabel(status: string | undefined): string {\n switch (status) {\n case 'completed': return 'OK';\n case 'triggered': return 'RUN';\n case 'skipped': return 'SKP';\n case 'failed': return 'FAIL';\n case 'cancelled': return 'CNL';\n case 'dry-run': return 'DRY';\n default: return status ?? '—';\n }\n }\n\n /** Bezárás propagálás. */\n handleClose(): void {\n this.closed.emit();\n }\n}\n", "<app-s-modal [isOpen]=\"isOpen()\"\n [title]=\"'Schedule infók ehhez a session-höz'\"\n [maxWidth]=\"'lg'\"\n [bodyFlexColumn]=\"true\"\n [headerBorderClass]=\"'border-neonCyan/50'\"\n (closed)=\"handleClose()\">\n\n @if (!sessionId()) {\n <div class=\"p-4 text-center text-neutral-500 text-sm\">Nincs kiválasztott session.</div>\n } @else if (jobsForSession_$().length === 0) {\n <div class=\"p-4 text-center text-neutral-500 text-sm\">\n Ehhez a sessionhöz nincs aktív schedule job.\n </div>\n } @else {\n <!-- Job lista — belső scroll a hosszabb listáknak. -->\n <div class=\"flex-1 overflow-y-auto space-y-3 pr-1\">\n @for (job of jobsForSession_$(); track job._id) {\n <div class=\"border border-neutral-700/60 rounded-md p-2.5 bg-neutral-900/40\">\n <!-- Fejléc: név + cron preset + enabled/paused jelző. -->\n <div class=\"flex items-center gap-2 mb-1.5\">\n <span class=\"text-sm font-medium text-neutral-200 truncate\">\n {{ job.name || job._id }}\n </span>\n <span class=\"text-[10px] text-neutral-400\">\n {{ job.schedule | schSchedulePresetLabel }}\n </span>\n @if (job.paused) {\n <span class=\"text-[10px] px-1 rounded bg-yellow-500/20 text-yellow-400\">paused</span>\n }\n @if (job.enabled === false) {\n <span class=\"text-[10px] px-1 rounded bg-neutral-500/20 text-neutral-400\">disabled</span>\n }\n @if (job.dryRun) {\n <span class=\"text-[10px] px-1 rounded bg-purple-500/20 text-purple-400\">dry-run</span>\n }\n </div>\n\n <!-- Description, ha van. -->\n @if (job.description) {\n <div class=\"text-[11px] text-neutral-400 mb-1.5 truncate\">{{ job.description }}</div>\n }\n\n <!-- Meta: timezone + nextDueAt + lastTriggeredAt. -->\n <div class=\"flex flex-wrap gap-x-3 gap-y-0.5 text-[10px] text-neutral-500 mb-2\">\n @if (job.timezone) {\n <span><span class=\"text-neutral-600\">tz:</span> {{ job.timezone }}</span>\n }\n @if (job.nextDueAt) {\n <span [title]=\"job.nextDueAt | sAbsoluteTime\"><span class=\"text-neutral-600\">next:</span> {{ job.nextDueAt | sTimeAgo }}</span>\n }\n @if (job.lastTriggeredAt) {\n <span [title]=\"job.lastTriggeredAt | sAbsoluteTime\"><span class=\"text-neutral-600\">last:</span> {{ job.lastTriggeredAt | sTimeAgo }}</span>\n }\n </div>\n\n <!-- Utolsó max 5 execution badge sor. -->\n @if (getRecentExecutionsForJob(job._id).length > 0) {\n <div class=\"flex flex-wrap gap-1\">\n @for (exec of getRecentExecutionsForJob(job._id); track exec._id) {\n <span\n class=\"text-[10px] px-1.5 py-0.5 rounded font-mono\"\n [ngClass]=\"getStatusColorClass(exec.status)\"\n [title]=\"(exec.scheduledAt || '—')\n + ' — ' + (exec.status || '—')\n + (exec.skipReason ? ' (' + exec.skipReason + ')' : '')\n + (exec.errorDetails?.message ? ': ' + exec.errorDetails!.message : '')\">\n {{ getStatusLabel(exec.status) }}\n </span>\n }\n </div>\n } @else {\n <div class=\"text-[10px] text-neutral-500\">Még nem volt execution.</div>\n }\n </div>\n }\n </div>\n }\n</app-s-modal>\n", "import { CommonModule } from '@angular/common';\nimport { Component, computed, inject, input, InputSignal, OnInit, output, OutputEmitterRef, Signal } from '@angular/core';\n\nimport { CCAP_CoordinatorSession_Response } from '../../../../_models/interfaces/coordinator/ccap-coordinator-session.interface';\nimport { S_Modal_Component } from '../../../shared/_components/s-modal/s-modal.component';\nimport { Coordinator_DataService } from '../../_services/coordinator.data-service';\n\n/**\n * REQ-SES-CRD-IND-001 Slice 3 (cycle 202) — Coordinator indicator click → popup info modal.\n *\n * Megjeleníti a megadott `sessionId`-hez tartozó koordinátorokat (név → workflow / model\n * / státusz / phase progress / blockers / pauseReason) — analóg módon a\n * `SCH_SchedulePopup_Component`-tel (cycle 201). A popup forrása a\n * `Coordinator_DataService.globalCoordinatorsList_$` signal — a dashboard-ok már\n * `loadAllCoordinatorsForManagementPage()`-t hívnak ngOnInit-ben, tehát a popup\n * nyitásakor friss adatra ülünk; deep-link fallback ngOnInit-ben.\n */\n@Component({\n selector: 'app-crd-info-popup',\n standalone: true,\n imports: [CommonModule, S_Modal_Component],\n templateUrl: './crd-info-popup.component.html',\n})\n/** CRD_InfoPopup_Component class. */\nexport class CRD_InfoPopup_Component implements OnInit {\n\n /** A megjelenített session-höz tartozó koordinátorok filter kulcsa. `null` → üres lista. */\n readonly sessionId: InputSignal<string | null> = input.required<string | null>();\n\n /** Modal nyitva. */\n readonly isOpen: InputSignal<boolean> = input.required<boolean>();\n\n /** Bezárás esemény. */\n readonly closed: OutputEmitterRef<void> = output<void>();\n\n readonly coordinator_DS: Coordinator_DataService = inject(Coordinator_DataService);\n\n /**\n * Az aktuális sessionId-hez tartozó koordinátorok (sessionId match).\n * Megtartjuk a stopped/completed státuszúakat is — a user a \"miért fejeződött be\"-t\n * is láthatja, így informatívabb a popup, mint a sima badge-szűrés.\n */\n readonly coordinatorsForSession_$: Signal<CCAP_CoordinatorSession_Response[]> = computed(\n (): CCAP_CoordinatorSession_Response[] => {\n const sid: string | null = this.sessionId();\n if (!sid) {\n return [];\n }\n return this.coordinator_DS.globalCoordinatorsList_$().filter(\n (c: CCAP_CoordinatorSession_Response): boolean => c.sessionId === sid,\n );\n },\n );\n\n /** Deep-link / first-paint fallback: ha a DS még üres, töltsük be most. */\n ngOnInit(): void {\n if (this.coordinator_DS.globalCoordinatorsList_$().length === 0) {\n void this.coordinator_DS.loadAllCoordinatorsForManagementPage();\n }\n }\n\n /** Status → Tailwind szín-osztály (zöld active / sárga paused / kék idle / szürke stopped/completed). */\n getStatusColorClass(status: string | undefined): string {\n const s: string = (status ?? '').trim().toLowerCase();\n switch (s) {\n case 'active': return 'bg-green-500/20 text-green-400';\n case 'running': return 'bg-green-500/20 text-green-400';\n case 'paused': return 'bg-yellow-500/20 text-yellow-400';\n case 'idle': return 'bg-blue-500/20 text-blue-400';\n case 'stopped': return 'bg-neutral-500/20 text-neutral-400';\n case 'completed': return 'bg-neutral-600/20 text-neutral-400';\n case 'failed': return 'bg-red-500/20 text-red-400';\n default: return 'bg-neutral-700/30 text-neutral-300';\n }\n }\n\n /** Bezárás propagálás. */\n handleClose(): void {\n this.closed.emit();\n }\n}\n", "<app-s-modal [isOpen]=\"isOpen()\"\n [title]=\"'Koordinátor infók ehhez a session-höz'\"\n [maxWidth]=\"'lg'\"\n [bodyFlexColumn]=\"true\"\n [headerBorderClass]=\"'border-neonAmber/50'\"\n (closed)=\"handleClose()\">\n\n @if (!sessionId()) {\n <div class=\"p-4 text-center text-neutral-500 text-sm\">Nincs kiválasztott session.</div>\n } @else if (coordinatorsForSession_$().length === 0) {\n <div class=\"p-4 text-center text-neutral-500 text-sm\">\n Ehhez a sessionhöz nincs koordinátor.\n </div>\n } @else {\n <!-- Koordinátor lista — belső scroll a hosszabb listáknak. -->\n <div class=\"flex-1 overflow-y-auto space-y-3 pr-1\">\n @for (crd of coordinatorsForSession_$(); track crd._id) {\n <div class=\"border border-neutral-700/60 rounded-md p-2.5 bg-neutral-900/40\">\n <!-- Fejléc: workflowId + status badge. -->\n <div class=\"flex items-center gap-2 mb-1.5\">\n <span class=\"text-sm font-medium text-neutral-200 truncate\">\n {{ crd.workflowId || crd._id }}\n </span>\n <span class=\"text-[10px] px-1.5 py-0.5 rounded font-mono\"\n [ngClass]=\"getStatusColorClass(crd.status)\">\n {{ crd.status || '—' }}\n </span>\n </div>\n\n <!-- Meta: providerName + model + projectId. -->\n <div class=\"flex flex-wrap gap-x-3 gap-y-0.5 text-[10px] text-neutral-500 mb-2\">\n @if (crd.providerName) {\n <span><span class=\"text-neutral-600\">provider:</span> {{ crd.providerName }}</span>\n }\n @if (crd.model) {\n <span><span class=\"text-neutral-600\">model:</span> {{ crd.model }}</span>\n }\n @if (crd.projectId) {\n <span><span class=\"text-neutral-600\">project:</span> {{ crd.projectId }}</span>\n }\n </div>\n\n <!-- Phase progress + total step count. -->\n <div class=\"text-[11px] text-neutral-400 mb-1.5\">\n <span class=\"text-neutral-600\">phase:</span>\n {{ crd.currentPhaseIndex }}\n <span class=\"text-neutral-600\">·</span>\n <span class=\"text-neutral-600\">phase-step:</span>\n {{ crd.currentPhaseStepCount }}\n <span class=\"text-neutral-600\">·</span>\n <span class=\"text-neutral-600\">total:</span>\n {{ crd.totalStepCount }}\n </div>\n\n <!-- Pause reason, ha paused. -->\n @if (crd.pauseReason) {\n <div class=\"text-[11px] text-yellow-400/80 mb-1.5 truncate\"\n [title]=\"crd.pauseReason\">\n <span class=\"text-neutral-600\">paused:</span> {{ crd.pauseReason }}\n </div>\n }\n\n <!-- Last response summary. -->\n @if (crd.lastResponseSummary) {\n <div class=\"text-[11px] text-neutral-400 mb-1.5 line-clamp-2\"\n [title]=\"crd.lastResponseSummary\">\n <span class=\"text-neutral-600\">last:</span> {{ crd.lastResponseSummary }}\n </div>\n }\n\n <!-- Blockers. -->\n @if (crd.blockers && crd.blockers.length > 0) {\n <div class=\"flex flex-wrap gap-1 mt-1\">\n @for (b of crd.blockers; track b) {\n <span class=\"text-[10px] px-1.5 py-0.5 rounded bg-red-500/15 text-red-400 truncate max-w-full\"\n [title]=\"b\">\n blocker: {{ b }}\n </span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n</app-s-modal>\n", "import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\n\nimport { firstValueFrom } from 'rxjs';\n\nimport { environment } from '../../../../environments/environment';\nimport {\n SQ_Snapshot_Response,\n} from '../../../_models/interfaces/session-queue/ccap-session-queue-snapshot.interface';\n\n/**\n * Session queue REST API service.\n * Session-type agnosztikus: a baseRoute paraméterrel határozzuk meg az útvonalat\n * (pl. 'session', 'ca-session', 'cc-session', 'oc-session').\n */\n@Injectable({ providedIn: 'root' })\nexport class ExS_Queue_ApiService {\n\n private readonly apiBase: string = environment.api.baseUrl;\n\n private readonly http: HttpClient = inject(HttpClient);\n\n /**\n * Queue snapshot lekérdezése.\n * Cache-bust query paraméter: a böngésző ne cache-elje a GET választ\n * (navigáció után stale/üres snapshot-ot adna vissza).\n */\n getQueue(params: {\n baseRoute: string;\n sessionId: string;\n }): Promise<{ queue: SQ_Snapshot_Response }> {\n const url: string = `${this.buildUrl(params.baseRoute, params.sessionId)}?_t=${Date.now()}`;\n return firstValueFrom(\n this.http.get<{ queue: SQ_Snapshot_Response }>(url),\n );\n }\n\n /**\n * Queue elem szerkesztése.\n */\n editItem(params: {\n baseRoute: string;\n sessionId: string;\n queueItemId: string;\n text: string;\n }): Promise<Record<string, unknown>> {\n const url: string =\n `${this.buildUrl(params.baseRoute, params.sessionId)}/${params.queueItemId}`;\n return firstValueFrom(\n this.http.patch<Record<string, unknown>>(url, { text: params.text }),\n );\n }\n\n /**\n * Queue elem törlése.\n */\n removeItem(params: {\n baseRoute: string;\n sessionId: string;\n queueItemId: string;\n }): Promise<Record<string, unknown>> {\n const url: string =\n `${this.buildUrl(params.baseRoute, params.sessionId)}/${params.queueItemId}`;\n return firstValueFrom(\n this.http.delete<Record<string, unknown>>(url),\n );\n }\n\n /**\n * Azonnali küldés.\n */\n sendNow(params: {\n baseRoute: string;\n sessionId: string;\n queueItemId: string;\n }): Promise<Record<string, unknown>> {\n const url: string =\n `${this.buildUrl(params.baseRoute, params.sessionId)}/${params.queueItemId}/send-now`;\n return firstValueFrom(\n this.http.post<Record<string, unknown>>(url, {}),\n );\n }\n\n /**\n * Queue elem sorrend módosítása (up/down).\n */\n reorderItem(params: {\n baseRoute: string;\n sessionId: string;\n queueItemId: string;\n direction: 'up' | 'down';\n }): Promise<Record<string, unknown>> {\n const url: string =\n `${this.buildUrl(params.baseRoute, params.sessionId)}/${params.queueItemId}/reorder`;\n return firstValueFrom(\n this.http.post<Record<string, unknown>>(url, { direction: params.direction }),\n );\n }\n\n /**\n * Queue lock (editing mode).\n */\n lockQueue(params: {\n baseRoute: string;\n sessionId: string;\n }): Promise<Record<string, unknown>> {\n const url: string = `${this.buildUrl(params.baseRoute, params.sessionId)}/lock`;\n return firstValueFrom(\n this.http.post<Record<string, unknown>>(url, {}),\n );\n }\n\n /**\n * Queue unlock.\n */\n unlockQueue(params: {\n baseRoute: string;\n sessionId: string;\n }): Promise<Record<string, unknown>> {\n const url: string = `${this.buildUrl(params.baseRoute, params.sessionId)}/unlock`;\n return firstValueFrom(\n this.http.post<Record<string, unknown>>(url, {}),\n );\n }\n\n /**\n * URL builder: /api/{baseRoute}-queue/{sessionId}\n *\n * A DyNTS Router nem használ mergeParams-ot, ezért a :sessionId param\n * a controller endpoint path-jában van — az API URL struktúra:\n * /api/cc-session-queue/{sessionId} (nem /api/cc-session/{sessionId}/queue).\n */\n private buildUrl(baseRoute: string, sessionId: string): string {\n return `${this.apiBase}/${baseRoute}-queue/${sessionId}`;\n }\n}\n", "import { inject, Injectable, OnDestroy, signal } from '@angular/core';\n\nimport { Subscription } from 'rxjs';\n\nimport {\n SQ_Snapshot_Response,\n SQ_SnapshotItem_Interface,\n} from '../../../_models/interfaces/session-queue/ccap-session-queue-snapshot.interface';\nimport { ExS_Queue_ApiService } from './exs-queue.api-service';\nimport { CCAP_Socket_ControlService } from '../../../_services/control-services/ccap-socket.control-service';\nimport { CCAP_GlobalError_ControlService } from '../../../_services/control-services/ccap-global-error.control-service';\nimport { DyFM_Log } from '@futdevpro/fsm-dynamo';\n\n/** Socket event nevek (szerver konstansokkal szinkronban). */\nconst SOCKET_EVENT_SESSION_QUEUE_UPDATED: string = 'session-queue:updated';\nconst SOCKET_EVENT_SESSION_QUEUE_LOCK_CHANGED: string = 'session-queue:lock-changed';\n\n/**\n * Session queue data-service.\n * Socket.io event-eket figyeli és signal-ben tárolja a queue állapotot.\n * Session-type agnosztikus — a subscribeToSession-ben kapja a baseRoute-ot.\n */\n@Injectable({ providedIn: 'root' })\nexport class ExS_Queue_DataService implements OnDestroy {\n\n private readonly sessionQueue_AS: ExS_Queue_ApiService =\n inject(ExS_Queue_ApiService);\n private readonly socket_CS: CCAP_Socket_ControlService = inject(CCAP_Socket_ControlService);\n private readonly globalError_CS: CCAP_GlobalError_ControlService =\n inject(CCAP_GlobalError_ControlService);\n\n private eventSubscription: Subscription | null = null;\n\n /** Socket reconnect subscription (queue reload triggerhez). */\n private reconnectSubscription: Subscription | null = null;\n\n /** Aktív session azonosító. */\n private activeSessionId: string = '';\n\n /** Aktív session base route (pl. 'session', 'ca-session'). */\n private activeBaseRoute: string = '';\n\n // ── Publikus signal-ek ────────────────────────────────────────────────\n\n /** Aktuális queue snapshot (null ha nincs aktív session vagy üres). */\n readonly queueSnapshot_$ = signal<SQ_Snapshot_Response | null>(null);\n\n /** Queue lock állapot. */\n readonly isLocked_$ = signal<boolean>(false);\n\n /** Szerkesztés alatt álló elem ID-ja (null ha nincs szerkesztés). */\n readonly editingItemId_$ = signal<string | null>(null);\n\n /** Szerkesztés alatti szöveg. */\n readonly editingText_$ = signal<string>('');\n\n /** Queue elemek (convenience getter a snapshot-ból). */\n readonly items_$ = signal<SQ_SnapshotItem_Interface[]>([]);\n\n constructor() {\n this.eventSubscription = this.socket_CS.event$.subscribe(\n (envelope: { event: string; payload: Record<string, unknown> }): void => {\n this.handleSocketEvent(envelope);\n },\n );\n\n // Socket reconnect → queue újratöltése REST-ről (disconnect alatt kiesett socket push-ok pótlása).\n // Ugyanez a minta mint ClaudeCode_DataService.reconnectSubscription.\n this.reconnectSubscription = this.socket_CS.connected$.subscribe(\n (isConnected: boolean): void => {\n if (isConnected && this.activeSessionId) {\n DyFM_Log.info(\n `ExS_Queue_DS | Socket reconnected, reloading queue | session: ${this.activeSessionId}`,\n );\n this.loadQueue();\n }\n },\n );\n }\n\n ngOnDestroy(): void {\n this.eventSubscription?.unsubscribe();\n this.eventSubscription = null;\n this.reconnectSubscription?.unsubscribe();\n this.reconnectSubscription = null;\n }\n\n // ── Subscribe / Unsubscribe ───────────────────────────────────────────\n\n /**\n * Feliratkozás egy session queue-jára.\n * Beállítja az aktív session-t és betölti a queue snapshot-ot a szerverről.\n */\n subscribeToSession(params: {\n sessionId: string;\n baseRoute: string;\n }): void {\n this.activeSessionId = params.sessionId;\n this.activeBaseRoute = params.baseRoute;\n\n DyFM_Log.info(\n `ExS_Queue_DS | subscribeToSession`\n + ` | session: ${params.sessionId}`\n + ` | baseRoute: ${params.baseRoute}`,\n );\n\n // Kezdeti betöltés REST-ről\n this.loadQueue();\n }\n\n /**\n * Leiratkozás (session váltáskor vagy komponens destroy-kor).\n */\n unsubscribe(): void {\n this.activeSessionId = '';\n this.activeBaseRoute = '';\n this.queueSnapshot_$.set(null);\n this.items_$.set([]);\n this.isLocked_$.set(false);\n this.editingItemId_$.set(null);\n this.editingText_$.set('');\n }\n\n // ── Queue CRUD ────────────────────────────────────────────────────────\n\n /**\n * Edit indítás: lock + editingItemId beállítás.\n */\n async startEditing(queueItemId: string): Promise<void> {\n if (!this.activeSessionId || !this.activeBaseRoute) {\n return;\n }\n\n // Stale guard: ha az item már nincs a kliens signal-ben (auto-delivery időközben elvitte),\n // csendben reload-olunk — a DOM még nem frissült, de a szerver már törölte az elemet.\n if (!this.isItemInCurrentSnapshot(queueItemId)) {\n DyFM_Log.info(\n `ExS_Queue_DS | startEditing — stale item, reloading`\n + ` | queueItemId: ${queueItemId}`,\n );\n await this.loadQueue();\n return;\n }\n\n // Lock küldés a szervernek\n try {\n await this.sessionQueue_AS.lockQueue({\n baseRoute: this.activeBaseRoute,\n sessionId: this.activeSessionId,\n });\n } catch {\n // HTTP hibát az interceptor kezeli — ha lock meghiúsult, nem lépünk edit módba\n return;\n }\n\n // UI state beállítás\n const item: SQ_SnapshotItem_Interface | undefined =\n this.items_$().find(\n (i: SQ_SnapshotItem_Interface): boolean =>\n i.queueItemId === queueItemId,\n );\n\n this.isLocked_$.set(true);\n this.editingItemId_$.set(queueItemId);\n this.editingText_$.set(item?.text ?? '');\n }\n\n /**\n * Edit mentés: PATCH + unlock.\n * Hiba esetén az editing mód NEM zárul be — a user szövege megmarad retry-hoz.\n * Csak sikeres mentés után futtatjuk a finishEditing-et (unlock + UI reset).\n */\n async saveEdit(): Promise<void> {\n const itemId: string | null = this.editingItemId_$();\n if (!itemId || !this.activeSessionId || !this.activeBaseRoute) {\n return;\n }\n\n try {\n const result: Record<string, unknown> =\n await this.sessionQueue_AS.editItem({\n baseRoute: this.activeBaseRoute,\n sessionId: this.activeSessionId,\n queueItemId: itemId,\n text: this.editingText_$(),\n });\n\n // item: null → a szerver nem találta az elemet (auto-delivery közben elvitte)\n if (result.item === null) {\n this.globalError_CS.showError(\n new Error('Queue item not found — it may have been delivered while editing'),\n 'session-queue-edit',\n );\n await this.finishEditing();\n await this.loadQueue();\n return;\n }\n } catch (error: unknown) {\n // HTTP hiba → explicit showError; editing mód NEM zárul be, a user szövege megmarad\n this.globalError_CS.showError(error, 'session-queue-edit-save');\n return;\n }\n\n // Sikeres mentés → unlock + UI reset\n await this.finishEditing();\n }\n\n /**\n * Edit visszavonás: unlock, szerkesztés eldobása.\n */\n async cancelEdit(): Promise<void> {\n await this.finishEditing();\n }\n\n /**\n * Queue elem törlése.\n * Stale guard: ha az item már nincs a kliens snapshot-ban (auto-delivery elvitte),\n * csendben reload-olunk hiba popup nélkül.\n */\n async removeItem(queueItemId: string): Promise<void> {\n if (!this.activeSessionId || !this.activeBaseRoute) {\n return;\n }\n\n // Stale guard: kliens-oldali ellenőrzés szerver hívás előtt\n if (!this.isItemInCurrentSnapshot(queueItemId)) {\n DyFM_Log.info(\n `ExS_Queue_DS | removeItem — stale item, reloading`\n + ` | queueItemId: ${queueItemId}`,\n );\n await this.loadQueue();\n return;\n }\n\n try {\n const result: Record<string, unknown> =\n await this.sessionQueue_AS.removeItem({\n baseRoute: this.activeBaseRoute,\n sessionId: this.activeSessionId,\n queueItemId: queueItemId,\n });\n\n // success: false → szerver sem találta (auto-delivery vagy másik kliens közben törölte).\n // Csendben reload — az item eltűnése a kívánt eredmény, nem kell hiba.\n if (result.success === false) {\n DyFM_Log.info(\n `ExS_Queue_DS | removeItem — server: item not found, reloading`\n + ` | queueItemId: ${queueItemId}`,\n );\n await this.loadQueue();\n }\n } catch {\n // HTTP hibát az interceptor kezeli — queue reload, hogy a kliens szinkronban legyen\n await this.loadQueue();\n }\n }\n\n /**\n * Azonnali küldés.\n * Stale guard: ha az item már nincs a kliens snapshot-ban, csendben reload — auto-delivery\n * már elküldte az elemet, ez nem hiba, hanem normál race condition.\n * Valódi delivery hiba (session nem ready, adapter failed) továbbra is error popup-ot kap.\n */\n async sendNow(queueItemId: string): Promise<void> {\n if (!this.activeSessionId || !this.activeBaseRoute) {\n return;\n }\n\n // Stale guard: kliens-oldali ellenőrzés szerver hívás előtt\n if (!this.isItemInCurrentSnapshot(queueItemId)) {\n DyFM_Log.info(\n `ExS_Queue_DS | sendNow — stale item, reloading`\n + ` | queueItemId: ${queueItemId}`,\n );\n await this.loadQueue();\n return;\n }\n\n try {\n const result: Record<string, unknown> =\n await this.sessionQueue_AS.sendNow({\n baseRoute: this.activeBaseRoute,\n sessionId: this.activeSessionId,\n queueItemId: queueItemId,\n });\n\n if (result.success === false) {\n const reason: string =\n typeof result.reason === 'string' ? result.reason : 'unknown';\n\n // \"Item not found in queue\" → auto-delivery már elküldte; csendben reload (nem hiba).\n // Minden más reason (session not ready, adapter error) → valódi hiba, popup.\n if (reason === 'Item not found in queue') {\n DyFM_Log.info(\n `ExS_Queue_DS | sendNow — server: item already delivered, reloading`\n + ` | queueItemId: ${queueItemId}`,\n );\n } else {\n this.globalError_CS.showError(\n new Error(`Send-now delivery failed: ${reason}`),\n 'session-queue-send-now',\n );\n }\n\n await this.loadQueue();\n }\n } catch {\n // HTTP hibát az interceptor kezeli — queue reload, hogy a kliens szinkronban legyen\n await this.loadQueue();\n }\n }\n\n /**\n * Queue elem mozgatása (up/down).\n * Stale guard: ha az item már nincs a kliens snapshot-ban, csendben reload.\n */\n async reorderItem(params: {\n queueItemId: string;\n direction: 'up' | 'down';\n }): Promise<void> {\n if (!this.activeSessionId || !this.activeBaseRoute) {\n return;\n }\n\n // Stale guard: kliens-oldali ellenőrzés szerver hívás előtt\n if (!this.isItemInCurrentSnapshot(params.queueItemId)) {\n DyFM_Log.info(\n `ExS_Queue_DS | reorderItem — stale item, reloading`\n + ` | queueItemId: ${params.queueItemId}`,\n );\n await this.loadQueue();\n return;\n }\n\n try {\n const result: Record<string, unknown> =\n await this.sessionQueue_AS.reorderItem({\n baseRoute: this.activeBaseRoute,\n sessionId: this.activeSessionId,\n queueItemId: params.queueItemId,\n direction: params.direction,\n });\n\n // success: false → item közben eltűnt (auto-delivery vagy másik kliens).\n // Csendben reload — ugyanaz a race condition mint removeItem/sendNow.\n if (result.success === false) {\n DyFM_Log.info(\n `ExS_Queue_DS | reorderItem — server: item not found, reloading`\n + ` | queueItemId: ${params.queueItemId}`,\n );\n await this.loadQueue();\n }\n } catch {\n // HTTP hibát az interceptor kezeli — queue reload, hogy a kliens szinkronban legyen\n await this.loadQueue();\n }\n }\n\n // ── Private ───────────────────────────────────────────────────────────\n\n /**\n * Ellenőrzi, hogy a megadott queueItemId létezik-e az aktuális kliens-oldali snapshot-ban.\n * Stale guard: ha a szerver (auto-delivery / másik kliens) már eltávolította az elemet,\n * a socket push frissítette az items_$ signal-t, de a DOM még nem renderelődött újra —\n * ilyenkor a template-ből emittált queueItemId már stale. A signal SSOT, nem a DOM.\n */\n private isItemInCurrentSnapshot(queueItemId: string): boolean {\n return this.items_$().some(\n (i: SQ_SnapshotItem_Interface): boolean =>\n i.queueItemId === queueItemId,\n );\n }\n\n /**\n * Queue betöltése REST-ről (subscribe és reconnect esetén).\n * A sessionId-t és baseRoute-ot a hívás pillanatában rögzítjük:\n * ha a HTTP válasz ideje alatt session váltás történt, az eredményt eldobjuk (stale guard).\n */\n private async loadQueue(): Promise<void> {\n const capturedSessionId: string = this.activeSessionId;\n const capturedBaseRoute: string = this.activeBaseRoute;\n\n if (!capturedSessionId || !capturedBaseRoute) {\n return;\n }\n\n try {\n const result = await this.sessionQueue_AS.getQueue({\n baseRoute: capturedBaseRoute,\n sessionId: capturedSessionId,\n });\n\n // Stale guard: ha a session időközben megváltozott, az eredményt eldobjuk\n if (this.activeSessionId !== capturedSessionId) {\n DyFM_Log.info(\n `ExS_Queue_DS | loadQueue result discarded (session changed)`\n + ` | requested: ${capturedSessionId}`\n + ` | current: ${this.activeSessionId}`,\n );\n return;\n }\n\n const itemCount: number = result?.queue?.items?.length ?? 0;\n DyFM_Log.info(\n `ExS_Queue_DS | loadQueue OK | session: ${capturedSessionId}`\n + ` | items: ${itemCount}`,\n );\n\n this.applySnapshot(result.queue);\n } catch (error: unknown) {\n // Stale guard: session váltás történt — ne írjuk felül az új session adatait\n if (this.activeSessionId !== capturedSessionId) {\n return;\n }\n\n DyFM_Log.warn(\n `ExS_Queue_DS | loadQueue FAILED | session: ${capturedSessionId}`\n + ` | baseRoute: ${capturedBaseRoute}`\n + ` | error: ${error instanceof Error ? error.message : String(error)}`,\n );\n this.queueSnapshot_$.set(null);\n this.items_$.set([]);\n }\n }\n\n /**\n * Snapshot alkalmazása a signal-ekre.\n */\n private applySnapshot(snapshot: SQ_Snapshot_Response): void {\n this.queueSnapshot_$.set(snapshot);\n this.items_$.set(snapshot.items ?? []);\n this.isLocked_$.set(snapshot.isLocked);\n }\n\n /**\n * Szerkesztés befejezése: unlock + UI state reset.\n * Ha az unlock meghiúsul, a queue locked marad a szerveren (auto-delivery blokkolva) —\n * explicit hibaüzenet szükséges, hogy a user tudja és újra tudja próbálni.\n */\n private async finishEditing(): Promise<void> {\n this.editingItemId_$.set(null);\n this.editingText_$.set('');\n this.isLocked_$.set(false);\n\n if (!this.activeSessionId || !this.activeBaseRoute) {\n return;\n }\n\n try {\n await this.sessionQueue_AS.unlockQueue({\n baseRoute: this.activeBaseRoute,\n sessionId: this.activeSessionId,\n });\n } catch (error: unknown) {\n // Unlock hiba → a queue locked marad a szerveren, auto-delivery blokkolva.\n // Explicit hibaüzenet — a user-nek tudnia kell, hogy a lock aktív maradt.\n this.globalError_CS.showError(error, 'session-queue-unlock');\n }\n }\n\n /**\n * Socket event kezelés — queue snapshot és lock változás.\n */\n private handleSocketEvent(envelope: {\n event: string;\n payload: Record<string, unknown>;\n }): void {\n const payload: Record<string, unknown> = envelope.payload;\n const payloadSessionId: string =\n typeof payload.sessionId === 'string' ? payload.sessionId : '';\n\n // Csak az aktív session-höz tartozó event-eket kezeljük\n if (payloadSessionId !== this.activeSessionId) {\n return;\n }\n\n if (envelope.event === SOCKET_EVENT_SESSION_QUEUE_UPDATED) {\n this.applySnapshot(payload as unknown as SQ_Snapshot_Response);\n }\n\n if (envelope.event === SOCKET_EVENT_SESSION_QUEUE_LOCK_CHANGED) {\n const isLocked: boolean =\n typeof payload.isLocked === 'boolean' ? payload.isLocked : false;\n this.isLocked_$.set(isLocked);\n }\n }\n}\n", "import { Shr_LocalStoragePersistence_Util } from './storage/shr-local-storage-persistence.util';\n\n/**\n * REQ-SES-INPUT-DRAFT-001 follow-up (cycle 217) — egységesített prompt-piszkozat\n * localStorage util session-típustól függetlenül.\n *\n * A `Ses_InputStorage_Util` (CCAP session, prefix `ccap-ccapSession`) és a\n * `CC_InputStorage_Util` (CC session, prefix `ccap-ccSession`) eddig külön-külön\n * implementálta a `savePromptDraft / loadPromptDraft / clearPromptDraft`\n * hármast lényegében ugyanazzal a logikával, csak más prefixszel. Ez a shared\n * util egy közös magot ad — a hívók a prefixet paraméterként adják át, így a\n * localStorage kulcs-formátum (`{prefix}:promptDraft:{sessionId}`) változatlan\n * (backward-compatibility), de a duplikáció megszűnt.\n *\n * Send-flow használat (cycle 189 minta — REQ-CC-INPUT-CLEAR-001):\n * 1. user típus → `saveDraft(prefix, sessionId, content)` minden ngModelChange-en\n * 2. ngOnChanges sessionId váltás → `loadDraft(prefix, sessionId)` → input feltöltés\n * 3. send-START → `clearDraft(prefix, sessionId)` (await ELŐTT, hogy navigálás közben se legyen stuck)\n * 4. await sikeres → in-memory clear (a localStorage már üres)\n * 5. catch → `saveDraft(prefix, sessionId, content)` restore (retry-nál ne vesszen el)\n *\n * REQ-UI-MENU-STATE-001 (cycle 457): a `saveDraft / loadDraft / clearDraft` most\n * a generikus `Shr_LocalStoragePersistence_Util.writeString / readString / remove`\n * metódusokra delegál. A guard-ok (`!prefix || !sessionId` → no-op / üres-string\n * fallback) változatlanok; a try/catch best-effort viselkedés (private mode /\n * quota-exceeded → csendes return) a generikus util-ban van. Két foundation\n * util közül ez a domain-specifikus (prompt-draft) most a generikus\n * (string/boolean/JSON) tetejére költözött.\n */\nexport class SHR_PromptDraftStorage_Util {\n\n /** Per-session prompt piszkozat mentése a megadott prefix-szel. */\n static saveDraft(prefix: string, sessionId: string, content: string): void {\n if (!prefix || !sessionId) {\n return;\n }\n Shr_LocalStoragePersistence_Util.writeString(`${prefix}:promptDraft:${sessionId}`, content);\n }\n\n /** Per-session prompt piszkozat betöltése; üres string ha nincs vagy hiba. */\n static loadDraft(prefix: string, sessionId: string): string {\n if (!prefix || !sessionId) {\n return '';\n }\n return Shr_LocalStoragePersistence_Util.readString(`${prefix}:promptDraft:${sessionId}`) ?? '';\n }\n\n /** Per-session prompt piszkozat törlése (sikeres küldés után). */\n static clearDraft(prefix: string, sessionId: string): void {\n if (!prefix || !sessionId) {\n return;\n }\n Shr_LocalStoragePersistence_Util.remove(`${prefix}:promptDraft:${sessionId}`);\n }\n\n /**\n * REQ-UI-SES-LIST-DRAFT-INDICATOR-001 (cycle 902): igaz, ha létezik nem-üres\n * piszkozat a prefix+sessionId kulcson — whitespace-only NEM számít draft-nak.\n * A session-list-row template ezzel rendereli a draft-indikátor ikont.\n */\n static hasDraft(prefix: string, sessionId: string): boolean {\n if (!prefix || !sessionId) {\n return false;\n }\n return SHR_PromptDraftStorage_Util.loadDraft(prefix, sessionId).trim().length > 0;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275textInterpolate", "job_r1", "description", "\u0275\u0275textInterpolate1", "timezone", "\u0275\u0275property", "\u0275\u0275pipeBind1", "nextDueAt", "lastTriggeredAt", "ctx_r2", "getStatusColorClass", "exec_r2", "status", "scheduledAt", "skipReason", "errorDetails", "message", "getStatusLabel", "\u0275\u0275repeaterCreate", "SCH_SchedulePopup_Component_Conditional_3_For_2_Conditional_15_For_2_Template", "_forTrack0", "\u0275\u0275repeater", "getRecentExecutionsForJob", "_id", "\u0275\u0275template", "SCH_SchedulePopup_Component_Conditional_3_For_2_Conditional_7_Template", "SCH_SchedulePopup_Component_Conditional_3_For_2_Conditional_8_Template", "SCH_SchedulePopup_Component_Conditional_3_For_2_Conditional_9_Template", "SCH_SchedulePopup_Component_Conditional_3_For_2_Conditional_10_Template", "SCH_SchedulePopup_Component_Conditional_3_For_2_Conditional_12_Template", "SCH_SchedulePopup_Component_Conditional_3_For_2_Conditional_13_Template", "SCH_SchedulePopup_Component_Conditional_3_For_2_Conditional_14_Template", "SCH_SchedulePopup_Component_Conditional_3_For_2_Conditional_15_Template", "SCH_SchedulePopup_Component_Conditional_3_For_2_Conditional_16_Template", "name", "schedule", "\u0275\u0275conditional", "paused", "enabled", "dryRun", "length", "SCH_SchedulePopup_Component_Conditional_3_For_2_Template", "jobsForSession_$", "SCH_SchedulePopup_Component", "sessionId", "input", "required", "isOpen", "closed", "output", "jobs_DS", "inject", "SCH_ScheduledJobs_DataService", "computed", "sid", "jobs_$", "filter", "job", "target", "payload", "executionsByJob_$", "recentExecutions_$", "ngOnInit", "loadAll", "jobId", "get", "slice", "handleClose", "emit", "selectors", "inputs", "outputs", "standalone", "features", "\u0275\u0275StandaloneFeature", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275listener", "SCH_SchedulePopup_Component_Conditional_1_Template", "SCH_SchedulePopup_Component_Conditional_2_Template", "SCH_SchedulePopup_Component_Conditional_3_Template", "CommonModule", "NgClass", "S_Modal_Component", "S_AbsoluteTime_Pipe", "S_TimeAgo_Pipe", "SCH_SchedulePresetLabel_Pipe", "encapsulation", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275advance", "\u0275\u0275textInterpolate1", "crd_r1", "providerName", "model", "projectId", "\u0275\u0275property", "pauseReason", "lastResponseSummary", "b_r2", "\u0275\u0275repeaterCreate", "CRD_InfoPopup_Component_Conditional_3_For_2_Conditional_26_For_2_Template", "\u0275\u0275repeaterTrackByIdentity", "\u0275\u0275repeater", "blockers", "\u0275\u0275template", "CRD_InfoPopup_Component_Conditional_3_For_2_Conditional_7_Template", "CRD_InfoPopup_Component_Conditional_3_For_2_Conditional_8_Template", "CRD_InfoPopup_Component_Conditional_3_For_2_Conditional_9_Template", "CRD_InfoPopup_Component_Conditional_3_For_2_Conditional_24_Template", "CRD_InfoPopup_Component_Conditional_3_For_2_Conditional_25_Template", "CRD_InfoPopup_Component_Conditional_3_For_2_Conditional_26_Template", "workflowId", "_id", "ctx_r2", "getStatusColorClass", "status", "\u0275\u0275conditional", "currentPhaseIndex", "currentPhaseStepCount", "totalStepCount", "length", "CRD_InfoPopup_Component_Conditional_3_For_2_Template", "_forTrack0", "coordinatorsForSession_$", "CRD_InfoPopup_Component", "sessionId", "input", "required", "isOpen", "closed", "output", "coordinator_DS", "inject", "Coordinator_DataService", "computed", "sid", "globalCoordinatorsList_$", "filter", "c", "ngOnInit", "loadAllCoordinatorsForManagementPage", "trim", "toLowerCase", "handleClose", "emit", "selectors", "inputs", "outputs", "standalone", "features", "\u0275\u0275StandaloneFeature", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275listener", "CRD_InfoPopup_Component_Conditional_1_Template", "CRD_InfoPopup_Component_Conditional_2_Template", "CRD_InfoPopup_Component_Conditional_3_Template", "CommonModule", "NgClass", "S_Modal_Component", "encapsulation", "ExS_Queue_ApiService", "apiBase", "environment", "api", "baseUrl", "http", "inject", "HttpClient", "getQueue", "params", "url", "buildUrl", "baseRoute", "sessionId", "Date", "now", "firstValueFrom", "get", "editItem", "queueItemId", "patch", "text", "removeItem", "delete", "sendNow", "post", "reorderItem", "direction", "lockQueue", "unlockQueue", "factory", "\u0275fac", "providedIn", "import_fsm_dynamo", "SOCKET_EVENT_SESSION_QUEUE_UPDATED", "SOCKET_EVENT_SESSION_QUEUE_LOCK_CHANGED", "ExS_Queue_DataService", "sessionQueue_AS", "inject", "ExS_Queue_ApiService", "socket_CS", "CCAP_Socket_ControlService", "globalError_CS", "CCAP_GlobalError_ControlService", "eventSubscription", "reconnectSubscription", "activeSessionId", "activeBaseRoute", "queueSnapshot_$", "signal", "isLocked_$", "editingItemId_$", "editingText_$", "items_$", "constructor", "event$", "subscribe", "envelope", "handleSocketEvent", "connected$", "isConnected", "DyFM_Log", "info", "loadQueue", "ngOnDestroy", "unsubscribe", "subscribeToSession", "params", "sessionId", "baseRoute", "set", "startEditing", "queueItemId", "__async", "isItemInCurrentSnapshot", "lockQueue", "item", "find", "i", "text", "saveEdit", "itemId", "editItem", "showError", "Error", "finishEditing", "error", "cancelEdit", "removeItem", "success", "sendNow", "result", "reason", "reorderItem", "direction", "some", "capturedSessionId", "capturedBaseRoute", "getQueue", "itemCount", "queue", "items", "length", "applySnapshot", "warn", "message", "String", "snapshot", "isLocked", "unlockQueue", "payload", "event", "factory", "\u0275fac", "providedIn", "SHR_PromptDraftStorage_Util", "saveDraft", "prefix", "sessionId", "content", "Shr_LocalStoragePersistence_Util", "writeString", "loadDraft", "readString", "clearDraft", "remove", "hasDraft", "trim", "length"]
7
7
  }