@genexus/genexus-ide-ui 1.0.48 → 1.0.50

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 (227) hide show
  1. package/dist/{esm/MERCURY_ASSETS-91a1db9c.js → cjs/MERCURY_ASSETS-ac982891.js} +2 -4
  2. package/dist/cjs/MERCURY_ASSETS-ac982891.js.map +1 -0
  3. package/dist/cjs/assets-manager-7227a74b.js +7 -0
  4. package/dist/cjs/assets-manager-7227a74b.js.map +1 -0
  5. package/dist/cjs/code-render-9b3efb53.js +50 -0
  6. package/dist/cjs/code-render-9b3efb53.js.map +1 -0
  7. package/dist/cjs/genexus-ide-ui.cjs.js +1 -1
  8. package/dist/cjs/gx-ide-ai-message.cjs.entry.js +3 -2
  9. package/dist/cjs/gx-ide-ai-message.cjs.entry.js.map +1 -1
  10. package/dist/cjs/gx-ide-chat-container.cjs.entry.js +62 -0
  11. package/dist/cjs/gx-ide-chat-container.cjs.entry.js.map +1 -0
  12. package/dist/cjs/gx-ide-create-kb-from-server.cjs.entry.js +4 -3
  13. package/dist/cjs/gx-ide-create-kb-from-server.cjs.entry.js.map +1 -1
  14. package/dist/cjs/gx-ide-current-user-info.cjs.entry.js +3 -2
  15. package/dist/cjs/gx-ide-current-user-info.cjs.entry.js.map +1 -1
  16. package/dist/cjs/gx-ide-dashboard-home.cjs.entry.js +3 -2
  17. package/dist/cjs/gx-ide-dashboard-home.cjs.entry.js.map +1 -1
  18. package/dist/cjs/gx-ide-data-selector.cjs.entry.js +3 -2
  19. package/dist/cjs/gx-ide-data-selector.cjs.entry.js.map +1 -1
  20. package/dist/cjs/gx-ide-data-type-selector.cjs.entry.js +3 -2
  21. package/dist/cjs/gx-ide-data-type-selector.cjs.entry.js.map +1 -1
  22. package/dist/cjs/gx-ide-design-import.cjs.entry.js +8 -7
  23. package/dist/cjs/gx-ide-design-import.cjs.entry.js.map +1 -1
  24. package/dist/cjs/gx-ide-entity-selector.cjs.entry.js +4 -3
  25. package/dist/cjs/gx-ide-entity-selector.cjs.entry.js.map +1 -1
  26. package/dist/cjs/gx-ide-kb-manager-export.cjs.entry.js +7 -6
  27. package/dist/cjs/gx-ide-kb-manager-export.cjs.entry.js.map +1 -1
  28. package/dist/cjs/gx-ide-kb-manager-import.cjs.entry.js +6 -5
  29. package/dist/cjs/gx-ide-kb-manager-import.cjs.entry.js.map +1 -1
  30. package/dist/cjs/gx-ide-manage-module-references-v2.cjs.entry.js +4 -3
  31. package/dist/cjs/gx-ide-manage-module-references-v2.cjs.entry.js.map +1 -1
  32. package/dist/cjs/gx-ide-manage-module-references.cjs.entry.js +4 -3
  33. package/dist/cjs/gx-ide-manage-module-references.cjs.entry.js.map +1 -1
  34. package/dist/cjs/gx-ide-new-kb.cjs.entry.js +3 -2
  35. package/dist/cjs/gx-ide-new-kb.cjs.entry.js.map +1 -1
  36. package/dist/cjs/gx-ide-object-selector.cjs.entry.js +4 -3
  37. package/dist/cjs/gx-ide-object-selector.cjs.entry.js.map +1 -1
  38. package/dist/cjs/gx-ide-sc-chat-container.cjs.entry.js +286 -0
  39. package/dist/cjs/gx-ide-sc-chat-container.cjs.entry.js.map +1 -0
  40. package/dist/cjs/gx-ide-share-kb.cjs.entry.js +3 -2
  41. package/dist/cjs/gx-ide-share-kb.cjs.entry.js.map +1 -1
  42. package/dist/cjs/gx-ide-start-page.cjs.entry.js +6 -5
  43. package/dist/cjs/gx-ide-start-page.cjs.entry.js.map +1 -1
  44. package/dist/cjs/gx-ide-welcome-page.cjs.entry.js +3 -2
  45. package/dist/cjs/gx-ide-welcome-page.cjs.entry.js.map +1 -1
  46. package/dist/cjs/gx-ide-ww-attributes.cjs.entry.js +3 -2
  47. package/dist/cjs/gx-ide-ww-attributes.cjs.entry.js.map +1 -1
  48. package/dist/cjs/index.cjs.js +9 -0
  49. package/dist/cjs/index.cjs.js.map +1 -1
  50. package/dist/cjs/loader.cjs.js +1 -1
  51. package/dist/collection/collection-manifest.json +3 -1
  52. package/dist/collection/components/_helpers/chat-container/chat-container.css +178 -0
  53. package/dist/collection/components/_helpers/chat-container/chat-container.js +137 -0
  54. package/dist/collection/components/_helpers/chat-container/chat-container.js.map +1 -0
  55. package/dist/collection/components/_helpers/chat-container/code-render.js +42 -0
  56. package/dist/collection/components/_helpers/chat-container/code-render.js.map +1 -0
  57. package/dist/collection/index.js +1 -0
  58. package/dist/collection/index.js.map +1 -1
  59. package/dist/collection/showcase/chat-container/callbacks.js +247 -0
  60. package/dist/collection/showcase/chat-container/callbacks.js.map +1 -0
  61. package/dist/collection/showcase/chat-container/chat-showcase.css +4 -0
  62. package/dist/collection/showcase/chat-container/chat.showcase.js +57 -0
  63. package/dist/collection/showcase/chat-container/chat.showcase.js.map +1 -0
  64. package/dist/collection/testing/locale.e2e.js +4 -0
  65. package/dist/collection/testing/locale.e2e.js.map +1 -1
  66. package/dist/components/MERCURY_ASSETS.js +0 -4
  67. package/dist/components/MERCURY_ASSETS.js.map +1 -1
  68. package/dist/components/ai-message.js +2 -1
  69. package/dist/components/ai-message.js.map +1 -1
  70. package/dist/components/assets-manager.js +5 -0
  71. package/dist/components/assets-manager.js.map +1 -0
  72. package/dist/components/chat-container.js +78 -0
  73. package/dist/components/chat-container.js.map +1 -0
  74. package/dist/components/code-render.js +47 -0
  75. package/dist/components/code-render.js.map +1 -0
  76. package/dist/components/entity-selector.js +2 -1
  77. package/dist/components/entity-selector.js.map +1 -1
  78. package/dist/components/gx-ide-chat-container.d.ts +11 -0
  79. package/dist/components/gx-ide-chat-container.js +8 -0
  80. package/dist/components/gx-ide-chat-container.js.map +1 -0
  81. package/dist/components/gx-ide-create-kb-from-server.js +2 -1
  82. package/dist/components/gx-ide-create-kb-from-server.js.map +1 -1
  83. package/dist/components/gx-ide-current-user-info.js +2 -1
  84. package/dist/components/gx-ide-current-user-info.js.map +1 -1
  85. package/dist/components/gx-ide-dashboard-home.js +2 -1
  86. package/dist/components/gx-ide-dashboard-home.js.map +1 -1
  87. package/dist/components/gx-ide-data-selector.js +2 -1
  88. package/dist/components/gx-ide-data-selector.js.map +1 -1
  89. package/dist/components/gx-ide-data-type-selector.js +2 -1
  90. package/dist/components/gx-ide-data-type-selector.js.map +1 -1
  91. package/dist/components/gx-ide-design-import.js +2 -1
  92. package/dist/components/gx-ide-design-import.js.map +1 -1
  93. package/dist/components/gx-ide-kb-manager-export.js +2 -1
  94. package/dist/components/gx-ide-kb-manager-export.js.map +1 -1
  95. package/dist/components/gx-ide-kb-manager-import.js +2 -1
  96. package/dist/components/gx-ide-kb-manager-import.js.map +1 -1
  97. package/dist/components/gx-ide-manage-module-references-v2.js +2 -1
  98. package/dist/components/gx-ide-manage-module-references-v2.js.map +1 -1
  99. package/dist/components/gx-ide-manage-module-references.js +2 -1
  100. package/dist/components/gx-ide-manage-module-references.js.map +1 -1
  101. package/dist/components/gx-ide-new-kb.js +2 -1
  102. package/dist/components/gx-ide-new-kb.js.map +1 -1
  103. package/dist/components/gx-ide-object-selector.js +2 -1
  104. package/dist/components/gx-ide-object-selector.js.map +1 -1
  105. package/dist/components/gx-ide-sc-chat-container.d.ts +11 -0
  106. package/dist/components/gx-ide-sc-chat-container.js +308 -0
  107. package/dist/components/gx-ide-sc-chat-container.js.map +1 -0
  108. package/dist/components/gx-ide-share-kb.js +2 -1
  109. package/dist/components/gx-ide-share-kb.js.map +1 -1
  110. package/dist/components/gx-ide-start-page.js +2 -1
  111. package/dist/components/gx-ide-start-page.js.map +1 -1
  112. package/dist/components/gx-ide-welcome-page.js +2 -1
  113. package/dist/components/gx-ide-welcome-page.js.map +1 -1
  114. package/dist/components/gx-ide-ww-attributes.js +2 -1
  115. package/dist/components/gx-ide-ww-attributes.js.map +1 -1
  116. package/dist/components/index.js +2 -0
  117. package/dist/components/index.js.map +1 -1
  118. package/dist/{cjs/MERCURY_ASSETS-fbc83c8c.js → esm/MERCURY_ASSETS-9e4e8ebc.js} +1 -7
  119. package/dist/esm/MERCURY_ASSETS-9e4e8ebc.js.map +1 -0
  120. package/dist/esm/assets-manager-0d129105.js +5 -0
  121. package/dist/esm/assets-manager-0d129105.js.map +1 -0
  122. package/dist/esm/code-render-79798e42.js +47 -0
  123. package/dist/esm/code-render-79798e42.js.map +1 -0
  124. package/dist/esm/genexus-ide-ui.js +1 -1
  125. package/dist/esm/gx-ide-ai-message.entry.js +2 -1
  126. package/dist/esm/gx-ide-ai-message.entry.js.map +1 -1
  127. package/dist/esm/gx-ide-chat-container.entry.js +58 -0
  128. package/dist/esm/gx-ide-chat-container.entry.js.map +1 -0
  129. package/dist/esm/gx-ide-create-kb-from-server.entry.js +2 -1
  130. package/dist/esm/gx-ide-create-kb-from-server.entry.js.map +1 -1
  131. package/dist/esm/gx-ide-current-user-info.entry.js +2 -1
  132. package/dist/esm/gx-ide-current-user-info.entry.js.map +1 -1
  133. package/dist/esm/gx-ide-dashboard-home.entry.js +2 -1
  134. package/dist/esm/gx-ide-dashboard-home.entry.js.map +1 -1
  135. package/dist/esm/gx-ide-data-selector.entry.js +2 -1
  136. package/dist/esm/gx-ide-data-selector.entry.js.map +1 -1
  137. package/dist/esm/gx-ide-data-type-selector.entry.js +2 -1
  138. package/dist/esm/gx-ide-data-type-selector.entry.js.map +1 -1
  139. package/dist/esm/gx-ide-design-import.entry.js +2 -1
  140. package/dist/esm/gx-ide-design-import.entry.js.map +1 -1
  141. package/dist/esm/gx-ide-entity-selector.entry.js +2 -1
  142. package/dist/esm/gx-ide-entity-selector.entry.js.map +1 -1
  143. package/dist/esm/gx-ide-kb-manager-export.entry.js +2 -1
  144. package/dist/esm/gx-ide-kb-manager-export.entry.js.map +1 -1
  145. package/dist/esm/gx-ide-kb-manager-import.entry.js +2 -1
  146. package/dist/esm/gx-ide-kb-manager-import.entry.js.map +1 -1
  147. package/dist/esm/gx-ide-manage-module-references-v2.entry.js +2 -1
  148. package/dist/esm/gx-ide-manage-module-references-v2.entry.js.map +1 -1
  149. package/dist/esm/gx-ide-manage-module-references.entry.js +2 -1
  150. package/dist/esm/gx-ide-manage-module-references.entry.js.map +1 -1
  151. package/dist/esm/gx-ide-new-kb.entry.js +2 -1
  152. package/dist/esm/gx-ide-new-kb.entry.js.map +1 -1
  153. package/dist/esm/gx-ide-object-selector.entry.js +2 -1
  154. package/dist/esm/gx-ide-object-selector.entry.js.map +1 -1
  155. package/dist/esm/gx-ide-sc-chat-container.entry.js +282 -0
  156. package/dist/esm/gx-ide-sc-chat-container.entry.js.map +1 -0
  157. package/dist/esm/gx-ide-share-kb.entry.js +2 -1
  158. package/dist/esm/gx-ide-share-kb.entry.js.map +1 -1
  159. package/dist/esm/gx-ide-start-page.entry.js +2 -1
  160. package/dist/esm/gx-ide-start-page.entry.js.map +1 -1
  161. package/dist/esm/gx-ide-welcome-page.entry.js +2 -1
  162. package/dist/esm/gx-ide-welcome-page.entry.js.map +1 -1
  163. package/dist/esm/gx-ide-ww-attributes.entry.js +2 -1
  164. package/dist/esm/gx-ide-ww-attributes.entry.js.map +1 -1
  165. package/dist/esm/index.js +4 -0
  166. package/dist/esm/index.js.map +1 -1
  167. package/dist/esm/loader.js +1 -1
  168. package/dist/genexus-ide-ui/genexus-ide-ui.esm.js +1 -1
  169. package/dist/genexus-ide-ui/genexus-ide-ui.esm.js.map +1 -1
  170. package/dist/genexus-ide-ui/index.esm.js +6 -0
  171. package/dist/genexus-ide-ui/index.esm.js.map +1 -1
  172. package/dist/genexus-ide-ui/{p-aa324232.entry.js → p-1a629aa9.entry.js} +4 -2
  173. package/dist/genexus-ide-ui/{p-aa324232.entry.js.map → p-1a629aa9.entry.js.map} +1 -1
  174. package/dist/genexus-ide-ui/{p-18317dd7.entry.js → p-1e29cd30.entry.js} +4 -2
  175. package/dist/genexus-ide-ui/{p-18317dd7.entry.js.map → p-1e29cd30.entry.js.map} +1 -1
  176. package/dist/genexus-ide-ui/{p-af05e095.entry.js → p-1ea6c3fe.entry.js} +13 -11
  177. package/dist/genexus-ide-ui/{p-af05e095.entry.js.map → p-1ea6c3fe.entry.js.map} +1 -1
  178. package/dist/genexus-ide-ui/{p-a1c5775d.entry.js → p-2145674e.entry.js} +4 -2
  179. package/dist/genexus-ide-ui/{p-a1c5775d.entry.js.map → p-2145674e.entry.js.map} +1 -1
  180. package/dist/genexus-ide-ui/{p-ec6129c7.entry.js → p-2cefd33a.entry.js} +4 -2
  181. package/dist/genexus-ide-ui/{p-ec6129c7.entry.js.map → p-2cefd33a.entry.js.map} +1 -1
  182. package/dist/genexus-ide-ui/{p-f252dd07.entry.js → p-36fecdcb.entry.js} +10 -8
  183. package/dist/genexus-ide-ui/{p-f252dd07.entry.js.map → p-36fecdcb.entry.js.map} +1 -1
  184. package/dist/genexus-ide-ui/{p-f827b9b8.entry.js → p-3ca45936.entry.js} +4 -2
  185. package/dist/genexus-ide-ui/{p-f827b9b8.entry.js.map → p-3ca45936.entry.js.map} +1 -1
  186. package/dist/genexus-ide-ui/{p-a8739942.entry.js → p-440742f3.entry.js} +4 -2
  187. package/dist/genexus-ide-ui/{p-a8739942.entry.js.map → p-440742f3.entry.js.map} +1 -1
  188. package/dist/genexus-ide-ui/{p-a40648dc.entry.js → p-442e30e3.entry.js} +4 -2
  189. package/dist/genexus-ide-ui/{p-a40648dc.entry.js.map → p-442e30e3.entry.js.map} +1 -1
  190. package/dist/genexus-ide-ui/{p-2dcfa6ef.entry.js → p-47d4ec9a.entry.js} +33 -31
  191. package/dist/genexus-ide-ui/{p-2dcfa6ef.entry.js.map → p-47d4ec9a.entry.js.map} +1 -1
  192. package/dist/genexus-ide-ui/p-6e4208d8.js +9 -0
  193. package/dist/genexus-ide-ui/p-6e4208d8.js.map +1 -0
  194. package/dist/genexus-ide-ui/{p-64f2a9f4.entry.js → p-7be438dc.entry.js} +10 -8
  195. package/dist/genexus-ide-ui/{p-64f2a9f4.entry.js.map → p-7be438dc.entry.js.map} +1 -1
  196. package/dist/genexus-ide-ui/p-8558e873.entry.js +224 -0
  197. package/dist/genexus-ide-ui/p-8558e873.entry.js.map +1 -0
  198. package/dist/genexus-ide-ui/{p-8cebb078.entry.js → p-8942f4b6.entry.js} +4 -2
  199. package/dist/genexus-ide-ui/{p-8cebb078.entry.js.map → p-8942f4b6.entry.js.map} +1 -1
  200. package/dist/genexus-ide-ui/{p-9e34f166.entry.js → p-9cfd7800.entry.js} +4 -2
  201. package/dist/genexus-ide-ui/{p-9e34f166.entry.js.map → p-9cfd7800.entry.js.map} +1 -1
  202. package/dist/genexus-ide-ui/{p-1986d34d.js → p-ad5caf61.js} +1 -10
  203. package/dist/genexus-ide-ui/p-ad5caf61.js.map +1 -0
  204. package/dist/genexus-ide-ui/{p-c1162623.entry.js → p-b1eb312d.entry.js} +15 -13
  205. package/dist/genexus-ide-ui/{p-c1162623.entry.js.map → p-b1eb312d.entry.js.map} +1 -1
  206. package/dist/genexus-ide-ui/p-c1791757.entry.js +87 -0
  207. package/dist/genexus-ide-ui/p-c1791757.entry.js.map +1 -0
  208. package/dist/genexus-ide-ui/{p-1feae6ef.entry.js → p-c4c48a1e.entry.js} +4 -2
  209. package/dist/genexus-ide-ui/{p-1feae6ef.entry.js.map → p-c4c48a1e.entry.js.map} +1 -1
  210. package/dist/genexus-ide-ui/{p-e4bbec21.entry.js → p-cfef5956.entry.js} +4 -2
  211. package/dist/genexus-ide-ui/{p-e4bbec21.entry.js.map → p-cfef5956.entry.js.map} +1 -1
  212. package/dist/genexus-ide-ui/{p-92c51f3e.entry.js → p-e14affde.entry.js} +4 -2
  213. package/dist/genexus-ide-ui/{p-92c51f3e.entry.js.map → p-e14affde.entry.js.map} +1 -1
  214. package/dist/genexus-ide-ui/p-f3f1e1f6.js +68 -0
  215. package/dist/genexus-ide-ui/p-f3f1e1f6.js.map +1 -0
  216. package/dist/genexus-ide-ui/{p-0c60c76f.entry.js → p-f7d2a39a.entry.js} +11 -9
  217. package/dist/genexus-ide-ui/{p-0c60c76f.entry.js.map → p-f7d2a39a.entry.js.map} +1 -1
  218. package/dist/types/components/_helpers/chat-container/chat-container.d.ts +23 -0
  219. package/dist/types/components/_helpers/chat-container/code-render.d.ts +4 -0
  220. package/dist/types/components.d.ts +54 -0
  221. package/dist/types/index.d.ts +1 -0
  222. package/dist/types/showcase/chat-container/callbacks.d.ts +6 -0
  223. package/dist/types/showcase/chat-container/chat.showcase.d.ts +6 -0
  224. package/package.json +1 -1
  225. package/dist/cjs/MERCURY_ASSETS-fbc83c8c.js.map +0 -1
  226. package/dist/esm/MERCURY_ASSETS-91a1db9c.js.map +0 -1
  227. package/dist/genexus-ide-ui/p-1986d34d.js.map +0 -1
