@talkpilot/core-db 1.3.35 → 1.3.37

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 (80) hide show
  1. package/README.md +117 -1
  2. package/dist/configuration/index.d.ts +2 -0
  3. package/dist/configuration/index.d.ts.map +1 -1
  4. package/dist/configuration/index.js +2 -0
  5. package/dist/configuration/index.js.map +1 -1
  6. package/dist/configuration/internalModels/index.d.ts +4 -0
  7. package/dist/configuration/internalModels/index.d.ts.map +1 -0
  8. package/dist/configuration/internalModels/index.js +21 -0
  9. package/dist/configuration/internalModels/index.js.map +1 -0
  10. package/dist/configuration/internalModels/internalModels.constants.d.ts +2 -0
  11. package/dist/configuration/internalModels/internalModels.constants.d.ts.map +1 -0
  12. package/dist/configuration/internalModels/internalModels.constants.js +5 -0
  13. package/dist/configuration/internalModels/internalModels.constants.js.map +1 -0
  14. package/dist/configuration/internalModels/internalModels.getters.d.ts +16 -0
  15. package/dist/configuration/internalModels/internalModels.getters.d.ts.map +1 -0
  16. package/dist/configuration/internalModels/internalModels.getters.js +31 -0
  17. package/dist/configuration/internalModels/internalModels.getters.js.map +1 -0
  18. package/dist/configuration/internalModels/internalModels.types.d.ts +12 -0
  19. package/dist/configuration/internalModels/internalModels.types.d.ts.map +1 -0
  20. package/dist/configuration/internalModels/internalModels.types.js +3 -0
  21. package/dist/configuration/internalModels/internalModels.types.js.map +1 -0
  22. package/dist/configuration/models/index.d.ts +4 -0
  23. package/dist/configuration/models/index.d.ts.map +1 -0
  24. package/dist/configuration/models/index.js +16 -0
  25. package/dist/configuration/models/index.js.map +1 -0
  26. package/dist/configuration/models/models.constants.d.ts +5 -0
  27. package/dist/configuration/models/models.constants.d.ts.map +1 -0
  28. package/dist/configuration/models/models.constants.js +15 -0
  29. package/dist/configuration/models/models.constants.js.map +1 -0
  30. package/dist/configuration/models/models.getters.d.ts +21 -0
  31. package/dist/configuration/models/models.getters.d.ts.map +1 -0
  32. package/dist/configuration/models/models.getters.js +44 -0
  33. package/dist/configuration/models/models.getters.js.map +1 -0
  34. package/dist/configuration/models/models.types.d.ts +68 -0
  35. package/dist/configuration/models/models.types.d.ts.map +1 -0
  36. package/dist/configuration/models/models.types.js +3 -0
  37. package/dist/configuration/models/models.types.js.map +1 -0
  38. package/dist/index.d.ts +2 -0
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +2 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/talkpilot/clients/clients.quota.getters.d.ts +7 -0
  43. package/dist/talkpilot/clients/clients.quota.getters.d.ts.map +1 -0
  44. package/dist/talkpilot/clients/clients.quota.getters.js +80 -0
  45. package/dist/talkpilot/clients/clients.quota.getters.js.map +1 -0
  46. package/dist/talkpilot/clients/clients.quota.types.d.ts +24 -0
  47. package/dist/talkpilot/clients/clients.quota.types.d.ts.map +1 -0
  48. package/dist/talkpilot/clients/clients.quota.types.js +3 -0
  49. package/dist/talkpilot/clients/clients.quota.types.js.map +1 -0
  50. package/dist/talkpilot/clients/clients.types.d.ts +3 -0
  51. package/dist/talkpilot/clients/clients.types.d.ts.map +1 -1
  52. package/dist/talkpilot/clients/index.d.ts +2 -0
  53. package/dist/talkpilot/clients/index.d.ts.map +1 -1
  54. package/dist/talkpilot/clients/index.js +2 -0
  55. package/dist/talkpilot/clients/index.js.map +1 -1
  56. package/dist/talkpilot/clientsConfig/clientsConfig.getters.d.ts +5 -0
  57. package/dist/talkpilot/clientsConfig/clientsConfig.getters.d.ts.map +1 -1
  58. package/dist/talkpilot/clientsConfig/clientsConfig.getters.js +37 -1
  59. package/dist/talkpilot/clientsConfig/clientsConfig.getters.js.map +1 -1
  60. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts +2 -0
  61. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts.map +1 -1
  62. package/package.json +1 -1
  63. package/src/configuration/index.ts +2 -0
  64. package/src/configuration/internalModels/index.ts +3 -0
  65. package/src/configuration/internalModels/internalModels.constants.ts +1 -0
  66. package/src/configuration/internalModels/internalModels.getters.ts +33 -0
  67. package/src/configuration/internalModels/internalModels.types.ts +12 -0
  68. package/src/configuration/models/index.ts +25 -0
  69. package/src/configuration/models/models.constants.ts +13 -0
  70. package/src/configuration/models/models.getters.ts +53 -0
  71. package/src/configuration/models/models.types.ts +79 -0
  72. package/src/index.ts +2 -0
  73. package/src/talkpilot/clients/__tests__/clients.quota.spec.ts +123 -0
  74. package/src/talkpilot/clients/clients.quota.getters.ts +119 -0
  75. package/src/talkpilot/clients/clients.quota.types.ts +27 -0
  76. package/src/talkpilot/clients/clients.types.ts +4 -0
  77. package/src/talkpilot/clients/index.ts +2 -0
  78. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +26 -0
  79. package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +54 -0
  80. package/src/talkpilot/clientsConfig/clientsConfig.types.ts +3 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clients.quota.getters.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/clients/clients.quota.getters.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAE/B,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAkBlC;AAYD,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,eAAe,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CAYlB;AAED,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAY7E;AAED,wBAAsB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB9E"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getClientQuotaState = getClientQuotaState;
