@talkpilot/core-db 1.3.57 → 1.3.58

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 (249) 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 +778 -799
  5. package/dist/index.d.ts +1 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/talkpilot/clients/clients.getters.d.ts +0 -1
  10. package/dist/talkpilot/clients/clients.getters.d.ts.map +1 -1
  11. package/dist/talkpilot/clients/clients.getters.js +1 -3
  12. package/dist/talkpilot/clients/clients.getters.js.map +1 -1
  13. package/dist/talkpilot/phone_numbers/phone_numbers.getter.d.ts +0 -6
  14. package/dist/talkpilot/phone_numbers/phone_numbers.getter.d.ts.map +1 -1
  15. package/dist/talkpilot/phone_numbers/phone_numbers.getter.js +1 -32
  16. package/dist/talkpilot/phone_numbers/phone_numbers.getter.js.map +1 -1
  17. package/dist/websitalk/scanResources/scanResources.getters.d.ts +1 -0
  18. package/dist/websitalk/scanResources/scanResources.getters.d.ts.map +1 -1
  19. package/dist/websitalk/scanResources/scanResources.getters.js +6 -1
  20. package/dist/websitalk/scanResources/scanResources.getters.js.map +1 -1
  21. package/dist/websitalk/scans/scans.constants.d.ts +3 -1
  22. package/dist/websitalk/scans/scans.constants.d.ts.map +1 -1
  23. package/dist/websitalk/scans/scans.constants.js +3 -0
  24. package/dist/websitalk/scans/scans.constants.js.map +1 -1
  25. package/dist/websitalk/scans/scans.getters.d.ts +1 -0
  26. package/dist/websitalk/scans/scans.getters.d.ts.map +1 -1
  27. package/dist/websitalk/scans/scans.getters.js +6 -1
  28. package/dist/websitalk/scans/scans.getters.js.map +1 -1
  29. package/dist/websitalk/scans/scans.types.d.ts +1 -0
  30. package/dist/websitalk/scans/scans.types.d.ts.map +1 -1
  31. package/jest.config.js +20 -20
  32. package/package.json +46 -46
  33. package/src/__tests__/setup.ts +20 -20
  34. package/src/bulkWrite/__tests__/bulkWrite.spec.ts +65 -65
  35. package/src/bulkWrite/bulkWrite.ops.ts +45 -45
  36. package/src/bulkWrite/bulkWrite.types.ts +4 -4
  37. package/src/bulkWrite/index.ts +2 -2
  38. package/src/config.ts +9 -9
  39. package/src/configuration/index.ts +17 -17
  40. package/src/configuration/internalModels/index.ts +3 -3
  41. package/src/configuration/internalModels/internalModels.constants.ts +1 -1
  42. package/src/configuration/internalModels/internalModels.getters.ts +33 -33
  43. package/src/configuration/internalModels/internalModels.types.ts +12 -12
  44. package/src/configuration/models/__tests__/models.getters.spec.ts +67 -67
  45. package/src/configuration/models/index.ts +27 -27
  46. package/src/configuration/models/models.constants.ts +15 -15
  47. package/src/configuration/models/models.getters.ts +71 -71
  48. package/src/configuration/models/models.types.ts +80 -80
  49. package/src/configuration/mongodb-client.ts +62 -62
  50. package/src/configuration/prompts/index.ts +2 -2
  51. package/src/configuration/prompts/prompts.getters.ts +49 -49
  52. package/src/configuration/prompts/prompts.types.ts +11 -11
  53. package/src/connection.ts +81 -81
  54. package/src/index.ts +47 -46
  55. package/src/municipal/__tests__/validation.spec.ts +62 -62
  56. package/src/municipal/cities/cities.getters.ts +50 -50
  57. package/src/municipal/cities/cities.types.ts +11 -11
  58. package/src/municipal/cities/index.ts +2 -2
  59. package/src/municipal/departmentsSubjects/__tests__/departmentsSubjects.spec.ts +272 -272
  60. package/src/municipal/departmentsSubjects/departmentsSubjects.getters.ts +317 -317
  61. package/src/municipal/departmentsSubjects/departmentsSubjects.types.ts +73 -73
  62. package/src/municipal/departmentsSubjects/index.ts +9 -9
  63. package/src/municipal/index.ts +22 -22
  64. package/src/municipal/mongodb-client.ts +61 -61
  65. package/src/municipal/muniIssues/__tests__/muniIssues.setters.spec.ts +94 -94
  66. package/src/municipal/muniIssues/__tests__/muniIssues.setup.spec.ts +92 -92
  67. package/src/municipal/muniIssues/index.ts +17 -17
  68. package/src/municipal/muniIssues/muniIssues.constants.ts +18 -18
  69. package/src/municipal/muniIssues/muniIssues.getters.ts +24 -24
  70. package/src/municipal/muniIssues/muniIssues.schema.ts +66 -66
  71. package/src/municipal/muniIssues/muniIssues.setters.ts +24 -24
  72. package/src/municipal/muniIssues/muniIssues.setup.ts +65 -65
  73. package/src/municipal/muniIssues/muniIssues.types.ts +37 -37
  74. package/src/municipal/streets/__tests__/streets.spec.ts +253 -253
  75. package/src/municipal/streets/index.ts +2 -2
  76. package/src/municipal/streets/streets.getters.ts +140 -140
  77. package/src/municipal/streets/streets.types.ts +19 -19
  78. package/src/municipal/systemInstructions/__tests__/getters.spec.ts +113 -113
  79. package/src/municipal/systemInstructions/__tests__/setters.spec.ts +274 -274
  80. package/src/municipal/systemInstructions/index.ts +7 -7
  81. package/src/municipal/systemInstructions/instructions.getters.ts +57 -57
  82. package/src/municipal/systemInstructions/instructions.setters.ts +119 -119
  83. package/src/municipal/systemInstructions/instructions.types.ts +30 -30
  84. package/src/municipal/tickets/__tests__/tickets.getters.spec.ts +30 -30
  85. package/src/municipal/tickets/__tests__/tickets.statistics.spec.ts +99 -99
  86. package/src/municipal/tickets/index.ts +9 -9
  87. package/src/municipal/tickets/tickets.constants.ts +8 -8
  88. package/src/municipal/tickets/tickets.getters.ts +121 -121
  89. package/src/municipal/tickets/tickets.statistics.aggregation.ts +110 -110
  90. package/src/municipal/tickets/tickets.statistics.getters.ts +145 -145
  91. package/src/municipal/tickets/tickets.types.ts +54 -54
  92. package/src/municipal/utils/types.ts +11 -11
  93. package/src/talkpilot/__tests__/db.spec.ts +38 -38
  94. package/src/talkpilot/__tests__/mongodb-client.spec.ts +18 -18
  95. package/src/talkpilot/__tests__/validation.spec.ts +68 -68
  96. package/src/talkpilot/agents/__tests__/agents.getters.spec.ts +29 -29
  97. package/src/talkpilot/agents/agents.getters.ts +34 -34
  98. package/src/talkpilot/agents/agents.types.ts +14 -14
  99. package/src/talkpilot/agents/index.ts +2 -2
  100. package/src/talkpilot/backgroundToolResults/__tests__/backgroundToolResults.getters.spec.ts +147 -147
  101. package/src/talkpilot/backgroundToolResults/backgroundToolResults.getters.ts +65 -65
  102. package/src/talkpilot/backgroundToolResults/backgroundToolResults.types.ts +23 -23
  103. package/src/talkpilot/backgroundToolResults/index.ts +2 -2
  104. package/src/talkpilot/calls/__tests__/callStats.utils.spec.ts +128 -128
  105. package/src/talkpilot/calls/__tests__/calls.dashboard.spec.ts +229 -229
  106. package/src/talkpilot/calls/__tests__/calls.spec.ts +471 -471
  107. package/src/talkpilot/calls/__tests__/calls.statistics.spec.ts +483 -483
  108. package/src/talkpilot/calls/calls.constants.ts +49 -49
  109. package/src/talkpilot/calls/calls.getters.ts +277 -277
  110. package/src/talkpilot/calls/calls.statistics.getters.ts +668 -668
  111. package/src/talkpilot/calls/calls.statistics.types.ts +48 -48
  112. package/src/talkpilot/calls/calls.types.ts +149 -149
  113. package/src/talkpilot/calls/dashboard/calls.dashboard.ts +295 -295
  114. package/src/talkpilot/calls/dashboard/calls.dashboard.types.ts +57 -57
  115. package/src/talkpilot/calls/index.ts +6 -6
  116. package/src/talkpilot/clientAudioBuffers/__tests__/clientAudioBuffer.getters.spec.ts +160 -160
  117. package/src/talkpilot/clientAudioBuffers/clientAudioBuffer.getters.ts +117 -117
  118. package/src/talkpilot/clientAudioBuffers/clientsAudioBuffers.types.ts +25 -25
  119. package/src/talkpilot/clientAudioBuffers/index.ts +2 -2
  120. package/src/talkpilot/clients/__tests__/clients.quota.spec.ts +123 -123
  121. package/src/talkpilot/clients/clients.getters.ts +16 -19
  122. package/src/talkpilot/clients/clients.quota.getters.ts +119 -119
  123. package/src/talkpilot/clients/clients.quota.types.ts +27 -27
  124. package/src/talkpilot/clients/clients.types.ts +18 -18
  125. package/src/talkpilot/clients/index.ts +4 -4
  126. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.getters.spec.ts +423 -423
  127. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +212 -212
  128. package/src/talkpilot/clientsConfig/clientsConfig.constants.ts +2 -2
  129. package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +247 -247
  130. package/src/talkpilot/clientsConfig/clientsConfig.types.ts +136 -136
  131. package/src/talkpilot/clientsConfig/index.ts +3 -3
  132. package/src/talkpilot/contextNotes/__tests__/contextNotes.getters.spec.ts +217 -217
  133. package/src/talkpilot/contextNotes/contextNotes.getters.ts +85 -85
  134. package/src/talkpilot/contextNotes/contextNotes.types.ts +20 -20
  135. package/src/talkpilot/contextNotes/index.ts +2 -2
  136. package/src/talkpilot/flows/__tests__/flows.schema.spec.ts +124 -124
  137. package/src/talkpilot/flows/flows.getter.ts +34 -34
  138. package/src/talkpilot/flows/flows.schema.ts +180 -180
  139. package/src/talkpilot/flows/flows.types.ts +211 -211
  140. package/src/talkpilot/flows/index.ts +7 -7
  141. package/src/talkpilot/groups/__tests__/groups.spec.ts +90 -90
  142. package/src/talkpilot/groups/__tests__/phone.utils.spec.ts +32 -32
  143. package/src/talkpilot/groups/groups.getters.ts +30 -30
  144. package/src/talkpilot/groups/groups.types.ts +29 -29
  145. package/src/talkpilot/groups/index.ts +3 -3
  146. package/src/talkpilot/groups/phone.utils.ts +46 -46
  147. package/src/talkpilot/index.ts +31 -31
  148. package/src/talkpilot/leads/index.ts +2 -2
  149. package/src/talkpilot/leads/leads.getter.ts +6 -6
  150. package/src/talkpilot/leads/leads.schema.ts +33 -33
  151. package/src/talkpilot/leads/leads.types.ts +20 -20
  152. package/src/talkpilot/mongodb-client.ts +78 -78
  153. package/src/talkpilot/phone_numbers/__tests__/phone_numbers.spec.ts +282 -530
  154. package/src/talkpilot/phone_numbers/index.ts +2 -2
  155. package/src/talkpilot/phone_numbers/phone_numbers.getter.ts +176 -240
  156. package/src/talkpilot/phone_numbers/phone_numbers.schema.ts +17 -17
  157. package/src/talkpilot/phone_numbers/phone_numbers.types.ts +30 -30
  158. package/src/talkpilot/plans/__tests__/plans.spec.ts +70 -70
  159. package/src/talkpilot/plans/index.ts +2 -2
  160. package/src/talkpilot/plans/plans.getters.ts +132 -132
  161. package/src/talkpilot/plans/plans.types.ts +89 -89
  162. package/src/talkpilot/products/__tests__/products.getters.spec.ts +44 -44
  163. package/src/talkpilot/products/index.ts +2 -2
  164. package/src/talkpilot/products/products.getters.ts +12 -12
  165. package/src/talkpilot/products/products.types.ts +9 -9
  166. package/src/talkpilot/results/index.ts +7 -7
  167. package/src/talkpilot/results/results.getter.ts +39 -39
  168. package/src/talkpilot/results/results.schema.ts +25 -25
  169. package/src/talkpilot/results/results.types.ts +34 -34
  170. package/src/talkpilot/retry_analyze/__tests__/retryAnalyze.getters.spec.ts +156 -156
  171. package/src/talkpilot/retry_analyze/index.ts +2 -2
  172. package/src/talkpilot/retry_analyze/retryAnalyze.getters.ts +84 -84
  173. package/src/talkpilot/retry_analyze/retryAnalyze.types.ts +13 -13
  174. package/src/talkpilot/sessions/__tests__/sessions.spec.ts +147 -147
  175. package/src/talkpilot/sessions/index.ts +2 -2
  176. package/src/talkpilot/sessions/sessions.getter.ts +92 -92
  177. package/src/talkpilot/sessions/sessions.schema.ts +34 -34
  178. package/src/talkpilot/sessions/sessions.types.ts +30 -30
  179. package/src/talkpilot/subscriptions/__tests__/subscriptions.getters.utils.spec.ts +45 -45
  180. package/src/talkpilot/subscriptions/index.ts +3 -3
  181. package/src/talkpilot/subscriptions/subscriptions.getters.ts +146 -146
  182. package/src/talkpilot/subscriptions/subscriptions.getters.utils.ts +33 -33
  183. package/src/talkpilot/subscriptions/subscriptions.types.ts +66 -66
  184. package/src/talkpilot/utils/__tests__/query.utils.spec.ts +49 -49
  185. package/src/talkpilot/utils/query.utils.ts +21 -21
  186. package/src/test-utils/db-utils.ts +33 -33
  187. package/src/test-utils/factories/index.ts +18 -18
  188. package/src/test-utils/factories/municipal/cities.ts +16 -16
  189. package/src/test-utils/factories/municipal/departmentsSubjects.ts +37 -37
  190. package/src/test-utils/factories/municipal/muniIssues.ts +32 -32
  191. package/src/test-utils/factories/municipal/streets.ts +22 -22
  192. package/src/test-utils/factories/municipal/tickets.ts +39 -39
  193. package/src/test-utils/factories/talkpilot/agents.ts +19 -19
  194. package/src/test-utils/factories/talkpilot/calls.ts +37 -37
  195. package/src/test-utils/factories/talkpilot/clientAudioBuffers.ts +20 -20
  196. package/src/test-utils/factories/talkpilot/clientsConfig.ts +18 -18
  197. package/src/test-utils/factories/talkpilot/contextNotes.ts +40 -40
  198. package/src/test-utils/factories/talkpilot/flows.ts +33 -33
  199. package/src/test-utils/factories/talkpilot/groups.ts +33 -33
  200. package/src/test-utils/factories/talkpilot/phone_numbers.ts +22 -22
  201. package/src/test-utils/factories/talkpilot/sessions.ts +35 -35
  202. package/src/test-utils/factories/websitalk/knowledgeDocuments.ts +29 -29
  203. package/src/test-utils/factories/websitalk/scanResources.ts +26 -26
  204. package/src/test-utils/factories/websitalk/scans.ts +29 -29
  205. package/src/test-utils/factories/websitalk/websiteUrls.ts +17 -17
  206. package/src/utils/date.utils.ts +126 -126
  207. package/src/utils/shared.types.ts +4 -4
  208. package/src/utils/validation.ts +23 -23
  209. package/src/websitalk/index.ts +18 -18
  210. package/src/websitalk/knowledgeDocuments/__tests__/knowledgeDocuments.spec.ts +238 -238
  211. package/src/websitalk/knowledgeDocuments/index.ts +3 -3
  212. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.constants.ts +26 -26
  213. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.getters.ts +95 -95
  214. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.types.ts +75 -75
  215. package/src/websitalk/mongodb-client.ts +61 -61
  216. package/src/websitalk/scanResources/__tests__/scanResources.spec.ts +267 -248
  217. package/src/websitalk/scanResources/index.ts +4 -4
  218. package/src/websitalk/scanResources/scanResources.constants.ts +60 -60
  219. package/src/websitalk/scanResources/scanResources.getters.ts +128 -121
  220. package/src/websitalk/scanResources/scanResources.types.ts +105 -105
  221. package/src/websitalk/scanResources/scanResources.utils.ts +31 -31
  222. package/src/websitalk/scans/__tests__/scans.spec.ts +341 -313
  223. package/src/websitalk/scans/index.ts +4 -4
  224. package/src/websitalk/scans/scans.constants.ts +18 -15
  225. package/src/websitalk/scans/scans.getters.ts +171 -166
  226. package/src/websitalk/scans/scans.types.ts +57 -56
  227. package/src/websitalk/scans/scans.utils.ts +5 -5
  228. package/src/websitalk/websiteUrls/__tests__/websiteUrls.spec.ts +77 -77
  229. package/src/websitalk/websiteUrls/index.ts +2 -2
  230. package/src/websitalk/websiteUrls/websiteUrls.getters.ts +65 -65
  231. package/src/websitalk/websiteUrls/websiteUrls.types.ts +13 -13
  232. package/tsconfig.json +23 -23
  233. package/dist/configuration/models/models.seed.d.ts +0 -5
  234. package/dist/configuration/models/models.seed.d.ts.map +0 -1
  235. package/dist/configuration/models/models.seed.js +0 -16
  236. package/dist/configuration/models/models.seed.js.map +0 -1
  237. package/dist/configuration/models/realtimeUiFields.constants.d.ts +0 -4
  238. package/dist/configuration/models/realtimeUiFields.constants.d.ts.map +0 -1
  239. package/dist/configuration/models/realtimeUiFields.constants.js +0 -80
  240. package/dist/configuration/models/realtimeUiFields.constants.js.map +0 -1
  241. package/dist/configuration/models/uiFields.types.d.ts +0 -29
  242. package/dist/configuration/models/uiFields.types.d.ts.map +0 -1
  243. package/dist/configuration/models/uiFields.types.js +0 -12
  244. package/dist/configuration/models/uiFields.types.js.map +0 -1
  245. package/dist/talkpilot/phone_numbers/phone_numbers.utils.d.ts +0 -6
  246. package/dist/talkpilot/phone_numbers/phone_numbers.utils.d.ts.map +0 -1
  247. package/dist/talkpilot/phone_numbers/phone_numbers.utils.js +0 -11
  248. package/dist/talkpilot/phone_numbers/phone_numbers.utils.js.map +0 -1
  249. package/src/talkpilot/phone_numbers/phone_numbers.utils.ts +0 -9
