@tellescope/sdk 2.0.0-beta.1 → 2.0.0-beta.3

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 (957) hide show
  1. package/CLAUDE.md +24 -0
  2. package/env.example +6 -0
  3. package/lib/cjs/sdk.d.ts +375 -4
  4. package/lib/cjs/sdk.d.ts.map +1 -1
  5. package/lib/cjs/sdk.js +5 -0
  6. package/lib/cjs/sdk.js.map +1 -1
  7. package/lib/cjs/tests/api_tests/ai_conversations.test.d.ts +14 -5
  8. package/lib/cjs/tests/api_tests/ai_conversations.test.d.ts.map +1 -1
  9. package/lib/cjs/tests/api_tests/ai_conversations.test.js +163 -149
  10. package/lib/cjs/tests/api_tests/ai_conversations.test.js.map +1 -1
  11. package/lib/cjs/tests/api_tests/ai_conversations_agent_message.test.d.ts +22 -0
  12. package/lib/cjs/tests/api_tests/ai_conversations_agent_message.test.d.ts.map +1 -0
  13. package/lib/cjs/tests/api_tests/ai_conversations_agent_message.test.js +518 -0
  14. package/lib/cjs/tests/api_tests/ai_conversations_agent_message.test.js.map +1 -0
  15. package/lib/cjs/tests/api_tests/appointment_link_expiration.test.d.ts +6 -5
  16. package/lib/cjs/tests/api_tests/appointment_link_expiration.test.d.ts.map +1 -1
  17. package/lib/cjs/tests/api_tests/appointment_link_expiration.test.js +135 -73
  18. package/lib/cjs/tests/api_tests/appointment_link_expiration.test.js.map +1 -1
  19. package/lib/cjs/tests/api_tests/appointment_no_showed_trigger.test.d.ts +6 -5
  20. package/lib/cjs/tests/api_tests/appointment_no_showed_trigger.test.d.ts.map +1 -1
  21. package/lib/cjs/tests/api_tests/appointment_no_showed_trigger.test.js +240 -174
  22. package/lib/cjs/tests/api_tests/appointment_no_showed_trigger.test.js.map +1 -1
  23. package/lib/cjs/tests/api_tests/availability_block_buffer.test.d.ts +22 -0
  24. package/lib/cjs/tests/api_tests/availability_block_buffer.test.d.ts.map +1 -0
  25. package/lib/cjs/tests/api_tests/availability_block_buffer.test.js +311 -0
  26. package/lib/cjs/tests/api_tests/availability_block_buffer.test.js.map +1 -0
  27. package/lib/cjs/tests/api_tests/beluga_manual_sync.test.d.ts +6 -5
  28. package/lib/cjs/tests/api_tests/beluga_manual_sync.test.d.ts.map +1 -1
  29. package/lib/cjs/tests/api_tests/beluga_manual_sync.test.js +235 -192
  30. package/lib/cjs/tests/api_tests/beluga_manual_sync.test.js.map +1 -1
  31. package/lib/cjs/tests/api_tests/beluga_trigger_refill.test.d.ts +6 -5
  32. package/lib/cjs/tests/api_tests/beluga_trigger_refill.test.d.ts.map +1 -1
  33. package/lib/cjs/tests/api_tests/beluga_trigger_refill.test.js +351 -264
  34. package/lib/cjs/tests/api_tests/beluga_trigger_refill.test.js.map +1 -1
  35. package/lib/cjs/tests/api_tests/booking_prevent_upcoming_duplicate.test.d.ts +22 -0
  36. package/lib/cjs/tests/api_tests/booking_prevent_upcoming_duplicate.test.d.ts.map +1 -0
  37. package/lib/cjs/tests/api_tests/booking_prevent_upcoming_duplicate.test.js +506 -0
  38. package/lib/cjs/tests/api_tests/booking_prevent_upcoming_duplicate.test.js.map +1 -0
  39. package/lib/cjs/tests/api_tests/bulk_assignment.test.d.ts +16 -5
  40. package/lib/cjs/tests/api_tests/bulk_assignment.test.d.ts.map +1 -1
  41. package/lib/cjs/tests/api_tests/bulk_assignment.test.js +336 -243
  42. package/lib/cjs/tests/api_tests/bulk_assignment.test.js.map +1 -1
  43. package/lib/cjs/tests/api_tests/calendar_event_references_update.test.d.ts +13 -5
  44. package/lib/cjs/tests/api_tests/calendar_event_references_update.test.d.ts.map +1 -1
  45. package/lib/cjs/tests/api_tests/calendar_event_references_update.test.js +131 -108
  46. package/lib/cjs/tests/api_tests/calendar_event_references_update.test.js.map +1 -1
  47. package/lib/cjs/tests/api_tests/calendar_event_webhook_template.test.d.ts +15 -5
  48. package/lib/cjs/tests/api_tests/calendar_event_webhook_template.test.d.ts.map +1 -1
  49. package/lib/cjs/tests/api_tests/calendar_event_webhook_template.test.js +240 -252
  50. package/lib/cjs/tests/api_tests/calendar_event_webhook_template.test.js.map +1 -1
  51. package/lib/cjs/tests/api_tests/chats_analytics.test.d.ts +14 -5
  52. package/lib/cjs/tests/api_tests/chats_analytics.test.d.ts.map +1 -1
  53. package/lib/cjs/tests/api_tests/chats_analytics.test.js +190 -189
  54. package/lib/cjs/tests/api_tests/chats_analytics.test.js.map +1 -1
  55. package/lib/cjs/tests/api_tests/concurrent_build_threads.test.d.ts +23 -5
  56. package/lib/cjs/tests/api_tests/concurrent_build_threads.test.d.ts.map +1 -1
  57. package/lib/cjs/tests/api_tests/concurrent_build_threads.test.js +121 -118
  58. package/lib/cjs/tests/api_tests/concurrent_build_threads.test.js.map +1 -1
  59. package/lib/cjs/tests/api_tests/configurations_public_read.test.d.ts +21 -5
  60. package/lib/cjs/tests/api_tests/configurations_public_read.test.d.ts.map +1 -1
  61. package/lib/cjs/tests/api_tests/configurations_public_read.test.js +235 -119
  62. package/lib/cjs/tests/api_tests/configurations_public_read.test.js.map +1 -1
  63. package/lib/cjs/tests/api_tests/copied_form_response_no_enduser_sync.test.d.ts +7 -0
  64. package/lib/cjs/tests/api_tests/copied_form_response_no_enduser_sync.test.d.ts.map +1 -0
  65. package/lib/cjs/tests/api_tests/copied_form_response_no_enduser_sync.test.js +356 -0
  66. package/lib/cjs/tests/api_tests/copied_form_response_no_enduser_sync.test.js.map +1 -0
  67. package/lib/cjs/tests/api_tests/create_note_action.test.d.ts +18 -5
  68. package/lib/cjs/tests/api_tests/create_note_action.test.d.ts.map +1 -1
  69. package/lib/cjs/tests/api_tests/create_note_action.test.js +218 -173
  70. package/lib/cjs/tests/api_tests/create_note_action.test.js.map +1 -1
  71. package/lib/cjs/tests/api_tests/create_user_notifications_trigger.test.d.ts +17 -4
  72. package/lib/cjs/tests/api_tests/create_user_notifications_trigger.test.d.ts.map +1 -1
  73. package/lib/cjs/tests/api_tests/create_user_notifications_trigger.test.js +144 -205
  74. package/lib/cjs/tests/api_tests/create_user_notifications_trigger.test.js.map +1 -1
  75. package/lib/cjs/tests/api_tests/custom_aggregation.test.d.ts +15 -5
  76. package/lib/cjs/tests/api_tests/custom_aggregation.test.d.ts.map +1 -1
  77. package/lib/cjs/tests/api_tests/custom_aggregation.test.js +284 -223
  78. package/lib/cjs/tests/api_tests/custom_aggregation.test.js.map +1 -1
  79. package/lib/cjs/tests/api_tests/database_cascade_delete.test.d.ts +13 -5
  80. package/lib/cjs/tests/api_tests/database_cascade_delete.test.d.ts.map +1 -1
  81. package/lib/cjs/tests/api_tests/database_cascade_delete.test.js +218 -242
  82. package/lib/cjs/tests/api_tests/database_cascade_delete.test.js.map +1 -1
  83. package/lib/cjs/tests/api_tests/dont_sync_to_elation_form_submission.test.d.ts +21 -5
  84. package/lib/cjs/tests/api_tests/dont_sync_to_elation_form_submission.test.d.ts.map +1 -1
  85. package/lib/cjs/tests/api_tests/dont_sync_to_elation_form_submission.test.js +168 -112
  86. package/lib/cjs/tests/api_tests/dont_sync_to_elation_form_submission.test.js.map +1 -1
  87. package/lib/cjs/tests/api_tests/elation_user_id.test.d.ts +17 -5
  88. package/lib/cjs/tests/api_tests/elation_user_id.test.d.ts.map +1 -1
  89. package/lib/cjs/tests/api_tests/elation_user_id.test.js +121 -54
  90. package/lib/cjs/tests/api_tests/elation_user_id.test.js.map +1 -1
  91. package/lib/cjs/tests/api_tests/enduser_fields_sync.test.d.ts +3 -1
  92. package/lib/cjs/tests/api_tests/enduser_fields_sync.test.d.ts.map +1 -1
  93. package/lib/cjs/tests/api_tests/enduser_fields_sync.test.js +3 -1
  94. package/lib/cjs/tests/api_tests/enduser_fields_sync.test.js.map +1 -1
  95. package/lib/cjs/tests/api_tests/enduser_observations_auto_review.test.d.ts +3 -1
  96. package/lib/cjs/tests/api_tests/enduser_observations_auto_review.test.d.ts.map +1 -1
  97. package/lib/cjs/tests/api_tests/enduser_observations_auto_review.test.js +3 -1
  98. package/lib/cjs/tests/api_tests/enduser_observations_auto_review.test.js.map +1 -1
  99. package/lib/cjs/tests/api_tests/file_download_unicode_names.test.d.ts +6 -5
  100. package/lib/cjs/tests/api_tests/file_download_unicode_names.test.d.ts.map +1 -1
  101. package/lib/cjs/tests/api_tests/file_download_unicode_names.test.js +193 -143
  102. package/lib/cjs/tests/api_tests/file_download_unicode_names.test.js.map +1 -1
  103. package/lib/cjs/tests/api_tests/form_intake_email_normalization.test.d.ts +7 -0
  104. package/lib/cjs/tests/api_tests/form_intake_email_normalization.test.d.ts.map +1 -0
  105. package/lib/cjs/tests/api_tests/form_intake_email_normalization.test.js +532 -0
  106. package/lib/cjs/tests/api_tests/form_intake_email_normalization.test.js.map +1 -0
  107. package/lib/cjs/tests/api_tests/form_submitted_trigger.test.d.ts +25 -5
  108. package/lib/cjs/tests/api_tests/form_submitted_trigger.test.d.ts.map +1 -1
  109. package/lib/cjs/tests/api_tests/form_submitted_trigger.test.js +395 -366
  110. package/lib/cjs/tests/api_tests/form_submitted_trigger.test.js.map +1 -1
  111. package/lib/cjs/tests/api_tests/form_translations.test.d.ts +6 -5
  112. package/lib/cjs/tests/api_tests/form_translations.test.d.ts.map +1 -1
  113. package/lib/cjs/tests/api_tests/form_translations.test.js +269 -189
  114. package/lib/cjs/tests/api_tests/form_translations.test.js.map +1 -1
  115. package/lib/cjs/tests/api_tests/form_vital_reading.test.d.ts +7 -0
  116. package/lib/cjs/tests/api_tests/form_vital_reading.test.d.ts.map +1 -0
  117. package/lib/cjs/tests/api_tests/form_vital_reading.test.js +461 -0
  118. package/lib/cjs/tests/api_tests/form_vital_reading.test.js.map +1 -0
  119. package/lib/cjs/tests/api_tests/formsort_header_auth.test.d.ts +29 -5
  120. package/lib/cjs/tests/api_tests/formsort_header_auth.test.d.ts.map +1 -1
  121. package/lib/cjs/tests/api_tests/formsort_header_auth.test.js +179 -162
  122. package/lib/cjs/tests/api_tests/formsort_header_auth.test.js.map +1 -1
  123. package/lib/cjs/tests/api_tests/gcal_sync_retry.test.d.ts +12 -6
  124. package/lib/cjs/tests/api_tests/gcal_sync_retry.test.d.ts.map +1 -1
  125. package/lib/cjs/tests/api_tests/gcal_sync_retry.test.js +98 -84
  126. package/lib/cjs/tests/api_tests/gcal_sync_retry.test.js.map +1 -1
  127. package/lib/cjs/tests/api_tests/get_some_projection.test.d.ts +20 -5
  128. package/lib/cjs/tests/api_tests/get_some_projection.test.d.ts.map +1 -1
  129. package/lib/cjs/tests/api_tests/get_some_projection.test.js +342 -298
  130. package/lib/cjs/tests/api_tests/get_some_projection.test.js.map +1 -1
  131. package/lib/cjs/tests/api_tests/group_event_attendee_self_update.test.d.ts +6 -5
  132. package/lib/cjs/tests/api_tests/group_event_attendee_self_update.test.d.ts.map +1 -1
  133. package/lib/cjs/tests/api_tests/group_event_attendee_self_update.test.js +294 -223
  134. package/lib/cjs/tests/api_tests/group_event_attendee_self_update.test.js.map +1 -1
  135. package/lib/cjs/tests/api_tests/integrations_redacted.test.d.ts +6 -5
  136. package/lib/cjs/tests/api_tests/integrations_redacted.test.d.ts.map +1 -1
  137. package/lib/cjs/tests/api_tests/integrations_redacted.test.js +307 -213
  138. package/lib/cjs/tests/api_tests/integrations_redacted.test.js.map +1 -1
  139. package/lib/cjs/tests/api_tests/journey_delete_cancels_actions.test.d.ts +6 -5
  140. package/lib/cjs/tests/api_tests/journey_delete_cancels_actions.test.d.ts.map +1 -1
  141. package/lib/cjs/tests/api_tests/journey_delete_cancels_actions.test.js +179 -178
  142. package/lib/cjs/tests/api_tests/journey_delete_cancels_actions.test.js.map +1 -1
  143. package/lib/cjs/tests/api_tests/journey_statistics_cache.test.d.ts +26 -0
  144. package/lib/cjs/tests/api_tests/journey_statistics_cache.test.d.ts.map +1 -0
  145. package/lib/cjs/tests/api_tests/journey_statistics_cache.test.js +232 -0
  146. package/lib/cjs/tests/api_tests/journey_statistics_cache.test.js.map +1 -0
  147. package/lib/cjs/tests/api_tests/journey_step_manual_count.test.d.ts +34 -0
  148. package/lib/cjs/tests/api_tests/journey_step_manual_count.test.d.ts.map +1 -0
  149. package/lib/cjs/tests/api_tests/journey_step_manual_count.test.js +243 -0
  150. package/lib/cjs/tests/api_tests/journey_step_manual_count.test.js.map +1 -0
  151. package/lib/cjs/tests/api_tests/load_team_chat.test.d.ts.map +1 -1
  152. package/lib/cjs/tests/api_tests/load_team_chat.test.js +181 -124
  153. package/lib/cjs/tests/api_tests/load_team_chat.test.js.map +1 -1
  154. package/lib/cjs/tests/api_tests/load_threads_autobuild.test.d.ts +24 -5
  155. package/lib/cjs/tests/api_tests/load_threads_autobuild.test.d.ts.map +1 -1
  156. package/lib/cjs/tests/api_tests/load_threads_autobuild.test.js +261 -227
  157. package/lib/cjs/tests/api_tests/load_threads_autobuild.test.js.map +1 -1
  158. package/lib/cjs/tests/api_tests/load_threads_care_team.test.d.ts +9 -1
  159. package/lib/cjs/tests/api_tests/load_threads_care_team.test.d.ts.map +1 -1
  160. package/lib/cjs/tests/api_tests/load_threads_care_team.test.js +118 -32
  161. package/lib/cjs/tests/api_tests/load_threads_care_team.test.js.map +1 -1
  162. package/lib/cjs/tests/api_tests/managed_content_file_access.test.d.ts +15 -5
  163. package/lib/cjs/tests/api_tests/managed_content_file_access.test.d.ts.map +1 -1
  164. package/lib/cjs/tests/api_tests/managed_content_file_access.test.js +285 -311
  165. package/lib/cjs/tests/api_tests/managed_content_file_access.test.js.map +1 -1
  166. package/lib/cjs/tests/api_tests/mdb_sort.test.d.ts +20 -5
  167. package/lib/cjs/tests/api_tests/mdb_sort.test.d.ts.map +1 -1
  168. package/lib/cjs/tests/api_tests/mdb_sort.test.js +361 -305
  169. package/lib/cjs/tests/api_tests/mdb_sort.test.js.map +1 -1
  170. package/lib/cjs/tests/api_tests/mdi_manual_sync.test.d.ts +27 -0
  171. package/lib/cjs/tests/api_tests/mdi_manual_sync.test.d.ts.map +1 -0
  172. package/lib/cjs/tests/api_tests/mdi_manual_sync.test.js +395 -0
  173. package/lib/cjs/tests/api_tests/mdi_manual_sync.test.js.map +1 -0
  174. package/lib/cjs/tests/api_tests/mdi_trigger_refill.test.d.ts +6 -5
  175. package/lib/cjs/tests/api_tests/mdi_trigger_refill.test.d.ts.map +1 -1
  176. package/lib/cjs/tests/api_tests/mdi_trigger_refill.test.js +259 -209
  177. package/lib/cjs/tests/api_tests/mdi_trigger_refill.test.js.map +1 -1
  178. package/lib/cjs/tests/api_tests/mdi_webhooks.test.d.ts +12 -5
  179. package/lib/cjs/tests/api_tests/mdi_webhooks.test.d.ts.map +1 -1
  180. package/lib/cjs/tests/api_tests/mdi_webhooks.test.js +67 -61
  181. package/lib/cjs/tests/api_tests/mdi_webhooks.test.js.map +1 -1
  182. package/lib/cjs/tests/api_tests/message_assignment_trigger.test.d.ts +23 -14
  183. package/lib/cjs/tests/api_tests/message_assignment_trigger.test.d.ts.map +1 -1
  184. package/lib/cjs/tests/api_tests/message_assignment_trigger.test.js +258 -306
  185. package/lib/cjs/tests/api_tests/message_assignment_trigger.test.js.map +1 -1
  186. package/lib/cjs/tests/api_tests/metriport_push_form_response.test.d.ts +6 -5
  187. package/lib/cjs/tests/api_tests/metriport_push_form_response.test.d.ts.map +1 -1
  188. package/lib/cjs/tests/api_tests/metriport_push_form_response.test.js +301 -238
  189. package/lib/cjs/tests/api_tests/metriport_push_form_response.test.js.map +1 -1
  190. package/lib/cjs/tests/api_tests/organization_api_keys.test.d.ts.map +1 -1
  191. package/lib/cjs/tests/api_tests/organization_api_keys.test.js +226 -59
  192. package/lib/cjs/tests/api_tests/organization_api_keys.test.js.map +1 -1
  193. package/lib/cjs/tests/api_tests/organization_settings_duplicates.test.d.ts +19 -5
  194. package/lib/cjs/tests/api_tests/organization_settings_duplicates.test.d.ts.map +1 -1
  195. package/lib/cjs/tests/api_tests/organization_settings_duplicates.test.js +335 -222
  196. package/lib/cjs/tests/api_tests/organization_settings_duplicates.test.js.map +1 -1
  197. package/lib/cjs/tests/api_tests/organization_signup.test.d.ts +3 -1
  198. package/lib/cjs/tests/api_tests/organization_signup.test.d.ts.map +1 -1
  199. package/lib/cjs/tests/api_tests/organization_signup.test.js +221 -52
  200. package/lib/cjs/tests/api_tests/organization_signup.test.js.map +1 -1
  201. package/lib/cjs/tests/api_tests/out_of_office_endpoint.test.d.ts.map +1 -1
  202. package/lib/cjs/tests/api_tests/out_of_office_endpoint.test.js +109 -1
  203. package/lib/cjs/tests/api_tests/out_of_office_endpoint.test.js.map +1 -1
  204. package/lib/cjs/tests/api_tests/outbound_chat_sent_trigger.test.d.ts +6 -6
  205. package/lib/cjs/tests/api_tests/outbound_chat_sent_trigger.test.d.ts.map +1 -1
  206. package/lib/cjs/tests/api_tests/outbound_chat_sent_trigger.test.js +309 -361
  207. package/lib/cjs/tests/api_tests/outbound_chat_sent_trigger.test.js.map +1 -1
  208. package/lib/cjs/tests/api_tests/phone_calls_cold_transfer.test.d.ts +6 -5
  209. package/lib/cjs/tests/api_tests/phone_calls_cold_transfer.test.d.ts.map +1 -1
  210. package/lib/cjs/tests/api_tests/phone_calls_cold_transfer.test.js +246 -165
  211. package/lib/cjs/tests/api_tests/phone_calls_cold_transfer.test.js.map +1 -1
  212. package/lib/cjs/tests/api_tests/phone_calls_conference_hold.test.d.ts +15 -5
  213. package/lib/cjs/tests/api_tests/phone_calls_conference_hold.test.d.ts.map +1 -1
  214. package/lib/cjs/tests/api_tests/phone_calls_conference_hold.test.js +130 -47
  215. package/lib/cjs/tests/api_tests/phone_calls_conference_hold.test.js.map +1 -1
  216. package/lib/cjs/tests/api_tests/phone_embed_leave_message.test.d.ts +7 -0
  217. package/lib/cjs/tests/api_tests/phone_embed_leave_message.test.d.ts.map +1 -0
  218. package/lib/cjs/tests/api_tests/phone_embed_leave_message.test.js +571 -0
  219. package/lib/cjs/tests/api_tests/phone_embed_leave_message.test.js.map +1 -0
  220. package/lib/cjs/tests/api_tests/phone_tree_enduser_condition.test.d.ts +6 -5
  221. package/lib/cjs/tests/api_tests/phone_tree_enduser_condition.test.d.ts.map +1 -1
  222. package/lib/cjs/tests/api_tests/phone_tree_enduser_condition.test.js +180 -132
  223. package/lib/cjs/tests/api_tests/phone_tree_enduser_condition.test.js.map +1 -1
  224. package/lib/cjs/tests/api_tests/programs.test.d.ts +3 -1
  225. package/lib/cjs/tests/api_tests/programs.test.d.ts.map +1 -1
  226. package/lib/cjs/tests/api_tests/programs.test.js +474 -51
  227. package/lib/cjs/tests/api_tests/programs.test.js.map +1 -1
  228. package/lib/cjs/tests/api_tests/public_form_case_insensitive_match.test.d.ts +7 -0
  229. package/lib/cjs/tests/api_tests/public_form_case_insensitive_match.test.d.ts.map +1 -0
  230. package/lib/cjs/tests/api_tests/public_form_case_insensitive_match.test.js +733 -0
  231. package/lib/cjs/tests/api_tests/public_form_case_insensitive_match.test.js.map +1 -0
  232. package/lib/cjs/tests/api_tests/security/add-to-journey-foreign-enduserid.test.d.ts +3 -1
  233. package/lib/cjs/tests/api_tests/security/add-to-journey-foreign-enduserid.test.d.ts.map +1 -1
  234. package/lib/cjs/tests/api_tests/security/add-to-journey-foreign-enduserid.test.js +3 -1
  235. package/lib/cjs/tests/api_tests/security/add-to-journey-foreign-enduserid.test.js.map +1 -1
  236. package/lib/cjs/tests/api_tests/security/ai-conversations-rbac.test.d.ts +10 -5
  237. package/lib/cjs/tests/api_tests/security/ai-conversations-rbac.test.d.ts.map +1 -1
  238. package/lib/cjs/tests/api_tests/security/ai-conversations-rbac.test.js +401 -282
  239. package/lib/cjs/tests/api_tests/security/ai-conversations-rbac.test.js.map +1 -1
  240. package/lib/cjs/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts +3 -1
  241. package/lib/cjs/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts.map +1 -1
  242. package/lib/cjs/tests/api_tests/security/appointment-reschedule-ownership.test.js +3 -1
  243. package/lib/cjs/tests/api_tests/security/appointment-reschedule-ownership.test.js.map +1 -1
  244. package/lib/cjs/tests/api_tests/security/automated-actions-process-gate.test.d.ts +9 -5
  245. package/lib/cjs/tests/api_tests/security/automated-actions-process-gate.test.d.ts.map +1 -1
  246. package/lib/cjs/tests/api_tests/security/automated-actions-process-gate.test.js +228 -211
  247. package/lib/cjs/tests/api_tests/security/automated-actions-process-gate.test.js.map +1 -1
  248. package/lib/cjs/tests/api_tests/security/booking-info-idor-token-mint.test.d.ts +13 -8
  249. package/lib/cjs/tests/api_tests/security/booking-info-idor-token-mint.test.d.ts.map +1 -1
  250. package/lib/cjs/tests/api_tests/security/booking-info-idor-token-mint.test.js +270 -254
  251. package/lib/cjs/tests/api_tests/security/booking-info-idor-token-mint.test.js.map +1 -1
  252. package/lib/cjs/tests/api_tests/security/cascade-role-rename-cross-tenant.test.d.ts +16 -6
  253. package/lib/cjs/tests/api_tests/security/cascade-role-rename-cross-tenant.test.d.ts.map +1 -1
  254. package/lib/cjs/tests/api_tests/security/cascade-role-rename-cross-tenant.test.js +167 -142
  255. package/lib/cjs/tests/api_tests/security/cascade-role-rename-cross-tenant.test.js.map +1 -1
  256. package/lib/cjs/tests/api_tests/security/data-sync-redaction-bypass.test.d.ts +10 -5
  257. package/lib/cjs/tests/api_tests/security/data-sync-redaction-bypass.test.d.ts.map +1 -1
  258. package/lib/cjs/tests/api_tests/security/data-sync-redaction-bypass.test.js +296 -221
  259. package/lib/cjs/tests/api_tests/security/data-sync-redaction-bypass.test.js.map +1 -1
  260. package/lib/cjs/tests/api_tests/security/develop-health-benefit-verification-rbac.test.d.ts +12 -5
  261. package/lib/cjs/tests/api_tests/security/develop-health-benefit-verification-rbac.test.d.ts.map +1 -1
  262. package/lib/cjs/tests/api_tests/security/develop-health-benefit-verification-rbac.test.js +221 -216
  263. package/lib/cjs/tests/api_tests/security/develop-health-benefit-verification-rbac.test.js.map +1 -1
  264. package/lib/cjs/tests/api_tests/security/enduser-ai-summary-trust-gate.test.d.ts +11 -5
  265. package/lib/cjs/tests/api_tests/security/enduser-ai-summary-trust-gate.test.d.ts.map +1 -1
  266. package/lib/cjs/tests/api_tests/security/enduser-ai-summary-trust-gate.test.js +300 -203
  267. package/lib/cjs/tests/api_tests/security/enduser-ai-summary-trust-gate.test.js.map +1 -1
  268. package/lib/cjs/tests/api_tests/security/enduser-cross-create.test.d.ts +11 -5
  269. package/lib/cjs/tests/api_tests/security/enduser-cross-create.test.d.ts.map +1 -1
  270. package/lib/cjs/tests/api_tests/security/enduser-cross-create.test.js +415 -275
  271. package/lib/cjs/tests/api_tests/security/enduser-cross-create.test.js.map +1 -1
  272. package/lib/cjs/tests/api_tests/security/enduser-write-restrictions.test.d.ts +11 -5
  273. package/lib/cjs/tests/api_tests/security/enduser-write-restrictions.test.d.ts.map +1 -1
  274. package/lib/cjs/tests/api_tests/security/enduser-write-restrictions.test.js +347 -228
  275. package/lib/cjs/tests/api_tests/security/enduser-write-restrictions.test.js.map +1 -1
  276. package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.d.ts +3 -1
  277. package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.d.ts.map +1 -1
  278. package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.js +3 -1
  279. package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.js.map +1 -1
  280. package/lib/cjs/tests/api_tests/security/form-logic-js-execution.test.d.ts +3 -1
  281. package/lib/cjs/tests/api_tests/security/form-logic-js-execution.test.d.ts.map +1 -1
  282. package/lib/cjs/tests/api_tests/security/form-logic-js-execution.test.js +3 -1
  283. package/lib/cjs/tests/api_tests/security/form-logic-js-execution.test.js.map +1 -1
  284. package/lib/cjs/tests/api_tests/security/formsort_webhook_auth_field_lock.test.d.ts.map +1 -1
  285. package/lib/cjs/tests/api_tests/security/formsort_webhook_auth_field_lock.test.js +424 -39
  286. package/lib/cjs/tests/api_tests/security/formsort_webhook_auth_field_lock.test.js.map +1 -1
  287. package/lib/cjs/tests/api_tests/security/globalunique-conflict-redaction.test.d.ts +18 -7
  288. package/lib/cjs/tests/api_tests/security/globalunique-conflict-redaction.test.d.ts.map +1 -1
  289. package/lib/cjs/tests/api_tests/security/globalunique-conflict-redaction.test.js +164 -75
  290. package/lib/cjs/tests/api_tests/security/globalunique-conflict-redaction.test.js.map +1 -1
  291. package/lib/cjs/tests/api_tests/security/handle-incoming-communication-cross-tenant.test.d.ts +15 -9
  292. package/lib/cjs/tests/api_tests/security/handle-incoming-communication-cross-tenant.test.d.ts.map +1 -1
  293. package/lib/cjs/tests/api_tests/security/handle-incoming-communication-cross-tenant.test.js +99 -102
  294. package/lib/cjs/tests/api_tests/security/handle-incoming-communication-cross-tenant.test.js.map +1 -1
  295. package/lib/cjs/tests/api_tests/security/load-inbox-redaction.test.d.ts +11 -5
  296. package/lib/cjs/tests/api_tests/security/load-inbox-redaction.test.d.ts.map +1 -1
  297. package/lib/cjs/tests/api_tests/security/load-inbox-redaction.test.js +132 -89
  298. package/lib/cjs/tests/api_tests/security/load-inbox-redaction.test.js.map +1 -1
  299. package/lib/cjs/tests/api_tests/security/proxy-image-unauth-ssrf.test.d.ts +12 -5
  300. package/lib/cjs/tests/api_tests/security/proxy-image-unauth-ssrf.test.d.ts.map +1 -1
  301. package/lib/cjs/tests/api_tests/security/proxy-image-unauth-ssrf.test.js +190 -138
  302. package/lib/cjs/tests/api_tests/security/proxy-image-unauth-ssrf.test.js.map +1 -1
  303. package/lib/cjs/tests/api_tests/security/register_business_id_injection.test.d.ts +18 -16
  304. package/lib/cjs/tests/api_tests/security/register_business_id_injection.test.d.ts.map +1 -1
  305. package/lib/cjs/tests/api_tests/security/register_business_id_injection.test.js +164 -124
  306. package/lib/cjs/tests/api_tests/security/register_business_id_injection.test.js.map +1 -1
  307. package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts +3 -1
  308. package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts.map +1 -1
  309. package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js +3 -1
  310. package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js.map +1 -1
  311. package/lib/cjs/tests/api_tests/security/sanitize-user-html-with-iframes.test.d.ts.map +1 -1
  312. package/lib/cjs/tests/api_tests/security/sanitize-user-html-with-iframes.test.js +122 -2
  313. package/lib/cjs/tests/api_tests/security/sanitize-user-html-with-iframes.test.js.map +1 -1
  314. package/lib/cjs/tests/api_tests/security/schema-adminonly-enforcement.test.d.ts +11 -5
  315. package/lib/cjs/tests/api_tests/security/schema-adminonly-enforcement.test.d.ts.map +1 -1
  316. package/lib/cjs/tests/api_tests/security/schema-adminonly-enforcement.test.js +288 -274
  317. package/lib/cjs/tests/api_tests/security/schema-adminonly-enforcement.test.js.map +1 -1
  318. package/lib/cjs/tests/api_tests/security/self-admin-role-assignment.test.d.ts +17 -10
  319. package/lib/cjs/tests/api_tests/security/self-admin-role-assignment.test.d.ts.map +1 -1
  320. package/lib/cjs/tests/api_tests/security/self-admin-role-assignment.test.js +173 -138
  321. package/lib/cjs/tests/api_tests/security/self-admin-role-assignment.test.js.map +1 -1
  322. package/lib/cjs/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.d.ts +6 -5
  323. package/lib/cjs/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.d.ts.map +1 -1
  324. package/lib/cjs/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.js +310 -265
  325. package/lib/cjs/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.js.map +1 -1
  326. package/lib/cjs/tests/api_tests/security/webhook-timeout.test.d.ts +9 -5
  327. package/lib/cjs/tests/api_tests/security/webhook-timeout.test.d.ts.map +1 -1
  328. package/lib/cjs/tests/api_tests/security/webhook-timeout.test.js +108 -83
  329. package/lib/cjs/tests/api_tests/security/webhook-timeout.test.js.map +1 -1
  330. package/lib/cjs/tests/api_tests/session_for_join_link.test.d.ts +10 -0
  331. package/lib/cjs/tests/api_tests/session_for_join_link.test.d.ts.map +1 -0
  332. package/lib/cjs/tests/api_tests/session_for_join_link.test.js +147 -0
  333. package/lib/cjs/tests/api_tests/session_for_join_link.test.js.map +1 -0
  334. package/lib/cjs/tests/api_tests/set_fields_order_templates.test.d.ts.map +1 -1
  335. package/lib/cjs/tests/api_tests/set_fields_order_templates.test.js +191 -88
  336. package/lib/cjs/tests/api_tests/set_fields_order_templates.test.js.map +1 -1
  337. package/lib/cjs/tests/api_tests/stedi_approval.test.d.ts +6 -5
  338. package/lib/cjs/tests/api_tests/stedi_approval.test.d.ts.map +1 -1
  339. package/lib/cjs/tests/api_tests/stedi_approval.test.js +206 -137
  340. package/lib/cjs/tests/api_tests/stedi_approval.test.js.map +1 -1
  341. package/lib/cjs/tests/api_tests/stripe_checkout_items.test.d.ts +17 -0
  342. package/lib/cjs/tests/api_tests/stripe_checkout_items.test.d.ts.map +1 -0
  343. package/lib/cjs/tests/api_tests/stripe_checkout_items.test.js +219 -0
  344. package/lib/cjs/tests/api_tests/stripe_checkout_items.test.js.map +1 -0
  345. package/lib/cjs/tests/api_tests/stripe_multiple_customer_ids.test.d.ts +5 -0
  346. package/lib/cjs/tests/api_tests/stripe_multiple_customer_ids.test.d.ts.map +1 -0
  347. package/lib/cjs/tests/api_tests/stripe_multiple_customer_ids.test.js +396 -0
  348. package/lib/cjs/tests/api_tests/stripe_multiple_customer_ids.test.js.map +1 -0
  349. package/lib/cjs/tests/api_tests/ticket_stage_archive.test.d.ts +7 -0
  350. package/lib/cjs/tests/api_tests/ticket_stage_archive.test.d.ts.map +1 -0
  351. package/lib/cjs/tests/api_tests/ticket_stage_archive.test.js +344 -0
  352. package/lib/cjs/tests/api_tests/ticket_stage_archive.test.js.map +1 -0
  353. package/lib/cjs/tests/api_tests/tickets_bulk_assign_care_team.test.d.ts +6 -5
  354. package/lib/cjs/tests/api_tests/tickets_bulk_assign_care_team.test.d.ts.map +1 -1
  355. package/lib/cjs/tests/api_tests/tickets_bulk_assign_care_team.test.js +165 -149
  356. package/lib/cjs/tests/api_tests/tickets_bulk_assign_care_team.test.js.map +1 -1
  357. package/lib/cjs/tests/api_tests/tickets_bulk_assign_from_queue.test.d.ts +3 -1
  358. package/lib/cjs/tests/api_tests/tickets_bulk_assign_from_queue.test.d.ts.map +1 -1
  359. package/lib/cjs/tests/api_tests/tickets_bulk_assign_from_queue.test.js +3 -1
  360. package/lib/cjs/tests/api_tests/tickets_bulk_assign_from_queue.test.js.map +1 -1
  361. package/lib/cjs/tests/api_tests/totp_mfa.test.d.ts.map +1 -1
  362. package/lib/cjs/tests/api_tests/totp_mfa.test.js +37 -31
  363. package/lib/cjs/tests/api_tests/totp_mfa.test.js.map +1 -1
  364. package/lib/cjs/tests/api_tests/translations.test.d.ts +6 -5
  365. package/lib/cjs/tests/api_tests/translations.test.d.ts.map +1 -1
  366. package/lib/cjs/tests/api_tests/translations.test.js +104 -75
  367. package/lib/cjs/tests/api_tests/translations.test.js.map +1 -1
  368. package/lib/cjs/tests/api_tests/trigger_contains_matching.test.d.ts +3 -1
  369. package/lib/cjs/tests/api_tests/trigger_contains_matching.test.d.ts.map +1 -1
  370. package/lib/cjs/tests/api_tests/trigger_contains_matching.test.js +3 -1
  371. package/lib/cjs/tests/api_tests/trigger_contains_matching.test.js.map +1 -1
  372. package/lib/cjs/tests/api_tests/trigger_set_fields_date_difference.test.d.ts +21 -4
  373. package/lib/cjs/tests/api_tests/trigger_set_fields_date_difference.test.d.ts.map +1 -1
  374. package/lib/cjs/tests/api_tests/trigger_set_fields_date_difference.test.js +238 -370
  375. package/lib/cjs/tests/api_tests/trigger_set_fields_date_difference.test.js.map +1 -1
  376. package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.d.ts +3 -1
  377. package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.d.ts.map +1 -1
  378. package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.js +3 -1
  379. package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.js.map +1 -1
  380. package/lib/cjs/tests/api_tests/user_preferences.test.d.ts +30 -0
  381. package/lib/cjs/tests/api_tests/user_preferences.test.d.ts.map +1 -0
  382. package/lib/cjs/tests/api_tests/user_preferences.test.js +279 -0
  383. package/lib/cjs/tests/api_tests/user_preferences.test.js.map +1 -0
  384. package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.d.ts +3 -1
  385. package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.d.ts.map +1 -1
  386. package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.js +3 -1
  387. package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.js.map +1 -1
  388. package/lib/cjs/tests/api_tests/vitl_push.test.d.ts +7 -0
  389. package/lib/cjs/tests/api_tests/vitl_push.test.d.ts.map +1 -0
  390. package/lib/cjs/tests/api_tests/vitl_push.test.js +341 -0
  391. package/lib/cjs/tests/api_tests/vitl_push.test.js.map +1 -0
  392. package/lib/cjs/tests/api_tests/webhook_error_handling.test.d.ts +17 -5
  393. package/lib/cjs/tests/api_tests/webhook_error_handling.test.d.ts.map +1 -1
  394. package/lib/cjs/tests/api_tests/webhook_error_handling.test.js +204 -195
  395. package/lib/cjs/tests/api_tests/webhook_error_handling.test.js.map +1 -1
  396. package/lib/cjs/tests/api_tests/webhook_raw_json_number.test.d.ts +15 -5
  397. package/lib/cjs/tests/api_tests/webhook_raw_json_number.test.d.ts.map +1 -1
  398. package/lib/cjs/tests/api_tests/webhook_raw_json_number.test.js +154 -179
  399. package/lib/cjs/tests/api_tests/webhook_raw_json_number.test.js.map +1 -1
  400. package/lib/cjs/tests/api_tests/welle_partner_token.test.d.ts +6 -5
  401. package/lib/cjs/tests/api_tests/welle_partner_token.test.d.ts.map +1 -1
  402. package/lib/cjs/tests/api_tests/welle_partner_token.test.js +393 -251
  403. package/lib/cjs/tests/api_tests/welle_partner_token.test.js.map +1 -1
  404. package/lib/cjs/tests/setup_isolated.d.ts +55 -0
  405. package/lib/cjs/tests/setup_isolated.d.ts.map +1 -1
  406. package/lib/cjs/tests/setup_isolated.js +119 -1
  407. package/lib/cjs/tests/setup_isolated.js.map +1 -1
  408. package/lib/cjs/tests/tests.d.ts.map +1 -1
  409. package/lib/cjs/tests/tests.js +385 -535
  410. package/lib/cjs/tests/tests.js.map +1 -1
  411. package/lib/cjs/tests/unit_tests/date_string_validation.test.d.ts +2 -0
  412. package/lib/cjs/tests/unit_tests/date_string_validation.test.d.ts.map +1 -0
  413. package/lib/cjs/tests/unit_tests/date_string_validation.test.js +112 -0
  414. package/lib/cjs/tests/unit_tests/date_string_validation.test.js.map +1 -0
  415. package/lib/cjs/tests/unit_tests/isolated_suite_discovery.test.d.ts +2 -0
  416. package/lib/cjs/tests/unit_tests/isolated_suite_discovery.test.d.ts.map +1 -0
  417. package/lib/cjs/tests/unit_tests/isolated_suite_discovery.test.js +201 -0
  418. package/lib/cjs/tests/unit_tests/isolated_suite_discovery.test.js.map +1 -0
  419. package/lib/cjs/tests/unit_tests/programs_conditional_logic.test.d.ts +3 -0
  420. package/lib/cjs/tests/unit_tests/programs_conditional_logic.test.d.ts.map +1 -0
  421. package/lib/cjs/tests/unit_tests/programs_conditional_logic.test.js +120 -0
  422. package/lib/cjs/tests/unit_tests/programs_conditional_logic.test.js.map +1 -0
  423. package/lib/cjs/tests/webhooks_tests.js +44 -34
  424. package/lib/cjs/tests/webhooks_tests.js.map +1 -1
  425. package/lib/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  426. package/lib/esm/sdk.d.ts +375 -4
  427. package/lib/esm/sdk.d.ts.map +1 -1
  428. package/lib/esm/sdk.js +5 -0
  429. package/lib/esm/sdk.js.map +1 -1
  430. package/lib/esm/tests/api_tests/ai_conversations.test.d.ts +14 -5
  431. package/lib/esm/tests/api_tests/ai_conversations.test.d.ts.map +1 -1
  432. package/lib/esm/tests/api_tests/ai_conversations.test.js +161 -148
  433. package/lib/esm/tests/api_tests/ai_conversations.test.js.map +1 -1
  434. package/lib/esm/tests/api_tests/ai_conversations_agent_message.test.d.ts +22 -0
  435. package/lib/esm/tests/api_tests/ai_conversations_agent_message.test.d.ts.map +1 -0
  436. package/lib/esm/tests/api_tests/ai_conversations_agent_message.test.js +510 -0
  437. package/lib/esm/tests/api_tests/ai_conversations_agent_message.test.js.map +1 -0
  438. package/lib/esm/tests/api_tests/appointment_link_expiration.test.d.ts +6 -5
  439. package/lib/esm/tests/api_tests/appointment_link_expiration.test.d.ts.map +1 -1
  440. package/lib/esm/tests/api_tests/appointment_link_expiration.test.js +132 -71
  441. package/lib/esm/tests/api_tests/appointment_link_expiration.test.js.map +1 -1
  442. package/lib/esm/tests/api_tests/appointment_no_showed_trigger.test.d.ts +6 -5
  443. package/lib/esm/tests/api_tests/appointment_no_showed_trigger.test.d.ts.map +1 -1
  444. package/lib/esm/tests/api_tests/appointment_no_showed_trigger.test.js +238 -173
  445. package/lib/esm/tests/api_tests/appointment_no_showed_trigger.test.js.map +1 -1
  446. package/lib/esm/tests/api_tests/availability_block_buffer.test.d.ts +22 -0
  447. package/lib/esm/tests/api_tests/availability_block_buffer.test.d.ts.map +1 -0
  448. package/lib/esm/tests/api_tests/availability_block_buffer.test.js +306 -0
  449. package/lib/esm/tests/api_tests/availability_block_buffer.test.js.map +1 -0
  450. package/lib/esm/tests/api_tests/beluga_manual_sync.test.d.ts +6 -5
  451. package/lib/esm/tests/api_tests/beluga_manual_sync.test.d.ts.map +1 -1
  452. package/lib/esm/tests/api_tests/beluga_manual_sync.test.js +232 -190
  453. package/lib/esm/tests/api_tests/beluga_manual_sync.test.js.map +1 -1
  454. package/lib/esm/tests/api_tests/beluga_trigger_refill.test.d.ts +6 -5
  455. package/lib/esm/tests/api_tests/beluga_trigger_refill.test.d.ts.map +1 -1
  456. package/lib/esm/tests/api_tests/beluga_trigger_refill.test.js +348 -262
  457. package/lib/esm/tests/api_tests/beluga_trigger_refill.test.js.map +1 -1
  458. package/lib/esm/tests/api_tests/booking_prevent_upcoming_duplicate.test.d.ts +22 -0
  459. package/lib/esm/tests/api_tests/booking_prevent_upcoming_duplicate.test.d.ts.map +1 -0
  460. package/lib/esm/tests/api_tests/booking_prevent_upcoming_duplicate.test.js +501 -0
  461. package/lib/esm/tests/api_tests/booking_prevent_upcoming_duplicate.test.js.map +1 -0
  462. package/lib/esm/tests/api_tests/bulk_assignment.test.d.ts +16 -5
  463. package/lib/esm/tests/api_tests/bulk_assignment.test.d.ts.map +1 -1
  464. package/lib/esm/tests/api_tests/bulk_assignment.test.js +333 -241
  465. package/lib/esm/tests/api_tests/bulk_assignment.test.js.map +1 -1
  466. package/lib/esm/tests/api_tests/calendar_event_references_update.test.d.ts +13 -5
  467. package/lib/esm/tests/api_tests/calendar_event_references_update.test.d.ts.map +1 -1
  468. package/lib/esm/tests/api_tests/calendar_event_references_update.test.js +129 -107
  469. package/lib/esm/tests/api_tests/calendar_event_references_update.test.js.map +1 -1
  470. package/lib/esm/tests/api_tests/calendar_event_webhook_template.test.d.ts +15 -5
  471. package/lib/esm/tests/api_tests/calendar_event_webhook_template.test.d.ts.map +1 -1
  472. package/lib/esm/tests/api_tests/calendar_event_webhook_template.test.js +238 -251
  473. package/lib/esm/tests/api_tests/calendar_event_webhook_template.test.js.map +1 -1
  474. package/lib/esm/tests/api_tests/chats_analytics.test.d.ts +14 -5
  475. package/lib/esm/tests/api_tests/chats_analytics.test.d.ts.map +1 -1
  476. package/lib/esm/tests/api_tests/chats_analytics.test.js +188 -188
  477. package/lib/esm/tests/api_tests/chats_analytics.test.js.map +1 -1
  478. package/lib/esm/tests/api_tests/concurrent_build_threads.test.d.ts +23 -5
  479. package/lib/esm/tests/api_tests/concurrent_build_threads.test.d.ts.map +1 -1
  480. package/lib/esm/tests/api_tests/concurrent_build_threads.test.js +119 -117
  481. package/lib/esm/tests/api_tests/concurrent_build_threads.test.js.map +1 -1
  482. package/lib/esm/tests/api_tests/configurations_public_read.test.d.ts +21 -5
  483. package/lib/esm/tests/api_tests/configurations_public_read.test.d.ts.map +1 -1
  484. package/lib/esm/tests/api_tests/configurations_public_read.test.js +233 -118
  485. package/lib/esm/tests/api_tests/configurations_public_read.test.js.map +1 -1
  486. package/lib/esm/tests/api_tests/copied_form_response_no_enduser_sync.test.d.ts +7 -0
  487. package/lib/esm/tests/api_tests/copied_form_response_no_enduser_sync.test.d.ts.map +1 -0
  488. package/lib/esm/tests/api_tests/copied_form_response_no_enduser_sync.test.js +351 -0
  489. package/lib/esm/tests/api_tests/copied_form_response_no_enduser_sync.test.js.map +1 -0
  490. package/lib/esm/tests/api_tests/create_note_action.test.d.ts +18 -5
  491. package/lib/esm/tests/api_tests/create_note_action.test.d.ts.map +1 -1
  492. package/lib/esm/tests/api_tests/create_note_action.test.js +216 -172
  493. package/lib/esm/tests/api_tests/create_note_action.test.js.map +1 -1
  494. package/lib/esm/tests/api_tests/create_user_notifications_trigger.test.d.ts +17 -4
  495. package/lib/esm/tests/api_tests/create_user_notifications_trigger.test.d.ts.map +1 -1
  496. package/lib/esm/tests/api_tests/create_user_notifications_trigger.test.js +141 -203
  497. package/lib/esm/tests/api_tests/create_user_notifications_trigger.test.js.map +1 -1
  498. package/lib/esm/tests/api_tests/custom_aggregation.test.d.ts +15 -5
  499. package/lib/esm/tests/api_tests/custom_aggregation.test.d.ts.map +1 -1
  500. package/lib/esm/tests/api_tests/custom_aggregation.test.js +282 -222
  501. package/lib/esm/tests/api_tests/custom_aggregation.test.js.map +1 -1
  502. package/lib/esm/tests/api_tests/database_cascade_delete.test.d.ts +13 -5
  503. package/lib/esm/tests/api_tests/database_cascade_delete.test.d.ts.map +1 -1
  504. package/lib/esm/tests/api_tests/database_cascade_delete.test.js +216 -241
  505. package/lib/esm/tests/api_tests/database_cascade_delete.test.js.map +1 -1
  506. package/lib/esm/tests/api_tests/dont_sync_to_elation_form_submission.test.d.ts +21 -5
  507. package/lib/esm/tests/api_tests/dont_sync_to_elation_form_submission.test.d.ts.map +1 -1
  508. package/lib/esm/tests/api_tests/dont_sync_to_elation_form_submission.test.js +165 -110
  509. package/lib/esm/tests/api_tests/dont_sync_to_elation_form_submission.test.js.map +1 -1
  510. package/lib/esm/tests/api_tests/elation_user_id.test.d.ts +17 -5
  511. package/lib/esm/tests/api_tests/elation_user_id.test.d.ts.map +1 -1
  512. package/lib/esm/tests/api_tests/elation_user_id.test.js +119 -53
  513. package/lib/esm/tests/api_tests/elation_user_id.test.js.map +1 -1
  514. package/lib/esm/tests/api_tests/enduser_fields_sync.test.d.ts +3 -1
  515. package/lib/esm/tests/api_tests/enduser_fields_sync.test.d.ts.map +1 -1
  516. package/lib/esm/tests/api_tests/enduser_fields_sync.test.js +2 -0
  517. package/lib/esm/tests/api_tests/enduser_fields_sync.test.js.map +1 -1
  518. package/lib/esm/tests/api_tests/enduser_observations_auto_review.test.d.ts +3 -1
  519. package/lib/esm/tests/api_tests/enduser_observations_auto_review.test.d.ts.map +1 -1
  520. package/lib/esm/tests/api_tests/enduser_observations_auto_review.test.js +2 -0
  521. package/lib/esm/tests/api_tests/enduser_observations_auto_review.test.js.map +1 -1
  522. package/lib/esm/tests/api_tests/file_download_unicode_names.test.d.ts +6 -5
  523. package/lib/esm/tests/api_tests/file_download_unicode_names.test.d.ts.map +1 -1
  524. package/lib/esm/tests/api_tests/file_download_unicode_names.test.js +190 -141
  525. package/lib/esm/tests/api_tests/file_download_unicode_names.test.js.map +1 -1
  526. package/lib/esm/tests/api_tests/form_intake_email_normalization.test.d.ts +7 -0
  527. package/lib/esm/tests/api_tests/form_intake_email_normalization.test.d.ts.map +1 -0
  528. package/lib/esm/tests/api_tests/form_intake_email_normalization.test.js +527 -0
  529. package/lib/esm/tests/api_tests/form_intake_email_normalization.test.js.map +1 -0
  530. package/lib/esm/tests/api_tests/form_submitted_trigger.test.d.ts +25 -5
  531. package/lib/esm/tests/api_tests/form_submitted_trigger.test.d.ts.map +1 -1
  532. package/lib/esm/tests/api_tests/form_submitted_trigger.test.js +393 -365
  533. package/lib/esm/tests/api_tests/form_submitted_trigger.test.js.map +1 -1
  534. package/lib/esm/tests/api_tests/form_translations.test.d.ts +6 -5
  535. package/lib/esm/tests/api_tests/form_translations.test.d.ts.map +1 -1
  536. package/lib/esm/tests/api_tests/form_translations.test.js +268 -189
  537. package/lib/esm/tests/api_tests/form_translations.test.js.map +1 -1
  538. package/lib/esm/tests/api_tests/form_vital_reading.test.d.ts +7 -0
  539. package/lib/esm/tests/api_tests/form_vital_reading.test.d.ts.map +1 -0
  540. package/lib/esm/tests/api_tests/form_vital_reading.test.js +456 -0
  541. package/lib/esm/tests/api_tests/form_vital_reading.test.js.map +1 -0
  542. package/lib/esm/tests/api_tests/formsort_header_auth.test.d.ts +29 -5
  543. package/lib/esm/tests/api_tests/formsort_header_auth.test.d.ts.map +1 -1
  544. package/lib/esm/tests/api_tests/formsort_header_auth.test.js +177 -161
  545. package/lib/esm/tests/api_tests/formsort_header_auth.test.js.map +1 -1
  546. package/lib/esm/tests/api_tests/gcal_sync_retry.test.d.ts +12 -6
  547. package/lib/esm/tests/api_tests/gcal_sync_retry.test.d.ts.map +1 -1
  548. package/lib/esm/tests/api_tests/gcal_sync_retry.test.js +96 -83
  549. package/lib/esm/tests/api_tests/gcal_sync_retry.test.js.map +1 -1
  550. package/lib/esm/tests/api_tests/get_some_projection.test.d.ts +20 -5
  551. package/lib/esm/tests/api_tests/get_some_projection.test.d.ts.map +1 -1
  552. package/lib/esm/tests/api_tests/get_some_projection.test.js +339 -296
  553. package/lib/esm/tests/api_tests/get_some_projection.test.js.map +1 -1
  554. package/lib/esm/tests/api_tests/group_event_attendee_self_update.test.d.ts +6 -5
  555. package/lib/esm/tests/api_tests/group_event_attendee_self_update.test.d.ts.map +1 -1
  556. package/lib/esm/tests/api_tests/group_event_attendee_self_update.test.js +292 -222
  557. package/lib/esm/tests/api_tests/group_event_attendee_self_update.test.js.map +1 -1
  558. package/lib/esm/tests/api_tests/integrations_redacted.test.d.ts +6 -5
  559. package/lib/esm/tests/api_tests/integrations_redacted.test.d.ts.map +1 -1
  560. package/lib/esm/tests/api_tests/integrations_redacted.test.js +304 -211
  561. package/lib/esm/tests/api_tests/integrations_redacted.test.js.map +1 -1
  562. package/lib/esm/tests/api_tests/journey_delete_cancels_actions.test.d.ts +6 -5
  563. package/lib/esm/tests/api_tests/journey_delete_cancels_actions.test.d.ts.map +1 -1
  564. package/lib/esm/tests/api_tests/journey_delete_cancels_actions.test.js +177 -154
  565. package/lib/esm/tests/api_tests/journey_delete_cancels_actions.test.js.map +1 -1
  566. package/lib/esm/tests/api_tests/journey_statistics_cache.test.d.ts +26 -0
  567. package/lib/esm/tests/api_tests/journey_statistics_cache.test.d.ts.map +1 -0
  568. package/lib/esm/tests/api_tests/journey_statistics_cache.test.js +227 -0
  569. package/lib/esm/tests/api_tests/journey_statistics_cache.test.js.map +1 -0
  570. package/lib/esm/tests/api_tests/journey_step_manual_count.test.d.ts +34 -0
  571. package/lib/esm/tests/api_tests/journey_step_manual_count.test.d.ts.map +1 -0
  572. package/lib/esm/tests/api_tests/journey_step_manual_count.test.js +238 -0
  573. package/lib/esm/tests/api_tests/journey_step_manual_count.test.js.map +1 -0
  574. package/lib/esm/tests/api_tests/load_team_chat.test.d.ts.map +1 -1
  575. package/lib/esm/tests/api_tests/load_team_chat.test.js +181 -124
  576. package/lib/esm/tests/api_tests/load_team_chat.test.js.map +1 -1
  577. package/lib/esm/tests/api_tests/load_threads_autobuild.test.d.ts +24 -5
  578. package/lib/esm/tests/api_tests/load_threads_autobuild.test.d.ts.map +1 -1
  579. package/lib/esm/tests/api_tests/load_threads_autobuild.test.js +259 -226
  580. package/lib/esm/tests/api_tests/load_threads_autobuild.test.js.map +1 -1
  581. package/lib/esm/tests/api_tests/load_threads_care_team.test.d.ts +9 -1
  582. package/lib/esm/tests/api_tests/load_threads_care_team.test.d.ts.map +1 -1
  583. package/lib/esm/tests/api_tests/load_threads_care_team.test.js +117 -31
  584. package/lib/esm/tests/api_tests/load_threads_care_team.test.js.map +1 -1
  585. package/lib/esm/tests/api_tests/managed_content_file_access.test.d.ts +15 -5
  586. package/lib/esm/tests/api_tests/managed_content_file_access.test.d.ts.map +1 -1
  587. package/lib/esm/tests/api_tests/managed_content_file_access.test.js +283 -287
  588. package/lib/esm/tests/api_tests/managed_content_file_access.test.js.map +1 -1
  589. package/lib/esm/tests/api_tests/mdb_sort.test.d.ts +20 -5
  590. package/lib/esm/tests/api_tests/mdb_sort.test.d.ts.map +1 -1
  591. package/lib/esm/tests/api_tests/mdb_sort.test.js +358 -303
  592. package/lib/esm/tests/api_tests/mdb_sort.test.js.map +1 -1
  593. package/lib/esm/tests/api_tests/mdi_manual_sync.test.d.ts +27 -0
  594. package/lib/esm/tests/api_tests/mdi_manual_sync.test.d.ts.map +1 -0
  595. package/lib/esm/tests/api_tests/mdi_manual_sync.test.js +390 -0
  596. package/lib/esm/tests/api_tests/mdi_manual_sync.test.js.map +1 -0
  597. package/lib/esm/tests/api_tests/mdi_trigger_refill.test.d.ts +6 -5
  598. package/lib/esm/tests/api_tests/mdi_trigger_refill.test.d.ts.map +1 -1
  599. package/lib/esm/tests/api_tests/mdi_trigger_refill.test.js +257 -208
  600. package/lib/esm/tests/api_tests/mdi_trigger_refill.test.js.map +1 -1
  601. package/lib/esm/tests/api_tests/mdi_webhooks.test.d.ts +12 -5
  602. package/lib/esm/tests/api_tests/mdi_webhooks.test.d.ts.map +1 -1
  603. package/lib/esm/tests/api_tests/mdi_webhooks.test.js +65 -60
  604. package/lib/esm/tests/api_tests/mdi_webhooks.test.js.map +1 -1
  605. package/lib/esm/tests/api_tests/message_assignment_trigger.test.d.ts +23 -14
  606. package/lib/esm/tests/api_tests/message_assignment_trigger.test.d.ts.map +1 -1
  607. package/lib/esm/tests/api_tests/message_assignment_trigger.test.js +256 -305
  608. package/lib/esm/tests/api_tests/message_assignment_trigger.test.js.map +1 -1
  609. package/lib/esm/tests/api_tests/metriport_push_form_response.test.d.ts +6 -5
  610. package/lib/esm/tests/api_tests/metriport_push_form_response.test.d.ts.map +1 -1
  611. package/lib/esm/tests/api_tests/metriport_push_form_response.test.js +298 -236
  612. package/lib/esm/tests/api_tests/metriport_push_form_response.test.js.map +1 -1
  613. package/lib/esm/tests/api_tests/organization_api_keys.test.d.ts.map +1 -1
  614. package/lib/esm/tests/api_tests/organization_api_keys.test.js +226 -59
  615. package/lib/esm/tests/api_tests/organization_api_keys.test.js.map +1 -1
  616. package/lib/esm/tests/api_tests/organization_settings_duplicates.test.d.ts +19 -5
  617. package/lib/esm/tests/api_tests/organization_settings_duplicates.test.d.ts.map +1 -1
  618. package/lib/esm/tests/api_tests/organization_settings_duplicates.test.js +332 -220
  619. package/lib/esm/tests/api_tests/organization_settings_duplicates.test.js.map +1 -1
  620. package/lib/esm/tests/api_tests/organization_signup.test.d.ts +3 -1
  621. package/lib/esm/tests/api_tests/organization_signup.test.d.ts.map +1 -1
  622. package/lib/esm/tests/api_tests/organization_signup.test.js +220 -51
  623. package/lib/esm/tests/api_tests/organization_signup.test.js.map +1 -1
  624. package/lib/esm/tests/api_tests/out_of_office_endpoint.test.d.ts.map +1 -1
  625. package/lib/esm/tests/api_tests/out_of_office_endpoint.test.js +109 -1
  626. package/lib/esm/tests/api_tests/out_of_office_endpoint.test.js.map +1 -1
  627. package/lib/esm/tests/api_tests/outbound_chat_sent_trigger.test.d.ts +6 -6
  628. package/lib/esm/tests/api_tests/outbound_chat_sent_trigger.test.d.ts.map +1 -1
  629. package/lib/esm/tests/api_tests/outbound_chat_sent_trigger.test.js +308 -361
  630. package/lib/esm/tests/api_tests/outbound_chat_sent_trigger.test.js.map +1 -1
  631. package/lib/esm/tests/api_tests/phone_calls_cold_transfer.test.d.ts +6 -5
  632. package/lib/esm/tests/api_tests/phone_calls_cold_transfer.test.d.ts.map +1 -1
  633. package/lib/esm/tests/api_tests/phone_calls_cold_transfer.test.js +243 -163
  634. package/lib/esm/tests/api_tests/phone_calls_cold_transfer.test.js.map +1 -1
  635. package/lib/esm/tests/api_tests/phone_calls_conference_hold.test.d.ts +15 -5
  636. package/lib/esm/tests/api_tests/phone_calls_conference_hold.test.d.ts.map +1 -1
  637. package/lib/esm/tests/api_tests/phone_calls_conference_hold.test.js +127 -45
  638. package/lib/esm/tests/api_tests/phone_calls_conference_hold.test.js.map +1 -1
  639. package/lib/esm/tests/api_tests/phone_embed_leave_message.test.d.ts +7 -0
  640. package/lib/esm/tests/api_tests/phone_embed_leave_message.test.d.ts.map +1 -0
  641. package/lib/esm/tests/api_tests/phone_embed_leave_message.test.js +566 -0
  642. package/lib/esm/tests/api_tests/phone_embed_leave_message.test.js.map +1 -0
  643. package/lib/esm/tests/api_tests/phone_tree_enduser_condition.test.d.ts +6 -5
  644. package/lib/esm/tests/api_tests/phone_tree_enduser_condition.test.d.ts.map +1 -1
  645. package/lib/esm/tests/api_tests/phone_tree_enduser_condition.test.js +177 -130
  646. package/lib/esm/tests/api_tests/phone_tree_enduser_condition.test.js.map +1 -1
  647. package/lib/esm/tests/api_tests/programs.test.d.ts +3 -1
  648. package/lib/esm/tests/api_tests/programs.test.d.ts.map +1 -1
  649. package/lib/esm/tests/api_tests/programs.test.js +473 -50
  650. package/lib/esm/tests/api_tests/programs.test.js.map +1 -1
  651. package/lib/esm/tests/api_tests/public_form_case_insensitive_match.test.d.ts +7 -0
  652. package/lib/esm/tests/api_tests/public_form_case_insensitive_match.test.d.ts.map +1 -0
  653. package/lib/esm/tests/api_tests/public_form_case_insensitive_match.test.js +728 -0
  654. package/lib/esm/tests/api_tests/public_form_case_insensitive_match.test.js.map +1 -0
  655. package/lib/esm/tests/api_tests/security/add-to-journey-foreign-enduserid.test.d.ts +3 -1
  656. package/lib/esm/tests/api_tests/security/add-to-journey-foreign-enduserid.test.d.ts.map +1 -1
  657. package/lib/esm/tests/api_tests/security/add-to-journey-foreign-enduserid.test.js +2 -0
  658. package/lib/esm/tests/api_tests/security/add-to-journey-foreign-enduserid.test.js.map +1 -1
  659. package/lib/esm/tests/api_tests/security/ai-conversations-rbac.test.d.ts +10 -5
  660. package/lib/esm/tests/api_tests/security/ai-conversations-rbac.test.d.ts.map +1 -1
  661. package/lib/esm/tests/api_tests/security/ai-conversations-rbac.test.js +399 -281
  662. package/lib/esm/tests/api_tests/security/ai-conversations-rbac.test.js.map +1 -1
  663. package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts +3 -1
  664. package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts.map +1 -1
  665. package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.js +2 -0
  666. package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.js.map +1 -1
  667. package/lib/esm/tests/api_tests/security/automated-actions-process-gate.test.d.ts +9 -5
  668. package/lib/esm/tests/api_tests/security/automated-actions-process-gate.test.d.ts.map +1 -1
  669. package/lib/esm/tests/api_tests/security/automated-actions-process-gate.test.js +225 -209
  670. package/lib/esm/tests/api_tests/security/automated-actions-process-gate.test.js.map +1 -1
  671. package/lib/esm/tests/api_tests/security/booking-info-idor-token-mint.test.d.ts +13 -8
  672. package/lib/esm/tests/api_tests/security/booking-info-idor-token-mint.test.d.ts.map +1 -1
  673. package/lib/esm/tests/api_tests/security/booking-info-idor-token-mint.test.js +268 -253
  674. package/lib/esm/tests/api_tests/security/booking-info-idor-token-mint.test.js.map +1 -1
  675. package/lib/esm/tests/api_tests/security/cascade-role-rename-cross-tenant.test.d.ts +16 -6
  676. package/lib/esm/tests/api_tests/security/cascade-role-rename-cross-tenant.test.d.ts.map +1 -1
  677. package/lib/esm/tests/api_tests/security/cascade-role-rename-cross-tenant.test.js +165 -141
  678. package/lib/esm/tests/api_tests/security/cascade-role-rename-cross-tenant.test.js.map +1 -1
  679. package/lib/esm/tests/api_tests/security/data-sync-redaction-bypass.test.d.ts +10 -5
  680. package/lib/esm/tests/api_tests/security/data-sync-redaction-bypass.test.d.ts.map +1 -1
  681. package/lib/esm/tests/api_tests/security/data-sync-redaction-bypass.test.js +294 -220
  682. package/lib/esm/tests/api_tests/security/data-sync-redaction-bypass.test.js.map +1 -1
  683. package/lib/esm/tests/api_tests/security/develop-health-benefit-verification-rbac.test.d.ts +12 -5
  684. package/lib/esm/tests/api_tests/security/develop-health-benefit-verification-rbac.test.d.ts.map +1 -1
  685. package/lib/esm/tests/api_tests/security/develop-health-benefit-verification-rbac.test.js +219 -215
  686. package/lib/esm/tests/api_tests/security/develop-health-benefit-verification-rbac.test.js.map +1 -1
  687. package/lib/esm/tests/api_tests/security/enduser-ai-summary-trust-gate.test.d.ts +11 -5
  688. package/lib/esm/tests/api_tests/security/enduser-ai-summary-trust-gate.test.d.ts.map +1 -1
  689. package/lib/esm/tests/api_tests/security/enduser-ai-summary-trust-gate.test.js +298 -202
  690. package/lib/esm/tests/api_tests/security/enduser-ai-summary-trust-gate.test.js.map +1 -1
  691. package/lib/esm/tests/api_tests/security/enduser-cross-create.test.d.ts +11 -5
  692. package/lib/esm/tests/api_tests/security/enduser-cross-create.test.d.ts.map +1 -1
  693. package/lib/esm/tests/api_tests/security/enduser-cross-create.test.js +413 -274
  694. package/lib/esm/tests/api_tests/security/enduser-cross-create.test.js.map +1 -1
  695. package/lib/esm/tests/api_tests/security/enduser-write-restrictions.test.d.ts +11 -5
  696. package/lib/esm/tests/api_tests/security/enduser-write-restrictions.test.d.ts.map +1 -1
  697. package/lib/esm/tests/api_tests/security/enduser-write-restrictions.test.js +345 -227
  698. package/lib/esm/tests/api_tests/security/enduser-write-restrictions.test.js.map +1 -1
  699. package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.d.ts +3 -1
  700. package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.d.ts.map +1 -1
  701. package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.js +2 -0
  702. package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.js.map +1 -1
  703. package/lib/esm/tests/api_tests/security/form-logic-js-execution.test.d.ts +3 -1
  704. package/lib/esm/tests/api_tests/security/form-logic-js-execution.test.d.ts.map +1 -1
  705. package/lib/esm/tests/api_tests/security/form-logic-js-execution.test.js +2 -0
  706. package/lib/esm/tests/api_tests/security/form-logic-js-execution.test.js.map +1 -1
  707. package/lib/esm/tests/api_tests/security/formsort_webhook_auth_field_lock.test.d.ts.map +1 -1
  708. package/lib/esm/tests/api_tests/security/formsort_webhook_auth_field_lock.test.js +424 -39
  709. package/lib/esm/tests/api_tests/security/formsort_webhook_auth_field_lock.test.js.map +1 -1
  710. package/lib/esm/tests/api_tests/security/globalunique-conflict-redaction.test.d.ts +18 -7
  711. package/lib/esm/tests/api_tests/security/globalunique-conflict-redaction.test.d.ts.map +1 -1
  712. package/lib/esm/tests/api_tests/security/globalunique-conflict-redaction.test.js +162 -74
  713. package/lib/esm/tests/api_tests/security/globalunique-conflict-redaction.test.js.map +1 -1
  714. package/lib/esm/tests/api_tests/security/handle-incoming-communication-cross-tenant.test.d.ts +15 -9
  715. package/lib/esm/tests/api_tests/security/handle-incoming-communication-cross-tenant.test.d.ts.map +1 -1
  716. package/lib/esm/tests/api_tests/security/handle-incoming-communication-cross-tenant.test.js +96 -100
  717. package/lib/esm/tests/api_tests/security/handle-incoming-communication-cross-tenant.test.js.map +1 -1
  718. package/lib/esm/tests/api_tests/security/load-inbox-redaction.test.d.ts +11 -5
  719. package/lib/esm/tests/api_tests/security/load-inbox-redaction.test.d.ts.map +1 -1
  720. package/lib/esm/tests/api_tests/security/load-inbox-redaction.test.js +129 -87
  721. package/lib/esm/tests/api_tests/security/load-inbox-redaction.test.js.map +1 -1
  722. package/lib/esm/tests/api_tests/security/proxy-image-unauth-ssrf.test.d.ts +12 -5
  723. package/lib/esm/tests/api_tests/security/proxy-image-unauth-ssrf.test.d.ts.map +1 -1
  724. package/lib/esm/tests/api_tests/security/proxy-image-unauth-ssrf.test.js +187 -136
  725. package/lib/esm/tests/api_tests/security/proxy-image-unauth-ssrf.test.js.map +1 -1
  726. package/lib/esm/tests/api_tests/security/register_business_id_injection.test.d.ts +18 -16
  727. package/lib/esm/tests/api_tests/security/register_business_id_injection.test.d.ts.map +1 -1
  728. package/lib/esm/tests/api_tests/security/register_business_id_injection.test.js +162 -123
  729. package/lib/esm/tests/api_tests/security/register_business_id_injection.test.js.map +1 -1
  730. package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts +3 -1
  731. package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts.map +1 -1
  732. package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js +2 -0
  733. package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js.map +1 -1
  734. package/lib/esm/tests/api_tests/security/sanitize-user-html-with-iframes.test.d.ts.map +1 -1
  735. package/lib/esm/tests/api_tests/security/sanitize-user-html-with-iframes.test.js +122 -2
  736. package/lib/esm/tests/api_tests/security/sanitize-user-html-with-iframes.test.js.map +1 -1
  737. package/lib/esm/tests/api_tests/security/schema-adminonly-enforcement.test.d.ts +11 -5
  738. package/lib/esm/tests/api_tests/security/schema-adminonly-enforcement.test.d.ts.map +1 -1
  739. package/lib/esm/tests/api_tests/security/schema-adminonly-enforcement.test.js +285 -272
  740. package/lib/esm/tests/api_tests/security/schema-adminonly-enforcement.test.js.map +1 -1
  741. package/lib/esm/tests/api_tests/security/self-admin-role-assignment.test.d.ts +17 -10
  742. package/lib/esm/tests/api_tests/security/self-admin-role-assignment.test.d.ts.map +1 -1
  743. package/lib/esm/tests/api_tests/security/self-admin-role-assignment.test.js +171 -137
  744. package/lib/esm/tests/api_tests/security/self-admin-role-assignment.test.js.map +1 -1
  745. package/lib/esm/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.d.ts +6 -5
  746. package/lib/esm/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.d.ts.map +1 -1
  747. package/lib/esm/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.js +307 -263
  748. package/lib/esm/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.js.map +1 -1
  749. package/lib/esm/tests/api_tests/security/webhook-timeout.test.d.ts +9 -5
  750. package/lib/esm/tests/api_tests/security/webhook-timeout.test.d.ts.map +1 -1
  751. package/lib/esm/tests/api_tests/security/webhook-timeout.test.js +105 -81
  752. package/lib/esm/tests/api_tests/security/webhook-timeout.test.js.map +1 -1
  753. package/lib/esm/tests/api_tests/session_for_join_link.test.d.ts +10 -0
  754. package/lib/esm/tests/api_tests/session_for_join_link.test.d.ts.map +1 -0
  755. package/lib/esm/tests/api_tests/session_for_join_link.test.js +142 -0
  756. package/lib/esm/tests/api_tests/session_for_join_link.test.js.map +1 -0
  757. package/lib/esm/tests/api_tests/set_fields_order_templates.test.d.ts.map +1 -1
  758. package/lib/esm/tests/api_tests/set_fields_order_templates.test.js +191 -88
  759. package/lib/esm/tests/api_tests/set_fields_order_templates.test.js.map +1 -1
  760. package/lib/esm/tests/api_tests/stedi_approval.test.d.ts +6 -5
  761. package/lib/esm/tests/api_tests/stedi_approval.test.d.ts.map +1 -1
  762. package/lib/esm/tests/api_tests/stedi_approval.test.js +204 -136
  763. package/lib/esm/tests/api_tests/stedi_approval.test.js.map +1 -1
  764. package/lib/esm/tests/api_tests/stripe_checkout_items.test.d.ts +17 -0
  765. package/lib/esm/tests/api_tests/stripe_checkout_items.test.d.ts.map +1 -0
  766. package/lib/esm/tests/api_tests/stripe_checkout_items.test.js +214 -0
  767. package/lib/esm/tests/api_tests/stripe_checkout_items.test.js.map +1 -0
  768. package/lib/esm/tests/api_tests/stripe_multiple_customer_ids.test.d.ts +5 -0
  769. package/lib/esm/tests/api_tests/stripe_multiple_customer_ids.test.d.ts.map +1 -0
  770. package/lib/esm/tests/api_tests/stripe_multiple_customer_ids.test.js +388 -0
  771. package/lib/esm/tests/api_tests/stripe_multiple_customer_ids.test.js.map +1 -0
  772. package/lib/esm/tests/api_tests/ticket_stage_archive.test.d.ts +7 -0
  773. package/lib/esm/tests/api_tests/ticket_stage_archive.test.d.ts.map +1 -0
  774. package/lib/esm/tests/api_tests/ticket_stage_archive.test.js +339 -0
  775. package/lib/esm/tests/api_tests/ticket_stage_archive.test.js.map +1 -0
  776. package/lib/esm/tests/api_tests/tickets_bulk_assign_care_team.test.d.ts +6 -5
  777. package/lib/esm/tests/api_tests/tickets_bulk_assign_care_team.test.d.ts.map +1 -1
  778. package/lib/esm/tests/api_tests/tickets_bulk_assign_care_team.test.js +162 -147
  779. package/lib/esm/tests/api_tests/tickets_bulk_assign_care_team.test.js.map +1 -1
  780. package/lib/esm/tests/api_tests/tickets_bulk_assign_from_queue.test.d.ts +3 -1
  781. package/lib/esm/tests/api_tests/tickets_bulk_assign_from_queue.test.d.ts.map +1 -1
  782. package/lib/esm/tests/api_tests/tickets_bulk_assign_from_queue.test.js +2 -0
  783. package/lib/esm/tests/api_tests/tickets_bulk_assign_from_queue.test.js.map +1 -1
  784. package/lib/esm/tests/api_tests/totp_mfa.test.d.ts.map +1 -1
  785. package/lib/esm/tests/api_tests/totp_mfa.test.js +37 -31
  786. package/lib/esm/tests/api_tests/totp_mfa.test.js.map +1 -1
  787. package/lib/esm/tests/api_tests/translations.test.d.ts +6 -5
  788. package/lib/esm/tests/api_tests/translations.test.d.ts.map +1 -1
  789. package/lib/esm/tests/api_tests/translations.test.js +102 -74
  790. package/lib/esm/tests/api_tests/translations.test.js.map +1 -1
  791. package/lib/esm/tests/api_tests/trigger_contains_matching.test.d.ts +3 -1
  792. package/lib/esm/tests/api_tests/trigger_contains_matching.test.d.ts.map +1 -1
  793. package/lib/esm/tests/api_tests/trigger_contains_matching.test.js +2 -0
  794. package/lib/esm/tests/api_tests/trigger_contains_matching.test.js.map +1 -1
  795. package/lib/esm/tests/api_tests/trigger_set_fields_date_difference.test.d.ts +21 -4
  796. package/lib/esm/tests/api_tests/trigger_set_fields_date_difference.test.d.ts.map +1 -1
  797. package/lib/esm/tests/api_tests/trigger_set_fields_date_difference.test.js +236 -369
  798. package/lib/esm/tests/api_tests/trigger_set_fields_date_difference.test.js.map +1 -1
  799. package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.d.ts +3 -1
  800. package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.d.ts.map +1 -1
  801. package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.js +2 -0
  802. package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.js.map +1 -1
  803. package/lib/esm/tests/api_tests/user_preferences.test.d.ts +30 -0
  804. package/lib/esm/tests/api_tests/user_preferences.test.d.ts.map +1 -0
  805. package/lib/esm/tests/api_tests/user_preferences.test.js +274 -0
  806. package/lib/esm/tests/api_tests/user_preferences.test.js.map +1 -0
  807. package/lib/esm/tests/api_tests/vital_review_trigger_action.test.d.ts +3 -1
  808. package/lib/esm/tests/api_tests/vital_review_trigger_action.test.d.ts.map +1 -1
  809. package/lib/esm/tests/api_tests/vital_review_trigger_action.test.js +2 -0
  810. package/lib/esm/tests/api_tests/vital_review_trigger_action.test.js.map +1 -1
  811. package/lib/esm/tests/api_tests/vitl_push.test.d.ts +7 -0
  812. package/lib/esm/tests/api_tests/vitl_push.test.d.ts.map +1 -0
  813. package/lib/esm/tests/api_tests/vitl_push.test.js +333 -0
  814. package/lib/esm/tests/api_tests/vitl_push.test.js.map +1 -0
  815. package/lib/esm/tests/api_tests/webhook_error_handling.test.d.ts +17 -5
  816. package/lib/esm/tests/api_tests/webhook_error_handling.test.d.ts.map +1 -1
  817. package/lib/esm/tests/api_tests/webhook_error_handling.test.js +202 -194
  818. package/lib/esm/tests/api_tests/webhook_error_handling.test.js.map +1 -1
  819. package/lib/esm/tests/api_tests/webhook_raw_json_number.test.d.ts +15 -5
  820. package/lib/esm/tests/api_tests/webhook_raw_json_number.test.d.ts.map +1 -1
  821. package/lib/esm/tests/api_tests/webhook_raw_json_number.test.js +152 -178
  822. package/lib/esm/tests/api_tests/webhook_raw_json_number.test.js.map +1 -1
  823. package/lib/esm/tests/api_tests/welle_partner_token.test.d.ts +6 -5
  824. package/lib/esm/tests/api_tests/welle_partner_token.test.d.ts.map +1 -1
  825. package/lib/esm/tests/api_tests/welle_partner_token.test.js +391 -250
  826. package/lib/esm/tests/api_tests/welle_partner_token.test.js.map +1 -1
  827. package/lib/esm/tests/setup_isolated.d.ts +55 -0
  828. package/lib/esm/tests/setup_isolated.d.ts.map +1 -1
  829. package/lib/esm/tests/setup_isolated.js +114 -0
  830. package/lib/esm/tests/setup_isolated.js.map +1 -1
  831. package/lib/esm/tests/tests.d.ts.map +1 -1
  832. package/lib/esm/tests/tests.js +386 -536
  833. package/lib/esm/tests/tests.js.map +1 -1
  834. package/lib/esm/tests/unit_tests/date_string_validation.test.d.ts +2 -0
  835. package/lib/esm/tests/unit_tests/date_string_validation.test.d.ts.map +1 -0
  836. package/lib/esm/tests/unit_tests/date_string_validation.test.js +108 -0
  837. package/lib/esm/tests/unit_tests/date_string_validation.test.js.map +1 -0
  838. package/lib/esm/tests/unit_tests/isolated_suite_discovery.test.d.ts +2 -0
  839. package/lib/esm/tests/unit_tests/isolated_suite_discovery.test.d.ts.map +1 -0
  840. package/lib/esm/tests/unit_tests/isolated_suite_discovery.test.js +174 -0
  841. package/lib/esm/tests/unit_tests/isolated_suite_discovery.test.js.map +1 -0
  842. package/lib/esm/tests/unit_tests/programs_conditional_logic.test.d.ts +3 -0
  843. package/lib/esm/tests/unit_tests/programs_conditional_logic.test.d.ts.map +1 -0
  844. package/lib/esm/tests/unit_tests/programs_conditional_logic.test.js +117 -0
  845. package/lib/esm/tests/unit_tests/programs_conditional_logic.test.js.map +1 -0
  846. package/lib/esm/tests/webhooks_tests.js +44 -34
  847. package/lib/esm/tests/webhooks_tests.js.map +1 -1
  848. package/lib/tsconfig.tsbuildinfo +1 -1
  849. package/package.json +12 -11
  850. package/src/sdk.ts +14 -2
  851. package/src/tests/api_tests/ai_conversations.test.ts +170 -138
  852. package/src/tests/api_tests/ai_conversations_agent_message.test.ts +491 -0
  853. package/src/tests/api_tests/appointment_link_expiration.test.ts +94 -35
  854. package/src/tests/api_tests/appointment_no_showed_trigger.test.ts +181 -128
  855. package/src/tests/api_tests/availability_block_buffer.test.ts +286 -0
  856. package/src/tests/api_tests/beluga_manual_sync.test.ts +103 -53
  857. package/src/tests/api_tests/beluga_trigger_refill.test.ts +131 -46
  858. package/src/tests/api_tests/booking_prevent_upcoming_duplicate.test.ts +541 -0
  859. package/src/tests/api_tests/bulk_assignment.test.ts +307 -220
  860. package/src/tests/api_tests/calendar_event_references_update.test.ts +97 -54
  861. package/src/tests/api_tests/calendar_event_webhook_template.test.ts +198 -158
  862. package/src/tests/api_tests/chats_analytics.test.ts +161 -123
  863. package/src/tests/api_tests/concurrent_build_threads.test.ts +80 -69
  864. package/src/tests/api_tests/configurations_public_read.test.ts +154 -67
  865. package/src/tests/api_tests/copied_form_response_no_enduser_sync.test.ts +307 -0
  866. package/src/tests/api_tests/create_note_action.test.ts +149 -70
  867. package/src/tests/api_tests/create_user_notifications_trigger.test.ts +116 -144
  868. package/src/tests/api_tests/custom_aggregation.test.ts +163 -92
  869. package/src/tests/api_tests/database_cascade_delete.test.ts +101 -87
  870. package/src/tests/api_tests/dont_sync_to_elation_form_submission.test.ts +122 -51
  871. package/src/tests/api_tests/elation_user_id.test.ts +105 -42
  872. package/src/tests/api_tests/enduser_fields_sync.test.ts +4 -0
  873. package/src/tests/api_tests/enduser_observations_auto_review.test.ts +4 -0
  874. package/src/tests/api_tests/file_download_unicode_names.test.ts +171 -122
  875. package/src/tests/api_tests/form_intake_email_normalization.test.ts +489 -0
  876. package/src/tests/api_tests/form_submitted_trigger.test.ts +152 -86
  877. package/src/tests/api_tests/form_translations.test.ts +117 -48
  878. package/src/tests/api_tests/form_vital_reading.test.ts +393 -0
  879. package/src/tests/api_tests/formsort_header_auth.test.ts +147 -97
  880. package/src/tests/api_tests/gcal_sync_retry.test.ts +71 -49
  881. package/src/tests/api_tests/get_some_projection.test.ts +333 -169
  882. package/src/tests/api_tests/group_event_attendee_self_update.test.ts +103 -52
  883. package/src/tests/api_tests/integrations_redacted.test.ts +161 -84
  884. package/src/tests/api_tests/journey_delete_cancels_actions.test.ts +93 -64
  885. package/src/tests/api_tests/journey_statistics_cache.test.ts +237 -0
  886. package/src/tests/api_tests/journey_step_manual_count.test.ts +220 -0
  887. package/src/tests/api_tests/load_team_chat.test.ts +62 -6
  888. package/src/tests/api_tests/load_threads_autobuild.test.ts +163 -67
  889. package/src/tests/api_tests/load_threads_care_team.test.ts +107 -0
  890. package/src/tests/api_tests/managed_content_file_access.test.ts +132 -108
  891. package/src/tests/api_tests/mdb_sort.test.ts +247 -161
  892. package/src/tests/api_tests/mdi_manual_sync.test.ts +277 -0
  893. package/src/tests/api_tests/mdi_trigger_refill.test.ts +132 -78
  894. package/src/tests/api_tests/mdi_webhooks.test.ts +52 -22
  895. package/src/tests/api_tests/message_assignment_trigger.test.ts +129 -155
  896. package/src/tests/api_tests/metriport_push_form_response.test.ts +109 -49
  897. package/src/tests/api_tests/organization_api_keys.test.ts +170 -2
  898. package/src/tests/api_tests/organization_settings_duplicates.test.ts +291 -181
  899. package/src/tests/api_tests/organization_signup.test.ts +174 -5
  900. package/src/tests/api_tests/out_of_office_endpoint.test.ts +98 -0
  901. package/src/tests/api_tests/outbound_chat_sent_trigger.test.ts +163 -175
  902. package/src/tests/api_tests/phone_calls_cold_transfer.test.ts +195 -133
  903. package/src/tests/api_tests/phone_calls_conference_hold.test.ts +112 -42
  904. package/src/tests/api_tests/phone_embed_leave_message.test.ts +541 -0
  905. package/src/tests/api_tests/phone_tree_enduser_condition.test.ts +81 -32
  906. package/src/tests/api_tests/programs.test.ts +701 -0
  907. package/src/tests/api_tests/public_form_case_insensitive_match.test.ts +632 -0
  908. package/src/tests/api_tests/security/add-to-journey-foreign-enduserid.test.ts +4 -0
  909. package/src/tests/api_tests/security/ai-conversations-rbac.test.ts +248 -128
  910. package/src/tests/api_tests/security/appointment-reschedule-ownership.test.ts +4 -0
  911. package/src/tests/api_tests/security/automated-actions-process-gate.test.ts +47 -42
  912. package/src/tests/api_tests/security/booking-info-idor-token-mint.test.ts +53 -45
  913. package/src/tests/api_tests/security/cascade-role-rename-cross-tenant.test.ts +100 -73
  914. package/src/tests/api_tests/security/data-sync-redaction-bypass.test.ts +125 -59
  915. package/src/tests/api_tests/security/develop-health-benefit-verification-rbac.test.ts +131 -103
  916. package/src/tests/api_tests/security/enduser-ai-summary-trust-gate.test.ts +161 -68
  917. package/src/tests/api_tests/security/enduser-cross-create.test.ts +200 -61
  918. package/src/tests/api_tests/security/enduser-write-restrictions.test.ts +179 -61
  919. package/src/tests/api_tests/security/file-link-session-confinement.test.ts +4 -0
  920. package/src/tests/api_tests/security/form-logic-js-execution.test.ts +4 -0
  921. package/src/tests/api_tests/security/formsort_webhook_auth_field_lock.test.ts +225 -0
  922. package/src/tests/api_tests/security/globalunique-conflict-redaction.test.ts +163 -44
  923. package/src/tests/api_tests/security/handle-incoming-communication-cross-tenant.test.ts +78 -70
  924. package/src/tests/api_tests/security/load-inbox-redaction.test.ts +79 -44
  925. package/src/tests/api_tests/security/proxy-image-unauth-ssrf.test.ts +95 -52
  926. package/src/tests/api_tests/security/register_business_id_injection.test.ts +132 -93
  927. package/src/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.ts +4 -0
  928. package/src/tests/api_tests/security/sanitize-user-html-with-iframes.test.ts +127 -0
  929. package/src/tests/api_tests/security/schema-adminonly-enforcement.test.ts +42 -37
  930. package/src/tests/api_tests/security/self-admin-role-assignment.test.ts +92 -54
  931. package/src/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.ts +76 -34
  932. package/src/tests/api_tests/security/webhook-timeout.test.ts +67 -36
  933. package/src/tests/api_tests/session_for_join_link.test.ts +99 -0
  934. package/src/tests/api_tests/set_fields_order_templates.test.ts +94 -9
  935. package/src/tests/api_tests/stedi_approval.test.ts +156 -90
  936. package/src/tests/api_tests/stripe_checkout_items.test.ts +186 -0
  937. package/src/tests/api_tests/ticket_stage_archive.test.ts +314 -0
  938. package/src/tests/api_tests/tickets_bulk_assign_care_team.test.ts +138 -103
  939. package/src/tests/api_tests/tickets_bulk_assign_from_queue.test.ts +4 -0
  940. package/src/tests/api_tests/totp_mfa.test.ts +10 -5
  941. package/src/tests/api_tests/translations.test.ts +69 -46
  942. package/src/tests/api_tests/trigger_contains_matching.test.ts +4 -0
  943. package/src/tests/api_tests/trigger_set_fields_date_difference.test.ts +198 -256
  944. package/src/tests/api_tests/user_logs_restore_deleted.test.ts +4 -0
  945. package/src/tests/api_tests/user_preferences.test.ts +227 -0
  946. package/src/tests/api_tests/vital_review_trigger_action.test.ts +455 -0
  947. package/src/tests/api_tests/vitl_push.test.ts +323 -0
  948. package/src/tests/api_tests/webhook_error_handling.test.ts +121 -60
  949. package/src/tests/api_tests/webhook_raw_json_number.test.ts +127 -109
  950. package/src/tests/api_tests/welle_partner_token.test.ts +217 -90
  951. package/src/tests/setup_isolated.ts +147 -0
  952. package/src/tests/tests.ts +165 -177
  953. package/src/tests/{api_tests → unit_tests}/date_string_validation.test.ts +2 -23
  954. package/src/tests/unit_tests/isolated_suite_discovery.test.ts +178 -0
  955. package/src/tests/unit_tests/programs_conditional_logic.test.ts +189 -0
  956. package/src/tests/webhooks_tests.ts +6 -1
  957. package/test_generated.pdf +0 -0
