@tellescope/sdk 1.256.14 → 1.256.16

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 (293) hide show
  1. package/lib/cjs/sdk.d.ts +2 -2
  2. package/lib/cjs/tests/api_tests/auto_merge_form_submission.test.js +1 -1
  3. package/lib/cjs/tests/api_tests/auto_merge_form_submission.test.js.map +1 -1
  4. package/lib/cjs/tests/api_tests/enduser_observations_auto_review.test.d.ts +5 -0
  5. package/lib/cjs/tests/api_tests/enduser_observations_auto_review.test.d.ts.map +1 -0
  6. package/lib/cjs/tests/api_tests/enduser_observations_auto_review.test.js +388 -0
  7. package/lib/cjs/tests/api_tests/enduser_observations_auto_review.test.js.map +1 -0
  8. package/lib/cjs/tests/api_tests/integrations_redacted.test.js +3 -3
  9. package/lib/cjs/tests/api_tests/integrations_redacted.test.js.map +1 -1
  10. package/lib/cjs/tests/api_tests/organization_signup.test.d.ts +1 -1
  11. package/lib/cjs/tests/api_tests/organization_signup.test.js +1 -1
  12. package/lib/cjs/tests/api_tests/purchase_made_trigger.test.d.ts.map +1 -1
  13. package/lib/cjs/tests/api_tests/purchase_made_trigger.test.js +103 -162
  14. package/lib/cjs/tests/api_tests/purchase_made_trigger.test.js.map +1 -1
  15. package/lib/cjs/tests/api_tests/security/F-0200-form-logic-js-execution.test.d.ts +33 -0
  16. package/lib/cjs/tests/api_tests/security/F-0200-form-logic-js-execution.test.d.ts.map +1 -0
  17. package/lib/cjs/tests/api_tests/security/F-0200-form-logic-js-execution.test.js +249 -0
  18. package/lib/cjs/tests/api_tests/security/F-0200-form-logic-js-execution.test.js.map +1 -0
  19. package/lib/cjs/tests/api_tests/security/add-to-journey-foreign-enduserid.test.d.ts +42 -0
  20. package/lib/cjs/tests/api_tests/security/add-to-journey-foreign-enduserid.test.d.ts.map +1 -0
  21. package/lib/cjs/tests/api_tests/security/add-to-journey-foreign-enduserid.test.js +281 -0
  22. package/lib/cjs/tests/api_tests/security/add-to-journey-foreign-enduserid.test.js.map +1 -0
  23. package/lib/cjs/tests/api_tests/security/ai-conversations-rbac.test.d.ts +38 -0
  24. package/lib/cjs/tests/api_tests/security/ai-conversations-rbac.test.d.ts.map +1 -0
  25. package/lib/cjs/tests/api_tests/security/ai-conversations-rbac.test.js +390 -0
  26. package/lib/cjs/tests/api_tests/security/ai-conversations-rbac.test.js.map +1 -0
  27. package/lib/cjs/tests/api_tests/security/allowed-paths-confinement.test.d.ts +6 -0
  28. package/lib/cjs/tests/api_tests/security/allowed-paths-confinement.test.d.ts.map +1 -0
  29. package/lib/cjs/tests/api_tests/security/allowed-paths-confinement.test.js +1003 -0
  30. package/lib/cjs/tests/api_tests/security/allowed-paths-confinement.test.js.map +1 -0
  31. package/lib/cjs/tests/api_tests/security/automated-actions-process-gate.test.d.ts +42 -0
  32. package/lib/cjs/tests/api_tests/security/automated-actions-process-gate.test.d.ts.map +1 -0
  33. package/lib/cjs/tests/api_tests/security/automated-actions-process-gate.test.js +323 -0
  34. package/lib/cjs/tests/api_tests/security/automated-actions-process-gate.test.js.map +1 -0
  35. package/lib/cjs/tests/api_tests/security/booking-info-idor-token-mint.test.d.ts +29 -0
  36. package/lib/cjs/tests/api_tests/security/booking-info-idor-token-mint.test.d.ts.map +1 -0
  37. package/lib/cjs/tests/api_tests/security/booking-info-idor-token-mint.test.js +335 -0
  38. package/lib/cjs/tests/api_tests/security/booking-info-idor-token-mint.test.js.map +1 -0
  39. package/lib/cjs/tests/api_tests/security/cascade-role-rename-cross-tenant.test.d.ts +32 -0
  40. package/lib/cjs/tests/api_tests/security/cascade-role-rename-cross-tenant.test.d.ts.map +1 -0
  41. package/lib/cjs/tests/api_tests/security/cascade-role-rename-cross-tenant.test.js +237 -0
  42. package/lib/cjs/tests/api_tests/security/cascade-role-rename-cross-tenant.test.js.map +1 -0
  43. package/lib/cjs/tests/api_tests/security/data-sync-redaction-bypass.test.d.ts +28 -0
  44. package/lib/cjs/tests/api_tests/security/data-sync-redaction-bypass.test.d.ts.map +1 -0
  45. package/lib/cjs/tests/api_tests/security/data-sync-redaction-bypass.test.js +349 -0
  46. package/lib/cjs/tests/api_tests/security/data-sync-redaction-bypass.test.js.map +1 -0
  47. package/lib/cjs/tests/api_tests/security/develop-health-benefit-verification-rbac.test.d.ts +30 -0
  48. package/lib/cjs/tests/api_tests/security/develop-health-benefit-verification-rbac.test.d.ts.map +1 -0
  49. package/lib/cjs/tests/api_tests/security/develop-health-benefit-verification-rbac.test.js +314 -0
  50. package/lib/cjs/tests/api_tests/security/develop-health-benefit-verification-rbac.test.js.map +1 -0
  51. package/lib/cjs/tests/api_tests/security/enduser-cross-create.test.d.ts +21 -0
  52. package/lib/cjs/tests/api_tests/security/enduser-cross-create.test.d.ts.map +1 -0
  53. package/lib/cjs/tests/api_tests/security/enduser-cross-create.test.js +362 -0
  54. package/lib/cjs/tests/api_tests/security/enduser-cross-create.test.js.map +1 -0
  55. package/lib/cjs/tests/api_tests/security/enduser-write-restrictions.test.d.ts +21 -0
  56. package/lib/cjs/tests/api_tests/security/enduser-write-restrictions.test.d.ts.map +1 -0
  57. package/lib/cjs/tests/api_tests/security/enduser-write-restrictions.test.js +366 -0
  58. package/lib/cjs/tests/api_tests/security/enduser-write-restrictions.test.js.map +1 -0
  59. package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.d.ts +5 -0
  60. package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.d.ts.map +1 -0
  61. package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.js +357 -0
  62. package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.js.map +1 -0
  63. package/lib/cjs/tests/api_tests/security/form-logic-js-execution.test.d.ts +32 -0
  64. package/lib/cjs/tests/api_tests/security/form-logic-js-execution.test.d.ts.map +1 -0
  65. package/lib/cjs/tests/api_tests/security/form-logic-js-execution.test.js +248 -0
  66. package/lib/cjs/tests/api_tests/security/form-logic-js-execution.test.js.map +1 -0
  67. package/lib/cjs/tests/api_tests/security/globalunique-conflict-redaction.test.d.ts +19 -0
  68. package/lib/cjs/tests/api_tests/security/globalunique-conflict-redaction.test.d.ts.map +1 -0
  69. package/lib/cjs/tests/api_tests/security/globalunique-conflict-redaction.test.js +138 -0
  70. package/lib/cjs/tests/api_tests/security/globalunique-conflict-redaction.test.js.map +1 -0
  71. package/lib/cjs/tests/api_tests/security/handle-incoming-communication-cross-tenant.test.d.ts +24 -0
  72. package/lib/cjs/tests/api_tests/security/handle-incoming-communication-cross-tenant.test.d.ts.map +1 -0
  73. package/lib/cjs/tests/api_tests/security/handle-incoming-communication-cross-tenant.test.js +201 -0
  74. package/lib/cjs/tests/api_tests/security/handle-incoming-communication-cross-tenant.test.js.map +1 -0
  75. package/lib/cjs/tests/api_tests/security/invite-user-enumeration.test.d.ts +29 -0
  76. package/lib/cjs/tests/api_tests/security/invite-user-enumeration.test.d.ts.map +1 -0
  77. package/lib/cjs/tests/api_tests/security/invite-user-enumeration.test.js +278 -0
  78. package/lib/cjs/tests/api_tests/security/invite-user-enumeration.test.js.map +1 -0
  79. package/lib/cjs/tests/api_tests/security/load-inbox-redaction.test.d.ts +17 -0
  80. package/lib/cjs/tests/api_tests/security/load-inbox-redaction.test.d.ts.map +1 -0
  81. package/lib/cjs/tests/api_tests/security/load-inbox-redaction.test.js +155 -0
  82. package/lib/cjs/tests/api_tests/security/load-inbox-redaction.test.js.map +1 -0
  83. package/lib/cjs/tests/api_tests/security/prototype-pollution.test.d.ts +2 -0
  84. package/lib/cjs/tests/api_tests/security/prototype-pollution.test.d.ts.map +1 -0
  85. package/lib/cjs/tests/api_tests/security/prototype-pollution.test.js +88 -0
  86. package/lib/cjs/tests/api_tests/security/prototype-pollution.test.js.map +1 -0
  87. package/lib/cjs/tests/api_tests/security/proxy-image-unauth-ssrf.test.d.ts +34 -0
  88. package/lib/cjs/tests/api_tests/security/proxy-image-unauth-ssrf.test.d.ts.map +1 -0
  89. package/lib/cjs/tests/api_tests/security/proxy-image-unauth-ssrf.test.js +230 -0
  90. package/lib/cjs/tests/api_tests/security/proxy-image-unauth-ssrf.test.js.map +1 -0
  91. package/lib/cjs/tests/api_tests/security/sanitize-user-html-with-iframes.test.d.ts +2 -0
  92. package/lib/cjs/tests/api_tests/security/sanitize-user-html-with-iframes.test.d.ts.map +1 -0
  93. package/lib/cjs/tests/api_tests/security/sanitize-user-html-with-iframes.test.js +242 -0
  94. package/lib/cjs/tests/api_tests/security/sanitize-user-html-with-iframes.test.js.map +1 -0
  95. package/lib/cjs/tests/api_tests/security/sanitize-user-html.test.d.ts +2 -0
  96. package/lib/cjs/tests/api_tests/security/sanitize-user-html.test.d.ts.map +1 -0
  97. package/lib/cjs/tests/api_tests/security/sanitize-user-html.test.js +148 -0
  98. package/lib/cjs/tests/api_tests/security/sanitize-user-html.test.js.map +1 -0
  99. package/lib/cjs/tests/api_tests/security/schema-adminonly-enforcement.test.d.ts +45 -0
  100. package/lib/cjs/tests/api_tests/security/schema-adminonly-enforcement.test.d.ts.map +1 -0
  101. package/lib/cjs/tests/api_tests/security/schema-adminonly-enforcement.test.js +388 -0
  102. package/lib/cjs/tests/api_tests/security/schema-adminonly-enforcement.test.js.map +1 -0
  103. package/lib/cjs/tests/api_tests/security/self-admin-role-assignment.test.d.ts +38 -0
  104. package/lib/cjs/tests/api_tests/security/self-admin-role-assignment.test.d.ts.map +1 -0
  105. package/lib/cjs/tests/api_tests/security/self-admin-role-assignment.test.js +222 -0
  106. package/lib/cjs/tests/api_tests/security/self-admin-role-assignment.test.js.map +1 -0
  107. package/lib/cjs/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.d.ts +6 -0
  108. package/lib/cjs/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.d.ts.map +1 -0
  109. package/lib/cjs/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.js +354 -0
  110. package/lib/cjs/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.js.map +1 -0
  111. package/lib/cjs/tests/api_tests/security/webhook-outbound-ssrf.test.d.ts +28 -0
  112. package/lib/cjs/tests/api_tests/security/webhook-outbound-ssrf.test.d.ts.map +1 -0
  113. package/lib/cjs/tests/api_tests/security/webhook-outbound-ssrf.test.js +442 -0
  114. package/lib/cjs/tests/api_tests/security/webhook-outbound-ssrf.test.js.map +1 -0
  115. package/lib/cjs/tests/api_tests/security/webhook-timeout.test.d.ts +19 -0
  116. package/lib/cjs/tests/api_tests/security/webhook-timeout.test.d.ts.map +1 -0
  117. package/lib/cjs/tests/api_tests/security/webhook-timeout.test.js +156 -0
  118. package/lib/cjs/tests/api_tests/security/webhook-timeout.test.js.map +1 -0
  119. package/lib/cjs/tests/api_tests/webhook_error_handling.test.js +2 -2
  120. package/lib/cjs/tests/api_tests/webhook_error_handling.test.js.map +1 -1
  121. package/lib/cjs/tests/tests.d.ts.map +1 -1
  122. package/lib/cjs/tests/tests.js +60 -46
  123. package/lib/cjs/tests/tests.js.map +1 -1
  124. package/lib/cjs/tests/unit_tests/openapi_spec_freshness.test.d.ts +1 -1
  125. package/lib/cjs/tests/unit_tests/openapi_spec_freshness.test.js +1 -1
  126. package/lib/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  127. package/lib/esm/enduser.d.ts +0 -1
  128. package/lib/esm/enduser.d.ts.map +1 -1
  129. package/lib/esm/sdk.d.ts +4 -5
  130. package/lib/esm/sdk.d.ts.map +1 -1
  131. package/lib/esm/session.d.ts +0 -1
  132. package/lib/esm/session.d.ts.map +1 -1
  133. package/lib/esm/tests/api_tests/auto_merge_form_submission.test.js +1 -1
  134. package/lib/esm/tests/api_tests/auto_merge_form_submission.test.js.map +1 -1
  135. package/lib/esm/tests/api_tests/enduser_observations_auto_review.test.d.ts +5 -0
  136. package/lib/esm/tests/api_tests/enduser_observations_auto_review.test.d.ts.map +1 -0
  137. package/lib/esm/tests/api_tests/enduser_observations_auto_review.test.js +383 -0
  138. package/lib/esm/tests/api_tests/enduser_observations_auto_review.test.js.map +1 -0
  139. package/lib/esm/tests/api_tests/integrations_redacted.test.js +3 -3
  140. package/lib/esm/tests/api_tests/integrations_redacted.test.js.map +1 -1
  141. package/lib/esm/tests/api_tests/organization_signup.test.d.ts +1 -1
  142. package/lib/esm/tests/api_tests/organization_signup.test.js +1 -1
  143. package/lib/esm/tests/api_tests/purchase_made_trigger.test.d.ts.map +1 -1
  144. package/lib/esm/tests/api_tests/purchase_made_trigger.test.js +104 -163
  145. package/lib/esm/tests/api_tests/purchase_made_trigger.test.js.map +1 -1
  146. package/lib/esm/tests/api_tests/security/F-0200-form-logic-js-execution.test.d.ts +33 -0
  147. package/lib/esm/tests/api_tests/security/F-0200-form-logic-js-execution.test.d.ts.map +1 -0
  148. package/lib/esm/tests/api_tests/security/F-0200-form-logic-js-execution.test.js +244 -0
  149. package/lib/esm/tests/api_tests/security/F-0200-form-logic-js-execution.test.js.map +1 -0
  150. package/lib/esm/tests/api_tests/security/add-to-journey-foreign-enduserid.test.d.ts +42 -0
  151. package/lib/esm/tests/api_tests/security/add-to-journey-foreign-enduserid.test.d.ts.map +1 -0
  152. package/lib/esm/tests/api_tests/security/add-to-journey-foreign-enduserid.test.js +276 -0
  153. package/lib/esm/tests/api_tests/security/add-to-journey-foreign-enduserid.test.js.map +1 -0
  154. package/lib/esm/tests/api_tests/security/ai-conversations-rbac.test.d.ts +38 -0
  155. package/lib/esm/tests/api_tests/security/ai-conversations-rbac.test.d.ts.map +1 -0
  156. package/lib/esm/tests/api_tests/security/ai-conversations-rbac.test.js +386 -0
  157. package/lib/esm/tests/api_tests/security/ai-conversations-rbac.test.js.map +1 -0
  158. package/lib/esm/tests/api_tests/security/allowed-paths-confinement.test.d.ts +6 -0
  159. package/lib/esm/tests/api_tests/security/allowed-paths-confinement.test.d.ts.map +1 -0
  160. package/lib/esm/tests/api_tests/security/allowed-paths-confinement.test.js +996 -0
  161. package/lib/esm/tests/api_tests/security/allowed-paths-confinement.test.js.map +1 -0
  162. package/lib/esm/tests/api_tests/security/automated-actions-process-gate.test.d.ts +42 -0
  163. package/lib/esm/tests/api_tests/security/automated-actions-process-gate.test.d.ts.map +1 -0
  164. package/lib/esm/tests/api_tests/security/automated-actions-process-gate.test.js +316 -0
  165. package/lib/esm/tests/api_tests/security/automated-actions-process-gate.test.js.map +1 -0
  166. package/lib/esm/tests/api_tests/security/booking-info-idor-token-mint.test.d.ts +29 -0
  167. package/lib/esm/tests/api_tests/security/booking-info-idor-token-mint.test.d.ts.map +1 -0
  168. package/lib/esm/tests/api_tests/security/booking-info-idor-token-mint.test.js +331 -0
  169. package/lib/esm/tests/api_tests/security/booking-info-idor-token-mint.test.js.map +1 -0
  170. package/lib/esm/tests/api_tests/security/cascade-role-rename-cross-tenant.test.d.ts +32 -0
  171. package/lib/esm/tests/api_tests/security/cascade-role-rename-cross-tenant.test.d.ts.map +1 -0
  172. package/lib/esm/tests/api_tests/security/cascade-role-rename-cross-tenant.test.js +233 -0
  173. package/lib/esm/tests/api_tests/security/cascade-role-rename-cross-tenant.test.js.map +1 -0
  174. package/lib/esm/tests/api_tests/security/data-sync-redaction-bypass.test.d.ts +28 -0
  175. package/lib/esm/tests/api_tests/security/data-sync-redaction-bypass.test.d.ts.map +1 -0
  176. package/lib/esm/tests/api_tests/security/data-sync-redaction-bypass.test.js +345 -0
  177. package/lib/esm/tests/api_tests/security/data-sync-redaction-bypass.test.js.map +1 -0
  178. package/lib/esm/tests/api_tests/security/develop-health-benefit-verification-rbac.test.d.ts +30 -0
  179. package/lib/esm/tests/api_tests/security/develop-health-benefit-verification-rbac.test.d.ts.map +1 -0
  180. package/lib/esm/tests/api_tests/security/develop-health-benefit-verification-rbac.test.js +310 -0
  181. package/lib/esm/tests/api_tests/security/develop-health-benefit-verification-rbac.test.js.map +1 -0
  182. package/lib/esm/tests/api_tests/security/enduser-cross-create.test.d.ts +21 -0
  183. package/lib/esm/tests/api_tests/security/enduser-cross-create.test.d.ts.map +1 -0
  184. package/lib/esm/tests/api_tests/security/enduser-cross-create.test.js +358 -0
  185. package/lib/esm/tests/api_tests/security/enduser-cross-create.test.js.map +1 -0
  186. package/lib/esm/tests/api_tests/security/enduser-write-restrictions.test.d.ts +21 -0
  187. package/lib/esm/tests/api_tests/security/enduser-write-restrictions.test.d.ts.map +1 -0
  188. package/lib/esm/tests/api_tests/security/enduser-write-restrictions.test.js +362 -0
  189. package/lib/esm/tests/api_tests/security/enduser-write-restrictions.test.js.map +1 -0
  190. package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.d.ts +5 -0
  191. package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.d.ts.map +1 -0
  192. package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.js +349 -0
  193. package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.js.map +1 -0
  194. package/lib/esm/tests/api_tests/security/form-logic-js-execution.test.d.ts +32 -0
  195. package/lib/esm/tests/api_tests/security/form-logic-js-execution.test.d.ts.map +1 -0
  196. package/lib/esm/tests/api_tests/security/form-logic-js-execution.test.js +243 -0
  197. package/lib/esm/tests/api_tests/security/form-logic-js-execution.test.js.map +1 -0
  198. package/lib/esm/tests/api_tests/security/globalunique-conflict-redaction.test.d.ts +19 -0
  199. package/lib/esm/tests/api_tests/security/globalunique-conflict-redaction.test.d.ts.map +1 -0
  200. package/lib/esm/tests/api_tests/security/globalunique-conflict-redaction.test.js +134 -0
  201. package/lib/esm/tests/api_tests/security/globalunique-conflict-redaction.test.js.map +1 -0
  202. package/lib/esm/tests/api_tests/security/handle-incoming-communication-cross-tenant.test.d.ts +24 -0
  203. package/lib/esm/tests/api_tests/security/handle-incoming-communication-cross-tenant.test.d.ts.map +1 -0
  204. package/lib/esm/tests/api_tests/security/handle-incoming-communication-cross-tenant.test.js +194 -0
  205. package/lib/esm/tests/api_tests/security/handle-incoming-communication-cross-tenant.test.js.map +1 -0
  206. package/lib/esm/tests/api_tests/security/invite-user-enumeration.test.d.ts +29 -0
  207. package/lib/esm/tests/api_tests/security/invite-user-enumeration.test.d.ts.map +1 -0
  208. package/lib/esm/tests/api_tests/security/invite-user-enumeration.test.js +271 -0
  209. package/lib/esm/tests/api_tests/security/invite-user-enumeration.test.js.map +1 -0
  210. package/lib/esm/tests/api_tests/security/load-inbox-redaction.test.d.ts +17 -0
  211. package/lib/esm/tests/api_tests/security/load-inbox-redaction.test.d.ts.map +1 -0
  212. package/lib/esm/tests/api_tests/security/load-inbox-redaction.test.js +151 -0
  213. package/lib/esm/tests/api_tests/security/load-inbox-redaction.test.js.map +1 -0
  214. package/lib/esm/tests/api_tests/security/prototype-pollution.test.d.ts +2 -0
  215. package/lib/esm/tests/api_tests/security/prototype-pollution.test.d.ts.map +1 -0
  216. package/lib/esm/tests/api_tests/security/prototype-pollution.test.js +84 -0
  217. package/lib/esm/tests/api_tests/security/prototype-pollution.test.js.map +1 -0
  218. package/lib/esm/tests/api_tests/security/proxy-image-unauth-ssrf.test.d.ts +34 -0
  219. package/lib/esm/tests/api_tests/security/proxy-image-unauth-ssrf.test.d.ts.map +1 -0
  220. package/lib/esm/tests/api_tests/security/proxy-image-unauth-ssrf.test.js +223 -0
  221. package/lib/esm/tests/api_tests/security/proxy-image-unauth-ssrf.test.js.map +1 -0
  222. package/lib/esm/tests/api_tests/security/sanitize-user-html-with-iframes.test.d.ts +2 -0
  223. package/lib/esm/tests/api_tests/security/sanitize-user-html-with-iframes.test.d.ts.map +1 -0
  224. package/lib/esm/tests/api_tests/security/sanitize-user-html-with-iframes.test.js +238 -0
  225. package/lib/esm/tests/api_tests/security/sanitize-user-html-with-iframes.test.js.map +1 -0
  226. package/lib/esm/tests/api_tests/security/sanitize-user-html.test.d.ts +2 -0
  227. package/lib/esm/tests/api_tests/security/sanitize-user-html.test.d.ts.map +1 -0
  228. package/lib/esm/tests/api_tests/security/sanitize-user-html.test.js +144 -0
  229. package/lib/esm/tests/api_tests/security/sanitize-user-html.test.js.map +1 -0
  230. package/lib/esm/tests/api_tests/security/schema-adminonly-enforcement.test.d.ts +45 -0
  231. package/lib/esm/tests/api_tests/security/schema-adminonly-enforcement.test.d.ts.map +1 -0
  232. package/lib/esm/tests/api_tests/security/schema-adminonly-enforcement.test.js +381 -0
  233. package/lib/esm/tests/api_tests/security/schema-adminonly-enforcement.test.js.map +1 -0
  234. package/lib/esm/tests/api_tests/security/self-admin-role-assignment.test.d.ts +38 -0
  235. package/lib/esm/tests/api_tests/security/self-admin-role-assignment.test.d.ts.map +1 -0
  236. package/lib/esm/tests/api_tests/security/self-admin-role-assignment.test.js +218 -0
  237. package/lib/esm/tests/api_tests/security/self-admin-role-assignment.test.js.map +1 -0
  238. package/lib/esm/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.d.ts +6 -0
  239. package/lib/esm/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.d.ts.map +1 -0
  240. package/lib/esm/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.js +350 -0
  241. package/lib/esm/tests/api_tests/security/startlinktoken-enduser-staff-escalation.test.js.map +1 -0
  242. package/lib/esm/tests/api_tests/security/webhook-outbound-ssrf.test.d.ts +28 -0
  243. package/lib/esm/tests/api_tests/security/webhook-outbound-ssrf.test.d.ts.map +1 -0
  244. package/lib/esm/tests/api_tests/security/webhook-outbound-ssrf.test.js +435 -0
  245. package/lib/esm/tests/api_tests/security/webhook-outbound-ssrf.test.js.map +1 -0
  246. package/lib/esm/tests/api_tests/security/webhook-timeout.test.d.ts +19 -0
  247. package/lib/esm/tests/api_tests/security/webhook-timeout.test.d.ts.map +1 -0
  248. package/lib/esm/tests/api_tests/security/webhook-timeout.test.js +149 -0
  249. package/lib/esm/tests/api_tests/security/webhook-timeout.test.js.map +1 -0
  250. package/lib/esm/tests/api_tests/webhook_error_handling.test.js +2 -2
  251. package/lib/esm/tests/api_tests/webhook_error_handling.test.js.map +1 -1
  252. package/lib/esm/tests/tests.d.ts.map +1 -1
  253. package/lib/esm/tests/tests.js +38 -24
  254. package/lib/esm/tests/tests.js.map +1 -1
  255. package/lib/esm/tests/unit_tests/openapi_spec_freshness.test.d.ts +1 -1
  256. package/lib/esm/tests/unit_tests/openapi_spec_freshness.test.js +1 -1
  257. package/lib/tsconfig.tsbuildinfo +1 -1
  258. package/package.json +10 -10
  259. package/src/tests/api_tests/auto_merge_form_submission.test.ts +1 -1
  260. package/src/tests/api_tests/enduser_observations_auto_review.test.ts +358 -0
  261. package/src/tests/api_tests/integrations_redacted.test.ts +1 -1
  262. package/src/tests/api_tests/organization_signup.test.ts +2 -2
  263. package/src/tests/api_tests/purchase_made_trigger.test.ts +29 -41
  264. package/src/tests/api_tests/security/{F-0196-add-to-journey-foreign-enduserid.test.ts → add-to-journey-foreign-enduserid.test.ts} +6 -7
  265. package/src/tests/api_tests/security/{F-0005-ai-conversations-rbac.test.ts → ai-conversations-rbac.test.ts} +14 -14
  266. package/src/tests/api_tests/security/{F-0166-allowed-paths-wildcard-bypass.test.ts → allowed-paths-confinement.test.ts} +11 -11
  267. package/src/tests/api_tests/security/{F-0192-automated-actions-process-gate.test.ts → automated-actions-process-gate.test.ts} +6 -7
  268. package/src/tests/api_tests/security/{F-0179-booking-info-idor-token-mint.test.ts → booking-info-idor-token-mint.test.ts} +5 -6
  269. package/src/tests/api_tests/security/{F-0053-cascade-role-rename-cross-tenant.test.ts → cascade-role-rename-cross-tenant.test.ts} +10 -10
  270. package/src/tests/api_tests/security/{F-0001-data-sync-redaction-bypass.test.ts → data-sync-redaction-bypass.test.ts} +9 -9
  271. package/src/tests/api_tests/security/{F-0006-develop-health-benefit-verification-rbac.test.ts → develop-health-benefit-verification-rbac.test.ts} +7 -8
  272. package/src/tests/api_tests/security/{F-0116-F-0119-enduser-cross-create.test.ts → enduser-cross-create.test.ts} +25 -25
  273. package/src/tests/api_tests/security/{F-0106-F-0110-enduser-write-restrictions.test.ts → enduser-write-restrictions.test.ts} +12 -14
  274. package/src/tests/api_tests/security/file-link-session-confinement.test.ts +291 -0
  275. package/src/tests/api_tests/security/form-logic-js-execution.test.ts +183 -0
  276. package/src/tests/api_tests/security/{F-0145-globalunique-leak.test.ts → globalunique-conflict-redaction.test.ts} +5 -6
  277. package/src/tests/api_tests/security/{F-0008-handle-incoming-communication-cross-tenant.test.ts → handle-incoming-communication-cross-tenant.test.ts} +8 -8
  278. package/src/tests/api_tests/security/{F-0007-invite-user-enumeration.test.ts → invite-user-enumeration.test.ts} +8 -8
  279. package/src/tests/api_tests/security/{F-0151-load-inbox-redaction.test.ts → load-inbox-redaction.test.ts} +5 -6
  280. package/src/tests/api_tests/security/{F-0016-prototype-pollution.test.ts → prototype-pollution.test.ts} +4 -4
  281. package/src/tests/api_tests/security/{F-0025-proxy-image-unauth-ssrf.test.ts → proxy-image-unauth-ssrf.test.ts} +11 -12
  282. package/src/tests/api_tests/security/{F-0013-sanitize-user-html-with-iframes.test.ts → sanitize-user-html-with-iframes.test.ts} +5 -5
  283. package/src/tests/api_tests/security/{F-0013-sanitize-user-html.test.ts → sanitize-user-html.test.ts} +4 -4
  284. package/src/tests/api_tests/security/{F-0191-schema-adminonly-enforcement.test.ts → schema-adminonly-enforcement.test.ts} +6 -7
  285. package/src/tests/api_tests/security/{F-0076-self-admin-role-assignment.test.ts → self-admin-role-assignment.test.ts} +13 -13
  286. package/src/tests/api_tests/security/{F-0185-startlinktoken-enduser-staff-escalation.test.ts → startlinktoken-enduser-staff-escalation.test.ts} +6 -6
  287. package/src/tests/api_tests/security/{F-0015-webhook-outbound-ssrf.test.ts → webhook-outbound-ssrf.test.ts} +13 -14
  288. package/src/tests/api_tests/security/{F-0155-webhook-timeout.test.ts → webhook-timeout.test.ts} +6 -7
  289. package/src/tests/api_tests/webhook_error_handling.test.ts +1 -1
  290. package/src/tests/tests.ts +43 -24
  291. package/src/tests/unit_tests/openapi_spec_freshness.test.ts +1 -1
  292. package/test_generated.pdf +0 -0
  293. package/src/tests/api_tests/security/readonly-enduser-preview.test.ts +0 -301
