@aakash58/chatbot 1.1.21 → 1.1.24

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 (351) hide show
  1. package/README.md +22 -298
  2. package/esm2022/aakash58-chatbot.mjs +5 -0
  3. package/esm2022/lib/app/chat/chat-ui-state.service.mjs +170 -0
  4. package/esm2022/lib/app/chat/chat.service.mjs +445 -0
  5. package/esm2022/lib/app/chat/components/chat-button/chat-button.component.mjs +50 -0
  6. package/esm2022/lib/app/chat/components/chat-footer/chat-footer.component.mjs +12 -0
  7. package/esm2022/lib/app/chat/components/chat-header/chat-header.component.mjs +66 -0
  8. package/esm2022/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.mjs +186 -0
  9. package/esm2022/lib/app/chat/components/chat-window/chat-window.component.mjs +312 -0
  10. package/esm2022/lib/app/chat/components/message-input/message-input.component.mjs +36 -0
  11. package/esm2022/lib/app/chat/components/message-list/message-list.component.mjs +115 -0
  12. package/esm2022/lib/app/chat/model/chat-history.model.mjs +2 -0
  13. package/esm2022/lib/app/chat/model/chat-request.model.mjs +2 -0
  14. package/esm2022/lib/app/chat/model/chat-response.model.mjs +2 -0
  15. package/esm2022/lib/app/chat/model/chat-session.model.mjs +2 -0
  16. package/esm2022/lib/app/chat/model/chat-stream-message.model.mjs +2 -0
  17. package/esm2022/lib/app/chat/model/chat-stream-response.model.mjs +2 -0
  18. package/esm2022/lib/app/chat/services/chat-api.service.mjs +61 -0
  19. package/esm2022/lib/app/chat/services/chat-audio.service.mjs +50 -0
  20. package/esm2022/lib/app/chat/services/chat-history.service.mjs +252 -0
  21. package/esm2022/lib/app/login/login-form.component.mjs +46 -0
  22. package/esm2022/lib/app/personalization/personalization-dialog.component.mjs +194 -0
  23. package/esm2022/lib/app/personalization/personalization.service.mjs +149 -0
  24. package/esm2022/lib/app/personalization/sections/account/account-section.component.mjs +122 -0
  25. package/esm2022/lib/app/personalization/sections/preferences/color-picker-dialog.component.mjs +86 -0
  26. package/esm2022/lib/app/personalization/sections/preferences/preferences-section.component.mjs +115 -0
  27. package/esm2022/lib/app/personalization/sections/profile/profile-section.component.mjs +29 -0
  28. package/esm2022/lib/app/personalization/sections/settings/setting-section.component.mjs +30 -0
  29. package/esm2022/lib/app/personalization/sections/terms/terms-section.component.mjs +12 -0
  30. package/esm2022/lib/constant/doohbot-constant.mjs +28 -0
  31. package/esm2022/lib/constant/html-entities.mjs +9 -0
  32. package/esm2022/lib/constant/utf8.mjs +10 -0
  33. package/esm2022/lib/core/app-const.mjs +61 -0
  34. package/esm2022/lib/core/auth/account-api.service.mjs +40 -0
  35. package/esm2022/lib/core/auth/auth.service.mjs +391 -0
  36. package/esm2022/lib/core/auth/models/auth-result.model.mjs +3 -0
  37. package/esm2022/lib/core/auth/models/federated-login-request.model.mjs +6 -0
  38. package/esm2022/lib/core/auth/models/login-request.model.mjs +6 -0
  39. package/esm2022/lib/core/auth/storage.service.mjs +110 -0
  40. package/esm2022/lib/core/directives/draggable/draggable-dialog.directive.mjs +112 -0
  41. package/esm2022/lib/core/directives/fullscreen/fullscreen.directive.mjs +55 -0
  42. package/esm2022/lib/core/directives/resizable/resizable-dialog.directive.mjs +179 -0
  43. package/esm2022/lib/core/environments/environment.mjs +15 -0
  44. package/esm2022/lib/core/environments/environment.prod.mjs +15 -0
  45. package/esm2022/lib/core/helpers/crypto-helper.service.mjs +52 -0
  46. package/esm2022/lib/core/http/http-stream.service.mjs +97 -0
  47. package/esm2022/lib/core/http/http.service.mjs +103 -0
  48. package/esm2022/lib/core/interceptors/auth.interceptor.mjs +96 -0
  49. package/esm2022/lib/core/interceptors/license.interceptor.mjs +44 -0
  50. package/esm2022/lib/core/models/api-config.model.mjs +18 -0
  51. package/esm2022/lib/core/models/api-request.model.mjs +2 -0
  52. package/esm2022/lib/core/models/api-response.model.mjs +8 -0
  53. package/esm2022/lib/core/models/doohbot-config.model.mjs +18 -0
  54. package/esm2022/lib/core/models/license.model.mjs +2 -0
  55. package/esm2022/lib/core/models/message.mjs +2 -0
  56. package/esm2022/lib/core/models/theme-config.model.mjs +2 -0
  57. package/esm2022/lib/core/services/core-config.service.mjs +52 -0
  58. package/esm2022/lib/core/services/license.service.mjs +145 -0
  59. package/esm2022/lib/core/services/markdown.service.mjs +64 -0
  60. package/esm2022/lib/core/services/theme.service.mjs +248 -0
  61. package/esm2022/lib/core/types/auth-mode.type.mjs +2 -0
  62. package/esm2022/lib/core/types/auth-status.type.mjs +5 -0
  63. package/esm2022/lib/core/types/chat-stream.type.mjs +2 -0
  64. package/esm2022/lib/core/types/message-role.type.mjs +2 -0
  65. package/esm2022/lib/core/types/prompt-mode.type.mjs +5 -0
  66. package/esm2022/lib/core/types/snackbar-error.type.mjs +5 -0
  67. package/esm2022/lib/core/types/tenant-resolution-strategy.type.mjs +2 -0
  68. package/esm2022/lib/core/utils/logger.service.mjs +42 -0
  69. package/esm2022/lib/doohbot-input.mjs +20 -0
  70. package/esm2022/lib/doohbot.component.mjs +444 -0
  71. package/esm2022/lib/predefined_messages.mjs +15 -0
  72. package/esm2022/lib/shared/chips/chips.component.mjs +28 -0
  73. package/esm2022/lib/shared/dialog/dialog.component.mjs +36 -0
  74. package/esm2022/lib/shared/dialog/dialog.service.mjs +64 -0
  75. package/esm2022/lib/shared/dialog/dialog.utils.mjs +85 -0
  76. package/esm2022/lib/shared/dropdown-menu/dropdown-menu.component.mjs +29 -0
  77. package/esm2022/lib/shared/input-dialog/input-dialog.component.mjs +38 -0
  78. package/esm2022/lib/shared/menu-item/menu-item.component.mjs +24 -0
  79. package/esm2022/lib/shared/pipes/simple-markdown.pipe.mjs +27 -0
  80. package/esm2022/lib/shared/snackbar/snackbar.component.mjs +43 -0
  81. package/esm2022/lib/shared/snackbar/snackbar.service.mjs +46 -0
  82. package/esm2022/lib/shared/snackbar/snackbar.utils.mjs +43 -0
  83. package/esm2022/public-api.mjs +37 -0
  84. package/fesm2022/aakash58-chatbot.mjs +5193 -0
  85. package/fesm2022/aakash58-chatbot.mjs.map +1 -0
  86. package/index.d.ts +5 -0
  87. package/lib/app/chat/chat-ui-state.service.d.ts +96 -0
  88. package/lib/app/chat/chat.service.d.ts +88 -0
  89. package/lib/app/chat/components/chat-button/chat-button.component.d.ts +16 -0
  90. package/lib/app/chat/components/chat-footer/chat-footer.component.d.ts +5 -0
  91. package/lib/app/chat/components/chat-header/chat-header.component.d.ts +24 -0
  92. package/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.d.ts +49 -0
  93. package/lib/app/chat/components/chat-window/chat-window.component.d.ts +107 -0
  94. package/lib/app/chat/components/message-input/message-input.component.d.ts +12 -0
  95. package/lib/app/chat/components/message-list/message-list.component.d.ts +40 -0
  96. package/lib/app/chat/model/chat-history.model.d.ts +51 -0
  97. package/lib/app/chat/model/chat-request.model.d.ts +10 -0
  98. package/lib/app/chat/model/chat-response.model.d.ts +9 -0
  99. package/lib/app/chat/model/chat-session.model.d.ts +12 -0
  100. package/{projects/doohbot/src/lib/app/chat/model/chat-stream-message.model.ts → lib/app/chat/model/chat-stream-message.model.d.ts} +5 -6
  101. package/lib/app/chat/model/chat-stream-response.model.d.ts +10 -0
  102. package/lib/app/chat/services/chat-api.service.d.ts +30 -0
  103. package/lib/app/chat/services/chat-audio.service.d.ts +19 -0
  104. package/lib/app/chat/services/chat-history.service.d.ts +53 -0
  105. package/lib/app/login/login-form.component.d.ts +20 -0
  106. package/lib/app/personalization/personalization-dialog.component.d.ts +53 -0
  107. package/lib/app/personalization/personalization.service.d.ts +66 -0
  108. package/lib/app/personalization/sections/account/account-section.component.d.ts +30 -0
  109. package/lib/app/personalization/sections/preferences/color-picker-dialog.component.d.ts +17 -0
  110. package/lib/app/personalization/sections/preferences/preferences-section.component.d.ts +27 -0
  111. package/lib/app/personalization/sections/profile/profile-section.component.d.ts +17 -0
  112. package/lib/app/personalization/sections/settings/setting-section.component.d.ts +10 -0
  113. package/lib/app/personalization/sections/terms/terms-section.component.d.ts +5 -0
  114. package/lib/constant/doohbot-constant.d.ts +12 -0
  115. package/lib/constant/html-entities.d.ts +8 -0
  116. package/lib/constant/utf8.d.ts +9 -0
  117. package/lib/core/app-const.d.ts +11 -0
  118. package/lib/core/auth/account-api.service.d.ts +20 -0
  119. package/lib/core/auth/auth.service.d.ts +90 -0
  120. package/lib/core/auth/models/auth-result.model.d.ts +4 -0
  121. package/lib/core/auth/models/federated-login-request.model.d.ts +5 -0
  122. package/lib/core/auth/models/login-request.model.d.ts +6 -0
  123. package/lib/core/auth/storage.service.d.ts +21 -0
  124. package/lib/core/directives/draggable/draggable-dialog.directive.d.ts +23 -0
  125. package/lib/core/directives/fullscreen/fullscreen.directive.d.ts +14 -0
  126. package/lib/core/directives/resizable/resizable-dialog.directive.d.ts +30 -0
  127. package/lib/core/environments/environment.d.ts +7 -0
  128. package/lib/core/environments/environment.prod.d.ts +7 -0
  129. package/lib/core/helpers/crypto-helper.service.d.ts +12 -0
  130. package/lib/core/http/http-stream.service.d.ts +18 -0
  131. package/lib/core/http/http.service.d.ts +20 -0
  132. package/lib/core/interceptors/auth.interceptor.d.ts +18 -0
  133. package/lib/core/interceptors/license.interceptor.d.ts +11 -0
  134. package/lib/core/models/api-config.model.d.ts +58 -0
  135. package/lib/core/models/api-request.model.d.ts +77 -0
  136. package/lib/core/models/api-response.model.d.ts +6 -0
  137. package/lib/core/models/doohbot-config.model.d.ts +81 -0
  138. package/{projects/doohbot/src/lib/core/models/license.model.ts → lib/core/models/license.model.d.ts} +23 -27
  139. package/lib/core/models/message.d.ts +16 -0
  140. package/lib/core/models/theme-config.model.d.ts +28 -0
  141. package/lib/core/services/core-config.service.d.ts +23 -0
  142. package/lib/core/services/license.service.d.ts +33 -0
  143. package/lib/core/services/markdown.service.d.ts +8 -0
  144. package/lib/core/services/theme.service.d.ts +40 -0
  145. package/{projects/doohbot/src/lib/core/types/auth-mode.type.ts → lib/core/types/auth-mode.type.d.ts} +4 -4
  146. package/{projects/doohbot/src/lib/core/types/auth-status.type.ts → lib/core/types/auth-status.type.d.ts} +4 -5
  147. package/{projects/doohbot/src/lib/core/types/chat-stream.type.ts → lib/core/types/chat-stream.type.d.ts} +4 -4
  148. package/{projects/doohbot/src/lib/core/types/message-role.type.ts → lib/core/types/message-role.type.d.ts} +4 -4
  149. package/{projects/doohbot/src/lib/core/types/prompt-mode.type.ts → lib/core/types/prompt-mode.type.d.ts} +4 -5
  150. package/{projects/doohbot/src/lib/core/types/snackbar-error.type.ts → lib/core/types/snackbar-error.type.d.ts} +4 -5
  151. package/{projects/doohbot/src/lib/core/types/tenant-resolution-strategy.type.ts → lib/core/types/tenant-resolution-strategy.type.d.ts} +4 -4
  152. package/lib/core/utils/logger.service.d.ts +11 -0
  153. package/lib/doohbot-input.d.ts +19 -0
  154. package/lib/doohbot.component.d.ts +108 -0
  155. package/lib/predefined_messages.d.ts +2 -0
  156. package/lib/shared/chips/chips.component.d.ts +10 -0
  157. package/lib/shared/dialog/dialog.component.d.ts +19 -0
  158. package/lib/shared/dialog/dialog.service.d.ts +29 -0
  159. package/lib/shared/dialog/dialog.utils.d.ts +41 -0
  160. package/lib/shared/dropdown-menu/dropdown-menu.component.d.ts +11 -0
  161. package/lib/shared/input-dialog/input-dialog.component.d.ts +20 -0
  162. package/lib/shared/menu-item/menu-item.component.d.ts +9 -0
  163. package/lib/shared/pipes/simple-markdown.pipe.d.ts +10 -0
  164. package/lib/shared/snackbar/snackbar.component.d.ts +14 -0
  165. package/lib/shared/snackbar/snackbar.service.d.ts +19 -0
  166. package/{projects/doohbot/src/lib/shared/snackbar/snackbar.utils.ts → lib/shared/snackbar/snackbar.utils.d.ts} +33 -49
  167. package/package.json +29 -75
  168. package/public-api.d.ts +11 -0
  169. package/.editorconfig +0 -17
  170. package/.vscode/extensions.json +0 -4
  171. package/.vscode/launch.json +0 -41
  172. package/.vscode/settings.json +0 -14
  173. package/.vscode/tasks.json +0 -60
  174. package/angular.json +0 -132
  175. package/docs/PUBLISHING_GUIDE.md +0 -104
  176. package/projects/app-doohbot/public/assets/const/app-const.json +0 -15
  177. package/projects/app-doohbot/public/assets/const/doohclick_license.json +0 -6
  178. package/projects/app-doohbot/public/favicon.ico +0 -0
  179. package/projects/app-doohbot/src/app/app.config.ts +0 -13
  180. package/projects/app-doohbot/src/app/app.html +0 -31
  181. package/projects/app-doohbot/src/app/app.routes.ts +0 -3
  182. package/projects/app-doohbot/src/app/app.scss +0 -279
  183. package/projects/app-doohbot/src/app/app.spec.ts +0 -23
  184. package/projects/app-doohbot/src/app/app.ts +0 -72
  185. package/projects/app-doohbot/src/index.html +0 -15
  186. package/projects/app-doohbot/src/main.ts +0 -6
  187. package/projects/app-doohbot/src/styles.scss +0 -15
  188. package/projects/app-doohbot/tsconfig.app.json +0 -15
  189. package/projects/app-doohbot/tsconfig.spec.json +0 -14
  190. package/projects/doohbot/README.md +0 -64
  191. package/projects/doohbot/docs/README.md +0 -140
  192. package/projects/doohbot/ng-package.json +0 -10
  193. package/projects/doohbot/package.json +0 -16
  194. package/projects/doohbot/src/lib/app/chat/chat-ui-state.service.ts +0 -194
  195. package/projects/doohbot/src/lib/app/chat/chat.service.ts +0 -547
  196. package/projects/doohbot/src/lib/app/chat/components/chat-button/chat-button.component.html +0 -27
  197. package/projects/doohbot/src/lib/app/chat/components/chat-button/chat-button.component.scss +0 -115
  198. package/projects/doohbot/src/lib/app/chat/components/chat-button/chat-button.component.ts +0 -35
  199. package/projects/doohbot/src/lib/app/chat/components/chat-footer/chat-footer.component.html +0 -3
  200. package/projects/doohbot/src/lib/app/chat/components/chat-footer/chat-footer.component.scss +0 -20
  201. package/projects/doohbot/src/lib/app/chat/components/chat-footer/chat-footer.component.ts +0 -12
  202. package/projects/doohbot/src/lib/app/chat/components/chat-header/chat-header.component.html +0 -34
  203. package/projects/doohbot/src/lib/app/chat/components/chat-header/chat-header.component.scss +0 -78
  204. package/projects/doohbot/src/lib/app/chat/components/chat-header/chat-header.component.ts +0 -52
  205. package/projects/doohbot/src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.html +0 -77
  206. package/projects/doohbot/src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.scss +0 -346
  207. package/projects/doohbot/src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.ts +0 -188
  208. package/projects/doohbot/src/lib/app/chat/components/chat-window/chat-window.component.html +0 -146
  209. package/projects/doohbot/src/lib/app/chat/components/chat-window/chat-window.component.scss +0 -187
  210. package/projects/doohbot/src/lib/app/chat/components/chat-window/chat-window.component.ts +0 -256
  211. package/projects/doohbot/src/lib/app/chat/components/message-input/message-input.component.html +0 -17
  212. package/projects/doohbot/src/lib/app/chat/components/message-input/message-input.component.scss +0 -59
  213. package/projects/doohbot/src/lib/app/chat/components/message-input/message-input.component.ts +0 -28
  214. package/projects/doohbot/src/lib/app/chat/components/message-list/message-list.component.html +0 -138
  215. package/projects/doohbot/src/lib/app/chat/components/message-list/message-list.component.scss +0 -436
  216. package/projects/doohbot/src/lib/app/chat/components/message-list/message-list.component.ts +0 -106
  217. package/projects/doohbot/src/lib/app/chat/model/chat-history.model.ts +0 -57
  218. package/projects/doohbot/src/lib/app/chat/model/chat-request.model.ts +0 -17
  219. package/projects/doohbot/src/lib/app/chat/model/chat-response.model.ts +0 -9
  220. package/projects/doohbot/src/lib/app/chat/model/chat-session.model.ts +0 -14
  221. package/projects/doohbot/src/lib/app/chat/model/chat-stream-response.model.ts +0 -12
  222. package/projects/doohbot/src/lib/app/chat/services/chat-api.service.ts +0 -82
  223. package/projects/doohbot/src/lib/app/chat/services/chat-audio.service.ts +0 -44
  224. package/projects/doohbot/src/lib/app/chat/services/chat-history.service.ts +0 -303
  225. package/projects/doohbot/src/lib/app/login/login-form.component.html +0 -80
  226. package/projects/doohbot/src/lib/app/login/login-form.component.scss +0 -189
  227. package/projects/doohbot/src/lib/app/login/login-form.component.ts +0 -45
  228. package/projects/doohbot/src/lib/app/personalization/personalization-dialog.component.html +0 -81
  229. package/projects/doohbot/src/lib/app/personalization/personalization-dialog.component.scss +0 -179
  230. package/projects/doohbot/src/lib/app/personalization/personalization-dialog.component.ts +0 -217
  231. package/projects/doohbot/src/lib/app/personalization/personalization.service.ts +0 -197
  232. package/projects/doohbot/src/lib/app/personalization/sections/account/account-section.component.html +0 -111
  233. package/projects/doohbot/src/lib/app/personalization/sections/account/account-section.component.scss +0 -218
  234. package/projects/doohbot/src/lib/app/personalization/sections/account/account-section.component.ts +0 -121
  235. package/projects/doohbot/src/lib/app/personalization/sections/instructions/instructions-section.component.html +0 -46
  236. package/projects/doohbot/src/lib/app/personalization/sections/instructions/instructions-section.component.scss +0 -138
  237. package/projects/doohbot/src/lib/app/personalization/sections/instructions/instructions-section.component.ts +0 -28
  238. package/projects/doohbot/src/lib/app/personalization/sections/preferences/color-picker-dialog.component.ts +0 -92
  239. package/projects/doohbot/src/lib/app/personalization/sections/preferences/preferences-section.component.html +0 -198
  240. package/projects/doohbot/src/lib/app/personalization/sections/preferences/preferences-section.component.scss +0 -107
  241. package/projects/doohbot/src/lib/app/personalization/sections/preferences/preferences-section.component.ts +0 -103
  242. package/projects/doohbot/src/lib/app/personalization/sections/profile/profile-section.component.html +0 -46
  243. package/projects/doohbot/src/lib/app/personalization/sections/profile/profile-section.component.scss +0 -131
  244. package/projects/doohbot/src/lib/app/personalization/sections/profile/profile-section.component.ts +0 -23
  245. package/projects/doohbot/src/lib/app/personalization/sections/settings/setting-section.component.html +0 -33
  246. package/projects/doohbot/src/lib/app/personalization/sections/settings/setting-section.component.scss +0 -61
  247. package/projects/doohbot/src/lib/app/personalization/sections/settings/setting-section.component.ts +0 -20
  248. package/projects/doohbot/src/lib/app/personalization/sections/terms/terms-section.component.html +0 -30
  249. package/projects/doohbot/src/lib/app/personalization/sections/terms/terms-section.component.scss +0 -59
  250. package/projects/doohbot/src/lib/app/personalization/sections/terms/terms-section.component.ts +0 -12
  251. package/projects/doohbot/src/lib/constant/doohbot-constant.ts +0 -40
  252. package/projects/doohbot/src/lib/constant/html-entities.ts +0 -8
  253. package/projects/doohbot/src/lib/constant/utf8.ts +0 -9
  254. package/projects/doohbot/src/lib/core/app-const.ts +0 -63
  255. package/projects/doohbot/src/lib/core/auth/account-api.service.ts +0 -53
  256. package/projects/doohbot/src/lib/core/auth/auth.service.ts +0 -478
  257. package/projects/doohbot/src/lib/core/auth/models/auth-result.model.ts +0 -4
  258. package/projects/doohbot/src/lib/core/auth/models/federated-login-request.model.ts +0 -5
  259. package/projects/doohbot/src/lib/core/auth/models/login-request.model.ts +0 -6
  260. package/projects/doohbot/src/lib/core/auth/storage.service.ts +0 -113
  261. package/projects/doohbot/src/lib/core/directives/draggable/draggable-dialog.directive.ts +0 -123
  262. package/projects/doohbot/src/lib/core/directives/draggable/draggable-dialog.module.ts +0 -9
  263. package/projects/doohbot/src/lib/core/directives/fullscreen/fullscreen.directive.ts +0 -58
  264. package/projects/doohbot/src/lib/core/directives/fullscreen/fullscreen.module.ts +0 -9
  265. package/projects/doohbot/src/lib/core/directives/popout/popout.directive.ts +0 -169
  266. package/projects/doohbot/src/lib/core/directives/popout/popout.module.ts +0 -9
  267. package/projects/doohbot/src/lib/core/directives/resizable/resizable-dialog.directive.ts +0 -197
  268. package/projects/doohbot/src/lib/core/directives/resizable/resizable-dialog.module.ts +0 -9
  269. package/projects/doohbot/src/lib/core/enums/api-request-state.enum.ts +0 -9
  270. package/projects/doohbot/src/lib/core/environments/environment.prod.ts +0 -14
  271. package/projects/doohbot/src/lib/core/environments/environment.ts +0 -14
  272. package/projects/doohbot/src/lib/core/helpers/crypto-helper.service.ts +0 -72
  273. package/projects/doohbot/src/lib/core/http/http-stream.service.ts +0 -105
  274. package/projects/doohbot/src/lib/core/http/http.service.ts +0 -148
  275. package/projects/doohbot/src/lib/core/interceptors/auth.interceptor.ts +0 -118
  276. package/projects/doohbot/src/lib/core/interceptors/license.interceptor.ts +0 -50
  277. package/projects/doohbot/src/lib/core/models/api-config.model.ts +0 -82
  278. package/projects/doohbot/src/lib/core/models/api-request.model.ts +0 -92
  279. package/projects/doohbot/src/lib/core/models/api-response.model.ts +0 -13
  280. package/projects/doohbot/src/lib/core/models/doohbot-config.model.ts +0 -109
  281. package/projects/doohbot/src/lib/core/models/message.ts +0 -18
  282. package/projects/doohbot/src/lib/core/models/theme-config.model.ts +0 -48
  283. package/projects/doohbot/src/lib/core/services/core-config.service.ts +0 -53
  284. package/projects/doohbot/src/lib/core/services/doohbot-api.service.ts +0 -207
  285. package/projects/doohbot/src/lib/core/services/license.service.ts +0 -171
  286. package/projects/doohbot/src/lib/core/services/markdown.service.ts +0 -73
  287. package/projects/doohbot/src/lib/core/services/theme.service.ts +0 -305
  288. package/projects/doohbot/src/lib/core/utils/error-handler.util.ts +0 -31
  289. package/projects/doohbot/src/lib/core/utils/logger.service.ts +0 -45
  290. package/projects/doohbot/src/lib/doohbot-input.ts +0 -19
  291. package/projects/doohbot/src/lib/doohbot.component.html +0 -34
  292. package/projects/doohbot/src/lib/doohbot.component.scss +0 -17
  293. package/projects/doohbot/src/lib/doohbot.component.spec.ts +0 -31
  294. package/projects/doohbot/src/lib/doohbot.component.ts +0 -545
  295. package/projects/doohbot/src/lib/elements.ts +0 -25
  296. package/projects/doohbot/src/lib/predefined_messages.ts +0 -14
  297. package/projects/doohbot/src/lib/shared/chips/chips.component.html +0 -9
  298. package/projects/doohbot/src/lib/shared/chips/chips.component.scss +0 -29
  299. package/projects/doohbot/src/lib/shared/chips/chips.component.spec.ts +0 -22
  300. package/projects/doohbot/src/lib/shared/chips/chips.component.ts +0 -20
  301. package/projects/doohbot/src/lib/shared/dialog/dialog.component.html +0 -29
  302. package/projects/doohbot/src/lib/shared/dialog/dialog.component.scss +0 -100
  303. package/projects/doohbot/src/lib/shared/dialog/dialog.component.ts +0 -42
  304. package/projects/doohbot/src/lib/shared/dialog/dialog.service.ts +0 -62
  305. package/projects/doohbot/src/lib/shared/dialog/dialog.utils.ts +0 -102
  306. package/projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.html +0 -30
  307. package/projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.scss +0 -53
  308. package/projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.spec.ts +0 -22
  309. package/projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.ts +0 -35
  310. package/projects/doohbot/src/lib/shared/input-dialog/input-dialog.component.html +0 -16
  311. package/projects/doohbot/src/lib/shared/input-dialog/input-dialog.component.scss +0 -45
  312. package/projects/doohbot/src/lib/shared/input-dialog/input-dialog.component.ts +0 -46
  313. package/projects/doohbot/src/lib/shared/menu-item/menu-item.component.html +0 -5
  314. package/projects/doohbot/src/lib/shared/menu-item/menu-item.component.scss +0 -0
  315. package/projects/doohbot/src/lib/shared/menu-item/menu-item.component.spec.ts +0 -22
  316. package/projects/doohbot/src/lib/shared/menu-item/menu-item.component.ts +0 -20
  317. package/projects/doohbot/src/lib/shared/pipes/simple-markdown.pipe.ts +0 -19
  318. package/projects/doohbot/src/lib/shared/popout/popout.html +0 -1
  319. package/projects/doohbot/src/lib/shared/popout/popout.scss +0 -0
  320. package/projects/doohbot/src/lib/shared/popout/popout.spec.ts +0 -23
  321. package/projects/doohbot/src/lib/shared/popout/popout.ts +0 -11
  322. package/projects/doohbot/src/lib/shared/snackbar/snackbar.component.html +0 -7
  323. package/projects/doohbot/src/lib/shared/snackbar/snackbar.component.scss +0 -125
  324. package/projects/doohbot/src/lib/shared/snackbar/snackbar.component.spec.ts +0 -21
  325. package/projects/doohbot/src/lib/shared/snackbar/snackbar.component.ts +0 -44
  326. package/projects/doohbot/src/lib/shared/snackbar/snackbar.service.ts +0 -54
  327. package/projects/doohbot/src/lib/styles/_theme.scss +0 -132
  328. package/projects/doohbot/src/lib/styles/material-override.scss +0 -302
  329. package/projects/doohbot/src/lib/styles/utility.scss +0 -588
  330. package/projects/doohbot/src/public-api.ts +0 -42
  331. package/projects/doohbot/tsconfig.lib.json +0 -15
  332. package/projects/doohbot/tsconfig.lib.prod.json +0 -11
  333. package/projects/doohbot/tsconfig.spec.json +0 -10
  334. package/proxy.conf.json +0 -8
  335. package/publish.config.js +0 -25
  336. package/scripts/publishing/index.ts +0 -67
  337. package/scripts/publishing/pipeline/01-clean.ts +0 -11
  338. package/scripts/publishing/pipeline/02-validate-pre.ts +0 -8
  339. package/scripts/publishing/pipeline/03-build.ts +0 -7
  340. package/scripts/publishing/pipeline/04-validate-post.ts +0 -8
  341. package/scripts/publishing/pipeline/05-prepare-package.ts +0 -29
  342. package/scripts/publishing/pipeline/06-version.ts +0 -23
  343. package/scripts/publishing/pipeline/07-publish.ts +0 -14
  344. package/scripts/publishing/pipeline/08-cleanup.ts +0 -5
  345. package/scripts/publishing/types.ts +0 -36
  346. package/scripts/publishing/utils/command.ts +0 -15
  347. package/scripts/publishing/utils/config.ts +0 -17
  348. package/scripts/validate.ts +0 -166
  349. package/tsconfig.json +0 -45
  350. package/tsconfig.scripts.json +0 -15
  351. /package/{projects/doohbot/src → src}/assets/bot.mp3 +0 -0