@@ -2,31 +2,18 @@ require('source-map-support').install();
2
2
 
3
3
  import http from "http"
4
4
  import axios from "axios"
5
- import { Session } from "../../../sdk"
6
5
  import {
7
- async_test,
8
- log_header,
9
- } from "@tellescope/testing"
10
- import { setup_tests } from "../../setup"
6
+ assert_checks,
7
+ Check,
8
+ IsolatedSuite,
9
+ setup_isolated_tenant,
10
+ } from "../../setup_isolated"
11
11
 
12
12
  const host = process.env.API_URL || 'http://localhost:8080' as const
13
13
 
14
- const LOCAL_HOSTNAMES = ['localhost', '127.0.0.1', '::1']
14
+ const RAND = () => Math.random().toString(36).slice(2, 10)
15
15
 
16
- /**
17
- * 127.0.0.1 only means "the machine running this test" when the API is also local. Against staging or
18
- * prod it is the API server itself — the sentinel below would never be contacted, every assertion
19
- * here would pass for the wrong reason, and we would be probing a live environment. Fail loudly.
20
- */
21
- const assert_local_api = () => {
22
- const hostname = new URL(host).hostname
23
- if (!LOCAL_HOSTNAMES.includes(hostname)) {
24
- throw new Error(
25
- `SSRF tests must run against a local API (got ${host}). `
26
- + `127.0.0.1 would resolve to the API server rather than this machine, so the tests would be meaningless.`
27
- )
28
- }
29
- }
16
+ const LOCAL_HOSTNAMES = ['localhost', '127.0.0.1', '::1']
30
17
 
