@aakash58/chatbot 1.1.19 → 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.
Files changed (351) hide show
  1. package/.editorconfig +17 -0
  2. package/.vscode/extensions.json +4 -0
  3. package/.vscode/launch.json +41 -0
  4. package/.vscode/settings.json +14 -0
  5. package/.vscode/tasks.json +60 -0
  6. package/README.md +298 -22
  7. package/angular.json +132 -0
  8. package/docs/PUBLISHING_GUIDE.md +104 -0
  9. package/package.json +75 -29
  10. package/projects/app-doohbot/public/assets/const/app-const.json +15 -0
  11. package/projects/app-doohbot/public/assets/const/doohclick_license.json +6 -0
  12. package/projects/app-doohbot/public/favicon.ico +0 -0
  13. package/projects/app-doohbot/src/app/app.config.ts +13 -0
  14. package/projects/app-doohbot/src/app/app.html +31 -0
  15. package/projects/app-doohbot/src/app/app.routes.ts +3 -0
  16. package/projects/app-doohbot/src/app/app.scss +279 -0
  17. package/projects/app-doohbot/src/app/app.spec.ts +23 -0
  18. package/projects/app-doohbot/src/app/app.ts +72 -0
  19. package/projects/app-doohbot/src/index.html +15 -0
  20. package/projects/app-doohbot/src/main.ts +6 -0
  21. package/projects/app-doohbot/src/styles.scss +15 -0
  22. package/projects/app-doohbot/tsconfig.app.json +15 -0
  23. package/projects/app-doohbot/tsconfig.spec.json +14 -0
  24. package/projects/doohbot/README.md +64 -0
  25. package/projects/doohbot/docs/README.md +140 -0
  26. package/projects/doohbot/ng-package.json +10 -0
  27. package/projects/doohbot/package.json +16 -0
  28. package/projects/doohbot/src/lib/app/chat/chat-ui-state.service.ts +194 -0
  29. package/projects/doohbot/src/lib/app/chat/chat.service.ts +547 -0
  30. package/projects/doohbot/src/lib/app/chat/components/chat-button/chat-button.component.html +27 -0
  31. package/projects/doohbot/src/lib/app/chat/components/chat-button/chat-button.component.scss +115 -0
  32. package/projects/doohbot/src/lib/app/chat/components/chat-button/chat-button.component.ts +35 -0
  33. package/projects/doohbot/src/lib/app/chat/components/chat-footer/chat-footer.component.html +3 -0
  34. package/projects/doohbot/src/lib/app/chat/components/chat-footer/chat-footer.component.scss +20 -0
  35. package/projects/doohbot/src/lib/app/chat/components/chat-footer/chat-footer.component.ts +12 -0
  36. package/projects/doohbot/src/lib/app/chat/components/chat-header/chat-header.component.html +34 -0
  37. package/projects/doohbot/src/lib/app/chat/components/chat-header/chat-header.component.scss +78 -0
  38. package/projects/doohbot/src/lib/app/chat/components/chat-header/chat-header.component.ts +52 -0
  39. package/projects/doohbot/src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.html +77 -0
  40. package/projects/doohbot/src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.scss +346 -0
  41. package/projects/doohbot/src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.ts +188 -0
  42. package/projects/doohbot/src/lib/app/chat/components/chat-window/chat-window.component.html +146 -0
  43. package/projects/doohbot/src/lib/app/chat/components/chat-window/chat-window.component.scss +187 -0
  44. package/projects/doohbot/src/lib/app/chat/components/chat-window/chat-window.component.ts +256 -0
  45. package/projects/doohbot/src/lib/app/chat/components/message-input/message-input.component.html +17 -0
  46. package/projects/doohbot/src/lib/app/chat/components/message-input/message-input.component.scss +59 -0
  47. package/projects/doohbot/src/lib/app/chat/components/message-input/message-input.component.ts +28 -0
  48. package/projects/doohbot/src/lib/app/chat/components/message-list/message-list.component.html +138 -0
  49. package/projects/doohbot/src/lib/app/chat/components/message-list/message-list.component.scss +436 -0
  50. package/projects/doohbot/src/lib/app/chat/components/message-list/message-list.component.ts +106 -0
  51. package/projects/doohbot/src/lib/app/chat/model/chat-history.model.ts +57 -0
  52. package/projects/doohbot/src/lib/app/chat/model/chat-request.model.ts +17 -0
  53. package/projects/doohbot/src/lib/app/chat/model/chat-response.model.ts +9 -0
  54. package/projects/doohbot/src/lib/app/chat/model/chat-session.model.ts +14 -0
  55. 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
  56. package/projects/doohbot/src/lib/app/chat/model/chat-stream-response.model.ts +12 -0
  57. package/projects/doohbot/src/lib/app/chat/services/chat-api.service.ts +82 -0
  58. package/projects/doohbot/src/lib/app/chat/services/chat-audio.service.ts +44 -0
  59. package/projects/doohbot/src/lib/app/chat/services/chat-history.service.ts +303 -0
  60. package/projects/doohbot/src/lib/app/login/login-form.component.html +80 -0
  61. package/projects/doohbot/src/lib/app/login/login-form.component.scss +189 -0
  62. package/projects/doohbot/src/lib/app/login/login-form.component.ts +45 -0
  63. package/projects/doohbot/src/lib/app/personalization/personalization-dialog.component.html +81 -0
  64. package/projects/doohbot/src/lib/app/personalization/personalization-dialog.component.scss +179 -0
  65. package/projects/doohbot/src/lib/app/personalization/personalization-dialog.component.ts +217 -0
  66. package/projects/doohbot/src/lib/app/personalization/personalization.service.ts +197 -0
  67. package/projects/doohbot/src/lib/app/personalization/sections/account/account-section.component.html +111 -0
  68. package/projects/doohbot/src/lib/app/personalization/sections/account/account-section.component.scss +218 -0
  69. package/projects/doohbot/src/lib/app/personalization/sections/account/account-section.component.ts +121 -0
  70. package/projects/doohbot/src/lib/app/personalization/sections/instructions/instructions-section.component.html +46 -0
  71. package/projects/doohbot/src/lib/app/personalization/sections/instructions/instructions-section.component.scss +138 -0
  72. package/projects/doohbot/src/lib/app/personalization/sections/instructions/instructions-section.component.ts +28 -0
  73. package/projects/doohbot/src/lib/app/personalization/sections/preferences/color-picker-dialog.component.ts +92 -0
  74. package/projects/doohbot/src/lib/app/personalization/sections/preferences/preferences-section.component.html +198 -0
  75. package/projects/doohbot/src/lib/app/personalization/sections/preferences/preferences-section.component.scss +107 -0
  76. package/projects/doohbot/src/lib/app/personalization/sections/preferences/preferences-section.component.ts +103 -0
  77. package/projects/doohbot/src/lib/app/personalization/sections/profile/profile-section.component.html +46 -0
  78. package/projects/doohbot/src/lib/app/personalization/sections/profile/profile-section.component.scss +131 -0
  79. package/projects/doohbot/src/lib/app/personalization/sections/profile/profile-section.component.ts +23 -0
  80. package/projects/doohbot/src/lib/app/personalization/sections/settings/setting-section.component.html +33 -0
  81. package/projects/doohbot/src/lib/app/personalization/sections/settings/setting-section.component.scss +61 -0
  82. package/projects/doohbot/src/lib/app/personalization/sections/settings/setting-section.component.ts +20 -0
  83. package/projects/doohbot/src/lib/app/personalization/sections/terms/terms-section.component.html +30 -0
  84. package/projects/doohbot/src/lib/app/personalization/sections/terms/terms-section.component.scss +59 -0
  85. package/projects/doohbot/src/lib/app/personalization/sections/terms/terms-section.component.ts +12 -0
  86. package/projects/doohbot/src/lib/constant/doohbot-constant.ts +40 -0
  87. package/projects/doohbot/src/lib/constant/html-entities.ts +8 -0
  88. package/projects/doohbot/src/lib/constant/utf8.ts +9 -0
  89. package/projects/doohbot/src/lib/core/app-const.ts +63 -0
  90. package/projects/doohbot/src/lib/core/auth/account-api.service.ts +53 -0
  91. package/projects/doohbot/src/lib/core/auth/auth.service.ts +478 -0
  92. package/projects/doohbot/src/lib/core/auth/models/auth-result.model.ts +4 -0
  93. package/projects/doohbot/src/lib/core/auth/models/federated-login-request.model.ts +5 -0
  94. package/projects/doohbot/src/lib/core/auth/models/login-request.model.ts +6 -0
  95. package/projects/doohbot/src/lib/core/auth/storage.service.ts +113 -0
  96. package/projects/doohbot/src/lib/core/directives/draggable/draggable-dialog.directive.ts +123 -0
  97. package/projects/doohbot/src/lib/core/directives/draggable/draggable-dialog.module.ts +9 -0
  98. package/projects/doohbot/src/lib/core/directives/fullscreen/fullscreen.directive.ts +58 -0
  99. package/projects/doohbot/src/lib/core/directives/fullscreen/fullscreen.module.ts +9 -0
  100. package/projects/doohbot/src/lib/core/directives/popout/popout.directive.ts +169 -0
  101. package/projects/doohbot/src/lib/core/directives/popout/popout.module.ts +9 -0
  102. package/projects/doohbot/src/lib/core/directives/resizable/resizable-dialog.directive.ts +197 -0
  103. package/projects/doohbot/src/lib/core/directives/resizable/resizable-dialog.module.ts +9 -0
  104. package/projects/doohbot/src/lib/core/enums/api-request-state.enum.ts +9 -0
  105. package/projects/doohbot/src/lib/core/environments/environment.prod.ts +14 -0
  106. package/projects/doohbot/src/lib/core/environments/environment.ts +14 -0
  107. package/projects/doohbot/src/lib/core/helpers/crypto-helper.service.ts +72 -0
  108. package/projects/doohbot/src/lib/core/http/http-stream.service.ts +105 -0
  109. package/projects/doohbot/src/lib/core/http/http.service.ts +148 -0
  110. package/projects/doohbot/src/lib/core/interceptors/auth.interceptor.ts +118 -0
  111. package/projects/doohbot/src/lib/core/interceptors/license.interceptor.ts +50 -0
  112. package/projects/doohbot/src/lib/core/models/api-config.model.ts +82 -0
  113. package/projects/doohbot/src/lib/core/models/api-request.model.ts +92 -0
  114. package/projects/doohbot/src/lib/core/models/api-response.model.ts +13 -0
  115. package/projects/doohbot/src/lib/core/models/doohbot-config.model.ts +109 -0
  116. package/{lib/core/models/license.model.d.ts → projects/doohbot/src/lib/core/models/license.model.ts} +27 -23
  117. package/projects/doohbot/src/lib/core/models/message.ts +18 -0
  118. package/projects/doohbot/src/lib/core/models/theme-config.model.ts +48 -0
  119. package/projects/doohbot/src/lib/core/services/core-config.service.ts +53 -0
  120. package/projects/doohbot/src/lib/core/services/doohbot-api.service.ts +207 -0
  121. package/projects/doohbot/src/lib/core/services/license.service.ts +171 -0
  122. package/projects/doohbot/src/lib/core/services/markdown.service.ts +73 -0
  123. package/projects/doohbot/src/lib/core/services/theme.service.ts +305 -0
  124. package/{lib/core/types/auth-mode.type.d.ts → projects/doohbot/src/lib/core/types/auth-mode.type.ts} +4 -4
  125. package/{lib/core/types/auth-status.type.d.ts → projects/doohbot/src/lib/core/types/auth-status.type.ts} +5 -4
  126. package/{lib/core/types/chat-stream.type.d.ts → projects/doohbot/src/lib/core/types/chat-stream.type.ts} +4 -4
  127. package/{lib/core/types/message-role.type.d.ts → projects/doohbot/src/lib/core/types/message-role.type.ts} +4 -4
  128. package/{lib/core/types/prompt-mode.type.d.ts → projects/doohbot/src/lib/core/types/prompt-mode.type.ts} +5 -4
  129. package/{lib/core/types/snackbar-error.type.d.ts → projects/doohbot/src/lib/core/types/snackbar-error.type.ts} +5 -4
  130. package/{lib/core/types/tenant-resolution-strategy.type.d.ts → projects/doohbot/src/lib/core/types/tenant-resolution-strategy.type.ts} +4 -4
  131. package/projects/doohbot/src/lib/core/utils/error-handler.util.ts +31 -0
  132. package/projects/doohbot/src/lib/core/utils/logger.service.ts +45 -0
  133. package/projects/doohbot/src/lib/doohbot-input.ts +19 -0
  134. package/projects/doohbot/src/lib/doohbot.component.html +34 -0
  135. package/projects/doohbot/src/lib/doohbot.component.scss +17 -0
  136. package/projects/doohbot/src/lib/doohbot.component.spec.ts +31 -0
  137. package/projects/doohbot/src/lib/doohbot.component.ts +545 -0
  138. package/projects/doohbot/src/lib/elements.ts +25 -0
  139. package/projects/doohbot/src/lib/predefined_messages.ts +14 -0
  140. package/projects/doohbot/src/lib/shared/chips/chips.component.html +9 -0
  141. package/projects/doohbot/src/lib/shared/chips/chips.component.scss +29 -0
  142. package/projects/doohbot/src/lib/shared/chips/chips.component.spec.ts +22 -0
  143. package/projects/doohbot/src/lib/shared/chips/chips.component.ts +20 -0
  144. package/projects/doohbot/src/lib/shared/dialog/dialog.component.html +29 -0
  145. package/projects/doohbot/src/lib/shared/dialog/dialog.component.scss +100 -0
  146. package/projects/doohbot/src/lib/shared/dialog/dialog.component.ts +42 -0
  147. package/projects/doohbot/src/lib/shared/dialog/dialog.service.ts +62 -0
  148. package/projects/doohbot/src/lib/shared/dialog/dialog.utils.ts +102 -0
  149. package/projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.html +30 -0
  150. package/projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.scss +53 -0
  151. package/projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.spec.ts +22 -0
  152. package/projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.ts +35 -0
  153. package/projects/doohbot/src/lib/shared/input-dialog/input-dialog.component.html +16 -0
  154. package/projects/doohbot/src/lib/shared/input-dialog/input-dialog.component.scss +45 -0
  155. package/projects/doohbot/src/lib/shared/input-dialog/input-dialog.component.ts +46 -0
  156. package/projects/doohbot/src/lib/shared/menu-item/menu-item.component.html +5 -0
  157. package/projects/doohbot/src/lib/shared/menu-item/menu-item.component.scss +0 -0
  158. package/projects/doohbot/src/lib/shared/menu-item/menu-item.component.spec.ts +22 -0
  159. package/projects/doohbot/src/lib/shared/menu-item/menu-item.component.ts +20 -0
  160. package/projects/doohbot/src/lib/shared/pipes/simple-markdown.pipe.ts +19 -0
  161. package/projects/doohbot/src/lib/shared/popout/popout.html +1 -0
  162. package/projects/doohbot/src/lib/shared/popout/popout.scss +0 -0
  163. package/projects/doohbot/src/lib/shared/popout/popout.spec.ts +23 -0
  164. package/projects/doohbot/src/lib/shared/popout/popout.ts +11 -0
  165. package/projects/doohbot/src/lib/shared/snackbar/snackbar.component.html +7 -0
  166. package/projects/doohbot/src/lib/shared/snackbar/snackbar.component.scss +125 -0
  167. package/projects/doohbot/src/lib/shared/snackbar/snackbar.component.spec.ts +21 -0
  168. package/projects/doohbot/src/lib/shared/snackbar/snackbar.component.ts +44 -0
  169. package/projects/doohbot/src/lib/shared/snackbar/snackbar.service.ts +54 -0
  170. package/{lib/shared/snackbar/snackbar.utils.d.ts → projects/doohbot/src/lib/shared/snackbar/snackbar.utils.ts} +49 -33
  171. package/projects/doohbot/src/lib/styles/_theme.scss +132 -0
  172. package/projects/doohbot/src/lib/styles/material-override.scss +302 -0
  173. package/projects/doohbot/src/lib/styles/utility.scss +588 -0
  174. package/projects/doohbot/src/public-api.ts +42 -0
  175. package/projects/doohbot/tsconfig.lib.json +15 -0
  176. package/projects/doohbot/tsconfig.lib.prod.json +11 -0
  177. package/projects/doohbot/tsconfig.spec.json +10 -0
  178. package/proxy.conf.json +8 -0
  179. package/publish.config.js +25 -0
  180. package/scripts/publishing/index.ts +67 -0
  181. package/scripts/publishing/pipeline/01-clean.ts +11 -0
  182. package/scripts/publishing/pipeline/02-validate-pre.ts +8 -0
  183. package/scripts/publishing/pipeline/03-build.ts +7 -0
  184. package/scripts/publishing/pipeline/04-validate-post.ts +8 -0
  185. package/scripts/publishing/pipeline/05-prepare-package.ts +29 -0
  186. package/scripts/publishing/pipeline/06-version.ts +23 -0
  187. package/scripts/publishing/pipeline/07-publish.ts +14 -0
  188. package/scripts/publishing/pipeline/08-cleanup.ts +5 -0
  189. package/scripts/publishing/types.ts +36 -0
  190. package/scripts/publishing/utils/command.ts +15 -0
  191. package/scripts/publishing/utils/config.ts +17 -0
  192. package/scripts/validate.ts +166 -0
  193. package/tsconfig.json +45 -0
  194. package/tsconfig.scripts.json +15 -0
  195. package/esm2022/aakash58-chatbot.mjs +0 -5
  196. package/esm2022/lib/app/chat/chat-ui-state.service.mjs +0 -170
  197. package/esm2022/lib/app/chat/chat.service.mjs +0 -445
  198. package/esm2022/lib/app/chat/components/chat-button/chat-button.component.mjs +0 -50
  199. package/esm2022/lib/app/chat/components/chat-footer/chat-footer.component.mjs +0 -12
  200. package/esm2022/lib/app/chat/components/chat-header/chat-header.component.mjs +0 -66
  201. package/esm2022/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.mjs +0 -186
  202. package/esm2022/lib/app/chat/components/chat-window/chat-window.component.mjs +0 -312
  203. package/esm2022/lib/app/chat/components/message-input/message-input.component.mjs +0 -36
  204. package/esm2022/lib/app/chat/components/message-list/message-list.component.mjs +0 -115
  205. package/esm2022/lib/app/chat/model/chat-history.model.mjs +0 -2
  206. package/esm2022/lib/app/chat/model/chat-request.model.mjs +0 -2
  207. package/esm2022/lib/app/chat/model/chat-response.model.mjs +0 -2
  208. package/esm2022/lib/app/chat/model/chat-session.model.mjs +0 -2
  209. package/esm2022/lib/app/chat/model/chat-stream-message.model.mjs +0 -2
  210. package/esm2022/lib/app/chat/model/chat-stream-response.model.mjs +0 -2
  211. package/esm2022/lib/app/chat/services/chat-api.service.mjs +0 -61
  212. package/esm2022/lib/app/chat/services/chat-audio.service.mjs +0 -50
  213. package/esm2022/lib/app/chat/services/chat-history.service.mjs +0 -252
  214. package/esm2022/lib/app/login/login-form.component.mjs +0 -46
  215. package/esm2022/lib/app/personalization/personalization-dialog.component.mjs +0 -194
  216. package/esm2022/lib/app/personalization/personalization.service.mjs +0 -149
  217. package/esm2022/lib/app/personalization/sections/account/account-section.component.mjs +0 -122
  218. package/esm2022/lib/app/personalization/sections/preferences/color-picker-dialog.component.mjs +0 -86
  219. package/esm2022/lib/app/personalization/sections/preferences/preferences-section.component.mjs +0 -115
  220. package/esm2022/lib/app/personalization/sections/profile/profile-section.component.mjs +0 -29
  221. package/esm2022/lib/app/personalization/sections/settings/setting-section.component.mjs +0 -30
  222. package/esm2022/lib/app/personalization/sections/terms/terms-section.component.mjs +0 -12
  223. package/esm2022/lib/constant/doohbot-constant.mjs +0 -28
  224. package/esm2022/lib/constant/html-entities.mjs +0 -9
  225. package/esm2022/lib/constant/utf8.mjs +0 -10
  226. package/esm2022/lib/core/app-const.mjs +0 -61
  227. package/esm2022/lib/core/auth/account-api.service.mjs +0 -40
  228. package/esm2022/lib/core/auth/auth.service.mjs +0 -391
  229. package/esm2022/lib/core/auth/models/auth-result.model.mjs +0 -3
  230. package/esm2022/lib/core/auth/models/federated-login-request.model.mjs +0 -6
  231. package/esm2022/lib/core/auth/models/login-request.model.mjs +0 -6
  232. package/esm2022/lib/core/auth/storage.service.mjs +0 -110
  233. package/esm2022/lib/core/directives/draggable/draggable-dialog.directive.mjs +0 -112
  234. package/esm2022/lib/core/directives/fullscreen/fullscreen.directive.mjs +0 -55
  235. package/esm2022/lib/core/directives/resizable/resizable-dialog.directive.mjs +0 -179
  236. package/esm2022/lib/core/environments/environment.mjs +0 -15
  237. package/esm2022/lib/core/environments/environment.prod.mjs +0 -15
  238. package/esm2022/lib/core/helpers/crypto-helper.service.mjs +0 -52
  239. package/esm2022/lib/core/http/http-stream.service.mjs +0 -97
  240. package/esm2022/lib/core/http/http.service.mjs +0 -103
  241. package/esm2022/lib/core/interceptors/auth.interceptor.mjs +0 -96
  242. package/esm2022/lib/core/interceptors/license.interceptor.mjs +0 -44
  243. package/esm2022/lib/core/models/api-config.model.mjs +0 -18
  244. package/esm2022/lib/core/models/api-request.model.mjs +0 -2
  245. package/esm2022/lib/core/models/api-response.model.mjs +0 -8
  246. package/esm2022/lib/core/models/doohbot-config.model.mjs +0 -18
  247. package/esm2022/lib/core/models/license.model.mjs +0 -2
  248. package/esm2022/lib/core/models/message.mjs +0 -2
  249. package/esm2022/lib/core/models/theme-config.model.mjs +0 -2
  250. package/esm2022/lib/core/services/core-config.service.mjs +0 -52
  251. package/esm2022/lib/core/services/license.service.mjs +0 -145
  252. package/esm2022/lib/core/services/markdown.service.mjs +0 -64
  253. package/esm2022/lib/core/services/theme.service.mjs +0 -248
  254. package/esm2022/lib/core/types/auth-mode.type.mjs +0 -2
  255. package/esm2022/lib/core/types/auth-status.type.mjs +0 -5
  256. package/esm2022/lib/core/types/chat-stream.type.mjs +0 -2
  257. package/esm2022/lib/core/types/message-role.type.mjs +0 -2
  258. package/esm2022/lib/core/types/prompt-mode.type.mjs +0 -5
  259. package/esm2022/lib/core/types/snackbar-error.type.mjs +0 -5
  260. package/esm2022/lib/core/types/tenant-resolution-strategy.type.mjs +0 -2
  261. package/esm2022/lib/core/utils/logger.service.mjs +0 -42
  262. package/esm2022/lib/doohbot-input.mjs +0 -20
  263. package/esm2022/lib/doohbot.component.mjs +0 -444
  264. package/esm2022/lib/predefined_messages.mjs +0 -15
  265. package/esm2022/lib/shared/chips/chips.component.mjs +0 -28
  266. package/esm2022/lib/shared/dialog/dialog.component.mjs +0 -36
  267. package/esm2022/lib/shared/dialog/dialog.service.mjs +0 -64
  268. package/esm2022/lib/shared/dialog/dialog.utils.mjs +0 -85
  269. package/esm2022/lib/shared/dropdown-menu/dropdown-menu.component.mjs +0 -29
  270. package/esm2022/lib/shared/input-dialog/input-dialog.component.mjs +0 -38
  271. package/esm2022/lib/shared/menu-item/menu-item.component.mjs +0 -24
  272. package/esm2022/lib/shared/pipes/simple-markdown.pipe.mjs +0 -27
  273. package/esm2022/lib/shared/snackbar/snackbar.component.mjs +0 -43
  274. package/esm2022/lib/shared/snackbar/snackbar.service.mjs +0 -46
  275. package/esm2022/lib/shared/snackbar/snackbar.utils.mjs +0 -43
  276. package/esm2022/public-api.mjs +0 -37
  277. package/fesm2022/aakash58-chatbot.mjs +0 -5193
  278. package/fesm2022/aakash58-chatbot.mjs.map +0 -1
  279. package/index.d.ts +0 -5
  280. package/lib/app/chat/chat-ui-state.service.d.ts +0 -96
  281. package/lib/app/chat/chat.service.d.ts +0 -88
  282. package/lib/app/chat/components/chat-button/chat-button.component.d.ts +0 -16
  283. package/lib/app/chat/components/chat-footer/chat-footer.component.d.ts +0 -5
  284. package/lib/app/chat/components/chat-header/chat-header.component.d.ts +0 -24
  285. package/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.d.ts +0 -49
  286. package/lib/app/chat/components/chat-window/chat-window.component.d.ts +0 -107
  287. package/lib/app/chat/components/message-input/message-input.component.d.ts +0 -12
  288. package/lib/app/chat/components/message-list/message-list.component.d.ts +0 -40
  289. package/lib/app/chat/model/chat-history.model.d.ts +0 -51
  290. package/lib/app/chat/model/chat-request.model.d.ts +0 -10
  291. package/lib/app/chat/model/chat-response.model.d.ts +0 -9
  292. package/lib/app/chat/model/chat-session.model.d.ts +0 -12
  293. package/lib/app/chat/model/chat-stream-response.model.d.ts +0 -10
  294. package/lib/app/chat/services/chat-api.service.d.ts +0 -30
  295. package/lib/app/chat/services/chat-audio.service.d.ts +0 -19
  296. package/lib/app/chat/services/chat-history.service.d.ts +0 -53
  297. package/lib/app/login/login-form.component.d.ts +0 -20
  298. package/lib/app/personalization/personalization-dialog.component.d.ts +0 -53
  299. package/lib/app/personalization/personalization.service.d.ts +0 -66
  300. package/lib/app/personalization/sections/account/account-section.component.d.ts +0 -30
  301. package/lib/app/personalization/sections/preferences/color-picker-dialog.component.d.ts +0 -17
  302. package/lib/app/personalization/sections/preferences/preferences-section.component.d.ts +0 -27
  303. package/lib/app/personalization/sections/profile/profile-section.component.d.ts +0 -17
  304. package/lib/app/personalization/sections/settings/setting-section.component.d.ts +0 -10
  305. package/lib/app/personalization/sections/terms/terms-section.component.d.ts +0 -5
  306. package/lib/constant/doohbot-constant.d.ts +0 -12
  307. package/lib/constant/html-entities.d.ts +0 -8
  308. package/lib/constant/utf8.d.ts +0 -9
  309. package/lib/core/app-const.d.ts +0 -11
  310. package/lib/core/auth/account-api.service.d.ts +0 -20
  311. package/lib/core/auth/auth.service.d.ts +0 -90
  312. package/lib/core/auth/models/auth-result.model.d.ts +0 -4
  313. package/lib/core/auth/models/federated-login-request.model.d.ts +0 -5
  314. package/lib/core/auth/models/login-request.model.d.ts +0 -6
  315. package/lib/core/auth/storage.service.d.ts +0 -21
  316. package/lib/core/directives/draggable/draggable-dialog.directive.d.ts +0 -23
  317. package/lib/core/directives/fullscreen/fullscreen.directive.d.ts +0 -14
  318. package/lib/core/directives/resizable/resizable-dialog.directive.d.ts +0 -30
  319. package/lib/core/environments/environment.d.ts +0 -7
  320. package/lib/core/environments/environment.prod.d.ts +0 -7
  321. package/lib/core/helpers/crypto-helper.service.d.ts +0 -12
  322. package/lib/core/http/http-stream.service.d.ts +0 -18
  323. package/lib/core/http/http.service.d.ts +0 -20
  324. package/lib/core/interceptors/auth.interceptor.d.ts +0 -18
  325. package/lib/core/interceptors/license.interceptor.d.ts +0 -11
  326. package/lib/core/models/api-config.model.d.ts +0 -58
  327. package/lib/core/models/api-request.model.d.ts +0 -77
  328. package/lib/core/models/api-response.model.d.ts +0 -6
  329. package/lib/core/models/doohbot-config.model.d.ts +0 -81
  330. package/lib/core/models/message.d.ts +0 -16
  331. package/lib/core/models/theme-config.model.d.ts +0 -28
  332. package/lib/core/services/core-config.service.d.ts +0 -23
  333. package/lib/core/services/license.service.d.ts +0 -33
  334. package/lib/core/services/markdown.service.d.ts +0 -8
  335. package/lib/core/services/theme.service.d.ts +0 -40
  336. package/lib/core/utils/logger.service.d.ts +0 -11
  337. package/lib/doohbot-input.d.ts +0 -19
  338. package/lib/doohbot.component.d.ts +0 -108
  339. package/lib/predefined_messages.d.ts +0 -2
  340. package/lib/shared/chips/chips.component.d.ts +0 -10
  341. package/lib/shared/dialog/dialog.component.d.ts +0 -19
  342. package/lib/shared/dialog/dialog.service.d.ts +0 -29
  343. package/lib/shared/dialog/dialog.utils.d.ts +0 -41
  344. package/lib/shared/dropdown-menu/dropdown-menu.component.d.ts +0 -11
  345. package/lib/shared/input-dialog/input-dialog.component.d.ts +0 -20
  346. package/lib/shared/menu-item/menu-item.component.d.ts +0 -9
  347. package/lib/shared/pipes/simple-markdown.pipe.d.ts +0 -10
  348. package/lib/shared/snackbar/snackbar.component.d.ts +0 -14
  349. package/lib/shared/snackbar/snackbar.service.d.ts +0 -19
  350. package/public-api.d.ts +0 -11
  351. /package/{src → projects/doohbot/src}/assets/bot.mp3 +0 -0
