@tellescope/sdk 2.0.0-beta.0 → 2.0.0-beta.2

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 (303) hide show
  1. package/CLAUDE.md +24 -0
  2. package/env.example +6 -0
  3. package/lib/cjs/sdk.d.ts +376 -3
  4. package/lib/cjs/sdk.d.ts.map +1 -1
  5. package/lib/cjs/sdk.js +1 -0
  6. package/lib/cjs/sdk.js.map +1 -1
  7. package/lib/cjs/tests/api_tests/booking_prevent_upcoming_duplicate.test.d.ts +22 -0
  8. package/lib/cjs/tests/api_tests/booking_prevent_upcoming_duplicate.test.d.ts.map +1 -0
  9. package/lib/cjs/tests/api_tests/booking_prevent_upcoming_duplicate.test.js +506 -0
  10. package/lib/cjs/tests/api_tests/booking_prevent_upcoming_duplicate.test.js.map +1 -0
  11. package/lib/cjs/tests/api_tests/enduser_fields_sync.test.d.ts +3 -1
  12. package/lib/cjs/tests/api_tests/enduser_fields_sync.test.d.ts.map +1 -1
  13. package/lib/cjs/tests/api_tests/enduser_fields_sync.test.js +3 -1
  14. package/lib/cjs/tests/api_tests/enduser_fields_sync.test.js.map +1 -1
  15. package/lib/cjs/tests/api_tests/enduser_observations_auto_review.test.d.ts +3 -1
  16. package/lib/cjs/tests/api_tests/enduser_observations_auto_review.test.d.ts.map +1 -1
  17. package/lib/cjs/tests/api_tests/enduser_observations_auto_review.test.js +3 -1
  18. package/lib/cjs/tests/api_tests/enduser_observations_auto_review.test.js.map +1 -1
  19. package/lib/cjs/tests/api_tests/form_vital_reading.test.d.ts +7 -0
  20. package/lib/cjs/tests/api_tests/form_vital_reading.test.d.ts.map +1 -0
  21. package/lib/cjs/tests/api_tests/form_vital_reading.test.js +461 -0
  22. package/lib/cjs/tests/api_tests/form_vital_reading.test.js.map +1 -0
  23. package/lib/cjs/tests/api_tests/journey_statistics_cache.test.d.ts +26 -0
  24. package/lib/cjs/tests/api_tests/journey_statistics_cache.test.d.ts.map +1 -0
  25. package/lib/cjs/tests/api_tests/journey_statistics_cache.test.js +232 -0
  26. package/lib/cjs/tests/api_tests/journey_statistics_cache.test.js.map +1 -0
  27. package/lib/cjs/tests/api_tests/journey_step_manual_count.test.d.ts +34 -0
  28. package/lib/cjs/tests/api_tests/journey_step_manual_count.test.d.ts.map +1 -0
  29. package/lib/cjs/tests/api_tests/journey_step_manual_count.test.js +243 -0
  30. package/lib/cjs/tests/api_tests/journey_step_manual_count.test.js.map +1 -0
  31. package/lib/cjs/tests/api_tests/load_threads_care_team.test.d.ts +3 -1
  32. package/lib/cjs/tests/api_tests/load_threads_care_team.test.d.ts.map +1 -1
  33. package/lib/cjs/tests/api_tests/load_threads_care_team.test.js +3 -1
  34. package/lib/cjs/tests/api_tests/load_threads_care_team.test.js.map +1 -1
  35. package/lib/cjs/tests/api_tests/mdi_case_offerings.test.d.ts.map +1 -1
  36. package/lib/cjs/tests/api_tests/mdi_case_offerings.test.js +139 -9
  37. package/lib/cjs/tests/api_tests/mdi_case_offerings.test.js.map +1 -1
  38. package/lib/cjs/tests/api_tests/organization_signup.test.d.ts +3 -1
  39. package/lib/cjs/tests/api_tests/organization_signup.test.d.ts.map +1 -1
  40. package/lib/cjs/tests/api_tests/organization_signup.test.js +3 -1
  41. package/lib/cjs/tests/api_tests/organization_signup.test.js.map +1 -1
  42. package/lib/cjs/tests/api_tests/phone_embed_leave_message.test.d.ts +7 -0
  43. package/lib/cjs/tests/api_tests/phone_embed_leave_message.test.d.ts.map +1 -0
  44. package/lib/cjs/tests/api_tests/phone_embed_leave_message.test.js +571 -0
  45. package/lib/cjs/tests/api_tests/phone_embed_leave_message.test.js.map +1 -0
  46. package/lib/cjs/tests/api_tests/programs.test.d.ts +3 -1
  47. package/lib/cjs/tests/api_tests/programs.test.d.ts.map +1 -1
  48. package/lib/cjs/tests/api_tests/programs.test.js +73 -17
  49. package/lib/cjs/tests/api_tests/programs.test.js.map +1 -1
  50. package/lib/cjs/tests/api_tests/public_form_case_insensitive_match.test.d.ts +7 -0
  51. package/lib/cjs/tests/api_tests/public_form_case_insensitive_match.test.d.ts.map +1 -0
  52. package/lib/cjs/tests/api_tests/public_form_case_insensitive_match.test.js +733 -0
  53. package/lib/cjs/tests/api_tests/public_form_case_insensitive_match.test.js.map +1 -0
  54. package/lib/cjs/tests/api_tests/security/add-to-journey-foreign-enduserid.test.d.ts +3 -1
  55. package/lib/cjs/tests/api_tests/security/add-to-journey-foreign-enduserid.test.d.ts.map +1 -1
  56. package/lib/cjs/tests/api_tests/security/add-to-journey-foreign-enduserid.test.js +58 -48
  57. package/lib/cjs/tests/api_tests/security/add-to-journey-foreign-enduserid.test.js.map +1 -1
  58. package/lib/cjs/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts +3 -1
  59. package/lib/cjs/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts.map +1 -1
  60. package/lib/cjs/tests/api_tests/security/appointment-reschedule-ownership.test.js +3 -1
  61. package/lib/cjs/tests/api_tests/security/appointment-reschedule-ownership.test.js.map +1 -1
  62. package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.d.ts +3 -1
  63. package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.d.ts.map +1 -1
  64. package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.js +3 -1
  65. package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.js.map +1 -1
  66. package/lib/cjs/tests/api_tests/security/form-logic-js-execution.test.d.ts +3 -1
  67. package/lib/cjs/tests/api_tests/security/form-logic-js-execution.test.d.ts.map +1 -1
  68. package/lib/cjs/tests/api_tests/security/form-logic-js-execution.test.js +3 -1
  69. package/lib/cjs/tests/api_tests/security/form-logic-js-execution.test.js.map +1 -1
  70. package/lib/cjs/tests/api_tests/security/formsort_webhook_auth_field_lock.test.d.ts.map +1 -1
  71. package/lib/cjs/tests/api_tests/security/formsort_webhook_auth_field_lock.test.js +424 -39
  72. package/lib/cjs/tests/api_tests/security/formsort_webhook_auth_field_lock.test.js.map +1 -1
  73. package/lib/cjs/tests/api_tests/security/register_business_id_injection.test.js +2 -2
  74. package/lib/cjs/tests/api_tests/security/register_business_id_injection.test.js.map +1 -1
  75. package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts +3 -1
  76. package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts.map +1 -1
  77. package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js +3 -1
  78. package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js.map +1 -1
  79. package/lib/cjs/tests/api_tests/session_for_join_link.test.d.ts +10 -0
  80. package/lib/cjs/tests/api_tests/session_for_join_link.test.d.ts.map +1 -0
  81. package/lib/cjs/tests/api_tests/session_for_join_link.test.js +147 -0
  82. package/lib/cjs/tests/api_tests/session_for_join_link.test.js.map +1 -0
  83. package/lib/cjs/tests/api_tests/set_fields_order_templates.test.d.ts.map +1 -1
  84. package/lib/cjs/tests/api_tests/set_fields_order_templates.test.js +191 -88
  85. package/lib/cjs/tests/api_tests/set_fields_order_templates.test.js.map +1 -1
  86. package/lib/cjs/tests/api_tests/stripe_checkout_items.test.d.ts +17 -0
  87. package/lib/cjs/tests/api_tests/stripe_checkout_items.test.d.ts.map +1 -0
  88. package/lib/cjs/tests/api_tests/stripe_checkout_items.test.js +219 -0
  89. package/lib/cjs/tests/api_tests/stripe_checkout_items.test.js.map +1 -0
  90. package/lib/cjs/tests/api_tests/stripe_multiple_customer_ids.test.d.ts +5 -0
  91. package/lib/cjs/tests/api_tests/stripe_multiple_customer_ids.test.d.ts.map +1 -0
  92. package/lib/cjs/tests/api_tests/stripe_multiple_customer_ids.test.js +396 -0
  93. package/lib/cjs/tests/api_tests/stripe_multiple_customer_ids.test.js.map +1 -0
  94. package/lib/cjs/tests/api_tests/tickets_bulk_assign_from_queue.test.d.ts +3 -1
  95. package/lib/cjs/tests/api_tests/tickets_bulk_assign_from_queue.test.d.ts.map +1 -1
  96. package/lib/cjs/tests/api_tests/tickets_bulk_assign_from_queue.test.js +3 -1
  97. package/lib/cjs/tests/api_tests/tickets_bulk_assign_from_queue.test.js.map +1 -1
  98. package/lib/cjs/tests/api_tests/totp_mfa.test.d.ts.map +1 -1
  99. package/lib/cjs/tests/api_tests/totp_mfa.test.js +37 -31
  100. package/lib/cjs/tests/api_tests/totp_mfa.test.js.map +1 -1
  101. package/lib/cjs/tests/api_tests/trigger_contains_matching.test.d.ts +3 -1
  102. package/lib/cjs/tests/api_tests/trigger_contains_matching.test.d.ts.map +1 -1
  103. package/lib/cjs/tests/api_tests/trigger_contains_matching.test.js +3 -1
  104. package/lib/cjs/tests/api_tests/trigger_contains_matching.test.js.map +1 -1
  105. package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.d.ts +3 -1
  106. package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.d.ts.map +1 -1
  107. package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.js +3 -1
  108. package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.js.map +1 -1
  109. package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.d.ts +3 -1
  110. package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.d.ts.map +1 -1
  111. package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.js +3 -1
  112. package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.js.map +1 -1
  113. package/lib/cjs/tests/api_tests/vitl_push.test.d.ts +7 -0
  114. package/lib/cjs/tests/api_tests/vitl_push.test.d.ts.map +1 -0
  115. package/lib/cjs/tests/api_tests/vitl_push.test.js +341 -0
  116. package/lib/cjs/tests/api_tests/vitl_push.test.js.map +1 -0
  117. package/lib/cjs/tests/setup_isolated.d.ts +48 -0
  118. package/lib/cjs/tests/setup_isolated.d.ts.map +1 -1
  119. package/lib/cjs/tests/setup_isolated.js +119 -1
  120. package/lib/cjs/tests/setup_isolated.js.map +1 -1
  121. package/lib/cjs/tests/tests.d.ts.map +1 -1
  122. package/lib/cjs/tests/tests.js +378 -282
  123. package/lib/cjs/tests/tests.js.map +1 -1
  124. package/lib/cjs/tests/unit_tests/isolated_suite_discovery.test.d.ts +2 -0
  125. package/lib/cjs/tests/unit_tests/isolated_suite_discovery.test.d.ts.map +1 -0
  126. package/lib/cjs/tests/unit_tests/isolated_suite_discovery.test.js +201 -0
  127. package/lib/cjs/tests/unit_tests/isolated_suite_discovery.test.js.map +1 -0
  128. package/lib/cjs/tests/unit_tests/programs_conditional_logic.test.d.ts +3 -0
  129. package/lib/cjs/tests/unit_tests/programs_conditional_logic.test.d.ts.map +1 -0
  130. package/lib/cjs/tests/unit_tests/programs_conditional_logic.test.js +120 -0
  131. package/lib/cjs/tests/unit_tests/programs_conditional_logic.test.js.map +1 -0
  132. package/lib/cjs/tests/webhooks_tests.js +44 -34
  133. package/lib/cjs/tests/webhooks_tests.js.map +1 -1
  134. package/lib/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  135. package/lib/esm/sdk.d.ts +376 -3
  136. package/lib/esm/sdk.d.ts.map +1 -1
  137. package/lib/esm/sdk.js +1 -0
  138. package/lib/esm/sdk.js.map +1 -1
  139. package/lib/esm/tests/api_tests/booking_prevent_upcoming_duplicate.test.d.ts +22 -0
  140. package/lib/esm/tests/api_tests/booking_prevent_upcoming_duplicate.test.d.ts.map +1 -0
  141. package/lib/esm/tests/api_tests/booking_prevent_upcoming_duplicate.test.js +501 -0
  142. package/lib/esm/tests/api_tests/booking_prevent_upcoming_duplicate.test.js.map +1 -0
  143. package/lib/esm/tests/api_tests/enduser_fields_sync.test.d.ts +3 -1
  144. package/lib/esm/tests/api_tests/enduser_fields_sync.test.d.ts.map +1 -1
  145. package/lib/esm/tests/api_tests/enduser_fields_sync.test.js +2 -0
  146. package/lib/esm/tests/api_tests/enduser_fields_sync.test.js.map +1 -1
  147. package/lib/esm/tests/api_tests/enduser_observations_auto_review.test.d.ts +3 -1
  148. package/lib/esm/tests/api_tests/enduser_observations_auto_review.test.d.ts.map +1 -1
  149. package/lib/esm/tests/api_tests/enduser_observations_auto_review.test.js +2 -0
  150. package/lib/esm/tests/api_tests/enduser_observations_auto_review.test.js.map +1 -1
  151. package/lib/esm/tests/api_tests/form_vital_reading.test.d.ts +7 -0
  152. package/lib/esm/tests/api_tests/form_vital_reading.test.d.ts.map +1 -0
  153. package/lib/esm/tests/api_tests/form_vital_reading.test.js +456 -0
  154. package/lib/esm/tests/api_tests/form_vital_reading.test.js.map +1 -0
  155. package/lib/esm/tests/api_tests/journey_statistics_cache.test.d.ts +26 -0
  156. package/lib/esm/tests/api_tests/journey_statistics_cache.test.d.ts.map +1 -0
  157. package/lib/esm/tests/api_tests/journey_statistics_cache.test.js +227 -0
  158. package/lib/esm/tests/api_tests/journey_statistics_cache.test.js.map +1 -0
  159. package/lib/esm/tests/api_tests/journey_step_manual_count.test.d.ts +34 -0
  160. package/lib/esm/tests/api_tests/journey_step_manual_count.test.d.ts.map +1 -0
  161. package/lib/esm/tests/api_tests/journey_step_manual_count.test.js +238 -0
  162. package/lib/esm/tests/api_tests/journey_step_manual_count.test.js.map +1 -0
  163. package/lib/esm/tests/api_tests/load_threads_care_team.test.d.ts +3 -1
  164. package/lib/esm/tests/api_tests/load_threads_care_team.test.d.ts.map +1 -1
  165. package/lib/esm/tests/api_tests/load_threads_care_team.test.js +2 -0
  166. package/lib/esm/tests/api_tests/load_threads_care_team.test.js.map +1 -1
  167. package/lib/esm/tests/api_tests/mdi_case_offerings.test.d.ts.map +1 -1
  168. package/lib/esm/tests/api_tests/mdi_case_offerings.test.js +139 -9
  169. package/lib/esm/tests/api_tests/mdi_case_offerings.test.js.map +1 -1
  170. package/lib/esm/tests/api_tests/organization_signup.test.d.ts +3 -1
  171. package/lib/esm/tests/api_tests/organization_signup.test.d.ts.map +1 -1
  172. package/lib/esm/tests/api_tests/organization_signup.test.js +2 -0
  173. package/lib/esm/tests/api_tests/organization_signup.test.js.map +1 -1
  174. package/lib/esm/tests/api_tests/phone_embed_leave_message.test.d.ts +7 -0
  175. package/lib/esm/tests/api_tests/phone_embed_leave_message.test.d.ts.map +1 -0
  176. package/lib/esm/tests/api_tests/phone_embed_leave_message.test.js +566 -0
  177. package/lib/esm/tests/api_tests/phone_embed_leave_message.test.js.map +1 -0
  178. package/lib/esm/tests/api_tests/programs.test.d.ts +3 -1
  179. package/lib/esm/tests/api_tests/programs.test.d.ts.map +1 -1
  180. package/lib/esm/tests/api_tests/programs.test.js +72 -16
  181. package/lib/esm/tests/api_tests/programs.test.js.map +1 -1
  182. package/lib/esm/tests/api_tests/public_form_case_insensitive_match.test.d.ts +7 -0
  183. package/lib/esm/tests/api_tests/public_form_case_insensitive_match.test.d.ts.map +1 -0
  184. package/lib/esm/tests/api_tests/public_form_case_insensitive_match.test.js +728 -0
  185. package/lib/esm/tests/api_tests/public_form_case_insensitive_match.test.js.map +1 -0
  186. package/lib/esm/tests/api_tests/security/add-to-journey-foreign-enduserid.test.d.ts +3 -1
  187. package/lib/esm/tests/api_tests/security/add-to-journey-foreign-enduserid.test.d.ts.map +1 -1
  188. package/lib/esm/tests/api_tests/security/add-to-journey-foreign-enduserid.test.js +57 -47
  189. package/lib/esm/tests/api_tests/security/add-to-journey-foreign-enduserid.test.js.map +1 -1
  190. package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts +3 -1
  191. package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts.map +1 -1
  192. package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.js +2 -0
  193. package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.js.map +1 -1
  194. package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.d.ts +3 -1
  195. package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.d.ts.map +1 -1
  196. package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.js +2 -0
  197. package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.js.map +1 -1
  198. package/lib/esm/tests/api_tests/security/form-logic-js-execution.test.d.ts +3 -1
  199. package/lib/esm/tests/api_tests/security/form-logic-js-execution.test.d.ts.map +1 -1
  200. package/lib/esm/tests/api_tests/security/form-logic-js-execution.test.js +2 -0
  201. package/lib/esm/tests/api_tests/security/form-logic-js-execution.test.js.map +1 -1
  202. package/lib/esm/tests/api_tests/security/formsort_webhook_auth_field_lock.test.d.ts.map +1 -1
  203. package/lib/esm/tests/api_tests/security/formsort_webhook_auth_field_lock.test.js +424 -39
  204. package/lib/esm/tests/api_tests/security/formsort_webhook_auth_field_lock.test.js.map +1 -1
  205. package/lib/esm/tests/api_tests/security/register_business_id_injection.test.js +2 -2
  206. package/lib/esm/tests/api_tests/security/register_business_id_injection.test.js.map +1 -1
  207. package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts +3 -1
  208. package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts.map +1 -1
  209. package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js +2 -0
  210. package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js.map +1 -1
  211. package/lib/esm/tests/api_tests/session_for_join_link.test.d.ts +10 -0
  212. package/lib/esm/tests/api_tests/session_for_join_link.test.d.ts.map +1 -0
  213. package/lib/esm/tests/api_tests/session_for_join_link.test.js +142 -0
  214. package/lib/esm/tests/api_tests/session_for_join_link.test.js.map +1 -0
  215. package/lib/esm/tests/api_tests/set_fields_order_templates.test.d.ts.map +1 -1
  216. package/lib/esm/tests/api_tests/set_fields_order_templates.test.js +191 -88
  217. package/lib/esm/tests/api_tests/set_fields_order_templates.test.js.map +1 -1
  218. package/lib/esm/tests/api_tests/stripe_checkout_items.test.d.ts +17 -0
  219. package/lib/esm/tests/api_tests/stripe_checkout_items.test.d.ts.map +1 -0
  220. package/lib/esm/tests/api_tests/stripe_checkout_items.test.js +214 -0
  221. package/lib/esm/tests/api_tests/stripe_checkout_items.test.js.map +1 -0
  222. package/lib/esm/tests/api_tests/stripe_multiple_customer_ids.test.d.ts +5 -0
  223. package/lib/esm/tests/api_tests/stripe_multiple_customer_ids.test.d.ts.map +1 -0
  224. package/lib/esm/tests/api_tests/stripe_multiple_customer_ids.test.js +388 -0
  225. package/lib/esm/tests/api_tests/stripe_multiple_customer_ids.test.js.map +1 -0
  226. package/lib/esm/tests/api_tests/tickets_bulk_assign_from_queue.test.d.ts +3 -1
  227. package/lib/esm/tests/api_tests/tickets_bulk_assign_from_queue.test.d.ts.map +1 -1
  228. package/lib/esm/tests/api_tests/tickets_bulk_assign_from_queue.test.js +2 -0
  229. package/lib/esm/tests/api_tests/tickets_bulk_assign_from_queue.test.js.map +1 -1
  230. package/lib/esm/tests/api_tests/totp_mfa.test.d.ts.map +1 -1
  231. package/lib/esm/tests/api_tests/totp_mfa.test.js +37 -31
  232. package/lib/esm/tests/api_tests/totp_mfa.test.js.map +1 -1
  233. package/lib/esm/tests/api_tests/trigger_contains_matching.test.d.ts +3 -1
  234. package/lib/esm/tests/api_tests/trigger_contains_matching.test.d.ts.map +1 -1
  235. package/lib/esm/tests/api_tests/trigger_contains_matching.test.js +2 -0
  236. package/lib/esm/tests/api_tests/trigger_contains_matching.test.js.map +1 -1
  237. package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.d.ts +3 -1
  238. package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.d.ts.map +1 -1
  239. package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.js +2 -0
  240. package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.js.map +1 -1
  241. package/lib/esm/tests/api_tests/vital_review_trigger_action.test.d.ts +3 -1
  242. package/lib/esm/tests/api_tests/vital_review_trigger_action.test.d.ts.map +1 -1
  243. package/lib/esm/tests/api_tests/vital_review_trigger_action.test.js +2 -0
  244. package/lib/esm/tests/api_tests/vital_review_trigger_action.test.js.map +1 -1
  245. package/lib/esm/tests/api_tests/vitl_push.test.d.ts +7 -0
  246. package/lib/esm/tests/api_tests/vitl_push.test.d.ts.map +1 -0
  247. package/lib/esm/tests/api_tests/vitl_push.test.js +333 -0
  248. package/lib/esm/tests/api_tests/vitl_push.test.js.map +1 -0
  249. package/lib/esm/tests/setup_isolated.d.ts +48 -0
  250. package/lib/esm/tests/setup_isolated.d.ts.map +1 -1
  251. package/lib/esm/tests/setup_isolated.js +114 -0
  252. package/lib/esm/tests/setup_isolated.js.map +1 -1
  253. package/lib/esm/tests/tests.d.ts.map +1 -1
  254. package/lib/esm/tests/tests.js +379 -283
  255. package/lib/esm/tests/tests.js.map +1 -1
  256. package/lib/esm/tests/unit_tests/isolated_suite_discovery.test.d.ts +2 -0
  257. package/lib/esm/tests/unit_tests/isolated_suite_discovery.test.d.ts.map +1 -0
  258. package/lib/esm/tests/unit_tests/isolated_suite_discovery.test.js +174 -0
  259. package/lib/esm/tests/unit_tests/isolated_suite_discovery.test.js.map +1 -0
  260. package/lib/esm/tests/unit_tests/programs_conditional_logic.test.d.ts +3 -0
  261. package/lib/esm/tests/unit_tests/programs_conditional_logic.test.d.ts.map +1 -0
  262. package/lib/esm/tests/unit_tests/programs_conditional_logic.test.js +117 -0
  263. package/lib/esm/tests/unit_tests/programs_conditional_logic.test.js.map +1 -0
  264. package/lib/esm/tests/webhooks_tests.js +44 -34
  265. package/lib/esm/tests/webhooks_tests.js.map +1 -1
  266. package/lib/tsconfig.tsbuildinfo +1 -1
  267. package/package.json +12 -11
  268. package/src/sdk.ts +9 -2
  269. package/src/tests/api_tests/booking_prevent_upcoming_duplicate.test.ts +541 -0
  270. package/src/tests/api_tests/enduser_fields_sync.test.ts +154 -0
  271. package/src/tests/api_tests/enduser_observations_auto_review.test.ts +4 -0
  272. package/src/tests/api_tests/form_vital_reading.test.ts +393 -0
  273. package/src/tests/api_tests/journey_statistics_cache.test.ts +237 -0
  274. package/src/tests/api_tests/journey_step_manual_count.test.ts +220 -0
  275. package/src/tests/api_tests/load_threads_care_team.test.ts +214 -0
  276. package/src/tests/api_tests/mdi_case_offerings.test.ts +138 -0
  277. package/src/tests/api_tests/organization_signup.test.ts +4 -0
  278. package/src/tests/api_tests/phone_embed_leave_message.test.ts +541 -0
  279. package/src/tests/api_tests/programs.test.ts +351 -0
  280. package/src/tests/api_tests/public_form_case_insensitive_match.test.ts +632 -0
  281. package/src/tests/api_tests/security/add-to-journey-foreign-enduserid.test.ts +37 -26
  282. package/src/tests/api_tests/security/appointment-reschedule-ownership.test.ts +436 -0
  283. package/src/tests/api_tests/security/file-link-session-confinement.test.ts +4 -0
  284. package/src/tests/api_tests/security/form-logic-js-execution.test.ts +4 -0
  285. package/src/tests/api_tests/security/formsort_webhook_auth_field_lock.test.ts +225 -0
  286. package/src/tests/api_tests/security/register_business_id_injection.test.ts +2 -2
  287. package/src/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.ts +4 -0
  288. package/src/tests/api_tests/session_for_join_link.test.ts +99 -0
  289. package/src/tests/api_tests/set_fields_order_templates.test.ts +94 -9
  290. package/src/tests/api_tests/stripe_checkout_items.test.ts +186 -0
  291. package/src/tests/api_tests/tickets_bulk_assign_from_queue.test.ts +4 -0
  292. package/src/tests/api_tests/totp_mfa.test.ts +10 -5
  293. package/src/tests/api_tests/trigger_contains_matching.test.ts +349 -0
  294. package/src/tests/api_tests/user_logs_restore_deleted.test.ts +419 -0
  295. package/src/tests/api_tests/vital_review_trigger_action.test.ts +455 -0
  296. package/src/tests/api_tests/vitl_push.test.ts +323 -0
  297. package/src/tests/setup_isolated.ts +140 -0
  298. package/src/tests/tests.ts +126 -20
  299. package/src/tests/unit_tests/isolated_suite_discovery.test.ts +178 -0
  300. package/src/tests/unit_tests/programs_conditional_logic.test.ts +189 -0
  301. package/src/tests/unit_tests/trigger_title_partials.test.ts +174 -0
  302. package/src/tests/webhooks_tests.ts +6 -1
  303. package/test_generated.pdf +0 -0