31
18
  /**
32
19
  * Regression tests: `/v1/proxy-image` must refuse internal and non-image destinations.
@@ -55,10 +42,30 @@ const assert_local_api = () => {
55
42
  * The authenticated happy-path test lives with the Phase 2 endpoint change — it cannot exist here
56
43
  * because the POST route does not yet exist, and a test that fails for "not implemented" would muddy
57
44
  * the vulnerability proof.
45
+ *
46
+ * 127.0.0.1 only means "the machine running this test" when the API is also local. Against staging or
47
+ * prod it is the API server itself — the sentinel below would never be contacted and every check here
48
+ * would pass for the wrong reason. So a non-local API_URL records ONE FAILING check and returns: this
49
+ * suite goes deliberately red rather than skipping, because a skipped SSRF proof rots silently. It
50
+ * must not throw: a throw propagates out of run_isolated_in_parallel and aborts every remaining batch.
58
51
  */
59
- export const proxy_image_ssrf_tests = async ({ sdk } : { sdk: Session, sdkNonAdmin: Session }) => {
60
- log_header("proxy-image unauthenticated SSRF")
61
- assert_local_api()
52
+ export const proxy_image_ssrf_checks = async (): Promise<Check[]> => {
53
+ const checks: Check[] = []
54
+ const record = (label: string, pass: boolean, detail: string) => checks.push({ label, pass, detail })
55
+
56
+ // Before provisioning, deliberately: an early return after setup_isolated_tenant but outside the
57
+ // try/finally would strand a tenant that nothing in the system can delete.
58
+ const hostname = new URL(host).hostname
59
+ if (!LOCAL_HOSTNAMES.includes(hostname)) {
60
+ record(
61
+ 'SSRF proof runs against a local API',
62
+ false,
63
+ `API_URL is ${host}, which is not local. 127.0.0.1 would resolve to the API server rather than `
64
+ + `this machine, so the sentinel could never be contacted and every check below would pass for `
65
+ + `the wrong reason. Re-run against a local API; this suite is red, not skipped, on purpose.`,
66
+ )
67
+ return checks
68
+ }
62
69
 
63
70
  const SENTINEL = `f0025-sentinel-${Date.now()}-${Math.random().toString(36).slice(2)}`
64
71
  let sentinelHits = 0
@@ -71,7 +78,34 @@ export const proxy_image_ssrf_tests = async ({ sdk } : { sdk: Session, sdkNonAdm
71
78
  res.end(JSON.stringify({ sentinel: SENTINEL, credentials: 'internal-only' }))
72
79
  })
73
80
 
81
+ /**
82
+ * The async_test({ onResult }) equivalent, as a soft Check: a call that REJECTS is a failure
83
+ * (async_test treats it the same way), and a resolved call passes only when onResult agrees.
84
+ */
85
+ const expect_result = async <T,>(label: string, fn: () => Promise<T>, onResult: (r: T) => boolean) => {
86
+ try {
87
+ const result = await fn()
88
+ // The raw value decides the fallback, not JSON.stringify of it.
89
+ const stringified = JSON.stringify(result)
90
+ record(label, onResult(result), `result=${stringified === undefined ? String(result) : stringified}`)
91
+ } catch (e: any) {
92
+ const message = typeof e?.message === 'string' && e.message !== ''
93
+ ? e.message
94
+ : (e === undefined || e === null ? String(e) : JSON.stringify(e))
95
+ record(label, false, `rejected instead of resolving: ${message}`)
96
+ }
97
+ }
98
+
99
+ let tenant: Awaited<ReturnType<typeof setup_isolated_tenant>> | undefined
100
+
74
101
  try {
102
+ tenant = await setup_isolated_tenant({
103
+ name: `Proxy-image unauthenticated SSRF ${RAND()}`,
104
+ users: [{ isAdmin: true }],
105
+ apiKeys: 0,
106
+ })
107
+ const { sdk } = tenant
108
+
75
109
  await new Promise<void>(resolve => sentinel.listen(0, '127.0.0.1', () => resolve()))
76
110
  const sentinelPort = (sentinel.address() as any).port
77
111
  const sentinelURL = `http://127.0.0.1:${sentinelPort}/latest/meta-data/iam/security-credentials/`
@@ -93,26 +127,28 @@ export const proxy_image_ssrf_tests = async ({ sdk } : { sdk: Session, sdkNonAdm
93
127
  }
94
128
 
95
129
  // T1 — the core SSRF: an unauthenticated caller must not be able to read an internal resource.
96
- await async_test(
130
+ await expect_result(
97
131
  'proxy-image does not stream an internal non-image resource to an unauthenticated caller',
98
132
  call_unauthenticated,
99
- {
100
- // Positive control: a numeric status proves we actually reached our API rather than failing to
101
- // connect (a connection error would make "nothing leaked" true for the wrong reason).
102
- onResult: (r: any) => (
103
- typeof r.status === 'number'
104
- && r.leaked === false
105
- && r.sentinelHits === 0
106
- ),
107
- },
133
+ // Positive control: a numeric status proves we actually reached our API rather than failing to
134
+ // connect (a connection error would make "nothing leaked" true for the wrong reason).
135
+ (r: any) => (
136
+ typeof r.status === 'number'
137
+ && r.leaked === false
138
+ && r.sentinelHits === 0
139
+ ),
108
140
  )
109
141
 
110
142
  // T2 — the unauthenticated surface itself: the request must be refused outright, and the
111
143
  // destination must never be contacted (no SSRF-as-a-side-effect even when the body is withheld).
112
- await async_test(
144
+ await expect_result(
113
145
  'proxy-image refuses an unauthenticated request without contacting the destination',
114
146
  call_unauthenticated,
115
- { onResult: (r: any) => r.status >= 400 && r.status < 500 && r.sentinelHits === 0 },
147
+ // 429 is excluded explicitly: this suite now runs inside the 8-wide isolated pool, where a
148
+ // shared per-IP throttle could return one and satisfy "some 4xx" without the auth gate ever
149
+ // having fired. Any other 4xx (401 on the authenticated shape, 404/405 on the retired GET)
150
+ // is still accepted, as the comment above describes.
151
+ (r: any) => r.status >= 400 && r.status < 500 && r.status !== 429 && r.sentinelHits === 0,
116
152
  )
117
153
 
118
154
  // Authenticating is not enough on its own — a staff session must not be able to reach an internal
@@ -127,46 +163,53 @@ export const proxy_image_ssrf_tests = async ({ sdk } : { sdk: Session, sdkNonAdm
127
163
  return { status: res.status, sentinelHits }
128
164
  }
129
165
 
130
- await async_test(
166
+ await expect_result(
131
167
  'proxy-image refuses a private destination even for an authenticated staff session',
132
168
  () => call_authenticated(sentinelURL),
133
- { onResult: (r: any) => r.status === 400 && r.sentinelHits === 0 },
169
+ (r: any) => r.status === 400 && r.sentinelHits === 0,
134
170
  )
135
171
 
136
- await async_test(
172
+ await expect_result(
137
173
  'proxy-image refuses cloud metadata for an authenticated staff session',
138
174
  () => call_authenticated('https://169.254.169.254/latest/meta-data/'),
139
- { onResult: (r: any) => r.status === 400 },
175
+ (r: any) => r.status === 400,
140
176
  )
141
177
 
142
178
  // Scheme and port are pinned: only https on 443, which is all the PDF export ever needs.
143
- await async_test(
179
+ await expect_result(
144
180
  'proxy-image refuses a plain http destination',
145
181
  () => call_authenticated('http://example.com/logo.png'),
146
- { onResult: (r: any) => r.status === 400 },
182
+ (r: any) => r.status === 400,
147
183
  )
148
184
 
149
- await async_test(
185
+ await expect_result(
150
186
  'proxy-image refuses a non-443 port',
151
187
  () => call_authenticated('https://example.com:8443/logo.png'),
152
- { onResult: (r: any) => r.status === 400 },
188
+ (r: any) => r.status === 400,
153
189
  )
154
190
  } finally {
155
191
  sentinel.close()
192
+ // Teardown BEFORE anything asserts — assert calls process.exit, which would strand this tenant.
193
+ if (tenant) { try { await tenant.teardown() } catch (e) { console.error('teardown failed', e) } }
156
194
  }
195
+
196
+ return checks
157
197
  }
158
198
 
159
- if (require.main === module) {
160
- console.log(`🌐 Using API URL: ${host}`)
161
- const sdk = new Session({ host })
162
- const sdkNonAdmin = new Session({ host })
199
+ /** Asserting wrapper, for standalone runs. */
200
+ export const proxy_image_ssrf_tests = async () => {
201
+ assert_checks('Proxy-image unauthenticated SSRF', await proxy_image_ssrf_checks())
202
+ }
163
203
 
164
- const runTests = async () => {
165
- await setup_tests(sdk, sdkNonAdmin)
166
- await proxy_image_ssrf_tests({ sdk, sdkNonAdmin })
167
- }
204
+ /** Enrolls this suite in the auto-discovered parallel pool — see run_discovered_isolated_suites. */
205
+ export const ISOLATED_SUITE: IsolatedSuite = {
206
+ name: 'Proxy-image unauthenticated SSRF',
207
+ run: proxy_image_ssrf_checks,
208
+ }
168
209
 
169
- runTests()
210
+ if (require.main === module) {
211
+ console.log(`🌐 Using API URL: ${host}`)
212
+ proxy_image_ssrf_tests()
170
213
  .then(() => {
171
214
  console.log("✅ proxy-image SSRF test suite completed successfully")
172
215
  process.exit(0)
@@ -1,26 +1,39 @@
1
1
  require('source-map-support').install();
2
2
 
3
3
  import axios from "axios"
4
- import { Session } from "../../../sdk"
4
+ import { wait } from "@tellescope/testing"
5
5
  import {
6
- assert,
7
- log_header,
8
- wait,
9
- } from "@tellescope/testing"
10
- import { setup_tests } from "../../setup"
6
+ assert_checks,
7
+ Check,
8
+ IsolatedSuite,
9
+ setup_isolated_tenant,
10
+ } from "../../setup_isolated"
11
11
 
12
12
  const host = process.env.API_URL || 'http://localhost:8080' as const
13
13
 
14
- const post = async (path: string, body: any, headers: Record<string, string> = {}) => {
15
- try {
16
- const res = await axios.post(`${host}${path}`, body, {
17
- validateStatus: () => true,
18
- headers,
19
- })
20
- return { status: res.status, data: res.data }
21
- } catch (err: any) {
22
- return { status: err?.response?.status, data: err?.response?.data }
14
+ const RAND = () => Math.random().toString(36).slice(2, 10)
15
+
16
+ /**
17
+ * POST /v1/users/register, retrying a 429.
18
+ *
19
+ * The endpoint is throttled at roughly 1/sec on a `user-register-<ip>` namespace that no tenant
20
+ * teardown clears and that every concurrently running suite shares, so a 429 here is contention
21
+ * between suites, not a result. (Deliberately a local copy of organization_signup.test.ts's helper
22
+ * rather than a shared export: the two suites stay uncoupled.)
23
+ */
24
+ const register_request = async (data: Record<string, any>) => {
25
+ const send = () => axios.request({
26
+ method: 'post', url: `${host}/v1/users/register`,
27
+ data,
28
+ validateStatus: () => true,
29
+ })
30
+
31
+ let result = await send()
32
+ for (let attempt = 0; attempt < 5 && result.status === 429; attempt++) {
33
+ await wait(undefined, 1200)
34
+ result = await send()
23
35
  }
36
+ return result
24
37
  }
25
38
 
26
39
  /**
@@ -36,99 +49,125 @@ const post = async (path: string, body: any, headers: Record<string, string> = {
36
49
  * caller-supplied businessId onto a new `accountType: 'Business'` user — bypassing the
37
50
  * globalUnique: ['email'] enforcement that only runs in the generic create route.
38
51
  *
39
- * The "victim org" here is the test admin's own org (sdk.userInfo.businessId): an org the
40
- * anonymous caller was never invited to. The admin is used purely to OBSERVE whether an
41
- * uninvited user record materialized inside their org (getOne({ email }) is org-scoped and
42
- * throws when the email is absent from the caller's tenant).
52
+ * The "victim org" is this suite's OWN provisioned tenant (tenant.businessId): an org the
53
+ * anonymous caller was never invited to. Its admin is used purely to OBSERVE whether an uninvited
54
+ * user record materialized inside the org (getOne({ email }) is org-scoped and throws when the
55
+ * email is absent from the caller's tenant). Running on a throwaway tenant rather than the shared
56
+ * fixture means a failing (vulnerable) run plants its user in an org that is then torn down.
43
57
  *
44
58
  * Expected results:
45
- * - VULNERABLE code: the assertions FAIL — the planted user appears inside the victim org,
46
- * proving the exploit ("EXPLOIT CONFIRMED" in the failure message).
59
+ * - VULNERABLE code: the checks FAIL — the planted user appears inside the victim org,
60
+ * proving the exploit ("EXPLOIT CONFIRMED" in the failure detail).
47
61
  * - FIXED code: register ignores the caller-supplied businessId (self-signups are created
48
62
  * org-less and duplicates are rejected globally), so nothing appears in the victim org and
49
- * the assertions PASS.
63
+ * the checks PASS.
50
64
  *
51
- * Uses unique emails per run (Date.now()) so re-runs never collide on the platform-wide unique
52
- * email constraint. NOTE: on the FIXED path these registrations create org-less user records
53
- * that an org-scoped admin cannot delete — harmless residue (unique emails), inherent to the
54
- * legitimate "root register, no org" signup behavior.
65
+ * Uses unique emails per run so re-runs never collide on the platform-wide unique email
66
+ * constraint. NOTE: on the FIXED path these registrations create org-less user records that
67
+ * neither an org-scoped admin nor the tenant teardown (which deletes by businessId) can remove —
68
+ * harmless residue (unique emails), inherent to the legitimate "root register, no org" signup.
55
69
  */
56
- export const register_business_id_injection_tests = async ({ sdk } : { sdk: Session, sdkNonAdmin: Session }) => {
57
- log_header("register businessId injection")
58
-
59
- const victimBusinessId = sdk.userInfo.businessId
60
- const password = 'testpassword123!'
61
- const termsVersion = '1'
62
-
63
- // ==================================================================================
64
- // Scenario 1 — uninvited org join
65
- // An anonymous caller registers with businessId set to the victim org. On vulnerable
66
- // code this creates a Business user INSIDE the victim org that no one invited.
67
- // ==================================================================================
68
- const email1 = `security+reg-inject-${Date.now()}@wearehackerone.com`
69
-
70
- const before = await sdk.api.users.getOne({ email: email1 }).catch(() => null)
71
- assert(before === null, `precondition failed: ${email1} already present in victim org`, 'precondition: victim org has no such user')
72
-
73
- const res1 = await post('/v1/users/register', { email: email1, password, termsVersion, businessId: victimBusinessId })
74
- console.log(` register(businessId=victim) -> HTTP ${res1.status}`)
75
-
76
- const planted1: any = await sdk.api.users.getOne({ email: email1 }).catch(() => null)
77
- const injectedIntoVictimOrg = !!planted1 && planted1.businessId === victimBusinessId
78
-
79
- // Clean up BEFORE asserting (a failed assert calls process.exit(1) and would skip cleanup).
80
- if (planted1?.id) await sdk.api.users.deleteOne(planted1.id).catch(() => {})
70
+ export const register_business_id_injection_checks = async (): Promise<Check[]> => {
71
+ const checks: Check[] = []
72
+ const record = (label: string, pass: boolean, detail: string) => checks.push({ label, pass, detail })
81
73
 
82
- assert(
83
- !injectedIntoVictimOrg,
84
- `❌ EXPLOIT CONFIRMED: anonymous POST /v1/users/register with businessId=${victimBusinessId} created user `
85
- + `${email1} (accountType=${planted1?.accountType}) inside the victim org — no invite required`,
86
- '✅ register ignores caller-supplied businessId — no user injected into victim org',
87
- )
74
+ let tenant: Awaited<ReturnType<typeof setup_isolated_tenant>> | undefined
88
75
 
89
- await wait(undefined, 1200) // register endpoint rate-limits ~1/sec per IP
90
-
91
- // ==================================================================================
92
- // Scenario 2 — cross-org duplicate for the same email
93
- // First register with NO businessId (the legitimate "root register, no org" record —
94
- // the "oldest" account in the report). Then register the SAME email WITH the victim
95
- // businessId. On vulnerable code the scoped duplicate check misses the org-less record,
96
- // so a SECOND user record for the same email is created inside the victim org.
97
- // ==================================================================================
98
- const email2 = `security+reg-dup-${Date.now()}@wearehackerone.com`
99
-
100
- const resRoot = await post('/v1/users/register', { email: email2, password, termsVersion })
101
- console.log(` register(no businessId) -> HTTP ${resRoot.status}`)
102
-
103
- await wait(undefined, 1200)
104
-
105
- const resDup = await post('/v1/users/register', { email: email2, password, termsVersion, businessId: victimBusinessId })
106
- console.log(` register(same email, businessId=victim) -> HTTP ${resDup.status}`)
76
+ try {
77
+ tenant = await setup_isolated_tenant({
78
+ name: `register businessId injection ${RAND()}`,
79
+ users: [{ isAdmin: true }],
80
+ apiKeys: 0,
81
+ })
82
+ const { sdk } = tenant
83
+
84
+ const victimBusinessId = tenant.businessId
85
+ const password = 'testpassword123!'
86
+ const termsVersion = '1'
87
+
88
+ // ==================================================================================
89
+ // Scenario 1 — uninvited org join
90
+ // An anonymous caller registers with businessId set to the victim org. On vulnerable
91
+ // code this creates a Business user INSIDE the victim org that no one invited.
92
+ // ==================================================================================
93
+ const email1 = `dontsend+reg-inject-${Date.now()}-${RAND()}@tellescope.com`
94
+
95
+ const before = await sdk.api.users.getOne({ email: email1 }).catch(() => null)
96
+ record(
97
+ 'precondition: victim org has no such user',
98
+ before === null,
99
+ before === null ? `${email1} absent from the victim org` : `precondition failed: ${email1} already present in victim org`,
100
+ )
101
+
102
+ const res1 = await register_request({ email: email1, password, termsVersion, businessId: victimBusinessId })
103
+ console.log(` register(businessId=victim) -> HTTP ${res1.status}`)
104
+
105
+ const planted1: any = await sdk.api.users.getOne({ email: email1 }).catch(() => null)
106
+ const injectedIntoVictimOrg = !!planted1 && planted1.businessId === victimBusinessId
107
+
108
+ record(
109
+ '✅ register ignores caller-supplied businessId — no user injected into victim org',
110
+ !injectedIntoVictimOrg,
111
+ injectedIntoVictimOrg
112
+ ? `❌ EXPLOIT CONFIRMED: anonymous POST /v1/users/register with businessId=${victimBusinessId} created user `
113
+ + `${email1} (accountType=${planted1?.accountType}) inside the victim org — no invite required`
114
+ : `register -> HTTP ${res1.status}; no ${email1} user inside the victim org`,
115
+ )
116
+
117
+ await wait(undefined, 1200) // register endpoint rate-limits ~1/sec per IP
118
+
119
+ // ==================================================================================
120
+ // Scenario 2 — cross-org duplicate for the same email
121
+ // First register with NO businessId (the legitimate "root register, no org" record —
122
+ // the "oldest" account in the report). Then register the SAME email WITH the victim
123
+ // businessId. On vulnerable code the scoped duplicate check misses the org-less record,
124
+ // so a SECOND user record for the same email is created inside the victim org.
125
+ // ==================================================================================
126
+ const email2 = `dontsend+reg-dup-${Date.now()}-${RAND()}@tellescope.com`
127
+
128
+ const resRoot = await register_request({ email: email2, password, termsVersion })
129
+ console.log(` register(no businessId) -> HTTP ${resRoot.status}`)
130
+
131
+ await wait(undefined, 1200)
132
+
133
+ const resDup = await register_request({ email: email2, password, termsVersion, businessId: victimBusinessId })
134
+ console.log(` register(same email, businessId=victim) -> HTTP ${resDup.status}`)
135
+
136
+ const planted2: any = await sdk.api.users.getOne({ email: email2 }).catch(() => null)
137
+ const duplicateInVictimOrg = !!planted2 && planted2.businessId === victimBusinessId
138
+
139
+ record(
140
+ '✅ register enforces global email uniqueness — no cross-org duplicate created',
141
+ !duplicateInVictimOrg,
142
+ duplicateInVictimOrg
143
+ ? `❌ EXPLOIT CONFIRMED: same email ${email2} registered into a second org — duplicate user `
144
+ + `(accountType=${planted2?.accountType}) created in victim org ${victimBusinessId}`
145
+ : `register(no org) -> HTTP ${resRoot.status}, register(businessId=victim) -> HTTP ${resDup.status}; `
146
+ + `no ${email2} user inside the victim org`,
147
+ )
148
+ } finally {
149
+ // Teardown BEFORE anything asserts — assert calls process.exit, which would strand this tenant.
150
+ if (tenant) { try { await tenant.teardown() } catch (e) { console.error('teardown failed', e) } }
151
+ }
107
152
 
108
- const planted2: any = await sdk.api.users.getOne({ email: email2 }).catch(() => null)
109
- const duplicateInVictimOrg = !!planted2 && planted2.businessId === victimBusinessId
153
+ return checks
154
+ }
110
155
 
111
- if (planted2?.id) await sdk.api.users.deleteOne(planted2.id).catch(() => {})
156
+ /** Asserting wrapper, for standalone runs. */
157
+ export const register_business_id_injection_tests = async () => {
158
+ assert_checks('register businessId injection', await register_business_id_injection_checks())
159
+ }
112
160
 
113
- assert(
114
- !duplicateInVictimOrg,
115
- `❌ EXPLOIT CONFIRMED: same email ${email2} registered into a second org — duplicate user `
116
- + `(accountType=${planted2?.accountType}) created in victim org ${victimBusinessId}`,
117
- '✅ register enforces global email uniqueness — no cross-org duplicate created',
118
- )
161
+ /** Enrolls this suite in the auto-discovered parallel pool — see run_discovered_isolated_suites. */
162
+ export const ISOLATED_SUITE: IsolatedSuite = {
163
+ name: 'register businessId injection',
164
+ run: register_business_id_injection_checks,
119
165
  }
120
166
 
121
167
  // Allow running this test file independently
122
168
  if (require.main === module) {
123
- const sdk = new Session({ host })
124
- const sdkNonAdmin = new Session({ host })
125
-
126
- const runTests = async () => {
127
- await setup_tests(sdk, sdkNonAdmin)
128
- await register_business_id_injection_tests({ sdk, sdkNonAdmin })
129
- }
130
-
131
- runTests()
169
+ console.log(`🌐 Using API URL: ${host}`)
170
+ register_business_id_injection_tests()
132
171
  .then(() => {
133
172
  console.log("✅ register businessId injection test suite completed successfully")
134
173
  process.exit(0)
@@ -5,6 +5,7 @@ import {
5
5
  assert_checks,
6
6
  Check,
7
7
  setup_isolated_tenant,
8
+ IsolatedSuite,
8
9
  } from "../../setup_isolated"
9
10
 
10
11
  const host = process.env.API_URL || 'http://localhost:8080' as const
@@ -182,6 +183,9 @@ export const rich_text_answer_sanitized_on_write_tests = async () => {
182
183
  assert_checks('Rich Text answers sanitized on write', await rich_text_answer_sanitized_on_write_checks())
183
184
  }
184
185
 
186
+ /** Enrolls this suite in the auto-discovered parallel pool — see run_discovered_isolated_suites. */
187
+ export const ISOLATED_SUITE: IsolatedSuite = { name: 'Rich Text answers sanitized on write', run: rich_text_answer_sanitized_on_write_checks }
188
+
185
189
  // Allow running this test file independently
186
190
  if (require.main === module) {
187
191
  console.log(`🌐 Using API URL: ${host}`)
@@ -208,6 +208,133 @@ export const sanitize_user_html_with_iframes_tests = async () => {
208
208
  if (!endToEnd.includes('&lt;iframe')) fail(`patient markup not escaped to inert text: ${endToEnd}`)
209
209
  if ((endToEnd.toLowerCase().match(/<iframe/g) || []).length !== 1) fail(`patient-injected iframe became a live frame: ${endToEnd}`)
210
210
 
211
+ // ---------------------------------------------------------------------------------------------
212
+ // 7. sanitize-html 2.18.0 behaviour pins
213
+ //
214
+ // Added with the 2.17.7 -> 2.18.0 bump. 2.18.0 changes how markup *inside a disallowed tag* is
215
+ // emitted: where 2.17.7 entity-escaped it into visible literal text, 2.18.0 parses it and runs it
216
+ // back through the allowlist. That is a rendering change on every surface, so the vectors it
217
+ // could plausibly reopen are pinned here rather than left to a future release to rediscover.
218
+ // ---------------------------------------------------------------------------------------------
219
+
220
+ // --- meta refresh -------------------------------------------------------------------------
221
+ // <meta> is not allowlisted by either shared sanitizer, so an http-equiv="refresh" redirect must
222
+ // never survive. The portal's custom-page sanitizer allowlists <meta> for charset/name/content
223
+ // and deliberately omits http-equiv for exactly this reason (CustomPage.tsx), which is why this
224
+ // vector is worth pinning on the shared pair too.
225
+ const metaRefreshCases: [string, string][] = [
226
+ ['lowercase', `<meta http-equiv="refresh" content="0;url=https://evil.example">`],
227
+ ['uppercase', `<META HTTP-EQUIV="REFRESH" CONTENT="0;url=https://evil.example">`],
228
+ ['nested in allowed block', `<div><meta http-equiv="refresh" content="0;url=https://evil.example"><p>after</p></div>`],
229
+ ]
230
+ for (const [name, payload] of metaRefreshCases) {
231
+ for (const [fnName, fn] of [['with_iframes', sanitize_user_html_with_iframes], ['base', sanitize_user_html]] as const) {
232
+ const out = fn(payload).toLowerCase()
233
+ if (out.includes('<meta')) fail(`meta survived [${fnName}/${name}] -> ${out}`)
234
+ if (out.includes('http-equiv')) fail(`http-equiv survived [${fnName}/${name}] -> ${out}`)
235
+ if (out.includes('evil.example')) fail(`meta refresh target survived [${fnName}/${name}] -> ${out}`)
236
+ }
237
+ }
238
+ // the redirect is dropped without taking the surrounding content with it
239
+ const metaSibling = sanitize_user_html_with_iframes(`<div><meta http-equiv="refresh" content="0;url=https://evil.example"><p>after</p></div>`)
240
+ if (!metaSibling.includes('<p>after</p>')) fail(`content after a dropped meta refresh was lost: ${metaSibling}`)
241
+
242
+ // --- svg:animate --------------------------------------------------------------------------
243
+ // SMIL animation can rewrite an attribute after sanitization: <animate attributeName="href"
244
+ // values="javascript:..."> turns an inert <a> into a javascript: link at render time, which no
245
+ // amount of href filtering catches. <svg> is not allowlisted, so animate must never survive —
246
+ // and with 2.18.0 now re-parsing disallowed-tag contents, "the parent is dropped" is no longer
247
+ // on its own enough to assume the child went with it.
248
+ const svgAnimateCases: [string, string][] = [
249
+ ['animate onbegin', `<svg><animate onbegin="alert(1)" attributeName="x" dur="1s"></svg>`],
250
+ ['animate href values', `<svg><a><animate attributeName="href" values="javascript:alert(1)"/><text>x</text></a></svg>`],
251
+ ['set href to', `<svg><a><set attributeName="href" to="javascript:alert(1)"/><text>x</text></a></svg>`],
252
+ ['animate onrepeat', `<svg><animate attributeName="x" begin="0s" onrepeat="alert(1)"/></svg>`],
253
+ ['animate inside dropped iframe', `<iframe><svg><a><animate attributeName="href" values="javascript:alert(1)"/><text>x</text></a></svg></iframe>`],
254
+ ]
255
+ for (const [name, payload] of svgAnimateCases) {
256
+ for (const [fnName, fn] of [['with_iframes', sanitize_user_html_with_iframes], ['base', sanitize_user_html]] as const) {
257
+ const out = fn(payload).toLowerCase()
258
+ if (out.includes('<animate') || out.includes('<set')) fail(`SMIL animation element survived [${fnName}/${name}] -> ${out}`)
259
+ if (out.includes('<svg')) fail(`svg survived [${fnName}/${name}] -> ${out}`)
260
+ if (out.includes('attributename')) fail(`attributeName survived [${fnName}/${name}] -> ${out}`)
261
+ if (out.includes('javascript:')) fail(`javascript: payload survived [${fnName}/${name}] -> ${out}`)
262
+ if (/\son[a-z]+\s*=/.test(out.replace(/"[^"]*"/g, '""'))) fail(`SMIL event handler survived [${fnName}/${name}] -> ${out}`)
263
+ }
264
+ }
265
+
266
+ // --- noscript (the nonTextTags vector) ------------------------------------------------------
267
+ // The classic noscript context-confusion payload: a browser parses <noscript> contents as raw
268
+ // text when scripting is enabled and as markup when it isn't, so a sanitizer that disagrees with
269
+ // the renderer can be walked out of the attribute it thinks it is inside. Neither shared
270
+ // sanitizer sets nonTextTags, but the portal's custom-page sanitizer lists 'noscript' there
271
+ // (CustomPage.tsx), so the dependency's handling of the tag is pinned here.
272
+ const noscriptCases: [string, string][] = [
273
+ ['attribute break-out', `<noscript><p title="</noscript><img src=x onerror=alert(1)>">`],
274
+ ['style comment mXSS', `<noscript><style><!--</style><img src=x onerror=alert(1)>`],
275
+ ['plain content', `<noscript>hidden</noscript><p>after</p>`],
276
+ ['markup content', `<noscript><b>bold</b></noscript><p>after</p>`],
277
+ ['inside dropped iframe', `<iframe><noscript><p title="</noscript><img src=x onerror=alert(1)>"></iframe>`],
278
+ ]
279
+ for (const [name, payload] of noscriptCases) {
280
+ for (const [fnName, fn] of [['with_iframes', sanitize_user_html_with_iframes], ['base', sanitize_user_html]] as const) {
281
+ const out = fn(payload)
282
+ if (out.toLowerCase().includes('<noscript')) fail(`noscript survived [${fnName}/${name}] -> ${out}`)
283
+ // The breakout payload may legitimately remain as inert escaped text inside an attribute
284
+ // value; what must never happen is it coming back as a live handler. Values are blanked
285
+ // before the handler check for exactly that reason.
286
+ if (/\son[a-z]+\s*=/.test(out.toLowerCase().replace(/"[^"]*"/g, '""').replace(/'[^']*'/g, "''"))) {
287
+ fail(`live event handler escaped the noscript context [${fnName}/${name}] -> ${out}`)
288
+ }
289
+ if (out.toLowerCase().includes('<script')) fail(`script escaped the noscript context [${fnName}/${name}] -> ${out}`)
290
+ }
291
+ }
292
+ // content after a noscript block is not swallowed (the "page ends early" regression)
293
+ const afterNoscript = sanitize_user_html(`<noscript>a</noscript><p>para1</p><div>para2</div><span>tail</span>`)
294
+ for (const frag of ['<p>para1</p>', '<div>para2</div>', '<span>tail</span>']) {
295
+ if (!afterNoscript.includes(frag)) fail(`content after noscript was swallowed (missing ${frag}): ${afterNoscript}`)
296
+ }
297
+
298
+ // --- disallowed-iframe fallback content (the actual 2.18.0 delta) ---------------------------
299
+ // This is what changed. In sanitize_user_html (no iframe in allowedTags) the markup inside a
300
+ // dropped <iframe> used to be emitted as escaped literal text; from 2.18.0 it is parsed and
301
+ // allowlisted instead, so a patient reading a form answer now sees bold text where they used to
302
+ // see "<b>FB</b>". Safe — the allowlist still applies — but it is a visible change, so both the
303
+ // containment and the rendering are pinned.
304
+ const baseFallback = sanitize_user_html(`<iframe src="http://evil.example"><b>FB</b></iframe>`)
305
+ if (baseFallback.toLowerCase().includes('<iframe')) fail(`base sanitizer kept the frame: ${baseFallback}`)
306
+ if (baseFallback.toLowerCase().includes('evil.example')) fail(`base sanitizer kept the frame src: ${baseFallback}`)
307
+ // The markup form, not just the characters "FB": on 2.17.7 this came back as the escaped text
308
+ // &lt;b&gt;FB&lt;/b&gt;, which also contains "FB". Asserting the live tag is what makes this pin
309
+ // the 2.18.0 behaviour rather than pass identically on either version.
310
+ if (!baseFallback.includes('<b>FB</b>')) fail(`fallback markup was not parsed back into live markup: ${baseFallback}`)
311
+ if (baseFallback.includes('&lt;b&gt;')) fail(`fallback markup is still escaped (pre-2.18.0 behaviour): ${baseFallback}`)
312
+
313
+ // The hostile versions of the same shape must still come out inert, by the allowlist rather
314
+ // than by escaping.
315
+ const fallbackAttacks: [string, string][] = [
316
+ ['img onerror', `<iframe><img src=x onerror=alert(1)></iframe>`],
317
+ ['script', `<iframe><script>alert(1)</script></iframe>`],
318
+ ['nested iframe', `<iframe><iframe src="https://evil.example"></iframe></iframe>`],
319
+ ['javascript link', `<iframe><a href="javascript:alert(1)">x</a></iframe>`],
320
+ ['object', `<iframe><object data="javascript:alert(1)"></object></iframe>`],
321
+ ['base href', `<iframe><base href="https://evil.example"></iframe>`],
322
+ ]
323
+ for (const [name, payload] of fallbackAttacks) {
324
+ const out = sanitize_user_html(payload)
325
+ if (!has_no_executable_vector_allowing_iframe(out) || out.toLowerCase().includes('<iframe')) {
326
+ fail(`iframe fallback content reopened a vector [${name}] -> ${out}`)
327
+ }
328
+ }
329
+
330
+ // sanitize_user_html_with_iframes is unaffected: exclusiveFilter removes a disallowed frame AND
331
+ // its children, so fallback markup never reaches the escaping path at all. Asserted explicitly
332
+ // so the two functions' different handling stays deliberate.
333
+ for (const [name, payload] of [...fallbackAttacks, ['bold fallback', `<iframe src="http://evil.example"><b>FB</b></iframe>`] as [string, string]]) {
334
+ const out = sanitize_user_html_with_iframes(payload)
335
+ if (out !== '') fail(`with_iframes should drop a disallowed frame and all its content [${name}] -> ${out}`)
336
+ }
337
+
211
338
  console.log("✅ sanitize_user_html_with_iframes XSS regression tests passed")
212
339
  }
213
340