diff --git a/distributor/_studio_dependecies/ConversationFlowExport/IVA-Solution-Consultants_Distributor_Full_05292025_7fe819e2-91cb-47a9-a4a8-da6bbf5d14c1.json b/distributor/_studio_dependecies/ConversationFlowExport/IVA-Solution-Consultants_Distributor_Full_05292025_7fe819e2-91cb-47a9-a4a8-da6bbf5d14c1.json new file mode 100644 index 0000000..0c2ff06 --- /dev/null +++ b/distributor/_studio_dependecies/ConversationFlowExport/IVA-Solution-Consultants_Distributor_Full_05292025_7fe819e2-91cb-47a9-a4a8-da6bbf5d14c1.json @@ -0,0 +1 @@ +{"file":{"content":{"intents":[{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODdm","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"modelId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0MzU0YWZiZGY5MzBmNGIzODZh","label":"VXML Welcome Event @ 6647ad7b84df93835bbb4346","keyPhrases":[],"enabled":true,"relevant":true,"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227700,"_vc":{"branch":"current","operation":"create","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODdl","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDE4YzllYjA3MzRjODkxNjIy","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDFkMDM3ZjMzNGIyZTZiMWI3"},"updatedAt":1748531457197,"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl"}},{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODgz","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"modelId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0MzU0YWZiZGY5MzBmNGIzODZh","label":"VXML Max Speech Timeout @ 6647ad7b84df93835bbb4346","keyPhrases":[],"enabled":true,"relevant":true,"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227749,"_vc":{"branch":"current","operation":"create","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODgy","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDE4YzllYjA3MzRjODkxNjI0","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDFkMDM3ZjMzNGIyZTZiMWI3"},"updatedAt":1748531457197,"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl"}},{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg5","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"modelId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0MzU0YWZiZGY5MzBmNGIzODZh","label":"VXML Transfer Call Event @ 6647ad7b84df93835bbb4346","keyPhrases":[],"enabled":true,"relevant":true,"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227865,"_vc":{"branch":"current","operation":"create","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg4","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDE4YzllYjA3MzRjODkxNjI3","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDFkMDM3ZjMzNGIyZTZiMWI3"},"updatedAt":1748531457197,"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl"}},{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODgx","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"modelId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0MzU0YWZiZGY5MzBmNGIzODZh","label":"VXML Queue Status Event @ 6647ad7b84df93835bbb4346","keyPhrases":[],"enabled":true,"relevant":true,"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227728,"_vc":{"branch":"current","operation":"create","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODgw","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDE4YzllYjA3MzRjODkxNjIz","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDFkMDM3ZjMzNGIyZTZiMWI3"},"updatedAt":1748531457197,"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl"}},{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg1","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"modelId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0MzU0YWZiZGY5MzBmNGIzODZh","label":"VXML Noinput Event @ 6647ad7b84df93835bbb4346","keyPhrases":[],"enabled":true,"relevant":true,"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227773,"_vc":{"branch":"current","operation":"create","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg0","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDE4YzllYjA3MzRjODkxNjI1","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDFkMDM3ZjMzNGIyZTZiMWI3"},"updatedAt":1748531457197,"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl"}},{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg3","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"modelId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0MzU0YWZiZGY5MzBmNGIzODZh","label":"VXML Unrecognized Event @ 6647ad7b84df93835bbb4346","keyPhrases":[],"enabled":true,"relevant":true,"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227801,"_vc":{"branch":"current","operation":"create","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg2","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDE4YzllYjA3MzRjODkxNjI2","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDFkMDM3ZjMzNGIyZTZiMWI3"},"updatedAt":1748531457197,"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl"}}],"alternates":[{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDQ0YWZiZGY5MzBmNGIzODk1","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"modelId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0MzU0YWZiZGY5MzBmNGIzODZh","intentId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODgy","value":"vxmlmaxspeechtimeout","entities":[],"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788228035,"_vc":{"branch":"current","operation":"create","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDQ0YWZiZGY5MzBmNGIzODk0","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDE4YzllYjA3MzRjODkxNjMx","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDFkMDM3ZjMzNGIyZTZiMWI3"},"updatedAt":1748531457211,"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl"},"dependsOn":[{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODgy","_vc_latest":{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODgz","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"modelId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0MzU0YWZiZGY5MzBmNGIzODZh","label":"VXML Max Speech Timeout @ 6647ad7b84df93835bbb4346","keyPhrases":[],"enabled":true,"relevant":true,"publication":{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjZmNzE5MjYxOWYzZjIxOTI3MzcyZTY2","original_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjY0N2E4YzQ4NGRmOTM4MzViYmI0MzM3"},"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227749,"_vc":{"branch":"current","operation":"create","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODgy","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDE4YzllYjA3MzRjODkxNjI0","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDFkMDM3ZjMzNGIyZTZiMWI3"},"updatedAt":1748531457197,"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl"}}}]},{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODhm","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"modelId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0MzU0YWZiZGY5MzBmNGIzODZh","intentId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg2","value":"vxmlunrecognized","entities":[],"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227948,"_vc":{"branch":"current","operation":"create","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODhl","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDE4YzllYjA3MzRjODkxNjJl","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDFkMDM3ZjMzNGIyZTZiMWI3"},"updatedAt":1748531457211,"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl"},"dependsOn":[{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg2","_vc_latest":{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg3","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"modelId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0MzU0YWZiZGY5MzBmNGIzODZh","label":"VXML Unrecognized Event @ 6647ad7b84df93835bbb4346","keyPhrases":[],"enabled":true,"relevant":true,"publication":{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjZmNzE5MjYxOWYzZjIxOTI3MzcyZTY2","original_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjY0N2E4YzQ4NGRmOTM4MzViYmI0MzM5"},"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227801,"_vc":{"branch":"current","operation":"create","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg2","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDE4YzllYjA3MzRjODkxNjI2","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDFkMDM3ZjMzNGIyZTZiMWI3"},"updatedAt":1748531457197,"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl"}}}]},{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODkx","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"modelId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0MzU0YWZiZGY5MzBmNGIzODZh","intentId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg0","value":"vxmlnoinput","entities":[],"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227975,"_vc":{"branch":"current","operation":"create","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODkw","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDE4YzllYjA3MzRjODkxNjJm","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDFkMDM3ZjMzNGIyZTZiMWI3"},"updatedAt":1748531457211,"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl"},"dependsOn":[{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg0","_vc_latest":{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg1","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"modelId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0MzU0YWZiZGY5MzBmNGIzODZh","label":"VXML Noinput Event @ 6647ad7b84df93835bbb4346","keyPhrases":[],"enabled":true,"relevant":true,"publication":{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjZmNzE5MjYxOWYzZjIxOTI3MzcyZTY2","original_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjY0N2E4YzQ4NGRmOTM4MzViYmI0MzM4"},"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227773,"_vc":{"branch":"current","operation":"create","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg0","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDE4YzllYjA3MzRjODkxNjI1","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDFkMDM3ZjMzNGIyZTZiMWI3"},"updatedAt":1748531457197,"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl"}}}]},{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODhk","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"modelId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0MzU0YWZiZGY5MzBmNGIzODZh","intentId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODdl","value":"vxmlwelcome","entities":[],"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227918,"_vc":{"branch":"current","operation":"create","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODhj","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDE4YzllYjA3MzRjODkxNjJk","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDFkMDM3ZjMzNGIyZTZiMWI3"},"updatedAt":1748531457211,"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl"},"dependsOn":[{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODdl","_vc_latest":{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODdm","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"modelId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0MzU0YWZiZGY5MzBmNGIzODZh","label":"VXML Welcome Event @ 6647ad7b84df93835bbb4346","keyPhrases":[],"enabled":true,"relevant":true,"publication":{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjZmNzE5MjYxOWYzZjIxOTI3MzcyZTY2","original_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjY0N2E4YzQ4NGRmOTM4MzViYmI0MzM1"},"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227700,"_vc":{"branch":"current","operation":"create","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODdl","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDE4YzllYjA3MzRjODkxNjIy","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDFkMDM3ZjMzNGIyZTZiMWI3"},"updatedAt":1748531457197,"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl"}}}]},{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDQ0YWZiZGY5MzBmNGIzODkz","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"modelId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0MzU0YWZiZGY5MzBmNGIzODZh","intentId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg4","value":"vxmltransfercall","entities":[],"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788228004,"_vc":{"branch":"current","operation":"create","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDQ0YWZiZGY5MzBmNGIzODky","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDE4YzllYjA3MzRjODkxNjMw","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDFkMDM3ZjMzNGIyZTZiMWI3"},"updatedAt":1748531457211,"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl"},"dependsOn":[{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg4","_vc_latest":{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg5","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"modelId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0MzU0YWZiZGY5MzBmNGIzODZh","label":"VXML Transfer Call Event @ 6647ad7b84df93835bbb4346","keyPhrases":[],"enabled":true,"relevant":true,"publication":{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjZmNzE5MjYxOWYzZjIxOTI3MzcyZTY2","original_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjY0N2E4YzQ4NGRmOTM4MzViYmI0MzNh"},"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227865,"_vc":{"branch":"current","operation":"create","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg4","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDE4YzllYjA3MzRjODkxNjI3","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDFkMDM3ZjMzNGIyZTZiMWI3"},"updatedAt":1748531457197,"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl"}}}]},{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODhi","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"modelId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0MzU0YWZiZGY5MzBmNGIzODZh","intentId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODgw","value":"vxmlqueuestatus","entities":[],"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227891,"_vc":{"branch":"current","operation":"create","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODhh","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDE4YzllYjA3MzRjODkxNjJj","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDFkMDM3ZjMzNGIyZTZiMWI3"},"updatedAt":1748531457211,"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl"},"dependsOn":[{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODgw","_vc_latest":{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODgx","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"modelId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0MzU0YWZiZGY5MzBmNGIzODZh","label":"VXML Queue Status Event @ 6647ad7b84df93835bbb4346","keyPhrases":[],"enabled":true,"relevant":true,"publication":{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjZmNzE5MjYxOWYzZjIxOTI3MzcyZTY2","original_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjY0N2E4YzQ4NGRmOTM4MzViYmI0MzM2"},"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227728,"_vc":{"branch":"current","operation":"create","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODgw","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDE4YzllYjA3MzRjODkxNjIz","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDFkMDM3ZjMzNGIyZTZiMWI3"},"updatedAt":1748531457197,"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl"}}}]}],"entities":[],"entityValues":[],"conversationFlows":[{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMjliMTcyYTk5M2U2MmE1YmRhYzIy","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"modelId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0MzU0YWZiZGY5MzBmNGIzODZh","name":"VXML Events @ 6647ad7b84df93835bbb4346","description":"No description","content":{"6fcfc962-9cc5-415f-bd3f-d7a3f0470dd1":{"type":"intent","componentId":"intent","icon":"ear-listen","position":{"left":5130.9609375,"top":5168.96875},"name":"Intent","description":"Select intents as flow triggers","id":"6fcfc962-9cc5-415f-bd3f-d7a3f0470dd1","data":{"intentId":"67d194434afbdf930f4b3882","ports":[{"id":"c117a795-8f45-4591-b0b6-1007da744173"}]}},"dbc05c11-81aa-4aab-a7de-88f7b786fd35":{"type":"intent","componentId":"intent","icon":"ear-listen","position":{"left":5134.94921875,"top":5433.9453125},"name":"Intent","description":"Select intents as flow triggers","id":"dbc05c11-81aa-4aab-a7de-88f7b786fd35","data":{"intentId":"67d194434afbdf930f4b3886","ports":[{"id":"8643e899-4ccc-472b-87a8-ccac830620b4"}]}},"7bd547b2-f820-49e6-ac80-bb2d0d5f7169":{"type":"intent","componentId":"intent","icon":"ear-listen","position":{"left":5129.9375,"top":5785.9296875},"name":"Intent","description":"Select intents as flow triggers","id":"7bd547b2-f820-49e6-ac80-bb2d0d5f7169","data":{"intentId":"67d194434afbdf930f4b3884","ports":[{"id":"347d5936-ff0b-496e-a3ca-bddc4eaf6a2d"}]}},"d09bc7d0-41e8-4457-9337-52c73565771b":{"type":"intent","componentId":"intent","icon":"ear-listen","position":{"left":5127.94921875,"top":6054.9453125},"name":"Intent","description":"Select intents as flow triggers","id":"d09bc7d0-41e8-4457-9337-52c73565771b","data":{"intentId":"67d194434afbdf930f4b3880","ports":[{"id":"aa325093-4e21-4dff-8f5c-aee9f0be397e"}]}},"707c19e4-5685-4117-bcc7-14517d338f79":{"type":"intent","componentId":"intent","icon":"ear-listen","position":{"left":5139.9609375,"top":6258.94140625},"name":"Intent","description":"Select intents as flow triggers","id":"707c19e4-5685-4117-bcc7-14517d338f79","data":{"intentId":"67d194434afbdf930f4b387e","ports":[{"id":"67b883e6-f051-4a78-98bb-e067f18d89db"}]}},"fb08b400-bf23-4c72-ae8e-94d2bbba0af1":{"type":"group","componentId":"group","icon":"layer-group","position":{"left":5495.9453125,"top":5075.78125},"name":"Group","description":"Useful for grouping widgets together","id":"fb08b400-bf23-4c72-ae8e-94d2bbba0af1","data":{"steps":["c117a795-8f45-4591-b0b6-1007da744173","501902db-7b86-4904-9d8c-fe6c2f857fab"]}},"c117a795-8f45-4591-b0b6-1007da744173":{"_id":"662bf8dedae383ffb348fea3","componentId":"664caf7f-fce6-4a55-b195-fdcfe47119eb","originalComponentId":"d9db6b1e-e3d5-40f2-a618-7684a28adfc0","type":"seed","icon":"paragraph","position":{"left":0,"top":0},"name":"Multi-Channel Reply","readme":"# Multi-Channel Reply Widget\r\n\r\nThis widget allows you to craft responses with rich text features\r\nusing a user-friendly WYSIWYG editor.\r\n\r\n## Supported Channels\r\n\r\n- Plain text (fallback)\r\n- Web/HTML\r\n- Facebook\r\n- Microsoft Teams\r\n- Twitter\r\n- WhatsApp\r\n\r\n### All Channels\r\n\r\nYou can define multiple messages within a single reply. Use the **Add Content**\r\nbutton to add additional messages or other types of content (depending on the\r\nselected channel.)\r\n\r\nYou can include **inline conversation variables** in your response\r\nby including a variable name surrounded by curly brackets,\r\nsuch as `{variableName}`. Object paths and arrays are also supported, e.g. `{path.to.thing[3]}`.\r\n\r\nA randomizer feature is also included for rich text and plain text replies.\r\nYou can define multiple **alternative responses** for each message,\r\none of which will be selected at random each time the response is hit in the agent.\r\n\r\nYou may also create replies for multiple languages.\r\nUse the dropdown at the top of the form to select the language currently being edited.\r\nAll languages will share the same content cards for every channel.\r\n\r\n### Web Channel\r\n\r\nSupported features include:\r\n\r\n- **Bold**\r\n- _Italic_\r\n- Bulleted lists\r\n- Numbered lists\r\n- Hyperlinks\r\n- Images\r\n- Block quotes\r\n- Quick replies\r\n- Undo/redo\r\n- Copy/paste\r\n\r\nThe editor saves the response in HTML format. If desired,\r\nyou can view and edit the raw HTML markup by toggling the switch\r\nfrom **Rich** to **Raw**.\r\n\r\n### Facebook Channel\r\n\r\nSupported features include:\r\n\r\n- **Bold**\r\n- _Italic_\r\n- ~~Strikethrough~~\r\n- Carousel\r\n- Image replies\r\n- Quick replies\r\n- Undo/redo\r\n- Copy/paste\r\n\r\nThe editor saves the response in Facebook message format. If desired,\r\nyou can view and edit the raw markup by toggling the switch\r\nfrom **Rich** to **Raw**.\r\n\r\n### Microsoft Teams Channel\r\n\r\nSupported features include:\r\n\r\n- **Bold**\r\n- _Italic_\r\n- Bulleted lists\r\n- Numbered lists\r\n- Hyperlinks\r\n- Block quotes\r\n- Quick replies\r\n- Cards\r\n - Hero Card\r\n - Thumbnail Card\r\n- Undo/redo\r\n- Copy/paste\r\n\r\nThe editor saves the response in Markdown format. If desired,\r\nyou can view and edit the raw Markdown markup by toggling the switch\r\nfrom **Rich** to **Raw**.\r\n\r\n### Twitter Channel\r\n\r\nSupported features include:\r\n\r\n- Plain text replies\r\n- Quick Reply messages\r\n- Calls to Action\r\n\r\n### WhatsApp Channel\r\n\r\nSupported features include:\r\n\r\n- **Bold**\r\n- _Italic_\r\n- ~~Strikethrough~~\r\n- Quick Replies\r\n- Menu Replies\r\n- Media Replies\r\n - Image\r\n - Video\r\n - Audio\r\n - Document (txt, PDF, Word, Excel, Powerpoint)\r\n- Undo/redo\r\n- Copy/paste\r\n\r\nThe editor saves the response in WhatsApp message format. If desired,\r\nyou can view and edit the raw markup by toggling the switch\r\nfrom **Rich** to **Raw**.\r\n","description":"Craft rich text replies for multiple different channels","endpoint":"https://console.ivastudio.verint.live/Widget/get/64e3ca2df0c99192d946ab9e_655d44bd75c5d32ee18263ca_664caf7f-fce6-4a55-b195-fdcfe47119eb.js","version":{"major":0,"minor":1,"patch":14},"metadata":{"createdBy":"64e637d804bf464073a2a224","createdAt":1714157790017},"id":"c117a795-8f45-4591-b0b6-1007da744173","groupId":"fb08b400-bf23-4c72-ae8e-94d2bbba0af1","data":{"code":"// Auto-generated code. Do not modify.\nconst channels = {\n \"text\": {\n \"en\": [[\"I am sorry, I work best with small simple statements and that reply sounded very long. \"]]\n },\n \"web\": {\n \"en\": [[\"

I am sorry, I work best with small simple statements and that reply sounded very long.

\"]]\n },\n \"voice\": {\n \"en\": [[\"I am sorry, I work best with small simple statements and that reply sounded very long. \"]]\n }\n};\nconst channelOptions = {};\nconst channelName = (req.body?.metadata?.channel ?? req.body?.channel ?? \"web\").toLowerCase();\nconst languages = channels[channelName] ?? channels.text ?? channels.web;\nconst lang = (req.body?.metadata?.lang ?? req.body?.lang ?? \"en\").slice(0, 2);\nconst replies = languages?.[lang] ?? [[\"\"]];\nreplies.forEach(replySet => {\n function replaceVariables(str) {\n return str.replace(/{([^}]+)}/g, (match, key) => new Function(\"x\", \"return x.\" + key)(conversationData));\n }\n let reply = replySet.length > 1 ? replySet[Math.floor(Math.random() * replySet.length)] : replySet[0];\n if (typeof reply === 'object') {\n function replaceValues(obj) {\n if (Array.isArray(obj)) {\n for (let i = 0; i < obj.length; i++) {\n if (typeof obj[i] === \"object\") {\n replaceValues(obj[i]);\n } else if (typeof obj[i] === \"string\") {\n obj[i] = replaceVariables(obj[i]);\n }\n }\n } else {\n for (const key in obj) {\n if (typeof obj[key] === \"object\") {\n replaceValues(obj[key]);\n } else if (typeof obj[key] === \"string\") {\n obj[key] = replaceVariables(obj[key]);\n }\n }\n }\n }\n replaceValues(reply);\n } else {\n reply = replaceVariables(reply);\n }\n recognizedObject.answers.push(reply);\n});\nconst options = channelOptions[channelName]?.[lang];\nif (options && options.length > 0) {\n if (!(\"options\" in recognizedObject)) recognizedObject.options = [];\n recognizedObject.options.push(...options);\n}\nnext();","ports":[],"activeChannels":{"text":[{"type":"text","languages":{"en":[{"value":"I am sorry, I work best with small simple statements and that reply sounded very long. ","valid":true}]}}],"web":[{"type":"text","languages":{"en":[{"value":"

I am sorry, I work best with small simple statements and that reply sounded very long.

","valid":true}]}}],"voice":[{"type":"text","languages":{"en":[{"value":"I am sorry, I work best with small simple statements and that reply sounded very long. ","valid":true}]}}]},"valid":true,"updateKey":683299749}},"92a8b64f-a684-4870-9eb7-fbdd7212f511":{"type":"group","componentId":"group","icon":"layer-group","position":{"left":5497.9453125,"top":5362.7734375},"name":"Group","description":"Useful for grouping widgets together","id":"92a8b64f-a684-4870-9eb7-fbdd7212f511","data":{"steps":["8643e899-4ccc-472b-87a8-ccac830620b4","6df7e34b-7fab-4972-8e6f-5cca901b9985"]}},"8643e899-4ccc-472b-87a8-ccac830620b4":{"_id":"662bf8dedae383ffb348fea3","componentId":"664caf7f-fce6-4a55-b195-fdcfe47119eb","originalComponentId":"d9db6b1e-e3d5-40f2-a618-7684a28adfc0","type":"seed","icon":"paragraph","position":{"left":0,"top":0},"name":"Multi-Channel Reply","readme":"# Multi-Channel Reply Widget\r\n\r\nThis widget allows you to craft responses with rich text features\r\nusing a user-friendly WYSIWYG editor.\r\n\r\n## Supported Channels\r\n\r\n- Plain text (fallback)\r\n- Web/HTML\r\n- Facebook\r\n- Microsoft Teams\r\n- Twitter\r\n- WhatsApp\r\n\r\n### All Channels\r\n\r\nYou can define multiple messages within a single reply. Use the **Add Content**\r\nbutton to add additional messages or other types of content (depending on the\r\nselected channel.)\r\n\r\nYou can include **inline conversation variables** in your response\r\nby including a variable name surrounded by curly brackets,\r\nsuch as `{variableName}`. Object paths and arrays are also supported, e.g. `{path.to.thing[3]}`.\r\n\r\nA randomizer feature is also included for rich text and plain text replies.\r\nYou can define multiple **alternative responses** for each message,\r\none of which will be selected at random each time the response is hit in the agent.\r\n\r\nYou may also create replies for multiple languages.\r\nUse the dropdown at the top of the form to select the language currently being edited.\r\nAll languages will share the same content cards for every channel.\r\n\r\n### Web Channel\r\n\r\nSupported features include:\r\n\r\n- **Bold**\r\n- _Italic_\r\n- Bulleted lists\r\n- Numbered lists\r\n- Hyperlinks\r\n- Images\r\n- Block quotes\r\n- Quick replies\r\n- Undo/redo\r\n- Copy/paste\r\n\r\nThe editor saves the response in HTML format. If desired,\r\nyou can view and edit the raw HTML markup by toggling the switch\r\nfrom **Rich** to **Raw**.\r\n\r\n### Facebook Channel\r\n\r\nSupported features include:\r\n\r\n- **Bold**\r\n- _Italic_\r\n- ~~Strikethrough~~\r\n- Carousel\r\n- Image replies\r\n- Quick replies\r\n- Undo/redo\r\n- Copy/paste\r\n\r\nThe editor saves the response in Facebook message format. If desired,\r\nyou can view and edit the raw markup by toggling the switch\r\nfrom **Rich** to **Raw**.\r\n\r\n### Microsoft Teams Channel\r\n\r\nSupported features include:\r\n\r\n- **Bold**\r\n- _Italic_\r\n- Bulleted lists\r\n- Numbered lists\r\n- Hyperlinks\r\n- Block quotes\r\n- Quick replies\r\n- Cards\r\n - Hero Card\r\n - Thumbnail Card\r\n- Undo/redo\r\n- Copy/paste\r\n\r\nThe editor saves the response in Markdown format. If desired,\r\nyou can view and edit the raw Markdown markup by toggling the switch\r\nfrom **Rich** to **Raw**.\r\n\r\n### Twitter Channel\r\n\r\nSupported features include:\r\n\r\n- Plain text replies\r\n- Quick Reply messages\r\n- Calls to Action\r\n\r\n### WhatsApp Channel\r\n\r\nSupported features include:\r\n\r\n- **Bold**\r\n- _Italic_\r\n- ~~Strikethrough~~\r\n- Quick Replies\r\n- Menu Replies\r\n- Media Replies\r\n - Image\r\n - Video\r\n - Audio\r\n - Document (txt, PDF, Word, Excel, Powerpoint)\r\n- Undo/redo\r\n- Copy/paste\r\n\r\nThe editor saves the response in WhatsApp message format. If desired,\r\nyou can view and edit the raw markup by toggling the switch\r\nfrom **Rich** to **Raw**.\r\n","description":"Craft rich text replies for multiple different channels","endpoint":"https://console.ivastudio.verint.live/Widget/get/64e3ca2df0c99192d946ab9e_655d44bd75c5d32ee18263ca_664caf7f-fce6-4a55-b195-fdcfe47119eb.js","version":{"major":0,"minor":1,"patch":14},"metadata":{"createdBy":"64e637d804bf464073a2a224","createdAt":1714157790017},"id":"8643e899-4ccc-472b-87a8-ccac830620b4","groupId":"92a8b64f-a684-4870-9eb7-fbdd7212f511","data":{"code":"// Auto-generated code. Do not modify.\nconst channels = {\n \"text\": {\n \"en\": [[\"I am sorry, I did not understand that. \"]]\n },\n \"web\": {\n \"en\": [[\"

I am sorry, I did not understand that.

\"]]\n },\n \"voice\": {\n \"en\": [[\"I am sorry, I did not understand that. \"]]\n }\n};\nconst channelOptions = {};\nconst channelName = (req.body?.metadata?.channel ?? req.body?.channel ?? \"web\").toLowerCase();\nconst languages = channels[channelName] ?? channels.text ?? channels.web;\nconst lang = (req.body?.metadata?.lang ?? req.body?.lang ?? \"en\").slice(0, 2);\nconst replies = languages?.[lang] ?? [[\"\"]];\nreplies.forEach(replySet => {\n function replaceVariables(str) {\n return str.replace(/{([^}]+)}/g, (match, key) => new Function(\"x\", \"return x.\" + key)(conversationData));\n }\n let reply = replySet.length > 1 ? replySet[Math.floor(Math.random() * replySet.length)] : replySet[0];\n if (typeof reply === 'object') {\n function replaceValues(obj) {\n if (Array.isArray(obj)) {\n for (let i = 0; i < obj.length; i++) {\n if (typeof obj[i] === \"object\") {\n replaceValues(obj[i]);\n } else if (typeof obj[i] === \"string\") {\n obj[i] = replaceVariables(obj[i]);\n }\n }\n } else {\n for (const key in obj) {\n if (typeof obj[key] === \"object\") {\n replaceValues(obj[key]);\n } else if (typeof obj[key] === \"string\") {\n obj[key] = replaceVariables(obj[key]);\n }\n }\n }\n }\n replaceValues(reply);\n } else {\n reply = replaceVariables(reply);\n }\n recognizedObject.answers.push(reply);\n});\nconst options = channelOptions[channelName]?.[lang];\nif (options && options.length > 0) {\n if (!(\"options\" in recognizedObject)) recognizedObject.options = [];\n recognizedObject.options.push(...options);\n}\nnext();","ports":[],"activeChannels":{"text":[{"type":"text","languages":{"en":[{"value":"I am sorry, I did not understand that. ","valid":true}]}}],"web":[{"type":"text","languages":{"en":[{"value":"

I am sorry, I did not understand that.

","valid":true}]}}],"voice":[{"type":"text","languages":{"en":[{"value":"I am sorry, I did not understand that. ","valid":true}]}}]},"valid":true,"updateKey":843160827}},"a516be40-cf36-4a0a-873b-99d080ec9264":{"type":"group","componentId":"group","icon":"layer-group","position":{"left":5503.921875,"top":5733.75390625},"name":"Group","description":"Useful for grouping widgets together","id":"a516be40-cf36-4a0a-873b-99d080ec9264","data":{"steps":["347d5936-ff0b-496e-a3ca-bddc4eaf6a2d","35a62471-638e-4b13-b7ae-2695573f3dca"]}},"347d5936-ff0b-496e-a3ca-bddc4eaf6a2d":{"_id":"662bf8dedae383ffb348fea3","componentId":"664caf7f-fce6-4a55-b195-fdcfe47119eb","originalComponentId":"d9db6b1e-e3d5-40f2-a618-7684a28adfc0","type":"seed","icon":"paragraph","position":{"left":0,"top":0},"name":"Multi-Channel Reply","readme":"# Multi-Channel Reply Widget\r\n\r\nThis widget allows you to craft responses with rich text features\r\nusing a user-friendly WYSIWYG editor.\r\n\r\n## Supported Channels\r\n\r\n- Plain text (fallback)\r\n- Web/HTML\r\n- Facebook\r\n- Microsoft Teams\r\n- Twitter\r\n- WhatsApp\r\n\r\n### All Channels\r\n\r\nYou can define multiple messages within a single reply. Use the **Add Content**\r\nbutton to add additional messages or other types of content (depending on the\r\nselected channel.)\r\n\r\nYou can include **inline conversation variables** in your response\r\nby including a variable name surrounded by curly brackets,\r\nsuch as `{variableName}`. Object paths and arrays are also supported, e.g. `{path.to.thing[3]}`.\r\n\r\nA randomizer feature is also included for rich text and plain text replies.\r\nYou can define multiple **alternative responses** for each message,\r\none of which will be selected at random each time the response is hit in the agent.\r\n\r\nYou may also create replies for multiple languages.\r\nUse the dropdown at the top of the form to select the language currently being edited.\r\nAll languages will share the same content cards for every channel.\r\n\r\n### Web Channel\r\n\r\nSupported features include:\r\n\r\n- **Bold**\r\n- _Italic_\r\n- Bulleted lists\r\n- Numbered lists\r\n- Hyperlinks\r\n- Images\r\n- Block quotes\r\n- Quick replies\r\n- Undo/redo\r\n- Copy/paste\r\n\r\nThe editor saves the response in HTML format. If desired,\r\nyou can view and edit the raw HTML markup by toggling the switch\r\nfrom **Rich** to **Raw**.\r\n\r\n### Facebook Channel\r\n\r\nSupported features include:\r\n\r\n- **Bold**\r\n- _Italic_\r\n- ~~Strikethrough~~\r\n- Carousel\r\n- Image replies\r\n- Quick replies\r\n- Undo/redo\r\n- Copy/paste\r\n\r\nThe editor saves the response in Facebook message format. If desired,\r\nyou can view and edit the raw markup by toggling the switch\r\nfrom **Rich** to **Raw**.\r\n\r\n### Microsoft Teams Channel\r\n\r\nSupported features include:\r\n\r\n- **Bold**\r\n- _Italic_\r\n- Bulleted lists\r\n- Numbered lists\r\n- Hyperlinks\r\n- Block quotes\r\n- Quick replies\r\n- Cards\r\n - Hero Card\r\n - Thumbnail Card\r\n- Undo/redo\r\n- Copy/paste\r\n\r\nThe editor saves the response in Markdown format. If desired,\r\nyou can view and edit the raw Markdown markup by toggling the switch\r\nfrom **Rich** to **Raw**.\r\n\r\n### Twitter Channel\r\n\r\nSupported features include:\r\n\r\n- Plain text replies\r\n- Quick Reply messages\r\n- Calls to Action\r\n\r\n### WhatsApp Channel\r\n\r\nSupported features include:\r\n\r\n- **Bold**\r\n- _Italic_\r\n- ~~Strikethrough~~\r\n- Quick Replies\r\n- Menu Replies\r\n- Media Replies\r\n - Image\r\n - Video\r\n - Audio\r\n - Document (txt, PDF, Word, Excel, Powerpoint)\r\n- Undo/redo\r\n- Copy/paste\r\n\r\nThe editor saves the response in WhatsApp message format. If desired,\r\nyou can view and edit the raw markup by toggling the switch\r\nfrom **Rich** to **Raw**.\r\n","description":"Craft rich text replies for multiple different channels","endpoint":"https://console.ivastudio.verint.live/Widget/get/64e3ca2df0c99192d946ab9e_655d44bd75c5d32ee18263ca_664caf7f-fce6-4a55-b195-fdcfe47119eb.js","version":{"major":0,"minor":1,"patch":14},"metadata":{"createdBy":"64e637d804bf464073a2a224","createdAt":1714157790017},"id":"347d5936-ff0b-496e-a3ca-bddc4eaf6a2d","groupId":"a516be40-cf36-4a0a-873b-99d080ec9264","data":{"code":"// Auto-generated code. Do not modify.\nconst channels = {\n \"text\": {\n \"en\": [[\"I am sorry, I couldn't hear you. \"]]\n },\n \"web\": {\n \"en\": [[\"

I am sorry, I couldn't hear you.

\"]]\n },\n \"voice\": {\n \"en\": [[\"I am sorry, I couldn't hear you. \"]]\n }\n};\nconst channelOptions = {};\nconst channelName = (req.body?.metadata?.channel ?? req.body?.channel ?? \"web\").toLowerCase();\nconst languages = channels[channelName] ?? channels.text ?? channels.web;\nconst lang = (req.body?.metadata?.lang ?? req.body?.lang ?? \"en\").slice(0, 2);\nconst replies = languages?.[lang] ?? [[\"\"]];\nreplies.forEach(replySet => {\n function replaceVariables(str) {\n return str.replace(/{([^}]+)}/g, (match, key) => new Function(\"x\", \"return x.\" + key)(conversationData));\n }\n let reply = replySet.length > 1 ? replySet[Math.floor(Math.random() * replySet.length)] : replySet[0];\n if (typeof reply === 'object') {\n function replaceValues(obj) {\n if (Array.isArray(obj)) {\n for (let i = 0; i < obj.length; i++) {\n if (typeof obj[i] === \"object\") {\n replaceValues(obj[i]);\n } else if (typeof obj[i] === \"string\") {\n obj[i] = replaceVariables(obj[i]);\n }\n }\n } else {\n for (const key in obj) {\n if (typeof obj[key] === \"object\") {\n replaceValues(obj[key]);\n } else if (typeof obj[key] === \"string\") {\n obj[key] = replaceVariables(obj[key]);\n }\n }\n }\n }\n replaceValues(reply);\n } else {\n reply = replaceVariables(reply);\n }\n recognizedObject.answers.push(reply);\n});\nconst options = channelOptions[channelName]?.[lang];\nif (options && options.length > 0) {\n if (!(\"options\" in recognizedObject)) recognizedObject.options = [];\n recognizedObject.options.push(...options);\n}\nnext();","ports":[],"activeChannels":{"text":[{"type":"text","languages":{"en":[{"value":"I am sorry, I couldn't hear you. ","valid":true}]}}],"web":[{"type":"text","languages":{"en":[{"value":"

I am sorry, I couldn't hear you.

","valid":true}]}}],"voice":[{"type":"text","languages":{"en":[{"value":"I am sorry, I couldn't hear you. ","valid":true}]}}]},"valid":true,"updateKey":27692630}},"3079f18b-3c1f-43a4-86b8-941016e511a6":{"type":"group","componentId":"group","icon":"layer-group","position":{"left":5518.96875,"top":6003.76171875},"name":"Group","description":"Useful for grouping widgets together","id":"3079f18b-3c1f-43a4-86b8-941016e511a6","data":{"steps":["aa325093-4e21-4dff-8f5c-aee9f0be397e"]}},"aa325093-4e21-4dff-8f5c-aee9f0be397e":{"_id":"662bf8dedae383ffb348fea3","componentId":"664caf7f-fce6-4a55-b195-fdcfe47119eb","originalComponentId":"d9db6b1e-e3d5-40f2-a618-7684a28adfc0","type":"seed","icon":"paragraph","position":{"left":0,"top":0},"name":"Multi-Channel Reply","readme":"# Multi-Channel Reply Widget\r\n\r\nThis widget allows you to craft responses with rich text features\r\nusing a user-friendly WYSIWYG editor.\r\n\r\n## Supported Channels\r\n\r\n- Plain text (fallback)\r\n- Web/HTML\r\n- Facebook\r\n- Microsoft Teams\r\n- Twitter\r\n- WhatsApp\r\n\r\n### All Channels\r\n\r\nYou can define multiple messages within a single reply. Use the **Add Content**\r\nbutton to add additional messages or other types of content (depending on the\r\nselected channel.)\r\n\r\nYou can include **inline conversation variables** in your response\r\nby including a variable name surrounded by curly brackets,\r\nsuch as `{variableName}`. Object paths and arrays are also supported, e.g. `{path.to.thing[3]}`.\r\n\r\nA randomizer feature is also included for rich text and plain text replies.\r\nYou can define multiple **alternative responses** for each message,\r\none of which will be selected at random each time the response is hit in the agent.\r\n\r\nYou may also create replies for multiple languages.\r\nUse the dropdown at the top of the form to select the language currently being edited.\r\nAll languages will share the same content cards for every channel.\r\n\r\n### Web Channel\r\n\r\nSupported features include:\r\n\r\n- **Bold**\r\n- _Italic_\r\n- Bulleted lists\r\n- Numbered lists\r\n- Hyperlinks\r\n- Images\r\n- Block quotes\r\n- Quick replies\r\n- Undo/redo\r\n- Copy/paste\r\n\r\nThe editor saves the response in HTML format. If desired,\r\nyou can view and edit the raw HTML markup by toggling the switch\r\nfrom **Rich** to **Raw**.\r\n\r\n### Facebook Channel\r\n\r\nSupported features include:\r\n\r\n- **Bold**\r\n- _Italic_\r\n- ~~Strikethrough~~\r\n- Carousel\r\n- Image replies\r\n- Quick replies\r\n- Undo/redo\r\n- Copy/paste\r\n\r\nThe editor saves the response in Facebook message format. If desired,\r\nyou can view and edit the raw markup by toggling the switch\r\nfrom **Rich** to **Raw**.\r\n\r\n### Microsoft Teams Channel\r\n\r\nSupported features include:\r\n\r\n- **Bold**\r\n- _Italic_\r\n- Bulleted lists\r\n- Numbered lists\r\n- Hyperlinks\r\n- Block quotes\r\n- Quick replies\r\n- Cards\r\n - Hero Card\r\n - Thumbnail Card\r\n- Undo/redo\r\n- Copy/paste\r\n\r\nThe editor saves the response in Markdown format. If desired,\r\nyou can view and edit the raw Markdown markup by toggling the switch\r\nfrom **Rich** to **Raw**.\r\n\r\n### Twitter Channel\r\n\r\nSupported features include:\r\n\r\n- Plain text replies\r\n- Quick Reply messages\r\n- Calls to Action\r\n\r\n### WhatsApp Channel\r\n\r\nSupported features include:\r\n\r\n- **Bold**\r\n- _Italic_\r\n- ~~Strikethrough~~\r\n- Quick Replies\r\n- Menu Replies\r\n- Media Replies\r\n - Image\r\n - Video\r\n - Audio\r\n - Document (txt, PDF, Word, Excel, Powerpoint)\r\n- Undo/redo\r\n- Copy/paste\r\n\r\nThe editor saves the response in WhatsApp message format. If desired,\r\nyou can view and edit the raw markup by toggling the switch\r\nfrom **Rich** to **Raw**.\r\n","description":"Craft rich text replies for multiple different channels","endpoint":"https://console.ivastudio.verint.live/Widget/get/64e3ca2df0c99192d946ab9e_655d44bd75c5d32ee18263ca_664caf7f-fce6-4a55-b195-fdcfe47119eb.js","version":{"major":0,"minor":1,"patch":14},"metadata":{"createdBy":"64e637d804bf464073a2a224","createdAt":1714157790017},"id":"aa325093-4e21-4dff-8f5c-aee9f0be397e","groupId":"3079f18b-3c1f-43a4-86b8-941016e511a6","data":{"code":"// Auto-generated code. Do not modify.\nconst channels = {\n \"text\": {\n \"en\": [[\"Queue Status Event.\"]]\n },\n \"web\": {\n \"en\": [[\"

Queue status event.

\"]]\n },\n \"voice\": {\n \"en\": [[\"Queue Status Event.\"]]\n }\n};\nconst channelOptions = {};\nconst channelName = (req.body?.metadata?.channel ?? req.body?.channel ?? \"web\").toLowerCase();\nconst languages = channels[channelName] ?? channels.text ?? channels.web;\nconst lang = (req.body?.metadata?.lang ?? req.body?.lang ?? \"en\").slice(0, 2);\nconst replies = languages?.[lang] ?? [[\"\"]];\nreplies.forEach(replySet => {\n function replaceVariables(str) {\n return str.replace(/{([^}]+)}/g, (match, key) => new Function(\"x\", \"return x.\" + key)(conversationData));\n }\n let reply = replySet.length > 1 ? replySet[Math.floor(Math.random() * replySet.length)] : replySet[0];\n if (typeof reply === 'object') {\n function replaceValues(obj) {\n if (Array.isArray(obj)) {\n for (let i = 0; i < obj.length; i++) {\n if (typeof obj[i] === \"object\") {\n replaceValues(obj[i]);\n } else if (typeof obj[i] === \"string\") {\n obj[i] = replaceVariables(obj[i]);\n }\n }\n } else {\n for (const key in obj) {\n if (typeof obj[key] === \"object\") {\n replaceValues(obj[key]);\n } else if (typeof obj[key] === \"string\") {\n obj[key] = replaceVariables(obj[key]);\n }\n }\n }\n }\n replaceValues(reply);\n } else {\n reply = replaceVariables(reply);\n }\n recognizedObject.answers.push(reply);\n});\nconst options = channelOptions[channelName]?.[lang];\nif (options && options.length > 0) {\n if (!(\"options\" in recognizedObject)) recognizedObject.options = [];\n recognizedObject.options.push(...options);\n}\nnext();","ports":[],"activeChannels":{"text":[{"type":"text","languages":{"en":[{"value":"Queue Status Event.","valid":true}]}}],"web":[{"type":"text","languages":{"en":[{"value":"

Queue status event.

","valid":true}]}}],"voice":[{"type":"text","languages":{"en":[{"value":"Queue Status Event.","valid":true}]}}]},"valid":true,"updateKey":264004016}},"9806cea7-2826-4ef9-8b05-bc57ed949a7b":{"type":"group","componentId":"group","icon":"layer-group","position":{"left":5512.93359375,"top":6173.75390625},"name":"Group","description":"Useful for grouping widgets together","id":"9806cea7-2826-4ef9-8b05-bc57ed949a7b","data":{"steps":["67b883e6-f051-4a78-98bb-e067f18d89db"]}},"67b883e6-f051-4a78-98bb-e067f18d89db":{"_id":"662bf8dedae383ffb348fea3","componentId":"664caf7f-fce6-4a55-b195-fdcfe47119eb","originalComponentId":"d9db6b1e-e3d5-40f2-a618-7684a28adfc0","type":"seed","icon":"paragraph","position":{"left":0,"top":0},"name":"Multi-Channel Reply","readme":"# Multi-Channel Reply Widget\r\n\r\nThis widget allows you to craft responses with rich text features\r\nusing a user-friendly WYSIWYG editor.\r\n\r\n## Supported Channels\r\n\r\n- Plain text (fallback)\r\n- Web/HTML\r\n- Facebook\r\n- Microsoft Teams\r\n- Twitter\r\n- WhatsApp\r\n\r\n### All Channels\r\n\r\nYou can define multiple messages within a single reply. Use the **Add Content**\r\nbutton to add additional messages or other types of content (depending on the\r\nselected channel.)\r\n\r\nYou can include **inline conversation variables** in your response\r\nby including a variable name surrounded by curly brackets,\r\nsuch as `{variableName}`. Object paths and arrays are also supported, e.g. `{path.to.thing[3]}`.\r\n\r\nA randomizer feature is also included for rich text and plain text replies.\r\nYou can define multiple **alternative responses** for each message,\r\none of which will be selected at random each time the response is hit in the agent.\r\n\r\nYou may also create replies for multiple languages.\r\nUse the dropdown at the top of the form to select the language currently being edited.\r\nAll languages will share the same content cards for every channel.\r\n\r\n### Web Channel\r\n\r\nSupported features include:\r\n\r\n- **Bold**\r\n- _Italic_\r\n- Bulleted lists\r\n- Numbered lists\r\n- Hyperlinks\r\n- Images\r\n- Block quotes\r\n- Quick replies\r\n- Undo/redo\r\n- Copy/paste\r\n\r\nThe editor saves the response in HTML format. If desired,\r\nyou can view and edit the raw HTML markup by toggling the switch\r\nfrom **Rich** to **Raw**.\r\n\r\n### Facebook Channel\r\n\r\nSupported features include:\r\n\r\n- **Bold**\r\n- _Italic_\r\n- ~~Strikethrough~~\r\n- Carousel\r\n- Image replies\r\n- Quick replies\r\n- Undo/redo\r\n- Copy/paste\r\n\r\nThe editor saves the response in Facebook message format. If desired,\r\nyou can view and edit the raw markup by toggling the switch\r\nfrom **Rich** to **Raw**.\r\n\r\n### Microsoft Teams Channel\r\n\r\nSupported features include:\r\n\r\n- **Bold**\r\n- _Italic_\r\n- Bulleted lists\r\n- Numbered lists\r\n- Hyperlinks\r\n- Block quotes\r\n- Quick replies\r\n- Cards\r\n - Hero Card\r\n - Thumbnail Card\r\n- Undo/redo\r\n- Copy/paste\r\n\r\nThe editor saves the response in Markdown format. If desired,\r\nyou can view and edit the raw Markdown markup by toggling the switch\r\nfrom **Rich** to **Raw**.\r\n\r\n### Twitter Channel\r\n\r\nSupported features include:\r\n\r\n- Plain text replies\r\n- Quick Reply messages\r\n- Calls to Action\r\n\r\n### WhatsApp Channel\r\n\r\nSupported features include:\r\n\r\n- **Bold**\r\n- _Italic_\r\n- ~~Strikethrough~~\r\n- Quick Replies\r\n- Menu Replies\r\n- Media Replies\r\n - Image\r\n - Video\r\n - Audio\r\n - Document (txt, PDF, Word, Excel, Powerpoint)\r\n- Undo/redo\r\n- Copy/paste\r\n\r\nThe editor saves the response in WhatsApp message format. If desired,\r\nyou can view and edit the raw markup by toggling the switch\r\nfrom **Rich** to **Raw**.\r\n","description":"Craft rich text replies for multiple different channels","endpoint":"https://console.ivastudio.verint.live/Widget/get/64e3ca2df0c99192d946ab9e_655d44bd75c5d32ee18263ca_664caf7f-fce6-4a55-b195-fdcfe47119eb.js","version":{"major":0,"minor":1,"patch":14},"metadata":{"createdBy":"64e637d804bf464073a2a224","createdAt":1714157790017},"id":"67b883e6-f051-4a78-98bb-e067f18d89db","groupId":"9806cea7-2826-4ef9-8b05-bc57ed949a7b","data":{"code":"// Auto-generated code. Do not modify.\nconst channels = {\"text\":{\"en\":[[\"Please enter your workspace code:\"]]},\"web\":{\"en\":[[\"

Please enter your workspace code:

\"]]},\"voice\":{\"en\":[[\"Please enter your workspace code:\"]]}};\nconst channelOptions = {};\nconst channelName = (req.body?.metadata?.channel ?? req.body?.channel ?? \"web\").toLowerCase();\nconst languages = channels[channelName] ?? channels.text ?? channels.web;\nconst lang = (req.body?.metadata?.lang ?? req.body?.lang ?? \"en\").slice(0, 2);\nconst replies = languages?.[lang] ?? [[\"\"]];\nreplies.forEach(replySet => {\n\tfunction replaceVariables(str) {\n\t\treturn str.replace(/{([^}]+)}/g, (match, key) => (new Function(\"x\", \"return x.\" + key))(conversationData));\n\t}\n\tlet reply = replySet.length > 1 ? replySet[Math.floor(Math.random() * replySet.length)] : replySet[0];\n\tif(typeof reply === 'object') {\n\t\tfunction replaceValues(obj) {\n\t\t\tif(Array.isArray(obj)) {\n\t\t\t\tfor(let i = 0; i < obj.length; i++) {\n\t\t\t\t\tif(typeof obj[i] === \"object\") {\n\t\t\t\t\t\treplaceValues(obj[i]);\n\t\t\t\t\t}\n\t\t\t\t\telse if(typeof obj[i] === \"string\") {\n\t\t\t\t\t\tobj[i] = replaceVariables(obj[i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tfor(const key in obj){\n\t\t\t\t\tif(typeof obj[key] === \"object\") {\n\t\t\t\t\t\treplaceValues(obj[key]);\n\t\t\t\t\t}\n\t\t\t\t\telse if(typeof obj[key] === \"string\") {\n\t\t\t\t\t\tobj[key] = replaceVariables(obj[key]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treplaceValues(reply);\n\t}\n\telse {\n\t\treply = replaceVariables(reply);\n\t}\n\trecognizedObject.answers.push(reply);\n});\nconst options = channelOptions[channelName]?.[lang];\nif(options && options.length > 0) {\n\tif(!(\"options\" in recognizedObject)) recognizedObject.options = [];\n\trecognizedObject.options.push(...options);\n}\nnext();\n","ports":[],"activeChannels":{"text":[{"type":"text","languages":{"en":[{"value":"Please enter your workspace code:","valid":true}]}}],"web":[{"type":"text","languages":{"en":[{"value":"

Please enter your workspace code:

","valid":true}]}}],"voice":[{"type":"text","languages":{"en":[{"value":"Please enter your workspace code:","valid":true}]}}]},"valid":true,"updateKey":52392153}},"501902db-7b86-4904-9d8c-fe6c2f857fab":{"_id":"662bed6aa966ff323c01f430","componentId":"b59636d2-457a-47dd-ac95-c7f4ff8b2c93","originalComponentId":"ea8f8d4a-9d23-4f73-a628-28dd4df8662b","type":"seed","icon":"plug-circle-check","position":{"left":0,"top":0},"endpoint":"https://console.ivastudio.verint.live/Widget/get/649f328215391a16f47d081e_649f49f4cc92e926d671e8c4_b59636d2-457a-47dd-ac95-c7f4ff8b2c93.js","metadata":{"createdBy":"650a13a8303c8abc768b7df1","createdAt":1714154858711},"id":"501902db-7b86-4904-9d8c-fe6c2f857fab","groupId":"fb08b400-bf23-4c72-ae8e-94d2bbba0af1","data":{"code":"if (\"returnToSlotName\" && !_.isUndefined(conversationData.returnToSlotName)) {\n next(0);\n} else {\n next(1);\n}","ports":[{"id":"6b55be9c-ef19-49d6-9666-134d52610a86"},{"id":"87af2146-45c9-4105-a079-a1b3a40c846f"}],"variableName":"returnToSlotName","selectedCondition":"exists","selectedFailureAction":"next(index)","selectedSuccessAction":"next(index)"}},"6df7e34b-7fab-4972-8e6f-5cca901b9985":{"_id":"662bed6aa966ff323c01f430","componentId":"b59636d2-457a-47dd-ac95-c7f4ff8b2c93","originalComponentId":"ea8f8d4a-9d23-4f73-a628-28dd4df8662b","type":"seed","icon":"plug-circle-check","position":{"left":0,"top":0},"endpoint":"https://console.ivastudio.verint.live/Widget/get/649f328215391a16f47d081e_649f49f4cc92e926d671e8c4_b59636d2-457a-47dd-ac95-c7f4ff8b2c93.js","metadata":{"createdBy":"650a13a8303c8abc768b7df1","createdAt":1714154858711},"id":"6df7e34b-7fab-4972-8e6f-5cca901b9985","groupId":"92a8b64f-a684-4870-9eb7-fbdd7212f511","data":{"code":"if (\"returnToSlotName\" && !_.isUndefined(conversationData.returnToSlotName)) {\n next(0);\n} else {\n next(1);\n}","ports":[{"id":"6b55be9c-ef19-49d6-9666-134d52610a86"},{"id":"87af2146-45c9-4105-a079-a1b3a40c846f"}],"variableName":"returnToSlotName","selectedCondition":"exists","selectedSuccessAction":"next(index)","selectedFailureAction":"next(index)"}},"35a62471-638e-4b13-b7ae-2695573f3dca":{"_id":"662bed6aa966ff323c01f430","componentId":"b59636d2-457a-47dd-ac95-c7f4ff8b2c93","originalComponentId":"ea8f8d4a-9d23-4f73-a628-28dd4df8662b","type":"seed","icon":"plug-circle-check","position":{"left":0,"top":0},"endpoint":"https://console.ivastudio.verint.live/Widget/get/649f328215391a16f47d081e_649f49f4cc92e926d671e8c4_b59636d2-457a-47dd-ac95-c7f4ff8b2c93.js","metadata":{"createdBy":"650a13a8303c8abc768b7df1","createdAt":1714154858711},"id":"35a62471-638e-4b13-b7ae-2695573f3dca","groupId":"a516be40-cf36-4a0a-873b-99d080ec9264","data":{"code":"if (\"returnToSlotName\" && !_.isUndefined(conversationData.returnToSlotName)) {\n next(0);\n} else {\n next(1);\n}","ports":[{"id":"6b55be9c-ef19-49d6-9666-134d52610a86"},{"id":"87af2146-45c9-4105-a079-a1b3a40c846f"}],"variableName":"returnToSlotName","selectedCondition":"exists","selectedSuccessAction":"next(index)","selectedFailureAction":"next(index)"}},"4fdff133-ea1b-4504-a277-e14f011a8347":{"type":"group","componentId":"group","icon":"layer-group","position":{"left":6035.45703125,"top":5491.0078125},"name":"Group","description":"Useful for grouping widgets together","id":"4fdff133-ea1b-4504-a277-e14f011a8347","data":{"steps":["87af2146-45c9-4105-a079-a1b3a40c846f"],"name":"No Current Slot Name in resturnToSlotName"}},"87af2146-45c9-4105-a079-a1b3a40c846f":{"_id":"662bf8dedae383ffb348fea3","componentId":"664caf7f-fce6-4a55-b195-fdcfe47119eb","originalComponentId":"d9db6b1e-e3d5-40f2-a618-7684a28adfc0","type":"seed","icon":"paragraph","position":{"left":0,"top":0},"name":"Multi-Channel Reply","readme":"# Multi-Channel Reply Widget\r\n\r\nThis widget allows you to craft responses with rich text features\r\nusing a user-friendly WYSIWYG editor.\r\n\r\n## Supported Channels\r\n\r\n- Plain text (fallback)\r\n- Web/HTML\r\n- Facebook\r\n- Microsoft Teams\r\n- Twitter\r\n- WhatsApp\r\n\r\n### All Channels\r\n\r\nYou can define multiple messages within a single reply. Use the **Add Content**\r\nbutton to add additional messages or other types of content (depending on the\r\nselected channel.)\r\n\r\nYou can include **inline conversation variables** in your response\r\nby including a variable name surrounded by curly brackets,\r\nsuch as `{variableName}`. Object paths and arrays are also supported, e.g. `{path.to.thing[3]}`.\r\n\r\nA randomizer feature is also included for rich text and plain text replies.\r\nYou can define multiple **alternative responses** for each message,\r\none of which will be selected at random each time the response is hit in the agent.\r\n\r\nYou may also create replies for multiple languages.\r\nUse the dropdown at the top of the form to select the language currently being edited.\r\nAll languages will share the same content cards for every channel.\r\n\r\n### Web Channel\r\n\r\nSupported features include:\r\n\r\n- **Bold**\r\n- _Italic_\r\n- Bulleted lists\r\n- Numbered lists\r\n- Hyperlinks\r\n- Images\r\n- Block quotes\r\n- Quick replies\r\n- Undo/redo\r\n- Copy/paste\r\n\r\nThe editor saves the response in HTML format. If desired,\r\nyou can view and edit the raw HTML markup by toggling the switch\r\nfrom **Rich** to **Raw**.\r\n\r\n### Facebook Channel\r\n\r\nSupported features include:\r\n\r\n- **Bold**\r\n- _Italic_\r\n- ~~Strikethrough~~\r\n- Carousel\r\n- Image replies\r\n- Quick replies\r\n- Undo/redo\r\n- Copy/paste\r\n\r\nThe editor saves the response in Facebook message format. If desired,\r\nyou can view and edit the raw markup by toggling the switch\r\nfrom **Rich** to **Raw**.\r\n\r\n### Microsoft Teams Channel\r\n\r\nSupported features include:\r\n\r\n- **Bold**\r\n- _Italic_\r\n- Bulleted lists\r\n- Numbered lists\r\n- Hyperlinks\r\n- Block quotes\r\n- Quick replies\r\n- Cards\r\n - Hero Card\r\n - Thumbnail Card\r\n- Undo/redo\r\n- Copy/paste\r\n\r\nThe editor saves the response in Markdown format. If desired,\r\nyou can view and edit the raw Markdown markup by toggling the switch\r\nfrom **Rich** to **Raw**.\r\n\r\n### Twitter Channel\r\n\r\nSupported features include:\r\n\r\n- Plain text replies\r\n- Quick Reply messages\r\n- Calls to Action\r\n\r\n### WhatsApp Channel\r\n\r\nSupported features include:\r\n\r\n- **Bold**\r\n- _Italic_\r\n- ~~Strikethrough~~\r\n- Quick Replies\r\n- Menu Replies\r\n- Media Replies\r\n - Image\r\n - Video\r\n - Audio\r\n - Document (txt, PDF, Word, Excel, Powerpoint)\r\n- Undo/redo\r\n- Copy/paste\r\n\r\nThe editor saves the response in WhatsApp message format. If desired,\r\nyou can view and edit the raw markup by toggling the switch\r\nfrom **Rich** to **Raw**.\r\n","description":"Craft rich text replies for multiple different channels","endpoint":"https://console.ivastudio.verint.live/Widget/get/64e3ca2df0c99192d946ab9e_655d44bd75c5d32ee18263ca_664caf7f-fce6-4a55-b195-fdcfe47119eb.js","version":{"major":0,"minor":1,"patch":14},"metadata":{"createdBy":"64e637d804bf464073a2a224","createdAt":1714157790017},"id":"87af2146-45c9-4105-a079-a1b3a40c846f","groupId":"4fdff133-ea1b-4504-a277-e14f011a8347","data":{"code":"// Auto-generated code. Do not modify.\nconst channels = {\n \"text\": {\n \"en\": [[\"How can I help you today?\"]]\n },\n \"web\": {\n \"en\": [[\"

How can I help you today?

\"]]\n },\n \"voice\": {\n \"en\": [[\"How can I help you today?\"]]\n }\n};\nconst channelOptions = {};\nconst channelName = (req.body?.metadata?.channel ?? req.body?.channel ?? \"web\").toLowerCase();\nconst languages = channels[channelName] ?? channels.text ?? channels.web;\nconst lang = (req.body?.metadata?.lang ?? req.body?.lang ?? \"en\").slice(0, 2);\nconst replies = languages?.[lang] ?? [[\"\"]];\nreplies.forEach(replySet => {\n function replaceVariables(str) {\n return str.replace(/{([^}]+)}/g, (match, key) => new Function(\"x\", \"return x.\" + key)(conversationData));\n }\n let reply = replySet.length > 1 ? replySet[Math.floor(Math.random() * replySet.length)] : replySet[0];\n if (typeof reply === 'object') {\n function replaceValues(obj) {\n if (Array.isArray(obj)) {\n for (let i = 0; i < obj.length; i++) {\n if (typeof obj[i] === \"object\") {\n replaceValues(obj[i]);\n } else if (typeof obj[i] === \"string\") {\n obj[i] = replaceVariables(obj[i]);\n }\n }\n } else {\n for (const key in obj) {\n if (typeof obj[key] === \"object\") {\n replaceValues(obj[key]);\n } else if (typeof obj[key] === \"string\") {\n obj[key] = replaceVariables(obj[key]);\n }\n }\n }\n }\n replaceValues(reply);\n } else {\n reply = replaceVariables(reply);\n }\n recognizedObject.answers.push(reply);\n});\nconst options = channelOptions[channelName]?.[lang];\nif (options && options.length > 0) {\n if (!(\"options\" in recognizedObject)) recognizedObject.options = [];\n recognizedObject.options.push(...options);\n}\nnext();","ports":[],"activeChannels":{"text":[{"type":"text","languages":{"en":[{"value":"How can I help you today?","valid":true}]}}],"web":[{"type":"text","languages":{"en":[{"value":"

How can I help you today?

","valid":true}]}}],"voice":[{"type":"text","languages":{"en":[{"value":"How can I help you today?","valid":true}]}}]},"valid":true,"updateKey":988073571}},"0d13599a-36e8-432d-83d0-7d751f1fbb93":{"type":"group","componentId":"group","icon":"layer-group","position":{"left":6126.44921875,"top":5248.91015625},"name":"Group","description":"Useful for grouping widgets together","id":"0d13599a-36e8-432d-83d0-7d751f1fbb93","data":{"steps":["6b55be9c-ef19-49d6-9666-134d52610a86"],"name":"Returning To returnToSlotName via \"GoTo\""}},"6b55be9c-ef19-49d6-9666-134d52610a86":{"type":"seed","componentId":"seed","icon":"code","position":{"left":0,"top":0},"name":"Code","description":"Allows custom code to execute where placed","id":"6b55be9c-ef19-49d6-9666-134d52610a86","groupId":"0d13599a-36e8-432d-83d0-7d751f1fbb93","data":{"code":"recognizedObject.goTo = conversationData.returnToSlotName;\nnext();","ports":[null]}}},"global":false,"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788228178,"_vc":{"branch":"current","operation":"update","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDQ0YWZiZGY5MzBmNGIzODk2","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDE4YzllYjA3MzRjODkxNjM2","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDFkMDM3ZjMzNGIyZTZiMWI3"},"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl","updatedAt":1748531457223},"dependsOn":[{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODdl","_vc_latest":{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODdm","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"modelId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0MzU0YWZiZGY5MzBmNGIzODZh","label":"VXML Welcome Event @ 6647ad7b84df93835bbb4346","keyPhrases":[],"enabled":true,"relevant":true,"publication":{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjZmNzE5MjYxOWYzZjIxOTI3MzcyZTY2","original_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjY0N2E4YzQ4NGRmOTM4MzViYmI0MzM1"},"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227700,"_vc":{"branch":"current","operation":"create","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODdl","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDE4YzllYjA3MzRjODkxNjIy","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDFkMDM3ZjMzNGIyZTZiMWI3"},"updatedAt":1748531457197,"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl"}}},{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODgy","_vc_latest":{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODgz","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"modelId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0MzU0YWZiZGY5MzBmNGIzODZh","label":"VXML Max Speech Timeout @ 6647ad7b84df93835bbb4346","keyPhrases":[],"enabled":true,"relevant":true,"publication":{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjZmNzE5MjYxOWYzZjIxOTI3MzcyZTY2","original_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjY0N2E4YzQ4NGRmOTM4MzViYmI0MzM3"},"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227749,"_vc":{"branch":"current","operation":"create","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODgy","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDE4YzllYjA3MzRjODkxNjI0","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDFkMDM3ZjMzNGIyZTZiMWI3"},"updatedAt":1748531457197,"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl"}}},{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODgw","_vc_latest":{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODgx","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"modelId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0MzU0YWZiZGY5MzBmNGIzODZh","label":"VXML Queue Status Event @ 6647ad7b84df93835bbb4346","keyPhrases":[],"enabled":true,"relevant":true,"publication":{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjZmNzE5MjYxOWYzZjIxOTI3MzcyZTY2","original_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjY0N2E4YzQ4NGRmOTM4MzViYmI0MzM2"},"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227728,"_vc":{"branch":"current","operation":"create","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODgw","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDE4YzllYjA3MzRjODkxNjIz","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDFkMDM3ZjMzNGIyZTZiMWI3"},"updatedAt":1748531457197,"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl"}}},{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg0","_vc_latest":{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg1","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"modelId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0MzU0YWZiZGY5MzBmNGIzODZh","label":"VXML Noinput Event @ 6647ad7b84df93835bbb4346","keyPhrases":[],"enabled":true,"relevant":true,"publication":{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjZmNzE5MjYxOWYzZjIxOTI3MzcyZTY2","original_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjY0N2E4YzQ4NGRmOTM4MzViYmI0MzM4"},"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227773,"_vc":{"branch":"current","operation":"create","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg0","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDE4YzllYjA3MzRjODkxNjI1","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDFkMDM3ZjMzNGIyZTZiMWI3"},"updatedAt":1748531457197,"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl"}}},{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg2","_vc_latest":{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg3","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"modelId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0MzU0YWZiZGY5MzBmNGIzODZh","label":"VXML Unrecognized Event @ 6647ad7b84df93835bbb4346","keyPhrases":[],"enabled":true,"relevant":true,"publication":{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjZmNzE5MjYxOWYzZjIxOTI3MzcyZTY2","original_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjY0N2E4YzQ4NGRmOTM4MzViYmI0MzM5"},"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227801,"_vc":{"branch":"current","operation":"create","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg2","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDE4YzllYjA3MzRjODkxNjI2","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5MDFkMDM3ZjMzNGIyZTZiMWI3"},"updatedAt":1748531457197,"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl"}}}]}],"globalVariables":[{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0OTQ0YWZiZGY5MzBmNGIzODk4","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","name":"voiceSettings_6647ad7b84df93835bbb4346","type":"Object","content":"{\r\n \"nlu\": {\r\n \"apiBaseURL\": \"http://ivas-router.prd1\",\r\n \"modelName\": \"MVP\",\r\n \"settings\": {\r\n \"intentConfidenceThreshold\": 0.4\r\n }\r\n },\r\n \"suffix\": \"6647ad7b84df93835bbb4346\",\r\n \"waitHoldTimeout\": \"8s\",\r\n \"waitHoldQueueStatus\": \"20\",\r\n \"responses\": {\r\n \"welcome\": \"Hello, I'm a virtual assistant. How can I help you?\",\r\n \"unrecognized\": \"I did not understand what you said. Can you please say it again?\",\r\n \"unanswered\": \"I understand what you said, but I have not been taught how to answer your question... yet.\",\r\n \"noinput\": \"If you said something, I did not hear it. Can you please repeat that?\",\r\n \"speechtimeout\": \"We may be having noise issues with our call, Can you repeat that?\",\r\n \"transferCall\": \"Forwarding to a live operator\",\r\n \"pleaseContinueToHold\": \"Please continue to wait for the next available representative.\",\r\n \"safetynet\": \"There was a problem processing your request. How else can I help?\"\r\n },\r\n \"ivr\": {\r\n \"hostname\": \"https://router.ivastudio.verint.live\",\r\n \"applicationName\": \"SC Distr\"\r\n },\r\n \"transfer\": {\r\n \"destination\": \"\"\r\n },\r\n \"integrations\": {\r\n \"CAInterface\": {\r\n \"enabled\": false,\r\n \"suffix\": \"\"\r\n }\r\n }\r\n}","parameters":null,"returnsContextObject":null,"organizationId":null,"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227337,"_vc":{"branch":"current","operation":"update","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODZi","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5NTU4YzllYjA3MzRjODkyMDE5","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5NTVkMDM3ZjMzNGIyZTZiMWI4"},"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl","updatedAt":1748531541999}},{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODZl","workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","name":"vxmlgen_gvf_6647ad7b84df93835bbb4346","type":"Function","content":"// version 1.0.5\nreturn {\nfrontDoor: options => {\n const parameters = _.merge({\n lastResortUrl: 'D:\\\\\\\\Program Files (x86)\\\\\\\\Intervoice\\\\Media Server for VOIP\\\\\\\\APPL\\\\\\\\CSIURLROUTER\\\\\\\\lastresort.vxml'\n }, options);\n parameters.suffix = parameters.suffix && `_${parameters.suffix}` || '';\n const xml = {\n 'vxml': {\n '$': {\n 'version': '2.1',\n 'xmlns': 'http://www.w3.org/2001/vxml',\n 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',\n 'xsi:schemaLocation': 'http://www.w3.org/2001/vxml http://www.w3.org/TR/2007/REC-voicexml21-20070619/vxml.xsd'\n },\n 'var': [{\n '$': {\n 'name': 'sessionId',\n 'expr': 'session.connection.log.callid'\n }\n }, {\n '$': {\n 'name': 'localURI',\n 'expr': 'session.connection.local.uri'\n }\n }, {\n '$': {\n 'name': 'remoteURI',\n 'expr': 'session.connection.remote.uri'\n }\n }, {\n '$': {\n 'name': 'aai',\n 'expr': 'session.connection.aai'\n }\n }, {\n '$': {\n 'expr': \"''\",\n 'name': 'sessionJSON'\n }\n }, {\n '$': {\n 'name': 'errorCount',\n 'expr': '0'\n }\n }, {\n '$': {\n 'name': 'message',\n 'expr': \"''\"\n }\n }, {\n '$': {\n 'name': 'event',\n 'expr': \"''\"\n }\n }],\n 'form': [{\n '$': {\n 'id': 'main'\n },\n 'block': [{\n 'script': [\"\\n \\n // https://www.ecma-international.org/ecma-262/#sec-json.stringify\\n // JSON.stringify() is supported in ECMA 262 edition 5 and later.\\n // Convergys CIVP 10 supports ECMA 262 edition 3\\n // For this alternate implementation, see:\\n // https://www.sitepoint.com/javascript-json-serialization/\\n\\n var JSON = JSON || {};\\n\\n JSON.stringify = JSON.stringify || function (obj) {\\n\\n var t = typeof (obj);\\n if (t != \\\"object\\\" || obj === null) {\\n\\n // simple data type\\n if (t == \\\"string\\\") obj = '\\\"' + obj + '\\\"';\\n return String(obj);\\n\\n }\\n else {\\n\\n // recurse array or object\\n var n, v, json = [], arr = (obj && obj.constructor == Array);\\n\\n for (n in obj) {\\n v = obj[n]; t = typeof (v);\\n\\n if (t == \\\"string\\\") v = '\\\"' + v.replace(/\\\\\\\\([^\\\"])/g, \\\"\\\\\\\\\\\\\\\\$1\\\") + '\\\"';\\n else if (t == \\\"undefined\\\") v = null;\\n else if (t == \\\"object\\\" && v !== null) v = JSON.stringify(v);\\n\\t\\t\\t\\t\\t\\telse if (t == \\\"function\\\") v = null;\\n\\n json.push((arr ? \\\"\\\" : '\\\"' + n + '\\\":') + String(v));\\n }\\n\\n return (arr ? \\\"[\\\" : \\\"{\\\") + String(json) + (arr ? \\\"]\\\" : \\\"}\\\");\\n }\\n };\\n\\n JSON.parse = JSON.parse || function (str) {\\n if (str === \\\"\\\") str = '\\\"\\\"';\\n eval(\\\"var p=\\\" + str + \\\";\\\");\\n return p;\\n };\\n\\n sessionJSON = JSON.stringify(session);\\n \\n \"],\n 'submit': [{\n '$': {\n 'method': 'post',\n 'expr': 'loopUrl',\n 'namelist': 'sessionId localURI remoteURI aai sessionJSON'\n }\n }]\n }]\n }],\n 'catch': [{\n '$': {\n 'event': 'connection.disconnect'\n },\n 'assign': [{\n '$': {\n 'name': 'message',\n 'expr': '_message'\n }\n }, {\n '$': {\n 'name': 'event',\n 'expr': '_event'\n }\n }],\n 'submit': [{\n '$': {\n 'method': 'post',\n 'expr': 'stopUrl',\n 'namelist': 'sessionId message event'\n }\n }]\n }, {\n '$': {\n 'event': 'error'\n },\n 'assign': [{\n '$': {\n 'name': 'errorCount',\n 'expr': 'errorCount + 1'\n }\n }, {\n '$': {\n 'name': 'message',\n 'expr': '_message'\n }\n }, {\n '$': {\n 'name': 'event',\n 'expr': '_event'\n }\n }],\n 'if': [{\n '$': {\n 'cond': 'errorCount > 3'\n },\n 'log': [{\n '_': 'Tranfer of last resort., sessionId: ,\\n\\t\\tevent: , message: \\n\\t\\t\\t',\n '$': {\n 'label': 'error'\n },\n 'value': [{\n '$': {\n 'expr': 'sessionId'\n }\n }, {\n '$': {\n 'expr': '_event'\n }\n }, {\n '$': {\n 'expr': '_message'\n }\n }]\n }],\n 'goto': [{\n '$': {\n 'expr': 'lastResortUrl'\n }\n }]\n }],\n 'submit': [{\n '$': {\n 'method': 'post',\n 'expr': 'errorUrl',\n 'namelist': 'sessionId message event'\n }\n }]\n }]\n }\n };\n xml.vxml.var.push({\n '$': {\n 'name': 'loopUrl',\n 'expr': `'${parameters.loopUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_loop${parameters.suffix}`}'`\n }\n }, {\n '$': {\n 'name': 'errorUrl',\n 'expr': `'${parameters.errorUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_error${parameters.suffix}`}'`\n }\n }, {\n '$': {\n 'name': 'lastResortUrl',\n 'expr': `'${parameters.lastResortUrl}'`\n }\n }, {\n '$': {\n 'name': 'stopUrl',\n 'expr': `'${parameters.stopUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_stop${parameters.suffix}`}'`\n }\n }, {\n '$': {\n 'name': 'maxspeechtimeoutUrl',\n 'expr': `'${parameters.maxspeechtimeoutUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_loop${parameters.suffix}/maxspeechtimeout`}'`\n }\n });\n const builder = new xml2js.Builder({\n cdata: true\n });\n return builder.buildObject(xml);\n},\nloop: options => {\n const builder = new xml2js.Builder();\n const parameters = _.merge({\n dialogName: 'test_dialog',\n dtmfgrammarUri: 'builtin:dtmf/digits',\n languageCode: 'en-US',\n lastResortUrl: 'D:\\\\\\\\Program Files (x86)\\\\\\\\Intervoice\\\\Media Server for VOIP\\\\\\\\APPL\\\\\\\\CSIURLROUTER\\\\\\\\lastresort.vxml',\n voiceName: 'en-US-Wavenet-F',\n prosodyRate: '1.0',\n confidencelevel: 0.01,\n sensitivity: 0.5,\n completetimeout: '1s',\n incompletetimeout: '1s',\n maxspeechtimeout: '15s',\n timeout: '15s',\n privatedata: false,\n bargein: false,\n processingSoundUrl: 'https://ivastudio.ai/media-file/5009635/2af2ba0f-3222-485d-bb60-4ed4f8883545.wav',\n dtmf: {\n interdigittimeout: '5s',\n termtimeout: '0s',\n termchar: '#'\n },\n vars: []\n }, options, options?.recognizedData?.ivrSettings);\n const xml = {\n 'vxml': {\n '$': {\n 'version': '2.1',\n 'xmlns': 'http://www.w3.org/2001/vxml',\n 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',\n 'xsi:schemaLocation': 'http://www.w3.org/2001/vxml http://www.w3.org/TR/2007/REC-voicexml21-20070619/vxml.xsd'\n },\n 'property': [],\n 'var': [{\n '$': {\n 'name': 'utterance'\n }\n }, {\n '$': {\n 'name': 'confidence'\n }\n }, {\n '$': {\n 'name': 'inputmode'\n }\n }, {\n '$': {\n 'name': 'interpretation'\n }\n }, {\n '$': {\n 'name': 'errorCount',\n 'expr': '0'\n }\n }, {\n '$': {\n 'name': 'message'\n }\n }, {\n '$': {\n 'name': 'event'\n }\n }],\n 'script': [\"\\n setProperty(\\\"com.ivb.tts.request_id\\\", session.connection.log.callid)\\n \"],\n 'form': [{\n '$': {\n 'id': 'main'\n },\n 'property': [{\n '$': {\n 'name': 'confidencelevel'\n }\n }, {\n '$': {\n 'name': 'sensitivity'\n }\n }, {\n '$': {\n 'name': 'completetimeout'\n }\n }, {\n '$': {\n 'name': 'incompletetimeout'\n }\n }, {\n '$': {\n 'name': 'maxspeechtimeout'\n }\n }, {\n '$': {\n 'name': 'timeout'\n }\n }, {\n '$': {\n 'name': 'recordutterance',\n 'value': 'true'\n }\n }, {\n '$': {\n 'name': 'recordutterancetype',\n 'value': 'audio/x-wav'\n }\n }, {\n '$': {\n 'name': 'com.intervoice.log.privatedata'\n }\n }, {\n '$': {\n 'name': 'interdigittimeout'\n }\n }, {\n '$': {\n 'name': 'termtimeout'\n }\n }],\n 'block': [],\n 'field': [{\n '$': {\n 'name': 'intent'\n },\n 'grammar': [{\n '$': {\n 'srcexpr': 'grammarUri'\n }\n }, {\n '$': {\n 'srcexpr': 'dtmfgrammarUri'\n }\n }],\n 'prompt': [],\n 'filled': [{\n 'goto': [{\n '$': {\n 'next': '#exit'\n }\n }]\n }]\n }]\n }, {\n '$': {\n 'id': 'exit'\n },\n 'property': [],\n 'block': [{\n 'if': [{\n '$': {\n 'cond': \"typeof(application.lastresult$) != 'undefined'\"\n },\n 'if': [{\n '$': {\n 'cond': \"typeof(application.lastresult$[0]) != 'undefined'\"\n },\n 'assign': [{\n '$': {\n 'name': 'inputmode',\n 'expr': 'application.lastresult$[0].inputmode'\n }\n }, {\n '$': {\n 'name': 'confidence',\n 'expr': 'application.lastresult$[0].confidence'\n }\n }, {\n '$': {\n 'name': 'utterance',\n 'expr': 'application.lastresult$[0].utterance'\n }\n }],\n 'if': [{\n '$': {\n 'cond': \"typeof(application.lastresult$[0].interpretation) == 'object'\"\n },\n 'throw': [{\n '$': {\n 'event': 'error.interpretation',\n 'message': 'The semantic result returned an object.'\n }\n }],\n 'else': [''],\n 'assign': [{\n '$': {\n 'name': 'interpretation',\n 'expr': 'application.lastresult$[0].interpretation'\n }\n }]\n }],\n 'var': [{\n '$': {\n 'name': 'waveform',\n 'expr': 'application.lastresult$.waveform'\n }\n }]\n }],\n 'else': [''],\n 'throw': [{\n '$': {\n 'event': 'nomatch'\n }\n }]\n }],\n 'submit': [{\n '$': {\n 'method': 'post',\n 'fetchtimeout': \"16s\",\n 'expr': 'loopUrl',\n 'namelist': 'sessionId confidence inputmode utterance interpretation recognizerRequestID waveform'.concat(...parameters.vars.map(v => {\n return ` ${v.$.name}`;\n }))\n }\n }]\n }]\n }],\n 'noinput': [{\n 'submit': [{\n '$': {\n 'method': 'post',\n 'expr': 'noinputUrl',\n 'namelist': 'sessionId recognizerRequestID'\n }\n }]\n }],\n 'nomatch': [{\n 'submit': [{\n '$': {\n 'method': 'post',\n 'expr': 'nomatchUrl',\n 'namelist': 'sessionId recognizerRequestID'\n }\n }]\n }],\n 'catch': [{\n '$': {\n 'event': 'maxspeechtimeout'\n },\n 'submit': [{\n '$': {\n 'method': 'post',\n 'expr': 'maxspeechtimeoutUrl',\n 'namelist': 'sessionId recognizerRequestID'\n }\n }]\n }, {\n '$': {\n 'event': 'connection.disconnect'\n },\n 'assign': [{\n '$': {\n 'name': 'message',\n 'expr': '_message'\n }\n }, {\n '$': {\n 'name': 'event',\n 'expr': '_event'\n }\n }],\n 'submit': [{\n '$': {\n 'method': 'post',\n 'expr': 'stopUrl',\n 'namelist': 'sessionId message event'\n }\n }]\n }, {\n '$': {\n 'event': 'error'\n },\n 'assign': [{\n '$': {\n 'name': 'errorCount',\n 'expr': 'errorCount + 1'\n }\n }, {\n '$': {\n 'name': 'message',\n 'expr': '_message'\n }\n }, {\n '$': {\n 'name': 'event',\n 'expr': '_event'\n }\n }],\n 'if': [{\n '$': {\n 'cond': 'errorCount > 3'\n },\n 'log': [{\n '_': 'Tranfer of last resort: sessionId: ,\\n\\t\\tevent: , message: .',\n '$': {\n 'label': 'error'\n },\n 'value': [{\n '$': {\n 'expr': 'sessionId'\n }\n }, {\n '$': {\n 'expr': '_event'\n }\n }, {\n '$': {\n 'expr': '_message'\n }\n }]\n }],\n 'goto': [{\n '$': {\n 'expr': 'lastResortUrl'\n }\n }]\n }],\n 'submit': [{\n '$': {\n 'method': 'post',\n 'expr': 'errorUrl',\n 'namelist': 'sessionId message event'\n }\n }]\n }]\n }\n };\n parameters.rmodel = parameters.rmodel || {\n 'languageCode': parameters.languageCode,\n 'maxAlternatives': 1,\n 'model': 'phone_call',\n 'useEnhanced': true,\n 'speechContexts': []\n };\n parameters.suffix = parameters.suffix && `_${parameters.suffix}` || '';\n if (parameters.recognizedData && parameters.recognizedData.expectedPhrases) {\n parameters.rmodel.speechContexts = [{\n phrases: parameters.recognizedData.expectedPhrases\n }];\n }\n xml.vxml.$['xml:lang'] = parameters.languageCode;\n xml.vxml.property.push({\n '$': {\n 'name': 'com.ivb.asr.application_name',\n 'value': parameters.applicationName || `${parameters.workspaceId}_VerintVXML`\n }\n }, {\n '$': {\n 'name': 'com.ivb.asr.dialog_name',\n 'value': parameters.dialogName\n // 'value': parameters?.dialogName ?? (recognizedData?.answers?.join(\";:;\") || \"EMPTY\").substring(0, 100)\n }\n }, {\n '$': {\n 'name': 'com.ivb.asr.request_id',\n 'value': parameters.requestId\n }\n }, {\n '$': {\n 'name': 'com.ivb.tts.application_name',\n 'value': parameters.applicationName || `${parameters.workspaceId}_VerintVXML`\n }\n }, {\n '$': {\n 'name': 'com.ivb.tts.dialog_name',\n 'value': parameters.dialogName\n }\n }, {\n '$': {\n 'name': 'com.ivb.tts.Voice-Engine',\n 'value': 'google'\n }\n }, {\n '$': {\n 'name': 'com.ivb.tts.Voice-Name',\n 'value': parameters.voiceName\n }\n }, {\n '$': {\n 'name': 'com.ivb.tts.Prosody-Rate',\n 'value': parameters.prosodyRate\n }\n });\n if (parameters.processingSoundUrl) {\n xml.vxml.property.push({\n '$': {\n 'name': 'fetchaudio',\n 'value': parameters.processingSoundUrl\n }\n }, {\n '$': {\n 'name': 'fetchaudiodelay',\n 'value': '1s'\n }\n }, {\n '$': {\n 'name': 'fetchaudiominimum',\n 'value': '1s'\n }\n });\n }\n xml.vxml.var.unshift({\n '$': {\n 'name': 'sessionId',\n 'expr': `'${parameters.sessionId}'`\n }\n }, {\n '$': {\n 'name': 'recognizerRequestID',\n 'expr': `'${parameters.requestId}'`\n }\n }, {\n '$': {\n 'name': 'grammarUri',\n 'expr': parameters.grammarUri ? `'${parameters.grammarUri}'` : `'builtin:speech/transcribe?rname=Google;rmodel=${encodeURIComponent(JSON.stringify(parameters.rmodel))}'`\n }\n }, {\n '$': {\n 'name': 'dtmfgrammarUri',\n 'expr': `'${parameters.dtmfgrammarUri}'`\n }\n }, {\n '$': {\n 'name': 'noinputUrl',\n 'expr': `'${parameters.noinputUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_loop${parameters.suffix}/noinput`}'`\n }\n }, {\n '$': {\n 'name': 'nomatchUrl',\n 'expr': `'${parameters.nomatchUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_loop${parameters.suffix}/nomatch`}'`\n }\n }, {\n '$': {\n 'name': 'loopUrl',\n 'expr': `'${parameters.loopUr || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_loop${parameters.suffix}`}'`\n }\n }, {\n '$': {\n 'name': 'errorUrl',\n // 'expr': `'${parameters.errorUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_error${parameters.suffix}`}'`\n 'expr': `'${parameters.stopUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_stop${parameters.suffix}`}'`\n }\n }, {\n '$': {\n 'name': 'lastResortUrl',\n 'expr': `'${parameters.lastResortUrl}'`\n }\n }, {\n '$': {\n 'name': 'stopUrl',\n 'expr': `'${parameters.stopUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_stop${parameters.suffix}`}'`\n }\n }, {\n '$': {\n 'name': 'maxspeechtimeoutUrl',\n 'expr': `'${parameters.maxspeechtimeoutUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_loop${parameters.suffix}/maxspeechtimeout`}'`\n }\n });\n parameters.vars.forEach(v => {\n xml.vxml.var.unshift(v);\n });\n xml.vxml.form = xml.vxml.form.map(f => {\n switch (f.$.id) {\n case 'main':\n if (f.property) {\n f.property = f.property.map(p => {\n switch (p.$.name) {\n case 'confidencelevel':\n p.$.value = parameters.confidencelevel;\n break;\n case 'sensitivity':\n p.$.value = parameters.sensitivity;\n break;\n case 'completetimeout':\n p.$.value = parameters.completetimeout;\n break;\n case 'incompletetimeout':\n p.$.value = parameters.incompletetimeout;\n break;\n case 'maxspeechtimeout':\n p.$.value = parameters.maxspeechtimeout;\n break;\n case 'timeout':\n p.$.value = parameters.timeout;\n break;\n case 'com.intervoice.log.privatedata':\n p.$.value = parameters.privatedata;\n break;\n case 'interdigittimeout':\n p.$.value = parameters.dtmf.interdigittimeout;\n break;\n case 'termtimeout':\n p.$.value = parameters.dtmf.termtimeout;\n break;\n }\n return p;\n });\n }\n if (parameters.disconnect) {\n const obj = {};\n if (parameters.promptAudio) {\n obj.prompt = [];\n if (Array.isArray(parameters.promptAudio)) {\n obj.prompt.push(...parameters.promptAudio.map(audio => {\n return {\n $: {\n bargein: parameters.bargein\n },\n audio: [{\n $: {\n src: audio\n }\n }]\n };\n }));\n } else {\n obj.prompt.push({\n $: {\n bargein: parameters.bargein\n },\n audio: [{\n $: {\n src: parameters.promptAudio\n }\n }]\n });\n }\n } else if (parameters.promptText) {\n obj.prompt = {\n _: parameters.promptText,\n $: {\n bargein: parameters.bargein\n }\n };\n } else if (parameters.promptMixed) {\n obj.prompt = parameters.promptMixed.map(prompt => {\n const obj = {\n $: {\n bargein: parameters.bargein\n }\n };\n if (prompt.url) {\n obj.audio = [{\n $: {\n src: prompt.url\n }\n }];\n } else {\n obj._ = prompt.text;\n }\n return obj;\n });\n }\n obj.submit = {\n $: {\n method: 'post',\n expr: 'stopUrl',\n namelist: 'sessionId'\n }\n };\n f.block = (f.block || []).concat(obj);\n }\n if (f.field) {\n f.field = f.field.map(f => {\n switch (f.$.name) {\n case 'intent':\n if (parameters.promptAudio) {\n f.prompt = [];\n if (Array.isArray(parameters.promptAudio)) {\n f.prompt.push(...parameters.promptAudio.map(audio => {\n return {\n $: {\n bargein: parameters.bargein\n },\n audio: [{\n $: {\n src: audio\n }\n }]\n };\n }));\n } else {\n f.prompt.push({\n $: {\n bargein: parameters.bargein\n },\n audio: [{\n $: {\n src: parameters.promptAudio\n }\n }]\n });\n }\n } else if (parameters.promptText) {\n f.prompt = {\n '_': parameters.promptText,\n '$': {\n bargein: parameters.bargein\n }\n };\n } else if (parameters.promptMixed) {\n f.prompt = parameters.promptMixed.map(prompt => {\n const obj = {\n $: {\n bargein: parameters.bargein\n }\n };\n if (prompt.url) {\n obj.audio = [{\n $: {\n src: prompt.url\n }\n }];\n } else {\n obj._ = prompt.text;\n }\n return obj;\n });\n }\n break;\n }\n return f;\n });\n }\n break;\n }\n return f;\n });\n return builder.buildObject(xml);\n},\nstop: options => {\n const parameters = _.merge({\n processingSoundUrl: 'https://ivastudio.ai/media-file/5009635/2af2ba0f-3222-485d-bb60-4ed4f8883545.wav',\n terminationObject: {\n type: 'DISCONNECT'\n }\n }, options);\n parameters.suffix = parameters.suffix && `_${parameters.suffix}` || '';\n const xml = {\n 'vxml': {\n '$': {\n 'version': '2.1',\n 'xmlns': 'http://www.w3.org/2001/vxml',\n 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',\n 'xsi:schemaLocation': 'http://www.w3.org/2001/vxml http://www.w3.org/TR/2007/REC-voicexml21-20070619/vxml.xsd'\n },\n 'property': [],\n 'var': [],\n 'form': [{\n 'var': [],\n 'block': []\n }]\n }\n };\n if (parameters.useLoop) {\n xml.vxml.property.push({\n '$': {\n 'name': 'fetchaudio',\n 'value': parameters.processingSoundUrl\n }\n }, {\n '$': {\n 'name': 'fetchaudiodelay',\n 'value': '1s'\n }\n }, {\n '$': {\n 'name': 'fetchaudiominimum',\n 'value': '1s'\n }\n });\n xml.vxml.var.push({\n '$': {\n 'name': 'stopUrl',\n 'expr': `'${parameters.stopUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_stop${parameters.suffix}`}'`\n }\n }, {\n $: {\n name: 'sessionId',\n expr: `'${parameters.sessionId}'`\n }\n }, {\n $: {\n name: 'looped',\n expr: true\n }\n });\n xml.vxml.form[0].block[0] = {\n submit: {\n $: {\n method: 'post',\n expr: 'stopUrl',\n namelist: 'sessionId looped'\n }\n }\n };\n } else {\n switch (parameters.terminationObject.type) {\n case 'RETURN':\n {\n xml.vxml.form[0].block[0] = {\n 'return': {}\n };\n if (parameters.terminationObject.data) {\n xml.vxml.form[0].var.push({\n $: {\n name: '_aai',\n expr: `'${parameters.terminationObject.data}'`\n }\n });\n xml.vxml.form[0].block[0].return.$ = {\n namelist: '_aai'\n };\n }\n break;\n }\n case 'TRANSFER':\n {\n if (parameters.terminationObject.destination) {\n xml.vxml.form[0].transfer = {\n $: {\n type: 'blind',\n dest: parameters.terminationObject.destination\n }\n };\n xml.vxml.catch = [{\n '$': {\n event: 'connection.disconnect'\n },\n 'return': {}\n }];\n }\n break;\n }\n case 'GOTO':\n xml.vxml.form[0].block[0] = {\n 'submit': {\n $: {\n next: parameters.terminationObject.url,\n namelist: Object.keys(parameters.terminationObject.vars).join(' '),\n method: 'post'\n }\n }\n };\n for (const [key, value] of Object.entries(parameters.terminationObject.vars)) {\n xml.vxml.form[0].var.push({\n $: {\n name: key,\n expr: value\n }\n });\n }\n break;\n default:\n xml.vxml.form[0].block[0] = {\n disconnect: {}\n };\n }\n }\n const builder = new xml2js.Builder();\n return builder.buildObject(xml);\n},\nannounce: options => {\n const builder = new xml2js.Builder();\n const parameters = _.merge({\n dialogName: 'test_dialog',\n languageCode: 'en-US',\n lastResortUrl: 'D:\\\\\\\\Program Files (x86)\\\\\\\\Intervoice\\\\Media Server for VOIP\\\\\\\\APPL\\\\\\\\CSIURLROUTER\\\\\\\\lastresort.vxml',\n voiceName: 'en-US-Wavenet-F',\n prosodyRate: '1.0',\n privatedata: false,\n fetchtimout: \"35s\",\n processingSoundUrl: 'https://ivastudio.ai/media-file/5009635/4b11d97f-3b02-4746-8482-a7375f78a8a2.wav',\n vars: []\n }, options, options?.recognizedData?.ivrSettings);\n const xml = {\n 'vxml': {\n '$': {\n 'version': '2.1',\n 'xmlns': 'http://www.w3.org/2001/vxml',\n 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',\n 'xsi:schemaLocation': 'http://www.w3.org/2001/vxml http://www.w3.org/TR/2007/REC-voicexml21-20070619/vxml.xsd'\n },\n 'property': [],\n 'var': [{\n '$': {\n 'name': 'errorCount',\n 'expr': '0'\n }\n }, {\n '$': {\n 'name': 'message'\n }\n }, {\n '$': {\n 'name': 'event'\n }\n }],\n 'script': [\"\\n setProperty(\\\"com.ivb.tts.request_id\\\", session.connection.log.callid)\\n \"],\n 'form': [{\n '$': {\n 'id': 'main'\n },\n 'property': [{\n '$': {\n 'name': 'com.intervoice.log.privatedata'\n }\n }],\n 'block': [{\n '$': {\n 'name': 'announce'\n },\n 'prompt': [{\n '_': parameters.promptText,\n '$': {\n bargein: false\n }\n }]\n }]\n }, {\n '$': {\n 'id': 'exit'\n },\n 'property': [],\n 'block': [{\n 'submit': [{\n '$': {\n 'method': 'post',\n 'fetchtimeout': parameters.fetchtimout,\n 'expr': 'loopUrl',\n 'namelist': 'sessionId'\n }\n }]\n }],\n 'catch': [{\n '$': {\n 'event': 'error.badfetch.timeout'\n },\n 'submit': [{\n '$': {\n 'method': 'post',\n 'expr': 'loopUrl',\n 'namelist': 'sessionId'\n }\n }]\n }]\n }],\n 'catch': [{\n '$': {\n 'event': 'connection.disconnect'\n },\n 'assign': [{\n '$': {\n 'name': 'message',\n 'expr': '_message'\n }\n }, {\n '$': {\n 'name': 'event',\n 'expr': '_event'\n }\n }],\n 'submit': [{\n '$': {\n 'method': 'post',\n 'expr': 'stopUrl',\n 'namelist': 'sessionId message event'\n }\n }]\n }, {\n '$': {\n 'event': 'error'\n },\n 'assign': [{\n '$': {\n 'name': 'errorCount',\n 'expr': 'errorCount + 1'\n }\n }, {\n '$': {\n 'name': 'message',\n 'expr': '_message'\n }\n }, {\n '$': {\n 'name': 'event',\n 'expr': '_event'\n }\n }],\n 'if': [{\n '$': {\n 'cond': 'errorCount > 3'\n },\n 'log': [{\n '_': 'Transfer of last resort: sessionId: ,\\n\\t\\tevent: , message: .',\n '$': {\n 'label': 'error'\n },\n 'value': [{\n '$': {\n 'expr': 'sessionId'\n }\n }, {\n '$': {\n 'expr': '_event'\n }\n }, {\n '$': {\n 'expr': '_message'\n }\n }]\n }],\n 'goto': [{\n '$': {\n 'expr': 'lastResortUrl'\n }\n }]\n }],\n 'submit': [{\n '$': {\n 'method': 'post',\n 'expr': 'errorUrl',\n 'namelist': 'sessionId message event'\n }\n }]\n }]\n }\n };\n parameters.suffix = parameters.suffix && `_${parameters.suffix}` || '';\n xml.vxml.$['xml:lang'] = parameters.languageCode;\n xml.vxml.property.push({\n '$': {\n 'name': 'com.ivb.tts.application_name',\n 'value': parameters.applicationName || `${parameters.workspaceId}_VerintVXML`\n }\n }, {\n '$': {\n 'name': 'com.ivb.tts.dialog_name',\n 'value': parameters.dialogName\n }\n }, {\n '$': {\n 'name': 'com.ivb.tts.Voice-Engine',\n 'value': 'google'\n }\n }, {\n '$': {\n 'name': 'com.ivb.tts.Voice-Name',\n 'value': parameters.voiceName\n }\n }, {\n '$': {\n 'name': 'com.ivb.tts.Prosody-Rate',\n 'value': parameters.prosodyRate\n }\n });\n if (parameters.processingSoundUrl) {\n xml.vxml.property.push({\n '$': {\n 'name': 'fetchaudio',\n 'value': parameters.processingSoundUrl\n }\n }, {\n '$': {\n 'name': 'fetchaudiodelay',\n 'value': '1s'\n }\n }, {\n '$': {\n 'name': 'fetchaudiominimum',\n 'value': '1s'\n }\n });\n }\n xml.vxml.var.unshift({\n '$': {\n 'name': 'sessionId',\n 'expr': `'${parameters.sessionId}'`\n }\n }, {\n '$': {\n 'name': 'recognizerRequestID',\n 'expr': `'${parameters.requestId}'`\n }\n }, {\n '$': {\n 'name': 'loopUrl',\n 'expr': `'${parameters.loopUr || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_loop${parameters.suffix}`}'`\n }\n }, {\n '$': {\n 'name': 'errorUrl',\n // 'expr': `'${parameters.errorUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_error${parameters.suffix}`}'`\n 'expr': `'${parameters.stopUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_stop${parameters.suffix}`}'`\n }\n }, {\n '$': {\n 'name': 'lastResortUrl',\n 'expr': `'${parameters.lastResortUrl}'`\n }\n }, {\n '$': {\n 'name': 'stopUrl',\n 'expr': `'${parameters.stopUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_stop${parameters.suffix}`}'`\n }\n });\n xml.vxml.form = xml.vxml.form.map(f => {\n switch (f.$.id) {\n case 'main':\n if (f.property) {\n f.property = f.property.map(p => {\n switch (p.$.name) {\n case 'com.intervoice.log.privatedata':\n p.$.value = parameters.privatedata;\n break;\n }\n return p;\n });\n }\n const obj = {};\n if (parameters.disconnect) {\n obj.submit = {\n $: {\n method: 'post',\n expr: 'stopUrl',\n namelist: 'sessionId'\n }\n };\n } else {\n obj.goto = [{\n '$': {\n 'next': '#exit'\n }\n }];\n }\n f.block = (f.block || []).concat(obj);\n break;\n }\n return f;\n });\n return builder.buildObject(xml);\n},\nannounce2: options => {\n const builder = new xml2js.Builder();\n const parameters = _.merge({\n dialogName: 'test_dialog',\n dtmfgrammarUri: 'builtin:dtmf/digits',\n languageCode: 'en-US',\n lastResortUrl: 'D:\\\\\\\\Program Files (x86)\\\\\\\\Intervoice\\\\Media Server for VOIP\\\\\\\\APPL\\\\\\\\CSIURLROUTER\\\\\\\\lastresort.vxml',\n voiceName: 'en-US-Wavenet-F',\n fetchtimeout: \"35s\",\n prosodyRate: '1.0',\n confidencelevel: 0.01,\n sensitivity: 0.5,\n completetimeout: '1s',\n incompletetimeout: '1s',\n maxspeechtimeout: '15s',\n timeout: '1s',\n privatedata: false,\n bargein: false,\n processingSoundUrl: 'https://ivastudio.ai/media-file/5009635/4b11d97f-3b02-4746-8482-a7375f78a8a2.wav',\n dtmf: {\n interdigittimeout: '5s',\n termtimeout: '0s',\n termchar: '#'\n },\n vars: []\n }, options, options?.recognizedData?.ivrSettings);\n parameters.timeout = \"1s\";\n const xml = {\n 'vxml': {\n '$': {\n 'version': '2.1',\n 'xmlns': 'http://www.w3.org/2001/vxml',\n 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',\n 'xsi:schemaLocation': 'http://www.w3.org/2001/vxml http://www.w3.org/TR/2007/REC-voicexml21-20070619/vxml.xsd'\n },\n 'property': [],\n 'var': [{\n '$': {\n 'name': 'utterance'\n }\n }, {\n '$': {\n 'name': 'confidence'\n }\n }, {\n '$': {\n 'name': 'inputmode'\n }\n }, {\n '$': {\n 'name': 'interpretation'\n }\n }, {\n '$': {\n 'name': 'errorCount',\n 'expr': '0'\n }\n }, {\n '$': {\n 'name': 'message'\n }\n }, {\n '$': {\n 'name': 'event'\n }\n }],\n 'script': [\"\\n setProperty(\\\"com.ivb.tts.request_id\\\", session.connection.log.callid)\\n \"],\n 'form': [{\n '$': {\n 'id': 'main'\n },\n 'property': [{\n '$': {\n 'name': 'confidencelevel'\n }\n }, {\n '$': {\n 'name': 'sensitivity'\n }\n }, {\n '$': {\n 'name': 'completetimeout'\n }\n }, {\n '$': {\n 'name': 'incompletetimeout'\n }\n }, {\n '$': {\n 'name': 'maxspeechtimeout'\n }\n }, {\n '$': {\n 'name': 'timeout'\n }\n }, {\n '$': {\n 'name': 'recordutterance',\n 'value': 'true'\n }\n }, {\n '$': {\n 'name': 'recordutterancetype',\n 'value': 'audio/x-wav'\n }\n }, {\n '$': {\n 'name': 'com.intervoice.log.privatedata'\n }\n }, {\n '$': {\n 'name': 'interdigittimeout'\n }\n }, {\n '$': {\n 'name': 'termtimeout'\n }\n }],\n 'block': [],\n 'field': [{\n '$': {\n 'name': 'intent'\n },\n 'grammar': [{\n '$': {\n 'srcexpr': 'grammarUri'\n }\n }, {\n '$': {\n 'srcexpr': 'dtmfgrammarUri'\n }\n }],\n 'prompt': [],\n 'filled': [{\n 'goto': [{\n '$': {\n 'next': '#exit'\n }\n }]\n }]\n }]\n }, {\n '$': {\n 'id': 'exit'\n },\n 'property': [],\n 'block': [{\n 'submit': [{\n '$': {\n 'method': 'post',\n 'fetchtimeout': parameters.fetchtimeout,\n 'expr': 'loopUrl',\n 'namelist': 'sessionId'\n }\n }]\n }]\n }],\n 'noinput': [{\n 'goto': [{\n '$': {\n 'next': '#exit'\n }\n }]\n }],\n 'nomatch': [{\n 'goto': [{\n '$': {\n 'next': '#exit'\n }\n }]\n }],\n 'catch': [{\n '$': {\n 'event': 'maxspeechtimeout'\n },\n 'submit': [{\n '$': {\n 'method': 'post',\n 'expr': 'maxspeechtimeoutUrl',\n 'namelist': 'sessionId recognizerRequestID'\n }\n }]\n }, {\n '$': {\n 'event': 'connection.disconnect'\n },\n 'assign': [{\n '$': {\n 'name': 'message',\n 'expr': '_message'\n }\n }, {\n '$': {\n 'name': 'event',\n 'expr': '_event'\n }\n }],\n 'submit': [{\n '$': {\n 'method': 'post',\n 'expr': 'stopUrl',\n 'namelist': 'sessionId message event'\n }\n }]\n }, {\n '$': {\n 'event': 'error'\n },\n 'assign': [{\n '$': {\n 'name': 'errorCount',\n 'expr': 'errorCount + 1'\n }\n }, {\n '$': {\n 'name': 'message',\n 'expr': '_message'\n }\n }, {\n '$': {\n 'name': 'event',\n 'expr': '_event'\n }\n }],\n 'if': [{\n '$': {\n 'cond': 'errorCount > 3'\n },\n 'log': [{\n '_': 'Tranfer of last resort: sessionId: ,\\n\\t\\tevent: , message: .',\n '$': {\n 'label': 'error'\n },\n 'value': [{\n '$': {\n 'expr': 'sessionId'\n }\n }, {\n '$': {\n 'expr': '_event'\n }\n }, {\n '$': {\n 'expr': '_message'\n }\n }]\n }],\n 'goto': [{\n '$': {\n 'expr': 'lastResortUrl'\n }\n }]\n }],\n 'submit': [{\n '$': {\n 'method': 'post',\n 'expr': 'errorUrl',\n 'namelist': 'sessionId message event'\n }\n }]\n }]\n }\n };\n parameters.rmodel = parameters.rmodel || {\n 'languageCode': parameters.languageCode,\n 'maxAlternatives': 1,\n 'model': 'phone_call',\n 'useEnhanced': true,\n 'speechContexts': []\n };\n parameters.suffix = parameters.suffix && `_${parameters.suffix}` || '';\n if (parameters.recognizedData && parameters.recognizedData.expectedPhrases) {\n parameters.rmodel.speechContexts = [{\n phrases: parameters.recognizedData.expectedPhrases\n }];\n }\n xml.vxml.$['xml:lang'] = parameters.languageCode;\n xml.vxml.property.push({\n '$': {\n 'name': 'com.ivb.asr.application_name',\n 'value': parameters.applicationName || `${parameters.workspaceId}_VerintVXML`\n }\n }, {\n '$': {\n 'name': 'com.ivb.asr.dialog_name',\n 'value': parameters.dialogName\n // 'value': parameters?.dialogName ?? (recognizedData?.answers?.join(\";:;\") || \"EMPTY\").substring(0, 100)\n }\n }, {\n '$': {\n 'name': 'com.ivb.asr.request_id',\n 'value': parameters.requestId\n }\n }, {\n '$': {\n 'name': 'com.ivb.tts.application_name',\n 'value': parameters.applicationName || `${parameters.workspaceId}_VerintVXML`\n }\n }, {\n '$': {\n 'name': 'com.ivb.tts.dialog_name',\n 'value': parameters.dialogName\n }\n }, {\n '$': {\n 'name': 'com.ivb.tts.Voice-Engine',\n 'value': 'google'\n }\n }, {\n '$': {\n 'name': 'com.ivb.tts.Voice-Name',\n 'value': parameters.voiceName\n }\n }, {\n '$': {\n 'name': 'com.ivb.tts.Prosody-Rate',\n 'value': parameters.prosodyRate\n }\n });\n if (parameters.processingSoundUrl) {\n xml.vxml.property.push({\n '$': {\n 'name': 'fetchaudio',\n 'value': parameters.processingSoundUrl\n }\n }, {\n '$': {\n 'name': 'fetchaudiodelay',\n 'value': '1s'\n }\n }, {\n '$': {\n 'name': 'fetchaudiominimum',\n 'value': '1s'\n }\n });\n }\n xml.vxml.var.unshift({\n '$': {\n 'name': 'sessionId',\n 'expr': `'${parameters.sessionId}'`\n }\n }, {\n '$': {\n 'name': 'recognizerRequestID',\n 'expr': `'${parameters.requestId}'`\n }\n }, {\n '$': {\n 'name': 'grammarUri',\n 'expr': parameters.grammarUri ? `'${parameters.grammarUri}'` : `'builtin:speech/transcribe?rname=Google;rmodel=${encodeURIComponent(JSON.stringify(parameters.rmodel))}'`\n }\n }, {\n '$': {\n 'name': 'dtmfgrammarUri',\n 'expr': `'${parameters.dtmfgrammarUri}'`\n }\n }, {\n '$': {\n 'name': 'noinputUrl',\n 'expr': `'${parameters.noinputUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_loop${parameters.suffix}/noinput`}'`\n }\n }, {\n '$': {\n 'name': 'nomatchUrl',\n 'expr': `'${parameters.nomatchUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_loop${parameters.suffix}/nomatch`}'`\n }\n }, {\n '$': {\n 'name': 'loopUrl',\n 'expr': `'${parameters.loopUr || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_loop${parameters.suffix}`}'`\n }\n }, {\n '$': {\n 'name': 'errorUrl',\n // 'expr': `'${parameters.errorUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_error${parameters.suffix}`}'`\n 'expr': `'${parameters.stopUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_stop${parameters.suffix}`}'`\n }\n }, {\n '$': {\n 'name': 'lastResortUrl',\n 'expr': `'${parameters.lastResortUrl}'`\n }\n }, {\n '$': {\n 'name': 'stopUrl',\n 'expr': `'${parameters.stopUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_stop${parameters.suffix}`}'`\n }\n }, {\n '$': {\n 'name': 'maxspeechtimeoutUrl',\n 'expr': `'${parameters.maxspeechtimeoutUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_loop${parameters.suffix}/maxspeechtimeout`}'`\n }\n });\n parameters.vars.forEach(v => {\n xml.vxml.var.unshift(v);\n });\n xml.vxml.form = xml.vxml.form.map(f => {\n switch (f.$.id) {\n case 'main':\n if (f.property) {\n f.property = f.property.map(p => {\n switch (p.$.name) {\n case 'confidencelevel':\n p.$.value = parameters.confidencelevel;\n break;\n case 'sensitivity':\n p.$.value = parameters.sensitivity;\n break;\n case 'completetimeout':\n p.$.value = parameters.completetimeout;\n break;\n case 'incompletetimeout':\n p.$.value = parameters.incompletetimeout;\n break;\n case 'maxspeechtimeout':\n p.$.value = parameters.maxspeechtimeout;\n break;\n case 'timeout':\n p.$.value = parameters.timeout;\n break;\n case 'com.intervoice.log.privatedata':\n p.$.value = parameters.privatedata;\n break;\n case 'interdigittimeout':\n p.$.value = parameters.dtmf.interdigittimeout;\n break;\n case 'termtimeout':\n p.$.value = parameters.dtmf.termtimeout;\n break;\n }\n return p;\n });\n }\n if (parameters.disconnect) {\n const obj = {};\n if (parameters.promptAudio) {\n obj.prompt = [];\n if (Array.isArray(parameters.promptAudio)) {\n obj.prompt.push(...parameters.promptAudio.map(audio => {\n return {\n $: {\n bargein: parameters.bargein\n },\n audio: [{\n $: {\n src: audio\n }\n }]\n };\n }));\n } else {\n obj.prompt.push({\n $: {\n bargein: parameters.bargein\n },\n audio: [{\n $: {\n src: parameters.promptAudio\n }\n }]\n });\n }\n } else if (parameters.promptText) {\n obj.prompt = {\n _: parameters.promptText,\n $: {\n bargein: parameters.bargein\n }\n };\n } else if (parameters.promptMixed) {\n obj.prompt = parameters.promptMixed.map(prompt => {\n const obj = {\n $: {\n bargein: parameters.bargein\n }\n };\n if (prompt.url) {\n obj.audio = [{\n $: {\n src: prompt.url\n }\n }];\n } else {\n obj._ = prompt.text;\n }\n return obj;\n });\n }\n obj.submit = {\n $: {\n method: 'post',\n expr: 'stopUrl',\n namelist: 'sessionId'\n }\n };\n f.block = (f.block || []).concat(obj);\n }\n if (f.field) {\n f.field = f.field.map(f => {\n switch (f.$.name) {\n case 'intent':\n if (parameters.promptAudio) {\n f.prompt = [];\n if (Array.isArray(parameters.promptAudio)) {\n f.prompt.push(...parameters.promptAudio.map(audio => {\n return {\n $: {\n bargein: parameters.bargein\n },\n audio: [{\n $: {\n src: audio\n }\n }]\n };\n }));\n } else {\n f.prompt.push({\n $: {\n bargein: parameters.bargein\n },\n audio: [{\n $: {\n src: parameters.promptAudio\n }\n }]\n });\n }\n } else if (parameters.promptText) {\n f.prompt = {\n '_': parameters.promptText,\n '$': {\n bargein: parameters.bargein\n }\n };\n } else if (parameters.promptMixed) {\n f.prompt = parameters.promptMixed.map(prompt => {\n const obj = {\n $: {\n bargein: parameters.bargein\n }\n };\n if (prompt.url) {\n obj.audio = [{\n $: {\n src: prompt.url\n }\n }];\n } else {\n obj._ = prompt.text;\n }\n return obj;\n });\n }\n break;\n }\n return f;\n });\n }\n break;\n }\n return f;\n });\n return builder.buildObject(xml);\n}\n};","parameters":"","returnsContextObject":false,"organizationId":null,"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227476,"_vc":{"branch":"current","operation":"create","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODZk","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5NTU4YzllYjA3MzRjODkyMDE4","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5NTVkMDM3ZjMzNGIyZTZiMWI4"},"updatedAt":1748531541999,"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl"}}],"proxyScripts":[{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODcx","route":"vxml_error_6647ad7b84df93835bbb4346","description":"","content":"console.log(req.body); // <- Post request body\nconsole.log(res.query); // <- Query strings\nconst vxmlResponse = `\n\n
\n \n An error has occurred\n \n \n
\n
`;\nres.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0');\nres.setHeader('etag', nanoid());\nres.type('text/xml');\nres.send(vxmlResponse);","cache":false,"workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"enabled":true,"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227498,"_vc":{"branch":"current","operation":"update","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODZm","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5NTU4YzllYjA3MzRjODkyMDBm","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5NTVkMDM3ZjMzNGIyZTZiMWI4"},"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl","updatedAt":1748531541919},"endpoint":"https://router.ivastudio.verint.live/ProxyScript/run/67d183b64afbdf930f4b3863/current/vxml_error_6647ad7b84df93835bbb4346","running":false},{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODc0","route":"vxml_front_door_6647ad7b84df93835bbb4346","description":"","content":"console.log({\n frontdoor: \"1.0\",\n body: req.body,\n query: req.query,\n params: req.params\n});\nconst brand = req.query.brand;\n(async () => {\n const vxmlResponse = vxmlgen_gvf_6647ad7b84df93835bbb4346().frontDoor({\n hostname: voiceSettings_6647ad7b84df93835bbb4346.ivr.hostname,\n workspaceId: req.params.workspaceId,\n branch: req.params.branch,\n suffix: voiceSettings_6647ad7b84df93835bbb4346.suffix,\n brand\n });\n res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0');\n res.setHeader('etag', nanoid());\n res.type('text/xml');\n res.send(vxmlResponse);\n})();","cache":false,"workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"enabled":true,"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227536,"_vc":{"branch":"current","operation":"update","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODcy","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5NTU4YzllYjA3MzRjODkyMDEw","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5NTVkMDM3ZjMzNGIyZTZiMWI4"},"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl","updatedAt":1748531541919},"endpoint":"https://router.ivastudio.verint.live/ProxyScript/run/67d183b64afbdf930f4b3863/current/vxml_front_door_6647ad7b84df93835bbb4346","running":false},{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODc3","route":"vxml_transfer_6647ad7b84df93835bbb4346","description":"","content":"console.log({\n transfer: \"1.2\",\n query: req.query\n});\nconst sessionId = req.query.sessionId;\nconsole.log(\"Transfer\", sessionId);\nif (sessionId) {\n const smStr = `session-map-${sessionId}`;\n (async () => {\n await redis.hSet(smStr, {\n transferCall: \"true\",\n waitForLiveOperator: \"false\"\n });\n res.send(200);\n })().catch(e => {\n console.log(\"error\");\n console.log(e.message);\n res.send(500);\n });\n} else {\n res.send(400);\n}","cache":false,"workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"enabled":true,"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227571,"_vc":{"branch":"current","operation":"update","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODc1","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5NTU4YzllYjA3MzRjODkyMDEx","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5NTVkMDM3ZjMzNGIyZTZiMWI4"},"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl","updatedAt":1748531541919},"endpoint":"https://router.ivastudio.verint.live/ProxyScript/run/67d183b64afbdf930f4b3863/current/vxml_transfer_6647ad7b84df93835bbb4346","running":false},{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODdh","route":"vxml_stop_6647ad7b84df93835bbb4346","description":"","content":"console.log({\n stop: \"1.5\",\n body: req.body,\n query: req.query,\n params: req.params\n});\nconst getCA = () => {\n if (voiceSettings_6647ad7b84df93835bbb4346?.integrations?.CAInterface?.enabled) {\n let ca = \"CAInterface\";\n if (voiceSettings_6647ad7b84df93835bbb4346.integrations.CAInterface.suffix) {\n ca += voiceSettings_6647ad7b84df93835bbb4346.integrations.CAInterface.suffix;\n }\n ca += \"()\";\n return eval(ca);\n }\n return undefined;\n};\nconst sessionId = req.body.sessionId;\n(async () => {\n const smStr = `session-map-${sessionId}`;\n const sessionMap = await redis.hGetAll(smStr);\n const terminationObject = {\n type: 'RETURN'\n };\n const transferCall = sessionMap.transferCall || req.headers[\"transfer-call-tester\"];\n if (transferCall) {\n terminationObject.type = 'TRANSFER';\n let dest = sessionMap.transferTo || voiceSettings_6647ad7b84df93835bbb4346.transfer.destination;\n const params = [];\n if (sessionMap.xSpVerintId) params.push(\"X-SP-VerintID=\" + encodeURIComponent(sessionMap.xSpVerintId));\n for (let [index, value] of params.entries()) {\n if (index == 0) {\n dest += \"?\";\n } else {\n dest += \"&\";\n }\n dest += value;\n }\n terminationObject.destination = dest;\n console.log({\n terminationObject\n });\n } else if (sessionMap.waitForLiveOperator === \"true\" && sessionMap.interactionId) {\n const CA = getCA();\n if (CA) {\n CA.endTelephonyInteraction(await CA.getOIDC(), sessionMap.interactionId, \"abandoned-in-queue\");\n }\n }\n const vxmlResponse = vxmlgen_gvf_6647ad7b84df93835bbb4346().stop({\n terminationObject\n });\n console.log(vxmlResponse);\n res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0');\n res.setHeader('etag', nanoid());\n res.type('text/xml');\n res.send(vxmlResponse);\n})();","cache":false,"workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"enabled":true,"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227607,"_vc":{"branch":"current","operation":"update","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODc4","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5NTU4YzllYjA3MzRjODkyMDEy","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5NTVkMDM3ZjMzNGIyZTZiMWI4"},"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl","updatedAt":1748531541919},"endpoint":"https://router.ivastudio.verint.live/ProxyScript/run/67d183b64afbdf930f4b3863/current/vxml_stop_6647ad7b84df93835bbb4346","running":false},{"_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgwYTQyY2NhZDQyNjBlYWY4MDdkMTgx","route":"vxml_loop_6647ad7b84df93835bbb4346","description":"","content":"const utterance = req.body.utterance;\nconst sessionId = req.body.sessionId;\nconsole.log({\n loop: \"1.6\",\n utterance,\n sessionId\n});\nconst getNested = (obj, ...args) => {\n return args.reduce((obj, level) => {\n return obj && obj[level];\n }, obj);\n};\nif (req.body.body && req.body.query) {\n const tmpBody = JSON.parse(JSON.stringify(req.body.body));\n const tmpQuery = JSON.parse(JSON.stringify(req.body.query));\n req.query = tmpQuery;\n req.body = tmpBody;\n}\nif (req.body.sessionJSON) {\n try {\n req.body.sessionJSON = JSON.parse(req.body.sessionJSON);\n } catch (e) {\n console.log(e.message);\n }\n}\nconst verbose = voiceSettings_6647ad7b84df93835bbb4346.verbose || false;\nconst useDomain = req.body.useDomain;\nconst route = req.params && req.params[0] && req.params[0].split('/').slice(-1)[0];\nconst requestId = uuidv4();\nconst safetyNet = voiceSettings_6647ad7b84df93835bbb4346.responses.safetynet;\nconst waitHoldTimeout = voiceSettings_6647ad7b84df93835bbb4346.waitHoldTimeout;\nlet promptText = voiceSettings_6647ad7b84df93835bbb4346.responses.welcome;\nlet disconnect;\nlet waveform;\nlet gcsUri;\nlet fileName;\nlet recognizedData;\nif (req.body.waveform) {\n try {\n waveform = url.parse(req.body.waveform, true).query.googleUri;\n fileName = url.parse(waveform, true);\n if (fileName && fileName.pathName) gcsUri = `gs:/${fileName.pathname}`;\n } catch (e) {\n console.log(e.message);\n }\n}\nconst isCA = () => {\n return voiceSettings_6647ad7b84df93835bbb4346?.integrations?.CAInterface?.enabled || false;\n};\nconst getCA = () => {\n if (isCA()) {\n let ca = \"CAInterface\";\n if (voiceSettings_6647ad7b84df93835bbb4346.integrations.CAInterface.suffix) {\n ca += voiceSettings_6647ad7b84df93835bbb4346.integrations.CAInterface.suffix;\n }\n ca += \"()\";\n return eval(ca);\n }\n return undefined;\n};\nconst getInteractionId = async (ani, dnis, xSpVerintId) => {\n const suffix = voiceSettings_6647ad7b84df93835bbb4346.suffix && `_${voiceSettings_6647ad7b84df93835bbb4346.suffix}` || \"\";\n const callback = `${voiceSettings_6647ad7b84df93835bbb4346.ivr.hostname}/ProxyScript/run/${req.params.workspaceId}/${req.params.branch}/vxml_transfer${suffix}?sessionId=${sessionId}`;\n let tisId;\n const CA = getCA();\n if (CA) {\n try {\n const OIDC = await CA.getOIDC();\n if (OIDC.access_token) {\n tisId = await CA.createTelephonyInteraction(OIDC, ani, dnis, xSpVerintId, callback);\n } else {\n console.log(\"getInteractionId failed: Bad OIDC credentials\");\n console.log(OIDC);\n }\n } catch (error) {\n console.log(`getInteractionId failed. error: ${error.message}`);\n }\n }\n return tisId;\n};\nconst blockWaitLiveOperator = async (smStr, sessionMap, CA) => {\n const start = Date.now();\n let rd;\n const loopWait = 100;\n const total = voiceSettings_6647ad7b84df93835bbb4346.waitHoldQueueStatus * 1000 / loopWait;\n for (let i = 0; i < total; i++) {\n const sessionMap = await redis.hGetAll(smStr);\n if (sessionMap.transferCall) {\n console.log(\"Loop: transfer call\");\n rd = {\n answers: [voiceSettings_6647ad7b84df93835bbb4346.responses.transferCall],\n endCall: true\n };\n return rd;\n }\n await new Promise(r => setTimeout(r, loopWait));\n }\n if (CA) {\n try {\n const OIDC = await CA.getOIDC();\n // fallthrough, provide a queue status update\n const predictions = await CA.getWaitTime(OIDC, sessionMap.interactionId);\n rd = await run_app_event(sessionMap, smStr, \"VXML Queue Status Event\", \"vxmlqueuestatus\", voiceSettings_6647ad7b84df93835bbb4346.responses.pleaseContinueToHold, {\n predictions\n });\n } catch (error) {\n console.log(\"/predictions failed\" + error.message);\n }\n }\n if (!rd) {\n rd = {\n answers: [voiceSettings_6647ad7b84df93835bbb4346.responses.pleaseContinueToHold]\n };\n }\n console.log({\n blockWaitElapsed: Date.now() - start\n });\n return rd;\n};\nconst sequenceApiCalls = async (smStr, interactionId, apiCalls) => {\n const CA = getCA();\n if (CA) {\n await redis.hSet(smStr, {\n waitForApi: \"true\"\n });\n const OIDC = await CA.getOIDC();\n for (let api of apiCalls) {\n try {\n if (api.api == \"patchCallInfo\") {\n await CA.patchCallInfo(OIDC, interactionId, api.params);\n } else if (api.api = \"connectWithLiveOperator\") {\n const isVirtualHold = api.params.isVirtualHold;\n const callReason = api.params.callReason;\n if (isVirtualHold || callReason) {\n await CA.patchCallInfo(OIDC, interactionId, {\n isVirtualHold,\n callReason\n });\n }\n await CA.connectWithLiveOperator(OIDC, interactionId);\n redis.hSet(smStr, {\n waitForLiveOperator: \"true\",\n lastQueueStatus: JSON.stringify(Date.now())\n });\n redis.hDel(smStr, \"pendingAPIs\");\n } else {\n console.log({\n badapi: api\n });\n }\n } catch (err) {\n console.log(`Error: ${api.api} failed. ${err.message}`);\n }\n }\n redis.hDel(smStr, \"waitForApi\");\n }\n};\nconst run_app_event = async (sessionMap, smStr, intent, input, defaultAnswer, metadata = {}) => {\n const configuration = {\n directIntentHit: intent\n };\n return await run_model_and_report(sessionMap, smStr, input, defaultAnswer, configuration, metadata);\n};\nconst run_model_and_report = async (sessionMap, smStr, input, defaultAnswer, configuration, metadata = {}) => {\n let privateData = voiceSettings_6647ad7b84df93835bbb4346.ivr.privateData || false;\n let interactionId = sessionMap.interactionId;\n let {\n data: recognizedData\n } = await axios.post(`${voiceSettings_6647ad7b84df93835bbb4346.nlu.apiBaseURL}/Model/run/${req.params.workspaceId}/${req.params.branch}/${voiceSettings_6647ad7b84df93835bbb4346.nlu.modelName}`, {\n input,\n configuration,\n conversationId: sessionMap.conversationId,\n settings: voiceSettings_6647ad7b84df93835bbb4346.nlu.settings,\n channel: \"voice\",\n // for old multi-channel widgets\n metadata: {\n channel: 'voice',\n gcsUriAudio: waveform,\n ani: sessionMap.ani,\n dnis: sessionMap.dnis,\n callid: sessionMap.callid,\n xSpVerintId: sessionMap.xSpVerintId,\n interactionId,\n sessionId,\n syntheticAudio: true,\n utteranceFileName: `${fileName?.pathname?.replace('/asr-archive/', '') || \"\"}`,\n ...metadata\n }\n });\n privateData = recognizedData.ivrSettings?.privateData || privateData;\n if (!privateData && recognizedData.conversationId && sessionMap.conversationId === undefined) {\n db.analytics.addConversation({\n id: recognizedData.conversationId\n });\n }\n if (recognizedData.conversationId) {\n await redis.hSet(smStr, {\n conversationId: recognizedData.conversationId\n });\n }\n if (defaultAnswer && recognizedData.answers.length === 0) {\n recognizedData.answers = [defaultAnswer];\n } else if (recognizedData.classificationResults.length === 0 && recognizedData.answers.length === 0) {\n recognizedData.answers = [voiceSettings_6647ad7b84df93835bbb4346.responses.unrecognized];\n } else if (recognizedData.answers.length === 0) {\n recognizedData.answers = [voiceSettings_6647ad7b84df93835bbb4346.responses.unanswered];\n }\n if (!recognizedData.ivrSettings) {\n recognizedData.ivrSettings = {};\n }\n let timeout;\n // look for the wait-hold event from the flow\n\n if (recognizedData.vxmlCAApis) {\n timeout = waitHoldTimeout;\n // async\n if (recognizedData.vxmlCAApis.find(api => api.api == \"connectWithLiveOperator\")) {\n // defer api until after the current prompt finishes. next loop\n console.log(\"Deferring VC Apis\");\n await redis.hSet(smStr, {\n waitForLiveOperator: \"true\",\n pendingAPIs: JSON.stringify(recognizedData.vxmlCAApis)\n });\n sessionMap.waitForLiveOperator = true;\n } else {\n sequenceApiCalls(smStr, interactionId, recognizedData.vxmlCAApis);\n }\n } else if (sessionMap.waitForLiveOperator) {\n timeout = waitHoldTimeout;\n }\n if (timeout && !recognizedData.ivrSettings.timeout) {\n recognizedData.ivrSettings.timeout = timeout;\n }\n // add dialogName hueristically\n if (!recognizedData.ivrSettings.dialogName) {\n let dialogName = \"\";\n if (recognizedData.classificationResults.length) {\n dialogName = recognizedData.classificationResults[0].label.split(/\\s+/).join('_');\n }\n if (recognizedData.answers.length) {\n let words = recognizedData.answers[0].split(/\\s+/).map(word => {\n return word.replace(/[^a-z0-9]/gi, '');\n }).filter(word => word.length > 0);\n for (let i = 0; i < Math.min(6, words.length); i++) {\n dialogName += \"_\" + words[i];\n }\n }\n if (dialogName.length) {\n recognizedData.ivrSettings.dialogName = dialogName;\n }\n }\n if (!privateData && input !== \"vxmlqueuestatus\") {\n db.analytics.addTransaction(recognizedData);\n }\n return recognizedData;\n};\n// DEMO DISTRIBUTOR CODE\nconsole.log(\"req.body.interpretation\");\nconsole.log(req.body.interpretation);\nconst selectedWorkspaceOption = req.body.interpretation;\nconsole.log(\"Selected Option:\");\nconsole.log(selectedWorkspaceOption);\n\nlet vxmlResponse;\n\nconst generateVXML = async () => {\n try {\n // Common properties used in all cases, unless specified in the case block\n const commonProperties = {\n hostname: \"https://router.ivastudio.verint.live\",\n branch: \"current\",\n requestId,\n promptText,\n disconnect,\n recognizedData,\n ...voiceSettings_6647ad7b84df93835bbb4346.ivr,\n };\n\n switch (selectedWorkspaceOption) {\n case \"1\":\n // Peter's Workspace\n vxmlResponse = vxmlgen_gvf_6647ad7b84df93835bbb4346().frontDoor({\n workspaceId: \"67bca862210071627d32ef12\",\n suffix: \"6647ad7b84df93835bbb4346\", \n ...commonProperties,\n });\n break;\n case \"2\":\n // David's Workspace\n vxmlResponse = vxmlgen_gvf_6647ad7b84df93835bbb4346().frontDoor({\n workspaceId: \"67c9ddd765e40fd3d60ef441\",\n suffix: \"6647ad7b84df93835bbb4346\", \n ...commonProperties,\n });\n break;\n case \"3\":\n // Ramzi's Workspace\n vxmlResponse = vxmlgen_gvf_6647ad7b84df93835bbb4346().frontDoor({\n workspaceId: \"67c758bf8e90ca81122106a5\",\n suffix: \"6647ad7b84df93835bbb4346\", \n ...commonProperties,\n });\n break;\n case \"4\":\n // Amber's Workspace\n vxmlResponse = vxmlgen_gvf_6647ad7b84df93835bbb4346().frontDoor({\n workspaceId: \"67c9dde765e40fd3d60ef446\",\n suffix: \"6647ad7b84df93835bbb4346\", \n ...commonProperties,\n });\n break;\n case \"5\":\n // Ring Central Workspace\n vxmlResponse = vxmlgen_gvf_6647ad7b84df93835bbb4346().frontDoor({\n workspaceId: \"68098e35ad4260eaf807cff2\",\n suffix: \"6647ad7b84df93835bbb4346\", \n ...commonProperties,\n });\n break;\n default:\n vxmlResponse = vxmlgen_gvf_6647ad7b84df93835bbb4346().loop({\n hostname: voiceSettings_6647ad7b84df93835bbb4346.ivr.hostname,\n workspaceId: req.params.workspaceId,\n suffix: voiceSettings_6647ad7b84df93835bbb4346.suffix,\n branch: req.params.branch,\n sessionId,\n ...commonProperties,\n });\n break;\n }\n\n\t// END OF DEMO DISTRIBUTOR CODE\n res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0');\n res.setHeader('etag', nanoid());\n res.type('text/xml');\n if (verbose) {\n console.log('============================');\n console.log(vxmlResponse);\n console.log('++++++++++++++++++++++++++++');\n }\n res.send(vxmlResponse);\n } catch (e) {\n console.log(e.message);\n if (e.toJSON) console.log(e.toJSON());\n res.status(500);\n }\n};\nif (sessionId) {\n const smStr = `session-map-${sessionId}`;\n (async () => {\n if (req.body.sessionJSON && req.body.sessionJSON) {\n const ani = getNested(req.body, 'sessionJSON', 'telephone', 'ani').split('@')[0];\n const dnis = getNested(req.body, 'sessionJSON', 'connection', 'protocol', 'sip', 'requesturi').split('@')[0];\n const callid = getNested(req.body, 'sessionJSON', 'connection', 'protocol', 'sip', 'headers', 'call-id').split('_')[0];\n let xSpVerintId = getNested(req.body, 'sessionJSON', 'connection', 'protocol', 'sip', 'headers', 'x-sp-verintid') || callid;\n if (utterance == undefined) {\n getInteractionId(ani, dnis, callid).then(interactionId => {\n if (interactionId) {\n redis.hSet(smStr, {\n interactionId\n });\n }\n });\n await redis.hSet(smStr, {\n ani,\n dnis,\n callid,\n xSpVerintId\n });\n await redis.expire(smStr, 60 * 60 * 24);\n }\n }\n const sessionMap = await redis.hGetAll(smStr);\n Object.keys(sessionMap).forEach((key, i) => {\n try {\n sessionMap[key] = JSON.parse(sessionMap[key]);\n } catch (e) {}\n });\n console.log(sessionMap);\n if (sessionMap.waitForApi) {\n promptText = undefined;\n recognizedData = {\n answers: [\"\"],\n ivrSettings: {\n timeout: waitHoldTimeout\n }\n };\n } else if (sessionMap.endCall) {\n promptText = undefined;\n recognizedData = {\n answers: [\"\"],\n endCall: true\n };\n } else if (sessionMap.transferCall) {\n recognizedData = await run_app_event(sessionMap, smStr, 'VXML Transfer Call Event', 'vxmltransfercall', voiceSettings_6647ad7b84df93835bbb4346.responses.transferCall);\n recognizedData.endCall = true;\n } else if (sessionMap.waitForLiveOperator) {\n if (sessionMap.pendingAPIs) {\n // async. success will delete sessionMap.pendingApis\n sequenceApiCalls(smStr, sessionMap.interactionId, sessionMap.pendingAPIs);\n }\n recognizedData = await blockWaitLiveOperator(smStr, sessionMap, getCA());\n } else if (route === 'noinput') {\n recognizedData = await run_app_event(sessionMap, smStr, 'VXML Noinput Event', 'vxmlnoinput', voiceSettings_6647ad7b84df93835bbb4346.responses.noinput);\n } else if (route === 'nomatch') {\n recognizedData = await run_app_event(sessionMap, smStr, 'VXML Unrecognized Event', 'vxmlunrecognized', voiceSettings_6647ad7b84df93835bbb4346.responses.unrecognized);\n } else if (route === 'maxspeechtimeout') {\n recognizedData = await run_app_event(sessionMap, smStr, 'VXML Max Speech Timeout', 'vxmlmaxspeechtimeout', voiceSettings_6647ad7b84df93835bbb4346.responses.speechtimeout);\n } else if (utterance) {\n recognizedData = await run_model_and_report(sessionMap, smStr, utterance);\n } else {\n recognizedData = await run_app_event(sessionMap, smStr, 'VXML Welcome Event', 'vxmlwelcome', voiceSettings_6647ad7b84df93835bbb4346.responses.welcome);\n }\n if (recognizedData && recognizedData.transferCall) {\n recognizedData.endCall = true;\n await redis.hSet(smStr, {\n transferCall: \"true\",\n transferTo: recognizedData.transferTo || voiceSettings_6647ad7b84df93835bbb4346.transfer.destination\n });\n }\n promptText = recognizedData && recognizedData.answers && recognizedData.answers.join(' ') || promptText;\n disconnect = recognizedData && recognizedData.endCall || false;\n generateVXML(sessionMap);\n })().catch(e => {\n console.log(e.message);\n promptText = safetyNet;\n generateVXML();\n });\n} else {\n generateVXML();\n}","cache":false,"workspaceId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTgzYjY0YWZiZGY5MzBmNGIzODYz","organizationId":null,"enabled":true,"metadata":{"createdBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRmMWFjODE1NDVmODJiMDVhODgzNDQ3","createdAt":1741788227661,"_vc":{"branch":"current","operation":"update","_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODdi","lts_id":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5NTU4YzllYjA3MzRjODkyMDEz","commitId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjgzODc5NTVkMDM3ZjMzNGIyZTZiMWI4"},"updatedBy":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl","updatedAt":1748531541919},"endpoint":"https://router.ivastudio.verint.live/ProxyScript/run/67d183b64afbdf930f4b3863/current/vxml_loop_6647ad7b84df93835bbb4346","running":false}],"dynamicQueries":[],"llmConfigs":[],"prompts":[],"widgets":[],"engagements":[]},"authorId":"4d5df90a-66f1-48b1-9762-7d76c888d153-NjRiYWMwNTkyNGE5YzU3ODNlZjc0MjRl","description":"Full Model and Integration Export","readme":"# Full Model 05292025\n\nFull Model and Integration Export before upgrading and optimizing proxy scripts for distributor.","entities":{"Widget":[],"Dashboard":[],"DynamicQuery":[],"GlobalVariable":["4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0OTQ0YWZiZGY5MzBmNGIzODk4","4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODZl"],"Engagement":[],"ProxyScript":["4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODcx","4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODc0","4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODc3","4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODdh","4d5df90a-66f1-48b1-9762-7d76c888d153-NjgwYTQyY2NhZDQyNjBlYWY4MDdkMTgx"],"Alternate":["4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDQ0YWZiZGY5MzBmNGIzODk1","4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODhm","4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODkx","4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODhk","4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDQ0YWZiZGY5MzBmNGIzODkz","4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODhi"],"ConversationFlow":["4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMjliMTcyYTk5M2U2MmE1YmRhYzIy"],"EntityValue":[],"Entity":[],"Intent":["4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODdm","4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODgz","4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg5","4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODgx","4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg1","4d5df90a-66f1-48b1-9762-7d76c888d153-NjdkMTk0NDM0YWZiZGY5MzBmNGIzODg3"],"LlmConfig":[],"Prompt":[]},"name":"Full_05292025","status":"PENDING","version":{"major":0,"minor":0,"patch":1}},"id":"232398d6661aa9509bd630ecd63f4de9c51d7199ff48b6bcf628cff1740ca69f"} \ No newline at end of file diff --git a/distributor/_studio_dependecies/GlobalVariable/voiceSettings_6647ad7b84df93835bbb4346.json b/distributor/_studio_dependecies/GlobalVariable/voiceSettings_6647ad7b84df93835bbb4346.json new file mode 100644 index 0000000..7d93ad7 --- /dev/null +++ b/distributor/_studio_dependecies/GlobalVariable/voiceSettings_6647ad7b84df93835bbb4346.json @@ -0,0 +1,35 @@ +{ + "nlu": { + "apiBaseURL": "http://ivas-router.prd1", + "modelName": "MVP", + "settings": { + "intentConfidenceThreshold": 0.4 + } + }, + "suffix": "6647ad7b84df93835bbb4346", + "waitHoldTimeout": "8s", + "waitHoldQueueStatus": "20", + "responses": { + "welcome": "Hello, I'm a virtual assistant. How can I help you?", + "unrecognized": "I did not understand what you said. Can you please say it again?", + "unanswered": "I understand what you said, but I have not been taught how to answer your question... yet.", + "noinput": "If you said something, I did not hear it. Can you please repeat that?", + "speechtimeout": "We may be having noise issues with our call, Can you repeat that?", + "transferCall": "Forwarding to a live operator", + "pleaseContinueToHold": "Please continue to wait for the next available representative.", + "safetynet": "There was a problem processing your request. How else can I help?" + }, + "ivr": { + "hostname": "https://router.ivastudio.verint.live", + "applicationName": "SC Distr" + }, + "transfer": { + "destination": "" + }, + "integrations": { + "CAInterface": { + "enabled": false, + "suffix": "" + } + } +} \ No newline at end of file diff --git a/distributor/_studio_dependecies/GlobalVariable/vxmlgen_gvf_6647ad7b84df93835bbb4346.js b/distributor/_studio_dependecies/GlobalVariable/vxmlgen_gvf_6647ad7b84df93835bbb4346.js new file mode 100644 index 0000000..6631192 --- /dev/null +++ b/distributor/_studio_dependecies/GlobalVariable/vxmlgen_gvf_6647ad7b84df93835bbb4346.js @@ -0,0 +1,1788 @@ +// version 1.0.5 +return { +frontDoor: options => { + const parameters = _.merge({ + lastResortUrl: 'D:\\\\Program Files (x86)\\\\Intervoice\\Media Server for VOIP\\\\APPL\\\\CSIURLROUTER\\\\lastresort.vxml' + }, options); + parameters.suffix = parameters.suffix && `_${parameters.suffix}` || ''; + const xml = { + 'vxml': { + '$': { + 'version': '2.1', + 'xmlns': 'http://www.w3.org/2001/vxml', + 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', + 'xsi:schemaLocation': 'http://www.w3.org/2001/vxml http://www.w3.org/TR/2007/REC-voicexml21-20070619/vxml.xsd' + }, + 'var': [{ + '$': { + 'name': 'sessionId', + 'expr': 'session.connection.log.callid' + } + }, { + '$': { + 'name': 'localURI', + 'expr': 'session.connection.local.uri' + } + }, { + '$': { + 'name': 'remoteURI', + 'expr': 'session.connection.remote.uri' + } + }, { + '$': { + 'name': 'aai', + 'expr': 'session.connection.aai' + } + }, { + '$': { + 'expr': "''", + 'name': 'sessionJSON' + } + }, { + '$': { + 'name': 'errorCount', + 'expr': '0' + } + }, { + '$': { + 'name': 'message', + 'expr': "''" + } + }, { + '$': { + 'name': 'event', + 'expr': "''" + } + }], + 'form': [{ + '$': { + 'id': 'main' + }, + 'block': [{ + 'script': ["\n \n // https://www.ecma-international.org/ecma-262/#sec-json.stringify\n // JSON.stringify() is supported in ECMA 262 edition 5 and later.\n // Convergys CIVP 10 supports ECMA 262 edition 3\n // For this alternate implementation, see:\n // https://www.sitepoint.com/javascript-json-serialization/\n\n var JSON = JSON || {};\n\n JSON.stringify = JSON.stringify || function (obj) {\n\n var t = typeof (obj);\n if (t != \"object\" || obj === null) {\n\n // simple data type\n if (t == \"string\") obj = '\"' + obj + '\"';\n return String(obj);\n\n }\n else {\n\n // recurse array or object\n var n, v, json = [], arr = (obj && obj.constructor == Array);\n\n for (n in obj) {\n v = obj[n]; t = typeof (v);\n\n if (t == \"string\") v = '\"' + v.replace(/\\\\([^\"])/g, \"\\\\\\\\$1\") + '\"';\n else if (t == \"undefined\") v = null;\n else if (t == \"object\" && v !== null) v = JSON.stringify(v);\n\t\t\t\t\t\telse if (t == \"function\") v = null;\n\n json.push((arr ? \"\" : '\"' + n + '\":') + String(v));\n }\n\n return (arr ? \"[\" : \"{\") + String(json) + (arr ? \"]\" : \"}\");\n }\n };\n\n JSON.parse = JSON.parse || function (str) {\n if (str === \"\") str = '\"\"';\n eval(\"var p=\" + str + \";\");\n return p;\n };\n\n sessionJSON = JSON.stringify(session);\n \n "], + 'submit': [{ + '$': { + 'method': 'post', + 'expr': 'loopUrl', + 'namelist': 'sessionId localURI remoteURI aai sessionJSON' + } + }] + }] + }], + 'catch': [{ + '$': { + 'event': 'connection.disconnect' + }, + 'assign': [{ + '$': { + 'name': 'message', + 'expr': '_message' + } + }, { + '$': { + 'name': 'event', + 'expr': '_event' + } + }], + 'submit': [{ + '$': { + 'method': 'post', + 'expr': 'stopUrl', + 'namelist': 'sessionId message event' + } + }] + }, { + '$': { + 'event': 'error' + }, + 'assign': [{ + '$': { + 'name': 'errorCount', + 'expr': 'errorCount + 1' + } + }, { + '$': { + 'name': 'message', + 'expr': '_message' + } + }, { + '$': { + 'name': 'event', + 'expr': '_event' + } + }], + 'if': [{ + '$': { + 'cond': 'errorCount > 3' + }, + 'log': [{ + '_': 'Tranfer of last resort., sessionId: ,\n\t\tevent: , message: \n\t\t\t', + '$': { + 'label': 'error' + }, + 'value': [{ + '$': { + 'expr': 'sessionId' + } + }, { + '$': { + 'expr': '_event' + } + }, { + '$': { + 'expr': '_message' + } + }] + }], + 'goto': [{ + '$': { + 'expr': 'lastResortUrl' + } + }] + }], + 'submit': [{ + '$': { + 'method': 'post', + 'expr': 'errorUrl', + 'namelist': 'sessionId message event' + } + }] + }] + } + }; + xml.vxml.var.push({ + '$': { + 'name': 'loopUrl', + 'expr': `'${parameters.loopUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_loop${parameters.suffix}`}'` + } + }, { + '$': { + 'name': 'errorUrl', + 'expr': `'${parameters.errorUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_error${parameters.suffix}`}'` + } + }, { + '$': { + 'name': 'lastResortUrl', + 'expr': `'${parameters.lastResortUrl}'` + } + }, { + '$': { + 'name': 'stopUrl', + 'expr': `'${parameters.stopUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_stop${parameters.suffix}`}'` + } + }, { + '$': { + 'name': 'maxspeechtimeoutUrl', + 'expr': `'${parameters.maxspeechtimeoutUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_loop${parameters.suffix}/maxspeechtimeout`}'` + } + }); + const builder = new xml2js.Builder({ + cdata: true + }); + return builder.buildObject(xml); +}, +loop: options => { + const builder = new xml2js.Builder(); + const parameters = _.merge({ + dialogName: 'test_dialog', + dtmfgrammarUri: 'builtin:dtmf/digits', + languageCode: 'en-US', + lastResortUrl: 'D:\\\\Program Files (x86)\\\\Intervoice\\Media Server for VOIP\\\\APPL\\\\CSIURLROUTER\\\\lastresort.vxml', + voiceName: 'en-US-Wavenet-F', + prosodyRate: '1.0', + confidencelevel: 0.01, + sensitivity: 0.5, + completetimeout: '1s', + incompletetimeout: '1s', + maxspeechtimeout: '15s', + timeout: '15s', + privatedata: false, + bargein: false, + processingSoundUrl: 'https://ivastudio.ai/media-file/5009635/2af2ba0f-3222-485d-bb60-4ed4f8883545.wav', + dtmf: { + interdigittimeout: '5s', + termtimeout: '0s', + termchar: '#' + }, + vars: [] + }, options, options?.recognizedData?.ivrSettings); + const xml = { + 'vxml': { + '$': { + 'version': '2.1', + 'xmlns': 'http://www.w3.org/2001/vxml', + 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', + 'xsi:schemaLocation': 'http://www.w3.org/2001/vxml http://www.w3.org/TR/2007/REC-voicexml21-20070619/vxml.xsd' + }, + 'property': [], + 'var': [{ + '$': { + 'name': 'utterance' + } + }, { + '$': { + 'name': 'confidence' + } + }, { + '$': { + 'name': 'inputmode' + } + }, { + '$': { + 'name': 'interpretation' + } + }, { + '$': { + 'name': 'errorCount', + 'expr': '0' + } + }, { + '$': { + 'name': 'message' + } + }, { + '$': { + 'name': 'event' + } + }], + 'script': ["\n setProperty(\"com.ivb.tts.request_id\", session.connection.log.callid)\n "], + 'form': [{ + '$': { + 'id': 'main' + }, + 'property': [{ + '$': { + 'name': 'confidencelevel' + } + }, { + '$': { + 'name': 'sensitivity' + } + }, { + '$': { + 'name': 'completetimeout' + } + }, { + '$': { + 'name': 'incompletetimeout' + } + }, { + '$': { + 'name': 'maxspeechtimeout' + } + }, { + '$': { + 'name': 'timeout' + } + }, { + '$': { + 'name': 'recordutterance', + 'value': 'true' + } + }, { + '$': { + 'name': 'recordutterancetype', + 'value': 'audio/x-wav' + } + }, { + '$': { + 'name': 'com.intervoice.log.privatedata' + } + }, { + '$': { + 'name': 'interdigittimeout' + } + }, { + '$': { + 'name': 'termtimeout' + } + }], + 'block': [], + 'field': [{ + '$': { + 'name': 'intent' + }, + 'grammar': [{ + '$': { + 'srcexpr': 'grammarUri' + } + }, { + '$': { + 'srcexpr': 'dtmfgrammarUri' + } + }], + 'prompt': [], + 'filled': [{ + 'goto': [{ + '$': { + 'next': '#exit' + } + }] + }] + }] + }, { + '$': { + 'id': 'exit' + }, + 'property': [], + 'block': [{ + 'if': [{ + '$': { + 'cond': "typeof(application.lastresult$) != 'undefined'" + }, + 'if': [{ + '$': { + 'cond': "typeof(application.lastresult$[0]) != 'undefined'" + }, + 'assign': [{ + '$': { + 'name': 'inputmode', + 'expr': 'application.lastresult$[0].inputmode' + } + }, { + '$': { + 'name': 'confidence', + 'expr': 'application.lastresult$[0].confidence' + } + }, { + '$': { + 'name': 'utterance', + 'expr': 'application.lastresult$[0].utterance' + } + }], + 'if': [{ + '$': { + 'cond': "typeof(application.lastresult$[0].interpretation) == 'object'" + }, + 'throw': [{ + '$': { + 'event': 'error.interpretation', + 'message': 'The semantic result returned an object.' + } + }], + 'else': [''], + 'assign': [{ + '$': { + 'name': 'interpretation', + 'expr': 'application.lastresult$[0].interpretation' + } + }] + }], + 'var': [{ + '$': { + 'name': 'waveform', + 'expr': 'application.lastresult$.waveform' + } + }] + }], + 'else': [''], + 'throw': [{ + '$': { + 'event': 'nomatch' + } + }] + }], + 'submit': [{ + '$': { + 'method': 'post', + 'fetchtimeout': "16s", + 'expr': 'loopUrl', + 'namelist': 'sessionId confidence inputmode utterance interpretation recognizerRequestID waveform'.concat(...parameters.vars.map(v => { + return ` ${v.$.name}`; + })) + } + }] + }] + }], + 'noinput': [{ + 'submit': [{ + '$': { + 'method': 'post', + 'expr': 'noinputUrl', + 'namelist': 'sessionId recognizerRequestID' + } + }] + }], + 'nomatch': [{ + 'submit': [{ + '$': { + 'method': 'post', + 'expr': 'nomatchUrl', + 'namelist': 'sessionId recognizerRequestID' + } + }] + }], + 'catch': [{ + '$': { + 'event': 'maxspeechtimeout' + }, + 'submit': [{ + '$': { + 'method': 'post', + 'expr': 'maxspeechtimeoutUrl', + 'namelist': 'sessionId recognizerRequestID' + } + }] + }, { + '$': { + 'event': 'connection.disconnect' + }, + 'assign': [{ + '$': { + 'name': 'message', + 'expr': '_message' + } + }, { + '$': { + 'name': 'event', + 'expr': '_event' + } + }], + 'submit': [{ + '$': { + 'method': 'post', + 'expr': 'stopUrl', + 'namelist': 'sessionId message event' + } + }] + }, { + '$': { + 'event': 'error' + }, + 'assign': [{ + '$': { + 'name': 'errorCount', + 'expr': 'errorCount + 1' + } + }, { + '$': { + 'name': 'message', + 'expr': '_message' + } + }, { + '$': { + 'name': 'event', + 'expr': '_event' + } + }], + 'if': [{ + '$': { + 'cond': 'errorCount > 3' + }, + 'log': [{ + '_': 'Tranfer of last resort: sessionId: ,\n\t\tevent: , message: .', + '$': { + 'label': 'error' + }, + 'value': [{ + '$': { + 'expr': 'sessionId' + } + }, { + '$': { + 'expr': '_event' + } + }, { + '$': { + 'expr': '_message' + } + }] + }], + 'goto': [{ + '$': { + 'expr': 'lastResortUrl' + } + }] + }], + 'submit': [{ + '$': { + 'method': 'post', + 'expr': 'errorUrl', + 'namelist': 'sessionId message event' + } + }] + }] + } + }; + parameters.rmodel = parameters.rmodel || { + 'languageCode': parameters.languageCode, + 'maxAlternatives': 1, + 'model': 'phone_call', + 'useEnhanced': true, + 'speechContexts': [] + }; + parameters.suffix = parameters.suffix && `_${parameters.suffix}` || ''; + if (parameters.recognizedData && parameters.recognizedData.expectedPhrases) { + parameters.rmodel.speechContexts = [{ + phrases: parameters.recognizedData.expectedPhrases + }]; + } + xml.vxml.$['xml:lang'] = parameters.languageCode; + xml.vxml.property.push({ + '$': { + 'name': 'com.ivb.asr.application_name', + 'value': parameters.applicationName || `${parameters.workspaceId}_VerintVXML` + } + }, { + '$': { + 'name': 'com.ivb.asr.dialog_name', + 'value': parameters.dialogName + // 'value': parameters?.dialogName ?? (recognizedData?.answers?.join(";:;") || "EMPTY").substring(0, 100) + } + }, { + '$': { + 'name': 'com.ivb.asr.request_id', + 'value': parameters.requestId + } + }, { + '$': { + 'name': 'com.ivb.tts.application_name', + 'value': parameters.applicationName || `${parameters.workspaceId}_VerintVXML` + } + }, { + '$': { + 'name': 'com.ivb.tts.dialog_name', + 'value': parameters.dialogName + } + }, { + '$': { + 'name': 'com.ivb.tts.Voice-Engine', + 'value': 'google' + } + }, { + '$': { + 'name': 'com.ivb.tts.Voice-Name', + 'value': parameters.voiceName + } + }, { + '$': { + 'name': 'com.ivb.tts.Prosody-Rate', + 'value': parameters.prosodyRate + } + }); + if (parameters.processingSoundUrl) { + xml.vxml.property.push({ + '$': { + 'name': 'fetchaudio', + 'value': parameters.processingSoundUrl + } + }, { + '$': { + 'name': 'fetchaudiodelay', + 'value': '1s' + } + }, { + '$': { + 'name': 'fetchaudiominimum', + 'value': '1s' + } + }); + } + xml.vxml.var.unshift({ + '$': { + 'name': 'sessionId', + 'expr': `'${parameters.sessionId}'` + } + }, { + '$': { + 'name': 'recognizerRequestID', + 'expr': `'${parameters.requestId}'` + } + }, { + '$': { + 'name': 'grammarUri', + 'expr': parameters.grammarUri ? `'${parameters.grammarUri}'` : `'builtin:speech/transcribe?rname=Google;rmodel=${encodeURIComponent(JSON.stringify(parameters.rmodel))}'` + } + }, { + '$': { + 'name': 'dtmfgrammarUri', + 'expr': `'${parameters.dtmfgrammarUri}'` + } + }, { + '$': { + 'name': 'noinputUrl', + 'expr': `'${parameters.noinputUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_loop${parameters.suffix}/noinput`}'` + } + }, { + '$': { + 'name': 'nomatchUrl', + 'expr': `'${parameters.nomatchUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_loop${parameters.suffix}/nomatch`}'` + } + }, { + '$': { + 'name': 'loopUrl', + 'expr': `'${parameters.loopUr || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_loop${parameters.suffix}`}'` + } + }, { + '$': { + 'name': 'errorUrl', + // 'expr': `'${parameters.errorUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_error${parameters.suffix}`}'` + 'expr': `'${parameters.stopUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_stop${parameters.suffix}`}'` + } + }, { + '$': { + 'name': 'lastResortUrl', + 'expr': `'${parameters.lastResortUrl}'` + } + }, { + '$': { + 'name': 'stopUrl', + 'expr': `'${parameters.stopUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_stop${parameters.suffix}`}'` + } + }, { + '$': { + 'name': 'maxspeechtimeoutUrl', + 'expr': `'${parameters.maxspeechtimeoutUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_loop${parameters.suffix}/maxspeechtimeout`}'` + } + }); + parameters.vars.forEach(v => { + xml.vxml.var.unshift(v); + }); + xml.vxml.form = xml.vxml.form.map(f => { + switch (f.$.id) { + case 'main': + if (f.property) { + f.property = f.property.map(p => { + switch (p.$.name) { + case 'confidencelevel': + p.$.value = parameters.confidencelevel; + break; + case 'sensitivity': + p.$.value = parameters.sensitivity; + break; + case 'completetimeout': + p.$.value = parameters.completetimeout; + break; + case 'incompletetimeout': + p.$.value = parameters.incompletetimeout; + break; + case 'maxspeechtimeout': + p.$.value = parameters.maxspeechtimeout; + break; + case 'timeout': + p.$.value = parameters.timeout; + break; + case 'com.intervoice.log.privatedata': + p.$.value = parameters.privatedata; + break; + case 'interdigittimeout': + p.$.value = parameters.dtmf.interdigittimeout; + break; + case 'termtimeout': + p.$.value = parameters.dtmf.termtimeout; + break; + } + return p; + }); + } + if (parameters.disconnect) { + const obj = {}; + if (parameters.promptAudio) { + obj.prompt = []; + if (Array.isArray(parameters.promptAudio)) { + obj.prompt.push(...parameters.promptAudio.map(audio => { + return { + $: { + bargein: parameters.bargein + }, + audio: [{ + $: { + src: audio + } + }] + }; + })); + } else { + obj.prompt.push({ + $: { + bargein: parameters.bargein + }, + audio: [{ + $: { + src: parameters.promptAudio + } + }] + }); + } + } else if (parameters.promptText) { + obj.prompt = { + _: parameters.promptText, + $: { + bargein: parameters.bargein + } + }; + } else if (parameters.promptMixed) { + obj.prompt = parameters.promptMixed.map(prompt => { + const obj = { + $: { + bargein: parameters.bargein + } + }; + if (prompt.url) { + obj.audio = [{ + $: { + src: prompt.url + } + }]; + } else { + obj._ = prompt.text; + } + return obj; + }); + } + obj.submit = { + $: { + method: 'post', + expr: 'stopUrl', + namelist: 'sessionId' + } + }; + f.block = (f.block || []).concat(obj); + } + if (f.field) { + f.field = f.field.map(f => { + switch (f.$.name) { + case 'intent': + if (parameters.promptAudio) { + f.prompt = []; + if (Array.isArray(parameters.promptAudio)) { + f.prompt.push(...parameters.promptAudio.map(audio => { + return { + $: { + bargein: parameters.bargein + }, + audio: [{ + $: { + src: audio + } + }] + }; + })); + } else { + f.prompt.push({ + $: { + bargein: parameters.bargein + }, + audio: [{ + $: { + src: parameters.promptAudio + } + }] + }); + } + } else if (parameters.promptText) { + f.prompt = { + '_': parameters.promptText, + '$': { + bargein: parameters.bargein + } + }; + } else if (parameters.promptMixed) { + f.prompt = parameters.promptMixed.map(prompt => { + const obj = { + $: { + bargein: parameters.bargein + } + }; + if (prompt.url) { + obj.audio = [{ + $: { + src: prompt.url + } + }]; + } else { + obj._ = prompt.text; + } + return obj; + }); + } + break; + } + return f; + }); + } + break; + } + return f; + }); + return builder.buildObject(xml); +}, +stop: options => { + const parameters = _.merge({ + processingSoundUrl: 'https://ivastudio.ai/media-file/5009635/2af2ba0f-3222-485d-bb60-4ed4f8883545.wav', + terminationObject: { + type: 'DISCONNECT' + } + }, options); + parameters.suffix = parameters.suffix && `_${parameters.suffix}` || ''; + const xml = { + 'vxml': { + '$': { + 'version': '2.1', + 'xmlns': 'http://www.w3.org/2001/vxml', + 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', + 'xsi:schemaLocation': 'http://www.w3.org/2001/vxml http://www.w3.org/TR/2007/REC-voicexml21-20070619/vxml.xsd' + }, + 'property': [], + 'var': [], + 'form': [{ + 'var': [], + 'block': [] + }] + } + }; + if (parameters.useLoop) { + xml.vxml.property.push({ + '$': { + 'name': 'fetchaudio', + 'value': parameters.processingSoundUrl + } + }, { + '$': { + 'name': 'fetchaudiodelay', + 'value': '1s' + } + }, { + '$': { + 'name': 'fetchaudiominimum', + 'value': '1s' + } + }); + xml.vxml.var.push({ + '$': { + 'name': 'stopUrl', + 'expr': `'${parameters.stopUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_stop${parameters.suffix}`}'` + } + }, { + $: { + name: 'sessionId', + expr: `'${parameters.sessionId}'` + } + }, { + $: { + name: 'looped', + expr: true + } + }); + xml.vxml.form[0].block[0] = { + submit: { + $: { + method: 'post', + expr: 'stopUrl', + namelist: 'sessionId looped' + } + } + }; + } else { + switch (parameters.terminationObject.type) { + case 'RETURN': + { + xml.vxml.form[0].block[0] = { + 'return': {} + }; + if (parameters.terminationObject.data) { + xml.vxml.form[0].var.push({ + $: { + name: '_aai', + expr: `'${parameters.terminationObject.data}'` + } + }); + xml.vxml.form[0].block[0].return.$ = { + namelist: '_aai' + }; + } + break; + } + case 'TRANSFER': + { + if (parameters.terminationObject.destination) { + xml.vxml.form[0].transfer = { + $: { + type: 'blind', + dest: parameters.terminationObject.destination + } + }; + xml.vxml.catch = [{ + '$': { + event: 'connection.disconnect' + }, + 'return': {} + }]; + } + break; + } + case 'GOTO': + xml.vxml.form[0].block[0] = { + 'submit': { + $: { + next: parameters.terminationObject.url, + namelist: Object.keys(parameters.terminationObject.vars).join(' '), + method: 'post' + } + } + }; + for (const [key, value] of Object.entries(parameters.terminationObject.vars)) { + xml.vxml.form[0].var.push({ + $: { + name: key, + expr: value + } + }); + } + break; + default: + xml.vxml.form[0].block[0] = { + disconnect: {} + }; + } + } + const builder = new xml2js.Builder(); + return builder.buildObject(xml); +}, +announce: options => { + const builder = new xml2js.Builder(); + const parameters = _.merge({ + dialogName: 'test_dialog', + languageCode: 'en-US', + lastResortUrl: 'D:\\\\Program Files (x86)\\\\Intervoice\\Media Server for VOIP\\\\APPL\\\\CSIURLROUTER\\\\lastresort.vxml', + voiceName: 'en-US-Wavenet-F', + prosodyRate: '1.0', + privatedata: false, + fetchtimout: "35s", + processingSoundUrl: 'https://ivastudio.ai/media-file/5009635/4b11d97f-3b02-4746-8482-a7375f78a8a2.wav', + vars: [] + }, options, options?.recognizedData?.ivrSettings); + const xml = { + 'vxml': { + '$': { + 'version': '2.1', + 'xmlns': 'http://www.w3.org/2001/vxml', + 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', + 'xsi:schemaLocation': 'http://www.w3.org/2001/vxml http://www.w3.org/TR/2007/REC-voicexml21-20070619/vxml.xsd' + }, + 'property': [], + 'var': [{ + '$': { + 'name': 'errorCount', + 'expr': '0' + } + }, { + '$': { + 'name': 'message' + } + }, { + '$': { + 'name': 'event' + } + }], + 'script': ["\n setProperty(\"com.ivb.tts.request_id\", session.connection.log.callid)\n "], + 'form': [{ + '$': { + 'id': 'main' + }, + 'property': [{ + '$': { + 'name': 'com.intervoice.log.privatedata' + } + }], + 'block': [{ + '$': { + 'name': 'announce' + }, + 'prompt': [{ + '_': parameters.promptText, + '$': { + bargein: false + } + }] + }] + }, { + '$': { + 'id': 'exit' + }, + 'property': [], + 'block': [{ + 'submit': [{ + '$': { + 'method': 'post', + 'fetchtimeout': parameters.fetchtimout, + 'expr': 'loopUrl', + 'namelist': 'sessionId' + } + }] + }], + 'catch': [{ + '$': { + 'event': 'error.badfetch.timeout' + }, + 'submit': [{ + '$': { + 'method': 'post', + 'expr': 'loopUrl', + 'namelist': 'sessionId' + } + }] + }] + }], + 'catch': [{ + '$': { + 'event': 'connection.disconnect' + }, + 'assign': [{ + '$': { + 'name': 'message', + 'expr': '_message' + } + }, { + '$': { + 'name': 'event', + 'expr': '_event' + } + }], + 'submit': [{ + '$': { + 'method': 'post', + 'expr': 'stopUrl', + 'namelist': 'sessionId message event' + } + }] + }, { + '$': { + 'event': 'error' + }, + 'assign': [{ + '$': { + 'name': 'errorCount', + 'expr': 'errorCount + 1' + } + }, { + '$': { + 'name': 'message', + 'expr': '_message' + } + }, { + '$': { + 'name': 'event', + 'expr': '_event' + } + }], + 'if': [{ + '$': { + 'cond': 'errorCount > 3' + }, + 'log': [{ + '_': 'Transfer of last resort: sessionId: ,\n\t\tevent: , message: .', + '$': { + 'label': 'error' + }, + 'value': [{ + '$': { + 'expr': 'sessionId' + } + }, { + '$': { + 'expr': '_event' + } + }, { + '$': { + 'expr': '_message' + } + }] + }], + 'goto': [{ + '$': { + 'expr': 'lastResortUrl' + } + }] + }], + 'submit': [{ + '$': { + 'method': 'post', + 'expr': 'errorUrl', + 'namelist': 'sessionId message event' + } + }] + }] + } + }; + parameters.suffix = parameters.suffix && `_${parameters.suffix}` || ''; + xml.vxml.$['xml:lang'] = parameters.languageCode; + xml.vxml.property.push({ + '$': { + 'name': 'com.ivb.tts.application_name', + 'value': parameters.applicationName || `${parameters.workspaceId}_VerintVXML` + } + }, { + '$': { + 'name': 'com.ivb.tts.dialog_name', + 'value': parameters.dialogName + } + }, { + '$': { + 'name': 'com.ivb.tts.Voice-Engine', + 'value': 'google' + } + }, { + '$': { + 'name': 'com.ivb.tts.Voice-Name', + 'value': parameters.voiceName + } + }, { + '$': { + 'name': 'com.ivb.tts.Prosody-Rate', + 'value': parameters.prosodyRate + } + }); + if (parameters.processingSoundUrl) { + xml.vxml.property.push({ + '$': { + 'name': 'fetchaudio', + 'value': parameters.processingSoundUrl + } + }, { + '$': { + 'name': 'fetchaudiodelay', + 'value': '1s' + } + }, { + '$': { + 'name': 'fetchaudiominimum', + 'value': '1s' + } + }); + } + xml.vxml.var.unshift({ + '$': { + 'name': 'sessionId', + 'expr': `'${parameters.sessionId}'` + } + }, { + '$': { + 'name': 'recognizerRequestID', + 'expr': `'${parameters.requestId}'` + } + }, { + '$': { + 'name': 'loopUrl', + 'expr': `'${parameters.loopUr || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_loop${parameters.suffix}`}'` + } + }, { + '$': { + 'name': 'errorUrl', + // 'expr': `'${parameters.errorUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_error${parameters.suffix}`}'` + 'expr': `'${parameters.stopUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_stop${parameters.suffix}`}'` + } + }, { + '$': { + 'name': 'lastResortUrl', + 'expr': `'${parameters.lastResortUrl}'` + } + }, { + '$': { + 'name': 'stopUrl', + 'expr': `'${parameters.stopUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_stop${parameters.suffix}`}'` + } + }); + xml.vxml.form = xml.vxml.form.map(f => { + switch (f.$.id) { + case 'main': + if (f.property) { + f.property = f.property.map(p => { + switch (p.$.name) { + case 'com.intervoice.log.privatedata': + p.$.value = parameters.privatedata; + break; + } + return p; + }); + } + const obj = {}; + if (parameters.disconnect) { + obj.submit = { + $: { + method: 'post', + expr: 'stopUrl', + namelist: 'sessionId' + } + }; + } else { + obj.goto = [{ + '$': { + 'next': '#exit' + } + }]; + } + f.block = (f.block || []).concat(obj); + break; + } + return f; + }); + return builder.buildObject(xml); +}, +announce2: options => { + const builder = new xml2js.Builder(); + const parameters = _.merge({ + dialogName: 'test_dialog', + dtmfgrammarUri: 'builtin:dtmf/digits', + languageCode: 'en-US', + lastResortUrl: 'D:\\\\Program Files (x86)\\\\Intervoice\\Media Server for VOIP\\\\APPL\\\\CSIURLROUTER\\\\lastresort.vxml', + voiceName: 'en-US-Wavenet-F', + fetchtimeout: "35s", + prosodyRate: '1.0', + confidencelevel: 0.01, + sensitivity: 0.5, + completetimeout: '1s', + incompletetimeout: '1s', + maxspeechtimeout: '15s', + timeout: '1s', + privatedata: false, + bargein: false, + processingSoundUrl: 'https://ivastudio.ai/media-file/5009635/4b11d97f-3b02-4746-8482-a7375f78a8a2.wav', + dtmf: { + interdigittimeout: '5s', + termtimeout: '0s', + termchar: '#' + }, + vars: [] + }, options, options?.recognizedData?.ivrSettings); + parameters.timeout = "1s"; + const xml = { + 'vxml': { + '$': { + 'version': '2.1', + 'xmlns': 'http://www.w3.org/2001/vxml', + 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', + 'xsi:schemaLocation': 'http://www.w3.org/2001/vxml http://www.w3.org/TR/2007/REC-voicexml21-20070619/vxml.xsd' + }, + 'property': [], + 'var': [{ + '$': { + 'name': 'utterance' + } + }, { + '$': { + 'name': 'confidence' + } + }, { + '$': { + 'name': 'inputmode' + } + }, { + '$': { + 'name': 'interpretation' + } + }, { + '$': { + 'name': 'errorCount', + 'expr': '0' + } + }, { + '$': { + 'name': 'message' + } + }, { + '$': { + 'name': 'event' + } + }], + 'script': ["\n setProperty(\"com.ivb.tts.request_id\", session.connection.log.callid)\n "], + 'form': [{ + '$': { + 'id': 'main' + }, + 'property': [{ + '$': { + 'name': 'confidencelevel' + } + }, { + '$': { + 'name': 'sensitivity' + } + }, { + '$': { + 'name': 'completetimeout' + } + }, { + '$': { + 'name': 'incompletetimeout' + } + }, { + '$': { + 'name': 'maxspeechtimeout' + } + }, { + '$': { + 'name': 'timeout' + } + }, { + '$': { + 'name': 'recordutterance', + 'value': 'true' + } + }, { + '$': { + 'name': 'recordutterancetype', + 'value': 'audio/x-wav' + } + }, { + '$': { + 'name': 'com.intervoice.log.privatedata' + } + }, { + '$': { + 'name': 'interdigittimeout' + } + }, { + '$': { + 'name': 'termtimeout' + } + }], + 'block': [], + 'field': [{ + '$': { + 'name': 'intent' + }, + 'grammar': [{ + '$': { + 'srcexpr': 'grammarUri' + } + }, { + '$': { + 'srcexpr': 'dtmfgrammarUri' + } + }], + 'prompt': [], + 'filled': [{ + 'goto': [{ + '$': { + 'next': '#exit' + } + }] + }] + }] + }, { + '$': { + 'id': 'exit' + }, + 'property': [], + 'block': [{ + 'submit': [{ + '$': { + 'method': 'post', + 'fetchtimeout': parameters.fetchtimeout, + 'expr': 'loopUrl', + 'namelist': 'sessionId' + } + }] + }] + }], + 'noinput': [{ + 'goto': [{ + '$': { + 'next': '#exit' + } + }] + }], + 'nomatch': [{ + 'goto': [{ + '$': { + 'next': '#exit' + } + }] + }], + 'catch': [{ + '$': { + 'event': 'maxspeechtimeout' + }, + 'submit': [{ + '$': { + 'method': 'post', + 'expr': 'maxspeechtimeoutUrl', + 'namelist': 'sessionId recognizerRequestID' + } + }] + }, { + '$': { + 'event': 'connection.disconnect' + }, + 'assign': [{ + '$': { + 'name': 'message', + 'expr': '_message' + } + }, { + '$': { + 'name': 'event', + 'expr': '_event' + } + }], + 'submit': [{ + '$': { + 'method': 'post', + 'expr': 'stopUrl', + 'namelist': 'sessionId message event' + } + }] + }, { + '$': { + 'event': 'error' + }, + 'assign': [{ + '$': { + 'name': 'errorCount', + 'expr': 'errorCount + 1' + } + }, { + '$': { + 'name': 'message', + 'expr': '_message' + } + }, { + '$': { + 'name': 'event', + 'expr': '_event' + } + }], + 'if': [{ + '$': { + 'cond': 'errorCount > 3' + }, + 'log': [{ + '_': 'Tranfer of last resort: sessionId: ,\n\t\tevent: , message: .', + '$': { + 'label': 'error' + }, + 'value': [{ + '$': { + 'expr': 'sessionId' + } + }, { + '$': { + 'expr': '_event' + } + }, { + '$': { + 'expr': '_message' + } + }] + }], + 'goto': [{ + '$': { + 'expr': 'lastResortUrl' + } + }] + }], + 'submit': [{ + '$': { + 'method': 'post', + 'expr': 'errorUrl', + 'namelist': 'sessionId message event' + } + }] + }] + } + }; + parameters.rmodel = parameters.rmodel || { + 'languageCode': parameters.languageCode, + 'maxAlternatives': 1, + 'model': 'phone_call', + 'useEnhanced': true, + 'speechContexts': [] + }; + parameters.suffix = parameters.suffix && `_${parameters.suffix}` || ''; + if (parameters.recognizedData && parameters.recognizedData.expectedPhrases) { + parameters.rmodel.speechContexts = [{ + phrases: parameters.recognizedData.expectedPhrases + }]; + } + xml.vxml.$['xml:lang'] = parameters.languageCode; + xml.vxml.property.push({ + '$': { + 'name': 'com.ivb.asr.application_name', + 'value': parameters.applicationName || `${parameters.workspaceId}_VerintVXML` + } + }, { + '$': { + 'name': 'com.ivb.asr.dialog_name', + 'value': parameters.dialogName + // 'value': parameters?.dialogName ?? (recognizedData?.answers?.join(";:;") || "EMPTY").substring(0, 100) + } + }, { + '$': { + 'name': 'com.ivb.asr.request_id', + 'value': parameters.requestId + } + }, { + '$': { + 'name': 'com.ivb.tts.application_name', + 'value': parameters.applicationName || `${parameters.workspaceId}_VerintVXML` + } + }, { + '$': { + 'name': 'com.ivb.tts.dialog_name', + 'value': parameters.dialogName + } + }, { + '$': { + 'name': 'com.ivb.tts.Voice-Engine', + 'value': 'google' + } + }, { + '$': { + 'name': 'com.ivb.tts.Voice-Name', + 'value': parameters.voiceName + } + }, { + '$': { + 'name': 'com.ivb.tts.Prosody-Rate', + 'value': parameters.prosodyRate + } + }); + if (parameters.processingSoundUrl) { + xml.vxml.property.push({ + '$': { + 'name': 'fetchaudio', + 'value': parameters.processingSoundUrl + } + }, { + '$': { + 'name': 'fetchaudiodelay', + 'value': '1s' + } + }, { + '$': { + 'name': 'fetchaudiominimum', + 'value': '1s' + } + }); + } + xml.vxml.var.unshift({ + '$': { + 'name': 'sessionId', + 'expr': `'${parameters.sessionId}'` + } + }, { + '$': { + 'name': 'recognizerRequestID', + 'expr': `'${parameters.requestId}'` + } + }, { + '$': { + 'name': 'grammarUri', + 'expr': parameters.grammarUri ? `'${parameters.grammarUri}'` : `'builtin:speech/transcribe?rname=Google;rmodel=${encodeURIComponent(JSON.stringify(parameters.rmodel))}'` + } + }, { + '$': { + 'name': 'dtmfgrammarUri', + 'expr': `'${parameters.dtmfgrammarUri}'` + } + }, { + '$': { + 'name': 'noinputUrl', + 'expr': `'${parameters.noinputUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_loop${parameters.suffix}/noinput`}'` + } + }, { + '$': { + 'name': 'nomatchUrl', + 'expr': `'${parameters.nomatchUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_loop${parameters.suffix}/nomatch`}'` + } + }, { + '$': { + 'name': 'loopUrl', + 'expr': `'${parameters.loopUr || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_loop${parameters.suffix}`}'` + } + }, { + '$': { + 'name': 'errorUrl', + // 'expr': `'${parameters.errorUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_error${parameters.suffix}`}'` + 'expr': `'${parameters.stopUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_stop${parameters.suffix}`}'` + } + }, { + '$': { + 'name': 'lastResortUrl', + 'expr': `'${parameters.lastResortUrl}'` + } + }, { + '$': { + 'name': 'stopUrl', + 'expr': `'${parameters.stopUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_stop${parameters.suffix}`}'` + } + }, { + '$': { + 'name': 'maxspeechtimeoutUrl', + 'expr': `'${parameters.maxspeechtimeoutUrl || `${parameters.hostname}/ProxyScript/run/${parameters.workspaceId}/${parameters.branch}/vxml_loop${parameters.suffix}/maxspeechtimeout`}'` + } + }); + parameters.vars.forEach(v => { + xml.vxml.var.unshift(v); + }); + xml.vxml.form = xml.vxml.form.map(f => { + switch (f.$.id) { + case 'main': + if (f.property) { + f.property = f.property.map(p => { + switch (p.$.name) { + case 'confidencelevel': + p.$.value = parameters.confidencelevel; + break; + case 'sensitivity': + p.$.value = parameters.sensitivity; + break; + case 'completetimeout': + p.$.value = parameters.completetimeout; + break; + case 'incompletetimeout': + p.$.value = parameters.incompletetimeout; + break; + case 'maxspeechtimeout': + p.$.value = parameters.maxspeechtimeout; + break; + case 'timeout': + p.$.value = parameters.timeout; + break; + case 'com.intervoice.log.privatedata': + p.$.value = parameters.privatedata; + break; + case 'interdigittimeout': + p.$.value = parameters.dtmf.interdigittimeout; + break; + case 'termtimeout': + p.$.value = parameters.dtmf.termtimeout; + break; + } + return p; + }); + } + if (parameters.disconnect) { + const obj = {}; + if (parameters.promptAudio) { + obj.prompt = []; + if (Array.isArray(parameters.promptAudio)) { + obj.prompt.push(...parameters.promptAudio.map(audio => { + return { + $: { + bargein: parameters.bargein + }, + audio: [{ + $: { + src: audio + } + }] + }; + })); + } else { + obj.prompt.push({ + $: { + bargein: parameters.bargein + }, + audio: [{ + $: { + src: parameters.promptAudio + } + }] + }); + } + } else if (parameters.promptText) { + obj.prompt = { + _: parameters.promptText, + $: { + bargein: parameters.bargein + } + }; + } else if (parameters.promptMixed) { + obj.prompt = parameters.promptMixed.map(prompt => { + const obj = { + $: { + bargein: parameters.bargein + } + }; + if (prompt.url) { + obj.audio = [{ + $: { + src: prompt.url + } + }]; + } else { + obj._ = prompt.text; + } + return obj; + }); + } + obj.submit = { + $: { + method: 'post', + expr: 'stopUrl', + namelist: 'sessionId' + } + }; + f.block = (f.block || []).concat(obj); + } + if (f.field) { + f.field = f.field.map(f => { + switch (f.$.name) { + case 'intent': + if (parameters.promptAudio) { + f.prompt = []; + if (Array.isArray(parameters.promptAudio)) { + f.prompt.push(...parameters.promptAudio.map(audio => { + return { + $: { + bargein: parameters.bargein + }, + audio: [{ + $: { + src: audio + } + }] + }; + })); + } else { + f.prompt.push({ + $: { + bargein: parameters.bargein + }, + audio: [{ + $: { + src: parameters.promptAudio + } + }] + }); + } + } else if (parameters.promptText) { + f.prompt = { + '_': parameters.promptText, + '$': { + bargein: parameters.bargein + } + }; + } else if (parameters.promptMixed) { + f.prompt = parameters.promptMixed.map(prompt => { + const obj = { + $: { + bargein: parameters.bargein + } + }; + if (prompt.url) { + obj.audio = [{ + $: { + src: prompt.url + } + }]; + } else { + obj._ = prompt.text; + } + return obj; + }); + } + break; + } + return f; + }); + } + break; + } + return f; + }); + return builder.buildObject(xml); +} +}; \ No newline at end of file diff --git a/distributor/_studio_dependecies/ProxyScript/vxml_error_6647ad7b84df93835bbb4346.js b/distributor/_studio_dependecies/ProxyScript/vxml_error_6647ad7b84df93835bbb4346.js new file mode 100644 index 0000000..0d4b973 --- /dev/null +++ b/distributor/_studio_dependecies/ProxyScript/vxml_error_6647ad7b84df93835bbb4346.js @@ -0,0 +1,17 @@ +console.log(req.body); // <- Post request body +console.log(res.query); // <- Query strings +const vxmlResponse = ` + +
+ + An error has occurred + + +
+
`; +res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0'); +res.setHeader('etag', nanoid()); +res.type('text/xml'); +res.send(vxmlResponse); \ No newline at end of file diff --git a/distributor/_studio_dependecies/ProxyScript/vxml_front_door_6647ad7b84df93835bbb4346.js b/distributor/_studio_dependecies/ProxyScript/vxml_front_door_6647ad7b84df93835bbb4346.js new file mode 100644 index 0000000..afb5ad8 --- /dev/null +++ b/distributor/_studio_dependecies/ProxyScript/vxml_front_door_6647ad7b84df93835bbb4346.js @@ -0,0 +1,20 @@ +console.log({ + frontdoor: "1.0", + body: req.body, + query: req.query, + params: req.params +}); +const brand = req.query.brand; +(async () => { + const vxmlResponse = vxmlgen_gvf_6647ad7b84df93835bbb4346().frontDoor({ + hostname: voiceSettings_6647ad7b84df93835bbb4346.ivr.hostname, + workspaceId: req.params.workspaceId, + branch: req.params.branch, + suffix: voiceSettings_6647ad7b84df93835bbb4346.suffix, + brand + }); + res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0'); + res.setHeader('etag', nanoid()); + res.type('text/xml'); + res.send(vxmlResponse); +})(); \ No newline at end of file diff --git a/distributor/_studio_dependecies/ProxyScript/vxml_loop_6647ad7b84df93835bbb4346.js b/distributor/_studio_dependecies/ProxyScript/vxml_loop_6647ad7b84df93835bbb4346.js new file mode 100644 index 0000000..d53742d --- /dev/null +++ b/distributor/_studio_dependecies/ProxyScript/vxml_loop_6647ad7b84df93835bbb4346.js @@ -0,0 +1,431 @@ +const utterance = req.body.utterance; +const sessionId = req.body.sessionId; +console.log({ + loop: "1.6", + utterance, + sessionId +}); +const getNested = (obj, ...args) => { + return args.reduce((obj, level) => { + return obj && obj[level]; + }, obj); +}; +if (req.body.body && req.body.query) { + const tmpBody = JSON.parse(JSON.stringify(req.body.body)); + const tmpQuery = JSON.parse(JSON.stringify(req.body.query)); + req.query = tmpQuery; + req.body = tmpBody; +} +if (req.body.sessionJSON) { + try { + req.body.sessionJSON = JSON.parse(req.body.sessionJSON); + } catch (e) { + console.log(e.message); + } +} +const verbose = voiceSettings_6647ad7b84df93835bbb4346.verbose || false; +const useDomain = req.body.useDomain; +const route = req.params && req.params[0] && req.params[0].split('/').slice(-1)[0]; +const requestId = uuidv4(); +const safetyNet = voiceSettings_6647ad7b84df93835bbb4346.responses.safetynet; +const waitHoldTimeout = voiceSettings_6647ad7b84df93835bbb4346.waitHoldTimeout; +let promptText = voiceSettings_6647ad7b84df93835bbb4346.responses.welcome; +let disconnect; +let waveform; +let gcsUri; +let fileName; +let recognizedData; +if (req.body.waveform) { + try { + waveform = url.parse(req.body.waveform, true).query.googleUri; + fileName = url.parse(waveform, true); + if (fileName && fileName.pathName) gcsUri = `gs:/${fileName.pathname}`; + } catch (e) { + console.log(e.message); + } +} +const isCA = () => { + return voiceSettings_6647ad7b84df93835bbb4346?.integrations?.CAInterface?.enabled || false; +}; +const getCA = () => { + if (isCA()) { + let ca = "CAInterface"; + if (voiceSettings_6647ad7b84df93835bbb4346.integrations.CAInterface.suffix) { + ca += voiceSettings_6647ad7b84df93835bbb4346.integrations.CAInterface.suffix; + } + ca += "()"; + return eval(ca); + } + return undefined; +}; +const getInteractionId = async (ani, dnis, xSpVerintId) => { + const suffix = voiceSettings_6647ad7b84df93835bbb4346.suffix && `_${voiceSettings_6647ad7b84df93835bbb4346.suffix}` || ""; + const callback = `${voiceSettings_6647ad7b84df93835bbb4346.ivr.hostname}/ProxyScript/run/${req.params.workspaceId}/${req.params.branch}/vxml_transfer${suffix}?sessionId=${sessionId}`; + let tisId; + const CA = getCA(); + if (CA) { + try { + const OIDC = await CA.getOIDC(); + if (OIDC.access_token) { + tisId = await CA.createTelephonyInteraction(OIDC, ani, dnis, xSpVerintId, callback); + } else { + console.log("getInteractionId failed: Bad OIDC credentials"); + console.log(OIDC); + } + } catch (error) { + console.log(`getInteractionId failed. error: ${error.message}`); + } + } + return tisId; +}; +const blockWaitLiveOperator = async (smStr, sessionMap, CA) => { + const start = Date.now(); + let rd; + const loopWait = 100; + const total = voiceSettings_6647ad7b84df93835bbb4346.waitHoldQueueStatus * 1000 / loopWait; + for (let i = 0; i < total; i++) { + const sessionMap = await redis.hGetAll(smStr); + if (sessionMap.transferCall) { + console.log("Loop: transfer call"); + rd = { + answers: [voiceSettings_6647ad7b84df93835bbb4346.responses.transferCall], + endCall: true + }; + return rd; + } + await new Promise(r => setTimeout(r, loopWait)); + } + if (CA) { + try { + const OIDC = await CA.getOIDC(); + // fallthrough, provide a queue status update + const predictions = await CA.getWaitTime(OIDC, sessionMap.interactionId); + rd = await run_app_event(sessionMap, smStr, "VXML Queue Status Event", "vxmlqueuestatus", voiceSettings_6647ad7b84df93835bbb4346.responses.pleaseContinueToHold, { + predictions + }); + } catch (error) { + console.log("/predictions failed" + error.message); + } + } + if (!rd) { + rd = { + answers: [voiceSettings_6647ad7b84df93835bbb4346.responses.pleaseContinueToHold] + }; + } + console.log({ + blockWaitElapsed: Date.now() - start + }); + return rd; +}; +const sequenceApiCalls = async (smStr, interactionId, apiCalls) => { + const CA = getCA(); + if (CA) { + await redis.hSet(smStr, { + waitForApi: "true" + }); + const OIDC = await CA.getOIDC(); + for (let api of apiCalls) { + try { + if (api.api == "patchCallInfo") { + await CA.patchCallInfo(OIDC, interactionId, api.params); + } else if (api.api = "connectWithLiveOperator") { + const isVirtualHold = api.params.isVirtualHold; + const callReason = api.params.callReason; + if (isVirtualHold || callReason) { + await CA.patchCallInfo(OIDC, interactionId, { + isVirtualHold, + callReason + }); + } + await CA.connectWithLiveOperator(OIDC, interactionId); + redis.hSet(smStr, { + waitForLiveOperator: "true", + lastQueueStatus: JSON.stringify(Date.now()) + }); + redis.hDel(smStr, "pendingAPIs"); + } else { + console.log({ + badapi: api + }); + } + } catch (err) { + console.log(`Error: ${api.api} failed. ${err.message}`); + } + } + redis.hDel(smStr, "waitForApi"); + } +}; +const run_app_event = async (sessionMap, smStr, intent, input, defaultAnswer, metadata = {}) => { + const configuration = { + directIntentHit: intent + }; + return await run_model_and_report(sessionMap, smStr, input, defaultAnswer, configuration, metadata); +}; +const run_model_and_report = async (sessionMap, smStr, input, defaultAnswer, configuration, metadata = {}) => { + let privateData = voiceSettings_6647ad7b84df93835bbb4346.ivr.privateData || false; + let interactionId = sessionMap.interactionId; + let { + data: recognizedData + } = await axios.post(`${voiceSettings_6647ad7b84df93835bbb4346.nlu.apiBaseURL}/Model/run/${req.params.workspaceId}/${req.params.branch}/${voiceSettings_6647ad7b84df93835bbb4346.nlu.modelName}`, { + input, + configuration, + conversationId: sessionMap.conversationId, + settings: voiceSettings_6647ad7b84df93835bbb4346.nlu.settings, + channel: "voice", + // for old multi-channel widgets + metadata: { + channel: 'voice', + gcsUriAudio: waveform, + ani: sessionMap.ani, + dnis: sessionMap.dnis, + callid: sessionMap.callid, + xSpVerintId: sessionMap.xSpVerintId, + interactionId, + sessionId, + syntheticAudio: true, + utteranceFileName: `${fileName?.pathname?.replace('/asr-archive/', '') || ""}`, + ...metadata + } + }); + privateData = recognizedData.ivrSettings?.privateData || privateData; + if (!privateData && recognizedData.conversationId && sessionMap.conversationId === undefined) { + db.analytics.addConversation({ + id: recognizedData.conversationId + }); + } + if (recognizedData.conversationId) { + await redis.hSet(smStr, { + conversationId: recognizedData.conversationId + }); + } + if (defaultAnswer && recognizedData.answers.length === 0) { + recognizedData.answers = [defaultAnswer]; + } else if (recognizedData.classificationResults.length === 0 && recognizedData.answers.length === 0) { + recognizedData.answers = [voiceSettings_6647ad7b84df93835bbb4346.responses.unrecognized]; + } else if (recognizedData.answers.length === 0) { + recognizedData.answers = [voiceSettings_6647ad7b84df93835bbb4346.responses.unanswered]; + } + if (!recognizedData.ivrSettings) { + recognizedData.ivrSettings = {}; + } + let timeout; + // look for the wait-hold event from the flow + + if (recognizedData.vxmlCAApis) { + timeout = waitHoldTimeout; + // async + if (recognizedData.vxmlCAApis.find(api => api.api == "connectWithLiveOperator")) { + // defer api until after the current prompt finishes. next loop + console.log("Deferring VC Apis"); + await redis.hSet(smStr, { + waitForLiveOperator: "true", + pendingAPIs: JSON.stringify(recognizedData.vxmlCAApis) + }); + sessionMap.waitForLiveOperator = true; + } else { + sequenceApiCalls(smStr, interactionId, recognizedData.vxmlCAApis); + } + } else if (sessionMap.waitForLiveOperator) { + timeout = waitHoldTimeout; + } + if (timeout && !recognizedData.ivrSettings.timeout) { + recognizedData.ivrSettings.timeout = timeout; + } + // add dialogName hueristically + if (!recognizedData.ivrSettings.dialogName) { + let dialogName = ""; + if (recognizedData.classificationResults.length) { + dialogName = recognizedData.classificationResults[0].label.split(/\s+/).join('_'); + } + if (recognizedData.answers.length) { + let words = recognizedData.answers[0].split(/\s+/).map(word => { + return word.replace(/[^a-z0-9]/gi, ''); + }).filter(word => word.length > 0); + for (let i = 0; i < Math.min(6, words.length); i++) { + dialogName += "_" + words[i]; + } + } + if (dialogName.length) { + recognizedData.ivrSettings.dialogName = dialogName; + } + } + if (!privateData && input !== "vxmlqueuestatus") { + db.analytics.addTransaction(recognizedData); + } + return recognizedData; +}; +// DEMO DISTRIBUTOR CODE +console.log("req.body.interpretation"); +console.log(req.body.interpretation); +const selectedWorkspaceOption = req.body.interpretation; +console.log("Selected Option:"); +console.log(selectedWorkspaceOption); + +let vxmlResponse; + +const generateVXML = async () => { + try { + // Common properties used in all cases, unless specified in the case block + const commonProperties = { + hostname: "https://router.ivastudio.verint.live", + branch: "current", + requestId, + promptText, + disconnect, + recognizedData, + ...voiceSettings_6647ad7b84df93835bbb4346.ivr, + }; + + switch (selectedWorkspaceOption) { + case "1": + // Peter's Workspace + vxmlResponse = vxmlgen_gvf_6647ad7b84df93835bbb4346().frontDoor({ + workspaceId: "67bca862210071627d32ef12", + suffix: "6647ad7b84df93835bbb4346", + ...commonProperties, + }); + break; + case "2": + // David's Workspace + vxmlResponse = vxmlgen_gvf_6647ad7b84df93835bbb4346().frontDoor({ + workspaceId: "67c9ddd765e40fd3d60ef441", + suffix: "6647ad7b84df93835bbb4346", + ...commonProperties, + }); + break; + case "3": + // Ramzi's Workspace + vxmlResponse = vxmlgen_gvf_6647ad7b84df93835bbb4346().frontDoor({ + workspaceId: "67c758bf8e90ca81122106a5", + suffix: "6647ad7b84df93835bbb4346", + ...commonProperties, + }); + break; + case "4": + // Amber's Workspace + vxmlResponse = vxmlgen_gvf_6647ad7b84df93835bbb4346().frontDoor({ + workspaceId: "67c9dde765e40fd3d60ef446", + suffix: "6647ad7b84df93835bbb4346", + ...commonProperties, + }); + break; + case "5": + // Ring Central Workspace + vxmlResponse = vxmlgen_gvf_6647ad7b84df93835bbb4346().frontDoor({ + workspaceId: "68098e35ad4260eaf807cff2", + suffix: "6647ad7b84df93835bbb4346", + ...commonProperties, + }); + break; + default: + vxmlResponse = vxmlgen_gvf_6647ad7b84df93835bbb4346().loop({ + hostname: voiceSettings_6647ad7b84df93835bbb4346.ivr.hostname, + workspaceId: req.params.workspaceId, + suffix: voiceSettings_6647ad7b84df93835bbb4346.suffix, + branch: req.params.branch, + sessionId, + ...commonProperties, + }); + break; + } + + // END OF DEMO DISTRIBUTOR CODE + res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0'); + res.setHeader('etag', nanoid()); + res.type('text/xml'); + if (verbose) { + console.log('============================'); + console.log(vxmlResponse); + console.log('++++++++++++++++++++++++++++'); + } + res.send(vxmlResponse); + } catch (e) { + console.log(e.message); + if (e.toJSON) console.log(e.toJSON()); + res.status(500); + } +}; +if (sessionId) { + const smStr = `session-map-${sessionId}`; + (async () => { + if (req.body.sessionJSON && req.body.sessionJSON) { + const ani = getNested(req.body, 'sessionJSON', 'telephone', 'ani').split('@')[0]; + const dnis = getNested(req.body, 'sessionJSON', 'connection', 'protocol', 'sip', 'requesturi').split('@')[0]; + const callid = getNested(req.body, 'sessionJSON', 'connection', 'protocol', 'sip', 'headers', 'call-id').split('_')[0]; + let xSpVerintId = getNested(req.body, 'sessionJSON', 'connection', 'protocol', 'sip', 'headers', 'x-sp-verintid') || callid; + if (utterance == undefined) { + getInteractionId(ani, dnis, callid).then(interactionId => { + if (interactionId) { + redis.hSet(smStr, { + interactionId + }); + } + }); + await redis.hSet(smStr, { + ani, + dnis, + callid, + xSpVerintId + }); + await redis.expire(smStr, 60 * 60 * 24); + } + } + const sessionMap = await redis.hGetAll(smStr); + Object.keys(sessionMap).forEach((key, i) => { + try { + sessionMap[key] = JSON.parse(sessionMap[key]); + } catch (e) {} + }); + console.log(sessionMap); + if (sessionMap.waitForApi) { + promptText = undefined; + recognizedData = { + answers: [""], + ivrSettings: { + timeout: waitHoldTimeout + } + }; + } else if (sessionMap.endCall) { + promptText = undefined; + recognizedData = { + answers: [""], + endCall: true + }; + } else if (sessionMap.transferCall) { + recognizedData = await run_app_event(sessionMap, smStr, 'VXML Transfer Call Event', 'vxmltransfercall', voiceSettings_6647ad7b84df93835bbb4346.responses.transferCall); + recognizedData.endCall = true; + } else if (sessionMap.waitForLiveOperator) { + if (sessionMap.pendingAPIs) { + // async. success will delete sessionMap.pendingApis + sequenceApiCalls(smStr, sessionMap.interactionId, sessionMap.pendingAPIs); + } + recognizedData = await blockWaitLiveOperator(smStr, sessionMap, getCA()); + } else if (route === 'noinput') { + recognizedData = await run_app_event(sessionMap, smStr, 'VXML Noinput Event', 'vxmlnoinput', voiceSettings_6647ad7b84df93835bbb4346.responses.noinput); + } else if (route === 'nomatch') { + recognizedData = await run_app_event(sessionMap, smStr, 'VXML Unrecognized Event', 'vxmlunrecognized', voiceSettings_6647ad7b84df93835bbb4346.responses.unrecognized); + } else if (route === 'maxspeechtimeout') { + recognizedData = await run_app_event(sessionMap, smStr, 'VXML Max Speech Timeout', 'vxmlmaxspeechtimeout', voiceSettings_6647ad7b84df93835bbb4346.responses.speechtimeout); + } else if (utterance) { + recognizedData = await run_model_and_report(sessionMap, smStr, utterance); + } else { + recognizedData = await run_app_event(sessionMap, smStr, 'VXML Welcome Event', 'vxmlwelcome', voiceSettings_6647ad7b84df93835bbb4346.responses.welcome); + } + if (recognizedData && recognizedData.transferCall) { + recognizedData.endCall = true; + await redis.hSet(smStr, { + transferCall: "true", + transferTo: recognizedData.transferTo || voiceSettings_6647ad7b84df93835bbb4346.transfer.destination + }); + } + promptText = recognizedData && recognizedData.answers && recognizedData.answers.join(' ') || promptText; + disconnect = recognizedData && recognizedData.endCall || false; + generateVXML(sessionMap); + })().catch(e => { + console.log(e.message); + promptText = safetyNet; + generateVXML(); + }); +} else { + generateVXML(); +} \ No newline at end of file diff --git a/distributor/_studio_dependecies/ProxyScript/vxml_stop_6647ad7b84df93835bbb4346.js b/distributor/_studio_dependecies/ProxyScript/vxml_stop_6647ad7b84df93835bbb4346.js new file mode 100644 index 0000000..4863791 --- /dev/null +++ b/distributor/_studio_dependecies/ProxyScript/vxml_stop_6647ad7b84df93835bbb4346.js @@ -0,0 +1,57 @@ +console.log({ + stop: "1.5", + body: req.body, + query: req.query, + params: req.params +}); +const getCA = () => { + if (voiceSettings_6647ad7b84df93835bbb4346?.integrations?.CAInterface?.enabled) { + let ca = "CAInterface"; + if (voiceSettings_6647ad7b84df93835bbb4346.integrations.CAInterface.suffix) { + ca += voiceSettings_6647ad7b84df93835bbb4346.integrations.CAInterface.suffix; + } + ca += "()"; + return eval(ca); + } + return undefined; +}; +const sessionId = req.body.sessionId; +(async () => { + const smStr = `session-map-${sessionId}`; + const sessionMap = await redis.hGetAll(smStr); + const terminationObject = { + type: 'RETURN' + }; + const transferCall = sessionMap.transferCall || req.headers["transfer-call-tester"]; + if (transferCall) { + terminationObject.type = 'TRANSFER'; + let dest = sessionMap.transferTo || voiceSettings_6647ad7b84df93835bbb4346.transfer.destination; + const params = []; + if (sessionMap.xSpVerintId) params.push("X-SP-VerintID=" + encodeURIComponent(sessionMap.xSpVerintId)); + for (let [index, value] of params.entries()) { + if (index == 0) { + dest += "?"; + } else { + dest += "&"; + } + dest += value; + } + terminationObject.destination = dest; + console.log({ + terminationObject + }); + } else if (sessionMap.waitForLiveOperator === "true" && sessionMap.interactionId) { + const CA = getCA(); + if (CA) { + CA.endTelephonyInteraction(await CA.getOIDC(), sessionMap.interactionId, "abandoned-in-queue"); + } + } + const vxmlResponse = vxmlgen_gvf_6647ad7b84df93835bbb4346().stop({ + terminationObject + }); + console.log(vxmlResponse); + res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0'); + res.setHeader('etag', nanoid()); + res.type('text/xml'); + res.send(vxmlResponse); +})(); \ No newline at end of file diff --git a/distributor/_studio_dependecies/ProxyScript/vxml_transfer_6647ad7b84df93835bbb4346.js b/distributor/_studio_dependecies/ProxyScript/vxml_transfer_6647ad7b84df93835bbb4346.js new file mode 100644 index 0000000..30d2921 --- /dev/null +++ b/distributor/_studio_dependecies/ProxyScript/vxml_transfer_6647ad7b84df93835bbb4346.js @@ -0,0 +1,22 @@ +console.log({ + transfer: "1.2", + query: req.query +}); +const sessionId = req.query.sessionId; +console.log("Transfer", sessionId); +if (sessionId) { + const smStr = `session-map-${sessionId}`; + (async () => { + await redis.hSet(smStr, { + transferCall: "true", + waitForLiveOperator: "false" + }); + res.send(200); + })().catch(e => { + console.log("error"); + console.log(e.message); + res.send(500); + }); +} else { + res.send(400); +} \ No newline at end of file