@@ -0,0 +1,178 @@
1
+ .chat-container {
2
+ display: grid;
3
+ block-size: 100%;
4
+ overflow: auto;
5
+ grid-template-rows: max-content 1fr max-content;
6
+ gap: var(--mer-spacing--xs);
7
+ padding: var(--mer-spacing--xs);
8
+ position: relative;
9
+ --chat-common-border-radius: var(--mer-spacing--2xs);
10
+ }
11
+
12
+ .section {
13
+ display: contents;
14
+ }
15
+
16
+ .chat-container__header {
17
+ padding: var(--mer-spacing--2xs) var(--mer-spacing--2xs) var(--mer-spacing--2xs) var(--mer-spacing--sm);
18
+ display: flex;
19
+ align-items: center;
20
+ gap: var(--mer-spacing--sm);
21
+ justify-content: space-between;
22
+ }
23
+
24
+ .chat-container__ch-chat {
25
+ overflow: auto;
26
+ position: relative;
27
+ display: grid;
28
+ }
29
+
30
+ .chat-container__header,
31
+ .chat-container__footer {
32
+ padding: var(--mer-spacing--2xs) var(--mer-spacing--2xs) var(--mer-spacing--2xs) var(--mer-spacing--sm);
33
+ border-radius: var(--chat-common-border-radius);
34
+ }
35
+
36
+ .chat-container__conversation-copied {
37
+ position: absolute;
38
+ z-index: 1;
39
+ inline-size: 100%;
40
+ block-size: 100%;
41
+ background: rgba(22, 22, 23, 0.75);
42
+ backdrop-filter: saturate(180%) blur(20px);
43
+ display: grid;
44
+ align-items: center;
45
+ justify-content: center;
46
+ text-align: center;
47
+ padding: 32px;
48
+ --mer-icon__box--md: 18px;
49
+ pointer-events: none;
50
+ overflow: hidden;
51
+ animation: fadeIn 100ms ease-in-out forwards;
52
+ opacity: 0;
53
+ }
54
+
55
+ .chat-container__conversation-copied-wrapper {
56
+ display: flex;
57
+ align-items: center;
58
+ gap: var(--mer-spacing--sm);
59
+ }
60
+
61
+ .chat-container__conversation-copied-wrapper {
62
+ animation: liftUp var(--mer-timing--fast) ease-in-out forwards;
63
+ inset-block-start: 4px;
64
+ opacity: 0;
65
+ animation-delay: var(--mer-timing--fast);
66
+ position: relative;
67
+ }
68
+
69
+ @keyframes fadeIn {
70
+ from {
71
+ opacity: 0;
72
+ }
73
+ to {
74
+ opacity: 1;
75
+ }
76
+ }
77
+ @keyframes liftUp {
78
+ from {
79
+ opacity: 0;
80
+ inset-block-start: 4px;
81
+ }
82
+ to {
83
+ opacity: 1;
84
+ inset-block-start: 0;
85
+ }
86
+ }
87
+ .chat::part(message) {
88
+ position: relative;
89
+ --copy-button-opacity: 0;
90
+ --copied-to-clipboard-opacity: 0;
91
+ --date-opacity: 1;
92
+ }
93
+
94
+ .chat::part(message__time),
95
+ .chat::part(message__copy-button) {
96
+ transition: opacity var(--mer-timing--super-fast) ease-in-out;
97
+ }
98
+
99
+ .chat::part(message__time) {
100
+ opacity: var(--date-opacity);
101
+ }
102
+
103
+ .chat::part(message):hover {
104
+ position: relative;
105
+ --copy-button-opacity: 1;
106
+ --date-opacity: 0;
107
+ }
108
+
109
+ .chat::part(message__copy-button) {
110
+ position: absolute;
111
+ z-index: 1;
112
+ inset-inline-end: 0;
113
+ padding: var(--mer-spacing--sm);
114
+ transition: opacity var(--mer-timing--fast) ease-in-out;
115
+ opacity: var(--copy-button-opacity);
116
+ }
117
+ .chat::part(message__copy-button)::after {
118
+ content: "";
119
+ inline-size: var(--mer-icon__box--md);
120
+ block-size: var(--mer-icon__box--md);
121
+ background: no-repeat center/var(--mer-icon__size--md) var(--icon-path);
122
+ --icon-path: var(--icon__system_copy_primary--enabled);
123
+ }
124
+ .chat::part(message__copy-button):hover::after {
125
+ --icon-path: var(--icon__system_copy_primary--hover);
126
+ }
127
+ .chat::part(message__copy-button):active::after {
128
+ --icon-path: var(--icon__system_copy_primary--active);
129
+ }
130
+
131
+ .chat::part(message__copied-feedback) {
132
+ transition: opacity 150ms ease-in-out;
133
+ position: absolute;
134
+ inline-size: 100%;
135
+ block-size: 100%;
136
+ display: flex;
137
+ align-items: center;
138
+ justify-content: center;
139
+ z-index: 2;
140
+ background: rgba(22, 22, 23, 0.8);
141
+ backdrop-filter: saturate(180%) blur(20px);
142
+ opacity: var(--copied-to-clipboard-opacity);
143
+ pointer-events: none;
144
+ }
145
+
146
+ .chat::part(message__copied-feedback-visible) {
147
+ --copied-to-clipboard-opacity: 1;
148
+ pointer-events: visible;
149
+ }
150
+
151
+ .chat::part(send-container) {
152
+ gap: var(--mer-spacing--xs);
153
+ }
154
+
155
+ .chat::part(send-input) {
156
+ --control__padding-block: 7px !important;
157
+ }
158
+
159
+ .chat::part(send-button) {
160
+ border-width: var(--control__border-width);
161
+ border-style: var(--control__border-style);
162
+ border-color: var(--control__border-color);
163
+ border-radius: var(--control__border-radius);
164
+ inline-size: 32px;
165
+ block-size: 32px;
166
+ background: no-repeat center/var(--mer-icon__box--md) var(--icon-path);
167
+ --icon-path: var(--icon__system_send_primary--enabled);
168
+ }
169
+
170
+ .chat::part(send-button):hover {
171
+ --icon-path: var(--icon__system_send_primary--hover);
172
+ --control__border-color: var(--mer-text__primary--hover);
173
+ }
174
+
175
+ .chat::part(send-button):active {
176
+ --icon-path: var(--icon__system_send_primary--active);
177
+ --control__border-color: var(--mer-border-color__primary--active);
178
+ }
@@ -0,0 +1,137 @@
1
+ import { Host, h } from "@stencil/core";
2
+ import { getIconPath } from "@genexus/mercury";
3
+ const CSS_BUNDLES = [
4
+ "resets/box-sizing",
5
+ "utils/typography",
6
+ "chameleon/scrollbar",
7
+ "components/button",
8
+ "components/icon",
9
+ "utils/elevation"
10
+ ];
11
+ const COPY_ICON = getIconPath({
12
+ category: "system",
13
+ name: "copy",
14
+ colorType: "neutral"
15
+ });
16
+ const DELETE_ICON = getIconPath({
17
+ category: "system",
18
+ name: "delete-outlined",
19
+ colorType: "error"
20
+ });
21
+ const CONVERSATION_ICON = getIconPath({
22
+ category: "objects",
23
+ name: "conversational-flows"
24
+ });
25
+ export class GxIdeChatContainer {
26
+ constructor() {
27
+ this.chatTitle = undefined;
28
+ this.copyConversationCallback = undefined;
29
+ this.deleteConversationCallback = undefined;
30
+ this.displayConversationCopiedMessage = false;
31
+ }
32
+ /**
33
+ * It will display a feedback message that the conversation has been copied
34
+ */
35
+ async showCopyConversationMessage() {
36
+ this.displayConversationCopiedMessage = true;
37
+ setTimeout(() => {
38
+ this.displayConversationCopiedMessage = false;
39
+ }, 2000);
40
+ }
41
+ render() {
42
+ const renderHeader = this.chatTitle ||
43
+ this.copyConversationCallback ||
44
+ this.deleteConversationCallback;
45
+ const renderButtonsGroup = this.copyConversationCallback || this.deleteConversationCallback;
46
+ return (h(Host, { class: "chat-container" }, h("ch-theme", { model: CSS_BUNDLES }), h("section", { class: "section" }, renderHeader && (h("header", { class: "chat-container__header elevation-1 body-italic-m" }, this.chatTitle && this.chatTitle, renderButtonsGroup && (h("div", { class: "buttons-spacer" }, this.deleteConversationCallback && (h("button", { class: "button-secondary button-icon-only", onClick: this.deleteConversationCallback }, h("ch-image", { class: "icon-md", src: DELETE_ICON }))), this.copyConversationCallback && (h("button", { class: "button-secondary button-icon-only", onClick: this.copyConversationCallback }, h("ch-image", { class: "icon-md", src: COPY_ICON }))))))), h("section", { class: "chat-container__ch-chat" }, h("slot", null), this.displayConversationCopiedMessage && (h("div", { class: "chat-container__conversation-copied" }, h("div", { class: "chat-container__conversation-copied-wrapper" }, h("ch-image", { class: "icon-md", src: CONVERSATION_ICON }), h("p", { class: "body-regular-l" }, "conversation copied"))))))));
47
+ }
48
+ static get is() { return "gx-ide-chat-container"; }
49
+ static get originalStyleUrls() {
50
+ return {
51
+ "$": ["chat-container.scss"]
52
+ };
53
+ }
54
+ static get styleUrls() {
55
+ return {
56
+ "$": ["chat-container.css"]
57
+ };
58
+ }
59
+ static get properties() {
60
+ return {
61
+ "chatTitle": {
62
+ "type": "string",
63
+ "mutable": false,
64
+ "complexType": {
65
+ "original": "string",
66
+ "resolved": "string",
67
+ "references": {}
68
+ },
69
+ "required": false,
70
+ "optional": true,
71
+ "docs": {
72
+ "tags": [],
73
+ "text": "The chat title"
74
+ },
75
+ "attribute": "chat-title",
76
+ "reflect": false
77
+ },
78
+ "copyConversationCallback": {
79
+ "type": "unknown",
80
+ "mutable": false,
81
+ "complexType": {
82
+ "original": "() => void",
83
+ "resolved": "() => void",
84
+ "references": {}
85
+ },
86
+ "required": false,
87
+ "optional": false,
88
+ "docs": {
89
+ "tags": [],
90
+ "text": "If true a button for copying the conversation will be render on the header"
91
+ }
92
+ },
93
+ "deleteConversationCallback": {
94
+ "type": "unknown",
95
+ "mutable": false,
96
+ "complexType": {
97
+ "original": "() => void",
98
+ "resolved": "() => void",
99
+ "references": {}
100
+ },
101
+ "required": false,
102
+ "optional": false,
103
+ "docs": {
104
+ "tags": [],
105
+ "text": "If true a button for deleting the conversation will be render on the header"
106
+ }
107
+ }
108
+ };
109
+ }
110
+ static get states() {
111
+ return {
112
+ "displayConversationCopiedMessage": {}
113
+ };
114
+ }
115
+ static get methods() {
116
+ return {
117
+ "showCopyConversationMessage": {
118
+ "complexType": {
119
+ "signature": "() => Promise<void>",
120
+ "parameters": [],
121
+ "references": {
122
+ "Promise": {
123
+ "location": "global",
124
+ "id": "global::Promise"
125
+ }
126
+ },
127
+ "return": "Promise<void>"
128
+ },
129
+ "docs": {
130
+ "text": "It will display a feedback message that the conversation has been copied",
131
+ "tags": []
132
+ }
133
+ }
134
+ };
135
+ }
136
+ }
137
+ //# sourceMappingURL=chat-container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-container.js","sourceRoot":"","sources":["../../../../src/components/_helpers/chat-container/chat-container.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAkB,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/D,MAAM,WAAW,GAAmB;IAClC,mBAAmB;IACnB,kBAAkB;IAClB,qBAAqB;IACrB,mBAAmB;IACnB,iBAAiB;IACjB,iBAAiB;CAClB,CAAC;AAEF,MAAM,SAAS,GAAG,WAAW,CAAC;IAC5B,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,SAAS;CACrB,CAAC,CAAC;AACH,MAAM,WAAW,GAAG,WAAW,CAAC;IAC9B,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAE,iBAAiB;IACvB,SAAS,EAAE,OAAO;CACnB,CAAC,CAAC;AACH,MAAM,iBAAiB,GAAG,WAAW,CAAC;IACpC,QAAQ,EAAE,SAAS;IACnB,IAAI,EAAE,sBAAsB;CAC7B,CAAC,CAAC;AAOH,MAAM,OAAO,kBAAkB;;;;;gDAmBwB,KAAK;;IAE1D;;OAEG;IAEH,KAAK,CAAC,2BAA2B;QAC/B,IAAI,CAAC,gCAAgC,GAAG,IAAI,CAAC;QAC7C,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,gCAAgC,GAAG,KAAK,CAAC;QAChD,CAAC,EAAE,IAAI,CAAC,CAAC;IACX,CAAC;IAED,MAAM;QACJ,MAAM,YAAY,GAChB,IAAI,CAAC,SAAS;YACd,IAAI,CAAC,wBAAwB;YAC7B,IAAI,CAAC,0BAA0B,CAAC;QAElC,MAAM,kBAAkB,GACtB,IAAI,CAAC,wBAAwB,IAAI,IAAI,CAAC,0BAA0B,CAAC;QACnE,OAAO,CACL,EAAC,IAAI,IAAC,KAAK,EAAC,gBAAgB;YAC1B,gBAAU,KAAK,EAAE,WAAW,GAAa;YACzC,eAAS,KAAK,EAAC,SAAS;gBACrB,YAAY,IAAI,CACf,cAAQ,KAAK,EAAC,kDAAkD;oBAC7D,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS;oBAEhC,kBAAkB,IAAI,CACrB,WAAK,KAAK,EAAC,gBAAgB;wBACxB,IAAI,CAAC,0BAA0B,IAAI,CAClC,cACE,KAAK,EAAC,mCAAmC,EACzC,OAAO,EAAE,IAAI,CAAC,0BAA0B;4BAExC,gBAAU,KAAK,EAAC,SAAS,EAAC,GAAG,EAAE,WAAW,GAAa,CAChD,CACV;wBAEA,IAAI,CAAC,wBAAwB,IAAI,CAChC,cACE,KAAK,EAAC,mCAAmC,EACzC,OAAO,EAAE,IAAI,CAAC,wBAAwB;4BAEtC,gBAAU,KAAK,EAAC,SAAS,EAAC,GAAG,EAAE,SAAS,GAAa,CAC9C,CACV,CACG,CACP,CACM,CACV;gBACD,eAAS,KAAK,EAAC,yBAAyB;oBACtC,eAAa;oBACZ,IAAI,CAAC,gCAAgC,IAAI,CACxC,WAAK,KAAK,EAAC,qCAAqC;wBAC9C,WAAK,KAAK,EAAC,6CAA6C;4BACtD,gBAAU,KAAK,EAAC,SAAS,EAAC,GAAG,EAAE,iBAAiB,GAAa;4BAC7D,SAAG,KAAK,EAAC,gBAAgB,0BAAwB,CAC7C,CACF,CACP,CACO,CAEF,CACL,CACR,CAAC;IACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACF","sourcesContent":["import { Component, Host, h, Prop, Method, State } from \"@stencil/core\";\nimport { MercuryBundles, getIconPath } from \"@genexus/mercury\";\n\nconst CSS_BUNDLES: MercuryBundles = [\n \"resets/box-sizing\",\n \"utils/typography\",\n \"chameleon/scrollbar\",\n \"components/button\",\n \"components/icon\",\n \"utils/elevation\"\n];\n\nconst COPY_ICON = getIconPath({\n category: \"system\",\n name: \"copy\",\n colorType: \"neutral\"\n});\nconst DELETE_ICON = getIconPath({\n category: \"system\",\n name: \"delete-outlined\",\n colorType: \"error\"\n});\nconst CONVERSATION_ICON = getIconPath({\n category: \"objects\",\n name: \"conversational-flows\"\n});\n\n@Component({\n tag: \"gx-ide-chat-container\",\n styleUrl: \"chat-container.scss\",\n shadow: false\n})\nexport class GxIdeChatContainer {\n /**\n * The chat title\n */\n @Prop() readonly chatTitle?: string;\n\n /**\n * If true a button for copying the conversation will be render on the header\n */\n @Prop() readonly copyConversationCallback: () => void;\n\n /**\n * If true a button for deleting the conversation will be render on the header\n */\n @Prop() readonly deleteConversationCallback: () => void;\n\n /**\n * Coneration Copied\n */\n @State() displayConversationCopiedMessage: boolean = false;\n\n /**\n * It will display a feedback message that the conversation has been copied\n */\n @Method()\n async showCopyConversationMessage() {\n this.displayConversationCopiedMessage = true;\n setTimeout(() => {\n this.displayConversationCopiedMessage = false;\n }, 2000);\n }\n\n render() {\n const renderHeader =\n this.chatTitle ||\n this.copyConversationCallback ||\n this.deleteConversationCallback;\n\n const renderButtonsGroup =\n this.copyConversationCallback || this.deleteConversationCallback;\n return (\n <Host class=\"chat-container\">\n <ch-theme model={CSS_BUNDLES}></ch-theme>\n <section class=\"section\">\n {renderHeader && (\n <header class=\"chat-container__header elevation-1 body-italic-m\">\n {this.chatTitle && this.chatTitle}\n\n {renderButtonsGroup && (\n <div class=\"buttons-spacer\">\n {this.deleteConversationCallback && (\n <button\n class=\"button-secondary button-icon-only\"\n onClick={this.deleteConversationCallback}\n >\n <ch-image class=\"icon-md\" src={DELETE_ICON}></ch-image>\n </button>\n )}\n\n {this.copyConversationCallback && (\n <button\n class=\"button-secondary button-icon-only\"\n onClick={this.copyConversationCallback}\n >\n <ch-image class=\"icon-md\" src={COPY_ICON}></ch-image>\n </button>\n )}\n </div>\n )}\n </header>\n )}\n <section class=\"chat-container__ch-chat\">\n <slot></slot>\n {this.displayConversationCopiedMessage && (\n <div class=\"chat-container__conversation-copied\">\n <div class=\"chat-container__conversation-copied-wrapper\">\n <ch-image class=\"icon-md\" src={CONVERSATION_ICON}></ch-image>\n <p class=\"body-regular-l\">conversation copied</p>\n </div>\n </div>\n )}\n </section>\n {/* <footer class=\"chat-container__footer elevation-1\">footer</footer> */}\n </section>\n </Host>\n );\n }\n}\n"]}
@@ -0,0 +1,42 @@
1
+ import { h } from "@stencil/core";
2
+ import { getIconPath } from "@genexus/mercury";
3
+ getIconPath;
4
+ const MESSAGE_COPIED_PART_SELECTOR = "message__copied-feedback";
5
+ const MESSAGE_COPIED_VISIBLE_PART_SELECTOR = "message__copied-feedback-visible";
6
+ const copy = (text) => (event) => {
7
+ event.stopPropagation();
8
+ // 1. Copy message
9
+ navigator.clipboard.writeText(text);
10
+ // 2. Display "copied" message (expects to be the next sibling!)
11
+ const copiedFeedbackRef = event.target
12
+ .nextSibling;
13
+ const copiedFeedbackPart = copiedFeedbackRef.getAttribute("part");
14
+ if (copiedFeedbackPart === MESSAGE_COPIED_PART_SELECTOR) {
15
+ copiedFeedbackRef.setAttribute("part", `${MESSAGE_COPIED_PART_SELECTOR} ${MESSAGE_COPIED_VISIBLE_PART_SELECTOR}`);
16
+ setTimeout(() => {
17
+ copiedFeedbackRef.setAttribute("part", `${MESSAGE_COPIED_PART_SELECTOR}`);
18
+ }, 1000);
19
+ }
20
+ };
21
+ const copyButton = (textToCopy, accessibleName, additionalPart) => {
22
+ return (h("button", { "aria-label": accessibleName, title: accessibleName, class: "button-copy-code", type: "button", onClick: copy(textToCopy), part: `message__copy-button ${additionalPart}` }));
23
+ };
24
+ export const mercuryCodeRender = (copyButtonAccessibleName) => (options) => (h("div", { class: "code-block-container" }, h("div", { class: "code-block-header" }, copyButton(options.plainText, copyButtonAccessibleName, "code-render")), h("ch-code", { language: options.language, lastNestedChildClass: options.lastNestedChildClass, value: options.plainText })));
25
+ export const mercuryChatMessageRender = (theme) => (messageModel) => messageModel.role === "assistant" && messageModel.status === "waiting"
26
+ ? [
27
+ h("span", { part: "message__processing" }, "Processing request"),
28
+ h("div", { class: "processing-animation", part: "processing-animation" })
29
+ ]
30
+ : [
31
+ // "copy button" before "role" and "time" to hide both on button:focus
32
+ copyButton(messageModel.content, "Copy code", "common-message"),
33
+ h("p", { part: MESSAGE_COPIED_PART_SELECTOR }, "message copied to clipboard"),
34
+ h("span", { part: `message__role ${messageModel.role}` }, messageModel.role === "user" ? "You" : "GeneXus Code Fixer"),
35
+ h("time", { dateTime: messageModel.metadata, part: "message__time" }, messageModel.metadata),
36
+ messageModel.role === "user" ? (h("span", { part: "message__content user" }, messageModel.content)) : (h("ch-markdown-viewer", { part: messageModel.role === "assistant" &&
37
+ (messageModel.status === "complete" || !messageModel.status) &&
38
+ !messageModel.parts
39
+ ? `message__content no-error`
40
+ : "message__content", theme: theme, showIndicator: false, renderCode: mercuryCodeRender("Copy code"), value: messageModel.content }))
41
+ ];
42
+ //# sourceMappingURL=code-render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-render.js","sourceRoot":"","sources":["../../../../src/components/_helpers/chat-container/code-render.tsx"],"names":[],"mappings":"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","sourcesContent":["import { h } from \"@stencil/core\";\nimport {\n MarkdownViewerCodeRender,\n ChatMessageByRole\n} from \"@genexus/chameleon-controls-library\";\nimport { MarkdownViewerCodeRenderOptions } from \"@genexus/chameleon-controls-library/dist/types/components/markdown-viewer/parsers/types\";\nimport { getIconPath } from \"@genexus/mercury\";\ngetIconPath;\n\nconst MESSAGE_COPIED_PART_SELECTOR = \"message__copied-feedback\";\nconst MESSAGE_COPIED_VISIBLE_PART_SELECTOR = \"message__copied-feedback-visible\";\n\nconst copy = (text: string) => (event: Event) => {\n event.stopPropagation();\n\n // 1. Copy message\n navigator.clipboard.writeText(text);\n\n // 2. Display \"copied\" message (expects to be the next sibling!)\n const copiedFeedbackRef = (event.target as HTMLElement)\n .nextSibling as HTMLElement;\n const copiedFeedbackPart = copiedFeedbackRef.getAttribute(\"part\");\n if (copiedFeedbackPart === MESSAGE_COPIED_PART_SELECTOR) {\n copiedFeedbackRef.setAttribute(\n \"part\",\n `${MESSAGE_COPIED_PART_SELECTOR} ${MESSAGE_COPIED_VISIBLE_PART_SELECTOR}`\n );\n\n setTimeout(() => {\n copiedFeedbackRef.setAttribute(\"part\", `${MESSAGE_COPIED_PART_SELECTOR}`);\n }, 1000);\n }\n};\n\nconst copyButton = (\n textToCopy: string,\n accessibleName: string,\n additionalPart: string\n) => {\n return (\n <button\n aria-label={accessibleName}\n title={accessibleName}\n class=\"button-copy-code\"\n type=\"button\"\n onClick={copy(textToCopy)}\n part={`message__copy-button ${additionalPart}`}\n ></button>\n );\n};\n\nexport const mercuryCodeRender =\n (copyButtonAccessibleName: string) =>\n (options: MarkdownViewerCodeRenderOptions): MarkdownViewerCodeRender =>\n (\n <div class=\"code-block-container\">\n <div class=\"code-block-header\">\n {copyButton(\n options.plainText,\n copyButtonAccessibleName,\n \"code-render\"\n )}\n </div>\n <ch-code\n language={options.language}\n lastNestedChildClass={options.lastNestedChildClass}\n value={options.plainText}\n ></ch-code>\n </div>\n );\n\nexport const mercuryChatMessageRender =\n (theme: string) =>\n (messageModel: ChatMessageByRole<\"assistant\" | \"error\" | \"user\">) =>\n messageModel.role === \"assistant\" && messageModel.status === \"waiting\"\n ? [\n <span part=\"message__processing\">Processing request</span>,\n\n <div class=\"processing-animation\" part=\"processing-animation\"></div>\n ]\n : [\n // \"copy button\" before \"role\" and \"time\" to hide both on button:focus\n copyButton(\n messageModel.content as string,\n \"Copy code\",\n \"common-message\"\n ),\n <p part={MESSAGE_COPIED_PART_SELECTOR}>\n message copied to clipboard\n </p>,\n <span part={`message__role ${messageModel.role}`}>\n {messageModel.role === \"user\" ? \"You\" : \"GeneXus Code Fixer\"}\n </span>,\n <time dateTime={messageModel.metadata} part=\"message__time\">\n {messageModel.metadata}\n </time>,\n\n messageModel.role === \"user\" ? (\n <span part=\"message__content user\">{messageModel.content}</span>\n ) : (\n <ch-markdown-viewer\n part={\n messageModel.role === \"assistant\" &&\n (messageModel.status === \"complete\" || !messageModel.status) &&\n !messageModel.parts\n ? `message__content no-error`\n : \"message__content\"\n }\n theme={theme}\n showIndicator={false}\n renderCode={mercuryCodeRender(\"Copy code\")}\n value={messageModel.content as string}\n ></ch-markdown-viewer>\n )\n ];\n"]}
@@ -2,4 +2,5 @@ export * from "./components";
2
2
  // Add types from Chameleon, without importing any JS in the final bundle.