@@ -0,0 +1,357 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ 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;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.file_link_session_confinement_tests = exports.file_link_session_confinement_checks = void 0;
43
+ require('source-map-support').install();
44
+ var axios_1 = __importDefault(require("axios"));
45
+ var setup_isolated_1 = require("../../setup_isolated");
46
+ var host = process.env.API_URL || 'http://localhost:8080';
47
+ var RAND = function () { return Math.random().toString(36).slice(2, 10); };
48
+ var probe = function (method, path, o) {
49
+ if (o === void 0) { o = {}; }
50
+ return __awaiter(void 0, void 0, void 0, function () {
51
+ var r;
52
+ return __generator(this, function (_a) {
53
+ switch (_a.label) {
54
+ case 0: return [4 /*yield*/, axios_1.default.request({
55
+ method: method,
56
+ url: "".concat(host, "/v1").concat(path),
57
+ params: o.params,
58
+ data: o.data,
59
+ headers: o.token ? { Authorization: "Bearer ".concat(o.token) } : undefined,
60
+ validateStatus: function () { return true; },
61
+ })];
62
+ case 1:
63
+ r = _a.sent();
64
+ return [2 /*return*/, { status: r.status, body: r.data }];
65
+ }
66
+ });
67
+ });
68
+ };
69
+ var file_link_session_confinement_checks = function () { return __awaiter(void 0, void 0, void 0, function () {
70
+ var checks, record, tenant, sdk_1, enduser_1, newFile, fileA_1, fileB_1, mint, adminFiles, confinement_probes, plain, shared, methods, send, verify, _a, header, payload, decoded, forged, forgedSend, send, e_1;
71
+ return __generator(this, function (_b) {
72
+ switch (_b.label) {
73
+ case 0:
74
+ checks = [];
75
+ record = function (label, pass, detail) { return checks.push({ label: label, pass: pass, detail: detail }); };
76
+ _b.label = 1;
77
+ case 1:
78
+ _b.trys.push([1, , 22, 27]);
79
+ return [4 /*yield*/, (0, setup_isolated_1.setup_isolated_tenant)({
80
+ name: "FileLink ".concat(RAND()), users: [{ isAdmin: true }], apiKeys: 0,
81
+ })];
82
+ case 2:
83
+ tenant = _b.sent();
84
+ sdk_1 = tenant.sdk;
85
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({
86
+ fname: 'FileLink', lname: 'Recipient',
87
+ email: "dontsend-filelink-".concat(RAND(), "@tellescope.com"),
88
+ phone: '+15555550100',
89
+ dateOfBirth: '01-01-1990',
90
+ })
91
+ // No S3 upload needed: prepare_file_upload inserts the files record with its secureName
92
+ // immediately, and file_download_URL only SIGNS a GET url — it never checks the object exists.
93
+ ];
94
+ case 3:
95
+ enduser_1 = _b.sent();
96
+ newFile = function (name) { return __awaiter(void 0, void 0, void 0, function () {
97
+ return __generator(this, function (_a) {
98
+ switch (_a.label) {
99
+ case 0: return [4 /*yield*/, sdk_1.api.files.prepare_file_upload({
100
+ name: name,
101
+ type: 'application/pdf', size: 1000, enduserId: enduser_1.id,
102
+ })];
103
+ case 1: return [2 /*return*/, ((_a.sent()).file)];
104
+ }
105
+ });
106
+ }); };
107
+ return [4 /*yield*/, newFile("shared-".concat(RAND(), ".pdf"))]; // the one that gets shared
108
+ case 4:
109
+ fileA_1 = _b.sent() // the one that gets shared
110
+ ;
111
+ return [4 /*yield*/, newFile("private-".concat(RAND(), ".pdf"))
112
+ /**
113
+ * Mints a token exactly the way a real send does — get_templated_message is the endpoint the
114
+ * worker calls (worker/app.js handleOutgoingEmail).
115
+ *
116
+ * replaceLinks always rewrites the resolved link into a tracking redirect, so `plaintext` holds
117
+ * `doc (${API_URL}/r/<redirectToken>)` rather than the portal URL. Follow the 302 to recover it.
118
+ */
119
+ ]; // the rest of the patient's chart
120
+ case 5:
121
+ fileB_1 = _b.sent() // the rest of the patient's chart
122
+ ;
123
+ mint = function (verb) { return __awaiter(void 0, void 0, void 0, function () {
124
+ var plaintext, redirectURL, r, location, token;
125
+ var _a, _b;
126
+ return __generator(this, function (_c) {
127
+ switch (_c.label) {
128
+ case 0: return [4 /*yield*/, sdk_1.api.templates.get_templated_message({
129
+ channel: 'Email',
130
+ userId: tenant.users[0].id,
131
+ enduserId: enduser_1.id,
132
+ message: "{{files.".concat(fileA_1.id, ".").concat(verb, ":doc}}"),
133
+ })];
134
+ case 1:
135
+ plaintext = (_c.sent()).plaintext;
136
+ redirectURL = (_a = plaintext.match(/\((https?:\/\/[^)\s]+)\)/)) === null || _a === void 0 ? void 0 : _a[1];
137
+ if (!redirectURL)
138
+ return [2 /*return*/, { token: undefined, detail: "no link resolved from: ".concat(plaintext) }];
139
+ return [4 /*yield*/, axios_1.default.get(redirectURL, { maxRedirects: 0, validateStatus: function () { return true; } })];
140
+ case 2:
141
+ r = _c.sent();
142
+ location = r.headers['location'];
143
+ if (!location)
144
+ return [2 /*return*/, { token: undefined, detail: "redirect did not 302 (".concat(r.status, ")") }];
145
+ token = (_b = new URL(location).searchParams.get('token')) !== null && _b !== void 0 ? _b : undefined;
146
+ return [2 /*return*/, { token: token, detail: token ? 'minted' : "no token in ".concat(location) }];
147
+ }
148
+ });
149
+ }); };
150
+ return [4 /*yield*/, probe('get', '/files', { token: tenant.users[0].authToken })];
151
+ case 6:
152
+ adminFiles = _b.sent();
153
+ record('control: admin session lists files', adminFiles.status === 200, "status ".concat(adminFiles.status));
154
+ confinement_probes = function (variant, token) { return __awaiter(void 0, void 0, void 0, function () {
155
+ var p, _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, refreshed, leaked, refreshedToken, _s, _t, _u, _v;
156
+ var _w;
157
+ return __generator(this, function (_x) {
158
+ switch (_x.label) {
159
+ case 0:
160
+ p = function (label, expected, r) { return record("".concat(variant, " \u2014 ").concat(label), r.status === expected, "status ".concat(r.status, " (expected ").concat(expected, ")")); };
161
+ _a = p;
162
+ _b = ['1: downloads the shared file', 200];
163
+ return [4 /*yield*/, probe('get', '/file-download-URL', { token: token, params: { secureName: fileA_1.secureName } })];
164
+ case 1:
165
+ _a.apply(void 0, _b.concat([_x.sent()]));
166
+ _c = p;
167
+ _d = ['2: cannot download another file on the same patient', 403];
168
+ return [4 /*yield*/, probe('get', '/file-download-URL', { token: token, params: { secureName: fileB_1.secureName } })];
169
+ case 2:
170
+ _c.apply(void 0, _d.concat([_x.sent()]));
171
+ // validateInput merges query, then body, then params — body wins over query, so a pin checked
172
+ // against req.query rather than req.validated would be sidesteppable exactly like this.
173
+ _e = p;
174
+ _f = ['3: cannot smuggle another secureName through the body', 403];
175
+ return [4 /*yield*/, probe('get', '/file-download-URL', {
176
+ token: token,
177
+ params: { secureName: fileA_1.secureName }, data: { secureName: fileB_1.secureName },
178
+ })];
179
+ case 3:
180
+ // validateInput merges query, then body, then params — body wins over query, so a pin checked
181
+ // against req.query rather than req.validated would be sidesteppable exactly like this.
182
+ _e.apply(void 0, _f.concat([_x.sent()]));
183
+ // a listing would turn the pin into a directory of the patient's chart
184
+ _g = p;
185
+ _h = ['4: cannot list files', 403];
186
+ return [4 /*yield*/, probe('get', '/files', { token: token })];
187
+ case 4:
188
+ // a listing would turn the pin into a directory of the patient's chart
189
+ _g.apply(void 0, _h.concat([_x.sent()]));
190
+ _j = p;
191
+ _k = ['5a: cannot read chats', 403];
192
+ return [4 /*yield*/, probe('get', '/chats', { token: token })];
193
+ case 5:
194
+ _j.apply(void 0, _k.concat([_x.sent()]));
195
+ _l = p;
196
+ _m = ['5b: cannot read form responses', 403];
197
+ return [4 /*yield*/, probe('get', '/form-responses', { token: token })];
198
+ case 6:
199
+ _l.apply(void 0, _m.concat([_x.sent()]));
200
+ _o = p;
201
+ _p = ['5c: cannot read observations', 403];
202
+ return [4 /*yield*/, probe('get', '/enduser-observations', { token: token })];
203
+ case 7:
204
+ _o.apply(void 0, _p.concat([_x.sent()]));
205
+ _q = p;
206
+ _r = ['6: cannot update the patient', 403];
207
+ return [4 /*yield*/, probe('patch', "/enduser/".concat(enduser_1.id), { token: token, data: { updates: { fname: 'Overwritten' } } })];
208
+ case 8:
209
+ _q.apply(void 0, _r.concat([_x.sent()]));
210
+ return [4 /*yield*/, probe('post', '/refresh-enduser-session', { token: token })];
211
+ case 9:
212
+ refreshed = _x.sent();
213
+ p('7: can refresh its own session', 200, refreshed);
214
+ leaked = ['dateOfBirth', 'email', 'phone', 'fields', 'insurance', 'lname']
215
+ .filter(function (f) { var _a, _b; return ((_b = (_a = refreshed.body) === null || _a === void 0 ? void 0 : _a.enduser) !== null && _b !== void 0 ? _b : {})[f] !== undefined; });
216
+ record("".concat(variant, " \u2014 7b: refresh response withholds patient fields"), refreshed.status === 200 && leaked.length === 0, leaked.length ? "leaked: ".concat(leaked.join(', ')) : 'no patient fields in payload');
217
+ refreshedToken = (_w = refreshed.body) === null || _w === void 0 ? void 0 : _w.authToken;
218
+ if (!(typeof refreshedToken === 'string' && refreshedToken)) return [3 /*break*/, 12];
219
+ _s = p;
220
+ _t = ['8a: refreshed token still cannot download another file', 403];
221
+ return [4 /*yield*/, probe('get', '/file-download-URL', {
222
+ token: refreshedToken, params: { secureName: fileB_1.secureName },
223
+ })];
224
+ case 10:
225
+ _s.apply(void 0, _t.concat([_x.sent()]));
226
+ _u = p;
227
+ _v = ['8b: refreshed token still cannot update the patient', 403];
228
+ return [4 /*yield*/, probe('patch', "/enduser/".concat(enduser_1.id), {
229
+ token: refreshedToken, data: { updates: { fname: 'Overwritten' } },
230
+ })];
231
+ case 11:
232
+ _u.apply(void 0, _v.concat([_x.sent()]));
233
+ return [3 /*break*/, 13];
234
+ case 12:
235
+ record("".concat(variant, " \u2014 8: refreshed token available"), false, 'refresh returned no authToken');
236
+ _x.label = 13;
237
+ case 13: return [2 /*return*/];
238
+ }
239
+ });
240
+ }); };
241
+ return [4 /*yield*/, mint('link')];
242
+ case 7:
243
+ plain = _b.sent();
244
+ if (!plain.token) return [3 /*break*/, 9];
245
+ return [4 /*yield*/, confinement_probes('link', plain.token)];
246
+ case 8:
247
+ _b.sent();
248
+ return [3 /*break*/, 10];
249
+ case 9:
250
+ record('link — minted', false, plain.detail);
251
+ _b.label = 10;
252
+ case 10: return [4 /*yield*/, mint('shared-link')];
253
+ case 11:
254
+ shared = _b.sent();
255
+ if (!shared.token) return [3 /*break*/, 13];
256
+ return [4 /*yield*/, confinement_probes('shared-link', shared.token)];
257
+ case 12:
258
+ _b.sent();
259
+ return [3 /*break*/, 14];
260
+ case 13:
261
+ // Before the shared-link verb exists the merge field does not resolve. Record it and skip the
262
+ // shared probes rather than throwing, so the first run reports the whole picture at once.
263
+ record('shared-link — minted', false, shared.detail);
264
+ _b.label = 14;
265
+ case 14:
266
+ if (!shared.token) return [3 /*break*/, 19];
267
+ return [4 /*yield*/, probe('get', '/endusers/otp-methods', { params: { token: shared.token } })];
268
+ case 15:
269
+ methods = _b.sent();
270
+ record('shared-link — 9: OTP methods are not offered', methods.status === 403, "status ".concat(methods.status, " (expected 403)"));
271
+ return [4 /*yield*/, probe('post', '/endusers/send-otp-code', {
272
+ data: { token: shared.token, method: 'email' },
273
+ })];
274
+ case 16:
275
+ send = _b.sent();
276
+ record('shared-link — 10: cannot make us send the patient a login code', send.status === 403, "status ".concat(send.status, " (expected 403)"));
277
+ return [4 /*yield*/, probe('post', '/endusers/verify-otp-code', {
278
+ data: { token: shared.token, code: '000000' },
279
+ })];
280
+ case 17:
281
+ verify = _b.sent();
282
+ record('shared-link — 11: OTP verification refuses the scope before checking the code', verify.status === 403, "status ".concat(verify.status, " (expected 403, 400 = reached the code check)"));
283
+ _a = shared.token.split('.'), header = _a[0], payload = _a[1];
284
+ decoded = JSON.parse(Buffer.from(payload, 'base64url').toString());
285
+ delete decoded.sessionScopes;
286
+ delete decoded.scopeContext;
287
+ forged = [
288
+ header,
289
+ Buffer.from(JSON.stringify(decoded)).toString('base64url'),
290
+ 'not-a-real-signature',
291
+ ].join('.');
292
+ return [4 /*yield*/, probe('post', '/endusers/send-otp-code', {
293
+ data: { token: forged, method: 'email' },
294
+ })];
295
+ case 18:
296
+ forgedSend = _b.sent();
297
+ record('shared-link — 12: a forged token cannot strip the scope to unlock OTP', forgedSend.status === 403 || forgedSend.status === 401 || forgedSend.status === 404, "status ".concat(forgedSend.status, " (expected 401/403/404; 204 = signature never verified)"));
298
+ _b.label = 19;
299
+ case 19:
300
+ if (!plain.token) return [3 /*break*/, 21];
301
+ return [4 /*yield*/, probe('post', '/endusers/send-otp-code', {
302
+ data: { token: plain.token, method: 'email' },
303
+ })];
304
+ case 20:
305
+ send = _b.sent();
306
+ record('link — 13: patient OTP recovery still works', send.status === 204, "status ".concat(send.status, " (expected 204)"));
307
+ _b.label = 21;
308
+ case 21: return [3 /*break*/, 27];
309
+ case 22:
310
+ if (!tenant) return [3 /*break*/, 26];
311
+ _b.label = 23;
312
+ case 23:
313
+ _b.trys.push([23, 25, , 26]);
314
+ return [4 /*yield*/, tenant.teardown()];
315
+ case 24:
316
+ _b.sent();
317
+ return [3 /*break*/, 26];
318
+ case 25:
319
+ e_1 = _b.sent();
320
+ console.error('teardown failed', e_1);
321
+ return [3 /*break*/, 26];
322
+ case 26: return [7 /*endfinally*/];
323
+ case 27: return [2 /*return*/, checks];
324
+ }
325
+ });
326
+ }); };
327
+ exports.file_link_session_confinement_checks = file_link_session_confinement_checks;
328
+ /** Asserting wrapper, for standalone runs and for sequential use in the suite. */
329
+ var file_link_session_confinement_tests = function () { return __awaiter(void 0, void 0, void 0, function () {
330
+ var _a, _b;
331
+ return __generator(this, function (_c) {
332
+ switch (_c.label) {
333
+ case 0:
334
+ _a = setup_isolated_1.assert_checks;
335
+ _b = ['Shared file link session confinement'];
336
+ return [4 /*yield*/, (0, exports.file_link_session_confinement_checks)()];
337
+ case 1:
338
+ _a.apply(void 0, _b.concat([_c.sent()]));
339
+ return [2 /*return*/];
340
+ }
341
+ });
342
+ }); };
343
+ exports.file_link_session_confinement_tests = file_link_session_confinement_tests;
344
+ // Allow running this test file independently
345
+ if (require.main === module) {
346
+ console.log("\uD83C\uDF10 Using API URL: ".concat(host));
347
+ (0, exports.file_link_session_confinement_tests)()
348
+ .then(function () {
349
+ console.log("✅ file link session confinement test suite completed successfully");
350
+ process.exit(0);
351
+ })
352
+ .catch(function (error) {
353
+ console.error("❌ file link session confinement test suite failed:", error);
354
+ process.exit(1);
355
+ });
356
+ }
357
+ //# sourceMappingURL=file-link-session-confinement.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-link-session-confinement.test.js","sourceRoot":"","sources":["../../../../../src/tests/api_tests/security/file-link-session-confinement.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { Check } from "../../setup_isolated";
2
+ /**
3
+ * Regression test: `$JS(...)` must be rejected in stored conditional logic.
4
+ *
5
+ * `responses_satisfy_conditions` (utilities/src/utils.ts) compiled a stored condition value of the
6
+ * form `$JS(...)` with `new Function()` and executed it — in every form-filler's browser, including
7
+ * anonymous visitors on public intake pages, AND inside the API process (automation_triggers.ts
8
+ * trigger matching on every form submission, ai_agent/form_filling.ts voice-agent navigation). The
9
+ * API process holds every tenant's database handle, so a condition authored by staff in one tenant
10
+ * reached all of them. Any staff user or API key with form_fields write access could plant one by
11
+ * typing into the free-text $gt/$lt box — no API call required.
12
+ *
13
+ * The sink is removed. This asserts the second half of the fix: `compoundFilterValidator` rejects the
14
+ * syntax at write time on every field that feeds that evaluator, so it cannot be reintroduced through
15
+ * stored configuration. The runtime half — that a `$JS` value is never evaluated — is covered by the
16
+ * pure-function cases in `form_conditional_logic_tests` in tests.ts.
17
+ *
18
+ * The five condition locations were established by enumerating every `responses_satisfy_conditions`
19
+ * call site, and all five are covered here. That completeness matters: the first run of this test
20
+ * caught a half fix. `event.conditions` is wrapped in an `orValidator`, which returns the first arm
21
+ * that does not throw, and its permissive `optional: optionalAnyObjectValidator` arm was declared
22
+ * before the guarded one — so the payload was accepted and stored even though the validator had been
23
+ * swapped. Pointing a field at the guard is not the same as the guard being reachable, which is why
24
+ * every location gets an assertion rather than an argument.
25
+ *
26
+ * Each rejection is paired with a positive control using the same shape without `$JS(`, so a passing
27
+ * test cannot be explained by the write failing for an unrelated reason.
28
+ */
29
+ export declare const form_logic_js_execution_checks: () => Promise<Check[]>;
30
+ /** Asserting wrapper, for standalone runs and for sequential use in the suite. */
31
+ export declare const form_logic_js_execution_tests: () => Promise<void>;
32
+ //# sourceMappingURL=form-logic-js-execution.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-logic-js-execution.test.d.ts","sourceRoot":"","sources":["../../../../../src/tests/api_tests/security/form-logic-js-execution.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,EAEN,MAAM,sBAAsB,CAAA;AAM7B;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,8BAA8B,QAAa,QAAQ,KAAK,EAAE,CA4HtE,CAAA;AAED,kFAAkF;AAClF,eAAO,MAAM,6BAA6B,qBAEzC,CAAA"}