@talkpilot/core-db 1.3.47 → 1.3.49

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