@talkpilot/core-db 1.2.0 → 1.2.1

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 (132) hide show
  1. package/.cursor/rules/development.mdc +65 -65
  2. package/DEVELOPMENT.md +98 -98
  3. package/README.md +160 -160
  4. package/dist/talkpilot/calls/calls.getters.d.ts +1 -2
  5. package/dist/talkpilot/calls/calls.getters.d.ts.map +1 -1
  6. package/dist/talkpilot/calls/calls.getters.js +0 -176
  7. package/dist/talkpilot/calls/calls.getters.js.map +1 -1
  8. package/dist/talkpilot/calls/calls.types.d.ts +0 -48
  9. package/dist/talkpilot/calls/calls.types.d.ts.map +1 -1
  10. package/dist/talkpilot/clientsConfig/clientsConfig.getters.d.ts +0 -1
  11. package/dist/talkpilot/clientsConfig/clientsConfig.getters.d.ts.map +1 -1
  12. package/dist/talkpilot/clientsConfig/clientsConfig.getters.js +0 -13
  13. package/dist/talkpilot/clientsConfig/clientsConfig.getters.js.map +1 -1
  14. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts +16 -8
  15. package/dist/talkpilot/clientsConfig/clientsConfig.types.d.ts.map +1 -1
  16. package/jest.config.js +19 -19
  17. package/package.json +45 -45
  18. package/src/__tests__/setup.ts +20 -20
  19. package/src/connection.ts +42 -42
  20. package/src/index.ts +16 -16
  21. package/src/municipal/__tests__/validation.spec.ts +62 -62
  22. package/src/municipal/cities/cities.getters.ts +50 -50
  23. package/src/municipal/cities/cities.types.ts +11 -11
  24. package/src/municipal/cities/index.ts +2 -2
  25. package/src/municipal/departmentsSubjects/departmentsSubjects.getters.ts +282 -282
  26. package/src/municipal/departmentsSubjects/departmentsSubjects.types.ts +72 -72
  27. package/src/municipal/departmentsSubjects/index.ts +9 -9
  28. package/src/municipal/index.ts +21 -21
  29. package/src/municipal/mongodb-client.ts +61 -61
  30. package/src/municipal/streets/index.ts +2 -2
  31. package/src/municipal/streets/streets.getters.ts +125 -125
  32. package/src/municipal/streets/streets.types.ts +18 -18
  33. package/src/municipal/systemInstructions/__tests__/getters.spec.ts +113 -113
  34. package/src/municipal/systemInstructions/__tests__/setters.spec.ts +274 -274
  35. package/src/municipal/systemInstructions/index.ts +7 -7
  36. package/src/municipal/systemInstructions/instructions.getters.ts +57 -57
  37. package/src/municipal/systemInstructions/instructions.setters.ts +119 -119
  38. package/src/municipal/systemInstructions/instructions.types.ts +30 -30
  39. package/src/municipal/tickets/__tests__/tickets.getters.spec.ts +66 -66
  40. package/src/municipal/tickets/index.ts +2 -2
  41. package/src/municipal/tickets/tickets.getters.ts +261 -261
  42. package/src/municipal/tickets/tickets.types.ts +43 -43
  43. package/src/municipal/utils/types.ts +11 -11
  44. package/src/talkpilot/__tests__/db.spec.ts +38 -38
  45. package/src/talkpilot/__tests__/mongodb-client.spec.ts +18 -18
  46. package/src/talkpilot/__tests__/validation.spec.ts +68 -68
  47. package/src/talkpilot/agents/__tests__/agents.getters.spec.ts +29 -29
  48. package/src/talkpilot/agents/agents.getters.ts +34 -34
  49. package/src/talkpilot/agents/agents.types.ts +14 -14
  50. package/src/talkpilot/agents/index.ts +2 -2
  51. package/src/talkpilot/backgroundToolResults/__tests__/backgroundToolResults.getters.spec.ts +147 -147
  52. package/src/talkpilot/backgroundToolResults/backgroundToolResults.getters.ts +65 -65
  53. package/src/talkpilot/backgroundToolResults/backgroundToolResults.types.ts +23 -23
  54. package/src/talkpilot/backgroundToolResults/index.ts +2 -2
  55. package/src/talkpilot/calls/__tests__/callStats.utils.spec.ts +128 -128
  56. package/src/talkpilot/calls/__tests__/calls.spec.ts +252 -252
  57. package/src/talkpilot/calls/calls.getters.ts +248 -446
  58. package/src/talkpilot/calls/calls.types.ts +115 -171
  59. package/src/talkpilot/calls/index.ts +2 -2
  60. package/src/talkpilot/clientAudioBuffers/__tests__/clientAudioBuffer.getters.spec.ts +160 -160
  61. package/src/talkpilot/clientAudioBuffers/clientAudioBuffer.getters.ts +117 -117
  62. package/src/talkpilot/clientAudioBuffers/clientsAudioBuffers.types.ts +25 -25
  63. package/src/talkpilot/clientAudioBuffers/index.ts +2 -2
  64. package/src/talkpilot/clients/clients.getters.ts +16 -16
  65. package/src/talkpilot/clients/clients.types.ts +14 -14
  66. package/src/talkpilot/clients/index.ts +2 -2
  67. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +187 -106
  68. package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +22 -44
  69. package/src/talkpilot/clientsConfig/clientsConfig.types.ts +119 -94
  70. package/src/talkpilot/clientsConfig/index.ts +2 -2
  71. package/src/talkpilot/flows/__tests__/flows.schema.spec.ts +67 -67
  72. package/src/talkpilot/flows/flows.getter.ts +14 -14
  73. package/src/talkpilot/flows/flows.schema.ts +153 -153
  74. package/src/talkpilot/flows/flows.types.ts +184 -184
  75. package/src/talkpilot/flows/index.ts +2 -2
  76. package/src/talkpilot/groups/__tests__/groups.spec.ts +90 -90
  77. package/src/talkpilot/groups/__tests__/phone.utils.spec.ts +32 -32
  78. package/src/talkpilot/groups/groups.getters.ts +30 -30
  79. package/src/talkpilot/groups/groups.types.ts +29 -29
  80. package/src/talkpilot/groups/index.ts +3 -3
  81. package/src/talkpilot/groups/phone.utils.ts +46 -46
  82. package/src/talkpilot/index.ts +29 -29
  83. package/src/talkpilot/leads/index.ts +2 -2
  84. package/src/talkpilot/leads/leads.getter.ts +6 -6
  85. package/src/talkpilot/leads/leads.schema.ts +33 -33
  86. package/src/talkpilot/leads/leads.types.ts +20 -20
  87. package/src/talkpilot/mongodb-client.ts +78 -78
  88. package/src/talkpilot/phone_numbers/__tests__/phone_numbers.spec.ts +247 -247
  89. package/src/talkpilot/phone_numbers/index.ts +2 -2
  90. package/src/talkpilot/phone_numbers/phone_numbers.getter.ts +154 -154
  91. package/src/talkpilot/phone_numbers/phone_numbers.schema.ts +17 -17
  92. package/src/talkpilot/phone_numbers/phone_numbers.types.ts +30 -30
  93. package/src/talkpilot/plans/__tests__/plans.spec.ts +70 -70
  94. package/src/talkpilot/plans/index.ts +2 -2
  95. package/src/talkpilot/plans/plans.getters.ts +132 -132
  96. package/src/talkpilot/plans/plans.types.ts +89 -89
  97. package/src/talkpilot/results/index.ts +7 -7
  98. package/src/talkpilot/results/results.getter.ts +35 -35
  99. package/src/talkpilot/results/results.schema.ts +25 -25
  100. package/src/talkpilot/results/results.types.ts +34 -34
  101. package/src/talkpilot/retry_analyze/__tests__/retryAnalyze.getters.spec.ts +156 -156
  102. package/src/talkpilot/retry_analyze/index.ts +2 -2
  103. package/src/talkpilot/retry_analyze/retryAnalyze.getters.ts +75 -75
  104. package/src/talkpilot/retry_analyze/retryAnalyze.types.ts +13 -13
  105. package/src/talkpilot/sessions/__tests__/sessions.spec.ts +147 -147
  106. package/src/talkpilot/sessions/index.ts +2 -2
  107. package/src/talkpilot/sessions/sessions.getter.ts +92 -92
  108. package/src/talkpilot/sessions/sessions.schema.ts +34 -34
  109. package/src/talkpilot/sessions/sessions.types.ts +30 -30
  110. package/src/talkpilot/subscriptions/__tests__/subscriptions.getters.utils.spec.ts +45 -45
  111. package/src/talkpilot/subscriptions/index.ts +3 -3
  112. package/src/talkpilot/subscriptions/subscriptions.getters.ts +146 -146
  113. package/src/talkpilot/subscriptions/subscriptions.getters.utils.ts +33 -33
  114. package/src/talkpilot/subscriptions/subscriptions.types.ts +66 -66
  115. package/src/talkpilot/utils/__tests__/query.utils.spec.ts +49 -49
  116. package/src/talkpilot/utils/query.utils.ts +21 -21
  117. package/src/test-utils/db-utils.ts +24 -24
  118. package/src/test-utils/factories/index.ts +12 -12
  119. package/src/test-utils/factories/municipal/cities.ts +16 -16
  120. package/src/test-utils/factories/municipal/departmentsSubjects.ts +37 -37
  121. package/src/test-utils/factories/municipal/streets.ts +22 -22
  122. package/src/test-utils/factories/municipal/tickets.ts +39 -39
  123. package/src/test-utils/factories/talkpilot/agents.ts +19 -19
  124. package/src/test-utils/factories/talkpilot/calls.ts +37 -37
  125. package/src/test-utils/factories/talkpilot/clientAudioBuffers.ts +20 -20
  126. package/src/test-utils/factories/talkpilot/clientsConfig.ts +18 -18
  127. package/src/test-utils/factories/talkpilot/flows.ts +33 -33
  128. package/src/test-utils/factories/talkpilot/groups.ts +33 -33
  129. package/src/test-utils/factories/talkpilot/phone_numbers.ts +22 -22
  130. package/src/test-utils/factories/talkpilot/sessions.ts +35 -35
  131. package/src/utils/validation.ts +23 -23
  132. package/tsconfig.json +23 -23