3
3
  // Don't use 'import "@genexus/chameleon-controls-library"'
4
4
  typeof import("@genexus/chameleon-controls-library/dist/types/index");
5
+ export { mercuryChatMessageRender, mercuryCodeRender } from "./components/_helpers/chat-container/code-render"; // for ch-chat
5
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAE7B,0EAA0E;AAC1E,2DAA2D;AAC3D,OAAO,MAAM,CAAC,sDAAsD,CAAC,CAAC","sourcesContent":["export * from \"./components\";\n\n// Add types from Chameleon, without importing any JS in the final bundle.\n// Don't use 'import \"@genexus/chameleon-controls-library\"'\ntypeof import(\"@genexus/chameleon-controls-library/dist/types/index\");\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAE7B,0EAA0E;AAC1E,2DAA2D;AAC3D,OAAO,MAAM,CAAC,sDAAsD,CAAC,CAAC;AACtE,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EAClB,MAAM,kDAAkD,CAAC,CAAC,cAAc","sourcesContent":["export * from \"./components\";\n\n// Add types from Chameleon, without importing any JS in the final bundle.\n// Don't use 'import \"@genexus/chameleon-controls-library\"'\ntypeof import(\"@genexus/chameleon-controls-library/dist/types/index\");\nexport {\n mercuryChatMessageRender,\n mercuryCodeRender\n} from \"./components/_helpers/chat-container/code-render\"; // for ch-chat\n"]}
@@ -0,0 +1,247 @@
1
+ const PROCESSING_PLACEHOLDER = "{{ASSISTANT_NAME}}";
2
+ let timeOut;
3
+ const ASSISTANT_RESPONSE_MARKDOWN = `
4
+ ### Code block {#code-block}
5
+ To create code blocks, you’ll use three backticks (\` \`\`\` \`) or three tildes (\`~~~\`) on the lines before and after the code block.
6
+
7
+ \`\`\`
8
+ {
9
+ "firstName": "John",
10
+ "lastName": "Smith",
11
+ "age": 25
12
+ }
13
+ \`\`\`
14
+
15
+ Another way to create code blocks is to indent every line of the block by at least four spaces or one tab.
16
+
17
+ <html>
18
+ <head>
19
+ </head>
20
+ </html>
21
+
22
+
23
+ #### Syntax Highlighting {#syntax-highlighting}
24
+ This feature allows you to add color highlighting for whatever language your code was written in.
25
+ To add syntax highlighting, specify a language next to the backticks before the fenced code block.
26
+
27
+ \`\`\`json
28
+ {
29
+ "firstName": "John",
30
+ "lastName": "Smith",
31
+ "age": 25
32
+ }
33
+ \`\`\`
34
+
35
+ \`\`\`javascript
36
+ import React from 'react'
37
+ import ReactDOM from 'react-dom'
38
+ import Markdown from 'react-markdown'
39
+ import rehypeHighlight from 'rehype-highlight'
40
+
41
+ const markdown = \`
42
+ # Your markdown here
43
+ \`
44
+
45
+ ReactDOM.render(
46
+ <Markdown rehypePlugins={[rehypeHighlight]}>{markdown}</Markdown>,
47
+ document.querySelector('#content')
48
+ )
49
+ \`\`\`
50
+
51
+ ### Horizontal Rules {#horizontal-rules}
52
+ To create a horizontal rule, use three or more asterisks (\`***\`), dashes (\`---\`), or underscores (\`___\`) on a line by themselves.
53
+ `;
54
+ const ASSISTANT_RESPONSE_SHORT_MARKDOWN = `
55
+ ### Code block {#code-block}
56
+ To create code blocks, you’ll use three backticks (\` \`\`\` \`) or three tildes (\`~~~\`) on the lines before and after the code block.
57
+
58
+ \`\`\`json
59
+ {
60
+ "firstName": "John",
61
+ "lastName": "Smith",
62
+ "age": 25
63
+ }
64
+ \`\`\`
65
+ `;
66
+ const sendChatToLLM = () => {
67
+ // This is a WA to get the chat reference
68
+ const chatRef = document.querySelector("ch-chat");
69
+ chatRef.addNewMessage({
70
+ id: `${new Date().getTime()}`,
71
+ role: "assistant",
72
+ content: "Analyzing",
73
+ status: "waiting"
74
+ });
75
+ timeOut = setTimeout(() => {
76
+ chatRef.updateLastMessage({
77
+ role: "assistant",
78
+ content: "Processing with Chat with LLMs",
79
+ status: "waiting"
80
+ }, "replace");
81
+ timeOut = setTimeout(() => {
82
+ dummyStreaming(chatRef, 20, ASSISTANT_RESPONSE_MARKDOWN, "replace");
83
+ }, 200);
84
+ }, 200);
85
+ };
86
+ function dummyStreaming(chatRef, counter, stringToDisplay, mode) {
87
+ timeOut = setTimeout(() => {
88
+ const streamingCompleted = counter >= stringToDisplay.length;
89
+ chatRef.updateLastMessage({
90
+ role: "assistant",
91
+ content: {
92
+ message: stringToDisplay.substring(counter - 20, counter),
93
+ files: streamingCompleted
94
+ ? [
95
+ {
96
+ url: "https://next.genexus.ai",
97
+ caption: "Mars Exploration Contract"
98
+ },
99
+ {
100
+ url: "https://gx-chameleon.netlify.app",
101
+ caption: "Venus Exploration Contract"
102
+ }
103
+ ]
104
+ : undefined
105
+ },
106
+ status: streamingCompleted ? "complete" : "streaming"
107
+ }, mode);
108
+ if (!streamingCompleted) {
109
+ dummyStreaming(chatRef, counter + 20, stringToDisplay, "concat");
110
+ }
111
+ }, counter % 200 === 0 ? 50 : 40);
112
+ }
113
+ export const chatCallbacks = {
114
+ clear: () => new Promise(resolve => resolve()),
115
+ sendChatToLLM: sendChatToLLM,
116
+ uploadImage: () => new Promise(resolve => resolve("")),
117
+ stopGeneratingAnswer: () => {
118
+ clearTimeout(timeOut);
119
+ // This is a WA to get the chat reference
120
+ const chatRef = document.querySelector("ch-chat");
121
+ chatRef.updateLastMessage({
122
+ role: "assistant",
123
+ content: "",
124
+ status: "complete"
125
+ }, "concat");
126
+ return new Promise(resolve => setTimeout(() => resolve, 10));
127
+ }
128
+ };
129
+ export const chatTranslations = {
130
+ accessibleName: {
131
+ clearChat: "Clear chat",
132
+ copyResponseButton: "Copy assistant response",
133
+ downloadCodeButton: "Download code",
134
+ imagePicker: "Select images",
135
+ removeUploadedImage: "Remove uploaded image",
136
+ sendButton: "Send",
137
+ sendInput: "Message",
138
+ stopGeneratingAnswerButton: "Stop generating answer"
139
+ },
140
+ placeholder: {
141
+ sendInput: "Ask me a question..."
142
+ },
143
+ text: {
144
+ copyCodeButton: "Copy code",
145
+ processing: `Processing with ${PROCESSING_PLACEHOLDER}`,
146
+ sourceFiles: "Source files:"
147
+ }
148
+ };
149
+ export const chatRecord = [
150
+ { id: "1", role: "user", content: "Hello world" },
151
+ { id: "2", role: "assistant", content: ASSISTANT_RESPONSE_MARKDOWN },
152
+ { id: "3", role: "user", content: "Hello world 1" },
153
+ { id: "4", role: "assistant", content: ASSISTANT_RESPONSE_SHORT_MARKDOWN },
154
+ { id: "5", role: "user", content: "Hello world 2" },
155
+ { id: "6", role: "assistant", content: ASSISTANT_RESPONSE_SHORT_MARKDOWN },
156
+ { id: "7", role: "user", content: "Hello world 3" },
157
+ { id: "8", role: "assistant", content: ASSISTANT_RESPONSE_SHORT_MARKDOWN },
158
+ { id: "9", role: "user", content: "Hello world 4" },
159
+ { id: "10", role: "assistant", content: ASSISTANT_RESPONSE_SHORT_MARKDOWN }
160
+ ];
161
+ export const longChatRecord = Array.from({ length: 40 }, (_, index) => index % 2 === 0
162
+ ? {
163
+ id: `index: ${index}`,
164
+ role: "user",
165
+ content: `index: ${index}` +
166
+ `index: ${index}\n` +
167
+ `index: ${index}\n` +
168
+ `index: ${index}\n` +
169
+ `index: ${index}\n` +
170
+ `index: ${index}\n` +
171
+ `index: ${index}\n`
172
+ }
173
+ : {
174
+ id: `index: ${index}`,
175
+ role: "assistant",
176
+ content: ASSISTANT_RESPONSE_SHORT_MARKDOWN +
177
+ `\nindex: ${index}\n` +
178
+ `index: ${index}\n` +
179
+ `index: ${index}\n` +
180
+ `index: ${index}\n` +
181
+ `index: ${index}\n` +
182
+ `index: ${index}\n` +
183
+ `index: ${index}\n`
184
+ });
185
+ export const codeFixerRecord = [
186
+ {
187
+ id: "1",
188
+ role: "user",
189
+ content: "Please give me an example about...",
190
+ metadata: "14:55"
191
+ },
192
+ {
193
+ id: "2",
194
+ role: "assistant",
195
+ status: "complete",
196
+ content: "Action required example. Action required example. Action required example.",
197
+ metadata: "14:56"
198
+ },
199
+ {
200
+ id: "3",
201
+ role: "assistant",
202
+ status: "complete",
203
+ content: "Warning in request",
204
+ metadata: "14:57",
205
+ parts: "warning"
206
+ },
207
+ {
208
+ id: "4",
209
+ role: "error",
210
+ content: "Error in Request",
211
+ metadata: "14:58"
212
+ },
213
+ {
214
+ id: "5",
215
+ role: "assistant",
216
+ status: "complete",
217
+ content: "Warning in request",
218
+ metadata: "14:59",
219
+ parts: "success"
220
+ },
221
+ {
222
+ id: "6",
223
+ role: "user",
224
+ content: "Implement the function calculate_average_grade in grades.py that takes a list of grades as input and returns the average grade as a floating-point number",
225
+ metadata: "15:00"
226
+ },
227
+ {
228
+ id: "7",
229
+ role: "assistant",
230
+ status: "complete",
231
+ content: "You can provide further details or updates regarding your support ticket and its associated code. Your input here helps us better understand and address your issue effectively.",
232
+ metadata: "15:01"
233
+ },
234
+ {
235
+ id: "8",
236
+ role: "assistant",
237
+ status: "waiting",
238
+ content: "Processing Request"
239
+ },
240
+ {
241
+ id: "9",
242
+ role: "assistant",
243
+ status: "complete",
244
+ content: ASSISTANT_RESPONSE_SHORT_MARKDOWN
245
+ }
246
+ ];
247
+ //# sourceMappingURL=callbacks.js.map