@talkpilot/core-db 1.3.48 → 1.3.50

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 (231) 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 -777
  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 +6 -1
  8. package/dist/configuration/models/models.constants.js.map +1 -1
  9. package/dist/talkpilot/clients/clients.quota.constants.d.ts +2 -0
  10. package/dist/talkpilot/clients/clients.quota.constants.d.ts.map +1 -0
  11. package/dist/talkpilot/clients/clients.quota.constants.js +5 -0
  12. package/dist/talkpilot/clients/clients.quota.constants.js.map +1 -0
  13. package/dist/talkpilot/clients/clients.quota.utils.d.ts +8 -0
  14. package/dist/talkpilot/clients/clients.quota.utils.d.ts.map +1 -0
  15. package/dist/talkpilot/clients/clients.quota.utils.js +45 -0
  16. package/dist/talkpilot/clients/clients.quota.utils.js.map +1 -0
  17. package/dist/talkpilot/flows/flows.getter.d.ts +4 -1
  18. package/dist/talkpilot/flows/flows.getter.d.ts.map +1 -1
  19. package/dist/talkpilot/flows/flows.getter.js +12 -1
  20. package/dist/talkpilot/flows/flows.getter.js.map +1 -1
  21. package/dist/talkpilot/flows/flows.schema.d.ts +31 -0
  22. package/dist/talkpilot/flows/flows.schema.d.ts.map +1 -1
  23. package/dist/talkpilot/flows/flows.schema.js +25 -0
  24. package/dist/talkpilot/flows/flows.schema.js.map +1 -1
  25. package/dist/talkpilot/flows/flows.types.d.ts +14 -0
  26. package/dist/talkpilot/flows/flows.types.d.ts.map +1 -1
  27. package/dist/talkpilot/flows/index.d.ts +1 -1
  28. package/dist/talkpilot/flows/index.d.ts.map +1 -1
  29. package/dist/talkpilot/flows/index.js +3 -1
  30. package/dist/talkpilot/flows/index.js.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/index.ts +25 -25
  45. package/src/configuration/models/models.constants.ts +18 -13
  46. package/src/configuration/models/models.getters.ts +53 -53
  47. package/src/configuration/models/models.types.ts +79 -79
  48. package/src/configuration/mongodb-client.ts +62 -62
  49. package/src/configuration/prompts/index.ts +2 -2
  50. package/src/configuration/prompts/prompts.getters.ts +49 -49
  51. package/src/configuration/prompts/prompts.types.ts +11 -11
  52. package/src/connection.ts +81 -81
  53. package/src/index.ts +46 -46
  54. package/src/municipal/__tests__/validation.spec.ts +62 -62
  55. package/src/municipal/cities/cities.getters.ts +50 -50
  56. package/src/municipal/cities/cities.types.ts +11 -11
  57. package/src/municipal/cities/index.ts +2 -2
  58. package/src/municipal/departmentsSubjects/__tests__/departmentsSubjects.spec.ts +272 -272
  59. package/src/municipal/departmentsSubjects/departmentsSubjects.getters.ts +317 -317
  60. package/src/municipal/departmentsSubjects/departmentsSubjects.types.ts +73 -73
  61. package/src/municipal/departmentsSubjects/index.ts +9 -9
  62. package/src/municipal/index.ts +22 -22
  63. package/src/municipal/mongodb-client.ts +61 -61
  64. package/src/municipal/muniIssues/__tests__/muniIssues.setters.spec.ts +94 -94
  65. package/src/municipal/muniIssues/__tests__/muniIssues.setup.spec.ts +92 -92
  66. package/src/municipal/muniIssues/index.ts +17 -17
  67. package/src/municipal/muniIssues/muniIssues.constants.ts +18 -18
  68. package/src/municipal/muniIssues/muniIssues.getters.ts +24 -24
  69. package/src/municipal/muniIssues/muniIssues.schema.ts +66 -66
  70. package/src/municipal/muniIssues/muniIssues.setters.ts +24 -24
  71. package/src/municipal/muniIssues/muniIssues.setup.ts +65 -65
  72. package/src/municipal/muniIssues/muniIssues.types.ts +37 -37
  73. package/src/municipal/streets/__tests__/streets.spec.ts +253 -253
  74. package/src/municipal/streets/index.ts +2 -2
  75. package/src/municipal/streets/streets.getters.ts +140 -140
  76. package/src/municipal/streets/streets.types.ts +19 -19
  77. package/src/municipal/systemInstructions/__tests__/getters.spec.ts +113 -113
  78. package/src/municipal/systemInstructions/__tests__/setters.spec.ts +274 -274
  79. package/src/municipal/systemInstructions/index.ts +7 -7
  80. package/src/municipal/systemInstructions/instructions.getters.ts +57 -57
  81. package/src/municipal/systemInstructions/instructions.setters.ts +119 -119
  82. package/src/municipal/systemInstructions/instructions.types.ts +30 -30
  83. package/src/municipal/tickets/__tests__/tickets.getters.spec.ts +30 -30
  84. package/src/municipal/tickets/__tests__/tickets.statistics.spec.ts +99 -99
  85. package/src/municipal/tickets/index.ts +9 -9
  86. package/src/municipal/tickets/tickets.constants.ts +8 -8
  87. package/src/municipal/tickets/tickets.getters.ts +121 -121
  88. package/src/municipal/tickets/tickets.statistics.aggregation.ts +110 -110
  89. package/src/municipal/tickets/tickets.statistics.getters.ts +145 -145
  90. package/src/municipal/tickets/tickets.types.ts +54 -54
  91. package/src/municipal/utils/types.ts +11 -11
  92. package/src/talkpilot/__tests__/db.spec.ts +38 -38
  93. package/src/talkpilot/__tests__/mongodb-client.spec.ts +18 -18
  94. package/src/talkpilot/__tests__/validation.spec.ts +68 -68
  95. package/src/talkpilot/agents/__tests__/agents.getters.spec.ts +29 -29
  96. package/src/talkpilot/agents/agents.getters.ts +34 -34
  97. package/src/talkpilot/agents/agents.types.ts +14 -14
  98. package/src/talkpilot/agents/index.ts +2 -2
  99. package/src/talkpilot/backgroundToolResults/__tests__/backgroundToolResults.getters.spec.ts +147 -147
  100. package/src/talkpilot/backgroundToolResults/backgroundToolResults.getters.ts +65 -65
  101. package/src/talkpilot/backgroundToolResults/backgroundToolResults.types.ts +23 -23
  102. package/src/talkpilot/backgroundToolResults/index.ts +2 -2
  103. package/src/talkpilot/calls/__tests__/callStats.utils.spec.ts +128 -128
  104. package/src/talkpilot/calls/__tests__/calls.dashboard.spec.ts +229 -229
  105. package/src/talkpilot/calls/__tests__/calls.spec.ts +471 -471
  106. package/src/talkpilot/calls/__tests__/calls.statistics.spec.ts +483 -483
  107. package/src/talkpilot/calls/calls.constants.ts +49 -49
  108. package/src/talkpilot/calls/calls.getters.ts +277 -277
  109. package/src/talkpilot/calls/calls.statistics.getters.ts +668 -668
  110. package/src/talkpilot/calls/calls.statistics.types.ts +48 -48
  111. package/src/talkpilot/calls/calls.types.ts +149 -149
  112. package/src/talkpilot/calls/dashboard/calls.dashboard.ts +295 -295
  113. package/src/talkpilot/calls/dashboard/calls.dashboard.types.ts +57 -57
  114. package/src/talkpilot/calls/index.ts +6 -6
  115. package/src/talkpilot/clientAudioBuffers/__tests__/clientAudioBuffer.getters.spec.ts +160 -160
  116. package/src/talkpilot/clientAudioBuffers/clientAudioBuffer.getters.ts +117 -117
  117. package/src/talkpilot/clientAudioBuffers/clientsAudioBuffers.types.ts +25 -25
  118. package/src/talkpilot/clientAudioBuffers/index.ts +2 -2
  119. package/src/talkpilot/clients/__tests__/clients.quota.spec.ts +123 -123
  120. package/src/talkpilot/clients/clients.getters.ts +16 -16
  121. package/src/talkpilot/clients/clients.quota.getters.ts +119 -119
  122. package/src/talkpilot/clients/clients.quota.types.ts +27 -27
  123. package/src/talkpilot/clients/clients.types.ts +18 -18
  124. package/src/talkpilot/clients/index.ts +4 -4
  125. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.getters.spec.ts +423 -423
  126. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +212 -212
  127. package/src/talkpilot/clientsConfig/clientsConfig.constants.ts +2 -2
  128. package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +247 -247
  129. package/src/talkpilot/clientsConfig/clientsConfig.types.ts +136 -136
  130. package/src/talkpilot/clientsConfig/index.ts +3 -3
  131. package/src/talkpilot/contextNotes/__tests__/contextNotes.getters.spec.ts +217 -217
  132. package/src/talkpilot/contextNotes/contextNotes.getters.ts +85 -85
  133. package/src/talkpilot/contextNotes/contextNotes.types.ts +20 -20
  134. package/src/talkpilot/contextNotes/index.ts +2 -2
  135. package/src/talkpilot/flows/__tests__/flows.schema.spec.ts +124 -99
  136. package/src/talkpilot/flows/flows.getter.ts +34 -14
  137. package/src/talkpilot/flows/flows.schema.ts +180 -155
  138. package/src/talkpilot/flows/flows.types.ts +211 -189
  139. package/src/talkpilot/flows/index.ts +7 -2
  140. package/src/talkpilot/groups/__tests__/groups.spec.ts +90 -90
  141. package/src/talkpilot/groups/__tests__/phone.utils.spec.ts +32 -32
  142. package/src/talkpilot/groups/groups.getters.ts +30 -30
  143. package/src/talkpilot/groups/groups.types.ts +29 -29
  144. package/src/talkpilot/groups/index.ts +3 -3
  145. package/src/talkpilot/groups/phone.utils.ts +46 -46
  146. package/src/talkpilot/index.ts +31 -31
  147. package/src/talkpilot/leads/index.ts +2 -2
  148. package/src/talkpilot/leads/leads.getter.ts +6 -6
  149. package/src/talkpilot/leads/leads.schema.ts +33 -33
  150. package/src/talkpilot/leads/leads.types.ts +20 -20
  151. package/src/talkpilot/mongodb-client.ts +78 -78
  152. package/src/talkpilot/phone_numbers/__tests__/phone_numbers.spec.ts +282 -282
  153. package/src/talkpilot/phone_numbers/index.ts +2 -2
  154. package/src/talkpilot/phone_numbers/phone_numbers.getter.ts +176 -176
  155. package/src/talkpilot/phone_numbers/phone_numbers.schema.ts +17 -17
  156. package/src/talkpilot/phone_numbers/phone_numbers.types.ts +30 -30
  157. package/src/talkpilot/plans/__tests__/plans.spec.ts +70 -70
  158. package/src/talkpilot/plans/index.ts +2 -2
  159. package/src/talkpilot/plans/plans.getters.ts +132 -132
  160. package/src/talkpilot/plans/plans.types.ts +89 -89
  161. package/src/talkpilot/products/__tests__/products.getters.spec.ts +44 -44
  162. package/src/talkpilot/products/index.ts +2 -2
  163. package/src/talkpilot/products/products.getters.ts +12 -12
  164. package/src/talkpilot/products/products.types.ts +9 -9
  165. package/src/talkpilot/results/index.ts +7 -7
  166. package/src/talkpilot/results/results.getter.ts +39 -39
  167. package/src/talkpilot/results/results.schema.ts +25 -25
  168. package/src/talkpilot/results/results.types.ts +34 -34
  169. package/src/talkpilot/retry_analyze/__tests__/retryAnalyze.getters.spec.ts +156 -156
  170. package/src/talkpilot/retry_analyze/index.ts +2 -2
  171. package/src/talkpilot/retry_analyze/retryAnalyze.getters.ts +84 -84
  172. package/src/talkpilot/retry_analyze/retryAnalyze.types.ts +13 -13
  173. package/src/talkpilot/sessions/__tests__/sessions.spec.ts +147 -147
  174. package/src/talkpilot/sessions/index.ts +2 -2
  175. package/src/talkpilot/sessions/sessions.getter.ts +92 -92
  176. package/src/talkpilot/sessions/sessions.schema.ts +34 -34
  177. package/src/talkpilot/sessions/sessions.types.ts +30 -30
  178. package/src/talkpilot/subscriptions/__tests__/subscriptions.getters.utils.spec.ts +45 -45
  179. package/src/talkpilot/subscriptions/index.ts +3 -3
  180. package/src/talkpilot/subscriptions/subscriptions.getters.ts +146 -146
  181. package/src/talkpilot/subscriptions/subscriptions.getters.utils.ts +33 -33
  182. package/src/talkpilot/subscriptions/subscriptions.types.ts +66 -66
  183. package/src/talkpilot/utils/__tests__/query.utils.spec.ts +49 -49
  184. package/src/talkpilot/utils/query.utils.ts +21 -21
  185. package/src/test-utils/db-utils.ts +33 -33
  186. package/src/test-utils/factories/index.ts +18 -18
  187. package/src/test-utils/factories/municipal/cities.ts +16 -16
  188. package/src/test-utils/factories/municipal/departmentsSubjects.ts +37 -37
  189. package/src/test-utils/factories/municipal/muniIssues.ts +32 -32
  190. package/src/test-utils/factories/municipal/streets.ts +22 -22
  191. package/src/test-utils/factories/municipal/tickets.ts +39 -39
  192. package/src/test-utils/factories/talkpilot/agents.ts +19 -19
  193. package/src/test-utils/factories/talkpilot/calls.ts +37 -37
  194. package/src/test-utils/factories/talkpilot/clientAudioBuffers.ts +20 -20
  195. package/src/test-utils/factories/talkpilot/clientsConfig.ts +18 -18
  196. package/src/test-utils/factories/talkpilot/contextNotes.ts +40 -40
  197. package/src/test-utils/factories/talkpilot/flows.ts +33 -33
  198. package/src/test-utils/factories/talkpilot/groups.ts +33 -33
  199. package/src/test-utils/factories/talkpilot/phone_numbers.ts +22 -22
  200. package/src/test-utils/factories/talkpilot/sessions.ts +35 -35
  201. package/src/test-utils/factories/websitalk/knowledgeDocuments.ts +29 -29
  202. package/src/test-utils/factories/websitalk/scanResources.ts +26 -26
  203. package/src/test-utils/factories/websitalk/scans.ts +29 -29
  204. package/src/test-utils/factories/websitalk/websiteUrls.ts +17 -17
  205. package/src/utils/date.utils.ts +126 -126
  206. package/src/utils/shared.types.ts +4 -4
  207. package/src/utils/validation.ts +23 -23
  208. package/src/websitalk/index.ts +18 -18
  209. package/src/websitalk/knowledgeDocuments/__tests__/knowledgeDocuments.spec.ts +186 -186
  210. package/src/websitalk/knowledgeDocuments/index.ts +3 -3
  211. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.constants.ts +17 -17
  212. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.getters.ts +78 -78
  213. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.types.ts +62 -62
  214. package/src/websitalk/mongodb-client.ts +61 -61
  215. package/src/websitalk/scanResources/__tests__/scanResources.spec.ts +193 -193
  216. package/src/websitalk/scanResources/index.ts +4 -4
  217. package/src/websitalk/scanResources/scanResources.constants.ts +47 -47
  218. package/src/websitalk/scanResources/scanResources.getters.ts +102 -102
  219. package/src/websitalk/scanResources/scanResources.types.ts +90 -90
  220. package/src/websitalk/scanResources/scanResources.utils.ts +31 -31
  221. package/src/websitalk/scans/__tests__/scans.spec.ts +313 -313
  222. package/src/websitalk/scans/index.ts +4 -4
  223. package/src/websitalk/scans/scans.constants.ts +15 -15
  224. package/src/websitalk/scans/scans.getters.ts +166 -166
  225. package/src/websitalk/scans/scans.types.ts +54 -54
  226. package/src/websitalk/scans/scans.utils.ts +5 -5
  227. package/src/websitalk/websiteUrls/__tests__/websiteUrls.spec.ts +77 -77
  228. package/src/websitalk/websiteUrls/index.ts +2 -2
  229. package/src/websitalk/websiteUrls/websiteUrls.getters.ts +65 -65
  230. package/src/websitalk/websiteUrls/websiteUrls.types.ts +13 -13
  231. package/tsconfig.json +23 -23
