@futdevpro/ccap 1.1.3034 → 1.1.3043

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 (181) hide show
  1. package/client-dist/{agent-instances.module-DNEQ4QES.js → agent-instances.module-OL4LTEIT.js} +2 -2
  2. package/client-dist/{ca.module-RGPRFFQR.js → ca.module-IFBJYC7S.js} +2 -2
  3. package/client-dist/ca.module-IFBJYC7S.js.map +7 -0
  4. package/client-dist/{cc-usage-dashboard.component-PEZVSG7M.js → cc-usage-dashboard.component-RBDNMXFE.js} +2 -2
  5. package/client-dist/{cc.module-JUQY7GCV.js → cc.module-ZLMQ5DBO.js} +2 -2
  6. package/client-dist/cc.module-ZLMQ5DBO.js.map +7 -0
  7. package/client-dist/{chunk-7SDU766A.js → chunk-24SOOARE.js} +2 -2
  8. package/client-dist/{chunk-ZLKNTGRH.js → chunk-25JW4JGG.js} +2 -2
  9. package/client-dist/{chunk-Z2SVASLX.js → chunk-25UKBCOM.js} +2 -2
  10. package/client-dist/{chunk-7R5IXHU5.js → chunk-26UIFK6M.js} +2 -2
  11. package/client-dist/{chunk-TBPY4N7X.js → chunk-2DVO4HAF.js} +2 -2
  12. package/client-dist/{chunk-HQMSP7F6.js → chunk-2FUSUSSB.js} +2 -2
  13. package/client-dist/{chunk-PS73GRXP.js → chunk-2MFHBY3V.js} +2 -2
  14. package/client-dist/{chunk-F4HSG3GQ.js → chunk-356TQDJO.js} +2 -2
  15. package/client-dist/{chunk-TS2SSYDS.js → chunk-3C2CZPWU.js} +2 -2
  16. package/client-dist/{chunk-OXGMGAWK.js → chunk-3NJKCTTL.js} +2 -2
  17. package/client-dist/{chunk-OXGMGAWK.js.map → chunk-3NJKCTTL.js.map} +2 -2
  18. package/client-dist/{chunk-JIYKLYYE.js → chunk-5W3YXE7G.js} +2 -2
  19. package/client-dist/{chunk-CK5ZMGFL.js → chunk-62WFHZ4Y.js} +2 -2
  20. package/client-dist/{chunk-4F6OM6PQ.js → chunk-6ARSWPN4.js} +2 -2
  21. package/client-dist/{chunk-DOJVWJJ3.js → chunk-6LDWJMAW.js} +2 -2
  22. package/client-dist/{chunk-B5D2O575.js → chunk-6VXRSBOR.js} +2 -2
  23. package/client-dist/{chunk-WKY6ZRDX.js → chunk-ADX4TG4M.js} +2 -2
  24. package/client-dist/{chunk-QE7LJZUK.js → chunk-BBH6NG3K.js} +2 -2
  25. package/client-dist/{chunk-AHBMUOS3.js → chunk-BY4DPV6D.js} +2 -2
  26. package/client-dist/{chunk-ZTPYZH3Z.js → chunk-C4W5DM4G.js} +2 -2
  27. package/client-dist/{chunk-AOKITOTZ.js → chunk-CACJTQBI.js} +2 -2
  28. package/client-dist/{chunk-5DVU3XRC.js → chunk-CTXUWKOZ.js} +2 -2
  29. package/client-dist/{chunk-5DVU3XRC.js.map → chunk-CTXUWKOZ.js.map} +1 -1
  30. package/client-dist/{chunk-MVAZ7JR5.js → chunk-DE5TGTRA.js} +2 -2
  31. package/client-dist/{chunk-JWZ24GIQ.js → chunk-DO2NQZKT.js} +2 -2
  32. package/client-dist/{chunk-AC6VDECU.js → chunk-FWIPUOVU.js} +2 -2
  33. package/client-dist/{chunk-ZGYR3BWU.js → chunk-GIHB46BZ.js} +2 -2
  34. package/client-dist/{chunk-B22GYBFL.js → chunk-GQPQL6QL.js} +2 -2
  35. package/client-dist/{chunk-6HT66YVK.js → chunk-HBH5PC5V.js} +2 -2
  36. package/client-dist/{chunk-C77QVQH5.js → chunk-HQKLWYZZ.js} +2 -2
  37. package/client-dist/{chunk-CF6YGIKE.js → chunk-IKEIBCI7.js} +2 -2
  38. package/client-dist/{chunk-SY5M3A3Q.js → chunk-JOZ6VH77.js} +2 -2
  39. package/client-dist/{chunk-P6FPD5OQ.js → chunk-KVB362ZC.js} +2 -2
  40. package/client-dist/{chunk-BY7QOLIO.js → chunk-LNSR4P2R.js} +2 -2
  41. package/client-dist/{chunk-AZLDEUIZ.js → chunk-LZV3KBBF.js} +2 -2
  42. package/client-dist/{chunk-P7KPEPO7.js → chunk-MFKR3ELU.js} +2 -2
  43. package/client-dist/{chunk-CDFLZ523.js → chunk-N4VOCPNE.js} +2 -2
  44. package/client-dist/{chunk-H62NDY3W.js → chunk-NBKDMCHQ.js} +2 -2
  45. package/client-dist/{chunk-OMXNVPGE.js → chunk-NZ6EOCL5.js} +2 -2
  46. package/client-dist/{chunk-IIZH7NVD.js → chunk-O37NDGUH.js} +2 -2
  47. package/client-dist/{chunk-YS7A2NP6.js → chunk-O6ZCRGYS.js} +2 -2
  48. package/client-dist/{chunk-Y2AUIGUM.js → chunk-OS5FEBH3.js} +2 -2
  49. package/client-dist/{chunk-6H3YM2KP.js → chunk-PELGAWJ7.js} +2 -2
  50. package/client-dist/{chunk-RJGC4CE7.js → chunk-PRTX5A57.js} +2 -2
  51. package/client-dist/{chunk-YPZWNP5A.js → chunk-PUGIFYZ6.js} +2 -2
  52. package/client-dist/{chunk-IEVAOKOF.js → chunk-QHYFDG2X.js} +2 -2
  53. package/client-dist/{chunk-Q5DHVZ7D.js → chunk-QWSX4MBH.js} +2 -2
  54. package/client-dist/{chunk-E7UUENED.js → chunk-RLQ7SJBY.js} +2 -2
  55. package/client-dist/{chunk-3MSKVM2T.js → chunk-RPV55S5N.js} +2 -2
  56. package/client-dist/{chunk-XMFYG4OB.js → chunk-SAIVUQXH.js} +2 -2
  57. package/client-dist/{chunk-ED2JP2SX.js → chunk-SFKYMFE4.js} +2 -2
  58. package/client-dist/{chunk-H3UBW75V.js → chunk-SHHO5QC2.js} +2 -2
  59. package/client-dist/{chunk-KLIVF7NF.js → chunk-SXXPWH3I.js} +2 -2
  60. package/client-dist/{chunk-ZVQUYA4H.js → chunk-TH6CL7NS.js} +2 -2
  61. package/client-dist/{chunk-E4KDYJK2.js → chunk-VB4TWXMV.js} +2 -2
  62. package/client-dist/{chunk-FV6SC2QU.js → chunk-VTNDGQTJ.js} +2 -2
  63. package/client-dist/{chunk-343QTRWG.js → chunk-X3LN6PGV.js} +2 -2
  64. package/client-dist/{chunk-TRPIAKRB.js → chunk-ZES4NWQQ.js} +2 -2
  65. package/client-dist/{consultant.module-VDHVKNXB.js → consultant.module-TXQF6FU3.js} +2 -2
  66. package/client-dist/{consultant.module-VDHVKNXB.js.map → consultant.module-TXQF6FU3.js.map} +2 -2
  67. package/client-dist/{crd.module-746ZW6FL.js → crd.module-EHFE2VVM.js} +2 -2
  68. package/client-dist/{dashboard.module-U2NE6P3E.js → dashboard.module-E46CA3QM.js} +2 -2
  69. package/client-dist/{do.module-5V6Y3CDL.js → do.module-X3W7O7YP.js} +2 -2
  70. package/client-dist/{document-library.module-HXQGKT63.js → document-library.module-4YDX2EZJ.js} +2 -2
  71. package/client-dist/{embedding-eval.module-OENZYGQE.js → embedding-eval.module-YEED3EC2.js} +2 -2
  72. package/client-dist/{embedding-registry.module-RTS4TH4Q.js → embedding-registry.module-DLPAPVGF.js} +2 -2
  73. package/client-dist/{err.module-E4JTGICP.js → err.module-YF63AK7U.js} +2 -2
  74. package/client-dist/{feedback.module-YFIHVIAZ.js → feedback.module-VWP3BSGC.js} +2 -2
  75. package/client-dist/{host-runtime-mcp.module-N73MDNBO.js → host-runtime-mcp.module-G2YPMIRS.js} +2 -2
  76. package/client-dist/index.html +1 -1
  77. package/client-dist/{live-dev-pipeline.module-IA4J3U76.js → live-dev-pipeline.module-TOE3LFCX.js} +2 -2
  78. package/client-dist/{logs.module-VRVZQ76G.js → logs.module-F23IF7JZ.js} +2 -2
  79. package/client-dist/{main-AYZ66GKH.js → main-HIJV65YH.js} +3 -3
  80. package/client-dist/{main-AYZ66GKH.js.map → main-HIJV65YH.js.map} +2 -2
  81. package/client-dist/{master-control-remote-poc.module-ENMKL3BL.js → master-control-remote-poc.module-YJ7P4SWS.js} +2 -2
  82. package/client-dist/{mobile-app.module-25TPEFGS.js → mobile-app.module-HRKWBCQK.js} +2 -2
  83. package/client-dist/{model-registry.module-DTJEN56N.js → model-registry.module-MCTK5CGW.js} +2 -2
  84. package/client-dist/{oc.module-2ZFRFAWW.js → oc.module-X2ANEZZF.js} +2 -2
  85. package/client-dist/oc.module-X2ANEZZF.js.map +7 -0
  86. package/client-dist/{orc.module-JLA5C7MW.js → orc.module-X6WEWWRO.js} +2 -2
  87. package/client-dist/{project-management.module-NBKCZQ6Y.js → project-management.module-SFQU6F6U.js} +2 -2
  88. package/client-dist/project-source-routed.module-6XXRSFMP.js +2 -0
  89. package/client-dist/{scheduler.module-HFDAX5PZ.js → scheduler.module-DYEGXP26.js} +2 -2
  90. package/client-dist/{session.module-S5W7MI7Z.js → session.module-FCTG6KGU.js} +2 -2
  91. package/client-dist/session.module-FCTG6KGU.js.map +7 -0
  92. package/client-dist/{set.module-5NOTNWQ3.js → set.module-E2DLZVPP.js} +2 -2
  93. package/client-dist/{setup.module-NBPWQBBC.js → setup.module-5D35PTCI.js} +2 -2
  94. package/client-dist/{terminals.module-2MRATCCN.js → terminals.module-GBQAQCGJ.js} +2 -2
  95. package/client-dist/{voice-notes-poc.module-QRB77K3S.js → voice-notes-poc.module-73RWM2JN.js} +2 -2
  96. package/client-dist/{wfs.module-ZWBQCUOA.js → wfs.module-XOM3QRGR.js} +2 -2
  97. package/package.json +1 -1
  98. package/client-dist/ca.module-RGPRFFQR.js.map +0 -7
  99. package/client-dist/cc.module-JUQY7GCV.js.map +0 -7
  100. package/client-dist/oc.module-2ZFRFAWW.js.map +0 -7
  101. package/client-dist/project-source-routed.module-MDS232LH.js +0 -2
  102. package/client-dist/session.module-S5W7MI7Z.js.map +0 -7
  103. /package/client-dist/{agent-instances.module-DNEQ4QES.js.map → agent-instances.module-OL4LTEIT.js.map} +0 -0
  104. /package/client-dist/{cc-usage-dashboard.component-PEZVSG7M.js.map → cc-usage-dashboard.component-RBDNMXFE.js.map} +0 -0
  105. /package/client-dist/{chunk-7SDU766A.js.map → chunk-24SOOARE.js.map} +0 -0
  106. /package/client-dist/{chunk-ZLKNTGRH.js.map → chunk-25JW4JGG.js.map} +0 -0
  107. /package/client-dist/{chunk-Z2SVASLX.js.map → chunk-25UKBCOM.js.map} +0 -0
  108. /package/client-dist/{chunk-7R5IXHU5.js.map → chunk-26UIFK6M.js.map} +0 -0
  109. /package/client-dist/{chunk-TBPY4N7X.js.map → chunk-2DVO4HAF.js.map} +0 -0
  110. /package/client-dist/{chunk-HQMSP7F6.js.map → chunk-2FUSUSSB.js.map} +0 -0
  111. /package/client-dist/{chunk-PS73GRXP.js.map → chunk-2MFHBY3V.js.map} +0 -0
  112. /package/client-dist/{chunk-F4HSG3GQ.js.map → chunk-356TQDJO.js.map} +0 -0
  113. /package/client-dist/{chunk-TS2SSYDS.js.map → chunk-3C2CZPWU.js.map} +0 -0
  114. /package/client-dist/{chunk-JIYKLYYE.js.map → chunk-5W3YXE7G.js.map} +0 -0
  115. /package/client-dist/{chunk-CK5ZMGFL.js.map → chunk-62WFHZ4Y.js.map} +0 -0
  116. /package/client-dist/{chunk-4F6OM6PQ.js.map → chunk-6ARSWPN4.js.map} +0 -0
  117. /package/client-dist/{chunk-DOJVWJJ3.js.map → chunk-6LDWJMAW.js.map} +0 -0
  118. /package/client-dist/{chunk-B5D2O575.js.map → chunk-6VXRSBOR.js.map} +0 -0
  119. /package/client-dist/{chunk-WKY6ZRDX.js.map → chunk-ADX4TG4M.js.map} +0 -0
  120. /package/client-dist/{chunk-QE7LJZUK.js.map → chunk-BBH6NG3K.js.map} +0 -0
  121. /package/client-dist/{chunk-AHBMUOS3.js.map → chunk-BY4DPV6D.js.map} +0 -0
  122. /package/client-dist/{chunk-ZTPYZH3Z.js.map → chunk-C4W5DM4G.js.map} +0 -0
  123. /package/client-dist/{chunk-AOKITOTZ.js.map → chunk-CACJTQBI.js.map} +0 -0
  124. /package/client-dist/{chunk-MVAZ7JR5.js.map → chunk-DE5TGTRA.js.map} +0 -0
  125. /package/client-dist/{chunk-JWZ24GIQ.js.map → chunk-DO2NQZKT.js.map} +0 -0
  126. /package/client-dist/{chunk-AC6VDECU.js.map → chunk-FWIPUOVU.js.map} +0 -0
  127. /package/client-dist/{chunk-ZGYR3BWU.js.map → chunk-GIHB46BZ.js.map} +0 -0
  128. /package/client-dist/{chunk-B22GYBFL.js.map → chunk-GQPQL6QL.js.map} +0 -0
  129. /package/client-dist/{chunk-6HT66YVK.js.map → chunk-HBH5PC5V.js.map} +0 -0
  130. /package/client-dist/{chunk-C77QVQH5.js.map → chunk-HQKLWYZZ.js.map} +0 -0
  131. /package/client-dist/{chunk-CF6YGIKE.js.map → chunk-IKEIBCI7.js.map} +0 -0
  132. /package/client-dist/{chunk-SY5M3A3Q.js.map → chunk-JOZ6VH77.js.map} +0 -0
  133. /package/client-dist/{chunk-P6FPD5OQ.js.map → chunk-KVB362ZC.js.map} +0 -0
  134. /package/client-dist/{chunk-BY7QOLIO.js.map → chunk-LNSR4P2R.js.map} +0 -0
  135. /package/client-dist/{chunk-AZLDEUIZ.js.map → chunk-LZV3KBBF.js.map} +0 -0
  136. /package/client-dist/{chunk-P7KPEPO7.js.map → chunk-MFKR3ELU.js.map} +0 -0
  137. /package/client-dist/{chunk-CDFLZ523.js.map → chunk-N4VOCPNE.js.map} +0 -0
  138. /package/client-dist/{chunk-H62NDY3W.js.map → chunk-NBKDMCHQ.js.map} +0 -0
  139. /package/client-dist/{chunk-OMXNVPGE.js.map → chunk-NZ6EOCL5.js.map} +0 -0
  140. /package/client-dist/{chunk-IIZH7NVD.js.map → chunk-O37NDGUH.js.map} +0 -0
  141. /package/client-dist/{chunk-YS7A2NP6.js.map → chunk-O6ZCRGYS.js.map} +0 -0
  142. /package/client-dist/{chunk-Y2AUIGUM.js.map → chunk-OS5FEBH3.js.map} +0 -0
  143. /package/client-dist/{chunk-6H3YM2KP.js.map → chunk-PELGAWJ7.js.map} +0 -0
  144. /package/client-dist/{chunk-RJGC4CE7.js.map → chunk-PRTX5A57.js.map} +0 -0
  145. /package/client-dist/{chunk-YPZWNP5A.js.map → chunk-PUGIFYZ6.js.map} +0 -0
  146. /package/client-dist/{chunk-IEVAOKOF.js.map → chunk-QHYFDG2X.js.map} +0 -0
  147. /package/client-dist/{chunk-Q5DHVZ7D.js.map → chunk-QWSX4MBH.js.map} +0 -0
  148. /package/client-dist/{chunk-E7UUENED.js.map → chunk-RLQ7SJBY.js.map} +0 -0
  149. /package/client-dist/{chunk-3MSKVM2T.js.map → chunk-RPV55S5N.js.map} +0 -0
  150. /package/client-dist/{chunk-XMFYG4OB.js.map → chunk-SAIVUQXH.js.map} +0 -0
  151. /package/client-dist/{chunk-ED2JP2SX.js.map → chunk-SFKYMFE4.js.map} +0 -0
  152. /package/client-dist/{chunk-H3UBW75V.js.map → chunk-SHHO5QC2.js.map} +0 -0
  153. /package/client-dist/{chunk-KLIVF7NF.js.map → chunk-SXXPWH3I.js.map} +0 -0
  154. /package/client-dist/{chunk-ZVQUYA4H.js.map → chunk-TH6CL7NS.js.map} +0 -0
  155. /package/client-dist/{chunk-E4KDYJK2.js.map → chunk-VB4TWXMV.js.map} +0 -0
  156. /package/client-dist/{chunk-FV6SC2QU.js.map → chunk-VTNDGQTJ.js.map} +0 -0
  157. /package/client-dist/{chunk-343QTRWG.js.map → chunk-X3LN6PGV.js.map} +0 -0
  158. /package/client-dist/{chunk-TRPIAKRB.js.map → chunk-ZES4NWQQ.js.map} +0 -0
  159. /package/client-dist/{crd.module-746ZW6FL.js.map → crd.module-EHFE2VVM.js.map} +0 -0
  160. /package/client-dist/{dashboard.module-U2NE6P3E.js.map → dashboard.module-E46CA3QM.js.map} +0 -0
  161. /package/client-dist/{do.module-5V6Y3CDL.js.map → do.module-X3W7O7YP.js.map} +0 -0
  162. /package/client-dist/{document-library.module-HXQGKT63.js.map → document-library.module-4YDX2EZJ.js.map} +0 -0
  163. /package/client-dist/{embedding-eval.module-OENZYGQE.js.map → embedding-eval.module-YEED3EC2.js.map} +0 -0
  164. /package/client-dist/{embedding-registry.module-RTS4TH4Q.js.map → embedding-registry.module-DLPAPVGF.js.map} +0 -0
  165. /package/client-dist/{err.module-E4JTGICP.js.map → err.module-YF63AK7U.js.map} +0 -0
  166. /package/client-dist/{feedback.module-YFIHVIAZ.js.map → feedback.module-VWP3BSGC.js.map} +0 -0
  167. /package/client-dist/{host-runtime-mcp.module-N73MDNBO.js.map → host-runtime-mcp.module-G2YPMIRS.js.map} +0 -0
  168. /package/client-dist/{live-dev-pipeline.module-IA4J3U76.js.map → live-dev-pipeline.module-TOE3LFCX.js.map} +0 -0
  169. /package/client-dist/{logs.module-VRVZQ76G.js.map → logs.module-F23IF7JZ.js.map} +0 -0
  170. /package/client-dist/{master-control-remote-poc.module-ENMKL3BL.js.map → master-control-remote-poc.module-YJ7P4SWS.js.map} +0 -0
  171. /package/client-dist/{mobile-app.module-25TPEFGS.js.map → mobile-app.module-HRKWBCQK.js.map} +0 -0
  172. /package/client-dist/{model-registry.module-DTJEN56N.js.map → model-registry.module-MCTK5CGW.js.map} +0 -0
  173. /package/client-dist/{orc.module-JLA5C7MW.js.map → orc.module-X6WEWWRO.js.map} +0 -0
  174. /package/client-dist/{project-management.module-NBKCZQ6Y.js.map → project-management.module-SFQU6F6U.js.map} +0 -0
  175. /package/client-dist/{project-source-routed.module-MDS232LH.js.map → project-source-routed.module-6XXRSFMP.js.map} +0 -0
  176. /package/client-dist/{scheduler.module-HFDAX5PZ.js.map → scheduler.module-DYEGXP26.js.map} +0 -0
  177. /package/client-dist/{set.module-5NOTNWQ3.js.map → set.module-E2DLZVPP.js.map} +0 -0
  178. /package/client-dist/{setup.module-NBPWQBBC.js.map → setup.module-5D35PTCI.js.map} +0 -0
  179. /package/client-dist/{terminals.module-2MRATCCN.js.map → terminals.module-GBQAQCGJ.js.map} +0 -0
  180. /package/client-dist/{voice-notes-poc.module-QRB77K3S.js.map → voice-notes-poc.module-73RWM2JN.js.map} +0 -0
  181. /package/client-dist/{wfs.module-ZWBQCUOA.js.map → wfs.module-XOM3QRGR.js.map} +0 -0