@@ -0,0 +1,109 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ import { AuthMode } from '../types/auth-mode.type';
3
+ import { TenantResolutionStrategy } from '../types/tenant-resolution-strategy.type';
4
+ import { PromptMode } from '../types/prompt-mode.type';
5
+
6
+ /**
7
+ * Advanced configuration for DoohBot package
8
+ * Supports both simple and complex use cases
9
+ */
10
+ export interface DoohbotAdvancedConfig {
11
+ /**
12
+ * Authentication mode
13
+ * - 'manual': You provide platformTenant, subTenant, agent manually
14
+ * - 'auto': Package reads from your auth service via resolver
15
+ * @default 'manual'
16
+ */
17
+ authMode?: AuthMode;
18
+
19
+ /**
20
+ * Tenant resolution strategy
21
+ * - 'static': Use fixed values provided via inputs
22
+ * - 'dynamic': Automatically update when auth state changes
23
+ * - 'callback': Use custom resolver function
24
+ * @default 'static'
25
+ */
26
+ tenantResolution?: TenantResolutionStrategy;
27
+
28
+ /**
29
+ * Auto-configure from localStorage key
30
+ * If provided, package will read auth data from localStorage
31
+ * Example: 'auth_user' or 'saas_session'
32
+ */
33
+ autoConfigFromStorage?: string;
34
+
35
+ /**
36
+ * Enable multi-tenant mode
37
+ * Allows switching between different tenant contexts
38
+ * @default false
39
+ */
40
+ enableMultiTenant?: boolean;
41
+
42
+ /**
43
+ * Persist chat history per tenant
44
+ * @default true
45
+ */
46
+ persistChatPerTenant?: boolean;
47
+
48
+ /**
49
+ * Custom authentication header name
50
+ * @default 'Authorization'
51
+ */
52
+ authHeaderName?: string;
53
+
54
+ /**
55
+ * Custom authentication header format
56
+ * Use {token} as placeholder
57
+ * @default 'Bearer {token}'
58
+ */
59
+ authHeaderFormat?: string;
60
+
61
+ /**
62
+ * Enable role-based features
63
+ * Shows/hides features based on user permissions
64
+ * @default false
65
+ */
66
+ enableRoleBasedFeatures?: boolean;
67
+
68
+ /**
69
+ * User permissions (for role-based features)
70
+ */
71
+ userPermissions?: string[];
72
+
73
+ /**
74
+ * Callback when authentication fails
75
+ */
76
+ onAuthFailure?: (error: any) => void;
77
+
78
+ /**
79
+ * Enable debug mode (logs configuration and requests)
80
+ * @default false
81
+ */
82
+ debugMode?: boolean;
83
+
84
+ /**
85
+ * Prompt mode for chat responses
86
+ * @default 'markdown'
87
+ */
88
+ promptMode?: PromptMode;
89
+ }
90
+
91
+ /**
92
+ * Injection token for advanced configuration
93
+ */
94
+ export const DOOHBOT_ADVANCED_CONFIG = new InjectionToken<DoohbotAdvancedConfig>(
95
+ 'DOOHBOT_ADVANCED_CONFIG',
96
+ {
97
+ providedIn: 'root',
98
+ factory: () => ({
99
+ authMode: 'manual',
100
+ tenantResolution: 'static',
101
+ enableMultiTenant: false,
102
+ persistChatPerTenant: true,
103
+ authHeaderName: 'Authorization',
104
+ authHeaderFormat: 'Bearer {token}',
105
+ enableRoleBasedFeatures: false,
106
+ debugMode: false,
107
+ }),
108
+ },
109
+ );
@@ -1,23 +1,27 @@
1
- export interface LicensingContext {
2
- tenantId: string;
3
- principalId: string;
4
- roles?: string[];
5
- }
6
- export interface LicensePackage {
7
- [packageId: string]: string;
8
- }
9
- export interface SubjectLicense {
10
- subjectType: 'user' | 'role' | 'tenant';
11
- subjectId: string;
12
- packages: LicensePackage;
13
- }
14
- export interface LicenseFileContent {
15
- accountId: string;
16
- issuedBy: string;
17
- issuedAt: string;
18
- licenses: SubjectLicense[];
19
- }
20
- export interface LicenseRegistry {
21
- accountId: string;
22
- subjectLicenses: Map<string, LicensePackage>;
23
- }
1
+ export interface LicensingContext {
2
+ tenantId: string; // Unique company/org ID
3
+ principalId: string; // User / Merchant ID
4
+ roles?: string[]; // Optional roles/groups
5
+ }
6
+
7
+ export interface LicensePackage {
8
+ [packageId: string]: string; // packageId -> licenseKey
9
+ }
10
+
11
+ export interface SubjectLicense {
12
+ subjectType: 'user' | 'role' | 'tenant';
13
+ subjectId: string;
14
+ packages: LicensePackage;
15
+ }
16
+
17
+ export interface LicenseFileContent {
18
+ accountId: string;
19
+ issuedBy: string;
20
+ issuedAt: string;
21
+ licenses: SubjectLicense[];
22
+ }
23
+
24
+ export interface LicenseRegistry {
25
+ accountId: string;
26
+ subjectLicenses: Map<string, LicensePackage>;
27
+ }
@@ -0,0 +1,18 @@
1
+ import { MessageRole } from '../types/message-role.type';
2
+
3
+ export interface Message {
4
+ id: string;
5
+ sender: MessageRole;
6
+ senderName?: string;
7
+ text: string; //! used for non-streaming
8
+ chunks?: string[]; //! used for streaming
9
+ timestamp?: Date;
10
+ showSuggestions?: boolean;
11
+ // Optional context fields for API integration
12
+ platformTenant?: string;
13
+ subTenant?: string;
14
+ agent?: string;
15
+ completed: boolean | true;
16
+ isHistory: boolean | true; //! Indicated the message is from history
17
+ copied?: boolean;
18
+ }
@@ -0,0 +1,48 @@
1
+ // TODO
2
+ export interface DoohbotThemeConfig {
3
+ // Font
4
+ fontFamily?: string;
5
+
6
+ // Primary & Secondary
7
+ primaryColor?: string;
8
+ secondaryColor?: string;
9
+
10
+ // Backgrounds
11
+ backgroundColor?: string;
12
+ chatInputColor?: string;
13
+
14
+ // Text Colors
15
+ textAltColor?: string;
16
+ textColor?: string;
17
+ secondaryTextColor?: string;
18
+ hintTextColor?: string;
19
+
20
+ // Button Colors
21
+ buttonColor?: string;
22
+
23
+ // Message Colors
24
+ userMessageColor?: string;
25
+ botMessageColor?: string;
26
+
27
+ // Message Text Colors
28
+ userTextColor?: string;
29
+ botTextColor?: string;
30
+
31
+ // Borders
32
+ borderColor?: string;
33
+ borderShadowColor?: string;
34
+ borderTopColor?: string;
35
+
36
+ // Indicators
37
+ typingIndicatorColor?: string;
38
+
39
+ // Utility Colors
40
+ white?: string;
41
+ black?: string;
42
+ grey?: string;
43
+ red?: string;
44
+ yellow?: string;
45
+ orange?: string;
46
+ green?: string;
47
+ blue?: string;
48
+ }
@@ -0,0 +1,53 @@
1
+ import { Injectable, signal, WritableSignal } from '@angular/core';
2
+ import { DoohbotInput } from '../../doohbot-input';
3
+
4
+ @Injectable({
5
+ providedIn: 'root',
6
+ })
7
+ export class CoreConfigService {
8
+ private configSignal: WritableSignal<DoohbotInput> = signal(new DoohbotInput());
9
+ public config$ = this.configSignal.asReadonly();
10
+
11
+ /**
12
+ * Updates the global library configuration
13
+ */
14
+ updateConfig(config: DoohbotInput): void {
15
+ this.configSignal.set(config);
16
+ }
17
+
18
+ /**
19
+ * Dynamic getters for common config properties
20
+ */
21
+ get apiUrl(): string {
22
+ const config = this.configSignal();
23
+ return `${config.apiBaseUrl}${config.apiSegment}`;
24
+ }
25
+
26
+ get storageKey(): string {
27
+ return this.configSignal().storageKey || '';
28
+ }
29
+
30
+ get secretKey(): string {
31
+ return this.configSignal().secretKey || '';
32
+ }
33
+
34
+ get companyCode(): string {
35
+ return this.configSignal().companyCode || '';
36
+ }
37
+
38
+ get tenancyName(): string {
39
+ return this.configSignal().tenancyName || '';
40
+ }
41
+
42
+ get licenseKey(): string {
43
+ return this.configSignal().licenseKey || '';
44
+ }
45
+
46
+ get licenseFilePath(): string {
47
+ return this.configSignal().licenseFilePath || '';
48
+ }
49
+
50
+ get rememberMe(): boolean {
51
+ return this.configSignal().rememberMe !== undefined ? this.configSignal().rememberMe! : false;
52
+ }
53
+ }
@@ -0,0 +1,207 @@
1
+ import { Injectable, inject } from '@angular/core';
2
+ import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';
3
+ import { Observable, throwError, timer } from 'rxjs';
4
+ import { catchError, retry, timeout, map } from 'rxjs/operators';
5
+ import { DOOHBOT_API_CONFIG, DoohbotApiConfig } from '../models/api-config.model';
6
+ import { ChatApiRequest, ChatApiResponse, ChatApiError } from '../models/api-request.model';
7
+ import { Message } from '../models/message';
8
+ import { ErrorHandlerUtil } from '../utils/error-handler.util';
9
+ import logger from '../utils/logger.service';
10
+ import { SnackbarUtils } from '../../shared/snackbar/snackbar.utils';
11
+ import { StorageService } from './../auth/storage.service';
12
+ import { LicenseService } from './license.service';
13
+ import { AuthService } from '../auth/auth.service';
14
+
15
+ @Injectable({
16
+ providedIn: 'root',
17
+ })
18
+ export class ChatbotApiService {
19
+ private http = inject(HttpClient);
20
+ private config = inject(DOOHBOT_API_CONFIG);
21
+ private tokenStorage = inject(StorageService);
22
+ private licenseService = inject(LicenseService);
23
+ private authService = inject(AuthService);
24
+
25
+ /**
26
+ * Send a chat message to the API
27
+ * @param message User's message text
28
+ * @param history Optional message history for context
29
+ * @returns Observable of the API response
30
+ */
31
+ sendMessage(message: string, history?: Message[]): Observable<ChatApiResponse> {
32
+ if (!this.config.apiUrl) {
33
+ return throwError(
34
+ () =>
35
+ ({
36
+ message: 'API URL not configured',
37
+ code: 'CONFIG_ERROR',
38
+ }) as ChatApiError,
39
+ );
40
+ }
41
+
42
+ // Build request payload with tenant context
43
+ const request = this.buildRequest(message, history);
44
+
45
+ // Build headers
46
+ const headers = this.buildHeaders();
47
+
48
+ // Configure timeout
49
+ const timeoutMs = this.config.timeout || 30000;
50
+
51
+ // Make HTTP request
52
+ return this.http.post<ChatApiResponse>(this.config.apiUrl, request, { headers }).pipe(
53
+ timeout(timeoutMs),
54
+ this.applyRetryStrategy(),
55
+ map((response) => this.validateResponse(response)),
56
+ catchError((error) => this.handleError(error)),
57
+ );
58
+ }
59
+
60
+ /**
61
+ * Build request payload with current tenant context
62
+ */
63
+ private buildRequest(message: string, history?: Message[]): ChatApiRequest {
64
+ const request: ChatApiRequest = {
65
+ message,
66
+ timestamp: new Date().toISOString(),
67
+ };
68
+
69
+ // Include history if enabled and provided
70
+ if (this.config.includeHistory && history && history.length > 0) {
71
+ const maxMessages = this.config.maxHistoryMessages || 10;
72
+ request.history = history.slice(-maxMessages);
73
+ }
74
+
75
+ return request;
76
+ }
77
+
78
+ /**
79
+ * Build HTTP headers
80
+ */
81
+ private buildHeaders(): HttpHeaders {
82
+ let headers = new HttpHeaders({
83
+ 'Content-Type': 'application/json',
84
+ });
85
+
86
+ // Add API key if provided
87
+ if (this.config.apiKey) {
88
+ headers = headers.set('Authorization', `Bearer ${this.config.apiKey}`);
89
+ }
90
+
91
+ // Headers (License and Auth) are now handled globally by AuthInterceptor
92
+ // Add custom headers if provided if any specific to this service
93
+ if (this.config.customHeaders) {
94
+ Object.entries(this.config.customHeaders).forEach(([key, value]) => {
95
+ headers = headers.set(key, value);
96
+ });
97
+ }
98
+
99
+ return headers;
100
+ }
101
+
102
+ /**
103
+ * Apply retry strategy based on configuration
104
+ */
105
+ private applyRetryStrategy() {
106
+ return (source: Observable<ChatApiResponse>) => {
107
+ if (!this.config.enableRetry) {
108
+ return source;
109
+ }
110
+
111
+ const retryAttempts = this.config.retryAttempts || 2;
112
+ const retryDelay = this.config.retryDelay || 1000;
113
+
114
+ return source.pipe(
115
+ retry({
116
+ count: retryAttempts,
117
+ delay: (error, retryCount) => {
118
+ // Only retry on network errors or 5xx server errors
119
+ if (this.shouldRetry(error)) {
120
+ logger.warn(`Retrying API request (attempt: ${retryCount}/${retryAttempts})...`);
121
+ return timer(retryDelay * retryCount);
122
+ }
123
+ // Don't retry on client errors (4xx)
124
+ return throwError(() => error);
125
+ },
126
+ }),
127
+ );
128
+ };
129
+ }
130
+
131
+ /**
132
+ * Determine if error should trigger a retry
133
+ */
134
+ private shouldRetry(error: any): boolean {
135
+ if (error instanceof HttpErrorResponse) {
136
+ // Retry on network errors or 5xx server errors
137
+ return error.status === 0 || error.status >= 500;
138
+ }
139
+ // Retry on timeout errors
140
+ if (error.name === 'TimeoutError') {
141
+ return true;
142
+ }
143
+ return false;
144
+ }
145
+
146
+ /**
147
+ * Validate API response
148
+ */
149
+ private validateResponse(response: ChatApiResponse): ChatApiResponse {
150
+ if (!response || !response.reply) {
151
+ throw {
152
+ message: 'Invalid API response: missing reply field',
153
+ code: 'INVALID_RESPONSE',
154
+ } as ChatApiError;
155
+ }
156
+ return response;
157
+ }
158
+
159
+ /**
160
+ * Handle API errors
161
+ */
162
+ private handleError(error: any): Observable<never> {
163
+ let apiError: ChatApiError;
164
+
165
+ if (error instanceof HttpErrorResponse) {
166
+ // HTTP error
167
+ apiError = {
168
+ message: ErrorHandlerUtil.handleError(error),
169
+ code: error.error?.code || 'HTTP_ERROR',
170
+ statusCode: error.status,
171
+ details: error.error,
172
+ };
173
+ } else if (error.name === 'TimeoutError') {
174
+ // Timeout error
175
+ apiError = {
176
+ message: 'Request timeout - please try again',
177
+ code: 'TIMEOUT',
178
+ statusCode: 408,
179
+ };
180
+ } else {
181
+ // Other errors
182
+ apiError = {
183
+ message: error.message || 'Unknown error occurred',
184
+ code: error.code || 'UNKNOWN_ERROR',
185
+ details: error,
186
+ };
187
+ }
188
+
189
+ logger.error('Chatbot API Error:', apiError);
190
+ SnackbarUtils.error(apiError.message);
191
+ return throwError(() => apiError);
192
+ }
193
+
194
+ /**
195
+ * Check if API is enabled
196
+ */
197
+ isApiEnabled(): boolean {
198
+ return this.config.enableApi === true && !!this.config.apiUrl;
199
+ }
200
+
201
+ /**
202
+ * Get current API configuration
203
+ */
204
+ getConfig(): DoohbotApiConfig {
205
+ return { ...this.config };
206
+ }
207
+ }
@@ -0,0 +1,171 @@
1
+ import { inject, Injectable, signal } from '@angular/core';
2
+ import { HttpClient } from '@angular/common/http';
3
+ import { firstValueFrom } from 'rxjs';
4
+ import {
5
+ LicenseFileContent,
6
+ LicenseRegistry,
7
+ LicensingContext,
8
+ LicensePackage,
9
+ } from '../models/license.model';
10
+ import logger from '../utils/logger.service';
11
+ import { CoreConfigService } from './core-config.service';
12
+
13
+ @Injectable({
14
+ providedIn: 'root',
15
+ })
16
+ export class LicenseService {
17
+ private http = inject(HttpClient);
18
+ private coreConfig = inject(CoreConfigService);
19
+ private registry = signal<LicenseRegistry | null>(null);
20
+
21
+ /**
22
+ * Load the license configuration from a JSON file.
23
+ * Supports both Hierarchical (entitlements) and Flat-map (package:key) formats.
24
+ * @param filePath Path to the license JSON file
25
+ */
26
+ async loadLicenseFile(filePath?: string): Promise<void> {
27
+ try {
28
+ const finalPath = filePath || this.coreConfig.licenseFilePath;
29
+
30
+ const data = await firstValueFrom(this.http.get<any>(finalPath));
31
+
32
+ if (!data) {
33
+ throw new Error('Empty license file');
34
+ }
35
+
36
+ // Detection: Hierarchical Format (subjectId/licenses array)
37
+ if (data.licenses && Array.isArray(data.licenses)) {
38
+ this.processHierarchicalLicense(data);
39
+ }
40
+ // Detection: Flat Map Format (packageId: key)
41
+ else {
42
+ this.processFlatMapLicense(data);
43
+ }
44
+ } catch (error) {
45
+ // Industry pattern: Silent loading for optional registry files
46
+ logger.log(
47
+ '[LicenseService] No external license file found or failed to load. Falling back to AppConst.',
48
+ );
49
+ this.registry.set(null);
50
+ }
51
+ }
52
+
53
+ private processHierarchicalLicense(data: LicenseFileContent): void {
54
+ const subjectMap = new Map<string, LicensePackage>();
55
+
56
+ data.licenses.forEach((license) => {
57
+ const key = `${license.subjectType}:${license.subjectId}`;
58
+ subjectMap.set(key, license.packages);
59
+ });
60
+
61
+ this.registry.set({
62
+ accountId: data.accountId,
63
+ subjectLicenses: subjectMap,
64
+ });
65
+
66
+ logger.log(`[LicenseService] Hierarchical Registry loaded for account: ${data.accountId}`);
67
+ }
68
+
69
+ private processFlatMapLicense(data: Record<string, string>): void {
70
+ // Flat-map format: { "tenantName": "license_key" }
71
+ // Convert each entry to: tenant:tenantName -> { doohbot: license_key }
72
+
73
+ const subjectMap = new Map<string, LicensePackage>();
74
+
75
+ Object.entries(data).forEach(([tenantName, licenseKey]) => {
76
+ const tenantKey = `tenant:${tenantName}`;
77
+ subjectMap.set(tenantKey, {
78
+ doohbot: licenseKey,
79
+ });
80
+ });
81
+
82
+ this.registry.set({
83
+ accountId: 'FLAT_MAP_REGISTRY',
84
+ subjectLicenses: subjectMap,
85
+ });
86
+
87
+ logger.log(`[LicenseService] Flat-map registry loaded with ${subjectMap.size} tenant(s)`);
88
+ }
89
+
90
+ /**
91
+ * Resolve the correct license key based on context and requested package
92
+ * @param context The current licensing context (tenant, user, roles)
93
+ * @param packageId The ID of the package requesting a license
94
+ * @returns The resolved license key, or null if unauthorized
95
+ */
96
+ resolveLicenseKey(context: LicensingContext, packageId: string): string | null {
97
+ // Hierarchical Registry (Most Specific)
98
+ const keyFromRegistry = this.resolveFromRegistry(context, packageId);
99
+ if (keyFromRegistry) return keyFromRegistry;
100
+
101
+ logger.warn(
102
+ `[LicenseService] No license found for package: ${packageId} and user: ${context.principalId}`,
103
+ );
104
+ return null;
105
+ }
106
+
107
+ private resolveFromRegistry(context: LicensingContext, packageId: string): string | null {
108
+ const reg = this.registry();
109
+ if (!reg) return null;
110
+
111
+ // Strict Account Check
112
+ if (reg.accountId !== 'EXTERNAL_OVERRIDE' && reg.accountId !== context.tenantId) {
113
+ logger.error(
114
+ `[LicenseService] Account mismatch! Registry: ${reg.accountId}, Context: ${context.tenantId}`,
115
+ );
116
+ return null;
117
+ }
118
+
119
+ const subjectsToSearch = [
120
+ `user:${context.principalId}`,
121
+ ...(context.roles?.map((r) => `role:${r}`) || []),
122
+ `tenant:${context.tenantId}`,
123
+ 'tenant:default', // Fallback for flat-map external files
124
+ ];
125
+
126
+ for (const subjectKey of subjectsToSearch) {
127
+ const packages = reg.subjectLicenses.get(subjectKey);
128
+ if (packages && packages[packageId]) {
129
+ logger.debug(`[LicenseService] Resolved key for ${packageId} via Registry (${subjectKey})`);
130
+ return packages[packageId];
131
+ }
132
+ }
133
+ return null;
134
+ }
135
+
136
+ /**
137
+ * Resolves the license key for the current tenant.
138
+ */
139
+ resolveTenantLicenseKey(tenancyName?: string): string | null {
140
+ const activeTenancy = tenancyName || this.coreConfig.tenancyName;
141
+
142
+ if (!activeTenancy) {
143
+ logger.warn('[LicenseService] No tenancy name found.');
144
+ return null;
145
+ }
146
+
147
+ const reg = this.registry();
148
+ if (!reg) {
149
+ logger.error('[LicenseService] License registry not loaded.');
150
+ return null;
151
+ }
152
+
153
+ const tenantLicenses = reg.subjectLicenses.get(`tenant:${activeTenancy}`);
154
+ const licenseKey = tenantLicenses?.['doohbot'] || null;
155
+
156
+ if (licenseKey) {
157
+ logger.info(`[LicenseService] Resolved Doohbot license for: ${activeTenancy}`);
158
+ } else {
159
+ logger.warn(`[LicenseService] No license key found for tenant: ${activeTenancy}`);
160
+ }
161
+
162
+ return licenseKey;
163
+ }
164
+
165
+ /**
166
+ * Check if a registry is currently loaded
167
+ */
168
+ isRegistryLoaded(): boolean {
169
+ return this.registry() !== null;
170
+ }
171
+ }