@talkpilot/core-db 1.3.5 → 1.3.7

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 (234) hide show
  1. package/.cursor/rules/development.mdc +65 -65
  2. package/DEVELOPMENT.md +141 -126
  3. package/README.md +190 -190
  4. package/README_OLD.md +160 -160
  5. package/dist/talkpilot/calls/calls.types.d.ts +5 -0
  6. package/dist/talkpilot/calls/calls.types.d.ts.map +1 -1
  7. package/dist/talkpilot/contextNotes/contextNotes.getters.d.ts +19 -0
  8. package/dist/talkpilot/contextNotes/contextNotes.getters.d.ts.map +1 -0
  9. package/dist/talkpilot/contextNotes/contextNotes.getters.js +57 -0
  10. package/dist/talkpilot/contextNotes/contextNotes.getters.js.map +1 -0
  11. package/dist/talkpilot/contextNotes/contextNotes.types.d.ts +19 -0
  12. package/dist/talkpilot/contextNotes/contextNotes.types.d.ts.map +1 -0
  13. package/dist/talkpilot/contextNotes/contextNotes.types.js +3 -0
  14. package/dist/talkpilot/contextNotes/contextNotes.types.js.map +1 -0
  15. package/dist/talkpilot/contextNotes/index.d.ts +3 -0
  16. package/dist/talkpilot/contextNotes/index.d.ts.map +1 -0
  17. package/dist/talkpilot/contextNotes/index.js +19 -0
  18. package/dist/talkpilot/contextNotes/index.js.map +1 -0
  19. package/dist/talkpilot/flows/flows.schema.d.ts +3 -0
  20. package/dist/talkpilot/flows/flows.schema.d.ts.map +1 -1
  21. package/dist/talkpilot/flows/flows.schema.js +1 -0
  22. package/dist/talkpilot/flows/flows.schema.js.map +1 -1
  23. package/dist/talkpilot/flows/flows.types.d.ts +2 -0
  24. package/dist/talkpilot/flows/flows.types.d.ts.map +1 -1
  25. package/dist/talkpilot/index.d.ts +2 -0
  26. package/dist/talkpilot/index.d.ts.map +1 -1
  27. package/dist/talkpilot/index.js +2 -0
  28. package/dist/talkpilot/index.js.map +1 -1
  29. package/dist/talkpilot/products/index.d.ts +3 -0
  30. package/dist/talkpilot/products/index.d.ts.map +1 -0
  31. package/dist/talkpilot/products/index.js +19 -0
  32. package/dist/talkpilot/products/index.js.map +1 -0
  33. package/dist/talkpilot/products/products.getters.d.ts +6 -0
  34. package/dist/talkpilot/products/products.getters.d.ts.map +1 -0
  35. package/dist/talkpilot/products/products.getters.js +14 -0
  36. package/dist/talkpilot/products/products.getters.js.map +1 -0
  37. package/dist/talkpilot/products/products.types.d.ts +9 -0
  38. package/dist/talkpilot/products/products.types.d.ts.map +1 -0
  39. package/dist/talkpilot/products/products.types.js +3 -0
  40. package/dist/talkpilot/products/products.types.js.map +1 -0
  41. package/dist/test-utils/factories/index.d.ts +1 -0
  42. package/dist/test-utils/factories/index.d.ts.map +1 -1
  43. package/dist/test-utils/factories/index.js +1 -0
  44. package/dist/test-utils/factories/index.js.map +1 -1
  45. package/dist/test-utils/factories/talkpilot/contextNotes.d.ts +16 -0
  46. package/dist/test-utils/factories/talkpilot/contextNotes.d.ts.map +1 -0
  47. package/dist/test-utils/factories/talkpilot/contextNotes.js +30 -0
  48. package/dist/test-utils/factories/talkpilot/contextNotes.js.map +1 -0
  49. package/jest.config.js +20 -19
  50. package/package.json +46 -46
  51. package/src/__tests__/setup.ts +20 -20
  52. package/src/connection.ts +54 -54
  53. package/src/index.ts +26 -26
  54. package/src/municipal/__tests__/validation.spec.ts +62 -62
  55. package/src/municipal/cities/cities.getters.ts +50 -50
  56. package/src/municipal/cities/cities.types.ts +11 -11
  57. package/src/municipal/cities/index.ts +2 -2
  58. package/src/municipal/departmentsSubjects/departmentsSubjects.getters.ts +282 -282
  59. package/src/municipal/departmentsSubjects/departmentsSubjects.types.ts +72 -72
  60. package/src/municipal/departmentsSubjects/index.ts +9 -9
  61. package/src/municipal/index.ts +22 -22
  62. package/src/municipal/mongodb-client.ts +61 -61
  63. package/src/municipal/muniIssues/__tests__/muniIssues.setters.spec.ts +92 -92
  64. package/src/municipal/muniIssues/__tests__/muniIssues.setup.spec.ts +92 -92
  65. package/src/municipal/muniIssues/index.ts +17 -17
  66. package/src/municipal/muniIssues/muniIssues.constants.ts +18 -18
  67. package/src/municipal/muniIssues/muniIssues.getters.ts +24 -24
  68. package/src/municipal/muniIssues/muniIssues.schema.ts +66 -66
  69. package/src/municipal/muniIssues/muniIssues.setters.ts +24 -24
  70. package/src/municipal/muniIssues/muniIssues.setup.ts +65 -65
  71. package/src/municipal/muniIssues/muniIssues.types.ts +37 -37
  72. package/src/municipal/streets/index.ts +2 -2
  73. package/src/municipal/streets/streets.getters.ts +125 -125
  74. package/src/municipal/streets/streets.types.ts +18 -18
  75. package/src/municipal/systemInstructions/__tests__/getters.spec.ts +113 -113
  76. package/src/municipal/systemInstructions/__tests__/setters.spec.ts +274 -274
  77. package/src/municipal/systemInstructions/index.ts +7 -7
  78. package/src/municipal/systemInstructions/instructions.getters.ts +57 -57
  79. package/src/municipal/systemInstructions/instructions.setters.ts +119 -119
  80. package/src/municipal/systemInstructions/instructions.types.ts +30 -30
  81. package/src/municipal/tickets/__tests__/tickets.getters.spec.ts +30 -30
  82. package/src/municipal/tickets/__tests__/tickets.statistics.spec.ts +51 -51
  83. package/src/municipal/tickets/index.ts +3 -3
  84. package/src/municipal/tickets/tickets.constants.ts +8 -8
  85. package/src/municipal/tickets/tickets.getters.ts +121 -121
  86. package/src/municipal/tickets/tickets.statistics.aggregation.ts +96 -96
  87. package/src/municipal/tickets/tickets.statistics.getters.ts +71 -71
  88. package/src/municipal/tickets/tickets.types.ts +53 -53
  89. package/src/municipal/utils/types.ts +11 -11
  90. package/src/talkpilot/__tests__/db.spec.ts +38 -38
  91. package/src/talkpilot/__tests__/mongodb-client.spec.ts +18 -18
  92. package/src/talkpilot/__tests__/validation.spec.ts +68 -68
  93. package/src/talkpilot/agents/__tests__/agents.getters.spec.ts +29 -29
  94. package/src/talkpilot/agents/agents.getters.ts +34 -34
  95. package/src/talkpilot/agents/agents.types.ts +14 -14
  96. package/src/talkpilot/agents/index.ts +2 -2
  97. package/src/talkpilot/backgroundToolResults/__tests__/backgroundToolResults.getters.spec.ts +147 -147
  98. package/src/talkpilot/backgroundToolResults/backgroundToolResults.getters.ts +65 -65
  99. package/src/talkpilot/backgroundToolResults/backgroundToolResults.types.ts +23 -23
  100. package/src/talkpilot/backgroundToolResults/index.ts +2 -2
  101. package/src/talkpilot/calls/__tests__/callStats.utils.spec.ts +128 -128
  102. package/src/talkpilot/calls/__tests__/calls.dashboard.spec.ts +149 -149
  103. package/src/talkpilot/calls/__tests__/calls.spec.ts +270 -270
  104. package/src/talkpilot/calls/__tests__/calls.statistics.spec.ts +344 -344
  105. package/src/talkpilot/calls/calls.constants.ts +20 -20
  106. package/src/talkpilot/calls/calls.getters.ts +248 -248
  107. package/src/talkpilot/calls/calls.statistics.getters.ts +587 -587
  108. package/src/talkpilot/calls/calls.statistics.types.ts +44 -44
  109. package/src/talkpilot/calls/calls.types.ts +119 -116
  110. package/src/talkpilot/calls/dashboard/calls.dashboard.ts +292 -292
  111. package/src/talkpilot/calls/dashboard/calls.dashboard.types.ts +57 -57
  112. package/src/talkpilot/calls/index.ts +6 -6
  113. package/src/talkpilot/clientAudioBuffers/__tests__/clientAudioBuffer.getters.spec.ts +160 -160
  114. package/src/talkpilot/clientAudioBuffers/clientAudioBuffer.getters.ts +117 -117
  115. package/src/talkpilot/clientAudioBuffers/clientsAudioBuffers.types.ts +25 -25
  116. package/src/talkpilot/clientAudioBuffers/index.ts +2 -2
  117. package/src/talkpilot/clients/clients.getters.ts +16 -16
  118. package/src/talkpilot/clients/clients.types.ts +14 -14
  119. package/src/talkpilot/clients/index.ts +2 -2
  120. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.getters.spec.ts +53 -53
  121. package/src/talkpilot/clientsConfig/__tests__/clientsConfig.spec.ts +190 -190
  122. package/src/talkpilot/clientsConfig/clientsConfig.getters.ts +55 -55
  123. package/src/talkpilot/clientsConfig/clientsConfig.types.ts +127 -127
  124. package/src/talkpilot/clientsConfig/index.ts +2 -2
  125. package/src/talkpilot/contextNotes/__tests__/contextNotes.getters.spec.ts +176 -0
  126. package/src/talkpilot/contextNotes/contextNotes.getters.ts +86 -0
  127. package/src/talkpilot/contextNotes/contextNotes.types.ts +20 -0
  128. package/src/talkpilot/contextNotes/index.ts +2 -0
  129. package/src/talkpilot/flows/__tests__/flows.schema.spec.ts +96 -71
  130. package/src/talkpilot/flows/flows.getter.ts +14 -14
  131. package/src/talkpilot/flows/flows.schema.ts +154 -153
  132. package/src/talkpilot/flows/flows.types.ts +187 -184
  133. package/src/talkpilot/flows/index.ts +2 -2
  134. package/src/talkpilot/groups/__tests__/groups.spec.ts +90 -90
  135. package/src/talkpilot/groups/__tests__/phone.utils.spec.ts +32 -32
  136. package/src/talkpilot/groups/groups.getters.ts +30 -30
  137. package/src/talkpilot/groups/groups.types.ts +29 -29
  138. package/src/talkpilot/groups/index.ts +3 -3
  139. package/src/talkpilot/groups/phone.utils.ts +46 -46
  140. package/src/talkpilot/index.ts +31 -29
  141. package/src/talkpilot/leads/index.ts +2 -2
  142. package/src/talkpilot/leads/leads.getter.ts +6 -6
  143. package/src/talkpilot/leads/leads.schema.ts +33 -33
  144. package/src/talkpilot/leads/leads.types.ts +20 -20
  145. package/src/talkpilot/mongodb-client.ts +78 -78
  146. package/src/talkpilot/phone_numbers/__tests__/phone_numbers.spec.ts +252 -252
  147. package/src/talkpilot/phone_numbers/index.ts +2 -2
  148. package/src/talkpilot/phone_numbers/phone_numbers.getter.ts +158 -158
  149. package/src/talkpilot/phone_numbers/phone_numbers.schema.ts +17 -17
  150. package/src/talkpilot/phone_numbers/phone_numbers.types.ts +30 -30
  151. package/src/talkpilot/plans/__tests__/plans.spec.ts +70 -70
  152. package/src/talkpilot/plans/index.ts +2 -2
  153. package/src/talkpilot/plans/plans.getters.ts +132 -132
  154. package/src/talkpilot/plans/plans.types.ts +89 -89
  155. package/src/talkpilot/products/__tests__/products.getters.spec.ts +45 -0
  156. package/src/talkpilot/products/index.ts +2 -0
  157. package/src/talkpilot/products/products.getters.ts +12 -0
  158. package/src/talkpilot/products/products.types.ts +9 -0
  159. package/src/talkpilot/results/index.ts +7 -7
  160. package/src/talkpilot/results/results.getter.ts +39 -39
  161. package/src/talkpilot/results/results.schema.ts +25 -25
  162. package/src/talkpilot/results/results.types.ts +34 -34
  163. package/src/talkpilot/retry_analyze/__tests__/retryAnalyze.getters.spec.ts +156 -156
  164. package/src/talkpilot/retry_analyze/index.ts +2 -2
  165. package/src/talkpilot/retry_analyze/retryAnalyze.getters.ts +84 -84
  166. package/src/talkpilot/retry_analyze/retryAnalyze.types.ts +13 -13
  167. package/src/talkpilot/sessions/__tests__/sessions.spec.ts +147 -147
  168. package/src/talkpilot/sessions/index.ts +2 -2
  169. package/src/talkpilot/sessions/sessions.getter.ts +92 -92
  170. package/src/talkpilot/sessions/sessions.schema.ts +34 -34
  171. package/src/talkpilot/sessions/sessions.types.ts +30 -30
  172. package/src/talkpilot/subscriptions/__tests__/subscriptions.getters.utils.spec.ts +45 -45
  173. package/src/talkpilot/subscriptions/index.ts +3 -3
  174. package/src/talkpilot/subscriptions/subscriptions.getters.ts +146 -146
  175. package/src/talkpilot/subscriptions/subscriptions.getters.utils.ts +33 -33
  176. package/src/talkpilot/subscriptions/subscriptions.types.ts +66 -66
  177. package/src/talkpilot/utils/__tests__/query.utils.spec.ts +49 -49
  178. package/src/talkpilot/utils/query.utils.ts +21 -21
  179. package/src/test-utils/db-utils.ts +26 -26
  180. package/src/test-utils/factories/index.ts +15 -14
  181. package/src/test-utils/factories/municipal/cities.ts +16 -16
  182. package/src/test-utils/factories/municipal/departmentsSubjects.ts +37 -37
  183. package/src/test-utils/factories/municipal/muniIssues.ts +32 -32
  184. package/src/test-utils/factories/municipal/streets.ts +22 -22
  185. package/src/test-utils/factories/municipal/tickets.ts +39 -39
  186. package/src/test-utils/factories/talkpilot/agents.ts +19 -19
  187. package/src/test-utils/factories/talkpilot/calls.ts +37 -37
  188. package/src/test-utils/factories/talkpilot/clientAudioBuffers.ts +20 -20
  189. package/src/test-utils/factories/talkpilot/clientsConfig.ts +18 -18
  190. package/src/test-utils/factories/talkpilot/contextNotes.ts +33 -0
  191. package/src/test-utils/factories/talkpilot/flows.ts +33 -33
  192. package/src/test-utils/factories/talkpilot/groups.ts +33 -33
  193. package/src/test-utils/factories/talkpilot/phone_numbers.ts +22 -22
  194. package/src/test-utils/factories/talkpilot/sessions.ts +35 -35
  195. package/src/test-utils/factories/websitalk/scans.ts +23 -23
  196. package/src/utils/date.utils.ts +116 -116
  197. package/src/utils/shared.types.ts +4 -4
  198. package/src/utils/validation.ts +23 -23
  199. package/src/websitalk/index.ts +15 -15
  200. package/src/websitalk/mongodb-client.ts +61 -61
  201. package/src/websitalk/scans/__tests__/scans.spec.ts +218 -218
  202. package/src/websitalk/scans/index.ts +2 -2
  203. package/src/websitalk/scans/scans.getters.ts +113 -113
  204. package/src/websitalk/scans/scans.types.ts +53 -53
  205. package/tsconfig.json +23 -23
  206. package/.claude/settings.local.json +0 -11
  207. package/dist/municipal/tickets/tickets.deprecated.getters.d.ts +0 -12
  208. package/dist/municipal/tickets/tickets.deprecated.getters.d.ts.map +0 -1
  209. package/dist/municipal/tickets/tickets.deprecated.getters.js +0 -131
  210. package/dist/municipal/tickets/tickets.deprecated.getters.js.map +0 -1
  211. package/dist/municipal/tickets/tickets.statistics.dates.d.ts +0 -7
  212. package/dist/municipal/tickets/tickets.statistics.dates.d.ts.map +0 -1
  213. package/dist/municipal/tickets/tickets.statistics.dates.js +0 -40
  214. package/dist/municipal/tickets/tickets.statistics.dates.js.map +0 -1
  215. package/dist/municipal/tickets/tickets.statistics.pipeline.d.ts +0 -53
  216. package/dist/municipal/tickets/tickets.statistics.pipeline.d.ts.map +0 -1
  217. package/dist/municipal/tickets/tickets.statistics.pipeline.js +0 -112
  218. package/dist/municipal/tickets/tickets.statistics.pipeline.js.map +0 -1
  219. package/dist/municipal/tickets/tickets.statistics.utils.d.ts +0 -7
  220. package/dist/municipal/tickets/tickets.statistics.utils.d.ts.map +0 -1
  221. package/dist/municipal/tickets/tickets.statistics.utils.js +0 -40
  222. package/dist/municipal/tickets/tickets.statistics.utils.js.map +0 -1
  223. package/dist/talkpilot/calls/calls.statistics.ticketScope.d.ts +0 -12
  224. package/dist/talkpilot/calls/calls.statistics.ticketScope.d.ts.map +0 -1
  225. package/dist/talkpilot/calls/calls.statistics.ticketScope.js +0 -37
  226. package/dist/talkpilot/calls/calls.statistics.ticketScope.js.map +0 -1
  227. package/dist/talkpilot/calls/calls.statistics.tickets.d.ts +0 -17
  228. package/dist/talkpilot/calls/calls.statistics.tickets.d.ts.map +0 -1
  229. package/dist/talkpilot/calls/calls.statistics.tickets.js +0 -33
  230. package/dist/talkpilot/calls/calls.statistics.tickets.js.map +0 -1
  231. package/dist/utils/statistics.aggregation.d.ts +0 -20
  232. package/dist/utils/statistics.aggregation.d.ts.map +0 -1
  233. package/dist/utils/statistics.aggregation.js +0 -43
  234. package/dist/utils/statistics.aggregation.js.map +0 -1
