@calltelemetry/cli 0.6.12 → 0.7.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 (474) hide show
  1. package/dist/commands/appliance.d.ts +3 -0
  2. package/dist/commands/appliance.d.ts.map +1 -0
  3. package/dist/commands/appliance.js +99 -0
  4. package/dist/commands/appliance.js.map +1 -0
  5. package/dist/commands/config.d.ts.map +1 -1
  6. package/dist/commands/config.js +0 -42
  7. package/dist/commands/config.js.map +1 -1
  8. package/dist/commands/loadtest.d.ts.map +1 -1
  9. package/dist/commands/loadtest.js +214 -1
  10. package/dist/commands/loadtest.js.map +1 -1
  11. package/dist/commands/otel.d.ts +3 -0
  12. package/dist/commands/otel.d.ts.map +1 -0
  13. package/dist/commands/otel.js +89 -0
  14. package/dist/commands/otel.js.map +1 -0
  15. package/dist/commands/seed.d.ts +3 -0
  16. package/dist/commands/seed.d.ts.map +1 -0
  17. package/dist/commands/seed.js +106 -0
  18. package/dist/commands/seed.js.map +1 -0
  19. package/dist/commands/storage.d.ts +3 -0
  20. package/dist/commands/storage.d.ts.map +1 -0
  21. package/dist/commands/storage.js +66 -0
  22. package/dist/commands/storage.js.map +1 -0
  23. package/dist/commands/update.d.ts.map +1 -1
  24. package/dist/commands/update.js +19 -17
  25. package/dist/commands/update.js.map +1 -1
  26. package/dist/index.js +8 -0
  27. package/dist/index.js.map +1 -1
  28. package/dist/lib/migration-001-cgnat.d.ts +2 -0
  29. package/dist/lib/migration-001-cgnat.d.ts.map +1 -0
  30. package/dist/lib/migration-001-cgnat.js +59 -0
  31. package/dist/lib/migration-001-cgnat.js.map +1 -0
  32. package/dist/lib/migration-002-swap.d.ts +12 -0
  33. package/dist/lib/migration-002-swap.d.ts.map +1 -0
  34. package/dist/lib/migration-002-swap.js +103 -0
  35. package/dist/lib/migration-002-swap.js.map +1 -0
  36. package/dist/lib/migration-003-nm-heal.d.ts +12 -0
  37. package/dist/lib/migration-003-nm-heal.d.ts.map +1 -0
  38. package/dist/lib/migration-003-nm-heal.js +75 -0
  39. package/dist/lib/migration-003-nm-heal.js.map +1 -0
  40. package/dist/lib/migration-004-systemd-docker.d.ts +13 -0
  41. package/dist/lib/migration-004-systemd-docker.d.ts.map +1 -0
  42. package/dist/lib/migration-004-systemd-docker.js +48 -0
  43. package/dist/lib/migration-004-systemd-docker.js.map +1 -0
  44. package/dist/lib/migration-005-ssh-keys.d.ts +13 -0
  45. package/dist/lib/migration-005-ssh-keys.d.ts.map +1 -0
  46. package/dist/lib/migration-005-ssh-keys.js +49 -0
  47. package/dist/lib/migration-005-ssh-keys.js.map +1 -0
  48. package/dist/lib/migration-006-console-loglevel.d.ts +10 -0
  49. package/dist/lib/migration-006-console-loglevel.d.ts.map +1 -0
  50. package/dist/lib/migration-006-console-loglevel.js +27 -0
  51. package/dist/lib/migration-006-console-loglevel.js.map +1 -0
  52. package/dist/lib/migration-007-nm-keyfile.d.ts +10 -0
  53. package/dist/lib/migration-007-nm-keyfile.d.ts.map +1 -0
  54. package/dist/lib/migration-007-nm-keyfile.js +30 -0
  55. package/dist/lib/migration-007-nm-keyfile.js.map +1 -0
  56. package/dist/lib/migration-008-systemd-restart.d.ts +13 -0
  57. package/dist/lib/migration-008-systemd-restart.d.ts.map +1 -0
  58. package/dist/lib/migration-008-systemd-restart.js +41 -0
  59. package/dist/lib/migration-008-systemd-restart.js.map +1 -0
  60. package/dist/lib/migration-009-bind-mount-files.d.ts +11 -0
  61. package/dist/lib/migration-009-bind-mount-files.d.ts.map +1 -0
  62. package/dist/lib/migration-009-bind-mount-files.js +86 -0
  63. package/dist/lib/migration-009-bind-mount-files.js.map +1 -0
  64. package/dist/lib/migration-010-jtapi-state.d.ts +11 -0
  65. package/dist/lib/migration-010-jtapi-state.d.ts.map +1 -0
  66. package/dist/lib/migration-010-jtapi-state.js +61 -0
  67. package/dist/lib/migration-010-jtapi-state.js.map +1 -0
  68. package/dist/lib/migration-011-docker-memory-limit.d.ts +13 -0
  69. package/dist/lib/migration-011-docker-memory-limit.d.ts.map +1 -0
  70. package/dist/lib/migration-011-docker-memory-limit.js +45 -0
  71. package/dist/lib/migration-011-docker-memory-limit.js.map +1 -0
  72. package/dist/lib/migration-012-db-pool-sizes.d.ts +12 -0
  73. package/dist/lib/migration-012-db-pool-sizes.d.ts.map +1 -0
  74. package/dist/lib/migration-012-db-pool-sizes.js +64 -0
  75. package/dist/lib/migration-012-db-pool-sizes.js.map +1 -0
  76. package/dist/lib/migration-013-grafana-password.d.ts +15 -0
  77. package/dist/lib/migration-013-grafana-password.d.ts.map +1 -0
  78. package/dist/lib/migration-013-grafana-password.js +80 -0
  79. package/dist/lib/migration-013-grafana-password.js.map +1 -0
  80. package/dist/lib/migration-014-docker-firewall-backend.d.ts +16 -0
  81. package/dist/lib/migration-014-docker-firewall-backend.d.ts.map +1 -0
  82. package/dist/lib/migration-014-docker-firewall-backend.js +72 -0
  83. package/dist/lib/migration-014-docker-firewall-backend.js.map +1 -0
  84. package/dist/lib/migrations.d.ts +42 -0
  85. package/dist/lib/migrations.d.ts.map +1 -0
  86. package/dist/lib/migrations.js +231 -0
  87. package/dist/lib/migrations.js.map +1 -0
  88. package/dist/lib/otel.d.ts +7 -7
  89. package/dist/lib/otel.d.ts.map +1 -1
  90. package/dist/lib/otel.js +18 -25
  91. package/dist/lib/otel.js.map +1 -1
  92. package/dist/lib/prefs.d.ts +1 -0
  93. package/dist/lib/prefs.d.ts.map +1 -1
  94. package/dist/lib/prefs.js +1 -0
  95. package/dist/lib/prefs.js.map +1 -1
  96. package/dist/lib/prompts.d.ts +3 -0
  97. package/dist/lib/prompts.d.ts.map +1 -0
  98. package/dist/lib/prompts.js +39 -0
  99. package/dist/lib/prompts.js.map +1 -0
  100. package/dist/lib/rpc-scripts.d.ts +4 -0
  101. package/dist/lib/rpc-scripts.d.ts.map +1 -1
  102. package/dist/lib/rpc-scripts.js +235 -0
  103. package/dist/lib/rpc-scripts.js.map +1 -1
  104. package/dist/lib/secrets.d.ts +2 -2
  105. package/dist/lib/secrets.d.ts.map +1 -1
  106. package/dist/lib/secrets.js +2 -1
  107. package/dist/lib/secrets.js.map +1 -1
  108. package/dist/lib/seed/connection.d.ts +5 -0
  109. package/dist/lib/seed/connection.d.ts.map +1 -0
  110. package/dist/lib/seed/connection.js +168 -0
  111. package/dist/lib/seed/connection.js.map +1 -0
  112. package/dist/lib/seed/copy.d.ts +4 -0
  113. package/dist/lib/seed/copy.d.ts.map +1 -0
  114. package/dist/lib/seed/copy.js +74 -0
  115. package/dist/lib/seed/copy.js.map +1 -0
  116. package/dist/lib/seed/dashboard-templates.d.ts +22 -0
  117. package/dist/lib/seed/dashboard-templates.d.ts.map +1 -0
  118. package/dist/lib/seed/dashboard-templates.js +268 -0
  119. package/dist/lib/seed/dashboard-templates.js.map +1 -0
  120. package/dist/lib/seed/families.d.ts +5 -0
  121. package/dist/lib/seed/families.d.ts.map +1 -0
  122. package/dist/lib/seed/families.js +1541 -0
  123. package/dist/lib/seed/families.js.map +1 -0
  124. package/dist/lib/seed/index.d.ts +12 -0
  125. package/dist/lib/seed/index.d.ts.map +1 -0
  126. package/dist/lib/seed/index.js +327 -0
  127. package/dist/lib/seed/index.js.map +1 -0
  128. package/dist/lib/seed/presets.d.ts +5 -0
  129. package/dist/lib/seed/presets.d.ts.map +1 -0
  130. package/dist/lib/seed/presets.js +114 -0
  131. package/dist/lib/seed/presets.js.map +1 -0
  132. package/dist/lib/seed/schema/columns.d.ts +35 -0
  133. package/dist/lib/seed/schema/columns.d.ts.map +1 -0
  134. package/dist/lib/seed/schema/columns.js +497 -0
  135. package/dist/lib/seed/schema/columns.js.map +1 -0
  136. package/dist/lib/seed/schema/fingerprint.d.ts +2 -0
  137. package/dist/lib/seed/schema/fingerprint.d.ts.map +1 -0
  138. package/dist/lib/seed/schema/fingerprint.js +4 -0
  139. package/dist/lib/seed/schema/fingerprint.js.map +1 -0
  140. package/dist/lib/seed/schema/index.d.ts +4 -0
  141. package/dist/lib/seed/schema/index.d.ts.map +1 -0
  142. package/dist/lib/seed/schema/index.js +6 -0
  143. package/dist/lib/seed/schema/index.js.map +1 -0
  144. package/dist/lib/seed/schema/spec.d.ts +8 -0
  145. package/dist/lib/seed/schema/spec.d.ts.map +1 -0
  146. package/dist/lib/seed/schema/spec.js +655 -0
  147. package/dist/lib/seed/schema/spec.js.map +1 -0
  148. package/dist/lib/seed/schema/tables.d.ts +132 -0
  149. package/dist/lib/seed/schema/tables.d.ts.map +1 -0
  150. package/dist/lib/seed/schema/tables.js +37 -0
  151. package/dist/lib/seed/schema/tables.js.map +1 -0
  152. package/dist/lib/seed/store.d.ts +26 -0
  153. package/dist/lib/seed/store.d.ts.map +1 -0
  154. package/dist/lib/seed/store.js +111 -0
  155. package/dist/lib/seed/store.js.map +1 -0
  156. package/dist/lib/seed/types.d.ts +71 -0
  157. package/dist/lib/seed/types.d.ts.map +1 -0
  158. package/dist/lib/seed/types.js +2 -0
  159. package/dist/lib/seed/types.js.map +1 -0
  160. package/dist/lib/storage.d.ts +4 -0
  161. package/dist/lib/storage.d.ts.map +1 -0
  162. package/dist/lib/storage.js +36 -0
  163. package/dist/lib/storage.js.map +1 -0
  164. package/dist/lib/update-steps.d.ts.map +1 -1
  165. package/dist/lib/update-steps.js +27 -0
  166. package/dist/lib/update-steps.js.map +1 -1
  167. package/dist/lib/update.d.ts.map +1 -1
  168. package/dist/lib/update.js +28 -2
  169. package/dist/lib/update.js.map +1 -1
  170. package/dist/lib/version.d.ts +1 -1
  171. package/dist/lib/version.d.ts.map +1 -1
  172. package/dist/lib/version.js +1 -1
  173. package/dist/lib/version.js.map +1 -1
  174. package/dist/lib/xcc-loadtest-types.d.ts +232 -0
  175. package/dist/lib/xcc-loadtest-types.d.ts.map +1 -0
  176. package/dist/lib/xcc-loadtest-types.js +2 -0
  177. package/dist/lib/xcc-loadtest-types.js.map +1 -0
  178. package/dist/lib/xcc-loadtest.d.ts +4 -0
  179. package/dist/lib/xcc-loadtest.d.ts.map +1 -0
  180. package/dist/lib/xcc-loadtest.js +616 -0
  181. package/dist/lib/xcc-loadtest.js.map +1 -0
  182. package/dist/lib/xcc-overlay.d.ts +3 -0
  183. package/dist/lib/xcc-overlay.d.ts.map +1 -0
  184. package/dist/lib/xcc-overlay.js +74 -0
  185. package/dist/lib/xcc-overlay.js.map +1 -0
  186. package/dist/lib/xcc-scenarios.d.ts +8 -0
  187. package/dist/lib/xcc-scenarios.d.ts.map +1 -0
  188. package/dist/lib/xcc-scenarios.js +129 -0
  189. package/dist/lib/xcc-scenarios.js.map +1 -0
  190. package/dist/lib/xcc-xml.d.ts +18 -0
  191. package/dist/lib/xcc-xml.d.ts.map +1 -0
  192. package/dist/lib/xcc-xml.js +210 -0
  193. package/dist/lib/xcc-xml.js.map +1 -0
  194. package/dist/shell/commands/appliance-migrations.d.ts +7 -0
  195. package/dist/shell/commands/appliance-migrations.d.ts.map +1 -0
  196. package/dist/shell/commands/appliance-migrations.js +128 -0
  197. package/dist/shell/commands/appliance-migrations.js.map +1 -0
  198. package/dist/shell/commands/appliance-performance.d.ts +36 -0
  199. package/dist/shell/commands/appliance-performance.d.ts.map +1 -0
  200. package/dist/shell/commands/appliance-performance.js +221 -0
  201. package/dist/shell/commands/appliance-performance.js.map +1 -0
  202. package/dist/shell/commands/config.d.ts.map +1 -1
  203. package/dist/shell/commands/config.js +6 -5
  204. package/dist/shell/commands/config.js.map +1 -1
  205. package/dist/shell/commands/connect.d.ts.map +1 -1
  206. package/dist/shell/commands/connect.js +3 -2
  207. package/dist/shell/commands/connect.js.map +1 -1
  208. package/dist/shell/commands/db.d.ts.map +1 -1
  209. package/dist/shell/commands/db.js +5 -4
  210. package/dist/shell/commands/db.js.map +1 -1
  211. package/dist/shell/commands/debug.d.ts.map +1 -1
  212. package/dist/shell/commands/debug.js +5 -4
  213. package/dist/shell/commands/debug.js.map +1 -1
  214. package/dist/shell/commands/diag.js +10 -10
  215. package/dist/shell/commands/diag.js.map +1 -1
  216. package/dist/shell/commands/registry.d.ts.map +1 -1
  217. package/dist/shell/commands/registry.js +74 -0
  218. package/dist/shell/commands/registry.js.map +1 -1
  219. package/dist/shell/commands/secrets.d.ts.map +1 -1
  220. package/dist/shell/commands/secrets.js +2 -1
  221. package/dist/shell/commands/secrets.js.map +1 -1
  222. package/dist/shell/commands/seed.d.ts +9 -0
  223. package/dist/shell/commands/seed.d.ts.map +1 -0
  224. package/dist/shell/commands/seed.js +197 -0
  225. package/dist/shell/commands/seed.js.map +1 -0
  226. package/dist/shell/commands/services.d.ts.map +1 -1
  227. package/dist/shell/commands/services.js +5 -4
  228. package/dist/shell/commands/services.js.map +1 -1
  229. package/dist/shell/commands/test.d.ts.map +1 -1
  230. package/dist/shell/commands/test.js +3 -2
  231. package/dist/shell/commands/test.js.map +1 -1
  232. package/dist/shell/commands/users.d.ts.map +1 -1
  233. package/dist/shell/commands/users.js +9 -2
  234. package/dist/shell/commands/users.js.map +1 -1
  235. package/dist/shell/network-onboarding.d.ts +29 -7
  236. package/dist/shell/network-onboarding.d.ts.map +1 -1
  237. package/dist/shell/network-onboarding.js +305 -88
  238. package/dist/shell/network-onboarding.js.map +1 -1
  239. package/dist/ui/components/ActionBar.d.ts +13 -0
  240. package/dist/ui/components/ActionBar.d.ts.map +1 -0
  241. package/dist/ui/components/ActionBar.js +7 -0
  242. package/dist/ui/components/ActionBar.js.map +1 -0
  243. package/dist/ui/components/AppShell.d.ts +6 -1
  244. package/dist/ui/components/AppShell.d.ts.map +1 -1
  245. package/dist/ui/components/AppShell.js +32 -10
  246. package/dist/ui/components/AppShell.js.map +1 -1
  247. package/dist/ui/components/DashboardBlock.d.ts +11 -0
  248. package/dist/ui/components/DashboardBlock.d.ts.map +1 -0
  249. package/dist/ui/components/DashboardBlock.js +6 -0
  250. package/dist/ui/components/DashboardBlock.js.map +1 -0
  251. package/dist/ui/components/DataTable.d.ts +6 -1
  252. package/dist/ui/components/DataTable.d.ts.map +1 -1
  253. package/dist/ui/components/DataTable.js +71 -7
  254. package/dist/ui/components/DataTable.js.map +1 -1
  255. package/dist/ui/components/ErrorBoundary.d.ts +1 -1
  256. package/dist/ui/components/FieldList.d.ts +24 -0
  257. package/dist/ui/components/FieldList.d.ts.map +1 -0
  258. package/dist/ui/components/FieldList.js +67 -0
  259. package/dist/ui/components/FieldList.js.map +1 -0
  260. package/dist/ui/components/KeyValue.d.ts +4 -2
  261. package/dist/ui/components/KeyValue.d.ts.map +1 -1
  262. package/dist/ui/components/KeyValue.js +4 -2
  263. package/dist/ui/components/KeyValue.js.map +1 -1
  264. package/dist/ui/components/KeyboardHint.d.ts +10 -0
  265. package/dist/ui/components/KeyboardHint.d.ts.map +1 -0
  266. package/dist/ui/components/KeyboardHint.js +6 -0
  267. package/dist/ui/components/KeyboardHint.js.map +1 -0
  268. package/dist/ui/components/MenuList.d.ts +10 -0
  269. package/dist/ui/components/MenuList.d.ts.map +1 -0
  270. package/dist/ui/components/MenuList.js +7 -0
  271. package/dist/ui/components/MenuList.js.map +1 -0
  272. package/dist/ui/components/MetricsFooter.d.ts +10 -7
  273. package/dist/ui/components/MetricsFooter.d.ts.map +1 -1
  274. package/dist/ui/components/MetricsFooter.js +16 -3
  275. package/dist/ui/components/MetricsFooter.js.map +1 -1
  276. package/dist/ui/components/PaneSection.d.ts +9 -0
  277. package/dist/ui/components/PaneSection.d.ts.map +1 -0
  278. package/dist/ui/components/PaneSection.js +6 -0
  279. package/dist/ui/components/PaneSection.js.map +1 -0
  280. package/dist/ui/components/PanelState.d.ts +8 -0
  281. package/dist/ui/components/PanelState.d.ts.map +1 -0
  282. package/dist/ui/components/PanelState.js +7 -0
  283. package/dist/ui/components/PanelState.js.map +1 -0
  284. package/dist/ui/components/ScrollViewport.d.ts +16 -0
  285. package/dist/ui/components/ScrollViewport.d.ts.map +1 -0
  286. package/dist/ui/components/ScrollViewport.js +54 -0
  287. package/dist/ui/components/ScrollViewport.js.map +1 -0
  288. package/dist/ui/components/Section.js +1 -1
  289. package/dist/ui/components/Section.js.map +1 -1
  290. package/dist/ui/components/SelectMenu.d.ts.map +1 -1
  291. package/dist/ui/components/SelectMenu.js +3 -3
  292. package/dist/ui/components/SelectMenu.js.map +1 -1
  293. package/dist/ui/components/ShellOutput.d.ts +2 -1
  294. package/dist/ui/components/ShellOutput.d.ts.map +1 -1
  295. package/dist/ui/components/ShellOutput.js +6 -2
  296. package/dist/ui/components/ShellOutput.js.map +1 -1
  297. package/dist/ui/components/SplitPane.d.ts +18 -0
  298. package/dist/ui/components/SplitPane.d.ts.map +1 -0
  299. package/dist/ui/components/SplitPane.js +9 -0
  300. package/dist/ui/components/SplitPane.js.map +1 -0
  301. package/dist/ui/components/StatusList.d.ts +18 -0
  302. package/dist/ui/components/StatusList.d.ts.map +1 -0
  303. package/dist/ui/components/StatusList.js +13 -0
  304. package/dist/ui/components/StatusList.js.map +1 -0
  305. package/dist/ui/components/SummaryStrip.d.ts +9 -0
  306. package/dist/ui/components/SummaryStrip.d.ts.map +1 -0
  307. package/dist/ui/components/SummaryStrip.js +6 -0
  308. package/dist/ui/components/SummaryStrip.js.map +1 -0
  309. package/dist/ui/components/app-shell-viewport.d.ts +7 -0
  310. package/dist/ui/components/app-shell-viewport.d.ts.map +1 -0
  311. package/dist/ui/components/app-shell-viewport.js +6 -0
  312. package/dist/ui/components/app-shell-viewport.js.map +1 -0
  313. package/dist/ui/components/index.d.ts +14 -0
  314. package/dist/ui/components/index.d.ts.map +1 -1
  315. package/dist/ui/components/index.js +12 -0
  316. package/dist/ui/components/index.js.map +1 -1
  317. package/dist/ui/context/MetricsContext.d.ts.map +1 -1
  318. package/dist/ui/context/MetricsContext.js +15 -12
  319. package/dist/ui/context/MetricsContext.js.map +1 -1
  320. package/dist/ui/hooks/index.d.ts +9 -1
  321. package/dist/ui/hooks/index.d.ts.map +1 -1
  322. package/dist/ui/hooks/index.js +7 -0
  323. package/dist/ui/hooks/index.js.map +1 -1
  324. package/dist/ui/hooks/useAsyncTask.d.ts +7 -1
  325. package/dist/ui/hooks/useAsyncTask.d.ts.map +1 -1
  326. package/dist/ui/hooks/useAsyncTask.js +30 -6
  327. package/dist/ui/hooks/useAsyncTask.js.map +1 -1
  328. package/dist/ui/hooks/useBoundedCursor.d.ts +7 -0
  329. package/dist/ui/hooks/useBoundedCursor.d.ts.map +1 -0
  330. package/dist/ui/hooks/useBoundedCursor.js +19 -0
  331. package/dist/ui/hooks/useBoundedCursor.js.map +1 -0
  332. package/dist/ui/hooks/useConfirmBackNav.d.ts +7 -0
  333. package/dist/ui/hooks/useConfirmBackNav.d.ts.map +1 -0
  334. package/dist/ui/hooks/useConfirmBackNav.js +10 -0
  335. package/dist/ui/hooks/useConfirmBackNav.js.map +1 -0
  336. package/dist/ui/hooks/useDismissKeys.d.ts +10 -0
  337. package/dist/ui/hooks/useDismissKeys.d.ts.map +1 -0
  338. package/dist/ui/hooks/useDismissKeys.js +17 -0
  339. package/dist/ui/hooks/useDismissKeys.js.map +1 -0
  340. package/dist/ui/hooks/useListCursor.d.ts +7 -0
  341. package/dist/ui/hooks/useListCursor.d.ts.map +1 -0
  342. package/dist/ui/hooks/useListCursor.js +29 -0
  343. package/dist/ui/hooks/useListCursor.js.map +1 -0
  344. package/dist/ui/hooks/useTwoPaneCursor.d.ts +12 -0
  345. package/dist/ui/hooks/useTwoPaneCursor.d.ts.map +1 -0
  346. package/dist/ui/hooks/useTwoPaneCursor.js +36 -0
  347. package/dist/ui/hooks/useTwoPaneCursor.js.map +1 -0
  348. package/dist/ui/hooks/useXccBackendOverlay.d.ts +9 -0
  349. package/dist/ui/hooks/useXccBackendOverlay.d.ts.map +1 -0
  350. package/dist/ui/hooks/useXccBackendOverlay.js +14 -0
  351. package/dist/ui/hooks/useXccBackendOverlay.js.map +1 -0
  352. package/dist/ui/hooks/useXccLoadTest.d.ts +11 -0
  353. package/dist/ui/hooks/useXccLoadTest.d.ts.map +1 -0
  354. package/dist/ui/hooks/useXccLoadTest.js +37 -0
  355. package/dist/ui/hooks/useXccLoadTest.js.map +1 -0
  356. package/dist/ui/palette.d.ts +23 -0
  357. package/dist/ui/palette.d.ts.map +1 -0
  358. package/dist/ui/palette.js +22 -0
  359. package/dist/ui/palette.js.map +1 -0
  360. package/dist/ui/views/DbHealthView.js +4 -4
  361. package/dist/ui/views/DbHealthView.js.map +1 -1
  362. package/dist/ui/views/DbSizeView.d.ts.map +1 -1
  363. package/dist/ui/views/DbSizeView.js +2 -2
  364. package/dist/ui/views/DbSizeView.js.map +1 -1
  365. package/dist/ui/views/DbTablesView.d.ts.map +1 -1
  366. package/dist/ui/views/DbTablesView.js +2 -2
  367. package/dist/ui/views/DbTablesView.js.map +1 -1
  368. package/dist/ui/views/DiagDatabaseView.d.ts.map +1 -1
  369. package/dist/ui/views/DiagDatabaseView.js +4 -3
  370. package/dist/ui/views/DiagDatabaseView.js.map +1 -1
  371. package/dist/ui/views/DiagNetworkView.js +2 -2
  372. package/dist/ui/views/DiagNetworkView.js.map +1 -1
  373. package/dist/ui/views/DiagServiceView.js +1 -1
  374. package/dist/ui/views/DiagServiceView.js.map +1 -1
  375. package/dist/ui/views/DockerPruneView.d.ts.map +1 -1
  376. package/dist/ui/views/DockerPruneView.js +4 -8
  377. package/dist/ui/views/DockerPruneView.js.map +1 -1
  378. package/dist/ui/views/K8sDeployView.d.ts.map +1 -1
  379. package/dist/ui/views/K8sDeployView.js +5 -5
  380. package/dist/ui/views/K8sDeployView.js.map +1 -1
  381. package/dist/ui/views/K8sServicesView.d.ts.map +1 -1
  382. package/dist/ui/views/K8sServicesView.js +6 -11
  383. package/dist/ui/views/K8sServicesView.js.map +1 -1
  384. package/dist/ui/views/K8sStatusView.d.ts.map +1 -1
  385. package/dist/ui/views/K8sStatusView.js +14 -19
  386. package/dist/ui/views/K8sStatusView.js.map +1 -1
  387. package/dist/ui/views/LoadTestConfigView.d.ts.map +1 -1
  388. package/dist/ui/views/LoadTestConfigView.js +45 -43
  389. package/dist/ui/views/LoadTestConfigView.js.map +1 -1
  390. package/dist/ui/views/LoadTestSummaryView.d.ts.map +1 -1
  391. package/dist/ui/views/LoadTestSummaryView.js +7 -2
  392. package/dist/ui/views/LoadTestSummaryView.js.map +1 -1
  393. package/dist/ui/views/MainMenu.d.ts.map +1 -1
  394. package/dist/ui/views/MainMenu.js +265 -55
  395. package/dist/ui/views/MainMenu.js.map +1 -1
  396. package/dist/ui/views/MigrateHistoryView.d.ts.map +1 -1
  397. package/dist/ui/views/MigrateHistoryView.js +11 -2
  398. package/dist/ui/views/MigrateHistoryView.js.map +1 -1
  399. package/dist/ui/views/MigrateRollbackView.d.ts.map +1 -1
  400. package/dist/ui/views/MigrateRollbackView.js +4 -8
  401. package/dist/ui/views/MigrateRollbackView.js.map +1 -1
  402. package/dist/ui/views/MigrateRunView.d.ts.map +1 -1
  403. package/dist/ui/views/MigrateRunView.js +4 -8
  404. package/dist/ui/views/MigrateRunView.js.map +1 -1
  405. package/dist/ui/views/MigrateStatusView.js +1 -1
  406. package/dist/ui/views/MigrateStatusView.js.map +1 -1
  407. package/dist/ui/views/MigrateWatchView.js +1 -1
  408. package/dist/ui/views/MigrateWatchView.js.map +1 -1
  409. package/dist/ui/views/OfflineApplyView.d.ts.map +1 -1
  410. package/dist/ui/views/OfflineApplyView.js +17 -7
  411. package/dist/ui/views/OfflineApplyView.js.map +1 -1
  412. package/dist/ui/views/OfflineDownloadView.d.ts.map +1 -1
  413. package/dist/ui/views/OfflineDownloadView.js +17 -7
  414. package/dist/ui/views/OfflineDownloadView.js.map +1 -1
  415. package/dist/ui/views/OfflineFetchView.d.ts.map +1 -1
  416. package/dist/ui/views/OfflineFetchView.js +17 -7
  417. package/dist/ui/views/OfflineFetchView.js.map +1 -1
  418. package/dist/ui/views/OfflineInspectView.d.ts.map +1 -1
  419. package/dist/ui/views/OfflineInspectView.js +17 -7
  420. package/dist/ui/views/OfflineInspectView.js.map +1 -1
  421. package/dist/ui/views/OsUpdatesEnableView.js +4 -4
  422. package/dist/ui/views/OsUpdatesEnableView.js.map +1 -1
  423. package/dist/ui/views/OsUpdatesLogView.js +1 -1
  424. package/dist/ui/views/OsUpdatesLogView.js.map +1 -1
  425. package/dist/ui/views/OsUpdatesStatusView.d.ts.map +1 -1
  426. package/dist/ui/views/OsUpdatesStatusView.js +12 -12
  427. package/dist/ui/views/OsUpdatesStatusView.js.map +1 -1
  428. package/dist/ui/views/PowerActionView.d.ts.map +1 -1
  429. package/dist/ui/views/PowerActionView.js +3 -8
  430. package/dist/ui/views/PowerActionView.js.map +1 -1
  431. package/dist/ui/views/SecretsResetPasswordView.d.ts.map +1 -1
  432. package/dist/ui/views/SecretsResetPasswordView.js +23 -7
  433. package/dist/ui/views/SecretsResetPasswordView.js.map +1 -1
  434. package/dist/ui/views/SecretsSetupView.d.ts.map +1 -1
  435. package/dist/ui/views/SecretsSetupView.js +39 -22
  436. package/dist/ui/views/SecretsSetupView.js.map +1 -1
  437. package/dist/ui/views/ServiceLogsView.d.ts.map +1 -1
  438. package/dist/ui/views/ServiceLogsView.js +9 -9
  439. package/dist/ui/views/ServiceLogsView.js.map +1 -1
  440. package/dist/ui/views/ServicesView.d.ts.map +1 -1
  441. package/dist/ui/views/ServicesView.js +51 -28
  442. package/dist/ui/views/ServicesView.js.map +1 -1
  443. package/dist/ui/views/SettingsView.d.ts.map +1 -1
  444. package/dist/ui/views/SettingsView.js +5 -4
  445. package/dist/ui/views/SettingsView.js.map +1 -1
  446. package/dist/ui/views/SetupWizardView.d.ts.map +1 -1
  447. package/dist/ui/views/SetupWizardView.js +37 -32
  448. package/dist/ui/views/SetupWizardView.js.map +1 -1
  449. package/dist/ui/views/StatusView.d.ts.map +1 -1
  450. package/dist/ui/views/StatusView.js +44 -31
  451. package/dist/ui/views/StatusView.js.map +1 -1
  452. package/dist/ui/views/UpdateView.d.ts.map +1 -1
  453. package/dist/ui/views/UpdateView.js +28 -14
  454. package/dist/ui/views/UpdateView.js.map +1 -1
  455. package/dist/ui/views/UserResetPasswordView.d.ts.map +1 -1
  456. package/dist/ui/views/UserResetPasswordView.js +26 -8
  457. package/dist/ui/views/UserResetPasswordView.js.map +1 -1
  458. package/dist/ui/views/XccLoadTestConfigView.d.ts +29 -0
  459. package/dist/ui/views/XccLoadTestConfigView.d.ts.map +1 -0
  460. package/dist/ui/views/XccLoadTestConfigView.js +210 -0
  461. package/dist/ui/views/XccLoadTestConfigView.js.map +1 -0
  462. package/dist/ui/views/XccLoadTestRunView.d.ts +9 -0
  463. package/dist/ui/views/XccLoadTestRunView.d.ts.map +1 -0
  464. package/dist/ui/views/XccLoadTestRunView.js +154 -0
  465. package/dist/ui/views/XccLoadTestRunView.js.map +1 -0
  466. package/dist/ui/views/XccLoadTestSummaryView.d.ts +9 -0
  467. package/dist/ui/views/XccLoadTestSummaryView.d.ts.map +1 -0
  468. package/dist/ui/views/XccLoadTestSummaryView.js +63 -0
  469. package/dist/ui/views/XccLoadTestSummaryView.js.map +1 -0
  470. package/dist/ui/views/XccLoadTestView.d.ts +8 -0
  471. package/dist/ui/views/XccLoadTestView.d.ts.map +1 -0
  472. package/dist/ui/views/XccLoadTestView.js +40 -0
  473. package/dist/ui/views/XccLoadTestView.js.map +1 -0
  474. package/package.json +6 -1