@@ -1,153 +1,153 @@
1
- export const flowMongoSchema = {
2
- bsonType: "object",
3
- required: [
4
- "flowName",
5
- "systemInstructions",
6
- "initialSentence",
7
- "interactions",
8
- ],
9
- properties: {
10
- _id: { bsonType: "objectId" },
11
- flowName: { bsonType: "string" },
12
- clientId: { bsonType: "string" },
13
- systemInstructions: { bsonType: "string" },
14
- initialSentence: { bsonType: "string" },
15
- voice: { bsonType: ["string", "null"] },
16
- conversationSettings: {
17
- bsonType: ["object", "null"],
18
- properties: {
19
- interruptions: {
20
- bsonType: ["object", "null"],
21
- properties: {
22
- enableInterruptionDetection: { bsonType: "bool" },
23
- interruptionWindowSeconds: { bsonType: "number" },
24
- interruptionThresholdSeconds: { bsonType: "number" },
25
- interruptionInstruction: { bsonType: "string" },
26
- },
27
- additionalProperties: false,
28
- },
29
- silence: {
30
- bsonType: ["object", "null"],
31
- properties: {
32
- enableSilenceDetection: { bsonType: "bool" },
33
- firstWarningSilenceSeconds: { bsonType: "number" },
34
- firstWarningInstruction: { bsonType: "string" },
35
- secondWarningSilenceSeconds: { bsonType: "number" },
36
- secondWarningInstruction: { bsonType: "string" },
37
- disconnectSilenceSeconds: { bsonType: "number" },
38
- },
39
- additionalProperties: false,
40
- },
41
- liveTimeUpdates: { bsonType: "bool" },
42
- },
43
- additionalProperties: false,
44
- },
45
- interactions: {
46
- bsonType: "array",
47
- items: {
48
- bsonType: "object",
49
- required: ["id", "type", "text", "position"],
50
- properties: {
51
- id: { bsonType: "string" },
52
- type: { bsonType: "string" },
53
- text: { bsonType: "string" },
54
- successStatus: { bsonType: ["string", "null"] },
55
- conditions: {
56
- bsonType: ["array", "null"],
57
- items: {
58
- bsonType: "object",
59
- required: ["conditionString"],
60
- properties: {
61
- conditionString: { bsonType: "string" },
62
- nodeType: { bsonType: ["string", "null"] },
63
- id: { bsonType: ["string", "null"] },
64
- },
65
- },
66
- },
67
- defaultNodeType: { bsonType: ["string", "null"] },
68
- defaultChild: {
69
- bsonType: ["object", "null"],
70
- properties: { id: { bsonType: "string" } },
71
- },
72
- position: {
73
- bsonType: "object",
74
- required: ["x", "y"],
75
- properties: {
76
- x: { bsonType: "number" },
77
- y: { bsonType: "number" },
78
- },
79
- },
80
- name: { bsonType: ["string", "null"] },
81
- children: {
82
- bsonType: ["array", "null"],
83
- items: { bsonType: "string" },
84
- },
85
- resultsLabel: { bsonType: ["string", "null"] },
86
- resultsColor: { bsonType: ["string", "null"] },
87
- },
88
- },
89
- },
90
- edges: {
91
- bsonType: ["array", "null"],
92
- items: {
93
- bsonType: "object",
94
- required: ["id", "source", "target"],
95
- properties: {
96
- id: { bsonType: "string" },
97
- source: { bsonType: "string" },
98
- target: { bsonType: "string" },
99
- label: { bsonType: ["string", "null"] },
100
- },
101
- },
102
- },
103
- metaKeys: {
104
- bsonType: ["array", "null"],
105
- items: {
106
- bsonType: "object",
107
- required: ["key"],
108
- properties: {
109
- key: { bsonType: "string" },
110
- required: { bsonType: "bool" },
111
- },
112
- },
113
- },
114
- userProperties: {
115
- bsonType: ["array", "null"],
116
- items: {
117
- bsonType: "object",
118
- required: ["name", "description"],
119
- properties: {
120
- name: { bsonType: "string" },
121
- description: { bsonType: "string" },
122
- },
123
- },
124
- },
125
- tools: {
126
- bsonType: ["array", "null"],
127
- items: {
128
- bsonType: "object",
129
- required: ["id", "name", "url", "method", "parameters"],
130
- properties: {
131
- id: { bsonType: "string" },
132
- name: { bsonType: "string" },
133
- description: { bsonType: "string" },
134
- url: { bsonType: "string" },
135
- method: { bsonType: "string" },
136
- headers: { bsonType: "object" },
137
- parameters: { bsonType: "object" },
138
- bodyFormat: { bsonType: "string", enum: ["json", "form-data"] },
139
- preventAudioDuringTool: { bsonType: "bool" },
140
- sendUserAuthToken: { bsonType: "bool" },
141
- runInBackground: { bsonType: "bool" },
142
- backgroundToolType: {
143
- bsonType: "string",
144
- enum: ["backgroundToolAlways", "backgroundToolOnce"],
145
- },
146
- backgroundContinuationInstructions: { bsonType: 'string' },
147
- },
148
- additionalProperties: false,
149
- },
150
- },
151
- },
152
- additionalProperties: false,
153
- } as const;
1
+ export const flowMongoSchema = {
2
+ bsonType: "object",
3
+ required: [
4
+ "flowName",
5
+ "systemInstructions",
6
+ "initialSentence",
7
+ "interactions",
8
+ ],
9
+ properties: {
10
+ _id: { bsonType: "objectId" },
11
+ flowName: { bsonType: "string" },
12
+ clientId: { bsonType: "string" },
13
+ systemInstructions: { bsonType: "string" },
14
+ initialSentence: { bsonType: "string" },
15
+ voice: { bsonType: ["string", "null"] },
16
+ conversationSettings: {
17
+ bsonType: ["object", "null"],
18
+ properties: {
19
+ interruptions: {
20
+ bsonType: ["object", "null"],
21
+ properties: {
22
+ enableInterruptionDetection: { bsonType: "bool" },
23
+ interruptionWindowSeconds: { bsonType: "number" },
24
+ interruptionThresholdSeconds: { bsonType: "number" },
25
+ interruptionInstruction: { bsonType: "string" },
26
+ },
27
+ additionalProperties: false,
28
+ },
29
+ silence: {
30
+ bsonType: ["object", "null"],
31
+ properties: {
32
+ enableSilenceDetection: { bsonType: "bool" },
33
+ firstWarningSilenceSeconds: { bsonType: "number" },
34
+ firstWarningInstruction: { bsonType: "string" },
35
+ secondWarningSilenceSeconds: { bsonType: "number" },
36
+ secondWarningInstruction: { bsonType: "string" },
37
+ disconnectSilenceSeconds: { bsonType: "number" },
38
+ },
39
+ additionalProperties: false,
40
+ },
41
+ liveTimeUpdates: { bsonType: "bool" },
42
+ },
43
+ additionalProperties: false,
44
+ },
45
+ interactions: {
46
+ bsonType: "array",
47
+ items: {
48
+ bsonType: "object",
49
+ required: ["id", "type", "text", "position"],
50
+ properties: {
51
+ id: { bsonType: "string" },
52
+ type: { bsonType: "string" },
53
+ text: { bsonType: "string" },
54
+ successStatus: { bsonType: ["string", "null"] },
55
+ conditions: {
56
+ bsonType: ["array", "null"],
57
+ items: {
58
+ bsonType: "object",
59
+ required: ["conditionString"],
60
+ properties: {
61
+ conditionString: { bsonType: "string" },
62
+ nodeType: { bsonType: ["string", "null"] },
63
+ id: { bsonType: ["string", "null"] },
64
+ },
65
+ },
66
+ },
67
+ defaultNodeType: { bsonType: ["string", "null"] },
68
+ defaultChild: {
69
+ bsonType: ["object", "null"],
70
+ properties: { id: { bsonType: "string" } },
71
+ },
72
+ position: {
73
+ bsonType: "object",
74
+ required: ["x", "y"],
75
+ properties: {
76
+ x: { bsonType: "number" },
77
+ y: { bsonType: "number" },
78
+ },
79
+ },
80
+ name: { bsonType: ["string", "null"] },
81
+ children: {
82
+ bsonType: ["array", "null"],
83
+ items: { bsonType: "string" },
84
+ },
85
+ resultsLabel: { bsonType: ["string", "null"] },
86
+ resultsColor: { bsonType: ["string", "null"] },
87
+ },
88
+ },
89
+ },
90
+ edges: {
91
+ bsonType: ["array", "null"],
92
+ items: {
93
+ bsonType: "object",
94
+ required: ["id", "source", "target"],
95
+ properties: {
96
+ id: { bsonType: "string" },
97
+ source: { bsonType: "string" },
98
+ target: { bsonType: "string" },
99
+ label: { bsonType: ["string", "null"] },
100
+ },
101
+ },
102
+ },
103
+ metaKeys: {
104
+ bsonType: ["array", "null"],
105
+ items: {
106
+ bsonType: "object",
107
+ required: ["key"],
108
+ properties: {
109
+ key: { bsonType: "string" },
110
+ required: { bsonType: "bool" },
111
+ },
112
+ },
113
+ },
114
+ userProperties: {
115
+ bsonType: ["array", "null"],
116
+ items: {
117
+ bsonType: "object",
118
+ required: ["name", "description"],
119
+ properties: {
120
+ name: { bsonType: "string" },
121
+ description: { bsonType: "string" },
122
+ },
123
+ },
124
+ },
125
+ tools: {
126
+ bsonType: ["array", "null"],
127
+ items: {
128
+ bsonType: "object",
129
+ required: ["id", "name", "url", "method", "parameters"],
130
+ properties: {
131
+ id: { bsonType: "string" },
132
+ name: { bsonType: "string" },
133
+ description: { bsonType: "string" },
134
+ url: { bsonType: "string" },
135
+ method: { bsonType: "string" },
136
+ headers: { bsonType: "object" },
137
+ parameters: { bsonType: "object" },
138
+ bodyFormat: { bsonType: "string", enum: ["json", "form-data"] },
139
+ preventAudioDuringTool: { bsonType: "bool" },
140
+ sendUserAuthToken: { bsonType: "bool" },
141
+ runInBackground: { bsonType: "bool" },
142
+ backgroundToolType: {
143
+ bsonType: "string",
144
+ enum: ["backgroundToolAlways", "backgroundToolOnce"],
145
+ },
146
+ backgroundContinuationInstructions: { bsonType: 'string' },
147
+ },
148
+ additionalProperties: false,
149
+ },
150
+ },
151
+ },
152
+ additionalProperties: false,
153
+ } as const;
@@ -1,184 +1,184 @@
1
- import { ObjectId } from "mongodb";
2
-
3
- /* ---------- Basic helpers ---------- */
4
-
5
- export type Position = { x: number; y: number };
6
- export type HttpMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
7
-
8
- export type QuestionType = "open" | "multiple" | "table";
9
- export type SelectionType = "single" | "multiple";
10
-
11
- export type Question = {
12
- id: string;
13
- type: QuestionType;
14
- text: string;
15
- repeatAnswer?: boolean;
16
- // For 'multiple' type questions:
17
- answers?: string[] | null;
18
- selectionType?: SelectionType | null; // 'single' = choose one, 'multiple' = choose one or more
19
- // For 'table' type questions:
20
- tableHeader?: string | null;
21
- tableRows?: string[] | null;
22
- tableColumns?: string[] | null; // These are the answer options shared across all rows
23
- // Note: 'table' questions can also have selectionType to indicate if each row allows single or multiple selections
24
- };
25
-
26
- export type NodeKind =
27
- | "start"
28
- | "say"
29
- | "condition"
30
- | "improvise"
31
- | "tool"
32
- | "sendMessage"
33
- | "questionsList"
34
- | "end";
35
- type BaseNode = {
36
- id: string;
37
- type: NodeKind;
38
- text: string;
39
-
40
- name?: string | null;
41
- position: Position;
42
- children?: string[] | null;
43
- successStatus?: string | null;
44
- questions?: Question[] | null;
45
- };
46
-
47
- export type StartNode = BaseNode & { type: "start" };
48
-
49
- export type SayNode = BaseNode & { type: "say" };
50
-
51
- export type ConditionNode = BaseNode & {
52
- type: "condition";
53
- conditions: Array<{
54
- conditionString: string;
55
- nodeType?: string | null;
56
- id?: string | null;
57
- }>;
58
- defaultNodeType?: string | null;
59
- defaultChild?: { id?: string } | null;
60
- };
61
-
62
- export type ImproviseNode = BaseNode & { type: "improvise" };
63
-
64
- export type FlowTool = {
65
- id: string;
66
- name: string;
67
- description?: string;
68
- url: string;
69
- method: HttpMethod;
70
- headers?: Record<string, string>;
71
- parameters: Record<string, unknown>;
72
- bodyFormat?: "json" | "form-data";
73
- preventAudioDuringTool?: boolean;
74
- sendUserAuthToken?: boolean;
75
- runInBackground?: boolean;
76
- backgroundToolType?: "backgroundToolAlways" | "backgroundToolOnce";
77
- backgroundContinuationInstructions?: string;
78
- };
79
-
80
- export type SendMethod = "sms" | "whatsapp";
81
-
82
- export type SendMessageNode = BaseNode & {
83
- type: "sendMessage";
84
- /** Which channel to use. If omitted, decide at runtime (e.g., default to whatsapp). */
85
- send_method: SendMethod;
86
- /** Destination phone (E.164 or templated string like "{{userPhone}}"). */
87
- phone_number: string;
88
- };
89
-
90
- export type ToolNode = BaseNode & {
91
- type: "tool";
92
- name: string;
93
- text: string;
94
- };
95
-
96
- export type QuestionsListNode = BaseNode & {
97
- type: "questionsList";
98
- questions: Question[];
99
- };
100
-
101
- export type EndNode = BaseNode & { type: "end" };
102
-
103
- export type Interaction =
104
- | StartNode
105
- | SayNode
106
- | ConditionNode
107
- | ImproviseNode
108
- | ToolNode
109
- | SendMessageNode
110
- | QuestionsListNode
111
- | EndNode;
112
-
113
- export type Edge = {
114
- id: string;
115
- source: string;
116
- target: string;
117
- label?: string | null;
118
- };
119
-
120
- export type MetaKey = {
121
- key: string;
122
- required?: boolean;
123
- };
124
-
125
- export type UserProperty = {
126
- name: string;
127
- description: string;
128
- };
129
-
130
- export type InterruptionSettings = {
131
- enableInterruptionDetection?: boolean;
132
- interruptionWindowSeconds?: number;
133
- interruptionThresholdSeconds?: number;
134
- interruptionInstruction?: string;
135
- };
136
-
137
- export type SilenceEscalationSettings = {
138
- enableSilenceDetection?: boolean;
139
- firstWarningSilenceSeconds?: number;
140
- firstWarningInstruction?: string;
141
- secondWarningSilenceSeconds?: number;
142
- secondWarningInstruction?: string;
143
- disconnectSilenceSeconds?: number;
144
- silenceTimeoutSeconds?: number;
145
- };
146
-
147
- export type ConversationSettings = {
148
- interruptions?: InterruptionSettings;
149
- silence?: SilenceEscalationSettings;
150
- liveTimeUpdates?: boolean;
151
- };
152
-
153
- /* ---------- The Flow object ---------- */
154
-
155
- export type Flow = {
156
- freeTextContent?: string;
157
- isFreeText?: boolean;
158
- _id?: ObjectId;
159
-
160
- flowName: string;
161
- clientId: string;
162
-
163
- systemInstructions: string;
164
- initialSentence: string;
165
- voice?: string;
166
-
167
- insights: string[];
168
- conversationSettings?: ConversationSettings;
169
-
170
- interactions: Interaction[];
171
-
172
- edges?: Edge[] | null;
173
- metaKeys?: MetaKey[] | null;
174
- userProperties?: UserProperty[] | null;
175
- tools?: FlowTool[];
176
- afterCallEvent?: string;
177
-
178
- // AI provider configuration
179
- aiProvider?: any;
180
-
181
- // Timestamps
182
- createdAt?: Date;
183
- updatedAt?: Date;
184
- };
1
+ import { ObjectId } from "mongodb";
2
+
3
+ /* ---------- Basic helpers ---------- */
4
+
5
+ export type Position = { x: number; y: number };
6
+ export type HttpMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
7
+
8
+ export type QuestionType = "open" | "multiple" | "table";
9
+ export type SelectionType = "single" | "multiple";
10
+
11
+ export type Question = {
12
+ id: string;
13
+ type: QuestionType;
14
+ text: string;
15
+ repeatAnswer?: boolean;
16
+ // For 'multiple' type questions:
17
+ answers?: string[] | null;
18
+ selectionType?: SelectionType | null; // 'single' = choose one, 'multiple' = choose one or more
19
+ // For 'table' type questions:
20
+ tableHeader?: string | null;
21
+ tableRows?: string[] | null;
22
+ tableColumns?: string[] | null; // These are the answer options shared across all rows
23
+ // Note: 'table' questions can also have selectionType to indicate if each row allows single or multiple selections
24
+ };
25
+
26
+ export type NodeKind =
27
+ | "start"
28
+ | "say"
29
+ | "condition"
30
+ | "improvise"
31
+ | "tool"
32
+ | "sendMessage"
33
+ | "questionsList"
34
+ | "end";
35
+ type BaseNode = {
36
+ id: string;
37
+ type: NodeKind;
38
+ text: string;
39
+
40
+ name?: string | null;
41
+ position: Position;
42
+ children?: string[] | null;
43
+ successStatus?: string | null;
44
+ questions?: Question[] | null;
45
+ };
46
+
47
+ export type StartNode = BaseNode & { type: "start" };
48
+
49
+ export type SayNode = BaseNode & { type: "say" };
50
+
51
+ export type ConditionNode = BaseNode & {
52
+ type: "condition";
53
+ conditions: Array<{
54
+ conditionString: string;
55
+ nodeType?: string | null;
56
+ id?: string | null;
57
+ }>;
58
+ defaultNodeType?: string | null;
59
+ defaultChild?: { id?: string } | null;
60
+ };
61
+
62
+ export type ImproviseNode = BaseNode & { type: "improvise" };
63
+
64
+ export type FlowTool = {
65
+ id: string;
66
+ name: string;
67
+ description?: string;
68
+ url: string;
69
+ method: HttpMethod;
70
+ headers?: Record<string, string>;
71
+ parameters: Record<string, unknown>;
72
+ bodyFormat?: "json" | "form-data";
73
+ preventAudioDuringTool?: boolean;
74
+ sendUserAuthToken?: boolean;
75
+ runInBackground?: boolean;
76
+ backgroundToolType?: "backgroundToolAlways" | "backgroundToolOnce";
77
+ backgroundContinuationInstructions?: string;
78
+ };
79
+
80
+ export type SendMethod = "sms" | "whatsapp";
81
+
82
+ export type SendMessageNode = BaseNode & {
83
+ type: "sendMessage";
84
+ /** Which channel to use. If omitted, decide at runtime (e.g., default to whatsapp). */
85
+ send_method: SendMethod;
86
+ /** Destination phone (E.164 or templated string like "{{userPhone}}"). */
87
+ phone_number: string;
88
+ };
89
+
90
+ export type ToolNode = BaseNode & {
91
+ type: "tool";
92
+ name: string;
93
+ text: string;
94
+ };
95
+
96
+ export type QuestionsListNode = BaseNode & {
97
+ type: "questionsList";
98
+ questions: Question[];
99
+ };
100
+
101
+ export type EndNode = BaseNode & { type: "end" };
102
+
103
+ export type Interaction =
104
+ | StartNode
105
+ | SayNode
106
+ | ConditionNode
107
+ | ImproviseNode
108
+ | ToolNode
109
+ | SendMessageNode
110
+ | QuestionsListNode
111
+ | EndNode;
112
+
113
+ export type Edge = {
114
+ id: string;
115
+ source: string;
116
+ target: string;
117
+ label?: string | null;
118
+ };
119
+
120
+ export type MetaKey = {
121
+ key: string;
122
+ required?: boolean;
123
+ };
124
+
125
+ export type UserProperty = {
126
+ name: string;
127
+ description: string;
128
+ };
129
+
130
+ export type InterruptionSettings = {
131
+ enableInterruptionDetection?: boolean;
132
+ interruptionWindowSeconds?: number;
133
+ interruptionThresholdSeconds?: number;
134
+ interruptionInstruction?: string;
135
+ };
136
+
137
+ export type SilenceEscalationSettings = {
138
+ enableSilenceDetection?: boolean;
139
+ firstWarningSilenceSeconds?: number;
140
+ firstWarningInstruction?: string;
141
+ secondWarningSilenceSeconds?: number;
142
+ secondWarningInstruction?: string;
143
+ disconnectSilenceSeconds?: number;
144
+ silenceTimeoutSeconds?: number;
145
+ };
146
+
147
+ export type ConversationSettings = {
148
+ interruptions?: InterruptionSettings;
149
+ silence?: SilenceEscalationSettings;
150
+ liveTimeUpdates?: boolean;
151
+ };
152
+
153
+ /* ---------- The Flow object ---------- */
154
+
155
+ export type Flow = {
156
+ freeTextContent?: string;
157
+ isFreeText?: boolean;
158
+ _id?: ObjectId;
159
+
160
+ flowName: string;
161
+ clientId: string;
162
+
163
+ systemInstructions: string;
164
+ initialSentence: string;
165
+ voice?: string;
166
+
167
+ insights: string[];
168
+ conversationSettings?: ConversationSettings;
169
+
170
+ interactions: Interaction[];
171
+
172
+ edges?: Edge[] | null;
173
+ metaKeys?: MetaKey[] | null;
174
+ userProperties?: UserProperty[] | null;
175
+ tools?: FlowTool[];
176
+ afterCallEvent?: string;
177
+
178
+ // AI provider configuration
179
+ aiProvider?: any;
180
+
181
+ // Timestamps
182
+ createdAt?: Date;
183
+ updatedAt?: Date;
184
+ };