4
+ exports.updateQuotaAlertsConfig = updateQuotaAlertsConfig;
5
+ exports.markQuotaAlertSent = markQuotaAlertSent;
6
+ exports.markQuotaExpiredSent = markQuotaExpiredSent;
7
+ exports.resetClientQuotaSettings = resetClientQuotaSettings;
8
+ const clientsConfig_getters_1 = require("../clientsConfig/clientsConfig.getters");
9
+ const clients_getters_1 = require("./clients.getters");
10
+ async function getClientQuotaState(clientId) {
11
+ const [config, client] = await Promise.all([
12
+ (0, clientsConfig_getters_1.getClientConfig)(clientId),
13
+ (0, clients_getters_1.getClientsCollection)().findOne({ clientId }),
14
+ ]);
15
+ const usage = config?.quota;
16
+ if (usage?.totalQuota === undefined || usage?.totalQuota === null)
17
+ return null;
18
+ const settings = client?.quota;
19
+ return {
20
+ totalQuota: usage.totalQuota,
21
+ usedQuota: usage.usedQuota ?? 0,
22
+ expiresAt: usage.expiresAt,
23
+ alerts: settings?.alerts,
24
+ expiredSent: settings?.expiredSent,
25
+ };
26
+ }
27
+ const ensureClientDoc = async (clientId) => {
28
+ const now = new Date();
29
+ await (0, clients_getters_1.getClientsCollection)().updateOne({ clientId }, { $setOnInsert: { clientId, createdAt: now, updatedAt: now, credits: 0 } }, { upsert: true });
30
+ await (0, clients_getters_1.getClientsCollection)().updateOne({ clientId }, { $set: { updatedAt: now } });
31
+ };
32
+ async function updateQuotaAlertsConfig(clientId, alerts) {
33
+ const config = await (0, clientsConfig_getters_1.getClientConfig)(clientId);
34
+ if (!config) {
35
+ throw new Error(`No client config found for clientId: ${clientId}`);
36
+ }
37
+ await ensureClientDoc(clientId);
38
+ const state = await getClientQuotaState(clientId);
39
+ const existing = state?.alerts ?? [];
40
+ const sentByThreshold = new Map(existing.filter((a) => a.thresholdSent).map((a) => [a.thresholdPct, true]));
41
+ const merged = alerts.map((alert) => ({
42
+ thresholdPct: alert.thresholdPct,
43
+ recipientEmails: alert.recipientEmails,
44
+ ...(sentByThreshold.get(alert.thresholdPct) ? { thresholdSent: true } : {}),
45
+ }));
46
+ const result = await (0, clients_getters_1.getClientsCollection)().updateOne({ clientId }, { $set: { "quota.alerts": merged, updatedAt: new Date() } });
47
+ if (result.matchedCount === 0) {
48
+ throw new Error(`No client found for clientId: ${clientId}`);
49
+ }
50
+ }
51
+ async function markQuotaAlertSent(clientId, alertIndex) {
52
+ await ensureClientDoc(clientId);
53
+ const result = await (0, clients_getters_1.getClientsCollection)().findOneAndUpdate({
54
+ clientId,
55
+ [`quota.alerts.${alertIndex}.thresholdSent`]: { $ne: true },
56
+ }, { $set: { [`quota.alerts.${alertIndex}.thresholdSent`]: true, updatedAt: new Date() } }, { returnDocument: "after" });
57
+ return result !== null;
58
+ }
59
+ async function markQuotaExpiredSent(clientId) {
60
+ await ensureClientDoc(clientId);
61
+ const result = await (0, clients_getters_1.getClientsCollection)().findOneAndUpdate({
62
+ clientId,
63
+ "quota.expiredSent": { $ne: true },
64
+ }, { $set: { "quota.expiredSent": true, updatedAt: new Date() } }, { returnDocument: "after" });
65
+ return result !== null;
66
+ }
67
+ async function resetClientQuotaSettings(clientId) {
68
+ const client = await (0, clients_getters_1.getClientsCollection)().findOne({ clientId });
69
+ const alerts = client?.quota?.alerts?.map(({ thresholdSent: _s, ...alert }) => alert) ?? [];
70
+ if (client) {
71
+ await (0, clients_getters_1.getClientsCollection)().updateOne({ clientId }, {
72
+ $set: {
73
+ ...(alerts.length ? { "quota.alerts": alerts } : {}),
74
+ updatedAt: new Date(),
75
+ },
76
+ $unset: { "quota.expiredSent": "" },
77
+ });
78
+ }
79
+ }
80
+ //# sourceMappingURL=clients.quota.getters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clients.quota.getters.js","sourceRoot":"","sources":["../../../src/talkpilot/clients/clients.quota.getters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export type QuotaThresholdAlert = {
2
+ thresholdPct: number;
3
+ recipientEmails: string[];
4
+ thresholdSent?: boolean;
5
+ };
6
+ export type ClientQuotaSettings = {
7
+ /** Up to 3 threshold alerts, each with up to 3 recipient emails. */
8
+ alerts?: QuotaThresholdAlert[];
9
+ /** Set after expired-quota email is sent successfully. */
10
+ expiredSent?: boolean;
11
+ };
12
+ export type QuotaAlertInput = {
13
+ thresholdPct: number;
14
+ recipientEmails: string[];
15
+ };
16
+ export type ClientQuotaUsage = {
17
+ totalQuota: number;
18
+ usedQuota: number;
19
+ expiresAt?: Date;
20
+ /** Human-readable account label for quota alert emails. */
21
+ clientDisplayName?: string;
22
+ };
23
+ export type ClientQuotaState = ClientQuotaUsage & ClientQuotaSettings;
24
+ //# sourceMappingURL=clients.quota.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clients.quota.types.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/clients/clients.quota.types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,oEAAoE;IACpE,MAAM,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC/B,0DAA0D;IAC1D,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,2DAA2D;IAC3D,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,gBAAgB,GAAG,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=clients.quota.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clients.quota.types.js","sourceRoot":"","sources":["../../../src/talkpilot/clients/clients.quota.types.ts"],"names":[],"mappings":""}
@@ -1,4 +1,6 @@
1
1
  import { ObjectId } from "mongodb";
