@aakash58/chatbot 1.1.20 → 1.1.21
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.
- package/.editorconfig +17 -0
- package/.vscode/extensions.json +4 -0
- package/.vscode/launch.json +41 -0
- package/.vscode/settings.json +14 -0
- package/.vscode/tasks.json +60 -0
- package/README.md +298 -22
- package/angular.json +132 -0
- package/docs/PUBLISHING_GUIDE.md +104 -0
- package/package.json +75 -29
- package/projects/app-doohbot/public/assets/const/app-const.json +15 -0
- package/projects/app-doohbot/public/assets/const/doohclick_license.json +6 -0
- package/projects/app-doohbot/public/favicon.ico +0 -0
- package/projects/app-doohbot/src/app/app.config.ts +13 -0
- package/projects/app-doohbot/src/app/app.html +31 -0
- package/projects/app-doohbot/src/app/app.routes.ts +3 -0
- package/projects/app-doohbot/src/app/app.scss +279 -0
- package/projects/app-doohbot/src/app/app.spec.ts +23 -0
- package/projects/app-doohbot/src/app/app.ts +72 -0
- package/projects/app-doohbot/src/index.html +15 -0
- package/projects/app-doohbot/src/main.ts +6 -0
- package/projects/app-doohbot/src/styles.scss +15 -0
- package/projects/app-doohbot/tsconfig.app.json +15 -0
- package/projects/app-doohbot/tsconfig.spec.json +14 -0
- package/projects/doohbot/README.md +64 -0
- package/projects/doohbot/docs/README.md +140 -0
- package/projects/doohbot/ng-package.json +10 -0
- package/projects/doohbot/package.json +16 -0
- package/projects/doohbot/src/lib/app/chat/chat-ui-state.service.ts +194 -0
- package/projects/doohbot/src/lib/app/chat/chat.service.ts +547 -0
- package/projects/doohbot/src/lib/app/chat/components/chat-button/chat-button.component.html +27 -0
- package/projects/doohbot/src/lib/app/chat/components/chat-button/chat-button.component.scss +115 -0
- package/projects/doohbot/src/lib/app/chat/components/chat-button/chat-button.component.ts +35 -0
- package/projects/doohbot/src/lib/app/chat/components/chat-footer/chat-footer.component.html +3 -0
- package/projects/doohbot/src/lib/app/chat/components/chat-footer/chat-footer.component.scss +20 -0
- package/projects/doohbot/src/lib/app/chat/components/chat-footer/chat-footer.component.ts +12 -0
- package/projects/doohbot/src/lib/app/chat/components/chat-header/chat-header.component.html +34 -0
- package/projects/doohbot/src/lib/app/chat/components/chat-header/chat-header.component.scss +78 -0
- package/projects/doohbot/src/lib/app/chat/components/chat-header/chat-header.component.ts +52 -0
- package/projects/doohbot/src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.html +77 -0
- package/projects/doohbot/src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.scss +346 -0
- package/projects/doohbot/src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.ts +188 -0
- package/projects/doohbot/src/lib/app/chat/components/chat-window/chat-window.component.html +146 -0
- package/projects/doohbot/src/lib/app/chat/components/chat-window/chat-window.component.scss +187 -0
- package/projects/doohbot/src/lib/app/chat/components/chat-window/chat-window.component.ts +256 -0
- package/projects/doohbot/src/lib/app/chat/components/message-input/message-input.component.html +17 -0
- package/projects/doohbot/src/lib/app/chat/components/message-input/message-input.component.scss +59 -0
- package/projects/doohbot/src/lib/app/chat/components/message-input/message-input.component.ts +28 -0
- package/projects/doohbot/src/lib/app/chat/components/message-list/message-list.component.html +138 -0
- package/projects/doohbot/src/lib/app/chat/components/message-list/message-list.component.scss +436 -0
- package/projects/doohbot/src/lib/app/chat/components/message-list/message-list.component.ts +106 -0
- package/projects/doohbot/src/lib/app/chat/model/chat-history.model.ts +57 -0
- package/projects/doohbot/src/lib/app/chat/model/chat-request.model.ts +17 -0
- package/projects/doohbot/src/lib/app/chat/model/chat-response.model.ts +9 -0
- package/projects/doohbot/src/lib/app/chat/model/chat-session.model.ts +14 -0
- package/{lib/app/chat/model/chat-stream-message.model.d.ts → projects/doohbot/src/lib/app/chat/model/chat-stream-message.model.ts} +6 -5
- package/projects/doohbot/src/lib/app/chat/model/chat-stream-response.model.ts +12 -0
- package/projects/doohbot/src/lib/app/chat/services/chat-api.service.ts +82 -0
- package/projects/doohbot/src/lib/app/chat/services/chat-audio.service.ts +44 -0
- package/projects/doohbot/src/lib/app/chat/services/chat-history.service.ts +303 -0
- package/projects/doohbot/src/lib/app/login/login-form.component.html +80 -0
- package/projects/doohbot/src/lib/app/login/login-form.component.scss +189 -0
- package/projects/doohbot/src/lib/app/login/login-form.component.ts +45 -0
- package/projects/doohbot/src/lib/app/personalization/personalization-dialog.component.html +81 -0
- package/projects/doohbot/src/lib/app/personalization/personalization-dialog.component.scss +179 -0
- package/projects/doohbot/src/lib/app/personalization/personalization-dialog.component.ts +217 -0
- package/projects/doohbot/src/lib/app/personalization/personalization.service.ts +197 -0
- package/projects/doohbot/src/lib/app/personalization/sections/account/account-section.component.html +111 -0
- package/projects/doohbot/src/lib/app/personalization/sections/account/account-section.component.scss +218 -0
- package/projects/doohbot/src/lib/app/personalization/sections/account/account-section.component.ts +121 -0
- package/projects/doohbot/src/lib/app/personalization/sections/instructions/instructions-section.component.html +46 -0
- package/projects/doohbot/src/lib/app/personalization/sections/instructions/instructions-section.component.scss +138 -0
- package/projects/doohbot/src/lib/app/personalization/sections/instructions/instructions-section.component.ts +28 -0
- package/projects/doohbot/src/lib/app/personalization/sections/preferences/color-picker-dialog.component.ts +92 -0
- package/projects/doohbot/src/lib/app/personalization/sections/preferences/preferences-section.component.html +198 -0
- package/projects/doohbot/src/lib/app/personalization/sections/preferences/preferences-section.component.scss +107 -0
- package/projects/doohbot/src/lib/app/personalization/sections/preferences/preferences-section.component.ts +103 -0
- package/projects/doohbot/src/lib/app/personalization/sections/profile/profile-section.component.html +46 -0
- package/projects/doohbot/src/lib/app/personalization/sections/profile/profile-section.component.scss +131 -0
- package/projects/doohbot/src/lib/app/personalization/sections/profile/profile-section.component.ts +23 -0
- package/projects/doohbot/src/lib/app/personalization/sections/settings/setting-section.component.html +33 -0
- package/projects/doohbot/src/lib/app/personalization/sections/settings/setting-section.component.scss +61 -0
- package/projects/doohbot/src/lib/app/personalization/sections/settings/setting-section.component.ts +20 -0
- package/projects/doohbot/src/lib/app/personalization/sections/terms/terms-section.component.html +30 -0
- package/projects/doohbot/src/lib/app/personalization/sections/terms/terms-section.component.scss +59 -0
- package/projects/doohbot/src/lib/app/personalization/sections/terms/terms-section.component.ts +12 -0
- package/projects/doohbot/src/lib/constant/doohbot-constant.ts +40 -0
- package/projects/doohbot/src/lib/constant/html-entities.ts +8 -0
- package/projects/doohbot/src/lib/constant/utf8.ts +9 -0
- package/projects/doohbot/src/lib/core/app-const.ts +63 -0
- package/projects/doohbot/src/lib/core/auth/account-api.service.ts +53 -0
- package/projects/doohbot/src/lib/core/auth/auth.service.ts +478 -0
- package/projects/doohbot/src/lib/core/auth/models/auth-result.model.ts +4 -0
- package/projects/doohbot/src/lib/core/auth/models/federated-login-request.model.ts +5 -0
- package/projects/doohbot/src/lib/core/auth/models/login-request.model.ts +6 -0
- package/projects/doohbot/src/lib/core/auth/storage.service.ts +113 -0
- package/projects/doohbot/src/lib/core/directives/draggable/draggable-dialog.directive.ts +123 -0
- package/projects/doohbot/src/lib/core/directives/draggable/draggable-dialog.module.ts +9 -0
- package/projects/doohbot/src/lib/core/directives/fullscreen/fullscreen.directive.ts +58 -0
- package/projects/doohbot/src/lib/core/directives/fullscreen/fullscreen.module.ts +9 -0
- package/projects/doohbot/src/lib/core/directives/popout/popout.directive.ts +169 -0
- package/projects/doohbot/src/lib/core/directives/popout/popout.module.ts +9 -0
- package/projects/doohbot/src/lib/core/directives/resizable/resizable-dialog.directive.ts +197 -0
- package/projects/doohbot/src/lib/core/directives/resizable/resizable-dialog.module.ts +9 -0
- package/projects/doohbot/src/lib/core/enums/api-request-state.enum.ts +9 -0
- package/projects/doohbot/src/lib/core/environments/environment.prod.ts +14 -0
- package/projects/doohbot/src/lib/core/environments/environment.ts +14 -0
- package/projects/doohbot/src/lib/core/helpers/crypto-helper.service.ts +72 -0
- package/projects/doohbot/src/lib/core/http/http-stream.service.ts +105 -0
- package/projects/doohbot/src/lib/core/http/http.service.ts +148 -0
- package/projects/doohbot/src/lib/core/interceptors/auth.interceptor.ts +118 -0
- package/projects/doohbot/src/lib/core/interceptors/license.interceptor.ts +50 -0
- package/projects/doohbot/src/lib/core/models/api-config.model.ts +82 -0
- package/projects/doohbot/src/lib/core/models/api-request.model.ts +92 -0
- package/projects/doohbot/src/lib/core/models/api-response.model.ts +13 -0
- package/projects/doohbot/src/lib/core/models/doohbot-config.model.ts +109 -0
- package/{lib/core/models/license.model.d.ts → projects/doohbot/src/lib/core/models/license.model.ts} +27 -23
- package/projects/doohbot/src/lib/core/models/message.ts +18 -0
- package/projects/doohbot/src/lib/core/models/theme-config.model.ts +48 -0
- package/projects/doohbot/src/lib/core/services/core-config.service.ts +53 -0
- package/projects/doohbot/src/lib/core/services/doohbot-api.service.ts +207 -0
- package/projects/doohbot/src/lib/core/services/license.service.ts +171 -0
- package/projects/doohbot/src/lib/core/services/markdown.service.ts +73 -0
- package/projects/doohbot/src/lib/core/services/theme.service.ts +305 -0
- package/{lib/core/types/auth-mode.type.d.ts → projects/doohbot/src/lib/core/types/auth-mode.type.ts} +4 -4
- package/{lib/core/types/auth-status.type.d.ts → projects/doohbot/src/lib/core/types/auth-status.type.ts} +5 -4
- package/{lib/core/types/chat-stream.type.d.ts → projects/doohbot/src/lib/core/types/chat-stream.type.ts} +4 -4
- package/{lib/core/types/message-role.type.d.ts → projects/doohbot/src/lib/core/types/message-role.type.ts} +4 -4
- package/{lib/core/types/prompt-mode.type.d.ts → projects/doohbot/src/lib/core/types/prompt-mode.type.ts} +5 -4
- package/{lib/core/types/snackbar-error.type.d.ts → projects/doohbot/src/lib/core/types/snackbar-error.type.ts} +5 -4
- package/{lib/core/types/tenant-resolution-strategy.type.d.ts → projects/doohbot/src/lib/core/types/tenant-resolution-strategy.type.ts} +4 -4
- package/projects/doohbot/src/lib/core/utils/error-handler.util.ts +31 -0
- package/projects/doohbot/src/lib/core/utils/logger.service.ts +45 -0
- package/projects/doohbot/src/lib/doohbot-input.ts +19 -0
- package/projects/doohbot/src/lib/doohbot.component.html +34 -0
- package/projects/doohbot/src/lib/doohbot.component.scss +17 -0
- package/projects/doohbot/src/lib/doohbot.component.spec.ts +31 -0
- package/projects/doohbot/src/lib/doohbot.component.ts +545 -0
- package/projects/doohbot/src/lib/elements.ts +25 -0
- package/projects/doohbot/src/lib/predefined_messages.ts +14 -0
- package/projects/doohbot/src/lib/shared/chips/chips.component.html +9 -0
- package/projects/doohbot/src/lib/shared/chips/chips.component.scss +29 -0
- package/projects/doohbot/src/lib/shared/chips/chips.component.spec.ts +22 -0
- package/projects/doohbot/src/lib/shared/chips/chips.component.ts +20 -0
- package/projects/doohbot/src/lib/shared/dialog/dialog.component.html +29 -0
- package/projects/doohbot/src/lib/shared/dialog/dialog.component.scss +100 -0
- package/projects/doohbot/src/lib/shared/dialog/dialog.component.ts +42 -0
- package/projects/doohbot/src/lib/shared/dialog/dialog.service.ts +62 -0
- package/projects/doohbot/src/lib/shared/dialog/dialog.utils.ts +102 -0
- package/projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.html +30 -0
- package/projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.scss +53 -0
- package/projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.spec.ts +22 -0
- package/projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.ts +35 -0
- package/projects/doohbot/src/lib/shared/input-dialog/input-dialog.component.html +16 -0
- package/projects/doohbot/src/lib/shared/input-dialog/input-dialog.component.scss +45 -0
- package/projects/doohbot/src/lib/shared/input-dialog/input-dialog.component.ts +46 -0
- package/projects/doohbot/src/lib/shared/menu-item/menu-item.component.html +5 -0
- package/projects/doohbot/src/lib/shared/menu-item/menu-item.component.scss +0 -0
- package/projects/doohbot/src/lib/shared/menu-item/menu-item.component.spec.ts +22 -0
- package/projects/doohbot/src/lib/shared/menu-item/menu-item.component.ts +20 -0
- package/projects/doohbot/src/lib/shared/pipes/simple-markdown.pipe.ts +19 -0
- package/projects/doohbot/src/lib/shared/popout/popout.html +1 -0
- package/projects/doohbot/src/lib/shared/popout/popout.scss +0 -0
- package/projects/doohbot/src/lib/shared/popout/popout.spec.ts +23 -0
- package/projects/doohbot/src/lib/shared/popout/popout.ts +11 -0
- package/projects/doohbot/src/lib/shared/snackbar/snackbar.component.html +7 -0
- package/projects/doohbot/src/lib/shared/snackbar/snackbar.component.scss +125 -0
- package/projects/doohbot/src/lib/shared/snackbar/snackbar.component.spec.ts +21 -0
- package/projects/doohbot/src/lib/shared/snackbar/snackbar.component.ts +44 -0
- package/projects/doohbot/src/lib/shared/snackbar/snackbar.service.ts +54 -0
- package/{lib/shared/snackbar/snackbar.utils.d.ts → projects/doohbot/src/lib/shared/snackbar/snackbar.utils.ts} +49 -33
- package/projects/doohbot/src/lib/styles/_theme.scss +132 -0
- package/projects/doohbot/src/lib/styles/material-override.scss +302 -0
- package/projects/doohbot/src/lib/styles/utility.scss +588 -0
- package/projects/doohbot/src/public-api.ts +42 -0
- package/projects/doohbot/tsconfig.lib.json +15 -0
- package/projects/doohbot/tsconfig.lib.prod.json +11 -0
- package/projects/doohbot/tsconfig.spec.json +10 -0
- package/proxy.conf.json +8 -0
- package/publish.config.js +25 -0
- package/scripts/publishing/index.ts +67 -0
- package/scripts/publishing/pipeline/01-clean.ts +11 -0
- package/scripts/publishing/pipeline/02-validate-pre.ts +8 -0
- package/scripts/publishing/pipeline/03-build.ts +7 -0
- package/scripts/publishing/pipeline/04-validate-post.ts +8 -0
- package/scripts/publishing/pipeline/05-prepare-package.ts +29 -0
- package/scripts/publishing/pipeline/06-version.ts +23 -0
- package/scripts/publishing/pipeline/07-publish.ts +14 -0
- package/scripts/publishing/pipeline/08-cleanup.ts +5 -0
- package/scripts/publishing/types.ts +36 -0
- package/scripts/publishing/utils/command.ts +15 -0
- package/scripts/publishing/utils/config.ts +17 -0
- package/scripts/validate.ts +166 -0
- package/tsconfig.json +45 -0
- package/tsconfig.scripts.json +15 -0
- package/esm2022/aakash58-chatbot.mjs +0 -5
- package/esm2022/lib/app/chat/chat-ui-state.service.mjs +0 -170
- package/esm2022/lib/app/chat/chat.service.mjs +0 -445
- package/esm2022/lib/app/chat/components/chat-button/chat-button.component.mjs +0 -50
- package/esm2022/lib/app/chat/components/chat-footer/chat-footer.component.mjs +0 -12
- package/esm2022/lib/app/chat/components/chat-header/chat-header.component.mjs +0 -66
- package/esm2022/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.mjs +0 -186
- package/esm2022/lib/app/chat/components/chat-window/chat-window.component.mjs +0 -312
- package/esm2022/lib/app/chat/components/message-input/message-input.component.mjs +0 -36
- package/esm2022/lib/app/chat/components/message-list/message-list.component.mjs +0 -115
- package/esm2022/lib/app/chat/model/chat-history.model.mjs +0 -2
- package/esm2022/lib/app/chat/model/chat-request.model.mjs +0 -2
- package/esm2022/lib/app/chat/model/chat-response.model.mjs +0 -2
- package/esm2022/lib/app/chat/model/chat-session.model.mjs +0 -2
- package/esm2022/lib/app/chat/model/chat-stream-message.model.mjs +0 -2
- package/esm2022/lib/app/chat/model/chat-stream-response.model.mjs +0 -2
- package/esm2022/lib/app/chat/services/chat-api.service.mjs +0 -61
- package/esm2022/lib/app/chat/services/chat-audio.service.mjs +0 -50
- package/esm2022/lib/app/chat/services/chat-history.service.mjs +0 -252
- package/esm2022/lib/app/login/login-form.component.mjs +0 -46
- package/esm2022/lib/app/personalization/personalization-dialog.component.mjs +0 -194
- package/esm2022/lib/app/personalization/personalization.service.mjs +0 -149
- package/esm2022/lib/app/personalization/sections/account/account-section.component.mjs +0 -122
- package/esm2022/lib/app/personalization/sections/preferences/color-picker-dialog.component.mjs +0 -86
- package/esm2022/lib/app/personalization/sections/preferences/preferences-section.component.mjs +0 -115
- package/esm2022/lib/app/personalization/sections/profile/profile-section.component.mjs +0 -29
- package/esm2022/lib/app/personalization/sections/settings/setting-section.component.mjs +0 -30
- package/esm2022/lib/app/personalization/sections/terms/terms-section.component.mjs +0 -12
- package/esm2022/lib/constant/doohbot-constant.mjs +0 -28
- package/esm2022/lib/constant/html-entities.mjs +0 -9
- package/esm2022/lib/constant/utf8.mjs +0 -10
- package/esm2022/lib/core/app-const.mjs +0 -61
- package/esm2022/lib/core/auth/account-api.service.mjs +0 -40
- package/esm2022/lib/core/auth/auth.service.mjs +0 -391
- package/esm2022/lib/core/auth/models/auth-result.model.mjs +0 -3
- package/esm2022/lib/core/auth/models/federated-login-request.model.mjs +0 -6
- package/esm2022/lib/core/auth/models/login-request.model.mjs +0 -6
- package/esm2022/lib/core/auth/storage.service.mjs +0 -110
- package/esm2022/lib/core/directives/draggable/draggable-dialog.directive.mjs +0 -112
- package/esm2022/lib/core/directives/fullscreen/fullscreen.directive.mjs +0 -55
- package/esm2022/lib/core/directives/resizable/resizable-dialog.directive.mjs +0 -179
- package/esm2022/lib/core/environments/environment.mjs +0 -15
- package/esm2022/lib/core/environments/environment.prod.mjs +0 -15
- package/esm2022/lib/core/helpers/crypto-helper.service.mjs +0 -52
- package/esm2022/lib/core/http/http-stream.service.mjs +0 -97
- package/esm2022/lib/core/http/http.service.mjs +0 -103
- package/esm2022/lib/core/interceptors/auth.interceptor.mjs +0 -96
- package/esm2022/lib/core/interceptors/license.interceptor.mjs +0 -44
- package/esm2022/lib/core/models/api-config.model.mjs +0 -18
- package/esm2022/lib/core/models/api-request.model.mjs +0 -2
- package/esm2022/lib/core/models/api-response.model.mjs +0 -8
- package/esm2022/lib/core/models/doohbot-config.model.mjs +0 -18
- package/esm2022/lib/core/models/license.model.mjs +0 -2
- package/esm2022/lib/core/models/message.mjs +0 -2
- package/esm2022/lib/core/models/theme-config.model.mjs +0 -2
- package/esm2022/lib/core/services/core-config.service.mjs +0 -52
- package/esm2022/lib/core/services/license.service.mjs +0 -145
- package/esm2022/lib/core/services/markdown.service.mjs +0 -64
- package/esm2022/lib/core/services/theme.service.mjs +0 -248
- package/esm2022/lib/core/types/auth-mode.type.mjs +0 -2
- package/esm2022/lib/core/types/auth-status.type.mjs +0 -5
- package/esm2022/lib/core/types/chat-stream.type.mjs +0 -2
- package/esm2022/lib/core/types/message-role.type.mjs +0 -2
- package/esm2022/lib/core/types/prompt-mode.type.mjs +0 -5
- package/esm2022/lib/core/types/snackbar-error.type.mjs +0 -5
- package/esm2022/lib/core/types/tenant-resolution-strategy.type.mjs +0 -2
- package/esm2022/lib/core/utils/logger.service.mjs +0 -42
- package/esm2022/lib/doohbot-input.mjs +0 -20
- package/esm2022/lib/doohbot.component.mjs +0 -444
- package/esm2022/lib/predefined_messages.mjs +0 -15
- package/esm2022/lib/shared/chips/chips.component.mjs +0 -28
- package/esm2022/lib/shared/dialog/dialog.component.mjs +0 -36
- package/esm2022/lib/shared/dialog/dialog.service.mjs +0 -64
- package/esm2022/lib/shared/dialog/dialog.utils.mjs +0 -85
- package/esm2022/lib/shared/dropdown-menu/dropdown-menu.component.mjs +0 -29
- package/esm2022/lib/shared/input-dialog/input-dialog.component.mjs +0 -38
- package/esm2022/lib/shared/menu-item/menu-item.component.mjs +0 -24
- package/esm2022/lib/shared/pipes/simple-markdown.pipe.mjs +0 -27
- package/esm2022/lib/shared/snackbar/snackbar.component.mjs +0 -43
- package/esm2022/lib/shared/snackbar/snackbar.service.mjs +0 -46
- package/esm2022/lib/shared/snackbar/snackbar.utils.mjs +0 -43
- package/esm2022/public-api.mjs +0 -37
- package/fesm2022/aakash58-chatbot.mjs +0 -5193
- package/fesm2022/aakash58-chatbot.mjs.map +0 -1
- package/index.d.ts +0 -5
- package/lib/app/chat/chat-ui-state.service.d.ts +0 -96
- package/lib/app/chat/chat.service.d.ts +0 -88
- package/lib/app/chat/components/chat-button/chat-button.component.d.ts +0 -16
- package/lib/app/chat/components/chat-footer/chat-footer.component.d.ts +0 -5
- package/lib/app/chat/components/chat-header/chat-header.component.d.ts +0 -24
- package/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.d.ts +0 -49
- package/lib/app/chat/components/chat-window/chat-window.component.d.ts +0 -107
- package/lib/app/chat/components/message-input/message-input.component.d.ts +0 -12
- package/lib/app/chat/components/message-list/message-list.component.d.ts +0 -40
- package/lib/app/chat/model/chat-history.model.d.ts +0 -51
- package/lib/app/chat/model/chat-request.model.d.ts +0 -10
- package/lib/app/chat/model/chat-response.model.d.ts +0 -9
- package/lib/app/chat/model/chat-session.model.d.ts +0 -12
- package/lib/app/chat/model/chat-stream-response.model.d.ts +0 -10
- package/lib/app/chat/services/chat-api.service.d.ts +0 -30
- package/lib/app/chat/services/chat-audio.service.d.ts +0 -19
- package/lib/app/chat/services/chat-history.service.d.ts +0 -53
- package/lib/app/login/login-form.component.d.ts +0 -20
- package/lib/app/personalization/personalization-dialog.component.d.ts +0 -53
- package/lib/app/personalization/personalization.service.d.ts +0 -66
- package/lib/app/personalization/sections/account/account-section.component.d.ts +0 -30
- package/lib/app/personalization/sections/preferences/color-picker-dialog.component.d.ts +0 -17
- package/lib/app/personalization/sections/preferences/preferences-section.component.d.ts +0 -27
- package/lib/app/personalization/sections/profile/profile-section.component.d.ts +0 -17
- package/lib/app/personalization/sections/settings/setting-section.component.d.ts +0 -10
- package/lib/app/personalization/sections/terms/terms-section.component.d.ts +0 -5
- package/lib/constant/doohbot-constant.d.ts +0 -12
- package/lib/constant/html-entities.d.ts +0 -8
- package/lib/constant/utf8.d.ts +0 -9
- package/lib/core/app-const.d.ts +0 -11
- package/lib/core/auth/account-api.service.d.ts +0 -20
- package/lib/core/auth/auth.service.d.ts +0 -90
- package/lib/core/auth/models/auth-result.model.d.ts +0 -4
- package/lib/core/auth/models/federated-login-request.model.d.ts +0 -5
- package/lib/core/auth/models/login-request.model.d.ts +0 -6
- package/lib/core/auth/storage.service.d.ts +0 -21
- package/lib/core/directives/draggable/draggable-dialog.directive.d.ts +0 -23
- package/lib/core/directives/fullscreen/fullscreen.directive.d.ts +0 -14
- package/lib/core/directives/resizable/resizable-dialog.directive.d.ts +0 -30
- package/lib/core/environments/environment.d.ts +0 -7
- package/lib/core/environments/environment.prod.d.ts +0 -7
- package/lib/core/helpers/crypto-helper.service.d.ts +0 -12
- package/lib/core/http/http-stream.service.d.ts +0 -18
- package/lib/core/http/http.service.d.ts +0 -20
- package/lib/core/interceptors/auth.interceptor.d.ts +0 -18
- package/lib/core/interceptors/license.interceptor.d.ts +0 -11
- package/lib/core/models/api-config.model.d.ts +0 -58
- package/lib/core/models/api-request.model.d.ts +0 -77
- package/lib/core/models/api-response.model.d.ts +0 -6
- package/lib/core/models/doohbot-config.model.d.ts +0 -81
- package/lib/core/models/message.d.ts +0 -16
- package/lib/core/models/theme-config.model.d.ts +0 -28
- package/lib/core/services/core-config.service.d.ts +0 -23
- package/lib/core/services/license.service.d.ts +0 -33
- package/lib/core/services/markdown.service.d.ts +0 -8
- package/lib/core/services/theme.service.d.ts +0 -40
- package/lib/core/utils/logger.service.d.ts +0 -11
- package/lib/doohbot-input.d.ts +0 -19
- package/lib/doohbot.component.d.ts +0 -108
- package/lib/predefined_messages.d.ts +0 -2
- package/lib/shared/chips/chips.component.d.ts +0 -10
- package/lib/shared/dialog/dialog.component.d.ts +0 -19
- package/lib/shared/dialog/dialog.service.d.ts +0 -29
- package/lib/shared/dialog/dialog.utils.d.ts +0 -41
- package/lib/shared/dropdown-menu/dropdown-menu.component.d.ts +0 -11
- package/lib/shared/input-dialog/input-dialog.component.d.ts +0 -20
- package/lib/shared/menu-item/menu-item.component.d.ts +0 -9
- package/lib/shared/pipes/simple-markdown.pipe.d.ts +0 -10
- package/lib/shared/snackbar/snackbar.component.d.ts +0 -14
- package/lib/shared/snackbar/snackbar.service.d.ts +0 -19
- package/public-api.d.ts +0 -11
- /package/{src → projects/doohbot/src}/assets/bot.mp3 +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"aakash58-chatbot.mjs","sources":["../../../projects/doohbot/src/lib/constant/doohbot-constant.ts","../../../projects/doohbot/src/lib/core/utils/logger.service.ts","../../../projects/doohbot/src/lib/shared/snackbar/snackbar.utils.ts","../../../projects/doohbot/src/lib/core/models/doohbot-config.model.ts","../../../projects/doohbot/src/lib/doohbot-input.ts","../../../projects/doohbot/src/lib/core/services/core-config.service.ts","../../../projects/doohbot/src/lib/core/auth/storage.service.ts","../../../projects/doohbot/src/lib/core/http/http.service.ts","../../../projects/doohbot/src/lib/core/auth/account-api.service.ts","../../../projects/doohbot/src/lib/core/helpers/crypto-helper.service.ts","../../../projects/doohbot/src/lib/core/auth/auth.service.ts","../../../projects/doohbot/src/lib/app/personalization/personalization.service.ts","../../../projects/doohbot/src/lib/core/services/theme.service.ts","../../../projects/doohbot/src/lib/predefined_messages.ts","../../../projects/doohbot/src/lib/app/chat/components/chat-button/chat-button.component.ts","../../../projects/doohbot/src/lib/app/chat/components/chat-button/chat-button.component.html","../../../projects/doohbot/src/lib/shared/chips/chips.component.ts","../../../projects/doohbot/src/lib/shared/chips/chips.component.html","../../../projects/doohbot/src/lib/core/services/markdown.service.ts","../../../projects/doohbot/src/lib/shared/pipes/simple-markdown.pipe.ts","../../../projects/doohbot/src/lib/constant/utf8.ts","../../../projects/doohbot/src/lib/app/chat/components/message-list/message-list.component.ts","../../../projects/doohbot/src/lib/app/chat/components/message-list/message-list.component.html","../../../projects/doohbot/src/lib/app/chat/components/message-input/message-input.component.ts","../../../projects/doohbot/src/lib/app/chat/components/message-input/message-input.component.html","../../../projects/doohbot/src/lib/shared/dialog/dialog.component.ts","../../../projects/doohbot/src/lib/shared/dialog/dialog.component.html","../../../projects/doohbot/src/lib/shared/input-dialog/input-dialog.component.ts","../../../projects/doohbot/src/lib/shared/input-dialog/input-dialog.component.html","../../../projects/doohbot/src/lib/shared/dialog/dialog.service.ts","../../../projects/doohbot/src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.ts","../../../projects/doohbot/src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.html","../../../projects/doohbot/src/lib/core/directives/draggable/draggable-dialog.directive.ts","../../../projects/doohbot/src/lib/core/directives/resizable/resizable-dialog.directive.ts","../../../projects/doohbot/src/lib/core/http/http-stream.service.ts","../../../projects/doohbot/src/lib/app/chat/services/chat-api.service.ts","../../../projects/doohbot/src/lib/app/chat/services/chat-history.service.ts","../../../projects/doohbot/src/lib/app/chat/services/chat-audio.service.ts","../../../projects/doohbot/src/lib/app/chat/chat-ui-state.service.ts","../../../projects/doohbot/src/lib/app/chat/chat.service.ts","../../../projects/doohbot/src/lib/app/chat/components/chat-header/chat-header.component.ts","../../../projects/doohbot/src/lib/app/chat/components/chat-header/chat-header.component.html","../../../projects/doohbot/src/lib/app/login/login-form.component.ts","../../../projects/doohbot/src/lib/app/login/login-form.component.html","../../../projects/doohbot/src/lib/app/chat/components/chat-footer/chat-footer.component.ts","../../../projects/doohbot/src/lib/app/chat/components/chat-footer/chat-footer.component.html","../../../projects/doohbot/src/lib/app/personalization/sections/preferences/color-picker-dialog.component.ts","../../../projects/doohbot/src/lib/app/personalization/sections/preferences/preferences-section.component.ts","../../../projects/doohbot/src/lib/app/personalization/sections/preferences/preferences-section.component.html","../../../projects/doohbot/src/lib/constant/html-entities.ts","../../../projects/doohbot/src/lib/app/personalization/sections/profile/profile-section.component.ts","../../../projects/doohbot/src/lib/app/personalization/sections/profile/profile-section.component.html","../../../projects/doohbot/src/lib/app/personalization/sections/terms/terms-section.component.ts","../../../projects/doohbot/src/lib/app/personalization/sections/terms/terms-section.component.html","../../../projects/doohbot/src/lib/app/personalization/sections/settings/setting-section.component.ts","../../../projects/doohbot/src/lib/app/personalization/sections/settings/setting-section.component.html","../../../projects/doohbot/src/lib/app/personalization/sections/account/account-section.component.ts","../../../projects/doohbot/src/lib/app/personalization/sections/account/account-section.component.html","../../../projects/doohbot/src/lib/shared/dialog/dialog.utils.ts","../../../projects/doohbot/src/lib/shared/snackbar/snackbar.component.ts","../../../projects/doohbot/src/lib/shared/snackbar/snackbar.component.html","../../../projects/doohbot/src/lib/shared/snackbar/snackbar.service.ts","../../../projects/doohbot/src/lib/app/personalization/personalization-dialog.component.ts","../../../projects/doohbot/src/lib/app/personalization/personalization-dialog.component.html","../../../projects/doohbot/src/lib/app/chat/components/chat-window/chat-window.component.ts","../../../projects/doohbot/src/lib/app/chat/components/chat-window/chat-window.component.html","../../../projects/doohbot/src/lib/core/directives/fullscreen/fullscreen.directive.ts","../../../projects/doohbot/src/lib/core/services/license.service.ts","../../../projects/doohbot/src/lib/core/environments/environment.ts","../../../projects/doohbot/src/lib/core/app-const.ts","../../../projects/doohbot/src/lib/core/interceptors/license.interceptor.ts","../../../projects/doohbot/src/lib/core/interceptors/auth.interceptor.ts","../../../projects/doohbot/src/lib/doohbot.component.ts","../../../projects/doohbot/src/lib/doohbot.component.html","../../../projects/doohbot/src/lib/core/models/api-config.model.ts","../../../projects/doohbot/src/lib/shared/menu-item/menu-item.component.ts","../../../projects/doohbot/src/lib/shared/menu-item/menu-item.component.html","../../../projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.ts","../../../projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.html","../../../projects/doohbot/src/public-api.ts","../../../projects/doohbot/src/aakash58-chatbot.ts"],"sourcesContent":["export const DoohbotConst = {\r\n //LIVE ASSETS\r\n // APP_LOGO: 'https://iili.io/f3qSQJn.md.png',\r\n // USER_AVATAR: 'https://iili.io/KpEYoCP.png',\r\n // BOT_AVATAR: 'https://iili.io/KpER0Ge.png',\r\n\r\n // ==================\r\n\r\n //png ASSETS\r\n // APP_LOGO: 'assets/logo.svg',\r\n // APP_TEXT_LOGO: 'assets/title.svg',\r\n // APP_HEADER_LOGO: 'assets/header_logo.svg',\r\n // USER_AVATAR: 'assets/profile.png',\r\n // BOT_AVATAR: 'assets/bot.png',\r\n\r\n // ==================\r\n\r\n // Application Constants Text\r\n appTitle: 'DoohBot',\r\n appSubtitle: 'Welcome to DoohBot',\r\n welcomeDescription:\r\n 'We provide a powerful live chat platform to help businesses connect with their customers, offer support, and increase sales through real-time conversations.',\r\n hintText: 'Please Enter Here',\r\n errorMessage: 'The message you submitted was too long.',\r\n\r\n // ==================\r\n\r\n // base64_ASSETS\r\n\r\n appLogo:\r\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUwIiBoZWlnaHQ9IjE0OSIgdmlld0JveD0iMCAwIDE1MCAxNDkiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8yMzc2XzE0MzgpIj4KPHBhdGggZD0iTTYgNkgxNDMuMjI3VjE0Mi45NzVINlY2WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzIzNzZfMTQzOCkiLz4KPHBhdGggZD0iTTEwNS4zOTggNDMuNzI5NkM4OS40OTU0IDYwLjk5NyA4OS41NjQyIDg3LjU2NyAxMDUuNTU2IDEwNC43NTJMMTA2Ljk0OCAxMDYuMjQ5TDEwNi45MTIgMTA2LjIxNUwxMDYuOTU0IDEwNi4yNThMNjkuNzI2NSAxNDIuOTc1SDMzLjcyNjZIMTUuNzI2Nkg2Vjc4LjU2MjVMNDIuNjQwNSA0Mi4zOTY1TDQyLjc2NTQgNDIuNTIyM0w0Mi42NDI3IDQyLjM5MDhMNDQuMTQ5OCA0My43NzM4QzYxLjQ0NzUgNTkuNjQ4MyA4OC4wNjY3IDU5LjU3ODMgMTA1LjI4MyA0My42MTYyTDEwNi43ODQgNDIuMjI1M0wxMDUuMzk4IDQzLjcyOTZaIiBmaWxsPSIjRUVFRUVFIi8+CjxwYXRoIGQ9Ik03LjAwNzAxIDE0Mi45NzVMNDQuNzY3NyAxMDUuODkyQzYyLjA0MTIgODguODUyNyA4OS44ODMyIDg5LjAxNTkgMTA2Ljk1NCAxMDYuMjU4TDY5LjcyNjUgMTQyLjk3NUg3LjAwNzAxWiIgZmlsbD0idXJsKCNwYWludDFfbGluZWFyXzIzNzZfMTQzOCkiLz4KPHBhdGggZD0iTTYgNzguNTYyNUw0Mi42NDA1IDQyLjM5NjVDNjAuMTQ0NCA2MC4wNzU3IDU5Ljk3NTUgODguNTcxMSA0Mi4yNjM4IDEwNi4wNDNMNiAxNDJWNzguNTYyNVoiIGZpbGw9InVybCgjcGFpbnQyX2xpbmVhcl8yMzc2XzE0MzgpIi8+CjwvZz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8yMzc2XzE0MzgiIHgxPSI2LjAwMzA2IiB5MT0iNiIgeDI9IjE0Mi45NzIiIHkyPSIxNDMuMjI2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiMyODAwRkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDhEQUNGIi8+CjwvbGluZWFyR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQxX2xpbmVhcl8yMzc2XzE0MzgiIHgxPSIxNDMuMjI3IiB5MT0iNzYuODA0NiIgeDI9IjI2LjAwMSIgeTI9IjEyMi45NjQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzI4MDBGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwOERBQ0YiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDJfbGluZWFyXzIzNzZfMTQzOCIgeDE9IjU4LjI1NDEiIHkxPSI1OC4xNjciIHgyPSI1My45MTE3IiB5Mj0iMTMyLjk1MSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjgwMEZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzA4REFDRiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzIzNzZfMTQzOCI+CjxwYXRoIGQ9Ik02IDZIMTEzLjIyN0MxMjkuNzk1IDYgMTQzLjIyNyAxOS40MzE1IDE0My4yMjcgMzZWMTEyLjk3NUMxNDMuMjI3IDEyOS41NDQgMTI5Ljc5NSAxNDIuOTc1IDExMy4yMjcgMTQyLjk3NUg2VjZaIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=',\r\n appTextLogo:\r\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDc3IiBoZWlnaHQ9Ijk0IiB2aWV3Qm94PSIwIDAgNDc3IDk0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNNDUzLjkzMiA4Ny4wMjZDNDUyLjI0OSA4Ny4wMjYgNDUxLjI4NyA4Ni40MjUgNDUwLjA4NSA4NS4yMjI5TDQ0My43MTQgNzkuODEzNkM0NDIuNTEyIDc4LjYxMTUgNDQxLjkxMSA3Ny4yODkyIDQ0MS45MTEgNzUuNDg2MVY0MC44NjYySDQzMy42MTdWMzIuNDUxNkw0NDkuMTI0IDE1LjAyMTVINDUzLjIxMVYzMS4yNDk2SDQ3MC42NDFWNDAuODY2Mkg0NTMuMjExVjc2LjY4ODJINDcxLjAwMlY4Ny4wMjZINDUzLjkzMloiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTM3NS44MTkgODcuMDE4N0MzNzQuNjE3IDg3LjAxODcgMzczLjA1NCA4Ni42NTggMzcxLjQ5MiA4NS4wOTUzTDM2Ni4yMDIgNzkuODA2MkMzNjUuMTIgNzguNjA0MSAzNjQuNjQgNzcuMDQxNCAzNjQuNjQgNzUuNTk4OVY0Mi42NjE5QzM2NC42NCA0MC45NzkgMzY1LjI0MSAzOS41MzY1IDM2Ni4yMDIgMzguNDU0N0wzNzEuNDkyIDMzLjE2NTVDMzcyLjkzNCAzMS43MjMgMzc0LjQ5NyAzMS4yNDIyIDM3NS44MTkgMzEuMjQyMkg0MTAuNjhDNDEyLjM2MyAzMS4yNDIyIDQxMy42ODUgMzEuODQzMiA0MTQuODg3IDMzLjA0NTNMNDIwLjI5NiAzOC4zMzQ0QzQyMS42MTkgMzkuNjU2NyA0MjIuMSA0MC45NzkgNDIyLjEgNDIuNjYxOVY3NS41OTg5QzQyMi4xIDc3LjI4MTggNDIxLjYxOSA3OC42MDQxIDQyMC4yOTYgNzkuOTI2NEw0MTQuODg3IDg1LjIxNTVDNDEzLjY4NSA4Ni40MTc2IDQxMi4zNjMgODcuMDE4NyA0MTAuNjggODcuMDE4N0gzNzUuODE5Wk0zNzUuOTM5IDc2LjgwMUg0MTAuOFY0MS40NTk5SDM3NS45MzlWNzYuODAxWiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNMzQ5LjY0NCAzOC40NTYxQzM1MC44NDYgMzkuNzc4NCAzNTEuNDQ3IDQxLjEwMDcgMzUxLjQ0NyA0Mi43ODM2Vjc1LjYwMDRDMzUxLjQ0NyA3Ny4yODMzIDM1MC44NDYgNzguNjA1NiAzNDkuNjQ0IDc5LjkyNzlMMzQ0LjIzNCA4NS4yMTdDMzQzLjAzMiA4Ni41MzkzIDM0MS40NyA4Ny4wMjAxIDMzOS45MDcgODcuMDIwMUgzMTQuOTAzQzMxMi42MTkgODcuMDIwMSAzMTEuMjk3IDg2LjQxOTEgMzA5LjQ5NCA4NC40OTU4TDMwNi4xMjggODAuODg5NVY4Ny4wMjAxSDI5NC45NDlWNkgzMDYuMTI4VjM3LjM3NDNMMzA5LjQ5NCAzMy44ODgyQzMxMS40MTcgMzEuODQ0NyAzMTIuNjE5IDMxLjM2MzkgMzE0LjkwMyAzMS4zNjM5SDMzOS45MDdDMzQxLjU5IDMxLjM2MzkgMzQzLjAzMiAzMS44NDQ3IDM0NC4yMzQgMzMuMDQ2OEwzNDkuNjQ0IDM4LjQ1NjFaTTM0MC4xNDcgNzYuODAyNVY0MS40NjEzSDMwNi4xMjhWNzYuODAyNUgzNDAuMTQ3WiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNMjc2LjUxMiAzOC40NTYxQzI3Ny43MTQgMzkuNzc4NCAyNzguMzE1IDQxLjEwMDcgMjc4LjMxNSA0Mi43ODM2Vjg3LjAyMDFIMjY3LjAxNlY0MS40NjEzSDIzMi44NzZWODcuMDIwMUgyMjEuNjk3VjZIMjMyLjg3NlYzNy40OTQ1TDIzNi4zNjIgMzMuODg4MkMyMzguNDA2IDMxLjg0NDcgMjM5LjQ4OCAzMS4zNjM5IDI0MS43NzIgMzEuMzYzOUgyNjYuNzc1QzI2OC40NTggMzEuMzYzOSAyNjkuOTAxIDMxLjg0NDcgMjcxLjEwMyAzMy4wNDY4TDI3Ni41MTIgMzguNDU2MVoiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTE2MC4wNTUgODcuMDE4N0MxNTguODUzIDg3LjAxODcgMTU3LjI5IDg2LjY1OCAxNTUuNzI3IDg1LjA5NTNMMTUwLjQzOCA3OS44MDYyQzE0OS4zNTYgNzguNjA0MSAxNDguODc1IDc3LjA0MTQgMTQ4Ljg3NSA3NS41OTg5VjQyLjY2MTlDMTQ4Ljg3NSA0MC45NzkgMTQ5LjQ3NyAzOS41MzY1IDE1MC40MzggMzguNDU0N0wxNTUuNzI3IDMzLjE2NTVDMTU3LjE3IDMxLjcyMyAxNTguNzMzIDMxLjI0MjIgMTYwLjA1NSAzMS4yNDIySDE5NC45MTZDMTk2LjU5OCAzMS4yNDIyIDE5Ny45MjEgMzEuODQzMiAxOTkuMTIzIDMzLjA0NTNMMjA0LjUzMiAzOC4zMzQ0QzIwNS44NTUgMzkuNjU2NyAyMDYuMzM1IDQwLjk3OSAyMDYuMzM1IDQyLjY2MTlWNzUuNTk4OUMyMDYuMzM1IDc3LjI4MTggMjA1Ljg1NSA3OC42MDQxIDIwNC41MzIgNzkuOTI2NEwxOTkuMTIzIDg1LjIxNTVDMTk3LjkyMSA4Ni40MTc2IDE5Ni41OTggODcuMDE4NyAxOTQuOTE2IDg3LjAxODdIMTYwLjA1NVpNMTYwLjE3NSA3Ni44MDFIMTk1LjAzNlY0MS40NTk5SDE2MC4xNzVWNzYuODAxWiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNODguOTE0OCA4Ny4wMTg3Qzg3LjcxMjcgODcuMDE4NyA4Ni4xNSA4Ni42NTggODQuNTg3MyA4NS4wOTUzTDc5LjI5ODEgNzkuODA2MkM3OC4yMTYyIDc4LjYwNDEgNzcuNzM1NCA3Ny4wNDE0IDc3LjczNTQgNzUuNTk4OVY0Mi42NjE5Qzc3LjczNTQgNDAuOTc5IDc4LjMzNjQgMzkuNTM2NSA3OS4yOTgxIDM4LjQ1NDdMODQuNTg3MyAzMy4xNjU1Qzg2LjAyOTggMzEuNzIzIDg3LjU5MjUgMzEuMjQyMiA4OC45MTQ4IDMxLjI0MjJIMTIzLjc3NUMxMjUuNDU4IDMxLjI0MjIgMTI2Ljc4MSAzMS44NDMyIDEyNy45ODMgMzMuMDQ1M0wxMzMuMzkyIDM4LjMzNDRDMTM0LjcxNCAzOS42NTY3IDEzNS4xOTUgNDAuOTc5IDEzNS4xOTUgNDIuNjYxOVY3NS41OTg5QzEzNS4xOTUgNzcuMjgxOCAxMzQuNzE0IDc4LjYwNDEgMTMzLjM5MiA3OS45MjY0TDEyNy45ODMgODUuMjE1NUMxMjYuNzgxIDg2LjQxNzYgMTI1LjQ1OCA4Ny4wMTg3IDEyMy43NzUgODcuMDE4N0g4OC45MTQ4Wk04OS4wMzUgNzYuODAxSDEyMy44OTZWNDEuNDU5OUg4OS4wMzVWNzYuODAxWiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNNTEuMTk4NiA2SDYyLjM3OFY4Ny4wMjAxSDUxLjE5ODZWODAuODg5NUw0Ny44MzI3IDg0LjQ5NThDNDYuMDI5NiA4Ni40MTkxIDQ0LjcwNzMgODcuMDIwMSA0Mi40MjMzIDg3LjAyMDFIMTcuNDE5OUMxNS44NTcxIDg3LjAyMDEgMTQuMjk0NCA4Ni41MzkzIDEzLjA5MjMgODUuMjE3TDcuODAzMTQgNzkuOTI3OUM2LjQ4MDg0IDc4LjYwNTYgNiA3Ny4yODMzIDYgNzUuNjAwNFY0Mi43ODM2QzYgNDEuMTAwNyA2LjQ4MDg0IDM5Ljc3ODQgNy44MDMxNCAzOC40NTYxTDEzLjA5MjMgMzMuMDQ2OEMxNC4yOTQ0IDMxLjg0NDcgMTUuNzM2OSAzMS4zNjM5IDE3LjQxOTkgMzEuMzYzOUg0Mi40MjMzQzQ0LjcwNzMgMzEuMzYzOSA0NS45MDk0IDMxLjg0NDcgNDcuODMyNyAzMy44ODgyTDUxLjE5ODYgMzcuMzc0M1Y2Wk0xNy4xNzk0IDc2LjgwMjVINTEuMTk4NlY0MS40NjEzSDE3LjE3OTRWNzYuODAyNVoiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTIxLjgzMyA1OC4xNTYySDI3LjQyMTNWNjMuNzQ0NUgyMS44MzNWNTguMTU2MloiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTMxLjE0NiA1OC4xNTYySDM2LjczNDNWNjMuNzQ0NUgzMS4xNDZWNTguMTU2MloiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTQwLjQ1ODUgNTguMTU2Mkg0Ni4wNDY4VjYzLjc0NDVINDAuNDU4NVY1OC4xNTYyWiIgZmlsbD0iIzI4MDBGRiIvPgo8ZWxsaXBzZSBjeD0iMzg3LjA4MiIgY3k9IjU5LjI1NTIiIHJ4PSIzLjg5NDg3IiByeT0iMy44OTQ4NSIgZmlsbD0iIzI4MDBGRiIvPgo8ZWxsaXBzZSBjeD0iNDAwLjcxMyIgY3k9IjU5LjI1NTIiIHJ4PSIzLjg5NDg3IiByeT0iMy44OTQ4NSIgZmlsbD0iIzI4MDBGRiIvPgo8ZWxsaXBzZSBjeD0iMzkzLjE5MiIgY3k9IjkuOTE4MjgiIHJ4PSIzLjcwNTQxIiByeT0iMy43MDUzOSIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNMzgwLjIyNCAyOS4zNjkxQzM4MC4yMjQgMjguMTAyNCAzODEuNTUxIDI3LjAzMjQgMzgzLjkxMyAyNi4xMzY2QzM4Ni4yNzUgMjUuMjQwOSAzODkuNDc5IDI0LjczNzcgMzkyLjgxOSAyNC43Mzc3QzM5Ni4xNiAyNC43Mzc3IDM5OS4zNjMgMjUuMjQwOSA0MDEuNzI1IDI2LjEzNjZDNDA0LjA4OCAyNy4wMzI0IDQwNS4yMzQgMjguMTAyNCA0MDUuMjM0IDI5LjM2OTFIMzkyLjcyOUgzODAuMjI0WiIgZmlsbD0iIzI4MDBGRiIvPgo8cmVjdCB4PSIzOTEuMzQiIHk9IjEwLjg0MzgiIHdpZHRoPSIzLjcwNTQxIiBoZWlnaHQ9IjE1Ljc0NzkiIGZpbGw9IiMyODAwRkYiLz4KPC9zdmc+Cg==',\r\n appHeaderLogo:\r\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjYzIiBoZWlnaHQ9IjE0OSIgdmlld0JveD0iMCAwIDY2MyAxNDkiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8yMzc0XzE1NDYpIj4KPHBhdGggZD0iTTYgNkgxNDMuMjI3VjE0Mi45NzVINlY2WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzIzNzRfMTU0NikiLz4KPHBhdGggZD0iTTEwNS4zOTggNDMuNzI5NkM4OS40OTU0IDYwLjk5NyA4OS41NjQyIDg3LjU2NyAxMDUuNTU2IDEwNC43NTJMMTA2Ljk0OCAxMDYuMjQ5TDEwNi45MTIgMTA2LjIxNUwxMDYuOTU0IDEwNi4yNThMNjkuNzI2NSAxNDIuOTc1SDMzLjcyNjZIMTUuNzI2Nkg2Vjc4LjU2MjVMNDIuNjQwNSA0Mi4zOTY1TDQyLjc2NTQgNDIuNTIyM0w0Mi42NDI3IDQyLjM5MDhMNDQuMTQ5OCA0My43NzM4QzYxLjQ0NzUgNTkuNjQ4MyA4OC4wNjY3IDU5LjU3ODMgMTA1LjI4MyA0My42MTYyTDEwNi43ODQgNDIuMjI1M0wxMDUuMzk4IDQzLjcyOTZaIiBmaWxsPSIjRUVFRUVFIi8+CjxwYXRoIGQ9Ik03LjAwNzAxIDE0Mi45NzVMNDQuNzY3NyAxMDUuODkyQzYyLjA0MTIgODguODUyNyA4OS44ODMyIDg5LjAxNTkgMTA2Ljk1NCAxMDYuMjU4TDY5LjcyNjUgMTQyLjk3NUg3LjAwNzAxWiIgZmlsbD0idXJsKCNwYWludDFfbGluZWFyXzIzNzRfMTU0NikiLz4KPHBhdGggZD0iTTYgNzguNTYyNUw0Mi42NDA1IDQyLjM5NjVDNjAuMTQ0NCA2MC4wNzU3IDU5Ljk3NTUgODguNTcxMSA0Mi4yNjM4IDEwNi4wNDNMNiAxNDJWNzguNTYyNVoiIGZpbGw9InVybCgjcGFpbnQyX2xpbmVhcl8yMzc0XzE1NDYpIi8+CjwvZz4KPHBhdGggZD0iTTYzMi40MzggNTguMDA3OEg2NDkuODY3VjY3LjYyNEg2MzIuNDM4VjEwMy40NDZINjUwLjIyOVYxMTMuNzg0SDYzMy4xNThDNjMxLjQ3NiAxMTMuNzg0IDYzMC41MTQgMTEzLjE4MiA2MjkuMzEyIDExMS45OEw2MjIuOTQgMTA2LjU3MUM2MjEuNzM5IDEwNS4zNjkgNjIxLjEzOCAxMDQuMDQ3IDYyMS4xMzggMTAyLjI0NFY2Ny42MjRINjEyLjg0NFY1OS4yMDlMNjI4LjM1MSA0MS43NzkzSDYzMi40MzhWNTguMDA3OFpNMjQxLjYwNCAxMTMuNzc4SDIzMC40MjVWMTA3LjY0N0wyMjcuMDYgMTExLjI1NEMyMjUuMjU2IDExMy4xNzcgMjIzLjkzMyAxMTMuNzc4IDIyMS42NDkgMTEzLjc3OEgxOTYuNjQ2QzE5NS4wODQgMTEzLjc3OCAxOTMuNTIxIDExMy4yOTcgMTkyLjMxOSAxMTEuOTc1TDE4Ny4wMjkgMTA2LjY4NkMxODUuNzA3IDEwNS4zNjMgMTg1LjIyNyAxMDQuMDQxIDE4NS4yMjcgMTAyLjM1OFY2OS41NDFDMTg1LjIyNyA2Ny44NTg0IDE4NS43MDcgNjYuNTM2IDE4Ny4wMjkgNjUuMjEzOUwxOTIuMzE5IDU5LjgwNDdDMTkzLjUyMSA1OC42MDI3IDE5NC45NjQgNTguMTIyMSAxOTYuNjQ2IDU4LjEyMjFIMjIxLjY0OUMyMjMuOTMzIDU4LjEyMjEgMjI1LjEzNiA1OC42MDMgMjI3LjA2IDYwLjY0NjVMMjMwLjQyNSA2NC4xMzE4VjMyLjc1NzhIMjQxLjYwNFYxMTMuNzc4Wk00MTIuMTAzIDY0LjI1Mkw0MTUuNTg5IDYwLjY0NjVDNDE3LjYzMiA1OC42MDMgNDE4LjcxNCA1OC4xMjIxIDQyMC45OTggNTguMTIyMUg0NDYuMDAyQzQ0Ny42ODUgNTguMTIyMSA0NDkuMTI3IDU4LjYwMjcgNDUwLjMyOSA1OS44MDQ3TDQ1NS43MzggNjUuMjEzOUM0NTYuOTQgNjYuNTM2IDQ1Ny41NDIgNjcuODU4MyA0NTcuNTQyIDY5LjU0MVYxMTMuNzc4SDQ0Ni4yNDJWNjguMjE4OEg0MTIuMTAzVjExMy43NzhINDAwLjkyNFYzMi43NTc4SDQxMi4xMDNWNjQuMjUyWk00ODUuMzU0IDY0LjEzMThMNDg4LjcyMSA2MC42NDY1QzQ5MC42NDQgNTguNjAzIDQ5MS44NDYgNTguMTIyMSA0OTQuMTMgNTguMTIyMUg1MTkuMTM0QzUyMC44MTcgNTguMTIyMSA1MjIuMjU5IDU4LjYwMjcgNTIzLjQ2MSA1OS44MDQ3TDUyOC44NyA2NS4yMTM5QzUzMC4wNzIgNjYuNTM2IDUzMC42NzQgNjcuODU4MyA1MzAuNjc0IDY5LjU0MVYxMDIuMzU4QzUzMC42NzQgMTA0LjA0MSA1MzAuMDcyIDEwNS4zNjMgNTI4Ljg3IDEwNi42ODZMNTIzLjQ2MSAxMTEuOTc1QzUyMi4yNTkgMTEzLjI5NyA1MjAuNjk2IDExMy43NzggNTE5LjEzNCAxMTMuNzc4SDQ5NC4xM0M0OTEuODQ2IDExMy43NzggNDkwLjUyNCAxMTMuMTc3IDQ4OC43MjEgMTExLjI1NEw0ODUuMzU0IDEwNy42NDdWMTEzLjc3OEg0NzQuMTc2VjMyLjc1NzhINDg1LjM1NFY2NC4xMzE4Wk0zMDMuMDAyIDU4QzMwNC42ODUgNTggMzA2LjAwNyA1OC42MDA5IDMwNy4yMDkgNTkuODAyN0wzMTIuNjE5IDY1LjA5MThDMzEzLjk0MSA2Ni40MTQxIDMxNC40MjIgNjcuNzM3IDMxNC40MjIgNjkuNDE5OVYxMDIuMzU2QzMxNC40MjIgMTA0LjAzOSAzMTMuOTQxIDEwNS4zNjIgMzEyLjYxOSAxMDYuNjg1TDMwNy4yMDkgMTExLjk3NEMzMDYuMDA3IDExMy4xNzYgMzA0LjY4NSAxMTMuNzc2IDMwMy4wMDIgMTEzLjc3NkgyNjguMTQyQzI2Ni45NCAxMTMuNzc2IDI2NS4zNzYgMTEzLjQxNiAyNjMuODEzIDExMS44NTRMMjU4LjUyNCAxMDYuNTY0QzI1Ny40NDMgMTA1LjM2MiAyNTYuOTYyIDEwMy43OTkgMjU2Ljk2MiAxMDIuMzU2VjY5LjQxOTlDMjU2Ljk2MiA2Ny43MzcyIDI1Ny41NjMgNjYuMjk0NyAyNTguNTI0IDY1LjIxMjlMMjYzLjgxMyA1OS45MjI5QzI2NS4yNTYgNTguNDgwNCAyNjYuODE5IDU4IDI2OC4xNDIgNThIMzAzLjAwMlpNMzc0LjE0MyA1OEMzNzUuODI1IDU4LjAwMDEgMzc3LjE0OCA1OC42MDA4IDM3OC4zNSA1OS44MDI3TDM4My43NTkgNjUuMDkxOEMzODUuMDgxIDY2LjQxNDEgMzg1LjU2MiA2Ny43MzcgMzg1LjU2MiA2OS40MTk5VjEwMi4zNTZDMzg1LjU2MiAxMDQuMDM5IDM4NS4wODEgMTA1LjM2MiAzODMuNzU5IDEwNi42ODVMMzc4LjM1IDExMS45NzRDMzc3LjE0OCAxMTMuMTc2IDM3NS44MjUgMTEzLjc3NiAzNzQuMTQzIDExMy43NzZIMzM5LjI4MUMzMzguMDc5IDExMy43NzYgMzM2LjUxNyAxMTMuNDE2IDMzNC45NTQgMTExLjg1NEwzMjkuNjY1IDEwNi41NjRDMzI4LjU4MyAxMDUuMzYyIDMyOC4xMDMgMTAzLjc5OSAzMjguMTAzIDEwMi4zNTZWNjkuNDE5OUMzMjguMTAzIDY3LjczNzEgMzI4LjcwMyA2Ni4yOTQ4IDMyOS42NjUgNjUuMjEyOUwzMzQuOTU0IDU5LjkyMjlDMzM2LjM5NiA1OC40ODA3IDMzNy45NTkgNTguMDAwMSAzMzkuMjgxIDU4SDM3NC4xNDNaTTU4OS45MDYgNThDNTkxLjU4OSA1OCA1OTIuOTExIDU4LjYwMDkgNTk0LjExMyA1OS44MDI3TDU5OS41MjMgNjUuMDkxOEM2MDAuODQ2IDY2LjQxNDEgNjAxLjMyNiA2Ny43MzcgNjAxLjMyNiA2OS40MTk5VjEwMi4zNTZDNjAxLjMyNiAxMDQuMDM5IDYwMC44NDYgMTA1LjM2MiA1OTkuNTIzIDEwNi42ODVMNTk0LjExMyAxMTEuOTc0QzU5Mi45MTEgMTEzLjE3NiA1OTEuNTg5IDExMy43NzYgNTg5LjkwNiAxMTMuNzc2SDU1NS4wNDZDNTUzLjg0NCAxMTMuNzc2IDU1Mi4yOCAxMTMuNDE2IDU1MC43MTggMTExLjg1NEw1NDUuNDI5IDEwNi41NjRDNTQ0LjM0NyAxMDUuMzYyIDU0My44NjYgMTAzLjc5OSA1NDMuODY2IDEwMi4zNTZWNjkuNDE5OUM1NDMuODY2IDY3LjczNzIgNTQ0LjQ2NyA2Ni4yOTQ3IDU0NS40MjkgNjUuMjEyOUw1NTAuNzE4IDU5LjkyMjlDNTUyLjE2IDU4LjQ4MDQgNTUzLjcyNCA1OCA1NTUuMDQ2IDU4SDU4OS45MDZaTTE5Ni40MDYgMTAzLjU2MUgyMzAuNDI1VjY4LjIxODhIMTk2LjQwNlYxMDMuNTYxWk00ODUuMzU0IDEwMy41NjFINTE5LjM3NFY2OC4yMTg4SDQ4NS4zNTRWMTAzLjU2MVpNMjY4LjI2MiAxMDMuNTU5SDMwMy4xMjJWNjguMjE3OEgyNjguMjYyVjEwMy41NTlaTTMzOS40MDEgMTAzLjU1OUgzNzQuMjYzVjY4LjIxNzhIMzM5LjQwMVYxMDMuNTU5Wk01NTUuMTY2IDEwMy41NTlINTkwLjAyNlY2OC4yMTc4SDU1NS4xNjZWMTAzLjU1OVpNMjA2LjY0NyA5MC41MDJIMjAxLjA2Vjg0LjkxNDFIMjA2LjY0N1Y5MC41MDJaTTIxNS45NjEgOTAuNTAySDIxMC4zNzNWODQuOTE0MUgyMTUuOTYxVjkwLjUwMlpNMjI1LjI3MyA5MC41MDJIMjE5LjY4NlY4NC45MTQxSDIyNS4yNzNWOTAuNTAyWk01NjYuMzA5IDgyLjExODJDNTY4LjQ2IDgyLjExODIgNTcwLjIwNCA4My44NjI2IDU3MC4yMDQgODYuMDEzN0M1NzAuMjA0IDg4LjE2NDYgNTY4LjQ2IDg5LjkwODIgNTY2LjMwOSA4OS45MDgyQzU2NC4xNTggODkuOTA4MSA1NjIuNDE0IDg4LjE2NDUgNTYyLjQxNCA4Ni4wMTM3QzU2Mi40MTQgODMuODYyNyA1NjQuMTU4IDgyLjExODMgNTY2LjMwOSA4Mi4xMTgyWk01NzkuOTM5IDgyLjExODJDNTgyLjA5MSA4Mi4xMTgyIDU4My44MzQgODMuODYyNiA1ODMuODM0IDg2LjAxMzdDNTgzLjgzNCA4OC4xNjQ2IDU4Mi4wOSA4OS45MDgyIDU3OS45MzkgODkuOTA4MkM1NzcuNzg4IDg5LjkwODIgNTc2LjA0NSA4OC4xNjQ2IDU3Ni4wNDUgODYuMDEzN0M1NzYuMDQ1IDgzLjg2MjYgNTc3Ljc4OCA4Mi4xMTgyIDU3OS45MzkgODIuMTE4MlpNNTcyLjQxOSAzMi45NzA3QzU3NC40NjUgMzIuOTcwNyA1NzYuMTI0IDM0LjYyOTUgNTc2LjEyNCAzNi42NzU4QzU3Ni4xMjQgMzguMDQ3IDU3NS4zNzkgMzkuMjQzIDU3NC4yNzEgMzkuODgzOFY1MS41NzIzQzU3Ni43ODUgNTEuNzQzNCA1NzkuMTIxIDUyLjIwMDMgNTgwLjk1MiA1Mi44OTQ1QzU4My4zMTQgNTMuNzkwMiA1ODQuNDYxIDU0Ljg2MDQgNTg0LjQ2MSA1Ni4xMjdINTU5LjQ1QzU1OS40NTEgNTQuODYwNCA1NjAuNzc4IDUzLjc5MDIgNTYzLjE0IDUyLjg5NDVDNTY1LjE1IDUyLjEzMjEgNTY3Ljc3MSA1MS42NTU2IDU3MC41NjYgNTEuNTMwM1YzOS44ODQ4QzU2OS40NTkgMzkuMjQ0IDU2OC43MTQgMzguMDQ3MiA1NjguNzE0IDM2LjY3NThDNTY4LjcxNCAzNC42Mjk1IDU3MC4zNzMgMzIuOTcwNyA1NzIuNDE5IDMyLjk3MDdaIiBmaWxsPSIjMjgwMEZGIi8+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXJfMjM3NF8xNTQ2IiB4MT0iNi4wMDMwNiIgeTE9IjYiIHgyPSIxNDIuOTcyIiB5Mj0iMTQzLjIyNiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjgwMEZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzA4REFDRiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MV9saW5lYXJfMjM3NF8xNTQ2IiB4MT0iMTQzLjIyNyIgeTE9Ijc2LjgwNDYiIHgyPSIyNi4wMDEiIHkyPSIxMjIuOTY0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiMyODAwRkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDhEQUNGIi8+CjwvbGluZWFyR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQyX2xpbmVhcl8yMzc0XzE1NDYiIHgxPSI1OC4yNTQxIiB5MT0iNTguMTY3IiB4Mj0iNTMuOTExNyIgeTI9IjEzMi45NTEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzI4MDBGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwOERBQ0YiLz4KPC9saW5lYXJHcmFkaWVudD4KPGNsaXBQYXRoIGlkPSJjbGlwMF8yMzc0XzE1NDYiPgo8cGF0aCBkPSJNNiA2SDExMy4yMjdDMTI5Ljc5NSA2IDE0My4yMjcgMTkuNDMxNSAxNDMuMjI3IDM2VjExMi45NzVDMTQzLjIyNyAxMjkuNTQ0IDEyOS43OTUgMTQyLjk3NSAxMTMuMjI3IDE0Mi45NzVINlY2WiIgZmlsbD0id2hpdGUiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K',\r\n userAvatar:\r\n 'data:image/png;base64,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',\r\n botAvatar:\r\n 'data:image/png;base64,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',\r\n};\r\n","import { isDevMode } from '@angular/core';\r\n\r\nclass Logger {\r\n private static prefix = '[Doohbot]';\r\n\r\n // 🎨 Color styles\r\n private static styles = {\r\n log: 'color:#2196f3; font-weight:500',\r\n info: 'color:#4caf50; font-weight:500',\r\n warn: 'color:#ff9800; font-weight:600',\r\n error: 'color:#f44336; font-weight:700',\r\n debug: 'color:#9c27b0; font-weight:500',\r\n };\r\n\r\n private static canLog(): boolean {\r\n return isDevMode();\r\n }\r\n\r\n static log(message: string, ...args: any[]): void {\r\n if (!this.canLog()) return;\r\n console.log(`%c${this.prefix} ${message}`, this.styles.log, ...args);\r\n }\r\n\r\n static info(message: string, ...args: any[]): void {\r\n if (!this.canLog()) return;\r\n console.info(`%c${this.prefix} ${message}`, this.styles.info, ...args);\r\n }\r\n\r\n static warn(message: string, ...args: any[]): void {\r\n if (!this.canLog()) return;\r\n console.warn(`%c${this.prefix} ${message}`, this.styles.warn, ...args);\r\n }\r\n\r\n static error(message: string, ...args: any[]): void {\r\n if (!this.canLog()) return;\r\n console.error(`%c${this.prefix} ${message}`, this.styles.error, ...args);\r\n }\r\n\r\n static debug(message: string, ...args: any[]): void {\r\n if (!this.canLog()) return;\r\n console.debug(`%c${this.prefix} ${message}`, this.styles.debug, ...args);\r\n }\r\n}\r\n\r\nexport default Logger;\r\n","import { SnackbarService } from './snackbar.service';\r\n\r\n/**\r\n * Utility class for common snackbar operations\r\n * Provides reusable snackbar configurations for consistency across the application\r\n */\r\nexport class SnackbarUtils {\r\n private static service: SnackbarService | null = null;\r\n\r\n /**\r\n * Initialize the utility with a SnackbarService instance\r\n * @param service The SnackbarService instance\r\n */\r\n static init(service: SnackbarService): void {\r\n this.service = service;\r\n }\r\n\r\n /**\r\n * Show a success snackbar\r\n * @param message The message to show\r\n */\r\n static success(message: string): void {\r\n this.service?.success(message);\r\n }\r\n\r\n /**\r\n * Show an error snackbar\r\n * @param message The message to show\r\n */\r\n static error(message: string): void {\r\n this.service?.error(message);\r\n }\r\n\r\n /**\r\n * Show a warning snackbar\r\n * @param message The message to show\r\n */\r\n static warn(message: string): void {\r\n this.service?.warn(message);\r\n }\r\n\r\n /**\r\n * Show an info snackbar\r\n * @param message The message to show\r\n */\r\n static info(message: string): void {\r\n this.service?.info(message);\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { AuthMode } from '../types/auth-mode.type';\r\nimport { TenantResolutionStrategy } from '../types/tenant-resolution-strategy.type';\r\nimport { PromptMode } from '../types/prompt-mode.type';\r\n\r\n/**\r\n * Advanced configuration for DoohBot package\r\n * Supports both simple and complex use cases\r\n */\r\nexport interface DoohbotAdvancedConfig {\r\n /**\r\n * Authentication mode\r\n * - 'manual': You provide platformTenant, subTenant, agent manually\r\n * - 'auto': Package reads from your auth service via resolver\r\n * @default 'manual'\r\n */\r\n authMode?: AuthMode;\r\n\r\n /**\r\n * Tenant resolution strategy\r\n * - 'static': Use fixed values provided via inputs\r\n * - 'dynamic': Automatically update when auth state changes\r\n * - 'callback': Use custom resolver function\r\n * @default 'static'\r\n */\r\n tenantResolution?: TenantResolutionStrategy;\r\n\r\n /**\r\n * Auto-configure from localStorage key\r\n * If provided, package will read auth data from localStorage\r\n * Example: 'auth_user' or 'saas_session'\r\n */\r\n autoConfigFromStorage?: string;\r\n\r\n /**\r\n * Enable multi-tenant mode\r\n * Allows switching between different tenant contexts\r\n * @default false\r\n */\r\n enableMultiTenant?: boolean;\r\n\r\n /**\r\n * Persist chat history per tenant\r\n * @default true\r\n */\r\n persistChatPerTenant?: boolean;\r\n\r\n /**\r\n * Custom authentication header name\r\n * @default 'Authorization'\r\n */\r\n authHeaderName?: string;\r\n\r\n /**\r\n * Custom authentication header format\r\n * Use {token} as placeholder\r\n * @default 'Bearer {token}'\r\n */\r\n authHeaderFormat?: string;\r\n\r\n /**\r\n * Enable role-based features\r\n * Shows/hides features based on user permissions\r\n * @default false\r\n */\r\n enableRoleBasedFeatures?: boolean;\r\n\r\n /**\r\n * User permissions (for role-based features)\r\n */\r\n userPermissions?: string[];\r\n\r\n /**\r\n * Callback when authentication fails\r\n */\r\n onAuthFailure?: (error: any) => void;\r\n\r\n /**\r\n * Enable debug mode (logs configuration and requests)\r\n * @default false\r\n */\r\n debugMode?: boolean;\r\n\r\n /**\r\n * Prompt mode for chat responses\r\n * @default 'markdown'\r\n */\r\n promptMode?: PromptMode;\r\n}\r\n\r\n/**\r\n * Injection token for advanced configuration\r\n */\r\nexport const DOOHBOT_ADVANCED_CONFIG = new InjectionToken<DoohbotAdvancedConfig>(\r\n 'DOOHBOT_ADVANCED_CONFIG',\r\n {\r\n providedIn: 'root',\r\n factory: () => ({\r\n authMode: 'manual',\r\n tenantResolution: 'static',\r\n enableMultiTenant: false,\r\n persistChatPerTenant: true,\r\n authHeaderName: 'Authorization',\r\n authHeaderFormat: 'Bearer {token}',\r\n enableRoleBasedFeatures: false,\r\n debugMode: false,\r\n }),\r\n },\r\n);\r\n","export class DoohbotInput {\r\n username = '';\r\n password = '';\r\n rememberMe?: boolean = false;\r\n authToken?: string;\r\n license?: string = '';\r\n licenseCode?: string = '';\r\n licenseKey?: string = '';\r\n licenseFilePath?: string = '';\r\n apiBaseUrl?: string = '';\r\n apiSegment?: string = '';\r\n tenancyName?: string = '';\r\n storageKey?: string = '';\r\n secretKey?: string = '';\r\n companyCode?: string = '';\r\n buttonStyle?: 'fab' | 'sidebar' | 'sidebar-top' | 'sidebar-bottom';\r\n primaryColor?: string = '';\r\n accentColor?: string = '';\r\n}\r\n","import { Injectable, signal, WritableSignal } from '@angular/core';\r\nimport { DoohbotInput } from '../../doohbot-input';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class CoreConfigService {\r\n private configSignal: WritableSignal<DoohbotInput> = signal(new DoohbotInput());\r\n public config$ = this.configSignal.asReadonly();\r\n\r\n /**\r\n * Updates the global library configuration\r\n */\r\n updateConfig(config: DoohbotInput): void {\r\n this.configSignal.set(config);\r\n }\r\n\r\n /**\r\n * Dynamic getters for common config properties\r\n */\r\n get apiUrl(): string {\r\n const config = this.configSignal();\r\n return `${config.apiBaseUrl}${config.apiSegment}`;\r\n }\r\n\r\n get storageKey(): string {\r\n return this.configSignal().storageKey || '';\r\n }\r\n\r\n get secretKey(): string {\r\n return this.configSignal().secretKey || '';\r\n }\r\n\r\n get companyCode(): string {\r\n return this.configSignal().companyCode || '';\r\n }\r\n\r\n get tenancyName(): string {\r\n return this.configSignal().tenancyName || '';\r\n }\r\n\r\n get licenseKey(): string {\r\n return this.configSignal().licenseKey || '';\r\n }\r\n\r\n get licenseFilePath(): string {\r\n return this.configSignal().licenseFilePath || '';\r\n }\r\n\r\n get rememberMe(): boolean {\r\n return this.configSignal().rememberMe !== undefined ? this.configSignal().rememberMe! : false;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport * as CryptoJS from 'crypto-js';\r\nimport { CoreConfigService } from '../services/core-config.service';\r\nimport Logger from '../utils/logger.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class StorageService {\r\n get storageKey(): string {\r\n return this.coreConfig.storageKey;\r\n }\r\n\r\n get secretKey(): string {\r\n return this.coreConfig.secretKey;\r\n }\r\n\r\n private storage: Storage;\r\n\r\n constructor(private coreConfig: CoreConfigService) {\r\n // Determine initial storage\r\n // If session storage has data, use it (implies remember me was false)\r\n // Otherwise default/fallback to local storage\r\n if (sessionStorage.getItem(this.storageKey)) {\r\n this.storage = sessionStorage;\r\n } else {\r\n this.storage = localStorage;\r\n }\r\n }\r\n\r\n setRememberMe(rememberMe: boolean): void {\r\n const currentData = this.storage.getItem(this.storageKey);\r\n const targetStorage = rememberMe ? localStorage : sessionStorage;\r\n\r\n // If storage type is changing, move data\r\n if (this.storage !== targetStorage) {\r\n if (currentData) {\r\n targetStorage.setItem(this.storageKey, currentData);\r\n this.storage.removeItem(this.storageKey);\r\n }\r\n this.storage = targetStorage;\r\n }\r\n }\r\n\r\n set(key: string, value: any): void {\r\n const data = this.storage.getItem(this.storageKey);\r\n let dataJson: any = {};\r\n if (data) {\r\n const dataDec = this.decrypt(data);\r\n if (dataDec) {\r\n dataJson = JSON.parse(dataDec);\r\n }\r\n }\r\n dataJson = Object.assign(dataJson, { [key]: value });\r\n this.storage.setItem(this.storageKey, this.encrypt(JSON.stringify(dataJson)));\r\n }\r\n\r\n get(key: string): any {\r\n const data = this.storage.getItem(this.storageKey);\r\n if (data) {\r\n const dataDec = this.decrypt(data);\r\n if (dataDec) {\r\n try {\r\n const dataJson = JSON.parse(dataDec);\r\n return dataJson![key] || null;\r\n } catch (e) {\r\n Logger.error(\r\n '[TokenStorage] Failed to parse decrypted data, clearing corrupt storage:',\r\n e,\r\n );\r\n this.clear();\r\n return null;\r\n }\r\n } else {\r\n // Decrypt failed, auto-clear corrupt storage\r\n Logger.error('[TokenStorage] Decrypt failed, clearing corrupt storage');\r\n this.clear();\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Check if storage is valid (can be decrypted) without side effects\r\n */\r\n isValid(): boolean {\r\n const data = this.storage.getItem(this.storageKey);\r\n if (!data) return false;\r\n const decrypted = this.decrypt(data);\r\n return decrypted !== null && decrypted !== '';\r\n }\r\n\r\n clear(): void {\r\n // Clear both to be safe\r\n localStorage.removeItem(this.storageKey);\r\n sessionStorage.removeItem(this.storageKey);\r\n }\r\n\r\n private encrypt(value: string): string {\r\n return CryptoJS.AES.encrypt(value, this.secretKey).toString();\r\n }\r\n\r\n private decrypt(value: string): string | null {\r\n try {\r\n const bytes = CryptoJS.AES.decrypt(value, this.secretKey);\r\n const decrypted = bytes.toString(CryptoJS.enc.Utf8);\r\n return decrypted || null;\r\n } catch (e) {\r\n Logger.error('[TokenStorage] Decryption error:', e);\r\n return null;\r\n }\r\n }\r\n}\r\n","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, delay, retry, map, catchError, of } from 'rxjs';\r\nimport { CoreConfigService } from '../services/core-config.service';\r\nimport { StorageService } from '../auth/storage.service';\r\nimport logger from '../utils/logger.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class HttpService {\r\n // @BlockUI() blockUI!: NgBlockUI;\r\n\r\n get apiUrl(): string {\r\n return this.coreConfig.apiUrl;\r\n }\r\n\r\n constructor(\r\n private http: HttpClient,\r\n private tokenStorage: StorageService,\r\n private coreConfig: CoreConfigService,\r\n ) {\r\n logger.log('HttpService: Initialized');\r\n }\r\n\r\n get(\r\n url: string,\r\n param?: object,\r\n nestedParam = false,\r\n showLoader = false,\r\n refresh = true,\r\n headers?: HttpHeaders,\r\n ): Observable<any> {\r\n // if (showLoader && !this.blockUI.isActive) {\r\n\r\n // this.blockUI.start();\r\n\r\n // }\r\n\r\n let params = {};\r\n\r\n if (nestedParam) {\r\n this.buildHttpParams(params, param, '');\r\n } else {\r\n params = param as HttpParams;\r\n }\r\n\r\n return this.http\r\n .get(`${this.apiUrl}${url}`, {\r\n params: params,\r\n // withCredentials: true,\r\n headers,\r\n })\r\n .pipe(\r\n delay(100),\r\n\r\n retry(0),\r\n\r\n map((response) => this.returnResponse(response, showLoader)),\r\n\r\n catchError((error) => {\r\n // if (this.blockUI.isActive) {\r\n\r\n // this.blockUI.stop();\r\n\r\n // }\r\n\r\n return of(error);\r\n }),\r\n );\r\n }\r\n\r\n private buildHttpParams(params: any, data: any, currentPath: string) {\r\n Object.keys(data).forEach((key) => {\r\n if (data[key] instanceof Object && !(data[key] instanceof Array)) {\r\n this.buildHttpParams(params, data[key], `${currentPath}${key}.`);\r\n } else {\r\n params[`${currentPath}${key}`] = data[key];\r\n }\r\n });\r\n }\r\n\r\n post(url: string, param?: object, showLoader = false, headers?: HttpHeaders): Observable<any> {\r\n // if (showLoader && !this.blockUI.isActive) {\r\n // this.blockUI.start();\r\n // }\r\n\r\n return this.http.post(`${this.apiUrl}${url}`, param as HttpParams, { headers }).pipe(\r\n delay(100),\r\n retry(0),\r\n map((response: any) => this.returnResponse(response, showLoader)),\r\n catchError((error) => {\r\n // if (this.blockUI.isActive) {\r\n // this.blockUI.stop();\r\n // }\r\n\r\n return of(error);\r\n }),\r\n );\r\n }\r\n\r\n patch(url: string, param?: object, showLoader = false, headers?: HttpHeaders): Observable<any> {\r\n // if (showLoader && !this.blockUI.isActive) {\r\n // this.blockUI.start();\r\n // }\r\n\r\n return this.http.patch(`${this.apiUrl}${url}`, param as HttpParams, { headers }).pipe(\r\n delay(100),\r\n retry(0),\r\n map((response: any) => this.returnResponse(response, showLoader)),\r\n catchError((error) => {\r\n // if (this.blockUI.isActive) {\r\n // this.blockUI.stop();\r\n // }\r\n\r\n return of(error);\r\n }),\r\n );\r\n }\r\n\r\n delete(url: string, param?: object, showLoader = false, headers?: HttpHeaders): Observable<any> {\r\n // if (showLoader && !this.blockUI.isActive) {\r\n // this.blockUI.start();\r\n // }\r\n let params = {};\r\n params = param as HttpParams;\r\n\r\n return this.http.delete(`${this.apiUrl}${url}`, { body: param, headers }).pipe(\r\n delay(100),\r\n retry(0),\r\n map((response: any) => this.returnResponse(response, showLoader)),\r\n catchError((error) => {\r\n // if (this.blockUI.isActive) {\r\n // this.blockUI.stop();\r\n // }\r\n\r\n return of(error);\r\n }),\r\n );\r\n }\r\n\r\n private returnResponse(value: any, showLoader: boolean = true): any {\r\n // if (showLoader && this.blockUI.isActive) {\r\n // this.blockUI.reset();\r\n // }\r\n return value;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { HttpService } from '../http/http.service';\r\nimport { AuthResult } from './models/auth-result.model';\r\nimport { ApiResponse } from '../models/api-response.model';\r\nimport { LoginRequest } from './models/login-request.model';\r\nimport { FederatedLoginRequest } from './models/federated-login-request.model';\r\nimport { HttpHeaders } from '@angular/common/http';\r\nimport { StorageService } from './storage.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AccountService {\r\n constructor(\r\n private http: HttpService,\r\n private tokenStorage: StorageService,\r\n // private httpStream: HttpStreamService,\r\n ) {}\r\n\r\n login(param?: LoginRequest, showLoader = false): Observable<ApiResponse<AuthResult>> {\r\n return this.http.post('auth/login', param, showLoader, this.buildLicenceHeader());\r\n }\r\n\r\n federateLogin(\r\n param?: FederatedLoginRequest,\r\n showLoader = false,\r\n ): Observable<ApiResponse<AuthResult>> {\r\n return this.http.post('auth/federated/login', param, showLoader, this.buildLicenceHeader());\r\n }\r\n\r\n private buildLicenceHeader(): HttpHeaders {\r\n let headers = new HttpHeaders();\r\n const licenseKey = this.tokenStorage.get('license_key') || '';\r\n if (licenseKey) {\r\n headers = headers.set('x-license-key', licenseKey);\r\n }\r\n return headers;\r\n }\r\n\r\n refreshLogin(param?: object, showLoader = false): Observable<ApiResponse<AuthResult>> {\r\n return this.http.post('auth/refresh', param, showLoader, this.buildLicenceHeader());\r\n }\r\n\r\n logout(refreshToken: string, showLoader = false): Observable<ApiResponse<void>> {\r\n return this.http.post(\r\n 'auth/logout',\r\n { refresh_token: refreshToken },\r\n showLoader,\r\n this.buildLicenceHeader(),\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class CryptoHelperService {\r\n private encoder = new TextEncoder();\r\n private decoder = new TextDecoder();\r\n private secretKey = ''; // Will be set by AuthService\r\n\r\n setSecretKey(key: string) {\r\n this.secretKey = key;\r\n }\r\n\r\n private async getKey() {\r\n const salt = this.encoder.encode('fixed_salt'); // Keep constant\r\n const baseKey = await crypto.subtle.importKey(\r\n 'raw',\r\n this.encoder.encode(this.secretKey),\r\n 'PBKDF2',\r\n false,\r\n ['deriveKey'],\r\n );\r\n\r\n return crypto.subtle.deriveKey(\r\n {\r\n name: 'PBKDF2',\r\n salt,\r\n iterations: 100000,\r\n hash: 'SHA-256',\r\n },\r\n baseKey,\r\n { name: 'AES-GCM', length: 256 },\r\n false,\r\n ['encrypt', 'decrypt'],\r\n );\r\n }\r\n\r\n async encrypt(value: string): Promise<string | null> {\r\n if (!value) return null;\r\n\r\n const key = await this.getKey();\r\n const iv = crypto.getRandomValues(new Uint8Array(12));\r\n\r\n const encrypted = await crypto.subtle.encrypt(\r\n { name: 'AES-GCM', iv },\r\n key,\r\n this.encoder.encode(value),\r\n );\r\n\r\n const merged = new Uint8Array(iv.length + encrypted.byteLength);\r\n merged.set(iv, 0);\r\n merged.set(new Uint8Array(encrypted), iv.length);\r\n\r\n return btoa(String.fromCharCode(...merged));\r\n }\r\n\r\n async decrypt(value: string): Promise<string | null> {\r\n if (!value) return null;\r\n\r\n const raw = Uint8Array.from(atob(value), (c) => c.charCodeAt(0));\r\n\r\n const iv = raw.slice(0, 12);\r\n const data = raw.slice(12);\r\n\r\n const key = await this.getKey();\r\n\r\n const decrypted = await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, data);\r\n\r\n return this.decoder.decode(decrypted);\r\n }\r\n}\r\n","import { inject, Injectable, signal } from '@angular/core';\r\nimport { CoreConfigService } from '../services/core-config.service';\r\nimport { DoohbotInput } from '../../doohbot-input';\r\nimport {\r\n BehaviorSubject,\r\n map,\r\n Observable,\r\n catchError,\r\n of,\r\n tap,\r\n retry,\r\n throwError,\r\n firstValueFrom,\r\n} from 'rxjs';\r\nimport { AuthResult } from './models/auth-result.model';\r\nimport { FederatedLoginRequest } from './models/federated-login-request.model';\r\nimport { LoginRequest } from './models/login-request.model';\r\nimport { JwtHelperService } from '@auth0/angular-jwt';\r\nimport { CryptoHelperService } from '../helpers/crypto-helper.service';\r\nimport { StorageService } from './storage.service';\r\nimport logger from '../utils/logger.service';\r\nimport { AuthStatus } from '../types/auth-status.type';\r\nimport { AccountService } from './account-api.service';\r\nimport { SnackbarUtils } from './../../shared/snackbar/snackbar.utils';\r\nimport { DoohbotConst } from '../../constant/doohbot-constant';\r\nimport { Router } from '@angular/router';\r\nimport { LicensingContext } from '../models/license.model';\r\nimport { DOOHBOT_ADVANCED_CONFIG } from '../models/doohbot-config.model';\r\n\r\n//! inherit Window storageEventAdded for duplicate tab detection\r\ndeclare global {\r\n interface Window {\r\n storageEventAdded?: boolean;\r\n tabCLoseEventAdded?: boolean;\r\n abp?: any;\r\n AppPreBootstrap?: any;\r\n AppConsts?: any;\r\n }\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthService {\r\n get apiUrl(): string {\r\n return this.coreConfig.apiUrl;\r\n }\r\n\r\n get storageKey(): string {\r\n return this.coreConfig.storageKey;\r\n }\r\n\r\n get secretKey(): string {\r\n return this.coreConfig.secretKey;\r\n }\r\n\r\n get companyCode(): string {\r\n return this.coreConfig.companyCode;\r\n }\r\n\r\n jwtHelper: JwtHelperService = new JwtHelperService();\r\n private advancedConfig = inject(DOOHBOT_ADVANCED_CONFIG, { optional: true });\r\n\r\n // Reactive Authentication State\r\n private authStatusSubject = new BehaviorSubject<AuthStatus>('unauthenticated');\r\n public authStatus$ = this.authStatusSubject.asObservable();\r\n\r\n // UI State Signals (Merged from ChatAuthService)\r\n public isLoggingIn = signal<boolean>(false);\r\n public authError = signal<string | null>(null);\r\n public authSuccess = signal<string | null>(null);\r\n\r\n constructor(\r\n private accountService: AccountService,\r\n private cryptoHelper: CryptoHelperService,\r\n private tokenStorage: StorageService,\r\n private router: Router,\r\n private coreConfig: CoreConfigService,\r\n ) {\r\n // Properties are now derived from coreConfig\r\n }\r\n\r\n /**\r\n * Updates the service configuration from the component input\r\n */\r\n public updateConfig(config: DoohbotInput): void {\r\n this.coreConfig.updateConfig(config);\r\n if (config.secretKey) {\r\n this.cryptoHelper.setSecretKey(config.secretKey);\r\n }\r\n }\r\n\r\n getLoggedInUserName(): string {\r\n const username = this.tokenStorage.get('username');\r\n return username || '';\r\n }\r\n\r\n getLoggedInUserImageUrl(): string | null {\r\n return DoohbotConst.userAvatar;\r\n }\r\n\r\n getLoggedInUserRole(): string {\r\n const roles = this.tokenStorage.get('roles');\r\n // If roles is an array, return the first role, otherwise return the string\r\n if (Array.isArray(roles) && roles.length > 0) {\r\n return roles[0];\r\n }\r\n return roles || 'User';\r\n }\r\n\r\n // Add getters for backward compatibility if needed, but preferably use authStatus$\r\n public get authStatus(): AuthStatus {\r\n return this.authStatusSubject.value;\r\n }\r\n\r\n /**\r\n * Resolves a federated token from browser storage\r\n */\r\n private resolveSilentToken(): string | null {\r\n const config = this.coreConfig.config$();\r\n const commonKeys = ['access_token', 'id_token', 'token', 'authToken'];\r\n\r\n // 1. Try explicit authToken from config (Highest Priority)\r\n if (config.authToken) {\r\n logger.info(`[Auth] Using explicit authToken from input`);\r\n return config.authToken;\r\n }\r\n\r\n // 2. Try configured storage key from advanced config\r\n if (this.advancedConfig?.autoConfigFromStorage) {\r\n const key = this.advancedConfig.autoConfigFromStorage;\r\n const token = localStorage.getItem(key) || sessionStorage.getItem(key);\r\n if (token) {\r\n logger.debug(`[Auth] Resolved token from configured key: ${key}`);\r\n return token;\r\n }\r\n }\r\n\r\n // 3. Try common fallback keys\r\n for (const key of commonKeys) {\r\n const token = localStorage.getItem(key) || sessionStorage.getItem(key);\r\n if (token) {\r\n logger.debug(`[Auth] Resolved token from fallback key: ${key}`);\r\n return token;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Authenticate user with federated credentials\r\n */\r\n async federatedLogin(\r\n credentials: Partial<FederatedLoginRequest>,\r\n silent: boolean = true,\r\n ): Promise<boolean> {\r\n logger.log('>>>>>>>Attempting federated login...');\r\n\r\n // Resolve token if not provided\r\n if (!credentials.accessToken) {\r\n credentials.accessToken = this.resolveSilentToken() || '';\r\n }\r\n\r\n // If still no token, exit gracefully\r\n if (!credentials.accessToken) {\r\n logger.log('[Auth] No federated token found in storage.');\r\n return false;\r\n }\r\n\r\n this.isLoggingIn.set(true);\r\n if (!silent) {\r\n this.authError.set(null);\r\n this.authSuccess.set(null);\r\n }\r\n\r\n try {\r\n const response = await firstValueFrom(\r\n this.accountService.federateLogin(credentials as FederatedLoginRequest),\r\n );\r\n logger.log('>>>>>>>>>>>Federated Login response<<<<<<<<<<:', response);\r\n if (response && response.success && response.data) {\r\n // Map federated result to something AuthService can handle\r\n // Federated result: { access_token: string, remember_me: boolean }\r\n const authResult = {\r\n access_token: response.data.access_token,\r\n refresh_token: credentials.rememberMe ? response.data.refresh_token : '',\r\n };\r\n\r\n this.setSession(authResult, credentials.rememberMe || false);\r\n\r\n logger.log('Federated login successful, authenticated state set to true');\r\n if (!silent) {\r\n SnackbarUtils.success('Login successful!');\r\n this.authSuccess.set('Login successful!');\r\n }\r\n this.isLoggingIn.set(false);\r\n return true;\r\n } else {\r\n if (!silent) {\r\n this.authError.set('Federated login failed.');\r\n }\r\n this.isLoggingIn.set(false);\r\n return false;\r\n }\r\n } catch (error) {\r\n logger.error('Federated login failed:', error);\r\n if (!silent) {\r\n this.authError.set('An error occurred during federated login.');\r\n }\r\n this.isLoggingIn.set(false);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Authenticate user with credentials\r\n */\r\n async login(credentials: LoginRequest, silent: boolean = false): Promise<boolean> {\r\n this.isLoggingIn.set(true);\r\n if (!silent) {\r\n this.authError.set(null); //TODO\r\n this.authSuccess.set(null);\r\n }\r\n\r\n try {\r\n const response = await firstValueFrom(this.accountService.login(credentials));\r\n logger.log('>>>>>>>>>>>Login response<<<<<<<<<<:', response);\r\n if (response && response.success && response.data) {\r\n this.setSession(response.data, credentials.rememberMe);\r\n\r\n logger.log('Login successful, authenticated state set to true');\r\n if (!silent) {\r\n this.authSuccess.set('Login successful!');\r\n }\r\n this.isLoggingIn.set(false);\r\n return true;\r\n } else {\r\n if (!silent) {\r\n SnackbarUtils.error('Login failed. Please check your credentials.');\r\n this.authError.set('Login failed. Please check your credentials.');\r\n }\r\n this.isLoggingIn.set(false);\r\n return false;\r\n }\r\n } catch (error) {\r\n logger.error('Login failed:', error);\r\n if (!silent) {\r\n this.authError.set('An error occurred during login.');\r\n }\r\n this.isLoggingIn.set(false);\r\n return false;\r\n }\r\n }\r\n\r\n /*\r\n * Logout logic enhanced with UI signals\r\n */\r\n async logout(refreshToken?: string): Promise<boolean> {\r\n const token = refreshToken || this.getRefreshToken() || '';\r\n\r\n try {\r\n // If no token, just clear local state\r\n if (!token) {\r\n this.clearAuth();\r\n this.authSuccess.set('Logged out successfully!');\r\n setTimeout(() => this.authSuccess.set(null), 3000);\r\n return true;\r\n }\r\n\r\n const response = await firstValueFrom(this.accountService.logout(token));\r\n\r\n if (response && response.success) {\r\n this.clearAuth();\r\n this.authSuccess.set('Logged out successfully!');\r\n setTimeout(() => this.authSuccess.set(null), 3000);\r\n return true;\r\n } else {\r\n this.clearAuth();\r\n return false;\r\n }\r\n } catch (error) {\r\n logger.error('Logout failed:', error);\r\n SnackbarUtils.error('An error occurred during logout.');\r\n // Force clear auth on error to ensure user isn't stuck\r\n this.clearAuth();\r\n return false;\r\n }\r\n }\r\n\r\n // Utility\r\n setSession(session: AuthResult, rememberMe: boolean = true) {\r\n const user = this.jwtHelper.decodeToken(session.access_token);\r\n\r\n // Set storage type based on rememberMe preference\r\n this.tokenStorage.setRememberMe(rememberMe);\r\n\r\n this.tokenStorage.set('access_token', session.access_token);\r\n this.tokenStorage.set('refresh_token', session.refresh_token);\r\n this.tokenStorage.set('user_id', user?.user_id);\r\n this.tokenStorage.set('username', user?.username);\r\n this.tokenStorage.set('roles', user?.roles);\r\n this.tokenStorage.set('permissions', user?.permissions);\r\n this.tokenStorage.set('organization_id', user?.organization_id);\r\n this.tokenStorage.set('company_id', user?.company_id);\r\n this.tokenStorage.set('office_id', user?.office_id);\r\n\r\n // Notify subscribers\r\n this.authStatusSubject.next('authenticated');\r\n }\r\n\r\n getOrganizationId(): string | null {\r\n logger.debug('>>>>>>>>>>getOrganizationId<<<<<<<:', this.tokenStorage.get('organization_id'));\r\n return this.tokenStorage.get('organization_id');\r\n }\r\n\r\n getRefreshToken(): string | null {\r\n logger.debug('>>>>>>>>>>getRefreshToken<<<<<<<:', this.tokenStorage.get('refresh_token'));\r\n return this.tokenStorage.get('refresh_token');\r\n }\r\n\r\n refreshToken(): Observable<AuthResult> {\r\n const refreshToken = this.getRefreshToken();\r\n if (!refreshToken) {\r\n return throwError(() => new Error('No refresh token available'));\r\n }\r\n\r\n return this.accountService.refreshLogin({ refresh_token: refreshToken }).pipe(\r\n retry(3), // Retry 3 times on failure\r\n tap((response: any) => {\r\n if (response && response.success && response.data) {\r\n this.setSession(response.data);\r\n }\r\n }),\r\n map((response: any) => {\r\n if (response && response.success && response.data) {\r\n return response.data as AuthResult;\r\n } else {\r\n throw new Error('Token refresh failed');\r\n }\r\n }),\r\n catchError((err) => {\r\n logger.error('[Auth] Token refresh failed after retries:', err);\r\n this.clearAuth();\r\n SnackbarUtils.error('Session Expired. Please login.');\r\n return throwError(() => err);\r\n }),\r\n );\r\n }\r\n\r\n isAuthenticated(): boolean {\r\n const token = this.tokenStorage.get('access_token');\r\n return !!token && !this.isTokenExpired();\r\n }\r\n\r\n isTokenExpired(): boolean {\r\n let token = (this.tokenStorage.get('access_token') ?? '') as string;\r\n if (token) {\r\n return this.jwtHelper.isTokenExpired(token);\r\n } else {\r\n return true;\r\n }\r\n }\r\n\r\n /**\r\n * Validate stored token on app startup\r\n */\r\n validateStoredToken(): Observable<AuthStatus> {\r\n const accessToken = this.tokenStorage.get('access_token');\r\n\r\n //! No access token\r\n if (!accessToken) {\r\n //TODO: FORCE AUTHENTICATED FOR DEV\r\n // this.authStatusSubject.next('authenticated');\r\n // return of('authenticated');\r\n\r\n //! For production ( Backend Validation )\r\n this.authStatusSubject.next('unauthenticated');\r\n return of('unauthenticated');\r\n }\r\n\r\n // Access token valid\r\n if (!this.isTokenExpired()) {\r\n this.authStatusSubject.next('authenticated');\r\n return of('authenticated');\r\n }\r\n\r\n // Access Token expired -> try refresh\r\n const refreshToken = this.getRefreshToken();\r\n if (!refreshToken) {\r\n this.clearAuth();\r\n this.authStatusSubject.next('unauthenticated');\r\n return of('unauthenticated');\r\n }\r\n\r\n //! Access expired but refresh token exists → attempt refresh\r\n this.authStatusSubject.next('expired');\r\n return this.refreshToken().pipe(\r\n map(() => {\r\n this.authStatusSubject.next('authenticated');\r\n return 'authenticated' as AuthStatus;\r\n }),\r\n catchError((err) => {\r\n logger.error('[Auth] Token refresh failed:', err);\r\n this.clearAuth();\r\n this.authStatusSubject.next('unauthenticated');\r\n return of('unauthenticated' as AuthStatus);\r\n }),\r\n );\r\n }\r\n\r\n getUserId() {\r\n return this.tokenStorage.get('user_id') || '';\r\n }\r\n\r\n getLicensingContext(): LicensingContext {\r\n const roles = this.tokenStorage.get('roles');\r\n // Prefer company_id (specific tenant) over organization_id (system group)\r\n const tenantId = this.tokenStorage.get('company_id') || this.getOrganizationId() || '';\r\n\r\n return {\r\n tenantId: tenantId,\r\n principalId: this.getUserId() || '',\r\n roles: Array.isArray(roles) ? roles : roles ? [roles] : [],\r\n };\r\n }\r\n\r\n get licenseKey(): string {\r\n return this.tokenStorage.get('license_key') || this.coreConfig.licenseKey || '';\r\n }\r\n\r\n get isFederated(): boolean {\r\n return this.licenseKey.startsWith('doohbot_lic_');\r\n }\r\n\r\n setLicenseKey(key: string) {\r\n this.tokenStorage.set('license_key', key);\r\n }\r\n\r\n //! clear local storage\r\n /**\r\n * Clear all authentication related data from local storage, session storage, cache, and tokens.\r\n * This method is called when the user logs out.\r\n */\r\n clearAuth() {\r\n const userId = this.getUserId();\r\n logger.log('[Auth] Clearing auth:', { userId });\r\n\r\n this.clearSession();\r\n this.clearStorage();\r\n this.clearCache();\r\n this.clearLocalStorage();\r\n\r\n // ENSURE authStatus$ emits unauthenticated\r\n this.authStatusSubject.next('unauthenticated');\r\n\r\n logger.log('[Auth] Auth cleared successfully');\r\n }\r\n\r\n clearSession() {\r\n sessionStorage.clear();\r\n }\r\n\r\n clearTabInfo() {\r\n localStorage.removeItem('tabs');\r\n }\r\n\r\n clearStorage() {\r\n this.tokenStorage.clear();\r\n }\r\n clearLocalStorage() {\r\n localStorage.clear();\r\n }\r\n\r\n clearCache() {\r\n // this.cacheService.clear();\r\n }\r\n}\r\n","import { Injectable, signal, inject, effect } from '@angular/core';\r\nimport { StorageService } from '../../core/auth/storage.service';\r\nimport { AuthService } from '../../core/auth/auth.service';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\n\r\nexport interface Characteristics {\r\n warm: string;\r\n enthusiastic: string;\r\n headersAndLists: string;\r\n emoji: string;\r\n}\r\n\r\nexport interface AboutYou {\r\n nickname: string;\r\n occupation: string;\r\n}\r\n\r\nexport interface CustomInstructions {\r\n enabled: boolean;\r\n aboutUser: string;\r\n responseStyle: string;\r\n characteristics: Characteristics;\r\n aboutYou: AboutYou;\r\n}\r\n\r\nexport interface AppearanceSettings {\r\n theme: 'light' | 'dark' | 'auto';\r\n primaryColor: string;\r\n buttonStyle: 'fab' | 'sidebar' | 'sidebar-top' | 'sidebar-bottom';\r\n}\r\n\r\nexport interface PersonalizationSettings {\r\n customInstructions: CustomInstructions;\r\n appearance: AppearanceSettings;\r\n meta: {\r\n version: number;\r\n lastUpdated: number;\r\n };\r\n}\r\n\r\nconst BASE_STORAGE_KEY = 'app.personalization.v1';\r\n\r\nconst DEFAULT_SETTINGS: PersonalizationSettings = {\r\n customInstructions: {\r\n enabled: false,\r\n aboutUser: '',\r\n responseStyle: '',\r\n characteristics: {\r\n warm: 'Default',\r\n enthusiastic: 'Default',\r\n headersAndLists: 'Default',\r\n emoji: 'Default',\r\n },\r\n aboutYou: {\r\n nickname: '',\r\n occupation: '',\r\n },\r\n },\r\n appearance: {\r\n theme: 'auto',\r\n primaryColor: 'default', // Standard primary color (resolves to developer default)\r\n buttonStyle: 'fab',\r\n },\r\n meta: {\r\n version: 1,\r\n lastUpdated: Date.now(),\r\n },\r\n};\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class PersonalizationService {\r\n private storage = inject(StorageService);\r\n private authService = inject(AuthService);\r\n\r\n // Reactive Authentication Status\r\n private authStatus = toSignal(this.authService.authStatus$);\r\n\r\n // State Signals\r\n private _settings = signal<PersonalizationSettings>(DEFAULT_SETTINGS);\r\n public settings = this._settings.asReadonly();\r\n\r\n // Developer-provided defaults (from DoohbotInput)\r\n private _developerDefaults = signal<Partial<AppearanceSettings>>({});\r\n public readonly developerDefaults = this._developerDefaults.asReadonly();\r\n\r\n constructor() {\r\n // Reload settings when auth status changes (user logins or logouts)\r\n effect(\r\n () => {\r\n const status = this.authStatus();\r\n this._settings.set(this.loadSettings());\r\n },\r\n { allowSignalWrites: true }, // TODO\r\n );\r\n\r\n // Automatically persist changes when settings signal updates\r\n effect(() => {\r\n const currentSettings = this._settings();\r\n this.saveSettings(currentSettings);\r\n });\r\n }\r\n\r\n private getStorageKey(): string {\r\n const userId = this.authService.getUserId();\r\n return userId ? `${BASE_STORAGE_KEY}_${userId}` : BASE_STORAGE_KEY;\r\n }\r\n\r\n /**\r\n * Update custom instructions\r\n */\r\n updateInstructions(instructions: Partial<CustomInstructions>) {\r\n this._settings.update((s) => ({\r\n ...s,\r\n customInstructions: { ...s.customInstructions, ...instructions },\r\n meta: { ...s.meta, lastUpdated: Date.now() },\r\n }));\r\n }\r\n\r\n /**\r\n * Update appearance settings\r\n */\r\n updateAppearance(appearance: Partial<AppearanceSettings>) {\r\n this._settings.update((s) => ({\r\n ...s,\r\n appearance: { ...s.appearance, ...appearance },\r\n meta: { ...s.meta, lastUpdated: Date.now() },\r\n }));\r\n }\r\n\r\n /**\r\n * Set initial developer defaults (called from DoohbotComponent)\r\n */\r\n setDeveloperDefaults(defaults: Partial<AppearanceSettings>) {\r\n this._developerDefaults.set(defaults);\r\n // Refresh settings to apply defaults if no user settings are saved\r\n this._settings.set(this.loadSettings());\r\n }\r\n\r\n /**\r\n * Reset all personalization to defaults\r\n */\r\n resetToDefaults() {\r\n this._settings.set({\r\n ...DEFAULT_SETTINGS,\r\n meta: { ...DEFAULT_SETTINGS.meta, lastUpdated: Date.now() },\r\n });\r\n }\r\n\r\n /**\r\n * Get the formatted instructions block for chat requests\r\n */\r\n getFormattedInstructions(): string {\r\n const s = this._settings().customInstructions;\r\n if (!s.enabled) return '';\r\n\r\n let block = '--- CUSTOM INSTRUCTIONS ---\\n';\r\n if (s.aboutUser) {\r\n block += `USER CONTEXT: ${s.aboutUser}\\n`;\r\n }\r\n if (s.responseStyle) {\r\n block += `RESPONSE STYLE: ${s.responseStyle}\\n`;\r\n }\r\n block += '---------------------------';\r\n\r\n return s.aboutUser || s.responseStyle ? block : '';\r\n }\r\n\r\n private loadSettings(): PersonalizationSettings {\r\n try {\r\n const key = this.getStorageKey();\r\n // StorageService.get handles decryption/parsing\r\n const saved = this.storage.get(key);\r\n if (saved) {\r\n return { ...DEFAULT_SETTINGS, ...saved };\r\n }\r\n } catch (e) {\r\n console.error('Failed to load personalization settings', e);\r\n }\r\n\r\n // Return defaults merged with developer overrides\r\n return {\r\n ...DEFAULT_SETTINGS,\r\n appearance: {\r\n ...DEFAULT_SETTINGS.appearance,\r\n ...this._developerDefaults(),\r\n primaryColor: 'default', //! Force 'default' for fresh loads so it resolves dynamically\r\n },\r\n };\r\n }\r\n\r\n private saveSettings(settings: PersonalizationSettings) {\r\n const key = this.getStorageKey();\r\n this.storage.set(key, settings);\r\n }\r\n}\r\n","import { effect, Injectable, OnDestroy, Renderer2, RendererFactory2, signal } from '@angular/core';\r\nimport { OverlayContainer } from '@angular/cdk/overlay';\r\nimport { DoohbotThemeConfig } from '../models/theme-config.model';\r\nimport { PersonalizationService } from '../../app/personalization/personalization.service';\r\n\r\nexport type ThemeMode = 'light' | 'dark' | 'auto';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ThemeService implements OnDestroy {\r\n private renderer: Renderer2;\r\n private _theme = signal<ThemeMode>('auto');\r\n public theme = this._theme.asReadonly();\r\n\r\n private _activeTheme = signal<'light-theme' | 'dark-theme'>('light-theme');\r\n public activeTheme = this._activeTheme.asReadonly();\r\n\r\n private observer: MutationObserver | null = null;\r\n // private mediaQueryListener: ((e: MediaQueryListEvent) => void) | null = null;\r\n\r\n constructor(\r\n rendererFactory: RendererFactory2,\r\n private overlay: OverlayContainer,\r\n private personalization: PersonalizationService,\r\n ) {\r\n this.renderer = rendererFactory.createRenderer(null, null);\r\n\r\n // Sync theme and primary color with PersonalizationService\r\n effect(\r\n () => {\r\n const settings = this.personalization.settings();\r\n const mode = settings.appearance.theme;\r\n const primaryColor = settings.appearance.primaryColor;\r\n\r\n // Update theme\r\n this._theme.set(mode);\r\n this.updateActiveTheme(mode);\r\n\r\n // Update primary color globally\r\n this.applyPrimaryColorToGlobal(primaryColor);\r\n },\r\n { allowSignalWrites: true },\r\n );\r\n\r\n // Separate effect to handle re-application of config when activeTheme changes\r\n effect(() => {\r\n // const currentTheme = this._activeTheme();\r\n const config = this._currentConfig();\r\n if (this.rootElement && config) {\r\n this.applyCssVariables(this.rootElement, config);\r\n }\r\n });\r\n }\r\n\r\n private _currentConfig = signal<DoohbotThemeConfig | undefined>(undefined);\r\n private rootElement: HTMLElement | null = null;\r\n\r\n public setThemeConfig(config: DoohbotThemeConfig, rootElement: HTMLElement) {\r\n this._currentConfig.set(config);\r\n this.rootElement = rootElement;\r\n // Initial apply\r\n this.applyCssVariables(rootElement, config);\r\n }\r\n\r\n public applyPrimaryColorToGlobal(colorInput: string) {\r\n if (!colorInput) return;\r\n\r\n let color = colorInput;\r\n\r\n // Resolve 'default' magic string to developer default\r\n if (colorInput === 'default') {\r\n const defaults = this.personalization.developerDefaults();\r\n color = defaults.primaryColor || 'default';\r\n }\r\n\r\n if (color.includes(',')) {\r\n const parts = color.split(',').map((p) => p.trim());\r\n const isDark = this._activeTheme() === 'dark-theme';\r\n color = parts.length >= 2 ? (isDark ? parts[1] : parts[0]) : parts[0];\r\n }\r\n\r\n const root = document.documentElement;\r\n const overlayContainer = this.overlay.getContainerElement();\r\n const onPrimary = this.getContrastColor(color);\r\n\r\n // Standard Material 3 tokens\r\n root.style.setProperty('--mat-sys-primary', color);\r\n root.style.setProperty('--mat-sys-on-primary', onPrimary);\r\n\r\n // Primary Container (using semi-transparent primary as a fallback if no specific logic)\r\n const primaryContainer = `${color}33`; // 20% opacity\r\n root.style.setProperty('--mat-sys-primary-container', primaryContainer);\r\n root.style.setProperty('--mat-sys-on-primary-container', color);\r\n\r\n overlayContainer.style.setProperty('--mat-sys-primary', color);\r\n overlayContainer.style.setProperty('--mat-sys-on-primary', onPrimary);\r\n overlayContainer.style.setProperty('--mat-sys-primary-container', primaryContainer);\r\n\r\n // Update internal legacy/utility variables\r\n root.style.setProperty('--primary-color', color);\r\n root.style.setProperty('--user-message-color', color);\r\n root.style.setProperty('--user-text-color', onPrimary);\r\n\r\n overlayContainer.style.setProperty('--primary-color', color);\r\n }\r\n\r\n /**\r\n * Simple luminance-based contrast calculation\r\n * Returns #ffffff for dark colors and #000000 for light colors\r\n */\r\n private getContrastColor(hex: string): string {\r\n if (!hex || hex.length < 6) return '#ffffff';\r\n\r\n // Remove # if present\r\n const cleanHex = hex.replace('#', '');\r\n const r = parseInt(cleanHex.substring(0, 2), 16);\r\n const g = parseInt(cleanHex.substring(2, 4), 16);\r\n const b = parseInt(cleanHex.substring(4, 6), 16);\r\n\r\n // Calculate luminance (standard formula)\r\n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\r\n\r\n return luminance > 0.6 ? '#000000' : '#ffffff';\r\n }\r\n\r\n setTheme(mode: ThemeMode): void {\r\n this.personalization.updateAppearance({ theme: mode });\r\n }\r\n\r\n private updateActiveTheme(mode: ThemeMode) {\r\n this.cleanupObservers();\r\n\r\n if (mode === 'auto') {\r\n this.handleAutoTheme();\r\n } else {\r\n const themeToApply = mode === 'dark' ? 'dark-theme' : 'light-theme';\r\n this._activeTheme.set(themeToApply);\r\n this.applyThemeToGlobal(themeToApply);\r\n }\r\n }\r\n\r\n private handleAutoTheme() {\r\n // Initial detection\r\n this.detectAndApplyParentTheme();\r\n\r\n // Watch for changes in parent\r\n this.observer = new MutationObserver(() => {\r\n this.detectAndApplyParentTheme();\r\n });\r\n\r\n this.observer.observe(document.documentElement, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme'],\r\n });\r\n this.observer.observe(document.body, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme'],\r\n });\r\n }\r\n\r\n private detectAndApplyParentTheme() {\r\n const isDark = this.isParentDark();\r\n const newTheme = isDark ? 'dark-theme' : 'light-theme';\r\n\r\n // Only update if changed to avoid unnecessary DOM updates\r\n if (this._activeTheme() !== newTheme) {\r\n this._activeTheme.set(newTheme);\r\n this.applyThemeToGlobal(newTheme);\r\n }\r\n }\r\n\r\n private isParentDark(): boolean {\r\n const body = document.body;\r\n const html = document.documentElement;\r\n\r\n // Check for common class names\r\n const darkClasses = ['dark', 'dark-theme', 'dark-mode', 'night-mode'];\r\n const hasDarkClass = (el: HTMLElement) => darkClasses.some((c) => el.classList.contains(c));\r\n\r\n if (hasDarkClass(body) || hasDarkClass(html)) return true;\r\n\r\n // Check for data-theme attribute\r\n if (body.getAttribute('data-theme') === 'dark' || html.getAttribute('data-theme') === 'dark')\r\n return true;\r\n\r\n // Check for Bootstrap 5.3+ data-bs-theme\r\n if (\r\n body.getAttribute('data-bs-theme') === 'dark' ||\r\n html.getAttribute('data-bs-theme') === 'dark'\r\n ) {\r\n return true;\r\n }\r\n\r\n // Fallback to system preference\r\n // return window.matchMedia('(prefers-color-scheme: dark)').matches;\r\n return false;\r\n }\r\n\r\n private applyThemeToGlobal(theme: 'light-theme' | 'dark-theme') {\r\n const overlayContainer = this.overlay.getContainerElement();\r\n const root = document.documentElement;\r\n\r\n // Apply to root for global CSS variables (light-dark() support)\r\n this.renderer.removeClass(root, 'light-theme');\r\n this.renderer.removeClass(root, 'dark-theme');\r\n this.renderer.addClass(root, theme);\r\n\r\n // Also apply to overlay container (for menus/dialogs)\r\n this.renderer.removeClass(overlayContainer, 'light-theme');\r\n this.renderer.removeClass(overlayContainer, 'dark-theme');\r\n this.renderer.addClass(overlayContainer, theme);\r\n }\r\n\r\n private cleanupObservers() {\r\n if (this.observer) {\r\n this.observer.disconnect();\r\n this.observer = null;\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.cleanupObservers();\r\n }\r\n\r\n /**\r\n * @deprecated Manual CSS variable application is now handled via theme.css tokens\r\n */\r\n public applyCssVariables(element: HTMLElement, config: DoohbotThemeConfig | undefined) {\r\n if (!config) return;\r\n\r\n const isDark = this._activeTheme() === 'dark-theme';\r\n\r\n const applyColor = (input: string | undefined, variableName: string) => {\r\n if (input) {\r\n const parts = input.split(',').map((p) => p.trim());\r\n const colorToUse = parts.length >= 2 ? (isDark ? parts[1] : parts[0]) : parts[0];\r\n // Apply to Component Host\r\n element.style.setProperty(`--${variableName}`, colorToUse);\r\n\r\n // Apply to Overlay Container (for Dialogs/Menus which exist outside host)\r\n this.overlay.getContainerElement().style.setProperty(`--${variableName}`, colorToUse);\r\n\r\n // Secondary mapping for specific variables that have derived states\r\n // if (variableName === 'primary-color') {\r\n // element.style.setProperty('--user-message-color', colorToUse);\r\n // element.style.setProperty('--mat-sys-primary', colorToUse);\r\n // const onPrimary = this.getContrastColor(colorToUse);\r\n // element.style.setProperty('--user-text-color', onPrimary);\r\n // element.style.setProperty('--mat-sys-on-primary', onPrimary);\r\n // }\r\n }\r\n };\r\n\r\n // Font\r\n if (config.fontFamily) element.style.setProperty('--font-family', config.fontFamily);\r\n\r\n // Primary & Secondary\r\n // Handled globally via PersonalizationService/applyPrimaryColorToGlobal to allow user overrides\r\n // applyColor(config.primaryColor, 'primary-color');\r\n applyColor(config.secondaryColor, 'secondary-color');\r\n\r\n // Backgrounds\r\n applyColor(config.backgroundColor, 'background-color');\r\n\r\n // Ensure chat input also follows dual mode if provided, or defaults?\r\n // User only asked for background color \"of the entire app\".\r\n applyColor(config.chatInputColor, 'chat-input-color');\r\n\r\n // Text Colors\r\n applyColor(config.textAltColor, 'text-alt-color');\r\n applyColor(config.textColor, 'text-color');\r\n applyColor(config.secondaryTextColor, 'secondary-text-color');\r\n applyColor(config.hintTextColor, 'hint-text-color');\r\n\r\n // Button Colors\r\n applyColor(config.buttonColor, 'button-color');\r\n\r\n // Message Colors\r\n applyColor(config.userMessageColor, 'user-message-color');\r\n applyColor(config.botMessageColor, 'bot-message-color');\r\n\r\n // Message Text Colors\r\n applyColor(config.userTextColor, 'user-text-color');\r\n applyColor(config.botTextColor, 'bot-text-color');\r\n\r\n // Borders\r\n applyColor(config.borderColor, 'border-color');\r\n applyColor(config.borderShadowColor, 'border-shadow-color');\r\n applyColor(config.borderTopColor, 'border-top-color');\r\n\r\n // Indicators\r\n applyColor(config.typingIndicatorColor, 'typing-indicator-color');\r\n\r\n // Utility Colors\r\n applyColor(config.white, 'white');\r\n applyColor(config.black, 'black');\r\n applyColor(config.grey, 'grey');\r\n applyColor(config.red, 'red');\r\n applyColor(config.yellow, 'yellow');\r\n applyColor(config.orange, 'orange');\r\n applyColor(config.green, 'green');\r\n applyColor(config.blue, 'blue');\r\n }\r\n}\r\n","export const PredefinedMessages = [\r\n 'How do I create a new DOOH proposal in Doohclick?',\r\n 'Can the buyer see internal notes I add in Doohclick?',\r\n // 'What happens after a buyer approves a proposal?',\r\n // 'Why would an SR hide the pipeline value in a proposal?',\r\n // 'Are additional services like ad formatting included in the base campaign cost?',\r\n 'How to create a proposal?',\r\n];\r\nexport const SuggestedMessages = [\r\n 'Hi! How can I help?',\r\n 'Check your activity?',\r\n 'Need account help?',\r\n 'Quick tips to start.',\r\n];\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\n@Component({\r\n selector: 'app-chat-button',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule],\r\n templateUrl: './chat-button.component.html',\r\n styleUrls: ['./chat-button.component.scss'],\r\n})\r\nexport class ChatButtonComponent {\r\n @Input() buttonStyle: 'fab' | 'sidebar' | 'sidebar-top' | 'sidebar-bottom' = 'fab';\r\n @Input() isChatOpen: boolean = false;\r\n @Input() unreadCount: number = 0;\r\n @Input() appTitle: string = 'Chat';\r\n @Input() appLogoUrl: string = '';\r\n @Input() appTextLogoUrl: string = '';\r\n\r\n @Output() toggle = new EventEmitter<void>();\r\n\r\n get isSidebar(): boolean {\r\n return this.buttonStyle.startsWith('sidebar');\r\n }\r\n\r\n get sidebarPosition(): 'top' | 'center' | 'bottom' {\r\n if (!this.isSidebar) return 'center';\r\n if (this.buttonStyle === 'sidebar') return 'center';\r\n return this.buttonStyle.split('-')[1] as 'top' | 'center' | 'bottom';\r\n }\r\n\r\n onToggle() {\r\n this.toggle.emit();\r\n }\r\n}\r\n","<!-- fab -->\r\n@if (buttonStyle === 'fab' && !isChatOpen) {\r\n <button class=\"chat-fab\" (click)=\"onToggle()\">\r\n <!-- <mat-icon>{{ chatIcon }}</mat-icon> -->\r\n <img style=\"width: 30px; height: 30px\" [src]=\"appLogoUrl\" />\r\n <!-- <div class=\"chat-logo\"></div> -->\r\n @if (unreadCount > 0) {\r\n <span class=\"alert-badge\">\r\n {{ unreadCount > 9 ? '9+' : unreadCount }}\r\n </span>\r\n }\r\n </button>\r\n}\r\n\r\n<!-- sidebar button -->\r\n@if (isSidebar && !isChatOpen) {\r\n <button class=\"chat-sidebar\" (click)=\"onToggle()\" [ngClass]=\"sidebarPosition\">\r\n <!-- <h2 style=\"transform: rotate(-90deg); font-size: 16px\">{{ appTitle }}</h2> -->\r\n <img style=\"transform: rotate(-90deg); width: 100px; height: 45px\" [src]=\"appTextLogoUrl\" />\r\n\r\n @if (unreadCount > 0) {\r\n <span class=\"alert-badge\">\r\n {{ unreadCount > 9 ? '9+' : unreadCount }}\r\n </span>\r\n }\r\n </button>\r\n}\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-chips',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './chips.component.html',\r\n styleUrls: ['./chips.component.scss'],\r\n})\r\nexport class Chips {\r\n @Input() messages: string[] = []; // messages array\r\n @Input() disabled = false;\r\n @Output() chipClick = new EventEmitter<string>(); // emit clicked chip\r\n\r\n onChipClick(msg: string) {\r\n if (this.disabled) return;\r\n this.chipClick.emit(msg);\r\n }\r\n}\r\n","@if (messages.length > 0) {\r\n <div class=\"predefined-chips\">\r\n @for (msg of messages; track msg) {\r\n <button class=\"chip\" (click)=\"onChipClick(msg)\">\r\n {{ msg }}\r\n </button>\r\n }\r\n </div>\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class MarkdownService {\r\n constructor() {}\r\n\r\n convert(markdown: string): string {\r\n if (!markdown) return '';\r\n\r\n // 1. Escape HTML first to prevent XSS\r\n let html = this.escapeHtml(markdown);\r\n\r\n // 2. Process Heads (h1-h3)\r\n // # Header -> <h1>Header</h1>\r\n html = html.replace(/^### (.*$)/gim, '<h3>$1</h3>');\r\n html = html.replace(/^## (.*$)/gim, '<h2>$1</h2>');\r\n html = html.replace(/^# (.*$)/gim, '<h1>$1</h1>');\r\n\r\n // 3. Bold (** or __)\r\n html = html.replace(/\\*\\*(.*?)\\*\\*/gim, '<strong>$1</strong>');\r\n html = html.replace(/__(.*?)__/gim, '<strong>$1</strong>');\r\n\r\n // 4. Italic (* or _)\r\n html = html.replace(/\\*(.*?)\\*/gim, '<em>$1</em>');\r\n html = html.replace(/_(.*?)_/gim, '<em>$1</em>');\r\n\r\n // 5. Lists (unordered)\r\n // Note: This is a simple regex that wraps each list item in <li>.\r\n // Full list wrapping <ul> needs state awareness, but for simple chat line-by-line:\r\n html = html.replace(/^\\s*-\\s+(.*$)/gim, '<li>$1</li>');\r\n html = html.replace(/^\\s*\\*\\s+(.*$)/gim, '<li>$1</li>');\r\n\r\n // 6. Lists (ordered)\r\n html = html.replace(/^\\s*\\d+\\.\\s+(.*$)/gim, '<li>$1</li>');\r\n\r\n // 7. Paragraphs\r\n // Split by double newline to form paragraphs, but avoid wrapping existing tags\r\n // This is a naive implementation; for robust parsing, we'd need a token,\r\n // but for simple chat, we can just replace \\n with <br> inside paragraphs.\r\n\r\n // Simple line break handling\r\n html = html.replace(/\\n/gim, '<br>');\r\n\r\n // Optional: Wrap loose text in paragraphs if completely robust is needed,\r\n // but <br> is usually sufficient for chat bubbles.\r\n\r\n // Wrap adjacent <li>s in <ul> or <ol> is tricky with pure regex on the whole string.\r\n // Improvement: We can wrap the whole block.\r\n\r\n // Basic List Wrapping (very simple heuristic)\r\n // Replace sequences of <li>...</li> with <ul>...</ul> is hard without multiple passes.\r\n // For now, we will style straight <li>s if they appear, or just accept that they might lack a parent <ul>\r\n // which browsers often handle okay visually, OR we try to group them.\r\n\r\n // Let's try to group <li>s\r\n html = html.replace(/(<li>.*<\\/li>(\\s*<br>\\s*)*)+/gim, '<ul>$&</ul>');\r\n\r\n // Clean up <br> inside <ul>\r\n html = html.replace(/<\\/li>\\s*<br>\\s*<li>/gim, '</li><li>');\r\n html = html.replace(/<ul>\\s*<br>/gim, '<ul>');\r\n html = html.replace(/<br>\\s*<\\/ul>/gim, '</ul>');\r\n\r\n return html;\r\n }\r\n\r\n private escapeHtml(text: string): string {\r\n const div = document.createElement('div');\r\n div.textContent = text;\r\n return div.innerHTML;\r\n }\r\n}\r\n","import { Pipe, PipeTransform, inject } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { MarkdownService } from '../../core/services/markdown.service';\r\n\r\n@Pipe({\r\n name: 'Markdown',\r\n standalone: true,\r\n pure: true,\r\n})\r\nexport class MarkdownPipe implements PipeTransform {\r\n private markdownService = inject(MarkdownService);\r\n private sanitizer = inject(DomSanitizer);\r\n\r\n transform(value: string | undefined | null): SafeHtml {\r\n if (!value) return '';\r\n const html = this.markdownService.convert(value);\r\n return this.sanitizer.bypassSecurityTrustHtml(html);\r\n }\r\n}\r\n","export const AppEmoji = {\r\n waveHand: '\\u{1F44B}',\r\n robotFace: '\\u{1F916}',\r\n partyPopper: '\\u{1F389}',\r\n thinkingFace: '\\u{1F914}',\r\n thumbsUp: '\\u{1F44D}',\r\n thumbsDown: '\\u{1F44E}',\r\n redHeart: '\\u{2764}\\u{FE0F}',\r\n};\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n Output,\r\n TrackByFunction,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Message } from '../../../../core/models/message';\r\nimport { Chips } from '../../../../shared/chips/chips.component';\r\nimport { MarkdownPipe } from '../../../../shared/pipes/simple-markdown.pipe';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { AppEmoji } from '../../../../constant/utf8';\r\n\r\n@Component({\r\n selector: 'app-message-list',\r\n standalone: true,\r\n imports: [CommonModule, Chips, MarkdownPipe, MatIconModule],\r\n templateUrl: './message-list.component.html',\r\n styleUrls: ['./message-list.component.scss'],\r\n})\r\nexport class MessageListComponent implements AfterViewInit, OnDestroy {\r\n @Input() messages: Message[] = [];\r\n @Input() isBotTyping: boolean = false;\r\n @Input() isStreaming: boolean = true;\r\n @Input() appLogoUrl: string = '';\r\n @Input() appSubtitle: string = '';\r\n @Input() welcomeDesc: string = '';\r\n @Input() predefinedMessages: string[] = [];\r\n @Input() botAvatarUrl: string = '';\r\n @Input() userAvatarUrl: string = '';\r\n @Input() userName: string = '';\r\n @Input() isAuthenticated: boolean = false;\r\n @Input() isLoggingIn: boolean = false;\r\n @Input() trackByMessageId: TrackByFunction<Message> = (index, item) => item.id ?? index;\r\n\r\n @Output() suggestionClick = new EventEmitter<string>();\r\n @Output() loginClick = new EventEmitter<void>();\r\n\r\n @ViewChild('chatMessages') private chatMessagesContainer!: ElementRef;\r\n private mutationObserver!: MutationObserver;\r\n\r\n appEmoji = AppEmoji;\r\n\r\n constructor(private cdr: ChangeDetectorRef) {}\r\n\r\n ngAfterViewInit(): void {\r\n if (!this.chatMessagesContainer) return;\r\n\r\n this.mutationObserver = new MutationObserver(() => this.scrollToBottom());\r\n\r\n this.mutationObserver.observe(this.chatMessagesContainer.nativeElement, {\r\n childList: true,\r\n subtree: true,\r\n });\r\n\r\n this.scrollToBottom();\r\n }\r\n\r\n private scrollToBottom(): void {\r\n if (!this.chatMessagesContainer) {\r\n return;\r\n }\r\n const container = this.chatMessagesContainer.nativeElement;\r\n container.scrollTo({\r\n top: container.scrollHeight,\r\n behavior: 'smooth',\r\n });\r\n }\r\n\r\n onPredefinedClick(text: string) {\r\n this.suggestionClick.emit(text);\r\n }\r\n\r\n copyMessage(message: Message): void {\r\n if (!message.text) return;\r\n\r\n navigator.clipboard.writeText(message.text).then(() => {\r\n // Logger.info('Copied to clipboard');\r\n // SnackbarUtils.info('Copied to clipboard');\r\n\r\n message.copied = true;\r\n this.cdr.markForCheck(); // force UI update\r\n\r\n setTimeout(() => {\r\n message.copied = false;\r\n this.cdr.markForCheck(); // update again\r\n }, 800);\r\n });\r\n }\r\n\r\n // trackByChunkIndex(index: number) {\r\n // return index;\r\n // }\r\n\r\n ngOnDestroy(): void {\r\n if (this.mutationObserver) {\r\n this.mutationObserver.disconnect();\r\n }\r\n }\r\n}\r\n","<div #chatMessages class=\"chat-messages\">\r\n <!-- Welcome Screen -->\r\n @if (messages.length === 0 && !isBotTyping) {\r\n <div class=\"welcome-screen\">\r\n <img [src]=\"appLogoUrl\" alt=\"Welcome\" class=\"welcome-image\" style=\"border-radius: 0px\" />\r\n\r\n <!-- Only show greeting if authenticated -->\r\n @if (userName && isAuthenticated) {\r\n <div class=\"marquee-container\">\r\n <h2 class=\"welcome-greeting marquee-text\">\r\n Hi, {{ userName }}!\r\n <span class=\"emoji\">{{ appEmoji.waveHand }}</span>\r\n </h2>\r\n </div>\r\n }\r\n\r\n <h3>{{ appSubtitle }}</h3>\r\n <p>{{ welcomeDesc }}</p>\r\n\r\n <!-- Predefined messages chips: Only show when authenticated -->\r\n @if (isAuthenticated) {\r\n <app-chips\r\n [messages]=\"predefinedMessages\"\r\n [disabled]=\"isBotTyping\"\r\n (chipClick)=\"onPredefinedClick($event)\"\r\n ></app-chips>\r\n }\r\n\r\n @if (!isAuthenticated) {\r\n <div class=\"auth-buttons-container\" style=\"margin-top: 20px\">\r\n <button (click)=\"loginClick.emit()\" class=\"auth-btn primary\" [disabled]=\"isLoggingIn\">\r\n {{ isLoggingIn ? 'Logging in...' : 'Login' }}\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Chat Messages -->\r\n <div\r\n *ngFor=\"let message of messages; trackBy: trackByMessageId\"\r\n class=\"message\"\r\n [class.user]=\"message.sender === 'user'\"\r\n [class.assistant]=\"message.sender === 'assistant'\"\r\n [class.streaming]=\"!message.completed && message.sender === 'assistant'\"\r\n >\r\n <!-- Avatar (Assistant on Left) -->\r\n @if (message.sender === 'assistant') {\r\n <div class=\"avatar-container\">\r\n <img class=\"assistant-avatar\" [src]=\"botAvatarUrl\" alt=\"Bot Avatar\" />\r\n </div>\r\n }\r\n\r\n <!-- Message Bubble -->\r\n <div class=\"message-content\">\r\n <!-- User chat bubble -->\r\n @if (message.sender === 'user') {\r\n <div class=\"user\">\r\n <span>{{ message.text }}</span>\r\n <button class=\"copy-btn\" (click)=\"copyMessage(message)\" title=\"Copy message\">\r\n <mat-icon>{{ message.copied ? 'check' : 'content_copy' }}</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n\r\n <!-- Assistant chat bubble -->\r\n @if (message.sender === 'assistant') {\r\n <div class=\"assistant\">\r\n @if (isStreaming && !message.isHistory) {\r\n <!-- Show text/chunks if they exist -->\r\n @if (message.chunks && message.chunks.length > 0) {\r\n <span\r\n *ngFor=\"let chunk of message.chunks; let i = index\"\r\n class=\"markdown-content\"\r\n [attr.data-index]=\"i\"\r\n [innerHTML]=\"chunk | Markdown\"\r\n ></span>\r\n } @else if (!message.completed) {\r\n <div class=\"typing-indicator\">\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </div>\r\n }\r\n } @else {\r\n <!-- Non-streaming or history -->\r\n @if (message.text) {\r\n <span class=\"markdown-content\" [innerHTML]=\"message.text | Markdown\"></span>\r\n } @else if (!message.completed) {\r\n <div class=\"typing-indicator\">\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </div>\r\n }\r\n }\r\n @if (message.completed) {\r\n <button class=\"copy-btn\" (click)=\"copyMessage(message)\" title=\"Copy message\">\r\n <mat-icon>{{ message.copied ? 'check' : 'content_copy' }}</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Show time below message -->\r\n @if (message.sender === 'assistant' && message.completed) {\r\n <div class=\"message-time\">\r\n {{ message.timestamp | date: 'shortTime' }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Avatar (User on Right) -->\r\n @if (message.sender === 'user') {\r\n <div class=\"avatar-container\">\r\n <img class=\"user-avatar\" [src]=\"userAvatarUrl\" alt=\"User Avatar\" />\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Standalone Typing Indicator (Fallback if no message added yet) -->\r\n @if (isBotTyping && messages[messages.length - 1]?.sender !== 'assistant') {\r\n <div class=\"message assistant\">\r\n <div class=\"avatar-container\">\r\n <img class=\"assistant-avatar\" [src]=\"botAvatarUrl\" alt=\"Bot Avatar\" />\r\n </div>\r\n <div class=\"message-content\">\r\n <div class=\"assistant\">\r\n <div class=\"typing-indicator\">\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\n@Component({\r\n selector: 'app-message-input',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule],\r\n templateUrl: './message-input.component.html',\r\n styleUrls: ['./message-input.component.scss'],\r\n})\r\nexport class MessageInputComponent {\r\n @Input() isBotTyping: boolean = false;\r\n @Input() hintText: string = 'Type a message...';\r\n\r\n @Output() send = new EventEmitter<string>();\r\n @Output() stop = new EventEmitter<void>();\r\n\r\n onSend(text: string) {\r\n if (text.trim()) {\r\n this.send.emit(text);\r\n }\r\n }\r\n\r\n onStop() {\r\n this.stop.emit();\r\n }\r\n}\r\n","<!-- Chat Input -->\r\n<div class=\"chat-input\">\r\n <div class=\"input-wrapper\">\r\n <input #messageInput type=\"text\" [disabled]=\"isBotTyping\" (keydown.enter)=\"\r\n !isBotTyping && onSend(messageInput.value); !isBotTyping && (messageInput.value = '')\r\n \" [placeholder]=\"hintText\" />\r\n\r\n <button (click)=\"\r\n isBotTyping ? onStop() : onSend(messageInput.value);\r\n !isBotTyping && (messageInput.value = '')\r\n \">\r\n <mat-icon [class.stop-icon]=\"isBotTyping\">{{\r\n isBotTyping ? 'stop_circle' : 'send'\r\n }}</mat-icon>\r\n </button>\r\n </div>\r\n</div>","import { Component, Inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\nexport interface DialogData {\r\n title: string;\r\n message: string;\r\n confirmText?: string;\r\n cancelText?: string;\r\n confirmButtonColor?: 'primary' | 'accent' | 'warn';\r\n icon?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'app-dialog',\r\n standalone: true,\r\n imports: [CommonModule, MatDialogModule, MatButtonModule, MatIconModule],\r\n templateUrl: './dialog.component.html',\r\n styleUrls: ['./dialog.component.scss'],\r\n})\r\nexport class DialogComponent {\r\n constructor(\r\n public dialogRef: MatDialogRef<DialogComponent>,\r\n @Inject(MAT_DIALOG_DATA) public data: DialogData,\r\n ) {\r\n // Set defaults\r\n this.data.confirmText = this.data.confirmText || 'Confirm';\r\n this.data.cancelText = this.data.cancelText || 'Cancel';\r\n this.data.confirmButtonColor = this.data.confirmButtonColor || 'warn';\r\n this.data.icon = this.data.icon || 'warning';\r\n }\r\n\r\n onCancel(): void {\r\n this.dialogRef.close(false);\r\n }\r\n\r\n onConfirm(): void {\r\n this.dialogRef.close(true);\r\n }\r\n}\r\n","<div class=\"dialog-container\">\r\n <div class=\"dialog-header\">\r\n <mat-icon class=\"dialog-icon\" [class.warn-icon]=\"data.confirmButtonColor === 'warn'\">\r\n {{ data.icon }}\r\n </mat-icon>\r\n <h2 mat-dialog-title>{{ data.title }}</h2>\r\n </div>\r\n\r\n <mat-dialog-content>\r\n <p class=\"dialog-message\">{{ data.message }}</p>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-button class=\"cancel-btn\" (click)=\"onCancel()\" type=\"button\">\r\n {{ data.cancelText }}\r\n </button>\r\n <button\r\n mat-raised-button\r\n class=\"confirm-btn\"\r\n [class.warn-btn]=\"data.confirmButtonColor === 'warn'\"\r\n [class.primary-btn]=\"data.confirmButtonColor === 'primary'\"\r\n [class.accent-btn]=\"data.confirmButtonColor === 'accent'\"\r\n (click)=\"onConfirm()\"\r\n type=\"button\"\r\n >\r\n {{ data.confirmText }}\r\n </button>\r\n </mat-dialog-actions>\r\n</div>\r\n","import { Component, Inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\nexport interface InputDialogData {\r\n title: string;\r\n message: string;\r\n initialValue: string;\r\n placeholder?: string;\r\n confirmText?: string;\r\n cancelText?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'app-input-dialog',\r\n standalone: true,\r\n imports: [CommonModule, MatDialogModule, MatButtonModule, FormsModule],\r\n templateUrl: './input-dialog.component.html',\r\n styleUrls: ['./input-dialog.component.scss'],\r\n})\r\nexport class InputDialogComponent {\r\n public value: string;\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef<InputDialogComponent>,\r\n @Inject(MAT_DIALOG_DATA) public data: InputDialogData,\r\n ) {\r\n this.value = data.initialValue;\r\n // Set defaults\r\n this.data.confirmText = this.data.confirmText || 'Save';\r\n this.data.cancelText = this.data.cancelText || 'Cancel';\r\n this.data.placeholder = this.data.placeholder || 'Enter value...';\r\n }\r\n\r\n onCancel(): void {\r\n this.dialogRef.close(null);\r\n }\r\n\r\n onConfirm(): void {\r\n if (this.value && this.value.trim()) {\r\n this.dialogRef.close(this.value.trim());\r\n }\r\n }\r\n}\r\n","<div class=\"dialog-container\">\r\n <h2 mat-dialog-title>{{ data.title }}</h2>\r\n <mat-dialog-content>\r\n <p class=\"dialog-message\">{{ data.message }}</p>\r\n <div class=\"input-group\">\r\n <input type=\"text\" class=\"dialog-input\" [(ngModel)]=\"value\" [placeholder]=\"data.placeholder\"\r\n (keyup.enter)=\"onConfirm()\" focus=\"true\" />\r\n </div>\r\n </mat-dialog-content>\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-button class=\"cancel-btn\" (click)=\"onCancel()\">{{ data.cancelText }}</button>\r\n <button mat-flat-button color=\"primary\" class=\"confirm-btn\" [disabled]=\"!value.trim()\" (click)=\"onConfirm()\">\r\n {{ data.confirmText }}\r\n </button>\r\n </mat-dialog-actions>\r\n</div>","import { Injectable } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { Observable } from 'rxjs';\r\nimport { DialogComponent, DialogData } from './dialog.component';\r\nimport { InputDialogComponent, InputDialogData } from '../input-dialog/input-dialog.component';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DialogService {\r\n constructor(private dialog: MatDialog) { }\r\n\r\n /**\r\n * Opens a confirmation dialog with customizable options\r\n * @param data Configuration for the dialog\r\n * @returns Observable that emits true if confirmed, false if cancelled\r\n */\r\n open(data: DialogData): Observable<boolean> {\r\n const dialogRef = this.dialog.open(DialogComponent, {\r\n width: '400px',\r\n data: data,\r\n disableClose: false,\r\n autoFocus: true,\r\n restoreFocus: true,\r\n });\r\n\r\n return dialogRef.afterClosed();\r\n }\r\n\r\n /**\r\n * Convenience method for delete confirmation dialogs\r\n * @param itemName Name of the item being deleted\r\n * @returns Observable that emits true if confirmed, false if cancelled\r\n */\r\n confirmDelete(itemName: string = 'this item'): Observable<boolean> {\r\n return this.open({\r\n title: 'Confirm Delete',\r\n message: `Are you sure you want to delete ${itemName}? This action cannot be undone.`,\r\n confirmText: 'Delete',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'delete_forever',\r\n });\r\n }\r\n\r\n /**\r\n * Opens a dialog with an input field\r\n * @param data Configuration for the input dialog\r\n * @returns Observable that emits the input value if confirmed, null if cancelled\r\n */\r\n openInput(data: InputDialogData): Observable<string | null> {\r\n const dialogRef = this.dialog.open(InputDialogComponent, {\r\n width: '400px',\r\n data: data,\r\n disableClose: false,\r\n autoFocus: true,\r\n restoreFocus: true,\r\n });\r\n\r\n return dialogRef.afterClosed();\r\n }\r\n}\r\n","import {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnInit,\r\n OnChanges,\r\n SimpleChanges,\r\n Output,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { DialogService } from '../../../../shared/dialog/dialog.service';\r\nimport { ChatSession, ChatSessionGroup } from '../../model/chat-session.model';\r\n\r\n@Component({\r\n selector: 'app-chat-history-sidebar',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule],\r\n templateUrl: './chat-history-sidebar.component.html',\r\n styleUrls: ['./chat-history-sidebar.component.scss'],\r\n})\r\nexport class ChatHistorySidebarComponent implements OnInit, OnChanges {\r\n @Input() sessions: ChatSession[] = [];\r\n @Input() isOpen: boolean = false;\r\n @Input() userName: string = 'User';\r\n @Input() isLoading: boolean = false;\r\n @Input() hasMoreSessions: boolean = false;\r\n @Input() isLoadingMore: boolean = false;\r\n @Input() processingSessionId: string | null = null;\r\n\r\n @Output() sessionSelected = new EventEmitter<ChatSession>();\r\n @Output() sessionDeleted = new EventEmitter<string>();\r\n @Output() closed = new EventEmitter<void>();\r\n @Output() loadMore = new EventEmitter<void>();\r\n @Output() refresh = new EventEmitter<void>();\r\n @Output() sessionRenamed = new EventEmitter<{ sessionId: string; newTitle: string }>();\r\n @Output() deleteAll = new EventEmitter<void>();\r\n\r\n chatHistory: ChatSessionGroup[] = [];\r\n\r\n constructor(private dialogService: DialogService) { }\r\n\r\n ngOnInit(): void {\r\n this.chatHistory = this.groupedSessions();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['sessions']) {\r\n this.chatHistory = this.groupedSessions();\r\n }\r\n }\r\n\r\n groupedSessions(): ChatSessionGroup[] {\r\n const now = new Date();\r\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\r\n const yesterday = new Date(today);\r\n yesterday.setDate(yesterday.getDate() - 1);\r\n const weekAgo = new Date(today);\r\n weekAgo.setDate(weekAgo.getDate() - 7);\r\n\r\n const groups: ChatSessionGroup[] = [\r\n { label: 'Today', sessions: [] },\r\n { label: 'Yesterday', sessions: [] },\r\n { label: 'This Week', sessions: [] },\r\n { label: 'Older', sessions: [] },\r\n ];\r\n\r\n // Sort sessions by timestamp (newest first)\r\n const sortedSessions = [...this.sessions].sort(\r\n (a, b) => b.timestamp.getTime() - a.timestamp.getTime(),\r\n );\r\n\r\n sortedSessions.forEach((session) => {\r\n const sessionDate = new Date(session.timestamp);\r\n const sessionDayStart = new Date(\r\n sessionDate.getFullYear(),\r\n sessionDate.getMonth(),\r\n sessionDate.getDate(),\r\n );\r\n\r\n if (sessionDayStart.getTime() === today.getTime()) {\r\n groups[0].sessions.push(session);\r\n } else if (sessionDayStart.getTime() === yesterday.getTime()) {\r\n groups[1].sessions.push(session);\r\n } else if (sessionDayStart.getTime() >= weekAgo.getTime()) {\r\n groups[2].sessions.push(session);\r\n } else {\r\n groups[3].sessions.push(session);\r\n }\r\n });\r\n\r\n // Filter out empty groups\r\n return groups.filter((g) => g.sessions.length > 0);\r\n }\r\n\r\n onSessionClick(session: ChatSession): void {\r\n this.sessionSelected.emit(session);\r\n }\r\n\r\n onEditClick(event: Event, session: ChatSession): void {\r\n event.stopPropagation();\r\n this.dialogService\r\n .openInput({\r\n title: 'Rename Conversation',\r\n message: 'Enter a new title for this conversation:',\r\n initialValue: session.title,\r\n placeholder: 'New title...',\r\n confirmText: 'Rename',\r\n })\r\n .subscribe((newTitle) => {\r\n if (newTitle !== null && newTitle.trim() !== '' && newTitle !== session.title) {\r\n this.sessionRenamed.emit({ sessionId: session.id, newTitle: newTitle.trim() });\r\n }\r\n });\r\n }\r\n\r\n onDeleteClick(event: Event, sessionId: string): void {\r\n event.stopPropagation();\r\n this.dialogService.confirmDelete('this conversation').subscribe((confirmed) => {\r\n if (confirmed) {\r\n this.sessionDeleted.emit(sessionId);\r\n this.chatHistory = this.groupedSessions();\r\n }\r\n });\r\n }\r\n\r\n onClose(): void {\r\n this.closed.emit();\r\n }\r\n\r\n formatTime(date: Date): string {\r\n return new Date(date).toLocaleTimeString('en-US', {\r\n hour: 'numeric',\r\n minute: '2-digit',\r\n hour12: true,\r\n });\r\n }\r\n\r\n formatDate(date: Date): string {\r\n return new Date(date).toLocaleDateString('en-US', {\r\n month: 'short',\r\n day: 'numeric',\r\n });\r\n }\r\n\r\n /**\r\n * Handle scroll event for infinite scroll\r\n */\r\n onScroll(event: Event): void {\r\n const element = event.target as HTMLElement;\r\n const scrollTop = element.scrollTop;\r\n const scrollHeight = element.scrollHeight;\r\n const clientHeight = element.clientHeight;\r\n\r\n // Check if scrolled near bottom (within 100px)\r\n const scrollBottom = scrollHeight - scrollTop - clientHeight;\r\n if (scrollBottom < 100 && this.hasMoreSessions && !this.isLoadingMore && !this.isLoading) {\r\n this.loadMore.emit();\r\n }\r\n }\r\n\r\n /**\r\n * Handle manual refresh\r\n */\r\n onRefresh(): void {\r\n this.refresh.emit();\r\n }\r\n\r\n /**\r\n * Handle clear all history\r\n */\r\n onClearAllClick(): void {\r\n this.dialogService\r\n .open({\r\n title: 'Clear All History',\r\n message: 'Are you sure you want to delete all chat history? This action cannot be undone.',\r\n confirmText: 'Clear All',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'delete_sweep',\r\n })\r\n .subscribe((confirmed: boolean | undefined) => {\r\n if (confirmed) {\r\n this.deleteAll.emit();\r\n }\r\n });\r\n }\r\n}\r\n","<div class=\"history-sidebar\" [class.open]=\"isOpen\">\r\n <div class=\"sidebar-header\">\r\n <div class=\"marquee-container\" style=\"flex: 1; margin-right: 10px\">\r\n <h3 class=\"marquee-text\">{{ userName }}'s Chat History</h3>\r\n </div>\r\n <button class=\"refresh-btn\" (click)=\"onRefresh()\" title=\"Refresh history\">\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n\r\n <button class=\"close-btn\" (click)=\"onClose()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"sidebar-content\" (scroll)=\"onScroll($event)\">\r\n @if (isLoading) {\r\n <div class=\"loader-container\">\r\n <div class=\"loader\"></div>\r\n <p>Loading history...</p>\r\n </div>\r\n }\r\n\r\n @if (!isLoading && sessions.length === 0) {\r\n <div class=\"empty-state\">\r\n <mat-icon>history</mat-icon>\r\n <p>No chat history yet</p>\r\n <span>Start a conversation to see it here</span>\r\n </div>\r\n }\r\n\r\n @if (!isLoading) {\r\n @for (group of chatHistory; track group.label) {\r\n <div class=\"session-group\">\r\n <div class=\"group-label\">{{ group.label }}</div>\r\n <div class=\"session-list\">\r\n @for (session of group.sessions; track session.id) {\r\n <div class=\"session-item\" (click)=\"onSessionClick(session)\">\r\n <div class=\"session-content\">\r\n <div class=\"session-title\">{{ session.title }}</div>\r\n <div class=\"session-time\">\r\n {{ formatTime(session.timestamp) }} · {{ formatDate(session.timestamp) }}\r\n </div>\r\n </div>\r\n <div class=\"session-actions\">\r\n <button class=\"edit-btn\" [disabled]=\"processingSessionId === session.id\"\r\n (click)=\"onEditClick($event, session)\" title=\"Edit title\">\r\n @if (processingSessionId !== session.id) {\r\n <mat-icon>edit</mat-icon>\r\n } @else {\r\n <div class=\"loader-tiny\"></div>\r\n }\r\n </button>\r\n <button class=\"delete-btn\" [disabled]=\"processingSessionId === session.id\"\r\n (click)=\"onDeleteClick($event, session.id)\" title=\"Delete conversation\">\r\n @if (processingSessionId !== session.id) {\r\n <mat-icon>delete</mat-icon>\r\n } @else {\r\n <div class=\"loader-tiny\"></div>\r\n }\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n\r\n <!-- Loading more indicator -->\r\n @if (isLoadingMore) {\r\n <div class=\"loading-more\">\r\n <div class=\"loader-small\"></div>\r\n <p>Loading more...</p>\r\n </div>\r\n }\r\n </div>\r\n</div>","import {\r\n Directive,\r\n ElementRef,\r\n HostListener,\r\n Input,\r\n OnInit,\r\n Renderer2,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[draggableDialog]',\r\n standalone: true,\r\n})\r\nexport class DraggableDialogDirective implements OnInit, OnChanges {\r\n private isDragging = false;\r\n private startX = 0;\r\n private startY = 0;\r\n private offsetX = 0;\r\n private offsetY = 0;\r\n\r\n @Input('dragHandle') dragHandleSelector: string | undefined;\r\n @Input() enableDrag = false;\r\n\r\n private dragHandle: HTMLElement | undefined;\r\n\r\n constructor(\r\n private el: ElementRef,\r\n private renderer: Renderer2,\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.updateDragState();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['enableDrag']) {\r\n this.updateDragState();\r\n }\r\n }\r\n\r\n private updateDragState() {\r\n if (this.enableDrag) {\r\n if (this.dragHandleSelector) {\r\n this.dragHandle = this.el.nativeElement.querySelector(this.dragHandleSelector);\r\n } else {\r\n this.dragHandle = this.el.nativeElement; // fallback\r\n }\r\n if (this.dragHandle) {\r\n this.renderer.setStyle(this.dragHandle, 'cursor', 'move');\r\n }\r\n } else {\r\n if (this.dragHandle) {\r\n this.renderer.setStyle(this.dragHandle, 'cursor', 'default');\r\n }\r\n // We don't need to unset dragHandle, just ensure the cursor is reset and the mousedown check respects the flag?\r\n // Actually, the mousedown listener is always active. We should check enableDrag inside mousedown.\r\n }\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n if (!this.enableDrag) return;\r\n if (event.defaultPrevented) return; // Respect other handlers (like resize)\r\n\r\n if (!this.dragHandle) return;\r\n\r\n const target = event.target as HTMLElement;\r\n\r\n // Strict check if handle is explicitly provided via selector, ensuring we only drag when clicking that specific handle\r\n if (\r\n this.dragHandleSelector &&\r\n target !== this.dragHandle &&\r\n !this.dragHandle.contains(target)\r\n ) {\r\n return;\r\n }\r\n\r\n // If using the host element as the handle (no selector), allow dragging from children\r\n // BUT exclude specific interactive elements to ensure usability\r\n if (!this.dragHandleSelector) {\r\n // Check if target is a resize handle (has class or data-dir)\r\n if (target.hasAttribute('data-dir') || target.classList.contains('doohbot-resize-handle'))\r\n return;\r\n\r\n if (!this.dragHandle.contains(target)) return;\r\n\r\n // Prevent dragging when interacting with controls\r\n const tagName = target.tagName;\r\n if (['BUTTON', 'INPUT', 'TEXTAREA', 'A', 'SELECT', 'MAT-ICON'].includes(tagName)) return;\r\n\r\n // Optional: explicit opt-out class\r\n if (target.classList.contains('no-drag')) return;\r\n }\r\n\r\n this.isDragging = true;\r\n this.startX = event.clientX - this.offsetX;\r\n this.startY = event.clientY - this.offsetY;\r\n\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n }\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMouseMove(event: MouseEvent) {\r\n if (!this.isDragging) return;\r\n\r\n this.offsetX = event.clientX - this.startX;\r\n this.offsetY = event.clientY - this.startY;\r\n\r\n this.renderer.setStyle(\r\n this.el.nativeElement,\r\n 'transform',\r\n `translate(${this.offsetX}px, ${this.offsetY}px)`,\r\n );\r\n }\r\n\r\n @HostListener('document:mouseup', [])\r\n onMouseUp() {\r\n this.isDragging = false;\r\n }\r\n}\r\n","// resizable-dialog.directive.ts\r\nimport {\r\n Directive,\r\n ElementRef,\r\n Renderer2,\r\n OnInit,\r\n OnDestroy,\r\n HostListener,\r\n Input,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[resizableDialog]',\r\n standalone: true,\r\n})\r\nexport class ResizableDialogDirective implements OnInit, OnDestroy, OnChanges {\r\n private resizeHandles: HTMLElement[] = [];\r\n private activeHandle: string | null = null;\r\n private startX = 0;\r\n private startY = 0;\r\n private startWidth = 0;\r\n private startHeight = 0;\r\n private startLeft = 0;\r\n private startTop = 0;\r\n\r\n @Input() enableResize = false;\r\n\r\n // Define resize directions\r\n private directions = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'];\r\n\r\n constructor(\r\n private el: ElementRef<HTMLElement>,\r\n private renderer: Renderer2,\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.updateResizeState();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['enableResize']) {\r\n this.updateResizeState();\r\n }\r\n }\r\n\r\n private updateResizeState() {\r\n if (this.enableResize) {\r\n if (this.resizeHandles.length === 0) {\r\n this.setStyle();\r\n this.createResizeHandles();\r\n }\r\n } else {\r\n this.removeResizeHandles();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.removeResizeHandles();\r\n }\r\n\r\n private setStyle() {\r\n const element = this.el.nativeElement;\r\n this.renderer.setStyle(element, 'position', 'absolute');\r\n this.renderer.setStyle(element, 'overflow', 'hidden');\r\n this.renderer.setStyle(element, 'boxSizing', 'border-box');\r\n }\r\n\r\n private createResizeHandles() {\r\n this.directions.forEach((dir) => {\r\n const handle = this.renderer.createElement('div');\r\n this.renderer.setAttribute(handle, 'data-dir', dir);\r\n this.renderer.addClass(handle, 'doohbot-resize-handle');\r\n this.renderer.setStyle(handle, 'position', 'absolute');\r\n this.renderer.setStyle(handle, 'background', 'transparent');\r\n this.renderer.setStyle(handle, 'zIndex', '2000'); // High z-index to sit above content\r\n this.renderer.setStyle(handle, 'userSelect', 'none');\r\n\r\n // Set size and position based on direction\r\n if (dir.includes('e') || dir.includes('w')) {\r\n this.renderer.setStyle(handle, 'width', '15px'); // Slightly larger hit area\r\n this.renderer.setStyle(handle, 'cursor', dir.includes('e') ? 'e-resize' : 'w-resize');\r\n this.renderer.setStyle(handle, 'top', '0');\r\n this.renderer.setStyle(handle, 'bottom', '0');\r\n this.renderer.setStyle(handle, 'right', dir.includes('e') ? '-5px' : null); // Extend slightly out\r\n this.renderer.setStyle(handle, 'left', dir.includes('w') ? '-5px' : null);\r\n }\r\n if (dir.includes('n') || dir.includes('s')) {\r\n this.renderer.setStyle(handle, 'height', '15px');\r\n this.renderer.setStyle(handle, 'cursor', dir.includes('s') ? 's-resize' : 'n-resize');\r\n this.renderer.setStyle(handle, 'left', '0');\r\n this.renderer.setStyle(handle, 'right', '0');\r\n this.renderer.setStyle(handle, 'bottom', dir.includes('s') ? '-5px' : null);\r\n this.renderer.setStyle(handle, 'top', dir.includes('n') ? '-5px' : null);\r\n }\r\n if (dir === 'ne' || dir === 'nw' || dir === 'se' || dir === 'sw') {\r\n this.renderer.setStyle(handle, 'width', '20px');\r\n this.renderer.setStyle(handle, 'height', '20px');\r\n this.renderer.setStyle(handle, 'borderRadius', '50%');\r\n this.renderer.setStyle(handle, 'cursor', `${dir}-resize`);\r\n this.renderer.setStyle(handle, 'top', dir.includes('n') ? '-10px' : null);\r\n this.renderer.setStyle(handle, 'bottom', dir.includes('s') ? '-10px' : null);\r\n this.renderer.setStyle(handle, 'left', dir.includes('w') ? '-10px' : null);\r\n this.renderer.setStyle(handle, 'right', dir.includes('e') ? '-10px' : null);\r\n }\r\n\r\n this.renderer.appendChild(this.el.nativeElement, handle);\r\n this.resizeHandles.push(handle);\r\n });\r\n }\r\n\r\n private removeResizeHandles() {\r\n this.resizeHandles.forEach((handle) => {\r\n this.renderer.removeChild(this.el.nativeElement, handle);\r\n });\r\n this.resizeHandles = [];\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n if (!this.enableResize) return;\r\n if (event.defaultPrevented) return; // Respect other handlers\r\n\r\n const target = event.target as HTMLElement;\r\n const dir = target.getAttribute('data-dir');\r\n if (!dir) return;\r\n\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n\r\n this.activeHandle = dir;\r\n const rect = this.el.nativeElement.getBoundingClientRect();\r\n\r\n this.startX = event.clientX;\r\n this.startY = event.clientY;\r\n this.startWidth = parseFloat(this.getComputedStyleValue('width'));\r\n this.startHeight = parseFloat(this.getComputedStyleValue('height'));\r\n this.startLeft = parseFloat(this.getComputedStyleValue('left'));\r\n this.startTop = parseFloat(this.getComputedStyleValue('top'));\r\n\r\n // Prevent text selection during resize\r\n document.body.classList.add('no-select');\r\n }\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMouseMove(event: MouseEvent) {\r\n if (!this.activeHandle) return;\r\n\r\n const dx = event.clientX - this.startX;\r\n const dy = event.clientY - this.startY;\r\n\r\n let newWidth = this.startWidth;\r\n let newHeight = this.startHeight;\r\n let newLeft = this.startLeft;\r\n let newTop = this.startTop;\r\n\r\n const minWidth = 150;\r\n const minHeight = 100;\r\n\r\n // Horizontal resize\r\n if (this.activeHandle.includes('e')) {\r\n newWidth = Math.max(this.startWidth + dx, minWidth);\r\n }\r\n if (this.activeHandle.includes('w')) {\r\n newWidth = Math.max(this.startWidth - dx, minWidth);\r\n newLeft = this.startLeft + (this.startWidth - newWidth);\r\n }\r\n\r\n // Vertical resize\r\n if (this.activeHandle.includes('s')) {\r\n newHeight = Math.max(this.startHeight + dy, minHeight);\r\n }\r\n if (this.activeHandle.includes('n')) {\r\n newHeight = Math.max(this.startHeight - dy, minHeight);\r\n newTop = this.startTop + (this.startHeight - newHeight);\r\n }\r\n\r\n // Apply changes\r\n this.renderer.setStyle(this.el.nativeElement, 'width', `${newWidth}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'height', `${newHeight}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'left', `${newLeft}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'top', `${newTop}px`);\r\n }\r\n\r\n @HostListener('document:mouseup')\r\n onMouseUp() {\r\n if (this.activeHandle) {\r\n this.activeHandle = null;\r\n document.body.classList.remove('no-select');\r\n }\r\n }\r\n\r\n private getComputedStyleValue(property: string): string {\r\n return getComputedStyle(this.el.nativeElement).getPropertyValue(property) || '0';\r\n }\r\n}\r\n","import { Injectable, NgZone } from '@angular/core';\r\nimport { HttpClient, HttpEventType, HttpHeaders } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { StorageService } from '../auth/storage.service';\r\nimport { ChatStreamResponse } from '../../app/chat/model/chat-stream-response.model';\r\nimport logger from '../utils/logger.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class HttpStreamService {\r\n constructor(\r\n private ngZone: NgZone,\r\n private tokenStorage: StorageService,\r\n private http: HttpClient,\r\n ) {}\r\n\r\n /**\r\n * Creates a POST-based HTTP streaming connection using fetch()\r\n */\r\n createHttpStream(\r\n url: string,\r\n body: any,\r\n headers?: Record<string, string>,\r\n ): Observable<ChatStreamResponse> {\r\n return new Observable<ChatStreamResponse>((observer) => {\r\n // Note: Authorization header is added automatically by AuthInterceptor\r\n let requestHeaders = new HttpHeaders({\r\n 'content-type': 'application/json',\r\n accept: 'text/event-stream',\r\n 'cache-control': 'no-cache',\r\n });\r\n\r\n if (headers) {\r\n Object.keys(headers).forEach((key) => {\r\n requestHeaders = requestHeaders.set(key, headers[key]);\r\n });\r\n }\r\n\r\n const req = this.http.request('POST', url, {\r\n body,\r\n headers: requestHeaders,\r\n reportProgress: true,\r\n observe: 'events',\r\n responseType: 'text',\r\n });\r\n\r\n let lastLoaded = 0;\r\n\r\n const sub = req.subscribe({\r\n next: (event) => {\r\n if (event.type === HttpEventType.DownloadProgress) {\r\n // Process the new chunk of data\r\n const fullText = (event as any).partialText;\r\n if (!fullText) return;\r\n\r\n const newText = fullText.slice(lastLoaded);\r\n lastLoaded = fullText.length;\r\n\r\n const lines = newText.split('\\n');\r\n\r\n for (const line of lines) {\r\n if (line.trim() === '') continue;\r\n\r\n if (line.startsWith('data: ')) {\r\n const dataStr = line.substring(6).trim();\r\n\r\n if (dataStr === '[DONE]') {\r\n this.ngZone.run(() => observer.complete());\r\n return;\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(dataStr);\r\n this.ngZone.run(() =>\r\n observer.next({\r\n content: parsed.content ?? parsed.message ?? '',\r\n type: parsed.type ?? 'chunk',\r\n id: parsed.response_id ?? '',\r\n created_at: parsed.created_at ?? '',\r\n sources: parsed.sources ?? [],\r\n error: parsed.error,\r\n }),\r\n );\r\n } catch (e) {\r\n logger.warn('Failed to parse SSE data:', dataStr, e);\r\n }\r\n }\r\n }\r\n } else if (event.type === HttpEventType.Response) {\r\n this.ngZone.run(() => observer.complete());\r\n }\r\n },\r\n error: (err) => {\r\n this.ngZone.run(() => observer.error(err));\r\n },\r\n complete: () => {\r\n this.ngZone.run(() => observer.complete());\r\n },\r\n });\r\n\r\n return () => sub.unsubscribe();\r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { ChatHistoryData, ChatHistoryRequest, ChatMessage } from '../model/chat-history.model';\r\nimport { HttpStreamService } from '../../../core/http/http-stream.service';\r\nimport { HttpService } from '../../../core/http/http.service';\r\nimport { ApiResponse } from '../../../core/models/api-response.model';\r\nimport logger from '../../../core/utils/logger.service';\r\nimport { ChatRequest } from '../model/chat-request.model';\r\nimport { ChatResponse } from '../model/chat-response.model';\r\nimport { ChatStreamResponse } from '../model/chat-stream-response.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatApiService {\r\n get apiUrl(): string {\r\n return this.http.apiUrl;\r\n }\r\n\r\n constructor(\r\n private http: HttpService,\r\n private httpStreamService: HttpStreamService,\r\n ) {\r\n logger.log('ChatApiService: Initialized');\r\n }\r\n\r\n /**\r\n * Send chat message and get full response\r\n */\r\n sendMessage(request?: ChatRequest, showLoader = false): Observable<ApiResponse<ChatResponse>> {\r\n return this.http.post('chats/ask', request, showLoader);\r\n }\r\n\r\n /**\r\n * Send chat message and get streaming response\r\n */\r\n sendMessageStream(request: ChatRequest): Observable<ChatStreamResponse> {\r\n return this.httpStreamService.createHttpStream(`${this.apiUrl}chats/stream`, request);\r\n }\r\n\r\n getChatHistory(\r\n request: ChatHistoryRequest,\r\n showLoader = false,\r\n ): Observable<ApiResponse<ChatHistoryData>> {\r\n return this.http.post('chats/sessions', request, showLoader);\r\n }\r\n\r\n getChatSession(\r\n chatSessionId: string,\r\n showLoader = false,\r\n ): Observable<ApiResponse<ChatMessage[]>> {\r\n return this.http.get(`chats/sessions/${chatSessionId}`, undefined, showLoader);\r\n }\r\n\r\n // deleteChatSession(chatSessionId: string, showLoader = false): Observable<ApiResponse<void>> {\r\n // return this.http.delete(`chats/sessions/${chatSessionId}`, undefined, showLoader);\r\n // }\r\n\r\n // deleteChatSession(chatSessionId: string, showLoader = false): Observable<ApiResponse<void>> {\r\n // return this.clearChatHistory(\r\n // { chat_session_ids: [chatSessionId], delete_all: false },\r\n // showLoader,\r\n // );\r\n // }\r\n\r\n deleteChatSession(chatSessionId: string, showLoader = false): Observable<ApiResponse<void>> {\r\n const body = { chat_session_ids: [chatSessionId], delete_all: false };\r\n return this.http.delete('chats/sessions', body, showLoader);\r\n }\r\n\r\n updateChatTitle(\r\n chatSessionId: string,\r\n title: string,\r\n showLoader = false,\r\n ): Observable<ApiResponse<void>> {\r\n return this.http.patch(`chats/sessions/${chatSessionId}/title`, { title }, showLoader);\r\n }\r\n\r\n clearChatHistory(request?: object, showLoader = false): Observable<ApiResponse<void>> {\r\n return this.http.delete('chats/sessions', request, showLoader);\r\n }\r\n}\r\n","import { Injectable, inject, signal } from '@angular/core';\r\nimport { Observable, of, catchError, map } from 'rxjs';\r\nimport { ChatApiService } from './chat-api.service';\r\nimport { ChatSession } from '../model/chat-session.model';\r\nimport { Message } from '../../../core/models/message';\r\nimport { SnackbarUtils } from '../../../shared/snackbar/snackbar.utils';\r\nimport logger from '../../../core/utils/logger.service';\r\nimport { ChatSessionResponse, ChatMessage } from '../model/chat-history.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatHistoryService {\r\n private chatApiService = inject(ChatApiService);\r\n\r\n // History State Signals\r\n public sessions = signal<ChatSession[]>([]);\r\n public isLoading = signal<boolean>(false);\r\n public isLoadingMore = signal<boolean>(false);\r\n public hasMore = signal<boolean>(true);\r\n public historyOffset = signal<number>(0);\r\n public isCacheValid = signal<boolean>(false);\r\n public processingSessionId = signal<string | null>(null);\r\n\r\n /**\r\n * Map API session response to ChatSession model\r\n */\r\n public mapSessionResponseToSession(\r\n sessionResponse: ChatSessionResponse,\r\n userId: string,\r\n ): ChatSession {\r\n // Use last_message_at or created_at or current time\r\n const timestamp = sessionResponse.last_message_at\r\n ? new Date(sessionResponse.last_message_at)\r\n : sessionResponse.created_at\r\n ? new Date(sessionResponse.created_at)\r\n : new Date();\r\n\r\n logger.log('Mapping session response:', sessionResponse);\r\n\r\n // Map messages from the session if they exist\r\n let messages: Message[] = [];\r\n if (sessionResponse.messages && Array.isArray(sessionResponse.messages)) {\r\n messages = sessionResponse.messages.map((msg: ChatMessage) => ({\r\n id: msg.message_id || '',\r\n sender: msg.role,\r\n text: msg.content,\r\n completed: true,\r\n isHistory: true,\r\n timestamp: new Date(msg.created_at),\r\n }));\r\n }\r\n\r\n // Use response_id as primary ID, fallback to chat_session_id\r\n const sessionId = sessionResponse.response_id || sessionResponse.chat_session_id || '';\r\n\r\n return {\r\n id: sessionId,\r\n timestamp: timestamp,\r\n title: sessionResponse.title || 'Previous Conversation',\r\n userId: userId,\r\n messages: messages,\r\n };\r\n }\r\n\r\n /**\r\n * Load all chat sessions for a specific user\r\n */\r\n loadSessions(userId: string, forceRefresh: boolean = false): void {\r\n logger.log('loadSessions called', { userId, forceRefresh });\r\n\r\n if (this.isCacheValid() && !forceRefresh && this.sessions().length > 0) {\r\n logger.log('Cache is valid and sessions already loaded. Skipping API call.');\r\n return;\r\n }\r\n\r\n this.isLoading.set(true);\r\n this.historyOffset.set(0);\r\n logger.log('Fetching chat history from API...');\r\n\r\n this.chatApiService\r\n .getChatHistory({ limit: 50, offset: 0 })\r\n .pipe(\r\n map((response) => {\r\n logger.log('Chat history response received', response);\r\n\r\n if (response && response.success && response.data && response.data.sessions) {\r\n const remoteSessions = response.data.sessions.map((session: ChatSessionResponse) =>\r\n this.mapSessionResponseToSession(session, userId),\r\n );\r\n const hasMore =\r\n response.data.offset + response.data.sessions.length < response.data.total;\r\n\r\n logger.log(`Mapped ${remoteSessions.length} sessions. Has more: ${hasMore}`);\r\n return { sessions: remoteSessions, hasMore };\r\n }\r\n\r\n logger.warn('No sessions found in response');\r\n return { sessions: [], hasMore: false };\r\n }),\r\n catchError((err) => {\r\n SnackbarUtils.error('Failed to load history');\r\n logger.error('ChatHistoryService: Failed to load history:', err);\r\n return of({ sessions: [], hasMore: false });\r\n }),\r\n )\r\n .subscribe({\r\n next: (result) => {\r\n this.sessions.set(result.sessions);\r\n this.hasMore.set(result.hasMore);\r\n this.historyOffset.set(result.sessions.length);\r\n this.isCacheValid.set(true);\r\n this.isLoading.set(false);\r\n\r\n logger.log(`Loaded ${result.sessions.length} sessions. Cache valid: true`);\r\n },\r\n error: () => {\r\n this.isLoading.set(false);\r\n logger.error('loadSessions: Unexpected error in subscription');\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Load more sessions for infinite scroll\r\n */\r\n loadMoreSessions(userId: string): void {\r\n if (!this.hasMore() || this.isLoadingMore()) return;\r\n\r\n const currentOffset = this.historyOffset();\r\n this.isLoadingMore.set(true);\r\n\r\n this.chatApiService\r\n .getChatHistory({ limit: 50, offset: currentOffset })\r\n .pipe(\r\n map((response) => {\r\n if (response && response.success && response.data && response.data.sessions) {\r\n const remoteSessions = response.data.sessions.map((session: ChatSessionResponse) =>\r\n this.mapSessionResponseToSession(session, userId),\r\n );\r\n const hasMore =\r\n response.data.offset + response.data.sessions.length < response.data.total;\r\n return { sessions: remoteSessions, hasMore };\r\n }\r\n return { sessions: [], hasMore: false };\r\n }),\r\n catchError((err) => {\r\n SnackbarUtils.error('Failed to load more history');\r\n logger.error('ChatHistoryService: Failed to load more history:', err);\r\n return of({ sessions: [], hasMore: false });\r\n }),\r\n )\r\n .subscribe({\r\n next: (result) => {\r\n const updatedSessions = [...this.sessions(), ...result.sessions];\r\n this.sessions.set(updatedSessions);\r\n this.hasMore.set(result.hasMore);\r\n this.historyOffset.set(currentOffset + result.sessions.length);\r\n this.isLoadingMore.set(false);\r\n },\r\n error: () => this.isLoadingMore.set(false),\r\n });\r\n }\r\n\r\n /**\r\n * Load messages for a specific session\r\n */\r\n loadSessionMessages(sessionId: string): Observable<Message[]> {\r\n return this.chatApiService.getChatSession(sessionId).pipe(\r\n map((response) => {\r\n if (response.success && response.data) {\r\n // Sort messages by created_at timestamp to ensure chronological order (user, assistant, user, assistant...)\r\n function sortMessages(messages: any[]) {\r\n const users = messages.filter((m) => m.role === 'user');\r\n const assistants = messages.filter((m) => m.role === 'assistant');\r\n\r\n const result = [];\r\n const maxLength = Math.max(users.length, assistants.length);\r\n\r\n for (let i = 0; i < maxLength; i++) {\r\n if (users[i]) result.push(users[i]);\r\n if (assistants[i]) result.push(assistants[i]);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n const sortedData = sortMessages(response.data);\r\n\r\n return sortedData.map((msg: ChatMessage) => ({\r\n id: msg.message_id || '',\r\n sender: msg.role,\r\n text: msg.content,\r\n completed: true,\r\n isHistory: true,\r\n timestamp: new Date(msg.created_at),\r\n }));\r\n }\r\n return [];\r\n }),\r\n catchError((err) => {\r\n logger.error('ChatHistoryService: Failed to load messages:', err);\r\n SnackbarUtils.error('Failed to load messages');\r\n return of([]);\r\n }),\r\n );\r\n }\r\n\r\n /**\r\n * Delete a specific session\r\n */\r\n deleteSession(sessionId: string, userId: string): Observable<void> {\r\n this.processingSessionId.set(sessionId);\r\n return this.chatApiService.deleteChatSession(sessionId).pipe(\r\n map((response) => {\r\n if (response && response.success) {\r\n this.sessions.update((prev) => prev.filter((s) => s.id !== sessionId));\r\n SnackbarUtils.success('Conversation deleted successfully');\r\n }\r\n }),\r\n catchError((err) => {\r\n SnackbarUtils.error('Failed to delete conversation');\r\n logger.error('ChatHistoryService: Failed to delete session', err);\r\n throw err;\r\n }),\r\n map(() => {\r\n this.processingSessionId.set(null);\r\n }),\r\n );\r\n }\r\n\r\n /**\r\n * Delete all history\r\n */\r\n deleteAllHistory(userId: string): Observable<void> {\r\n this.isLoading.set(true);\r\n return this.chatApiService.clearChatHistory({ delete_all: true }).pipe(\r\n map((response) => {\r\n if (response && response.success) {\r\n this.sessions.set([]);\r\n this.isCacheValid.set(false);\r\n SnackbarUtils.success('Chat history cleared');\r\n }\r\n }),\r\n catchError((err) => {\r\n SnackbarUtils.error('Failed to clear history');\r\n logger.error('ChatHistoryService: Failed to clear history', err);\r\n throw err;\r\n }),\r\n map(() => {\r\n this.isLoading.set(false);\r\n }),\r\n );\r\n }\r\n\r\n /**\r\n * Update session title\r\n */\r\n updateSessionTitle(sessionId: string, newTitle: string, userId: string): Observable<boolean> {\r\n this.processingSessionId.set(sessionId);\r\n return this.chatApiService.updateChatTitle(sessionId, newTitle).pipe(\r\n map((response) => {\r\n const success = !!(response && response.success);\r\n if (success) {\r\n this.sessions.update((prev) =>\r\n prev.map((s) => (s.id === sessionId ? { ...s, title: newTitle } : s)),\r\n );\r\n }\r\n this.processingSessionId.set(null);\r\n SnackbarUtils.success('Title updated successfully');\r\n return success;\r\n }),\r\n catchError((err) => {\r\n SnackbarUtils.error('Failed to update title');\r\n logger.error('ChatHistoryService: Failed to update title', err);\r\n this.processingSessionId.set(null);\r\n return of(false);\r\n }),\r\n );\r\n }\r\n\r\n /**\r\n * Invalidate cache\r\n */\r\n invalidateCache(): void {\r\n this.isCacheValid.set(false);\r\n this.historyOffset.set(0);\r\n this.hasMore.set(true);\r\n }\r\n\r\n /**\r\n * Clear all history state\r\n */\r\n clearState(): void {\r\n this.sessions.set([]);\r\n this.isLoading.set(false);\r\n this.isLoadingMore.set(false);\r\n this.hasMore.set(true);\r\n this.historyOffset.set(0);\r\n this.isCacheValid.set(false);\r\n this.processingSessionId.set(null);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport logger from '../../../core/utils/logger.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatAudioService {\r\n private audioUnlocked = false;\r\n\r\n constructor() { }\r\n\r\n /**\r\n * Unlock audio playback (required for autoplay in browsers)\r\n */\r\n public unlockAudio(): void {\r\n if (this.audioUnlocked) return;\r\n const audio = new Audio();\r\n audio.volume = 1.0;\r\n audio\r\n .play()\r\n .then(() => (this.audioUnlocked = true))\r\n .catch(() => { });\r\n }\r\n\r\n /**\r\n * Play bot message sound\r\n */\r\n public playBotSound(): void {\r\n if (!this.audioUnlocked) return;\r\n try {\r\n const audio = new Audio('assets/bot.mp3');\r\n audio.play();\r\n } catch (error) {\r\n logger.error('Error playing bot sound:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Check if audio is unlocked\r\n */\r\n public isAudioUnlocked(): boolean {\r\n return this.audioUnlocked;\r\n }\r\n}\r\n","import { Injectable, signal, computed, effect, Signal } from '@angular/core';\r\nimport { Message } from '../../core/models/message';\r\n\r\n/**\r\n * ChatUIStateService - Centralized UI state management\r\n *\r\n * Manages all UI-related state for the chat component including:\r\n * - Chat window open/close state\r\n * - History sidebar visibility\r\n * - Unread message tracking\r\n * - Fullscreen state\r\n *\r\n * This service uses Angular signals for reactive state management,\r\n * allowing components to subscribe to state changes efficiently.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatUIStateService {\r\n //! ===================== UI STATE SIGNALS============================\r\n\r\n /**\r\n * Whether the chat window is currently open\r\n */\r\n public isChatOpen = signal(false);\r\n\r\n /**\r\n * Whether the history sidebar is currently open\r\n */\r\n public isHistorySidebarOpen = signal(false);\r\n\r\n /**\r\n * Whether the chat is in fullscreen mode\r\n */\r\n public isFullScreen = signal(false);\r\n\r\n /**\r\n * ID of the last message that was read by the user\r\n */\r\n private lastReadMessageId = signal<string | null>(null);\r\n\r\n /**\r\n * Reference to current messages (injected from outside)\r\n */\r\n private messagesSignal: Signal<Message[]> = signal<Message[]>([]);\r\n\r\n //! ===================== COMPUTED SIGNALS ======================\r\n\r\n /**\r\n * Computed number of unread bot messages\r\n */\r\n public unreadCount = computed(() => {\r\n if (this.isChatOpen()) {\r\n return 0; // No unread when chat is open\r\n }\r\n\r\n const messages = this.messagesSignal();\r\n if (messages.length === 0) return 0;\r\n\r\n const lastReadId = this.lastReadMessageId();\r\n let lastReadIndex = -1;\r\n\r\n if (lastReadId !== null) {\r\n lastReadIndex = messages.findIndex((msg) => msg.id === lastReadId);\r\n }\r\n\r\n // Count unread bot messages after last read position\r\n const unreadBotMessages = messages\r\n .slice(lastReadIndex + 1)\r\n .filter((msg) => msg.sender === 'assistant');\r\n\r\n return unreadBotMessages.length;\r\n });\r\n\r\n //! ===================== EFFECTS ========================\r\n\r\n /**\r\n * Effect to automatically mark messages as read when chat is opened\r\n */\r\n public markAsReadEffect = effect(\r\n () => {\r\n const isOpen = this.isChatOpen();\r\n const msgs = this.messagesSignal();\r\n\r\n if (isOpen && msgs.length > 0) {\r\n const lastMessage = msgs[msgs.length - 1];\r\n if (lastMessage?.id) {\r\n const currentLastRead = this.lastReadMessageId();\r\n if (lastMessage.id !== currentLastRead) {\r\n this.lastReadMessageId.set(lastMessage.id);\r\n }\r\n }\r\n }\r\n },\r\n { allowSignalWrites: true }, // TODO\r\n );\r\n\r\n //! =================== PUBLIC METHODS ===========================\r\n\r\n /**\r\n * Set the messages signal reference from an external source\r\n * This allows the UI state service to track messages from MessageService\r\n */\r\n setMessagesSignal(messagesSignal: Signal<Message[]>): void {\r\n this.messagesSignal = messagesSignal;\r\n }\r\n\r\n /**\r\n * Toggle the chat window open/close state\r\n */\r\n toggleChat(): void {\r\n const currentlyOpen = this.isChatOpen();\r\n this.isChatOpen.update((open) => !open);\r\n\r\n // Mark messages as read when opening chat\r\n if (!currentlyOpen) {\r\n const messages = this.messagesSignal();\r\n if (messages.length > 0) {\r\n const lastMessage = messages[messages.length - 1];\r\n this.lastReadMessageId.set(lastMessage.id ?? null);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Toggle the history sidebar open/close state\r\n */\r\n toggleHistorySidebar(): void {\r\n this.isHistorySidebarOpen.update((open) => !open);\r\n }\r\n\r\n /**\r\n * Close the chat window\r\n */\r\n closeChat(): void {\r\n this.isChatOpen.set(false);\r\n }\r\n\r\n /**\r\n * Open the chat window\r\n */\r\n openChat(): void {\r\n this.isChatOpen.set(true);\r\n }\r\n\r\n /**\r\n * Close the history sidebar\r\n */\r\n closeHistorySidebar(): void {\r\n this.isHistorySidebarOpen.set(false);\r\n }\r\n\r\n /**\r\n * Open the history sidebar\r\n */\r\n openHistorySidebar(): void {\r\n this.isHistorySidebarOpen.set(true);\r\n }\r\n\r\n /**\r\n * Toggle fullscreen mode\r\n */\r\n toggleFullscreen(): void {\r\n this.isFullScreen.update((fs) => !fs);\r\n }\r\n\r\n /**\r\n * Set fullscreen state\r\n */\r\n setFullscreen(isFullscreen: boolean): void {\r\n this.isFullScreen.set(isFullscreen);\r\n }\r\n\r\n /**\r\n * Manually mark messages as read up to a specific message ID\r\n */\r\n markMessagesAsRead(messageId: string): void {\r\n this.lastReadMessageId.set(messageId);\r\n }\r\n\r\n /**\r\n * Reset last read message ID\r\n */\r\n resetLastRead(): void {\r\n this.lastReadMessageId.set(null);\r\n }\r\n\r\n /**\r\n * Get the last read message ID\r\n */\r\n getLastReadMessageId(): string | null {\r\n return this.lastReadMessageId();\r\n }\r\n}\r\n","import { Injectable, signal, inject, computed } from '@angular/core';\r\nimport { Subscription, Subject, lastValueFrom } from 'rxjs';\r\nimport { ChatSession } from './model/chat-session.model';\r\nimport { ChatHistoryService } from './services/chat-history.service';\r\n\r\n// Extracted Services\r\nimport { ChatApiService } from './services/chat-api.service';\r\nimport { ChatAudioService } from './services/chat-audio.service';\r\nimport { SnackbarUtils } from '../../shared/snackbar/snackbar.utils';\r\nimport { ChatApiError } from '../../core/models/api-request.model';\r\nimport { DOOHBOT_ADVANCED_CONFIG } from '../../core/models/doohbot-config.model';\r\nimport { Message } from '../../core/models/message';\r\nimport { PromptMode } from '../../core/types/prompt-mode.type';\r\nimport logger from '../../core/utils/logger.service';\r\nimport { ChatRequest } from './model/chat-request.model';\r\nimport { ChatStreamMessage } from './model/chat-stream-message.model';\r\nimport { AuthService } from './../../core/auth/auth.service';\r\n\r\nimport { ChatUIStateService } from './chat-ui-state.service';\r\nimport { PersonalizationService } from '../personalization/personalization.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatService {\r\n // Dependencies\r\n private apiService = inject(ChatApiService);\r\n private authService = inject(AuthService);\r\n private audioService = inject(ChatAudioService);\r\n private config = inject(DOOHBOT_ADVANCED_CONFIG, { optional: true });\r\n private chatHistoryService = inject(ChatHistoryService);\r\n private chatUIStateService = inject(ChatUIStateService);\r\n private personalization = inject(PersonalizationService);\r\n private chatSessions = this.chatHistoryService.sessions;\r\n\r\n // Public messages signal for current context\r\n public messages = signal<Message[]>([]);\r\n\r\n /**\r\n * Determine if suggestion chips should be shown\r\n */\r\n public showSuggestionChips = computed(() => {\r\n const msgs = this.messages();\r\n if (msgs.length === 0) return false;\r\n const lastBotMsg = [...msgs].reverse().find((m) => m.sender === 'assistant');\r\n return lastBotMsg?.showSuggestions === true;\r\n });\r\n\r\n // Active session\r\n private activeSession: ChatSession | null = null;\r\n\r\n // UI state signals (Keep these here as they are relevant to the Chat UI state)\r\n public isLoadingApi = signal<boolean>(false);\r\n public apiError = signal<ChatApiError | null>(null);\r\n public isBotTyping = signal<boolean>(false);\r\n public promptMode = signal<PromptMode>('markdown');\r\n public isStreaming = signal<boolean>(true); //! `isStreaming` is set to true by default\r\n\r\n messagesStream: Array<ChatStreamMessage> = [];\r\n currentResponse = '';\r\n\r\n private streamSubscription?: Subscription;\r\n private cancelSubject = new Subject<void>();\r\n\r\n getFallbackReply(): string {\r\n return \"I'm sorry 😔, I didn't understand that.\";\r\n }\r\n\r\n getFallbackError(): string {\r\n return 'Something went wrong. Please try again.';\r\n }\r\n\r\n constructor() {\r\n logger.log('ChatService: Initialized');\r\n\r\n // Initialize prompt mode from config if available\r\n if (this.config?.promptMode) {\r\n this.promptMode.set(this.config.promptMode);\r\n }\r\n }\r\n\r\n //! ==================== STATE MANAGEMENT ====================\r\n\r\n /**\r\n * Generate a unique session ID\r\n */\r\n private generateSessionId(): string {\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return `session_${crypto.randomUUID()}`;\r\n }\r\n return `session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\r\n }\r\n\r\n /**\r\n * Create a new chat session\r\n */\r\n createSession(userId: string): ChatSession {\r\n return {\r\n id: this.generateSessionId(),\r\n timestamp: new Date(),\r\n title: 'New Conversation',\r\n messages: [],\r\n userId,\r\n };\r\n }\r\n\r\n /**\r\n * Start a new chat session\r\n */\r\n public startNewSession(): void {\r\n // this.cancelRequest(); //! Cancel any ongoing request before starting new session\r\n const userId = this.authService.getUserId();\r\n\r\n this.isBotTyping.set(false);\r\n this.isLoadingApi.set(false);\r\n\r\n this.activeSession = this.createSession(userId);\r\n this.messages.set([]);\r\n }\r\n\r\n /**\r\n * Load an existing session\r\n */\r\n public loadSession(session: ChatSession): void {\r\n logger.log('[ChatService] Loading session:', session.id, 'Messages:', session.messages.length);\r\n this.activeSession = session;\r\n this.messages.set([...session.messages]);\r\n logger.log('[ChatService] Messages signal updated. Current count:', this.messages().length);\r\n }\r\n\r\n /**\r\n * Get active session\r\n */\r\n public getActiveSession(): ChatSession | null {\r\n return this.activeSession;\r\n }\r\n\r\n /**\r\n * Clear messages for current session and start new one\r\n */\r\n clearMessages(): void {\r\n this.messages.set([]);\r\n this.startNewSession();\r\n }\r\n\r\n /**\r\n * Add message to current session\r\n */\r\n public addMessage(message: Message): void {\r\n const newMessage = { ...message, timestamp: new Date() };\r\n\r\n // Update current messages signal\r\n this.messages.update((msgs) => [...msgs, newMessage]);\r\n\r\n // Save to active session (Server handles actual storage, UI just adds to local signal for immediate feedback)\r\n if (message.sender === 'assistant') {\r\n this.audioService.playBotSound();\r\n }\r\n }\r\n\r\n /**\r\n * Continue a chat session\r\n */\r\n public continueSession(sessionId: string): void {\r\n logger.log(`[ChatService] continuing session: ${sessionId}`);\r\n this.chatHistoryService.loadSessionMessages(sessionId).subscribe((messages) => {\r\n const loadedMessages = messages || [];\r\n const sessionFromList = this.chatSessions().find((s) => s.id === sessionId);\r\n\r\n if (sessionFromList) {\r\n sessionFromList.messages = loadedMessages;\r\n this.loadSession(sessionFromList);\r\n } else {\r\n const timestamp =\r\n loadedMessages.length > 0\r\n ? loadedMessages[loadedMessages.length - 1].timestamp || new Date()\r\n : new Date();\r\n\r\n const userId = this.authService.getUserId();\r\n\r\n const newSession: ChatSession = {\r\n id: sessionId,\r\n timestamp: timestamp,\r\n title: 'Previous Conversation',\r\n messages: loadedMessages,\r\n userId,\r\n };\r\n this.loadSession(newSession);\r\n }\r\n\r\n this.audioService.unlockAudio();\r\n this.chatUIStateService.openChat();\r\n });\r\n }\r\n\r\n //! ==================== MESSAGE PROCESSING ====================\r\n\r\n /**\r\n * Process a user message: add it, get bot reply, and add bot reply\r\n */\r\n public async sendMessage(text: string, maxLength: number = 1000): Promise<void> {\r\n const trimmedText = text.trim();\r\n if (!trimmedText) {\r\n return;\r\n }\r\n\r\n if (trimmedText.length > maxLength) {\r\n SnackbarUtils.error(`Message exceeds maximum length of ${maxLength} characters.`);\r\n return;\r\n }\r\n\r\n //! Cancel any ongoing request before starting a new one\r\n if (this.isBotTyping()) {\r\n this.cancelRequest();\r\n }\r\n\r\n const currentSessionId = this.activeSession?.id;\r\n\r\n this.addMessage({\r\n sender: 'user',\r\n text: text,\r\n completed: true,\r\n isHistory: false,\r\n id: Date.now().toString(),\r\n timestamp: new Date(),\r\n });\r\n\r\n this.isBotTyping.set(true);\r\n\r\n try {\r\n const response = await this.getBotReply(text);\r\n\r\n // Check if session has changed while waiting for response\r\n if (this.activeSession?.id !== currentSessionId) {\r\n logger.log(\r\n `[ChatService] Ignoring response for session: ${currentSessionId} as active session is now: ${this.activeSession?.id}`,\r\n );\r\n return;\r\n }\r\n\r\n const isFallback = response === this.getFallbackReply();\r\n\r\n // Only add completion message if it wasn't handled by streaming (response is not empty string)\r\n if (response !== '') {\r\n this.addMessage({\r\n sender: 'assistant',\r\n text: response,\r\n completed: true,\r\n isHistory: false,\r\n id: Date.now().toString(),\r\n showSuggestions: false, //! Don't show suggestions for fallback reply\r\n });\r\n }\r\n } finally {\r\n // Only reset typing if we are still in the same session, or if we want to be safe (though resetting false is usually harmless)\r\n if (this.activeSession?.id === currentSessionId) {\r\n this.isBotTyping.set(false);\r\n }\r\n }\r\n }\r\n\r\n //! ==================== API CALLS ====================\r\n\r\n async getBotReply(userText: string): Promise<string> {\r\n logger.log('Requesting bot reply for:', userText);\r\n\r\n try {\r\n this.isLoadingApi.set(true);\r\n this.apiError.set(null);\r\n\r\n const request = this.buildChatRequest(userText);\r\n\r\n //! chat endpoints\r\n if (this.isStreaming()) {\r\n return await this.stream(request);\r\n } else {\r\n return await this.ask(request);\r\n }\r\n } catch (error) {\r\n SnackbarUtils.error('An error occurred while getting the bot reply.');\r\n return this.getFallbackError();\r\n }\r\n }\r\n\r\n /**\r\n * Builds a chat request payload with the given user text and optional active session\r\n * @param {string} userInput - The text provided by the user\r\n * @returns {ChatRequest} - A chat request payload with the user text and optional active session\r\n * @memberof ChatService\r\n */\r\n\r\n private buildChatRequest(userText: string): ChatRequest {\r\n const instructions = this.personalization.getFormattedInstructions();\r\n const finalQuestion = instructions ? `${instructions}\\n\\n${userText}` : userText;\r\n\r\n const request: ChatRequest = {\r\n question: finalQuestion,\r\n organization_id: this.authService.getOrganizationId() || '',\r\n prompt_mode: this.promptMode(),\r\n custom_instructions: instructions,\r\n };\r\n\r\n if (this.activeSession && !this.activeSession.id.startsWith('session_')) {\r\n request.response_id = this.activeSession.id;\r\n logger.log('>>>> conversation continued:', this.activeSession.id);\r\n } else {\r\n logger.log('>>>> new conversation started');\r\n }\r\n\r\n return request;\r\n }\r\n\r\n // ! Ask api endpoint\r\n private async ask(request: ChatRequest): Promise<string> {\r\n logger.log('>>>>Using Standard Chat Endpoint<<<<');\r\n\r\n const responseSubject = new Subject<string>();\r\n\r\n const currentSessionId = this.activeSession?.id;\r\n\r\n this.streamSubscription = this.apiService.sendMessage(request, true).subscribe({\r\n next: (response) => {\r\n if (this.activeSession?.id === currentSessionId) {\r\n this.isLoadingApi.set(false);\r\n }\r\n if (response?.success && response.data) {\r\n if (this.activeSession?.id === currentSessionId) {\r\n this.mapSessionId(response.data.id);\r\n }\r\n responseSubject.next(response.data.content || this.getFallbackError());\r\n } else {\r\n responseSubject.next(this.getFallbackError());\r\n }\r\n responseSubject.complete();\r\n },\r\n error: (error) => {\r\n logger.error('Ask error:', error);\r\n if (this.activeSession?.id === currentSessionId) {\r\n this.isLoadingApi.set(false);\r\n this.isBotTyping.set(false);\r\n }\r\n responseSubject.next(this.getFallbackError());\r\n responseSubject.complete();\r\n },\r\n });\r\n\r\n // Handle manual cancellation\r\n const cancelSub = this.cancelSubject.subscribe(() => {\r\n responseSubject.next(''); // Resolve with empty string if cancelled\r\n responseSubject.complete();\r\n });\r\n\r\n try {\r\n return await lastValueFrom(responseSubject);\r\n } finally {\r\n cancelSub.unsubscribe();\r\n }\r\n }\r\n\r\n // ! Stream api endpoint\r\n private async stream(request: ChatRequest): Promise<string> {\r\n logger.log('>>>>Using Stream Chat Endpoint<<<<');\r\n\r\n this.currentResponse = '';\r\n this.isBotTyping.set(true);\r\n\r\n const assistantMessage: Message = {\r\n id: Date.now().toString(),\r\n sender: 'assistant',\r\n text: '',\r\n chunks: [],\r\n timestamp: new Date(),\r\n completed: false,\r\n isHistory: false,\r\n showSuggestions: false,\r\n };\r\n\r\n // Add empty bubble after first chunk has been received\r\n this.addMessage(assistantMessage);\r\n\r\n const streamComplete$ = new Subject<string>();\r\n let hasStarted = false;\r\n\r\n // Handle manual cancellation for stream\r\n const cancelSub = this.cancelSubject.subscribe(() => {\r\n if (!streamComplete$.closed) {\r\n streamComplete$.next('');\r\n streamComplete$.complete();\r\n }\r\n });\r\n\r\n this.streamSubscription = this.apiService.sendMessageStream(request).subscribe({\r\n next: (chunk) => {\r\n if (!hasStarted) {\r\n hasStarted = true;\r\n this.isBotTyping.set(false);\r\n\r\n // replace response_id in message id\r\n this.messages.update((msgs) =>\r\n msgs.map((m) =>\r\n m.id === assistantMessage.id\r\n ? {\r\n ...m,\r\n ...{ id: chunk.id },\r\n }\r\n : m,\r\n ),\r\n );\r\n\r\n assistantMessage.id = chunk.id;\r\n\r\n // Map the session ID to the backend-generated one\r\n this.mapSessionId(chunk.response_id || chunk.id);\r\n }\r\n\r\n const text = chunk.content ?? '';\r\n if (!text) return;\r\n\r\n // keep message in sync without regeneration\r\n this.messages.update((msgs) =>\r\n msgs.map((m) =>\r\n m.id === assistantMessage.id\r\n ? {\r\n ...m,\r\n chunks: [...(m.chunks ?? []), text], // immutable append\r\n }\r\n : m,\r\n ),\r\n );\r\n\r\n // const message = this.messages().find((m) => m.id === assistantMessage.id);\r\n // logger.log('Appending chunk to assistant message:', message?.chunks);\r\n },\r\n complete: () => {\r\n this.isLoadingApi.set(false);\r\n\r\n // Mark the chunk stream compelted\r\n this.messages.update((msgs) =>\r\n msgs.map((m) => (m.id === assistantMessage.id ? { ...m, completed: true } : m)),\r\n );\r\n\r\n // const message = this.messages().find((m) => m.id === assistantMessage.id);\r\n // this.currentResponse += message?.chunks?.join('') ?? '';\r\n\r\n // logger.log('Appending chunk to assistant message:', message?.text);\r\n // logger.log('Appending chunk to assistant message:', message?.chunks);\r\n\r\n streamComplete$.next(this.currentResponse);\r\n streamComplete$.complete();\r\n },\r\n error: (error) => {\r\n logger.error('Chat error:', error);\r\n SnackbarUtils.error('An error occurred during reply.');\r\n\r\n this.isLoadingApi.set(false);\r\n this.isBotTyping.set(false);\r\n SnackbarUtils.error('An error occurred during reply.');\r\n\r\n if (!hasStarted) this.addMessage(assistantMessage);\r\n if (!assistantMessage.text) assistantMessage.text = this.getFallbackError();\r\n\r\n // mark completed, do NOT rebuild content\r\n this.messages.update((msgs) =>\r\n msgs.map((m) =>\r\n m.id === assistantMessage.id\r\n ? {\r\n ...m,\r\n completed: true,\r\n isHistory: false,\r\n text: assistantMessage.text,\r\n }\r\n : m,\r\n ),\r\n );\r\n\r\n streamComplete$.next('');\r\n streamComplete$.complete();\r\n // this.finalizeStreamError(assistantMessage, hasStarted, streamComplete$);\r\n },\r\n });\r\n\r\n try {\r\n await lastValueFrom(streamComplete$);\r\n } finally {\r\n cancelSub.unsubscribe();\r\n }\r\n return '';\r\n }\r\n\r\n //! -----------------------------------------\r\n\r\n cancelRequest(): void {\r\n this.cancelSubject.next();\r\n\r\n // Reset UI states immediately\r\n this.isLoadingApi.set(false);\r\n this.isBotTyping.set(false);\r\n this.currentResponse = '';\r\n\r\n if (this.streamSubscription) {\r\n logger.log('Cancelling ongoing chat request...');\r\n this.streamSubscription.unsubscribe();\r\n this.streamSubscription = undefined;\r\n\r\n // Clean up assistant messages:\r\n // Remove if completely empty\r\n // Mark as completed if it has content\r\n this.messages.update((msgs) =>\r\n msgs\r\n .filter(\r\n (m) =>\r\n !(\r\n m.sender === 'assistant' &&\r\n !m.completed &&\r\n !m.text &&\r\n (!m.chunks || m.chunks.length === 0)\r\n ),\r\n )\r\n .map((m) => (m.sender === 'assistant' && !m.completed ? { ...m, completed: true } : m)),\r\n );\r\n }\r\n }\r\n\r\n //! ==================== AUDIO ====================\r\n\r\n public unlockAudio(): void {\r\n this.audioService.unlockAudio();\r\n }\r\n\r\n /**\r\n * Map local placeholder session ID to backend-generated ID\r\n */\r\n private mapSessionId(responseId?: string): void {\r\n if (!responseId || !this.activeSession || !this.activeSession.id.startsWith('session_')) {\r\n return;\r\n }\r\n\r\n const oldId = this.activeSession.id;\r\n logger.log(`[ChatService] Mapping local session ${oldId} → backend ID ${responseId}`);\r\n\r\n // Update active session subject\r\n this.activeSession.id = responseId;\r\n\r\n // Trigger history refresh to get the server-generated title\r\n this.chatHistoryService.invalidateCache();\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { ThemeService } from '../../../../core/services/theme.service';\r\nimport { inject } from '@angular/core';\r\nimport { ChatService } from '../../chat.service';\r\nimport Logger from '../../../../core/utils/logger.service';\r\nimport { ChatUIStateService } from '../../chat-ui-state.service';\r\nimport { SnackbarUtils } from '../../../../shared/snackbar/snackbar.utils';\r\n\r\n@Component({\r\n selector: 'app-chat-header',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule, MatMenuModule],\r\n templateUrl: './chat-header.component.html',\r\n styleUrls: ['./chat-header.component.scss'],\r\n})\r\nexport class ChatHeaderComponent {\r\n @Input() appHeaderLogoUrl: string = '';\r\n @Input() isAuthenticated: boolean = false;\r\n @Input() isFullScreen: boolean = false;\r\n @Input() settingsMenu: any;\r\n @Input() isNewChatDisabled: boolean = false;\r\n\r\n @Output() toggleChat = new EventEmitter<void>();\r\n @Output() toggleFullScreen = new EventEmitter<void>();\r\n @Output() toggleHistorySidebar = new EventEmitter<void>();\r\n @Output() clearChat = new EventEmitter<void>();\r\n\r\n public themeService = inject(ThemeService);\r\n public chatService = inject(ChatService);\r\n private uiState = inject(ChatUIStateService);\r\n\r\n onToggleChat() {\r\n this.toggleChat.emit();\r\n }\r\n\r\n onToggleHistorySidebar() {\r\n this.toggleHistorySidebar.emit();\r\n }\r\n\r\n onToggleFullScreen() {\r\n this.toggleFullScreen.emit();\r\n }\r\n\r\n onStartNewConversation() {\r\n Logger.warn('Starting new conversation...');\r\n this.chatService.startNewSession();\r\n this.uiState.closeHistorySidebar();\r\n }\r\n}\r\n","<div class=\"chat-header\">\r\n <div class=\"chat-title\">\r\n <img class=\"chat-logo\" style=\"width: 150px; height: 50px; margin-left: 0px\" [src]=\"appHeaderLogoUrl\"\r\n alt=\"Text-Logo\" />\r\n </div>\r\n\r\n <div class=\"chat-header-buttons\">\r\n <!-- History Button -->\r\n\r\n <!-- add chat Button -->\r\n @if (isAuthenticated) {\r\n <button class=\"header-button\" (click)=\"onStartNewConversation()\" title=\"Start new conversation\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n }\r\n\r\n <!-- history Button -->\r\n @if (isAuthenticated) {\r\n <button class=\"header-button\" (click)=\"onToggleHistorySidebar()\" title=\"Chat History\">\r\n <mat-icon>history</mat-icon>\r\n </button>\r\n }\r\n\r\n <!-- more Button -->\r\n <button class=\"header-button\" [matMenuTriggerFor]=\"settingsMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n\r\n <!-- minimize Button -->\r\n <button class=\"header-button\" (click)=\"onToggleChat()\">\r\n <mat-icon>minimize</mat-icon>\r\n </button>\r\n </div>\r\n</div>","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\n@Component({\r\n selector: 'app-login-form',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, MatIconModule],\r\n templateUrl: './login-form.component.html',\r\n styleUrls: ['./login-form.component.scss'],\r\n})\r\nexport class LoginFormComponent {\r\n @Input() isLoggingIn: boolean = false;\r\n\r\n @Output() loginSubmit = new EventEmitter<{\r\n username: string;\r\n password: string;\r\n rememberMe: boolean;\r\n }>();\r\n @Output() cancel = new EventEmitter<void>();\r\n\r\n public loginUsername = '';\r\n public loginPassword = '';\r\n public showPassword = false;\r\n public rememberMe = false;\r\n\r\n togglePasswordVisibility() {\r\n this.showPassword = !this.showPassword;\r\n }\r\n\r\n onLoginSubmit() {\r\n if (this.loginUsername && this.loginPassword) {\r\n this.loginSubmit.emit({\r\n username: this.loginUsername,\r\n password: this.loginPassword,\r\n rememberMe: this.rememberMe,\r\n });\r\n }\r\n }\r\n\r\n onCancel() {\r\n this.cancel.emit();\r\n }\r\n}\r\n","<form\r\n class=\"login-form-container\"\r\n (ngSubmit)=\"onLoginSubmit()\"\r\n autocomplete=\"on\"\r\n #loginForm=\"ngForm\"\r\n>\r\n <h3 class=\"login-title\">Login to Doohbot</h3>\r\n\r\n <div class=\"login-fields\">\r\n <!-- Username Field -->\r\n <div class=\"input-group\">\r\n <label class=\"input-label\">Username</label>\r\n <input\r\n type=\"text\"\r\n name=\"username\"\r\n [(ngModel)]=\"loginUsername\"\r\n #username=\"ngModel\"\r\n placeholder=\"Enter your username\"\r\n class=\"login-input\"\r\n required\r\n autocomplete=\"username\"\r\n />\r\n @if (username.invalid && (username.dirty || username.touched)) {\r\n <span class=\"error-text\"> Username is required </span>\r\n }\r\n </div>\r\n\r\n <!-- Password Field -->\r\n <div class=\"input-group\">\r\n <label class=\"input-label\">Password</label>\r\n <div class=\"password-wrapper\">\r\n <input\r\n [type]=\"showPassword ? 'text' : 'password'\"\r\n name=\"password\"\r\n [(ngModel)]=\"loginPassword\"\r\n #password=\"ngModel\"\r\n placeholder=\"Enter your password\"\r\n class=\"login-input password-input\"\r\n required\r\n autocomplete=\"current-password\"\r\n />\r\n\r\n <button\r\n type=\"button\"\r\n class=\"password-toggle-btn\"\r\n (click)=\"togglePasswordVisibility()\"\r\n tabindex=\"-1\"\r\n >\r\n <mat-icon>\r\n {{ showPassword ? 'visibility' : 'visibility_off' }}\r\n </mat-icon>\r\n </button>\r\n </div>\r\n @if (password.invalid && (password.dirty || password.touched)) {\r\n <span class=\"error-text\"> Password is required </span>\r\n }\r\n </div>\r\n\r\n <!-- Remember Me -->\r\n <div class=\"remember-me-container\">\r\n <label class=\"remember-me-label\">\r\n <input\r\n type=\"checkbox\"\r\n name=\"rememberMe\"\r\n [(ngModel)]=\"rememberMe\"\r\n class=\"remember-me-checkbox\"\r\n />\r\n <span class=\"remember-me-text\">Remember me</span>\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"login-actions\">\r\n <button type=\"button\" (click)=\"onCancel()\" class=\"auth-btn secondary\">Cancel</button>\r\n\r\n <button type=\"submit\" class=\"auth-btn primary\" [disabled]=\"loginForm.invalid || isLoggingIn\">\r\n {{ isLoggingIn ? 'Logging in...' : 'Login' }}\r\n </button>\r\n </div>\r\n</form>\r\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-chat-footer',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './chat-footer.component.html',\r\n styleUrls: ['./chat-footer.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ChatFooterComponent {}\r\n","<div class=\"terms-conditions\">\r\n <!-- Terms and conditions relocated to Personalization Hub -->\r\n</div>","import { Component, Inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatDialogModule, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\n\r\n@Component({\r\n selector: 'app-color-picker-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n ],\r\n template: `\r\n <h2 mat-dialog-title>Choose Custom Color</h2>\r\n <mat-dialog-content>\r\n <div class=\"picker-container\">\r\n <input\r\n type=\"color\"\r\n [(ngModel)]=\"color\"\r\n (input)=\"onColorInput($event)\"\r\n class=\"main-picker\"\r\n />\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Hex Code</mat-label>\r\n <input matInput [(ngModel)]=\"color\" placeholder=\"#000000\" />\r\n </mat-form-field>\r\n </div>\r\n </mat-dialog-content>\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-button (click)=\"onCancel()\">Cancel</button>\r\n <button mat-raised-button color=\"primary\" (click)=\"onConfirm()\">Apply</button>\r\n </mat-dialog-actions>\r\n `,\r\n styles: [\r\n `\r\n .picker-container {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 20px;\r\n padding: 10px 0;\r\n }\r\n .main-picker {\r\n width: 100px;\r\n height: 100px;\r\n padding: 0;\r\n border: none;\r\n border-radius: 50%;\r\n cursor: pointer;\r\n outline: none;\r\n background: none;\r\n }\r\n .main-picker::-webkit-color-swatch-wrapper {\r\n padding: 0;\r\n }\r\n .main-picker::-webkit-color-swatch {\r\n border: none;\r\n border-radius: 50%;\r\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\r\n }\r\n `,\r\n ],\r\n})\r\nexport class ColorPickerDialogComponent {\r\n public color: string;\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef<ColorPickerDialogComponent>,\r\n @Inject(MAT_DIALOG_DATA) public data: { color: string },\r\n ) {\r\n this.color = data.color;\r\n }\r\n\r\n onColorInput(event: any) {\r\n this.color = event.target.value;\r\n }\r\n\r\n onCancel() {\r\n this.dialogRef.close();\r\n }\r\n\r\n onConfirm() {\r\n this.dialogRef.close(this.color);\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { PersonalizationSettings } from '../../personalization.service';\r\nimport { ColorPickerDialogComponent } from './color-picker-dialog.component';\r\n\r\n@Component({\r\n selector: 'app-preferences-section',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule, MatTooltipModule, MatFormFieldModule, MatSelectModule],\r\n templateUrl: './preferences-section.component.html',\r\n styleUrls: ['./preferences-section.component.scss'],\r\n})\r\nexport class PreferencesSectionComponent {\r\n constructor(private dialog: MatDialog) { }\r\n @Input() settings!: PersonalizationSettings;\r\n @Input() colorTokens: any[] = [];\r\n @Input() isCustomColorSelected = false;\r\n @Input() defaultColor: string = 'default';\r\n\r\n @Output() onThemeSelect = new EventEmitter<'light' | 'dark' | 'auto'>();\r\n @Output() onColorSelect = new EventEmitter<string>();\r\n @Output() onButtonStyleSelect = new EventEmitter<'fab' | 'sidebar' | 'sidebar-top' | 'sidebar-bottom'>();\r\n @Output() onSave = new EventEmitter<void>();\r\n @Output() onReset = new EventEmitter<void>();\r\n\r\n onCustomColorChange(event: Event) {\r\n const color = (event.target as HTMLInputElement).value;\r\n this.onColorSelect.emit(color);\r\n }\r\n\r\n getSelectedColorName(): string {\r\n const current = this.settings.appearance.primaryColor;\r\n if (current === 'default') return 'Default';\r\n\r\n // Fallback for legacy saved hexes that happen to match default\r\n // or finding the named token\r\n const token = this.colorTokens.find(c => c.value.toLowerCase() === current.toLowerCase());\r\n if (token) return token.name === 'Standard' ? 'Default' : token.name;\r\n\r\n return 'Custom';\r\n }\r\n\r\n isCustomColor(): boolean {\r\n const current = this.settings.appearance.primaryColor;\r\n if (current === 'default') return false;\r\n\r\n return !this.colorTokens.some(c => c.value.toLowerCase() === current.toLowerCase());\r\n }\r\n\r\n getThemeIcon(theme: string): string {\r\n switch (theme) {\r\n case 'light': return 'light_mode';\r\n case 'dark': return 'dark_mode';\r\n default: return 'brightness_auto';\r\n }\r\n }\r\n\r\n getThemeLabel(theme: string): string {\r\n switch (theme) {\r\n case 'light': return 'Light Mode';\r\n case 'dark': return 'Dark Mode';\r\n default: return 'System';\r\n }\r\n }\r\n\r\n getStyleIcon(style: string): string {\r\n switch (style) {\r\n case 'fab': return 'radio_button_checked';\r\n case 'sidebar': return 'view_sidebar';\r\n case 'sidebar-top': return 'vertical_align_top';\r\n case 'sidebar-bottom': return 'vertical_align_bottom';\r\n default: return 'radio_button_checked';\r\n }\r\n }\r\n\r\n getStyleLabel(style: string): string {\r\n switch (style) {\r\n case 'fab': return 'FAB';\r\n case 'sidebar': return 'Sidebar';\r\n case 'sidebar-top': return 'Sidebar Top';\r\n case 'sidebar-bottom': return 'Sidebar Bottom';\r\n default: return 'FAB';\r\n }\r\n }\r\n\r\n openCustomColorPicker() {\r\n const dialogRef = this.dialog.open(ColorPickerDialogComponent, {\r\n width: '350px',\r\n data: { color: this.settings.appearance.primaryColor }\r\n });\r\n\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result) {\r\n this.onColorSelect.emit(result);\r\n }\r\n });\r\n }\r\n}\r\n","<div class=\"preferences-container\">\r\n <header class=\"pane-header\">\r\n <h1>Preferences</h1>\r\n <p>Customize how your assistant looks and feels.</p>\r\n </header>\r\n\r\n <div class=\"settings-list\">\r\n <!-- Appearance Row -->\r\n <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Appearance</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\r\n <mat-select\r\n [value]=\"settings.appearance.theme\"\r\n (selectionChange)=\"onThemeSelect.emit($event.value)\"\r\n >\r\n <mat-select-trigger>\r\n <div class=\"selected-option-trigger\">\r\n <mat-icon>{{ getThemeIcon(settings.appearance.theme) }}</mat-icon>\r\n <span>{{ getThemeLabel(settings.appearance.theme) }}</span>\r\n </div>\r\n </mat-select-trigger>\r\n <mat-option value=\"light\">\r\n <div class=\"option-content\">\r\n <mat-icon>light_mode</mat-icon>\r\n <span>Light Mode</span>\r\n </div>\r\n </mat-option>\r\n <mat-option value=\"dark\">\r\n <div class=\"option-content\">\r\n <mat-icon>dark_mode</mat-icon>\r\n <span>Dark Mode</span>\r\n </div>\r\n </mat-option>\r\n <mat-option value=\"auto\">\r\n <div class=\"option-content\">\r\n <mat-icon>brightness_auto</mat-icon>\r\n <span>System</span>\r\n </div>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <!-- Accent Color Row -->\r\n <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Accent color</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\r\n <mat-select\r\n [value]=\"settings.appearance.primaryColor\"\r\n (selectionChange)=\"onColorSelect.emit($event.value)\"\r\n >\r\n <mat-select-trigger>\r\n <div class=\"selected-color-trigger\">\r\n <div\r\n class=\"color-dot\"\r\n [style.background-color]=\"\r\n settings.appearance.primaryColor === 'default'\r\n ? defaultColor\r\n : settings.appearance.primaryColor\r\n \"\r\n ></div>\r\n <span>{{ getSelectedColorName() }}</span>\r\n </div>\r\n </mat-select-trigger>\r\n @for (color of colorTokens; track color.name) {\r\n <mat-option [value]=\"color.value\">\r\n <div class=\"option-content\">\r\n <div\r\n class=\"color-dot\"\r\n [style.background-color]=\"\r\n color.value === 'default' ? defaultColor : color.value\r\n \"\r\n ></div>\r\n <span>{{ color.name === 'Standard' ? 'Default' : color.name }}</span>\r\n </div>\r\n </mat-option>\r\n }\r\n\r\n <!-- Active Custom Color -->\r\n @if (isCustomColor()) {\r\n <mat-option [value]=\"settings.appearance.primaryColor\">\r\n <div class=\"option-content\">\r\n <div\r\n class=\"color-dot\"\r\n [style.background-color]=\"settings.appearance.primaryColor\"\r\n ></div>\r\n <span>Custom</span>\r\n </div>\r\n </mat-option>\r\n }\r\n\r\n <!-- Action to pick new Custom Color -->\r\n <mat-option\r\n [value]=\"'picker-trigger'\"\r\n (click)=\"openCustomColorPicker(); $event.stopPropagation()\"\r\n >\r\n <div class=\"option-content\">\r\n <mat-icon>colorize</mat-icon>\r\n <span>{{ isCustomColor() ? 'Change Custom...' : 'Custom...' }}</span>\r\n </div>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <!-- Trigger Style Row -->\r\n <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Trigger Style</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\">\r\n <mat-select\r\n [value]=\"settings.appearance.buttonStyle\"\r\n (selectionChange)=\"onButtonStyleSelect.emit($event.value)\"\r\n >\r\n <mat-select-trigger>\r\n <div class=\"selected-option-trigger\">\r\n <mat-icon>{{ getStyleIcon(settings.appearance.buttonStyle) }}</mat-icon>\r\n <span>{{ getStyleLabel(settings.appearance.buttonStyle) }}</span>\r\n </div>\r\n </mat-select-trigger>\r\n <mat-option value=\"fab\">\r\n <div class=\"option-content\">\r\n <mat-icon>radio_button_checked</mat-icon>\r\n <span>FAB</span>\r\n </div>\r\n </mat-option>\r\n <mat-option value=\"sidebar\">\r\n <div class=\"option-content\">\r\n <mat-icon>view_sidebar</mat-icon>\r\n <span>Sidebar</span>\r\n </div>\r\n </mat-option>\r\n <mat-option value=\"sidebar-top\">\r\n <div class=\"option-content\">\r\n <mat-icon>vertical_align_top</mat-icon>\r\n <span>Sidebar Top</span>\r\n </div>\r\n </mat-option>\r\n <mat-option value=\"sidebar-bottom\">\r\n <div class=\"option-content\">\r\n <mat-icon>vertical_align_bottom</mat-icon>\r\n <span>Sidebar Bottom</span>\r\n </div>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <!-- Language Placeholder -->\r\n <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Language</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn\">Auto-detect</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Voice Placeholder -->\r\n <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Voice</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn\">Cove</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Data Controls Placeholder -->\r\n <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Data controls</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn\">Manage</button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section-actions\">\r\n <button mat-button class=\"reset-btn\" (click)=\"onReset.emit()\">Reset</button>\r\n <div class=\"spacer\"></div>\r\n <button mat-raised-button color=\"primary\" class=\"save-btn\" (click)=\"onSave.emit()\">\r\n Apply Changes\r\n </button>\r\n </div>\r\n</div>\r\n","export const AppEntity = {\r\n amp: '&',\r\n lt: '<',\r\n gt: '>',\r\n quot: '"',\r\n apos: ''',\r\n at: '@',\r\n};\r\n","import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { AppEntity } from '../../../../constant/html-entities';\r\n\r\n@Component({\r\n selector: 'app-profile-section',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule],\r\n templateUrl: './profile-section.component.html',\r\n styleUrls: ['./profile-section.component.scss'],\r\n})\r\nexport class ProfileSectionComponent {\r\n @Input() username: string = 'User';\r\n @Input() userImageUrl: string | null = null;\r\n @Input() userRole: string = 'Doohbot User';\r\n\r\n appEntity = AppEntity;\r\n\r\n get initials(): string {\r\n return this.username ? this.username.charAt(0).toUpperCase() : 'U';\r\n }\r\n}\r\n","<div class=\"section-pane active\">\r\n <header class=\"pane-header\">\r\n <h1>My Profile</h1>\r\n <p>Manage your account details and personal information.</p>\r\n </header>\r\n\r\n <div class=\"pane-content\">\r\n <div class=\"profile-card\">\r\n <div class=\"avatar-section\">\r\n <div class=\"letter-avatar\" [class.has-image]=\"!!userImageUrl\">\r\n @if (userImageUrl) {\r\n <img [src]=\"userImageUrl\" [alt]=\"username\" class=\"profile-img\" />\r\n } @else {\r\n {{ initials }}\r\n }\r\n </div>\r\n <div class=\"user-main-info\">\r\n <h2>{{ username }}</h2>\r\n <p class=\"role-badge\">{{ userRole }}</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"info-grid\">\r\n <div class=\"info-item\">\r\n <label>Full Name</label>\r\n <div class=\"info-value\">{{ username }}</div>\r\n </div>\r\n <div class=\"info-item\">\r\n <label>Email Address</label>\r\n <div class=\"info-value\">\r\n <div class=\"info-value\">user@adzen.tech</div>\r\n </div>\r\n <!-- Mock/Placeholder for now -->\r\n </div>\r\n <div class=\"info-item\">\r\n <label>Organization</label>\r\n <div class=\"info-value\">Adzen Tech Private Limited</div>\r\n </div>\r\n <div class=\"info-item\">\r\n <label>Member Since</label>\r\n <div class=\"info-value\">January 2026</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-terms-section',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './terms-section.component.html',\r\n styleUrls: ['./terms-section.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class TermsSectionComponent { }\r\n","<div class=\"terms-container\">\r\n <div class=\"terms-header\">\r\n <h3>Terms and Conditions</h3>\r\n <p class=\"last-updated\">Last updated: January 9, 2026</p>\r\n </div>\r\n\r\n <div class=\"terms-content\">\r\n <section>\r\n <h4>1. Acceptance of Terms</h4>\r\n <p>By using Doohbot, you agree to comply with and be bound by these terms and conditions. Please read them\r\n carefully.</p>\r\n </section>\r\n\r\n <section>\r\n <h4>2. Privacy & Data</h4>\r\n <p>We value your privacy. Your chat history and personalization settings are stored locally or securely on\r\n our servers to improve your experience.</p>\r\n </section>\r\n\r\n <section>\r\n <h4>3. Usage Guidelines</h4>\r\n <p>Doohbot is intended for professional use within the Doohclick ecosystem. Misuse or automated scraping is\r\n strictly prohibited.</p>\r\n </section>\r\n\r\n <div class=\"full-terms-link\">\r\n <a href=\"#\">View Full Terms and Conditions →</a>\r\n </div>\r\n </div>\r\n</div>","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { PersonalizationSettings } from '../../personalization.service';\r\n\r\n@Component({\r\n selector: 'app-setting-section',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, MatFormFieldModule, MatInputModule, MatButtonModule],\r\n templateUrl: './setting-section.component.html',\r\n styleUrls: ['./setting-section.component.scss'],\r\n})\r\nexport class SettingSectionComponent {\r\n @Input() settings!: PersonalizationSettings;\r\n @Input() hasChanges = false;\r\n @Output() onSave = new EventEmitter<void>();\r\n}","<div class=\"section-pane active\">\r\n <header class=\"pane-header\">\r\n <h1>Custom Instructions</h1>\r\n <p>Tell us more about yourself and how you want the assistant to respond.</p>\r\n </header>\r\n\r\n <div class=\"pane-content\">\r\n <div class=\"instruction-fields\">\r\n <div class=\"field-item\">\r\n <label>What should the assistant know about you?</label>\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <textarea matInput rows=\"6\" [(ngModel)]=\"settings.customInstructions.aboutUser\"\r\n placeholder=\"e.g. I prefer code examples in TypeScript...\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"field-item\">\r\n <label>How should the assistant respond?</label>\r\n <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n <textarea matInput rows=\"6\" [(ngModel)]=\"settings.customInstructions.responseStyle\"\r\n placeholder=\"e.g. Be concise and use bullet points...\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div class=\"section-actions\">\r\n <div class=\"spacer\"></div>\r\n <button mat-raised-button color=\"primary\" class=\"save-btn\" [disabled]=\"!hasChanges\" (click)=\"onSave.emit()\">\r\n Save\r\n </button>\r\n </div>\r\n</div>","import { Component, Input, Output, EventEmitter, inject, ChangeDetectorRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { DialogService } from '../../../../shared/dialog/dialog.service';\r\nimport { AuthService } from '../../../../core/auth/auth.service';\r\n\r\nexport interface ActiveSession {\r\n id: string;\r\n device: string;\r\n location: string;\r\n created: string;\r\n updated: string;\r\n isCurrent?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'app-account-section',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule, MatButtonModule, MatTooltipModule, MatMenuModule],\r\n templateUrl: './account-section.component.html',\r\n styleUrls: ['./account-section.component.scss']\r\n})\r\nexport class AccountSectionComponent {\r\n private dialogService = inject(DialogService);\r\n private authService = inject(AuthService);\r\n private cd = inject(ChangeDetectorRef);\r\n\r\n @Input() organizationId: string = '';\r\n public isCopied = false;\r\n\r\n ngOnInit() {\r\n if (!this.organizationId) {\r\n this.organizationId = this.authService.getOrganizationId() || '';\r\n }\r\n }\r\n\r\n @Output() onDeleteAllHistory = new EventEmitter<void>();\r\n @Output() onLogoutAll = new EventEmitter<void>();\r\n @Output() onLogoutSession = new EventEmitter<string>();\r\n @Output() onDeleteAccount = new EventEmitter<void>();\r\n\r\n public sessions: ActiveSession[] = [\r\n {\r\n id: 'session-1',\r\n device: 'Chrome (Windows)',\r\n location: 'Kathmandu, Bagmati Province, NP',\r\n created: 'Jan 9, 2026, 9:21 AM',\r\n updated: 'Jan 9, 2026, 9:21 AM',\r\n isCurrent: true\r\n }\r\n ];\r\n\r\n copyOrgId() {\r\n const orgId = this.authService.getOrganizationId();\r\n if (orgId) {\r\n navigator.clipboard.writeText(orgId);\r\n this.isCopied = true;\r\n this.cd.detectChanges();\r\n\r\n setTimeout(() => {\r\n this.isCopied = false;\r\n this.cd.detectChanges();\r\n }, 800);\r\n }\r\n }\r\n\r\n confirmLogoutAll() {\r\n this.dialogService.open({\r\n title: 'Log out of all devices',\r\n message: 'Are you sure you want to log out of all active devices? You will be signed out everywhere except here.',\r\n confirmText: 'Log out all',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'logout'\r\n }).subscribe(confirmed => {\r\n if (confirmed) this.onLogoutAll.emit();\r\n });\r\n }\r\n\r\n confirmLogoutSession(session: ActiveSession) {\r\n this.dialogService.open({\r\n title: 'Log out of session',\r\n message: `Are you sure you want to log out from ${session.device} at ${session.location}?`,\r\n confirmText: 'Log out',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'logout'\r\n }).subscribe(confirmed => {\r\n if (confirmed) this.onLogoutSession.emit(session.id);\r\n });\r\n }\r\n\r\n confirmDeleteAllHistory() {\r\n this.dialogService.open({\r\n title: 'Clear All History',\r\n message: 'Are you sure you want to delete all chat history? This action cannot be undone.',\r\n confirmText: 'Clear All',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'delete_sweep'\r\n }).subscribe(confirmed => {\r\n if (confirmed) this.onDeleteAllHistory.emit();\r\n });\r\n }\r\n\r\n confirmDeleteAccount() {\r\n this.dialogService.open({\r\n title: 'Delete Your Account',\r\n message: 'This will permanently delete your account and all associated data. This action is irreversible. Are you absolutely sure?',\r\n confirmText: 'Delete Account',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'person_remove'\r\n }).subscribe(confirmed => {\r\n if (confirmed) this.onDeleteAccount.emit();\r\n });\r\n }\r\n}\r\n","<div class=\"account-container\">\r\n <div class=\"settings-list\">\r\n\r\n <!-- Delete all chats row -->\r\n <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Delete all chats</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn danger\" (click)=\"confirmDeleteAllHistory()\">Delete all</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Export data row -->\r\n <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Export data</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn\">Export</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Org ID row -->\r\n <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Organization ID</span>\r\n <span class=\"row-sublabel\">Used for workspace identification</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <code class=\"org-id\">{{ organizationId }}</code>\r\n <button mat-icon-button (click)=\"copyOrgId()\" [matTooltip]=\"isCopied ? 'Copied!' : 'Copy ID'\">\r\n <mat-icon>{{ isCopied ? 'check' : 'content_copy' }}</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Logout all row -->\r\n <div class=\"settings-row\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label\">Global Logout</span>\r\n <span class=\"row-sublabel\">Sign out from all active devices</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn danger\" (click)=\"confirmLogoutAll()\">Logout all</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Delete account row -->\r\n <div class=\"settings-row no-border\">\r\n <div class=\"row-info\">\r\n <span class=\"row-label danger-text\">Delete account</span>\r\n <span class=\"row-sublabel\">Permanently delete your profile and data</span>\r\n </div>\r\n <div class=\"row-action\">\r\n <button class=\"pill-btn danger-filled\" (click)=\"confirmDeleteAccount()\">Delete Account</button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Active Sessions Section -->\r\n <div class=\"sessions-section\">\r\n <h3>Active sessions</h3>\r\n <div class=\"sessions-table-container\">\r\n <table class=\"sessions-table\">\r\n <thead>\r\n <tr>\r\n <th>Device</th>\r\n <th>Location</th>\r\n <th>Created</th>\r\n <th>Updated</th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (session of sessions; track session.id) {\r\n <tr [class.current]=\"session.isCurrent\">\r\n <td>\r\n <div class=\"device-cell\">\r\n <mat-icon>{{ session.device.includes('Windows') ? 'laptop' : 'smartphone' }}</mat-icon>\r\n <div class=\"device-info\">\r\n <span class=\"device-name\">{{ session.device }}</span>\r\n @if (session.isCurrent) {\r\n <span class=\"current-badge\">Current</span>\r\n }\r\n </div>\r\n </div>\r\n </td>\r\n <td>{{ session.location }}</td>\r\n <td>{{ session.created }}</td>\r\n <td>{{ session.updated }}</td>\r\n <td class=\"action-cell\">\r\n @if (!session.isCurrent) {\r\n <button mat-icon-button [matMenuTriggerFor]=\"sessionMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #sessionMenu=\"matMenu\" xPosition=\"before\">\r\n <button mat-menu-item (click)=\"confirmLogoutSession(session)\">\r\n <mat-icon>logout</mat-icon>\r\n <span>Log out of session</span>\r\n </button>\r\n </mat-menu>\r\n }\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n</div>","import { DialogService } from './dialog.service';\r\nimport { Observable } from 'rxjs';\r\n\r\n/**\r\n * Utility class for common dialog operations\r\n * Provides reusable dialog configurations for consistency across the application\r\n */\r\nexport class DialogUtils {\r\n /**\r\n * Show a logout confirmation dialog\r\n * @param dialogService The DialogService instance\r\n * @returns Observable that emits true if confirmed, false if cancelled\r\n */\r\n static confirmLogout(dialogService: DialogService): Observable<boolean> {\r\n return dialogService.open({\r\n title: 'Logout',\r\n message: 'Are you sure you want to logout?',\r\n confirmText: 'Logout',\r\n cancelText: 'Cancel',\r\n icon: 'logout',\r\n confirmButtonColor: 'warn',\r\n });\r\n }\r\n\r\n /**\r\n * Show a reset confirmation dialog\r\n * @param dialogService The DialogService instance\r\n * @param itemName Optional name of what is being reset (default: 'preferences')\r\n * @returns Observable that emits true if confirmed, false if cancelled\r\n */\r\n static confirmReset(\r\n dialogService: DialogService,\r\n itemName: string = 'preferences'\r\n ): Observable<boolean> {\r\n return dialogService.open({\r\n title: 'Reset to Defaults',\r\n message: `Are you sure you want to reset ${itemName} to default settings? This action cannot be undone.`,\r\n confirmText: 'Reset',\r\n cancelText: 'Cancel',\r\n icon: 'restart_alt',\r\n confirmButtonColor: 'warn',\r\n });\r\n }\r\n\r\n /**\r\n * Show a delete confirmation dialog\r\n * @param dialogService The DialogService instance\r\n * @param itemName Name of the item being deleted\r\n * @returns Observable that emits true if confirmed, false if cancelled\r\n */\r\n static confirmDelete(\r\n dialogService: DialogService,\r\n itemName: string = 'this item'\r\n ): Observable<boolean> {\r\n return dialogService.open({\r\n title: 'Confirm Delete',\r\n message: `Are you sure you want to delete ${itemName}? This action cannot be undone.`,\r\n confirmText: 'Delete',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'delete_forever',\r\n });\r\n }\r\n\r\n /**\r\n * Show a clear all confirmation dialog\r\n * @param dialogService The DialogService instance\r\n * @param itemName Name of what is being cleared (e.g., 'chat history', 'all sessions')\r\n * @returns Observable that emits true if confirmed, false if cancelled\r\n */\r\n static confirmClearAll(\r\n dialogService: DialogService,\r\n itemName: string = 'all items'\r\n ): Observable<boolean> {\r\n return dialogService.open({\r\n title: 'Clear All',\r\n message: `Are you sure you want to clear ${itemName}? This action cannot be undone.`,\r\n confirmText: 'Clear All',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'delete_sweep',\r\n });\r\n }\r\n\r\n /**\r\n * Show a discard changes confirmation dialog\r\n * @param dialogService The DialogService instance\r\n * @returns Observable that emits true if confirmed, false if cancelled\r\n */\r\n static confirmDiscardChanges(dialogService: DialogService): Observable<boolean> {\r\n return dialogService.open({\r\n title: 'Discard Changes',\r\n message: 'You have unsaved changes. Are you sure you want to discard them?',\r\n confirmText: 'Discard',\r\n cancelText: 'Keep Editing',\r\n confirmButtonColor: 'warn',\r\n icon: 'warning',\r\n });\r\n }\r\n}\r\n\r\n\r\n","import { Component, inject, OnInit } from '@angular/core';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar';\r\nimport { SnackBarError } from '../../core/types/snackbar-error.type';\r\n\r\n@Component({\r\n selector: 'app-snackbar',\r\n templateUrl: './snackbar.component.html',\r\n styleUrls: ['./snackbar.component.scss'],\r\n standalone: true,\r\n imports: [MatIconModule, CommonModule],\r\n})\r\nexport class SnackBar implements OnInit {\r\n private snackBarRef = inject(MatSnackBarRef);\r\n private data = inject(MAT_SNACK_BAR_DATA);\r\n\r\n public message: string | null = null;\r\n public type: SnackBarError = 'error';\r\n\r\n ngOnInit() {\r\n this.message = this.data.message;\r\n this.type = this.data.type || 'error';\r\n }\r\n\r\n close() {\r\n this.snackBarRef.dismiss();\r\n }\r\n\r\n get icon(): string {\r\n switch (this.type) {\r\n case 'success':\r\n return 'check_circle';\r\n case 'error':\r\n return 'error';\r\n case 'warn':\r\n return 'warning';\r\n case 'info':\r\n return 'info';\r\n default:\r\n return 'info';\r\n }\r\n }\r\n}\r\n","<div class=\"snackbar-message\" [ngClass]=\"'type-' + type\">\r\n <div class=\"error-content\">\r\n <mat-icon class=\"alert-icon\">{{ icon }}</mat-icon>\r\n <span class=\"error-text\">{{ message }}</span>\r\n </div>\r\n <mat-icon class=\"close-icon\" (click)=\"close()\">close</mat-icon>\r\n</div>\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { SnackBarError } from '../../core/types/snackbar-error.type';\r\nimport { SnackBar } from './snackbar.component';\r\nimport { SnackbarUtils } from './snackbar.utils';\r\n\r\nexport interface SnackbarConfig {\r\n message: string;\r\n duration?: number;\r\n type: SnackBarError;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SnackbarService {\r\n private snackBar = inject(MatSnackBar);\r\n\r\n constructor() {\r\n SnackbarUtils.init(this);\r\n }\r\n\r\n // Generic show method\r\n private show(message: string, duration: number, type: SnackBarError) {\r\n this.snackBar.openFromComponent(SnackBar, {\r\n duration: duration,\r\n data: { message, type },\r\n horizontalPosition: 'end',\r\n verticalPosition: 'bottom',\r\n panelClass: [`snackbar-${type}`]\r\n });\r\n }\r\n\r\n // Convenience methods\r\n success(message: string, duration: number = 3000) {\r\n this.show(message, duration, 'success');\r\n }\r\n\r\n warn(message: string, duration: number = 5000) {\r\n this.show(message, duration, 'warn');\r\n }\r\n\r\n error(message: string, duration: number = 5000) {\r\n this.show(message, duration, 'error');\r\n }\r\n\r\n info(message: string, duration: number = 4000) {\r\n this.show(message, duration, 'info');\r\n }\r\n\r\n clear() {\r\n this.snackBar.dismiss();\r\n }\r\n}\r\n","import { Component, inject, OnDestroy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatDialogModule, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { PreferencesSectionComponent } from './sections/preferences/preferences-section.component';\r\nimport { ProfileSectionComponent } from './sections/profile/profile-section.component';\r\nimport { TermsSectionComponent } from './sections/terms/terms-section.component';\r\nimport { SettingSectionComponent } from './sections/settings/setting-section.component';\r\nimport { AccountSectionComponent } from './sections/account/account-section.component';\r\nimport { ChatHistoryService } from '../chat/services/chat-history.service';\r\nimport { AuthService } from '../../core/auth/auth.service';\r\nimport { PersonalizationService, PersonalizationSettings } from './personalization.service';\r\nimport { DialogService } from '../../shared/dialog/dialog.service';\r\nimport { DialogUtils } from '../../shared/dialog/dialog.utils';\r\nimport { SnackbarService } from '../../shared/snackbar/snackbar.service';\r\nimport { ThemeService } from '../../core/services/theme.service';\r\n\r\n@Component({\r\n selector: 'app-personalization-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n MatTabsModule,\r\n MatSlideToggleModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatTooltipModule,\r\n PreferencesSectionComponent,\r\n ProfileSectionComponent,\r\n SettingSectionComponent,\r\n TermsSectionComponent,\r\n AccountSectionComponent,\r\n ],\r\n templateUrl: './personalization-dialog.component.html',\r\n styleUrls: ['./personalization-dialog.component.scss'],\r\n})\r\nexport class PersonalizationDialogComponent implements OnDestroy {\r\n private dialogRef = inject(MatDialogRef<PersonalizationDialogComponent>);\r\n private dialogService = inject(DialogService);\r\n public personalization = inject(PersonalizationService);\r\n private authService = inject(AuthService);\r\n private chatHistory = inject(ChatHistoryService);\r\n private snackbar = inject(SnackbarService);\r\n\r\n // Local copy of settings for editing\r\n public settings: PersonalizationSettings = JSON.parse(\r\n JSON.stringify(this.personalization.settings()),\r\n );\r\n\r\n public activeSection = 'profile';\r\n\r\n public sections = [\r\n { id: 'account', label: 'Account', type: 'header' },\r\n { id: 'profile', label: 'My profile', icon: 'person_outline', type: 'item' },\r\n { id: 'account_settings', label: 'Manage Account', icon: 'manage_accounts', type: 'item' },\r\n { id: 'preferences', label: 'Preferences', icon: 'tune', type: 'item' },\r\n { id: 'workspace', label: 'Workspace', type: 'header' },\r\n { id: 'general', label: 'Settings', icon: 'settings', type: 'item' },\r\n { id: 'info', label: 'Support', type: 'header' },\r\n { id: 'terms', label: 'Terms & Conditions', icon: 'description', type: 'item' },\r\n ];\r\n\r\n public colorTokens = [\r\n {\r\n name: 'Standard',\r\n value: 'default',\r\n },\r\n { name: 'Purple', value: '#7c3aed' },\r\n { name: 'Pink', value: '#db2777' },\r\n { name: 'Red', value: '#dc2626' },\r\n { name: 'Orange', value: '#ea580c' },\r\n { name: 'Green', value: '#16a34a' },\r\n { name: 'Teal', value: '#0d9488' },\r\n { name: 'Blue', value: '#2563eb' },\r\n ];\r\n\r\n private themeService = inject(ThemeService);\r\n private originalColor: string = '';\r\n private isSaved = false;\r\n\r\n constructor() {\r\n this.originalColor = this.personalization.settings().appearance.primaryColor;\r\n }\r\n\r\n onSave() {\r\n if (this.activeSection === 'preferences') {\r\n this.isSaved = true;\r\n this.personalization.updateAppearance(this.settings.appearance);\r\n // Re-apply to ensure consistency (effect handles it, but just in case)\r\n this.snackbar.success('Appearance settings saved');\r\n } else if (this.activeSection === 'general') {\r\n this.personalization.updateInstructions(this.settings.customInstructions);\r\n this.snackbar.success('Settings saved');\r\n }\r\n }\r\n\r\n onCancel() {\r\n this.dialogRef.close(false);\r\n // ngOnDestroy will handle revert\r\n }\r\n\r\n ngOnDestroy() {\r\n if (!this.isSaved) {\r\n // Revert to original color if not saved\r\n this.themeService.applyPrimaryColorToGlobal(this.originalColor);\r\n }\r\n }\r\n\r\n onReset() {\r\n DialogUtils.confirmReset(this.dialogService).subscribe((confirmed) => {\r\n if (confirmed) {\r\n // Only reset the current section\r\n if (this.activeSection === 'preferences') {\r\n // Reset only appearance settings to defaults\r\n this.personalization.resetToDefaults();\r\n // Re-clone settings to update UI\r\n this.settings = JSON.parse(JSON.stringify(this.personalization.settings()));\r\n\r\n // Live preview the reset\r\n this.themeService.applyPrimaryColorToGlobal(this.settings.appearance.primaryColor);\r\n }\r\n }\r\n });\r\n }\r\n\r\n selectTheme(theme: 'light' | 'dark' | 'auto') {\r\n this.settings.appearance.theme = theme;\r\n // Optional: Preview theme? User only asked for color.\r\n }\r\n\r\n selectColor(color: string) {\r\n this.settings.appearance.primaryColor = color;\r\n //! Live Preview for changed color\r\n // this.themeService.applyPrimaryColorToGlobal(color);\r\n }\r\n\r\n selectButtonStyle(style: 'fab' | 'sidebar' | 'sidebar-top' | 'sidebar-bottom') {\r\n this.settings.appearance.buttonStyle = style;\r\n }\r\n\r\n selectSection(sectionId: string) {\r\n if (this.sections.find((s) => s.id === sectionId && s.type === 'item')) {\r\n this.activeSection = sectionId;\r\n }\r\n }\r\n\r\n get hasChanges(): boolean {\r\n if (this.activeSection === 'preferences') return this.hasPreferencesChanges();\r\n if (this.activeSection === 'general') return this.hasInstructionChanges();\r\n return false;\r\n }\r\n\r\n hasPreferencesChanges(): boolean {\r\n const original = this.personalization.settings().appearance;\r\n const current = this.settings.appearance;\r\n return JSON.stringify(original) !== JSON.stringify(current);\r\n }\r\n\r\n hasInstructionChanges(): boolean {\r\n const original = this.personalization.settings().customInstructions;\r\n const current = this.settings.customInstructions;\r\n return JSON.stringify(original) !== JSON.stringify(current);\r\n }\r\n\r\n get username(): string {\r\n return this.authService.getLoggedInUserName();\r\n }\r\n\r\n get userImageUrl(): string | null {\r\n return this.authService.getLoggedInUserImageUrl();\r\n }\r\n\r\n get userRole(): string {\r\n return this.authService.getLoggedInUserRole();\r\n }\r\n\r\n isCustomColorSelected(): boolean {\r\n return !this.colorTokens.some(\r\n (token) => token.value.toLowerCase() === this.settings.appearance.primaryColor.toLowerCase(),\r\n );\r\n }\r\n\r\n onCustomColorChange(event: Event) {\r\n const color = (event.target as HTMLInputElement).value;\r\n this.selectColor(color);\r\n }\r\n\r\n deleteAllHistory() {\r\n const userId = this.authService.getUserId() || '';\r\n this.chatHistory.deleteAllHistory(userId.toString()).subscribe(() => {\r\n // History cleared\r\n });\r\n }\r\n\r\n logoutAllDevices() {\r\n console.log('Logging out of all devices...');\r\n // Implement service call when API is ready\r\n }\r\n\r\n deleteAccount() {\r\n console.log('Deleting account...');\r\n // Implement service call when API is ready\r\n }\r\n}\r\n","<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","import {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n TrackByFunction,\r\n OnDestroy,\r\n OnInit,\r\n SimpleChanges,\r\n OnChanges,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\r\nimport { MessageListComponent } from '../message-list/message-list.component';\r\nimport { MessageInputComponent } from '../message-input/message-input.component';\r\nimport { inject } from '@angular/core';\r\nimport { ChatHistorySidebarComponent } from '../chat-history-sidebar/chat-history-sidebar.component';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { AuthService } from '../../../../core/auth/auth.service';\r\nimport { DraggableDialogDirective } from '../../../../core/directives/draggable/draggable-dialog.directive';\r\nimport { ResizableDialogDirective } from '../../../../core/directives/resizable/resizable-dialog.directive';\r\nimport { Message } from '../../../../core/models/message';\r\nimport { DoohbotThemeConfig } from '../../../../core/models/theme-config.model';\r\nimport { ThemeService } from '../../../../core/services/theme.service';\r\nimport { ChatHeaderComponent } from '../chat-header/chat-header.component';\r\nimport { LoginFormComponent } from '../../../login/login-form.component';\r\nimport { ChatFooterComponent } from '../chat-footer/chat-footer.component';\r\nimport logger from '../../../../core/utils/logger.service';\r\nimport { Chips } from '../../../../shared/chips/chips.component';\r\nimport { ChatSession } from '../../model/chat-session.model';\r\nimport { PersonalizationDialogComponent } from '../../../personalization/personalization-dialog.component';\r\n\r\n@Component({\r\n selector: 'app-chat-window',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatIconModule,\r\n MatMenuModule,\r\n Chips,\r\n MessageListComponent,\r\n MessageInputComponent,\r\n DraggableDialogDirective,\r\n ResizableDialogDirective,\r\n ChatHistorySidebarComponent,\r\n ChatHeaderComponent,\r\n LoginFormComponent,\r\n ChatFooterComponent,\r\n FormsModule,\r\n MatDialogModule,\r\n ],\r\n templateUrl: './chat-window.component.html',\r\n styleUrls: ['./chat-window.component.scss'],\r\n})\r\nexport class ChatWindowComponent implements OnInit, OnDestroy, OnChanges {\r\n @Input() isChatOpen: boolean = false;\r\n @Input() enableDrag: boolean = false;\r\n @Input() enableResize: boolean = false;\r\n @Input() isFullScreen: boolean = false;\r\n @Input() isStreaming: boolean = true;\r\n @Input() isAuthenticated: boolean = false;\r\n @Input() appTitle: string = '';\r\n @Input() appLogoUrl: string = '';\r\n @Input() appTextLogoUrl: string = '';\r\n @Input() appHeaderLogoUrl: string = '';\r\n @Input() messages: Message[] = [];\r\n @Input() isBotTyping: boolean = false;\r\n @Input() appSubtitle: string = '';\r\n @Input() welcomeDesc: string = '';\r\n @Input() predefinedMessages: string[] = [];\r\n @Input() suggestedMessages: string[] = [];\r\n @Input() botAvatarUrl: string = '';\r\n @Input() userAvatarUrl: string = '';\r\n @Input() userName: string = '';\r\n @Input() trackByMessageId: TrackByFunction<Message> = (index, item) => item.id ?? index;\r\n @Input() hintText: string = '';\r\n @Input() messageError: string | null = null;\r\n @Input() showSuggestionChips: boolean = false;\r\n @Input() isHistorySidebarOpen: boolean = false;\r\n @Input() chatSessions: ChatSession[] = [];\r\n @Input() chatHistoryUserName: string = 'User';\r\n\r\n @Input() isLoggingIn: boolean = false;\r\n @Input() authError: string | null = null;\r\n @Input() authSuccess: string | null = null;\r\n @Input() isLoadingSessions: boolean = false;\r\n @Input() hasMoreSessions: boolean = false;\r\n @Input() isLoadingMoreSessions: boolean = false;\r\n @Input() processingSessionId: string | null = null;\r\n @Input() themeConfig: DoohbotThemeConfig | undefined;\r\n @Input() buttonStyle: string = 'fab';\r\n\r\n @Output() toggleChat = new EventEmitter<void>();\r\n @Output() toggleFullScreen = new EventEmitter<void>();\r\n @Output() toggleHistorySidebar = new EventEmitter<void>();\r\n @Output() openSettings = new EventEmitter<void>();\r\n @Output() suggestionClick = new EventEmitter<string>();\r\n @Output() send = new EventEmitter<string>();\r\n @Output() stop = new EventEmitter<void>();\r\n @Output() clearMessageError = new EventEmitter<void>();\r\n @Output() clearChat = new EventEmitter<void>();\r\n @Output() sessionSelected = new EventEmitter<ChatSession>();\r\n @Output() sessionDeleted = new EventEmitter<string>();\r\n @Output() loadMoreSessions = new EventEmitter<void>();\r\n @Output() refreshSessions = new EventEmitter<void>();\r\n @Output() sessionRenamed = new EventEmitter<{ sessionId: string; newTitle: string }>();\r\n @Output() deleteAllSessions = new EventEmitter<void>();\r\n\r\n @Output() loginSubmit = new EventEmitter<{\r\n username: string;\r\n password: string;\r\n rememberMe: boolean;\r\n }>();\r\n @Output() logout = new EventEmitter<void>();\r\n\r\n public themeService = inject(ThemeService);\r\n public authService = inject(AuthService);\r\n private dialog = inject(MatDialog);\r\n\r\n // UI state\r\n public showLoginForm = false;\r\n\r\n public get canDrag(): boolean {\r\n return this.enableDrag && this.buttonStyle === 'fab' && !this.isFullScreen;\r\n }\r\n\r\n public get canResize(): boolean {\r\n return this.enableResize && this.buttonStyle === 'fab' && !this.isFullScreen;\r\n }\r\n\r\n constructor() {}\r\n\r\n onToggleChat() {\r\n this.toggleChat.emit();\r\n }\r\n\r\n onToggleHistorySidebar() {\r\n logger.log('History button clicked!');\r\n this.toggleHistorySidebar.emit();\r\n }\r\n\r\n onLoginClick() {\r\n this.showLoginForm = true;\r\n }\r\n\r\n onLoginSubmit(credentials: { username: string; password: string; rememberMe: boolean }) {\r\n this.loginSubmit.emit(credentials);\r\n }\r\n\r\n onCancelLogin() {\r\n this.showLoginForm = false;\r\n }\r\n\r\n onToggleFullScreen() {\r\n this.toggleFullScreen.emit();\r\n }\r\n\r\n onOpenSettings() {\r\n this.openSettings.emit();\r\n }\r\n\r\n onOpenPersonalization() {\r\n this.dialog.open(PersonalizationDialogComponent, {\r\n width: '1100px',\r\n height: '700px',\r\n maxWidth: '95vw',\r\n panelClass: 'personalization-dialog-panel',\r\n });\r\n }\r\n\r\n onSuggestionClick(text: string) {\r\n this.suggestionClick.emit(text);\r\n }\r\n\r\n onSend(text: string) {\r\n this.send.emit(text);\r\n }\r\n\r\n onStop() {\r\n this.stop.emit();\r\n }\r\n\r\n onClearMessageError() {\r\n this.messageError = null;\r\n this.clearMessageError.emit();\r\n }\r\n\r\n onClearAuthError() {\r\n this.clearMessageError.emit();\r\n }\r\n\r\n onClearChat() {\r\n this.clearChat.emit();\r\n }\r\n\r\n onLogout() {\r\n this.logout.emit();\r\n }\r\n\r\n onSessionSelected(session: ChatSession) {\r\n this.sessionSelected.emit(session);\r\n }\r\n\r\n onSessionDeleted(sessionId: string) {\r\n this.sessionDeleted.emit(sessionId);\r\n }\r\n\r\n onSessionRenamed(event: { sessionId: string; newTitle: string }) {\r\n this.sessionRenamed.emit(event);\r\n }\r\n\r\n onDeleteAllSessions() {\r\n this.deleteAllSessions.emit();\r\n }\r\n\r\n onPopoutShown(win: Window) {\r\n // Apply theme classes\r\n const activeTheme = this.themeService.activeTheme();\r\n logger.log('Popout shown, applying theme:', activeTheme);\r\n\r\n const body = win.document.body;\r\n // We cannot use renderer easily on another document without custom renderer factory,\r\n // but native DOM manipulation is fine here since it's a separate window object.\r\n body.classList.remove('light-theme', 'dark-theme');\r\n body.classList.add(activeTheme);\r\n\r\n // Apply CSS variables\r\n this.themeService.applyCssVariables(body, this.themeConfig);\r\n }\r\n\r\n ngOnInit() {\r\n // Initialization logic if needed\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n //? Handle authentication status changes\r\n if (changes['isAuthenticated']) {\r\n if (this.isAuthenticated) {\r\n this.showLoginForm = false;\r\n }\r\n }\r\n\r\n //? Handle logging in status changes\r\n if (changes['isLoggingIn']) {\r\n if (this.isLoggingIn) {\r\n this.showLoginForm = false;\r\n } else if (!this.isAuthenticated && !changes['isLoggingIn'].firstChange) {\r\n this.showLoginForm = true;\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy() {}\r\n}\r\n","@if (isChatOpen) {\r\n <div\r\n draggableDialog\r\n [enableDrag]=\"canDrag\"\r\n resizableDialog\r\n [enableResize]=\"canResize\"\r\n class=\"chat-window\"\r\n [class.fullscreen]=\"isFullScreen\"\r\n [class.layout-sidebar]=\"buttonStyle.includes('sidebar')\"\r\n >\r\n <!-- chat window header -->\r\n <app-chat-header\r\n [appHeaderLogoUrl]=\"appHeaderLogoUrl\"\r\n [isAuthenticated]=\"isAuthenticated\"\r\n [isFullScreen]=\"isFullScreen\"\r\n [settingsMenu]=\"settingsMenu\"\r\n [isNewChatDisabled]=\"messages.length === 0\"\r\n (toggleChat)=\"onToggleChat()\"\r\n (toggleFullScreen)=\"onToggleFullScreen()\"\r\n (toggleHistorySidebar)=\"onToggleHistorySidebar()\"\r\n (clearChat)=\"onClearChat()\"\r\n ></app-chat-header>\r\n\r\n <!-- Main Content Area: Toggle between Messages and History -->\r\n <div class=\"chat-content-wrapper\">\r\n <!-- Chat History View -->\r\n <app-chat-history-sidebar\r\n [class.sidebar-closed]=\"!isHistorySidebarOpen\"\r\n [sessions]=\"chatSessions\"\r\n [isOpen]=\"isHistorySidebarOpen\"\r\n [userName]=\"chatHistoryUserName\"\r\n [isLoading]=\"isLoadingSessions\"\r\n [hasMoreSessions]=\"hasMoreSessions\"\r\n [isLoadingMore]=\"isLoadingMoreSessions\"\r\n [processingSessionId]=\"processingSessionId\"\r\n (sessionSelected)=\"onSessionSelected($event)\"\r\n (sessionDeleted)=\"onSessionDeleted($event)\"\r\n (loadMore)=\"loadMoreSessions.emit()\"\r\n (refresh)=\"refreshSessions.emit()\"\r\n (sessionRenamed)=\"onSessionRenamed($event)\"\r\n (deleteAll)=\"onDeleteAllSessions()\"\r\n (closed)=\"onToggleHistorySidebar()\"\r\n >\r\n </app-chat-history-sidebar>\r\n\r\n <!-- Messages View -->\r\n <div class=\"messages-view\" [class.hidden]=\"isHistorySidebarOpen && !isFullScreen\">\r\n <!-- Messages / Welcome Screen -->\r\n @if (!showLoginForm) {\r\n <app-message-list\r\n [messages]=\"messages\"\r\n [isBotTyping]=\"isBotTyping\"\r\n [isStreaming]=\"isStreaming\"\r\n [appLogoUrl]=\"appLogoUrl\"\r\n [appSubtitle]=\"appSubtitle\"\r\n [welcomeDesc]=\"welcomeDesc\"\r\n [predefinedMessages]=\"predefinedMessages\"\r\n [botAvatarUrl]=\"botAvatarUrl\"\r\n [userAvatarUrl]=\"userAvatarUrl\"\r\n [userName]=\"userName\"\r\n [isAuthenticated]=\"isAuthenticated\"\r\n [isLoggingIn]=\"isLoggingIn\"\r\n [trackByMessageId]=\"trackByMessageId\"\r\n (suggestionClick)=\"onSuggestionClick($event)\"\r\n (loginClick)=\"onLoginClick()\"\r\n ></app-message-list>\r\n }\r\n\r\n @if (showSuggestionChips && isAuthenticated) {\r\n <app-chips\r\n [messages]=\"suggestedMessages\"\r\n [disabled]=\"isBotTyping\"\r\n (chipClick)=\"onSuggestionClick($event)\"\r\n ></app-chips>\r\n }\r\n\r\n <!-- Chat Input: Only show when authenticated -->\r\n @if (isAuthenticated) {\r\n <app-message-input\r\n [isBotTyping]=\"isBotTyping\"\r\n [hintText]=\"hintText\"\r\n (send)=\"onSend($event)\"\r\n (stop)=\"onStop()\"\r\n ></app-message-input>\r\n }\r\n\r\n <!-- Login Form -->\r\n @if (showLoginForm && !isAuthenticated) {\r\n <app-login-form\r\n [isLoggingIn]=\"isLoggingIn\"\r\n (loginSubmit)=\"onLoginSubmit($event)\"\r\n (cancel)=\"onCancelLogin()\"\r\n ></app-login-form>\r\n }\r\n\r\n <!-- Auth error snackbar (login/logout errors only) -->\r\n <!-- <app-snackbar\r\n *ngIf=\"authError\"\r\n [message]=\"authError\"\r\n (closed)=\"onClearAuthError()\"\r\n ></app-snackbar> -->\r\n\r\n <!-- footer -->\r\n <app-chat-footer></app-chat-footer>\r\n </div>\r\n </div>\r\n </div>\r\n}\r\n\r\n<mat-menu #settingsMenu=\"matMenu\">\r\n <!-- Personalization -->\r\n @if (isAuthenticated) {\r\n <button\r\n mat-menu-item\r\n (click)=\"onOpenPersonalization()\"\r\n style=\"display: flex; align-items: center\"\r\n >\r\n <mat-icon>settings_suggest</mat-icon>\r\n <span>Personalization</span>\r\n </button>\r\n }\r\n\r\n <!-- Change Theme -->\r\n\r\n <!-- Full-Screen Button -->\r\n <button mat-menu-item (click)=\"onToggleFullScreen()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>{{ isFullScreen ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\r\n <span> {{ isFullScreen ? 'Minimize' : 'Expand' }}</span>\r\n </button>\r\n\r\n <!-- Clear Chat -->\r\n @if (isAuthenticated && messages.length > 0) {\r\n <button mat-menu-item (click)=\"onClearChat()\" style=\"display: flex; align-items: center\">\r\n <mat-icon> clear_all</mat-icon>\r\n <span>End Chat</span>\r\n </button>\r\n }\r\n\r\n <!-- Logout -->\r\n @if (isAuthenticated) {\r\n <button mat-menu-item (click)=\"onLogout()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>logout</mat-icon>\r\n <span>Logout</span>\r\n </button>\r\n }\r\n</mat-menu>\r\n","import { Directive, ElementRef, Input, Renderer2 } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[appFullscreen]',\r\n standalone: true,\r\n})\r\nexport class FullscreenDirective {\r\n private isFullScreen = false;\r\n private preFullscreenState: {\r\n width: string;\r\n height: string;\r\n left: string;\r\n top: string;\r\n } | null = null;\r\n\r\n @Input() fullscreenTarget: string = '.chat-window';\r\n\r\n constructor(\r\n private el: ElementRef,\r\n private renderer: Renderer2,\r\n ) { }\r\n\r\n public toggle(): void {\r\n const targetEl = this.el.nativeElement.querySelector(this.fullscreenTarget);\r\n if (!targetEl) return;\r\n\r\n if (!this.isFullScreen) {\r\n this.preFullscreenState = {\r\n width: targetEl.style.width,\r\n height: targetEl.style.height,\r\n left: targetEl.style.left,\r\n top: targetEl.style.top,\r\n };\r\n\r\n targetEl.style.width = '';\r\n targetEl.style.height = '';\r\n targetEl.style.left = '';\r\n targetEl.style.top = '';\r\n targetEl.style.transform = '';\r\n\r\n this.isFullScreen = true;\r\n } else {\r\n this.isFullScreen = false;\r\n\r\n if (this.preFullscreenState) {\r\n targetEl.style.width = this.preFullscreenState.width;\r\n targetEl.style.height = this.preFullscreenState.height;\r\n targetEl.style.left = this.preFullscreenState.left;\r\n targetEl.style.top = this.preFullscreenState.top;\r\n targetEl.style.transform = ''; // Clear transform to allow CSS transitions/classes\r\n }\r\n }\r\n }\r\n\r\n public getFullscreenState(): boolean {\r\n return this.isFullScreen;\r\n }\r\n}\r\n","import { inject, Injectable, signal } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport {\r\n LicenseFileContent,\r\n LicenseRegistry,\r\n LicensingContext,\r\n LicensePackage,\r\n} from '../models/license.model';\r\nimport logger from '../utils/logger.service';\r\nimport { CoreConfigService } from './core-config.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class LicenseService {\r\n private http = inject(HttpClient);\r\n private coreConfig = inject(CoreConfigService);\r\n private registry = signal<LicenseRegistry | null>(null);\r\n\r\n /**\r\n * Load the license configuration from a JSON file.\r\n * Supports both Hierarchical (entitlements) and Flat-map (package:key) formats.\r\n * @param filePath Path to the license JSON file\r\n */\r\n async loadLicenseFile(filePath?: string): Promise<void> {\r\n try {\r\n const finalPath = filePath || this.coreConfig.licenseFilePath;\r\n\r\n const data = await firstValueFrom(this.http.get<any>(finalPath));\r\n\r\n if (!data) {\r\n throw new Error('Empty license file');\r\n }\r\n\r\n // Detection: Hierarchical Format (subjectId/licenses array)\r\n if (data.licenses && Array.isArray(data.licenses)) {\r\n this.processHierarchicalLicense(data);\r\n }\r\n // Detection: Flat Map Format (packageId: key)\r\n else {\r\n this.processFlatMapLicense(data);\r\n }\r\n } catch (error) {\r\n // Industry pattern: Silent loading for optional registry files\r\n logger.log(\r\n '[LicenseService] No external license file found or failed to load. Falling back to AppConst.',\r\n );\r\n this.registry.set(null);\r\n }\r\n }\r\n\r\n private processHierarchicalLicense(data: LicenseFileContent): void {\r\n const subjectMap = new Map<string, LicensePackage>();\r\n\r\n data.licenses.forEach((license) => {\r\n const key = `${license.subjectType}:${license.subjectId}`;\r\n subjectMap.set(key, license.packages);\r\n });\r\n\r\n this.registry.set({\r\n accountId: data.accountId,\r\n subjectLicenses: subjectMap,\r\n });\r\n\r\n logger.log(`[LicenseService] Hierarchical Registry loaded for account: ${data.accountId}`);\r\n }\r\n\r\n private processFlatMapLicense(data: Record<string, string>): void {\r\n // Flat-map format: { \"tenantName\": \"license_key\" }\r\n // Convert each entry to: tenant:tenantName -> { doohbot: license_key }\r\n\r\n const subjectMap = new Map<string, LicensePackage>();\r\n\r\n Object.entries(data).forEach(([tenantName, licenseKey]) => {\r\n const tenantKey = `tenant:${tenantName}`;\r\n subjectMap.set(tenantKey, {\r\n doohbot: licenseKey,\r\n });\r\n });\r\n\r\n this.registry.set({\r\n accountId: 'FLAT_MAP_REGISTRY',\r\n subjectLicenses: subjectMap,\r\n });\r\n\r\n logger.log(`[LicenseService] Flat-map registry loaded with ${subjectMap.size} tenant(s)`);\r\n }\r\n\r\n /**\r\n * Resolve the correct license key based on context and requested package\r\n * @param context The current licensing context (tenant, user, roles)\r\n * @param packageId The ID of the package requesting a license\r\n * @returns The resolved license key, or null if unauthorized\r\n */\r\n resolveLicenseKey(context: LicensingContext, packageId: string): string | null {\r\n // Hierarchical Registry (Most Specific)\r\n const keyFromRegistry = this.resolveFromRegistry(context, packageId);\r\n if (keyFromRegistry) return keyFromRegistry;\r\n\r\n logger.warn(\r\n `[LicenseService] No license found for package: ${packageId} and user: ${context.principalId}`,\r\n );\r\n return null;\r\n }\r\n\r\n private resolveFromRegistry(context: LicensingContext, packageId: string): string | null {\r\n const reg = this.registry();\r\n if (!reg) return null;\r\n\r\n // Strict Account Check\r\n if (reg.accountId !== 'EXTERNAL_OVERRIDE' && reg.accountId !== context.tenantId) {\r\n logger.error(\r\n `[LicenseService] Account mismatch! Registry: ${reg.accountId}, Context: ${context.tenantId}`,\r\n );\r\n return null;\r\n }\r\n\r\n const subjectsToSearch = [\r\n `user:${context.principalId}`,\r\n ...(context.roles?.map((r) => `role:${r}`) || []),\r\n `tenant:${context.tenantId}`,\r\n 'tenant:default', // Fallback for flat-map external files\r\n ];\r\n\r\n for (const subjectKey of subjectsToSearch) {\r\n const packages = reg.subjectLicenses.get(subjectKey);\r\n if (packages && packages[packageId]) {\r\n logger.debug(`[LicenseService] Resolved key for ${packageId} via Registry (${subjectKey})`);\r\n return packages[packageId];\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Resolves the license key for the current tenant.\r\n */\r\n resolveTenantLicenseKey(tenancyName?: string): string | null {\r\n const activeTenancy = tenancyName || this.coreConfig.tenancyName;\r\n\r\n if (!activeTenancy) {\r\n logger.warn('[LicenseService] No tenancy name found.');\r\n return null;\r\n }\r\n\r\n const reg = this.registry();\r\n if (!reg) {\r\n logger.error('[LicenseService] License registry not loaded.');\r\n return null;\r\n }\r\n\r\n const tenantLicenses = reg.subjectLicenses.get(`tenant:${activeTenancy}`);\r\n const licenseKey = tenantLicenses?.['doohbot'] || null;\r\n\r\n if (licenseKey) {\r\n logger.info(`[LicenseService] Resolved Doohbot license for: ${activeTenancy}`);\r\n } else {\r\n logger.warn(`[LicenseService] No license key found for tenant: ${activeTenancy}`);\r\n }\r\n\r\n return licenseKey;\r\n }\r\n\r\n /**\r\n * Check if a registry is currently loaded\r\n */\r\n isRegistryLoaded(): boolean {\r\n return this.registry() !== null;\r\n }\r\n}\r\n","// export const environment = {\r\n// staging: false,\r\n// development: false,\r\n// production: true,\r\n// chatApiUrl: 'https://api.production.com',\r\n// apiKey: '',\r\n// };\r\nexport const environment = {\r\n config: 'const/app-const.json',\r\n production: false,\r\n apiBaseUrl: '',\r\n loginEndpoint: '',\r\n apiSegment: 'api/v1/',\r\n};\r\n","import { Injectable } from '@angular/core';\r\nimport { environment } from './environments/environment';\r\nimport { environment as environmentprod } from './environments/environment';\r\nimport { ReplaySubject } from 'rxjs';\r\nimport logger from './utils/logger.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AppConst {\r\n static appBaseUrl = environment.apiBaseUrl;\r\n static data: any;\r\n public config$ = new ReplaySubject<any>(1);\r\n\r\n constructor() {}\r\n\r\n async load(): Promise<any> {\r\n const filePath = `./assets/${environment.production ? environmentprod.config : environment.config}?t=${new Date().getTime()}`;\r\n const response = await fetch(filePath);\r\n\r\n if (!response.ok) {\r\n logger.error('============================ ERROR ============================');\r\n logger.error(`Could not find file ${filePath}`);\r\n logger.error('============================ ERROR ============================');\r\n }\r\n\r\n logger.error('============================ AppConst ============================', filePath);\r\n if (response.ok) {\r\n try {\r\n AppConst.data = await response.json();\r\n this.config$.next(AppConst.data);\r\n logger.error(\r\n '============================ AppConst ============================',\r\n AppConst.data,\r\n );\r\n // Override apiBaseUrl if present in environment\r\n // if (environment.apiBaseUrl) {\r\n // AppConst.data.apiBaseUrl = environment.apiBaseUrl;\r\n // }\r\n // // Override loginEndpoint if present in environment\r\n // if (environment.loginEndpoint) {\r\n // AppConst.data.loginEndpoint = environment.loginEndpoint;\r\n // }\r\n } catch (error: any) {\r\n logger.error('============================ ERROR ============================');\r\n logger.error(`Could not find file ${filePath}.\\nMESSAGE: ${error.message}`);\r\n logger.error('============================ ERROR ============================');\r\n }\r\n\r\n if (AppConst.data && !Object.keys(AppConst.data).length) {\r\n logger.error('============================ ERROR ============================');\r\n logger.error(`No data found in file ${filePath}`);\r\n logger.error('============================ ERROR ============================');\r\n }\r\n } else {\r\n logger.error('============================ ERROR ============================');\r\n logger.error(\r\n `Failed to load file ${filePath}.\\nMESSAGE: Request failed with ${response.status} / ${response.statusText}`,\r\n );\r\n logger.error('============================ ERROR ============================');\r\n }\r\n }\r\n}\r\n","import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';\r\nimport { Injectable, Injector } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { AuthService } from '../auth/auth.service';\r\nimport { LicenseService } from '../services/license.service';\r\n\r\n@Injectable()\r\nexport class LicenseInterceptor implements HttpInterceptor {\r\n constructor(private injector: Injector) {}\r\n\r\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n const authService = this.injector.get(AuthService);\r\n const licenseService = this.injector.get(LicenseService);\r\n\r\n // Skip if this is a login/auth request (AccountService handles it explicitly)\r\n if (\r\n req.url.includes('auth/login') ||\r\n req.url.includes('auth/federated/login') ||\r\n req.url.includes('auth/refresh') ||\r\n req.url.includes('auth/logout')\r\n ) {\r\n return next.handle(req);\r\n }\r\n\r\n // Determine if this is an internal API request\r\n const apiUrl = authService.apiUrl;\r\n\r\n const isInternalApi =\r\n (apiUrl && req.url.startsWith(apiUrl)) ||\r\n (!req.url.startsWith('http') && !req.url.startsWith('assets/'));\r\n\r\n if (!isInternalApi) {\r\n return next.handle(req);\r\n }\r\n\r\n // Resolve License Key for Authenticated Request\r\n const context = authService.getLicensingContext();\r\n // Post-login, context.tenantId should be company_id\r\n const licenseKey = licenseService.resolveLicenseKey(context, '');\r\n\r\n if (licenseKey) {\r\n const clonedReq = req.clone({\r\n headers: req.headers.set('x-license-key', licenseKey),\r\n });\r\n return next.handle(clonedReq);\r\n }\r\n\r\n return next.handle(req);\r\n }\r\n}\r\n","import {\r\n HttpErrorResponse,\r\n HttpEvent,\r\n HttpHandler,\r\n HttpInterceptor,\r\n HttpRequest,\r\n} from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, catchError, filter, Observable, switchMap, take, throwError } from 'rxjs';\r\nimport { AuthService } from '../auth/auth.service';\r\nimport { StorageService } from '../auth/storage.service';\r\nimport { Injector } from '@angular/core';\r\nimport logger from '../utils/logger.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthInterceptor implements HttpInterceptor {\r\n private isRefreshing = false;\r\n private clearingAuth = false; // Prevent multiple clearAuth calls\r\n private refreshTokenSubject: BehaviorSubject<any> = new BehaviorSubject<any>(null);\r\n\r\n constructor(\r\n private tokenStorage: StorageService,\r\n private injector: Injector,\r\n ) {}\r\n\r\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n const authReq = this.getRequestWithHeaders(req);\r\n\r\n return next.handle(authReq).pipe(\r\n catchError((error) => {\r\n // Handle 401 Unauthorized errors\r\n if (\r\n error instanceof HttpErrorResponse &&\r\n error.status === 401 &&\r\n !authReq.url.includes('auth/login') && // Don't retry login\r\n !authReq.url.includes('auth/federated/login') && // Don't retry federated login\r\n !authReq.url.includes('auth/logout') && // Don't retry logout\r\n !authReq.url.includes('auth/refresh') // Don't retry refresh itself\r\n ) {\r\n logger.error('[AuthInterceptor] 401 Unauthorized:', {\r\n url: authReq.url,\r\n userId: this.tokenStorage.get('user_id'),\r\n });\r\n return this.handle401Error(authReq, next);\r\n }\r\n return throwError(() => error);\r\n }),\r\n );\r\n }\r\n\r\n private handle401Error(request: HttpRequest<any>, next: HttpHandler) {\r\n // If already clearing, don't retry\r\n if (this.clearingAuth) {\r\n logger.log('[AuthInterceptor] Already clearing auth, rejecting request');\r\n return throwError(() => new Error('Authentication cleared'));\r\n }\r\n\r\n if (!this.isRefreshing) {\r\n this.isRefreshing = true;\r\n this.refreshTokenSubject.next(null);\r\n\r\n const authService = this.injector.get(AuthService);\r\n return authService.refreshToken().pipe(\r\n switchMap((token: any) => {\r\n this.isRefreshing = false;\r\n this.refreshTokenSubject.next(token.access_token);\r\n // Retry the original request with the new token\r\n return next.handle(this.getRequestWithHeaders(request));\r\n }),\r\n catchError((err) => {\r\n this.isRefreshing = false;\r\n // Refresh failed - logout user (only once)\r\n if (!this.clearingAuth) {\r\n this.clearingAuth = true;\r\n const authService = this.injector.get(AuthService);\r\n authService.clearAuth();\r\n this.clearingAuth = false;\r\n }\r\n return throwError(() => err);\r\n }),\r\n );\r\n } else {\r\n // Wait while getting new token\r\n return this.refreshTokenSubject.pipe(\r\n filter((token) => token != null),\r\n take(1),\r\n switchMap((jwt) => {\r\n // Rewrite with new token and retry\r\n return next.handle(this.getRequestWithHeaders(request));\r\n }),\r\n );\r\n }\r\n }\r\n\r\n getRequestWithHeaders(req: HttpRequest<any>): HttpRequest<any> {\r\n // Skip adding token for login/refresh/logout endpoints\r\n if (\r\n req.url.includes('auth/login') ||\r\n req.url.includes('auth/federated/login') ||\r\n req.url.includes('auth/refresh') ||\r\n req.url.includes('auth/logout')\r\n ) {\r\n return req;\r\n }\r\n\r\n let headers = req.headers;\r\n // Get fresh token from new storage service\r\n const token = this.tokenStorage.get('access_token') ?? '';\r\n\r\n if (token != '') {\r\n headers = headers.set('authorization', `Bearer ${token}`);\r\n }\r\n\r\n return req.clone({ headers });\r\n }\r\n}\r\n","import {\r\n APP_INITIALIZER,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n ElementRef,\r\n inject,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Renderer2,\r\n signal,\r\n SimpleChanges,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { DoohbotConst } from './constant/doohbot-constant';\r\nimport { LoginRequest } from './core/auth/models/login-request.model';\r\nimport { FederatedLoginRequest } from './core/auth/models/federated-login-request.model';\r\nimport { AuthService } from './core/auth/auth.service';\r\nimport logger from './core/utils/logger.service';\r\nimport { ThemeService } from './core/services/theme.service';\r\nimport { PredefinedMessages, SuggestedMessages } from './predefined_messages';\r\nimport { DoohbotInput } from './doohbot-input';\r\nimport { DoohbotApiConfig } from './core/models/api-config.model';\r\nimport { DoohbotThemeConfig } from './core/models/theme-config.model';\r\nimport { ChatButtonComponent } from './app/chat/components/chat-button/chat-button.component';\r\nimport { ChatWindowComponent } from './app/chat/components/chat-window/chat-window.component';\r\nimport { FullscreenDirective } from './core/directives/fullscreen/fullscreen.directive';\r\nimport { ChatHistoryService } from './app/chat/services/chat-history.service';\r\nimport { ChatUIStateService } from './app/chat/chat-ui-state.service';\r\nimport { ChatSession } from './app/chat/model/chat-session.model';\r\nimport { AuthStatus } from './core/types/auth-status.type';\r\nimport { ChatService } from './app/chat/chat.service';\r\nimport { DialogService } from './shared/dialog/dialog.service';\r\nimport { DialogUtils } from './shared/dialog/dialog.utils';\r\nimport { SnackbarService } from './shared/snackbar/snackbar.service';\r\nimport { PersonalizationService } from './app/personalization/personalization.service';\r\nimport { LicenseService } from './core/services/license.service';\r\nimport { AppConst } from './core/app-const';\r\nimport { LicenseInterceptor } from './core/interceptors/license.interceptor';\r\nimport { AuthInterceptor } from './core/interceptors/auth.interceptor';\r\nimport { CommonModule } from '@angular/common';\r\nimport { bootstrapApplication } from '@angular/platform-browser';\r\nimport { HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';\r\n\r\n@Component({\r\n selector: 'app-doohbot',\r\n standalone: true,\r\n imports: [CommonModule, ChatButtonComponent, ChatWindowComponent, FullscreenDirective],\r\n templateUrl: './doohbot.component.html',\r\n styleUrls: ['./doohbot.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class Doohbot extends DoohbotInput implements OnInit, OnDestroy {\r\n //! ======================= INPUTS ==========================\r\n\r\n @Input() config: DoohbotInput = new DoohbotInput();\r\n @Input() override buttonStyle?: 'fab' | 'sidebar' | 'sidebar-top' | 'sidebar-bottom' = 'fab';\r\n @Input() enableDrag: boolean = false;\r\n @Input() enableResize: boolean = false;\r\n @Input() apiConfig?: DoohbotApiConfig;\r\n @Input() themeConfig: DoohbotThemeConfig | undefined;\r\n\r\n //! ==================== SERVICES ======================\r\n\r\n private chatHistory = inject(ChatHistoryService);\r\n private uiState = inject(ChatUIStateService);\r\n private themeService = inject(ThemeService);\r\n private authService = inject(AuthService);\r\n private chatService = inject(ChatService);\r\n private dialogService = inject(DialogService);\r\n private snackbarService = inject(SnackbarService);\r\n private personalization = inject(PersonalizationService);\r\n private licenseService = inject(LicenseService);\r\n\r\n //! ========================= EXPOSED STATE FROM SERVICES ============================\r\n\r\n // UI State signals\r\n public isChatOpen = this.uiState.isChatOpen;\r\n public isHistorySidebarOpen = this.uiState.isHistorySidebarOpen;\r\n public isFullScreen = this.uiState.isFullScreen;\r\n public unreadCount = this.uiState.unreadCount;\r\n\r\n // Chat State signals\r\n public messages = this.chatService.messages;\r\n public isBotTyping = this.chatService.isBotTyping;\r\n public isStreaming = this.chatService.isStreaming;\r\n public messageError = computed(() => this.chatService.apiError()?.message || null);\r\n public showSuggestionChips = this.chatService.showSuggestionChips;\r\n public chatSessions = this.chatHistory.sessions;\r\n public hasMoreHistory = this.chatHistory.hasMore;\r\n public isLoadingMore = this.chatHistory.isLoadingMore;\r\n public isLoadingSessions = this.chatHistory.isLoading;\r\n public processingSessionId = this.chatHistory.processingSessionId;\r\n\r\n // Auth State signals\r\n // public isAuthenticated = this.chatFacade.isAuthenticated;\r\n\r\n public isLoggingIn = this.authService.isLoggingIn;\r\n public authError = this.authService.authError;\r\n public authSuccess = this.authService.authSuccess;\r\n\r\n // Personalization\r\n public activeButtonStyle = computed(() => this.personalization.settings().appearance.buttonStyle);\r\n\r\n //! ======================= COMPONENT-SPECIFIC STATE =====================\r\n\r\n public userName = 'User';\r\n public predefinedMessages: string[] = PredefinedMessages;\r\n public suggestedMessages: string[] = SuggestedMessages;\r\n\r\n public maxMessageLength = 1000;\r\n\r\n // Constants\r\n readonly DoohbotConst = DoohbotConst;\r\n\r\n // Context cleanup\r\n private contextCleanup?: () => void;\r\n\r\n // Reactive state\r\n public authStatus = signal<AuthStatus>(this.authService.authStatus);\r\n public isAuthenticated = signal<boolean>(this.authStatus() === 'authenticated');\r\n\r\n //! ========================= VIEW CHILDREN ======================\r\n\r\n @ViewChild(ChatWindowComponent, { read: ElementRef }) chatWindowRef!: ElementRef;\r\n @ViewChild(FullscreenDirective) fullscreenDirective!: FullscreenDirective;\r\n\r\n //! ======================= CONSTRUCTOR ========================\r\n\r\n constructor(\r\n private elementRef: ElementRef,\r\n private renderer: Renderer2,\r\n ) {\r\n super();\r\n\r\n // Setup messages signal ref for UI state service\r\n this.uiState.setMessagesSignal(this.chatService.messages);\r\n\r\n // Theme management effect\r\n effect(() => {\r\n const activeTheme = this.themeService.activeTheme();\r\n const host = this.elementRef.nativeElement;\r\n this.renderer.removeClass(host, 'light-theme');\r\n this.renderer.removeClass(host, 'dark-theme');\r\n this.renderer.addClass(host, activeTheme);\r\n });\r\n }\r\n\r\n //! ====================== LIFECYCLE HOOKS =====================\r\n // Corrected structural integrity.\r\n\r\n async ngOnInit() {\r\n logger.log('Initializing Doohbot component...');\r\n\r\n // Load license registry from file and wait for it to complete\r\n if (this.config.licenseFilePath) {\r\n await this.licenseService.loadLicenseFile(this.config.licenseFilePath);\r\n }\r\n\r\n // Run validation once on startup\r\n this.authService.validateStoredToken().subscribe();\r\n\r\n // React to auth status changes\r\n this.authService.authStatus$.subscribe((status) => {\r\n const wasAuthenticated = this.isAuthenticated();\r\n this.authStatus.set(status);\r\n this.isAuthenticated.set(status === 'authenticated');\r\n\r\n if (status === 'authenticated' && !wasAuthenticated) {\r\n this.initializeUI();\r\n }\r\n });\r\n\r\n // Handle initial state\r\n if (this.isAuthenticated()) {\r\n this.initializeUI();\r\n } else {\r\n //! STRICT VALIDATION: Only attempt federated login if we have the necessary configuration\r\n const hasAuthToken = !!this.config.authToken;\r\n\r\n // STRICT VALIDATION: We need both Token AND Valid License Context to proceed\r\n if (this.canAttemptFederatedLogin()) {\r\n logger.log('Attempting federated login...');\r\n await this.onFederatedLogin();\r\n // If federated login failed, the login screen will be shown automatically\r\n // via the auth status subscription above\r\n } else {\r\n logger.info(\r\n 'Insufficient config for federated login (Need Token + TenancyName/LicenseKey). Waiting for user login.',\r\n );\r\n }\r\n }\r\n }\r\n\r\n private canAttemptFederatedLogin(): boolean {\r\n const hasAuthToken = !!this.config.authToken;\r\n\r\n const hasDirectLicenseKey = !!this.config.licenseKey;\r\n const hasTenantLicenseLookup = !!this.config.tenancyName && !!this.config.licenseFilePath;\r\n\r\n const hasValidLicenseContext = hasDirectLicenseKey || hasTenantLicenseLookup;\r\n\r\n return hasAuthToken && hasValidLicenseContext;\r\n }\r\n\r\n private initializeUI() {\r\n // Apply theme\r\n if (this.themeConfig) {\r\n this.themeService.setThemeConfig(this.themeConfig, this.elementRef.nativeElement);\r\n }\r\n\r\n // Set user metadata\r\n this.userAvatarUrl();\r\n this.updateUserName();\r\n\r\n // Start new session\r\n this.chatService.startNewSession();\r\n\r\n // Subscribe to context changes if not already\r\n if (!this.contextCleanup) {\r\n this.uiState.resetLastRead();\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n // Handle user context changes\r\n if (changes['userContext']) {\r\n // this.chatFacade.handleUserContextChange(this.userContext);\r\n this.updateUserName();\r\n\r\n // Reset UI state and re-authenticate\r\n this.uiState.closeChat();\r\n this.uiState.closeHistorySidebar();\r\n }\r\n\r\n // Handle config changes\r\n if (changes['config']) {\r\n this.authService.updateConfig(this.config);\r\n this.userAvatarUrl();\r\n this.updateUserName();\r\n\r\n if (this.config.licenseKey) {\r\n this.authService.setLicenseKey(this.config.licenseKey);\r\n }\r\n\r\n if (this.config.buttonStyle || this.buttonStyle) {\r\n this.personalization.setDeveloperDefaults({\r\n buttonStyle: this.buttonStyle || this.config.buttonStyle,\r\n });\r\n }\r\n\r\n // Handle dynamic config updates for authentication\r\n if (!this.isAuthenticated()) {\r\n const token = this.config.authToken;\r\n // Validate Config before attempting\r\n if (token && this.canAttemptFederatedLogin()) {\r\n this.onFederatedLogin(token);\r\n }\r\n }\r\n }\r\n\r\n if (changes['buttonStyle'] && this.buttonStyle) {\r\n this.personalization.setDeveloperDefaults({ buttonStyle: this.buttonStyle });\r\n }\r\n\r\n if (changes['themeConfig']) {\r\n if (this.themeConfig) {\r\n this.themeService.setThemeConfig(this.themeConfig, this.elementRef.nativeElement);\r\n }\r\n if (this.themeConfig?.primaryColor) {\r\n this.personalization.setDeveloperDefaults({ primaryColor: this.themeConfig.primaryColor });\r\n }\r\n }\r\n\r\n // Handle Color Inputs\r\n if (changes['config'] && (this.config.primaryColor || this.config.accentColor)) {\r\n const defaults: any = {};\r\n if (this.config.primaryColor) defaults.primaryColor = this.config.primaryColor;\r\n if (this.config.accentColor) defaults.primaryColor = this.config.accentColor;\r\n\r\n this.personalization.setDeveloperDefaults(defaults);\r\n }\r\n }\r\n\r\n //! ====================== AUTHENTICATION ==================\r\n // Logic moved to ChatFacadeService.initialize()\r\n\r\n onNormalLogin(credentials: LoginRequest): void {\r\n // Use Tenancy Name from Config Input\r\n let tenancy = this.config.tenancyName;\r\n\r\n //! fallback: Try to resolve from global utility (Auto-detect)\r\n // if (!tenancy) {\r\n // tenancy = window.AppPreBootstrap?.resolveTenancyName(window.AppConsts?.appBaseUrl);\r\n // }\r\n\r\n // Resolve key from whatever tenancy we found\r\n let autoKey = this.licenseService.resolveTenantLicenseKey(tenancy || undefined);\r\n\r\n // Inject for strict validation\r\n if (autoKey) {\r\n credentials.license = autoKey;\r\n // Also set it in service usage context for this session\r\n this.authService.setLicenseKey(autoKey);\r\n }\r\n\r\n this.authService.login(credentials, false);\r\n }\r\n\r\n async onFederatedLogin(token?: string): Promise<void> {\r\n // Resolve Key from tenancy name\r\n let autoKey = this.licenseService.resolveTenantLicenseKey();\r\n\r\n // Fallback to Config Input\r\n if (!autoKey) {\r\n autoKey = this.config.licenseKey || '';\r\n }\r\n\r\n if (autoKey) {\r\n this.authService.setLicenseKey(autoKey);\r\n }\r\n\r\n const request: Partial<FederatedLoginRequest> = {\r\n accessToken: token,\r\n rememberMe: this.config.rememberMe,\r\n license: autoKey,\r\n };\r\n\r\n // Await the federated login result\r\n const success = await this.authService.federatedLogin(request);\r\n\r\n if (!success) {\r\n logger.info('Federated login failed. User can proceed with normal login.');\r\n }\r\n }\r\n\r\n performLogout(): void {\r\n DialogUtils.confirmLogout(this.dialogService).subscribe((confirmed) => {\r\n if (confirmed) {\r\n // Invalidate history cache before logout\r\n this.chatHistory.invalidateCache();\r\n this.authService.logout();\r\n }\r\n });\r\n }\r\n\r\n //! ====================== CHAT OPERATIONS =====================\r\n\r\n toggleChat(): void {\r\n this.uiState.toggleChat();\r\n }\r\n\r\n async sendMessage(text: string): Promise<void> {\r\n await this.chatService.sendMessage(text, this.maxMessageLength);\r\n // Invalidate cache after sending message\r\n this.chatHistory.invalidateCache();\r\n }\r\n\r\n onStopRequest(): void {\r\n logger.log('Stopping chat request...');\r\n this.chatService.cancelRequest();\r\n }\r\n\r\n clearChat(): void {\r\n const userId = this.authService.getUserId() || '';\r\n // this.chatService.cancelRequest();\r\n this.chatService.clearMessages();\r\n }\r\n\r\n clearMessageError(): void {\r\n this.chatService.apiError.set(null);\r\n }\r\n\r\n //! ===================== SESSION MANAGEMENT =======================\r\n\r\n toggleHistorySidebar(): void {\r\n const isNowOpen = !this.uiState.isHistorySidebarOpen();\r\n if (isNowOpen) {\r\n // Only load if not already cached\r\n this.loadUserSessions();\r\n }\r\n this.uiState.toggleHistorySidebar();\r\n }\r\n\r\n loadChatSession(session: ChatSession): void {\r\n logger.log(`Session selected: ${session.id}. continuing session...`);\r\n this.chatService.continueSession(session.id);\r\n this.uiState.closeHistorySidebar();\r\n }\r\n\r\n deleteSession(sessionId: string): void {\r\n logger.log(`Deleting session: ${sessionId}`);\r\n const userId = this.authService.getUserId() || '';\r\n this.chatHistory.deleteSession(sessionId, userId.toString()).subscribe(() => {\r\n // Invalidate cache after deletion\r\n this.chatHistory.invalidateCache();\r\n\r\n // If deleted session is currently active, start a new one\r\n const activeSession = this.chatService.getActiveSession();\r\n if (activeSession?.id === sessionId) {\r\n logger.log('Active session was deleted, starting a new one.');\r\n this.chatService.startNewSession();\r\n }\r\n });\r\n }\r\n\r\n //! deleteAllSessions\r\n\r\n deleteAllSessions(): void {\r\n logger.log('Deleting all chat sessions');\r\n const userId = this.authService.getUserId() || '';\r\n this.chatHistory.deleteAllHistory(userId.toString()).subscribe({\r\n next: () => {\r\n this.chatService.clearMessages();\r\n },\r\n });\r\n }\r\n\r\n renameSession(event: { sessionId: string; newTitle: string }): void {\r\n logger.log(`Renaming session ${event.sessionId} to ${event.newTitle}`);\r\n const userId = this.authService.getUserId() || '';\r\n this.chatHistory\r\n .updateSessionTitle(event.sessionId, event.newTitle, userId.toString())\r\n .subscribe((success) => {\r\n if (success) {\r\n // If updated session is currently active, update its title in ChatService\r\n const activeSession = this.chatService.getActiveSession();\r\n if (activeSession?.id === event.sessionId) {\r\n activeSession.title = event.newTitle;\r\n }\r\n }\r\n });\r\n }\r\n\r\n private loadUserSessions(): void {\r\n const userId = this.authService.getUserId() || '';\r\n logger.log(`Initiating loadUserSessions for user: ${userId}`);\r\n this.chatHistory.loadSessions(userId.toString());\r\n }\r\n\r\n /**\r\n * Load more sessions for infinite scroll\r\n */\r\n loadMoreHistory(): void {\r\n const userId = this.authService.getUserId() || '';\r\n logger.log(`Loading more sessions for user: ${userId}`);\r\n this.chatHistory.loadMoreSessions(userId.toString());\r\n }\r\n\r\n /**\r\n * Manually refresh history\r\n */\r\n refreshHistory(): void {\r\n const userId = this.authService.getUserId() || '';\r\n logger.log(`Refreshing sessions for user: ${userId}`);\r\n this.chatHistory.invalidateCache();\r\n this.chatHistory.loadSessions(userId.toString(), true); // force refresh\r\n }\r\n\r\n //! ======================== FULLSCREEN =====================\r\n\r\n toggleFullScreen(): void {\r\n if (this.fullscreenDirective) {\r\n this.fullscreenDirective.toggle();\r\n const isFullscreen = this.fullscreenDirective.getFullscreenState();\r\n this.uiState.setFullscreen(isFullscreen);\r\n }\r\n }\r\n\r\n //! ================== UTILITY METHODS =======================\r\n\r\n trackByMessageId(index: number, item: any): string {\r\n return item.id || index.toString();\r\n }\r\n\r\n /**\r\n * Resolve and update the username from all available sources\r\n */\r\n private updateUserName(): void {\r\n if (!this.isAuthenticated()) {\r\n this.userName = '';\r\n return;\r\n }\r\n\r\n const loggedInName = this.authService.getLoggedInUserName();\r\n // const contextName = this.userContext?.userName;\r\n const configName = this.config.username;\r\n\r\n if (configName) {\r\n this.userName = configName;\r\n } else if (loggedInName) {\r\n this.userName = loggedInName;\r\n } else {\r\n this.userName = 'User';\r\n }\r\n\r\n logger.log('Resolved userName:', this.userName);\r\n }\r\n\r\n userAvatarUrl(): string {\r\n return DoohbotConst.userAvatar;\r\n }\r\n\r\n ngOnDestroy() {\r\n // Clean up subscriptions\r\n if (this.contextCleanup) {\r\n this.contextCleanup();\r\n }\r\n\r\n this.chatService.cancelRequest();\r\n }\r\n}\r\n\r\n//! ================== INITIALIZATION =======================\r\n\r\nexport function initializeApp() {\r\n const appConst = inject(AppConst);\r\n return appConst.load(); // Returns a Promise\r\n}\r\n\r\nbootstrapApplication(Doohbot, {\r\n providers: [\r\n provideHttpClient(withInterceptorsFromDi()),\r\n AppConst,\r\n {\r\n provide: APP_INITIALIZER,\r\n useFactory: initializeApp,\r\n multi: true,\r\n },\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: AuthInterceptor,\r\n multi: true,\r\n },\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: LicenseInterceptor,\r\n multi: true,\r\n },\r\n ],\r\n});\r\n","<app-chat-button [buttonStyle]=\"activeButtonStyle()\" [isChatOpen]=\"isChatOpen()\" [unreadCount]=\"unreadCount()\"\r\n [appTitle]=\"DoohbotConst.appTitle\" [appLogoUrl]=\"DoohbotConst.appLogo\" [appTextLogoUrl]=\"DoohbotConst.appTextLogo\"\r\n (toggle)=\"toggleChat()\"></app-chat-button>\r\n\r\n@if (isChatOpen()) {\r\n<app-chat-window appFullscreen [isChatOpen]=\"isChatOpen()\" [enableDrag]=\"enableDrag\" [enableResize]=\"enableResize\"\r\n [isFullScreen]=\"isFullScreen()\" [appTitle]=\"DoohbotConst.appTitle\" [appLogoUrl]=\"DoohbotConst.appLogo\"\r\n [appTextLogoUrl]=\"DoohbotConst.appTextLogo\" [appHeaderLogoUrl]=\"DoohbotConst.appHeaderLogo\" [messages]=\"messages()\"\r\n [isBotTyping]=\"isBotTyping()\" [isStreaming]=\"isStreaming()\" [appSubtitle]=\"DoohbotConst.appSubtitle\"\r\n [welcomeDesc]=\"DoohbotConst.welcomeDescription\" [predefinedMessages]=\"predefinedMessages\"\r\n [suggestedMessages]=\"suggestedMessages\" [botAvatarUrl]=\"DoohbotConst.botAvatar\"\r\n [userAvatarUrl]=\"DoohbotConst.userAvatar\" [userName]=\"userName\" [trackByMessageId]=\"trackByMessageId\"\r\n [hintText]=\"DoohbotConst.hintText\" [messageError]=\"messageError()\" [showSuggestionChips]=\"showSuggestionChips()\"\r\n [buttonStyle]=\"activeButtonStyle()\" [isHistorySidebarOpen]=\"isHistorySidebarOpen()\" [chatSessions]=\"chatSessions()\"\r\n [isLoadingSessions]=\"isLoadingSessions()\" [processingSessionId]=\"processingSessionId()\"\r\n [hasMoreSessions]=\"hasMoreHistory()\" [isLoadingMoreSessions]=\"isLoadingMore()\" [chatHistoryUserName]=\"userName\"\r\n [isLoggingIn]=\"isLoggingIn()\" [isAuthenticated]=\"isAuthenticated()\" [authError]=\"authError()\"\r\n [authSuccess]=\"authSuccess()\" (toggleChat)=\"toggleChat()\" (loginSubmit)=\"onNormalLogin($event)\"\r\n (toggleFullScreen)=\"toggleFullScreen()\" (toggleHistorySidebar)=\"toggleHistorySidebar()\"\r\n (sessionSelected)=\"loadChatSession($event)\" (sessionDeleted)=\"deleteSession($event)\"\r\n (sessionRenamed)=\"renameSession($event)\" (loadMoreSessions)=\"loadMoreHistory()\" (refreshSessions)=\"refreshHistory()\"\r\n (suggestionClick)=\"sendMessage($event)\" (send)=\"sendMessage($event)\" (stop)=\"onStopRequest()\"\r\n (clearMessageError)=\"clearMessageError()\" (clearChat)=\"clearChat()\" (deleteAllSessions)=\"deleteAllSessions()\"\r\n (logout)=\"performLogout()\"></app-chat-window>\r\n}\r\n\r\n<!-- Skeleton Loader while auth is unknown or refreshing -->\r\n<!-- @if (isChatOpen() && (authStatus() === 'expired')) {\r\n<div class=\"auth-loading-skeleton\">\r\n <div class=\"skeleton-header\"></div>\r\n <div class=\"skeleton-messages\"></div>\r\n <div class=\"skeleton-input\"></div>\r\n</div>\r\n} -->","import { InjectionToken } from '@angular/core';\r\nimport { environment } from '../environments/environment.prod';\r\n\r\n/**\r\n * Configuration for Doohbot API integration\r\n */\r\nexport interface DoohbotApiConfig {\r\n /**\r\n * Backend API endpoint URL\r\n * Example: 'https://api.example.com/chat'\r\n */\r\n apiUrl: string;\r\n\r\n /**\r\n * Optional API key for authentication\r\n */\r\n apiKey?: string;\r\n\r\n /**\r\n * Request timeout in milliseconds\r\n * @default 30000 (30 seconds)\r\n */\r\n timeout?: number; // no need\r\n\r\n /**\r\n * Enable API mode (true) or use local intent matching (false)\r\n * @default false\r\n */\r\n enableApi?: boolean; // no need\r\n\r\n /**\r\n * Include message history in API requests\r\n * @default false\r\n */\r\n includeHistory?: boolean; // no need\r\n\r\n /**\r\n * Maximum number of history messages to include in requests\r\n * @default 10\r\n */\r\n maxHistoryMessages?: number; // no need\r\n\r\n /**\r\n * Custom headers to include in API requests\r\n */\r\n customHeaders?: Record<string, string>;\r\n\r\n /**\r\n * Enable retry on failure\r\n * @default true\r\n */\r\n enableRetry?: boolean;\r\n\r\n /**\r\n * Number of retry attempts\r\n * @default 2\r\n */\r\n retryAttempts?: number;\r\n\r\n /**\r\n * Delay between retries in milliseconds\r\n * @default 1000\r\n */\r\n retryDelay?: number;\r\n}\r\n\r\n/**\r\n * Injection token for providing Doohbot API configuration\r\n */\r\nexport const DOOHBOT_API_CONFIG = new InjectionToken<DoohbotApiConfig>('DOOHBOT_API_CONFIG', {\r\n providedIn: 'root',\r\n factory: () => ({\r\n apiUrl: '',\r\n timeout: 30000,\r\n enableApi: false,\r\n includeHistory: false,\r\n maxHistoryMessages: 10,\r\n enableRetry: true,\r\n retryAttempts: 2,\r\n retryDelay: 1000,\r\n }),\r\n});\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-menu-item',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './menu-item.component.html',\r\n styleUrl: './menu-item.component.scss',\r\n})\r\nexport class MenuItem {\r\n @Input() href = '#';\r\n @Output() selected = new EventEmitter<void>();\r\n\r\n onClick(event: Event): void {\r\n // Optional: prevent default if used for actions, not navigation\r\n // event.preventDefault();\r\n\r\n this.selected.emit();\r\n }\r\n}\r\n","<li>\r\n <a [href]=\"href\" (click)=\"onClick($event)\">\r\n <ng-content></ng-content>\r\n </a>\r\n</li>\r\n","import {\r\n AfterContentInit,\r\n Component,\r\n ContentChildren,\r\n ElementRef,\r\n QueryList,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { MenuItem } from '../menu-item/menu-item.component';\r\n\r\n@Component({\r\n selector: 'app-dropdown-menu',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './dropdown-menu.component.html',\r\n styleUrl: './dropdown-menu.component.scss',\r\n})\r\nexport class DropdownMenu implements AfterContentInit {\r\n @ViewChild('details') detailsRef!: ElementRef<HTMLDetailsElement>;\r\n\r\n @ContentChildren(MenuItem) menuItems!: QueryList<MenuItem>;\r\n\r\n ngAfterContentInit() {\r\n // Subscribe to all menu item selections\r\n this.menuItems.forEach((item) => {\r\n item.selected.subscribe(() => {\r\n this.close();\r\n });\r\n });\r\n }\r\n\r\n close(): void {\r\n this.detailsRef.nativeElement.open = false;\r\n }\r\n}\r\n","<details class=\"dropdown-menu\" #details>\r\n <summary role=\"button\" class=\"dropdown-trigger\">\r\n <ng-content select=\"[trigger]\"></ng-content>\r\n </summary>\r\n <ul class=\"dropdown-list\">\r\n <ng-content></ng-content>\r\n </ul>\r\n</details>\r\n\r\n<!-- ussage example:\r\n<app-dropdown-menu>\r\n <span trigger>☰ Menu</span>\r\n\r\n <app-menu-item href=\"/profile\" (selected)=\"doSomething('profile')\">\r\n My Profile\r\n </app-menu-item>\r\n \r\n <app-menu-item href=\"/settings\" (selected)=\"doSomething('settings')\">\r\n Settings\r\n </app-menu-item>\r\n \r\n <app-menu-item href=\"#\" (selected)=\"logout()\">\r\n Logout\r\n </app-menu-item>\r\n</app-dropdown-menu> -->\r\n\r\n<!-- \r\n Note: The above usage example is commented out to avoid rendering issues.\r\n It demonstrates how to use the DropdownMenu component with MenuItem components as options.\r\n-->\r\n","// /*\r\n/* Public API Surface of chatbot\r\n */\r\n\r\n// Main component\r\nexport * from './lib/doohbot.component';\r\n\r\nexport * from './lib/doohbot-input';\r\nexport * from './lib/core/models/api-config.model';\r\nexport * from './lib/constant/doohbot-constant';\r\nexport * from './lib/core/models/theme-config.model';\r\nexport * from './lib/shared/dialog/dialog.component';\r\nexport * from './lib/shared/dialog/dialog.service';\r\nexport * from './lib/shared/chips/chips.component';\r\nexport * from './lib/shared/snackbar/snackbar.component';\r\nexport * from './lib/shared/dropdown-menu/dropdown-menu.component';\r\nexport * from './lib/shared/menu-item/menu-item.component';\r\n\r\n// // Services\r\n// export * from './lib/core/services/doohbot-api.service';\r\n// export * from './lib/core/auth/auth.service';\r\n// export * from './lib/core/auth/account-api.service';\r\n// export * from './lib/core/services/theme.service';\r\n// export * from './lib/core/chat/chat-facade.service';\r\n// export * from './lib/core/chat/chat-helper.service';\r\n// export * from './lib/core/services/storage.service';\r\n\r\n// // Helpers\r\n// export * from './lib/predefined_messages';\r\n\r\n// // Components\r\n// export * from './lib/components/chat-button/chat-button.component';\r\n// export * from './lib/components/chat-window/chat-window.component';\r\n// export * from './lib/components/message-list/message-list.component';\r\n// export * from './lib/components/message-input/message-input.component';\r\n// export * from './lib/components/chat-history-sidebar/chat-history-sidebar.component';\r\n\r\n// // Directives\r\n// export * from './lib/directives/fullscreen/fullscreen.directive';\r\n// export * from './lib/directives/popout/popout.directive';\r\n// export * from './lib/directives/draggable/draggable-dialog.directive';\r\n// export * from './lib/directives/resizable/resizable-dialog.directive';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.CoreConfigService","logger","i2.StorageService","i3.CoreConfigService","i1.HttpService","i1.AccountService","i2.CryptoHelperService","i3.StorageService","i5.CoreConfigService","i1","i2.PersonalizationService","i2","i3","i1.DialogService","i1.StorageService","i2.HttpStreamService","i4","i5","environmentprod"],"mappings":"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"}
|