@@ -1,65 +1,65 @@
1
- import {
2
- buildDeleteOp,
3
- buildInsertOp,
4
- buildSetOp,
5
- buildUpsertOp,
6
- } from "../bulkWrite.ops";
7
-
8
- interface TestDoc {
9
- _id: string;
10
- key: string;
11
- value: string;
12
- }
13
-
14
- describe("buildSetOp", () => {
15
- it("returns a plain $set updateOne with no upsert", () => {
16
- const op = buildSetOp<TestDoc>({ key: "k1" }, { value: "v2" });
17
- expect(op).toEqual({
18
- updateOne: { filter: { key: "k1" }, update: { $set: { value: "v2" } } },
19
- });
20
- });
21
- });
22
-
23
- describe("buildUpsertOp", () => {
24
- it("returns $set + $setOnInsert + upsert:true", () => {
25
- const op = buildUpsertOp<TestDoc>(
26
- { key: "k1" },
27
- { value: "v1" },
28
- { key: "k1" },
29
- );
30
- expect(op).toEqual({
31
- updateOne: {
32
- filter: { key: "k1" },
33
- update: { $set: { value: "v1" }, $setOnInsert: { key: "k1" } },
34
- upsert: true,
35
- },
36
- });
37
- });
38
-
39
- it("defaults $setOnInsert to an empty object when omitted", () => {
40
- const op = buildUpsertOp<TestDoc>({ key: "k1" }, { value: "v1" });
41
- expect(op).toEqual({
42
- updateOne: {
43
- filter: { key: "k1" },
44
- update: { $set: { value: "v1" }, $setOnInsert: {} },
45
- upsert: true,
46
- },
47
- });
48
- });
49
- });
50
-
51
- describe("buildInsertOp", () => {
52
- it("returns an insertOne with the given document", () => {
53
- const op = buildInsertOp<TestDoc>({ _id: "1", key: "k1", value: "v1" });
54
- expect(op).toEqual({
55
- insertOne: { document: { _id: "1", key: "k1", value: "v1" } },
56
- });
57
- });
58
- });
59
-
60
- describe("buildDeleteOp", () => {
61
- it("returns a deleteOne matching filter", () => {
62
- const op = buildDeleteOp<TestDoc>({ key: "k1" });
63
- expect(op).toEqual({ deleteOne: { filter: { key: "k1" } } });
64
- });
65
- });
1
+ import {
2
+ buildDeleteOp,
3
+ buildInsertOp,
4
+ buildSetOp,
5
+ buildUpsertOp,
6
+ } from "../bulkWrite.ops";
7
+
8
+ interface TestDoc {
9
+ _id: string;
10
+ key: string;
11
+ value: string;
12
+ }
13
+
14
+ describe("buildSetOp", () => {
15
+ it("returns a plain $set updateOne with no upsert", () => {
16
+ const op = buildSetOp<TestDoc>({ key: "k1" }, { value: "v2" });
17
+ expect(op).toEqual({
18
+ updateOne: { filter: { key: "k1" }, update: { $set: { value: "v2" } } },
19
+ });
20
+ });
21
+ });
22
+
23
+ describe("buildUpsertOp", () => {
24
+ it("returns $set + $setOnInsert + upsert:true", () => {
25
+ const op = buildUpsertOp<TestDoc>(
26
+ { key: "k1" },
27
+ { value: "v1" },
28
+ { key: "k1" },
29
+ );
30
+ expect(op).toEqual({
31
+ updateOne: {
32
+ filter: { key: "k1" },
33
+ update: { $set: { value: "v1" }, $setOnInsert: { key: "k1" } },
34
+ upsert: true,
35
+ },
36
+ });
37
+ });
38
+
39
+ it("defaults $setOnInsert to an empty object when omitted", () => {
40
+ const op = buildUpsertOp<TestDoc>({ key: "k1" }, { value: "v1" });
41
+ expect(op).toEqual({
42
+ updateOne: {
43
+ filter: { key: "k1" },
44
+ update: { $set: { value: "v1" }, $setOnInsert: {} },
45
+ upsert: true,
46
+ },
47
+ });
48
+ });
49
+ });
50
+
51
+ describe("buildInsertOp", () => {
52
+ it("returns an insertOne with the given document", () => {
53
+ const op = buildInsertOp<TestDoc>({ _id: "1", key: "k1", value: "v1" });
54
+ expect(op).toEqual({
55
+ insertOne: { document: { _id: "1", key: "k1", value: "v1" } },
56
+ });
57
+ });
58
+ });
59
+
60
+ describe("buildDeleteOp", () => {
61
+ it("returns a deleteOne matching filter", () => {
62
+ const op = buildDeleteOp<TestDoc>({ key: "k1" });
63
+ expect(op).toEqual({ deleteOne: { filter: { key: "k1" } } });
64
+ });
65
+ });
@@ -1,45 +1,45 @@
1
- import { Document, Filter, OptionalId } from "mongodb";
2
- import { BulkWriteOp } from "./bulkWrite.types";
3
-
4
- /**
5
- * Updates specific fields on the record matching filter.
6
- * Does nothing if no record matches.
7
- */
8
- export function buildSetOp<T extends Document>(
9
- filter: Filter<T>,
10
- setFields: Partial<T>,
11
- ): BulkWriteOp<T> {
12
- return { updateOne: { filter, update: { $set: setFields } } };
13
- }
14
-
15
- /**
16
- * Updates specific fields on the record matching the filter or creates a new record if none matches.
17
- * setOnInsertFields are only applied when a new record is created; they're ignored on an update.
18
- */
19
- export function buildUpsertOp<T extends Document>(
20
- filter: Filter<T>,
21
- setFields: Partial<T>,
22
- setOnInsertFields: Partial<T> = {},
23
- ): BulkWriteOp<T> {
24
- return {
25
- updateOne: {
26
- filter,
27
- update: { $set: setFields, $setOnInsert: setOnInsertFields },
28
- upsert: true,
29
- },
30
- };
31
- }
32
-
33
- /** Creates a new record. */
34
- export function buildInsertOp<T extends Document>(
35
- document: OptionalId<T>,
36
- ): BulkWriteOp<T> {
37
- return { insertOne: { document } };
38
- }
39
-
40
- /** Permanently removes the record matching the filter. */
41
- export function buildDeleteOp<T extends Document>(
42
- filter: Filter<T>,
43
- ): BulkWriteOp<T> {
44
- return { deleteOne: { filter } };
45
- }
1
+ import { Document, Filter, OptionalId } from "mongodb";
2
+ import { BulkWriteOp } from "./bulkWrite.types";
3
+
4
+ /**
5
+ * Updates specific fields on the record matching filter.
6
+ * Does nothing if no record matches.
7
+ */
8
+ export function buildSetOp<T extends Document>(
9
+ filter: Filter<T>,
10
+ setFields: Partial<T>,
11
+ ): BulkWriteOp<T> {
12
+ return { updateOne: { filter, update: { $set: setFields } } };
13
+ }
14
+
15
+ /**
16
+ * Updates specific fields on the record matching the filter or creates a new record if none matches.
17
+ * setOnInsertFields are only applied when a new record is created; they're ignored on an update.
18
+ */
19
+ export function buildUpsertOp<T extends Document>(
20
+ filter: Filter<T>,
21
+ setFields: Partial<T>,
22
+ setOnInsertFields: Partial<T> = {},
23
+ ): BulkWriteOp<T> {
24
+ return {
25
+ updateOne: {
26
+ filter,
27
+ update: { $set: setFields, $setOnInsert: setOnInsertFields },
28
+ upsert: true,
29
+ },
30
+ };
31
+ }
32
+
33
+ /** Creates a new record. */
34
+ export function buildInsertOp<T extends Document>(
35
+ document: OptionalId<T>,
36
+ ): BulkWriteOp<T> {
37
+ return { insertOne: { document } };
38
+ }
39
+
40
+ /** Permanently removes the record matching the filter. */
41
+ export function buildDeleteOp<T extends Document>(
42
+ filter: Filter<T>,
43
+ ): BulkWriteOp<T> {
44
+ return { deleteOne: { filter } };
45
+ }
@@ -1,4 +1,4 @@
1
- import { AnyBulkWriteOperation, Document } from "mongodb";
2
-
3
- /** A single MongoDB bulk-write operation, typed against the target document shape. */
4
- export type BulkWriteOp<T extends Document> = AnyBulkWriteOperation<T>;
1
+ import { AnyBulkWriteOperation, Document } from "mongodb";
2
+
3
+ /** A single MongoDB bulk-write operation, typed against the target document shape. */
4
+ export type BulkWriteOp<T extends Document> = AnyBulkWriteOperation<T>;
@@ -1,2 +1,2 @@
1
- export * from "./bulkWrite.types";
2
- export * from "./bulkWrite.ops";
1
+ export * from "./bulkWrite.types";
2
+ export * from "./bulkWrite.ops";
package/src/config.ts CHANGED
@@ -1,9 +1,9 @@
1
- /**
2
- * Centralized env var access. Add new fields here instead of reading
3
- * process.env directly elsewhere, so each env var has exactly one source of truth in the code.
4
- */
5
-
6
- export const configurationDbConfig = {
7
- mongoUri: process.env.MONGO_URI || process.env.MONGODB_URI,
8
- configurationDbName: process.env.CONFIGURATION_DB_NAME,
9
- };
1
+ /**
2
+ * Centralized env var access. Add new fields here instead of reading
3
+ * process.env directly elsewhere, so each env var has exactly one source of truth in the code.
4
+ */
5
+
6
+ export const configurationDbConfig = {
7
+ mongoUri: process.env.MONGO_URI || process.env.MONGODB_URI,
8
+ configurationDbName: process.env.CONFIGURATION_DB_NAME,
9
+ };
@@ -1,17 +1,17 @@
1
- import { Db, ObjectId as MongoObjectId } from "mongodb";
2
-
3
- export * from "./prompts";
4
- export * from "./models";
5
- export * from "./internalModels";
6
- export { configurationMongodbClient } from "./mongodb-client";
7
-
8
- let db: Db;
9
- export const setDb = (d: Db) => {
10
- db = d;
11
- };
12
-
13
- export const getDb = (): Db => {
14
- if (!db) throw new Error("Configuration DB not initialised");
15
- return db;
16
- };
17
- export const ObjectId = MongoObjectId;
1
+ import { Db, ObjectId as MongoObjectId } from "mongodb";
2
+
3
+ export * from "./prompts";
4
+ export * from "./models";
5
+ export * from "./internalModels";
6
+ export { configurationMongodbClient } from "./mongodb-client";
7
+
8
+ let db: Db;
9
+ export const setDb = (d: Db) => {
10
+ db = d;
11
+ };
12
+
13
+ export const getDb = (): Db => {
14
+ if (!db) throw new Error("Configuration DB not initialised");
15
+ return db;
16
+ };
17
+ export const ObjectId = MongoObjectId;
@@ -1,3 +1,3 @@
1
- export { INTERNAL_MODELS_COLLECTION } from "./internalModels.constants";
2
- export * from "./internalModels.getters";
3
- export type { InternalModel } from "./internalModels.types";
1
+ export { INTERNAL_MODELS_COLLECTION } from "./internalModels.constants";
2
+ export * from "./internalModels.getters";
3
+ export type { InternalModel } from "./internalModels.types";
@@ -1 +1 @@
1
- export const INTERNAL_MODELS_COLLECTION = "internal-models";
1
+ export const INTERNAL_MODELS_COLLECTION = "internal-models";
@@ -1,33 +1,33 @@
1
- import { getDb } from "../index";
2
- import { Collection, Filter } from "mongodb";
3
- import { InternalModel } from "./internalModels.types";
4
- import { INTERNAL_MODELS_COLLECTION } from "./internalModels.constants";
5
-
6
- export const getInternalModelsCollection = (): Collection<InternalModel> => {
7
- return getDb().collection<InternalModel>(INTERNAL_MODELS_COLLECTION);
8
- };
9
-
10
- /**
11
- * Get an internal model config by its unique name
12
- */
13
- export const getInternalModelByName = async (
14
- name: string
15
- ): Promise<InternalModel | null> => {
16
- return await getInternalModelsCollection().findOne({ name });
17
- };
18
-
19
- /**
20
- * Find internal models by filter.
21
- */
22
- export const findInternalModels = async (
23
- filter: Filter<InternalModel> = {}
24
- ): Promise<InternalModel[]> => {
25
- return await getInternalModelsCollection().find(filter).toArray();
26
- };
27
-
28
- /**
29
- * Get all internal models.
30
- */
31
- export const getAllInternalModels = async (): Promise<InternalModel[]> => {
32
- return await findInternalModels();
33
- };
1
+ import { getDb } from "../index";
2
+ import { Collection, Filter } from "mongodb";
3
+ import { InternalModel } from "./internalModels.types";
4
+ import { INTERNAL_MODELS_COLLECTION } from "./internalModels.constants";
5
+
6
+ export const getInternalModelsCollection = (): Collection<InternalModel> => {
7
+ return getDb().collection<InternalModel>(INTERNAL_MODELS_COLLECTION);
8
+ };
9
+
10
+ /**
11
+ * Get an internal model config by its unique name
12
+ */
13
+ export const getInternalModelByName = async (
14
+ name: string
15
+ ): Promise<InternalModel | null> => {
16
+ return await getInternalModelsCollection().findOne({ name });
17
+ };
18
+
19
+ /**
20
+ * Find internal models by filter.
21
+ */
22
+ export const findInternalModels = async (
23
+ filter: Filter<InternalModel> = {}
24
+ ): Promise<InternalModel[]> => {
25
+ return await getInternalModelsCollection().find(filter).toArray();
26
+ };
27
+
28
+ /**
29
+ * Get all internal models.
30
+ */
31
+ export const getAllInternalModels = async (): Promise<InternalModel[]> => {
32
+ return await findInternalModels();
33
+ };
@@ -1,12 +1,12 @@
1
- import { ObjectId } from "mongodb";
2
-
3
- export type InternalModel = {
4
- _id: ObjectId;
5
- /** Has to be unique between other names in collection */
6
- name: string;
7
- provider: string;
8
- model: string;
9
- config?: Record<string, unknown>;
10
- createdAt: Date;
11
- updatedAt: Date;
12
- };
1
+ import { ObjectId } from "mongodb";
2
+
3
+ export type InternalModel = {
4
+ _id: ObjectId;
5
+ /** Has to be unique between other names in collection */
6
+ name: string;
7
+ provider: string;
8
+ model: string;
9
+ config?: Record<string, unknown>;
10
+ createdAt: Date;
11
+ updatedAt: Date;
12
+ };
@@ -1,25 +1,25 @@
1
- export {
2
- MODELS_COLLECTION,
3
- MODEL_TYPES,
4
- REALTIME_MODEL_PROVIDERS,
5
- STT_MODEL_PROVIDERS,
6
- } from "./models.constants";
7
- export {
8
- getModelsCollection,
9
- findModels,
10
- getModelByModelId,
11
- getModelsByProvider,
12
- getModelsByType,
13
- getAvailableModelsByType,
14
- } from "./models.getters";
15
- export type {
16
- ModelType,
17
- RealtimeModelProvider,
18
- SttModelProvider,
19
- SemanticVad,
20
- ServerVad,
21
- TurnDetection,
22
- RealtimeModelDoc,
23
- SttModelDoc,
24
- ModelDoc,
25
- } from "./models.types";
1
+ export {
2
+ MODELS_COLLECTION,
3
+ MODEL_TYPES,
4
+ REALTIME_MODEL_PROVIDERS,
5
+ STT_MODEL_PROVIDERS,
6
+ } from "./models.constants";
7
+ export {
8
+ getModelsCollection,
9
+ findModels,
10
+ getModelByModelId,
11
+ getModelsByProvider,
12
+ getModelsByType,
13
+ getAvailableModelsByType,
14
+ } from "./models.getters";
15
+ export type {
16
+ ModelType,
17
+ RealtimeModelProvider,
18
+ SttModelProvider,
19
+ SemanticVad,
20
+ ServerVad,
21
+ TurnDetection,
22
+ RealtimeModelDoc,
23
+ SttModelDoc,
24
+ ModelDoc,
25
+ } from "./models.types";
@@ -1,13 +1,18 @@
1
- export const MODELS_COLLECTION = "models";
2
-
3
- export const MODEL_TYPES = ["realtime", "stt"] as const;
4
-
5
- export const REALTIME_MODEL_PROVIDERS = ["openai", "gemini", "xai"] as const;
6
- export const STT_MODEL_PROVIDERS = [
7
- "openai-stt",
8
- "google-stt",
9
- "deepgram-stt",
10
- "deepgram-flux",
11
- "elevenlabs-scribe",
12
- "gladia-stt",
13
- ] as const;
1
+ export const MODELS_COLLECTION = "models";
2
+
3
+ export const MODEL_TYPES = ["realtime", "stt"] as const;
4
+
5
+ export const REALTIME_MODEL_PROVIDERS = [
6
+ "openai",
7
+ "gemini",
8
+ "xai",
9
+ "elevenlabs",
10
+ ] as const;
11
+ export const STT_MODEL_PROVIDERS = [
12
+ "openai-stt",
13
+ "google-stt",
14
+ "deepgram-stt",
15
+ "deepgram-flux",
16
+ "elevenlabs-scribe",
17
+ "gladia-stt",
18
+ ] as const;
@@ -1,53 +1,53 @@
1
- import { Collection, Filter } from "mongodb";
2
-
3
- import { getDb } from "../index";
4
- import { MODELS_COLLECTION } from "./models.constants";
5
- import { ModelDoc, ModelType } from "./models.types";
6
-
7
- /** Raw typed handle to the `models` collection. */
8
- export const getModelsCollection = (): Collection<ModelDoc> => {
9
- return getDb().collection<ModelDoc>(MODELS_COLLECTION);
10
- };
11
-
12
- /** Find models by an arbitrary filter. */
13
- export const findModels = async (
14
- filter: Filter<ModelDoc> = {}
15
- ): Promise<ModelDoc[]> => {
16
- return await getModelsCollection().find(filter).toArray();
17
- };
18
-
19
- /**
20
- * Get a single model by its `modelId`, optionally scoped to a `type`.
21
- * @param modelId e.g. "deepgram-stt-phonecall"
22
- * @param type optional narrowing filter, since `modelId` isn't guaranteed unique across types
23
- */
24
- export const getModelByModelId = async (
25
- modelId: string,
26
- type?: ModelType
27
- ): Promise<ModelDoc | null> => {
28
- const filter = (type ? { modelId, type } : { modelId }) as Filter<ModelDoc>;
29
- return await getModelsCollection().findOne(filter);
30
- };
31
-
32
- /**
33
- * Get all models for a given `provider`, optionally scoped to a `type`.
34
- */
35
- export const getModelsByProvider = async (
36
- provider: string,
37
- type?: ModelType
38
- ): Promise<ModelDoc[]> => {
39
- const filter = (type ? { provider, type } : { provider }) as Filter<ModelDoc>;
40
- return await findModels(filter);
41
- };
42
-
43
- /** Get all models of a given `type`. */
44
- export const getModelsByType = async (type: ModelType): Promise<ModelDoc[]> => {
45
- return await findModels({ type } as Filter<ModelDoc>);
46
- };
47
-
48
- /** Get all models of a given `type` where `available` is true. */
49
- export const getAvailableModelsByType = async (
50
- type: ModelType
51
- ): Promise<ModelDoc[]> => {
52
- return await findModels({ type, available: true } as Filter<ModelDoc>);
53
- };
1
+ import { Collection, Filter } from "mongodb";
2
+
3
+ import { getDb } from "../index";
4
+ import { MODELS_COLLECTION } from "./models.constants";
5
+ import { ModelDoc, ModelType } from "./models.types";
6
+
7
+ /** Raw typed handle to the `models` collection. */
8
+ export const getModelsCollection = (): Collection<ModelDoc> => {
9
+ return getDb().collection<ModelDoc>(MODELS_COLLECTION);
10
+ };
11
+
12
+ /** Find models by an arbitrary filter. */
13
+ export const findModels = async (
14
+ filter: Filter<ModelDoc> = {}
15
+ ): Promise<ModelDoc[]> => {
16
+ return await getModelsCollection().find(filter).toArray();
17
+ };
18
+
19
+ /**
20
+ * Get a single model by its `modelId`, optionally scoped to a `type`.
21
+ * @param modelId e.g. "deepgram-stt-phonecall"
22
+ * @param type optional narrowing filter, since `modelId` isn't guaranteed unique across types
23
+ */
24
+ export const getModelByModelId = async (
25
+ modelId: string,
26
+ type?: ModelType
27
+ ): Promise<ModelDoc | null> => {
28
+ const filter = (type ? { modelId, type } : { modelId }) as Filter<ModelDoc>;
29
+ return await getModelsCollection().findOne(filter);
30
+ };
31
+
32
+ /**
33
+ * Get all models for a given `provider`, optionally scoped to a `type`.
34
+ */
35
+ export const getModelsByProvider = async (
36
+ provider: string,
37
+ type?: ModelType
38
+ ): Promise<ModelDoc[]> => {
39
+ const filter = (type ? { provider, type } : { provider }) as Filter<ModelDoc>;
40
+ return await findModels(filter);
41
+ };
42
+
43
+ /** Get all models of a given `type`. */
44
+ export const getModelsByType = async (type: ModelType): Promise<ModelDoc[]> => {
45
+ return await findModels({ type } as Filter<ModelDoc>);
46
+ };
47
+
48
+ /** Get all models of a given `type` where `available` is true. */
49
+ export const getAvailableModelsByType = async (
50
+ type: ModelType
51
+ ): Promise<ModelDoc[]> => {
52
+ return await findModels({ type, available: true } as Filter<ModelDoc>);
53
+ };