@talkpilot/core-db 1.3.7 → 1.3.8
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.
- package/README.md +55 -2
- package/dist/municipal/tickets/tickets.statistics.getters.d.ts +4 -0
- package/dist/municipal/tickets/tickets.statistics.getters.d.ts.map +1 -1
- package/dist/municipal/tickets/tickets.statistics.getters.js +30 -3
- package/dist/municipal/tickets/tickets.statistics.getters.js.map +1 -1
- package/dist/talkpilot/calls/calls.dashboard.d.ts +3 -0
- package/dist/talkpilot/calls/calls.dashboard.d.ts.map +1 -0
- package/dist/talkpilot/calls/calls.dashboard.js +191 -0
- package/dist/talkpilot/calls/calls.dashboard.js.map +1 -0
- package/dist/talkpilot/calls/calls.statistics.getters.js +12 -15
- package/dist/talkpilot/calls/calls.statistics.getters.js.map +1 -1
- package/dist/talkpilot/calls/calls.statistics.types.d.ts +4 -1
- package/dist/talkpilot/calls/calls.statistics.types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/setup.ts +20 -20
- package/src/municipal/__tests__/validation.spec.ts +62 -62
- package/src/municipal/cities/cities.getters.ts +50 -50
- package/src/municipal/cities/cities.types.ts +11 -11
- package/src/municipal/cities/index.ts +2 -2
- package/src/municipal/departmentsSubjects/departmentsSubjects.getters.ts +282 -282
- package/src/municipal/departmentsSubjects/departmentsSubjects.types.ts +72 -72
- package/src/municipal/departmentsSubjects/index.ts +9 -9
- package/src/municipal/mongodb-client.ts +61 -61
- package/src/municipal/streets/index.ts +2 -2
- package/src/municipal/streets/streets.getters.ts +125 -125
- package/src/municipal/streets/streets.types.ts +18 -18
- package/src/municipal/systemInstructions/__tests__/getters.spec.ts +113 -113
- package/src/municipal/systemInstructions/__tests__/setters.spec.ts +274 -274
- package/src/municipal/systemInstructions/index.ts +7 -7
- package/src/municipal/systemInstructions/instructions.getters.ts +57 -57
- package/src/municipal/systemInstructions/instructions.setters.ts +119 -119
- package/src/municipal/systemInstructions/instructions.types.ts +30 -30
- package/src/municipal/tickets/__tests__/tickets.statistics.spec.ts +21 -4
- package/src/municipal/tickets/tickets.statistics.getters.ts +40 -2
- package/src/municipal/utils/types.ts +11 -11
- package/src/talkpilot/__tests__/db.spec.ts +38 -38
- package/src/talkpilot/__tests__/mongodb-client.spec.ts +18 -18
- package/src/talkpilot/__tests__/validation.spec.ts +68 -68
- package/src/talkpilot/agents/__tests__/agents.getters.spec.ts +29 -29
- package/src/talkpilot/agents/agents.getters.ts +34 -34
- package/src/talkpilot/agents/agents.types.ts +14 -14
- package/src/talkpilot/agents/index.ts +2 -2
- package/src/talkpilot/backgroundToolResults/__tests__/backgroundToolResults.getters.spec.ts +147 -147
- package/src/talkpilot/backgroundToolResults/backgroundToolResults.getters.ts +65 -65
- package/src/talkpilot/backgroundToolResults/backgroundToolResults.types.ts +23 -23
- package/src/talkpilot/backgroundToolResults/index.ts +2 -2
- package/src/talkpilot/calls/__tests__/callStats.utils.spec.ts +128 -128
- package/src/talkpilot/calls/__tests__/calls.spec.ts +270 -270
- package/src/talkpilot/calls/__tests__/calls.statistics.spec.ts +25 -18
- package/src/talkpilot/calls/calls.getters.ts +248 -248
- package/src/talkpilot/calls/calls.statistics.getters.ts +25 -25
- package/src/talkpilot/calls/calls.statistics.types.ts +4 -1
- package/src/talkpilot/clientAudioBuffers/__tests__/clientAudioBuffer.getters.spec.ts +160 -160
- package/src/talkpilot/clientAudioBuffers/clientAudioBuffer.getters.ts +117 -117
- package/src/talkpilot/clientAudioBuffers/clientsAudioBuffers.types.ts +25 -25
- package/src/talkpilot/clientAudioBuffers/index.ts +2 -2
- package/src/talkpilot/clients/clients.getters.ts +16 -16
- package/src/talkpilot/clients/clients.types.ts +14 -14
- package/src/talkpilot/clients/index.ts +2 -2
- package/src/talkpilot/clientsConfig/__tests__/clientsConfig.getters.spec.ts +53 -53
- package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +55 -55
- package/src/talkpilot/clientsConfig/clientsConfig.types.ts +127 -127
- package/src/talkpilot/clientsConfig/index.ts +2 -2
- package/src/talkpilot/flows/flows.getter.ts +14 -14
- package/src/talkpilot/flows/index.ts +2 -2
- package/src/talkpilot/groups/__tests__/groups.spec.ts +90 -90
- package/src/talkpilot/groups/__tests__/phone.utils.spec.ts +32 -32
- package/src/talkpilot/groups/groups.getters.ts +30 -30
- package/src/talkpilot/groups/groups.types.ts +29 -29
- package/src/talkpilot/groups/index.ts +3 -3
- package/src/talkpilot/groups/phone.utils.ts +46 -46
- package/src/talkpilot/leads/index.ts +2 -2
- package/src/talkpilot/leads/leads.getter.ts +6 -6
- package/src/talkpilot/leads/leads.schema.ts +33 -33
- package/src/talkpilot/leads/leads.types.ts +20 -20
- package/src/talkpilot/mongodb-client.ts +78 -78
- package/src/talkpilot/phone_numbers/__tests__/phone_numbers.spec.ts +252 -252
- package/src/talkpilot/phone_numbers/index.ts +2 -2
- package/src/talkpilot/phone_numbers/phone_numbers.getter.ts +158 -158
- package/src/talkpilot/phone_numbers/phone_numbers.schema.ts +17 -17
- package/src/talkpilot/phone_numbers/phone_numbers.types.ts +30 -30
- package/src/talkpilot/plans/__tests__/plans.spec.ts +70 -70
- package/src/talkpilot/plans/index.ts +2 -2
- package/src/talkpilot/plans/plans.getters.ts +132 -132
- package/src/talkpilot/plans/plans.types.ts +89 -89
- package/src/talkpilot/results/index.ts +7 -7
- package/src/talkpilot/results/results.getter.ts +39 -39
- package/src/talkpilot/results/results.schema.ts +25 -25
- package/src/talkpilot/results/results.types.ts +34 -34
- package/src/talkpilot/retry_analyze/__tests__/retryAnalyze.getters.spec.ts +156 -156
- package/src/talkpilot/retry_analyze/index.ts +2 -2
- package/src/talkpilot/retry_analyze/retryAnalyze.getters.ts +84 -84
- package/src/talkpilot/retry_analyze/retryAnalyze.types.ts +13 -13
- package/src/talkpilot/sessions/__tests__/sessions.spec.ts +147 -147
- package/src/talkpilot/sessions/index.ts +2 -2
- package/src/talkpilot/sessions/sessions.getter.ts +92 -92
- package/src/talkpilot/sessions/sessions.schema.ts +34 -34
- package/src/talkpilot/sessions/sessions.types.ts +30 -30
- package/src/talkpilot/subscriptions/__tests__/subscriptions.getters.utils.spec.ts +45 -45
- package/src/talkpilot/subscriptions/index.ts +3 -3
- package/src/talkpilot/subscriptions/subscriptions.getters.ts +146 -146
- package/src/talkpilot/subscriptions/subscriptions.getters.utils.ts +33 -33
- package/src/talkpilot/subscriptions/subscriptions.types.ts +66 -66
- package/src/talkpilot/utils/__tests__/query.utils.spec.ts +49 -49
- package/src/talkpilot/utils/query.utils.ts +21 -21
- package/src/test-utils/factories/municipal/cities.ts +16 -16
- package/src/test-utils/factories/municipal/departmentsSubjects.ts +37 -37
- package/src/test-utils/factories/municipal/streets.ts +22 -22
- package/src/test-utils/factories/municipal/tickets.ts +39 -39
- package/src/test-utils/factories/talkpilot/agents.ts +19 -19
- package/src/test-utils/factories/talkpilot/calls.ts +37 -37
- package/src/test-utils/factories/talkpilot/clientAudioBuffers.ts +20 -20
- package/src/test-utils/factories/talkpilot/clientsConfig.ts +18 -18
- package/src/test-utils/factories/talkpilot/flows.ts +33 -33
- package/src/test-utils/factories/talkpilot/groups.ts +33 -33
- package/src/test-utils/factories/talkpilot/phone_numbers.ts +22 -22
- package/src/test-utils/factories/talkpilot/sessions.ts +35 -35
- package/src/utils/shared.types.ts +4 -4
- package/src/utils/validation.ts +23 -23
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from "./clients.getters";
|
|
2
|
-
export * from "./clients.types";
|
|
1
|
+
export * from "./clients.getters";
|
|
2
|
+
export * from "./clients.types";
|
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, afterEach } from "@jest/globals";
|
|
2
|
-
import {
|
|
3
|
-
getClientsConfigCollection,
|
|
4
|
-
updateProductConfig,
|
|
5
|
-
} from "../clientsConfig.getters";
|
|
6
|
-
|
|
7
|
-
describe("updateProductConfig", () => {
|
|
8
|
-
beforeEach(async () => {
|
|
9
|
-
await getClientsConfigCollection().deleteMany({});
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
afterEach(async () => {
|
|
13
|
-
await getClientsConfigCollection().deleteMany({});
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
it("should update partial fields using correct dot notation", async () => {
|
|
17
|
-
const clientId = "client-123";
|
|
18
|
-
const collection = getClientsConfigCollection();
|
|
19
|
-
|
|
20
|
-
await collection.insertOne({
|
|
21
|
-
clientId,
|
|
22
|
-
products: {
|
|
23
|
-
websiteTalk: {
|
|
24
|
-
language: "English",
|
|
25
|
-
companyName: "OldCorp",
|
|
26
|
-
defaultBaseUrl: "https://old-url.com",
|
|
27
|
-
logoUrl: "",
|
|
28
|
-
timezone: "UTC",
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
} as any);
|
|
32
|
-
|
|
33
|
-
const updates = { language: "Hebrew", companyName: "TestCorp" };
|
|
34
|
-
await updateProductConfig(clientId, "websiteTalk", updates);
|
|
35
|
-
|
|
36
|
-
const updatedDoc = await collection.findOne({ clientId });
|
|
37
|
-
|
|
38
|
-
expect(updatedDoc).toBeDefined();
|
|
39
|
-
expect(updatedDoc?.products.websiteTalk?.language).toBe("Hebrew");
|
|
40
|
-
expect(updatedDoc?.products.websiteTalk?.companyName).toBe("TestCorp");
|
|
41
|
-
expect(updatedDoc?.products.websiteTalk?.defaultBaseUrl).toBe(
|
|
42
|
-
"https://old-url.com",
|
|
43
|
-
);
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it("should throw an error if no client config is found", async () => {
|
|
47
|
-
await expect(
|
|
48
|
-
updateProductConfig("invalid-client", "websiteTalk", {
|
|
49
|
-
language: "English",
|
|
50
|
-
}),
|
|
51
|
-
).rejects.toThrow("No client config found for clientId: invalid-client");
|
|
52
|
-
});
|
|
53
|
-
});
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from "@jest/globals";
|
|
2
|
+
import {
|
|
3
|
+
getClientsConfigCollection,
|
|
4
|
+
updateProductConfig,
|
|
5
|
+
} from "../clientsConfig.getters";
|
|
6
|
+
|
|
7
|
+
describe("updateProductConfig", () => {
|
|
8
|
+
beforeEach(async () => {
|
|
9
|
+
await getClientsConfigCollection().deleteMany({});
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
afterEach(async () => {
|
|
13
|
+
await getClientsConfigCollection().deleteMany({});
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it("should update partial fields using correct dot notation", async () => {
|
|
17
|
+
const clientId = "client-123";
|
|
18
|
+
const collection = getClientsConfigCollection();
|
|
19
|
+
|
|
20
|
+
await collection.insertOne({
|
|
21
|
+
clientId,
|
|
22
|
+
products: {
|
|
23
|
+
websiteTalk: {
|
|
24
|
+
language: "English",
|
|
25
|
+
companyName: "OldCorp",
|
|
26
|
+
defaultBaseUrl: "https://old-url.com",
|
|
27
|
+
logoUrl: "",
|
|
28
|
+
timezone: "UTC",
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
} as any);
|
|
32
|
+
|
|
33
|
+
const updates = { language: "Hebrew", companyName: "TestCorp" };
|
|
34
|
+
await updateProductConfig(clientId, "websiteTalk", updates);
|
|
35
|
+
|
|
36
|
+
const updatedDoc = await collection.findOne({ clientId });
|
|
37
|
+
|
|
38
|
+
expect(updatedDoc).toBeDefined();
|
|
39
|
+
expect(updatedDoc?.products.websiteTalk?.language).toBe("Hebrew");
|
|
40
|
+
expect(updatedDoc?.products.websiteTalk?.companyName).toBe("TestCorp");
|
|
41
|
+
expect(updatedDoc?.products.websiteTalk?.defaultBaseUrl).toBe(
|
|
42
|
+
"https://old-url.com",
|
|
43
|
+
);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("should throw an error if no client config is found", async () => {
|
|
47
|
+
await expect(
|
|
48
|
+
updateProductConfig("invalid-client", "websiteTalk", {
|
|
49
|
+
language: "English",
|
|
50
|
+
}),
|
|
51
|
+
).rejects.toThrow("No client config found for clientId: invalid-client");
|
|
52
|
+
});
|
|
53
|
+
});
|
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ClientConfigDoc,
|
|
3
|
-
getDb,
|
|
4
|
-
findClientByPhoneNumber,
|
|
5
|
-
Products,
|
|
6
|
-
KNOWN_PRODUCT_KEYS,
|
|
7
|
-
KnownProductKey,
|
|
8
|
-
} from "../index";
|
|
9
|
-
import { Collection } from "mongodb";
|
|
10
|
-
|
|
11
|
-
export const getClientsConfigCollection = (): Collection<ClientConfigDoc> => {
|
|
12
|
-
return getDb().collection<ClientConfigDoc>("clientsConfig");
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
export const getClientConfig = (clientId: string) => {
|
|
16
|
-
return getClientsConfigCollection().findOne({ clientId });
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
export const getClientConfigByPhone = async (phone: string) => {
|
|
20
|
-
const client = await findClientByPhoneNumber(phone);
|
|
21
|
-
if (!client) return null;
|
|
22
|
-
return getClientConfig(client.clientId);
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
export const createClientConfigDoc = async (
|
|
26
|
-
clientConfig: ClientConfigDoc,
|
|
27
|
-
): Promise<void> => {
|
|
28
|
-
await getClientsConfigCollection().insertOne(clientConfig);
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
export async function updateProductConfig<K extends KnownProductKey>(
|
|
32
|
-
clientId: string,
|
|
33
|
-
productKey: K,
|
|
34
|
-
updates: Partial<Products[K]>,
|
|
35
|
-
): Promise<void> {
|
|
36
|
-
if (!KNOWN_PRODUCT_KEYS.includes(productKey as KnownProductKey)) {
|
|
37
|
-
throw new Error(
|
|
38
|
-
`Invalid product key: "${productKey}". Must be one of: ${KNOWN_PRODUCT_KEYS.join(", ")}`,
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const setOperations: Record<string, unknown> = {};
|
|
43
|
-
for (const [key, value] of Object.entries(updates)) {
|
|
44
|
-
setOperations[`products.${productKey}.${key}`] = value;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const result = await getClientsConfigCollection().updateOne(
|
|
48
|
-
{ clientId },
|
|
49
|
-
{ $set: setOperations },
|
|
50
|
-
);
|
|
51
|
-
|
|
52
|
-
if (result.matchedCount === 0) {
|
|
53
|
-
throw new Error(`No client config found for clientId: ${clientId}`);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
ClientConfigDoc,
|
|
3
|
+
getDb,
|
|
4
|
+
findClientByPhoneNumber,
|
|
5
|
+
Products,
|
|
6
|
+
KNOWN_PRODUCT_KEYS,
|
|
7
|
+
KnownProductKey,
|
|
8
|
+
} from "../index";
|
|
9
|
+
import { Collection } from "mongodb";
|
|
10
|
+
|
|
11
|
+
export const getClientsConfigCollection = (): Collection<ClientConfigDoc> => {
|
|
12
|
+
return getDb().collection<ClientConfigDoc>("clientsConfig");
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export const getClientConfig = (clientId: string) => {
|
|
16
|
+
return getClientsConfigCollection().findOne({ clientId });
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export const getClientConfigByPhone = async (phone: string) => {
|
|
20
|
+
const client = await findClientByPhoneNumber(phone);
|
|
21
|
+
if (!client) return null;
|
|
22
|
+
return getClientConfig(client.clientId);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export const createClientConfigDoc = async (
|
|
26
|
+
clientConfig: ClientConfigDoc,
|
|
27
|
+
): Promise<void> => {
|
|
28
|
+
await getClientsConfigCollection().insertOne(clientConfig);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export async function updateProductConfig<K extends KnownProductKey>(
|
|
32
|
+
clientId: string,
|
|
33
|
+
productKey: K,
|
|
34
|
+
updates: Partial<Products[K]>,
|
|
35
|
+
): Promise<void> {
|
|
36
|
+
if (!KNOWN_PRODUCT_KEYS.includes(productKey as KnownProductKey)) {
|
|
37
|
+
throw new Error(
|
|
38
|
+
`Invalid product key: "${productKey}". Must be one of: ${KNOWN_PRODUCT_KEYS.join(", ")}`,
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const setOperations: Record<string, unknown> = {};
|
|
43
|
+
for (const [key, value] of Object.entries(updates)) {
|
|
44
|
+
setOperations[`products.${productKey}.${key}`] = value;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const result = await getClientsConfigCollection().updateOne(
|
|
48
|
+
{ clientId },
|
|
49
|
+
{ $set: setOperations },
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
if (result.matchedCount === 0) {
|
|
53
|
+
throw new Error(`No client config found for clientId: ${clientId}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -1,127 +1,127 @@
|
|
|
1
|
-
import { WithId } from "mongodb";
|
|
2
|
-
import { CallLengthThresholds } from "src/utils/shared.types";
|
|
3
|
-
|
|
4
|
-
// ---------------------------------------------------------------------------
|
|
5
|
-
// Moked106 (MIS)
|
|
6
|
-
// ---------------------------------------------------------------------------
|
|
7
|
-
|
|
8
|
-
export type InitiateCallForShortSlaConfig = {
|
|
9
|
-
active: boolean;
|
|
10
|
-
max_hours: number;
|
|
11
|
-
contacts?: { name: string; phoneNumber: string }[];
|
|
12
|
-
flow_id?: string | string[];
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
/** Per-tool LLM system prompt overrides. Falls back to hardcoded defaults when absent. */
|
|
16
|
-
export type Moked106ToolPrompts = {
|
|
17
|
-
findSubjectsSystemPrompt?: string;
|
|
18
|
-
findStreetsSystemPrompt?: string;
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
/** Feature flags and behavior config for the moked_106 municipal call-center product. */
|
|
22
|
-
export type Moked106Config = {
|
|
23
|
-
initiate_call_for_short_sla?: InitiateCallForShortSlaConfig;
|
|
24
|
-
avoidSaveTickets?: boolean;
|
|
25
|
-
withUploadImagesSms?: boolean;
|
|
26
|
-
withNeedAttentionCalls?: boolean;
|
|
27
|
-
toolsPrompts?: Moked106ToolPrompts;
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
export const KNOWN_PRODUCT_KEYS = [
|
|
31
|
-
"municipal",
|
|
32
|
-
"clinics",
|
|
33
|
-
"websiteTalk",
|
|
34
|
-
] as const;
|
|
35
|
-
export type KnownProductKey = (typeof KNOWN_PRODUCT_KEYS)[number];
|
|
36
|
-
|
|
37
|
-
/** Product config for the MIS */
|
|
38
|
-
export type MunicipalProduct = {
|
|
39
|
-
moked_106?: Moked106Config;
|
|
40
|
-
cityName: string;
|
|
41
|
-
crmName?: string;
|
|
42
|
-
cityDisplayName?: string;
|
|
43
|
-
cityLogoURL?: string;
|
|
44
|
-
timezone: string;
|
|
45
|
-
websiteUrl?: string;
|
|
46
|
-
isProductionReady?: boolean;
|
|
47
|
-
municipalDisplayName?: string;
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
// ---------------------------------------------------------------------------
|
|
51
|
-
// WebsiteTalk
|
|
52
|
-
// ---------------------------------------------------------------------------
|
|
53
|
-
|
|
54
|
-
export type WebsiteTalkScheduler = {
|
|
55
|
-
type: "cron";
|
|
56
|
-
schedule: string;
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
/** Product config for the websiteTalk */
|
|
60
|
-
export type WebsiteTalkProduct = {
|
|
61
|
-
logoUrl: string;
|
|
62
|
-
companyName: string;
|
|
63
|
-
timezone: string;
|
|
64
|
-
language: string;
|
|
65
|
-
defaultBaseUrl: string;
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
// ---------------------------------------------------------------------------
|
|
69
|
-
// Clinics
|
|
70
|
-
// ---------------------------------------------------------------------------
|
|
71
|
-
|
|
72
|
-
/** Product config for the clinics scheduling integration. */
|
|
73
|
-
export type ClinicsProduct = {
|
|
74
|
-
api_key_secret_name: string;
|
|
75
|
-
base_api_url: string;
|
|
76
|
-
provider: "clinix" | (string & {});
|
|
77
|
-
description?: string;
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
// ---------------------------------------------------------------------------
|
|
81
|
-
// Top Level Client config
|
|
82
|
-
// ---------------------------------------------------------------------------
|
|
83
|
-
|
|
84
|
-
export type Products = {
|
|
85
|
-
municipal?: MunicipalProduct;
|
|
86
|
-
clinics?: ClinicsProduct;
|
|
87
|
-
websiteTalk?: WebsiteTalkProduct;
|
|
88
|
-
[key: string]: unknown;
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
export type ClientLanguageName =
|
|
92
|
-
| "Hebrew"
|
|
93
|
-
| "English"
|
|
94
|
-
| "Russian"
|
|
95
|
-
| "French"
|
|
96
|
-
| "Spanish"
|
|
97
|
-
| (string & {});
|
|
98
|
-
|
|
99
|
-
export type SendGridConfig = {
|
|
100
|
-
emailTo: string[];
|
|
101
|
-
templateId?: string;
|
|
102
|
-
senderId?: string;
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
export type SmsConfig = {};
|
|
106
|
-
|
|
107
|
-
export type WhatsappConfig = {};
|
|
108
|
-
|
|
109
|
-
export type CommunicationsConfig = {
|
|
110
|
-
sendGrid?: SendGridConfig;
|
|
111
|
-
sms?: SmsConfig;
|
|
112
|
-
whatsapp?: WhatsappConfig;
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
export type ClientConfig<P extends Products = Products> = {
|
|
116
|
-
clientId: string;
|
|
117
|
-
phoneNumber?: string;
|
|
118
|
-
language?: ClientLanguageName;
|
|
119
|
-
products: P;
|
|
120
|
-
timezone?: string;
|
|
121
|
-
communications?: CommunicationsConfig;
|
|
122
|
-
callLengthThresholds?: CallLengthThresholds;
|
|
123
|
-
};
|
|
124
|
-
|
|
125
|
-
export type ClientConfigDoc<P extends Products = Products> = WithId<
|
|
126
|
-
ClientConfig<P>
|
|
127
|
-
>;
|
|
1
|
+
import { WithId } from "mongodb";
|
|
2
|
+
import { CallLengthThresholds } from "src/utils/shared.types";
|
|
3
|
+
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Moked106 (MIS)
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
|
|
8
|
+
export type InitiateCallForShortSlaConfig = {
|
|
9
|
+
active: boolean;
|
|
10
|
+
max_hours: number;
|
|
11
|
+
contacts?: { name: string; phoneNumber: string }[];
|
|
12
|
+
flow_id?: string | string[];
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
/** Per-tool LLM system prompt overrides. Falls back to hardcoded defaults when absent. */
|
|
16
|
+
export type Moked106ToolPrompts = {
|
|
17
|
+
findSubjectsSystemPrompt?: string;
|
|
18
|
+
findStreetsSystemPrompt?: string;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/** Feature flags and behavior config for the moked_106 municipal call-center product. */
|
|
22
|
+
export type Moked106Config = {
|
|
23
|
+
initiate_call_for_short_sla?: InitiateCallForShortSlaConfig;
|
|
24
|
+
avoidSaveTickets?: boolean;
|
|
25
|
+
withUploadImagesSms?: boolean;
|
|
26
|
+
withNeedAttentionCalls?: boolean;
|
|
27
|
+
toolsPrompts?: Moked106ToolPrompts;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export const KNOWN_PRODUCT_KEYS = [
|
|
31
|
+
"municipal",
|
|
32
|
+
"clinics",
|
|
33
|
+
"websiteTalk",
|
|
34
|
+
] as const;
|
|
35
|
+
export type KnownProductKey = (typeof KNOWN_PRODUCT_KEYS)[number];
|
|
36
|
+
|
|
37
|
+
/** Product config for the MIS */
|
|
38
|
+
export type MunicipalProduct = {
|
|
39
|
+
moked_106?: Moked106Config;
|
|
40
|
+
cityName: string;
|
|
41
|
+
crmName?: string;
|
|
42
|
+
cityDisplayName?: string;
|
|
43
|
+
cityLogoURL?: string;
|
|
44
|
+
timezone: string;
|
|
45
|
+
websiteUrl?: string;
|
|
46
|
+
isProductionReady?: boolean;
|
|
47
|
+
municipalDisplayName?: string;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
// WebsiteTalk
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
|
|
54
|
+
export type WebsiteTalkScheduler = {
|
|
55
|
+
type: "cron";
|
|
56
|
+
schedule: string;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/** Product config for the websiteTalk */
|
|
60
|
+
export type WebsiteTalkProduct = {
|
|
61
|
+
logoUrl: string;
|
|
62
|
+
companyName: string;
|
|
63
|
+
timezone: string;
|
|
64
|
+
language: string;
|
|
65
|
+
defaultBaseUrl: string;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
// Clinics
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
|
|
72
|
+
/** Product config for the clinics scheduling integration. */
|
|
73
|
+
export type ClinicsProduct = {
|
|
74
|
+
api_key_secret_name: string;
|
|
75
|
+
base_api_url: string;
|
|
76
|
+
provider: "clinix" | (string & {});
|
|
77
|
+
description?: string;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
// Top Level Client config
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
|
|
84
|
+
export type Products = {
|
|
85
|
+
municipal?: MunicipalProduct;
|
|
86
|
+
clinics?: ClinicsProduct;
|
|
87
|
+
websiteTalk?: WebsiteTalkProduct;
|
|
88
|
+
[key: string]: unknown;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
export type ClientLanguageName =
|
|
92
|
+
| "Hebrew"
|
|
93
|
+
| "English"
|
|
94
|
+
| "Russian"
|
|
95
|
+
| "French"
|
|
96
|
+
| "Spanish"
|
|
97
|
+
| (string & {});
|
|
98
|
+
|
|
99
|
+
export type SendGridConfig = {
|
|
100
|
+
emailTo: string[];
|
|
101
|
+
templateId?: string;
|
|
102
|
+
senderId?: string;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
export type SmsConfig = {};
|
|
106
|
+
|
|
107
|
+
export type WhatsappConfig = {};
|
|
108
|
+
|
|
109
|
+
export type CommunicationsConfig = {
|
|
110
|
+
sendGrid?: SendGridConfig;
|
|
111
|
+
sms?: SmsConfig;
|
|
112
|
+
whatsapp?: WhatsappConfig;
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
export type ClientConfig<P extends Products = Products> = {
|
|
116
|
+
clientId: string;
|
|
117
|
+
phoneNumber?: string;
|
|
118
|
+
language?: ClientLanguageName;
|
|
119
|
+
products: P;
|
|
120
|
+
timezone?: string;
|
|
121
|
+
communications?: CommunicationsConfig;
|
|
122
|
+
callLengthThresholds?: CallLengthThresholds;
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
export type ClientConfigDoc<P extends Products = Products> = WithId<
|
|
126
|
+
ClientConfig<P>
|
|
127
|
+
>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from "./clientsConfig.types";
|
|
2
|
-
export * from "./clientsConfig.getters";
|
|
1
|
+
export * from "./clientsConfig.types";
|
|
2
|
+
export * from "./clientsConfig.getters";
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import type { Collection, ObjectId, WithId } from "mongodb";
|
|
2
|
-
import { getDb } from "../index";
|
|
3
|
-
import type { Flow } from "./flows.types";
|
|
4
|
-
|
|
5
|
-
export const getFlowsCollection = (): Collection<Flow> => {
|
|
6
|
-
return getDb().collection<Flow>("flows");
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
export const findFlowById = (
|
|
10
|
-
flowId: ObjectId,
|
|
11
|
-
clientId: string,
|
|
12
|
-
): Promise<WithId<Flow> | null> => {
|
|
13
|
-
return getFlowsCollection().findOne({ _id: flowId, clientId });
|
|
14
|
-
};
|
|
1
|
+
import type { Collection, ObjectId, WithId } from "mongodb";
|
|
2
|
+
import { getDb } from "../index";
|
|
3
|
+
import type { Flow } from "./flows.types";
|
|
4
|
+
|
|
5
|
+
export const getFlowsCollection = (): Collection<Flow> => {
|
|
6
|
+
return getDb().collection<Flow>("flows");
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export const findFlowById = (
|
|
10
|
+
flowId: ObjectId,
|
|
11
|
+
clientId: string,
|
|
12
|
+
): Promise<WithId<Flow> | null> => {
|
|
13
|
+
return getFlowsCollection().findOne({ _id: flowId, clientId });
|
|
14
|
+
};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { getFlowsCollection, findFlowById } from "./flows.getter";
|
|
2
|
-
export type * from "./flows.types";
|
|
1
|
+
export { getFlowsCollection, findFlowById } from "./flows.getter";
|
|
2
|
+
export type * from "./flows.types";
|