@talkpilot/core-db 1.3.62 → 1.3.63

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 (238) 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 +815 -815
  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/municipal/departmentsSubjects/departmentsSubjects.setters.d.ts +10 -0
  10. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.d.ts.map +1 -0
  11. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.js +15 -0
  12. package/dist/municipal/departmentsSubjects/departmentsSubjects.setters.js.map +1 -0
  13. package/dist/municipal/streets/streets.setters.d.ts +10 -0
  14. package/dist/municipal/streets/streets.setters.d.ts.map +1 -0
  15. package/dist/municipal/streets/streets.setters.js +15 -0
  16. package/dist/municipal/streets/streets.setters.js.map +1 -0
  17. package/dist/reconcile/index.d.ts +5 -0
  18. package/dist/reconcile/index.d.ts.map +1 -0
  19. package/dist/reconcile/index.js +21 -0
  20. package/dist/reconcile/index.js.map +1 -0
  21. package/dist/reconcile/reconcile.diff.d.ts +4 -0
  22. package/dist/reconcile/reconcile.diff.d.ts.map +1 -0
  23. package/dist/reconcile/reconcile.diff.js +36 -0
  24. package/dist/reconcile/reconcile.diff.js.map +1 -0
  25. package/dist/reconcile/reconcile.execute.d.ts +7 -0
  26. package/dist/reconcile/reconcile.execute.d.ts.map +1 -0
  27. package/dist/reconcile/reconcile.execute.js +20 -0
  28. package/dist/reconcile/reconcile.execute.js.map +1 -0
  29. package/dist/reconcile/reconcile.ops.d.ts +12 -0
  30. package/dist/reconcile/reconcile.ops.d.ts.map +1 -0
  31. package/dist/reconcile/reconcile.ops.js +24 -0
  32. package/dist/reconcile/reconcile.ops.js.map +1 -0
  33. package/dist/reconcile/reconcile.types.d.ts +32 -0
  34. package/dist/reconcile/reconcile.types.d.ts.map +1 -0
  35. package/dist/reconcile/reconcile.types.js +3 -0
  36. package/dist/reconcile/reconcile.types.js.map +1 -0
  37. package/jest.config.js +20 -20
  38. package/package.json +46 -46
  39. package/src/__tests__/setup.ts +20 -20
  40. package/src/bulkWrite/__tests__/bulkWrite.spec.ts +65 -65
  41. package/src/bulkWrite/bulkWrite.ops.ts +45 -45
  42. package/src/bulkWrite/bulkWrite.types.ts +4 -4
  43. package/src/bulkWrite/index.ts +2 -2
  44. package/src/config.ts +9 -9
  45. package/src/configuration/index.ts +17 -17
  46. package/src/configuration/internalModels/index.ts +3 -3
  47. package/src/configuration/internalModels/internalModels.constants.ts +1 -1
  48. package/src/configuration/internalModels/internalModels.getters.ts +33 -33
  49. package/src/configuration/internalModels/internalModels.types.ts +12 -12
  50. package/src/configuration/models/__tests__/models.getters.spec.ts +67 -67
  51. package/src/configuration/models/index.ts +27 -27
  52. package/src/configuration/models/models.constants.ts +20 -15
  53. package/src/configuration/models/models.getters.ts +71 -71
  54. package/src/configuration/models/models.types.ts +80 -80
  55. package/src/configuration/mongodb-client.ts +62 -62
  56. package/src/configuration/prompts/index.ts +2 -2
  57. package/src/configuration/prompts/prompts.getters.ts +49 -49
  58. package/src/configuration/prompts/prompts.types.ts +11 -11
  59. package/src/connection.ts +81 -81
  60. package/src/index.ts +47 -47
  61. package/src/municipal/__tests__/validation.spec.ts +62 -62
  62. package/src/municipal/cities/cities.getters.ts +50 -50
  63. package/src/municipal/cities/cities.types.ts +11 -11
  64. package/src/municipal/cities/index.ts +2 -2
  65. package/src/municipal/departmentsSubjects/__tests__/departmentsSubjects.spec.ts +272 -272
  66. package/src/municipal/departmentsSubjects/departmentsSubjects.getters.ts +317 -317
  67. package/src/municipal/departmentsSubjects/departmentsSubjects.types.ts +73 -73
  68. package/src/municipal/departmentsSubjects/index.ts +9 -9
  69. package/src/municipal/index.ts +22 -22
  70. package/src/municipal/mongodb-client.ts +61 -61
  71. package/src/municipal/muniIssues/__tests__/muniIssues.setters.spec.ts +94 -94
  72. package/src/municipal/muniIssues/__tests__/muniIssues.setup.spec.ts +92 -92
  73. package/src/municipal/muniIssues/index.ts +17 -17
  74. package/src/municipal/muniIssues/muniIssues.constants.ts +18 -18
  75. package/src/municipal/muniIssues/muniIssues.getters.ts +24 -24
  76. package/src/municipal/muniIssues/muniIssues.schema.ts +66 -66
  77. package/src/municipal/muniIssues/muniIssues.setters.ts +24 -24
  78. package/src/municipal/muniIssues/muniIssues.setup.ts +65 -65
  79. package/src/municipal/muniIssues/muniIssues.types.ts +37 -37
  80. package/src/municipal/streets/__tests__/streets.spec.ts +253 -253
  81. package/src/municipal/streets/index.ts +2 -2
  82. package/src/municipal/streets/streets.getters.ts +140 -140
  83. package/src/municipal/streets/streets.types.ts +19 -19
  84. package/src/municipal/systemInstructions/__tests__/getters.spec.ts +113 -113
  85. package/src/municipal/systemInstructions/__tests__/setters.spec.ts +274 -274
  86. package/src/municipal/systemInstructions/index.ts +7 -7
  87. package/src/municipal/systemInstructions/instructions.getters.ts +57 -57
  88. package/src/municipal/systemInstructions/instructions.setters.ts +119 -119
  89. package/src/municipal/systemInstructions/instructions.types.ts +30 -30
  90. package/src/municipal/tickets/__tests__/tickets.getters.spec.ts +30 -30
  91. package/src/municipal/tickets/__tests__/tickets.statistics.spec.ts +99 -99
  92. package/src/municipal/tickets/index.ts +9 -9
  93. package/src/municipal/tickets/tickets.constants.ts +8 -8
  94. package/src/municipal/tickets/tickets.getters.ts +121 -121
  95. package/src/municipal/tickets/tickets.statistics.aggregation.ts +110 -110
  96. package/src/municipal/tickets/tickets.statistics.getters.ts +145 -145
  97. package/src/municipal/tickets/tickets.types.ts +54 -54
  98. package/src/municipal/utils/types.ts +11 -11
  99. package/src/talkpilot/__tests__/db.spec.ts +38 -38
  100. package/src/talkpilot/__tests__/mongodb-client.spec.ts +18 -18
  101. package/src/talkpilot/__tests__/validation.spec.ts +68 -68
  102. package/src/talkpilot/agents/__tests__/agents.getters.spec.ts +29 -29
  103. package/src/talkpilot/agents/agents.getters.ts +34 -34
  104. package/src/talkpilot/agents/agents.types.ts +14 -14
  105. package/src/talkpilot/agents/index.ts +2 -2
  106. package/src/talkpilot/backgroundToolResults/__tests__/backgroundToolResults.getters.spec.ts +147 -147
  107. package/src/talkpilot/backgroundToolResults/backgroundToolResults.getters.ts +65 -65
  108. package/src/talkpilot/backgroundToolResults/backgroundToolResults.types.ts +23 -23
  109. package/src/talkpilot/backgroundToolResults/index.ts +2 -2
  110. package/src/talkpilot/calls/__tests__/callStats.utils.spec.ts +128 -128
  111. package/src/talkpilot/calls/__tests__/calls.dashboard.spec.ts +229 -229
  112. package/src/talkpilot/calls/__tests__/calls.spec.ts +471 -471
  113. package/src/talkpilot/calls/__tests__/calls.statistics.spec.ts +483 -483
  114. package/src/talkpilot/calls/calls.constants.ts +49 -49
  115. package/src/talkpilot/calls/calls.getters.ts +277 -277
  116. package/src/talkpilot/calls/calls.statistics.getters.ts +668 -668
  117. package/src/talkpilot/calls/calls.statistics.types.ts +48 -48
  118. package/src/talkpilot/calls/calls.types.ts +149 -149
  119. package/src/talkpilot/calls/dashboard/calls.dashboard.ts +295 -295
  120. package/src/talkpilot/calls/dashboard/calls.dashboard.types.ts +57 -57
  121. package/src/talkpilot/calls/index.ts +6 -6
  122. package/src/talkpilot/clientAudioBuffers/__tests__/clientAudioBuffer.getters.spec.ts +160 -160
  123. package/src/talkpilot/clientAudioBuffers/clientAudioBuffer.getters.ts +117 -117
  124. package/src/talkpilot/clientAudioBuffers/clientsAudioBuffers.types.ts +25 -25
  125. package/src/talkpilot/clientAudioBuffers/index.ts +2 -2
  126. package/src/talkpilot/clients/__tests__/clients.quota.spec.ts +123 -123
  127. package/src/talkpilot/clients/clients.getters.ts +19 -19
  128. package/src/talkpilot/clients/clients.quota.getters.ts +119 -119
  129. package/src/talkpilot/clients/clients.quota.types.ts +27 -27
  130. package/src/talkpilot/clients/clients.types.ts +18 -18
  131. package/src/talkpilot/clients/index.ts +4 -4
  132. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.getters.spec.ts +423 -423
  133. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +212 -212
  134. package/src/talkpilot/clientsConfig/clientsConfig.constants.ts +2 -2
  135. package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +247 -247
  136. package/src/talkpilot/clientsConfig/clientsConfig.types.ts +137 -137
  137. package/src/talkpilot/clientsConfig/index.ts +3 -3
  138. package/src/talkpilot/contextNotes/__tests__/contextNotes.getters.spec.ts +217 -217
  139. package/src/talkpilot/contextNotes/contextNotes.getters.ts +85 -85
  140. package/src/talkpilot/contextNotes/contextNotes.types.ts +20 -20
  141. package/src/talkpilot/contextNotes/index.ts +2 -2
  142. package/src/talkpilot/flows/__tests__/flows.schema.spec.ts +124 -124
  143. package/src/talkpilot/flows/flows.getter.ts +34 -34
  144. package/src/talkpilot/flows/flows.schema.ts +180 -180
  145. package/src/talkpilot/flows/flows.types.ts +211 -211
  146. package/src/talkpilot/flows/index.ts +7 -7
  147. package/src/talkpilot/groups/__tests__/groups.spec.ts +90 -90
  148. package/src/talkpilot/groups/__tests__/phone.utils.spec.ts +32 -32
  149. package/src/talkpilot/groups/groups.getters.ts +30 -30
  150. package/src/talkpilot/groups/groups.types.ts +29 -29
  151. package/src/talkpilot/groups/index.ts +3 -3
  152. package/src/talkpilot/groups/phone.utils.ts +46 -46
  153. package/src/talkpilot/index.ts +31 -31
  154. package/src/talkpilot/leads/index.ts +2 -2
  155. package/src/talkpilot/leads/leads.getter.ts +6 -6
  156. package/src/talkpilot/leads/leads.schema.ts +33 -33
  157. package/src/talkpilot/leads/leads.types.ts +20 -20
  158. package/src/talkpilot/mongodb-client.ts +78 -78
  159. package/src/talkpilot/phone_numbers/__tests__/phone_numbers.spec.ts +530 -530
  160. package/src/talkpilot/phone_numbers/index.ts +2 -2
  161. package/src/talkpilot/phone_numbers/phone_numbers.getter.ts +240 -240
  162. package/src/talkpilot/phone_numbers/phone_numbers.schema.ts +17 -17
  163. package/src/talkpilot/phone_numbers/phone_numbers.types.ts +30 -30
  164. package/src/talkpilot/phone_numbers/phone_numbers.utils.ts +9 -9
  165. package/src/talkpilot/plans/__tests__/plans.spec.ts +70 -70
  166. package/src/talkpilot/plans/index.ts +2 -2
  167. package/src/talkpilot/plans/plans.getters.ts +132 -132
  168. package/src/talkpilot/plans/plans.types.ts +89 -89
  169. package/src/talkpilot/products/__tests__/products.getters.spec.ts +44 -44
  170. package/src/talkpilot/products/index.ts +2 -2
  171. package/src/talkpilot/products/products.getters.ts +12 -12
  172. package/src/talkpilot/products/products.types.ts +9 -9
  173. package/src/talkpilot/results/index.ts +7 -7
  174. package/src/talkpilot/results/results.getter.ts +39 -39
  175. package/src/talkpilot/results/results.schema.ts +25 -25
  176. package/src/talkpilot/results/results.types.ts +34 -34
  177. package/src/talkpilot/retry_analyze/__tests__/retryAnalyze.getters.spec.ts +156 -156
  178. package/src/talkpilot/retry_analyze/index.ts +2 -2
  179. package/src/talkpilot/retry_analyze/retryAnalyze.getters.ts +84 -84
  180. package/src/talkpilot/retry_analyze/retryAnalyze.types.ts +13 -13
  181. package/src/talkpilot/sessions/__tests__/sessions.spec.ts +147 -147
  182. package/src/talkpilot/sessions/index.ts +2 -2
  183. package/src/talkpilot/sessions/sessions.getter.ts +92 -92
  184. package/src/talkpilot/sessions/sessions.schema.ts +34 -34
  185. package/src/talkpilot/sessions/sessions.types.ts +30 -30
  186. package/src/talkpilot/subscriptions/__tests__/subscriptions.getters.utils.spec.ts +45 -45
  187. package/src/talkpilot/subscriptions/index.ts +3 -3
  188. package/src/talkpilot/subscriptions/subscriptions.getters.ts +146 -146
  189. package/src/talkpilot/subscriptions/subscriptions.getters.utils.ts +33 -33
  190. package/src/talkpilot/subscriptions/subscriptions.types.ts +66 -66
  191. package/src/talkpilot/utils/__tests__/query.utils.spec.ts +49 -49
  192. package/src/talkpilot/utils/query.utils.ts +21 -21
  193. package/src/test-utils/db-utils.ts +33 -33
  194. package/src/test-utils/factories/index.ts +18 -18
  195. package/src/test-utils/factories/municipal/cities.ts +16 -16
  196. package/src/test-utils/factories/municipal/departmentsSubjects.ts +37 -37
  197. package/src/test-utils/factories/municipal/muniIssues.ts +32 -32
  198. package/src/test-utils/factories/municipal/streets.ts +22 -22
  199. package/src/test-utils/factories/municipal/tickets.ts +39 -39
  200. package/src/test-utils/factories/talkpilot/agents.ts +19 -19
  201. package/src/test-utils/factories/talkpilot/calls.ts +37 -37
  202. package/src/test-utils/factories/talkpilot/clientAudioBuffers.ts +20 -20
  203. package/src/test-utils/factories/talkpilot/clientsConfig.ts +18 -18
  204. package/src/test-utils/factories/talkpilot/contextNotes.ts +40 -40
  205. package/src/test-utils/factories/talkpilot/flows.ts +33 -33
  206. package/src/test-utils/factories/talkpilot/groups.ts +33 -33
  207. package/src/test-utils/factories/talkpilot/phone_numbers.ts +22 -22
  208. package/src/test-utils/factories/talkpilot/sessions.ts +35 -35
  209. package/src/test-utils/factories/websitalk/knowledgeDocuments.ts +29 -29
  210. package/src/test-utils/factories/websitalk/scanResources.ts +26 -26
  211. package/src/test-utils/factories/websitalk/scans.ts +30 -30
  212. package/src/test-utils/factories/websitalk/websiteUrls.ts +17 -17
  213. package/src/utils/date.utils.ts +126 -126
  214. package/src/utils/shared.types.ts +4 -4
  215. package/src/utils/validation.ts +23 -23
  216. package/src/websitalk/index.ts +18 -18
  217. package/src/websitalk/knowledgeDocuments/__tests__/knowledgeDocuments.spec.ts +238 -238
  218. package/src/websitalk/knowledgeDocuments/index.ts +3 -3
  219. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.constants.ts +26 -26
  220. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.getters.ts +95 -95
  221. package/src/websitalk/knowledgeDocuments/knowledgeDocuments.types.ts +75 -75
  222. package/src/websitalk/mongodb-client.ts +61 -61
  223. package/src/websitalk/scanResources/__tests__/scanResources.spec.ts +267 -267
  224. package/src/websitalk/scanResources/index.ts +4 -4
  225. package/src/websitalk/scanResources/scanResources.constants.ts +60 -60
  226. package/src/websitalk/scanResources/scanResources.getters.ts +128 -128
  227. package/src/websitalk/scanResources/scanResources.types.ts +105 -105
  228. package/src/websitalk/scanResources/scanResources.utils.ts +31 -31
  229. package/src/websitalk/scans/index.ts +4 -4
  230. package/src/websitalk/scans/scans.constants.ts +18 -18
  231. package/src/websitalk/scans/scans.getters.ts +172 -172
  232. package/src/websitalk/scans/scans.types.ts +58 -58
  233. package/src/websitalk/scans/scans.utils.ts +5 -5
  234. package/src/websitalk/websiteUrls/__tests__/websiteUrls.spec.ts +77 -77
  235. package/src/websitalk/websiteUrls/index.ts +2 -2
  236. package/src/websitalk/websiteUrls/websiteUrls.getters.ts +65 -65
  237. package/src/websitalk/websiteUrls/websiteUrls.types.ts +13 -13
  238. 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,67 +1,67 @@