@@ -0,0 +1,566 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ require('source-map-support').install();
38
+ import { EnduserSession } from "../../sdk";
39
+ import { assert_checks, setup_isolated_tenant, } from "../setup_isolated";
40
+ var host = process.env.API_URL || 'http://localhost:8080';
41
+ var RAND = function () { return Math.random().toString(36).slice(2, 10); };
42
+ /**
43
+ * Coverage for the Phone Embed backend, `sms_messages.leave_message` (api/v1/api.ts) — the endpoint
44
+ * behind the "Leave a note, and we will text you back soon" widget.
45
+ *
46
+ * Two changes are under test:
47
+ *
48
+ * 1. Matching. Historically phone-only: a submission from a number that already existed was filed
49
+ * onto that contact no matter whose name was typed. Now, for orgs that have opted into
50
+ * `settings.endusers.matchEmailAndNames`, phone AND fname AND lname must all match, compared
51
+ * through `nameMatchValue` so `settings.endusers.caseInsensitiveMatching` applies exactly as it
52
+ * does to public form intake. Both settings OFF must behave exactly as before.
53
+ *
54
+ * 2. The "Incoming Message" automation trigger. Submissions used to fire only "Contact Created" and
55
+ * "Field Equals"; they now go through `handleIncomingCommunication` with channel 'SMS' and NO
56
+ * destination, so unfiltered and SMS-filtered triggers fire while destination-filtered and
57
+ * Email-filtered ones stay silent.
58
+ *
59
+ * Fixture warning, inherited from public_form_case_insensitive_match: `nameValidator` applies
60
+ * `first_letter_capitalized`, so a submitted "carol" is already stored as "Carol" and a
61
+ * "carol"/"Carol" fixture would pass with the setting OFF, proving nothing. The case-insensitive
62
+ * cases here differ AFTER the first letter ("MCDONALD" vs "mcdonald" -> "Mcdonald").
63
+ *
64
+ * `setup_isolated` rather than `setup_tests` because this flips ORGANIZATION settings, which on the
65
+ * shared fixture org would change behavior under every concurrently running suite, and because it
66
+ * asserts on "how many contacts carry this phone number", which needs a tenant nobody else writes to.
67
+ *
68
+ * RATE LIMIT: `leave_message` is throttled per IP at 10/min and 50/hour (`enduser-leave_message-ip`).
69
+ * Every submission in this suite comes from one IP, so the post count is kept to 8 deliberately — see
70
+ * POST_BUDGET below. Adding a submission risks 429ing the run rather than failing a check.
71
+ *
72
+ * Runs standalone or as part of the main suite:
73
+ * npm run test:modular -- api_tests/phone_embed_leave_message
74
+ */
75
+ /** Hard ceiling this suite stays under; `leave_message` allows 10 posts per minute per IP. */
76
+ var POST_BUDGET = 8;
77
+ /** Polls until `check` returns truthy or the budget runs out. The endpoint responds 204 before its
78
+ * trigger work finishes (handleIncomingCommunication is deliberately not awaited), so every
79
+ * assertion about a trigger's effect has to wait for it. Returns the last value either way, so a
80
+ * timeout produces a failed check with real evidence rather than a thrown error. */
81
+ var pollFor = function (describe, read, check, _a) {
82
+ var _b = _a === void 0 ? {} : _a, _c = _b.timeoutMs, timeoutMs = _c === void 0 ? 15000 : _c, _d = _b.intervalMs, intervalMs = _d === void 0 ? 500 : _d;
83
+ return __awaiter(void 0, void 0, void 0, function () {
84
+ var deadline, last;
85
+ return __generator(this, function (_e) {
86
+ switch (_e.label) {
87
+ case 0:
88
+ deadline = Date.now() + timeoutMs;
89
+ return [4 /*yield*/, read()];
90
+ case 1:
91
+ last = _e.sent();
92
+ _e.label = 2;
93
+ case 2:
94
+ if (!(!check(last) && Date.now() < deadline)) return [3 /*break*/, 5];
95
+ return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, intervalMs); })];
96
+ case 3:
97
+ _e.sent();
98
+ return [4 /*yield*/, read()];
99
+ case 4:
100
+ last = _e.sent();
101
+ return [3 /*break*/, 2];
102
+ case 5:
103
+ if (!check(last))
104
+ console.log(" (timed out waiting for ".concat(describe, " after ").concat(timeoutMs, "ms)"));
105
+ return [2 /*return*/, last];
106
+ }
107
+ });
108
+ });
109
+ };
110
+ export var phone_embed_leave_message_checks = function () { return __awaiter(void 0, void 0, void 0, function () {
111
+ var checks, record, tenant, sdk_1, businessId_1, posts_1, submit, contactsWithPhone_1, messagesFor_1, setSettings, TAG_ANY_1, TAG_SMS, TAG_EMAIL, TAG_DESTINATION, TAG_CREATED, addTagsTrigger, removeOnIncomingJourney_1, inRemoveJourney_1, PHONE_LEGACY_1, stampBeforeMatch_1, afterFirst, alice_1, notes, tagged, stamped, _a, _b, _c, _d, _e, _f, _g, _h, afterSecond, notes, restamped, removed, _j, _k, _l, _m, _o, _p, _q, _r, PHONE_NAMED_1, afterFirst, carol_1, taggedOn, afterSame, notes, afterDifferent, dave, _s, _t, _u, _v, _w, _x, _y, _z, carolNotes, PHONE_NAMELESS_1, nameless, after, namelessAfter, _0, _1, _2, _3, _4, _5, PHONE_CASE_1, stored, afterInsensitive, _6, _7, _8, _9, _10, afterSensitive;
112
+ var _11, _12;
113
+ return __generator(this, function (_13) {
114
+ switch (_13.label) {
115
+ case 0:
116
+ checks = [];
117
+ record = function (label, pass, detail) { return checks.push({ label: label, pass: pass, detail: detail }); };
118
+ _13.label = 1;
119
+ case 1:
120
+ _13.trys.push([1, , 61, 63]);
121
+ return [4 /*yield*/, setup_isolated_tenant({
122
+ name: "PhoneEmbedLeaveMessage ".concat(RAND()),
123
+ users: [{ isAdmin: true }],
124
+ apiKeys: 0,
125
+ })];
126
+ case 2:
127
+ tenant = _13.sent();
128
+ sdk_1 = tenant.sdk, businessId_1 = tenant.businessId;
129
+ posts_1 = 0;
130
+ submit = function (fname, lname, phone, message) { return __awaiter(void 0, void 0, void 0, function () {
131
+ var enduserSDK;
132
+ return __generator(this, function (_a) {
133
+ switch (_a.label) {
134
+ case 0:
135
+ posts_1 += 1;
136
+ if (posts_1 > POST_BUDGET) {
137
+ throw new Error("Suite exceeded its ".concat(POST_BUDGET, "-post budget; the per-IP throttle will 429"));
138
+ }
139
+ enduserSDK = new EnduserSession({ host: host, businessId: businessId_1 });
140
+ return [4 /*yield*/, enduserSDK.api.sms_messages.leave_message({ businessId: businessId_1, fname: fname, lname: lname, phone: phone, message: message })];
141
+ case 1:
142
+ _a.sent();
143
+ return [2 /*return*/];
144
+ }
145
+ });
146
+ }); };
147
+ contactsWithPhone_1 = function (phone) { return __awaiter(void 0, void 0, void 0, function () {
148
+ return __generator(this, function (_a) {
149
+ switch (_a.label) {
150
+ case 0: return [4 /*yield*/, sdk_1.api.endusers.getSome({ filter: { phone: phone } })];
151
+ case 1: return [2 /*return*/, (_a.sent())
152
+ /** Inbound notes filed onto one contact, newest last. */
153
+ ];
154
+ }
155
+ });
156
+ }); };
157
+ messagesFor_1 = function (enduserId) { return __awaiter(void 0, void 0, void 0, function () {
158
+ return __generator(this, function (_a) {
159
+ switch (_a.label) {
160
+ case 0: return [4 /*yield*/, sdk_1.api.sms_messages.getSome({ filter: { enduserId: enduserId } })];
161
+ case 1: return [2 /*return*/, (_a.sent())
162
+ /** Writes BOTH flags every time. Writing only one would be ambiguous about whether the update
163
+ * merges into `settings.endusers` or replaces it, and this suite needs them on simultaneously. */
164
+ ];
165
+ }
166
+ });
167
+ }); };
168
+ setSettings = function (matchEmailAndNames, caseInsensitiveMatching) { return __awaiter(void 0, void 0, void 0, function () {
169
+ var after;
170
+ var _a, _b, _c, _d, _e, _f, _g, _h;
171
+ return __generator(this, function (_j) {
172
+ switch (_j.label) {
173
+ case 0: return [4 /*yield*/, sdk_1.api.organizations.updateOne(businessId_1, {
174
+ settings: { endusers: { matchEmailAndNames: matchEmailAndNames, caseInsensitiveMatching: caseInsensitiveMatching } },
175
+ })];
176
+ case 1:
177
+ _j.sent();
178
+ return [4 /*yield*/, sdk_1.api.organizations.getOne(businessId_1)];
179
+ case 2:
180
+ after = _j.sent();
181
+ record("fixture: settings applied (matchEmailAndNames=".concat(matchEmailAndNames, ", caseInsensitive=").concat(caseInsensitiveMatching, ")"), ((_b = (_a = after.settings) === null || _a === void 0 ? void 0 : _a.endusers) === null || _b === void 0 ? void 0 : _b.matchEmailAndNames) === matchEmailAndNames
182
+ && ((_d = (_c = after.settings) === null || _c === void 0 ? void 0 : _c.endusers) === null || _d === void 0 ? void 0 : _d.caseInsensitiveMatching) === caseInsensitiveMatching, "org now reports matchEmailAndNames=".concat((_f = (_e = after.settings) === null || _e === void 0 ? void 0 : _e.endusers) === null || _f === void 0 ? void 0 : _f.matchEmailAndNames, ", ")
183
+ + "caseInsensitiveMatching=".concat((_h = (_g = after.settings) === null || _g === void 0 ? void 0 : _g.endusers) === null || _h === void 0 ? void 0 : _h.caseInsensitiveMatching, " ")
184
+ + "(if these disagree every check in the section below is vacuous)");
185
+ return [2 /*return*/];
186
+ }
187
+ });
188
+ }); };
189
+ TAG_ANY_1 = "embed-any-".concat(RAND());
190
+ TAG_SMS = "embed-sms-".concat(RAND());
191
+ TAG_EMAIL = "embed-email-".concat(RAND());
192
+ TAG_DESTINATION = "embed-destination-".concat(RAND());
193
+ TAG_CREATED = "embed-created-".concat(RAND());
194
+ addTagsTrigger = function (title, event, tag) { return __awaiter(void 0, void 0, void 0, function () {
195
+ return __generator(this, function (_a) {
196
+ switch (_a.label) {
197
+ case 0: return [4 /*yield*/, sdk_1.api.automation_triggers.createOne({
198
+ title: "".concat(title, " ").concat(RAND()),
199
+ status: 'Active',
200
+ event: event,
201
+ action: { type: 'Add Tags', info: { tags: [tag] } },
202
+ })];
203
+ case 1: return [2 /*return*/, (_a.sent())];
204
+ }
205
+ });
206
+ }); };
207
+ return [4 /*yield*/, addTagsTrigger('Embed incoming, unfiltered', { type: 'Incoming Message', info: {} }, TAG_ANY_1)];
208
+ case 3:
209
+ _13.sent();
210
+ return [4 /*yield*/, addTagsTrigger('Embed incoming, SMS only', { type: 'Incoming Message', info: { channels: ['SMS'] } }, TAG_SMS)];
211
+ case 4:
212
+ _13.sent();
213
+ return [4 /*yield*/, addTagsTrigger('Embed incoming, Email only', { type: 'Incoming Message', info: { channels: ['Email'] } }, TAG_EMAIL)];
214
+ case 5:
215
+ _13.sent();
216
+ return [4 /*yield*/, addTagsTrigger('Embed incoming, destination filtered', { type: 'Incoming Message', info: { destinations: ['+15005550123'] } }, TAG_DESTINATION)];
217
+ case 6:
218
+ _13.sent();
219
+ return [4 /*yield*/, addTagsTrigger('Embed contact created', { type: 'Contact Created', info: {} }, TAG_CREATED)
220
+ // Executable guard for the journey-removal race. `handleIncomingCommunication` runs
221
+ // `handleRemoveFromJourneysForIncomingCommunication`, which strips a contact out of every journey
222
+ // marked `onIncomingEnduserCommunication: 'Remove'`. The handler passes it the enduser object it
223
+ // already has, and for a BRAND-NEW contact that object carries no journeys, so the removal no-ops
224
+ // and the contact stays in the journey "Contact Created" is concurrently adding them to.
225
+ //
226
+ // This is the only check that would fail if a future edit replaced `enduser: result` with a
227
+ // re-read of the contact — a comment alone cannot catch that. Both halves are asserted below,
228
+ // against the two submissions section 1 already makes, so this costs no extra posts:
229
+ // new contact -> removal no-ops, contact STAYS in the journey
230
+ // matched one -> removal really runs, contact is REMOVED (Twilio inbound-webhook parity)
231
+ ];
232
+ case 7:
233
+ _13.sent();
234
+ return [4 /*yield*/, sdk_1.api.journeys.createOne({
235
+ title: "Embed Remove On Incoming ".concat(RAND()),
236
+ onIncomingEnduserCommunication: 'Remove',
237
+ })];
238
+ case 8:
239
+ removeOnIncomingJourney_1 = _13.sent();
240
+ return [4 /*yield*/, sdk_1.api.automation_triggers.createOne({
241
+ title: "Embed add to remove-on-incoming journey ".concat(RAND()),
242
+ status: 'Active',
243
+ event: { type: 'Contact Created', info: {} },
244
+ action: { type: 'Add To Journey', info: { journeyId: removeOnIncomingJourney_1.id } },
245
+ })];
246
+ case 9:
247
+ _13.sent();
248
+ inRemoveJourney_1 = function (enduserId) { return __awaiter(void 0, void 0, void 0, function () {
249
+ var _a, _b;
250
+ var _c;
251
+ return __generator(this, function (_d) {
252
+ switch (_d.label) {
253
+ case 0:
254
+ _b = (_a = Object).keys;
255
+ return [4 /*yield*/, sdk_1.api.endusers.getOne(enduserId)];
256
+ case 1: return [2 /*return*/, (_b.apply(_a, [(_c = (_d.sent()).journeys) !== null && _c !== void 0 ? _c : {}])
257
+ .includes(removeOnIncomingJourney_1.id))
258
+ /* ======== 1. both settings OFF: unchanged legacy behavior, plus the new trigger ======== */
259
+ ];
260
+ }
261
+ });
262
+ }); };
263
+ /* ======== 1. both settings OFF: unchanged legacy behavior, plus the new trigger ======== */
264
+ return [4 /*yield*/, setSettings(false, false)];
265
+ case 10:
266
+ /* ======== 1. both settings OFF: unchanged legacy behavior, plus the new trigger ======== */
267
+ _13.sent();
268
+ PHONE_LEGACY_1 = '+15005550101';
269
+ return [4 /*yield*/, submit('Alice', 'Smith', PHONE_LEGACY_1, 'off note one')];
270
+ case 11:
271
+ _13.sent();
272
+ return [4 /*yield*/, pollFor('the first submission to create a contact', function () { return contactsWithPhone_1(PHONE_LEGACY_1); }, function (found) { return found.length >= 1; })];
273
+ case 12:
274
+ afterFirst = _13.sent();
275
+ record('settings OFF: a submission from an unknown number creates a contact', afterFirst.length === 1 && afterFirst[0].fname === 'Alice' && afterFirst[0].lname === 'Smith', "contacts on ".concat(PHONE_LEGACY_1, ": ").concat(afterFirst.length, " ")
276
+ + "(".concat(afterFirst.map(function (e) { return "".concat(e.fname, " ").concat(e.lname); }).join(', ') || 'none', "); expected exactly one Alice Smith"));
277
+ alice_1 = afterFirst[0];
278
+ if (!alice_1) return [3 /*break*/, 20];
279
+ return [4 /*yield*/, messagesFor_1(alice_1.id)];
280
+ case 13:
281
+ notes = _13.sent();
282
+ record('the note is filed as an inbound, log-only SMS (so the patient is never texted it back)', notes.length === 1 && notes[0].inbound === true && notes[0].logOnly === true
283
+ && notes[0].message === 'off note one', "messages=".concat(notes.length, ": ").concat(JSON.stringify(notes.map(function (n) { return ({ m: n.message, inbound: n.inbound, logOnly: n.logOnly }); }))));
284
+ return [4 /*yield*/, pollFor('the Incoming Message trigger to fire', function () { return __awaiter(void 0, void 0, void 0, function () { var _a; return __generator(this, function (_b) {
285
+ switch (_b.label) {
286
+ case 0: return [4 /*yield*/, sdk_1.api.endusers.getOne(alice_1.id)];
287
+ case 1: return [2 /*return*/, (_a = (_b.sent()).tags) !== null && _a !== void 0 ? _a : []];
288
+ }
289
+ }); }); }, function (tags) { return tags.includes(TAG_ANY_1); })];
290
+ case 14:
291
+ tagged = _13.sent();
292
+ record('an unfiltered Incoming Message trigger FIRES for an embed submission (the headline ask)', tagged.includes(TAG_ANY_1), "tags on the contact: ".concat(JSON.stringify(tagged), "; expected to contain ").concat(TAG_ANY_1));
293
+ record('an Incoming Message trigger filtered to channel SMS fires', tagged.includes(TAG_SMS), "tags on the contact: ".concat(JSON.stringify(tagged), "; expected to contain ").concat(TAG_SMS));
294
+ record('an Incoming Message trigger filtered to channel Email does NOT fire', !tagged.includes(TAG_EMAIL), "tags on the contact: ".concat(JSON.stringify(tagged), "; must NOT contain ").concat(TAG_EMAIL));
295
+ record('an Incoming Message trigger filtered to a DESTINATION stays silent (no Twilio number is involved)', !tagged.includes(TAG_DESTINATION), "tags on the contact: ".concat(JSON.stringify(tagged), "; must NOT contain ").concat(TAG_DESTINATION));
296
+ record('the Contact Created trigger still fires for a contact the submission created (regression)', tagged.includes(TAG_CREATED), "tags on the contact: ".concat(JSON.stringify(tagged), "; expected to contain ").concat(TAG_CREATED));
297
+ return [4 /*yield*/, sdk_1.api.endusers.getOne(alice_1.id)];
298
+ case 15:
299
+ stamped = _13.sent();
300
+ record('recentInboundSMSAt is stamped, so the contact sorts as recently active in the inbox', !!stamped.recentInboundSMSAt, "recentInboundSMSAt=".concat(JSON.stringify(stamped.recentInboundSMSAt)));
301
+ stampBeforeMatch_1 = stamped.recentInboundSMSAt;
302
+ // half one of the race guard: the contact "Contact Created" just added must still be there
303
+ return [4 /*yield*/, pollFor('the Contact Created trigger to add the new contact to the remove-on-incoming journey', function () { return inRemoveJourney_1(alice_1.id); }, function (present) { return present; })
304
+ // settle, so a removal that fired slightly late would still be caught rather than missed
305
+ ];
306
+ case 16:
307
+ // half one of the race guard: the contact "Contact Created" just added must still be there
308
+ _13.sent();
309
+ // settle, so a removal that fired slightly late would still be caught rather than missed
310
+ return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 2000); })];
311
+ case 17:
312
+ // settle, so a removal that fired slightly late would still be caught rather than missed
313
+ _13.sent();
314
+ _a = record;
315
+ _b = ['a brand-new contact is NOT stripped from the journey Contact Created just added them to'];
316
+ return [4 /*yield*/, inRemoveJourney_1(alice_1.id)];
317
+ case 18:
318
+ _b = _b.concat([_13.sent()]);
319
+ _c = "contact ".concat(alice_1.id, " must still be in journey ").concat(removeOnIncomingJourney_1.id, "; ");
320
+ _d = "journeys=".concat;
321
+ _f = (_e = JSON).stringify;
322
+ _h = (_g = Object).keys;
323
+ return [4 /*yield*/, sdk_1.api.endusers.getOne(alice_1.id)];
324
+ case 19:
325
+ _a.apply(void 0, _b.concat([_c + _d.apply("journeys=", [_f.apply(_e, [_h.apply(_g, [(_11 = (_13.sent()).journeys) !== null && _11 !== void 0 ? _11 : {}])])])]));
326
+ _13.label = 20;
327
+ case 20:
328
+ // The legacy carve-out: with the setting OFF a DIFFERENT name on the same number must still
329
+ // match, exactly as it has for years. This is the regression that proves the gate works.
330
+ return [4 /*yield*/, submit('Bob', 'Jones', PHONE_LEGACY_1, 'off note two')
331
+ // A direct read, not a poll: the handler commits the match-or-insert decision BEFORE it answers
332
+ // 204, so the contact count is already final here. Only the trigger and stamp writes lag.
333
+ ];
334
+ case 21:
335
+ // The legacy carve-out: with the setting OFF a DIFFERENT name on the same number must still
336
+ // match, exactly as it has for years. This is the regression that proves the gate works.
337
+ _13.sent();
338
+ return [4 /*yield*/, contactsWithPhone_1(PHONE_LEGACY_1)];
339
+ case 22:
340
+ afterSecond = _13.sent();
341
+ record('settings OFF: a DIFFERENT name on the same number still matches (no second contact) — unchanged', afterSecond.length === 1, "contacts on ".concat(PHONE_LEGACY_1, ": ").concat(afterSecond.length, " ")
342
+ + "(".concat(afterSecond.map(function (e) { return "".concat(e.fname, " ").concat(e.lname); }).join(', '), "); expected exactly one"));
343
+ if (!alice_1) return [3 /*break*/, 27];
344
+ return [4 /*yield*/, pollFor('the second note to land', function () { return messagesFor_1(alice_1.id); }, function (found) { return found.length >= 2; })];
345
+ case 23:
346
+ notes = _13.sent();
347
+ record('settings OFF: the second note is filed onto the matched contact', notes.length === 2 && notes.some(function (n) { return n.message === 'off note two'; }), "messages on the matched contact: ".concat(JSON.stringify(notes.map(function (n) { return n.message; }))));
348
+ return [4 /*yield*/, pollFor('recentInboundSMSAt to advance on the matched contact', function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
349
+ switch (_a.label) {
350
+ case 0: return [4 /*yield*/, sdk_1.api.endusers.getOne(alice_1.id)];
351
+ case 1: return [2 /*return*/, (_a.sent()).recentInboundSMSAt];
352
+ }
353
+ }); }); }, function (value) { return !!value && !!stampBeforeMatch_1 && new Date(value) > new Date(stampBeforeMatch_1); })];
354
+ case 24:
355
+ restamped = _13.sent();
356
+ record('recentInboundSMSAt advances on a MATCHED contact, not just a newly created one', !!restamped && !!stampBeforeMatch_1 && new Date(restamped) > new Date(stampBeforeMatch_1), "before=".concat(JSON.stringify(stampBeforeMatch_1), ", after=").concat(JSON.stringify(restamped), "; after must be later"));
357
+ return [4 /*yield*/, pollFor('the matched contact to be removed from the remove-on-incoming journey', function () { return inRemoveJourney_1(alice_1.id); }, function (present) { return !present; })];
358
+ case 25:
359
+ removed = _13.sent();
360
+ _j = record;
361
+ _k = ['an incoming note from an EXISTING contact DOES remove them from a remove-on-incoming journey',
362
+ !removed];
363
+ _l = "contact ".concat(alice_1.id, " must no longer be in journey ").concat(removeOnIncomingJourney_1.id, "; ");
364
+ _m = "journeys=".concat;
365
+ _p = (_o = JSON).stringify;
366
+ _r = (_q = Object).keys;
367
+ return [4 /*yield*/, sdk_1.api.endusers.getOne(alice_1.id)];
368
+ case 26:
369
+ _j.apply(void 0, _k.concat([_l + _m.apply("journeys=", [_p.apply(_o, [_r.apply(_q, [(_12 = (_13.sent()).journeys) !== null && _12 !== void 0 ? _12 : {}])])])]));
370
+ _13.label = 27;
371
+ case 27:
372
+ /* ======== 2. matchEmailAndNames ON: phone + name must both match ======== */
373
+ return [4 /*yield*/, setSettings(true, false)];
374
+ case 28:
375
+ /* ======== 2. matchEmailAndNames ON: phone + name must both match ======== */
376
+ _13.sent();
377
+ PHONE_NAMED_1 = '+15005550102';
378
+ return [4 /*yield*/, submit('Carol', 'Diaz', PHONE_NAMED_1, 'on note one')];
379
+ case 29:
380
+ _13.sent();
381
+ return [4 /*yield*/, pollFor('the first named submission to create a contact', function () { return contactsWithPhone_1(PHONE_NAMED_1); }, function (found) { return found.length >= 1; })];
382
+ case 30:
383
+ afterFirst = _13.sent();
384
+ record('setting ON: an unknown number still creates a contact', afterFirst.length === 1, "contacts on ".concat(PHONE_NAMED_1, ": ").concat(afterFirst.length, "; expected exactly one"));
385
+ carol_1 = afterFirst[0];
386
+ if (!carol_1) return [3 /*break*/, 32];
387
+ return [4 /*yield*/, pollFor('the Incoming Message trigger to fire with matchEmailAndNames ON', function () { return __awaiter(void 0, void 0, void 0, function () { var _a; return __generator(this, function (_b) {
388
+ switch (_b.label) {
389
+ case 0: return [4 /*yield*/, sdk_1.api.endusers.getOne(carol_1.id)];
390
+ case 1: return [2 /*return*/, (_a = (_b.sent()).tags) !== null && _a !== void 0 ? _a : []];
391
+ }
392
+ }); }); }, function (tags) { return tags.includes(TAG_ANY_1); })];
393
+ case 31:
394
+ taggedOn = _13.sent();
395
+ record('the Incoming Message trigger also fires with matchEmailAndNames ON (gate is matching-only)', taggedOn.includes(TAG_ANY_1) && taggedOn.includes(TAG_SMS) && !taggedOn.includes(TAG_DESTINATION), "tags: ".concat(JSON.stringify(taggedOn), "; expected ").concat(TAG_ANY_1, " and ").concat(TAG_SMS, ", and NOT ").concat(TAG_DESTINATION));
396
+ _13.label = 32;
397
+ case 32:
398
+ // same phone, SAME name -> must match the existing record
399
+ return [4 /*yield*/, submit('Carol', 'Diaz', PHONE_NAMED_1, 'on note two')];
400
+ case 33:
401
+ // same phone, SAME name -> must match the existing record
402
+ _13.sent();
403
+ return [4 /*yield*/, contactsWithPhone_1(PHONE_NAMED_1)];
404
+ case 34:
405
+ afterSame = _13.sent();
406
+ record('setting ON: the SAME name on the same number matches (no duplicate)', afterSame.length === 1, "contacts on ".concat(PHONE_NAMED_1, ": ").concat(afterSame.length, " ")
407
+ + "(".concat(afterSame.map(function (e) { return "".concat(e.fname, " ").concat(e.lname); }).join(', '), "); expected exactly one"));
408
+ if (!carol_1) return [3 /*break*/, 36];
409
+ return [4 /*yield*/, pollFor('both notes to land on Carol', function () { return messagesFor_1(carol_1.id); }, function (found) { return found.length >= 2; })];
410
+ case 35:
411
+ notes = _13.sent();
412
+ record('setting ON: both notes from the same person land on the one contact', notes.length === 2, "messages on ".concat(carol_1.id, ": ").concat(JSON.stringify(notes.map(function (n) { return n.message; }))));
413
+ _13.label = 36;
414
+ case 36:
415
+ // same phone, DIFFERENT name -> a second contact, which is the behavior change
416
+ return [4 /*yield*/, submit('Dave', 'Edwards', PHONE_NAMED_1, 'on note three')];
417
+ case 37:
418
+ // same phone, DIFFERENT name -> a second contact, which is the behavior change
419
+ _13.sent();
420
+ return [4 /*yield*/, pollFor('the differing-name submission to create a second contact', function () { return contactsWithPhone_1(PHONE_NAMED_1); }, function (found) { return found.length >= 2; })];
421
+ case 38:
422
+ afterDifferent = _13.sent();
423
+ record('setting ON: a DIFFERENT name on the same number creates a SECOND contact', afterDifferent.length === 2, "contacts on ".concat(PHONE_NAMED_1, ": ").concat(afterDifferent.length, " ")
424
+ + "(".concat(afterDifferent.map(function (e) { return "".concat(e.fname, " ").concat(e.lname); }).join(', '), "); expected two"));
425
+ dave = afterDifferent.find(function (e) { return e.fname === 'Dave' && e.lname === 'Edwards'; });
426
+ _s = record;
427
+ _t = ['setting ON: the differing-name note is filed onto the NEW contact, not the existing one'];
428
+ _u = !!dave;
429
+ if (!_u) return [3 /*break*/, 40];
430
+ return [4 /*yield*/, messagesFor_1(dave.id)];
431
+ case 39:
432
+ _u = (_13.sent()).some(function (n) { return n.message === 'on note three'; });
433
+ _13.label = 40;
434
+ case 40:
435
+ _t = _t.concat([_u]);
436
+ if (!dave) return [3 /*break*/, 42];
437
+ _x = (_w = "messages on Dave ".concat(dave.id, ": ")).concat;
438
+ _z = (_y = JSON).stringify;
439
+ return [4 /*yield*/, messagesFor_1(dave.id)];
440
+ case 41:
441
+ _v = _x.apply(_w, [_z.apply(_y, [(_13.sent()).map(function (n) { return n.message; })])]);
442
+ return [3 /*break*/, 43];
443
+ case 42:
444
+ _v = "no Dave Edwards contact was created on ".concat(PHONE_NAMED_1);
445
+ _13.label = 43;
446
+ case 43:
447
+ _s.apply(void 0, _t.concat([_v]));
448
+ if (!carol_1) return [3 /*break*/, 45];
449
+ return [4 /*yield*/, messagesFor_1(carol_1.id)];
450
+ case 44:
451
+ carolNotes = _13.sent();
452
+ record('setting ON: the differing-name note did NOT leak onto the other contact', !carolNotes.some(function (n) { return n.message === 'on note three'; }), "messages on Carol ".concat(carol_1.id, ": ").concat(JSON.stringify(carolNotes.map(function (n) { return n.message; }))));
453
+ _13.label = 45;
454
+ case 45:
455
+ PHONE_NAMELESS_1 = '+15005550103';
456
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({ phone: PHONE_NAMELESS_1 })];
457
+ case 46:
458
+ nameless = _13.sent();
459
+ record('fixture: the nameless contact really has no name', !nameless.fname && !nameless.lname, "fname=".concat(JSON.stringify(nameless.fname), ", lname=").concat(JSON.stringify(nameless.lname), " ")
460
+ + "(if either is set, the check below is vacuous)");
461
+ return [4 /*yield*/, submit('Fiona', 'Grant', PHONE_NAMELESS_1, 'blank name note')];
462
+ case 47:
463
+ _13.sent();
464
+ return [4 /*yield*/, pollFor('the submission to create its own contact beside the nameless one', function () { return contactsWithPhone_1(PHONE_NAMELESS_1); }, function (found) { return found.length >= 2; })];
465
+ case 48:
466
+ after = _13.sent();
467
+ record('setting ON: a blank-name contact on the same number is NOT matched; a second contact is created', after.length === 2 && after.some(function (e) { return e.fname === 'Fiona' && e.lname === 'Grant'; }), "contacts on ".concat(PHONE_NAMELESS_1, ": ").concat(after.length, " ")
468
+ + "(".concat(after.map(function (e) { return "".concat(JSON.stringify(e.fname), " ").concat(JSON.stringify(e.lname)); }).join(', '), "); ")
469
+ + "expected two, one of them Fiona Grant");
470
+ return [4 /*yield*/, sdk_1.api.endusers.getOne(nameless.id)];
471
+ case 49:
472
+ namelessAfter = _13.sent();
473
+ record('setting ON: the nameless contact is left untouched — no name is written onto it', !namelessAfter.fname && !namelessAfter.lname, "the nameless contact now reads fname=".concat(JSON.stringify(namelessAfter.fname), ", ")
474
+ + "lname=".concat(JSON.stringify(namelessAfter.lname), "; both must still be empty"));
475
+ _0 = record;
476
+ _1 = ['setting ON: the note did not land on the nameless contact'];
477
+ return [4 /*yield*/, messagesFor_1(nameless.id)];
478
+ case 50:
479
+ _1 = _1.concat([!(_13.sent()).some(function (n) { return n.message === 'blank name note'; })]);
480
+ _2 = "messages on the nameless contact: ";
481
+ _3 = "".concat;
482
+ _5 = (_4 = JSON).stringify;
483
+ return [4 /*yield*/, messagesFor_1(nameless.id)];
484
+ case 51:
485
+ _0.apply(void 0, _1.concat([_2 + _3.apply("", [_5.apply(_4, [(_13.sent()).map(function (n) { return n.message; })])])]));
486
+ PHONE_CASE_1 = '+15005550104';
487
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({ fname: 'Ian', lname: 'MCDONALD', phone: PHONE_CASE_1 })];
488
+ case 52:
489
+ stored = _13.sent();
490
+ record('fixture: a non-first-letter capitalization variant is stored verbatim', stored.lname === 'MCDONALD', "stored lname=".concat(JSON.stringify(stored.lname), " (if this is not MCDONALD both checks below are vacuous)"));
491
+ return [4 /*yield*/, setSettings(true, true)];
492
+ case 53:
493
+ _13.sent();
494
+ return [4 /*yield*/, submit('Ian', 'mcdonald', PHONE_CASE_1, 'case note one')];
495
+ case 54:
496
+ _13.sent();
497
+ return [4 /*yield*/, contactsWithPhone_1(PHONE_CASE_1)];
498
+ case 55:
499
+ afterInsensitive = _13.sent();
500
+ record('caseInsensitiveMatching ON: "mcdonald" matches stored "MCDONALD" (no duplicate)', afterInsensitive.length === 1, "contacts on ".concat(PHONE_CASE_1, ": ").concat(afterInsensitive.length, " ")
501
+ + "(".concat(afterInsensitive.map(function (e) { return "".concat(e.fname, " ").concat(e.lname); }).join(', '), "); expected exactly one"));
502
+ _6 = record;
503
+ _7 = ['caseInsensitiveMatching ON: the matched contact keeps its own capitalization'];
504
+ return [4 /*yield*/, sdk_1.api.endusers.getOne(stored.id)];
505
+ case 56:
506
+ _7 = _7.concat([(_13.sent()).lname === 'MCDONALD']);
507
+ _8 = "stored lname is now ".concat;
508
+ _10 = (_9 = JSON).stringify;
509
+ return [4 /*yield*/, sdk_1.api.endusers.getOne(stored.id)];
510
+ case 57:
511
+ _6.apply(void 0, _7.concat([_8.apply("stored lname is now ", [_10.apply(_9, [(_13.sent()).lname]), ", must still be \"MCDONALD\""])]));
512
+ return [4 /*yield*/, setSettings(true, false)];
513
+ case 58:
514
+ _13.sent();
515
+ return [4 /*yield*/, submit('Ian', 'mcdonald', PHONE_CASE_1, 'case note two')];
516
+ case 59:
517
+ _13.sent();
518
+ return [4 /*yield*/, pollFor('the byte-exact submission to create a second contact', function () { return contactsWithPhone_1(PHONE_CASE_1); }, function (found) { return found.length >= 2; })];
519
+ case 60:
520
+ afterSensitive = _13.sent();
521
+ record('caseInsensitiveMatching OFF: "Mcdonald" no longer matches "MCDONALD"; a second contact is created', afterSensitive.length === 2, "contacts on ".concat(PHONE_CASE_1, ": ").concat(afterSensitive.length, " ")
522
+ + "(".concat(afterSensitive.map(function (e) { return "".concat(e.fname, " ").concat(e.lname); }).join(', '), "); expected two"));
523
+ record("the suite stayed within its per-IP post budget", posts_1 <= POST_BUDGET, "made ".concat(posts_1, " submissions, budget is ").concat(POST_BUDGET, " (the endpoint allows 10/min per IP)"));
524
+ return [2 /*return*/, checks];
525
+ case 61: return [4 /*yield*/, (tenant === null || tenant === void 0 ? void 0 : tenant.teardown())];
526
+ case 62:
527
+ _13.sent();
528
+ return [7 /*endfinally*/];
529
+ case 63: return [2 /*return*/];
530
+ }
531
+ });
532
+ }); };
533
+ /** Asserting wrapper, for standalone runs. */
534
+ export var phone_embed_leave_message_tests = function () { return __awaiter(void 0, void 0, void 0, function () {
535
+ var _a, _b;
536
+ return __generator(this, function (_c) {
537
+ switch (_c.label) {
538
+ case 0:
539
+ _a = assert_checks;
540
+ _b = ['Phone Embed leave_message'];
541
+ return [4 /*yield*/, phone_embed_leave_message_checks()];
542
+ case 1:
543
+ _a.apply(void 0, _b.concat([_c.sent()]));
544
+ return [2 /*return*/];
545
+ }
546
+ });
547
+ }); };
548
+ /** Enrolls this suite in the auto-discovered parallel pool — see run_discovered_isolated_suites. */
549
+ export var ISOLATED_SUITE = {
550
+ name: 'Phone Embed leave_message',
551
+ run: phone_embed_leave_message_checks,
552
+ };
553
+ // Allow running this test file independently
554
+ if (require.main === module) {
555
+ console.log("Using API URL: ".concat(host));
556
+ phone_embed_leave_message_tests()
557
+ .then(function () {
558
+ console.log("Phone Embed leave_message test suite completed successfully");
559
+ process.exit(0);
560
+ })
561
+ .catch(function (error) {
562
+ console.error("Phone Embed leave_message test suite failed:", error);
563
+ process.exit(1);
564
+ });
565
+ }
566
+ //# sourceMappingURL=phone_embed_leave_message.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phone_embed_leave_message.test.js","sourceRoot":"","sources":["../../../../src/tests/api_tests/phone_embed_leave_message.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
- import { Check } from "../setup_isolated";
1
+ import { Check, IsolatedSuite } from "../setup_isolated";
2
2
  export declare const programs_checks: () => Promise<Check[]>;
3
3
  /** Asserting wrapper, for standalone runs and for sequential use in the suite. */
4
4
  export declare const programs_tests: () => Promise<void>;
5
+ /** Enrolls this suite in the auto-discovered parallel pool — see run_discovered_isolated_suites. */
6
+ export declare const ISOLATED_SUITE: IsolatedSuite;
5
7
  //# sourceMappingURL=programs.test.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"programs.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/api_tests/programs.test.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,EAEN,MAAM,mBAAmB,CAAA;AA0C1B,eAAO,MAAM,eAAe,QAAa,QAAQ,KAAK,EAAE,CA4NvD,CAAA;AAED,kFAAkF;AAClF,eAAO,MAAM,cAAc,qBAE1B,CAAA"}
1
+ {"version":3,"file":"programs.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/api_tests/programs.test.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,EAEL,aAAa,EACd,MAAM,mBAAmB,CAAA;AA0C1B,eAAO,MAAM,eAAe,QAAa,QAAQ,KAAK,EAAE,CAqRvD,CAAA;AAED,kFAAkF;AAClF,eAAO,MAAM,cAAc,qBAE1B,CAAA;AAED,oGAAoG;AACpG,eAAO,MAAM,cAAc,EAAE,aAA0D,CAAA"}