@talkpilot/core-db 1.3.84 → 1.3.86

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 (229) hide show
  1. package/.cursor/rules/development.mdc +65 -65
  2. package/AGENTS.md +49 -49
  3. package/DEVELOPMENT.md +141 -141
  4. package/README.md +847 -847
  5. package/dist/talkpilot/flows/flows.schema.d.ts +9 -0
  6. package/dist/talkpilot/flows/flows.schema.d.ts.map +1 -1
  7. package/dist/talkpilot/flows/flows.schema.js +7 -0
  8. package/dist/talkpilot/flows/flows.schema.js.map +1 -1
  9. package/dist/talkpilot/flows/flows.types.d.ts +3 -0
  10. package/dist/talkpilot/flows/flows.types.d.ts.map +1 -1
  11. package/dist/talkpilot/subscriptions/subscriptions.utils.d.ts +4 -0
  12. package/dist/talkpilot/subscriptions/subscriptions.utils.d.ts.map +1 -0
  13. package/dist/talkpilot/subscriptions/subscriptions.utils.js +20 -0
  14. package/dist/talkpilot/subscriptions/subscriptions.utils.js.map +1 -0
  15. package/jest.config.js +20 -20
  16. package/package.json +46 -46
  17. package/src/__tests__/setup.ts +20 -20
  18. package/src/bulkWrite/__tests__/bulkWrite.spec.ts +65 -65
  19. package/src/bulkWrite/bulkWrite.ops.ts +45 -45
  20. package/src/bulkWrite/bulkWrite.types.ts +4 -4
  21. package/src/bulkWrite/index.ts +2 -2
  22. package/src/config.ts +9 -9
  23. package/src/configuration/index.ts +17 -17
  24. package/src/configuration/internalModels/index.ts +3 -3
  25. package/src/configuration/internalModels/internalModels.constants.ts +1 -1
  26. package/src/configuration/internalModels/internalModels.getters.ts +33 -33
  27. package/src/configuration/internalModels/internalModels.types.ts +12 -12
  28. package/src/configuration/models/__tests__/models.getters.spec.ts +67 -67
  29. package/src/configuration/models/index.ts +27 -27
  30. package/src/configuration/models/models.constants.ts +20 -20
  31. package/src/configuration/models/models.getters.ts +71 -71
  32. package/src/configuration/models/models.types.ts +80 -80
  33. package/src/configuration/mongodb-client.ts +62 -62
  34. package/src/configuration/prompts/index.ts +2 -2
  35. package/src/configuration/prompts/prompts.getters.ts +49 -49
  36. package/src/configuration/prompts/prompts.types.ts +11 -11
  37. package/src/connection.ts +81 -81
  38. package/src/index.ts +48 -48
  39. package/src/municipal/__tests__/validation.spec.ts +62 -62
  40. package/src/municipal/cities/cities.getters.ts +50 -50
  41. package/src/municipal/cities/cities.types.ts +11 -11
  42. package/src/municipal/cities/index.ts +2 -2
  43. package/src/municipal/departmentsSubjects/__tests__/departmentsSubjects.spec.ts +272 -272
  44. package/src/municipal/departmentsSubjects/departmentsSubjects.getters.ts +317 -317
  45. package/src/municipal/departmentsSubjects/departmentsSubjects.types.ts +73 -73
  46. package/src/municipal/departmentsSubjects/index.ts +9 -9
  47. package/src/municipal/index.ts +23 -23
  48. package/src/municipal/mongodb-client.ts +61 -61
  49. package/src/municipal/muniIssues/__tests__/muniIssues.getters.spec.ts +87 -87
  50. package/src/municipal/muniIssues/__tests__/muniIssues.setters.spec.ts +219 -219
  51. package/src/municipal/muniIssues/__tests__/muniIssues.setup.spec.ts +93 -93
  52. package/src/municipal/muniIssues/index.ts +24 -24
  53. package/src/municipal/muniIssues/muniIssues.constants.ts +27 -27
  54. package/src/municipal/muniIssues/muniIssues.getters.ts +73 -73
  55. package/src/municipal/muniIssues/muniIssues.schema.ts +85 -85
  56. package/src/municipal/muniIssues/muniIssues.setters.ts +87 -87
  57. package/src/municipal/muniIssues/muniIssues.setup.ts +65 -65
  58. package/src/municipal/muniIssues/muniIssues.types.ts +67 -67
  59. package/src/municipal/residents/__tests__/residents.spec.ts +92 -92
  60. package/src/municipal/residents/index.ts +4 -4
  61. package/src/municipal/residents/residents.constants.ts +2 -2
  62. package/src/municipal/residents/residents.getters.ts +42 -42
  63. package/src/municipal/residents/residents.schema.ts +28 -28
  64. package/src/municipal/residents/residents.types.ts +17 -17
  65. package/src/municipal/streets/__tests__/streets.spec.ts +253 -253
  66. package/src/municipal/streets/index.ts +2 -2
  67. package/src/municipal/streets/streets.getters.ts +140 -140
  68. package/src/municipal/streets/streets.types.ts +19 -19
  69. package/src/municipal/systemInstructions/__tests__/getters.spec.ts +113 -113
  70. package/src/municipal/systemInstructions/__tests__/setters.spec.ts +274 -274
  71. package/src/municipal/systemInstructions/index.ts +7 -7
  72. package/src/municipal/systemInstructions/instructions.getters.ts +57 -57
  73. package/src/municipal/systemInstructions/instructions.setters.ts +119 -119
  74. package/src/municipal/systemInstructions/instructions.types.ts +30 -30
  75. package/src/municipal/tickets/__tests__/tickets.getters.spec.ts +30 -30
  76. package/src/municipal/tickets/__tests__/tickets.statistics.spec.ts +99 -99
  77. package/src/municipal/tickets/index.ts +9 -9
  78. package/src/municipal/tickets/tickets.constants.ts +8 -8
  79. package/src/municipal/tickets/tickets.getters.ts +121 -121
  80. package/src/municipal/tickets/tickets.statistics.aggregation.ts +110 -110
  81. package/src/municipal/tickets/tickets.statistics.getters.ts +145 -145
  82. package/src/municipal/tickets/tickets.types.ts +54 -54
  83. package/src/municipal/utils/types.ts +11 -11
  84. package/src/talkpilot/__tests__/db.spec.ts +38 -38
  85. package/src/talkpilot/__tests__/mongodb-client.spec.ts +18 -18
  86. package/src/talkpilot/__tests__/validation.spec.ts +68 -68
  87. package/src/talkpilot/agents/__tests__/agents.getters.spec.ts +29 -29
  88. package/src/talkpilot/agents/agents.getters.ts +34 -34
  89. package/src/talkpilot/agents/agents.types.ts +14 -14
  90. package/src/talkpilot/agents/index.ts +2 -2
  91. package/src/talkpilot/backgroundToolResults/__tests__/backgroundToolResults.getters.spec.ts +147 -147
  92. package/src/talkpilot/backgroundToolResults/backgroundToolResults.getters.ts +65 -65
  93. package/src/talkpilot/backgroundToolResults/backgroundToolResults.types.ts +23 -23
  94. package/src/talkpilot/backgroundToolResults/index.ts +2 -2
  95. package/src/talkpilot/callTokenUsage/__tests__/callTokenUsage.getters.spec.ts +57 -57
  96. package/src/talkpilot/callTokenUsage/callTokenUsage.getters.ts +42 -42
  97. package/src/talkpilot/callTokenUsage/callTokenUsage.types.ts +28 -28
  98. package/src/talkpilot/callTokenUsage/index.ts +2 -2
  99. package/src/talkpilot/calls/__tests__/callStats.utils.spec.ts +128 -128
  100. package/src/talkpilot/calls/__tests__/calls.dashboard.spec.ts +229 -229
  101. package/src/talkpilot/calls/__tests__/calls.spec.ts +519 -519
  102. package/src/talkpilot/calls/__tests__/calls.statistics.spec.ts +483 -483
  103. package/src/talkpilot/calls/calls.constants.ts +57 -57
  104. package/src/talkpilot/calls/calls.getters.ts +295 -295
  105. package/src/talkpilot/calls/calls.statistics.getters.ts +668 -668
  106. package/src/talkpilot/calls/calls.statistics.types.ts +48 -48
  107. package/src/talkpilot/calls/calls.types.ts +168 -168
  108. package/src/talkpilot/calls/dashboard/calls.dashboard.ts +295 -295
  109. package/src/talkpilot/calls/dashboard/calls.dashboard.types.ts +57 -57
  110. package/src/talkpilot/calls/index.ts +6 -6
  111. package/src/talkpilot/clientAudioBuffers/__tests__/clientAudioBuffer.getters.spec.ts +160 -160
  112. package/src/talkpilot/clientAudioBuffers/clientAudioBuffer.getters.ts +117 -117
  113. package/src/talkpilot/clientAudioBuffers/clientsAudioBuffers.types.ts +25 -25
  114. package/src/talkpilot/clientAudioBuffers/index.ts +2 -2
  115. package/src/talkpilot/clients/__tests__/clients.quota.spec.ts +123 -123
  116. package/src/talkpilot/clients/clients.getters.ts +19 -19
  117. package/src/talkpilot/clients/clients.quota.getters.ts +119 -119
  118. package/src/talkpilot/clients/clients.quota.types.ts +27 -27
  119. package/src/talkpilot/clients/clients.types.ts +18 -18
  120. package/src/talkpilot/clients/index.ts +4 -4
  121. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.getters.spec.ts +423 -423
  122. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +212 -212
  123. package/src/talkpilot/clientsConfig/clientsConfig.constants.ts +2 -2
  124. package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +247 -247
  125. package/src/talkpilot/clientsConfig/clientsConfig.types.ts +137 -137
  126. package/src/talkpilot/clientsConfig/index.ts +3 -3
  127. package/src/talkpilot/contextNotes/__tests__/contextNotes.getters.spec.ts +217 -217
  128. package/src/talkpilot/contextNotes/contextNotes.getters.ts +85 -85
  129. package/src/talkpilot/contextNotes/contextNotes.types.ts +20 -20
  130. package/src/talkpilot/contextNotes/index.ts +2 -2
  131. package/src/talkpilot/flows/__tests__/flows.schema.spec.ts +163 -152
  132. package/src/talkpilot/flows/flows.getter.ts +34 -34
  133. package/src/talkpilot/flows/flows.schema.ts +203 -196
  134. package/src/talkpilot/flows/flows.types.ts +221 -220
  135. package/src/talkpilot/flows/index.ts +7 -7
  136. package/src/talkpilot/groups/__tests__/groups.spec.ts +90 -90
  137. package/src/talkpilot/groups/__tests__/phone.utils.spec.ts +32 -32
  138. package/src/talkpilot/groups/groups.getters.ts +30 -30
  139. package/src/talkpilot/groups/groups.types.ts +29 -29
  140. package/src/talkpilot/groups/index.ts +3 -3
  141. package/src/talkpilot/groups/phone.utils.ts +46 -46
  142. package/src/talkpilot/index.ts +32 -32
  143. package/src/talkpilot/leads/index.ts +2 -2
  144. package/src/talkpilot/leads/leads.getter.ts +6 -6
  145. package/src/talkpilot/leads/leads.schema.ts +33 -33
  146. package/src/talkpilot/leads/leads.types.ts +20 -20
  147. package/src/talkpilot/mongodb-client.ts +78 -78
  148. package/src/talkpilot/phone_numbers/__tests__/phone_numbers.spec.ts +530 -530
  149. package/src/talkpilot/phone_numbers/index.ts +2 -2
  150. package/src/talkpilot/phone_numbers/phone_numbers.getter.ts +240 -240
  151. package/src/talkpilot/phone_numbers/phone_numbers.schema.ts +17 -17
  152. package/src/talkpilot/phone_numbers/phone_numbers.types.ts +30 -30
  153. package/src/talkpilot/phone_numbers/phone_numbers.utils.ts +9 -9
  154. package/src/talkpilot/plans/__tests__/plans.spec.ts +70 -70
  155. package/src/talkpilot/plans/index.ts +2 -2
  156. package/src/talkpilot/plans/plans.getters.ts +132 -132
  157. package/src/talkpilot/plans/plans.types.ts +89 -89
  158. package/src/talkpilot/products/__tests__/products.getters.spec.ts +44 -44
  159. package/src/talkpilot/products/index.ts +2 -2
  160. package/src/talkpilot/products/products.getters.ts +12 -12
  161. package/src/talkpilot/products/products.types.ts +9 -9
  162. package/src/talkpilot/results/index.ts +7 -7
  163. package/src/talkpilot/results/results.getter.ts +39 -39
  164. package/src/talkpilot/results/results.schema.ts +25 -25
  165. package/src/talkpilot/results/results.types.ts +34 -34
  166. package/src/talkpilot/retry_analyze/__tests__/retryAnalyze.getters.spec.ts +156 -156
  167. package/src/talkpilot/retry_analyze/index.ts +2 -2
  168. package/src/talkpilot/retry_analyze/retryAnalyze.getters.ts +84 -84
  169. package/src/talkpilot/retry_analyze/retryAnalyze.types.ts +13 -13
  170. package/src/talkpilot/sessions/__tests__/sessions.spec.ts +147 -147
  171. package/src/talkpilot/sessions/index.ts +2 -2
  172. package/src/talkpilot/sessions/sessions.getter.ts +92 -92
  173. package/src/talkpilot/sessions/sessions.schema.ts +34 -34
  174. package/src/talkpilot/sessions/sessions.types.ts +30 -30
  175. package/src/talkpilot/subscriptions/__tests__/subscriptions.getters.utils.spec.ts +45 -45
  176. package/src/talkpilot/subscriptions/index.ts +3 -3
  177. package/src/talkpilot/subscriptions/subscriptions.getters.ts +146 -146
  178. package/src/talkpilot/subscriptions/subscriptions.getters.utils.ts +33 -33
  179. package/src/talkpilot/subscriptions/subscriptions.types.ts +66 -66
  180. package/src/talkpilot/utils/__tests__/query.utils.spec.ts +49 -49
  181. package/src/talkpilot/utils/query.utils.ts +21 -21
  182. package/src/test-utils/db-utils.ts +33 -33
  183. package/src/test-utils/factories/index.ts +19 -19
  184. package/src/test-utils/factories/municipal/cities.ts +16 -16
  185. package/src/test-utils/factories/municipal/departmentsSubjects.ts +37 -37
  186. package/src/test-utils/factories/municipal/muniIssues.ts +32 -32
  187. package/src/test-utils/factories/municipal/residents.ts +20 -20
  188. package/src/test-utils/factories/municipal/streets.ts +22 -22
  189. package/src/test-utils/factories/municipal/tickets.ts +39 -39
  190. package/src/test-utils/factories/talkpilot/agents.ts +19 -19
  191. package/src/test-utils/factories/talkpilot/calls.ts +37 -37
  192. package/src/test-utils/factories/talkpilot/clientAudioBuffers.ts +20 -20
  193. package/src/test-utils/factories/talkpilot/clientsConfig.ts +18 -18
  194. package/src/test-utils/factories/talkpilot/contextNotes.ts +40 -40
  195. package/src/test-utils/factories/talkpilot/flows.ts +33 -33
  196. package/src/test-utils/factories/talkpilot/groups.ts +33 -33
  197. package/src/test-utils/factories/talkpilot/phone_numbers.ts +22 -22
  198. package/src/test-utils/factories/talkpilot/sessions.ts +35 -35
  199. package/src/test-utils/factories/websitalk/knowledgeDocuments.ts +29 -29
  200. package/src/test-utils/factories/websitalk/scanResources.ts +26 -26
  201. package/src/test-utils/factories/websitalk/scans.ts +30 -30
  202. package/src/test-utils/factories/websitalk/websiteUrls.ts +17 -17
  203. package/src/utils/date.utils.ts +126 -126
  204. package/src/utils/shared.types.ts +4 -4
  205. package/src/utils/validation.ts +23 -23
  206. package/src/websitalk/index.ts +18 -18
  207. package/src/websitalk/knowledgeDocuments/__tests__/knowledgeDocuments.spec.ts +238 -238
  208. package/src/websitalk/knowledgeDocuments/index.ts +3 -3
  209. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.constants.ts +26 -26
  210. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.getters.ts +95 -95
  211. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.types.ts +75 -75
  212. package/src/websitalk/mongodb-client.ts +61 -61
  213. package/src/websitalk/scanResources/__tests__/scanResources.spec.ts +267 -267
  214. package/src/websitalk/scanResources/index.ts +4 -4
  215. package/src/websitalk/scanResources/scanResources.constants.ts +60 -60
  216. package/src/websitalk/scanResources/scanResources.getters.ts +128 -128
  217. package/src/websitalk/scanResources/scanResources.types.ts +105 -105
  218. package/src/websitalk/scanResources/scanResources.utils.ts +31 -31
  219. package/src/websitalk/scans/__tests__/scans.spec.ts +362 -362
  220. package/src/websitalk/scans/index.ts +4 -4
  221. package/src/websitalk/scans/scans.constants.ts +18 -18
  222. package/src/websitalk/scans/scans.getters.ts +172 -172
  223. package/src/websitalk/scans/scans.types.ts +58 -58
  224. package/src/websitalk/scans/scans.utils.ts +5 -5
  225. package/src/websitalk/websiteUrls/__tests__/websiteUrls.spec.ts +77 -77
  226. package/src/websitalk/websiteUrls/index.ts +2 -2
  227. package/src/websitalk/websiteUrls/websiteUrls.getters.ts +65 -65
  228. package/src/websitalk/websiteUrls/websiteUrls.types.ts +13 -13
  229. package/tsconfig.json +23 -23