1
- import { ObjectId } from "mongodb";
2
- import { MODELS_COLLECTION } from "../models.constants";
3
- import {
4
- getModelsCollection,
5
- getModelContextWindow,
6
- } from "../models.getters";
7
- import type { RealtimeModelDoc } from "../models.types";
8
-
9
- function realtimeModel(
10
- overrides: Partial<RealtimeModelDoc> & Pick<RealtimeModelDoc, "modelId">,
11
- ): RealtimeModelDoc {
12
- const now = new Date();
13
- return {
14
- _id: new ObjectId(),
15
- name: overrides.modelId,
16
- type: "realtime",
17
- provider: "openai",
18
- available: true,
19
- createdAt: now,
20
- updatedAt: now,
21
- ...overrides,
22
- };
23
- }
24
-
25
- describe("getModelContextWindow", () => {
26
- it("returns configDefaults.contextWindow for the model", async () => {
27
- await getModelsCollection().insertOne(
28
- realtimeModel({
29
- modelId: "gpt-realtime",
30
- configDefaults: { contextWindow: 32_000 },
31
- }),
32
- );
33
-
34
- await expect(getModelContextWindow("gpt-realtime")).resolves.toBe(32_000);
35
- });
36
-
37
- it("returns null when the model is missing", async () => {
38
- await expect(getModelContextWindow("missing-model")).resolves.toBeNull();
39
- });
40
-
41
- it("returns null when contextWindow is missing or not a positive number", async () => {
42
- await getModelsCollection().insertMany([
43
- realtimeModel({
44
- modelId: "no-window",
45
- configDefaults: {},
46
- }),
47
- realtimeModel({
48
- modelId: "zero-window",
49
- configDefaults: { contextWindow: 0 },
50
- }),
51
- realtimeModel({
52
- modelId: "string-window",
53
- configDefaults: { contextWindow: "64000" },
54
- }),
55
- ]);
56
-
57
- await expect(getModelContextWindow("no-window")).resolves.toBeNull();
58
- await expect(getModelContextWindow("zero-window")).resolves.toBeNull();
59
- await expect(getModelContextWindow("string-window")).resolves.toBeNull();
60
- });
61
- });
62
-
63
- describe("models collection", () => {
64
- it(`uses the "${MODELS_COLLECTION}" collection`, () => {
65
- expect(getModelsCollection().collectionName).toBe(MODELS_COLLECTION);
66
- });
67
- });
1
+ import { ObjectId } from "mongodb";
2
+ import { MODELS_COLLECTION } from "../models.constants";
3
+ import {
4
+ getModelsCollection,
5
+ getModelContextWindow,
6
+ } from "../models.getters";
7
+ import type { RealtimeModelDoc } from "../models.types";
8
+
9
+ function realtimeModel(
10
+ overrides: Partial<RealtimeModelDoc> & Pick<RealtimeModelDoc, "modelId">,
11
+ ): RealtimeModelDoc {
12
+ const now = new Date();
13
+ return {
14
+ _id: new ObjectId(),
15
+ name: overrides.modelId,
16
+ type: "realtime",
17
+ provider: "openai",
18
+ available: true,
19
+ createdAt: now,
20
+ updatedAt: now,
21
+ ...overrides,
22
+ };
23
+ }
24
+
25
+ describe("getModelContextWindow", () => {
26
+ it("returns configDefaults.contextWindow for the model", async () => {
27
+ await getModelsCollection().insertOne(
28
+ realtimeModel({
29
+ modelId: "gpt-realtime",
30
+ configDefaults: { contextWindow: 32_000 },
31
+ }),
32
+ );
33
+
34
+ await expect(getModelContextWindow("gpt-realtime")).resolves.toBe(32_000);
35
+ });
36
+
37
+ it("returns null when the model is missing", async () => {
38
+ await expect(getModelContextWindow("missing-model")).resolves.toBeNull();
39
+ });
40
+
41
+ it("returns null when contextWindow is missing or not a positive number", async () => {
42
+ await getModelsCollection().insertMany([
43
+ realtimeModel({
44
+ modelId: "no-window",
45
+ configDefaults: {},
46
+ }),
47
+ realtimeModel({
48
+ modelId: "zero-window",
49
+ configDefaults: { contextWindow: 0 },
50
+ }),
51
+ realtimeModel({
52
+ modelId: "string-window",
53
+ configDefaults: { contextWindow: "64000" },
54
+ }),
55
+ ]);
56
+
57
+ await expect(getModelContextWindow("no-window")).resolves.toBeNull();
58
+ await expect(getModelContextWindow("zero-window")).resolves.toBeNull();
59
+ await expect(getModelContextWindow("string-window")).resolves.toBeNull();
60
+ });
61
+ });
62
+
63
+ describe("models collection", () => {
64
+ it(`uses the "${MODELS_COLLECTION}" collection`, () => {
65
+ expect(getModelsCollection().collectionName).toBe(MODELS_COLLECTION);
66
+ });
67
+ });
@@ -1,27 +1,27 @@
1
- export {
2
- MODELS_COLLECTION,
3
- MODEL_CONFIG_DEFAULTS_CONTEXT_WINDOW,
4
- MODEL_TYPES,
5
- REALTIME_MODEL_PROVIDERS,
6
- STT_MODEL_PROVIDERS,
7
- } from "./models.constants";
8
- export {
9
- getModelsCollection,
10
- findModels,
11
- getModelByModelId,
12
- getModelContextWindow,
13
- getModelsByProvider,
14
- getModelsByType,
15
- getAvailableModelsByType,
16
- } from "./models.getters";
17
- export type {
18
- ModelType,
19
- RealtimeModelProvider,
20
- SttModelProvider,
21
- SemanticVad,
22
- ServerVad,
23
- TurnDetection,
24
- RealtimeModelDoc,
25
- SttModelDoc,
26
- ModelDoc,
27
- } from "./models.types";
1
+ export {
2
+ MODELS_COLLECTION,
3
+ MODEL_CONFIG_DEFAULTS_CONTEXT_WINDOW,
4
+ MODEL_TYPES,
5
+ REALTIME_MODEL_PROVIDERS,
6
+ STT_MODEL_PROVIDERS,
7
+ } from "./models.constants";
8
+ export {
9
+ getModelsCollection,
10
+ findModels,
11
+ getModelByModelId,
12
+ getModelContextWindow,
13
+ getModelsByProvider,
14
+ getModelsByType,
15
+ getAvailableModelsByType,
16
+ } from "./models.getters";
17
+ export type {
18
+ ModelType,
19
+ RealtimeModelProvider,
20
+ SttModelProvider,
21
+ SemanticVad,
22
+ ServerVad,
23
+ TurnDetection,
24
+ RealtimeModelDoc,
25
+ SttModelDoc,
26
+ ModelDoc,
27
+ } from "./models.types";
@@ -1,15 +1,20 @@
1
- export const MODELS_COLLECTION = "models";
2
-
3
- export const MODEL_CONFIG_DEFAULTS_CONTEXT_WINDOW = "contextWindow";
4
-
5
- export const MODEL_TYPES = ["realtime", "stt"] as const;
6
-
7
- export const REALTIME_MODEL_PROVIDERS = ["openai", "gemini", "xai"] as const;
8
- export const STT_MODEL_PROVIDERS = [
9
- "openai-stt",
10
- "google-stt",
11
- "deepgram-stt",
12
- "deepgram-flux",
13
- "elevenlabs-scribe",
14
- "gladia-stt",
15
- ] as const;
1
+ export const MODELS_COLLECTION = "models";
2
+
3
+ export const MODEL_CONFIG_DEFAULTS_CONTEXT_WINDOW = "contextWindow";
4
+
5
+ export const MODEL_TYPES = ["realtime", "stt"] as const;
6
+
7
+ export const REALTIME_MODEL_PROVIDERS = [
8
+ "openai",
9
+ "gemini",
10
+ "xai",
11
+ "elevenlabs",
12
+ ] as const;
13
+ export const STT_MODEL_PROVIDERS = [
14
+ "openai-stt",
15
+ "google-stt",
16
+ "deepgram-stt",
17
+ "deepgram-flux",
18
+ "elevenlabs-scribe",
19
+ "gladia-stt",
20
+ ] as const;