@@ -0,0 +1,1541 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { copyRows, reserveIds } from './copy.js';
3
+ import { DASHBOARD_TEMPLATE_FIXTURES } from './dashboard-templates.js';
4
+ import { TABLE_COLUMNS, SEED_TABLES } from './schema/index.js';
5
+ const DEVICE_NAMES = ['SEP001122334455', 'SEP00AABBCCDDEE', 'CSFAGENT01', 'TABREMOTE01'];
6
+ const PEER_IPS = ['10.10.10.10', '10.10.10.11', '10.20.20.20', '10.20.20.21'];
7
+ const MEDIA_TYPES = ['audio', 'voice'];
8
+ const FALLBACK_DEVICE_POOLS = ['Default', 'HQ-Pool', 'Remote-Office-East', 'Remote-Office-West'];
9
+ const FALLBACK_LOCATIONS = ['HQ-Floor1', 'HQ-Floor2', 'HQ-Floor3', 'Remote-East'];
10
+ const FALLBACK_MODELS = ['Cisco 8841', 'Cisco 8845', 'Cisco 8861'];
11
+ const FALLBACK_SUBNETS = ['10.10.1.0/24', '10.10.2.0/24', '10.20.1.0/24'];
12
+ function affectedRows(rowCount) {
13
+ return rowCount ?? 0;
14
+ }
15
+ function chunkSizeFor(count) {
16
+ if (count >= 100_000)
17
+ return 10_000;
18
+ if (count >= 10_000)
19
+ return 5_000;
20
+ return 1_000;
21
+ }
22
+ function pick(items, index) {
23
+ return items[index % items.length];
24
+ }
25
+ function randomPhone(prefix, seed) {
26
+ return `${prefix}${String(1_000_000 + (seed % 8_999_999)).padStart(7, '0')}`;
27
+ }
28
+ function randomIpv4(seed) {
29
+ return `10.${10 + (seed % 20)}.${20 + (seed % 30)}.${30 + (seed % 200)}`;
30
+ }
31
+ function randomDuration(seed) {
32
+ return 30 + (seed % 1800);
33
+ }
34
+ function timeSpread(days, offset) {
35
+ const now = Date.now();
36
+ const spanMs = days * 24 * 60 * 60 * 1000;
37
+ const delta = Math.floor((offset % Math.max(spanMs, 1)) / 1000) * 1000;
38
+ return new Date(now - delta);
39
+ }
40
+ function chunkRange(total, chunk) {
41
+ const ranges = [];
42
+ for (let offset = 0; offset < total; offset += chunk) {
43
+ ranges.push({ offset, size: Math.min(chunk, total - offset) });
44
+ }
45
+ return ranges;
46
+ }
47
+ function tableMeta(key) {
48
+ return {
49
+ tableName: SEED_TABLES[key].tableName,
50
+ sequenceName: SEED_TABLES[key].sequenceName,
51
+ columns: TABLE_COLUMNS[key],
52
+ };
53
+ }
54
+ async function insertControlRow(client, sql, values) {
55
+ const result = await client.query(sql, values);
56
+ return Number.parseInt(result.rows[0].id, 10);
57
+ }
58
+ async function createCdrIntegration(client, orgId, home, name) {
59
+ return insertControlRow(client, `
60
+ INSERT INTO public.cdr_integrations
61
+ (name, healthy, username, inserted_at, updated_at, org_id, home)
62
+ VALUES
63
+ ($1, true, $2, now(), now(), $3, $4)
64
+ RETURNING id
65
+ `, [name, name, orgId, home]);
66
+ }
67
+ async function createCallmanager(client, orgId, name) {
68
+ return insertControlRow(client, `
69
+ INSERT INTO public.callmanagers
70
+ (name, org_id, inserted_at, updated_at, enable_axl_sync, enable_ris_sync, enable_phone_query, ris_batch_size)
71
+ VALUES
72
+ ($1, $2, now(), now(), false, false, false, 100)
73
+ RETURNING id
74
+ `, [name, orgId]);
75
+ }
76
+ async function createCube(client, orgId, name) {
77
+ return insertControlRow(client, `
78
+ INSERT INTO public.cubes
79
+ (name, xcc_hostname, xcc_enabled, xcc_online, org_id, inserted_at, updated_at, application_name, xcc_mode, xcc_emulator)
80
+ VALUES
81
+ ($1, $2, true, true, $3, now(), now(), 'ct-seed', 'both', true)
82
+ RETURNING id
83
+ `, [name, `${name}.local`, orgId]);
84
+ }
85
+ async function copyChunked(client, key, rows) {
86
+ const meta = tableMeta(key);
87
+ await copyRows(client, meta.tableName, meta.columns, rows);
88
+ }
89
+ async function reserveChunkIds(client, key, count) {
90
+ const sequenceName = tableMeta(key).sequenceName;
91
+ if (!sequenceName) {
92
+ throw new Error(`Table '${key}' does not use a numeric sequence.`);
93
+ }
94
+ return reserveIds(client, sequenceName, count);
95
+ }
96
+ async function findExistingCallmanagerId(client, orgId) {
97
+ const result = await client.query(`
98
+ SELECT id
99
+ FROM public.callmanagers
100
+ WHERE org_id = $1
101
+ ORDER BY id ASC
102
+ LIMIT 1
103
+ `, [orgId]);
104
+ const value = result.rows[0]?.id;
105
+ return value ? Number.parseInt(value, 10) : null;
106
+ }
107
+ async function getOrCreateCallmanagerId(client, orgId, name) {
108
+ const existingId = await findExistingCallmanagerId(client, orgId);
109
+ if (existingId) {
110
+ return { id: existingId, created: false };
111
+ }
112
+ return {
113
+ id: await createCallmanager(client, orgId, name),
114
+ created: true,
115
+ };
116
+ }
117
+ async function queryWeightedDimension(client, sql, params, fallback) {
118
+ try {
119
+ const result = await client.query(sql, params);
120
+ const rows = result.rows.filter((row) => row.value);
121
+ if (rows.length > 0) {
122
+ const total = rows.reduce((sum, row) => sum + Number.parseInt(row.count, 10), 0);
123
+ if (total > 0) {
124
+ return rows.map((row) => ({
125
+ value: row.value,
126
+ weight: Number.parseInt(row.count, 10) / total,
127
+ }));
128
+ }
129
+ }
130
+ }
131
+ catch {
132
+ // Fall through to fallback values.
133
+ }
134
+ const weight = 1 / fallback.length;
135
+ return fallback.map((value) => ({ value, weight }));
136
+ }
137
+ async function queryPhoneCount(client, orgId) {
138
+ try {
139
+ const result = await client.query('SELECT COUNT(*)::bigint AS count FROM public.phones WHERE org_id = $1', [orgId]);
140
+ return Number.parseInt(result.rows[0]?.count ?? '0', 10);
141
+ }
142
+ catch {
143
+ return 0;
144
+ }
145
+ }
146
+ async function seedCurriEvents(client, ctx, plan) {
147
+ const chunk = chunkSizeFor(plan.count);
148
+ let inserted = 0;
149
+ for (const { offset, size } of chunkRange(plan.count, chunk)) {
150
+ const curriIds = await reserveChunkIds(client, 'curri_events', size);
151
+ const appIds = await reserveChunkIds(client, 'app_events', size);
152
+ const signalIds = await reserveChunkIds(client, 'reputation_signals', size);
153
+ const curriRows = [];
154
+ const appRows = [];
155
+ const signalRows = [];
156
+ for (let index = 0; index < size; index++) {
157
+ const seed = offset + index + 1;
158
+ const occurredAt = timeSpread(plan.days, seed * 90_000);
159
+ const action = seed % 4 === 0 ? 'block' : 'permit';
160
+ const curriId = curriIds[index];
161
+ curriRows.push({
162
+ id: curriId,
163
+ calling_number: randomPhone('+1408', seed),
164
+ called_number: randomPhone('+1650', seed * 3),
165
+ trigger_point_type: seed % 3 === 0 ? 'pre_call' : 'route_request',
166
+ calling_devicename: pick(DEVICE_NAMES, seed),
167
+ result: action === 'block' ? 'blocked' : 'permitted',
168
+ inserted_at: occurredAt,
169
+ updated_at: occurredAt,
170
+ action_taken: action,
171
+ org_id: ctx.orgId,
172
+ alert_variables: { ct_seed_run_id: ctx.runId, family: 'curri_events' },
173
+ applied_modifiers: action === 'block' ? {} : { calling_name: `Customer ${seed}` },
174
+ final_rendered_action: action,
175
+ response_time: 200_000 + (seed % 50_000),
176
+ processing_time: 80_000 + (seed % 25_000),
177
+ });
178
+ appRows.push({
179
+ id: appIds[index],
180
+ policy_action: action,
181
+ policy_reason: action === 'block' ? 'spam_score' : 'allow_list',
182
+ policy_destination: action === 'block' ? 'blocked' : 'routed',
183
+ policy_outcome: action === 'block' ? 'blocked' : 'permitted',
184
+ result: action === 'block' ? 'blocked' : 'success',
185
+ message: `ct-seed app event ${ctx.runId}`,
186
+ provider: 'ct-seed',
187
+ raw: { ct_seed_run_id: ctx.runId, family: 'curri_events' },
188
+ debug: { index: seed },
189
+ data: { callingNumber: randomPhone('+1408', seed) },
190
+ action,
191
+ org_id: ctx.orgId,
192
+ curri_event_id: curriId,
193
+ inserted_at: occurredAt,
194
+ updated_at: occurredAt,
195
+ });
196
+ signalRows.push({
197
+ id: signalIds[index],
198
+ org_id: ctx.orgId,
199
+ curri_event_id: curriId,
200
+ app_id: 0,
201
+ app_name: 'ct-seed',
202
+ provider_type: 'ct_seed',
203
+ signal_type: action === 'block' ? 'spam' : 'reputation',
204
+ score: action === 'block' ? 85 : 12,
205
+ classification: action === 'block' ? 'block' : 'allow',
206
+ weight: 1,
207
+ confidence: 0.9,
208
+ raw: { ct_seed_run_id: ctx.runId, family: 'curri_events' },
209
+ occurred_at: occurredAt,
210
+ inserted_at: occurredAt,
211
+ updated_at: occurredAt,
212
+ });
213
+ }
214
+ await copyChunked(client, 'curri_events', curriRows);
215
+ await copyChunked(client, 'app_events', appRows);
216
+ await copyChunked(client, 'reputation_signals', signalRows);
217
+ inserted += size;
218
+ }
219
+ return {
220
+ family: 'curri_events',
221
+ requestedCount: plan.count,
222
+ insertedCount: inserted,
223
+ details: {
224
+ runId: ctx.runId,
225
+ marker: ctx.marker,
226
+ },
227
+ };
228
+ }
229
+ function buildBaseCdrRow(id, integrationId, seed, occurredAt, duration, marker) {
230
+ const disconnectAt = new Date(occurredAt.getTime() + duration * 1000);
231
+ return {
232
+ id,
233
+ pkid: randomUUID(),
234
+ cdrRecordType: 1,
235
+ globalCallID_callManagerId: 1,
236
+ globalCallID_callId: 2_000_000 + seed,
237
+ origLegCallIdentifier: `orig-${seed}`,
238
+ destLegIdentifier: `dest-${seed}`,
239
+ dateTimeOrigination: occurredAt,
240
+ dateTimeConnect: occurredAt,
241
+ dateTimeDisconnect: disconnectAt,
242
+ duration,
243
+ callingPartyNumber: randomPhone('+1408', seed),
244
+ originalCalledPartyNumber: randomPhone('+1650', seed * 5),
245
+ finalCalledPartyNumber: randomPhone('+1310', seed * 7),
246
+ origIpAddr: randomIpv4(seed),
247
+ destIpAddr: randomIpv4(seed * 2),
248
+ origDeviceName: pick(DEVICE_NAMES, seed),
249
+ destDeviceName: pick(DEVICE_NAMES, seed + 1),
250
+ globalCallId_ClusterID: 'ct-seed',
251
+ comment: marker,
252
+ authCodeDescription: null,
253
+ clientMatterCode: null,
254
+ authorizationCodeValue: null,
255
+ cdr_integrations_id: integrationId,
256
+ inserted_at: occurredAt,
257
+ updated_at: occurredAt,
258
+ };
259
+ }
260
+ async function seedCdrRecords(client, ctx, plan) {
261
+ const familyMarker = `${ctx.marker}:cdr_records`;
262
+ const integrationHome = `/ct-seed/cdr/${ctx.runId}`;
263
+ const integrationId = await createCdrIntegration(client, ctx.orgId, integrationHome, `ct-seed-cdr-${ctx.runId}`);
264
+ const chunk = chunkSizeFor(plan.count);
265
+ let inserted = 0;
266
+ for (const { offset, size } of chunkRange(plan.count, chunk)) {
267
+ const ids = await reserveChunkIds(client, 'cdrcalls', size);
268
+ const rows = ids.map((id, index) => {
269
+ const seed = offset + index + 1;
270
+ const occurredAt = timeSpread(plan.days, seed * 150_000);
271
+ return buildBaseCdrRow(id, integrationId, seed, occurredAt, randomDuration(seed), familyMarker);
272
+ });
273
+ await copyChunked(client, 'cdrcalls', rows);
274
+ inserted += size;
275
+ }
276
+ return {
277
+ family: 'cdr_records',
278
+ requestedCount: plan.count,
279
+ insertedCount: inserted,
280
+ details: {
281
+ integrationHome,
282
+ marker: familyMarker,
283
+ },
284
+ };
285
+ }
286
+ async function seedMissedCalls(client, ctx, plan) {
287
+ const syncSource = `${ctx.marker}:missed_calls`;
288
+ const callmanagerName = `ct-seed-missed-${ctx.runId}`;
289
+ const callmanagerId = await createCallmanager(client, ctx.orgId, callmanagerName);
290
+ const userCount = Math.min(Math.max(Math.ceil(plan.count / 5), 10), 300);
291
+ const userIds = await reserveChunkIds(client, 'endusers', userCount);
292
+ const userRows = userIds.map((id, index) => {
293
+ const seed = index + 1;
294
+ return {
295
+ id,
296
+ first_name: `Missed${seed}`,
297
+ last_name: 'User',
298
+ extension: String(2000 + seed),
299
+ uuid: randomUUID(),
300
+ email: `missed-${ctx.runId}-${seed}@example.test`,
301
+ sync_source: syncSource,
302
+ smtp_alerts: true,
303
+ callmanager_id: callmanagerId,
304
+ inserted_at: ctx.startedAt,
305
+ updated_at: ctx.startedAt,
306
+ department: 'Support',
307
+ webex_alerts: false,
308
+ };
309
+ });
310
+ await copyChunked(client, 'endusers', userRows);
311
+ const chunk = chunkSizeFor(plan.count);
312
+ let inserted = 0;
313
+ for (const { offset, size } of chunkRange(plan.count, chunk)) {
314
+ const ids = await reserveChunkIds(client, 'cdr_event_logs', size);
315
+ const rows = ids.map((id, index) => {
316
+ const seed = offset + index + 1;
317
+ const occurredAt = timeSpread(plan.days, seed * 60_000);
318
+ return {
319
+ id,
320
+ event_type: 'missed_call',
321
+ calling_number: randomPhone('+1408', seed),
322
+ called_number: randomPhone('+1650', seed * 2),
323
+ action_taken: 'alert',
324
+ result: 'ct_seed',
325
+ org_id: ctx.orgId,
326
+ inserted_at: occurredAt,
327
+ updated_at: occurredAt,
328
+ end_user_id: pick(userIds, seed),
329
+ };
330
+ });
331
+ await copyChunked(client, 'cdr_event_logs', rows);
332
+ inserted += size;
333
+ }
334
+ return {
335
+ family: 'missed_calls',
336
+ requestedCount: plan.count,
337
+ insertedCount: inserted,
338
+ details: {
339
+ callmanagerName,
340
+ syncSource,
341
+ },
342
+ };
343
+ }
344
+ async function seedXccCalls(client, ctx, plan) {
345
+ const runId = ctx.runId;
346
+ const cubeName = `ct-seed-cube-${ctx.runId}`;
347
+ const cubeId = await createCube(client, ctx.orgId, cubeName);
348
+ const totalLogs = plan.count * 2;
349
+ const chunk = chunkSizeFor(totalLogs);
350
+ let insertedLogs = 0;
351
+ for (const { offset, size } of chunkRange(totalLogs, chunk)) {
352
+ const ids = await reserveChunkIds(client, 'cube_event_logs', size);
353
+ const rows = ids.map((id, index) => {
354
+ const seed = offset + index + 1;
355
+ const callSeed = Math.floor((offset + index) / 2) + 1;
356
+ const occurredAt = timeSpread(plan.days, seed * 70_000);
357
+ const disconnected = seed % 2 === 0;
358
+ return {
359
+ id,
360
+ event_type: disconnected ? 'disconnected' : 'connected',
361
+ status: disconnected ? 'completed' : 'connected',
362
+ details: { ct_seed_run_id: runId, family: 'xcc_calls' },
363
+ ip_address: pick(PEER_IPS, seed),
364
+ message: ctx.marker,
365
+ connection_id: `conn-${ctx.runId}-${callSeed}`,
366
+ call_id: `call-${ctx.runId}-${callSeed}`,
367
+ calling_number: randomPhone('+1408', callSeed),
368
+ called_number: randomPhone('+1650', callSeed * 4),
369
+ media_type: pick(MEDIA_TYPES, seed),
370
+ disconnect_reason: disconnected ? 'normal_call_clearing' : null,
371
+ retry_count: 0,
372
+ cube_id: cubeId,
373
+ inserted_at: occurredAt,
374
+ updated_at: occurredAt,
375
+ registration_id: `reg-${ctx.runId}`,
376
+ transaction_id: `txn-${ctx.runId}-${seed}`,
377
+ xcc_response: disconnected ? '<xcc status="ok"/>' : '<xcc status="ringing"/>',
378
+ new_calling_number: disconnected ? null : randomPhone('+1408', callSeed + 2),
379
+ xcc_disconnect_code: disconnected ? 16 : null,
380
+ request: `<request id="${seed}"/>`,
381
+ direction: callSeed % 2 === 0 ? 'outbound' : 'inbound',
382
+ curri_event_id: null,
383
+ };
384
+ });
385
+ await copyChunked(client, 'cube_event_logs', rows);
386
+ insertedLogs += size;
387
+ }
388
+ return {
389
+ family: 'xcc_calls',
390
+ requestedCount: plan.count,
391
+ insertedCount: plan.count,
392
+ details: {
393
+ cubeName,
394
+ runId,
395
+ logCount: insertedLogs,
396
+ },
397
+ };
398
+ }
399
+ async function seedFacCalls(client, ctx, plan) {
400
+ const familyMarker = `${ctx.marker}:fac_calls`;
401
+ const codes = ['SALES', 'SUPPORT', 'ENG', 'MKTG', 'FIN'];
402
+ const centerIds = await reserveChunkIds(client, 'fac_cost_centers', codes.length);
403
+ const assignmentIds = await reserveChunkIds(client, 'fac_code_cost_center_assignments', codes.length);
404
+ const effectiveFrom = ctx.startedAt;
405
+ const centerRows = centerIds.map((id, index) => ({
406
+ id,
407
+ org_id: ctx.orgId,
408
+ code: `CTFAC-${ctx.runId}-${index + 1}`,
409
+ name: `CT Seed FAC ${pick(codes, index)}`,
410
+ description: `ct-seed cost center ${ctx.runId}`,
411
+ department: pick(codes, index),
412
+ business_unit: 'ct-seed',
413
+ is_active: true,
414
+ effective_from: effectiveFrom,
415
+ notes: familyMarker,
416
+ inserted_at: ctx.startedAt,
417
+ updated_at: ctx.startedAt,
418
+ source: 'ct_seed',
419
+ sync_state: 'in_sync',
420
+ }));
421
+ const assignmentRows = assignmentIds.map((id, index) => ({
422
+ id,
423
+ fac_code: `FAC-${ctx.runId}-${index + 1}`,
424
+ cost_center_id: centerIds[index],
425
+ org_id: ctx.orgId,
426
+ is_active: true,
427
+ effective_from: effectiveFrom,
428
+ notes: familyMarker,
429
+ inserted_at: ctx.startedAt,
430
+ updated_at: ctx.startedAt,
431
+ source: 'ct_seed',
432
+ sync_state: 'in_sync',
433
+ }));
434
+ await copyChunked(client, 'fac_cost_centers', centerRows);
435
+ await copyChunked(client, 'fac_code_cost_center_assignments', assignmentRows);
436
+ const integrationHome = `/ct-seed/fac/${ctx.runId}`;
437
+ const integrationId = await createCdrIntegration(client, ctx.orgId, integrationHome, `ct-seed-fac-${ctx.runId}`);
438
+ const ids = await reserveChunkIds(client, 'cdrcalls', plan.count);
439
+ const rows = ids.map((id, index) => {
440
+ const seed = index + 1;
441
+ const occurredAt = timeSpread(plan.days, seed * 110_000);
442
+ const facCode = assignmentRows[index % assignmentRows.length].fac_code;
443
+ return {
444
+ ...buildBaseCdrRow(id, integrationId, seed, occurredAt, randomDuration(seed), familyMarker),
445
+ authCodeDescription: `ct-seed FAC ${facCode}`,
446
+ authorizationCodeValue: facCode,
447
+ };
448
+ });
449
+ await copyChunked(client, 'cdrcalls', rows);
450
+ return {
451
+ family: 'fac_calls',
452
+ requestedCount: plan.count,
453
+ insertedCount: plan.count,
454
+ details: {
455
+ integrationHome,
456
+ marker: familyMarker,
457
+ },
458
+ };
459
+ }
460
+ async function seedCmcCalls(client, ctx, plan) {
461
+ const familyMarker = `${ctx.marker}:cmc_calls`;
462
+ const clientCount = 4;
463
+ const clientIds = await reserveChunkIds(client, 'clients', clientCount);
464
+ const clientRows = clientIds.map((id, index) => ({
465
+ id,
466
+ org_id: ctx.orgId,
467
+ client_id: `CTCLIENT-${ctx.runId}-${index + 1}`,
468
+ client_name: `CT Seed Client ${index + 1}`,
469
+ description: familyMarker,
470
+ inserted_at: ctx.startedAt,
471
+ updated_at: ctx.startedAt,
472
+ }));
473
+ await copyChunked(client, 'clients', clientRows);
474
+ const codeCount = Math.max(8, Math.ceil(plan.count / 20));
475
+ const cmcIds = await reserveChunkIds(client, 'cmc_codes', codeCount);
476
+ const cmcRows = cmcIds.map((id, index) => ({
477
+ id,
478
+ org_id: ctx.orgId,
479
+ client_id: pick(clientIds, index),
480
+ cmc_code: `CMC-${ctx.runId}-${index + 1}`,
481
+ description: `ct-seed matter ${index + 1}`,
482
+ project_name: `Project ${index + 1}`,
483
+ matter_type: 'client_matter',
484
+ is_active: true,
485
+ effective_from: ctx.startedAt,
486
+ notes: familyMarker,
487
+ inserted_at: ctx.startedAt,
488
+ updated_at: ctx.startedAt,
489
+ }));
490
+ await copyChunked(client, 'cmc_codes', cmcRows);
491
+ const integrationHome = `/ct-seed/cmc/${ctx.runId}`;
492
+ const integrationId = await createCdrIntegration(client, ctx.orgId, integrationHome, `ct-seed-cmc-${ctx.runId}`);
493
+ const cdrIds = await reserveChunkIds(client, 'cdrcalls', plan.count);
494
+ const rows = cdrIds.map((id, index) => {
495
+ const seed = index + 1;
496
+ const occurredAt = timeSpread(plan.days, seed * 100_000);
497
+ const cmcCode = cmcRows[index % cmcRows.length].cmc_code;
498
+ return {
499
+ ...buildBaseCdrRow(id, integrationId, seed, occurredAt, randomDuration(seed), familyMarker),
500
+ authCodeDescription: `ct-seed CMC ${cmcCode}`,
501
+ clientMatterCode: cmcCode,
502
+ };
503
+ });
504
+ await copyChunked(client, 'cdrcalls', rows);
505
+ return {
506
+ family: 'cmc_calls',
507
+ requestedCount: plan.count,
508
+ insertedCount: plan.count,
509
+ details: {
510
+ integrationHome,
511
+ marker: familyMarker,
512
+ },
513
+ };
514
+ }
515
+ async function seedCostAllocation(client, ctx, plan) {
516
+ const familyMarker = `${ctx.marker}:cost_allocation`;
517
+ const rateTableIds = await reserveChunkIds(client, 'rate_tables', 2);
518
+ const rateRows = [
519
+ {
520
+ id: rateTableIds[0],
521
+ org_id: ctx.orgId,
522
+ name: `CT Seed Standard ${ctx.runId}`,
523
+ description: familyMarker,
524
+ priority: 100,
525
+ applies_to: 'all',
526
+ currency: 'USD',
527
+ is_active: true,
528
+ effective_from: ctx.startedAt,
529
+ inserted_at: ctx.startedAt,
530
+ updated_at: ctx.startedAt,
531
+ },
532
+ {
533
+ id: rateTableIds[1],
534
+ org_id: ctx.orgId,
535
+ name: `CT Seed Intl ${ctx.runId}`,
536
+ description: familyMarker,
537
+ priority: 90,
538
+ applies_to: 'all',
539
+ currency: 'USD',
540
+ is_active: true,
541
+ effective_from: ctx.startedAt,
542
+ inserted_at: ctx.startedAt,
543
+ updated_at: ctx.startedAt,
544
+ },
545
+ ];
546
+ await copyChunked(client, 'rate_tables', rateRows);
547
+ const multiplierIds = await reserveChunkIds(client, 'rate_time_multipliers', 4);
548
+ const multiplierRows = [
549
+ {
550
+ id: multiplierIds[0],
551
+ rate_table_id: rateTableIds[0],
552
+ name: `peak-${ctx.runId}`,
553
+ multiplier: 1.25,
554
+ start_time: '08:00:00',
555
+ end_time: '18:00:00',
556
+ days_of_week: [1, 2, 3, 4, 5],
557
+ priority: 100,
558
+ is_active: true,
559
+ inserted_at: ctx.startedAt,
560
+ updated_at: ctx.startedAt,
561
+ },
562
+ {
563
+ id: multiplierIds[1],
564
+ rate_table_id: rateTableIds[0],
565
+ name: `night-${ctx.runId}`,
566
+ multiplier: 0.8,
567
+ start_time: '18:00:00',
568
+ end_time: '23:59:00',
569
+ days_of_week: [1, 2, 3, 4, 5],
570
+ priority: 90,
571
+ is_active: true,
572
+ inserted_at: ctx.startedAt,
573
+ updated_at: ctx.startedAt,
574
+ },
575
+ {
576
+ id: multiplierIds[2],
577
+ rate_table_id: rateTableIds[1],
578
+ name: `weekend-${ctx.runId}`,
579
+ multiplier: 0.95,
580
+ start_time: '00:00:00',
581
+ end_time: '23:59:00',
582
+ days_of_week: [0, 6],
583
+ priority: 80,
584
+ is_active: true,
585
+ inserted_at: ctx.startedAt,
586
+ updated_at: ctx.startedAt,
587
+ },
588
+ {
589
+ id: multiplierIds[3],
590
+ rate_table_id: rateTableIds[1],
591
+ name: `intl-peak-${ctx.runId}`,
592
+ multiplier: 1.5,
593
+ start_time: '08:00:00',
594
+ end_time: '17:00:00',
595
+ days_of_week: [1, 2, 3, 4, 5],
596
+ priority: 110,
597
+ is_active: true,
598
+ inserted_at: ctx.startedAt,
599
+ updated_at: ctx.startedAt,
600
+ },
601
+ ];
602
+ await copyChunked(client, 'rate_time_multipliers', multiplierRows);
603
+ const ruleIds = await reserveChunkIds(client, 'costing_rules', 5);
604
+ const prefixes = ['+1', '+1408', '+1650', '+44', '+81'];
605
+ const ruleRows = ruleIds.map((id, index) => ({
606
+ id,
607
+ org_id: ctx.orgId,
608
+ dial_prefix: prefixes[index],
609
+ description: `ct-seed rule ${prefixes[index]}`,
610
+ rate_per_minute: index < 3 ? 0.03 : 0.09,
611
+ billing_increment: 60,
612
+ minimum_charge_duration: 0,
613
+ effective_from: ctx.startedAt,
614
+ is_active: true,
615
+ notes: familyMarker,
616
+ inserted_at: ctx.startedAt,
617
+ updated_at: ctx.startedAt,
618
+ initial_cost: 0,
619
+ initial_duration_seconds: 0,
620
+ incremental_cost: index < 3 ? 0.03 : 0.09,
621
+ rate_table_id: pick(rateTableIds, index),
622
+ }));
623
+ await copyChunked(client, 'costing_rules', ruleRows);
624
+ const integrationHome = `/ct-seed/cost/${ctx.runId}`;
625
+ const integrationId = await createCdrIntegration(client, ctx.orgId, integrationHome, `ct-seed-cost-${ctx.runId}`);
626
+ const cdrIds = await reserveChunkIds(client, 'cdrcalls', plan.count);
627
+ const rows = cdrIds.map((id, index) => {
628
+ const seed = index + 1;
629
+ const occurredAt = timeSpread(plan.days, seed * 95_000);
630
+ return buildBaseCdrRow(id, integrationId, seed, occurredAt, randomDuration(seed), familyMarker);
631
+ });
632
+ await copyChunked(client, 'cdrcalls', rows);
633
+ return {
634
+ family: 'cost_allocation',
635
+ requestedCount: plan.count,
636
+ insertedCount: plan.count,
637
+ details: {
638
+ integrationHome,
639
+ marker: familyMarker,
640
+ runId: ctx.runId,
641
+ },
642
+ };
643
+ }
644
+ function clampCount(value) {
645
+ return Math.max(0, Math.round(value));
646
+ }
647
+ function registrationNoise(seed) {
648
+ return 0.96 + ((seed % 11) / 100);
649
+ }
650
+ function registrationTimeMultiplier(hour) {
651
+ if (hour < 6)
652
+ return 0.62;
653
+ if (hour < 9)
654
+ return 0.82;
655
+ if (hour < 17)
656
+ return 1.0;
657
+ if (hour < 21)
658
+ return 0.9;
659
+ return 0.74;
660
+ }
661
+ function registrationWeekendMultiplier(dayIndex) {
662
+ return dayIndex === 0 || dayIndex === 6 ? 0.84 : 1.0;
663
+ }
664
+ async function seedRegistrationSnapshots(client, ctx, plan) {
665
+ const batchId = ctx.runId;
666
+ const callmanager = await getOrCreateCallmanagerId(client, ctx.orgId, `ct-seed-reg-${ctx.runId}`);
667
+ const callmanagerId = callmanager.id;
668
+ const phoneCount = await queryPhoneCount(client, ctx.orgId);
669
+ const basePhoneCount = Math.max(phoneCount, 500);
670
+ const devicePools = await queryWeightedDimension(client, `
671
+ SELECT COALESCE(NULLIF(device_pool, ''), 'Unknown') AS value, COUNT(*)::bigint AS count
672
+ FROM public.phones
673
+ WHERE org_id = $1
674
+ GROUP BY 1
675
+ ORDER BY 2 DESC
676
+ LIMIT 4
677
+ `, [ctx.orgId], FALLBACK_DEVICE_POOLS);
678
+ const locations = await queryWeightedDimension(client, `
679
+ SELECT COALESCE(NULLIF(location, ''), 'Unknown') AS value, COUNT(*)::bigint AS count
680
+ FROM public.phones
681
+ WHERE org_id = $1
682
+ GROUP BY 1
683
+ ORDER BY 2 DESC
684
+ LIMIT 4
685
+ `, [ctx.orgId], FALLBACK_LOCATIONS);
686
+ const models = await queryWeightedDimension(client, `
687
+ SELECT COALESCE(NULLIF(model, ''), 'Unknown') AS value, COUNT(*)::bigint AS count
688
+ FROM public.phones
689
+ WHERE org_id = $1
690
+ GROUP BY 1
691
+ ORDER BY 2 DESC
692
+ LIMIT 3
693
+ `, [ctx.orgId], FALLBACK_MODELS);
694
+ const subnets = await queryWeightedDimension(client, `
695
+ SELECT COALESCE(s.subnet_base || '/' || s.prefix::text, 'Unknown') AS value, COUNT(*)::bigint AS count
696
+ FROM public.phones p
697
+ LEFT JOIN public.subnets s ON s.id = p.subnet_id
698
+ WHERE p.org_id = $1
699
+ GROUP BY 1
700
+ ORDER BY 2 DESC
701
+ LIMIT 3
702
+ `, [ctx.orgId], FALLBACK_SUBNETS);
703
+ const rows = [];
704
+ const rowsPerSnapshot = 2 + devicePools.length + locations.length + models.length + subnets.length;
705
+ const snapshotSlots = Math.max(1, Math.ceil(plan.count / rowsPerSnapshot));
706
+ const now = new Date();
707
+ for (let slot = 0; slot < snapshotSlots && rows.length < plan.count; slot++) {
708
+ const snapshotAt = timeSpread(plan.days, slot * 3_600_000);
709
+ const hour = snapshotAt.getUTCHours();
710
+ const dayIndex = snapshotAt.getUTCDay();
711
+ const timeMultiplier = registrationTimeMultiplier(hour);
712
+ const weekendMultiplier = registrationWeekendMultiplier(dayIndex);
713
+ const trendMultiplier = 0.94 + (slot / Math.max(snapshotSlots, 1)) * 0.12;
714
+ const outageMultiplier = slot % 29 === 0 ? 0.72 : 1.0;
715
+ const totalCount = clampCount(basePhoneCount * timeMultiplier * weekendMultiplier * trendMultiplier * outageMultiplier * registrationNoise(slot + 1));
716
+ const registrationRate = outageMultiplier < 1 ? 0.74 : 0.93;
717
+ const registeredCount = clampCount(totalCount * registrationRate);
718
+ const unregisteredCount = Math.max(0, totalCount - registeredCount);
719
+ const slotRows = [];
720
+ const makeRow = (dimensionType, dimensionValue, countWeight, varianceSeed) => {
721
+ const weightedTotal = clampCount(totalCount * countWeight * registrationNoise(varianceSeed));
722
+ const weightedRegistered = clampCount(weightedTotal * registrationRate);
723
+ return {
724
+ id: 0,
725
+ org_id: ctx.orgId,
726
+ callmanager_id: callmanagerId,
727
+ batch_id: batchId,
728
+ dimension_type: dimensionType,
729
+ dimension_value: dimensionValue,
730
+ registered_count: weightedRegistered,
731
+ unregistered_count: Math.max(0, weightedTotal - weightedRegistered),
732
+ total_count: weightedTotal,
733
+ snapshot_at: snapshotAt,
734
+ inserted_at: now,
735
+ updated_at: now,
736
+ };
737
+ };
738
+ slotRows.push({
739
+ id: 0,
740
+ org_id: ctx.orgId,
741
+ callmanager_id: callmanagerId,
742
+ batch_id: batchId,
743
+ dimension_type: 'total',
744
+ dimension_value: '__all__',
745
+ registered_count: registeredCount,
746
+ unregistered_count: unregisteredCount,
747
+ total_count: totalCount,
748
+ snapshot_at: snapshotAt,
749
+ inserted_at: now,
750
+ updated_at: now,
751
+ });
752
+ slotRows.push({
753
+ id: 0,
754
+ org_id: ctx.orgId,
755
+ callmanager_id: callmanagerId,
756
+ batch_id: batchId,
757
+ dimension_type: 'callmanager',
758
+ dimension_value: String(callmanagerId),
759
+ registered_count: registeredCount,
760
+ unregistered_count: unregisteredCount,
761
+ total_count: totalCount,
762
+ snapshot_at: snapshotAt,
763
+ inserted_at: now,
764
+ updated_at: now,
765
+ });
766
+ devicePools.forEach((item, index) => {
767
+ slotRows.push(makeRow('device_pool', item.value, item.weight, slot + index + 10));
768
+ });
769
+ locations.forEach((item, index) => {
770
+ slotRows.push(makeRow('location', item.value, item.weight, slot + index + 20));
771
+ });
772
+ models.forEach((item, index) => {
773
+ slotRows.push(makeRow('model', item.value, item.weight, slot + index + 30));
774
+ });
775
+ subnets.forEach((item, index) => {
776
+ slotRows.push(makeRow('subnet', item.value, item.weight, slot + index + 40));
777
+ });
778
+ rows.push(...slotRows.slice(0, Math.max(0, plan.count - rows.length)));
779
+ }
780
+ const ids = await reserveChunkIds(client, 'phone_registration_snapshots', rows.length);
781
+ rows.forEach((row, index) => {
782
+ row.id = ids[index];
783
+ });
784
+ await copyChunked(client, 'phone_registration_snapshots', rows);
785
+ return {
786
+ family: 'registration_snapshots',
787
+ requestedCount: plan.count,
788
+ insertedCount: rows.length,
789
+ details: {
790
+ batchId,
791
+ callmanagerId,
792
+ createdCallmanager: callmanager.created,
793
+ },
794
+ };
795
+ }
796
+ async function seedDashboardTemplates(client, ctx, plan) {
797
+ const markerTag = `${ctx.marker}:dashboard_templates`;
798
+ const dashboardRows = [];
799
+ const widgetRows = [];
800
+ const selectedTemplates = DASHBOARD_TEMPLATE_FIXTURES.slice(0, plan.count);
801
+ for (const [templateIndex, template] of selectedTemplates.entries()) {
802
+ const dashboardId = randomUUID();
803
+ const insertedAt = new Date();
804
+ const shortRun = ctx.runId.slice(0, 8);
805
+ dashboardRows.push({
806
+ id: dashboardId,
807
+ name: `${template.name} (${shortRun})`,
808
+ description: `${template.description} [${markerTag}]`,
809
+ org_id: ctx.orgId,
810
+ created_by: null,
811
+ is_shared: template.isShared,
812
+ is_template: true,
813
+ layout_config: template.layoutConfig,
814
+ refresh_interval: template.refreshInterval,
815
+ tags: [...template.tags, 'ct_seed_template', markerTag],
816
+ lock_version: 1,
817
+ archived_at: null,
818
+ inserted_at: insertedAt,
819
+ updated_at: insertedAt,
820
+ share_token: null,
821
+ share_enabled: false,
822
+ });
823
+ template.widgets.forEach((widget, widgetIndex) => {
824
+ widgetRows.push({
825
+ id: randomUUID(),
826
+ dashboard_id: dashboardId,
827
+ title: widget.title,
828
+ widget_type: widget.widgetType,
829
+ display_mode: widget.displayMode,
830
+ layout: widget.layout,
831
+ report_config: widget.reportConfig,
832
+ chart_config: widget.chartConfig,
833
+ table_config: widget.tableConfig,
834
+ refresh_interval: widget.refreshInterval,
835
+ ignore_global_filters: widget.ignoreGlobalFilters,
836
+ sort_order: widget.sortOrder ?? widgetIndex,
837
+ inserted_at: insertedAt,
838
+ updated_at: insertedAt,
839
+ saved_report_id: null,
840
+ });
841
+ });
842
+ }
843
+ await copyChunked(client, 'dashboards', dashboardRows);
844
+ await copyChunked(client, 'dashboard_widgets', widgetRows);
845
+ return {
846
+ family: 'dashboard_templates',
847
+ requestedCount: plan.count,
848
+ insertedCount: dashboardRows.length,
849
+ details: {
850
+ markerTag,
851
+ dashboardIds: dashboardRows.map((row) => row.id),
852
+ },
853
+ };
854
+ }
855
+ function seedFamilyMarker(ctx, family) {
856
+ return `${ctx.marker}:${family}`;
857
+ }
858
+ async function createSeedPolicy(client, orgId, name, notes, defaultAction, tdosSettings) {
859
+ return insertControlRow(client, `
860
+ INSERT INTO public.policies (
861
+ name,
862
+ notes,
863
+ hit_count,
864
+ api_key,
865
+ inserted_at,
866
+ updated_at,
867
+ healthy,
868
+ type,
869
+ org_id,
870
+ block_mcids,
871
+ realtime_inventory,
872
+ tdos_settings,
873
+ default_action,
874
+ jtapi_enabled,
875
+ duplicate_call_suppression_enabled,
876
+ duplicate_call_action,
877
+ duplicate_call_threshold,
878
+ duplicate_call_window_ms
879
+ )
880
+ VALUES (
881
+ $1,
882
+ $2,
883
+ 0,
884
+ $3,
885
+ now(),
886
+ now(),
887
+ true,
888
+ 'normal',
889
+ $4,
890
+ true,
891
+ false,
892
+ COALESCE($5::jsonb, '{"tdos_enabled": false, "tdos_expiration_minutes": 60, "tdos_call_count_threshold": 10, "tdos_threshold_milliseconds": 60}'::jsonb),
893
+ $6,
894
+ false,
895
+ false,
896
+ 'block',
897
+ 1,
898
+ 5000
899
+ )
900
+ RETURNING id
901
+ `, [name, notes, randomUUID(), orgId, tdosSettings ? JSON.stringify(tdosSettings) : null, defaultAction]);
902
+ }
903
+ function parseNumberArray(value) {
904
+ if (!Array.isArray(value)) {
905
+ return [];
906
+ }
907
+ return value
908
+ .map((item) => Number.parseInt(String(item), 10))
909
+ .filter((item) => Number.isFinite(item) && item > 0);
910
+ }
911
+ function parseStringArray(value) {
912
+ if (!Array.isArray(value)) {
913
+ return [];
914
+ }
915
+ return value
916
+ .map((item) => String(item))
917
+ .filter((item) => item.length > 0);
918
+ }
919
+ async function seedBlockRules(client, ctx, plan) {
920
+ const family = 'block_rules';
921
+ const marker = seedFamilyMarker(ctx, family);
922
+ const shortRun = ctx.runId.slice(0, 8);
923
+ const policyId = await createSeedPolicy(client, ctx.orgId, `CT Seed Block Policy ${shortRun}`, marker, 'permit');
924
+ const ruleIds = await reserveChunkIds(client, 'rules', plan.count);
925
+ const rows = ruleIds.map((id, index) => {
926
+ const seed = index + 1;
927
+ const occurredAt = timeSpread(plan.days, seed * 600_000);
928
+ return {
929
+ id,
930
+ name: `CT Seed Block Rule ${seed}`,
931
+ calling_number: randomPhone('+1303', seed),
932
+ hit_count: seed % 5,
933
+ last_trigger: occurredAt,
934
+ policy_action: 'block',
935
+ policy_id: policyId,
936
+ user_id: null,
937
+ inserted_at: occurredAt,
938
+ updated_at: occurredAt,
939
+ webhook_id: null,
940
+ notification_id: null,
941
+ called_number: randomPhone('+1800', seed * 7),
942
+ greeting_name: null,
943
+ greeting_enabled: seed % 4 === 0,
944
+ new_calling_number: null,
945
+ new_called_number: null,
946
+ new_calling_name: seed % 4 === 0 ? 'Blocked Caller' : null,
947
+ new_called_name: null,
948
+ mcid_triggered: seed % 6 === 0,
949
+ teams_alert_id: null,
950
+ trigger_percentage: 100,
951
+ alert_templates_id: null,
952
+ app_id: null,
953
+ cdr_events: ['block'],
954
+ cdr_missed_call_alert: false,
955
+ alert_template: `ct_seed block alert ${ctx.runId}`,
956
+ attach_debug_messages: false,
957
+ email_subject: 'CT Seed Block Alert',
958
+ alert_only_success: false,
959
+ order: seed,
960
+ announcement_greetings: seed % 4 === 0 ? ['busy_signal'] : [],
961
+ jtapi_audio_id: null,
962
+ };
963
+ });
964
+ await copyChunked(client, 'rules', rows);
965
+ return {
966
+ family,
967
+ requestedCount: plan.count,
968
+ insertedCount: rows.length,
969
+ details: {
970
+ marker,
971
+ policyId,
972
+ ruleIds,
973
+ },
974
+ };
975
+ }
976
+ async function seedPermitRules(client, ctx, plan) {
977
+ const family = 'permit_rules';
978
+ const marker = seedFamilyMarker(ctx, family);
979
+ const shortRun = ctx.runId.slice(0, 8);
980
+ const policyId = await createSeedPolicy(client, ctx.orgId, `CT Seed Permit Policy ${shortRun}`, marker, 'block');
981
+ const ruleIds = await reserveChunkIds(client, 'rules', plan.count);
982
+ const rows = ruleIds.map((id, index) => {
983
+ const seed = index + 1;
984
+ const occurredAt = timeSpread(plan.days, seed * 420_000);
985
+ return {
986
+ id,
987
+ name: `CT Seed Permit Rule ${seed}`,
988
+ calling_number: randomPhone('+1408', seed * 5),
989
+ hit_count: seed % 7,
990
+ last_trigger: occurredAt,
991
+ policy_action: 'permit',
992
+ policy_id: policyId,
993
+ user_id: null,
994
+ inserted_at: occurredAt,
995
+ updated_at: occurredAt,
996
+ webhook_id: null,
997
+ notification_id: null,
998
+ called_number: randomPhone('+1650', seed * 11),
999
+ greeting_name: null,
1000
+ greeting_enabled: seed % 3 === 0,
1001
+ new_calling_number: seed % 5 === 0 ? randomPhone('+1408', seed * 17) : null,
1002
+ new_called_number: seed % 4 === 0 ? randomPhone('+1650', seed * 13) : null,
1003
+ new_calling_name: seed % 3 === 0 ? 'Verified Caller' : null,
1004
+ new_called_name: seed % 4 === 0 ? 'Front Desk' : null,
1005
+ mcid_triggered: false,
1006
+ teams_alert_id: null,
1007
+ trigger_percentage: 100,
1008
+ alert_templates_id: null,
1009
+ app_id: null,
1010
+ cdr_events: ['permit'],
1011
+ cdr_missed_call_alert: false,
1012
+ alert_template: `ct_seed permit alert ${ctx.runId}`,
1013
+ attach_debug_messages: false,
1014
+ email_subject: 'CT Seed Permit Alert',
1015
+ alert_only_success: false,
1016
+ order: seed,
1017
+ announcement_greetings: seed % 3 === 0 ? ['welcome'] : [],
1018
+ jtapi_audio_id: null,
1019
+ };
1020
+ });
1021
+ await copyChunked(client, 'rules', rows);
1022
+ return {
1023
+ family,
1024
+ requestedCount: plan.count,
1025
+ insertedCount: rows.length,
1026
+ details: {
1027
+ marker,
1028
+ policyId,
1029
+ ruleIds,
1030
+ },
1031
+ };
1032
+ }
1033
+ async function seedTdosViolations(client, ctx, plan) {
1034
+ const family = 'tdos_violations';
1035
+ const marker = seedFamilyMarker(ctx, family);
1036
+ const shortRun = ctx.runId.slice(0, 8);
1037
+ const policyId = await createSeedPolicy(client, ctx.orgId, `CT Seed TDOS Policy ${shortRun}`, marker, 'permit', {
1038
+ tdos_enabled: true,
1039
+ tdos_expiration_minutes: 60,
1040
+ tdos_call_count_threshold: 3,
1041
+ tdos_threshold_milliseconds: 1000,
1042
+ });
1043
+ const violationIds = await reserveChunkIds(client, 'tdos_violations', plan.count);
1044
+ const now = new Date();
1045
+ const rows = violationIds.map((id, index) => {
1046
+ const seed = index + 1;
1047
+ const violationAt = seed % 2 === 0
1048
+ ? new Date(now.getTime() - (seed % 45) * 60_000)
1049
+ : timeSpread(plan.days, seed * 780_000);
1050
+ const count = 3 + (seed % 6);
1051
+ const expiresAt = seed % 2 === 0
1052
+ ? new Date(violationAt.getTime() + 60 * 60 * 1000)
1053
+ : new Date(violationAt.getTime() - 60 * 60 * 1000);
1054
+ return {
1055
+ id,
1056
+ policy_id: policyId,
1057
+ calling_number: randomPhone('+1888', seed * 9),
1058
+ violation_count: count,
1059
+ last_violation_at: violationAt,
1060
+ inserted_at: violationAt,
1061
+ updated_at: violationAt,
1062
+ high_water_mark_violations: count + (seed % 3),
1063
+ expires_at: expiresAt,
1064
+ };
1065
+ });
1066
+ await copyChunked(client, 'tdos_violations', rows);
1067
+ return {
1068
+ family,
1069
+ requestedCount: plan.count,
1070
+ insertedCount: rows.length,
1071
+ details: {
1072
+ marker,
1073
+ policyId,
1074
+ violationIds,
1075
+ },
1076
+ };
1077
+ }
1078
+ async function seedWatchListsFullLifecycle(client, ctx, plan) {
1079
+ const family = 'watch_lists_full_lifecycle';
1080
+ const marker = seedFamilyMarker(ctx, family);
1081
+ const shortRun = ctx.runId.slice(0, 8);
1082
+ const policyId = await createSeedPolicy(client, ctx.orgId, `CT Seed Watch List Policy ${shortRun}`, marker, 'permit');
1083
+ const [watchListId] = await reserveChunkIds(client, 'watch_lists', 1);
1084
+ const [triggerId] = await reserveChunkIds(client, 'watch_list_triggers', 1);
1085
+ const [watchListPolicyId] = await reserveChunkIds(client, 'watch_lists_policies', 1);
1086
+ const [triggerPolicyId] = await reserveChunkIds(client, 'watch_list_triggers_policies', 1);
1087
+ const insertedAt = ctx.startedAt;
1088
+ const permitCallsPerNumber = 4;
1089
+ const blockedCallsPerNumber = 2;
1090
+ const totalCurriEvents = plan.count * (permitCallsPerNumber + blockedCallsPerNumber);
1091
+ await copyChunked(client, 'watch_lists', [{
1092
+ id: watchListId,
1093
+ name: `${marker}:list`,
1094
+ org_id: ctx.orgId,
1095
+ inserted_at: insertedAt,
1096
+ updated_at: insertedAt,
1097
+ }]);
1098
+ await copyChunked(client, 'watch_list_triggers', [{
1099
+ id: triggerId,
1100
+ name: `CT Seed Watch Trigger ${shortRun}`,
1101
+ description: marker,
1102
+ active: true,
1103
+ count: permitCallsPerNumber,
1104
+ minutes: 60,
1105
+ last_run: insertedAt,
1106
+ run_interval: 15,
1107
+ email_addresses: [],
1108
+ email_enabled: false,
1109
+ org_id: ctx.orgId,
1110
+ watch_list_id: watchListId,
1111
+ inserted_at: insertedAt,
1112
+ updated_at: insertedAt,
1113
+ expire_days: 7,
1114
+ }]);
1115
+ await copyChunked(client, 'watch_lists_policies', [{
1116
+ id: watchListPolicyId,
1117
+ watch_list_id: watchListId,
1118
+ policy_id: policyId,
1119
+ org_id: ctx.orgId,
1120
+ inserted_at: insertedAt,
1121
+ updated_at: insertedAt,
1122
+ }]);
1123
+ await copyChunked(client, 'watch_list_triggers_policies', [{
1124
+ id: triggerPolicyId,
1125
+ watch_list_trigger_id: triggerId,
1126
+ policy_id: policyId,
1127
+ org_id: ctx.orgId,
1128
+ inserted_at: insertedAt,
1129
+ updated_at: insertedAt,
1130
+ }]);
1131
+ const numberIds = await reserveChunkIds(client, 'watch_list_numbers', plan.count);
1132
+ const curriIds = await reserveChunkIds(client, 'curri_events', totalCurriEvents);
1133
+ const numberRows = [];
1134
+ const numberJoinRows = [];
1135
+ const violationRows = [];
1136
+ const violationEventRows = [];
1137
+ const curriRows = [];
1138
+ const violationIds = [];
1139
+ let curriIndex = 0;
1140
+ for (let index = 0; index < plan.count; index++) {
1141
+ const seed = index + 1;
1142
+ const callingNumber = randomPhone('+1555', seed * 7);
1143
+ const numberId = numberIds[index];
1144
+ const violationId = randomUUID();
1145
+ const violationTime = timeSpread(plan.days, seed * 2_400_000);
1146
+ const expiresAt = new Date(violationTime.getTime() + 7 * 24 * 60 * 60 * 1000);
1147
+ violationIds.push(violationId);
1148
+ numberRows.push({
1149
+ id: numberId,
1150
+ number: callingNumber,
1151
+ whitelist: false,
1152
+ comments: marker,
1153
+ org_id: ctx.orgId,
1154
+ inserted_at: violationTime,
1155
+ updated_at: violationTime,
1156
+ high_water_mark: permitCallsPerNumber + blockedCallsPerNumber,
1157
+ });
1158
+ numberJoinRows.push({
1159
+ watch_list_id: watchListId,
1160
+ watch_list_number_id: numberId,
1161
+ inserted_at: violationTime,
1162
+ updated_at: violationTime,
1163
+ });
1164
+ violationRows.push({
1165
+ id: violationId,
1166
+ watch_list_number_id: numberId,
1167
+ calling_number: callingNumber,
1168
+ violated_at: violationTime,
1169
+ expires_at: expiresAt,
1170
+ status: index % 4 === 0 ? 'inactive' : 'active',
1171
+ has_event_details: true,
1172
+ trigger_id: triggerId,
1173
+ watch_list_id: watchListId,
1174
+ org_id: ctx.orgId,
1175
+ inserted_at: violationTime,
1176
+ updated_at: violationTime,
1177
+ call_count: permitCallsPerNumber,
1178
+ calling_device: pick(DEVICE_NAMES, seed),
1179
+ });
1180
+ for (let permitIndex = 0; permitIndex < permitCallsPerNumber; permitIndex++) {
1181
+ const eventTime = new Date(violationTime.getTime() - (permitCallsPerNumber - permitIndex) * 5 * 60 * 1000);
1182
+ const curriId = curriIds[curriIndex++];
1183
+ const calledNumber = randomPhone('+1800', seed * 31 + permitIndex);
1184
+ curriRows.push({
1185
+ id: curriId,
1186
+ calling_number: callingNumber,
1187
+ called_number: calledNumber,
1188
+ trigger_point_type: 'translationpattern',
1189
+ calling_devicename: pick(DEVICE_NAMES, seed + permitIndex),
1190
+ result: 'permitted',
1191
+ inserted_at: eventTime,
1192
+ updated_at: eventTime,
1193
+ action_taken: 'permit',
1194
+ org_id: ctx.orgId,
1195
+ alert_variables: { ct_seed_run_id: ctx.runId, family, phase: 'trigger', violation_id: violationId },
1196
+ applied_modifiers: {},
1197
+ final_rendered_action: 'permit',
1198
+ response_time: 150_000 + (seed % 25_000),
1199
+ processing_time: 75_000 + (seed % 20_000),
1200
+ });
1201
+ violationEventRows.push({
1202
+ id: randomUUID(),
1203
+ violation_id: violationId,
1204
+ curri_event_id: curriId,
1205
+ calling_number: callingNumber,
1206
+ called_number: calledNumber,
1207
+ event_timestamp: eventTime,
1208
+ contributed_at: violationTime,
1209
+ org_id: ctx.orgId,
1210
+ inserted_at: violationTime,
1211
+ event_type: 'trigger',
1212
+ });
1213
+ }
1214
+ for (let blockedIndex = 0; blockedIndex < blockedCallsPerNumber; blockedIndex++) {
1215
+ const eventTime = new Date(violationTime.getTime() + (blockedIndex + 1) * 7 * 60 * 1000);
1216
+ const curriId = curriIds[curriIndex++];
1217
+ const calledNumber = randomPhone('+1888', seed * 47 + blockedIndex);
1218
+ curriRows.push({
1219
+ id: curriId,
1220
+ calling_number: callingNumber,
1221
+ called_number: calledNumber,
1222
+ trigger_point_type: 'translationpattern',
1223
+ calling_devicename: pick(DEVICE_NAMES, seed + blockedIndex + 20),
1224
+ result: 'blocked',
1225
+ inserted_at: eventTime,
1226
+ updated_at: eventTime,
1227
+ action_taken: 'block',
1228
+ org_id: ctx.orgId,
1229
+ alert_variables: { ct_seed_run_id: ctx.runId, family, phase: 'block', violation_id: violationId },
1230
+ applied_modifiers: {},
1231
+ final_rendered_action: 'block',
1232
+ response_time: 165_000 + (seed % 35_000),
1233
+ processing_time: 95_000 + (seed % 15_000),
1234
+ });
1235
+ violationEventRows.push({
1236
+ id: randomUUID(),
1237
+ violation_id: violationId,
1238
+ curri_event_id: curriId,
1239
+ calling_number: callingNumber,
1240
+ called_number: calledNumber,
1241
+ event_timestamp: eventTime,
1242
+ contributed_at: eventTime,
1243
+ org_id: ctx.orgId,
1244
+ inserted_at: eventTime,
1245
+ event_type: 'block',
1246
+ });
1247
+ }
1248
+ }
1249
+ await copyChunked(client, 'watch_list_numbers', numberRows);
1250
+ await copyChunked(client, 'watch_list_numbers_have_watch_lists', numberJoinRows);
1251
+ await copyChunked(client, 'curri_events', curriRows);
1252
+ await copyChunked(client, 'watch_list_violations', violationRows);
1253
+ await copyChunked(client, 'watch_list_violation_events', violationEventRows);
1254
+ return {
1255
+ family,
1256
+ requestedCount: plan.count,
1257
+ insertedCount: violationRows.length,
1258
+ details: {
1259
+ marker,
1260
+ runId: ctx.runId,
1261
+ policyId,
1262
+ watchListId: watchListId,
1263
+ triggerId: triggerId,
1264
+ watchListNumberIds: numberIds,
1265
+ violationIds,
1266
+ },
1267
+ };
1268
+ }
1269
+ async function seedGlobalBlockList(client, ctx, plan) {
1270
+ const family = 'global_block_list';
1271
+ const marker = seedFamilyMarker(ctx, family);
1272
+ const mcidIds = await reserveChunkIds(client, 'mcids', plan.count);
1273
+ const rows = mcidIds.map((id, index) => {
1274
+ const seed = index + 1;
1275
+ const seenAt = timeSpread(plan.days, seed * 300_000);
1276
+ const expires = seed % 3 === 0;
1277
+ return {
1278
+ id,
1279
+ calling_number: randomPhone('+1303', seed * 13),
1280
+ called_number: randomPhone('+1800', seed * 19),
1281
+ description: marker,
1282
+ expires,
1283
+ expires_datetime: expires ? new Date(seenAt.getTime() + 30 * 24 * 60 * 60 * 1000) : null,
1284
+ hit_count: seed % 11,
1285
+ last_seen: seenAt,
1286
+ cdrcall_id: null,
1287
+ cdr_integration_id: null,
1288
+ inserted_at: seenAt,
1289
+ updated_at: seenAt,
1290
+ org_id: ctx.orgId,
1291
+ devicename: pick(DEVICE_NAMES, seed),
1292
+ metadata: { ct_seed_run_id: ctx.runId, family, marker },
1293
+ expired_at: expires ? null : null,
1294
+ enduser_identity_id: null,
1295
+ source: 'admin',
1296
+ };
1297
+ });
1298
+ await copyChunked(client, 'mcids', rows);
1299
+ return {
1300
+ family,
1301
+ requestedCount: plan.count,
1302
+ insertedCount: rows.length,
1303
+ details: {
1304
+ marker,
1305
+ mcidIds,
1306
+ },
1307
+ };
1308
+ }
1309
+ export async function executeSeedFamily(client, ctx, plan) {
1310
+ switch (plan.family) {
1311
+ case 'curri_events':
1312
+ return seedCurriEvents(client, ctx, plan);
1313
+ case 'cdr_records':
1314
+ return seedCdrRecords(client, ctx, plan);
1315
+ case 'missed_calls':
1316
+ return seedMissedCalls(client, ctx, plan);
1317
+ case 'xcc_calls':
1318
+ return seedXccCalls(client, ctx, plan);
1319
+ case 'fac_calls':
1320
+ return seedFacCalls(client, ctx, plan);
1321
+ case 'cmc_calls':
1322
+ return seedCmcCalls(client, ctx, plan);
1323
+ case 'cost_allocation':
1324
+ return seedCostAllocation(client, ctx, plan);
1325
+ case 'registration_snapshots':
1326
+ return seedRegistrationSnapshots(client, ctx, plan);
1327
+ case 'dashboard_templates':
1328
+ return seedDashboardTemplates(client, ctx, plan);
1329
+ case 'block_rules':
1330
+ return seedBlockRules(client, ctx, plan);
1331
+ case 'permit_rules':
1332
+ return seedPermitRules(client, ctx, plan);
1333
+ case 'tdos_violations':
1334
+ return seedTdosViolations(client, ctx, plan);
1335
+ case 'watch_lists_full_lifecycle':
1336
+ return seedWatchListsFullLifecycle(client, ctx, plan);
1337
+ case 'global_block_list':
1338
+ return seedGlobalBlockList(client, ctx, plan);
1339
+ }
1340
+ }
1341
+ async function cleanupCurri(client, details) {
1342
+ const runId = String(details.runId ?? '');
1343
+ const signals = await client.query(`DELETE FROM public.reputation_signals WHERE raw->>'ct_seed_run_id' = $1`, [runId]);
1344
+ const apps = await client.query(`DELETE FROM public.app_events WHERE raw->>'ct_seed_run_id' = $1`, [runId]);
1345
+ const curri = await client.query(`DELETE FROM public.curri_events WHERE alert_variables->>'ct_seed_run_id' = $1`, [runId]);
1346
+ return affectedRows(signals.rowCount) + affectedRows(apps.rowCount) + affectedRows(curri.rowCount);
1347
+ }
1348
+ async function cleanupCdrRecords(client, details) {
1349
+ const marker = String(details.marker ?? '');
1350
+ const integrationHome = String(details.integrationHome ?? '');
1351
+ const cdr = await client.query(`DELETE FROM public.cdrcalls WHERE comment = $1`, [marker]);
1352
+ const integrations = await client.query(`DELETE FROM public.cdr_integrations WHERE home = $1`, [integrationHome]);
1353
+ return affectedRows(cdr.rowCount) + affectedRows(integrations.rowCount);
1354
+ }
1355
+ async function cleanupMissedCalls(client, details) {
1356
+ const syncSource = String(details.syncSource ?? '');
1357
+ const callmanagerName = String(details.callmanagerName ?? '');
1358
+ const events = await client.query(`
1359
+ DELETE FROM public.cdr_event_logs
1360
+ WHERE end_user_id IN (
1361
+ SELECT id FROM public.endusers WHERE sync_source = $1
1362
+ )
1363
+ `, [syncSource]);
1364
+ const users = await client.query(`DELETE FROM public.endusers WHERE sync_source = $1`, [syncSource]);
1365
+ const managers = await client.query(`DELETE FROM public.callmanagers WHERE name = $1`, [callmanagerName]);
1366
+ return affectedRows(events.rowCount) + affectedRows(users.rowCount) + affectedRows(managers.rowCount);
1367
+ }
1368
+ async function cleanupXcc(client, details) {
1369
+ const runId = String(details.runId ?? '');
1370
+ const cubeName = String(details.cubeName ?? '');
1371
+ const logs = await client.query(`DELETE FROM public.cube_event_logs WHERE details->>'ct_seed_run_id' = $1`, [runId]);
1372
+ const cubes = await client.query(`DELETE FROM public.cubes WHERE name = $1`, [cubeName]);
1373
+ return affectedRows(logs.rowCount) + affectedRows(cubes.rowCount);
1374
+ }
1375
+ async function cleanupFac(client, details) {
1376
+ const marker = String(details.marker ?? '');
1377
+ const integrationHome = String(details.integrationHome ?? '');
1378
+ const cdr = await client.query(`DELETE FROM public.cdrcalls WHERE comment = $1`, [marker]);
1379
+ const assignments = await client.query(`DELETE FROM public.fac_code_cost_center_assignments WHERE notes = $1`, [marker]);
1380
+ const centers = await client.query(`DELETE FROM public.fac_cost_centers WHERE notes = $1`, [marker]);
1381
+ const integrations = await client.query(`DELETE FROM public.cdr_integrations WHERE home = $1`, [integrationHome]);
1382
+ return affectedRows(cdr.rowCount) + affectedRows(assignments.rowCount) + affectedRows(centers.rowCount) + affectedRows(integrations.rowCount);
1383
+ }
1384
+ async function cleanupCmc(client, details) {
1385
+ const marker = String(details.marker ?? '');
1386
+ const integrationHome = String(details.integrationHome ?? '');
1387
+ const cdr = await client.query(`DELETE FROM public.cdrcalls WHERE comment = $1`, [marker]);
1388
+ const codes = await client.query(`DELETE FROM public.cmc_codes WHERE notes = $1`, [marker]);
1389
+ const clients = await client.query(`DELETE FROM public.clients WHERE description = $1`, [marker]);
1390
+ const integrations = await client.query(`DELETE FROM public.cdr_integrations WHERE home = $1`, [integrationHome]);
1391
+ return affectedRows(cdr.rowCount) + affectedRows(codes.rowCount) + affectedRows(clients.rowCount) + affectedRows(integrations.rowCount);
1392
+ }
1393
+ async function cleanupCost(client, details) {
1394
+ const marker = String(details.marker ?? '');
1395
+ const runId = String(details.runId ?? '');
1396
+ const integrationHome = String(details.integrationHome ?? '');
1397
+ const cdr = await client.query(`DELETE FROM public.cdrcalls WHERE comment = $1`, [marker]);
1398
+ const rules = await client.query(`DELETE FROM public.costing_rules WHERE notes = $1`, [marker]);
1399
+ const multipliers = await client.query(`DELETE FROM public.rate_time_multipliers WHERE name LIKE $1`, [`%${runId}%`]);
1400
+ const rateTables = await client.query(`DELETE FROM public.rate_tables WHERE description = $1`, [marker]);
1401
+ const integrations = await client.query(`DELETE FROM public.cdr_integrations WHERE home = $1`, [integrationHome]);
1402
+ return affectedRows(cdr.rowCount) + affectedRows(rules.rowCount) + affectedRows(multipliers.rowCount) + affectedRows(rateTables.rowCount) + affectedRows(integrations.rowCount);
1403
+ }
1404
+ async function cleanupRegistrationSnapshots(client, details) {
1405
+ const batchId = String(details.batchId ?? '');
1406
+ const rows = await client.query('DELETE FROM public.phone_registration_snapshots WHERE batch_id = $1::uuid', [batchId]);
1407
+ let callmanagersDeleted = 0;
1408
+ if (details.createdCallmanager === true) {
1409
+ const callmanagerId = Number(details.callmanagerId ?? 0);
1410
+ if (callmanagerId > 0) {
1411
+ const callmanagerRows = await client.query('DELETE FROM public.callmanagers WHERE id = $1', [callmanagerId]);
1412
+ callmanagersDeleted = affectedRows(callmanagerRows.rowCount);
1413
+ }
1414
+ }
1415
+ return affectedRows(rows.rowCount) + callmanagersDeleted;
1416
+ }
1417
+ async function cleanupDashboardTemplates(client, details) {
1418
+ const dashboardIds = Array.isArray(details.dashboardIds) ? details.dashboardIds.map(String) : [];
1419
+ const widgetRows = await client.query('DELETE FROM public.dashboard_widgets WHERE dashboard_id = ANY($1::uuid[])', [dashboardIds]);
1420
+ const dashboardRows = await client.query('DELETE FROM public.dashboards WHERE id = ANY($1::uuid[])', [dashboardIds]);
1421
+ return affectedRows(widgetRows.rowCount) + affectedRows(dashboardRows.rowCount);
1422
+ }
1423
+ async function cleanupBlockRules(client, details) {
1424
+ const ruleIds = parseNumberArray(details.ruleIds);
1425
+ const policyId = Number.parseInt(String(details.policyId ?? ''), 10);
1426
+ const rules = ruleIds.length > 0
1427
+ ? await client.query('DELETE FROM public.rules WHERE id = ANY($1::bigint[])', [ruleIds])
1428
+ : { rowCount: 0 };
1429
+ const policies = Number.isFinite(policyId) && policyId > 0
1430
+ ? await client.query('DELETE FROM public.policies WHERE id = $1', [policyId])
1431
+ : { rowCount: 0 };
1432
+ return affectedRows(rules.rowCount) + affectedRows(policies.rowCount);
1433
+ }
1434
+ async function cleanupPermitRules(client, details) {
1435
+ return cleanupBlockRules(client, details);
1436
+ }
1437
+ async function cleanupTdosViolations(client, details) {
1438
+ const violationIds = parseNumberArray(details.violationIds);
1439
+ const policyId = Number.parseInt(String(details.policyId ?? ''), 10);
1440
+ const violations = violationIds.length > 0
1441
+ ? await client.query('DELETE FROM public.tdos_violations WHERE id = ANY($1::bigint[])', [violationIds])
1442
+ : { rowCount: 0 };
1443
+ const policies = Number.isFinite(policyId) && policyId > 0
1444
+ ? await client.query('DELETE FROM public.policies WHERE id = $1', [policyId])
1445
+ : { rowCount: 0 };
1446
+ return affectedRows(violations.rowCount) + affectedRows(policies.rowCount);
1447
+ }
1448
+ async function cleanupWatchListLifecycle(client, details) {
1449
+ const runId = String(details.runId ?? '');
1450
+ const watchListId = Number.parseInt(String(details.watchListId ?? ''), 10);
1451
+ const triggerId = Number.parseInt(String(details.triggerId ?? ''), 10);
1452
+ const policyId = Number.parseInt(String(details.policyId ?? ''), 10);
1453
+ const watchListNumberIds = parseNumberArray(details.watchListNumberIds);
1454
+ const violationIds = parseStringArray(details.violationIds);
1455
+ const violationEvents = violationIds.length > 0
1456
+ ? await client.query('DELETE FROM public.watch_list_violation_events WHERE violation_id = ANY($1::uuid[])', [violationIds])
1457
+ : { rowCount: 0 };
1458
+ const curriEvents = runId
1459
+ ? await client.query(`
1460
+ DELETE FROM public.curri_events
1461
+ WHERE alert_variables->>'ct_seed_run_id' = $1
1462
+ AND alert_variables->>'family' = 'watch_lists_full_lifecycle'
1463
+ `, [runId])
1464
+ : { rowCount: 0 };
1465
+ const violations = violationIds.length > 0
1466
+ ? await client.query('DELETE FROM public.watch_list_violations WHERE id = ANY($1::uuid[])', [violationIds])
1467
+ : { rowCount: 0 };
1468
+ const triggerPolicies = Number.isFinite(triggerId) && triggerId > 0
1469
+ ? await client.query('DELETE FROM public.watch_list_triggers_policies WHERE watch_list_trigger_id = $1', [triggerId])
1470
+ : { rowCount: 0 };
1471
+ const listPolicies = Number.isFinite(watchListId) && watchListId > 0
1472
+ ? await client.query('DELETE FROM public.watch_lists_policies WHERE watch_list_id = $1', [watchListId])
1473
+ : { rowCount: 0 };
1474
+ const listNumbers = Number.isFinite(watchListId) && watchListId > 0
1475
+ ? await client.query('DELETE FROM public.watch_list_numbers_have_watch_lists WHERE watch_list_id = $1', [watchListId])
1476
+ : { rowCount: 0 };
1477
+ const triggers = Number.isFinite(triggerId) && triggerId > 0
1478
+ ? await client.query('DELETE FROM public.watch_list_triggers WHERE id = $1', [triggerId])
1479
+ : { rowCount: 0 };
1480
+ const numbers = watchListNumberIds.length > 0
1481
+ ? await client.query('DELETE FROM public.watch_list_numbers WHERE id = ANY($1::bigint[])', [watchListNumberIds])
1482
+ : { rowCount: 0 };
1483
+ const watchLists = Number.isFinite(watchListId) && watchListId > 0
1484
+ ? await client.query('DELETE FROM public.watch_lists WHERE id = $1', [watchListId])
1485
+ : { rowCount: 0 };
1486
+ const policies = Number.isFinite(policyId) && policyId > 0
1487
+ ? await client.query('DELETE FROM public.policies WHERE id = $1', [policyId])
1488
+ : { rowCount: 0 };
1489
+ return [
1490
+ violationEvents,
1491
+ curriEvents,
1492
+ violations,
1493
+ triggerPolicies,
1494
+ listPolicies,
1495
+ listNumbers,
1496
+ triggers,
1497
+ numbers,
1498
+ watchLists,
1499
+ policies,
1500
+ ].reduce((sum, result) => sum + affectedRows(result.rowCount), 0);
1501
+ }
1502
+ async function cleanupGlobalBlockList(client, details) {
1503
+ const mcidIds = parseNumberArray(details.mcidIds);
1504
+ const rows = mcidIds.length > 0
1505
+ ? await client.query('DELETE FROM public.mcids WHERE id = ANY($1::bigint[])', [mcidIds])
1506
+ : { rowCount: 0 };
1507
+ return affectedRows(rows.rowCount);
1508
+ }
1509
+ export async function cleanupSeedFamily(client, family, details) {
1510
+ switch (family) {
1511
+ case 'curri_events':
1512
+ return cleanupCurri(client, details);
1513
+ case 'cdr_records':
1514
+ return cleanupCdrRecords(client, details);
1515
+ case 'missed_calls':
1516
+ return cleanupMissedCalls(client, details);
1517
+ case 'xcc_calls':
1518
+ return cleanupXcc(client, details);
1519
+ case 'fac_calls':
1520
+ return cleanupFac(client, details);
1521
+ case 'cmc_calls':
1522
+ return cleanupCmc(client, details);
1523
+ case 'cost_allocation':
1524
+ return cleanupCost(client, details);
1525
+ case 'registration_snapshots':
1526
+ return cleanupRegistrationSnapshots(client, details);
1527
+ case 'dashboard_templates':
1528
+ return cleanupDashboardTemplates(client, details);
1529
+ case 'block_rules':
1530
+ return cleanupBlockRules(client, details);
1531
+ case 'permit_rules':
1532
+ return cleanupPermitRules(client, details);
1533
+ case 'tdos_violations':
1534
+ return cleanupTdosViolations(client, details);
1535
+ case 'watch_lists_full_lifecycle':
1536
+ return cleanupWatchListLifecycle(client, details);
1537
+ case 'global_block_list':
1538
+ return cleanupGlobalBlockList(client, details);
1539
+ }
1540
+ }
1541
+ //# sourceMappingURL=families.js.map