@@ -0,0 +1,194 @@
1
+ import { Component, inject } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { MatDialogModule, MatDialogRef } from '@angular/material/dialog';
5
+ import { MatButtonModule } from '@angular/material/button';
6
+ import { MatIconModule } from '@angular/material/icon';
7
+ import { MatTabsModule } from '@angular/material/tabs';
8
+ import { MatSlideToggleModule } from '@angular/material/slide-toggle';
9
+ import { MatFormFieldModule } from '@angular/material/form-field';
10
+ import { MatInputModule } from '@angular/material/input';
11
+ import { MatSelectModule } from '@angular/material/select';
12
+ import { MatTooltipModule } from '@angular/material/tooltip';
13
+ import { PreferencesSectionComponent } from './sections/preferences/preferences-section.component';
14
+ import { ProfileSectionComponent } from './sections/profile/profile-section.component';
15
+ import { TermsSectionComponent } from './sections/terms/terms-section.component';
16
+ import { SettingSectionComponent } from './sections/settings/setting-section.component';
17
+ import { AccountSectionComponent } from './sections/account/account-section.component';
18
+ import { ChatHistoryService } from '../chat/services/chat-history.service';
19
+ import { AuthService } from '../../core/auth/auth.service';
20
+ import { PersonalizationService } from './personalization.service';
21
+ import { DialogService } from '../../shared/dialog/dialog.service';
22
+ import { DialogUtils } from '../../shared/dialog/dialog.utils';
23
+ import { SnackbarService } from '../../shared/snackbar/snackbar.service';
24
+ import { ThemeService } from '../../core/services/theme.service';
25
+ import * as i0 from "@angular/core";
26
+ import * as i1 from "@angular/material/dialog";
27
+ import * as i2 from "@angular/material/button";
28
+ import * as i3 from "@angular/material/icon";
29
+ import * as i4 from "@angular/material/tooltip";
30
+ export class PersonalizationDialogComponent {
31
+ constructor() {
32
+ this.dialogRef = inject((MatDialogRef));
33
+ this.dialogService = inject(DialogService);
34
+ this.personalization = inject(PersonalizationService);
35
+ this.authService = inject(AuthService);
36
+ this.chatHistory = inject(ChatHistoryService);
37
+ this.snackbar = inject(SnackbarService);
38
+ // Local copy of settings for editing
39
+ this.settings = JSON.parse(JSON.stringify(this.personalization.settings()));
40
+ this.activeSection = 'profile';
41
+ this.sections = [
42
+ { id: 'account', label: 'Account', type: 'header' },
43
+ { id: 'profile', label: 'My profile', icon: 'person_outline', type: 'item' },
44
+ { id: 'account_settings', label: 'Manage Account', icon: 'manage_accounts', type: 'item' },
45
+ { id: 'preferences', label: 'Preferences', icon: 'tune', type: 'item' },
46
+ { id: 'workspace', label: 'Workspace', type: 'header' },
47
+ { id: 'general', label: 'Settings', icon: 'settings', type: 'item' },
48
+ { id: 'info', label: 'Support', type: 'header' },
49
+ { id: 'terms', label: 'Terms & Conditions', icon: 'description', type: 'item' },
50
+ ];
51
+ this.colorTokens = [
52
+ {
53
+ name: 'Standard',
54
+ value: 'default',
55
+ },
56
+ { name: 'Purple', value: '#7c3aed' },
57
+ { name: 'Pink', value: '#db2777' },
58
+ { name: 'Red', value: '#dc2626' },
59
+ { name: 'Orange', value: '#ea580c' },
60
+ { name: 'Green', value: '#16a34a' },
61
+ { name: 'Teal', value: '#0d9488' },
62
+ { name: 'Blue', value: '#2563eb' },
63
+ ];
64
+ this.themeService = inject(ThemeService);
65
+ this.originalColor = '';
66
+ this.isSaved = false;
67
+ this.originalColor = this.personalization.settings().appearance.primaryColor;
68
+ }
69
+ onSave() {
70
+ if (this.activeSection === 'preferences') {
71
+ this.isSaved = true;
72
+ this.personalization.updateAppearance(this.settings.appearance);
73
+ // Re-apply to ensure consistency (effect handles it, but just in case)
74
+ this.snackbar.success('Appearance settings saved');
75
+ }
76
+ else if (this.activeSection === 'general') {
77
+ this.personalization.updateInstructions(this.settings.customInstructions);
78
+ this.snackbar.success('Settings saved');
79
+ }
80
+ }
81
+ onCancel() {
82
+ this.dialogRef.close(false);
83
+ // ngOnDestroy will handle revert
84
+ }
85
+ ngOnDestroy() {
86
+ if (!this.isSaved) {
87
+ // Revert to original color if not saved
88
+ this.themeService.applyPrimaryColorToGlobal(this.originalColor);
89
+ }
90
+ }
91
+ onReset() {
92
+ DialogUtils.confirmReset(this.dialogService).subscribe((confirmed) => {
93
+ if (confirmed) {
94
+ // Only reset the current section
95
+ if (this.activeSection === 'preferences') {
96
+ // Reset only appearance settings to defaults
97
+ this.personalization.resetToDefaults();
98
+ // Re-clone settings to update UI
99
+ this.settings = JSON.parse(JSON.stringify(this.personalization.settings()));
100
+ // Live preview the reset
101
+ this.themeService.applyPrimaryColorToGlobal(this.settings.appearance.primaryColor);
102
+ }
103
+ }
104
+ });
105
+ }
106
+ selectTheme(theme) {
107
+ this.settings.appearance.theme = theme;
108
+ // Optional: Preview theme? User only asked for color.
109
+ }
110
+ selectColor(color) {
111
+ this.settings.appearance.primaryColor = color;
112
+ //! Live Preview for changed color
113
+ // this.themeService.applyPrimaryColorToGlobal(color);
114
+ }
115
+ selectButtonStyle(style) {
116
+ this.settings.appearance.buttonStyle = style;
117
+ }
118
+ selectSection(sectionId) {
119
+ if (this.sections.find((s) => s.id === sectionId && s.type === 'item')) {
120
+ this.activeSection = sectionId;
121
+ }
122
+ }
123
+ get hasChanges() {
124
+ if (this.activeSection === 'preferences')
125
+ return this.hasPreferencesChanges();
126
+ if (this.activeSection === 'general')
127
+ return this.hasInstructionChanges();
128
+ return false;
129
+ }
130
+ hasPreferencesChanges() {
131
+ const original = this.personalization.settings().appearance;
132
+ const current = this.settings.appearance;
133
+ return JSON.stringify(original) !== JSON.stringify(current);
134
+ }
135
+ hasInstructionChanges() {
136
+ const original = this.personalization.settings().customInstructions;
137
+ const current = this.settings.customInstructions;
138
+ return JSON.stringify(original) !== JSON.stringify(current);
139
+ }
140
+ get username() {
141
+ return this.authService.getLoggedInUserName();
142
+ }
143
+ get userImageUrl() {
144
+ return this.authService.getLoggedInUserImageUrl();
145
+ }
146
+ get userRole() {
147
+ return this.authService.getLoggedInUserRole();
148
+ }
149
+ isCustomColorSelected() {
150
+ return !this.colorTokens.some((token) => token.value.toLowerCase() === this.settings.appearance.primaryColor.toLowerCase());
151
+ }
152
+ onCustomColorChange(event) {
153
+ const color = event.target.value;
154
+ this.selectColor(color);
155
+ }
156
+ deleteAllHistory() {
157
+ const userId = this.authService.getUserId() || '';
158
+ this.chatHistory.deleteAllHistory(userId.toString()).subscribe(() => {
159
+ // History cleared
160
+ });
161
+ }
162
+ logoutAllDevices() {
163
+ console.log('Logging out of all devices...');
164
+ // Implement service call when API is ready
165
+ }
166
+ deleteAccount() {
167
+ console.log('Deleting account...');
168
+ // Implement service call when API is ready
169
+ }
170
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PersonalizationDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
171
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: PersonalizationDialogComponent, isStandalone: true, selector: "app-personalization-dialog", ngImport: i0, template: "<div class=\"personalization-container\">\r\n <div class=\"header\">\r\n <div class=\"title-section\">\r\n <mat-icon class=\"header-icon\">settings_suggest</mat-icon>\r\n <h2>Personalization</h2>\r\n </div>\r\n <button mat-icon-button (click)=\"onCancel()\" matTooltip=\"Close\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"dialog-layout no-padding\">\r\n <!-- Sidebar Navigation -->\r\n <aside class=\"sidebar\">\r\n @for (section of sections; track section.id) {\r\n @if (section.type === 'header') {\r\n <div class=\"nav-header\">{{ section.label }}</div>\r\n } @else {\r\n <div\r\n class=\"nav-item\"\r\n [class.active]=\"activeSection === section.id\"\r\n (click)=\"selectSection(section.id)\"\r\n >\r\n <mat-icon>{{ section.icon }}</mat-icon>\r\n <span>{{ section.label }}</span>\r\n </div>\r\n }\r\n }\r\n </aside>\r\n\r\n <!-- Main Content Area -->\r\n <main class=\"main-content\">\r\n <!-- Appearance / Preferences Section -->\r\n @if (activeSection === 'preferences') {\r\n <app-preferences-section\r\n [settings]=\"settings\"\r\n [colorTokens]=\"colorTokens\"\r\n [isCustomColorSelected]=\"isCustomColorSelected()\"\r\n [defaultColor]=\"personalization.developerDefaults().primaryColor || 'default'\"\r\n (onThemeSelect)=\"selectTheme($event)\"\r\n (onColorSelect)=\"selectColor($event)\"\r\n (onButtonStyleSelect)=\"selectButtonStyle($event)\"\r\n (onSave)=\"onSave()\"\r\n (onReset)=\"onReset()\"\r\n >\r\n </app-preferences-section>\r\n }\r\n\r\n <!-- Account / Profile Section -->\r\n @if (activeSection === 'account_settings') {\r\n <app-account-section\r\n (onDeleteAllHistory)=\"deleteAllHistory()\"\r\n (onLogoutAll)=\"logoutAllDevices()\"\r\n (onDeleteAccount)=\"deleteAccount()\"\r\n ></app-account-section>\r\n }\r\n\r\n @if (activeSection === 'profile') {\r\n <app-profile-section\r\n [username]=\"username\"\r\n [userImageUrl]=\"userImageUrl\"\r\n [userRole]=\"userRole\"\r\n ></app-profile-section>\r\n }\r\n\r\n <!-- General Section -->\r\n @if (activeSection === 'general') {\r\n <app-setting-section\r\n [settings]=\"settings\"\r\n [hasChanges]=\"hasChanges\"\r\n (onSave)=\"onSave()\"\r\n ></app-setting-section>\r\n }\r\n\r\n <!-- Terms and Conditions Section -->\r\n @if (activeSection === 'terms') {\r\n <app-terms-section></app-terms-section>\r\n }\r\n </main>\r\n </mat-dialog-content>\r\n</div>\r\n", styles: [".personalization-container{display:flex;flex-direction:column;width:100%;height:100%;max-width:none;max-height:none;max-height:90vh;background:var(--background-color);color:var(--text-color);border-radius:12px;overflow:hidden;box-shadow:var(--border-shadow-color)}.personalization-container .header{flex:0 0 auto;display:flex;justify-content:space-between;align-items:center;padding:12px 20px;border-bottom:1px solid var(--border-color);background:var(--background-color)}.personalization-container .header .title-section{display:flex;align-items:center;gap:10px}.personalization-container .header .title-section .header-icon{color:var(--secondary-text-color);font-size:20px;width:20px;height:20px}.personalization-container .header .title-section h2{margin:0;font-size:.95rem;font-weight:500;color:var(--secondary-text-color)}.personalization-container .dialog-layout{display:flex;padding:0;margin:0;flex:1;overflow:hidden}.personalization-container .sidebar{width:240px;background:rgba(var(--black-rgb),.02);border-right:1px solid var(--border-color);padding:16px 8px;display:flex;flex-direction:column;gap:2px;overflow-y:auto;scrollbar-gutter:stable}.personalization-container .sidebar::-webkit-scrollbar{width:4px}.personalization-container .sidebar::-webkit-scrollbar-track{background:transparent}.personalization-container .sidebar::-webkit-scrollbar-thumb{background:rgba(var(--black-rgb),.1);border-radius:10px}.personalization-container .sidebar::-webkit-scrollbar-thumb:hover{background:rgba(var(--black-rgb),.2)}.personalization-container .sidebar .nav-header{padding:12px 12px 6px;font-size:.75rem;font-weight:600;text-transform:uppercase;color:var(--secondary-text-color);letter-spacing:.5px}.personalization-container .sidebar .nav-item{display:flex;align-items:center;gap:12px;padding:8px 12px;border-radius:6px;cursor:pointer;transition:all .2s ease;color:var(--text-color)}.personalization-container .sidebar .nav-item mat-icon{font-size:18px;width:18px;height:18px;color:var(--secondary-text-color)}.personalization-container .sidebar .nav-item span{font-size:.9rem;font-weight:400}.personalization-container .sidebar .nav-item:hover{background:rgba(var(--black-rgb),.05)}.personalization-container .sidebar .nav-item.active{background:rgba(var(--primary-color-rgb),.1);font-weight:500;color:var(--primary-color)}.personalization-container .sidebar .nav-item.active mat-icon{color:var(--primary-color)}.personalization-container .main-content{flex:1;overflow-y:auto;background:var(--background-color);position:relative}.personalization-container .main-content::-webkit-scrollbar{width:6px}.personalization-container .main-content::-webkit-scrollbar-track{background:transparent}.personalization-container .main-content::-webkit-scrollbar-thumb{background:rgba(var(--black-rgb),.1);border-radius:10px}.personalization-container .main-content::-webkit-scrollbar-thumb:hover{background:rgba(var(--black-rgb),.2)}.full-width{width:100%}@keyframes slideIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}:host-context(.dark-theme) .personalization-container .sidebar{background:var(--background-color)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: PreferencesSectionComponent, selector: "app-preferences-section", inputs: ["settings", "colorTokens", "isCustomColorSelected", "defaultColor"], outputs: ["onThemeSelect", "onColorSelect", "onButtonStyleSelect", "onSave", "onReset"] }, { kind: "component", type: ProfileSectionComponent, selector: "app-profile-section", inputs: ["username", "userImageUrl", "userRole"] }, { kind: "component", type: SettingSectionComponent, selector: "app-setting-section", inputs: ["settings", "hasChanges"], outputs: ["onSave"] }, { kind: "component", type: TermsSectionComponent, selector: "app-terms-section" }, { kind: "component", type: AccountSectionComponent, selector: "app-account-section", inputs: ["organizationId"], outputs: ["onDeleteAllHistory", "onLogoutAll", "onLogoutSession", "onDeleteAccount"] }] }); }
172
+ }
173
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PersonalizationDialogComponent, decorators: [{
174
+ type: Component,
175
+ args: [{ selector: 'app-personalization-dialog', standalone: true, imports: [
176
+ CommonModule,
177
+ FormsModule,
178
+ MatDialogModule,
179
+ MatButtonModule,
180
+ MatIconModule,
181
+ MatTabsModule,
182
+ MatSlideToggleModule,
183
+ MatFormFieldModule,
184
+ MatInputModule,
185
+ MatSelectModule,
186
+ MatTooltipModule,
187
+ PreferencesSectionComponent,
188
+ ProfileSectionComponent,
189
+ SettingSectionComponent,
190
+ TermsSectionComponent,
191
+ AccountSectionComponent,
192
+ ], template: "<div class=\"personalization-container\">\r\n <div class=\"header\">\r\n <div class=\"title-section\">\r\n <mat-icon class=\"header-icon\">settings_suggest</mat-icon>\r\n <h2>Personalization</h2>\r\n </div>\r\n <button mat-icon-button (click)=\"onCancel()\" matTooltip=\"Close\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"dialog-layout no-padding\">\r\n <!-- Sidebar Navigation -->\r\n <aside class=\"sidebar\">\r\n @for (section of sections; track section.id) {\r\n @if (section.type === 'header') {\r\n <div class=\"nav-header\">{{ section.label }}</div>\r\n } @else {\r\n <div\r\n class=\"nav-item\"\r\n [class.active]=\"activeSection === section.id\"\r\n (click)=\"selectSection(section.id)\"\r\n >\r\n <mat-icon>{{ section.icon }}</mat-icon>\r\n <span>{{ section.label }}</span>\r\n </div>\r\n }\r\n }\r\n </aside>\r\n\r\n <!-- Main Content Area -->\r\n <main class=\"main-content\">\r\n <!-- Appearance / Preferences Section -->\r\n @if (activeSection === 'preferences') {\r\n <app-preferences-section\r\n [settings]=\"settings\"\r\n [colorTokens]=\"colorTokens\"\r\n [isCustomColorSelected]=\"isCustomColorSelected()\"\r\n [defaultColor]=\"personalization.developerDefaults().primaryColor || 'default'\"\r\n (onThemeSelect)=\"selectTheme($event)\"\r\n (onColorSelect)=\"selectColor($event)\"\r\n (onButtonStyleSelect)=\"selectButtonStyle($event)\"\r\n (onSave)=\"onSave()\"\r\n (onReset)=\"onReset()\"\r\n >\r\n </app-preferences-section>\r\n }\r\n\r\n <!-- Account / Profile Section -->\r\n @if (activeSection === 'account_settings') {\r\n <app-account-section\r\n (onDeleteAllHistory)=\"deleteAllHistory()\"\r\n (onLogoutAll)=\"logoutAllDevices()\"\r\n (onDeleteAccount)=\"deleteAccount()\"\r\n ></app-account-section>\r\n }\r\n\r\n @if (activeSection === 'profile') {\r\n <app-profile-section\r\n [username]=\"username\"\r\n [userImageUrl]=\"userImageUrl\"\r\n [userRole]=\"userRole\"\r\n ></app-profile-section>\r\n }\r\n\r\n <!-- General Section -->\r\n @if (activeSection === 'general') {\r\n <app-setting-section\r\n [settings]=\"settings\"\r\n [hasChanges]=\"hasChanges\"\r\n (onSave)=\"onSave()\"\r\n ></app-setting-section>\r\n }\r\n\r\n <!-- Terms and Conditions Section -->\r\n @if (activeSection === 'terms') {\r\n <app-terms-section></app-terms-section>\r\n }\r\n </main>\r\n </mat-dialog-content>\r\n</div>\r\n", styles: [".personalization-container{display:flex;flex-direction:column;width:100%;height:100%;max-width:none;max-height:none;max-height:90vh;background:var(--background-color);color:var(--text-color);border-radius:12px;overflow:hidden;box-shadow:var(--border-shadow-color)}.personalization-container .header{flex:0 0 auto;display:flex;justify-content:space-between;align-items:center;padding:12px 20px;border-bottom:1px solid var(--border-color);background:var(--background-color)}.personalization-container .header .title-section{display:flex;align-items:center;gap:10px}.personalization-container .header .title-section .header-icon{color:var(--secondary-text-color);font-size:20px;width:20px;height:20px}.personalization-container .header .title-section h2{margin:0;font-size:.95rem;font-weight:500;color:var(--secondary-text-color)}.personalization-container .dialog-layout{display:flex;padding:0;margin:0;flex:1;overflow:hidden}.personalization-container .sidebar{width:240px;background:rgba(var(--black-rgb),.02);border-right:1px solid var(--border-color);padding:16px 8px;display:flex;flex-direction:column;gap:2px;overflow-y:auto;scrollbar-gutter:stable}.personalization-container .sidebar::-webkit-scrollbar{width:4px}.personalization-container .sidebar::-webkit-scrollbar-track{background:transparent}.personalization-container .sidebar::-webkit-scrollbar-thumb{background:rgba(var(--black-rgb),.1);border-radius:10px}.personalization-container .sidebar::-webkit-scrollbar-thumb:hover{background:rgba(var(--black-rgb),.2)}.personalization-container .sidebar .nav-header{padding:12px 12px 6px;font-size:.75rem;font-weight:600;text-transform:uppercase;color:var(--secondary-text-color);letter-spacing:.5px}.personalization-container .sidebar .nav-item{display:flex;align-items:center;gap:12px;padding:8px 12px;border-radius:6px;cursor:pointer;transition:all .2s ease;color:var(--text-color)}.personalization-container .sidebar .nav-item mat-icon{font-size:18px;width:18px;height:18px;color:var(--secondary-text-color)}.personalization-container .sidebar .nav-item span{font-size:.9rem;font-weight:400}.personalization-container .sidebar .nav-item:hover{background:rgba(var(--black-rgb),.05)}.personalization-container .sidebar .nav-item.active{background:rgba(var(--primary-color-rgb),.1);font-weight:500;color:var(--primary-color)}.personalization-container .sidebar .nav-item.active mat-icon{color:var(--primary-color)}.personalization-container .main-content{flex:1;overflow-y:auto;background:var(--background-color);position:relative}.personalization-container .main-content::-webkit-scrollbar{width:6px}.personalization-container .main-content::-webkit-scrollbar-track{background:transparent}.personalization-container .main-content::-webkit-scrollbar-thumb{background:rgba(var(--black-rgb),.1);border-radius:10px}.personalization-container .main-content::-webkit-scrollbar-thumb:hover{background:rgba(var(--black-rgb),.2)}.full-width{width:100%}@keyframes slideIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}:host-context(.dark-theme) .personalization-container .sidebar{background:var(--background-color)}\n"] }]
193
+ }], ctorParameters: () => [] });
194
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc29uYWxpemF0aW9uLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb29oYm90L3NyYy9saWIvYXBwL3BlcnNvbmFsaXphdGlvbi9wZXJzb25hbGl6YXRpb24tZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rvb2hib3Qvc3JjL2xpYi9hcHAvcGVyc29uYWxpemF0aW9uL3BlcnNvbmFsaXphdGlvbi1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFD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QUNuQywyQ0FBMkM7SUFDN0MsQ0FBQzsrR0F0S1UsOEJBQThCO21HQUE5Qiw4QkFBOEIsc0ZDakQzQyx5eUZBaUZBLG1vR0RwREksWUFBWSw4QkFDWixXQUFXLDhCQUNYLGVBQWUsMEpBQ2YsZUFBZSwySUFDZixhQUFhLG1MQUNiLGFBQWEsOEJBQ2Isb0JBQW9CLDhCQUNwQixrQkFBa0IsOEJBQ2xCLGNBQWMsOEJBQ2QsZUFBZSw4QkFDZixnQkFBZ0IsNlRBQ2hCLDJCQUEyQiwyT0FDM0IsdUJBQXVCLGtIQUN2Qix1QkFBdUIseUhBQ3ZCLHFCQUFxQiw4REFDckIsdUJBQXVCOzs0RkFLZCw4QkFBOEI7a0JBeEIxQyxTQUFTOytCQUNFLDRCQUE0QixjQUMxQixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixXQUFXO3dCQUNYLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZixhQUFhO3dCQUNiLGFBQWE7d0JBQ2Isb0JBQW9CO3dCQUNwQixrQkFBa0I7d0JBQ2xCLGNBQWM7d0JBQ2QsZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLDJCQUEyQjt3QkFDM0IsdUJBQXVCO3dCQUN2Qix1QkFBdUI7d0JBQ3ZCLHFCQUFxQjt3QkFDckIsdUJBQXVCO3FCQUN4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdERpYWxvZ01vZHVsZSwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBNYXRUYWJzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFicyc7XHJcbmltcG9ydCB7IE1hdFNsaWRlVG9nZ2xlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGUtdG9nZ2xlJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xyXG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XHJcbmltcG9ydCB7IFByZWZlcmVuY2VzU2VjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vc2VjdGlvbnMvcHJlZmVyZW5jZXMvcHJlZmVyZW5jZXMtc2VjdGlvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQcm9maWxlU2VjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vc2VjdGlvbnMvcHJvZmlsZS9wcm9maWxlLXNlY3Rpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgVGVybXNTZWN0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9zZWN0aW9ucy90ZXJtcy90ZXJtcy1zZWN0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNldHRpbmdTZWN0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9zZWN0aW9ucy9zZXR0aW5ncy9zZXR0aW5nLXNlY3Rpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgQWNjb3VudFNlY3Rpb25Db21wb25lbnQgfSBmcm9tICcuL3NlY3Rpb25zL2FjY291bnQvYWNjb3VudC1zZWN0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENoYXRIaXN0b3J5U2VydmljZSB9IGZyb20gJy4uL2NoYXQvc2VydmljZXMvY2hhdC1oaXN0b3J5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvYXV0aC9hdXRoLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQZXJzb25hbGl6YXRpb25TZXJ2aWNlLCBQZXJzb25hbGl6YXRpb25TZXR0aW5ncyB9IGZyb20gJy4vcGVyc29uYWxpemF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2RpYWxvZy9kaWFsb2cuc2VydmljZSc7XHJcbmltcG9ydCB7IERpYWxvZ1V0aWxzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2RpYWxvZy9kaWFsb2cudXRpbHMnO1xyXG5pbXBvcnQgeyBTbmFja2JhclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc25hY2tiYXIvc25hY2tiYXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFRoZW1lU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvdGhlbWUuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1wZXJzb25hbGl6YXRpb24tZGlhbG9nJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgTWF0RGlhbG9nTW9kdWxlLFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICAgIE1hdFRhYnNNb2R1bGUsXHJcbiAgICBNYXRTbGlkZVRvZ2dsZU1vZHVsZSxcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcclxuICAgIE1hdElucHV0TW9kdWxlLFxyXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcclxuICAgIFByZWZlcmVuY2VzU2VjdGlvbkNvbXBvbmVudCxcclxuICAgIFByb2ZpbGVTZWN0aW9uQ29tcG9uZW50LFxyXG4gICAgU2V0dGluZ1NlY3Rpb25Db21wb25lbnQsXHJcbiAgICBUZXJtc1NlY3Rpb25Db21wb25lbnQsXHJcbiAgICBBY2NvdW50U2VjdGlvbkNvbXBvbmVudCxcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wZXJzb25hbGl6YXRpb24tZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9wZXJzb25hbGl6YXRpb24tZGlhbG9nLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQZXJzb25hbGl6YXRpb25EaWFsb2dDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgZGlhbG9nUmVmID0gaW5qZWN0KE1hdERpYWxvZ1JlZjxQZXJzb25hbGl6YXRpb25EaWFsb2dDb21wb25lbnQ+KTtcclxuICBwcml2YXRlIGRpYWxvZ1NlcnZpY2UgPSBpbmplY3QoRGlhbG9nU2VydmljZSk7XHJcbiAgcHVibGljIHBlcnNvbmFsaXphdGlvbiA9IGluamVjdChQZXJzb25hbGl6YXRpb25TZXJ2aWNlKTtcclxuICBwcml2YXRlIGF1dGhTZXJ2aWNlID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcclxuICBwcml2YXRlIGNoYXRIaXN0b3J5ID0gaW5qZWN0KENoYXRIaXN0b3J5U2VydmljZSk7XHJcbiAgcHJpdmF0ZSBzbmFja2JhciA9IGluamVjdChTbmFja2JhclNlcnZpY2UpO1xyXG5cclxuICAvLyBMb2NhbCBjb3B5IG9mIHNldHRpbmdzIGZvciBlZGl0aW5nXHJcbiAgcHVibGljIHNldHRpbmdzOiBQZXJzb25hbGl6YXRpb25TZXR0aW5ncyA9IEpTT04ucGFyc2UoXHJcbiAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnBlcnNvbmFsaXphdGlvbi5zZXR0aW5ncygpKSxcclxuICApO1xyXG5cclxuICBwdWJsaWMgYWN0aXZlU2VjdGlvbiA9ICdwcm9maWxlJztcclxuXHJcbiAgcHVibGljIHNlY3Rpb25zID0gW1xyXG4gICAgeyBpZDogJ2FjY291bnQnLCBsYWJlbDogJ0FjY291bnQnLCB0eXBlOiAnaGVhZGVyJyB9LFxyXG4gICAgeyBpZDogJ3Byb2ZpbGUnLCBsYWJlbDogJ015IHByb2ZpbGUnLCBpY29uOiAncGVyc29uX291dGxpbmUnLCB0eXBlOiAnaXRlbScgfSxcclxuICAgIHsgaWQ6ICdhY2NvdW50X3NldHRpbmdzJywgbGFiZWw6ICdNYW5hZ2UgQWNjb3VudCcsIGljb246ICdtYW5hZ2VfYWNjb3VudHMnLCB0eXBlOiAnaXRlbScgfSxcclxuICAgIHsgaWQ6ICdwcmVmZXJlbmNlcycsIGxhYmVsOiAnUHJlZmVyZW5jZXMnLCBpY29uOiAndHVuZScsIHR5cGU6ICdpdGVtJyB9LFxyXG4gICAgeyBpZDogJ3dvcmtzcGFjZScsIGxhYmVsOiAnV29ya3NwYWNlJywgdHlwZTogJ2hlYWRlcicgfSxcclxuICAgIHsgaWQ6ICdnZW5lcmFsJywgbGFiZWw6ICdTZXR0aW5ncycsIGljb246ICdzZXR0aW5ncycsIHR5cGU6ICdpdGVtJyB9LFxyXG4gICAgeyBpZDogJ2luZm8nLCBsYWJlbDogJ1N1cHBvcnQnLCB0eXBlOiAnaGVhZGVyJyB9LFxyXG4gICAgeyBpZDogJ3Rlcm1zJywgbGFiZWw6ICdUZXJtcyAmIENvbmRpdGlvbnMnLCBpY29uOiAnZGVzY3JpcHRpb24nLCB0eXBlOiAnaXRlbScgfSxcclxuICBdO1xyXG5cclxuICBwdWJsaWMgY29sb3JUb2tlbnMgPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdTdGFuZGFyZCcsXHJcbiAgICAgIHZhbHVlOiAnZGVmYXVsdCcsXHJcbiAgICB9LFxyXG4gICAgeyBuYW1lOiAnUHVycGxlJywgdmFsdWU6ICcjN2MzYWVkJyB9LFxyXG4gICAgeyBuYW1lOiAnUGluaycsIHZhbHVlOiAnI2RiMjc3NycgfSxcclxuICAgIHsgbmFtZTogJ1JlZCcsIHZhbHVlOiAnI2RjMjYyNicgfSxcclxuICAgIHsgbmFtZTogJ09yYW5nZScsIHZhbHVlOiAnI2VhNTgwYycgfSxcclxuICAgIHsgbmFtZTogJ0dyZWVuJywgdmFsdWU6ICcjMTZhMzRhJyB9LFxyXG4gICAgeyBuYW1lOiAnVGVhbCcsIHZhbHVlOiAnIzBkOTQ4OCcgfSxcclxuICAgIHsgbmFtZTogJ0JsdWUnLCB2YWx1ZTogJyMyNTYzZWInIH0sXHJcbiAgXTtcclxuXHJcbiAgcHJpdmF0ZSB0aGVtZVNlcnZpY2UgPSBpbmplY3QoVGhlbWVTZXJ2aWNlKTtcclxuICBwcml2YXRlIG9yaWdpbmFsQ29sb3I6IHN0cmluZyA9ICcnO1xyXG4gIHByaXZhdGUgaXNTYXZlZCA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMub3JpZ2luYWxDb2xvciA9IHRoaXMucGVyc29uYWxpemF0aW9uLnNldHRpbmdzKCkuYXBwZWFyYW5jZS5wcmltYXJ5Q29sb3I7XHJcbiAgfVxyXG5cclxuICBvblNhdmUoKSB7XHJcbiAgICBpZiAodGhpcy5hY3RpdmVTZWN0aW9uID09PSAncHJlZmVyZW5jZXMnKSB7XHJcbiAgICAgIHRoaXMuaXNTYXZlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMucGVyc29uYWxpemF0aW9uLnVwZGF0ZUFwcGVhcmFuY2UodGhpcy5zZXR0aW5ncy5hcHBlYXJhbmNlKTtcclxuICAgICAgLy8gUmUtYXBwbHkgdG8gZW5zdXJlIGNvbnNpc3RlbmN5IChlZmZlY3QgaGFuZGxlcyBpdCwgYnV0IGp1c3QgaW4gY2FzZSlcclxuICAgICAgdGhpcy5zbmFja2Jhci5zdWNjZXNzKCdBcHBlYXJhbmNlIHNldHRpbmdzIHNhdmVkJyk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlU2VjdGlvbiA9PT0gJ2dlbmVyYWwnKSB7XHJcbiAgICAgIHRoaXMucGVyc29uYWxpemF0aW9uLnVwZGF0ZUluc3RydWN0aW9ucyh0aGlzLnNldHRpbmdzLmN1c3RvbUluc3RydWN0aW9ucyk7XHJcbiAgICAgIHRoaXMuc25hY2tiYXIuc3VjY2VzcygnU2V0dGluZ3Mgc2F2ZWQnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ2FuY2VsKCkge1xyXG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoZmFsc2UpO1xyXG4gICAgLy8gbmdPbkRlc3Ryb3kgd2lsbCBoYW5kbGUgcmV2ZXJ0XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICghdGhpcy5pc1NhdmVkKSB7XHJcbiAgICAgIC8vIFJldmVydCB0byBvcmlnaW5hbCBjb2xvciBpZiBub3Qgc2F2ZWRcclxuICAgICAgdGhpcy50aGVtZVNlcnZpY2UuYXBwbHlQcmltYXJ5Q29sb3JUb0dsb2JhbCh0aGlzLm9yaWdpbmFsQ29sb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25SZXNldCgpIHtcclxuICAgIERpYWxvZ1V0aWxzLmNvbmZpcm1SZXNldCh0aGlzLmRpYWxvZ1NlcnZpY2UpLnN1YnNjcmliZSgoY29uZmlybWVkKSA9PiB7XHJcbiAgICAgIGlmIChjb25maXJtZWQpIHtcclxuICAgICAgICAvLyBPbmx5IHJlc2V0IHRoZSBjdXJyZW50IHNlY3Rpb25cclxuICAgICAgICBpZiAodGhpcy5hY3RpdmVTZWN0aW9uID09PSAncHJlZmVyZW5jZXMnKSB7XHJcbiAgICAgICAgICAvLyBSZXNldCBvbmx5IGFwcGVhcmFuY2Ugc2V0dGluZ3MgdG8gZGVmYXVsdHNcclxuICAgICAgICAgIHRoaXMucGVyc29uYWxpemF0aW9uLnJlc2V0VG9EZWZhdWx0cygpO1xyXG4gICAgICAgICAgLy8gUmUtY2xvbmUgc2V0dGluZ3MgdG8gdXBkYXRlIFVJXHJcbiAgICAgICAgICB0aGlzLnNldHRpbmdzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLnBlcnNvbmFsaXphdGlvbi5zZXR0aW5ncygpKSk7XHJcblxyXG4gICAgICAgICAgLy8gTGl2ZSBwcmV2aWV3IHRoZSByZXNldFxyXG4gICAgICAgICAgdGhpcy50aGVtZVNlcnZpY2UuYXBwbHlQcmltYXJ5Q29sb3JUb0dsb2JhbCh0aGlzLnNldHRpbmdzLmFwcGVhcmFuY2UucHJpbWFyeUNvbG9yKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0VGhlbWUodGhlbWU6ICdsaWdodCcgfCAnZGFyaycgfCAnYXV0bycpIHtcclxuICAgIHRoaXMuc2V0dGluZ3MuYXBwZWFyYW5jZS50aGVtZSA9IHRoZW1lO1xyXG4gICAgLy8gT3B0aW9uYWw6IFByZXZpZXcgdGhlbWU/IFVzZXIgb25seSBhc2tlZCBmb3IgY29sb3IuXHJcbiAgfVxyXG5cclxuICBzZWxlY3RDb2xvcihjb2xvcjogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNldHRpbmdzLmFwcGVhcmFuY2UucHJpbWFyeUNvbG9yID0gY29sb3I7XHJcbiAgICAvLyEgTGl2ZSBQcmV2aWV3IGZvciBjaGFuZ2VkIGNvbG9yXHJcbiAgICAvLyB0aGlzLnRoZW1lU2VydmljZS5hcHBseVByaW1hcnlDb2xvclRvR2xvYmFsKGNvbG9yKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdEJ1dHRvblN0eWxlKHN0eWxlOiAnZmFiJyB8ICdzaWRlYmFyJyB8ICdzaWRlYmFyLXRvcCcgfCAnc2lkZWJhci1ib3R0b20nKSB7XHJcbiAgICB0aGlzLnNldHRpbmdzLmFwcGVhcmFuY2UuYnV0dG9uU3R5bGUgPSBzdHlsZTtcclxuICB9XHJcblxyXG4gIHNlbGVjdFNlY3Rpb24oc2VjdGlvbklkOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLnNlY3Rpb25zLmZpbmQoKHMpID0+IHMuaWQgPT09IHNlY3Rpb25JZCAmJiBzLnR5cGUgPT09ICdpdGVtJykpIHtcclxuICAgICAgdGhpcy5hY3RpdmVTZWN0aW9uID0gc2VjdGlvbklkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc0NoYW5nZXMoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5hY3RpdmVTZWN0aW9uID09PSAncHJlZmVyZW5jZXMnKSByZXR1cm4gdGhpcy5oYXNQcmVmZXJlbmNlc0NoYW5nZXMoKTtcclxuICAgIGlmICh0aGlzLmFjdGl2ZVNlY3Rpb24gPT09ICdnZW5lcmFsJykgcmV0dXJuIHRoaXMuaGFzSW5zdHJ1Y3Rpb25DaGFuZ2VzKCk7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBoYXNQcmVmZXJlbmNlc0NoYW5nZXMoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBvcmlnaW5hbCA9IHRoaXMucGVyc29uYWxpemF0aW9uLnNldHRpbmdzKCkuYXBwZWFyYW5jZTtcclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnNldHRpbmdzLmFwcGVhcmFuY2U7XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob3JpZ2luYWwpICE9PSBKU09OLnN0cmluZ2lmeShjdXJyZW50KTtcclxuICB9XHJcblxyXG4gIGhhc0luc3RydWN0aW9uQ2hhbmdlcygpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IG9yaWdpbmFsID0gdGhpcy5wZXJzb25hbGl6YXRpb24uc2V0dGluZ3MoKS5jdXN0b21JbnN0cnVjdGlvbnM7XHJcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5zZXR0aW5ncy5jdXN0b21JbnN0cnVjdGlvbnM7XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob3JpZ2luYWwpICE9PSBKU09OLnN0cmluZ2lmeShjdXJyZW50KTtcclxuICB9XHJcblxyXG4gIGdldCB1c2VybmFtZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VkSW5Vc2VyTmFtZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHVzZXJJbWFnZVVybCgpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlZEluVXNlckltYWdlVXJsKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgdXNlclJvbGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlZEluVXNlclJvbGUoKTtcclxuICB9XHJcblxyXG4gIGlzQ3VzdG9tQ29sb3JTZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhdGhpcy5jb2xvclRva2Vucy5zb21lKFxyXG4gICAgICAodG9rZW4pID0+IHRva2VuLnZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IHRoaXMuc2V0dGluZ3MuYXBwZWFyYW5jZS5wcmltYXJ5Q29sb3IudG9Mb3dlckNhc2UoKSxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBvbkN1c3RvbUNvbG9yQ2hhbmdlKGV2ZW50OiBFdmVudCkge1xyXG4gICAgY29uc3QgY29sb3IgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xyXG4gICAgdGhpcy5zZWxlY3RDb2xvcihjb2xvcik7XHJcbiAgfVxyXG5cclxuICBkZWxldGVBbGxIaXN0b3J5KCkge1xyXG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5hdXRoU2VydmljZS5nZXRVc2VySWQoKSB8fCAnJztcclxuICAgIHRoaXMuY2hhdEhpc3RvcnkuZGVsZXRlQWxsSGlzdG9yeSh1c2VySWQudG9TdHJpbmcoKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgLy8gSGlzdG9yeSBjbGVhcmVkXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGxvZ291dEFsbERldmljZXMoKSB7XHJcbiAgICBjb25zb2xlLmxvZygnTG9nZ2luZyBvdXQgb2YgYWxsIGRldmljZXMuLi4nKTtcclxuICAgIC8vIEltcGxlbWVudCBzZXJ2aWNlIGNhbGwgd2hlbiBBUEkgaXMgcmVhZHlcclxuICB9XHJcblxyXG4gIGRlbGV0ZUFjY291bnQoKSB7XHJcbiAgICBjb25zb2xlLmxvZygnRGVsZXRpbmcgYWNjb3VudC4uLicpO1xyXG4gICAgLy8gSW1wbGVtZW50IHNlcnZpY2UgY2FsbCB3aGVuIEFQSSBpcyByZWFkeVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwicGVyc29uYWxpemF0aW9uLWNvbnRhaW5lclwiPlxyXG4gIDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0aXRsZS1zZWN0aW9uXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImhlYWRlci1pY29uXCI+c2V0dGluZ3Nfc3VnZ2VzdDwvbWF0LWljb24+XHJcbiAgICAgIDxoMj5QZXJzb25hbGl6YXRpb248L2gyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwib25DYW5jZWwoKVwiIG1hdFRvb2x0aXA9XCJDbG9zZVwiPlxyXG4gICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxtYXQtZGlhbG9nLWNvbnRlbnQgY2xhc3M9XCJkaWFsb2ctbGF5b3V0IG5vLXBhZGRpbmdcIj5cclxuICAgIDwhLS0gU2lkZWJhciBOYXZpZ2F0aW9uIC0tPlxyXG4gICAgPGFzaWRlIGNsYXNzPVwic2lkZWJhclwiPlxyXG4gICAgICBAZm9yIChzZWN0aW9uIG9mIHNlY3Rpb25zOyB0cmFjayBzZWN0aW9uLmlkKSB7XHJcbiAgICAgICAgQGlmIChzZWN0aW9uLnR5cGUgPT09ICdoZWFkZXInKSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibmF2LWhlYWRlclwiPnt7IHNlY3Rpb24ubGFiZWwgfX08L2Rpdj5cclxuICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJuYXYtaXRlbVwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlU2VjdGlvbiA9PT0gc2VjdGlvbi5pZFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RTZWN0aW9uKHNlY3Rpb24uaWQpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPG1hdC1pY29uPnt7IHNlY3Rpb24uaWNvbiB9fTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7IHNlY3Rpb24ubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIDwvYXNpZGU+XHJcblxyXG4gICAgPCEtLSBNYWluIENvbnRlbnQgQXJlYSAtLT5cclxuICAgIDxtYWluIGNsYXNzPVwibWFpbi1jb250ZW50XCI+XHJcbiAgICAgIDwhLS0gQXBwZWFyYW5jZSAvIFByZWZlcmVuY2VzIFNlY3Rpb24gLS0+XHJcbiAgICAgIEBpZiAoYWN0aXZlU2VjdGlvbiA9PT0gJ3ByZWZlcmVuY2VzJykge1xyXG4gICAgICAgIDxhcHAtcHJlZmVyZW5jZXMtc2VjdGlvblxyXG4gICAgICAgICAgW3NldHRpbmdzXT1cInNldHRpbmdzXCJcclxuICAgICAgICAgIFtjb2xvclRva2Vuc109XCJjb2xvclRva2Vuc1wiXHJcbiAgICAgICAgICBbaXNDdXN0b21Db2xvclNlbGVjdGVkXT1cImlzQ3VzdG9tQ29sb3JTZWxlY3RlZCgpXCJcclxuICAgICAgICAgIFtkZWZhdWx0Q29sb3JdPVwicGVyc29uYWxpemF0aW9uLmRldmVsb3BlckRlZmF1bHRzKCkucHJpbWFyeUNvbG9yIHx8ICdkZWZhdWx0J1wiXHJcbiAgICAgICAgICAob25UaGVtZVNlbGVjdCk9XCJzZWxlY3RUaGVtZSgkZXZlbnQpXCJcclxuICAgICAgICAgIChvbkNvbG9yU2VsZWN0KT1cInNlbGVjdENvbG9yKCRldmVudClcIlxyXG4gICAgICAgICAgKG9uQnV0dG9uU3R5bGVTZWxlY3QpPVwic2VsZWN0QnV0dG9uU3R5bGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAob25TYXZlKT1cIm9uU2F2ZSgpXCJcclxuICAgICAgICAgIChvblJlc2V0KT1cIm9uUmVzZXQoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDwvYXBwLXByZWZlcmVuY2VzLXNlY3Rpb24+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIDwhLS0gQWNjb3VudCAvIFByb2ZpbGUgU2VjdGlvbiAtLT5cclxuICAgICAgQGlmIChhY3RpdmVTZWN0aW9uID09PSAnYWNjb3VudF9zZXR0aW5ncycpIHtcclxuICAgICAgICA8YXBwLWFjY291bnQtc2VjdGlvblxyXG4gICAgICAgICAgKG9uRGVsZXRlQWxsSGlzdG9yeSk9XCJkZWxldGVBbGxIaXN0b3J5KClcIlxyXG4gICAgICAgICAgKG9uTG9nb3V0QWxsKT1cImxvZ291dEFsbERldmljZXMoKVwiXHJcbiAgICAgICAgICAob25EZWxldGVBY2NvdW50KT1cImRlbGV0ZUFjY291bnQoKVwiXHJcbiAgICAgICAgPjwvYXBwLWFjY291bnQtc2VjdGlvbj5cclxuICAgICAgfVxyXG5cclxuICAgICAgQGlmIChhY3RpdmVTZWN0aW9uID09PSAncHJvZmlsZScpIHtcclxuICAgICAgICA8YXBwLXByb2ZpbGUtc2VjdGlvblxyXG4gICAgICAgICAgW3VzZXJuYW1lXT1cInVzZXJuYW1lXCJcclxuICAgICAgICAgIFt1c2VySW1hZ2VVcmxdPVwidXNlckltYWdlVXJsXCJcclxuICAgICAgICAgIFt1c2VyUm9sZV09XCJ1c2VyUm9sZVwiXHJcbiAgICAgICAgPjwvYXBwLXByb2ZpbGUtc2VjdGlvbj5cclxuICAgICAgfVxyXG5cclxuICAgICAgPCEtLSBHZW5lcmFsIFNlY3Rpb24gLS0+XHJcbiAgICAgIEBpZiAoYWN0aXZlU2VjdGlvbiA9PT0gJ2dlbmVyYWwnKSB7XHJcbiAgICAgICAgPGFwcC1zZXR0aW5nLXNlY3Rpb25cclxuICAgICAgICAgIFtzZXR0aW5nc109XCJzZXR0aW5nc1wiXHJcbiAgICAgICAgICBbaGFzQ2hhbmdlc109XCJoYXNDaGFuZ2VzXCJcclxuICAgICAgICAgIChvblNhdmUpPVwib25TYXZlKClcIlxyXG4gICAgICAgID48L2FwcC1zZXR0aW5nLXNlY3Rpb24+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIDwhLS0gVGVybXMgYW5kIENvbmRpdGlvbnMgU2VjdGlvbiAtLT5cclxuICAgICAgQGlmIChhY3RpdmVTZWN0aW9uID09PSAndGVybXMnKSB7XHJcbiAgICAgICAgPGFwcC10ZXJtcy1zZWN0aW9uPjwvYXBwLXRlcm1zLXNlY3Rpb24+XHJcbiAgICAgIH1cclxuICAgIDwvbWFpbj5cclxuICA8L21hdC1kaWFsb2ctY29udGVudD5cclxuPC9kaXY+XHJcbiJdfQ==
@@ -0,0 +1,149 @@
1
+ import { Injectable, signal, inject, effect } from '@angular/core';
2
+ import { StorageService } from '../../core/auth/storage.service';
3
+ import { AuthService } from '../../core/auth/auth.service';
4
+ import { toSignal } from '@angular/core/rxjs-interop';
5
+ import * as i0 from "@angular/core";
6
+ const BASE_STORAGE_KEY = 'app.personalization.v1';
7
+ const DEFAULT_SETTINGS = {
8
+ customInstructions: {
9
+ enabled: false,
10
+ aboutUser: '',
11
+ responseStyle: '',
12
+ characteristics: {
13
+ warm: 'Default',
14
+ enthusiastic: 'Default',
15
+ headersAndLists: 'Default',
16
+ emoji: 'Default',
17
+ },
18
+ aboutYou: {
19
+ nickname: '',
20
+ occupation: '',
21
+ },
22
+ },
23
+ appearance: {
24
+ theme: 'auto',
25
+ primaryColor: 'default',
26
+ buttonStyle: 'fab',
27
+ },
28
+ meta: {
29
+ version: 1,
30
+ lastUpdated: Date.now(),
31
+ },
32
+ };
33
+ export class PersonalizationService {
34
+ constructor() {
35
+ this.storage = inject(StorageService);
36
+ this.authService = inject(AuthService);
37
+ // Reactive Authentication Status
38
+ this.authStatus = toSignal(this.authService.authStatus$);
39
+ // State Signals
40
+ this._settings = signal(DEFAULT_SETTINGS);
41
+ this.settings = this._settings.asReadonly();
42
+ // Developer-provided defaults (from DoohbotInput)
43
+ this._developerDefaults = signal({});
44
+ this.developerDefaults = this._developerDefaults.asReadonly();
45
+ // Reload settings when auth status changes (user logins or logouts)
46
+ effect(() => {
47
+ const status = this.authStatus();
48
+ this._settings.set(this.loadSettings());
49
+ }, { allowSignalWrites: true });
50
+ // Automatically persist changes when settings signal updates
51
+ effect(() => {
52
+ const currentSettings = this._settings();
53
+ this.saveSettings(currentSettings);
54
+ });
55
+ }
56
+ getStorageKey() {
57
+ const userId = this.authService.getUserId();
58
+ return userId ? `${BASE_STORAGE_KEY}_${userId}` : BASE_STORAGE_KEY;
59
+ }
60
+ /**
61
+ * Update custom instructions
62
+ */
63
+ updateInstructions(instructions) {
64
+ this._settings.update((s) => ({
65
+ ...s,
66
+ customInstructions: { ...s.customInstructions, ...instructions },
67
+ meta: { ...s.meta, lastUpdated: Date.now() },
68
+ }));
69
+ }
70
+ /**
71
+ * Update appearance settings
72
+ */
73
+ updateAppearance(appearance) {
74
+ this._settings.update((s) => ({
75
+ ...s,
76
+ appearance: { ...s.appearance, ...appearance },
77
+ meta: { ...s.meta, lastUpdated: Date.now() },
78
+ }));
79
+ }
80
+ /**
81
+ * Set initial developer defaults (called from DoohbotComponent)
82
+ */
83
+ setDeveloperDefaults(defaults) {
84
+ this._developerDefaults.set(defaults);
85
+ // Refresh settings to apply defaults if no user settings are saved
86
+ this._settings.set(this.loadSettings());
87
+ }
88
+ /**
89
+ * Reset all personalization to defaults
90
+ */
91
+ resetToDefaults() {
92
+ this._settings.set({
93
+ ...DEFAULT_SETTINGS,
94
+ meta: { ...DEFAULT_SETTINGS.meta, lastUpdated: Date.now() },
95
+ });
96
+ }
97
+ /**
98
+ * Get the formatted instructions block for chat requests
99
+ */
100
+ getFormattedInstructions() {
101
+ const s = this._settings().customInstructions;
102
+ if (!s.enabled)
103
+ return '';
104
+ let block = '--- CUSTOM INSTRUCTIONS ---\n';
105
+ if (s.aboutUser) {
106
+ block += `USER CONTEXT: ${s.aboutUser}\n`;
107
+ }
108
+ if (s.responseStyle) {
109
+ block += `RESPONSE STYLE: ${s.responseStyle}\n`;
110
+ }
111
+ block += '---------------------------';
112
+ return s.aboutUser || s.responseStyle ? block : '';
113
+ }
114
+ loadSettings() {
115
+ try {
116
+ const key = this.getStorageKey();
117
+ // StorageService.get handles decryption/parsing
118
+ const saved = this.storage.get(key);
119
+ if (saved) {
120
+ return { ...DEFAULT_SETTINGS, ...saved };
121
+ }
122
+ }
123
+ catch (e) {
124
+ console.error('Failed to load personalization settings', e);
125
+ }
126
+ // Return defaults merged with developer overrides
127
+ return {
128
+ ...DEFAULT_SETTINGS,
129
+ appearance: {
130
+ ...DEFAULT_SETTINGS.appearance,
131
+ ...this._developerDefaults(),
132
+ primaryColor: 'default', //! Force 'default' for fresh loads so it resolves dynamically
133
+ },
134
+ };
135
+ }
136
+ saveSettings(settings) {
137
+ const key = this.getStorageKey();
138
+ this.storage.set(key, settings);
139
+ }
140
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PersonalizationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
141
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PersonalizationService, providedIn: 'root' }); }
142
+ }
143
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PersonalizationService, decorators: [{
144
+ type: Injectable,
145
+ args: [{
146
+ providedIn: 'root',
147
+ }]
148
+ }], ctorParameters: () => [] });
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc29uYWxpemF0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb29oYm90L3NyYy9saWIvYXBwL3BlcnNvbmFsaXphdGlvbi9wZXJzb25hbGl6YXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQXFDdEQsTUFBTSxnQkFBZ0IsR0FBRyx3QkFBd0IsQ0FBQztBQUVsRCxNQUFNLGdCQUFnQixHQUE0QjtJQUNoRCxrQkFBa0IsRUFBRTtRQUNsQixPQUFPLEVBQUUsS0FBSztRQUNkLFNBQVMsRUFBRSxFQUFFO1FBQ2IsYUFBYSxFQUFFLEVBQUU7UUFDakIsZUFBZSxFQUFFO1lBQ2YsSUFBSSxFQUFFLFNBQVM7WUFDZixZQUFZLEVBQUUsU0FBUztZQUN2QixlQUFlLEVBQUUsU0FBUztZQUMxQixLQUFLLEVBQUUsU0FBUztTQUNqQjtRQUNELFFBQVEsRUFBRTtZQUNSLFFBQVEsRUFBRSxFQUFFO1lBQ1osVUFBVSxFQUFFLEVBQUU7U0FDZjtLQUNGO0lBQ0QsVUFBVSxFQUFFO1FBQ1YsS0FBSyxFQUFFLE1BQU07UUFDYixZQUFZLEVBQUUsU0FBUztRQUN2QixXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELElBQUksRUFBRTtRQUNKLE9BQU8sRUFBRSxDQUFDO1FBQ1YsV0FBVyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7S0FDeEI7Q0FDRixDQUFDO0FBS0YsTUFBTSxPQUFPLHNCQUFzQjtJQWVqQztRQWRR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QUksQ0FBQyxrQkFBa0IsRUFBRTtnQkFDNUIsWUFBWSxFQUFFLFNBQVMsRUFBRSwrREFBK0Q7YUFDekY7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLFlBQVksQ0FBQyxRQUFpQztRQUNwRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7K0dBM0hVLHNCQUFzQjttSEFBdEIsc0JBQXNCLGNBRnJCLE1BQU07OzRGQUVQLHNCQUFzQjtrQkFIbEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBzaWduYWwsIGluamVjdCwgZWZmZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9hdXRoL3N0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9hdXRoL2F1dGguc2VydmljZSc7XHJcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDaGFyYWN0ZXJpc3RpY3Mge1xyXG4gIHdhcm06IHN0cmluZztcclxuICBlbnRodXNpYXN0aWM6IHN0cmluZztcclxuICBoZWFkZXJzQW5kTGlzdHM6IHN0cmluZztcclxuICBlbW9qaTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEFib3V0WW91IHtcclxuICBuaWNrbmFtZTogc3RyaW5nO1xyXG4gIG9jY3VwYXRpb246IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDdXN0b21JbnN0cnVjdGlvbnMge1xyXG4gIGVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgYWJvdXRVc2VyOiBzdHJpbmc7XHJcbiAgcmVzcG9uc2VTdHlsZTogc3RyaW5nO1xyXG4gIGNoYXJhY3RlcmlzdGljczogQ2hhcmFjdGVyaXN0aWNzO1xyXG4gIGFib3V0WW91OiBBYm91dFlvdTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBcHBlYXJhbmNlU2V0dGluZ3Mge1xyXG4gIHRoZW1lOiAnbGlnaHQnIHwgJ2RhcmsnIHwgJ2F1dG8nO1xyXG4gIHByaW1hcnlDb2xvcjogc3RyaW5nO1xyXG4gIGJ1dHRvblN0eWxlOiAnZmFiJyB8ICdzaWRlYmFyJyB8ICdzaWRlYmFyLXRvcCcgfCAnc2lkZWJhci1ib3R0b20nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFBlcnNvbmFsaXphdGlvblNldHRpbmdzIHtcclxuICBjdXN0b21JbnN0cnVjdGlvbnM6IEN1c3RvbUluc3RydWN0aW9ucztcclxuICBhcHBlYXJhbmNlOiBBcHBlYXJhbmNlU2V0dGluZ3M7XHJcbiAgbWV0YToge1xyXG4gICAgdmVyc2lvbjogbnVtYmVyO1xyXG4gICAgbGFzdFVwZGF0ZWQ6IG51bWJlcjtcclxuICB9O1xyXG59XHJcblxyXG5jb25zdCBCQVNFX1NUT1JBR0VfS0VZID0gJ2FwcC5wZXJzb25hbGl6YXRpb24udjEnO1xyXG5cclxuY29uc3QgREVGQVVMVF9TRVRUSU5HUzogUGVyc29uYWxpemF0aW9uU2V0dGluZ3MgPSB7XHJcbiAgY3VzdG9tSW5zdHJ1Y3Rpb25zOiB7XHJcbiAgICBlbmFibGVkOiBmYWxzZSxcclxuICAgIGFib3V0VXNlcjogJycsXHJcbiAgICByZXNwb25zZVN0eWxlOiAnJyxcclxuICAgIGNoYXJhY3RlcmlzdGljczoge1xyXG4gICAgICB3YXJtOiAnRGVmYXVsdCcsXHJcbiAgICAgIGVudGh1c2lhc3RpYzogJ0RlZmF1bHQnLFxyXG4gICAgICBoZWFkZXJzQW5kTGlzdHM6ICdEZWZhdWx0JyxcclxuICAgICAgZW1vamk6ICdEZWZhdWx0JyxcclxuICAgIH0sXHJcbiAgICBhYm91dFlvdToge1xyXG4gICAgICBuaWNrbmFtZTogJycsXHJcbiAgICAgIG9jY3VwYXRpb246ICcnLFxyXG4gICAgfSxcclxuICB9LFxyXG4gIGFwcGVhcmFuY2U6IHtcclxuICAgIHRoZW1lOiAnYXV0bycsXHJcbiAgICBwcmltYXJ5Q29sb3I6ICdkZWZhdWx0JywgLy8gU3RhbmRhcmQgcHJpbWFyeSBjb2xvciAocmVzb2x2ZXMgdG8gZGV2ZWxvcGVyIGRlZmF1bHQpXHJcbiAgICBidXR0b25TdHlsZTogJ2ZhYicsXHJcbiAgfSxcclxuICBtZXRhOiB7XHJcbiAgICB2ZXJzaW9uOiAxLFxyXG4gICAgbGFzdFVwZGF0ZWQ6IERhdGUubm93KCksXHJcbiAgfSxcclxufTtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQZXJzb25hbGl6YXRpb25TZXJ2aWNlIHtcclxuICBwcml2YXRlIHN0b3JhZ2UgPSBpbmplY3QoU3RvcmFnZVNlcnZpY2UpO1xyXG4gIHByaXZhdGUgYXV0aFNlcnZpY2UgPSBpbmplY3QoQXV0aFNlcnZpY2UpO1xyXG5cclxuICAvLyBSZWFjdGl2ZSBBdXRoZW50aWNhdGlvbiBTdGF0dXNcclxuICBwcml2YXRlIGF1dGhTdGF0dXMgPSB0b1NpZ25hbCh0aGlzLmF1dGhTZXJ2aWNlLmF1dGhTdGF0dXMkKTtcclxuXHJcbiAgLy8gU3RhdGUgU2lnbmFsc1xyXG4gIHByaXZhdGUgX3NldHRpbmdzID0gc2lnbmFsPFBlcnNvbmFsaXphdGlvblNldHRpbmdzPihERUZBVUxUX1NFVFRJTkdTKTtcclxuICBwdWJsaWMgc2V0dGluZ3MgPSB0aGlzLl9zZXR0aW5ncy5hc1JlYWRvbmx5KCk7XHJcblxyXG4gIC8vIERldmVsb3Blci1wcm92aWRlZCBkZWZhdWx0cyAoZnJvbSBEb29oYm90SW5wdXQpXHJcbiAgcHJpdmF0ZSBfZGV2ZWxvcGVyRGVmYXVsdHMgPSBzaWduYWw8UGFydGlhbDxBcHBlYXJhbmNlU2V0dGluZ3M+Pih7fSk7XHJcbiAgcHVibGljIHJlYWRvbmx5IGRldmVsb3BlckRlZmF1bHRzID0gdGhpcy5fZGV2ZWxvcGVyRGVmYXVsdHMuYXNSZWFkb25seSgpO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIC8vIFJlbG9hZCBzZXR0aW5ncyB3aGVuIGF1dGggc3RhdHVzIGNoYW5nZXMgKHVzZXIgbG9naW5zIG9yIGxvZ291dHMpXHJcbiAgICBlZmZlY3QoXHJcbiAgICAgICgpID0+IHtcclxuICAgICAgICBjb25zdCBzdGF0dXMgPSB0aGlzLmF1dGhTdGF0dXMoKTtcclxuICAgICAgICB0aGlzLl9zZXR0aW5ncy5zZXQodGhpcy5sb2FkU2V0dGluZ3MoKSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSwgLy8gVE9ET1xyXG4gICAgKTtcclxuXHJcbiAgICAvLyBBdXRvbWF0aWNhbGx5IHBlcnNpc3QgY2hhbmdlcyB3aGVuIHNldHRpbmdzIHNpZ25hbCB1cGRhdGVzXHJcbiAgICBlZmZlY3QoKCkgPT4ge1xyXG4gICAgICBjb25zdCBjdXJyZW50U2V0dGluZ3MgPSB0aGlzLl9zZXR0aW5ncygpO1xyXG4gICAgICB0aGlzLnNhdmVTZXR0aW5ncyhjdXJyZW50U2V0dGluZ3MpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFN0b3JhZ2VLZXkoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHVzZXJJZCA9IHRoaXMuYXV0aFNlcnZpY2UuZ2V0VXNlcklkKCk7XHJcbiAgICByZXR1cm4gdXNlcklkID8gYCR7QkFTRV9TVE9SQUdFX0tFWX1fJHt1c2VySWR9YCA6IEJBU0VfU1RPUkFHRV9LRVk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgY3VzdG9tIGluc3RydWN0aW9uc1xyXG4gICAqL1xyXG4gIHVwZGF0ZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnM6IFBhcnRpYWw8Q3VzdG9tSW5zdHJ1Y3Rpb25zPikge1xyXG4gICAgdGhpcy5fc2V0dGluZ3MudXBkYXRlKChzKSA9PiAoe1xyXG4gICAgICAuLi5zLFxyXG4gICAgICBjdXN0b21JbnN0cnVjdGlvbnM6IHsgLi4ucy5jdXN0b21JbnN0cnVjdGlvbnMsIC4uLmluc3RydWN0aW9ucyB9LFxyXG4gICAgICBtZXRhOiB7IC4uLnMubWV0YSwgbGFzdFVwZGF0ZWQ6IERhdGUubm93KCkgfSxcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBhcHBlYXJhbmNlIHNldHRpbmdzXHJcbiAgICovXHJcbiAgdXBkYXRlQXBwZWFyYW5jZShhcHBlYXJhbmNlOiBQYXJ0aWFsPEFwcGVhcmFuY2VTZXR0aW5ncz4pIHtcclxuICAgIHRoaXMuX3NldHRpbmdzLnVwZGF0ZSgocykgPT4gKHtcclxuICAgICAgLi4ucyxcclxuICAgICAgYXBwZWFyYW5jZTogeyAuLi5zLmFwcGVhcmFuY2UsIC4uLmFwcGVhcmFuY2UgfSxcclxuICAgICAgbWV0YTogeyAuLi5zLm1ldGEsIGxhc3RVcGRhdGVkOiBEYXRlLm5vdygpIH0sXHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgaW5pdGlhbCBkZXZlbG9wZXIgZGVmYXVsdHMgKGNhbGxlZCBmcm9tIERvb2hib3RDb21wb25lbnQpXHJcbiAgICovXHJcbiAgc2V0RGV2ZWxvcGVyRGVmYXVsdHMoZGVmYXVsdHM6IFBhcnRpYWw8QXBwZWFyYW5jZVNldHRpbmdzPikge1xyXG4gICAgdGhpcy5fZGV2ZWxvcGVyRGVmYXVsdHMuc2V0KGRlZmF1bHRzKTtcclxuICAgIC8vIFJlZnJlc2ggc2V0dGluZ3MgdG8gYXBwbHkgZGVmYXVsdHMgaWYgbm8gdXNlciBzZXR0aW5ncyBhcmUgc2F2ZWRcclxuICAgIHRoaXMuX3NldHRpbmdzLnNldCh0aGlzLmxvYWRTZXR0aW5ncygpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IGFsbCBwZXJzb25hbGl6YXRpb24gdG8gZGVmYXVsdHNcclxuICAgKi9cclxuICByZXNldFRvRGVmYXVsdHMoKSB7XHJcbiAgICB0aGlzLl9zZXR0aW5ncy5zZXQoe1xyXG4gICAgICAuLi5ERUZBVUxUX1NFVFRJTkdTLFxyXG4gICAgICBtZXRhOiB7IC4uLkRFRkFVTFRfU0VUVElOR1MubWV0YSwgbGFzdFVwZGF0ZWQ6IERhdGUubm93KCkgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBmb3JtYXR0ZWQgaW5zdHJ1Y3Rpb25zIGJsb2NrIGZvciBjaGF0IHJlcXVlc3RzXHJcbiAgICovXHJcbiAgZ2V0Rm9ybWF0dGVkSW5zdHJ1Y3Rpb25zKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzID0gdGhpcy5fc2V0dGluZ3MoKS5jdXN0b21JbnN0cnVjdGlvbnM7XHJcbiAgICBpZiAoIXMuZW5hYmxlZCkgcmV0dXJuICcnO1xyXG5cclxuICAgIGxldCBibG9jayA9ICctLS0gQ1VTVE9NIElOU1RSVUNUSU9OUyAtLS1cXG4nO1xyXG4gICAgaWYgKHMuYWJvdXRVc2VyKSB7XHJcbiAgICAgIGJsb2NrICs9IGBVU0VSIENPTlRFWFQ6ICR7cy5hYm91dFVzZXJ9XFxuYDtcclxuICAgIH1cclxuICAgIGlmIChzLnJlc3BvbnNlU3R5bGUpIHtcclxuICAgICAgYmxvY2sgKz0gYFJFU1BPTlNFIFNUWUxFOiAke3MucmVzcG9uc2VTdHlsZX1cXG5gO1xyXG4gICAgfVxyXG4gICAgYmxvY2sgKz0gJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSc7XHJcblxyXG4gICAgcmV0dXJuIHMuYWJvdXRVc2VyIHx8IHMucmVzcG9uc2VTdHlsZSA/IGJsb2NrIDogJyc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRTZXR0aW5ncygpOiBQZXJzb25hbGl6YXRpb25TZXR0aW5ncyB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmdldFN0b3JhZ2VLZXkoKTtcclxuICAgICAgLy8gU3RvcmFnZVNlcnZpY2UuZ2V0IGhhbmRsZXMgZGVjcnlwdGlvbi9wYXJzaW5nXHJcbiAgICAgIGNvbnN0IHNhdmVkID0gdGhpcy5zdG9yYWdlLmdldChrZXkpO1xyXG4gICAgICBpZiAoc2F2ZWQpIHtcclxuICAgICAgICByZXR1cm4geyAuLi5ERUZBVUxUX1NFVFRJTkdTLCAuLi5zYXZlZCB9O1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHBlcnNvbmFsaXphdGlvbiBzZXR0aW5ncycsIGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJldHVybiBkZWZhdWx0cyBtZXJnZWQgd2l0aCBkZXZlbG9wZXIgb3ZlcnJpZGVzXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5ERUZBVUxUX1NFVFRJTkdTLFxyXG4gICAgICBhcHBlYXJhbmNlOiB7XHJcbiAgICAgICAgLi4uREVGQVVMVF9TRVRUSU5HUy5hcHBlYXJhbmNlLFxyXG4gICAgICAgIC4uLnRoaXMuX2RldmVsb3BlckRlZmF1bHRzKCksXHJcbiAgICAgICAgcHJpbWFyeUNvbG9yOiAnZGVmYXVsdCcsIC8vISBGb3JjZSAnZGVmYXVsdCcgIGZvciBmcmVzaCBsb2FkcyBzbyBpdCByZXNvbHZlcyBkeW5hbWljYWxseVxyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2F2ZVNldHRpbmdzKHNldHRpbmdzOiBQZXJzb25hbGl6YXRpb25TZXR0aW5ncykge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRTdG9yYWdlS2V5KCk7XHJcbiAgICB0aGlzLnN0b3JhZ2Uuc2V0KGtleSwgc2V0dGluZ3MpO1xyXG4gIH1cclxufVxyXG4iXX0=