@@ -1,113 +1,113 @@
1
- import { Collection, Filter, ObjectId } from "mongodb";
2
- import { getDb } from "../index";
3
- import {
4
- applyQueryOptions,
5
- QueryOptions,
6
- } from "../../talkpilot/utils/query.utils";
7
- import type {
8
- ActiveScanStatus,
9
- Scan,
10
- ScanDoc,
11
- ScanStatus,
12
- } from "./scans.types";
13
-
14
- export const getScansCollection = (): Collection<Scan> => {
15
- return getDb().collection<Scan>("scans");
16
- };
17
-
18
- export const getScansByClientAndDateRange = (
19
- clientId: string,
20
- startDate: Date,
21
- endDate: Date,
22
- ): Promise<ScanDoc[]> => {
23
- return getScansCollection()
24
- .find({
25
- clientId,
26
- createdAt: {
27
- $gte: startDate,
28
- $lte: endDate,
29
- },
30
- })
31
- .toArray();
32
- };
33
-
34
- export const getScanFieldsByClientAndDateRange = <K extends keyof Scan>(
35
- clientId: string,
36
- startDate: Date,
37
- endDate: Date,
38
- fields: K[],
39
- ): Promise<Pick<ScanDoc, "_id" | K>[]> => {
40
- const projection = fields.reduce<Record<string, 1>>((acc, field) => {
41
- acc[field as string] = 1;
42
- return acc;
43
- }, {});
44
-
45
- return getScansCollection()
46
- .find(
47
- {
48
- clientId,
49
- createdAt: {
50
- $gte: startDate,
51
- $lte: endDate,
52
- },
53
- },
54
- { projection },
55
- )
56
- .toArray() as Promise<Pick<ScanDoc, "_id" | K>[]>;
57
- };
58
-
59
- export const createScanDoc = (
60
- scan: Pick<Scan, "clientId" | "baseUrl" | "notifyPhoneNumber">,
61
- ) => {
62
- return getScansCollection().insertOne({
63
- ...scan,
64
- status: "CHECKING",
65
- activeTasksCount: 0,
66
- pagesScanned: 0,
67
- pagesSkipped: 0,
68
- skipped: [],
69
- siteChrome: {} as Scan["siteChrome"],
70
- createdAt: new Date(),
71
- updatedAt: new Date(),
72
- });
73
- };
74
-
75
- const FINISHED_SCAN_STATUSES: ScanStatus[] = ["COMPLETED", "FAILED"];
76
-
77
- export const getActiveScanStatus = async (
78
- clientId: string,
79
- ): Promise<ActiveScanStatus> => {
80
- const latestScan = await getScansCollection().findOne(
81
- { clientId },
82
- { sort: { createdAt: -1 } },
83
- );
84
-
85
- if (!latestScan || FINISHED_SCAN_STATUSES.includes(latestScan.status)) {
86
- return { isActive: false };
87
- }
88
-
89
- return { isActive: true, status: latestScan.status };
90
- };
91
-
92
- export const updateScanDoc = async (
93
- scanId: ObjectId,
94
- updates: Partial<Omit<Scan, "clientId" | "createdAt">>,
95
- ): Promise<ScanDoc | null> => {
96
- return await getScansCollection().findOneAndUpdate(
97
- { _id: scanId },
98
- { $set: { ...updates, updatedAt: new Date() } },
99
- { returnDocument: "after" },
100
- );
101
- };
102
-
103
- export const findScansByQuery = async (
104
- query: Filter<Scan>,
105
- options?: QueryOptions,
106
- ): Promise<ScanDoc[]> => {
107
- const cursor = getScansCollection().find(query);
108
- return await applyQueryOptions(cursor, options).toArray();
109
- };
110
-
111
- export const countScans = async (query: Filter<Scan>): Promise<number> => {
112
- return getScansCollection().countDocuments(query);
113
- };
1
+ import { Collection, Filter, ObjectId } from "mongodb";
2
+ import { getDb } from "../index";
3
+ import {
4
+ applyQueryOptions,
5
+ QueryOptions,
6
+ } from "../../talkpilot/utils/query.utils";
7
+ import type {
8
+ ActiveScanStatus,
9
+ Scan,
10
+ ScanDoc,
11
+ ScanStatus,
12
+ } from "./scans.types";
13
+
14
+ export const getScansCollection = (): Collection<Scan> => {
15
+ return getDb().collection<Scan>("scans");
16
+ };
17
+
18
+ export const getScansByClientAndDateRange = (
19
+ clientId: string,
20
+ startDate: Date,
21
+ endDate: Date,
22
+ ): Promise<ScanDoc[]> => {
23
+ return getScansCollection()
24
+ .find({
25
+ clientId,
26
+ createdAt: {
27
+ $gte: startDate,
28
+ $lte: endDate,
29
+ },
30
+ })
31
+ .toArray();
32
+ };
33
+
34
+ export const getScanFieldsByClientAndDateRange = <K extends keyof Scan>(
35
+ clientId: string,
36
+ startDate: Date,
37
+ endDate: Date,
38
+ fields: K[],
39
+ ): Promise<Pick<ScanDoc, "_id" | K>[]> => {
40
+ const projection = fields.reduce<Record<string, 1>>((acc, field) => {
41
+ acc[field as string] = 1;
42
+ return acc;
43
+ }, {});
44
+
45
+ return getScansCollection()
46
+ .find(
47
+ {
48
+ clientId,
49
+ createdAt: {
50
+ $gte: startDate,
51
+ $lte: endDate,
52
+ },
53
+ },
54
+ { projection },
55
+ )
56
+ .toArray() as Promise<Pick<ScanDoc, "_id" | K>[]>;
57
+ };
58
+
59
+ export const createScanDoc = (
60
+ scan: Pick<Scan, "clientId" | "baseUrl" | "notifyPhoneNumber">,
61
+ ) => {
62
+ return getScansCollection().insertOne({
63
+ ...scan,
64
+ status: "CHECKING",
65
+ activeTasksCount: 0,
66
+ pagesScanned: 0,
67
+ pagesSkipped: 0,
68
+ skipped: [],
69
+ siteChrome: {} as Scan["siteChrome"],
70
+ createdAt: new Date(),
71
+ updatedAt: new Date(),
72
+ });
73
+ };
74
+
75
+ const FINISHED_SCAN_STATUSES: ScanStatus[] = ["COMPLETED", "FAILED"];
76
+
77
+ export const getActiveScanStatus = async (
78
+ clientId: string,
79
+ ): Promise<ActiveScanStatus> => {
80
+ const latestScan = await getScansCollection().findOne(
81
+ { clientId },
82
+ { sort: { createdAt: -1 } },
83
+ );
84
+
85
+ if (!latestScan || FINISHED_SCAN_STATUSES.includes(latestScan.status)) {
86
+ return { isActive: false };
87
+ }
88
+
89
+ return { isActive: true, status: latestScan.status };
90
+ };
91
+
92
+ export const updateScanDoc = async (
93
+ scanId: ObjectId,
94
+ updates: Partial<Omit<Scan, "clientId" | "createdAt">>,
95
+ ): Promise<ScanDoc | null> => {
96
+ return await getScansCollection().findOneAndUpdate(
97
+ { _id: scanId },
98
+ { $set: { ...updates, updatedAt: new Date() } },
99
+ { returnDocument: "after" },
100
+ );
101
+ };
102
+
103
+ export const findScansByQuery = async (
104
+ query: Filter<Scan>,
105
+ options?: QueryOptions,
106
+ ): Promise<ScanDoc[]> => {
107
+ const cursor = getScansCollection().find(query);
108
+ return await applyQueryOptions(cursor, options).toArray();
109
+ };
110
+
111
+ export const countScans = async (query: Filter<Scan>): Promise<number> => {
112
+ return getScansCollection().countDocuments(query);
113
+ };
@@ -1,53 +1,53 @@
1
- import { WithId } from "mongodb";
2
-
3
- export type ScanStatus =
4
- | "CHECKING"
5
- | "PREPARING"
6
- | "SCANNING"
7
- | "PROCESSING"
8
- | "COMPLETED"
9
- | "FAILED";
10
-
11
- export type ActiveScanStatus =
12
- | { isActive: true; status: ScanStatus }
13
- | { isActive: false };
14
-
15
- export type SiteChromeEntry = {
16
- url: string;
17
- urlCanonical?: string | null;
18
- title?: string | null;
19
- h1?: string | null;
20
- language?: string | null;
21
- sourceType?: string | null;
22
- status?: string | null;
23
- context?: string | null;
24
- contentHash?: string | null;
25
- errorMessage?: string | null;
26
- breadcrumbs?: unknown;
27
- description?: string | null;
28
- sourceUrl?: string | null;
29
- fetchedAt?: Date | null;
30
- createdAt?: Date;
31
- updatedAt?: Date;
32
- };
33
-
34
- export type SkippedEntry = {
35
- path: string;
36
- reason: string;
37
- };
38
-
39
- export type Scan = {
40
- clientId: string;
41
- baseUrl: string;
42
- notifyPhoneNumber?: string | null;
43
- status: ScanStatus;
44
- activeTasksCount: number;
45
- pagesScanned: number;
46
- pagesSkipped: number;
47
- skipped: SkippedEntry[];
48
- siteChrome: SiteChromeEntry;
49
- createdAt: Date;
50
- updatedAt: Date;
51
- };
52
-
53
- export type ScanDoc = WithId<Scan>;
1
+ import { WithId } from "mongodb";
2
+
3
+ export type ScanStatus =
4
+ | "CHECKING"
5
+ | "PREPARING"
6
+ | "SCANNING"
7
+ | "PROCESSING"
8
+ | "COMPLETED"
9
+ | "FAILED";
10
+
11
+ export type ActiveScanStatus =
12
+ | { isActive: true; status: ScanStatus }
13
+ | { isActive: false };
14
+
15
+ export type SiteChromeEntry = {
16
+ url: string;
17
+ urlCanonical?: string | null;
18
+ title?: string | null;
19
+ h1?: string | null;
20
+ language?: string | null;
21
+ sourceType?: string | null;
22
+ status?: string | null;
23
+ context?: string | null;
24
+ contentHash?: string | null;
25
+ errorMessage?: string | null;
26
+ breadcrumbs?: unknown;
27
+ description?: string | null;
28
+ sourceUrl?: string | null;
29
+ fetchedAt?: Date | null;
30
+ createdAt?: Date;
31
+ updatedAt?: Date;
32
+ };
33
+
34
+ export type SkippedEntry = {
35
+ path: string;
36
+ reason: string;
37
+ };
38
+
39
+ export type Scan = {
40
+ clientId: string;
41
+ baseUrl: string;
42
+ notifyPhoneNumber?: string | null;
43
+ status: ScanStatus;
44
+ activeTasksCount: number;
45
+ pagesScanned: number;
46
+ pagesSkipped: number;
47
+ skipped: SkippedEntry[];
48
+ siteChrome: SiteChromeEntry;
49
+ createdAt: Date;
50
+ updatedAt: Date;
51
+ };
52
+
53
+ export type ScanDoc = WithId<Scan>;
package/tsconfig.json CHANGED
@@ -1,23 +1,23 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "CommonJS",
5
- "moduleResolution": "node",
6
- "lib": ["ES2022"],
7
- "declaration": true,
8
- "declarationMap": true,
9
- "sourceMap": true,
10
- "outDir": "dist",
11
- "rootDir": "src",
12
- "strict": true,
13
- "esModuleInterop": true,
14
- "forceConsistentCasingInFileNames": true,
15
- "skipLibCheck": true,
16
- "resolveJsonModule": true,
17
- "experimentalDecorators": true,
18
- "emitDecoratorMetadata": true,
19
- "baseUrl": "."
20
- },
21
- "include": ["src/**/*"],
22
- "exclude": ["node_modules", "dist", "test", "**/*.test.ts", "**/__tests__/*", "**/*.spec.ts"]
23
- }
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "CommonJS",
5
+ "moduleResolution": "node",
6
+ "lib": ["ES2022"],
7
+ "declaration": true,
8
+ "declarationMap": true,
9
+ "sourceMap": true,
10
+ "outDir": "dist",
11
+ "rootDir": "src",
12
+ "strict": true,
13
+ "esModuleInterop": true,
14
+ "forceConsistentCasingInFileNames": true,
15
+ "skipLibCheck": true,
16
+ "resolveJsonModule": true,
17
+ "experimentalDecorators": true,
18
+ "emitDecoratorMetadata": true,
19
+ "baseUrl": "."
20
+ },
21
+ "include": ["src/**/*"],
22
+ "exclude": ["node_modules", "dist", "test", "**/*.test.ts", "**/__tests__/*", "**/*.spec.ts"]
23
+ }
@@ -1,11 +0,0 @@
1
- {
2
- "permissions": {
3
- "allow": [
4
- "Bash(npx jest *)",
5
- "Bash(git reset *)",
6
- "Bash(git tag *)",
7
- "Bash(node -p \"require\\('./package.json'\\).version\")",
8
- "Bash(echo \"version: $\\(node -p \"require\\('./package.json'\\).version\"\\)\")"
9
- ]
10
- }
11
- }
@@ -1,12 +0,0 @@
1
- import type { SubjectStatsItem } from "./tickets.types";
2
- /**
3
- * @deprecated Use `findCallSidsWithTicketsByCity` with `ticketStatsDateScopeFromYmd` instead.
4
- * Will be removed in 3.0.0.
5
- */
6
- export declare function getTicketsCountByCityAndDateRange(cityName: string, startStr: string, endStr: string, timezone: string): Promise<number>;
7
- /**
8
- * @deprecated Use `findFilteredCallSids` + `findSubjectsByCallSids` instead.
9
- * Will be removed in 3.0.0.
10
- */
11
- export declare function getTicketsSubjectStats(cityName: string, startStr: string, endStr: string, timezone: string): Promise<SubjectStatsItem[]>;
12
- //# sourceMappingURL=tickets.deprecated.getters.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tickets.deprecated.getters.d.ts","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.deprecated.getters.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD;;;GAGG;AACH,wBAAsB,iCAAiC,CACrD,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAoG7B"}
@@ -1,131 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getTicketsCountByCityAndDateRange = getTicketsCountByCityAndDateRange;
4
- exports.getTicketsSubjectStats = getTicketsSubjectStats;
5
- const tickets_getters_1 = require("./tickets.getters");
6
- /**
7
- * @deprecated Use `findCallSidsWithTicketsByCity` with `ticketStatsDateScopeFromYmd` instead.
8
- * Will be removed in 3.0.0.
9
- */
10
- async function getTicketsCountByCityAndDateRange(cityName, startStr, endStr, timezone) {
11
- const doc = await (0, tickets_getters_1.getTicketsCollection)()
12
- .aggregate([
13
- { $match: { cityName, callSid: { $exists: true, $nin: [null, ""] } } },
14
- {
15
- $addFields: {
16
- dateLocal: {
17
- $dateToString: { format: "%Y-%m-%d", date: "$createdAt", timezone },
18
- },
19
- },
20
- },
21
- { $match: { dateLocal: { $gte: startStr, $lte: endStr } } },
22
- { $count: "n" },
23
- ])
24
- .next();
25
- return doc?.n ?? 0;
26
- }
27
- /**
28
- * @deprecated Use `findFilteredCallSids` + `findSubjectsByCallSids` instead.
29
- * Will be removed in 3.0.0.
30
- */
31
- async function getTicketsSubjectStats(cityName, startStr, endStr, timezone) {
32
- const rows = await (0, tickets_getters_1.getTicketsCollection)()
33
- .aggregate([
34
- { $match: { cityName } },
35
- {
36
- $addFields: {
37
- dateLocal: {
38
- $dateToString: { format: "%Y-%m-%d", date: "$createdAt", timezone },
39
- },
40
- },
41
- },
42
- { $match: { dateLocal: { $gte: startStr, $lte: endStr } } },
43
- {
44
- $addFields: {
45
- effectiveSubjectId: {
46
- $ifNull: [
47
- "$externalCallFields.event_subject_id",
48
- {
49
- $ifNull: [
50
- "$externalCallFields.event_sub_subject_id",
51
- "$externalCallFields.event_sub_subject_id2",
52
- ],
53
- },
54
- ],
55
- },
56
- },
57
- },
58
- {
59
- $lookup: {
60
- from: "departmentsSubjects",
61
- let: { sid: "$effectiveSubjectId", c: cityName },
62
- pipeline: [
63
- {
64
- $match: {
65
- $expr: {
66
- $and: [
67
- { $eq: ["$cityName", "$$c"] },
68
- {
69
- $or: [
70
- { $eq: ["$subject_id", { $ifNull: ["$$sid", ""] }] },
71
- {
72
- $eq: ["$sub_subject_id", { $ifNull: ["$$sid", ""] }],
73
- },
74
- {
75
- $eq: ["$sub_subject_id2", { $ifNull: ["$$sid", ""] }],
76
- },
77
- ],
78
- },
79
- ],
80
- },
81
- },
82
- },
83
- { $limit: 1 },
84
- ],
85
- as: "subj",
86
- },
87
- },
88
- {
89
- $addFields: {
90
- subject_id: {
91
- $cond: {
92
- if: { $gt: [{ $size: "$subj" }, 0] },
93
- then: {
94
- $ifNull: [{ $arrayElemAt: ["$subj.subject_id", 0] }, ""],
95
- },
96
- else: "",
97
- },
98
- },
99
- subject: {
100
- $cond: {
101
- if: { $gt: [{ $size: "$subj" }, 0] },
102
- then: {
103
- $ifNull: [
104
- { $arrayElemAt: ["$subj.subjectName", 0] },
105
- "Unclassified",
106
- ],
107
- },
108
- else: "Unclassified",
109
- },
110
- },
111
- },
112
- },
113
- {
114
- $group: {
115
- _id: "$subject_id",
116
- subject: { $first: "$subject" },
117
- count: { $sum: 1 },
118
- },
119
- },
120
- { $sort: { count: -1 } },
121
- ])
122
- .toArray();
123
- const total = rows.reduce((sum, row) => sum + row.count, 0);
124
- return rows.map((row) => ({
125
- subject_name: row.subject,
126
- subject_id: row._id,
127
- count: row.count,
128
- percentage: total > 0 ? Math.round((row.count / total) * 100) : 0,
129
- }));
130
- }
131
- //# sourceMappingURL=tickets.deprecated.getters.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tickets.deprecated.getters.js","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.deprecated.getters.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- import type { TicketStatsDateScope } from "./tickets.types";
2
- export declare const resolveTicketStatsDateRange: (dateScope?: TicketStatsDateScope) => {
3
- from: Date;
4
- to: Date;
5
- };
6
- export declare const ticketStatsDateScopeFromYmd: (startStr: string, endStr: string, timezone: string) => TicketStatsDateScope;
7
- //# sourceMappingURL=tickets.statistics.dates.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tickets.statistics.dates.d.ts","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.dates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAiC5D,eAAO,MAAM,2BAA2B,GACtC,YAAY,oBAAoB,KAC/B;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,IAAI,CAAA;CAKxB,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,UAAU,MAAM,EAChB,QAAQ,MAAM,EACd,UAAU,MAAM,KACf,oBAGD,CAAC"}
@@ -1,40 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ticketStatsDateScopeFromYmd = exports.resolveTicketStatsDateRange = void 0;
4
- const DEFAULT_LOOKBACK_DAYS = 30;
5
- const DAY_MS = 24 * 60 * 60 * 1000;
6
- const formatYmdInTz = (date, timezone) => new Intl.DateTimeFormat("en-CA", { timeZone: timezone }).format(date);
7
- const dateAtNoonUtc = (dateStr) => {
8
- const [y, m, d] = dateStr.split("-").map(Number);
9
- return new Date(Date.UTC(y, m - 1, d, 12, 0, 0));
10
- };
11
- const startOfCalendarDayInTz = (dateStr, timezone) => {
12
- const anchor = dateAtNoonUtc(dateStr).getTime();
13
- let low = anchor - 2 * DAY_MS;
14
- let high = anchor + DAY_MS;
15
- while (high - low > 1) {
16
- const mid = Math.floor((low + high) / 2);
17
- if (formatYmdInTz(new Date(mid), timezone) >= dateStr)
18
- high = mid;
19
- else
20
- low = mid;
21
- }
22
- return new Date(high);
23
- };
24
- const endOfCalendarDayInTz = (dateStr, timezone) => {
25
- const [y, m, d] = dateStr.split("-").map(Number);
26
- const nextDay = new Date(Date.UTC(y, m - 1, d + 1)).toISOString().slice(0, 10);
27
- return new Date(startOfCalendarDayInTz(nextDay, timezone).getTime() - 1);
28
- };
29
- const resolveTicketStatsDateRange = (dateScope) => {
30
- const to = dateScope?.to ?? new Date();
31
- const from = dateScope?.from ?? new Date(to.getTime() - DEFAULT_LOOKBACK_DAYS * DAY_MS);
32
- return { from, to };
33
- };
34
- exports.resolveTicketStatsDateRange = resolveTicketStatsDateRange;
35
- const ticketStatsDateScopeFromYmd = (startStr, endStr, timezone) => ({
36
- from: startOfCalendarDayInTz(startStr, timezone),
37
- to: endOfCalendarDayInTz(endStr, timezone),
38
- });
39
- exports.ticketStatsDateScopeFromYmd = ticketStatsDateScopeFromYmd;
40
- //# sourceMappingURL=tickets.statistics.dates.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tickets.statistics.dates.js","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.dates.ts"],"names":[],"mappings":";;;AAEA,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACjC,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEnC,MAAM,aAAa,GAAG,CAAC,IAAU,EAAE,QAAgB,EAAU,EAAE,CAC7D,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAExE,MAAM,aAAa,GAAG,CAAC,OAAe,EAAQ,EAAE;IAC9C,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjD,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAAC,OAAe,EAAE,QAAgB,EAAQ,EAAE;IACzE,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IAChD,IAAI,GAAG,GAAG,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC;IAC9B,IAAI,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;IAE3B,OAAO,IAAI,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACzC,IAAI,aAAa,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,IAAI,OAAO;YAAE,IAAI,GAAG,GAAG,CAAC;;YAC7D,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,OAAe,EAAE,QAAgB,EAAQ,EAAE;IACvE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/E,OAAO,IAAI,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;AAC3E,CAAC,CAAC;AAEK,MAAM,2BAA2B,GAAG,CACzC,SAAgC,EACN,EAAE;IAC5B,MAAM,EAAE,GAAG,SAAS,EAAE,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC;IACvC,MAAM,IAAI,GACR,SAAS,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,qBAAqB,GAAG,MAAM,CAAC,CAAC;IAC7E,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACtB,CAAC,CAAC;AAPW,QAAA,2BAA2B,+BAOtC;AAEK,MAAM,2BAA2B,GAAG,CACzC,QAAgB,EAChB,MAAc,EACd,QAAgB,EACM,EAAE,CAAC,CAAC;IAC1B,IAAI,EAAE,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAChD,EAAE,EAAE,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC;CAC3C,CAAC,CAAC;AAPU,QAAA,2BAA2B,+BAOrC"}
@@ -1,53 +0,0 @@
1
- import { CityName } from "../utils/types";
2
- import type { SubjectItem, TicketStatsDateScope } from "./tickets.types";
3
- export declare const isDraftSubjectIdExpr: {
4
- $or: ({
5
- $eq: (string | {
6
- $type: string;
7
- })[];
8
- $regexMatch?: undefined;
9
- } | {
10
- $eq: (string | null)[];
11
- $regexMatch?: undefined;
12
- } | {
13
- $regexMatch: {
14
- input: {
15
- $ifNull: string[];
16
- };
17
- regex: RegExp;
18
- };
19
- $eq?: undefined;
20
- })[];
21
- };
22
- export declare const ticketsWithCallSidMatch: (cityName: CityName, dateScope?: TicketStatsDateScope) => {
23
- createdAt: {
24
- $gte: Date;
25
- $lte: Date;
26
- };
27
- cityName: string;
28
- callSid: {
29
- $exists: boolean;
30
- $nin: (string | null)[];
31
- };
32
- };
33
- export declare const ticketsByCallSidsMatch: (cityName: CityName, callSids: string[], dateScope?: TicketStatsDateScope) => {
34
- createdAt?: {
35
- $gte: Date;
36
- $lte: Date;
37
- } | undefined;
38
- cityName: string;
39
- callSid: {
40
- $in: string[];
41
- };
42
- };
43
- export declare const callSidGroupStages: () => Record<string, unknown>[];
44
- export declare const subjectGroupStages: (cityName: CityName, limit?: number) => Record<string, unknown>[];
45
- export declare const runTicketStatsAggregate: <T>(pipeline: Record<string, unknown>[]) => Promise<T[]>;
46
- export declare const mapCallSidRows: (rows: {
47
- _id: unknown;
48
- }[]) => string[];
49
- export declare const mapSubjectRows: (rows: {
50
- _id: unknown;
51
- count: number;
52
- }[]) => SubjectItem[];
53
- //# sourceMappingURL=tickets.statistics.pipeline.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tickets.statistics.pipeline.d.ts","sourceRoot":"","sources":["../../../src/municipal/tickets/tickets.statistics.pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAiBzE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;CAWhC,CAAC;AA4CF,eAAO,MAAM,uBAAuB,GAClC,UAAU,QAAQ,EAClB,YAAY,oBAAoB;;;;;;;;;;CAKhC,CAAC;AAEH,eAAO,MAAM,sBAAsB,GACjC,UAAU,QAAQ,EAClB,UAAU,MAAM,EAAE,EAClB,YAAY,oBAAoB;;;;;;;;;CAKhC,CAAC;AAEH,eAAO,MAAM,kBAAkB,QAAO,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAE5D,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,UAAU,QAAQ,EAClB,QAAQ,MAAM,KACb,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAUzB,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAU,CAAC,EAC7C,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAClC,OAAO,CAAC,CAAC,EAAE,CAKb,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,MAAM;IAAE,GAAG,EAAE,OAAO,CAAA;CAAE,EAAE,KAAG,MAAM,EAChB,CAAC;AAEjD,eAAO,MAAM,cAAc,GAAI,MAAM;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,KAAG,WAAW,EAMjF,CAAC"}