@@ -1,32 +1,32 @@
1
- import { enrichPhoneNumber, isValidE164 } from "../phone.utils";
2
-
3
- describe("Phone Utilities", () => {
4
- describe("enrichPhoneNumber", () => {
5
- it("should enrich Israeli number", () => {
6
- const result = enrichPhoneNumber("+972507725874");
7
- expect(result?.e164).toBe("+972507725874");
8
- expect(result?.region).toBeDefined();
9
- expect(result?.countryCallingCode).toBe("972");
10
- });
11
-
12
- it("should enrich US number", () => {
13
- const result = enrichPhoneNumber("+12025551234");
14
- expect(result?.region).toBe("US");
15
- expect(result?.countryCallingCode).toBe("1");
16
- });
17
-
18
- it("should return null for invalid", () => {
19
- expect(enrichPhoneNumber("invalid")).toBeNull();
20
- expect(enrichPhoneNumber("0507725874")).toBeNull();
21
- });
22
- });
23
-
24
- describe("isValidE164", () => {
25
- it("should validate E.164 format", () => {
26
- expect(isValidE164("+972508832983")).toBe(true);
27
- expect(isValidE164("+12025551234")).toBe(true);
28
- expect(isValidE164("0501234567")).toBe(false);
29
- expect(isValidE164("invalid")).toBe(false);
30
- });
31
- });
32
- });
1
+ import { enrichPhoneNumber, isValidE164 } from "../phone.utils";
2
+
3
+ describe("Phone Utilities", () => {
4
+ describe("enrichPhoneNumber", () => {
5
+ it("should enrich Israeli number", () => {
6
+ const result = enrichPhoneNumber("+972507725874");
7
+ expect(result?.e164).toBe("+972507725874");
8
+ expect(result?.region).toBeDefined();
9
+ expect(result?.countryCallingCode).toBe("972");
10
+ });
11
+
12
+ it("should enrich US number", () => {
13
+ const result = enrichPhoneNumber("+12025551234");
14
+ expect(result?.region).toBe("US");
15
+ expect(result?.countryCallingCode).toBe("1");
16
+ });
17
+
18
+ it("should return null for invalid", () => {
19
+ expect(enrichPhoneNumber("invalid")).toBeNull();
20
+ expect(enrichPhoneNumber("0507725874")).toBeNull();
21
+ });
22
+ });
23
+
24
+ describe("isValidE164", () => {
25
+ it("should validate E.164 format", () => {
26
+ expect(isValidE164("+972508832983")).toBe(true);
27
+ expect(isValidE164("+12025551234")).toBe(true);
28
+ expect(isValidE164("0501234567")).toBe(false);
29
+ expect(isValidE164("invalid")).toBe(false);
30
+ });
31
+ });
32
+ });
@@ -1,30 +1,30 @@
1
- import { getDb, ObjectId, Group } from "../index";
2
- import { Collection, Filter } from "mongodb";
3
-
4
- export const getGroupsCollection = (): Collection<Group> => {
5
- return getDb().collection<Group>("groups");
6
- };
7
-
8
- export const findGroups = async (filter: Filter<Group>): Promise<Group[]> => {
9
- return await getGroupsCollection().find(filter).toArray();
10
- };
11
-
12
- export const createGroup = async (group: Group) => {
13
- const { insertedId } = await getGroupsCollection().insertOne(group);
14
- return insertedId;
15
- };
16
-
17
- export const updateGroup = async (
18
- filter: Filter<Group>,
19
- data: Partial<Group>,
20
- ) => {
21
- return await getGroupsCollection().findOneAndUpdate(
22
- filter,
23
- { $set: { ...data, updatedAt: new Date() } },
24
- { returnDocument: "after" },
25
- );
26
- };
27
-
28
- export const removeGroup = async (groupId: string) => {
29
- return await getGroupsCollection().deleteOne({ _id: new ObjectId(groupId) });
30
- };
1
+ import { getDb, ObjectId, Group } from "../index";
2
+ import { Collection, Filter } from "mongodb";
3
+
4
+ export const getGroupsCollection = (): Collection<Group> => {
5
+ return getDb().collection<Group>("groups");
6
+ };
7
+
8
+ export const findGroups = async (filter: Filter<Group>): Promise<Group[]> => {
9
+ return await getGroupsCollection().find(filter).toArray();
10
+ };
11
+
12
+ export const createGroup = async (group: Group) => {
13
+ const { insertedId } = await getGroupsCollection().insertOne(group);
14
+ return insertedId;
15
+ };
16
+
17
+ export const updateGroup = async (
18
+ filter: Filter<Group>,
19
+ data: Partial<Group>,
20
+ ) => {
21
+ return await getGroupsCollection().findOneAndUpdate(
22
+ filter,
23
+ { $set: { ...data, updatedAt: new Date() } },
24
+ { returnDocument: "after" },
25
+ );
26
+ };
27
+
28
+ export const removeGroup = async (groupId: string) => {
29
+ return await getGroupsCollection().deleteOne({ _id: new ObjectId(groupId) });
30
+ };
@@ -1,29 +1,29 @@
1
- import { WithId } from "mongodb";
2
- export type E164 = `+${string}`;
3
- export type CountryISO = Uppercase<string>;
4
-
5
- export type Phone = {
6
- e164: E164;
7
- region?: CountryISO;
8
- countryCallingCode?: string;
9
- national?: string;
10
- ext?: string;
11
- formatted?: string;
12
- };
13
-
14
- export type GroupContact = {
15
- name: string;
16
- phone: Phone;
17
- gender: string;
18
- };
19
-
20
- export type Group = {
21
- clientId: string;
22
- createdAt: Date;
23
- updatedAt: Date;
24
- name: string;
25
- description: string;
26
- contacts: GroupContact[];
27
- };
28
-
29
- export type GroupDoc = WithId<Group>;
1
+ import { WithId } from "mongodb";
2
+ export type E164 = `+${string}`;
3
+ export type CountryISO = Uppercase<string>;
4
+
5
+ export type Phone = {
6
+ e164: E164;
7
+ region?: CountryISO;
8
+ countryCallingCode?: string;
9
+ national?: string;
10
+ ext?: string;
11
+ formatted?: string;
12
+ };
13
+
14
+ export type GroupContact = {
15
+ name: string;
16
+ phone: Phone;
17
+ gender: string;
18
+ };
19
+
20
+ export type Group = {
21
+ clientId: string;
22
+ createdAt: Date;
23
+ updatedAt: Date;
24
+ name: string;
25
+ description: string;
26
+ contacts: GroupContact[];
27
+ };
28
+
29
+ export type GroupDoc = WithId<Group>;
@@ -1,3 +1,3 @@
1
- export * from "./groups.getters";
2
- export * from "./groups.types";
3
- export * from "./phone.utils";
1
+ export * from "./groups.getters";
2
+ export * from "./groups.types";
3
+ export * from "./phone.utils";
@@ -1,46 +1,46 @@
1
- import { PhoneNumberUtil, PhoneNumberFormat } from "google-libphonenumber";
2
- import type { Phone, E164, CountryISO } from "./groups.types";
3
-
4
- const phoneUtil = PhoneNumberUtil.getInstance();
5
-
6
- export const enrichPhoneNumber = (e164: string): Phone | null => {
7
- try {
8
- const phoneNumber = phoneUtil.parse(e164, "ZZ");
9
- if (!phoneUtil.isValidNumber(phoneNumber)) {
10
- return null;
11
- }
12
-
13
- const normalizedE164 = phoneUtil.format(
14
- phoneNumber,
15
- PhoneNumberFormat.E164,
16
- ) as E164;
17
- const region = phoneUtil.getRegionCodeForNumber(phoneNumber) as CountryISO;
18
- const countryCallingCode = phoneNumber.getCountryCode()?.toString();
19
- const national = phoneNumber.getNationalNumber()?.toString();
20
- const ext = phoneNumber.getExtension() || undefined;
21
- const formatted = phoneUtil.format(
22
- phoneNumber,
23
- PhoneNumberFormat.INTERNATIONAL,
24
- );
25
-
26
- return {
27
- e164: normalizedE164,
28
- region,
29
- countryCallingCode,
30
- national,
31
- ext,
32
- formatted,
33
- };
34
- } catch (error) {
35
- return null;
36
- }
37
- };
38
-
39
- export const isValidE164 = (e164: string): boolean => {
40
- try {
41
- const phoneNumber = phoneUtil.parse(e164, "ZZ");
42
- return phoneUtil.isValidNumber(phoneNumber);
43
- } catch (error) {
44
- return false;
45
- }
46
- };
1
+ import { PhoneNumberUtil, PhoneNumberFormat } from "google-libphonenumber";
2
+ import type { Phone, E164, CountryISO } from "./groups.types";
3
+
4
+ const phoneUtil = PhoneNumberUtil.getInstance();
5
+
6
+ export const enrichPhoneNumber = (e164: string): Phone | null => {
7
+ try {
8
+ const phoneNumber = phoneUtil.parse(e164, "ZZ");
9
+ if (!phoneUtil.isValidNumber(phoneNumber)) {
10
+ return null;
11
+ }
12
+
13
+ const normalizedE164 = phoneUtil.format(
14
+ phoneNumber,
15
+ PhoneNumberFormat.E164,
16
+ ) as E164;
17
+ const region = phoneUtil.getRegionCodeForNumber(phoneNumber) as CountryISO;
18
+ const countryCallingCode = phoneNumber.getCountryCode()?.toString();
19
+ const national = phoneNumber.getNationalNumber()?.toString();
20
+ const ext = phoneNumber.getExtension() || undefined;
21
+ const formatted = phoneUtil.format(
22
+ phoneNumber,
23
+ PhoneNumberFormat.INTERNATIONAL,
24
+ );
25
+
26
+ return {
27
+ e164: normalizedE164,
28
+ region,
29
+ countryCallingCode,
30
+ national,
31
+ ext,
32
+ formatted,
33
+ };
34
+ } catch (error) {
35
+ return null;
36
+ }
37
+ };
38
+
39
+ export const isValidE164 = (e164: string): boolean => {
40
+ try {
41
+ const phoneNumber = phoneUtil.parse(e164, "ZZ");
42
+ return phoneUtil.isValidNumber(phoneNumber);
43
+ } catch (error) {
44
+ return false;
45
+ }
46
+ };
@@ -1,31 +1,31 @@
1
- import { Db, ObjectId as MongoObjectId } from "mongodb";
2
-
3
- export * from "./flows";
4
- export * from "./contextNotes";
5
- export * from "./products";
6
- export * from "./results";
7
- export * from "./sessions";
8
- export * from "./phone_numbers";
9
- export * from "./leads";
10
- export * from "./clients";
11
- export * from "./agents";
12
- export * from "./plans";
13
- export * from "./subscriptions";
14
- export * from "./groups";
15
- export * from "./calls";
16
- export * from "./clientAudioBuffers";
17
- export * from "./clientsConfig";
18
- export * from "./backgroundToolResults";
19
- export * from "./retry_analyze";
20
- export { mongodbClient } from "./mongodb-client";
21
-
22
- let db: Db;
23
- export const setDb = (d: Db) => {
24
- db = d;
25
- };
26
- export const getDb = (): Db => {
27
- if (!db) throw new Error("DB not initialised");
28
- return db;
29
- };
30
-
31
- export const ObjectId = MongoObjectId;
1
+ import { Db, ObjectId as MongoObjectId } from "mongodb";
2
+
3
+ export * from "./flows";
4
+ export * from "./contextNotes";
5
+ export * from "./products";
6
+ export * from "./results";
7
+ export * from "./sessions";
8
+ export * from "./phone_numbers";
9
+ export * from "./leads";
10
+ export * from "./clients";
11
+ export * from "./agents";
12
+ export * from "./plans";
13
+ export * from "./subscriptions";
14
+ export * from "./groups";
15
+ export * from "./calls";
16
+ export * from "./clientAudioBuffers";
17
+ export * from "./clientsConfig";
18
+ export * from "./backgroundToolResults";
19
+ export * from "./retry_analyze";
20
+ export { mongodbClient } from "./mongodb-client";
21
+
22
+ let db: Db;
23
+ export const setDb = (d: Db) => {
24
+ db = d;
25
+ };
26
+ export const getDb = (): Db => {
27
+ if (!db) throw new Error("DB not initialised");
28
+ return db;
29
+ };
30
+
31
+ export const ObjectId = MongoObjectId;
@@ -1,2 +1,2 @@
1
- export { getLeadsCollection } from "./leads.getter";
2
- export type { Lead, LeadItem, LeadProperty } from "./leads.types";
1
+ export { getLeadsCollection } from "./leads.getter";
2
+ export type { Lead, LeadItem, LeadProperty } from "./leads.types";
@@ -1,6 +1,6 @@
1
- import type { Collection } from "mongodb";
2
- import { getDb } from "../index";
3
- import type { Lead } from "./leads.types";
4
-
5
- export const getLeadsCollection = (): Collection<Lead> =>
6
- getDb().collection<Lead>("leads");
1
+ import type { Collection } from "mongodb";
2
+ import { getDb } from "../index";
3
+ import type { Lead } from "./leads.types";
4
+
5
+ export const getLeadsCollection = (): Collection<Lead> =>
6
+ getDb().collection<Lead>("leads");
@@ -1,33 +1,33 @@
1
- export const leadsMongoSchema = {
2
- bsonType: "object",
3
- required: ["flowId", "clientId", "createdAt", "leads"],
4
- properties: {
5
- _id: { bsonType: "objectId" },
6
- flowId: { bsonType: "string" },
7
- clientId: { bsonType: "string" },
8
- createdAt: { bsonType: "date" },
9
- leads: {
10
- bsonType: "array",
11
- items: {
12
- bsonType: "object",
13
- required: ["callSid", "timestamp"],
14
- properties: {
15
- callSid: { bsonType: "string" },
16
- timestamp: { bsonType: "date" },
17
- properties: {
18
- bsonType: "array",
19
- items: {
20
- bsonType: "object",
21
- required: ["name", "value"],
22
- properties: {
23
- name: { bsonType: "string" },
24
- value: { bsonType: "string" },
25
- },
26
- },
27
- },
28
- },
29
- },
30
- },
31
- },
32
- additionalProperties: false,
33
- } as const;
1
+ export const leadsMongoSchema = {
2
+ bsonType: "object",
3
+ required: ["flowId", "clientId", "createdAt", "leads"],
4
+ properties: {
5
+ _id: { bsonType: "objectId" },
6
+ flowId: { bsonType: "string" },
7
+ clientId: { bsonType: "string" },
8
+ createdAt: { bsonType: "date" },
9
+ leads: {
10
+ bsonType: "array",
11
+ items: {
12
+ bsonType: "object",
13
+ required: ["callSid", "timestamp"],
14
+ properties: {
15
+ callSid: { bsonType: "string" },
16
+ timestamp: { bsonType: "date" },
17
+ properties: {
18
+ bsonType: "array",
19
+ items: {
20
+ bsonType: "object",
21
+ required: ["name", "value"],
22
+ properties: {
23
+ name: { bsonType: "string" },
24
+ value: { bsonType: "string" },
25
+ },
26
+ },
27
+ },
28
+ },
29
+ },
30
+ },
31
+ },
32
+ additionalProperties: false,
33
+ } as const;
@@ -1,20 +1,20 @@
1
- import { ObjectId } from "mongodb";
2
-
3
- export interface LeadProperty {
4
- name: string;
5
- value: string;
6
- }
7
-
8
- export interface LeadItem {
9
- callSid: string;
10
- timestamp: Date;
11
- properties?: LeadProperty[];
12
- }
13
-
14
- export interface Lead {
15
- _id?: ObjectId;
16
- flowId: ObjectId;
17
- clientId: string;
18
- createdAt: Date;
19
- leads: LeadItem[];
20
- }
1
+ import { ObjectId } from "mongodb";
2
+
3
+ export interface LeadProperty {
4
+ name: string;
5
+ value: string;
6
+ }
7
+
8
+ export interface LeadItem {
9
+ callSid: string;
10
+ timestamp: Date;
11
+ properties?: LeadProperty[];
12
+ }
13
+
14
+ export interface Lead {
15
+ _id?: ObjectId;
16
+ flowId: ObjectId;
17
+ clientId: string;
18
+ createdAt: Date;
19
+ leads: LeadItem[];
20
+ }
@@ -1,78 +1,78 @@
1
- import { MongoClient, Db } from "mongodb";
2
- import { setDb } from "./index";
3
- import { validateConfig, validateMongoUri } from "../utils/validation";
4
-
5
- class MongoDBClient {
6
- private client: MongoClient | null = null;
7
- private db: Db | null = null;
8
-
9
- private extractDatabaseName(uri: string): string | null {
10
- try {
11
- const url = new URL(uri);
12
- const dbName = url.pathname.slice(1);
13
- return dbName || null;
14
- } catch {
15
- return null;
16
- }
17
- }
18
-
19
- async connect(uri?: string, databaseName?: string): Promise<void> {
20
- if (this.client) {
21
- return;
22
- }
23
-
24
- const mongodbUri = uri || process.env.MONGO_URI || process.env.MONGODB_URI;
25
- validateConfig("MONGO_URI", mongodbUri);
26
- validateMongoUri(mongodbUri!);
27
-
28
- try {
29
- this.client = new MongoClient(mongodbUri!);
30
- await this.client.connect();
31
-
32
- const dbNameFromUri = this.extractDatabaseName(mongodbUri!);
33
- const dbName =
34
- databaseName || process.env.TALKPILOT_DB_NAME || dbNameFromUri;
35
-
36
- if (!dbName) {
37
- throw new Error(
38
- "[core-db] Database name not specified. Please pass databaseName to connect(), " +
39
- "add it to the URI, or set TALKPILOT_DB_NAME.",
40
- );
41
- }
42
-
43
- this.db = this.client.db(dbName);
44
- setDb(this.db);
45
- console.info(`[core-db] TalkPilot MongoDB connected: ${dbName}`);
46
- } catch (error) {
47
- console.error("[core-db] TalkPilot connection failed", error);
48
- throw error;
49
- }
50
- }
51
-
52
- async disconnect(): Promise<void> {
53
- if (this.client) {
54
- try {
55
- await this.client.close();
56
- this.client = null;
57
- this.db = null;
58
- console.info("MongoDB disconnected successfully");
59
- } catch (error) {
60
- console.error("[core-db] Disconnection failed", error);
61
- throw error;
62
- }
63
- }
64
- }
65
-
66
- getDb(): Db {
67
- if (!this.db) {
68
- throw new Error("Database not initialized. Call connect() first.");
69
- }
70
- return this.db;
71
- }
72
-
73
- isConnected(): boolean {
74
- return this.client !== null && this.client !== undefined;
75
- }
76
- }
77
-
78
- export const mongodbClient = new MongoDBClient();
1
+ import { MongoClient, Db } from "mongodb";
2
+ import { setDb } from "./index";
3
+ import { validateConfig, validateMongoUri } from "../utils/validation";
4
+
5
+ class MongoDBClient {
6
+ private client: MongoClient | null = null;
7
+ private db: Db | null = null;
8
+
9
+ private extractDatabaseName(uri: string): string | null {
10
+ try {
11
+ const url = new URL(uri);
12
+ const dbName = url.pathname.slice(1);
13
+ return dbName || null;
14
+ } catch {
15
+ return null;
16
+ }
17
+ }
18
+
19
+ async connect(uri?: string, databaseName?: string): Promise<void> {
20
+ if (this.client) {
21
+ return;
22
+ }
23
+
24
+ const mongodbUri = uri || process.env.MONGO_URI || process.env.MONGODB_URI;
25
+ validateConfig("MONGO_URI", mongodbUri);
26
+ validateMongoUri(mongodbUri!);
27
+
28
+ try {
29
+ this.client = new MongoClient(mongodbUri!);
30
+ await this.client.connect();
31
+
32
+ const dbNameFromUri = this.extractDatabaseName(mongodbUri!);
33
+ const dbName =
34
+ databaseName || process.env.TALKPILOT_DB_NAME || dbNameFromUri;
35
+
36
+ if (!dbName) {
37
+ throw new Error(
38
+ "[core-db] Database name not specified. Please pass databaseName to connect(), " +
39
+ "add it to the URI, or set TALKPILOT_DB_NAME.",
40
+ );
41
+ }
42
+
43
+ this.db = this.client.db(dbName);
44
+ setDb(this.db);
45
+ console.info(`[core-db] TalkPilot MongoDB connected: ${dbName}`);
46
+ } catch (error) {
47
+ console.error("[core-db] TalkPilot connection failed", error);
48
+ throw error;
49
+ }
50
+ }
51
+
52
+ async disconnect(): Promise<void> {
53
+ if (this.client) {
54
+ try {
55
+ await this.client.close();
56
+ this.client = null;
57
+ this.db = null;
58
+ console.info("MongoDB disconnected successfully");
59
+ } catch (error) {
60
+ console.error("[core-db] Disconnection failed", error);
61
+ throw error;
62
+ }
63
+ }
64
+ }
65
+
66
+ getDb(): Db {
67
+ if (!this.db) {
68
+ throw new Error("Database not initialized. Call connect() first.");
69
+ }
70
+ return this.db;
71
+ }
72
+
73
+ isConnected(): boolean {
74
+ return this.client !== null && this.client !== undefined;
75
+ }
76
+ }
77
+
78
+ export const mongodbClient = new MongoDBClient();