@talkpilot/core-db 1.3.46 → 1.3.47

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 (241) 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 +747 -747
  5. package/dist/configuration/models/models.constants.d.ts +1 -1
  6. package/dist/configuration/models/models.constants.d.ts.map +1 -1
  7. package/dist/configuration/models/models.constants.js +1 -1
  8. package/dist/configuration/models/models.constants.js.map +1 -1
  9. package/dist/talkpilot/calls/calls.types.d.ts +0 -14
  10. package/dist/talkpilot/calls/calls.types.d.ts.map +1 -1
  11. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts +1 -0
  12. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts.map +1 -1
  13. package/jest.config.js +20 -20
  14. package/package.json +46 -46
  15. package/src/__tests__/setup.ts +20 -20
  16. package/src/bulkWrite/__tests__/bulkWrite.spec.ts +65 -65
  17. package/src/bulkWrite/bulkWrite.ops.ts +45 -45
  18. package/src/bulkWrite/bulkWrite.types.ts +4 -4
  19. package/src/bulkWrite/index.ts +2 -2
  20. package/src/config.ts +9 -9
  21. package/src/configuration/index.ts +17 -17
  22. package/src/configuration/internalModels/index.ts +3 -3
  23. package/src/configuration/internalModels/internalModels.constants.ts +1 -1
  24. package/src/configuration/internalModels/internalModels.getters.ts +33 -33
  25. package/src/configuration/internalModels/internalModels.types.ts +12 -12
  26. package/src/configuration/models/index.ts +25 -25
  27. package/src/configuration/models/models.constants.ts +13 -13
  28. package/src/configuration/models/models.getters.ts +53 -53
  29. package/src/configuration/models/models.types.ts +79 -79
  30. package/src/configuration/mongodb-client.ts +62 -62
  31. package/src/configuration/prompts/index.ts +2 -2
  32. package/src/configuration/prompts/prompts.getters.ts +49 -49
  33. package/src/configuration/prompts/prompts.types.ts +11 -11
  34. package/src/connection.ts +81 -81
  35. package/src/index.ts +46 -46
  36. package/src/municipal/__tests__/validation.spec.ts +62 -62
  37. package/src/municipal/cities/cities.getters.ts +50 -50
  38. package/src/municipal/cities/cities.types.ts +11 -11
  39. package/src/municipal/cities/index.ts +2 -2
  40. package/src/municipal/departmentsSubjects/__tests__/departmentsSubjects.spec.ts +272 -272
  41. package/src/municipal/departmentsSubjects/departmentsSubjects.getters.ts +317 -317
  42. package/src/municipal/departmentsSubjects/departmentsSubjects.types.ts +73 -73
  43. package/src/municipal/departmentsSubjects/index.ts +9 -9
  44. package/src/municipal/index.ts +22 -22
  45. package/src/municipal/mongodb-client.ts +61 -61
  46. package/src/municipal/muniIssues/__tests__/muniIssues.setters.spec.ts +94 -94
  47. package/src/municipal/muniIssues/__tests__/muniIssues.setup.spec.ts +92 -92
  48. package/src/municipal/muniIssues/index.ts +17 -17
  49. package/src/municipal/muniIssues/muniIssues.constants.ts +18 -18
  50. package/src/municipal/muniIssues/muniIssues.getters.ts +24 -24
  51. package/src/municipal/muniIssues/muniIssues.schema.ts +66 -66
  52. package/src/municipal/muniIssues/muniIssues.setters.ts +24 -24
  53. package/src/municipal/muniIssues/muniIssues.setup.ts +65 -65
  54. package/src/municipal/muniIssues/muniIssues.types.ts +37 -37
  55. package/src/municipal/streets/__tests__/streets.spec.ts +253 -253
  56. package/src/municipal/streets/index.ts +2 -2
  57. package/src/municipal/streets/streets.getters.ts +140 -140
  58. package/src/municipal/streets/streets.types.ts +19 -19
  59. package/src/municipal/systemInstructions/__tests__/getters.spec.ts +113 -113
  60. package/src/municipal/systemInstructions/__tests__/setters.spec.ts +274 -274
  61. package/src/municipal/systemInstructions/index.ts +7 -7
  62. package/src/municipal/systemInstructions/instructions.getters.ts +57 -57
  63. package/src/municipal/systemInstructions/instructions.setters.ts +119 -119
  64. package/src/municipal/systemInstructions/instructions.types.ts +30 -30
  65. package/src/municipal/tickets/__tests__/tickets.getters.spec.ts +30 -30
  66. package/src/municipal/tickets/__tests__/tickets.statistics.spec.ts +99 -99
  67. package/src/municipal/tickets/index.ts +9 -9
  68. package/src/municipal/tickets/tickets.constants.ts +8 -8
  69. package/src/municipal/tickets/tickets.getters.ts +121 -121
  70. package/src/municipal/tickets/tickets.statistics.aggregation.ts +110 -110
  71. package/src/municipal/tickets/tickets.statistics.getters.ts +145 -145
  72. package/src/municipal/tickets/tickets.types.ts +54 -54
  73. package/src/municipal/utils/types.ts +11 -11
  74. package/src/talkpilot/__tests__/db.spec.ts +38 -38
  75. package/src/talkpilot/__tests__/mongodb-client.spec.ts +18 -18
  76. package/src/talkpilot/__tests__/validation.spec.ts +68 -68
  77. package/src/talkpilot/agents/__tests__/agents.getters.spec.ts +29 -29
  78. package/src/talkpilot/agents/agents.getters.ts +34 -34
  79. package/src/talkpilot/agents/agents.types.ts +14 -14
  80. package/src/talkpilot/agents/index.ts +2 -2
  81. package/src/talkpilot/backgroundToolResults/__tests__/backgroundToolResults.getters.spec.ts +147 -147
  82. package/src/talkpilot/backgroundToolResults/backgroundToolResults.getters.ts +65 -65
  83. package/src/talkpilot/backgroundToolResults/backgroundToolResults.types.ts +23 -23
  84. package/src/talkpilot/backgroundToolResults/index.ts +2 -2
  85. package/src/talkpilot/calls/__tests__/callStats.utils.spec.ts +128 -128
  86. package/src/talkpilot/calls/__tests__/calls.dashboard.spec.ts +229 -229
  87. package/src/talkpilot/calls/__tests__/calls.spec.ts +471 -471
  88. package/src/talkpilot/calls/__tests__/calls.statistics.spec.ts +483 -483
  89. package/src/talkpilot/calls/calls.constants.ts +49 -49
  90. package/src/talkpilot/calls/calls.getters.ts +277 -277
  91. package/src/talkpilot/calls/calls.statistics.getters.ts +668 -668
  92. package/src/talkpilot/calls/calls.statistics.types.ts +48 -48
  93. package/src/talkpilot/calls/calls.types.ts +134 -149
  94. package/src/talkpilot/calls/dashboard/calls.dashboard.ts +295 -295
  95. package/src/talkpilot/calls/dashboard/calls.dashboard.types.ts +57 -57
  96. package/src/talkpilot/calls/index.ts +6 -6
  97. package/src/talkpilot/clientAudioBuffers/__tests__/clientAudioBuffer.getters.spec.ts +160 -160
  98. package/src/talkpilot/clientAudioBuffers/clientAudioBuffer.getters.ts +117 -117
  99. package/src/talkpilot/clientAudioBuffers/clientsAudioBuffers.types.ts +25 -25
  100. package/src/talkpilot/clientAudioBuffers/index.ts +2 -2
  101. package/src/talkpilot/clients/__tests__/clients.quota.spec.ts +123 -123
  102. package/src/talkpilot/clients/clients.getters.ts +16 -16
  103. package/src/talkpilot/clients/clients.quota.getters.ts +119 -119
  104. package/src/talkpilot/clients/clients.quota.types.ts +27 -27
  105. package/src/talkpilot/clients/clients.types.ts +18 -18
  106. package/src/talkpilot/clients/index.ts +4 -4
  107. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.getters.spec.ts +423 -423
  108. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +212 -212
  109. package/src/talkpilot/clientsConfig/clientsConfig.constants.ts +2 -2
  110. package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +247 -247
  111. package/src/talkpilot/clientsConfig/clientsConfig.types.ts +136 -135
  112. package/src/talkpilot/clientsConfig/index.ts +3 -3
  113. package/src/talkpilot/contextNotes/__tests__/contextNotes.getters.spec.ts +217 -217
  114. package/src/talkpilot/contextNotes/contextNotes.getters.ts +85 -85
  115. package/src/talkpilot/contextNotes/contextNotes.types.ts +20 -20
  116. package/src/talkpilot/contextNotes/index.ts +2 -2
  117. package/src/talkpilot/flows/__tests__/flows.schema.spec.ts +99 -99
  118. package/src/talkpilot/flows/flows.getter.ts +14 -14
  119. package/src/talkpilot/flows/flows.schema.ts +155 -155
  120. package/src/talkpilot/flows/flows.types.ts +189 -189
  121. package/src/talkpilot/flows/index.ts +2 -2
  122. package/src/talkpilot/groups/__tests__/groups.spec.ts +90 -90
  123. package/src/talkpilot/groups/__tests__/phone.utils.spec.ts +32 -32
  124. package/src/talkpilot/groups/groups.getters.ts +30 -30
  125. package/src/talkpilot/groups/groups.types.ts +29 -29
  126. package/src/talkpilot/groups/index.ts +3 -3
  127. package/src/talkpilot/groups/phone.utils.ts +46 -46
  128. package/src/talkpilot/index.ts +31 -31
  129. package/src/talkpilot/leads/index.ts +2 -2
  130. package/src/talkpilot/leads/leads.getter.ts +6 -6
  131. package/src/talkpilot/leads/leads.schema.ts +33 -33
  132. package/src/talkpilot/leads/leads.types.ts +20 -20
  133. package/src/talkpilot/mongodb-client.ts +78 -78
  134. package/src/talkpilot/phone_numbers/__tests__/phone_numbers.spec.ts +282 -282
  135. package/src/talkpilot/phone_numbers/index.ts +2 -2
  136. package/src/talkpilot/phone_numbers/phone_numbers.getter.ts +176 -176
  137. package/src/talkpilot/phone_numbers/phone_numbers.schema.ts +17 -17
  138. package/src/talkpilot/phone_numbers/phone_numbers.types.ts +30 -30
  139. package/src/talkpilot/plans/__tests__/plans.spec.ts +70 -70
  140. package/src/talkpilot/plans/index.ts +2 -2
  141. package/src/talkpilot/plans/plans.getters.ts +132 -132
  142. package/src/talkpilot/plans/plans.types.ts +89 -89
  143. package/src/talkpilot/products/__tests__/products.getters.spec.ts +44 -44
  144. package/src/talkpilot/products/index.ts +2 -2
  145. package/src/talkpilot/products/products.getters.ts +12 -12
  146. package/src/talkpilot/products/products.types.ts +9 -9
  147. package/src/talkpilot/results/index.ts +7 -7
  148. package/src/talkpilot/results/results.getter.ts +39 -39
  149. package/src/talkpilot/results/results.schema.ts +25 -25
  150. package/src/talkpilot/results/results.types.ts +34 -34
  151. package/src/talkpilot/retry_analyze/__tests__/retryAnalyze.getters.spec.ts +156 -156
  152. package/src/talkpilot/retry_analyze/index.ts +2 -2
  153. package/src/talkpilot/retry_analyze/retryAnalyze.getters.ts +84 -84
  154. package/src/talkpilot/retry_analyze/retryAnalyze.types.ts +13 -13
  155. package/src/talkpilot/sessions/__tests__/sessions.spec.ts +147 -147
  156. package/src/talkpilot/sessions/index.ts +2 -2
  157. package/src/talkpilot/sessions/sessions.getter.ts +92 -92
  158. package/src/talkpilot/sessions/sessions.schema.ts +34 -34
  159. package/src/talkpilot/sessions/sessions.types.ts +30 -30
  160. package/src/talkpilot/subscriptions/__tests__/subscriptions.getters.utils.spec.ts +45 -45
  161. package/src/talkpilot/subscriptions/index.ts +3 -3
  162. package/src/talkpilot/subscriptions/subscriptions.getters.ts +146 -146
  163. package/src/talkpilot/subscriptions/subscriptions.getters.utils.ts +33 -33
  164. package/src/talkpilot/subscriptions/subscriptions.types.ts +66 -66
  165. package/src/talkpilot/utils/__tests__/query.utils.spec.ts +49 -49
  166. package/src/talkpilot/utils/query.utils.ts +21 -21
  167. package/src/test-utils/db-utils.ts +33 -33
  168. package/src/test-utils/factories/index.ts +18 -18
  169. package/src/test-utils/factories/municipal/cities.ts +16 -16
  170. package/src/test-utils/factories/municipal/departmentsSubjects.ts +37 -37
  171. package/src/test-utils/factories/municipal/muniIssues.ts +32 -32
  172. package/src/test-utils/factories/municipal/streets.ts +22 -22
  173. package/src/test-utils/factories/municipal/tickets.ts +39 -39
  174. package/src/test-utils/factories/talkpilot/agents.ts +19 -19
  175. package/src/test-utils/factories/talkpilot/calls.ts +37 -37
  176. package/src/test-utils/factories/talkpilot/clientAudioBuffers.ts +20 -20
  177. package/src/test-utils/factories/talkpilot/clientsConfig.ts +18 -18
  178. package/src/test-utils/factories/talkpilot/contextNotes.ts +40 -40
  179. package/src/test-utils/factories/talkpilot/flows.ts +33 -33
  180. package/src/test-utils/factories/talkpilot/groups.ts +33 -33
  181. package/src/test-utils/factories/talkpilot/phone_numbers.ts +22 -22
  182. package/src/test-utils/factories/talkpilot/sessions.ts +35 -35
  183. package/src/test-utils/factories/websitalk/knowledgeDocuments.ts +29 -29
  184. package/src/test-utils/factories/websitalk/scanResources.ts +26 -26
  185. package/src/test-utils/factories/websitalk/scans.ts +29 -29
  186. package/src/test-utils/factories/websitalk/websiteUrls.ts +17 -17
  187. package/src/utils/date.utils.ts +126 -126
  188. package/src/utils/shared.types.ts +4 -4
  189. package/src/utils/validation.ts +23 -23
  190. package/src/websitalk/index.ts +18 -18
  191. package/src/websitalk/knowledgeDocuments/__tests__/knowledgeDocuments.spec.ts +186 -186
  192. package/src/websitalk/knowledgeDocuments/index.ts +3 -3
  193. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.constants.ts +17 -17
  194. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.getters.ts +78 -78
  195. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.types.ts +62 -62
  196. package/src/websitalk/mongodb-client.ts +61 -61
  197. package/src/websitalk/scanResources/__tests__/scanResources.spec.ts +136 -136
  198. package/src/websitalk/scanResources/index.ts +4 -4
  199. package/src/websitalk/scanResources/scanResources.constants.ts +47 -47
  200. package/src/websitalk/scanResources/scanResources.getters.ts +94 -94
  201. package/src/websitalk/scanResources/scanResources.types.ts +90 -90
  202. package/src/websitalk/scanResources/scanResources.utils.ts +28 -28
  203. package/src/websitalk/scans/__tests__/scans.spec.ts +313 -313
  204. package/src/websitalk/scans/index.ts +4 -4
  205. package/src/websitalk/scans/scans.constants.ts +15 -15
  206. package/src/websitalk/scans/scans.getters.ts +166 -166
  207. package/src/websitalk/scans/scans.types.ts +54 -54
  208. package/src/websitalk/scans/scans.utils.ts +5 -5
  209. package/src/websitalk/websiteUrls/__tests__/websiteUrls.spec.ts +77 -77
  210. package/src/websitalk/websiteUrls/index.ts +2 -2
  211. package/src/websitalk/websiteUrls/websiteUrls.getters.ts +65 -65
  212. package/src/websitalk/websiteUrls/websiteUrls.types.ts +13 -13
  213. package/tsconfig.json +23 -23
  214. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.d.ts +0 -10
  215. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.d.ts.map +0 -1
  216. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.js +0 -15
  217. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.js.map +0 -1
  218. package/dist/municipal/streets/streets.setters.d.ts +0 -10
  219. package/dist/municipal/streets/streets.setters.d.ts.map +0 -1
  220. package/dist/municipal/streets/streets.setters.js +0 -15
  221. package/dist/municipal/streets/streets.setters.js.map +0 -1
  222. package/dist/reconcile/index.d.ts +0 -5
  223. package/dist/reconcile/index.d.ts.map +0 -1
  224. package/dist/reconcile/index.js +0 -21
  225. package/dist/reconcile/index.js.map +0 -1
  226. package/dist/reconcile/reconcile.diff.d.ts +0 -4
  227. package/dist/reconcile/reconcile.diff.d.ts.map +0 -1
  228. package/dist/reconcile/reconcile.diff.js +0 -36
  229. package/dist/reconcile/reconcile.diff.js.map +0 -1
  230. package/dist/reconcile/reconcile.execute.d.ts +0 -7
  231. package/dist/reconcile/reconcile.execute.d.ts.map +0 -1
  232. package/dist/reconcile/reconcile.execute.js +0 -20
  233. package/dist/reconcile/reconcile.execute.js.map +0 -1
  234. package/dist/reconcile/reconcile.ops.d.ts +0 -12
  235. package/dist/reconcile/reconcile.ops.d.ts.map +0 -1
  236. package/dist/reconcile/reconcile.ops.js +0 -24
  237. package/dist/reconcile/reconcile.ops.js.map +0 -1
  238. package/dist/reconcile/reconcile.types.d.ts +0 -32
  239. package/dist/reconcile/reconcile.types.d.ts.map +0 -1
  240. package/dist/reconcile/reconcile.types.js +0 -3
  241. package/dist/reconcile/reconcile.types.js.map +0 -1
@@ -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();