@@ -1,212 +1,212 @@
1
- import {
2
- createClientConfigDoc,
3
- getClientConfig,
4
- getClientDisplayName,
5
- } from "../clientsConfig.getters";
6
- import { createClientConfig } from "../../../test-utils/factories";
7
-
8
- describe("db.clientsConfig", () => {
9
- describe("getClientConfig", () => {
10
- it("should return client config by clientId", async () => {
11
- const clientId = "test-client-id";
12
- const clientConfig = createClientConfig({
13
- clientId,
14
- language: "Hebrew",
15
- products: { feature1: true, feature2: false } as any,
16
- });
17
-
18
- await createClientConfigDoc(clientConfig);
19
-
20
- const result = await getClientConfig(clientId);
21
-
22
- expect(result).toMatchObject({
23
- clientId,
24
- language: "Hebrew",
25
- products: { feature1: true, feature2: false },
26
- });
27
- });
28
-
29
- it("should support websiteTalk product config", async () => {
30
- const clientId = "websiteTalk-test";
31
- const clientConfig = createClientConfig({
32
- clientId,
33
- products: {
34
- websiteTalk: {
35
- companyName: "Acme Ltd",
36
- timezone: "Asia/Jerusalem",
37
- language: "he",
38
- },
39
- },
40
- });
41
-
42
- await createClientConfigDoc(clientConfig);
43
-
44
- const result = await getClientConfig(clientId);
45
-
46
- expect(result).toMatchObject({
47
- clientId,
48
- products: {
49
- websiteTalk: {
50
- companyName: "Acme Ltd",
51
- timezone: "Asia/Jerusalem",
52
- language: "he",
53
- },
54
- },
55
- });
56
- });
57
-
58
- it("should return null for non-existent clientId", async () => {
59
- const result = await getClientConfig("non-existent-client");
60
- expect(result).toBeNull();
61
- });
62
-
63
- it("should return quota.clientDisplayName when set on client config", async () => {
64
- const clientId = "display-name-client";
65
- await createClientConfigDoc(
66
- createClientConfig({
67
- clientId,
68
- quota: { totalQuota: 100, usedQuota: 0, clientDisplayName: "Acme Corp" },
69
- }),
70
- );
71
-
72
- expect(await getClientDisplayName(clientId)).toBe("Acme Corp");
73
- });
74
-
75
- it("should return '-' when quota.clientDisplayName is missing", async () => {
76
- const clientId = "no-display-name-client";
77
- await createClientConfigDoc(
78
- createClientConfig({ clientId, quota: { totalQuota: 100, usedQuota: 0 } }),
79
- );
80
-
81
- expect(await getClientDisplayName(clientId)).toBe("-");
82
- });
83
-
84
- it("should return '-' when client config is missing", async () => {
85
- expect(await getClientDisplayName("missing-client")).toBe("-");
86
- });
87
-
88
- it("given moked_106 with both toolsPrompts when saved and retrieved then both prompts are persisted", async () => {
89
- // Given
90
- const clientId = "tools-prompts-both";
91
- const clientConfig = createClientConfig({
92
- clientId,
93
- products: {
94
- municipal: {
95
- cityName: "ashdod",
96
- timezone: "Asia/Jerusalem",
97
- moked_106: {
98
- toolsPrompts: {
99
- findSubjectsSystemPrompt: "Custom subjects prompt",
100
- findStreetsSystemPrompt: "Custom streets prompt",
101
- },
102
- },
103
- },
104
- },
105
- });
106
-
107
- // When
108
- await createClientConfigDoc(clientConfig);
109
- const result = await getClientConfig(clientId);
110
-
111
- // Then
112
- expect(result?.products.municipal?.moked_106?.toolsPrompts).toMatchObject(
113
- {
114
- findSubjectsSystemPrompt: "Custom subjects prompt",
115
- findStreetsSystemPrompt: "Custom streets prompt",
116
- },
117
- );
118
- });
119
-
120
- it("given moked_106 with findSubjectsSystemPrompt only when saved and retrieved then findStreetsSystemPrompt is undefined", async () => {
121
- // Given
122
- const clientId = "tools-prompts-subjects-only";
123
- const clientConfig = createClientConfig({
124
- clientId,
125
- products: {
126
- municipal: {
127
- cityName: "ashdod",
128
- timezone: "Asia/Jerusalem",
129
- moked_106: {
130
- toolsPrompts: {
131
- findSubjectsSystemPrompt: "Subjects only prompt",
132
- },
133
- },
134
- },
135
- },
136
- });
137
-
138
- // When
139
- await createClientConfigDoc(clientConfig);
140
- const result = await getClientConfig(clientId);
141
-
142
- // Then
143
- expect(
144
- result?.products.municipal?.moked_106?.toolsPrompts
145
- ?.findSubjectsSystemPrompt,
146
- ).toBe("Subjects only prompt");
147
- expect(
148
- result?.products.municipal?.moked_106?.toolsPrompts
149
- ?.findStreetsSystemPrompt,
150
- ).toBeUndefined();
151
- });
152
-
153
- it("given moked_106 without toolsPrompts when saved and retrieved then toolsPrompts is undefined", async () => {
154
- // Given
155
- const clientId = "tools-prompts-absent";
156
- const clientConfig = createClientConfig({
157
- clientId,
158
- products: {
159
- municipal: {
160
- cityName: "ashdod",
161
- timezone: "Asia/Jerusalem",
162
- moked_106: {
163
- avoidSaveTickets: true,
164
- },
165
- },
166
- },
167
- });
168
-
169
- // When
170
- await createClientConfigDoc(clientConfig);
171
- const result = await getClientConfig(clientId);
172
-
173
- // Then
174
- expect(
175
- result?.products.municipal?.moked_106?.toolsPrompts,
176
- ).toBeUndefined();
177
- });
178
-
179
- it("should support communications config", async () => {
180
- const clientId = "communications-test";
181
- const clientConfig = createClientConfig({
182
- clientId,
183
- communications: {
184
- sendGrid: {
185
- emailTo: ["test@example.com"],
186
- templateId: "temp-123",
187
- senderId: "sender-123",
188
- },
189
- sms: {},
190
- whatsapp: {},
191
- },
192
- });
193
-
194
- await createClientConfigDoc(clientConfig);
195
-
196
- const result = await getClientConfig(clientId);
197
-
198
- expect(result).toMatchObject({
199
- clientId,
200
- communications: {
201
- sendGrid: {
202
- emailTo: ["test@example.com"],
203
- templateId: "temp-123",
204
- senderId: "sender-123",
205
- },
206
- sms: {},
207
- whatsapp: {},
208
- },
209
- });
210
- });
211
- });
212
- });
1
+ import {
2
+ createClientConfigDoc,
3
+ getClientConfig,
4
+ getClientDisplayName,
5
+ } from "../clientsConfig.getters";
6
+ import { createClientConfig } from "../../../test-utils/factories";
7
+
8
+ describe("db.clientsConfig", () => {
9
+ describe("getClientConfig", () => {
10
+ it("should return client config by clientId", async () => {
11
+ const clientId = "test-client-id";
12
+ const clientConfig = createClientConfig({
13
+ clientId,
14
+ language: "Hebrew",
15
+ products: { feature1: true, feature2: false } as any,
16
+ });
17
+
18
+ await createClientConfigDoc(clientConfig);
19
+
20
+ const result = await getClientConfig(clientId);
21
+
22
+ expect(result).toMatchObject({
23
+ clientId,
24
+ language: "Hebrew",
25
+ products: { feature1: true, feature2: false },
26
+ });
27
+ });
28
+
29
+ it("should support websiteTalk product config", async () => {
30
+ const clientId = "websiteTalk-test";
31
+ const clientConfig = createClientConfig({
32
+ clientId,
33
+ products: {
34
+ websiteTalk: {
35
+ companyName: "Acme Ltd",
36
+ timezone: "Asia/Jerusalem",
37
+ language: "he",
38
+ },
39
+ },
40
+ });
41
+
42
+ await createClientConfigDoc(clientConfig);
43
+
44
+ const result = await getClientConfig(clientId);
45
+
46
+ expect(result).toMatchObject({
47
+ clientId,
48
+ products: {
49
+ websiteTalk: {
50
+ companyName: "Acme Ltd",
51
+ timezone: "Asia/Jerusalem",
52
+ language: "he",
53
+ },
54
+ },
55
+ });
56
+ });
57
+
58
+ it("should return null for non-existent clientId", async () => {
59
+ const result = await getClientConfig("non-existent-client");
60
+ expect(result).toBeNull();
61
+ });
62
+
63
+ it("should return quota.clientDisplayName when set on client config", async () => {
64
+ const clientId = "display-name-client";
65
+ await createClientConfigDoc(
66
+ createClientConfig({
67
+ clientId,
68
+ quota: { totalQuota: 100, usedQuota: 0, clientDisplayName: "Acme Corp" },
69
+ }),
70
+ );
71
+
72
+ expect(await getClientDisplayName(clientId)).toBe("Acme Corp");
73
+ });
74
+
75
+ it("should return '-' when quota.clientDisplayName is missing", async () => {
76
+ const clientId = "no-display-name-client";
77
+ await createClientConfigDoc(
78
+ createClientConfig({ clientId, quota: { totalQuota: 100, usedQuota: 0 } }),
79
+ );
80
+
81
+ expect(await getClientDisplayName(clientId)).toBe("-");
82
+ });
83
+
84
+ it("should return '-' when client config is missing", async () => {
85
+ expect(await getClientDisplayName("missing-client")).toBe("-");
86
+ });
87
+
88
+ it("given moked_106 with both toolsPrompts when saved and retrieved then both prompts are persisted", async () => {
89
+ // Given
90
+ const clientId = "tools-prompts-both";
91
+ const clientConfig = createClientConfig({
92
+ clientId,
93
+ products: {
94
+ municipal: {
95
+ cityName: "ashdod",
96
+ timezone: "Asia/Jerusalem",
97
+ moked_106: {
98
+ toolsPrompts: {
99
+ findSubjectsSystemPrompt: "Custom subjects prompt",
100
+ findStreetsSystemPrompt: "Custom streets prompt",
101
+ },
102
+ },
103
+ },
104
+ },
105
+ });
106
+
107
+ // When
108
+ await createClientConfigDoc(clientConfig);
109
+ const result = await getClientConfig(clientId);
110
+
111
+ // Then
112
+ expect(result?.products.municipal?.moked_106?.toolsPrompts).toMatchObject(
113
+ {
114
+ findSubjectsSystemPrompt: "Custom subjects prompt",
115
+ findStreetsSystemPrompt: "Custom streets prompt",
116
+ },
117
+ );
118
+ });
119
+
120
+ it("given moked_106 with findSubjectsSystemPrompt only when saved and retrieved then findStreetsSystemPrompt is undefined", async () => {
121
+ // Given
122
+ const clientId = "tools-prompts-subjects-only";
123
+ const clientConfig = createClientConfig({
124
+ clientId,
125
+ products: {
126
+ municipal: {
127
+ cityName: "ashdod",
128
+ timezone: "Asia/Jerusalem",
129
+ moked_106: {
130
+ toolsPrompts: {
131
+ findSubjectsSystemPrompt: "Subjects only prompt",
132
+ },
133
+ },
134
+ },
135
+ },
136
+ });
137
+
138
+ // When
139
+ await createClientConfigDoc(clientConfig);
140
+ const result = await getClientConfig(clientId);
141
+
142
+ // Then
143
+ expect(
144
+ result?.products.municipal?.moked_106?.toolsPrompts
145
+ ?.findSubjectsSystemPrompt,
146
+ ).toBe("Subjects only prompt");
147
+ expect(
148
+ result?.products.municipal?.moked_106?.toolsPrompts
149
+ ?.findStreetsSystemPrompt,
150
+ ).toBeUndefined();
151
+ });
152
+
153
+ it("given moked_106 without toolsPrompts when saved and retrieved then toolsPrompts is undefined", async () => {
154
+ // Given
155
+ const clientId = "tools-prompts-absent";
156
+ const clientConfig = createClientConfig({
157
+ clientId,
158
+ products: {
159
+ municipal: {
160
+ cityName: "ashdod",
161
+ timezone: "Asia/Jerusalem",
162
+ moked_106: {
163
+ avoidSaveTickets: true,
164
+ },
165
+ },
166
+ },
167
+ });
168
+
169
+ // When
170
+ await createClientConfigDoc(clientConfig);
171
+ const result = await getClientConfig(clientId);
172
+
173
+ // Then
174
+ expect(
175
+ result?.products.municipal?.moked_106?.toolsPrompts,
176
+ ).toBeUndefined();
177
+ });
178
+
179
+ it("should support communications config", async () => {
180
+ const clientId = "communications-test";
181
+ const clientConfig = createClientConfig({
182
+ clientId,
183
+ communications: {
184
+ sendGrid: {
185
+ emailTo: ["test@example.com"],
186
+ templateId: "temp-123",
187
+ senderId: "sender-123",
188
+ },
189
+ sms: {},
190
+ whatsapp: {},
191
+ },
192
+ });
193
+
194
+ await createClientConfigDoc(clientConfig);
195
+
196
+ const result = await getClientConfig(clientId);
197
+
198
+ expect(result).toMatchObject({
199
+ clientId,
200
+ communications: {
201
+ sendGrid: {
202
+ emailTo: ["test@example.com"],
203
+ templateId: "temp-123",
204
+ senderId: "sender-123",
205
+ },
206
+ sms: {},
207
+ whatsapp: {},
208
+ },
209
+ });
210
+ });
211
+ });
212
+ });
@@ -1,2 +1,2 @@
1
- /** Maximum number of scans a client may have active at once. */
2
- export const MAX_ACTIVE_SCANS = 3;
1
+ /** Maximum number of scans a client may have active at once. */
2
+ export const MAX_ACTIVE_SCANS = 3;