2
+ import { ClientQuotaSettings } from "./clients.quota.types";
3
+ export type { QuotaThresholdAlert, ClientQuotaSettings, QuotaAlertInput, ClientQuotaUsage, ClientQuotaState } from "./clients.quota.types";
2
4
  export type Client = {
3
5
  _id?: ObjectId;
4
6
  createdAt: Date;
@@ -8,6 +10,7 @@ export type Client = {
8
10
  apiKey?: string | null;
9
11
  credits: number;
10
12
  managedBy?: string;
13
+ quota?: ClientQuotaSettings;
11
14
  };
12
15
  export type ClientDoc = Client & {
13
16
  _id: ObjectId;
@@ -1 +1 @@
1
- {"version":3,"file":"clients.types.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/clients/clients.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,MAAM,MAAM,MAAM,GAAG;IACnB,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG;IAAE,GAAG,EAAE,QAAQ,CAAA;CAAE,CAAC"}
1
+ {"version":3,"file":"clients.types.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/clients/clients.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE3I,MAAM,MAAM,MAAM,GAAG;IACnB,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,mBAAmB,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG;IAAE,GAAG,EAAE,QAAQ,CAAA;CAAE,CAAC"}
@@ -1,3 +1,5 @@
1
1
  export * from "./clients.getters";
2
2
  export * from "./clients.types";
3
+ export * from "./clients.quota.getters";
4
+ export * from "./clients.quota.types";
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/clients/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/clients/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC"}
@@ -16,4 +16,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./clients.getters"), exports);
18
18
  __exportStar(require("./clients.types"), exports);
19
+ __exportStar(require("./clients.quota.getters"), exports);
20
+ __exportStar(require("./clients.quota.types"), exports);
19
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/talkpilot/clients/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,kDAAgC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/talkpilot/clients/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,kDAAgC;AAChC,0DAAwC;AACxC,wDAAsC"}
@@ -2,10 +2,15 @@ import { ClientConfigDoc, Products, KnownProductKey } from "../index";
2
2
  import { Collection } from "mongodb";
3
3
  export declare const getClientsConfigCollection: () => Collection<ClientConfigDoc>;
4
4
  export declare const getClientConfig: (clientId: string) => Promise<import("mongodb").WithId<ClientConfigDoc> | null>;
5
+ export declare const getClientDisplayName: (clientId: string) => Promise<string>;
5
6
  export declare const getClientConfigByPhone: (phone: string) => Promise<import("mongodb").WithId<ClientConfigDoc> | null>;
6
7
  export declare const createClientConfigDoc: (clientConfig: ClientConfigDoc) => Promise<void>;
7
8
  export declare function updateProductConfig<K extends KnownProductKey>(clientId: string, productKey: K, updates: Partial<Products[K]>): Promise<void>;
8
9
  export declare const getActiveScanId: (clientId: string) => Promise<string | undefined>;
9
10
  export declare const updateActiveScanId: (clientId: string, scanId: string) => Promise<void>;
10
11
  export declare const clearActiveScanId: (clientId: string) => Promise<void>;
12
+ export declare function listClientIdsWithConfiguredQuota(): Promise<string[]>;
13
+ export declare function incrementClientQuotaUsage(clientId: string, amount?: number): Promise<void>;
14
+ export declare function resetClientQuotaUsage(clientId: string): Promise<void>;
15
+ export { getClientQuotaState, updateQuotaAlertsConfig, markQuotaAlertSent, markQuotaExpiredSent, resetClientQuotaSettings, } from "../clients/clients.quota.getters";
11
16
  //# sourceMappingURL=clientsConfig.getters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"clientsConfig.getters.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/clientsConfig/clientsConfig.getters.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAGf,QAAQ,EAER,eAAe,EAChB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,eAAO,MAAM,0BAA0B,QAAO,UAAU,CAAC,eAAe,CAEvE,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,UAAU,MAAM,8DAE/C,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAU,OAAO,MAAM,8DAIzD,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,cAAc,eAAe,KAC5B,OAAO,CAAC,IAAI,CAEd,CAAC;AAEF,wBAAsB,mBAAmB,CAAC,CAAC,SAAS,eAAe,EACjE,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,CAAC,EACb,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,KACf,OAAO,CAAC,MAAM,GAAG,SAAS,CAG5B,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,UAAU,MAAM,EAChB,QAAQ,MAAM,KACb,OAAO,CAAC,IAAI,CAEd,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,IAAI,CAQtE,CAAC"}
1
+ {"version":3,"file":"clientsConfig.getters.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/clientsConfig/clientsConfig.getters.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAGf,QAAQ,EAER,eAAe,EAChB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC,eAAO,MAAM,0BAA0B,QAAO,UAAU,CAAC,eAAe,CAEvE,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,UAAU,MAAM,8DAE/C,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,MAAM,CAO3E,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAU,OAAO,MAAM,8DAIzD,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,cAAc,eAAe,KAC5B,OAAO,CAAC,IAAI,CAEd,CAAC;AAEF,wBAAsB,mBAAmB,CAAC,CAAC,SAAS,eAAe,EACjE,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,CAAC,EACb,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,KACf,OAAO,CAAC,MAAM,GAAG,SAAS,CAG5B,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,UAAU,MAAM,EAChB,QAAQ,MAAM,KACb,OAAO,CAAC,IAAI,CAEd,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,IAAI,CAQtE,CAAC;AAEF,wBAAsB,gCAAgC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAO1E;AAED,wBAAsB,yBAAyB,CAC7C,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,MAAU,GACjB,OAAO,CAAC,IAAI,CAAC,CASf;AAED,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW3E;AAED,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,kCAAkC,CAAC"}
@@ -1,8 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.clearActiveScanId = exports.updateActiveScanId = exports.getActiveScanId = exports.createClientConfigDoc = exports.getClientConfigByPhone = exports.getClientConfig = exports.getClientsConfigCollection = void 0;
3
+ exports.resetClientQuotaSettings = exports.markQuotaExpiredSent = exports.markQuotaAlertSent = exports.updateQuotaAlertsConfig = exports.getClientQuotaState = exports.clearActiveScanId = exports.updateActiveScanId = exports.getActiveScanId = exports.createClientConfigDoc = exports.getClientConfigByPhone = exports.getClientDisplayName = exports.getClientConfig = exports.getClientsConfigCollection = void 0;
4
4
  exports.updateProductConfig = updateProductConfig;
5
+ exports.listClientIdsWithConfiguredQuota = listClientIdsWithConfiguredQuota;
6
+ exports.incrementClientQuotaUsage = incrementClientQuotaUsage;
7
+ exports.resetClientQuotaUsage = resetClientQuotaUsage;
5
8
  const index_1 = require("../index");
9
+ const clients_quota_getters_1 = require("../clients/clients.quota.getters");
6
10
  const getClientsConfigCollection = () => {
7
11
  return (0, index_1.getDb)().collection("clientsConfig");
8
12
  };
@@ -11,6 +15,12 @@ const getClientConfig = (clientId) => {
11
15
  return (0, exports.getClientsConfigCollection)().findOne({ clientId });
12
16
  };
13
17
  exports.getClientConfig = getClientConfig;
18
+ const getClientDisplayName = async (clientId) => {
19
+ const doc = await (0, exports.getClientsConfigCollection)().findOne({ clientId }, { projection: { "quota.clientDisplayName": 1, _id: 0 } });
20
+ const name = doc?.quota?.clientDisplayName?.trim();
21
+ return name || "-";
22
+ };
23
+ exports.getClientDisplayName = getClientDisplayName;
14
24
  const getClientConfigByPhone = async (phone) => {
15
25
  const client = await (0, index_1.findClientByPhoneNumber)(phone);
16
26
  if (!client)
@@ -51,4 +61,30 @@ const clearActiveScanId = async (clientId) => {
51
61
  }
52
62
  };
53
63
  exports.clearActiveScanId = clearActiveScanId;
64
+ async function listClientIdsWithConfiguredQuota() {
65
+ const docs = await (0, exports.getClientsConfigCollection)()
66
+ .find({ "quota.totalQuota": { $exists: true, $ne: null } })
67
+ .project({ clientId: 1, _id: 0 })
68
+ .toArray();
69
+ return docs.map(({ clientId }) => clientId);
70
+ }
71
+ async function incrementClientQuotaUsage(clientId, amount = 1) {
72
+ const result = await (0, exports.getClientsConfigCollection)().updateOne({ clientId, "quota.totalQuota": { $exists: true } }, { $inc: { "quota.usedQuota": amount } });
73
+ if (result.matchedCount === 0) {
74
+ return;
75
+ }
76
+ }
77
+ async function resetClientQuotaUsage(clientId) {
78
+ const result = await (0, exports.getClientsConfigCollection)().updateOne({ clientId }, { $set: { "quota.usedQuota": 0 } });
79
+ if (result.matchedCount === 0) {
80
+ throw new Error(`No client config found for clientId: ${clientId}`);
81
+ }
82
+ await (0, clients_quota_getters_1.resetClientQuotaSettings)(clientId);
83
+ }
84
+ var clients_quota_getters_2 = require("../clients/clients.quota.getters");
85
+ Object.defineProperty(exports, "getClientQuotaState", { enumerable: true, get: function () { return clients_quota_getters_2.getClientQuotaState; } });
86
+ Object.defineProperty(exports, "updateQuotaAlertsConfig", { enumerable: true, get: function () { return clients_quota_getters_2.updateQuotaAlertsConfig; } });
87
+ Object.defineProperty(exports, "markQuotaAlertSent", { enumerable: true, get: function () { return clients_quota_getters_2.markQuotaAlertSent; } });
88
+ Object.defineProperty(exports, "markQuotaExpiredSent", { enumerable: true, get: function () { return clients_quota_getters_2.markQuotaExpiredSent; } });
89
+ Object.defineProperty(exports, "resetClientQuotaSettings", { enumerable: true, get: function () { return clients_quota_getters_2.resetClientQuotaSettings; } });
54
90
  //# sourceMappingURL=clientsConfig.getters.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"clientsConfig.getters.js","sourceRoot":"","sources":["../../../src/talkpilot/clientsConfig/clientsConfig.getters.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"clientsConfig.getters.js","sourceRoot":"","sources":["../../../src/talkpilot/clientsConfig/clientsConfig.getters.ts"],"names":[],"mappings":"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"}
@@ -75,6 +75,7 @@ export type CommunicationsConfig = {
75
75
  sms?: SmsConfig;
76
76
  whatsapp?: WhatsappConfig;
77
77
  };
78
+ import type { ClientQuotaUsage } from "../clients/clients.quota.types";
78
79
  export type ClientConfig<P extends Products = Products> = {
79
80
  clientId: string;
80
81
  phoneNumber?: string;
@@ -83,6 +84,7 @@ export type ClientConfig<P extends Products = Products> = {
83
84
  timezone?: string;
84
85
  communications?: CommunicationsConfig;
85
86
  callLengthThresholds?: CallLengthThresholds;
87
+ quota?: ClientQuotaUsage;
86
88
  };
87
89
  export type ClientConfigDoc<P extends Products = Products> = WithId<ClientConfig<P>>;
88
90
  //# sourceMappingURL=clientsConfig.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"clientsConfig.types.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/clientsConfig/clientsConfig.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"clientsConfig.types.d.ts","sourceRoot":"","sources":["../../../src/talkpilot/clientsConfig/clientsConfig.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAMhE,MAAM,MAAM,6BAA6B,GAAG;IAC1C,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACnD,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC7B,CAAC;AAEF,iGAAiG;AACjG,MAAM,MAAM,mBAAmB,GAAG;IAChC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,+BAA+B,CAAC,EAAE,MAAM,CAAC;IACzC,gCAAgC,CAAC,EAAE,MAAM,CAAC;CAC3C,CAAC;AAEF,yFAAyF;AACzF,MAAM,MAAM,cAAc,GAAG;IAC3B,2BAA2B,CAAC,EAAE,6BAA6B,CAAC;IAC5D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,YAAY,CAAC,EAAE,mBAAmB,CAAC;CACpC,CAAC;AAEF,eAAO,MAAM,kBAAkB,kDAIrB,CAAC;AACX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,iCAAiC;AACjC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAMF,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,yCAAyC;AACzC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAMF,6DAA6D;AAC7D,MAAM,MAAM,cAAc,GAAG;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,QAAQ,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAMF,MAAM,MAAM,QAAQ,GAAG;IACrB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B,QAAQ,GACR,SAAS,GACT,SAAS,GACT,QAAQ,GACR,SAAS,GACT,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,EAAE,CAAC;AAE3B,MAAM,MAAM,cAAc,GAAG,EAAE,CAAC;AAEhC,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B,CAAC;AAEF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAEvE,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,IAAI;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,QAAQ,EAAE,CAAC,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,IAAI,MAAM,CACjE,YAAY,CAAC,CAAC,CAAC,CAChB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@talkpilot/core-db",
3
- "version": "1.3.35",
3
+ "version": "1.3.37",
4
4
  "description": "Core database package for centralized connections and ORM integration.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1,6 +1,8 @@
1
1
  import { Db, ObjectId as MongoObjectId } from "mongodb";
2
2
 
3
3
  export * from "./prompts";
4
+ export * from "./models";
5
+ export * from "./internalModels";
4
6
  export { configurationMongodbClient } from "./mongodb-client";
5
7
 
6
8
  let db: Db;
@@ -0,0 +1,3 @@
1
+ export { INTERNAL_MODELS_COLLECTION } from "./internalModels.constants";
2
+ export * from "./internalModels.getters";
3
+ export type { InternalModel } from "./internalModels.types";
@@ -0,0 +1 @@
1
+ export const INTERNAL_MODELS_COLLECTION = "internal-models";
@@ -0,0 +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
+ };
@@ -0,0 +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
+ };
@@ -0,0 +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";
@@ -0,0 +1,13 @@
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"] 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;
@@ -0,0 +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
+ };
@@ -0,0 +1,79 @@
1
+ import { ObjectId } from "mongodb";
2
+
3
+ import {
4
+ MODEL_TYPES,
5
+ REALTIME_MODEL_PROVIDERS,
6
+ STT_MODEL_PROVIDERS,
7
+ } from "./models.constants";
8
+
9
+ export type ModelType = (typeof MODEL_TYPES)[number];
10
+ export type RealtimeModelProvider = (typeof REALTIME_MODEL_PROVIDERS)[number];
11
+ export type SttModelProvider = (typeof STT_MODEL_PROVIDERS)[number];
12
+
13
+ export type SemanticVad = {
14
+ type: "semantic_vad";
15
+ eagerness?: "low" | "medium" | "high" | "auto";
16
+ create_response?: boolean;
17
+ interrupt_response?: boolean;
18
+ };
19
+
20
+ export type ServerVad = {
21
+ type: "server_vad";
22
+ threshold: number;
23
+ prefix_padding_ms: number;
24
+ silence_duration_ms: number;
25
+ create_response?: boolean;
26
+ interrupt_response?: boolean;
27
+ };
28
+
29
+ export type TurnDetection = SemanticVad | ServerVad;
30
+
31
+ type BaseModelDoc = {
32
+ _id: ObjectId;
33
+ /** Public identifier used by the provider, not to be confused with mongo id */
34
+ modelId: string;
35
+ name: string;
36
+ description?: string;
37
+ available: boolean;
38
+ configDefaults?: Record<string, unknown>;
39
+ createdAt: Date;
40
+ updatedAt: Date;
41
+ };
42
+
43
+ /** Realtime speech-to-speech model (OpenAI/Gemini). `features.vad` is turn-detection config. */
44
+ export type RealtimeModelDoc = BaseModelDoc & {
45
+ type: "realtime";
46
+ provider: RealtimeModelProvider;
47
+ features?: {
48
+ supportsAudio?: boolean;
49
+ supportsText?: boolean;
50
+ vad?: TurnDetection;
51
+ };
52
+ };
53
+
54
+ /** STT engine/preset (openai-stt, google-stt, deepgram-stt/-flux, elevenlabs-scribe, gladia-stt). */
55
+ export type SttModelDoc = BaseModelDoc & {
56
+ type: "stt";
57
+ provider: SttModelProvider;
58
+ features?: {
59
+ supportsAudio?: boolean;
60
+ supportsText?: boolean;
61
+ };
62
+ };
63
+
64
+ /**
65
+ * A document in the `models` collection (configuration db). Discriminated by `type`.
66
+ *
67
+ * Common fields (all variants):
68
+ * - `_id` — Mongo-managed ObjectId
69
+ * - `modelId` — model's public identifier
70
+ * - `name` — display name
71
+ * - `description?` — display description
72
+ * - `available` — whether the model should be offered/selectable right now
73
+ * - `configDefaults?` — free-form provider-specific config, e.g. the literal vendor
74
+ * model string, VAD tuning, language, barge-in timings — shape varies per `provider`
75
+ * - `createdAt` / `updatedAt`
76
+ *
77
+ * Type-specific fields: see {@link RealtimeModelDoc}, {@link SttModelDoc}.
78
+ */
79
+ export type ModelDoc = RealtimeModelDoc | SttModelDoc;
package/src/index.ts CHANGED
@@ -33,6 +33,8 @@ export {
33
33
  setDb as setConfigurationDb,
34
34
  } from "./configuration";
35
35
  export * from "./configuration/prompts";
36
+ export * from "./configuration/models";
37
+ export * from "./configuration/internalModels";
36
38
 
37
39
  export { ObjectId } from "mongodb";
38
40
  export type { Filter } from "mongodb";