@@ -1,3 +1,3 @@
1
- import"./chunk-EGRHWZRV.js";import{a as Ve}from"./chunk-Q2PKIGLB.js";import{a as we}from"./chunk-6H3YM2KP.js";import{a as Ie,b as X}from"./chunk-DOJVWJJ3.js";import"./chunk-OMXNVPGE.js";import{g as Re}from"./chunk-343QTRWG.js";import"./chunk-JWZ24GIQ.js";import"./chunk-7JUIBZEE.js";import{a as Pe,b as Ee,c as q}from"./chunk-C7XPBJTG.js";import{b as te,f as ke,g as Ae}from"./chunk-7R5IXHU5.js";import"./chunk-WPHEQXWB.js";import{b as Me}from"./chunk-OXGMGAWK.js";import"./chunk-BY7QOLIO.js";import"./chunk-IIZH7NVD.js";import"./chunk-YS7A2NP6.js";import"./chunk-Q2NVIOCY.js";import{a as De}from"./chunk-CDFLZ523.js";import{a as ee}from"./chunk-J32YRK3S.js";import"./chunk-QE7LJZUK.js";import"./chunk-YPZWNP5A.js";import"./chunk-F4HSG3GQ.js";import"./chunk-V3VQWJQL.js";import"./chunk-AC6VDECU.js";import"./chunk-RJGC4CE7.js";import"./chunk-ZBTWQZNB.js";import"./chunk-FLAJXIYW.js";import{b as ve,c as N,f as W,i as B,n as z,o as j,p as H,v as Se}from"./chunk-EO4DNTT4.js";import{k as Te}from"./chunk-P6FPD5OQ.js";import{a as V}from"./chunk-5UPNU54P.js";import{j as ye}from"./chunk-4F6OM6PQ.js";import{I as $e}from"./chunk-5DVU3XRC.js";import{Aa as he,Ba as me,C as x,D as I,E as se,Eb as xe,Fa as _,Fb as ge,Ga as k,Gb as U,J as m,K as u,Kb as be,L as le,M as de,Z as d,aa as l,ca as ce,da as M,ga as f,ha as _e,hb as b,ia as R,jb as ue,k as C,la as y,na as P,oa as S,p as v,pa as $,q as re,qa as r,ra as s,sa as w,ua as E,ub as fe,va as h,wa as c,xb as Ce,y as F,z as ae,za as pe}from"./chunk-TBMJSIBB.js";var Q="ccap-consultant",T=class{static savePanelOpen(a,e){V.writeBoolean(`${Q}:panelOpen:${a}`,e)}static loadPanelOpen(a,e){return V.readBoolean(`${Q}:panelOpen:${a}`,e)}static savePanelWidth(a,e){V.writeNumber(`${Q}:panelWidth:${a}`,e)}static loadPanelWidth(a,e){return V.readNumber(`${Q}:panelWidth:${a}`,e)}};var Oe=(()=>{class i{baseUrl=`${$e.api.baseUrl}/consultant`;http=x(Ce);listThreads(){return v(this.http.get(this.baseUrl))}getPickerOptions(){return v(this.http.get(`${this.baseUrl}/picker-options`))}createThread(e){return v(this.http.post(this.baseUrl,e))}getThread(e){return v(this.http.get(`${this.baseUrl}/${encodeURIComponent(e)}`))}patchThread(e){let t={};return e.label!=null&&(t.label=e.label),e.providerInstanceId!=null&&(t.providerInstanceId=e.providerInstanceId),e.model!=null&&(t.model=e.model),v(this.http.patch(`${this.baseUrl}/${encodeURIComponent(e.threadId)}`,t))}deleteThread(e){return v(this.http.delete(`${this.baseUrl}/${encodeURIComponent(e)}`))}postMessage(e){return v(this.http.post(`${this.baseUrl}/${encodeURIComponent(e.threadId)}/messages`,{text:e.text,allowWebSearch:e.allowWebSearch,attachments:e.attachments}))}static \u0275fac=function(t){return new(t||i)};static \u0275prov=F({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var G=(()=>{class i{consultant_AS=x(Oe);globalError_CS=x(ye);threads_$=l([]);threadsLoading_$=l(!1);threadsError_$=l(null);selectedThread_$=l(null);selectedThreadLoading_$=l(!1);selectedThreadError_$=l(null);sending_$=l(!1);activeThreadId_$=l("");defaults_$=l({providerInstanceId:"",model:""});pickerOptions_$=l([]);pickerOptionsLoading_$=l(!1);loadPickerOptions(){return C(this,null,function*(){this.pickerOptionsLoading_$.set(!0);try{let e=yield this.consultant_AS.getPickerOptions(),t=Array.isArray(e.entries)?e.entries.map(i.parseRegistryEntry).filter(n=>n!==null):[];this.pickerOptions_$.set(t),this.defaults_$.set({providerInstanceId:typeof e.defaults?.providerInstanceId=="string"?e.defaults.providerInstanceId:"",model:typeof e.defaults?.model=="string"?e.defaults.model:""})}catch(e){this.globalError_CS.showError(e,"Consultant_DataService.loadPickerOptions")}finally{this.pickerOptionsLoading_$.set(!1)}})}loadThreads(){return C(this,null,function*(){this.threadsLoading_$.set(!0),this.threadsError_$.set(null);try{let e=yield this.consultant_AS.listThreads(),n=(Array.isArray(e.threads)?e.threads:[]).map(o=>({threadId:typeof o.threadId=="string"?o.threadId:"",label:typeof o.label=="string"?o.label:"",providerInstanceId:typeof o.providerInstanceId=="string"?o.providerInstanceId:"",model:typeof o.model=="string"?o.model:"",messageCount:typeof o.messageCount=="number"?o.messageCount:0,updatedAt:typeof o.updatedAt=="string"?o.updatedAt:""}));this.threads_$.set(n)}catch(e){this.threadsError_$.set(e),this.globalError_CS.showError(e,"Consultant_DataService.loadThreads")}finally{this.threadsLoading_$.set(!1)}})}loadThreadDetail(e){return C(this,null,function*(){this.activeThreadId_$.set(e),this.selectedThreadLoading_$.set(!0),this.selectedThreadError_$.set(null);try{let t=yield this.consultant_AS.getThread(e),n=i.parseThreadDetail(t.thread);this.selectedThread_$.set(n)}catch(t){this.selectedThreadError_$.set(t),this.globalError_CS.showError(t,"Consultant_DataService.loadThreadDetail")}finally{this.selectedThreadLoading_$.set(!1)}})}sendMessage(e){return C(this,null,function*(){this.sending_$.set(!0);try{let n=(yield this.consultant_AS.postMessage(e)).thread;if(i.isPlainRecord(n)){let o=i.parseThreadDetail(n);this.selectedThread_$.set(o)}yield this.loadThreads()}catch(t){throw this.globalError_CS.showError(t,"Consultant_DataService.sendMessage"),t}finally{this.sending_$.set(!1)}})}updateThreadConfig(e){return C(this,null,function*(){try{let t=yield this.consultant_AS.patchThread(e),n=i.parseThreadDetail(t.thread);this.selectedThread_$.set(n),yield this.loadThreads()}catch(t){throw this.globalError_CS.showError(t,"Consultant_DataService.updateThreadConfig"),t}})}createThread(e){return C(this,null,function*(){try{let n=(yield this.consultant_AS.createThread(e)).thread.threadId,o=typeof n=="string"?n:"";return yield this.loadThreads(),o}catch(t){throw this.globalError_CS.showError(t,"Consultant_DataService.createThread"),t}})}deleteThread(e){return C(this,null,function*(){try{yield this.consultant_AS.deleteThread(e),this.activeThreadId_$()===e&&(this.selectedThread_$.set(null),this.activeThreadId_$.set("")),yield this.loadThreads()}catch(t){throw this.globalError_CS.showError(t,"Consultant_DataService.deleteThread"),t}})}static parseThreadDetail(e){let t=typeof e.threadId=="string"?e.threadId:"";if(!t.length)return null;let n=e.messages,o=[];if(Array.isArray(n))for(let p of n){if(!i.isPlainRecord(p))continue;let A=typeof p.id=="string"?p.id:"",Y=p.role;if(Y!=="user"&&Y!=="assistant")continue;let L={id:A,role:Y};typeof p.rawUserText=="string"&&(L.rawUserText=p.rawUserText),typeof p.content=="string"&&(L.content=p.content);let ie=p.userParts;if(Array.isArray(ie)){let oe=[];for(let D of ie){if(!i.isPlainRecord(D))continue;let J=D.type;if(J!=="text"&&J!=="image_url")continue;let Z={type:J};typeof D.text=="string"&&(Z.text=D.text),typeof D.imageUrl=="string"&&(Z.imageUrl=D.imageUrl),oe.push(Z)}L.userParts=oe}o.push(L)}return{threadId:t,label:typeof e.label=="string"?e.label:"",providerInstanceId:typeof e.providerInstanceId=="string"?e.providerInstanceId:"",model:typeof e.model=="string"?e.model:"",messages:o,updatedAt:typeof e.updatedAt=="string"?e.updatedAt:""}}static isPlainRecord(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}static parseRegistryEntry(e){if(!i.isPlainRecord(e))return null;let t=typeof e.provider=="string"?e.provider:"",n=typeof e.modelName=="string"?e.modelName:"";if(!t.length||!n.length)return null;let o=e.capabilities,p=Array.isArray(o)?o.filter(A=>typeof A=="string"):void 0;return{id:typeof e.id=="string"?e.id:"",provider:t,modelName:n,enabled:e.enabled===!0,capabilities:p}}static \u0275fac=function(t){return new(t||i)};static \u0275prov=F({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var g=class{static collectSortedProviders(a){let e=new Set;for(let t of a){let n=t.provider.trim();n.length>0&&e.add(n)}return[...e].sort()}static collectSortedModelsForProvider(a,e){let t=e.trim();if(!t.length)return[];let n=[];for(let o of a){let p=o.modelName.trim();o.provider===t&&p.length>0&&n.push(p)}return[...new Set(n)].sort()}};var ze=(i,a)=>a.id;function je(i,a){i&1&&(r(0,"div",5),_(1,"Loading..."),s())}function He(i,a){if(i&1){let e=E();r(0,"app-s-session-info-card",9),h("selected",function(n){m(e);let o=c(2);return u(o.handleSelectThread(n))})("contextMenu",function(n){m(e);let o=c(2);return u(o.handleRowContextMenu(n))}),s()}if(i&2){let e=a.$implicit,t=c(2);f("view",e)("isActive",t.consultant_DS.activeThreadId_$()===e.id)}}function Xe(i,a){if(i&1&&S(0,He,1,2,"app-s-session-info-card",8,ze),i&2){let e=c();$(e.threadRowViews_$())}}function qe(i,a){i&1&&(r(0,"div",6),_(1,"No threads"),s())}function Qe(i,a){if(i&1&&(r(0,"option",16),_(1),s()),i&2){let e=a.$implicit,t=c(2);f("value",e),d(),k(t.providerDisplayLabelsMap_$()[e]||e)}}function Ge(i,a){if(i&1&&(r(0,"option",16),_(1),s()),i&2){let e=a.$implicit;f("value",e),d(),k(e)}}function Ke(i,a){if(i&1){let e=E();r(0,"div",10),h("click",function(){m(e);let n=c();return u(n.handleCloseCreate())}),r(1,"div",11),h("click",function(n){return m(e),u(n.stopPropagation())}),r(2,"h3",12),_(3,"New consultant thread"),s(),r(4,"div",13)(5,"label",14),_(6,"Label (optional)"),s(),r(7,"input",15),h("ngModelChange",function(n){m(e);let o=c();return u(o.newLabel_$.set(n))}),s(),r(8,"label",14),_(9,"Provider"),s(),r(10,"select",15),h("ngModelChange",function(n){m(e);let o=c();return u(o.handleProviderChange(n))}),S(11,Qe,2,2,"option",16,P),s(),r(13,"label",14),_(14,"Model"),s(),r(15,"select",15),h("ngModelChange",function(n){m(e);let o=c();return u(o.newModel_$.set(n))}),S(16,Ge,2,2,"option",16,P),s()(),r(18,"div",17)(19,"button",18),h("click",function(){m(e);let n=c();return u(n.handleCloseCreate())}),_(20," Cancel "),s(),r(21,"button",19),h("click",function(){m(e);let n=c();return u(n.handleCreateThread())}),_(22," Create "),s()()()()}if(i&2){let e=c();d(7),f("ngModel",e.newLabel_$()),d(3),f("ngModel",e.newProvider_$()),d(),$(e.providerOptions_$()),d(4),f("ngModel",e.newModel_$()),d(),$(e.modelsForNewProvider_$()),d(5),f("disabled",e.isCreating_$()||!e.newProvider_$().trim()||!e.newModel_$().trim())}}function Ye(i,a){if(i&1){let e=E();r(0,"div",20),h("click",function(){m(e);let n=c();return u(n.handleCloseCtxMenu())}),s(),r(1,"div",21)(2,"button",22),h("click",function(){m(e);let n=c();return u(n.handleCtxDelete())}),_(3," Delete "),s()()}if(i&2){let e=c();d(),_e("left",e.ctxMenuPos_$().x,"px")("top",e.ctxMenuPos_$().y,"px")}}var Le=(()=>{class i{consultant_DS=x(G);router=x(U);modelRegistry_DS=x(De);isCreateOpen_$=l(!1);newLabel_$=l("");newProvider_$=l("");newModel_$=l("");isCreating_$=l(!1);providerOptions_$=b(()=>g.collectSortedProviders(this.consultant_DS.pickerOptions_$()));modelsForNewProvider_$=b(()=>g.collectSortedModelsForProvider(this.consultant_DS.pickerOptions_$(),this.newProvider_$()));providerDisplayLabelsMap_$=b(()=>{let e=this.modelRegistry_DS.setupConfigForRegistry_$(),t=this.providerOptions_$(),n={};for(let o of t)n[o]==null&&(n[o]=ee.getProviderDisplayLabel(o,e));return n});threadProviderDisplayLabels_$=b(()=>{let e=this.modelRegistry_DS.setupConfigForRegistry_$(),t=new Set;for(let o of this.consultant_DS.threads_$()){let p=o.providerInstanceId.trim();p.length>0&&t.add(p)}for(let o of this.providerOptions_$())t.add(o);let n={};for(let o of t)n[o]=ee.getProviderDisplayLabel(o,e);return n});threadRowViews_$=b(()=>this.consultant_DS.threads_$().map(e=>({id:e.threadId,label:e.label||e.threadId,status:"",statusColorClass:"bg-neutral-600",isArchived:!1,lastActivityAt:e.updatedAt,isRunning:!1})));ctxMenuThread_$=l(null);ctxMenuPos_$=l({x:0,y:0});ngOnInit(){this.consultant_DS.loadThreads(),this.consultant_DS.loadPickerOptions(),this.modelRegistry_DS.loadSetupConfigForRegistry()}handleSelectThread(e){this.router.navigate(["/consultant",e])}handleOpenCreate(){return C(this,null,function*(){yield this.consultant_DS.loadPickerOptions();let e=this.consultant_DS.defaults_$(),t=this.providerOptions_$();if(e.providerInstanceId.length>0&&t.includes(e.providerInstanceId)){let n=g.collectSortedModelsForProvider(this.consultant_DS.pickerOptions_$(),e.providerInstanceId);e.model.length>0&&n.includes(e.model)?(this.newProvider_$.set(e.providerInstanceId),this.newModel_$.set(e.model)):(this.newProvider_$.set(e.providerInstanceId),this.newModel_$.set(n[0]??""))}else{let n=t[0]??"";this.newProvider_$.set(n);let o=g.collectSortedModelsForProvider(this.consultant_DS.pickerOptions_$(),n);this.newModel_$.set(o[0]??"")}this.newLabel_$.set(""),this.isCreateOpen_$.set(!0)})}handleCloseCreate(){this.isCreateOpen_$.set(!1)}handleProviderChange(e){this.newProvider_$.set(e);let t=g.collectSortedModelsForProvider(this.consultant_DS.pickerOptions_$(),e);this.newModel_$.set(t[0]??"")}handleCreateThread(){return C(this,null,function*(){let e=this.newProvider_$().trim(),t=this.newModel_$().trim();if(!(!e.length||!t.length)){this.isCreating_$.set(!0);try{let n=this.newLabel_$().trim(),o=yield this.consultant_DS.createThread({label:n.length>0?n:void 0,providerInstanceId:e,model:t});this.isCreateOpen_$.set(!1),o.length>0&&this.router.navigate(["/consultant",o])}finally{this.isCreating_$.set(!1)}}})}handleRowContextMenu(e){let t=this.consultant_DS.threads_$().find(n=>n.threadId===e.id);t&&(this.ctxMenuThread_$.set(t),this.ctxMenuPos_$.set({x:e.event.clientX,y:e.event.clientY}))}handleCloseCtxMenu(){this.ctxMenuThread_$.set(null)}handleCtxDelete(){return C(this,null,function*(){let e=this.ctxMenuThread_$();if(e){this.handleCloseCtxMenu();try{yield this.consultant_DS.deleteThread(e.threadId),this.router.navigate(["/consultant"])}catch{}}})}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=I({type:i,selectors:[["app-ccap-consultant-dashboard"]],hostAttrs:[1,"flex","flex-col","flex-1","min-h-0","overflow-hidden"],decls:12,vars:3,consts:[[1,"flex","flex-col","flex-1","min-h-0"],[1,"shrink-0","p-2","border-b","border-neonDefault","flex","items-center","gap-2"],[1,"text-xs","font-semibold","text-neutral-300","flex-1","truncate"],["type","button",1,"px-2","py-1","text-xs","border","border-neonDefault","text-neutral-300","hover:bg-neutral-700","rounded","transition-colors",3,"click"],[1,"flex-1","overflow-y-auto"],[1,"p-3","text-xs","text-neutral-500"],[1,"p-4","text-center","text-neutral-500","text-xs"],[1,"fixed","inset-0","z-40","flex","items-center","justify-center","bg-black/60","p-4"],[3,"view","isActive"],[3,"selected","contextMenu","view","isActive"],[1,"fixed","inset-0","z-40","flex","items-center","justify-center","bg-black/60","p-4",3,"click"],[1,"w-full","max-w-md","rounded-lg","border","border-neonDefault","bg-neutral-900","p-4","shadow-xl",3,"click"],[1,"text-sm","font-semibold","text-neutral-200","mb-3"],[1,"flex","flex-col","gap-2","text-xs"],[1,"text-neutral-400"],[1,"w-full","px-2","py-1","rounded","bg-neutral-800","border","border-neutral-600","text-neutral-200",3,"ngModelChange","ngModel"],[3,"value"],[1,"flex","justify-end","gap-2","mt-4"],["type","button",1,"px-2","py-1","text-xs","border","border-neutral-600","text-neutral-400","rounded",3,"click"],["type","button",1,"px-2","py-1","text-xs","border","border-neonDefault","text-neutral-200","rounded","disabled:opacity-40",3,"click","disabled"],[1,"fixed","inset-0","z-40",3,"click"],[1,"fixed","z-50","min-w-[140px]","bg-neutral-900","border","border-neutral-700","rounded-lg","shadow-xl","py-1","text-xs"],[1,"w-full","text-left","px-3","py-1.5","text-red-400","hover:bg-red-500/10","transition-colors",3,"click"]],template:function(t,n){if(t&1&&(r(0,"div",0)(1,"div",1)(2,"span",2),_(3,"Consultant"),s(),r(4,"button",3),h("click",function(){return n.handleOpenCreate()}),_(5," + New "),s()(),r(6,"div",4),M(7,je,2,0,"div",5)(8,Xe,2,0)(9,qe,2,0,"div",6),s()(),M(10,Ke,23,4,"div",7)(11,Ye,4,4)),t&2){let o;d(7),y(n.consultant_DS.threadsLoading_$()?7:n.threadRowViews_$().length?8:9),d(3),y(n.isCreateOpen_$()?10:-1),d(),y((o=n.ctxMenuThread_$())?11:-1,o)}},dependencies:[j,H,N,z,W,B,Me],encapsulation:2})}return i})();var We=(()=>{class i{sidebarWidth_$=l(320);isSidebarOpen_$=l(!0);isResizing_$=l(!1);ngOnInit(){let e=T.loadPanelWidth("sidebar",320);this.sidebarWidth_$.set(Math.max(200,Math.min(600,e))),this.isSidebarOpen_$.set(T.loadPanelOpen("sidebar",!0))}handleSidebarResizeStart(e){let t=e.clientX,n=this.sidebarWidth_$();this.isResizing_$.set(!0),Ve.attachUntilPointerUp({startEvent:e,onMove:o=>{let p=o.clientX-t,A=Math.max(200,Math.min(600,n+p));this.sidebarWidth_$.set(A)},onEnd:()=>{this.isResizing_$.set(!1),T.savePanelWidth("sidebar",this.sidebarWidth_$())}})}handleToggleSidebar(){this.isSidebarOpen_$.update(e=>!e),T.savePanelOpen("sidebar",this.isSidebarOpen_$())}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=I({type:i,selectors:[["app-ccap-consultant-shell"]],hostAttrs:[1,"flex","min-h-0","w-full","flex-1","flex-col","overflow-hidden"],decls:14,vars:9,consts:[[1,"flex","min-h-0","w-full","flex-1","flex-col","overflow-hidden"],["sSessionToolbarLeft","",1,"flex","items-center","gap-1","min-w-0"],["type","button",1,"px-2","py-1","text-xs","border","border-neonDefault","text-neutral-300","hover:bg-neutral-700","rounded","transition-colors","flex","items-center","gap-1","shrink-0",3,"click"],["viewBox","0 0 24 24","fill","none","stroke","currentColor","stroke-width","2","stroke-linecap","round","stroke-linejoin","round",1,"w-3","h-3","shrink-0","transition-transform","duration-150"],["points","6 9 12 15 18 9"],["sSessionToolbarCenter","",1,"min-w-0"],["sSessionToolbarRight","",1,"min-w-0"],[3,"sidebarResizeStart","isSidebarOpen","sidebarWidthPx","isResizing"],["sSessionShellSidebar","",1,"flex","flex-col","overflow-hidden","h-full"],["sSessionShellMain","",1,"flex","min-h-0","flex-1","flex-col","overflow-hidden","[&>router-outlet]:contents"]],template:function(t,n){t&1&&(r(0,"div",0)(1,"app-s-session-shell-toolbar")(2,"div",1)(3,"button",2),h("click",function(){return n.handleToggleSidebar()}),le(),r(4,"svg",3),w(5,"polyline",4),s(),_(6," Consultant "),s()(),de(),w(7,"div",5)(8,"div",6),s(),r(9,"app-s-resizable-session-shell-layout",7),h("sidebarResizeStart",function(p){return n.handleSidebarResizeStart(p)}),r(10,"div",8),w(11,"app-ccap-consultant-dashboard"),s(),r(12,"div",9),w(13,"router-outlet"),s()()()),t&2&&(R("select-none",n.isResizing_$()),d(4),R("rotate-90",n.isSidebarOpen_$())("-rotate-90",!n.isSidebarOpen_$()),d(5),f("isSidebarOpen",n.isSidebarOpen_$())("sidebarWidthPx",n.sidebarWidth_$())("isResizing",n.isResizing_$()))},dependencies:[ge,Pe,Ee,Le],encapsulation:2})}return i})();var K=class i{static fromMessage(a){let e=a.role==="user",t=e?i.buildUserBodyText(a):a.content??"";return{listKey:a.id,kind:e?te.userPrompt:te.assistant,bodyText:t,isUserAligned:e,flags:{showCopy:!0,showRawInfo:!1,useEditDiffForExpandable:!1}}}static buildUserBodyText(a){let e=(a.rawUserText??"").trim();return(a.userParts?.length??0)>1?e.length>0?`${e}
1
+ import"./chunk-EGRHWZRV.js";import{a as Ve}from"./chunk-Q2PKIGLB.js";import{a as we}from"./chunk-PELGAWJ7.js";import{a as Ie,b as X}from"./chunk-6LDWJMAW.js";import"./chunk-NZ6EOCL5.js";import{g as Re}from"./chunk-X3LN6PGV.js";import"./chunk-DO2NQZKT.js";import"./chunk-7JUIBZEE.js";import{a as Pe,b as Ee,c as q}from"./chunk-C7XPBJTG.js";import{b as te,f as ke,g as Ae}from"./chunk-26UIFK6M.js";import"./chunk-WPHEQXWB.js";import{b as Me}from"./chunk-3NJKCTTL.js";import"./chunk-LNSR4P2R.js";import"./chunk-O37NDGUH.js";import"./chunk-O6ZCRGYS.js";import"./chunk-Q2NVIOCY.js";import{a as De}from"./chunk-N4VOCPNE.js";import{a as ee}from"./chunk-J32YRK3S.js";import"./chunk-BBH6NG3K.js";import"./chunk-PUGIFYZ6.js";import"./chunk-356TQDJO.js";import"./chunk-V3VQWJQL.js";import"./chunk-FWIPUOVU.js";import"./chunk-PRTX5A57.js";import"./chunk-ZBTWQZNB.js";import"./chunk-FLAJXIYW.js";import{b as ve,c as N,f as W,i as B,n as z,o as j,p as H,v as Se}from"./chunk-EO4DNTT4.js";import{k as Te}from"./chunk-KVB362ZC.js";import{a as V}from"./chunk-5UPNU54P.js";import{j as ye}from"./chunk-6ARSWPN4.js";import{I as $e}from"./chunk-CTXUWKOZ.js";import{Aa as he,Ba as me,C as x,D as I,E as se,Eb as xe,Fa as _,Fb as ge,Ga as k,Gb as U,J as m,K as u,Kb as be,L as le,M as de,Z as d,aa as l,ca as ce,da as M,ga as f,ha as _e,hb as b,ia as R,jb as ue,k as C,la as y,na as P,oa as S,p as v,pa as $,q as re,qa as r,ra as s,sa as w,ua as E,ub as fe,va as h,wa as c,xb as Ce,y as F,z as ae,za as pe}from"./chunk-TBMJSIBB.js";var Q="ccap-consultant",T=class{static savePanelOpen(a,e){V.writeBoolean(`${Q}:panelOpen:${a}`,e)}static loadPanelOpen(a,e){return V.readBoolean(`${Q}:panelOpen:${a}`,e)}static savePanelWidth(a,e){V.writeNumber(`${Q}:panelWidth:${a}`,e)}static loadPanelWidth(a,e){return V.readNumber(`${Q}:panelWidth:${a}`,e)}};var Oe=(()=>{class i{baseUrl=`${$e.api.baseUrl}/consultant`;http=x(Ce);listThreads(){return v(this.http.get(this.baseUrl))}getPickerOptions(){return v(this.http.get(`${this.baseUrl}/picker-options`))}createThread(e){return v(this.http.post(this.baseUrl,e))}getThread(e){return v(this.http.get(`${this.baseUrl}/${encodeURIComponent(e)}`))}patchThread(e){let t={};return e.label!=null&&(t.label=e.label),e.providerInstanceId!=null&&(t.providerInstanceId=e.providerInstanceId),e.model!=null&&(t.model=e.model),v(this.http.patch(`${this.baseUrl}/${encodeURIComponent(e.threadId)}`,t))}deleteThread(e){return v(this.http.delete(`${this.baseUrl}/${encodeURIComponent(e)}`))}postMessage(e){return v(this.http.post(`${this.baseUrl}/${encodeURIComponent(e.threadId)}/messages`,{text:e.text,allowWebSearch:e.allowWebSearch,attachments:e.attachments}))}static \u0275fac=function(t){return new(t||i)};static \u0275prov=F({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var G=(()=>{class i{consultant_AS=x(Oe);globalError_CS=x(ye);threads_$=l([]);threadsLoading_$=l(!1);threadsError_$=l(null);selectedThread_$=l(null);selectedThreadLoading_$=l(!1);selectedThreadError_$=l(null);sending_$=l(!1);activeThreadId_$=l("");defaults_$=l({providerInstanceId:"",model:""});pickerOptions_$=l([]);pickerOptionsLoading_$=l(!1);loadPickerOptions(){return C(this,null,function*(){this.pickerOptionsLoading_$.set(!0);try{let e=yield this.consultant_AS.getPickerOptions(),t=Array.isArray(e.entries)?e.entries.map(i.parseRegistryEntry).filter(n=>n!==null):[];this.pickerOptions_$.set(t),this.defaults_$.set({providerInstanceId:typeof e.defaults?.providerInstanceId=="string"?e.defaults.providerInstanceId:"",model:typeof e.defaults?.model=="string"?e.defaults.model:""})}catch(e){this.globalError_CS.showError(e,"Consultant_DataService.loadPickerOptions")}finally{this.pickerOptionsLoading_$.set(!1)}})}loadThreads(){return C(this,null,function*(){this.threadsLoading_$.set(!0),this.threadsError_$.set(null);try{let e=yield this.consultant_AS.listThreads(),n=(Array.isArray(e.threads)?e.threads:[]).map(o=>({threadId:typeof o.threadId=="string"?o.threadId:"",label:typeof o.label=="string"?o.label:"",providerInstanceId:typeof o.providerInstanceId=="string"?o.providerInstanceId:"",model:typeof o.model=="string"?o.model:"",messageCount:typeof o.messageCount=="number"?o.messageCount:0,updatedAt:typeof o.updatedAt=="string"?o.updatedAt:""}));this.threads_$.set(n)}catch(e){this.threadsError_$.set(e),this.globalError_CS.showError(e,"Consultant_DataService.loadThreads")}finally{this.threadsLoading_$.set(!1)}})}loadThreadDetail(e){return C(this,null,function*(){this.activeThreadId_$.set(e),this.selectedThreadLoading_$.set(!0),this.selectedThreadError_$.set(null);try{let t=yield this.consultant_AS.getThread(e),n=i.parseThreadDetail(t.thread);this.selectedThread_$.set(n)}catch(t){this.selectedThreadError_$.set(t),this.globalError_CS.showError(t,"Consultant_DataService.loadThreadDetail")}finally{this.selectedThreadLoading_$.set(!1)}})}sendMessage(e){return C(this,null,function*(){this.sending_$.set(!0);try{let n=(yield this.consultant_AS.postMessage(e)).thread;if(i.isPlainRecord(n)){let o=i.parseThreadDetail(n);this.selectedThread_$.set(o)}yield this.loadThreads()}catch(t){throw this.globalError_CS.showError(t,"Consultant_DataService.sendMessage"),t}finally{this.sending_$.set(!1)}})}updateThreadConfig(e){return C(this,null,function*(){try{let t=yield this.consultant_AS.patchThread(e),n=i.parseThreadDetail(t.thread);this.selectedThread_$.set(n),yield this.loadThreads()}catch(t){throw this.globalError_CS.showError(t,"Consultant_DataService.updateThreadConfig"),t}})}createThread(e){return C(this,null,function*(){try{let n=(yield this.consultant_AS.createThread(e)).thread.threadId,o=typeof n=="string"?n:"";return yield this.loadThreads(),o}catch(t){throw this.globalError_CS.showError(t,"Consultant_DataService.createThread"),t}})}deleteThread(e){return C(this,null,function*(){try{yield this.consultant_AS.deleteThread(e),this.activeThreadId_$()===e&&(this.selectedThread_$.set(null),this.activeThreadId_$.set("")),yield this.loadThreads()}catch(t){throw this.globalError_CS.showError(t,"Consultant_DataService.deleteThread"),t}})}static parseThreadDetail(e){let t=typeof e.threadId=="string"?e.threadId:"";if(!t.length)return null;let n=e.messages,o=[];if(Array.isArray(n))for(let p of n){if(!i.isPlainRecord(p))continue;let A=typeof p.id=="string"?p.id:"",Y=p.role;if(Y!=="user"&&Y!=="assistant")continue;let L={id:A,role:Y};typeof p.rawUserText=="string"&&(L.rawUserText=p.rawUserText),typeof p.content=="string"&&(L.content=p.content);let ie=p.userParts;if(Array.isArray(ie)){let oe=[];for(let D of ie){if(!i.isPlainRecord(D))continue;let J=D.type;if(J!=="text"&&J!=="image_url")continue;let Z={type:J};typeof D.text=="string"&&(Z.text=D.text),typeof D.imageUrl=="string"&&(Z.imageUrl=D.imageUrl),oe.push(Z)}L.userParts=oe}o.push(L)}return{threadId:t,label:typeof e.label=="string"?e.label:"",providerInstanceId:typeof e.providerInstanceId=="string"?e.providerInstanceId:"",model:typeof e.model=="string"?e.model:"",messages:o,updatedAt:typeof e.updatedAt=="string"?e.updatedAt:""}}static isPlainRecord(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}static parseRegistryEntry(e){if(!i.isPlainRecord(e))return null;let t=typeof e.provider=="string"?e.provider:"",n=typeof e.modelName=="string"?e.modelName:"";if(!t.length||!n.length)return null;let o=e.capabilities,p=Array.isArray(o)?o.filter(A=>typeof A=="string"):void 0;return{id:typeof e.id=="string"?e.id:"",provider:t,modelName:n,enabled:e.enabled===!0,capabilities:p}}static \u0275fac=function(t){return new(t||i)};static \u0275prov=F({token:i,factory:i.\u0275fac,providedIn:"root"})}return i})();var g=class{static collectSortedProviders(a){let e=new Set;for(let t of a){let n=t.provider.trim();n.length>0&&e.add(n)}return[...e].sort()}static collectSortedModelsForProvider(a,e){let t=e.trim();if(!t.length)return[];let n=[];for(let o of a){let p=o.modelName.trim();o.provider===t&&p.length>0&&n.push(p)}return[...new Set(n)].sort()}};var ze=(i,a)=>a.id;function je(i,a){i&1&&(r(0,"div",5),_(1,"Loading..."),s())}function He(i,a){if(i&1){let e=E();r(0,"app-s-session-info-card",9),h("selected",function(n){m(e);let o=c(2);return u(o.handleSelectThread(n))})("contextMenu",function(n){m(e);let o=c(2);return u(o.handleRowContextMenu(n))}),s()}if(i&2){let e=a.$implicit,t=c(2);f("view",e)("isActive",t.consultant_DS.activeThreadId_$()===e.id)}}function Xe(i,a){if(i&1&&S(0,He,1,2,"app-s-session-info-card",8,ze),i&2){let e=c();$(e.threadRowViews_$())}}function qe(i,a){i&1&&(r(0,"div",6),_(1,"No threads"),s())}function Qe(i,a){if(i&1&&(r(0,"option",16),_(1),s()),i&2){let e=a.$implicit,t=c(2);f("value",e),d(),k(t.providerDisplayLabelsMap_$()[e]||e)}}function Ge(i,a){if(i&1&&(r(0,"option",16),_(1),s()),i&2){let e=a.$implicit;f("value",e),d(),k(e)}}function Ke(i,a){if(i&1){let e=E();r(0,"div",10),h("click",function(){m(e);let n=c();return u(n.handleCloseCreate())}),r(1,"div",11),h("click",function(n){return m(e),u(n.stopPropagation())}),r(2,"h3",12),_(3,"New consultant thread"),s(),r(4,"div",13)(5,"label",14),_(6,"Label (optional)"),s(),r(7,"input",15),h("ngModelChange",function(n){m(e);let o=c();return u(o.newLabel_$.set(n))}),s(),r(8,"label",14),_(9,"Provider"),s(),r(10,"select",15),h("ngModelChange",function(n){m(e);let o=c();return u(o.handleProviderChange(n))}),S(11,Qe,2,2,"option",16,P),s(),r(13,"label",14),_(14,"Model"),s(),r(15,"select",15),h("ngModelChange",function(n){m(e);let o=c();return u(o.newModel_$.set(n))}),S(16,Ge,2,2,"option",16,P),s()(),r(18,"div",17)(19,"button",18),h("click",function(){m(e);let n=c();return u(n.handleCloseCreate())}),_(20," Cancel "),s(),r(21,"button",19),h("click",function(){m(e);let n=c();return u(n.handleCreateThread())}),_(22," Create "),s()()()()}if(i&2){let e=c();d(7),f("ngModel",e.newLabel_$()),d(3),f("ngModel",e.newProvider_$()),d(),$(e.providerOptions_$()),d(4),f("ngModel",e.newModel_$()),d(),$(e.modelsForNewProvider_$()),d(5),f("disabled",e.isCreating_$()||!e.newProvider_$().trim()||!e.newModel_$().trim())}}function Ye(i,a){if(i&1){let e=E();r(0,"div",20),h("click",function(){m(e);let n=c();return u(n.handleCloseCtxMenu())}),s(),r(1,"div",21)(2,"button",22),h("click",function(){m(e);let n=c();return u(n.handleCtxDelete())}),_(3," Delete "),s()()}if(i&2){let e=c();d(),_e("left",e.ctxMenuPos_$().x,"px")("top",e.ctxMenuPos_$().y,"px")}}var Le=(()=>{class i{consultant_DS=x(G);router=x(U);modelRegistry_DS=x(De);isCreateOpen_$=l(!1);newLabel_$=l("");newProvider_$=l("");newModel_$=l("");isCreating_$=l(!1);providerOptions_$=b(()=>g.collectSortedProviders(this.consultant_DS.pickerOptions_$()));modelsForNewProvider_$=b(()=>g.collectSortedModelsForProvider(this.consultant_DS.pickerOptions_$(),this.newProvider_$()));providerDisplayLabelsMap_$=b(()=>{let e=this.modelRegistry_DS.setupConfigForRegistry_$(),t=this.providerOptions_$(),n={};for(let o of t)n[o]==null&&(n[o]=ee.getProviderDisplayLabel(o,e));return n});threadProviderDisplayLabels_$=b(()=>{let e=this.modelRegistry_DS.setupConfigForRegistry_$(),t=new Set;for(let o of this.consultant_DS.threads_$()){let p=o.providerInstanceId.trim();p.length>0&&t.add(p)}for(let o of this.providerOptions_$())t.add(o);let n={};for(let o of t)n[o]=ee.getProviderDisplayLabel(o,e);return n});threadRowViews_$=b(()=>this.consultant_DS.threads_$().map(e=>({id:e.threadId,label:e.label||e.threadId,status:"",statusColorClass:"bg-neutral-600",isArchived:!1,lastActivityAt:e.updatedAt,isRunning:!1})));ctxMenuThread_$=l(null);ctxMenuPos_$=l({x:0,y:0});ngOnInit(){this.consultant_DS.loadThreads(),this.consultant_DS.loadPickerOptions(),this.modelRegistry_DS.loadSetupConfigForRegistry()}handleSelectThread(e){this.router.navigate(["/consultant",e])}handleOpenCreate(){return C(this,null,function*(){yield this.consultant_DS.loadPickerOptions();let e=this.consultant_DS.defaults_$(),t=this.providerOptions_$();if(e.providerInstanceId.length>0&&t.includes(e.providerInstanceId)){let n=g.collectSortedModelsForProvider(this.consultant_DS.pickerOptions_$(),e.providerInstanceId);e.model.length>0&&n.includes(e.model)?(this.newProvider_$.set(e.providerInstanceId),this.newModel_$.set(e.model)):(this.newProvider_$.set(e.providerInstanceId),this.newModel_$.set(n[0]??""))}else{let n=t[0]??"";this.newProvider_$.set(n);let o=g.collectSortedModelsForProvider(this.consultant_DS.pickerOptions_$(),n);this.newModel_$.set(o[0]??"")}this.newLabel_$.set(""),this.isCreateOpen_$.set(!0)})}handleCloseCreate(){this.isCreateOpen_$.set(!1)}handleProviderChange(e){this.newProvider_$.set(e);let t=g.collectSortedModelsForProvider(this.consultant_DS.pickerOptions_$(),e);this.newModel_$.set(t[0]??"")}handleCreateThread(){return C(this,null,function*(){let e=this.newProvider_$().trim(),t=this.newModel_$().trim();if(!(!e.length||!t.length)){this.isCreating_$.set(!0);try{let n=this.newLabel_$().trim(),o=yield this.consultant_DS.createThread({label:n.length>0?n:void 0,providerInstanceId:e,model:t});this.isCreateOpen_$.set(!1),o.length>0&&this.router.navigate(["/consultant",o])}finally{this.isCreating_$.set(!1)}}})}handleRowContextMenu(e){let t=this.consultant_DS.threads_$().find(n=>n.threadId===e.id);t&&(this.ctxMenuThread_$.set(t),this.ctxMenuPos_$.set({x:e.event.clientX,y:e.event.clientY}))}handleCloseCtxMenu(){this.ctxMenuThread_$.set(null)}handleCtxDelete(){return C(this,null,function*(){let e=this.ctxMenuThread_$();if(e){this.handleCloseCtxMenu();try{yield this.consultant_DS.deleteThread(e.threadId),this.router.navigate(["/consultant"])}catch{}}})}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=I({type:i,selectors:[["app-ccap-consultant-dashboard"]],hostAttrs:[1,"flex","flex-col","flex-1","min-h-0","overflow-hidden"],decls:12,vars:3,consts:[[1,"flex","flex-col","flex-1","min-h-0"],[1,"shrink-0","p-2","border-b","border-neonDefault","flex","items-center","gap-2"],[1,"text-xs","font-semibold","text-neutral-300","flex-1","truncate"],["type","button",1,"px-2","py-1","text-xs","border","border-neonDefault","text-neutral-300","hover:bg-neutral-700","rounded","transition-colors",3,"click"],[1,"flex-1","overflow-y-auto"],[1,"p-3","text-xs","text-neutral-500"],[1,"p-4","text-center","text-neutral-500","text-xs"],[1,"fixed","inset-0","z-40","flex","items-center","justify-center","bg-black/60","p-4"],[3,"view","isActive"],[3,"selected","contextMenu","view","isActive"],[1,"fixed","inset-0","z-40","flex","items-center","justify-center","bg-black/60","p-4",3,"click"],[1,"w-full","max-w-md","rounded-lg","border","border-neonDefault","bg-neutral-900","p-4","shadow-xl",3,"click"],[1,"text-sm","font-semibold","text-neutral-200","mb-3"],[1,"flex","flex-col","gap-2","text-xs"],[1,"text-neutral-400"],[1,"w-full","px-2","py-1","rounded","bg-neutral-800","border","border-neutral-600","text-neutral-200",3,"ngModelChange","ngModel"],[3,"value"],[1,"flex","justify-end","gap-2","mt-4"],["type","button",1,"px-2","py-1","text-xs","border","border-neutral-600","text-neutral-400","rounded",3,"click"],["type","button",1,"px-2","py-1","text-xs","border","border-neonDefault","text-neutral-200","rounded","disabled:opacity-40",3,"click","disabled"],[1,"fixed","inset-0","z-40",3,"click"],[1,"fixed","z-50","min-w-[140px]","bg-neutral-900","border","border-neutral-700","rounded-lg","shadow-xl","py-1","text-xs"],[1,"w-full","text-left","px-3","py-1.5","text-red-400","hover:bg-red-500/10","transition-colors",3,"click"]],template:function(t,n){if(t&1&&(r(0,"div",0)(1,"div",1)(2,"span",2),_(3,"Consultant"),s(),r(4,"button",3),h("click",function(){return n.handleOpenCreate()}),_(5," + New "),s()(),r(6,"div",4),M(7,je,2,0,"div",5)(8,Xe,2,0)(9,qe,2,0,"div",6),s()(),M(10,Ke,23,4,"div",7)(11,Ye,4,4)),t&2){let o;d(7),y(n.consultant_DS.threadsLoading_$()?7:n.threadRowViews_$().length?8:9),d(3),y(n.isCreateOpen_$()?10:-1),d(),y((o=n.ctxMenuThread_$())?11:-1,o)}},dependencies:[j,H,N,z,W,B,Me],encapsulation:2})}return i})();var We=(()=>{class i{sidebarWidth_$=l(320);isSidebarOpen_$=l(!0);isResizing_$=l(!1);ngOnInit(){let e=T.loadPanelWidth("sidebar",320);this.sidebarWidth_$.set(Math.max(200,Math.min(600,e))),this.isSidebarOpen_$.set(T.loadPanelOpen("sidebar",!0))}handleSidebarResizeStart(e){let t=e.clientX,n=this.sidebarWidth_$();this.isResizing_$.set(!0),Ve.attachUntilPointerUp({startEvent:e,onMove:o=>{let p=o.clientX-t,A=Math.max(200,Math.min(600,n+p));this.sidebarWidth_$.set(A)},onEnd:()=>{this.isResizing_$.set(!1),T.savePanelWidth("sidebar",this.sidebarWidth_$())}})}handleToggleSidebar(){this.isSidebarOpen_$.update(e=>!e),T.savePanelOpen("sidebar",this.isSidebarOpen_$())}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=I({type:i,selectors:[["app-ccap-consultant-shell"]],hostAttrs:[1,"flex","min-h-0","w-full","flex-1","flex-col","overflow-hidden"],decls:14,vars:9,consts:[[1,"flex","min-h-0","w-full","flex-1","flex-col","overflow-hidden"],["sSessionToolbarLeft","",1,"flex","items-center","gap-1","min-w-0"],["type","button",1,"px-2","py-1","text-xs","border","border-neonDefault","text-neutral-300","hover:bg-neutral-700","rounded","transition-colors","flex","items-center","gap-1","shrink-0",3,"click"],["viewBox","0 0 24 24","fill","none","stroke","currentColor","stroke-width","2","stroke-linecap","round","stroke-linejoin","round",1,"w-3","h-3","shrink-0","transition-transform","duration-150"],["points","6 9 12 15 18 9"],["sSessionToolbarCenter","",1,"min-w-0"],["sSessionToolbarRight","",1,"min-w-0"],[3,"sidebarResizeStart","isSidebarOpen","sidebarWidthPx","isResizing"],["sSessionShellSidebar","",1,"flex","flex-col","overflow-hidden","h-full"],["sSessionShellMain","",1,"flex","min-h-0","flex-1","flex-col","overflow-hidden","[&>router-outlet]:contents"]],template:function(t,n){t&1&&(r(0,"div",0)(1,"app-s-session-shell-toolbar")(2,"div",1)(3,"button",2),h("click",function(){return n.handleToggleSidebar()}),le(),r(4,"svg",3),w(5,"polyline",4),s(),_(6," Consultant "),s()(),de(),w(7,"div",5)(8,"div",6),s(),r(9,"app-s-resizable-session-shell-layout",7),h("sidebarResizeStart",function(p){return n.handleSidebarResizeStart(p)}),r(10,"div",8),w(11,"app-ccap-consultant-dashboard"),s(),r(12,"div",9),w(13,"router-outlet"),s()()()),t&2&&(R("select-none",n.isResizing_$()),d(4),R("rotate-90",n.isSidebarOpen_$())("-rotate-90",!n.isSidebarOpen_$()),d(5),f("isSidebarOpen",n.isSidebarOpen_$())("sidebarWidthPx",n.sidebarWidth_$())("isResizing",n.isResizing_$()))},dependencies:[ge,Pe,Ee,Le],encapsulation:2})}return i})();var K=class i{static fromMessage(a){let e=a.role==="user",t=e?i.buildUserBodyText(a):a.content??"";return{listKey:a.id,kind:e?te.userPrompt:te.assistant,bodyText:t,isUserAligned:e,flags:{showCopy:!0,showRawInfo:!1,useEditDiffForExpandable:!1}}}static buildUserBodyText(a){let e=(a.rawUserText??"").trim();return(a.userParts?.length??0)>1?e.length>0?`${e}
2
2
  [attachments]`:"[attachments]":e.length>0?e:a.content??""}};var Ze=(i,a)=>a.listKey;function et(i,a){i&1&&(r(0,"div",0),_(1," Select a thread or create a new consultant chat. "),s())}function tt(i,a){i&1&&(r(0,"div",1),_(1,"Loading\u2026"),s())}function nt(i,a){if(i&1&&(r(0,"option",8),_(1),s()),i&2){let e=a.$implicit;f("value",e),d(),k(e)}}function it(i,a){if(i&1&&(r(0,"option",8),_(1),s()),i&2){let e=a.$implicit;f("value",e),d(),k(e)}}function ot(i,a){if(i&1&&(r(0,"div",18),w(1,"app-s-agent-console-message-bubble",19),s()),i&2){let e=a.$implicit;R("self-end",e.isUserAligned===!0)("self-start",e.isUserAligned!==!0),d(),f("view",e)}}function rt(i,a){if(i&1){let e=E();r(0,"app-s-session-chat-column-layout")(1,"div",2)(2,"div",3)(3,"div",4)(4,"span",5),_(5,"Label"),s(),r(6,"input",6),h("ngModelChange",function(n){m(e);let o=c(2);return u(o.localLabel_$.set(n))}),s()(),r(7,"div",4)(8,"span",5),_(9,"Provider"),s(),r(10,"select",7),h("ngModelChange",function(n){m(e);let o=c(2);return u(o.handleProviderChange(n))}),S(11,nt,2,2,"option",8,P),s()(),r(13,"div",4)(14,"span",5),_(15,"Model"),s(),r(16,"select",6),h("ngModelChange",function(n){m(e);let o=c(2);return u(o.localModel_$.set(n))}),S(17,it,2,2,"option",8,P),s()(),r(19,"button",9),h("click",function(){m(e);let n=c(2);return u(n.handleApplyConfig())}),_(20," Apply "),s(),r(21,"button",10),h("click",function(){m(e);let n=c(2);return u(n.handleDeleteThread())}),_(22," Delete "),s()()(),r(23,"div",11),S(24,ot,2,5,"div",12,Ze),s(),r(26,"div",13)(27,"label",14)(28,"input",15),h("ngModelChange",function(n){m(e);let o=c(2);return u(o.allowWebSearch_$.set(n))}),s(),_(29," Allow web search (Brave) "),s(),r(30,"app-s-session-input",16),h("draftTextChange",function(n){m(e);let o=c(2);return u(o.composerText_$.set(n))})("sendRequested",function(){m(e);let n=c(2);return u(n.handleSend())})("attachmentsChanged",function(n){m(e);let o=c(2);return u(o.handleAttachmentsChanged(n))}),r(31,"app-ccap-voice-record-button",17),h("transcriptSegmentReady",function(n){m(e);let o=c(2);return u(o.handleVoiceSegment(n))}),s()()()()}if(i&2){let e=c(2);d(6),f("ngModel",e.localLabel_$()),d(4),f("ngModel",e.localProvider_$()),d(),$(e.providerOptions_$()),d(5),f("ngModel",e.localModel_$()),d(),$(e.modelsForSelectedProvider_$()),d(7),$(e.consultantBubbleViews_$()),d(4),f("ngModel",e.allowWebSearch_$()),d(2),f("draftText",e.composerText_$())("isSending",e.consultant_DS.sending_$())("enableAttachments",!0)("textareaRows",3),d(),f("compactLayout",!0)}}function at(i,a){i&1&&(r(0,"div",0),_(1," Thread not loaded. "),s())}function st(i,a){if(i&1&&M(0,rt,32,9,"app-s-session-chat-column-layout")(1,at,2,0,"div",0),i&2){let e=c();y(e.consultant_DS.selectedThread_$()?0:1)}}var ne=(()=>{class i extends we{consultant_DS=x(G);route=x(xe);router=x(U);voiceInputUi_DS=x(Ie);sessionInputRef;composerText_$=l("");allowWebSearch_$=l(!1);localLabel_$=l("");localProvider_$=l("");localModel_$=l("");providerOptions_$=b(()=>g.collectSortedProviders(this.consultant_DS.pickerOptions_$()));modelsForSelectedProvider_$=b(()=>g.collectSortedModelsForProvider(this.consultant_DS.pickerOptions_$(),this.localProvider_$()));consultantBubbleViews_$=b(()=>{let e=this.consultant_DS.selectedThread_$();return e?e.messages.map(t=>K.fromMessage(t)):[]});pendingAttachments=[];constructor(){super(),this.addSubscription(this.route.paramMap.pipe(re(e=>e.get("threadId")??"")).subscribe(e=>{e.length>0?this.consultant_DS.loadThreadDetail(e):(this.consultant_DS.selectedThread_$.set(null),this.consultant_DS.activeThreadId_$.set(""))})),ue(()=>{let e=this.consultant_DS.selectedThread_$();e!=null&&(this.localLabel_$.set(e.label),this.localProvider_$.set(e.providerInstanceId),this.localModel_$.set(e.model))},{allowSignalWrites:!0}),this.consultant_DS.loadPickerOptions()}ngOnDestroy(){super.ngOnDestroy()}handleProviderChange(e){this.localProvider_$.set(e);let t=g.collectSortedModelsForProvider(this.consultant_DS.pickerOptions_$(),e),n=this.localModel_$();t.includes(n)||this.localModel_$.set(t[0]??"")}handleApplyConfig(){return C(this,null,function*(){let e=this.consultant_DS.activeThreadId_$();e.length&&(yield this.consultant_DS.updateThreadConfig({threadId:e,label:this.localLabel_$(),providerInstanceId:this.localProvider_$(),model:this.localModel_$()}))})}handleDeleteThread(){return C(this,null,function*(){let e=this.consultant_DS.activeThreadId_$();e.length&&(yield this.consultant_DS.deleteThread(e),this.router.navigate(["/consultant"]))})}handleAttachmentsChanged(e){this.pendingAttachments=e}handleVoiceSegment(e){let t=e.text.trim();if(!t.length)return;let n=this.composerText_$().trim();this.composerText_$.set(n.length>0?`${n} ${t}`:t),this.voiceInputUi_DS.autoSendAfterVoice_$()&&e.isFinal&&this.handleSend()}handleSend(){return C(this,null,function*(){let e=this.consultant_DS.activeThreadId_$();if(!e.length)return;let t=this.composerText_$().trim(),n=[...this.pendingAttachments];if(!t.length&&!n.length)return;let o=n.map(p=>({kind:p.isImage?"image":"textDocument",mimeType:p.mimeType,fileName:p.fileName,dataBase64:p.base64}));yield this.consultant_DS.sendMessage({threadId:e,text:t,allowWebSearch:this.allowWebSearch_$(),attachments:o}),this.composerText_$.set(""),this.pendingAttachments=[],this.sessionInputRef?.clearAttachments()})}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=I({type:i,selectors:[["app-ccap-consultant-detail"]],viewQuery:function(t,n){if(t&1&&pe(q,5),t&2){let o;he(o=me())&&(n.sessionInputRef=o.first)}},hostAttrs:[1,"flex","flex-col","flex-1","min-h-0","overflow-hidden"],features:[ce],decls:3,vars:1,consts:[[1,"flex","flex-1","items-center","justify-center","p-4","text-xs","text-neutral-500"],[1,"flex","flex-1","items-center","justify-center","text-xs","text-neutral-500"],["sChatColumnHeader","",1,"flex","shrink-0","flex-col","gap-2","border-b","border-neonDefault","bg-ccapSurface","p-2"],[1,"flex","flex-wrap","items-end","gap-2"],[1,"flex","flex-col","gap-0.5"],[1,"text-[10px]","text-neutral-500"],[1,"w-40","rounded","border","border-neutral-600","bg-neutral-800","px-2","py-1","text-xs","text-neutral-200",3,"ngModelChange","ngModel"],[1,"w-36","rounded","border","border-neutral-600","bg-neutral-800","px-2","py-1","text-xs","text-neutral-200",3,"ngModelChange","ngModel"],[3,"value"],["type","button",1,"rounded","border","border-neonDefault","px-2","py-1","text-xs","text-neutral-300",3,"click"],["type","button",1,"ml-auto","rounded","border","border-red-900","px-2","py-1","text-xs","text-red-300",3,"click"],["sChatColumnScroll","",1,"flex","flex-col","gap-3","p-3"],[1,"max-w-[85%]",3,"self-end","self-start"],["sChatColumnComposer","",1,"flex","flex-col"],[1,"flex","cursor-pointer","items-center","gap-2","px-2","pt-1","text-[10px]","text-neutral-400"],["type","checkbox",3,"ngModelChange","ngModel"],["acceptedFileTypes","image/png,image/jpeg,image/webp,image/gif,.txt,.md,text/plain,text/markdown","placeholder","Message\u2026",3,"draftTextChange","sendRequested","attachmentsChanged","draftText","isSending","enableAttachments","textareaRows"],["sInputTextareaAccessory","",3,"transcriptSegmentReady","compactLayout"],[1,"max-w-[85%]"],[3,"view"]],template:function(t,n){t&1&&M(0,et,2,0,"div",0)(1,tt,2,0,"div",1)(2,st,2,1),t&2&&y(n.consultant_DS.activeThreadId_$()?n.consultant_DS.selectedThreadLoading_$()?1:2:0)},dependencies:[j,H,N,ve,z,W,B,X,q,ke,Ae],encapsulation:2})}return i})();var lt=[{path:"",component:We,children:[{path:"",component:ne},{path:":threadId",component:ne}]}],xn=(()=>{class i{static \u0275fac=function(t){return new(t||i)};static \u0275mod=se({type:i});static \u0275inj=ae({imports:[fe,Se,be.forChild(lt),Te,X,Re]})}return i})();export{xn as Consultant_Module};
3
- //# sourceMappingURL=consultant.module-VDHVKNXB.js.map
3
+ //# sourceMappingURL=consultant.module-TXQF6FU3.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["src/app/_modules/consultant/_collections/con-input-storage.util.ts", "src/app/_modules/consultant/_services/consultant.api-service.ts", "src/app/_modules/consultant/_services/consultant.data-service.ts", "src/app/_modules/consultant/_collections/con-picker-model.util.ts", "src/app/_modules/consultant/_components/ccap-consultant-dashboard/con-dashboard.component.ts", "src/app/_modules/consultant/_components/ccap-consultant-dashboard/con-dashboard.component.html", "src/app/_modules/consultant/_components/ccap-consultant-shell/con-shell.component.ts", "src/app/_modules/consultant/_components/ccap-consultant-shell/con-shell.component.html", "src/app/_modules/consultant/_collections/con-msg-to-bubble-view.util.ts", "src/app/_modules/consultant/_components/ccap-consultant-detail/con-detail.component.ts", "src/app/_modules/consultant/_components/ccap-consultant-detail/con-detail.component.html", "src/app/_modules/consultant/consultant.module.ts"],
4
- "sourcesContent": ["import { Shr_LocalStoragePersistence_Util } from '../../shared/_collections/utils/storage/shr-local-storage-persistence.util';\n\n/** localStorage prefix a Consultant shell UI állapotához. */\nconst STORAGE_PREFIX: string = 'ccap-consultant';\n\n/**\n * Consultant felület panel/sidebar localStorage — SSOT a host komponensben, prefix izolálva.\n *\n * REQ-UI-MENU-STATE-001 (cycle 447): a metódusok a shared\n * `Shr_LocalStoragePersistence_Util`-ra delegálnak. LocalStorage kulcs-formátum\n * változatlan (`ccap-consultant:*` prefix) — backward-compat.\n */\nexport class Con_InputStorage_Util {\n\n /** Panel nyitott/zárt állapot mentése. */\n static savePanelOpen(panelKey: string, isOpen: boolean): void {\n Shr_LocalStoragePersistence_Util.writeBoolean(`${STORAGE_PREFIX}:panelOpen:${panelKey}`, isOpen);\n }\n\n /** Panel nyitott/zárt állapot betöltése. */\n static loadPanelOpen(panelKey: string, defaultOpen: boolean): boolean {\n return Shr_LocalStoragePersistence_Util.readBoolean(\n `${STORAGE_PREFIX}:panelOpen:${panelKey}`,\n defaultOpen,\n );\n }\n\n /** Panel szélesség mentése (px). */\n static savePanelWidth(panelKey: string, width: number): void {\n Shr_LocalStoragePersistence_Util.writeNumber(`${STORAGE_PREFIX}:panelWidth:${panelKey}`, width);\n }\n\n /** Panel szélesség betöltése (px). */\n static loadPanelWidth(panelKey: string, defaultWidth: number): number {\n return Shr_LocalStoragePersistence_Util.readNumber(\n `${STORAGE_PREFIX}:panelWidth:${panelKey}`,\n defaultWidth,\n );\n }\n}\n", "import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\n\nimport { firstValueFrom } from 'rxjs';\n\nimport { environment } from '../../../../environments/environment';\n\n/**\n * Consultant POC REST API.\n */\n@Injectable({ providedIn: 'root' })\nexport class Consultant_ApiService {\n\n private readonly baseUrl: string = `${environment.api.baseUrl}/consultant`;\n\n private readonly http: HttpClient = inject(HttpClient);\n\n /**\n * Thread lista.\n */\n listThreads(): Promise<{ threads: Record<string, unknown>[] }> {\n return firstValueFrom(\n this.http.get<{ threads: Record<string, unknown>[] }>(this.baseUrl),\n );\n }\n\n /**\n * Picker opciók: Model Registry lista + default pair szerver oldali merge-elve.\n * A response tartalmazza az effektív defaults párost is.\n */\n getPickerOptions(): Promise<{\n entries: Record<string, unknown>[];\n defaults: { providerInstanceId: string; model: string };\n }> {\n return firstValueFrom(\n this.http.get<{\n entries: Record<string, unknown>[];\n defaults: { providerInstanceId: string; model: string };\n }>(`${this.baseUrl}/picker-options`),\n );\n }\n\n /**\n * Új thread.\n */\n createThread(params: {\n label?: string;\n providerInstanceId: string;\n model: string;\n }): Promise<{ thread: Record<string, unknown> }> {\n return firstValueFrom(\n this.http.post<{ thread: Record<string, unknown> }>(this.baseUrl, params),\n );\n }\n\n /**\n * Thread részletek.\n */\n getThread(threadId: string): Promise<{ thread: Record<string, unknown> }> {\n return firstValueFrom(\n this.http.get<{ thread: Record<string, unknown> }>(\n `${this.baseUrl}/${encodeURIComponent(threadId)}`,\n ),\n );\n }\n\n /**\n * Thread meta patch.\n */\n patchThread(params: {\n threadId: string;\n label?: string;\n providerInstanceId?: string;\n model?: string;\n }): Promise<{ thread: Record<string, unknown> }> {\n const body: Record<string, unknown> = {};\n if (params.label != null) {\n body.label = params.label;\n }\n if (params.providerInstanceId != null) {\n body.providerInstanceId = params.providerInstanceId;\n }\n if (params.model != null) {\n body.model = params.model;\n }\n return firstValueFrom(\n this.http.patch<{ thread: Record<string, unknown> }>(\n `${this.baseUrl}/${encodeURIComponent(params.threadId)}`,\n body,\n ),\n );\n }\n\n /**\n * Thread törlés.\n */\n deleteThread(threadId: string): Promise<{ ok: boolean }> {\n return firstValueFrom(\n this.http.delete<{ ok: boolean }>(\n `${this.baseUrl}/${encodeURIComponent(threadId)}`,\n ),\n );\n }\n\n /**\n * Üzenet küldése.\n */\n postMessage(params: {\n threadId: string;\n text: string;\n allowWebSearch: boolean;\n attachments: Record<string, unknown>[];\n }): Promise<Record<string, unknown>> {\n return firstValueFrom(\n this.http.post<Record<string, unknown>>(\n `${this.baseUrl}/${encodeURIComponent(params.threadId)}/messages`,\n {\n text: params.text,\n allowWebSearch: params.allowWebSearch,\n attachments: params.attachments,\n },\n ),\n );\n }\n}\n", "import { inject, Injectable, signal, WritableSignal } from '@angular/core';\n\nimport { Consultant_ApiService } from './consultant.api-service';\nimport {\n CCAP_ConsultantMessage_Client_Interface,\n CCAP_ConsultantThreadDetail_Client_Interface,\n CCAP_ConsultantThreadSummary_Client_Interface,\n} from '../../../_models/interfaces/consultant/ccap-consultant-client.interface';\nimport {\n MRg_ListItem_Response,\n} from '../../ai-systems/_modules/model-registry/_services/mrg-list-item.interface';\nimport { CCAP_GlobalError_ControlService } from '../../../_services/control-services/ccap-global-error.control-service';\n\n/**\n * Consultant POC állapot (SSOT).\n */\n@Injectable({ providedIn: 'root' })\nexport class Consultant_DataService {\n\n private readonly consultant_AS: Consultant_ApiService = inject(Consultant_ApiService);\n private readonly globalError_CS: CCAP_GlobalError_ControlService =\n inject(CCAP_GlobalError_ControlService);\n\n readonly threads_$: WritableSignal<CCAP_ConsultantThreadSummary_Client_Interface[]> =\n signal<CCAP_ConsultantThreadSummary_Client_Interface[]>([]);\n\n readonly threadsLoading_$: WritableSignal<boolean> = signal<boolean>(false);\n readonly threadsError_$: WritableSignal<unknown | null> = signal<unknown | null>(null);\n\n readonly selectedThread_$: WritableSignal<CCAP_ConsultantThreadDetail_Client_Interface | null> =\n signal<CCAP_ConsultantThreadDetail_Client_Interface | null>(null);\n\n readonly selectedThreadLoading_$: WritableSignal<boolean> = signal<boolean>(false);\n readonly selectedThreadError_$: WritableSignal<unknown | null> = signal<unknown | null>(null);\n\n readonly sending_$: WritableSignal<boolean> = signal<boolean>(false);\n\n readonly activeThreadId_$: WritableSignal<string> = signal<string>('');\n\n /** Effektív default provider/model pár (szerver SSOT: SC_Effective). */\n readonly defaults_$: WritableSignal<{ providerInstanceId: string; model: string }> =\n signal<{ providerInstanceId: string; model: string }>({ providerInstanceId: '', model: '' });\n\n /** Picker opciók (registry lista + default pair szerver oldali merge). */\n readonly pickerOptions_$: WritableSignal<MRg_ListItem_Response[]> =\n signal<MRg_ListItem_Response[]>([]);\n\n readonly pickerOptionsLoading_$: WritableSignal<boolean> = signal<boolean>(false);\n\n /**\n * Picker opciók betöltése (registry + default pair szerver oldali merge).\n * A defaults_$ signal-t is frissíti a válasz defaults mezőjéből.\n */\n async loadPickerOptions(): Promise<void> {\n this.pickerOptionsLoading_$.set(true);\n try {\n const res: {\n entries: Record<string, unknown>[];\n defaults: { providerInstanceId: string; model: string };\n } = await this.consultant_AS.getPickerOptions();\n const entries: MRg_ListItem_Response[] = Array.isArray(res.entries)\n ? res.entries.map(Consultant_DataService.parseRegistryEntry).filter(\n (e: MRg_ListItem_Response | null): e is MRg_ListItem_Response => e !== null,\n )\n : [];\n this.pickerOptions_$.set(entries);\n this.defaults_$.set({\n providerInstanceId: typeof res.defaults?.providerInstanceId === 'string'\n ? res.defaults.providerInstanceId : '',\n model: typeof res.defaults?.model === 'string' ? res.defaults.model : '',\n });\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'Consultant_DataService.loadPickerOptions');\n } finally {\n this.pickerOptionsLoading_$.set(false);\n }\n }\n\n /**\n * Thread lista betöltése.\n */\n async loadThreads(): Promise<void> {\n this.threadsLoading_$.set(true);\n this.threadsError_$.set(null);\n try {\n const res: { threads: Record<string, unknown>[] } = await this.consultant_AS.listThreads();\n const rawList: Record<string, unknown>[] = Array.isArray(res.threads) ? res.threads : [];\n const mapped: CCAP_ConsultantThreadSummary_Client_Interface[] = rawList.map(\n (row: Record<string, unknown>): CCAP_ConsultantThreadSummary_Client_Interface => ({\n threadId: typeof row.threadId === 'string' ? row.threadId : '',\n label: typeof row.label === 'string' ? row.label : '',\n providerInstanceId:\n typeof row.providerInstanceId === 'string' ? row.providerInstanceId : '',\n model: typeof row.model === 'string' ? row.model : '',\n messageCount: typeof row.messageCount === 'number' ? row.messageCount : 0,\n updatedAt: typeof row.updatedAt === 'string' ? row.updatedAt : '',\n }),\n );\n this.threads_$.set(mapped);\n } catch (err: unknown) {\n this.threadsError_$.set(err);\n this.globalError_CS.showError(err, 'Consultant_DataService.loadThreads');\n } finally {\n this.threadsLoading_$.set(false);\n }\n }\n\n /**\n * Egy thread részletei.\n */\n async loadThreadDetail(threadId: string): Promise<void> {\n this.activeThreadId_$.set(threadId);\n this.selectedThreadLoading_$.set(true);\n this.selectedThreadError_$.set(null);\n try {\n const res: { thread: Record<string, unknown> } = await this.consultant_AS.getThread(threadId);\n const detail: CCAP_ConsultantThreadDetail_Client_Interface | null =\n Consultant_DataService.parseThreadDetail(res.thread);\n this.selectedThread_$.set(detail);\n } catch (err: unknown) {\n this.selectedThreadError_$.set(err);\n this.globalError_CS.showError(err, 'Consultant_DataService.loadThreadDetail');\n } finally {\n this.selectedThreadLoading_$.set(false);\n }\n }\n\n /**\n * Üzenet küldés + lista frissítés.\n */\n async sendMessage(params: {\n threadId: string;\n text: string;\n allowWebSearch: boolean;\n attachments: Record<string, unknown>[];\n }): Promise<void> {\n this.sending_$.set(true);\n try {\n const res: Record<string, unknown> = await this.consultant_AS.postMessage(params);\n const threadRaw: unknown = res.thread;\n if (Consultant_DataService.isPlainRecord(threadRaw)) {\n const detail: CCAP_ConsultantThreadDetail_Client_Interface | null =\n Consultant_DataService.parseThreadDetail(threadRaw);\n this.selectedThread_$.set(detail);\n }\n await this.loadThreads();\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'Consultant_DataService.sendMessage');\n throw err;\n } finally {\n this.sending_$.set(false);\n }\n }\n\n /**\n * Provider/modell frissítés.\n */\n async updateThreadConfig(params: {\n threadId: string;\n providerInstanceId?: string;\n model?: string;\n label?: string;\n }): Promise<void> {\n try {\n const res: { thread: Record<string, unknown> } = await this.consultant_AS.patchThread(params);\n const detail: CCAP_ConsultantThreadDetail_Client_Interface | null =\n Consultant_DataService.parseThreadDetail(res.thread);\n this.selectedThread_$.set(detail);\n await this.loadThreads();\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'Consultant_DataService.updateThreadConfig');\n throw err;\n }\n }\n\n /**\n * Új thread létrehozása.\n */\n async createThread(params: {\n label?: string;\n providerInstanceId: string;\n model: string;\n }): Promise<string> {\n try {\n const res: { thread: Record<string, unknown> } = await this.consultant_AS.createThread(params);\n const idRaw: unknown = res.thread.threadId;\n const threadId: string = typeof idRaw === 'string' ? idRaw : '';\n await this.loadThreads();\n return threadId;\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'Consultant_DataService.createThread');\n throw err;\n }\n }\n\n /**\n * Thread törlése.\n */\n async deleteThread(threadId: string): Promise<void> {\n try {\n await this.consultant_AS.deleteThread(threadId);\n if (this.activeThreadId_$() === threadId) {\n this.selectedThread_$.set(null);\n this.activeThreadId_$.set('');\n }\n await this.loadThreads();\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'Consultant_DataService.deleteThread');\n throw err;\n }\n }\n\n /**\n * API thread objektum → részletek típus.\n */\n private static parseThreadDetail(\n raw: Record<string, unknown>,\n ): CCAP_ConsultantThreadDetail_Client_Interface | null {\n const threadId: string = typeof raw['threadId'] === 'string' ? raw['threadId'] : '';\n if (!threadId.length) {\n return null;\n }\n const messagesRaw: unknown = raw['messages'];\n const messages: CCAP_ConsultantMessage_Client_Interface[] = [];\n if (Array.isArray(messagesRaw)) {\n for (const m of messagesRaw) {\n if (!Consultant_DataService.isPlainRecord(m)) {\n continue;\n }\n const id: string = typeof m.id === 'string' ? m.id : '';\n const roleRaw: unknown = m.role;\n if (roleRaw !== 'user' && roleRaw !== 'assistant') {\n continue;\n }\n const msg: CCAP_ConsultantMessage_Client_Interface = {\n id: id,\n role: roleRaw,\n };\n if (typeof m.rawUserText === 'string') {\n msg.rawUserText = m.rawUserText;\n }\n if (typeof m.content === 'string') {\n msg.content = m.content;\n }\n const upRaw: unknown = m.userParts;\n if (Array.isArray(upRaw)) {\n const parts: CCAP_ConsultantMessage_Client_Interface['userParts'] = [];\n for (const p of upRaw) {\n if (!Consultant_DataService.isPlainRecord(p)) {\n continue;\n }\n const t: unknown = p.type;\n if (t !== 'text' && t !== 'image_url') {\n continue;\n }\n const part: {\n type: 'text' | 'image_url';\n text?: string;\n imageUrl?: string;\n } = { type: t };\n if (typeof p.text === 'string') {\n part.text = p.text;\n }\n if (typeof p.imageUrl === 'string') {\n part.imageUrl = p.imageUrl;\n }\n parts.push(part);\n }\n msg.userParts = parts;\n }\n messages.push(msg);\n }\n }\n return {\n threadId: threadId,\n label: typeof raw['label'] === 'string' ? raw['label'] : '',\n providerInstanceId:\n typeof raw['providerInstanceId'] === 'string' ? raw['providerInstanceId'] : '',\n model: typeof raw['model'] === 'string' ? raw['model'] : '',\n messages: messages,\n updatedAt: typeof raw['updatedAt'] === 'string' ? raw['updatedAt'] : '',\n };\n }\n\n private static isPlainRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n }\n\n /**\n * Registry entry JSON → típusos `MRg_ListItem_Response`.\n * Csak a picker-hez szükséges mezőket parsoljuk; null ha strukturálisan érvénytelen.\n */\n private static parseRegistryEntry(raw: unknown): MRg_ListItem_Response | null {\n if (!Consultant_DataService.isPlainRecord(raw)) {\n return null;\n }\n const provider: string = typeof raw['provider'] === 'string' ? raw['provider'] : '';\n const modelName: string = typeof raw['modelName'] === 'string' ? raw['modelName'] : '';\n if (!provider.length || !modelName.length) {\n return null;\n }\n const capsRaw: unknown = raw['capabilities'];\n const capabilities: string[] | undefined = Array.isArray(capsRaw)\n ? capsRaw.filter((c: unknown): c is string => typeof c === 'string')\n : undefined;\n return {\n id: typeof raw['id'] === 'string' ? raw['id'] : '',\n provider: provider,\n modelName: modelName,\n enabled: raw['enabled'] === true,\n capabilities: capabilities,\n };\n }\n}\n", "import { MRg_ListItem_Response } from '../../ai-systems/_modules/model-registry/_services/mrg-list-item.interface';\n\n/**\n * Consultant picker provider/model lista util (SSOT: mindenhol ugyanez a logika).\n */\nexport class Con_PickerModel_Util {\n\n /**\n * Egyedi, rendezett provider lista a picker entry-kből.\n */\n static collectSortedProviders(entries: MRg_ListItem_Response[]): string[] {\n const set: Set<string> = new Set<string>();\n for (const e of entries) {\n const prov: string = e.provider.trim();\n if (prov.length > 0) {\n set.add(prov);\n }\n }\n return [...set].sort();\n }\n\n /**\n * Adott providerhez tartozó egyedi, rendezett modellek.\n */\n static collectSortedModelsForProvider(\n entries: MRg_ListItem_Response[],\n provider: string,\n ): string[] {\n const p: string = provider.trim();\n if (!p.length) {\n return [];\n }\n const names: string[] = [];\n for (const e of entries) {\n const mn: string = e.modelName.trim();\n if (e.provider === p && mn.length > 0) {\n names.push(mn);\n }\n }\n return [...new Set(names)].sort();\n }\n}\n", "import { Component, OnInit, inject, signal, computed } from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { ProviderDisplayLabel_Util } from '../../../../_collections/display/provider-display-label.util';\nimport { Consultant_DataService } from '../../_services/consultant.data-service';\nimport { ModelRegistry_DataService } from '../../../ai-systems/_modules/model-registry/_services/model-registry.data-service';\nimport { MRg_SetupConfig_Type } from '../../../ai-systems/_modules/model-registry/_services/mrg-setup-config.type';\nimport { S_SessionListRowView_Interface } from '../../../shared/_models/interfaces/s-session-list-row-view.interface';\nimport { CCAP_ConsultantThreadSummary_Client_Interface } from '../../../../_models/interfaces/consultant/ccap-consultant-client.interface';\nimport { Con_PickerModel_Util } from '../../_collections/con-picker-model.util';\n\n/**\n * Consultant thread lista + új chat.\n */\n@Component({\n selector: 'app-ccap-consultant-dashboard',\n templateUrl: './con-dashboard.component.html',\n host: { class: 'flex flex-col flex-1 min-h-0 overflow-hidden' },\n})\n/** Con_Dashboard_Component class. */\nexport class Con_Dashboard_Component implements OnInit {\n\n readonly consultant_DS: Consultant_DataService = inject(Consultant_DataService);\n private readonly router: Router = inject(Router);\n private readonly modelRegistry_DS: ModelRegistry_DataService =\n inject(ModelRegistry_DataService);\n\n readonly isCreateOpen_$ = signal<boolean>(false);\n readonly newLabel_$ = signal<string>('');\n readonly newProvider_$ = signal<string>('');\n readonly newModel_$ = signal<string>('');\n readonly isCreating_$ = signal<boolean>(false);\n\n /**\n * Egyedi provider instance id-k a szerveri picker listából.\n */\n readonly providerOptions_$ = computed((): string[] => {\n return Con_PickerModel_Util.collectSortedProviders(this.consultant_DS.pickerOptions_$());\n });\n\n /**\n * Kiválasztott providerhez tartozó modellek.\n */\n readonly modelsForNewProvider_$ = computed((): string[] => {\n return Con_PickerModel_Util.collectSortedModelsForProvider(\n this.consultant_DS.pickerOptions_$(),\n this.newProvider_$(),\n );\n });\n\n /**\n * Provider id → megjelenített címke (display label config-ból).\n */\n readonly providerDisplayLabelsMap_$ = computed((): Record<string, string> => {\n const config: MRg_SetupConfig_Type = this.modelRegistry_DS.setupConfigForRegistry_$();\n const providers: string[] = this.providerOptions_$();\n const m: Record<string, string> = {};\n for (const p of providers) {\n if (m[p] == null) {\n m[p] = ProviderDisplayLabel_Util.getProviderDisplayLabel(p, config);\n }\n }\n return m;\n });\n\n /**\n * Thread lista sorokhoz: ismert providerInstanceId → display label.\n */\n readonly threadProviderDisplayLabels_$ = computed((): Record<string, string> => {\n const config: MRg_SetupConfig_Type = this.modelRegistry_DS.setupConfigForRegistry_$();\n const ids: Set<string> = new Set<string>();\n for (const t of this.consultant_DS.threads_$()) {\n const id: string = t.providerInstanceId.trim();\n if (id.length > 0) {\n ids.add(id);\n }\n }\n for (const p of this.providerOptions_$()) {\n ids.add(p);\n }\n const m: Record<string, string> = {};\n for (const id of ids) {\n m[id] = ProviderDisplayLabel_Util.getProviderDisplayLabel(id, config);\n }\n return m;\n });\n\n /** Thread lista → shared list row view model mapping. */\n readonly threadRowViews_$ = computed((): S_SessionListRowView_Interface[] =>\n this.consultant_DS.threads_$().map(\n (t: CCAP_ConsultantThreadSummary_Client_Interface): S_SessionListRowView_Interface => ({\n id: t.threadId,\n label: t.label || t.threadId,\n status: '',\n statusColorClass: 'bg-neutral-600',\n isArchived: false,\n lastActivityAt: t.updatedAt,\n isRunning: false,\n }),\n ),\n );\n\n // ── Context menu state ──────────────────────────────────────\n\n /** Kontextmenü thread-je (null = zárt). */\n readonly ctxMenuThread_$ = signal<CCAP_ConsultantThreadSummary_Client_Interface | null>(null);\n\n /** Kontextmenü pozíció. */\n readonly ctxMenuPos_$ = signal<{ x: number; y: number }>({ x: 0, y: 0 });\n\n ngOnInit(): void {\n void this.consultant_DS.loadThreads();\n void this.consultant_DS.loadPickerOptions();\n void this.modelRegistry_DS.loadSetupConfigForRegistry();\n }\n\n /**\n * Navigálás a kiválasztott consultant thread-re.\n */\n handleSelectThread(threadId: string): void {\n void this.router.navigate(['/consultant', threadId]);\n }\n\n /**\n * Modál megnyitás: friss picker opciók + szerveri defaults pre-selection.\n */\n async handleOpenCreate(): Promise<void> {\n await this.consultant_DS.loadPickerOptions();\n const defaults: { providerInstanceId: string; model: string } = this.consultant_DS.defaults_$();\n const providers: string[] = this.providerOptions_$();\n if (defaults.providerInstanceId.length > 0 && providers.includes(defaults.providerInstanceId)) {\n const models: string[] = Con_PickerModel_Util.collectSortedModelsForProvider(\n this.consultant_DS.pickerOptions_$(),\n defaults.providerInstanceId,\n );\n if (defaults.model.length > 0 && models.includes(defaults.model)) {\n this.newProvider_$.set(defaults.providerInstanceId);\n this.newModel_$.set(defaults.model);\n } else {\n this.newProvider_$.set(defaults.providerInstanceId);\n this.newModel_$.set(models[0] ?? '');\n }\n } else {\n const firstP: string = providers[0] ?? '';\n this.newProvider_$.set(firstP);\n const fallbackModels: string[] = Con_PickerModel_Util.collectSortedModelsForProvider(\n this.consultant_DS.pickerOptions_$(),\n firstP,\n );\n this.newModel_$.set(fallbackModels[0] ?? '');\n }\n this.newLabel_$.set('');\n this.isCreateOpen_$.set(true);\n }\n\n /**\n * Új thread modál bezárása.\n */\n handleCloseCreate(): void {\n this.isCreateOpen_$.set(false);\n }\n\n /**\n * Provider váltás — modell lista első elemére állítás.\n */\n handleProviderChange(value: string): void {\n this.newProvider_$.set(value);\n const models: string[] = Con_PickerModel_Util.collectSortedModelsForProvider(\n this.consultant_DS.pickerOptions_$(),\n value,\n );\n this.newModel_$.set(models[0] ?? '');\n }\n\n /**\n * Új consultant thread létrehozása a kiválasztott provider/model párossal.\n */\n async handleCreateThread(): Promise<void> {\n const provider: string = this.newProvider_$().trim();\n const model: string = this.newModel_$().trim();\n if (!provider.length || !model.length) {\n return;\n }\n this.isCreating_$.set(true);\n try {\n const label: string = this.newLabel_$().trim();\n const id: string = await this.consultant_DS.createThread({\n label: label.length > 0 ? label : undefined,\n providerInstanceId: provider,\n model: model,\n });\n this.isCreateOpen_$.set(false);\n if (id.length > 0) {\n void this.router.navigate(['/consultant', id]);\n }\n } finally {\n this.isCreating_$.set(false);\n }\n }\n\n // ── Context menu handlers ────────────────────────────────────\n\n /** Shared list row contextMenu output kezelése. */\n handleRowContextMenu(payload: { event: MouseEvent; id: string }): void {\n const thread: CCAP_ConsultantThreadSummary_Client_Interface | undefined =\n this.consultant_DS.threads_$().find(\n (t: CCAP_ConsultantThreadSummary_Client_Interface): boolean => t.threadId === payload.id,\n );\n if (!thread) {\n return;\n }\n this.ctxMenuThread_$.set(thread);\n this.ctxMenuPos_$.set({ x: payload.event.clientX, y: payload.event.clientY });\n }\n\n /** Kontextmenü bezárása. */\n handleCloseCtxMenu(): void {\n this.ctxMenuThread_$.set(null);\n }\n\n /** Delete a kontextmenüből. */\n async handleCtxDelete(): Promise<void> {\n const thread: CCAP_ConsultantThreadSummary_Client_Interface | null = this.ctxMenuThread_$();\n if (!thread) {\n return;\n }\n this.handleCloseCtxMenu();\n try {\n await this.consultant_DS.deleteThread(thread.threadId);\n void this.router.navigate(['/consultant']);\n } catch {\n // Hibát a data service kezeli\n }\n }\n}\n", "<div class=\"flex flex-col flex-1 min-h-0\">\n <div class=\"shrink-0 p-2 border-b border-neonDefault flex items-center gap-2\">\n <span class=\"text-xs font-semibold text-neutral-300 flex-1 truncate\">Consultant</span>\n <button\n type=\"button\"\n class=\"px-2 py-1 text-xs border border-neonDefault text-neutral-300 hover:bg-neutral-700 rounded transition-colors\"\n (click)=\"handleOpenCreate()\">\n + New\n </button>\n </div>\n\n <div class=\"flex-1 overflow-y-auto\">\n @if (consultant_DS.threadsLoading_$()) {\n <div class=\"p-3 text-xs text-neutral-500\">Loading...</div>\n } @else if (threadRowViews_$().length) {\n @for (row of threadRowViews_$(); track row.id) {\n <app-s-session-info-card\n [view]=\"row\"\n [isActive]=\"consultant_DS.activeThreadId_$() === row.id\"\n (selected)=\"handleSelectThread($event)\"\n (contextMenu)=\"handleRowContextMenu($event)\" />\n }\n } @else {\n <div class=\"p-4 text-center text-neutral-500 text-xs\">No threads</div>\n }\n </div>\n</div>\n\n@if (isCreateOpen_$()) {\n <div class=\"fixed inset-0 z-40 flex items-center justify-center bg-black/60 p-4\" (click)=\"handleCloseCreate()\">\n <div\n class=\"w-full max-w-md rounded-lg border border-neonDefault bg-neutral-900 p-4 shadow-xl\"\n (click)=\"$event.stopPropagation()\">\n <h3 class=\"text-sm font-semibold text-neutral-200 mb-3\">New consultant thread</h3>\n <div class=\"flex flex-col gap-2 text-xs\">\n <label class=\"text-neutral-400\">Label (optional)</label>\n <input\n class=\"w-full px-2 py-1 rounded bg-neutral-800 border border-neutral-600 text-neutral-200\"\n [ngModel]=\"newLabel_$()\"\n (ngModelChange)=\"newLabel_$.set($event)\" />\n\n <label class=\"text-neutral-400\">Provider</label>\n <select\n class=\"w-full px-2 py-1 rounded bg-neutral-800 border border-neutral-600 text-neutral-200\"\n [ngModel]=\"newProvider_$()\"\n (ngModelChange)=\"handleProviderChange($event)\">\n @for (p of providerOptions_$(); track p) {\n <option [value]=\"p\">{{ providerDisplayLabelsMap_$()[p] || p }}</option>\n }\n </select>\n\n <label class=\"text-neutral-400\">Model</label>\n <select\n class=\"w-full px-2 py-1 rounded bg-neutral-800 border border-neutral-600 text-neutral-200\"\n [ngModel]=\"newModel_$()\"\n (ngModelChange)=\"newModel_$.set($event)\">\n @for (m of modelsForNewProvider_$(); track m) {\n <option [value]=\"m\">{{ m }}</option>\n }\n </select>\n </div>\n <div class=\"flex justify-end gap-2 mt-4\">\n <button\n type=\"button\"\n class=\"px-2 py-1 text-xs border border-neutral-600 text-neutral-400 rounded\"\n (click)=\"handleCloseCreate()\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"px-2 py-1 text-xs border border-neonDefault text-neutral-200 rounded disabled:opacity-40\"\n [disabled]=\"isCreating_$() || !newProvider_$().trim() || !newModel_$().trim()\"\n (click)=\"handleCreateThread()\">\n Create\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- Context menu overlay -->\n@if (ctxMenuThread_$(); as ctxThread) {\n <div class=\"fixed inset-0 z-40\" (click)=\"handleCloseCtxMenu()\"></div>\n <div class=\"fixed z-50 min-w-[140px] bg-neutral-900 border border-neutral-700 rounded-lg shadow-xl py-1 text-xs\"\n [style.left.px]=\"ctxMenuPos_$().x\"\n [style.top.px]=\"ctxMenuPos_$().y\">\n <button\n class=\"w-full text-left px-3 py-1.5 text-red-400 hover:bg-red-500/10 transition-colors\"\n (click)=\"handleCtxDelete()\">\n Delete\n </button>\n </div>\n}\n", "import { Component, OnInit, signal } from '@angular/core';\n\nimport { Con_InputStorage_Util } from '../../_collections/con-input-storage.util';\nimport {\n SESSION_SHELL_SIDEBAR_DEFAULT_WIDTH_PX,\n SESSION_SHELL_SIDEBAR_MAX_WIDTH_PX,\n SESSION_SHELL_SIDEBAR_MIN_WIDTH_PX,\n} from '../../../shared/_collections/consts/session-detail-panel-layout.const';\nimport { SHR_DocumentPointerDrag_Util } from '../../../shared/_collections/utils/shr-document-pointer-drag.util';\n\n/**\n * Consultant POC shell: resizable bal lista + router-outlet (OC/CC session minta).\n */\n@Component({\n selector: 'app-ccap-consultant-shell',\n templateUrl: './con-shell.component.html',\n host: { class: 'flex min-h-0 w-full flex-1 flex-col overflow-hidden' },\n})\n/** Con_Shell_Component class. */\nexport class Con_Shell_Component implements OnInit {\n\n /** Bal sidebar szélessége (px). */\n readonly sidebarWidth_$ = signal<number>(SESSION_SHELL_SIDEBAR_DEFAULT_WIDTH_PX);\n\n /** Sidebar látható. */\n readonly isSidebarOpen_$ = signal<boolean>(true);\n\n /** Resize közben select-none a root-on. */\n readonly isResizing_$ = signal<boolean>(false);\n\n ngOnInit(): void {\n const stored: number = Con_InputStorage_Util.loadPanelWidth(\n 'sidebar',\n SESSION_SHELL_SIDEBAR_DEFAULT_WIDTH_PX,\n );\n this.sidebarWidth_$.set(\n Math.max(\n SESSION_SHELL_SIDEBAR_MIN_WIDTH_PX,\n Math.min(SESSION_SHELL_SIDEBAR_MAX_WIDTH_PX, stored),\n ),\n );\n this.isSidebarOpen_$.set(Con_InputStorage_Util.loadPanelOpen('sidebar', true));\n }\n\n /**\n * Sidebar resize drag indítása.\n */\n handleSidebarResizeStart(event: PointerEvent): void {\n const startX: number = event.clientX;\n const startWidth: number = this.sidebarWidth_$();\n this.isResizing_$.set(true);\n SHR_DocumentPointerDrag_Util.attachUntilPointerUp({\n startEvent: event,\n onMove: (e: PointerEvent): void => {\n const delta: number = e.clientX - startX;\n const newWidth: number = Math.max(\n SESSION_SHELL_SIDEBAR_MIN_WIDTH_PX,\n Math.min(SESSION_SHELL_SIDEBAR_MAX_WIDTH_PX, startWidth + delta),\n );\n this.sidebarWidth_$.set(newWidth);\n },\n onEnd: (): void => {\n this.isResizing_$.set(false);\n Con_InputStorage_Util.savePanelWidth('sidebar', this.sidebarWidth_$());\n },\n });\n }\n\n /**\n * Sidebar ki/be — állapot mentése.\n */\n handleToggleSidebar(): void {\n this.isSidebarOpen_$.update((v: boolean): boolean => !v);\n Con_InputStorage_Util.savePanelOpen('sidebar', this.isSidebarOpen_$());\n }\n}\n", "<div class=\"flex min-h-0 w-full flex-1 flex-col overflow-hidden\" [class.select-none]=\"isResizing_$()\">\n <app-s-session-shell-toolbar>\n <div sSessionToolbarLeft class=\"flex items-center gap-1 min-w-0\">\n <button\n type=\"button\"\n class=\"px-2 py-1 text-xs border border-neonDefault text-neutral-300 hover:bg-neutral-700 rounded transition-colors flex items-center gap-1 shrink-0\"\n (click)=\"handleToggleSidebar()\">\n <svg\n class=\"w-3 h-3 shrink-0 transition-transform duration-150\"\n [class.rotate-90]=\"isSidebarOpen_$()\"\n [class.-rotate-90]=\"!isSidebarOpen_$()\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n Consultant\n </button>\n </div>\n <div sSessionToolbarCenter class=\"min-w-0\"></div>\n <div sSessionToolbarRight class=\"min-w-0\"></div>\n </app-s-session-shell-toolbar>\n\n <app-s-resizable-session-shell-layout\n [isSidebarOpen]=\"isSidebarOpen_$()\"\n [sidebarWidthPx]=\"sidebarWidth_$()\"\n [isResizing]=\"isResizing_$()\"\n (sidebarResizeStart)=\"handleSidebarResizeStart($event)\">\n <div sSessionShellSidebar class=\"flex flex-col overflow-hidden h-full\">\n <app-ccap-consultant-dashboard />\n </div>\n <div\n sSessionShellMain\n class=\"flex min-h-0 flex-1 flex-col overflow-hidden [&>router-outlet]:contents\">\n <router-outlet />\n </div>\n </app-s-resizable-session-shell-layout>\n</div>\n", "import { CCAP_AgentConsoleBubbleKind_Type } from '../../../_enums/shared/ccap-agent-console-bubble-kind.enum';\nimport { CCAP_AgentConsoleBubbleView_Interface } from '../../../_models/interfaces/shared/ccap-agent-console-bubble-view.interface';\nimport { CCAP_ConsultantMessage_Client_Interface } from '../../../_models/interfaces/consultant/ccap-consultant-client.interface';\n\n/**\n * Consultant üzenet → közös buborék view-model.\n */\nexport class Con_MsgToBubbleView_Util {\n\n /**\n * Consultant thread üzenet mapelése.\n */\n static fromMessage(msg: CCAP_ConsultantMessage_Client_Interface): CCAP_AgentConsoleBubbleView_Interface {\n const isUser: boolean = msg.role === 'user';\n const bodyText: string = isUser\n ? Con_MsgToBubbleView_Util.buildUserBodyText(msg)\n : (msg.content ?? '');\n return {\n listKey: msg.id,\n kind: isUser ? CCAP_AgentConsoleBubbleKind_Type.userPrompt : CCAP_AgentConsoleBubbleKind_Type.assistant,\n bodyText: bodyText,\n isUserAligned: isUser,\n flags: {\n showCopy: true,\n showRawInfo: false,\n useEditDiffForExpandable: false,\n },\n };\n }\n\n /**\n * User sor: nyers szöveg + több userPart esetén attachment jelölés (régi detail megjelenítés).\n */\n private static buildUserBodyText(msg: CCAP_ConsultantMessage_Client_Interface): string {\n const raw: string = (msg.rawUserText ?? '').trim();\n const hasParts: boolean = (msg.userParts?.length ?? 0) > 1;\n if (hasParts) {\n return raw.length > 0 ? `${raw}\\n[attachments]` : '[attachments]';\n }\n if (raw.length > 0) {\n return raw;\n }\n return msg.content ?? '';\n }\n}\n", "import {\n Component,\n computed,\n effect,\n inject,\n OnDestroy,\n signal,\n ViewChild,\n WritableSignal,\n} from '@angular/core';\nimport { ActivatedRoute, ParamMap, Router } from '@angular/router';\n\nimport { map } from 'rxjs';\n\nimport { DyNX_SubscriptionControl } from '@futdevpro/ngx-dynamo';\n\nimport { Consultant_DataService } from '../../_services/consultant.data-service';\nimport { VNP_InputUi_DataService } from '../../../dev/_modules/poc/_modules/voice-notes-poc/_services/vnp-input-ui.data-service';\nimport {\n S_SessionInput_Component,\n} from '../../../shared/_components/session-ui/s-session-input/s-session-input.component';\nimport { Con_PickerModel_Util } from '../../_collections/con-picker-model.util';\nimport {\n CCAP_PendingAttachment_Interface,\n} from '../../../../_models/interfaces/session/ccap-pending-attachment.interface';\nimport {\n CCAP_ConsultantMessage_Client_Interface,\n} from '../../../../_models/interfaces/consultant/ccap-consultant-client.interface';\nimport { CCAP_AgentConsoleBubbleView_Interface } from '../../../../_models/interfaces/shared/ccap-agent-console-bubble-view.interface';\nimport { Con_MsgToBubbleView_Util } from '../../_collections/con-msg-to-bubble-view.util';\n\n/**\n * Consultant chat részletek: üzenetek, composer, modellváltás.\n */\n@Component({\n selector: 'app-ccap-consultant-detail',\n templateUrl: './con-detail.component.html',\n host: { class: 'flex flex-col flex-1 min-h-0 overflow-hidden' },\n})\n/** Con_Detail_Component class. */\nexport class Con_Detail_Component extends DyNX_SubscriptionControl implements OnDestroy {\n\n readonly consultant_DS: Consultant_DataService = inject(Consultant_DataService);\n private readonly route: ActivatedRoute = inject(ActivatedRoute);\n private readonly router: Router = inject(Router);\n private readonly voiceInputUi_DS: VNP_InputUi_DataService =\n inject(VNP_InputUi_DataService);\n\n /** Shared session input komponens referencia (clearAttachments küldés után). */\n @ViewChild(S_SessionInput_Component) private sessionInputRef: S_SessionInput_Component | undefined;\n\n readonly composerText_$: WritableSignal<string> = signal<string>('');\n readonly allowWebSearch_$: WritableSignal<boolean> = signal<boolean>(false);\n\n readonly localLabel_$: WritableSignal<string> = signal<string>('');\n readonly localProvider_$: WritableSignal<string> = signal<string>('');\n readonly localModel_$: WritableSignal<string> = signal<string>('');\n\n /**\n * Provider opciók a szerveri picker listából (SSOT: data service).\n */\n readonly providerOptions_$ = computed((): string[] => {\n return Con_PickerModel_Util.collectSortedProviders(this.consultant_DS.pickerOptions_$());\n });\n\n /**\n * Model lista a kiválasztott providerhez (SSOT: shared util, template-ben nincs method hívás).\n */\n readonly modelsForSelectedProvider_$ = computed((): string[] => {\n return Con_PickerModel_Util.collectSortedModelsForProvider(\n this.consultant_DS.pickerOptions_$(),\n this.localProvider_$(),\n );\n });\n\n /**\n * Thread üzenetek buborék view-modelje (track: listKey = message id).\n */\n readonly consultantBubbleViews_$ = computed((): CCAP_AgentConsoleBubbleView_Interface[] => {\n const t = this.consultant_DS.selectedThread_$();\n if (!t) {\n return [];\n }\n return t.messages.map(\n (m: CCAP_ConsultantMessage_Client_Interface): CCAP_AgentConsoleBubbleView_Interface =>\n Con_MsgToBubbleView_Util.fromMessage(m),\n );\n });\n\n /** Shared input komponensből érkező attachment-ek (küldéshez konvertáljuk). */\n private pendingAttachments: CCAP_PendingAttachment_Interface[] = [];\n\n constructor() {\n super();\n this.addSubscription(this.route.paramMap.pipe(\n map((pm: ParamMap): string => pm.get('threadId') ?? ''),\n ).subscribe((threadId: string): void => {\n if (threadId.length > 0) {\n void this.consultant_DS.loadThreadDetail(threadId);\n } else {\n this.consultant_DS.selectedThread_$.set(null);\n this.consultant_DS.activeThreadId_$.set('');\n }\n }));\n\n effect((): void => {\n const t = this.consultant_DS.selectedThread_$();\n if (t != null) {\n this.localLabel_$.set(t.label);\n this.localProvider_$.set(t.providerInstanceId);\n this.localModel_$.set(t.model);\n }\n }, { allowSignalWrites: true });\n\n void this.consultant_DS.loadPickerOptions();\n }\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n handleProviderChange(value: string): void {\n this.localProvider_$.set(value);\n const models: string[] = Con_PickerModel_Util.collectSortedModelsForProvider(\n this.consultant_DS.pickerOptions_$(),\n value,\n );\n const cur: string = this.localModel_$();\n if (!models.includes(cur)) {\n this.localModel_$.set(models[0] ?? '');\n }\n }\n\n async handleApplyConfig(): Promise<void> {\n const threadId: string = this.consultant_DS.activeThreadId_$();\n if (!threadId.length) {\n return;\n }\n await this.consultant_DS.updateThreadConfig({\n threadId: threadId,\n label: this.localLabel_$(),\n providerInstanceId: this.localProvider_$(),\n model: this.localModel_$(),\n });\n }\n\n async handleDeleteThread(): Promise<void> {\n const threadId: string = this.consultant_DS.activeThreadId_$();\n if (!threadId.length) {\n return;\n }\n await this.consultant_DS.deleteThread(threadId);\n void this.router.navigate(['/consultant']);\n }\n\n /**\n * Shared input komponens attachment lista változás.\n */\n handleAttachmentsChanged(attachments: CCAP_PendingAttachment_Interface[]): void {\n this.pendingAttachments = attachments;\n }\n\n /**\n * Voice szegmens transcribe: akkumuláció + auto-send csak isFinal=true esetén.\n */\n handleVoiceSegment(event: { text: string; isFinal: boolean }): void {\n const t: string = event.text.trim();\n if (!t.length) {\n return;\n }\n const current: string = this.composerText_$().trim();\n this.composerText_$.set(current.length > 0 ? `${current} ${t}` : t);\n if (this.voiceInputUi_DS.autoSendAfterVoice_$() && event.isFinal) {\n void this.handleSend();\n }\n }\n\n /**\n * Üzenet küldése — pending attachment-eket consultant API formátumra konvertálja.\n */\n async handleSend(): Promise<void> {\n const threadId: string = this.consultant_DS.activeThreadId_$();\n if (!threadId.length) {\n return;\n }\n const text: string = this.composerText_$().trim();\n const currentAttachments: CCAP_PendingAttachment_Interface[] = [...this.pendingAttachments];\n if (!text.length && !currentAttachments.length) {\n return;\n }\n const attachments: Record<string, unknown>[] = currentAttachments.map(\n (a: CCAP_PendingAttachment_Interface): Record<string, unknown> => ({\n kind: a.isImage ? 'image' : 'textDocument',\n mimeType: a.mimeType,\n fileName: a.fileName,\n dataBase64: a.base64,\n }),\n );\n await this.consultant_DS.sendMessage({\n threadId: threadId,\n text: text,\n allowWebSearch: this.allowWebSearch_$(),\n attachments: attachments,\n });\n this.composerText_$.set('');\n this.pendingAttachments = [];\n this.sessionInputRef?.clearAttachments();\n }\n\n}\n", "@if (!consultant_DS.activeThreadId_$()) {\n <div class=\"flex flex-1 items-center justify-center p-4 text-xs text-neutral-500\">\n Select a thread or create a new consultant chat.\n </div>\n} @else if (consultant_DS.selectedThreadLoading_$()) {\n <div class=\"flex flex-1 items-center justify-center text-xs text-neutral-500\">Loading…</div>\n} @else {\n @if (consultant_DS.selectedThread_$()) {\n <app-s-session-chat-column-layout>\n <div\n sChatColumnHeader\n class=\"flex shrink-0 flex-col gap-2 border-b border-neonDefault bg-ccapSurface p-2\">\n <div class=\"flex flex-wrap items-end gap-2\">\n <div class=\"flex flex-col gap-0.5\">\n <span class=\"text-[10px] text-neutral-500\">Label</span>\n <input\n class=\"w-40 rounded border border-neutral-600 bg-neutral-800 px-2 py-1 text-xs text-neutral-200\"\n [ngModel]=\"localLabel_$()\"\n (ngModelChange)=\"localLabel_$.set($event)\" />\n </div>\n <div class=\"flex flex-col gap-0.5\">\n <span class=\"text-[10px] text-neutral-500\">Provider</span>\n <select\n class=\"w-36 rounded border border-neutral-600 bg-neutral-800 px-2 py-1 text-xs text-neutral-200\"\n [ngModel]=\"localProvider_$()\"\n (ngModelChange)=\"handleProviderChange($event)\">\n @for (p of providerOptions_$(); track p) {\n <option [value]=\"p\">{{ p }}</option>\n }\n </select>\n </div>\n <div class=\"flex flex-col gap-0.5\">\n <span class=\"text-[10px] text-neutral-500\">Model</span>\n <select\n class=\"w-40 rounded border border-neutral-600 bg-neutral-800 px-2 py-1 text-xs text-neutral-200\"\n [ngModel]=\"localModel_$()\"\n (ngModelChange)=\"localModel_$.set($event)\">\n @for (m of modelsForSelectedProvider_$(); track m) {\n <option [value]=\"m\">{{ m }}</option>\n }\n </select>\n </div>\n <button\n type=\"button\"\n class=\"rounded border border-neonDefault px-2 py-1 text-xs text-neutral-300\"\n (click)=\"handleApplyConfig()\">\n Apply\n </button>\n <button\n type=\"button\"\n class=\"ml-auto rounded border border-red-900 px-2 py-1 text-xs text-red-300\"\n (click)=\"handleDeleteThread()\">\n Delete\n </button>\n </div>\n </div>\n\n <div sChatColumnScroll class=\"flex flex-col gap-3 p-3\">\n @for (row of consultantBubbleViews_$(); track row.listKey) {\n <div\n class=\"max-w-[85%]\"\n [class.self-end]=\"row.isUserAligned === true\"\n [class.self-start]=\"row.isUserAligned !== true\">\n <app-s-agent-console-message-bubble [view]=\"row\" />\n </div>\n }\n </div>\n\n <div sChatColumnComposer class=\"flex flex-col\">\n <label class=\"flex cursor-pointer items-center gap-2 px-2 pt-1 text-[10px] text-neutral-400\">\n <input type=\"checkbox\" [ngModel]=\"allowWebSearch_$()\" (ngModelChange)=\"allowWebSearch_$.set($event)\" />\n Allow web search (Brave)\n </label>\n <app-s-session-input\n [draftText]=\"composerText_$()\"\n (draftTextChange)=\"composerText_$.set($event)\"\n [isSending]=\"consultant_DS.sending_$()\"\n [enableAttachments]=\"true\"\n acceptedFileTypes=\"image/png,image/jpeg,image/webp,image/gif,.txt,.md,text/plain,text/markdown\"\n placeholder=\"Message…\"\n [textareaRows]=\"3\"\n (sendRequested)=\"handleSend()\"\n (attachmentsChanged)=\"handleAttachmentsChanged($event)\">\n <app-ccap-voice-record-button\n sInputTextareaAccessory\n [compactLayout]=\"true\"\n (transcriptSegmentReady)=\"handleVoiceSegment($event)\">\n </app-ccap-voice-record-button>\n </app-s-session-input>\n </div>\n </app-s-session-chat-column-layout>\n } @else {\n <div class=\"flex flex-1 items-center justify-center p-4 text-xs text-neutral-500\">\n Thread not loaded.\n </div>\n }\n}\n", "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { RouterModule, Routes } from '@angular/router';\n\nimport { CCAP_ErrorDisplay_Component } from '../../_components/ccap-error-display/ccap-error-display.component';\nimport { CCAP_VoiceRecordButton_Component } from '../../_components/ccap-voice-record-button/ccap-voice-record-button.component';\nimport { Shared_Module } from '../shared/shared.module';\nimport { Con_Shell_Component } from './_components/ccap-consultant-shell/con-shell.component';\nimport { Con_Dashboard_Component } from './_components/ccap-consultant-dashboard/con-dashboard.component';\nimport { Con_Detail_Component } from './_components/ccap-consultant-detail/con-detail.component';\n\nconst consultantRoutes: Routes = [\n {\n path: '',\n component: Con_Shell_Component,\n children: [\n { path: '', component: Con_Detail_Component },\n { path: ':threadId', component: Con_Detail_Component },\n ],\n },\n];\n\n/**\n * Consultant POC modul: egyszerű chat, provider/modell, mellékletek.\n */\n@NgModule({\n declarations: [\n Con_Shell_Component,\n Con_Dashboard_Component,\n Con_Detail_Component,\n ],\n imports: [\n CommonModule,\n FormsModule,\n RouterModule.forChild(consultantRoutes),\n CCAP_ErrorDisplay_Component,\n CCAP_VoiceRecordButton_Component,\n Shared_Module,\n ],\n})\n/** Consultant_Module class. */\nexport class Consultant_Module {}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Shr_LocalStoragePersistence_Util } from '../../shared/_collections/utils/storage/shr-local-storage-persistence.util';\n\n/** localStorage prefix a Consultant shell UI állapotához. */\nconst STORAGE_PREFIX: string = 'ccap-consultant';\n\n/**\n * Consultant felület panel/sidebar localStorage — SSOT a host komponensben, prefix izolálva.\n *\n * REQ-UI-MENU-STATE-001 (cycle 447): a metódusok a shared\n * `Shr_LocalStoragePersistence_Util`-ra delegálnak. LocalStorage kulcs-formátum\n * változatlan (`ccap-consultant:*` prefix) — backward-compat.\n */\nexport class Con_InputStorage_Util {\n\n /** Panel nyitott/zárt állapot mentése. */\n static savePanelOpen(panelKey: string, isOpen: boolean): void {\n Shr_LocalStoragePersistence_Util.writeBoolean(`${STORAGE_PREFIX}:panelOpen:${panelKey}`, isOpen);\n }\n\n /** Panel nyitott/zárt állapot betöltése. */\n static loadPanelOpen(panelKey: string, defaultOpen: boolean): boolean {\n return Shr_LocalStoragePersistence_Util.readBoolean(\n `${STORAGE_PREFIX}:panelOpen:${panelKey}`,\n defaultOpen,\n );\n }\n\n /** Panel szélesség mentése (px). */\n static savePanelWidth(panelKey: string, width: number): void {\n Shr_LocalStoragePersistence_Util.writeNumber(`${STORAGE_PREFIX}:panelWidth:${panelKey}`, width);\n }\n\n /** Panel szélesség betöltése (px). */\n static loadPanelWidth(panelKey: string, defaultWidth: number): number {\n return Shr_LocalStoragePersistence_Util.readNumber(\n `${STORAGE_PREFIX}:panelWidth:${panelKey}`,\n defaultWidth,\n );\n }\n}\n", "import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\n\nimport { firstValueFrom } from 'rxjs';\n\nimport { environment } from '../../../../environments/environment';\n\n/**\n * Consultant POC REST API.\n */\n@Injectable({ providedIn: 'root' })\nexport class Consultant_ApiService {\n\n private readonly baseUrl: string = `${environment.api.baseUrl}/consultant`;\n\n private readonly http: HttpClient = inject(HttpClient);\n\n /**\n * Thread lista.\n */\n listThreads(): Promise<{ threads: Record<string, unknown>[] }> {\n return firstValueFrom(\n this.http.get<{ threads: Record<string, unknown>[] }>(this.baseUrl),\n );\n }\n\n /**\n * Picker opciók: Model Registry lista + default pair szerver oldali merge-elve.\n * A response tartalmazza az effektív defaults párost is.\n */\n getPickerOptions(): Promise<{\n entries: Record<string, unknown>[];\n defaults: { providerInstanceId: string; model: string };\n }> {\n return firstValueFrom(\n this.http.get<{\n entries: Record<string, unknown>[];\n defaults: { providerInstanceId: string; model: string };\n }>(`${this.baseUrl}/picker-options`),\n );\n }\n\n /**\n * Új thread.\n */\n createThread(params: {\n label?: string;\n providerInstanceId: string;\n model: string;\n }): Promise<{ thread: Record<string, unknown> }> {\n return firstValueFrom(\n this.http.post<{ thread: Record<string, unknown> }>(this.baseUrl, params),\n );\n }\n\n /**\n * Thread részletek.\n */\n getThread(threadId: string): Promise<{ thread: Record<string, unknown> }> {\n return firstValueFrom(\n this.http.get<{ thread: Record<string, unknown> }>(\n `${this.baseUrl}/${encodeURIComponent(threadId)}`,\n ),\n );\n }\n\n /**\n * Thread meta patch.\n */\n patchThread(params: {\n threadId: string;\n label?: string;\n providerInstanceId?: string;\n model?: string;\n }): Promise<{ thread: Record<string, unknown> }> {\n const body: Record<string, unknown> = {};\n if (params.label != null) {\n body.label = params.label;\n }\n if (params.providerInstanceId != null) {\n body.providerInstanceId = params.providerInstanceId;\n }\n if (params.model != null) {\n body.model = params.model;\n }\n return firstValueFrom(\n this.http.patch<{ thread: Record<string, unknown> }>(\n `${this.baseUrl}/${encodeURIComponent(params.threadId)}`,\n body,\n ),\n );\n }\n\n /**\n * Thread törlés.\n */\n deleteThread(threadId: string): Promise<{ ok: boolean }> {\n return firstValueFrom(\n this.http.delete<{ ok: boolean }>(\n `${this.baseUrl}/${encodeURIComponent(threadId)}`,\n ),\n );\n }\n\n /**\n * Üzenet küldése.\n */\n postMessage(params: {\n threadId: string;\n text: string;\n allowWebSearch: boolean;\n attachments: Record<string, unknown>[];\n }): Promise<Record<string, unknown>> {\n return firstValueFrom(\n this.http.post<Record<string, unknown>>(\n `${this.baseUrl}/${encodeURIComponent(params.threadId)}/messages`,\n {\n text: params.text,\n allowWebSearch: params.allowWebSearch,\n attachments: params.attachments,\n },\n ),\n );\n }\n}\n", "import { inject, Injectable, signal, WritableSignal } from '@angular/core';\n\nimport { Consultant_ApiService } from './consultant.api-service';\nimport {\n CCAP_ConsultantMessage_Client_Interface,\n CCAP_ConsultantThreadDetail_Client_Interface,\n CCAP_ConsultantThreadSummary_Client_Interface,\n} from '../../../_models/interfaces/consultant/ccap-consultant-client.interface';\nimport {\n MRg_ListItem_Response,\n} from '../../ai-systems/_modules/model-registry/_services/mrg-list-item.interface';\nimport { CCAP_GlobalError_ControlService } from '../../../_services/control-services/ccap-global-error.control-service';\n\n/**\n * Consultant POC állapot (SSOT).\n */\n@Injectable({ providedIn: 'root' })\nexport class Consultant_DataService {\n\n private readonly consultant_AS: Consultant_ApiService = inject(Consultant_ApiService);\n private readonly globalError_CS: CCAP_GlobalError_ControlService =\n inject(CCAP_GlobalError_ControlService);\n\n readonly threads_$: WritableSignal<CCAP_ConsultantThreadSummary_Client_Interface[]> =\n signal<CCAP_ConsultantThreadSummary_Client_Interface[]>([]);\n\n readonly threadsLoading_$: WritableSignal<boolean> = signal<boolean>(false);\n readonly threadsError_$: WritableSignal<unknown | null> = signal<unknown | null>(null);\n\n readonly selectedThread_$: WritableSignal<CCAP_ConsultantThreadDetail_Client_Interface | null> =\n signal<CCAP_ConsultantThreadDetail_Client_Interface | null>(null);\n\n readonly selectedThreadLoading_$: WritableSignal<boolean> = signal<boolean>(false);\n readonly selectedThreadError_$: WritableSignal<unknown | null> = signal<unknown | null>(null);\n\n readonly sending_$: WritableSignal<boolean> = signal<boolean>(false);\n\n readonly activeThreadId_$: WritableSignal<string> = signal<string>('');\n\n /** Effektív default provider/model pár (szerver SSOT: SC_Effective). */\n readonly defaults_$: WritableSignal<{ providerInstanceId: string; model: string }> =\n signal<{ providerInstanceId: string; model: string }>({ providerInstanceId: '', model: '' });\n\n /** Picker opciók (registry lista + default pair szerver oldali merge). */\n readonly pickerOptions_$: WritableSignal<MRg_ListItem_Response[]> =\n signal<MRg_ListItem_Response[]>([]);\n\n readonly pickerOptionsLoading_$: WritableSignal<boolean> = signal<boolean>(false);\n\n /**\n * Picker opciók betöltése (registry + default pair szerver oldali merge).\n * A defaults_$ signal-t is frissíti a válasz defaults mezőjéből.\n */\n async loadPickerOptions(): Promise<void> {\n this.pickerOptionsLoading_$.set(true);\n try {\n const res: {\n entries: Record<string, unknown>[];\n defaults: { providerInstanceId: string; model: string };\n } = await this.consultant_AS.getPickerOptions();\n const entries: MRg_ListItem_Response[] = Array.isArray(res.entries)\n ? res.entries.map(Consultant_DataService.parseRegistryEntry).filter(\n (e: MRg_ListItem_Response | null): e is MRg_ListItem_Response => e !== null,\n )\n : [];\n this.pickerOptions_$.set(entries);\n this.defaults_$.set({\n providerInstanceId: typeof res.defaults?.providerInstanceId === 'string'\n ? res.defaults.providerInstanceId : '',\n model: typeof res.defaults?.model === 'string' ? res.defaults.model : '',\n });\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'Consultant_DataService.loadPickerOptions');\n } finally {\n this.pickerOptionsLoading_$.set(false);\n }\n }\n\n /**\n * Thread lista betöltése.\n */\n async loadThreads(): Promise<void> {\n this.threadsLoading_$.set(true);\n this.threadsError_$.set(null);\n try {\n const res: { threads: Record<string, unknown>[] } = await this.consultant_AS.listThreads();\n const rawList: Record<string, unknown>[] = Array.isArray(res.threads) ? res.threads : [];\n const mapped: CCAP_ConsultantThreadSummary_Client_Interface[] = rawList.map(\n (row: Record<string, unknown>): CCAP_ConsultantThreadSummary_Client_Interface => ({\n threadId: typeof row.threadId === 'string' ? row.threadId : '',\n label: typeof row.label === 'string' ? row.label : '',\n providerInstanceId:\n typeof row.providerInstanceId === 'string' ? row.providerInstanceId : '',\n model: typeof row.model === 'string' ? row.model : '',\n messageCount: typeof row.messageCount === 'number' ? row.messageCount : 0,\n updatedAt: typeof row.updatedAt === 'string' ? row.updatedAt : '',\n }),\n );\n this.threads_$.set(mapped);\n } catch (err: unknown) {\n this.threadsError_$.set(err);\n this.globalError_CS.showError(err, 'Consultant_DataService.loadThreads');\n } finally {\n this.threadsLoading_$.set(false);\n }\n }\n\n /**\n * Egy thread részletei.\n */\n async loadThreadDetail(threadId: string): Promise<void> {\n this.activeThreadId_$.set(threadId);\n this.selectedThreadLoading_$.set(true);\n this.selectedThreadError_$.set(null);\n try {\n const res: { thread: Record<string, unknown> } = await this.consultant_AS.getThread(threadId);\n const detail: CCAP_ConsultantThreadDetail_Client_Interface | null =\n Consultant_DataService.parseThreadDetail(res.thread);\n this.selectedThread_$.set(detail);\n } catch (err: unknown) {\n this.selectedThreadError_$.set(err);\n this.globalError_CS.showError(err, 'Consultant_DataService.loadThreadDetail');\n } finally {\n this.selectedThreadLoading_$.set(false);\n }\n }\n\n /**\n * Üzenet küldés + lista frissítés.\n */\n async sendMessage(params: {\n threadId: string;\n text: string;\n allowWebSearch: boolean;\n attachments: Record<string, unknown>[];\n }): Promise<void> {\n this.sending_$.set(true);\n try {\n const res: Record<string, unknown> = await this.consultant_AS.postMessage(params);\n const threadRaw: unknown = res.thread;\n if (Consultant_DataService.isPlainRecord(threadRaw)) {\n const detail: CCAP_ConsultantThreadDetail_Client_Interface | null =\n Consultant_DataService.parseThreadDetail(threadRaw);\n this.selectedThread_$.set(detail);\n }\n await this.loadThreads();\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'Consultant_DataService.sendMessage');\n throw err;\n } finally {\n this.sending_$.set(false);\n }\n }\n\n /**\n * Provider/modell frissítés.\n */\n async updateThreadConfig(params: {\n threadId: string;\n providerInstanceId?: string;\n model?: string;\n label?: string;\n }): Promise<void> {\n try {\n const res: { thread: Record<string, unknown> } = await this.consultant_AS.patchThread(params);\n const detail: CCAP_ConsultantThreadDetail_Client_Interface | null =\n Consultant_DataService.parseThreadDetail(res.thread);\n this.selectedThread_$.set(detail);\n await this.loadThreads();\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'Consultant_DataService.updateThreadConfig');\n throw err;\n }\n }\n\n /**\n * Új thread létrehozása.\n */\n async createThread(params: {\n label?: string;\n providerInstanceId: string;\n model: string;\n }): Promise<string> {\n try {\n const res: { thread: Record<string, unknown> } = await this.consultant_AS.createThread(params);\n const idRaw: unknown = res.thread.threadId;\n const threadId: string = typeof idRaw === 'string' ? idRaw : '';\n await this.loadThreads();\n return threadId;\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'Consultant_DataService.createThread');\n throw err;\n }\n }\n\n /**\n * Thread törlése.\n */\n async deleteThread(threadId: string): Promise<void> {\n try {\n await this.consultant_AS.deleteThread(threadId);\n if (this.activeThreadId_$() === threadId) {\n this.selectedThread_$.set(null);\n this.activeThreadId_$.set('');\n }\n await this.loadThreads();\n } catch (err: unknown) {\n this.globalError_CS.showError(err, 'Consultant_DataService.deleteThread');\n throw err;\n }\n }\n\n /**\n * API thread objektum → részletek típus.\n */\n private static parseThreadDetail(\n raw: Record<string, unknown>,\n ): CCAP_ConsultantThreadDetail_Client_Interface | null {\n const threadId: string = typeof raw['threadId'] === 'string' ? raw['threadId'] : '';\n if (!threadId.length) {\n return null;\n }\n const messagesRaw: unknown = raw['messages'];\n const messages: CCAP_ConsultantMessage_Client_Interface[] = [];\n if (Array.isArray(messagesRaw)) {\n for (const m of messagesRaw) {\n if (!Consultant_DataService.isPlainRecord(m)) {\n continue;\n }\n const id: string = typeof m.id === 'string' ? m.id : '';\n const roleRaw: unknown = m.role;\n if (roleRaw !== 'user' && roleRaw !== 'assistant') {\n continue;\n }\n const msg: CCAP_ConsultantMessage_Client_Interface = {\n id: id,\n role: roleRaw,\n };\n if (typeof m.rawUserText === 'string') {\n msg.rawUserText = m.rawUserText;\n }\n if (typeof m.content === 'string') {\n msg.content = m.content;\n }\n const upRaw: unknown = m.userParts;\n if (Array.isArray(upRaw)) {\n const parts: CCAP_ConsultantMessage_Client_Interface['userParts'] = [];\n for (const p of upRaw) {\n if (!Consultant_DataService.isPlainRecord(p)) {\n continue;\n }\n const t: unknown = p.type;\n if (t !== 'text' && t !== 'image_url') {\n continue;\n }\n const part: {\n type: 'text' | 'image_url';\n text?: string;\n imageUrl?: string;\n } = { type: t };\n if (typeof p.text === 'string') {\n part.text = p.text;\n }\n if (typeof p.imageUrl === 'string') {\n part.imageUrl = p.imageUrl;\n }\n parts.push(part);\n }\n msg.userParts = parts;\n }\n messages.push(msg);\n }\n }\n return {\n threadId: threadId,\n label: typeof raw['label'] === 'string' ? raw['label'] : '',\n providerInstanceId:\n typeof raw['providerInstanceId'] === 'string' ? raw['providerInstanceId'] : '',\n model: typeof raw['model'] === 'string' ? raw['model'] : '',\n messages: messages,\n updatedAt: typeof raw['updatedAt'] === 'string' ? raw['updatedAt'] : '',\n };\n }\n\n private static isPlainRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n }\n\n /**\n * Registry entry JSON → típusos `MRg_ListItem_Response`.\n * Csak a picker-hez szükséges mezőket parsoljuk; null ha strukturálisan érvénytelen.\n */\n private static parseRegistryEntry(raw: unknown): MRg_ListItem_Response | null {\n if (!Consultant_DataService.isPlainRecord(raw)) {\n return null;\n }\n const provider: string = typeof raw['provider'] === 'string' ? raw['provider'] : '';\n const modelName: string = typeof raw['modelName'] === 'string' ? raw['modelName'] : '';\n if (!provider.length || !modelName.length) {\n return null;\n }\n const capsRaw: unknown = raw['capabilities'];\n const capabilities: string[] | undefined = Array.isArray(capsRaw)\n ? capsRaw.filter((c: unknown): c is string => typeof c === 'string')\n : undefined;\n return {\n id: typeof raw['id'] === 'string' ? raw['id'] : '',\n provider: provider,\n modelName: modelName,\n enabled: raw['enabled'] === true,\n capabilities: capabilities,\n };\n }\n}\n", "import { MRg_ListItem_Response } from '../../ai-systems/_modules/model-registry/_services/mrg-list-item.interface';\n\n/**\n * Consultant picker provider/model lista util (SSOT: mindenhol ugyanez a logika).\n */\nexport class Con_PickerModel_Util {\n\n /**\n * Egyedi, rendezett provider lista a picker entry-kből.\n */\n static collectSortedProviders(entries: MRg_ListItem_Response[]): string[] {\n const set: Set<string> = new Set<string>();\n for (const e of entries) {\n const prov: string = e.provider.trim();\n if (prov.length > 0) {\n set.add(prov);\n }\n }\n return [...set].sort();\n }\n\n /**\n * Adott providerhez tartozó egyedi, rendezett modellek.\n */\n static collectSortedModelsForProvider(\n entries: MRg_ListItem_Response[],\n provider: string,\n ): string[] {\n const p: string = provider.trim();\n if (!p.length) {\n return [];\n }\n const names: string[] = [];\n for (const e of entries) {\n const mn: string = e.modelName.trim();\n if (e.provider === p && mn.length > 0) {\n names.push(mn);\n }\n }\n return [...new Set(names)].sort();\n }\n}\n", "import { Component, OnInit, inject, signal, computed } from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { ProviderDisplayLabel_Util } from '../../../../_collections/display/provider-display-label.util';\nimport { Consultant_DataService } from '../../_services/consultant.data-service';\nimport { ModelRegistry_DataService } from '../../../ai-systems/_modules/model-registry/_services/model-registry.data-service';\nimport { MRg_SetupConfig_Type } from '../../../ai-systems/_modules/model-registry/_services/mrg-setup-config.type';\nimport { S_SessionInfoCardData_Interface } from '../../../shared/_models/interfaces/s-session-info-card-data.interface';\nimport { CCAP_ConsultantThreadSummary_Client_Interface } from '../../../../_models/interfaces/consultant/ccap-consultant-client.interface';\nimport { Con_PickerModel_Util } from '../../_collections/con-picker-model.util';\n\n/**\n * Consultant thread lista + új chat.\n */\n@Component({\n selector: 'app-ccap-consultant-dashboard',\n templateUrl: './con-dashboard.component.html',\n host: { class: 'flex flex-col flex-1 min-h-0 overflow-hidden' },\n})\n/** Con_Dashboard_Component class. */\nexport class Con_Dashboard_Component implements OnInit {\n\n readonly consultant_DS: Consultant_DataService = inject(Consultant_DataService);\n private readonly router: Router = inject(Router);\n private readonly modelRegistry_DS: ModelRegistry_DataService =\n inject(ModelRegistry_DataService);\n\n readonly isCreateOpen_$ = signal<boolean>(false);\n readonly newLabel_$ = signal<string>('');\n readonly newProvider_$ = signal<string>('');\n readonly newModel_$ = signal<string>('');\n readonly isCreating_$ = signal<boolean>(false);\n\n /**\n * Egyedi provider instance id-k a szerveri picker listából.\n */\n readonly providerOptions_$ = computed((): string[] => {\n return Con_PickerModel_Util.collectSortedProviders(this.consultant_DS.pickerOptions_$());\n });\n\n /**\n * Kiválasztott providerhez tartozó modellek.\n */\n readonly modelsForNewProvider_$ = computed((): string[] => {\n return Con_PickerModel_Util.collectSortedModelsForProvider(\n this.consultant_DS.pickerOptions_$(),\n this.newProvider_$(),\n );\n });\n\n /**\n * Provider id → megjelenített címke (display label config-ból).\n */\n readonly providerDisplayLabelsMap_$ = computed((): Record<string, string> => {\n const config: MRg_SetupConfig_Type = this.modelRegistry_DS.setupConfigForRegistry_$();\n const providers: string[] = this.providerOptions_$();\n const m: Record<string, string> = {};\n for (const p of providers) {\n if (m[p] == null) {\n m[p] = ProviderDisplayLabel_Util.getProviderDisplayLabel(p, config);\n }\n }\n return m;\n });\n\n /**\n * Thread lista sorokhoz: ismert providerInstanceId → display label.\n */\n readonly threadProviderDisplayLabels_$ = computed((): Record<string, string> => {\n const config: MRg_SetupConfig_Type = this.modelRegistry_DS.setupConfigForRegistry_$();\n const ids: Set<string> = new Set<string>();\n for (const t of this.consultant_DS.threads_$()) {\n const id: string = t.providerInstanceId.trim();\n if (id.length > 0) {\n ids.add(id);\n }\n }\n for (const p of this.providerOptions_$()) {\n ids.add(p);\n }\n const m: Record<string, string> = {};\n for (const id of ids) {\n m[id] = ProviderDisplayLabel_Util.getProviderDisplayLabel(id, config);\n }\n return m;\n });\n\n /** Thread lista → shared list row view model mapping. */\n readonly threadRowViews_$ = computed((): S_SessionInfoCardData_Interface[] =>\n this.consultant_DS.threads_$().map(\n (t: CCAP_ConsultantThreadSummary_Client_Interface): S_SessionInfoCardData_Interface => ({\n id: t.threadId,\n label: t.label || t.threadId,\n status: '',\n statusColorClass: 'bg-neutral-600',\n isArchived: false,\n lastActivityAt: t.updatedAt,\n isRunning: false,\n }),\n ),\n );\n\n // ── Context menu state ──────────────────────────────────────\n\n /** Kontextmenü thread-je (null = zárt). */\n readonly ctxMenuThread_$ = signal<CCAP_ConsultantThreadSummary_Client_Interface | null>(null);\n\n /** Kontextmenü pozíció. */\n readonly ctxMenuPos_$ = signal<{ x: number; y: number }>({ x: 0, y: 0 });\n\n ngOnInit(): void {\n void this.consultant_DS.loadThreads();\n void this.consultant_DS.loadPickerOptions();\n void this.modelRegistry_DS.loadSetupConfigForRegistry();\n }\n\n /**\n * Navigálás a kiválasztott consultant thread-re.\n */\n handleSelectThread(threadId: string): void {\n void this.router.navigate(['/consultant', threadId]);\n }\n\n /**\n * Modál megnyitás: friss picker opciók + szerveri defaults pre-selection.\n */\n async handleOpenCreate(): Promise<void> {\n await this.consultant_DS.loadPickerOptions();\n const defaults: { providerInstanceId: string; model: string } = this.consultant_DS.defaults_$();\n const providers: string[] = this.providerOptions_$();\n if (defaults.providerInstanceId.length > 0 && providers.includes(defaults.providerInstanceId)) {\n const models: string[] = Con_PickerModel_Util.collectSortedModelsForProvider(\n this.consultant_DS.pickerOptions_$(),\n defaults.providerInstanceId,\n );\n if (defaults.model.length > 0 && models.includes(defaults.model)) {\n this.newProvider_$.set(defaults.providerInstanceId);\n this.newModel_$.set(defaults.model);\n } else {\n this.newProvider_$.set(defaults.providerInstanceId);\n this.newModel_$.set(models[0] ?? '');\n }\n } else {\n const firstP: string = providers[0] ?? '';\n this.newProvider_$.set(firstP);\n const fallbackModels: string[] = Con_PickerModel_Util.collectSortedModelsForProvider(\n this.consultant_DS.pickerOptions_$(),\n firstP,\n );\n this.newModel_$.set(fallbackModels[0] ?? '');\n }\n this.newLabel_$.set('');\n this.isCreateOpen_$.set(true);\n }\n\n /**\n * Új thread modál bezárása.\n */\n handleCloseCreate(): void {\n this.isCreateOpen_$.set(false);\n }\n\n /**\n * Provider váltás — modell lista első elemére állítás.\n */\n handleProviderChange(value: string): void {\n this.newProvider_$.set(value);\n const models: string[] = Con_PickerModel_Util.collectSortedModelsForProvider(\n this.consultant_DS.pickerOptions_$(),\n value,\n );\n this.newModel_$.set(models[0] ?? '');\n }\n\n /**\n * Új consultant thread létrehozása a kiválasztott provider/model párossal.\n */\n async handleCreateThread(): Promise<void> {\n const provider: string = this.newProvider_$().trim();\n const model: string = this.newModel_$().trim();\n if (!provider.length || !model.length) {\n return;\n }\n this.isCreating_$.set(true);\n try {\n const label: string = this.newLabel_$().trim();\n const id: string = await this.consultant_DS.createThread({\n label: label.length > 0 ? label : undefined,\n providerInstanceId: provider,\n model: model,\n });\n this.isCreateOpen_$.set(false);\n if (id.length > 0) {\n void this.router.navigate(['/consultant', id]);\n }\n } finally {\n this.isCreating_$.set(false);\n }\n }\n\n // ── Context menu handlers ────────────────────────────────────\n\n /** Shared list row contextMenu output kezelése. */\n handleRowContextMenu(payload: { event: MouseEvent; id: string }): void {\n const thread: CCAP_ConsultantThreadSummary_Client_Interface | undefined =\n this.consultant_DS.threads_$().find(\n (t: CCAP_ConsultantThreadSummary_Client_Interface): boolean => t.threadId === payload.id,\n );\n if (!thread) {\n return;\n }\n this.ctxMenuThread_$.set(thread);\n this.ctxMenuPos_$.set({ x: payload.event.clientX, y: payload.event.clientY });\n }\n\n /** Kontextmenü bezárása. */\n handleCloseCtxMenu(): void {\n this.ctxMenuThread_$.set(null);\n }\n\n /** Delete a kontextmenüből. */\n async handleCtxDelete(): Promise<void> {\n const thread: CCAP_ConsultantThreadSummary_Client_Interface | null = this.ctxMenuThread_$();\n if (!thread) {\n return;\n }\n this.handleCloseCtxMenu();\n try {\n await this.consultant_DS.deleteThread(thread.threadId);\n void this.router.navigate(['/consultant']);\n } catch {\n // Hibát a data service kezeli\n }\n }\n}\n", "<div class=\"flex flex-col flex-1 min-h-0\">\n <div class=\"shrink-0 p-2 border-b border-neonDefault flex items-center gap-2\">\n <span class=\"text-xs font-semibold text-neutral-300 flex-1 truncate\">Consultant</span>\n <button\n type=\"button\"\n class=\"px-2 py-1 text-xs border border-neonDefault text-neutral-300 hover:bg-neutral-700 rounded transition-colors\"\n (click)=\"handleOpenCreate()\">\n + New\n </button>\n </div>\n\n <div class=\"flex-1 overflow-y-auto\">\n @if (consultant_DS.threadsLoading_$()) {\n <div class=\"p-3 text-xs text-neutral-500\">Loading...</div>\n } @else if (threadRowViews_$().length) {\n @for (row of threadRowViews_$(); track row.id) {\n <app-s-session-info-card\n [view]=\"row\"\n [isActive]=\"consultant_DS.activeThreadId_$() === row.id\"\n (selected)=\"handleSelectThread($event)\"\n (contextMenu)=\"handleRowContextMenu($event)\" />\n }\n } @else {\n <div class=\"p-4 text-center text-neutral-500 text-xs\">No threads</div>\n }\n </div>\n</div>\n\n@if (isCreateOpen_$()) {\n <div class=\"fixed inset-0 z-40 flex items-center justify-center bg-black/60 p-4\" (click)=\"handleCloseCreate()\">\n <div\n class=\"w-full max-w-md rounded-lg border border-neonDefault bg-neutral-900 p-4 shadow-xl\"\n (click)=\"$event.stopPropagation()\">\n <h3 class=\"text-sm font-semibold text-neutral-200 mb-3\">New consultant thread</h3>\n <div class=\"flex flex-col gap-2 text-xs\">\n <label class=\"text-neutral-400\">Label (optional)</label>\n <input\n class=\"w-full px-2 py-1 rounded bg-neutral-800 border border-neutral-600 text-neutral-200\"\n [ngModel]=\"newLabel_$()\"\n (ngModelChange)=\"newLabel_$.set($event)\" />\n\n <label class=\"text-neutral-400\">Provider</label>\n <select\n class=\"w-full px-2 py-1 rounded bg-neutral-800 border border-neutral-600 text-neutral-200\"\n [ngModel]=\"newProvider_$()\"\n (ngModelChange)=\"handleProviderChange($event)\">\n @for (p of providerOptions_$(); track p) {\n <option [value]=\"p\">{{ providerDisplayLabelsMap_$()[p] || p }}</option>\n }\n </select>\n\n <label class=\"text-neutral-400\">Model</label>\n <select\n class=\"w-full px-2 py-1 rounded bg-neutral-800 border border-neutral-600 text-neutral-200\"\n [ngModel]=\"newModel_$()\"\n (ngModelChange)=\"newModel_$.set($event)\">\n @for (m of modelsForNewProvider_$(); track m) {\n <option [value]=\"m\">{{ m }}</option>\n }\n </select>\n </div>\n <div class=\"flex justify-end gap-2 mt-4\">\n <button\n type=\"button\"\n class=\"px-2 py-1 text-xs border border-neutral-600 text-neutral-400 rounded\"\n (click)=\"handleCloseCreate()\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"px-2 py-1 text-xs border border-neonDefault text-neutral-200 rounded disabled:opacity-40\"\n [disabled]=\"isCreating_$() || !newProvider_$().trim() || !newModel_$().trim()\"\n (click)=\"handleCreateThread()\">\n Create\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- Context menu overlay -->\n@if (ctxMenuThread_$(); as ctxThread) {\n <div class=\"fixed inset-0 z-40\" (click)=\"handleCloseCtxMenu()\"></div>\n <div class=\"fixed z-50 min-w-[140px] bg-neutral-900 border border-neutral-700 rounded-lg shadow-xl py-1 text-xs\"\n [style.left.px]=\"ctxMenuPos_$().x\"\n [style.top.px]=\"ctxMenuPos_$().y\">\n <button\n class=\"w-full text-left px-3 py-1.5 text-red-400 hover:bg-red-500/10 transition-colors\"\n (click)=\"handleCtxDelete()\">\n Delete\n </button>\n </div>\n}\n", "import { Component, OnInit, signal } from '@angular/core';\n\nimport { Con_InputStorage_Util } from '../../_collections/con-input-storage.util';\nimport {\n SESSION_SHELL_SIDEBAR_DEFAULT_WIDTH_PX,\n SESSION_SHELL_SIDEBAR_MAX_WIDTH_PX,\n SESSION_SHELL_SIDEBAR_MIN_WIDTH_PX,\n} from '../../../shared/_collections/consts/session-detail-panel-layout.const';\nimport { SHR_DocumentPointerDrag_Util } from '../../../shared/_collections/utils/shr-document-pointer-drag.util';\n\n/**\n * Consultant POC shell: resizable bal lista + router-outlet (OC/CC session minta).\n */\n@Component({\n selector: 'app-ccap-consultant-shell',\n templateUrl: './con-shell.component.html',\n host: { class: 'flex min-h-0 w-full flex-1 flex-col overflow-hidden' },\n})\n/** Con_Shell_Component class. */\nexport class Con_Shell_Component implements OnInit {\n\n /** Bal sidebar szélessége (px). */\n readonly sidebarWidth_$ = signal<number>(SESSION_SHELL_SIDEBAR_DEFAULT_WIDTH_PX);\n\n /** Sidebar látható. */\n readonly isSidebarOpen_$ = signal<boolean>(true);\n\n /** Resize közben select-none a root-on. */\n readonly isResizing_$ = signal<boolean>(false);\n\n ngOnInit(): void {\n const stored: number = Con_InputStorage_Util.loadPanelWidth(\n 'sidebar',\n SESSION_SHELL_SIDEBAR_DEFAULT_WIDTH_PX,\n );\n this.sidebarWidth_$.set(\n Math.max(\n SESSION_SHELL_SIDEBAR_MIN_WIDTH_PX,\n Math.min(SESSION_SHELL_SIDEBAR_MAX_WIDTH_PX, stored),\n ),\n );\n this.isSidebarOpen_$.set(Con_InputStorage_Util.loadPanelOpen('sidebar', true));\n }\n\n /**\n * Sidebar resize drag indítása.\n */\n handleSidebarResizeStart(event: PointerEvent): void {\n const startX: number = event.clientX;\n const startWidth: number = this.sidebarWidth_$();\n this.isResizing_$.set(true);\n SHR_DocumentPointerDrag_Util.attachUntilPointerUp({\n startEvent: event,\n onMove: (e: PointerEvent): void => {\n const delta: number = e.clientX - startX;\n const newWidth: number = Math.max(\n SESSION_SHELL_SIDEBAR_MIN_WIDTH_PX,\n Math.min(SESSION_SHELL_SIDEBAR_MAX_WIDTH_PX, startWidth + delta),\n );\n this.sidebarWidth_$.set(newWidth);\n },\n onEnd: (): void => {\n this.isResizing_$.set(false);\n Con_InputStorage_Util.savePanelWidth('sidebar', this.sidebarWidth_$());\n },\n });\n }\n\n /**\n * Sidebar ki/be — állapot mentése.\n */\n handleToggleSidebar(): void {\n this.isSidebarOpen_$.update((v: boolean): boolean => !v);\n Con_InputStorage_Util.savePanelOpen('sidebar', this.isSidebarOpen_$());\n }\n}\n", "<div class=\"flex min-h-0 w-full flex-1 flex-col overflow-hidden\" [class.select-none]=\"isResizing_$()\">\n <app-s-session-shell-toolbar>\n <div sSessionToolbarLeft class=\"flex items-center gap-1 min-w-0\">\n <button\n type=\"button\"\n class=\"px-2 py-1 text-xs border border-neonDefault text-neutral-300 hover:bg-neutral-700 rounded transition-colors flex items-center gap-1 shrink-0\"\n (click)=\"handleToggleSidebar()\">\n <svg\n class=\"w-3 h-3 shrink-0 transition-transform duration-150\"\n [class.rotate-90]=\"isSidebarOpen_$()\"\n [class.-rotate-90]=\"!isSidebarOpen_$()\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n Consultant\n </button>\n </div>\n <div sSessionToolbarCenter class=\"min-w-0\"></div>\n <div sSessionToolbarRight class=\"min-w-0\"></div>\n </app-s-session-shell-toolbar>\n\n <app-s-resizable-session-shell-layout\n [isSidebarOpen]=\"isSidebarOpen_$()\"\n [sidebarWidthPx]=\"sidebarWidth_$()\"\n [isResizing]=\"isResizing_$()\"\n (sidebarResizeStart)=\"handleSidebarResizeStart($event)\">\n <div sSessionShellSidebar class=\"flex flex-col overflow-hidden h-full\">\n <app-ccap-consultant-dashboard />\n </div>\n <div\n sSessionShellMain\n class=\"flex min-h-0 flex-1 flex-col overflow-hidden [&>router-outlet]:contents\">\n <router-outlet />\n </div>\n </app-s-resizable-session-shell-layout>\n</div>\n", "import { CCAP_AgentConsoleBubbleKind_Type } from '../../../_enums/shared/ccap-agent-console-bubble-kind.enum';\nimport { CCAP_AgentConsoleBubbleView_Interface } from '../../../_models/interfaces/shared/ccap-agent-console-bubble-view.interface';\nimport { CCAP_ConsultantMessage_Client_Interface } from '../../../_models/interfaces/consultant/ccap-consultant-client.interface';\n\n/**\n * Consultant üzenet → közös buborék view-model.\n */\nexport class Con_MsgToBubbleView_Util {\n\n /**\n * Consultant thread üzenet mapelése.\n */\n static fromMessage(msg: CCAP_ConsultantMessage_Client_Interface): CCAP_AgentConsoleBubbleView_Interface {\n const isUser: boolean = msg.role === 'user';\n const bodyText: string = isUser\n ? Con_MsgToBubbleView_Util.buildUserBodyText(msg)\n : (msg.content ?? '');\n return {\n listKey: msg.id,\n kind: isUser ? CCAP_AgentConsoleBubbleKind_Type.userPrompt : CCAP_AgentConsoleBubbleKind_Type.assistant,\n bodyText: bodyText,\n isUserAligned: isUser,\n flags: {\n showCopy: true,\n showRawInfo: false,\n useEditDiffForExpandable: false,\n },\n };\n }\n\n /**\n * User sor: nyers szöveg + több userPart esetén attachment jelölés (régi detail megjelenítés).\n */\n private static buildUserBodyText(msg: CCAP_ConsultantMessage_Client_Interface): string {\n const raw: string = (msg.rawUserText ?? '').trim();\n const hasParts: boolean = (msg.userParts?.length ?? 0) > 1;\n if (hasParts) {\n return raw.length > 0 ? `${raw}\\n[attachments]` : '[attachments]';\n }\n if (raw.length > 0) {\n return raw;\n }\n return msg.content ?? '';\n }\n}\n", "import {\n Component,\n computed,\n effect,\n inject,\n OnDestroy,\n signal,\n ViewChild,\n WritableSignal,\n} from '@angular/core';\nimport { ActivatedRoute, ParamMap, Router } from '@angular/router';\n\nimport { map } from 'rxjs';\n\nimport { DyNX_SubscriptionControl } from '@futdevpro/ngx-dynamo';\n\nimport { Consultant_DataService } from '../../_services/consultant.data-service';\nimport { VNP_InputUi_DataService } from '../../../dev/_modules/poc/_modules/voice-notes-poc/_services/vnp-input-ui.data-service';\nimport {\n S_SessionInput_Component,\n} from '../../../shared/_components/session-ui/s-session-input/s-session-input.component';\nimport { Con_PickerModel_Util } from '../../_collections/con-picker-model.util';\nimport {\n CCAP_PendingAttachment_Interface,\n} from '../../../../_models/interfaces/session/ccap-pending-attachment.interface';\nimport {\n CCAP_ConsultantMessage_Client_Interface,\n} from '../../../../_models/interfaces/consultant/ccap-consultant-client.interface';\nimport { CCAP_AgentConsoleBubbleView_Interface } from '../../../../_models/interfaces/shared/ccap-agent-console-bubble-view.interface';\nimport { Con_MsgToBubbleView_Util } from '../../_collections/con-msg-to-bubble-view.util';\n\n/**\n * Consultant chat részletek: üzenetek, composer, modellváltás.\n */\n@Component({\n selector: 'app-ccap-consultant-detail',\n templateUrl: './con-detail.component.html',\n host: { class: 'flex flex-col flex-1 min-h-0 overflow-hidden' },\n})\n/** Con_Detail_Component class. */\nexport class Con_Detail_Component extends DyNX_SubscriptionControl implements OnDestroy {\n\n readonly consultant_DS: Consultant_DataService = inject(Consultant_DataService);\n private readonly route: ActivatedRoute = inject(ActivatedRoute);\n private readonly router: Router = inject(Router);\n private readonly voiceInputUi_DS: VNP_InputUi_DataService =\n inject(VNP_InputUi_DataService);\n\n /** Shared session input komponens referencia (clearAttachments küldés után). */\n @ViewChild(S_SessionInput_Component) private sessionInputRef: S_SessionInput_Component | undefined;\n\n readonly composerText_$: WritableSignal<string> = signal<string>('');\n readonly allowWebSearch_$: WritableSignal<boolean> = signal<boolean>(false);\n\n readonly localLabel_$: WritableSignal<string> = signal<string>('');\n readonly localProvider_$: WritableSignal<string> = signal<string>('');\n readonly localModel_$: WritableSignal<string> = signal<string>('');\n\n /**\n * Provider opciók a szerveri picker listából (SSOT: data service).\n */\n readonly providerOptions_$ = computed((): string[] => {\n return Con_PickerModel_Util.collectSortedProviders(this.consultant_DS.pickerOptions_$());\n });\n\n /**\n * Model lista a kiválasztott providerhez (SSOT: shared util, template-ben nincs method hívás).\n */\n readonly modelsForSelectedProvider_$ = computed((): string[] => {\n return Con_PickerModel_Util.collectSortedModelsForProvider(\n this.consultant_DS.pickerOptions_$(),\n this.localProvider_$(),\n );\n });\n\n /**\n * Thread üzenetek buborék view-modelje (track: listKey = message id).\n */\n readonly consultantBubbleViews_$ = computed((): CCAP_AgentConsoleBubbleView_Interface[] => {\n const t = this.consultant_DS.selectedThread_$();\n if (!t) {\n return [];\n }\n return t.messages.map(\n (m: CCAP_ConsultantMessage_Client_Interface): CCAP_AgentConsoleBubbleView_Interface =>\n Con_MsgToBubbleView_Util.fromMessage(m),\n );\n });\n\n /** Shared input komponensből érkező attachment-ek (küldéshez konvertáljuk). */\n private pendingAttachments: CCAP_PendingAttachment_Interface[] = [];\n\n constructor() {\n super();\n this.addSubscription(this.route.paramMap.pipe(\n map((pm: ParamMap): string => pm.get('threadId') ?? ''),\n ).subscribe((threadId: string): void => {\n if (threadId.length > 0) {\n void this.consultant_DS.loadThreadDetail(threadId);\n } else {\n this.consultant_DS.selectedThread_$.set(null);\n this.consultant_DS.activeThreadId_$.set('');\n }\n }));\n\n effect((): void => {\n const t = this.consultant_DS.selectedThread_$();\n if (t != null) {\n this.localLabel_$.set(t.label);\n this.localProvider_$.set(t.providerInstanceId);\n this.localModel_$.set(t.model);\n }\n }, { allowSignalWrites: true });\n\n void this.consultant_DS.loadPickerOptions();\n }\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n handleProviderChange(value: string): void {\n this.localProvider_$.set(value);\n const models: string[] = Con_PickerModel_Util.collectSortedModelsForProvider(\n this.consultant_DS.pickerOptions_$(),\n value,\n );\n const cur: string = this.localModel_$();\n if (!models.includes(cur)) {\n this.localModel_$.set(models[0] ?? '');\n }\n }\n\n async handleApplyConfig(): Promise<void> {\n const threadId: string = this.consultant_DS.activeThreadId_$();\n if (!threadId.length) {\n return;\n }\n await this.consultant_DS.updateThreadConfig({\n threadId: threadId,\n label: this.localLabel_$(),\n providerInstanceId: this.localProvider_$(),\n model: this.localModel_$(),\n });\n }\n\n async handleDeleteThread(): Promise<void> {\n const threadId: string = this.consultant_DS.activeThreadId_$();\n if (!threadId.length) {\n return;\n }\n await this.consultant_DS.deleteThread(threadId);\n void this.router.navigate(['/consultant']);\n }\n\n /**\n * Shared input komponens attachment lista változás.\n */\n handleAttachmentsChanged(attachments: CCAP_PendingAttachment_Interface[]): void {\n this.pendingAttachments = attachments;\n }\n\n /**\n * Voice szegmens transcribe: akkumuláció + auto-send csak isFinal=true esetén.\n */\n handleVoiceSegment(event: { text: string; isFinal: boolean }): void {\n const t: string = event.text.trim();\n if (!t.length) {\n return;\n }\n const current: string = this.composerText_$().trim();\n this.composerText_$.set(current.length > 0 ? `${current} ${t}` : t);\n if (this.voiceInputUi_DS.autoSendAfterVoice_$() && event.isFinal) {\n void this.handleSend();\n }\n }\n\n /**\n * Üzenet küldése — pending attachment-eket consultant API formátumra konvertálja.\n */\n async handleSend(): Promise<void> {\n const threadId: string = this.consultant_DS.activeThreadId_$();\n if (!threadId.length) {\n return;\n }\n const text: string = this.composerText_$().trim();\n const currentAttachments: CCAP_PendingAttachment_Interface[] = [...this.pendingAttachments];\n if (!text.length && !currentAttachments.length) {\n return;\n }\n const attachments: Record<string, unknown>[] = currentAttachments.map(\n (a: CCAP_PendingAttachment_Interface): Record<string, unknown> => ({\n kind: a.isImage ? 'image' : 'textDocument',\n mimeType: a.mimeType,\n fileName: a.fileName,\n dataBase64: a.base64,\n }),\n );\n await this.consultant_DS.sendMessage({\n threadId: threadId,\n text: text,\n allowWebSearch: this.allowWebSearch_$(),\n attachments: attachments,\n });\n this.composerText_$.set('');\n this.pendingAttachments = [];\n this.sessionInputRef?.clearAttachments();\n }\n\n}\n", "@if (!consultant_DS.activeThreadId_$()) {\n <div class=\"flex flex-1 items-center justify-center p-4 text-xs text-neutral-500\">\n Select a thread or create a new consultant chat.\n </div>\n} @else if (consultant_DS.selectedThreadLoading_$()) {\n <div class=\"flex flex-1 items-center justify-center text-xs text-neutral-500\">Loading…</div>\n} @else {\n @if (consultant_DS.selectedThread_$()) {\n <app-s-session-chat-column-layout>\n <div\n sChatColumnHeader\n class=\"flex shrink-0 flex-col gap-2 border-b border-neonDefault bg-ccapSurface p-2\">\n <div class=\"flex flex-wrap items-end gap-2\">\n <div class=\"flex flex-col gap-0.5\">\n <span class=\"text-[10px] text-neutral-500\">Label</span>\n <input\n class=\"w-40 rounded border border-neutral-600 bg-neutral-800 px-2 py-1 text-xs text-neutral-200\"\n [ngModel]=\"localLabel_$()\"\n (ngModelChange)=\"localLabel_$.set($event)\" />\n </div>\n <div class=\"flex flex-col gap-0.5\">\n <span class=\"text-[10px] text-neutral-500\">Provider</span>\n <select\n class=\"w-36 rounded border border-neutral-600 bg-neutral-800 px-2 py-1 text-xs text-neutral-200\"\n [ngModel]=\"localProvider_$()\"\n (ngModelChange)=\"handleProviderChange($event)\">\n @for (p of providerOptions_$(); track p) {\n <option [value]=\"p\">{{ p }}</option>\n }\n </select>\n </div>\n <div class=\"flex flex-col gap-0.5\">\n <span class=\"text-[10px] text-neutral-500\">Model</span>\n <select\n class=\"w-40 rounded border border-neutral-600 bg-neutral-800 px-2 py-1 text-xs text-neutral-200\"\n [ngModel]=\"localModel_$()\"\n (ngModelChange)=\"localModel_$.set($event)\">\n @for (m of modelsForSelectedProvider_$(); track m) {\n <option [value]=\"m\">{{ m }}</option>\n }\n </select>\n </div>\n <button\n type=\"button\"\n class=\"rounded border border-neonDefault px-2 py-1 text-xs text-neutral-300\"\n (click)=\"handleApplyConfig()\">\n Apply\n </button>\n <button\n type=\"button\"\n class=\"ml-auto rounded border border-red-900 px-2 py-1 text-xs text-red-300\"\n (click)=\"handleDeleteThread()\">\n Delete\n </button>\n </div>\n </div>\n\n <div sChatColumnScroll class=\"flex flex-col gap-3 p-3\">\n @for (row of consultantBubbleViews_$(); track row.listKey) {\n <div\n class=\"max-w-[85%]\"\n [class.self-end]=\"row.isUserAligned === true\"\n [class.self-start]=\"row.isUserAligned !== true\">\n <app-s-agent-console-message-bubble [view]=\"row\" />\n </div>\n }\n </div>\n\n <div sChatColumnComposer class=\"flex flex-col\">\n <label class=\"flex cursor-pointer items-center gap-2 px-2 pt-1 text-[10px] text-neutral-400\">\n <input type=\"checkbox\" [ngModel]=\"allowWebSearch_$()\" (ngModelChange)=\"allowWebSearch_$.set($event)\" />\n Allow web search (Brave)\n </label>\n <app-s-session-input\n [draftText]=\"composerText_$()\"\n (draftTextChange)=\"composerText_$.set($event)\"\n [isSending]=\"consultant_DS.sending_$()\"\n [enableAttachments]=\"true\"\n acceptedFileTypes=\"image/png,image/jpeg,image/webp,image/gif,.txt,.md,text/plain,text/markdown\"\n placeholder=\"Message…\"\n [textareaRows]=\"3\"\n (sendRequested)=\"handleSend()\"\n (attachmentsChanged)=\"handleAttachmentsChanged($event)\">\n <app-ccap-voice-record-button\n sInputTextareaAccessory\n [compactLayout]=\"true\"\n (transcriptSegmentReady)=\"handleVoiceSegment($event)\">\n </app-ccap-voice-record-button>\n </app-s-session-input>\n </div>\n </app-s-session-chat-column-layout>\n } @else {\n <div class=\"flex flex-1 items-center justify-center p-4 text-xs text-neutral-500\">\n Thread not loaded.\n </div>\n }\n}\n", "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { RouterModule, Routes } from '@angular/router';\n\nimport { CCAP_ErrorDisplay_Component } from '../../_components/ccap-error-display/ccap-error-display.component';\nimport { CCAP_VoiceRecordButton_Component } from '../../_components/ccap-voice-record-button/ccap-voice-record-button.component';\nimport { Shared_Module } from '../shared/shared.module';\nimport { Con_Shell_Component } from './_components/ccap-consultant-shell/con-shell.component';\nimport { Con_Dashboard_Component } from './_components/ccap-consultant-dashboard/con-dashboard.component';\nimport { Con_Detail_Component } from './_components/ccap-consultant-detail/con-detail.component';\n\nconst consultantRoutes: Routes = [\n {\n path: '',\n component: Con_Shell_Component,\n children: [\n { path: '', component: Con_Detail_Component },\n { path: ':threadId', component: Con_Detail_Component },\n ],\n },\n];\n\n/**\n * Consultant POC modul: egyszerű chat, provider/modell, mellékletek.\n */\n@NgModule({\n declarations: [\n Con_Shell_Component,\n Con_Dashboard_Component,\n Con_Detail_Component,\n ],\n imports: [\n CommonModule,\n FormsModule,\n RouterModule.forChild(consultantRoutes),\n CCAP_ErrorDisplay_Component,\n CCAP_VoiceRecordButton_Component,\n Shared_Module,\n ],\n})\n/** Consultant_Module class. */\nexport class Consultant_Module {}\n"],
5
+ "mappings": "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",
6
6
  "names": ["STORAGE_PREFIX", "Con_InputStorage_Util", "savePanelOpen", "panelKey", "isOpen", "Shr_LocalStoragePersistence_Util", "writeBoolean", "loadPanelOpen", "defaultOpen", "readBoolean", "savePanelWidth", "width", "writeNumber", "loadPanelWidth", "defaultWidth", "readNumber", "Consultant_ApiService", "baseUrl", "environment", "api", "http", "inject", "HttpClient", "listThreads", "firstValueFrom", "get", "getPickerOptions", "createThread", "params", "post", "getThread", "threadId", "encodeURIComponent", "patchThread", "body", "label", "providerInstanceId", "model", "patch", "deleteThread", "delete", "postMessage", "text", "allowWebSearch", "attachments", "factory", "\u0275fac", "providedIn", "Consultant_DataService", "consultant_AS", "inject", "Consultant_ApiService", "globalError_CS", "CCAP_GlobalError_ControlService", "threads_$", "signal", "threadsLoading_$", "threadsError_$", "selectedThread_$", "selectedThreadLoading_$", "selectedThreadError_$", "sending_$", "activeThreadId_$", "defaults_$", "providerInstanceId", "model", "pickerOptions_$", "pickerOptionsLoading_$", "loadPickerOptions", "__async", "set", "res", "getPickerOptions", "entries", "Array", "isArray", "map", "parseRegistryEntry", "filter", "e", "defaults", "err", "showError", "loadThreads", "listThreads", "mapped", "threads", "row", "threadId", "label", "messageCount", "updatedAt", "loadThreadDetail", "getThread", "detail", "parseThreadDetail", "thread", "sendMessage", "params", "threadRaw", "postMessage", "isPlainRecord", "updateThreadConfig", "patchThread", "createThread", "idRaw", "deleteThread", "raw", "length", "messagesRaw", "messages", "m", "id", "roleRaw", "role", "msg", "rawUserText", "content", "upRaw", "userParts", "parts", "p", "t", "type", "part", "text", "imageUrl", "push", "value", "provider", "modelName", "capsRaw", "capabilities", "c", "undefined", "enabled", "factory", "\u0275fac", "providedIn", "Con_PickerModel_Util", "collectSortedProviders", "entries", "set", "Set", "e", "prov", "provider", "trim", "length", "add", "sort", "collectSortedModelsForProvider", "p", "names", "mn", "modelName", "push", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275listener", "$event", "\u0275\u0275restoreView", "_r1", "ctx_r1", "\u0275\u0275nextContext", "\u0275\u0275resetView", "handleSelectThread", "handleRowContextMenu", "\u0275\u0275property", "row_r3", "consultant_DS", "activeThreadId_$", "id", "\u0275\u0275repeaterCreate", "Con_Dashboard_Component_Conditional_8_For_1_Template", "_forTrack0", "\u0275\u0275repeater", "threadRowViews_$", "p_r5", "\u0275\u0275advance", "\u0275\u0275textInterpolate", "providerDisplayLabelsMap_$", "m_r6", "_r4", "handleCloseCreate", "i0", "stopPropagation", "newLabel_$", "set", "handleProviderChange", "Con_Dashboard_Component_Conditional_10_For_12_Template", "\u0275\u0275repeaterTrackByIdentity", "newModel_$", "Con_Dashboard_Component_Conditional_10_For_17_Template", "handleCreateThread", "newProvider_$", "providerOptions_$", "modelsForNewProvider_$", "isCreating_$", "trim", "_r7", "handleCloseCtxMenu", "handleCtxDelete", "\u0275\u0275styleProp", "ctxMenuPos_$", "x", "y", "Con_Dashboard_Component", "inject", "Consultant_DataService", "router", "Router", "modelRegistry_DS", "ModelRegistry_DataService", "isCreateOpen_$", "signal", "computed", "Con_PickerModel_Util", "collectSortedProviders", "pickerOptions_$", "collectSortedModelsForProvider", "config", "setupConfigForRegistry_$", "providers", "m", "p", "ProviderDisplayLabel_Util", "getProviderDisplayLabel", "threadProviderDisplayLabels_$", "ids", "Set", "t", "threads_$", "providerInstanceId", "length", "add", "map", "threadId", "label", "status", "statusColorClass", "isArchived", "lastActivityAt", "updatedAt", "isRunning", "ctxMenuThread_$", "ngOnInit", "loadThreads", "loadPickerOptions", "loadSetupConfigForRegistry", "navigate", "handleOpenCreate", "__async", "defaults", "defaults_$", "includes", "models", "model", "firstP", "fallbackModels", "value", "provider", "createThread", "undefined", "payload", "thread", "find", "event", "clientX", "clientY", "deleteThread", "selectors", "hostAttrs", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275template", "Con_Dashboard_Component_Conditional_7_Template", "Con_Dashboard_Component_Conditional_8_Template", "Con_Dashboard_Component_Conditional_9_Template", "Con_Dashboard_Component_Conditional_10_Template", "Con_Dashboard_Component_Conditional_11_Template", "\u0275\u0275conditional", "threadsLoading_$", "tmp_2_0", "Con_Shell_Component", "sidebarWidth_$", "signal", "SESSION_SHELL_SIDEBAR_DEFAULT_WIDTH_PX", "isSidebarOpen_$", "isResizing_$", "ngOnInit", "stored", "Con_InputStorage_Util", "loadPanelWidth", "set", "Math", "max", "SESSION_SHELL_SIDEBAR_MIN_WIDTH_PX", "min", "SESSION_SHELL_SIDEBAR_MAX_WIDTH_PX", "loadPanelOpen", "handleSidebarResizeStart", "event", "startX", "clientX", "startWidth", "SHR_DocumentPointerDrag_Util", "attachUntilPointerUp", "startEvent", "onMove", "e", "delta", "newWidth", "onEnd", "savePanelWidth", "handleToggleSidebar", "update", "v", "savePanelOpen", "selectors", "hostAttrs", "decls", "vars", "consts", "template", "rf", "ctx", "\u0275\u0275elementStart", "\u0275\u0275listener", "\u0275\u0275element", "\u0275\u0275elementEnd", "\u0275\u0275text", "$event", "\u0275\u0275classProp", "\u0275\u0275advance", "\u0275\u0275property", "Con_MsgToBubbleView_Util", "fromMessage", "msg", "isUser", "role", "bodyText", "buildUserBodyText", "content", "listKey", "id", "kind", "CCAP_AgentConsoleBubbleKind_Type", "userPrompt", "assistant", "isUserAligned", "flags", "showCopy", "showRawInfo", "useEditDiffForExpandable", "raw", "rawUserText", "trim", "userParts", "length", "\u0275\u0275elementStart", "\u0275\u0275text", "\u0275\u0275elementEnd", "\u0275\u0275property", "p_r3", "\u0275\u0275advance", "\u0275\u0275textInterpolate", "m_r4", "\u0275\u0275element", "\u0275\u0275classProp", "row_r5", "isUserAligned", "\u0275\u0275listener", "$event", "\u0275\u0275restoreView", "_r1", "ctx_r1", "\u0275\u0275nextContext", "\u0275\u0275resetView", "localLabel_$", "set", "handleProviderChange", "\u0275\u0275repeaterCreate", "Con_Detail_Component_Conditional_2_Conditional_0_For_12_Template", "\u0275\u0275repeaterTrackByIdentity", "localModel_$", "Con_Detail_Component_Conditional_2_Conditional_0_For_18_Template", "handleApplyConfig", "handleDeleteThread", "Con_Detail_Component_Conditional_2_Conditional_0_For_25_Template", "_forTrack0", "allowWebSearch_$", "composerText_$", "handleSend", "handleAttachmentsChanged", "handleVoiceSegment", "localProvider_$", "\u0275\u0275repeater", "providerOptions_$", "modelsForSelectedProvider_$", "consultantBubbleViews_$", "consultant_DS", "sending_$", "\u0275\u0275template", "Con_Detail_Component_Conditional_2_Conditional_0_Template", "Con_Detail_Component_Conditional_2_Conditional_1_Template", "\u0275\u0275conditional", "selectedThread_$", "Con_Detail_Component", "DyNX_SubscriptionControl", "inject", "Consultant_DataService", "route", "ActivatedRoute", "router", "Router", "voiceInputUi_DS", "VNP_InputUi_DataService", "sessionInputRef", "signal", "computed", "Con_PickerModel_Util", "collectSortedProviders", "pickerOptions_$", "collectSortedModelsForProvider", "t", "messages", "map", "m", "Con_MsgToBubbleView_Util", "fromMessage", "pendingAttachments", "constructor", "addSubscription", "paramMap", "pipe", "pm", "get", "subscribe", "threadId", "length", "loadThreadDetail", "activeThreadId_$", "effect", "label", "providerInstanceId", "model", "allowSignalWrites", "loadPickerOptions", "ngOnDestroy", "value", "models", "cur", "includes", "__async", "updateThreadConfig", "deleteThread", "navigate", "attachments", "event", "text", "trim", "current", "autoSendAfterVoice_$", "isFinal", "currentAttachments", "a", "kind", "isImage", "mimeType", "fileName", "dataBase64", "base64", "sendMessage", "allowWebSearch", "clearAttachments", "selectors", "viewQuery", "rf", "ctx", "S_SessionInput_Component", "Con_Detail_Component_Conditional_0_Template", "Con_Detail_Component_Conditional_1_Template", "Con_Detail_Component_Conditional_2_Template", "selectedThreadLoading_$", "consultantRoutes", "path", "component", "Con_Shell_Component", "children", "Con_Detail_Component", "Consultant_Module", "CommonModule", "FormsModule", "RouterModule", "forChild", "CCAP_ErrorDisplay_Component", "CCAP_VoiceRecordButton_Component", "Shared_Module"]
7
7
  }