diff --git a/.gitignore b/.gitignore index c64fb5c1b..bb0df62a8 100644 --- a/.gitignore +++ b/.gitignore @@ -94,3 +94,4 @@ yarn-debug.log* .vscode .claude/settings.local.json .cursor +CLAUDE.local.md diff --git a/Gemfile b/Gemfile index f37719a42..8b34b152d 100644 --- a/Gemfile +++ b/Gemfile @@ -181,7 +181,10 @@ gem 'reverse_markdown' gem 'iso-639' gem 'ruby-openai' -gem 'ai-agents', '>= 0.2.1' +gem 'ai-agents', '>= 0.4.3' + +# TODO: Move this gem as a dependency of ai-agents +gem 'ruby_llm-schema' gem 'shopify_api' diff --git a/Gemfile.lock b/Gemfile.lock index e755f82f2..8a0eb4c48 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,81 +1,110 @@ +GIT + remote: https://github.com/chatwoot/azure-storage-ruby + revision: 9957cf899d33a285b5dfe15bdb875292398e392b + branch: chatwoot + specs: + azure-storage-blob (2.0.3) + azure-storage-common (~> 2.0) + nokogiri (~> 1, >= 1.10.8) + azure-storage-common (2.0.4) + faraday (~> 2.0) + faraday-follow_redirects (~> 0.3.0) + faraday-net_http_persistent (~> 2.0) + net-http-persistent (~> 4.0) + nokogiri (~> 1, >= 1.10.8) + +GIT + remote: https://github.com/chatwoot/devise-secure_password + revision: adcc85fe1babfe40feae73dbcae64d14fff86e69 + branch: chatwoot + specs: + devise-secure_password (2.0.1) + devise (>= 4.0.0, < 5.0.0) + railties (>= 5.0.0, < 8.0.0) + GEM remote: https://rubygems.org/ specs: - actioncable (7.2.2.1) - actionpack (= 7.2.2.1) - activesupport (= 7.2.2.1) + actioncable (7.1.5.2) + actionpack (= 7.1.5.2) + activesupport (= 7.1.5.2) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (7.2.2.1) - actionpack (= 7.2.2.1) - activejob (= 7.2.2.1) - activerecord (= 7.2.2.1) - activestorage (= 7.2.2.1) - activesupport (= 7.2.2.1) - mail (>= 2.8.0) - actionmailer (7.2.2.1) - actionpack (= 7.2.2.1) - actionview (= 7.2.2.1) - activejob (= 7.2.2.1) - activesupport (= 7.2.2.1) - mail (>= 2.8.0) + actionmailbox (7.1.5.2) + actionpack (= 7.1.5.2) + activejob (= 7.1.5.2) + activerecord (= 7.1.5.2) + activestorage (= 7.1.5.2) + activesupport (= 7.1.5.2) + mail (>= 2.7.1) + net-imap + net-pop + net-smtp + actionmailer (7.1.5.2) + actionpack (= 7.1.5.2) + actionview (= 7.1.5.2) + activejob (= 7.1.5.2) + activesupport (= 7.1.5.2) + mail (~> 2.5, >= 2.5.4) + net-imap + net-pop + net-smtp rails-dom-testing (~> 2.2) - actionpack (7.2.2.1) - actionview (= 7.2.2.1) - activesupport (= 7.2.2.1) + actionpack (7.1.5.2) + actionview (= 7.1.5.2) + activesupport (= 7.1.5.2) nokogiri (>= 1.8.5) racc - rack (>= 2.2.4, < 3.2) + rack (>= 2.2.4) rack-session (>= 1.0.1) rack-test (>= 0.6.3) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - useragent (~> 0.16) - actiontext (7.2.2.1) - actionpack (= 7.2.2.1) - activerecord (= 7.2.2.1) - activestorage (= 7.2.2.1) - activesupport (= 7.2.2.1) + actiontext (7.1.5.2) + actionpack (= 7.1.5.2) + activerecord (= 7.1.5.2) + activestorage (= 7.1.5.2) + activesupport (= 7.1.5.2) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (7.2.2.1) - activesupport (= 7.2.2.1) + actionview (7.1.5.2) + activesupport (= 7.1.5.2) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - active_record_query_trace (1.8.3) - activerecord (>= 6.0.0) - activejob (7.2.2.1) - activesupport (= 7.2.2.1) + active_record_query_trace (1.8) + activejob (7.1.5.2) + activesupport (= 7.1.5.2) globalid (>= 0.3.6) - activemodel (7.2.2.1) - activesupport (= 7.2.2.1) - activerecord (7.2.2.1) - activemodel (= 7.2.2.1) - activesupport (= 7.2.2.1) + activemodel (7.1.5.2) + activesupport (= 7.1.5.2) + activerecord (7.1.5.2) + activemodel (= 7.1.5.2) + activesupport (= 7.1.5.2) timeout (>= 0.4.0) - activerecord-import (2.2.0) + activerecord-import (2.1.0) activerecord (>= 4.2) - activestorage (7.2.2.1) - actionpack (= 7.2.2.1) - activejob (= 7.2.2.1) - activerecord (= 7.2.2.1) - activesupport (= 7.2.2.1) + activestorage (7.1.5.2) + actionpack (= 7.1.5.2) + activejob (= 7.1.5.2) + activerecord (= 7.1.5.2) + activesupport (= 7.1.5.2) marcel (~> 1.0) - activesupport (7.2.2.1) + activesupport (7.1.5.2) base64 benchmark (>= 0.3) bigdecimal - concurrent-ruby (~> 1.0, >= 1.3.1) + concurrent-ruby (~> 1.0, >= 1.0.2) connection_pool (>= 2.2.5) drb i18n (>= 1.6, < 2) logger (>= 1.4.2) minitest (>= 5.1) + mutex_m securerandom (>= 0.3) - tzinfo (~> 2.0, >= 2.0.5) + tzinfo (~> 2.0) acts-as-taggable-on (12.0.0) activerecord (>= 7.1, < 8.1) zeitwerk (>= 2.4, < 3.0) @@ -89,13 +118,13 @@ GEM kaminari (~> 1.2.2) sassc-rails (~> 2.1) selectize-rails (~> 0.6) - administrate-field-active_storage (1.0.6) + administrate-field-active_storage (1.0.3) administrate (>= 0.2.2) rails (>= 7.0) - administrate-field-belongs_to_search (0.10.0) + administrate-field-belongs_to_search (0.9.0) administrate (>= 0.3, < 1.0) jbuilder (~> 2) - rails (>= 4.2, < 8.0) + rails (>= 4.2, < 7.2) selectize-rails (~> 0.6) ai-agents (0.4.3) ruby_llm (~> 1.3) @@ -104,30 +133,25 @@ GEM rake (>= 10.4, < 14.0) ast (2.4.3) attr_extras (7.1.0) - audited (5.8.0) - activerecord (>= 5.2, < 8.2) - activesupport (>= 5.2, < 8.2) - aws-eventstream (1.4.0) - aws-partitions (1.1145.0) - aws-sdk-core (3.229.0) - aws-eventstream (~> 1, >= 1.3.0) - aws-partitions (~> 1, >= 1.992.0) - aws-sigv4 (~> 1.9) - base64 - bigdecimal + audited (5.4.1) + activerecord (>= 5.0, < 7.7) + activesupport (>= 5.0, < 7.7) + aws-eventstream (1.2.0) + aws-partitions (1.760.0) + aws-sdk-core (3.171.1) + aws-eventstream (~> 1, >= 1.0.2) + aws-partitions (~> 1, >= 1.651.0) + aws-sigv4 (~> 1.5) jmespath (~> 1, >= 1.6.1) - logger - aws-sdk-kms (1.110.0) - aws-sdk-core (~> 3, >= 3.228.0) - aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.196.1) - aws-sdk-core (~> 3, >= 3.228.0) + aws-sdk-kms (1.64.0) + aws-sdk-core (~> 3, >= 3.165.0) + aws-sigv4 (~> 1.1) + aws-sdk-s3 (1.122.0) + aws-sdk-core (~> 3, >= 3.165.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.5) - aws-sigv4 (1.12.1) + aws-sigv4 (~> 1.4) + aws-sigv4 (1.5.2) aws-eventstream (~> 1, >= 1.0.2) - azure-blob (0.5.9.1) - rexml barnes (0.0.9) multi_json (~> 1) statsd-ruby (~> 1.1) @@ -136,51 +160,47 @@ GEM benchmark (0.4.1) bigdecimal (3.2.2) bindex (0.8.1) - bootsnap (1.18.6) + bootsnap (1.16.0) msgpack (~> 1.2) - brakeman (7.1.0) - racc - browser (6.2.0) + brakeman (5.4.1) + browser (5.3.1) builder (3.3.0) - bullet (7.2.0) + bullet (8.0.7) activesupport (>= 3.0.0) uniform_notifier (~> 1.11) bundle-audit (0.1.0) bundler-audit - bundler-audit (0.9.2) + bundler-audit (0.9.1) bundler (>= 1.2.0, < 3) thor (~> 1.0) - byebug (12.0.0) + byebug (11.1.3) childprocess (5.1.0) logger (~> 1.5) climate_control (1.2.0) coderay (1.1.3) - commonmarker (0.23.11) + commonmarker (0.23.10) concurrent-ruby (1.3.5) connection_pool (2.5.3) crack (1.0.0) bigdecimal rexml crass (1.0.6) - cronex (0.15.0) - tzinfo - unicode (>= 0.4.4.5) - csv (3.3.5) + csv (3.3.0) csv-safe (3.3.1) csv (~> 3.0) - database_cleaner (2.1.0) + database_cleaner (2.0.2) database_cleaner-active_record (>= 2, < 3) - database_cleaner-active_record (2.2.2) + database_cleaner-active_record (2.1.0) activerecord (>= 5.a) - database_cleaner-core (~> 2.0) + database_cleaner-core (~> 2.0.0) database_cleaner-core (2.0.1) date (3.4.1) ddtrace (0.48.0) ffi (~> 1.0) msgpack - debug (1.11.0) - irb (~> 1.10) - reline (>= 0.3.8) + debug (1.8.0) + irb (>= 1.5.0) + reline (>= 0.3.1) declarative (0.0.20) devise (4.9.4) bcrypt (~> 3.0) @@ -188,100 +208,93 @@ GEM railties (>= 4.1.0) responders warden (~> 1.2.3) - devise-secure_password (2.1.0) - devise (>= 4.0.0, < 5.0.0) - railties (>= 5.0.0, < 8.0.0) devise_token_auth (1.2.5) bcrypt (~> 3.0) devise (> 3.5.2, < 5) rails (>= 4.2.0, < 8.1) - diff-lcs (1.6.2) - digest-crc (0.7.0) + diff-lcs (1.5.1) + digest-crc (0.6.5) rake (>= 12.0.0, < 14.0.0) - docile (1.4.1) - domain_name (0.6.20240107) - dotenv (3.1.8) - dotenv-rails (3.1.8) - dotenv (= 3.1.8) + docile (1.4.0) + domain_name (0.5.20190701) + unf (>= 0.0.5, < 1.0.0) + dotenv (3.1.2) + dotenv-rails (3.1.2) + dotenv (= 3.1.2) railties (>= 6.1) - down (5.4.2) + down (5.4.0) addressable (~> 2.8) drb (2.2.3) - dry-cli (1.3.0) - elastic-apm (4.8.0) + dry-cli (1.1.0) + ecma-re-validator (0.4.0) + regexp_parser (~> 2.2) + elastic-apm (4.6.2) concurrent-ruby (~> 1.0) http (>= 3.0) ruby2_keywords - email_reply_trimmer (0.2.0) - erb (5.0.2) - erubi (1.13.1) - et-orbi (1.3.0) + email_reply_trimmer (0.1.13) + erubi (1.13.0) + et-orbi (1.2.11) tzinfo event_stream_parser (1.0.0) - execjs (2.10.0) + execjs (2.8.1) facebook-messenger (2.0.1) httparty (~> 0.13, >= 0.13.7) rack (>= 1.4.5) - factory_bot (6.5.4) - activesupport (>= 6.1.0) - factory_bot_rails (6.5.0) - factory_bot (~> 6.5) - railties (>= 6.1.0) - faker (3.5.2) + factory_bot (6.4.5) + activesupport (>= 5.0.0) + factory_bot_rails (6.4.3) + factory_bot (~> 6.4) + railties (>= 5.0.0) + faker (3.2.0) i18n (>= 1.8.11, < 2) - faraday (2.13.4) - faraday-net_http (>= 2.0, < 3.5) - json - logger - faraday-mashify (1.0.0) + faraday (2.9.0) + faraday-net_http (>= 2.0, < 3.2) + faraday-follow_redirects (0.3.0) + faraday (>= 1, < 3) + faraday-mashify (0.1.1) faraday (~> 2.0) hashie - faraday-multipart (1.1.1) - multipart-post (~> 2.0) - faraday-net_http (3.4.1) - net-http (>= 0.5.0) - faraday-retry (2.3.2) + faraday-multipart (1.0.4) + multipart-post (~> 2) + faraday-net_http (3.1.0) + net-http + faraday-net_http_persistent (2.1.0) + faraday (~> 2.5) + net-http-persistent (~> 4.0) + faraday-retry (2.2.1) faraday (~> 2.0) - fcm (2.0.1) + fcm (1.0.8) faraday (>= 1.0.0, < 3.0) googleauth (~> 1) - ffi (1.17.2-aarch64-linux-gnu) - ffi (1.17.2-aarch64-linux-musl) - ffi (1.17.2-arm-linux-gnu) - ffi (1.17.2-arm-linux-musl) + ffi (1.17.2) ffi (1.17.2-arm64-darwin) ffi (1.17.2-x86_64-darwin) ffi (1.17.2-x86_64-linux-gnu) - ffi (1.17.2-x86_64-linux-musl) - ffi-compiler (1.3.2) - ffi (>= 1.15.5) + ffi-compiler (1.0.1) + ffi (>= 1.0.0) rake flag_shih_tzu (0.3.23) - foreman (0.90.0) - thor (~> 1.4) + foreman (0.87.2) fugit (1.11.1) et-orbi (~> 1, >= 1.2.11) raabro (~> 1.4) - gapic-common (1.1.0) + gapic-common (0.20.0) faraday (>= 1.9, < 3.a) faraday-retry (>= 1.0, < 3.a) - google-cloud-env (~> 2.2) - google-logging-utils (~> 0.1) - google-protobuf (>= 3.25, < 5.a) - googleapis-common-protos (~> 1.6) - googleapis-common-protos-types (~> 1.15) - googleauth (~> 1.12) - grpc (~> 1.66) - geocoder (1.8.5) - base64 (>= 0.1.0) - csv (>= 3.0.0) + google-protobuf (~> 3.14) + googleapis-common-protos (>= 1.3.12, < 2.a) + googleapis-common-protos-types (>= 1.3.1, < 2.a) + googleauth (~> 1.0) + grpc (~> 1.36) + geocoder (1.8.1) gli (2.22.2) ostruct globalid (1.2.1) activesupport (>= 6.1) gmail_xoauth (0.4.3) oauth (>= 0.3.6) - google-apis-core (0.18.0) + google-apis-core (0.15.1) addressable (~> 2.5, >= 2.5.1) googleauth (~> 1.9) httpclient (>= 2.8.3, < 3.a) @@ -289,168 +302,122 @@ GEM mutex_m representable (~> 3.0) retriable (>= 2.0, < 4.a) - google-apis-iamcredentials_v1 (0.24.0) + google-apis-iamcredentials_v1 (0.22.0) google-apis-core (>= 0.15.0, < 2.a) - google-apis-storage_v1 (0.55.0) + google-apis-storage_v1 (0.47.0) google-apis-core (>= 0.15.0, < 2.a) - google-cloud-core (1.8.0) + google-cloud-core (1.7.1) google-cloud-env (>= 1.0, < 3.a) google-cloud-errors (~> 1.0) - google-cloud-dialogflow-v2 (1.10.1) - gapic-common (~> 1.0) + google-cloud-dialogflow-v2 (0.31.0) + gapic-common (>= 0.20.0, < 2.a) google-cloud-errors (~> 1.0) - google-cloud-location (~> 1.0) - google-cloud-env (2.3.1) - base64 (~> 0.2) + google-cloud-location (>= 0.4, < 2.a) + google-cloud-env (2.2.1) faraday (>= 1.0, < 3.a) - google-cloud-errors (1.5.0) - google-cloud-location (1.1.0) - gapic-common (~> 1.0) + google-cloud-errors (1.3.1) + google-cloud-location (0.6.0) + gapic-common (>= 0.20.0, < 2.a) google-cloud-errors (~> 1.0) - google-cloud-storage (1.56.0) + google-cloud-storage (1.52.0) addressable (~> 2.8) digest-crc (~> 0.4) google-apis-core (~> 0.13) google-apis-iamcredentials_v1 (~> 0.18) - google-apis-storage_v1 (>= 0.42) + google-apis-storage_v1 (~> 0.38) google-cloud-core (~> 1.6) googleauth (~> 1.9) mini_mime (~> 1.0) - google-cloud-translate-v3 (1.5.2) - gapic-common (~> 1.0) + google-cloud-translate-v3 (0.10.0) + gapic-common (>= 0.20.0, < 2.a) google-cloud-errors (~> 1.0) - google-cloud-location (~> 1.0) - google-iam-v1 (~> 1.3) - google-iam-v1 (1.4.0) - gapic-common (~> 1.0) - google-cloud-errors (~> 1.0) - grpc-google-iam-v1 (~> 1.11) - google-logging-utils (0.2.0) - google-protobuf (4.31.1) - bigdecimal - rake (>= 13) - google-protobuf (4.31.1-aarch64-linux-gnu) - bigdecimal - rake (>= 13) - google-protobuf (4.31.1-aarch64-linux-musl) - bigdecimal - rake (>= 13) - google-protobuf (4.31.1-arm64-darwin) - bigdecimal - rake (>= 13) - google-protobuf (4.31.1-x86_64-darwin) - bigdecimal - rake (>= 13) - google-protobuf (4.31.1-x86_64-linux-gnu) - bigdecimal - rake (>= 13) - google-protobuf (4.31.1-x86_64-linux-musl) - bigdecimal - rake (>= 13) - googleapis-common-protos (1.7.0) + google-protobuf (3.25.7) + googleapis-common-protos (1.6.0) google-protobuf (>= 3.18, < 5.a) googleapis-common-protos-types (~> 1.7) grpc (~> 1.41) googleapis-common-protos-types (1.20.0) google-protobuf (>= 3.18, < 5.a) - googleauth (1.14.0) + googleauth (1.11.2) faraday (>= 1.0, < 3.a) - google-cloud-env (~> 2.2) - google-logging-utils (~> 0.1) + google-cloud-env (~> 2.1) jwt (>= 1.4, < 3.0) multi_json (~> 1.11) os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) - groupdate (6.7.0) - activesupport (>= 7.1) - grpc (1.74.1) + groupdate (6.2.1) + activesupport (>= 5.2) + grpc (1.72.0) google-protobuf (>= 3.25, < 5.0) googleapis-common-protos-types (~> 1.0) - grpc (1.74.1-aarch64-linux-gnu) + grpc (1.72.0-arm64-darwin) google-protobuf (>= 3.25, < 5.0) googleapis-common-protos-types (~> 1.0) - grpc (1.74.1-aarch64-linux-musl) + grpc (1.72.0-x86_64-darwin) google-protobuf (>= 3.25, < 5.0) googleapis-common-protos-types (~> 1.0) - grpc (1.74.1-arm64-darwin) + grpc (1.72.0-x86_64-linux) google-protobuf (>= 3.25, < 5.0) googleapis-common-protos-types (~> 1.0) - grpc (1.74.1-x86_64-darwin) - google-protobuf (>= 3.25, < 5.0) - googleapis-common-protos-types (~> 1.0) - grpc (1.74.1-x86_64-linux-gnu) - google-protobuf (>= 3.25, < 5.0) - googleapis-common-protos-types (~> 1.0) - grpc (1.74.1-x86_64-linux-musl) - google-protobuf (>= 3.25, < 5.0) - googleapis-common-protos-types (~> 1.0) - grpc-google-iam-v1 (1.11.0) - google-protobuf (>= 3.18, < 5.a) - googleapis-common-protos (~> 1.7.0) - grpc (~> 1.41) gserver (0.0.1) haikunator (1.1.1) - hairtrigger (1.3.1) - activerecord (>= 6.0, < 9) + hairtrigger (1.0.0) + activerecord (>= 6.0, < 8) ruby2ruby (~> 2.4) ruby_parser (~> 3.10) hana (1.3.7) hash_diff (1.1.1) - hashdiff (1.2.0) + hashdiff (1.1.0) hashie (5.0.0) html2text (0.4.0) nokogiri (>= 1.0, < 2.0) - http (5.3.1) + http (5.1.1) addressable (~> 2.8) http-cookie (~> 1.0) http-form_data (~> 2.2) - llhttp-ffi (~> 0.5.0) + llhttp-ffi (~> 0.4.0) http-accept (1.7.0) - http-cookie (1.0.8) + http-cookie (1.0.5) domain_name (~> 0.5) http-form_data (2.3.0) - httparty (0.23.1) - csv + httparty (0.21.0) mini_mime (>= 1.0.0) multi_xml (>= 0.5.2) - httpclient (2.9.0) - mutex_m + httpclient (2.8.3) i18n (1.14.7) concurrent-ruby (~> 1.0) - image_processing (1.14.0) - mini_magick (>= 4.9.5, < 6) + image_processing (1.12.2) + mini_magick (>= 4.9.5, < 5) ruby-vips (>= 2.0.17, < 3) - io-console (0.8.1) - irb (1.15.2) - pp (>= 0.6.0) - rdoc (>= 4.0.0) - reline (>= 0.4.2) + io-console (0.6.0) + irb (1.7.2) + reline (>= 0.3.6) iso-639 (0.3.8) csv - jbuilder (2.14.0) - actionview (>= 7.0.0) - activesupport (>= 7.0.0) + jbuilder (2.11.5) + actionview (>= 5.0.0) + activesupport (>= 5.0.0) jmespath (1.6.2) jquery-rails (4.6.0) rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) - json (2.13.2) - json_refs (0.1.9) + json (2.12.0) + json_refs (0.1.8) hana - json_schemer (2.4.0) - bigdecimal + json_schemer (0.2.24) + ecma-re-validator (~> 0.3) hana (~> 1.3) regexp_parser (~> 2.0) - simpleidn (~> 0.2) - judoscale-rails (1.11.1) - judoscale-ruby (= 1.11.1) + uri_template (~> 0.7) + judoscale-rails (1.8.2) + judoscale-ruby (= 1.8.2) railties - judoscale-ruby (1.11.1) - judoscale-sidekiq (1.11.1) - judoscale-ruby (= 1.11.1) + judoscale-ruby (1.8.2) + judoscale-sidekiq (1.8.2) + judoscale-ruby (= 1.8.2) sidekiq (>= 5.0) - jwt (2.10.2) + jwt (2.8.1) base64 kaminari (1.2.2) activesupport (>= 4.1.0) @@ -464,9 +431,8 @@ GEM activerecord kaminari-core (= 1.2.2) kaminari-core (1.2.2) - koala (3.6.0) + koala (3.4.0) addressable - base64 faraday faraday-multipart json (>= 1.8) @@ -478,17 +444,13 @@ GEM logger (~> 1.6) letter_opener (1.10.0) launchy (>= 2.2, < 4) - line-bot-api (2.1.0) - base64 (~> 0.2) - multipart-post (~> 2.4) + line-bot-api (1.28.0) lint_roller (1.1.0) - liquid (5.8.7) - bigdecimal - strscan (>= 3.1.1) - listen (3.9.0) + liquid (5.4.0) + listen (3.8.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) - llhttp-ffi (0.5.1) + llhttp-ffi (0.4.0) ffi-compiler (~> 1.0) rake (~> 13.0) logger (1.7.0) @@ -497,7 +459,7 @@ GEM activesupport (>= 4) railties (>= 4) request_store (~> 1.0) - loofah (2.24.1) + loofah (2.23.1) crass (~> 1.0.2) nokogiri (>= 1.12.0) mail (2.8.1) @@ -507,31 +469,31 @@ GEM net-smtp marcel (1.0.4) maxminddb (0.1.22) - meta_request (0.8.5) + meta_request (0.8.3) rack-contrib (>= 1.1, < 3) - railties (>= 3.0.0, < 9) + railties (>= 3.0.0, < 8) method_source (1.1.0) - mime-types (3.7.0) - logger - mime-types-data (~> 3.2025, >= 3.2025.0507) - mime-types-data (3.2025.0805) - mini_magick (5.3.0) - logger + mime-types (3.4.1) + mime-types-data (~> 3.2015) + mime-types-data (3.2023.0218.1) + mini_magick (4.12.0) mini_mime (1.1.5) + mini_portile2 (2.8.9) minitest (5.25.5) - mock_redis (0.51.0) - redis (~> 5) + mock_redis (0.36.0) + ruby2_keywords msgpack (1.8.0) - multi_json (1.17.0) - multi_xml (0.7.2) - bigdecimal (~> 3.1) - multipart-post (2.4.1) + multi_json (1.15.0) + multi_xml (0.6.0) + multipart-post (2.3.0) mutex_m (0.3.0) - neighbor (0.6.0) - activerecord (>= 7.1) - net-http (0.6.0) + neighbor (0.2.3) + activerecord (>= 5.2) + net-http (0.4.1) uri - net-imap (0.5.9) + net-http-persistent (4.0.2) + connection_pool (~> 2.2) + net-imap (0.4.20) date net-protocol net-pop (0.1.2) @@ -544,15 +506,11 @@ GEM newrelic-sidekiq-metrics (1.6.2) newrelic_rpm (>= 8.0.0) sidekiq - newrelic_rpm (9.20.0) - nio4r (2.7.4) - nokogiri (1.18.9-aarch64-linux-gnu) - racc (~> 1.4) - nokogiri (1.18.9-aarch64-linux-musl) - racc (~> 1.4) - nokogiri (1.18.9-arm-linux-gnu) - racc (~> 1.4) - nokogiri (1.18.9-arm-linux-musl) + newrelic_rpm (9.6.0) + base64 + nio4r (2.7.3) + nokogiri (1.18.9) + mini_portile2 (~> 2.8.2) racc (~> 1.4) nokogiri (1.18.9-arm64-darwin) racc (~> 1.4) @@ -560,31 +518,28 @@ GEM racc (~> 1.4) nokogiri (1.18.9-x86_64-linux-gnu) racc (~> 1.4) - nokogiri (1.18.9-x86_64-linux-musl) - racc (~> 1.4) oauth (1.1.0) oauth-tty (~> 1.0, >= 1.0.1) snaky_hash (~> 2.0) version_gem (~> 1.1) oauth-tty (1.0.5) version_gem (~> 1.1, >= 1.1.1) - oauth2 (2.0.12) - faraday (>= 0.17.3, < 4.0) - jwt (>= 1.0, < 4.0) - logger (~> 1.2) + oauth2 (2.0.9) + faraday (>= 0.17.3, < 3.0) + jwt (>= 1.0, < 3.0) multi_xml (~> 0.5) rack (>= 1.2, < 4) - snaky_hash (~> 2.0, >= 2.0.3) - version_gem (>= 1.1.8, < 3) - oj (3.16.11) + snaky_hash (~> 2.0) + version_gem (~> 1.1) + oj (3.16.10) bigdecimal (>= 3.0) ostruct (>= 0.2) - omniauth (2.1.3) + omniauth (2.1.2) hashie (>= 3.4.6) rack (>= 2.2.3) rack-protection - omniauth-google-oauth2 (1.2.1) - jwt (>= 2.9.2) + omniauth-google-oauth2 (1.1.3) + jwt (>= 2.0) oauth2 (~> 2.0) omniauth (~> 2.0) omniauth-oauth2 (~> 1.8) @@ -594,121 +549,104 @@ GEM omniauth-rails_csrf_protection (1.0.2) actionpack (>= 4.2) omniauth (~> 2.0) - openssl (3.3.0) + openssl (3.2.0) orm_adapter (0.5.0) os (1.1.4) - ostruct (0.6.3) + ostruct (0.6.1) parallel (1.27.0) - parser (3.3.9.0) + parser (3.3.8.0) ast (~> 2.4.1) racc - pg (1.6.1) - pg (1.6.1-aarch64-linux) - pg (1.6.1-aarch64-linux-musl) - pg (1.6.1-arm64-darwin) - pg (1.6.1-x86_64-darwin) - pg (1.6.1-x86_64-linux) - pg (1.6.1-x86_64-linux-musl) - pg_search (2.3.7) - activerecord (>= 6.1) - activesupport (>= 6.1) - pgvector (0.3.2) - pp (0.6.2) - prettyprint - prettyprint (0.2.0) + pg (1.5.3) + pg_search (2.3.6) + activerecord (>= 5.2) + activesupport (>= 5.2) + pgvector (0.1.1) prism (1.4.0) procore-sift (1.0.0) activerecord (>= 6.1) - pry (0.15.2) + pry (0.14.2) coderay (~> 1.1) method_source (~> 1.0) - pry-rails (0.3.11) - pry (>= 0.13.0) - psych (5.2.6) - date - stringio + pry-rails (0.3.9) + pry (>= 0.10.4) public_suffix (6.0.2) - puma (6.6.1) + puma (6.4.3) nio4r (~> 2.0) - pundit (2.5.0) + pundit (2.3.0) activesupport (>= 3.0.0) raabro (1.4.0) racc (1.8.1) - rack (3.1.16) + rack (2.2.15) rack-attack (6.7.0) rack (>= 1.0, < 4) rack-contrib (2.5.0) rack (< 4) - rack-cors (3.0.0) - logger - rack (>= 3.0.14) - rack-mini-profiler (4.0.1) + rack-cors (2.0.0) + rack (>= 2.0.0) + rack-mini-profiler (3.2.0) rack (>= 1.2.0) - rack-protection (4.1.1) + rack-protection (3.2.0) base64 (>= 0.1.0) - logger (>= 1.6.0) - rack (>= 3.0.0, < 4) + rack (~> 2.2, >= 2.2.4) rack-proxy (0.7.7) rack - rack-session (2.1.1) - base64 (>= 0.1.0) - rack (>= 3.0.0) - rack-test (2.2.0) + rack-session (1.0.2) + rack (< 3) + rack-test (2.1.0) rack (>= 1.3) - rack-timeout (0.7.0) - rackup (2.2.1) - rack (>= 3) - rails (7.2.2.1) - actioncable (= 7.2.2.1) - actionmailbox (= 7.2.2.1) - actionmailer (= 7.2.2.1) - actionpack (= 7.2.2.1) - actiontext (= 7.2.2.1) - actionview (= 7.2.2.1) - activejob (= 7.2.2.1) - activemodel (= 7.2.2.1) - activerecord (= 7.2.2.1) - activestorage (= 7.2.2.1) - activesupport (= 7.2.2.1) + rack-timeout (0.6.3) + rackup (1.0.1) + rack (< 3) + webrick + rails (7.1.5.2) + actioncable (= 7.1.5.2) + actionmailbox (= 7.1.5.2) + actionmailer (= 7.1.5.2) + actionpack (= 7.1.5.2) + actiontext (= 7.1.5.2) + actionview (= 7.1.5.2) + activejob (= 7.1.5.2) + activemodel (= 7.1.5.2) + activerecord (= 7.1.5.2) + activestorage (= 7.1.5.2) + activesupport (= 7.1.5.2) bundler (>= 1.15.0) - railties (= 7.2.2.1) - rails-dom-testing (2.3.0) + railties (= 7.1.5.2) + rails-dom-testing (2.2.0) activesupport (>= 5.0.0) minitest nokogiri (>= 1.6) - rails-html-sanitizer (1.6.2) + rails-html-sanitizer (1.6.1) loofah (~> 2.21) nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) - railties (7.2.2.1) - actionpack (= 7.2.2.1) - activesupport (= 7.2.2.1) - irb (~> 1.13) + railties (7.1.5.2) + actionpack (= 7.1.5.2) + activesupport (= 7.1.5.2) + irb rackup (>= 1.0.0) rake (>= 12.2) thor (~> 1.0, >= 1.2.2) zeitwerk (~> 2.6) rainbow (3.1.1) - rake (13.3.0) + rake (13.2.1) rb-fsevent (0.11.2) - rb-inotify (0.11.1) + rb-inotify (0.10.1) ffi (~> 1.0) - rdoc (6.14.2) - erb - psych (>= 4.0.0) - redis (5.4.1) - redis-client (>= 0.22.0) - redis-client (0.25.2) + redis (5.0.6) + redis-client (>= 0.9.0) + redis-client (0.22.2) connection_pool - redis-namespace (1.11.0) + redis-namespace (1.10.0) redis (>= 4) - regexp_parser (2.11.1) - reline (0.6.2) + regexp_parser (2.10.0) + reline (0.3.6) io-console (~> 0.5) representable (3.2.0) declarative (< 0.1.0) trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) - request_store (1.7.0) + request_store (1.5.1) rack (>= 1.4) responders (3.1.1) actionpack (>= 5.2) @@ -719,29 +657,29 @@ GEM mime-types (>= 1.16, < 4.0) netrc (~> 0.8) retriable (3.1.2) - reverse_markdown (3.0.0) + reverse_markdown (2.1.1) nokogiri rexml (3.4.1) - rspec-core (3.13.5) + rspec-core (3.13.0) rspec-support (~> 3.13.0) - rspec-expectations (3.13.5) + rspec-expectations (3.13.2) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-mocks (3.13.5) + rspec-mocks (3.13.1) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-rails (8.0.2) - actionpack (>= 7.2) - activesupport (>= 7.2) - railties (>= 7.2) + rspec-rails (7.0.1) + actionpack (>= 7.0) + activesupport (>= 7.0) + railties (>= 7.0) rspec-core (~> 3.13) rspec-expectations (~> 3.13) rspec-mocks (~> 3.13) rspec-support (~> 3.13) - rspec-support (3.13.4) + rspec-support (3.13.1) rspec_junit_formatter (0.6.0) rspec-core (>= 2, < 4, != 2.12.0) - rubocop (1.79.2) + rubocop (1.75.6) json (~> 2.3) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.1.0) @@ -749,10 +687,10 @@ GEM parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) regexp_parser (>= 2.9.3, < 3.0) - rubocop-ast (>= 1.46.0, < 2.0) + rubocop-ast (>= 1.44.0, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 4.0) - rubocop-ast (1.46.0) + rubocop-ast (1.44.1) parser (>= 3.3.7.2) prism (~> 1.4) rubocop-factory_bot (2.27.1) @@ -762,7 +700,7 @@ GEM lint_roller (~> 1.1) rubocop (>= 1.75.0, < 2.0) rubocop-ast (>= 1.38.0, < 2.0) - rubocop-rails (2.33.1) + rubocop-rails (2.32.0) activesupport (>= 4.2.0) lint_roller (~> 1.1) rack (>= 1.1) @@ -771,23 +709,18 @@ GEM rubocop-rspec (3.6.0) lint_roller (~> 1.1) rubocop (~> 1.72, >= 1.72.1) - rubocop-rspec_rails (2.31.0) - lint_roller (~> 1.1) - rubocop (~> 1.72, >= 1.72.1) - rubocop-rspec (~> 3.5) - ruby-openai (8.2.0) + ruby-openai (7.3.1) event_stream_parser (>= 0.3.0, < 2.0.0) faraday (>= 1) faraday-multipart (>= 1) ruby-progressbar (1.13.0) - ruby-vips (2.2.4) + ruby-vips (2.1.4) ffi (~> 1.12) - logger ruby2_keywords (0.0.5) - ruby2ruby (2.5.2) + ruby2ruby (2.5.0) ruby_parser (~> 3.1) sexp_processor (~> 4.6) - ruby_llm (1.6.0) + ruby_llm (1.5.1) base64 event_stream_parser (~> 1) faraday (>= 1.10.0) @@ -796,8 +729,8 @@ GEM faraday-retry (>= 1) marcel (~> 1.0) zeitwerk (~> 2) - ruby_parser (3.21.1) - racc (~> 1.5) + ruby_llm-schema (0.1.0) + ruby_parser (3.20.0) sexp_processor (~> 4.16) sass (3.7.4) sass-listen (~> 4.0.0) @@ -812,7 +745,7 @@ GEM sprockets (> 3.0) sprockets-rails tilt - scout_apm (5.7.0) + scout_apm (5.3.3) parser scss_lint (0.60.0) sass (~> 3.5, >= 3.5.5) @@ -821,17 +754,17 @@ GEM activerecord (>= 4) activesupport (>= 4) selectize-rails (0.12.6) - sentry-rails (5.26.0) + sentry-rails (5.19.0) railties (>= 5.0) - sentry-ruby (~> 5.26.0) - sentry-ruby (5.26.0) + sentry-ruby (~> 5.19.0) + sentry-ruby (5.19.0) bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) - sentry-sidekiq (5.26.0) - sentry-ruby (~> 5.26.0) + sentry-sidekiq (5.19.0) + sentry-ruby (~> 5.19.0) sidekiq (>= 3.0) - sexp_processor (4.17.3) - shopify_api (14.11.0) + sexp_processor (4.17.0) + shopify_api (14.8.0) activesupport concurrent-ruby hash_diff @@ -842,23 +775,22 @@ GEM securerandom sorbet-runtime zeitwerk (~> 2.5) - shoulda-matchers (6.5.0) + shoulda-matchers (5.3.0) activesupport (>= 5.2.0) - sidekiq (8.0.7) - connection_pool (>= 2.5.0) - json (>= 2.9.0) - logger (>= 1.6.2) - rack (>= 3.1.0) - redis-client (>= 0.23.2) - sidekiq-cron (2.3.1) - cronex (>= 0.13.0) - fugit (~> 1.8, >= 1.11.1) + sidekiq (7.3.1) + concurrent-ruby (< 2) + connection_pool (>= 2.3.0) + logger + rack (>= 2.2.4) + redis-client (>= 0.22.2) + sidekiq-cron (1.12.0) + fugit (~> 1.8) globalid (>= 1.0.1) - sidekiq (>= 6.5.0) + sidekiq (>= 6) sidekiq_alive (2.5.0) gserver (~> 0.0.1) sidekiq (>= 5, < 9) - signet (0.20.0) + signet (0.17.0) addressable (~> 2.8) faraday (>= 0.17.5, < 3.a) jwt (>= 1.5, < 3.0) @@ -868,7 +800,6 @@ GEM json (>= 1.8, < 3) simplecov-html (~> 0.10.0) simplecov-html (0.10.2) - simpleidn (0.2.3) slack-ruby-client (2.5.2) faraday (>= 2.0) faraday-mashify @@ -876,32 +807,29 @@ GEM gli hashie logger - snaky_hash (2.0.3) - hashie (>= 0.1.0, < 6) - version_gem (>= 1.1.8, < 3) - sorbet-runtime (0.5.12388) - spring (4.4.0) + snaky_hash (2.0.1) + hashie + version_gem (~> 1.1, >= 1.1.1) + sorbet-runtime (0.5.11934) + spring (4.1.1) spring-watcher-listen (2.1.0) listen (>= 2.7, < 4.0) spring (>= 4) - sprockets (4.2.2) + sprockets (4.2.1) concurrent-ruby (~> 1.0) - logger rack (>= 2.2.4, < 4) - sprockets-rails (3.5.2) - actionpack (>= 6.1) - activesupport (>= 6.1) + sprockets-rails (3.4.2) + actionpack (>= 5.2) + activesupport (>= 5.2) sprockets (>= 3.0.0) - squasher (0.8.0) - stackprof (0.2.27) + squasher (0.7.2) + stackprof (0.2.25) statsd-ruby (1.5.0) - stringio (3.1.7) - stripe (15.4.0) - strscan (3.1.5) - telephone_number (1.4.23) - test-prof (1.4.4) + stripe (8.5.0) + telephone_number (1.4.20) + test-prof (1.2.1) thor (1.4.0) - tilt (2.6.1) + tilt (2.3.0) time_diff (0.3.0) activesupport i18n @@ -915,29 +843,29 @@ GEM oauth tzinfo (2.0.6) concurrent-ruby (~> 1.0) - tzinfo-data (1.2025.2) + tzinfo-data (1.2023.3) tzinfo (>= 1.0.0) uber (0.1.0) - uglifier (4.2.1) + uglifier (4.2.0) execjs (>= 0.3.0, < 3) - unicode (0.4.4.5) + unf (0.1.4) + unf_ext + unf_ext (0.0.8.2) unicode-display_width (3.1.4) unicode-emoji (~> 4.0, >= 4.0.4) unicode-emoji (4.0.4) uniform_notifier (1.17.0) uri (1.0.3) - useragent (0.16.11) - valid_email2 (7.0.13) - activemodel (>= 6.0) + uri_template (0.7.0) + valid_email2 (5.2.6) + activemodel (>= 3.2) mail (~> 2.5) - version_gem (1.1.8) - vite_rails (3.0.19) - railties (>= 5.1, < 9) + version_gem (1.1.4) + vite_rails (3.0.17) + railties (>= 5.1, < 8) vite_ruby (~> 3.0, >= 3.2.2) - vite_ruby (3.9.2) + vite_ruby (3.8.0) dry-cli (>= 0.7, < 2) - logger (~> 1.6) - mutex_m rack-proxy (~> 0.6, >= 0.6.1) zeitwerk (~> 2.2) warden (1.2.9) @@ -950,61 +878,61 @@ GEM web-push (3.0.1) jwt (~> 2.0) openssl (~> 3.0) - webmock (3.25.1) + webmock (3.23.1) addressable (>= 2.8.0) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) - websocket-driver (0.8.0) + webrick (1.9.1) + websocket-driver (0.7.7) base64 websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) wisper (2.0.0) - working_hours (1.5.0) - activesupport (>= 7.0) + working_hours (1.4.1) + activesupport (>= 3.2) tzinfo - zeitwerk (2.7.3) + zeitwerk (2.6.17) PLATFORMS - aarch64-linux - aarch64-linux-gnu - aarch64-linux-musl - arm-linux-gnu - arm-linux-musl - arm64-darwin - x86_64-darwin + arm64-darwin-20 + arm64-darwin-21 + arm64-darwin-22 + ruby + x86_64-darwin-18 + x86_64-darwin-20 + x86_64-darwin-21 + x86_64-darwin-22 x86_64-linux - x86_64-linux-gnu - x86_64-linux-musl DEPENDENCIES active_record_query_trace activerecord-import acts-as-taggable-on - administrate - administrate-field-active_storage - administrate-field-belongs_to_search - ai-agents (>= 0.2.1) + administrate (>= 0.20.1) + administrate-field-active_storage (>= 1.0.3) + administrate-field-belongs_to_search (>= 0.9.0) + ai-agents (>= 0.4.3) annotate attr_extras audited (~> 5.4, >= 5.4.1) aws-sdk-s3 - azure-blob + azure-storage-blob! barnes bootsnap brakeman browser - bullet (~> 7.2.0) + bullet bundle-audit byebug climate_control - commonmarker (~> 0.23.11) + commonmarker csv-safe database_cleaner ddtrace debug (~> 1.8) - devise - devise-secure_password - devise_token_auth + devise (>= 4.9.4) + devise-secure_password! + devise_token_auth (>= 1.2.3) dotenv-rails (>= 3.0.0) down elastic-apm @@ -1060,10 +988,10 @@ DEPENDENCIES puma pundit rack-attack (>= 6.7.0) - rack-cors + rack-cors (= 2.0.0) rack-mini-profiler (>= 3.2.0) rack-timeout - rails (~> 7.2.0) + rails (~> 7.1) redis redis-namespace responders (>= 3.1.1) @@ -1076,8 +1004,8 @@ DEPENDENCIES rubocop-performance rubocop-rails rubocop-rspec - rubocop-rspec_rails ruby-openai + ruby_llm-schema scout_apm scss_lint seed_dump @@ -1115,4 +1043,4 @@ RUBY VERSION ruby 3.4.4p34 BUNDLED WITH - 2.6.7 + 2.5.16 diff --git a/app/javascript/dashboard/i18n/index.js b/app/javascript/dashboard/i18n/index.js index d0e85b43a..17bfab34d 100644 --- a/app/javascript/dashboard/i18n/index.js +++ b/app/javascript/dashboard/i18n/index.js @@ -1,4 +1,5 @@ import ar from './locale/ar'; +import bg from './locale/bg'; import ca from './locale/ca'; import cs from './locale/cs'; import da from './locale/da'; @@ -40,6 +41,7 @@ import lt from './locale/lt'; export default { ar, + bg, ca, cs, da, diff --git a/app/javascript/dashboard/i18n/locale/am/automation.json b/app/javascript/dashboard/i18n/locale/am/automation.json index cf63de81c..80274f488 100644 --- a/app/javascript/dashboard/i18n/locale/am/automation.json +++ b/app/javascript/dashboard/i18n/locale/am/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation Created", "CONVERSATION_UPDATED": "Conversation Updated", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/am/integrations.json b/app/javascript/dashboard/i18n/locale/am/integrations.json index 1614931a0..be9281284 100644 --- a/app/javascript/dashboard/i18n/locale/am/integrations.json +++ b/app/javascript/dashboard/i18n/locale/am/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Features", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/am/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/am/whatsappTemplates.json index 4887d07b6..5f53faaa8 100644 --- a/app/javascript/dashboard/i18n/locale/am/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/am/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Select the whatsapp template you want to send", - "TEMPLATE_SELECTED_SUBTITLE": "Process {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Search Templates", - "NO_TEMPLATES_FOUND": "No templates found for", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Language", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter {variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Templates", + "SUBTITLE": "Select the whatsapp template you want to send", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Search Templates", + "NO_TEMPLATES_FOUND": "No templates found for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Language", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Go Back", + "SEND_MESSAGE_LABEL": "Send Message", + "FORM_ERROR_MESSAGE": "Please fill all variables before sending", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/ar/automation.json b/app/javascript/dashboard/i18n/locale/ar/automation.json index be7107f4c..788652a04 100644 --- a/app/javascript/dashboard/i18n/locale/ar/automation.json +++ b/app/javascript/dashboard/i18n/locale/ar/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "تم إنشاء المحادثة", "CONVERSATION_UPDATED": "تم تحديث المحادثة", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/ar/integrations.json b/app/javascript/dashboard/i18n/locale/ar/integrations.json index f00d3fe1d..bc17130c1 100644 --- a/app/javascript/dashboard/i18n/locale/ar/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ar/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "الخصائص", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ar/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/ar/whatsappTemplates.json index 110eeb8af..247af32c4 100644 --- a/app/javascript/dashboard/i18n/locale/ar/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/ar/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "قوالب الواتساب", - "SUBTITLE": "حدد القالب الذي تريد إرساله", - "TEMPLATE_SELECTED_SUBTITLE": "معالجة {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "نماذج البحث", - "NO_TEMPLATES_FOUND": "لم يتم العثور على قوالب", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "اللغة", - "TEMPLATE_BODY": "نص القالب", - "CATEGORY": "الفئة" - } - }, - "PARSER": { - "VARIABLES_LABEL": "المتغيرات", - "VARIABLE_PLACEHOLDER": "أدخل قيمة {variable}", - "GO_BACK_LABEL": "العودة للخلف", - "SEND_MESSAGE_LABEL": "إرسال الرسالة", - "FORM_ERROR_MESSAGE": "يرجى ملء جميع المتغيرات قبل الإرسال" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "قوالب الواتساب", + "SUBTITLE": "حدد القالب الذي تريد إرساله", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "نماذج البحث", + "NO_TEMPLATES_FOUND": "لم يتم العثور على قوالب", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "الفئة", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "اللغة", + "TEMPLATE_BODY": "نص القالب", + "CATEGORY": "الفئة" + } + }, + "PARSER": { + "VARIABLES_LABEL": "المتغيرات", + "LANGUAGE": "اللغة", + "CATEGORY": "الفئة", + "VARIABLE_PLACEHOLDER": "أدخل قيمة {variable}", + "GO_BACK_LABEL": "العودة للخلف", + "SEND_MESSAGE_LABEL": "إرسال الرسالة", + "FORM_ERROR_MESSAGE": "يرجى ملء جميع المتغيرات قبل الإرسال", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/az/automation.json b/app/javascript/dashboard/i18n/locale/az/automation.json index cf63de81c..80274f488 100644 --- a/app/javascript/dashboard/i18n/locale/az/automation.json +++ b/app/javascript/dashboard/i18n/locale/az/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation Created", "CONVERSATION_UPDATED": "Conversation Updated", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/az/integrations.json b/app/javascript/dashboard/i18n/locale/az/integrations.json index 1614931a0..be9281284 100644 --- a/app/javascript/dashboard/i18n/locale/az/integrations.json +++ b/app/javascript/dashboard/i18n/locale/az/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Features", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/az/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/az/whatsappTemplates.json index 4887d07b6..5f53faaa8 100644 --- a/app/javascript/dashboard/i18n/locale/az/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/az/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Select the whatsapp template you want to send", - "TEMPLATE_SELECTED_SUBTITLE": "Process {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Search Templates", - "NO_TEMPLATES_FOUND": "No templates found for", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Language", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter {variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Templates", + "SUBTITLE": "Select the whatsapp template you want to send", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Search Templates", + "NO_TEMPLATES_FOUND": "No templates found for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Language", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Go Back", + "SEND_MESSAGE_LABEL": "Send Message", + "FORM_ERROR_MESSAGE": "Please fill all variables before sending", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/bg/automation.json b/app/javascript/dashboard/i18n/locale/bg/automation.json index fe4d32743..006369305 100644 --- a/app/javascript/dashboard/i18n/locale/bg/automation.json +++ b/app/javascript/dashboard/i18n/locale/bg/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation Created", "CONVERSATION_UPDATED": "Conversation Updated", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/bg/integrations.json b/app/javascript/dashboard/i18n/locale/bg/integrations.json index 6bcd3b584..1069559a6 100644 --- a/app/javascript/dashboard/i18n/locale/bg/integrations.json +++ b/app/javascript/dashboard/i18n/locale/bg/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Features", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/bg/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/bg/whatsappTemplates.json index 4887d07b6..5f53faaa8 100644 --- a/app/javascript/dashboard/i18n/locale/bg/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/bg/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Select the whatsapp template you want to send", - "TEMPLATE_SELECTED_SUBTITLE": "Process {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Search Templates", - "NO_TEMPLATES_FOUND": "No templates found for", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Language", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter {variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Templates", + "SUBTITLE": "Select the whatsapp template you want to send", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Search Templates", + "NO_TEMPLATES_FOUND": "No templates found for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Language", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Go Back", + "SEND_MESSAGE_LABEL": "Send Message", + "FORM_ERROR_MESSAGE": "Please fill all variables before sending", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/ca/automation.json b/app/javascript/dashboard/i18n/locale/ca/automation.json index e3570b417..d961c762a 100644 --- a/app/javascript/dashboard/i18n/locale/ca/automation.json +++ b/app/javascript/dashboard/i18n/locale/ca/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversa Creada", "CONVERSATION_UPDATED": "Conversa Actualitzada", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/ca/integrations.json b/app/javascript/dashboard/i18n/locale/ca/integrations.json index 4607a2fe1..2668ce217 100644 --- a/app/javascript/dashboard/i18n/locale/ca/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ca/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Característiques", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ca/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/ca/whatsappTemplates.json index f078ec706..e0b132286 100644 --- a/app/javascript/dashboard/i18n/locale/ca/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/ca/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Plantilles de Whatsapp", - "SUBTITLE": "Selecciona la plantilla de whatsapp que vols enviar", - "TEMPLATE_SELECTED_SUBTITLE": "Procés {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Cerca plantilles", - "NO_TEMPLATES_FOUND": "No s'han trobat plantilles per a", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Idioma", - "TEMPLATE_BODY": "Cos de la plantilla", - "CATEGORY": "Categoria" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Introdueix el valor {variable}", - "GO_BACK_LABEL": "Torna enrere", - "SEND_MESSAGE_LABEL": "Envia missatge", - "FORM_ERROR_MESSAGE": "Omple totes les variables abans d'enviar-les" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Plantilles de Whatsapp", + "SUBTITLE": "Selecciona la plantilla de whatsapp que vols enviar", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Cerca plantilles", + "NO_TEMPLATES_FOUND": "No s'han trobat plantilles per a", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Categoria", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Idioma", + "TEMPLATE_BODY": "Cos de la plantilla", + "CATEGORY": "Categoria" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Idioma", + "CATEGORY": "Categoria", + "VARIABLE_PLACEHOLDER": "Introdueix el valor {variable}", + "GO_BACK_LABEL": "Torna enrere", + "SEND_MESSAGE_LABEL": "Envia missatge", + "FORM_ERROR_MESSAGE": "Omple totes les variables abans d'enviar-les", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/cs/automation.json b/app/javascript/dashboard/i18n/locale/cs/automation.json index d8dd12abd..6733fa929 100644 --- a/app/javascript/dashboard/i18n/locale/cs/automation.json +++ b/app/javascript/dashboard/i18n/locale/cs/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation Created", "CONVERSATION_UPDATED": "Conversation Updated", "MESSAGE_CREATED": "Zpráva vytvořena", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Konverzace otevřena" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/cs/integrations.json b/app/javascript/dashboard/i18n/locale/cs/integrations.json index 9b55bf386..26bc11c0c 100644 --- a/app/javascript/dashboard/i18n/locale/cs/integrations.json +++ b/app/javascript/dashboard/i18n/locale/cs/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Funkce", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/cs/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/cs/whatsappTemplates.json index 4887d07b6..5f53faaa8 100644 --- a/app/javascript/dashboard/i18n/locale/cs/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/cs/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Select the whatsapp template you want to send", - "TEMPLATE_SELECTED_SUBTITLE": "Process {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Search Templates", - "NO_TEMPLATES_FOUND": "No templates found for", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Language", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter {variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Templates", + "SUBTITLE": "Select the whatsapp template you want to send", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Search Templates", + "NO_TEMPLATES_FOUND": "No templates found for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Language", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Go Back", + "SEND_MESSAGE_LABEL": "Send Message", + "FORM_ERROR_MESSAGE": "Please fill all variables before sending", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/da/automation.json b/app/javascript/dashboard/i18n/locale/da/automation.json index 7910667a9..372422cfc 100644 --- a/app/javascript/dashboard/i18n/locale/da/automation.json +++ b/app/javascript/dashboard/i18n/locale/da/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Samtale Oprettet", "CONVERSATION_UPDATED": "Samtale Opdateret", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/da/integrations.json b/app/javascript/dashboard/i18n/locale/da/integrations.json index 8710dc6d8..c4b498a3a 100644 --- a/app/javascript/dashboard/i18n/locale/da/integrations.json +++ b/app/javascript/dashboard/i18n/locale/da/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Funktioner", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/da/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/da/whatsappTemplates.json index 3acb3acb3..34699398c 100644 --- a/app/javascript/dashboard/i18n/locale/da/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/da/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Skabeloner", - "SUBTITLE": "Vælg den whatsapp skabelon, du vil sende", - "TEMPLATE_SELECTED_SUBTITLE": "Proces {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Søg Skabeloner", - "NO_TEMPLATES_FOUND": "Ingen skabeloner fundet for", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Sprog", - "TEMPLATE_BODY": "Skabelon Krop", - "CATEGORY": "Kategori" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variabler", - "VARIABLE_PLACEHOLDER": "Indtast {variable} værdi", - "GO_BACK_LABEL": "Gå Tilbage", - "SEND_MESSAGE_LABEL": "Send Besked", - "FORM_ERROR_MESSAGE": "Udfyld venligst alle variabler før afsendelse" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Skabeloner", + "SUBTITLE": "Vælg den whatsapp skabelon, du vil sende", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Søg Skabeloner", + "NO_TEMPLATES_FOUND": "Ingen skabeloner fundet for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Kategori", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Sprog", + "TEMPLATE_BODY": "Skabelon Krop", + "CATEGORY": "Kategori" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variabler", + "LANGUAGE": "Sprog", + "CATEGORY": "Kategori", + "VARIABLE_PLACEHOLDER": "Indtast {variable} værdi", + "GO_BACK_LABEL": "Gå Tilbage", + "SEND_MESSAGE_LABEL": "Send Besked", + "FORM_ERROR_MESSAGE": "Udfyld venligst alle variabler før afsendelse", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/de/automation.json b/app/javascript/dashboard/i18n/locale/de/automation.json index 20e343e0a..b6cef93e1 100644 --- a/app/javascript/dashboard/i18n/locale/de/automation.json +++ b/app/javascript/dashboard/i18n/locale/de/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Konversation erstellt", "CONVERSATION_UPDATED": "Konversation aktualisiert", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/de/integrations.json b/app/javascript/dashboard/i18n/locale/de/integrations.json index fb78159f9..060389c52 100644 --- a/app/javascript/dashboard/i18n/locale/de/integrations.json +++ b/app/javascript/dashboard/i18n/locale/de/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Funktionen", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/de/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/de/whatsappTemplates.json index b5f1885ae..87f5c6a2c 100644 --- a/app/javascript/dashboard/i18n/locale/de/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/de/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "WhatsApp-Vorlagen", - "SUBTITLE": "Wählen Sie die WhatsApp-Vorlage aus, die Sie senden möchten", - "TEMPLATE_SELECTED_SUBTITLE": "Verarbeite {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Vorlagen suchen", - "NO_TEMPLATES_FOUND": "Keine Vorlagen gefunden für", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Sprache", - "TEMPLATE_BODY": "Vorlagenbody", - "CATEGORY": "Kategorie" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variablen", - "VARIABLE_PLACEHOLDER": "Geben Sie den Wert {variable} ein", - "GO_BACK_LABEL": "Zurück", - "SEND_MESSAGE_LABEL": "Nachricht senden", - "FORM_ERROR_MESSAGE": "Bitte füllen Sie vor dem Absenden alle Variablen aus" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "WhatsApp-Vorlagen", + "SUBTITLE": "Wählen Sie die WhatsApp-Vorlage aus, die Sie senden möchten", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Vorlagen suchen", + "NO_TEMPLATES_FOUND": "Keine Vorlagen gefunden für", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Kategorie", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Sprache", + "TEMPLATE_BODY": "Vorlagenbody", + "CATEGORY": "Kategorie" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variablen", + "LANGUAGE": "Sprache", + "CATEGORY": "Kategorie", + "VARIABLE_PLACEHOLDER": "Geben Sie den Wert {variable} ein", + "GO_BACK_LABEL": "Zurück", + "SEND_MESSAGE_LABEL": "Nachricht senden", + "FORM_ERROR_MESSAGE": "Bitte füllen Sie vor dem Absenden alle Variablen aus", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/el/automation.json b/app/javascript/dashboard/i18n/locale/el/automation.json index d474d9914..27afa3306 100644 --- a/app/javascript/dashboard/i18n/locale/el/automation.json +++ b/app/javascript/dashboard/i18n/locale/el/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Δημιουργήθηκε Συνομιλία", "CONVERSATION_UPDATED": "Η Συνομιλία Ενημερώθηκε", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/el/integrations.json b/app/javascript/dashboard/i18n/locale/el/integrations.json index 599d1c7e2..488107d41 100644 --- a/app/javascript/dashboard/i18n/locale/el/integrations.json +++ b/app/javascript/dashboard/i18n/locale/el/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Χαρακτηριστικά", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/el/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/el/whatsappTemplates.json index d78b9cb12..42b710727 100644 --- a/app/javascript/dashboard/i18n/locale/el/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/el/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Πρότυπα Whatsapp", - "SUBTITLE": "Επιλέξτε το πρότυπο Whatsapp που θέλετε να στείλετε", - "TEMPLATE_SELECTED_SUBTITLE": "Επεξεργασία {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Αναζήτηση Προτύπων", - "NO_TEMPLATES_FOUND": "Δεν βρέθηκαν πρότυπα για", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Γλώσσα", - "TEMPLATE_BODY": "Σώμα Προτύπου", - "CATEGORY": "Κατηγορία" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Μεταβλητές", - "VARIABLE_PLACEHOLDER": "Εισάγετε τιμή για {variable}", - "GO_BACK_LABEL": "Πίσω", - "SEND_MESSAGE_LABEL": "Αποστολή μηνύματος", - "FORM_ERROR_MESSAGE": "Παρακαλώ συμπληρώστε όλες τις μεταβλητές πριν την αποστολή" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Πρότυπα Whatsapp", + "SUBTITLE": "Επιλέξτε το πρότυπο Whatsapp που θέλετε να στείλετε", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Αναζήτηση Προτύπων", + "NO_TEMPLATES_FOUND": "Δεν βρέθηκαν πρότυπα για", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Κατηγορία", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Γλώσσα", + "TEMPLATE_BODY": "Σώμα Προτύπου", + "CATEGORY": "Κατηγορία" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Μεταβλητές", + "LANGUAGE": "Γλώσσα", + "CATEGORY": "Κατηγορία", + "VARIABLE_PLACEHOLDER": "Εισάγετε τιμή για {variable}", + "GO_BACK_LABEL": "Πίσω", + "SEND_MESSAGE_LABEL": "Αποστολή μηνύματος", + "FORM_ERROR_MESSAGE": "Παρακαλώ συμπληρώστε όλες τις μεταβλητές πριν την αποστολή", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/es/automation.json b/app/javascript/dashboard/i18n/locale/es/automation.json index a1f68a375..63b529aee 100644 --- a/app/javascript/dashboard/i18n/locale/es/automation.json +++ b/app/javascript/dashboard/i18n/locale/es/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversación creada", "CONVERSATION_UPDATED": "Conversación actualizada", "MESSAGE_CREATED": "Mensaje creado", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversación abierta" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/es/integrations.json b/app/javascript/dashboard/i18n/locale/es/integrations.json index fbf4754b8..ee297c2f8 100644 --- a/app/javascript/dashboard/i18n/locale/es/integrations.json +++ b/app/javascript/dashboard/i18n/locale/es/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Características", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/es/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/es/whatsappTemplates.json index 49a89e381..06ceacb68 100644 --- a/app/javascript/dashboard/i18n/locale/es/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/es/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Plantillas de Whatsapp", - "SUBTITLE": "Seleccione la plantilla de Whatsapp que desea enviar", - "TEMPLATE_SELECTED_SUBTITLE": "Procesar {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Buscar plantillas", - "NO_TEMPLATES_FOUND": "No se encontraron plantillas para", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Idioma", - "TEMPLATE_BODY": "Cuerpo de plantilla", - "CATEGORY": "Categoría" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Introduzca el valor de {variable}", - "GO_BACK_LABEL": "Volver", - "SEND_MESSAGE_LABEL": "Enviar mensaje", - "FORM_ERROR_MESSAGE": "Por favor, rellene todas las variables antes de enviar" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Plantillas de Whatsapp", + "SUBTITLE": "Seleccione la plantilla de Whatsapp que desea enviar", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Buscar plantillas", + "NO_TEMPLATES_FOUND": "No se encontraron plantillas para", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Categoría", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Idioma", + "TEMPLATE_BODY": "Cuerpo de plantilla", + "CATEGORY": "Categoría" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Idioma", + "CATEGORY": "Categoría", + "VARIABLE_PLACEHOLDER": "Introduzca el valor de {variable}", + "GO_BACK_LABEL": "Volver", + "SEND_MESSAGE_LABEL": "Enviar mensaje", + "FORM_ERROR_MESSAGE": "Por favor, rellene todas las variables antes de enviar", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/fa/automation.json b/app/javascript/dashboard/i18n/locale/fa/automation.json index 3e4ffd18e..3e02e4a69 100644 --- a/app/javascript/dashboard/i18n/locale/fa/automation.json +++ b/app/javascript/dashboard/i18n/locale/fa/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "گفتگو ایجاد شد", "CONVERSATION_UPDATED": "گفتگو به روز شد", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/fa/integrations.json b/app/javascript/dashboard/i18n/locale/fa/integrations.json index 15e4417d5..18c95d245 100644 --- a/app/javascript/dashboard/i18n/locale/fa/integrations.json +++ b/app/javascript/dashboard/i18n/locale/fa/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "امکانات", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/fa/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/fa/whatsappTemplates.json index 3b470e99f..ed5d76d1c 100644 --- a/app/javascript/dashboard/i18n/locale/fa/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/fa/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "قالب های واتساپ", - "SUBTITLE": "قالب واتساپ مورد نظر برای ارسال را انتخاب کنید", - "TEMPLATE_SELECTED_SUBTITLE": "فرآیند {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "جستجوی الگوها", - "NO_TEMPLATES_FOUND": "هیچ قالبی برای", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "زبان", - "TEMPLATE_BODY": "بدنه الگو", - "CATEGORY": "دسته‌بندی" - } - }, - "PARSER": { - "VARIABLES_LABEL": "متغیرها", - "VARIABLE_PLACEHOLDER": "مقدار {variable} را وارد کنید", - "GO_BACK_LABEL": "بازگشت", - "SEND_MESSAGE_LABEL": "ارسال پیام", - "FORM_ERROR_MESSAGE": "لطفا قبل از ارسال همه متغیرها را پر کنید" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "قالب های واتساپ", + "SUBTITLE": "قالب واتساپ مورد نظر برای ارسال را انتخاب کنید", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "جستجوی الگوها", + "NO_TEMPLATES_FOUND": "هیچ قالبی برای", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "دسته‌بندی", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "زبان", + "TEMPLATE_BODY": "بدنه الگو", + "CATEGORY": "دسته‌بندی" + } + }, + "PARSER": { + "VARIABLES_LABEL": "متغیرها", + "LANGUAGE": "زبان", + "CATEGORY": "دسته‌بندی", + "VARIABLE_PLACEHOLDER": "مقدار {variable} را وارد کنید", + "GO_BACK_LABEL": "بازگشت", + "SEND_MESSAGE_LABEL": "ارسال پیام", + "FORM_ERROR_MESSAGE": "لطفا قبل از ارسال همه متغیرها را پر کنید", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/fi/automation.json b/app/javascript/dashboard/i18n/locale/fi/automation.json index ec63918e7..740761ca5 100644 --- a/app/javascript/dashboard/i18n/locale/fi/automation.json +++ b/app/javascript/dashboard/i18n/locale/fi/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation Created", "CONVERSATION_UPDATED": "Conversation Updated", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/fi/integrations.json b/app/javascript/dashboard/i18n/locale/fi/integrations.json index 1374fba42..378242517 100644 --- a/app/javascript/dashboard/i18n/locale/fi/integrations.json +++ b/app/javascript/dashboard/i18n/locale/fi/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Ominaisuudet", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/fi/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/fi/whatsappTemplates.json index ae8bee085..337134e31 100644 --- a/app/javascript/dashboard/i18n/locale/fi/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/fi/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "WhatsApp-pohjat", - "SUBTITLE": "Valitse WhatsApp-pohja, jonka haluat lähettää", - "TEMPLATE_SELECTED_SUBTITLE": "Process {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Etsi Pohjia", - "NO_TEMPLATES_FOUND": "No templates found for", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Language", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Muuttujat", - "VARIABLE_PLACEHOLDER": "Enter {variable} value", - "GO_BACK_LABEL": "Mene Takaisin", - "SEND_MESSAGE_LABEL": "Lähetä Viesti", - "FORM_ERROR_MESSAGE": "Täytä kaikki muuttujat ennen lähettämistä" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "WhatsApp-pohjat", + "SUBTITLE": "Valitse WhatsApp-pohja, jonka haluat lähettää", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Etsi Pohjia", + "NO_TEMPLATES_FOUND": "No templates found for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Language", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Muuttujat", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Mene Takaisin", + "SEND_MESSAGE_LABEL": "Lähetä Viesti", + "FORM_ERROR_MESSAGE": "Täytä kaikki muuttujat ennen lähettämistä", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/fr/automation.json b/app/javascript/dashboard/i18n/locale/fr/automation.json index 500cbbdcf..11a1ddfe6 100644 --- a/app/javascript/dashboard/i18n/locale/fr/automation.json +++ b/app/javascript/dashboard/i18n/locale/fr/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation créée", "CONVERSATION_UPDATED": "Conversation mise à jour", "MESSAGE_CREATED": "Message créé", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation ouverte" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/fr/integrations.json b/app/javascript/dashboard/i18n/locale/fr/integrations.json index 0ace6565e..9ad0fb8fd 100644 --- a/app/javascript/dashboard/i18n/locale/fr/integrations.json +++ b/app/javascript/dashboard/i18n/locale/fr/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Fonctionnalités", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/fr/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/fr/whatsappTemplates.json index 0d4538240..71d0685cb 100644 --- a/app/javascript/dashboard/i18n/locale/fr/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/fr/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Modèles WhatsApp", - "SUBTITLE": "Sélectionnez le modèle whatsapp que vous souhaitez envoyer", - "TEMPLATE_SELECTED_SUBTITLE": "Traiter {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Rechercher des modèles", - "NO_TEMPLATES_FOUND": "Aucun modèle trouvé pour", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Langue", - "TEMPLATE_BODY": "Corps du modèle", - "CATEGORY": "Catégorie" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Entrez la valeur de {variable}", - "GO_BACK_LABEL": "Retour", - "SEND_MESSAGE_LABEL": "Envoyer un message", - "FORM_ERROR_MESSAGE": "Veuillez remplir toutes les variables avant d'envoyer" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Modèles WhatsApp", + "SUBTITLE": "Sélectionnez le modèle whatsapp que vous souhaitez envoyer", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Rechercher des modèles", + "NO_TEMPLATES_FOUND": "Aucun modèle trouvé pour", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Catégorie", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Langue", + "TEMPLATE_BODY": "Corps du modèle", + "CATEGORY": "Catégorie" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Langue", + "CATEGORY": "Catégorie", + "VARIABLE_PLACEHOLDER": "Entrez la valeur de {variable}", + "GO_BACK_LABEL": "Retour", + "SEND_MESSAGE_LABEL": "Envoyer un message", + "FORM_ERROR_MESSAGE": "Veuillez remplir toutes les variables avant d'envoyer", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/he/automation.json b/app/javascript/dashboard/i18n/locale/he/automation.json index e1be1df5c..6166c90a3 100644 --- a/app/javascript/dashboard/i18n/locale/he/automation.json +++ b/app/javascript/dashboard/i18n/locale/he/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "השיחה נוצרה", "CONVERSATION_UPDATED": "השיחה עודכנה", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "השיחה נפתחה" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/he/integrations.json b/app/javascript/dashboard/i18n/locale/he/integrations.json index 16058633b..37388725a 100644 --- a/app/javascript/dashboard/i18n/locale/he/integrations.json +++ b/app/javascript/dashboard/i18n/locale/he/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "מאפיינים", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/he/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/he/whatsappTemplates.json index 295b89a23..67b54f91f 100644 --- a/app/javascript/dashboard/i18n/locale/he/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/he/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "תבניות וואטסאפ", - "SUBTITLE": "בחר את תבנית הווטסאפ שברצונך לשלוח", - "TEMPLATE_SELECTED_SUBTITLE": "עיבוד {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "חפש תבניות", - "NO_TEMPLATES_FOUND": "לא נמצאו תבניות עבור", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "שפה", - "TEMPLATE_BODY": "גוף התבנית", - "CATEGORY": "קטגוריה" - } - }, - "PARSER": { - "VARIABLES_LABEL": "משתנים", - "VARIABLE_PLACEHOLDER": "הזן ערך {variable}", - "GO_BACK_LABEL": "חזור", - "SEND_MESSAGE_LABEL": "לשלוח הודעה", - "FORM_ERROR_MESSAGE": "נא למלא את כל המשתנים לפני השליחה" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "תבניות וואטסאפ", + "SUBTITLE": "בחר את תבנית הווטסאפ שברצונך לשלוח", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "חפש תבניות", + "NO_TEMPLATES_FOUND": "לא נמצאו תבניות עבור", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "קטגוריה", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "שפה", + "TEMPLATE_BODY": "גוף התבנית", + "CATEGORY": "קטגוריה" + } + }, + "PARSER": { + "VARIABLES_LABEL": "משתנים", + "LANGUAGE": "שפה", + "CATEGORY": "קטגוריה", + "VARIABLE_PLACEHOLDER": "הזן ערך {variable}", + "GO_BACK_LABEL": "חזור", + "SEND_MESSAGE_LABEL": "לשלוח הודעה", + "FORM_ERROR_MESSAGE": "נא למלא את כל המשתנים לפני השליחה", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/hi/automation.json b/app/javascript/dashboard/i18n/locale/hi/automation.json index cf63de81c..80274f488 100644 --- a/app/javascript/dashboard/i18n/locale/hi/automation.json +++ b/app/javascript/dashboard/i18n/locale/hi/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation Created", "CONVERSATION_UPDATED": "Conversation Updated", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/hi/integrations.json b/app/javascript/dashboard/i18n/locale/hi/integrations.json index bbb1c6662..cab231d7d 100644 --- a/app/javascript/dashboard/i18n/locale/hi/integrations.json +++ b/app/javascript/dashboard/i18n/locale/hi/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Features", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/hi/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/hi/whatsappTemplates.json index 4887d07b6..5f53faaa8 100644 --- a/app/javascript/dashboard/i18n/locale/hi/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/hi/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Select the whatsapp template you want to send", - "TEMPLATE_SELECTED_SUBTITLE": "Process {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Search Templates", - "NO_TEMPLATES_FOUND": "No templates found for", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Language", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter {variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Templates", + "SUBTITLE": "Select the whatsapp template you want to send", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Search Templates", + "NO_TEMPLATES_FOUND": "No templates found for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Language", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Go Back", + "SEND_MESSAGE_LABEL": "Send Message", + "FORM_ERROR_MESSAGE": "Please fill all variables before sending", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/hr/automation.json b/app/javascript/dashboard/i18n/locale/hr/automation.json index 8e1bcd7c4..65722bbf2 100644 --- a/app/javascript/dashboard/i18n/locale/hr/automation.json +++ b/app/javascript/dashboard/i18n/locale/hr/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation Created", "CONVERSATION_UPDATED": "Conversation Updated", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/hr/integrations.json b/app/javascript/dashboard/i18n/locale/hr/integrations.json index 63f5370c1..09eb8edaa 100644 --- a/app/javascript/dashboard/i18n/locale/hr/integrations.json +++ b/app/javascript/dashboard/i18n/locale/hr/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Features", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/hr/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/hr/whatsappTemplates.json index d943a13c1..ce82b426f 100644 --- a/app/javascript/dashboard/i18n/locale/hr/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/hr/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Predlošci", - "SUBTITLE": "Izaberi whatsapp predložak koji želiš poslati", - "TEMPLATE_SELECTED_SUBTITLE": "Proces {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Pretraži Predloške", - "NO_TEMPLATES_FOUND": "Nije pronađen predložak za", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Jezik", - "TEMPLATE_BODY": "Tijelo predloška", - "CATEGORY": "Kategorija" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Varijable", - "VARIABLE_PLACEHOLDER": "Unesi {variable} vrijednost", - "GO_BACK_LABEL": "Nazad", - "SEND_MESSAGE_LABEL": "Šalji poruku", - "FORM_ERROR_MESSAGE": "Popuniti sve varijable prije slanja" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Predlošci", + "SUBTITLE": "Izaberi whatsapp predložak koji želiš poslati", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Pretraži Predloške", + "NO_TEMPLATES_FOUND": "Nije pronađen predložak za", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Kategorija", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Jezik", + "TEMPLATE_BODY": "Tijelo predloška", + "CATEGORY": "Kategorija" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Varijable", + "LANGUAGE": "Jezik", + "CATEGORY": "Kategorija", + "VARIABLE_PLACEHOLDER": "Unesi {variable} vrijednost", + "GO_BACK_LABEL": "Nazad", + "SEND_MESSAGE_LABEL": "Šalji poruku", + "FORM_ERROR_MESSAGE": "Popuniti sve varijable prije slanja", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/hu/automation.json b/app/javascript/dashboard/i18n/locale/hu/automation.json index fc6accbe1..82873e610 100644 --- a/app/javascript/dashboard/i18n/locale/hu/automation.json +++ b/app/javascript/dashboard/i18n/locale/hu/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Beszélgetés létrehozva", "CONVERSATION_UPDATED": "Beszélgetés frissítve", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/hu/integrations.json b/app/javascript/dashboard/i18n/locale/hu/integrations.json index 00196e987..33904dde3 100644 --- a/app/javascript/dashboard/i18n/locale/hu/integrations.json +++ b/app/javascript/dashboard/i18n/locale/hu/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Lehetőségek", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/hu/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/hu/whatsappTemplates.json index 860ef1875..e28c69704 100644 --- a/app/javascript/dashboard/i18n/locale/hu/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/hu/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp sablonok", - "SUBTITLE": "Válaszd ki a Whatsapp sablont", - "TEMPLATE_SELECTED_SUBTITLE": "Feldolgozás: {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Sablon keresése", - "NO_TEMPLATES_FOUND": "Nem található sablon erre:", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Nyelv", - "TEMPLATE_BODY": "Sablon törzse", - "CATEGORY": "Kategória" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Változók", - "VARIABLE_PLACEHOLDER": "Add meg a {variable} értékét", - "GO_BACK_LABEL": "Vissza", - "SEND_MESSAGE_LABEL": "Üzenet küldése", - "FORM_ERROR_MESSAGE": "Kérlek add meg az összes változó értékét küldés előtt" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp sablonok", + "SUBTITLE": "Válaszd ki a Whatsapp sablont", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Sablon keresése", + "NO_TEMPLATES_FOUND": "Nem található sablon erre:", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Kategória", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Nyelv", + "TEMPLATE_BODY": "Sablon törzse", + "CATEGORY": "Kategória" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Változók", + "LANGUAGE": "Nyelv", + "CATEGORY": "Kategória", + "VARIABLE_PLACEHOLDER": "Add meg a {variable} értékét", + "GO_BACK_LABEL": "Vissza", + "SEND_MESSAGE_LABEL": "Üzenet küldése", + "FORM_ERROR_MESSAGE": "Kérlek add meg az összes változó értékét küldés előtt", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/hy/automation.json b/app/javascript/dashboard/i18n/locale/hy/automation.json index cf63de81c..80274f488 100644 --- a/app/javascript/dashboard/i18n/locale/hy/automation.json +++ b/app/javascript/dashboard/i18n/locale/hy/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation Created", "CONVERSATION_UPDATED": "Conversation Updated", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/hy/integrations.json b/app/javascript/dashboard/i18n/locale/hy/integrations.json index 68ce25b15..f0c7abbd3 100644 --- a/app/javascript/dashboard/i18n/locale/hy/integrations.json +++ b/app/javascript/dashboard/i18n/locale/hy/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Features", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/hy/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/hy/whatsappTemplates.json index 4887d07b6..5f53faaa8 100644 --- a/app/javascript/dashboard/i18n/locale/hy/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/hy/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Select the whatsapp template you want to send", - "TEMPLATE_SELECTED_SUBTITLE": "Process {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Search Templates", - "NO_TEMPLATES_FOUND": "No templates found for", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Language", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter {variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Templates", + "SUBTITLE": "Select the whatsapp template you want to send", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Search Templates", + "NO_TEMPLATES_FOUND": "No templates found for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Language", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Go Back", + "SEND_MESSAGE_LABEL": "Send Message", + "FORM_ERROR_MESSAGE": "Please fill all variables before sending", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/id/automation.json b/app/javascript/dashboard/i18n/locale/id/automation.json index ead34dbdd..e8a688248 100644 --- a/app/javascript/dashboard/i18n/locale/id/automation.json +++ b/app/javascript/dashboard/i18n/locale/id/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Percakapan Dibuat", "CONVERSATION_UPDATED": "Percakapan Diperbarui", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/id/integrations.json b/app/javascript/dashboard/i18n/locale/id/integrations.json index 116557224..98e186693 100644 --- a/app/javascript/dashboard/i18n/locale/id/integrations.json +++ b/app/javascript/dashboard/i18n/locale/id/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Fitur", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/id/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/id/whatsappTemplates.json index 88a806522..c9145225c 100644 --- a/app/javascript/dashboard/i18n/locale/id/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/id/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Templat Whatsapp", - "SUBTITLE": "Pilih templat Whatsapp yang ingin Anda kirim", - "TEMPLATE_SELECTED_SUBTITLE": "Process {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Cari Templat", - "NO_TEMPLATES_FOUND": "Tidak ditemukan templat untuk", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Bahasa", - "TEMPLATE_BODY": "Isi Templat", - "CATEGORY": "Kategori" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variabel", - "VARIABLE_PLACEHOLDER": "Masukkan nilai {variable}", - "GO_BACK_LABEL": "Kembali", - "SEND_MESSAGE_LABEL": "Kirim Pesan", - "FORM_ERROR_MESSAGE": "Harap isi semua variabel sebelum mengirim" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Templat Whatsapp", + "SUBTITLE": "Pilih templat Whatsapp yang ingin Anda kirim", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Cari Templat", + "NO_TEMPLATES_FOUND": "Tidak ditemukan templat untuk", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Kategori", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Bahasa", + "TEMPLATE_BODY": "Isi Templat", + "CATEGORY": "Kategori" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variabel", + "LANGUAGE": "Bahasa", + "CATEGORY": "Kategori", + "VARIABLE_PLACEHOLDER": "Masukkan nilai {variable}", + "GO_BACK_LABEL": "Kembali", + "SEND_MESSAGE_LABEL": "Kirim Pesan", + "FORM_ERROR_MESSAGE": "Harap isi semua variabel sebelum mengirim", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/is/automation.json b/app/javascript/dashboard/i18n/locale/is/automation.json index 145775f1c..8caeb2344 100644 --- a/app/javascript/dashboard/i18n/locale/is/automation.json +++ b/app/javascript/dashboard/i18n/locale/is/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation Created", "CONVERSATION_UPDATED": "Conversation Updated", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/is/integrations.json b/app/javascript/dashboard/i18n/locale/is/integrations.json index d0df69b2d..620ce70cf 100644 --- a/app/javascript/dashboard/i18n/locale/is/integrations.json +++ b/app/javascript/dashboard/i18n/locale/is/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Fídusar", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/is/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/is/whatsappTemplates.json index 0be0dfc90..55b7680af 100644 --- a/app/javascript/dashboard/i18n/locale/is/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/is/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Veldu WhatsApp sniðmátið sem þú vilt senda", - "TEMPLATE_SELECTED_SUBTITLE": "Process {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Search Templates", - "NO_TEMPLATES_FOUND": "No templates found for", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Language", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter {variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Templates", + "SUBTITLE": "Veldu WhatsApp sniðmátið sem þú vilt senda", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Search Templates", + "NO_TEMPLATES_FOUND": "No templates found for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Language", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Go Back", + "SEND_MESSAGE_LABEL": "Send Message", + "FORM_ERROR_MESSAGE": "Please fill all variables before sending", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/it/automation.json b/app/javascript/dashboard/i18n/locale/it/automation.json index 2052230e2..df3a5c0a8 100644 --- a/app/javascript/dashboard/i18n/locale/it/automation.json +++ b/app/javascript/dashboard/i18n/locale/it/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversazione creata", "CONVERSATION_UPDATED": "Conversazione aggiornata", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/it/integrations.json b/app/javascript/dashboard/i18n/locale/it/integrations.json index 0697ac873..102539b29 100644 --- a/app/javascript/dashboard/i18n/locale/it/integrations.json +++ b/app/javascript/dashboard/i18n/locale/it/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Funzionalità", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/it/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/it/whatsappTemplates.json index 2e1db45c7..b45435cca 100644 --- a/app/javascript/dashboard/i18n/locale/it/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/it/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Modelli Whatsapp", - "SUBTITLE": "Seleziona il modello whatsapp che vuoi inviare", - "TEMPLATE_SELECTED_SUBTITLE": "Elabora {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Cerca modelli", - "NO_TEMPLATES_FOUND": "Nessun modello trovato per", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Lingua", - "TEMPLATE_BODY": "Corpo modello", - "CATEGORY": "Categoria" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variabili", - "VARIABLE_PLACEHOLDER": "Inserisci il valore di {variable}", - "GO_BACK_LABEL": "Torna indietro", - "SEND_MESSAGE_LABEL": "Invia messaggio", - "FORM_ERROR_MESSAGE": "Si prega di compilare tutte le variabili prima di inviare" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Modelli Whatsapp", + "SUBTITLE": "Seleziona il modello whatsapp che vuoi inviare", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Cerca modelli", + "NO_TEMPLATES_FOUND": "Nessun modello trovato per", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Categoria", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Lingua", + "TEMPLATE_BODY": "Corpo modello", + "CATEGORY": "Categoria" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variabili", + "LANGUAGE": "Lingua", + "CATEGORY": "Categoria", + "VARIABLE_PLACEHOLDER": "Inserisci il valore di {variable}", + "GO_BACK_LABEL": "Torna indietro", + "SEND_MESSAGE_LABEL": "Invia messaggio", + "FORM_ERROR_MESSAGE": "Si prega di compilare tutte le variabili prima di inviare", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/ja/automation.json b/app/javascript/dashboard/i18n/locale/ja/automation.json index e78b88454..7b113c718 100644 --- a/app/javascript/dashboard/i18n/locale/ja/automation.json +++ b/app/javascript/dashboard/i18n/locale/ja/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "会話が作成されました", "CONVERSATION_UPDATED": "会話が更新されました", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/ja/integrations.json b/app/javascript/dashboard/i18n/locale/ja/integrations.json index d9b7442c5..65c471f3e 100644 --- a/app/javascript/dashboard/i18n/locale/ja/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ja/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "機能", "ALLOW_CONVERSATION_FAQS": "解決済みの会話からFAQを生成", - "ALLOW_MEMORIES": "顧客とのやり取りから重要な詳細を記憶としてキャプチャ" + "ALLOW_MEMORIES": "顧客とのやり取りから重要な詳細を記憶としてキャプチャ", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ja/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/ja/whatsappTemplates.json index de389b44c..3f1a39d1b 100644 --- a/app/javascript/dashboard/i18n/locale/ja/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/ja/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp テンプレート", - "SUBTITLE": "送信したいWhatsappテンプレートを選択してください", - "TEMPLATE_SELECTED_SUBTITLE": "{templateName} を処理中" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "テンプレートを検索", - "NO_TEMPLATES_FOUND": "該当するテンプレートが見つかりません:", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "言語", - "TEMPLATE_BODY": "テンプレート本文", - "CATEGORY": "カテゴリ" - } - }, - "PARSER": { - "VARIABLES_LABEL": "変数", - "VARIABLE_PLACEHOLDER": "{variable} の値を入力", - "GO_BACK_LABEL": "戻る", - "SEND_MESSAGE_LABEL": "メッセージを送信", - "FORM_ERROR_MESSAGE": "送信前に全ての変数を入力してください" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp テンプレート", + "SUBTITLE": "送信したいWhatsappテンプレートを選択してください", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "テンプレートを検索", + "NO_TEMPLATES_FOUND": "該当するテンプレートが見つかりません:", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "カテゴリ", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "言語", + "TEMPLATE_BODY": "テンプレート本文", + "CATEGORY": "カテゴリ" + } + }, + "PARSER": { + "VARIABLES_LABEL": "変数", + "LANGUAGE": "言語", + "CATEGORY": "カテゴリ", + "VARIABLE_PLACEHOLDER": "{variable} の値を入力", + "GO_BACK_LABEL": "戻る", + "SEND_MESSAGE_LABEL": "メッセージを送信", + "FORM_ERROR_MESSAGE": "送信前に全ての変数を入力してください", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/ka/automation.json b/app/javascript/dashboard/i18n/locale/ka/automation.json index cf63de81c..80274f488 100644 --- a/app/javascript/dashboard/i18n/locale/ka/automation.json +++ b/app/javascript/dashboard/i18n/locale/ka/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation Created", "CONVERSATION_UPDATED": "Conversation Updated", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/ka/integrations.json b/app/javascript/dashboard/i18n/locale/ka/integrations.json index 68ce25b15..f0c7abbd3 100644 --- a/app/javascript/dashboard/i18n/locale/ka/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ka/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Features", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ka/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/ka/whatsappTemplates.json index 4887d07b6..5f53faaa8 100644 --- a/app/javascript/dashboard/i18n/locale/ka/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/ka/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Select the whatsapp template you want to send", - "TEMPLATE_SELECTED_SUBTITLE": "Process {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Search Templates", - "NO_TEMPLATES_FOUND": "No templates found for", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Language", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter {variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Templates", + "SUBTITLE": "Select the whatsapp template you want to send", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Search Templates", + "NO_TEMPLATES_FOUND": "No templates found for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Language", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Go Back", + "SEND_MESSAGE_LABEL": "Send Message", + "FORM_ERROR_MESSAGE": "Please fill all variables before sending", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/ko/automation.json b/app/javascript/dashboard/i18n/locale/ko/automation.json index e12df529d..a5e1b079c 100644 --- a/app/javascript/dashboard/i18n/locale/ko/automation.json +++ b/app/javascript/dashboard/i18n/locale/ko/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation Created", "CONVERSATION_UPDATED": "Conversation Updated", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/ko/integrations.json b/app/javascript/dashboard/i18n/locale/ko/integrations.json index 37335c120..e5935505e 100644 --- a/app/javascript/dashboard/i18n/locale/ko/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ko/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "특징", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ko/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/ko/whatsappTemplates.json index 71fc338da..6f6c098f5 100644 --- a/app/javascript/dashboard/i18n/locale/ko/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/ko/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Select the whatsapp template you want to send", - "TEMPLATE_SELECTED_SUBTITLE": "Process {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Search Templates", - "NO_TEMPLATES_FOUND": "No templates found for", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "언어", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter {variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Templates", + "SUBTITLE": "Select the whatsapp template you want to send", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Search Templates", + "NO_TEMPLATES_FOUND": "No templates found for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "언어", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "언어", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Go Back", + "SEND_MESSAGE_LABEL": "Send Message", + "FORM_ERROR_MESSAGE": "Please fill all variables before sending", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/lt/automation.json b/app/javascript/dashboard/i18n/locale/lt/automation.json index 54bb9075b..3485c2355 100644 --- a/app/javascript/dashboard/i18n/locale/lt/automation.json +++ b/app/javascript/dashboard/i18n/locale/lt/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Pokalbis sukurtas", "CONVERSATION_UPDATED": "Pokalbis atnaujintas", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/lt/integrations.json b/app/javascript/dashboard/i18n/locale/lt/integrations.json index 90bf8d22d..81cba5fee 100644 --- a/app/javascript/dashboard/i18n/locale/lt/integrations.json +++ b/app/javascript/dashboard/i18n/locale/lt/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Funkcijos", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/lt/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/lt/whatsappTemplates.json index 7c9073480..a46abc2a0 100644 --- a/app/javascript/dashboard/i18n/locale/lt/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/lt/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Šablonai", - "SUBTITLE": "Pasirinkite WhatsApp šabloną, kurį norite siųsti", - "TEMPLATE_SELECTED_SUBTITLE": "Apdoroti {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Ieškoti šablonų", - "NO_TEMPLATES_FOUND": "Šablonų nerasta", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Kalba", - "TEMPLATE_BODY": "Šablono tekstas", - "CATEGORY": "Kategorija" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Kintamieji", - "VARIABLE_PLACEHOLDER": "Įveskite {variable} reikšmę", - "GO_BACK_LABEL": "Grįžti", - "SEND_MESSAGE_LABEL": "Išsiųsti pranešimą", - "FORM_ERROR_MESSAGE": "Prieš siųsdami užpildykite visus kintamuosius" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Šablonai", + "SUBTITLE": "Pasirinkite WhatsApp šabloną, kurį norite siųsti", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Ieškoti šablonų", + "NO_TEMPLATES_FOUND": "Šablonų nerasta", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Kategorija", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Kalba", + "TEMPLATE_BODY": "Šablono tekstas", + "CATEGORY": "Kategorija" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Kintamieji", + "LANGUAGE": "Kalba", + "CATEGORY": "Kategorija", + "VARIABLE_PLACEHOLDER": "Įveskite {variable} reikšmę", + "GO_BACK_LABEL": "Grįžti", + "SEND_MESSAGE_LABEL": "Išsiųsti pranešimą", + "FORM_ERROR_MESSAGE": "Prieš siųsdami užpildykite visus kintamuosius", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/lv/automation.json b/app/javascript/dashboard/i18n/locale/lv/automation.json index 193ef9739..9877bb4e3 100644 --- a/app/javascript/dashboard/i18n/locale/lv/automation.json +++ b/app/javascript/dashboard/i18n/locale/lv/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Saruna izveidota", "CONVERSATION_UPDATED": "Saruna Atjaunināta", "MESSAGE_CREATED": "Ziņojums Izveidots", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Saruna Atvērta" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/lv/integrations.json b/app/javascript/dashboard/i18n/locale/lv/integrations.json index e5a013bd7..b8f109f61 100644 --- a/app/javascript/dashboard/i18n/locale/lv/integrations.json +++ b/app/javascript/dashboard/i18n/locale/lv/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Īpašības", "ALLOW_CONVERSATION_FAQS": "Ģenerēt bieži uzdotos jautājumus no atrisinātajām sarunām", - "ALLOW_MEMORIES": "Pārtvert galvenās nianses kā atmiņas no klientu mijiedarbībām." + "ALLOW_MEMORIES": "Pārtvert galvenās nianses kā atmiņas no klientu mijiedarbībām.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/lv/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/lv/whatsappTemplates.json index 330ab173d..0b51f15f3 100644 --- a/app/javascript/dashboard/i18n/locale/lv/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/lv/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "WhatsApp Veidnes", - "SUBTITLE": "Izvēlieties WhatsApp veidni, kuru vēlaties nosūtīt", - "TEMPLATE_SELECTED_SUBTITLE": "Apstrādāt {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Meklēt Veidnes", - "NO_TEMPLATES_FOUND": "Veidnes nav atrastas", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Valoda", - "TEMPLATE_BODY": "Veidnes Pamatteksts", - "CATEGORY": "Kategorija" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Mainīgie", - "VARIABLE_PLACEHOLDER": "Ievadiet {variable} vērtību", - "GO_BACK_LABEL": "Atgriezties", - "SEND_MESSAGE_LABEL": "Sūtīt Ziņojumu", - "FORM_ERROR_MESSAGE": "Lūdzu, pirms nosūtīšanas aizpildiet visus mainīgos" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "WhatsApp Veidnes", + "SUBTITLE": "Izvēlieties WhatsApp veidni, kuru vēlaties nosūtīt", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Meklēt Veidnes", + "NO_TEMPLATES_FOUND": "Veidnes nav atrastas", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Kategorija", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Valoda", + "TEMPLATE_BODY": "Veidnes Pamatteksts", + "CATEGORY": "Kategorija" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Mainīgie", + "LANGUAGE": "Valoda", + "CATEGORY": "Kategorija", + "VARIABLE_PLACEHOLDER": "Ievadiet {variable} vērtību", + "GO_BACK_LABEL": "Atgriezties", + "SEND_MESSAGE_LABEL": "Sūtīt Ziņojumu", + "FORM_ERROR_MESSAGE": "Lūdzu, pirms nosūtīšanas aizpildiet visus mainīgos", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/ml/automation.json b/app/javascript/dashboard/i18n/locale/ml/automation.json index b50618313..6c3cd4517 100644 --- a/app/javascript/dashboard/i18n/locale/ml/automation.json +++ b/app/javascript/dashboard/i18n/locale/ml/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation Created", "CONVERSATION_UPDATED": "Conversation Updated", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/ml/integrations.json b/app/javascript/dashboard/i18n/locale/ml/integrations.json index f64124402..f375f9ff2 100644 --- a/app/javascript/dashboard/i18n/locale/ml/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ml/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Features", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ml/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/ml/whatsappTemplates.json index 4887d07b6..5f53faaa8 100644 --- a/app/javascript/dashboard/i18n/locale/ml/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/ml/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Select the whatsapp template you want to send", - "TEMPLATE_SELECTED_SUBTITLE": "Process {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Search Templates", - "NO_TEMPLATES_FOUND": "No templates found for", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Language", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter {variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Templates", + "SUBTITLE": "Select the whatsapp template you want to send", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Search Templates", + "NO_TEMPLATES_FOUND": "No templates found for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Language", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Go Back", + "SEND_MESSAGE_LABEL": "Send Message", + "FORM_ERROR_MESSAGE": "Please fill all variables before sending", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/ms/automation.json b/app/javascript/dashboard/i18n/locale/ms/automation.json index 2bdccfc0e..e3990a8ab 100644 --- a/app/javascript/dashboard/i18n/locale/ms/automation.json +++ b/app/javascript/dashboard/i18n/locale/ms/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation Created", "CONVERSATION_UPDATED": "Conversation Updated", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/ms/integrations.json b/app/javascript/dashboard/i18n/locale/ms/integrations.json index 3f5083d30..cb2c4a677 100644 --- a/app/javascript/dashboard/i18n/locale/ms/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ms/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Features", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ms/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/ms/whatsappTemplates.json index 4887d07b6..5f53faaa8 100644 --- a/app/javascript/dashboard/i18n/locale/ms/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/ms/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Select the whatsapp template you want to send", - "TEMPLATE_SELECTED_SUBTITLE": "Process {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Search Templates", - "NO_TEMPLATES_FOUND": "No templates found for", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Language", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter {variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Templates", + "SUBTITLE": "Select the whatsapp template you want to send", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Search Templates", + "NO_TEMPLATES_FOUND": "No templates found for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Language", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Go Back", + "SEND_MESSAGE_LABEL": "Send Message", + "FORM_ERROR_MESSAGE": "Please fill all variables before sending", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/ne/automation.json b/app/javascript/dashboard/i18n/locale/ne/automation.json index a4c0ce10b..4aba66e26 100644 --- a/app/javascript/dashboard/i18n/locale/ne/automation.json +++ b/app/javascript/dashboard/i18n/locale/ne/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation Created", "CONVERSATION_UPDATED": "Conversation Updated", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/ne/integrations.json b/app/javascript/dashboard/i18n/locale/ne/integrations.json index bc72dd2e3..56a6766fc 100644 --- a/app/javascript/dashboard/i18n/locale/ne/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ne/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Features", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ne/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/ne/whatsappTemplates.json index 4887d07b6..5f53faaa8 100644 --- a/app/javascript/dashboard/i18n/locale/ne/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/ne/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Select the whatsapp template you want to send", - "TEMPLATE_SELECTED_SUBTITLE": "Process {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Search Templates", - "NO_TEMPLATES_FOUND": "No templates found for", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Language", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter {variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Templates", + "SUBTITLE": "Select the whatsapp template you want to send", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Search Templates", + "NO_TEMPLATES_FOUND": "No templates found for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Language", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Go Back", + "SEND_MESSAGE_LABEL": "Send Message", + "FORM_ERROR_MESSAGE": "Please fill all variables before sending", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/nl/automation.json b/app/javascript/dashboard/i18n/locale/nl/automation.json index 269bf96ab..dd45ce36d 100644 --- a/app/javascript/dashboard/i18n/locale/nl/automation.json +++ b/app/javascript/dashboard/i18n/locale/nl/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Gesprek aangemaakt", "CONVERSATION_UPDATED": "Gesprek bijgewerkt", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/nl/integrations.json b/app/javascript/dashboard/i18n/locale/nl/integrations.json index 7b971629c..cecc6fac0 100644 --- a/app/javascript/dashboard/i18n/locale/nl/integrations.json +++ b/app/javascript/dashboard/i18n/locale/nl/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Features", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/nl/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/nl/whatsappTemplates.json index 4061f4090..7e4317fb8 100644 --- a/app/javascript/dashboard/i18n/locale/nl/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/nl/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Selecteer de whatsapp template die u wilt verzenden", - "TEMPLATE_SELECTED_SUBTITLE": "Verwerk {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Templates zoeken", - "NO_TEMPLATES_FOUND": "Geen templates gevonden voor", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Taal", - "TEMPLATE_BODY": "Template bericht", - "CATEGORY": "Categorie" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variabelen", - "VARIABLE_PLACEHOLDER": "Voer {variable} waarde in", - "GO_BACK_LABEL": "Ga terug", - "SEND_MESSAGE_LABEL": "Verstuur bericht", - "FORM_ERROR_MESSAGE": "Vul alstublieft alle variabelen in voordat u deze verzendt" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Templates", + "SUBTITLE": "Selecteer de whatsapp template die u wilt verzenden", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Templates zoeken", + "NO_TEMPLATES_FOUND": "Geen templates gevonden voor", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Categorie", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Taal", + "TEMPLATE_BODY": "Template bericht", + "CATEGORY": "Categorie" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variabelen", + "LANGUAGE": "Taal", + "CATEGORY": "Categorie", + "VARIABLE_PLACEHOLDER": "Voer {variable} waarde in", + "GO_BACK_LABEL": "Ga terug", + "SEND_MESSAGE_LABEL": "Verstuur bericht", + "FORM_ERROR_MESSAGE": "Vul alstublieft alle variabelen in voordat u deze verzendt", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/no/automation.json b/app/javascript/dashboard/i18n/locale/no/automation.json index 4a5b37875..c76e4dc1a 100644 --- a/app/javascript/dashboard/i18n/locale/no/automation.json +++ b/app/javascript/dashboard/i18n/locale/no/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation Created", "CONVERSATION_UPDATED": "Conversation Updated", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/no/integrations.json b/app/javascript/dashboard/i18n/locale/no/integrations.json index 10b668191..033245b58 100644 --- a/app/javascript/dashboard/i18n/locale/no/integrations.json +++ b/app/javascript/dashboard/i18n/locale/no/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Funksjoner", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/no/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/no/whatsappTemplates.json index 4887d07b6..5f53faaa8 100644 --- a/app/javascript/dashboard/i18n/locale/no/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/no/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Select the whatsapp template you want to send", - "TEMPLATE_SELECTED_SUBTITLE": "Process {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Search Templates", - "NO_TEMPLATES_FOUND": "No templates found for", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Language", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter {variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Templates", + "SUBTITLE": "Select the whatsapp template you want to send", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Search Templates", + "NO_TEMPLATES_FOUND": "No templates found for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Language", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Go Back", + "SEND_MESSAGE_LABEL": "Send Message", + "FORM_ERROR_MESSAGE": "Please fill all variables before sending", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/pl/automation.json b/app/javascript/dashboard/i18n/locale/pl/automation.json index 3ebfa9550..f4212f70c 100644 --- a/app/javascript/dashboard/i18n/locale/pl/automation.json +++ b/app/javascript/dashboard/i18n/locale/pl/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Rozpoczęcie rozmowy", "CONVERSATION_UPDATED": "Aktualizacja rozmowy", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/pl/integrations.json b/app/javascript/dashboard/i18n/locale/pl/integrations.json index ec149a9e4..7787df954 100644 --- a/app/javascript/dashboard/i18n/locale/pl/integrations.json +++ b/app/javascript/dashboard/i18n/locale/pl/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Funkcje", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/pl/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/pl/whatsappTemplates.json index fb87e1425..e1946af25 100644 --- a/app/javascript/dashboard/i18n/locale/pl/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/pl/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Szablony WhatsApp", - "SUBTITLE": "Wybierz szablon WhatsApp, który chcesz wysłać", - "TEMPLATE_SELECTED_SUBTITLE": "Przetwarzanie {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Wyszukaj szablony", - "NO_TEMPLATES_FOUND": "Nie znaleziono szablonów dla", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Język", - "TEMPLATE_BODY": "Treść szablonu", - "CATEGORY": "Kategoria" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Zmienne", - "VARIABLE_PLACEHOLDER": "Wprowadź wartość {variable}", - "GO_BACK_LABEL": "Powrót", - "SEND_MESSAGE_LABEL": "Wyślij wiadomość", - "FORM_ERROR_MESSAGE": "Proszę wypełnić wszystkie zmienne przed wysłaniem" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Szablony WhatsApp", + "SUBTITLE": "Wybierz szablon WhatsApp, który chcesz wysłać", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Wyszukaj szablony", + "NO_TEMPLATES_FOUND": "Nie znaleziono szablonów dla", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Kategoria", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Język", + "TEMPLATE_BODY": "Treść szablonu", + "CATEGORY": "Kategoria" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Zmienne", + "LANGUAGE": "Język", + "CATEGORY": "Kategoria", + "VARIABLE_PLACEHOLDER": "Wprowadź wartość {variable}", + "GO_BACK_LABEL": "Powrót", + "SEND_MESSAGE_LABEL": "Wyślij wiadomość", + "FORM_ERROR_MESSAGE": "Proszę wypełnić wszystkie zmienne przed wysłaniem", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/pt/automation.json b/app/javascript/dashboard/i18n/locale/pt/automation.json index a2740c577..0a720f528 100644 --- a/app/javascript/dashboard/i18n/locale/pt/automation.json +++ b/app/javascript/dashboard/i18n/locale/pt/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversa criada", "CONVERSATION_UPDATED": "Conversa atualizada", "MESSAGE_CREATED": "Mensagem criada", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversa aberta" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/pt/integrations.json b/app/javascript/dashboard/i18n/locale/pt/integrations.json index 69c3ddb4f..2a86bd97f 100644 --- a/app/javascript/dashboard/i18n/locale/pt/integrations.json +++ b/app/javascript/dashboard/i18n/locale/pt/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Características", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/pt/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/pt/whatsappTemplates.json index cba42fd01..45100216d 100644 --- a/app/javascript/dashboard/i18n/locale/pt/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/pt/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Template do WhatsApp", - "SUBTITLE": "Selecione o template do whatsapp que você deseja enviar", - "TEMPLATE_SELECTED_SUBTITLE": "Processo {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Buscar templates", - "NO_TEMPLATES_FOUND": "Nenhum template encontrado para", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Idioma", - "TEMPLATE_BODY": "Corpo do Template", - "CATEGORY": "Categoria" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variáveis", - "VARIABLE_PLACEHOLDER": "Digite o valor {variable}", - "GO_BACK_LABEL": "Voltar", - "SEND_MESSAGE_LABEL": "Enviar mensagem", - "FORM_ERROR_MESSAGE": "Preencha todas as variáveis antes de enviar" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Template do WhatsApp", + "SUBTITLE": "Selecione o template do whatsapp que você deseja enviar", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Buscar templates", + "NO_TEMPLATES_FOUND": "Nenhum template encontrado para", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Categoria", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Idioma", + "TEMPLATE_BODY": "Corpo do Template", + "CATEGORY": "Categoria" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variáveis", + "LANGUAGE": "Idioma", + "CATEGORY": "Categoria", + "VARIABLE_PLACEHOLDER": "Digite o valor {variable}", + "GO_BACK_LABEL": "Voltar", + "SEND_MESSAGE_LABEL": "Enviar mensagem", + "FORM_ERROR_MESSAGE": "Preencha todas as variáveis antes de enviar", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/automation.json b/app/javascript/dashboard/i18n/locale/pt_BR/automation.json index 22a097713..a3ecb50ac 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/automation.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversa Criada", "CONVERSATION_UPDATED": "Conversa Atualizada", "MESSAGE_CREATED": "Mensagem Criada", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversa Aberta" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json b/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json index 1b690cb82..67102dbb5 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Funcionalidades", "ALLOW_CONVERSATION_FAQS": "Gerar perguntas frequentes a partir de conversas resolvidas", - "ALLOW_MEMORIES": "Capture os principais detalhes como memórias de interações do cliente." + "ALLOW_MEMORIES": "Capture os principais detalhes como memórias de interações do cliente.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/pt_BR/whatsappTemplates.json index 1149bc577..27accbaa8 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Templates do Whatsapp", - "SUBTITLE": "Selecione o template do whatsapp que você deseja enviar", - "TEMPLATE_SELECTED_SUBTITLE": "Processar {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Pesquisar modelos", - "NO_TEMPLATES_FOUND": "Não há templates encontrados para", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Idioma", - "TEMPLATE_BODY": "Conteúdo do Template", - "CATEGORY": "Categoria" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variáveis", - "VARIABLE_PLACEHOLDER": "Insira o valor para {variable}", - "GO_BACK_LABEL": "Voltar", - "SEND_MESSAGE_LABEL": "Enviar Mensagem", - "FORM_ERROR_MESSAGE": "Por favor, preencha todas as variáveis antes de enviar" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Templates do Whatsapp", + "SUBTITLE": "Selecione o template do whatsapp que você deseja enviar", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Pesquisar modelos", + "NO_TEMPLATES_FOUND": "Não há templates encontrados para", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Categoria", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Idioma", + "TEMPLATE_BODY": "Conteúdo do Template", + "CATEGORY": "Categoria" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variáveis", + "LANGUAGE": "Idioma", + "CATEGORY": "Categoria", + "VARIABLE_PLACEHOLDER": "Insira o valor para {variable}", + "GO_BACK_LABEL": "Voltar", + "SEND_MESSAGE_LABEL": "Enviar Mensagem", + "FORM_ERROR_MESSAGE": "Por favor, preencha todas as variáveis antes de enviar", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/ro/automation.json b/app/javascript/dashboard/i18n/locale/ro/automation.json index 38a4dd0c6..8f18d43fe 100644 --- a/app/javascript/dashboard/i18n/locale/ro/automation.json +++ b/app/javascript/dashboard/i18n/locale/ro/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversație creată", "CONVERSATION_UPDATED": "Conversație actualizată", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/ro/integrations.json b/app/javascript/dashboard/i18n/locale/ro/integrations.json index 513b93b64..dae7e2088 100644 --- a/app/javascript/dashboard/i18n/locale/ro/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ro/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Caracteristici", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ro/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/ro/whatsappTemplates.json index fda8d7b10..e1697e19f 100644 --- a/app/javascript/dashboard/i18n/locale/ro/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/ro/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Șabloane WhatsApp", - "SUBTITLE": "Selectați șablonul WhatsApp pe care doriți să trimiteți", - "TEMPLATE_SELECTED_SUBTITLE": "{templateName} de proces" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Caută Șabloane", - "NO_TEMPLATES_FOUND": "Nu s-au găsit șabloane pentru", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Limbă", - "TEMPLATE_BODY": "Corpul șablonului", - "CATEGORY": "Categorie" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variabile", - "VARIABLE_PLACEHOLDER": "Introducerea {variable} valoare", - "GO_BACK_LABEL": "Înapoi", - "SEND_MESSAGE_LABEL": "Trimite mesaj", - "FORM_ERROR_MESSAGE": "Vă rugăm să completați toate variabilele înainte de a trimite" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Șabloane WhatsApp", + "SUBTITLE": "Selectați șablonul WhatsApp pe care doriți să trimiteți", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Caută Șabloane", + "NO_TEMPLATES_FOUND": "Nu s-au găsit șabloane pentru", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Categorie", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Limbă", + "TEMPLATE_BODY": "Corpul șablonului", + "CATEGORY": "Categorie" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variabile", + "LANGUAGE": "Limbă", + "CATEGORY": "Categorie", + "VARIABLE_PLACEHOLDER": "Introducerea {variable} valoare", + "GO_BACK_LABEL": "Înapoi", + "SEND_MESSAGE_LABEL": "Trimite mesaj", + "FORM_ERROR_MESSAGE": "Vă rugăm să completați toate variabilele înainte de a trimite", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/ru/automation.json b/app/javascript/dashboard/i18n/locale/ru/automation.json index 49e5699c9..08ead85fe 100644 --- a/app/javascript/dashboard/i18n/locale/ru/automation.json +++ b/app/javascript/dashboard/i18n/locale/ru/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Диалог создан", "CONVERSATION_UPDATED": "Диалог обновлён", "MESSAGE_CREATED": "Сообщение создано", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/ru/integrations.json b/app/javascript/dashboard/i18n/locale/ru/integrations.json index 833e9faf5..6de478fb1 100644 --- a/app/javascript/dashboard/i18n/locale/ru/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ru/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Возможности", "ALLOW_CONVERSATION_FAQS": "Создать FAQ из решённых диалогов", - "ALLOW_MEMORIES": "Сохраняйте ключевые детали в виде воспоминаний о взаимодействии с клиентами." + "ALLOW_MEMORIES": "Сохраняйте ключевые детали в виде воспоминаний о взаимодействии с клиентами.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ru/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/ru/whatsappTemplates.json index 65c55ec5a..a8effa8b8 100644 --- a/app/javascript/dashboard/i18n/locale/ru/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/ru/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Шаблоны Whatsapp", - "SUBTITLE": "Выберите шаблон whatsapp, который вы хотите отправить", - "TEMPLATE_SELECTED_SUBTITLE": "Обработка {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Найти шаблоны", - "NO_TEMPLATES_FOUND": "Не найдено шаблонов для", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Язык", - "TEMPLATE_BODY": "Тело шаблона", - "CATEGORY": "Категория" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Переменные", - "VARIABLE_PLACEHOLDER": "Введите значение {variable}", - "GO_BACK_LABEL": "Вернуться", - "SEND_MESSAGE_LABEL": "Отправить сообщение", - "FORM_ERROR_MESSAGE": "Пожалуйста, заполните все переменные перед отправкой" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Шаблоны Whatsapp", + "SUBTITLE": "Выберите шаблон whatsapp, который вы хотите отправить", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Найти шаблоны", + "NO_TEMPLATES_FOUND": "Не найдено шаблонов для", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Категория", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Язык", + "TEMPLATE_BODY": "Тело шаблона", + "CATEGORY": "Категория" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Переменные", + "LANGUAGE": "Язык", + "CATEGORY": "Категория", + "VARIABLE_PLACEHOLDER": "Введите значение {variable}", + "GO_BACK_LABEL": "Вернуться", + "SEND_MESSAGE_LABEL": "Отправить сообщение", + "FORM_ERROR_MESSAGE": "Пожалуйста, заполните все переменные перед отправкой", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/sh/automation.json b/app/javascript/dashboard/i18n/locale/sh/automation.json index cf63de81c..80274f488 100644 --- a/app/javascript/dashboard/i18n/locale/sh/automation.json +++ b/app/javascript/dashboard/i18n/locale/sh/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation Created", "CONVERSATION_UPDATED": "Conversation Updated", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/sh/integrations.json b/app/javascript/dashboard/i18n/locale/sh/integrations.json index 68ce25b15..f0c7abbd3 100644 --- a/app/javascript/dashboard/i18n/locale/sh/integrations.json +++ b/app/javascript/dashboard/i18n/locale/sh/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Features", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/sh/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/sh/whatsappTemplates.json index 4887d07b6..5f53faaa8 100644 --- a/app/javascript/dashboard/i18n/locale/sh/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/sh/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Select the whatsapp template you want to send", - "TEMPLATE_SELECTED_SUBTITLE": "Process {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Search Templates", - "NO_TEMPLATES_FOUND": "No templates found for", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Language", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter {variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Templates", + "SUBTITLE": "Select the whatsapp template you want to send", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Search Templates", + "NO_TEMPLATES_FOUND": "No templates found for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Language", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Go Back", + "SEND_MESSAGE_LABEL": "Send Message", + "FORM_ERROR_MESSAGE": "Please fill all variables before sending", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/sk/automation.json b/app/javascript/dashboard/i18n/locale/sk/automation.json index 9c2c463bc..2ea93e17a 100644 --- a/app/javascript/dashboard/i18n/locale/sk/automation.json +++ b/app/javascript/dashboard/i18n/locale/sk/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation Created", "CONVERSATION_UPDATED": "Conversation Updated", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/sk/integrations.json b/app/javascript/dashboard/i18n/locale/sk/integrations.json index e0d32c972..55cd79768 100644 --- a/app/javascript/dashboard/i18n/locale/sk/integrations.json +++ b/app/javascript/dashboard/i18n/locale/sk/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Features", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/sk/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/sk/whatsappTemplates.json index 4887d07b6..5f53faaa8 100644 --- a/app/javascript/dashboard/i18n/locale/sk/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/sk/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Select the whatsapp template you want to send", - "TEMPLATE_SELECTED_SUBTITLE": "Process {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Search Templates", - "NO_TEMPLATES_FOUND": "No templates found for", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Language", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter {variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Templates", + "SUBTITLE": "Select the whatsapp template you want to send", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Search Templates", + "NO_TEMPLATES_FOUND": "No templates found for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Language", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Go Back", + "SEND_MESSAGE_LABEL": "Send Message", + "FORM_ERROR_MESSAGE": "Please fill all variables before sending", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/sl/automation.json b/app/javascript/dashboard/i18n/locale/sl/automation.json index 694902ab5..2f97d7257 100644 --- a/app/javascript/dashboard/i18n/locale/sl/automation.json +++ b/app/javascript/dashboard/i18n/locale/sl/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation Created", "CONVERSATION_UPDATED": "Conversation Updated", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/sl/integrations.json b/app/javascript/dashboard/i18n/locale/sl/integrations.json index 5880a6b3c..e1f8321c5 100644 --- a/app/javascript/dashboard/i18n/locale/sl/integrations.json +++ b/app/javascript/dashboard/i18n/locale/sl/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Features", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/sl/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/sl/whatsappTemplates.json index eb4acbea6..aa6011859 100644 --- a/app/javascript/dashboard/i18n/locale/sl/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/sl/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Predloge za WhatsApp", - "SUBTITLE": "Izberite predlogo WhatsApp, ki jo želite poslati", - "TEMPLATE_SELECTED_SUBTITLE": "Obdelaj {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Išči predloge", - "NO_TEMPLATES_FOUND": "Ni najdenih predlog za", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Jezik", - "TEMPLATE_BODY": "Telo predloge", - "CATEGORY": "Kategorija" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Spremenljivke", - "VARIABLE_PLACEHOLDER": "Vnesi vrednost {variable}", - "GO_BACK_LABEL": "Pojdi nazaj", - "SEND_MESSAGE_LABEL": "Pošlji sporočilo", - "FORM_ERROR_MESSAGE": "Prosimo, izpolnite vse spremenljivke pred pošiljanjem" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Predloge za WhatsApp", + "SUBTITLE": "Izberite predlogo WhatsApp, ki jo želite poslati", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Išči predloge", + "NO_TEMPLATES_FOUND": "Ni najdenih predlog za", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Kategorija", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Jezik", + "TEMPLATE_BODY": "Telo predloge", + "CATEGORY": "Kategorija" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Spremenljivke", + "LANGUAGE": "Jezik", + "CATEGORY": "Kategorija", + "VARIABLE_PLACEHOLDER": "Vnesi vrednost {variable}", + "GO_BACK_LABEL": "Pojdi nazaj", + "SEND_MESSAGE_LABEL": "Pošlji sporočilo", + "FORM_ERROR_MESSAGE": "Prosimo, izpolnite vse spremenljivke pred pošiljanjem", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/sq/automation.json b/app/javascript/dashboard/i18n/locale/sq/automation.json index 643d3b09a..280c6c65d 100644 --- a/app/javascript/dashboard/i18n/locale/sq/automation.json +++ b/app/javascript/dashboard/i18n/locale/sq/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation Created", "CONVERSATION_UPDATED": "Conversation Updated", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/sq/integrations.json b/app/javascript/dashboard/i18n/locale/sq/integrations.json index 24315dec2..3fe43940a 100644 --- a/app/javascript/dashboard/i18n/locale/sq/integrations.json +++ b/app/javascript/dashboard/i18n/locale/sq/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Features", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/sq/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/sq/whatsappTemplates.json index 4887d07b6..5f53faaa8 100644 --- a/app/javascript/dashboard/i18n/locale/sq/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/sq/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Select the whatsapp template you want to send", - "TEMPLATE_SELECTED_SUBTITLE": "Process {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Search Templates", - "NO_TEMPLATES_FOUND": "No templates found for", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Language", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter {variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Templates", + "SUBTITLE": "Select the whatsapp template you want to send", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Search Templates", + "NO_TEMPLATES_FOUND": "No templates found for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Language", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Go Back", + "SEND_MESSAGE_LABEL": "Send Message", + "FORM_ERROR_MESSAGE": "Please fill all variables before sending", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/sr/automation.json b/app/javascript/dashboard/i18n/locale/sr/automation.json index f3bee7561..0f15f8e3d 100644 --- a/app/javascript/dashboard/i18n/locale/sr/automation.json +++ b/app/javascript/dashboard/i18n/locale/sr/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Razgovor je napravljen", "CONVERSATION_UPDATED": "Razgovor je izmenjen", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/sr/integrations.json b/app/javascript/dashboard/i18n/locale/sr/integrations.json index 8dada5dc6..77c6d0b7b 100644 --- a/app/javascript/dashboard/i18n/locale/sr/integrations.json +++ b/app/javascript/dashboard/i18n/locale/sr/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Mogućnosti", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/sr/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/sr/whatsappTemplates.json index 27fed1503..a3cf57d23 100644 --- a/app/javascript/dashboard/i18n/locale/sr/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/sr/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp šabloni", - "SUBTITLE": "Izaberite koji whatsapp šablon želite da pošaljete", - "TEMPLATE_SELECTED_SUBTITLE": "Obrada {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Pretraži šablone", - "NO_TEMPLATES_FOUND": "Nijedan šablon nije pronađen", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Jezik", - "TEMPLATE_BODY": "Telo šablona", - "CATEGORY": "Kategorija" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Promenljive", - "VARIABLE_PLACEHOLDER": "Unesite vrednost za {variable}", - "GO_BACK_LABEL": "Povratak", - "SEND_MESSAGE_LABEL": "Pošalji poruku", - "FORM_ERROR_MESSAGE": "Molim vas popunite sve promenljive pre slanja" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp šabloni", + "SUBTITLE": "Izaberite koji whatsapp šablon želite da pošaljete", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Pretraži šablone", + "NO_TEMPLATES_FOUND": "Nijedan šablon nije pronađen", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Kategorija", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Jezik", + "TEMPLATE_BODY": "Telo šablona", + "CATEGORY": "Kategorija" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Promenljive", + "LANGUAGE": "Jezik", + "CATEGORY": "Kategorija", + "VARIABLE_PLACEHOLDER": "Unesite vrednost za {variable}", + "GO_BACK_LABEL": "Povratak", + "SEND_MESSAGE_LABEL": "Pošalji poruku", + "FORM_ERROR_MESSAGE": "Molim vas popunite sve promenljive pre slanja", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/sv/automation.json b/app/javascript/dashboard/i18n/locale/sv/automation.json index d50296a86..b21bfe262 100644 --- a/app/javascript/dashboard/i18n/locale/sv/automation.json +++ b/app/javascript/dashboard/i18n/locale/sv/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation Created", "CONVERSATION_UPDATED": "Conversation Updated", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/sv/integrations.json b/app/javascript/dashboard/i18n/locale/sv/integrations.json index 805d3481f..ce27888e4 100644 --- a/app/javascript/dashboard/i18n/locale/sv/integrations.json +++ b/app/javascript/dashboard/i18n/locale/sv/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Funktioner", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/sv/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/sv/whatsappTemplates.json index 4887d07b6..5f53faaa8 100644 --- a/app/javascript/dashboard/i18n/locale/sv/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/sv/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Select the whatsapp template you want to send", - "TEMPLATE_SELECTED_SUBTITLE": "Process {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Search Templates", - "NO_TEMPLATES_FOUND": "No templates found for", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Language", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter {variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Templates", + "SUBTITLE": "Select the whatsapp template you want to send", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Search Templates", + "NO_TEMPLATES_FOUND": "No templates found for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Language", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Go Back", + "SEND_MESSAGE_LABEL": "Send Message", + "FORM_ERROR_MESSAGE": "Please fill all variables before sending", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/ta/automation.json b/app/javascript/dashboard/i18n/locale/ta/automation.json index b3aa9be50..ba7a725cd 100644 --- a/app/javascript/dashboard/i18n/locale/ta/automation.json +++ b/app/javascript/dashboard/i18n/locale/ta/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation Created", "CONVERSATION_UPDATED": "Conversation Updated", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/ta/integrations.json b/app/javascript/dashboard/i18n/locale/ta/integrations.json index 160cb189f..30244bd5a 100644 --- a/app/javascript/dashboard/i18n/locale/ta/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ta/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Features", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ta/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/ta/whatsappTemplates.json index 4887d07b6..5f53faaa8 100644 --- a/app/javascript/dashboard/i18n/locale/ta/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/ta/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Select the whatsapp template you want to send", - "TEMPLATE_SELECTED_SUBTITLE": "Process {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Search Templates", - "NO_TEMPLATES_FOUND": "No templates found for", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Language", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter {variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Templates", + "SUBTITLE": "Select the whatsapp template you want to send", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Search Templates", + "NO_TEMPLATES_FOUND": "No templates found for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Language", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Go Back", + "SEND_MESSAGE_LABEL": "Send Message", + "FORM_ERROR_MESSAGE": "Please fill all variables before sending", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/th/automation.json b/app/javascript/dashboard/i18n/locale/th/automation.json index eac475926..8df9e274f 100644 --- a/app/javascript/dashboard/i18n/locale/th/automation.json +++ b/app/javascript/dashboard/i18n/locale/th/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "การสนทนาที่ถูกสร้าง", "CONVERSATION_UPDATED": "อัปเดตการสนทนาแล้ว", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/th/integrations.json b/app/javascript/dashboard/i18n/locale/th/integrations.json index 692daf68e..c9ab15529 100644 --- a/app/javascript/dashboard/i18n/locale/th/integrations.json +++ b/app/javascript/dashboard/i18n/locale/th/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "ฟีเจอร์", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/th/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/th/whatsappTemplates.json index 4887d07b6..5f53faaa8 100644 --- a/app/javascript/dashboard/i18n/locale/th/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/th/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Select the whatsapp template you want to send", - "TEMPLATE_SELECTED_SUBTITLE": "Process {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Search Templates", - "NO_TEMPLATES_FOUND": "No templates found for", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Language", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter {variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Templates", + "SUBTITLE": "Select the whatsapp template you want to send", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Search Templates", + "NO_TEMPLATES_FOUND": "No templates found for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Language", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Go Back", + "SEND_MESSAGE_LABEL": "Send Message", + "FORM_ERROR_MESSAGE": "Please fill all variables before sending", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/tl/automation.json b/app/javascript/dashboard/i18n/locale/tl/automation.json index cf63de81c..80274f488 100644 --- a/app/javascript/dashboard/i18n/locale/tl/automation.json +++ b/app/javascript/dashboard/i18n/locale/tl/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation Created", "CONVERSATION_UPDATED": "Conversation Updated", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/tl/integrations.json b/app/javascript/dashboard/i18n/locale/tl/integrations.json index 1614931a0..be9281284 100644 --- a/app/javascript/dashboard/i18n/locale/tl/integrations.json +++ b/app/javascript/dashboard/i18n/locale/tl/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Features", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/tl/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/tl/whatsappTemplates.json index 4887d07b6..5f53faaa8 100644 --- a/app/javascript/dashboard/i18n/locale/tl/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/tl/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Select the whatsapp template you want to send", - "TEMPLATE_SELECTED_SUBTITLE": "Process {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Search Templates", - "NO_TEMPLATES_FOUND": "No templates found for", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Language", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter {variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Templates", + "SUBTITLE": "Select the whatsapp template you want to send", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Search Templates", + "NO_TEMPLATES_FOUND": "No templates found for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Language", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Go Back", + "SEND_MESSAGE_LABEL": "Send Message", + "FORM_ERROR_MESSAGE": "Please fill all variables before sending", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/tr/automation.json b/app/javascript/dashboard/i18n/locale/tr/automation.json index 2a1f9f55a..3bac1c990 100644 --- a/app/javascript/dashboard/i18n/locale/tr/automation.json +++ b/app/javascript/dashboard/i18n/locale/tr/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Görüşme Oluşturuldu", "CONVERSATION_UPDATED": "Görüşme Güncellendi", "MESSAGE_CREATED": "Mesaj Oluşturuldu", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Sohbet Açıldı" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/tr/integrations.json b/app/javascript/dashboard/i18n/locale/tr/integrations.json index 5e774e07a..d414ea777 100644 --- a/app/javascript/dashboard/i18n/locale/tr/integrations.json +++ b/app/javascript/dashboard/i18n/locale/tr/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Özellikleri", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/tr/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/tr/whatsappTemplates.json index da51ff735..47dfd1c55 100644 --- a/app/javascript/dashboard/i18n/locale/tr/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/tr/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "WhatsApp Şablonları", - "SUBTITLE": "Göndermek istediğiniz WhatsApp şablonunu seçin", - "TEMPLATE_SELECTED_SUBTITLE": "{templateName} işleniyor" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Şablon Ara", - "NO_TEMPLATES_FOUND": "İçin hiç şablon bulunamadı", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Dil", - "TEMPLATE_BODY": "Şablon İçeriği", - "CATEGORY": "Kategori" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Değişkenler", - "VARIABLE_PLACEHOLDER": "{variable} değerini girin", - "GO_BACK_LABEL": "Geri Git", - "SEND_MESSAGE_LABEL": "Mesaj Gönder", - "FORM_ERROR_MESSAGE": "Lütfen göndermeden önce tüm değişkenleri doldurun" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "WhatsApp Şablonları", + "SUBTITLE": "Göndermek istediğiniz WhatsApp şablonunu seçin", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Şablon Ara", + "NO_TEMPLATES_FOUND": "İçin hiç şablon bulunamadı", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Kategori", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Dil", + "TEMPLATE_BODY": "Şablon İçeriği", + "CATEGORY": "Kategori" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Değişkenler", + "LANGUAGE": "Dil", + "CATEGORY": "Kategori", + "VARIABLE_PLACEHOLDER": "{variable} değerini girin", + "GO_BACK_LABEL": "Geri Git", + "SEND_MESSAGE_LABEL": "Mesaj Gönder", + "FORM_ERROR_MESSAGE": "Lütfen göndermeden önce tüm değişkenleri doldurun", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/uk/automation.json b/app/javascript/dashboard/i18n/locale/uk/automation.json index 39ad3e474..84617e9f0 100644 --- a/app/javascript/dashboard/i18n/locale/uk/automation.json +++ b/app/javascript/dashboard/i18n/locale/uk/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Розмову створено", "CONVERSATION_UPDATED": "Розмову оновлено", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/uk/integrations.json b/app/javascript/dashboard/i18n/locale/uk/integrations.json index bc7afcfc6..fd1c820fc 100644 --- a/app/javascript/dashboard/i18n/locale/uk/integrations.json +++ b/app/javascript/dashboard/i18n/locale/uk/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Особливості", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/uk/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/uk/whatsappTemplates.json index 1246919f5..d181cd3f1 100644 --- a/app/javascript/dashboard/i18n/locale/uk/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/uk/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Шаблони Whatsapp", - "SUBTITLE": "Виберіть шаблон whatsApp, який Ви хочете надіслати", - "TEMPLATE_SELECTED_SUBTITLE": "Процес {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Знайти шаблони", - "NO_TEMPLATES_FOUND": "Шаблонів не знайдено для", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Мова", - "TEMPLATE_BODY": "Тіло шаблона", - "CATEGORY": "Категорія" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Змінні", - "VARIABLE_PLACEHOLDER": "Введіть значення {variable}", - "GO_BACK_LABEL": "Повернутися", - "SEND_MESSAGE_LABEL": "Надіслати повідомлення", - "FORM_ERROR_MESSAGE": "Будь ласка, заповніть всі змінні перед надсиланням" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Шаблони Whatsapp", + "SUBTITLE": "Виберіть шаблон whatsApp, який Ви хочете надіслати", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Знайти шаблони", + "NO_TEMPLATES_FOUND": "Шаблонів не знайдено для", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Категорія", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Мова", + "TEMPLATE_BODY": "Тіло шаблона", + "CATEGORY": "Категорія" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Змінні", + "LANGUAGE": "Мова", + "CATEGORY": "Категорія", + "VARIABLE_PLACEHOLDER": "Введіть значення {variable}", + "GO_BACK_LABEL": "Повернутися", + "SEND_MESSAGE_LABEL": "Надіслати повідомлення", + "FORM_ERROR_MESSAGE": "Будь ласка, заповніть всі змінні перед надсиланням", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/ur/automation.json b/app/javascript/dashboard/i18n/locale/ur/automation.json index a129539f8..3ef2ccc5e 100644 --- a/app/javascript/dashboard/i18n/locale/ur/automation.json +++ b/app/javascript/dashboard/i18n/locale/ur/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation Created", "CONVERSATION_UPDATED": "Conversation Updated", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/ur/integrations.json b/app/javascript/dashboard/i18n/locale/ur/integrations.json index bcf0c1a33..eaab517a2 100644 --- a/app/javascript/dashboard/i18n/locale/ur/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ur/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Features", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ur/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/ur/whatsappTemplates.json index 4887d07b6..5f53faaa8 100644 --- a/app/javascript/dashboard/i18n/locale/ur/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/ur/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Select the whatsapp template you want to send", - "TEMPLATE_SELECTED_SUBTITLE": "Process {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Search Templates", - "NO_TEMPLATES_FOUND": "No templates found for", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Language", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter {variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Templates", + "SUBTITLE": "Select the whatsapp template you want to send", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Search Templates", + "NO_TEMPLATES_FOUND": "No templates found for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Language", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Go Back", + "SEND_MESSAGE_LABEL": "Send Message", + "FORM_ERROR_MESSAGE": "Please fill all variables before sending", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/automation.json b/app/javascript/dashboard/i18n/locale/ur_IN/automation.json index cf63de81c..80274f488 100644 --- a/app/javascript/dashboard/i18n/locale/ur_IN/automation.json +++ b/app/javascript/dashboard/i18n/locale/ur_IN/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation Created", "CONVERSATION_UPDATED": "Conversation Updated", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/integrations.json b/app/javascript/dashboard/i18n/locale/ur_IN/integrations.json index 68ce25b15..f0c7abbd3 100644 --- a/app/javascript/dashboard/i18n/locale/ur_IN/integrations.json +++ b/app/javascript/dashboard/i18n/locale/ur_IN/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Features", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/ur_IN/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/ur_IN/whatsappTemplates.json index 4887d07b6..5f53faaa8 100644 --- a/app/javascript/dashboard/i18n/locale/ur_IN/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/ur_IN/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Select the whatsapp template you want to send", - "TEMPLATE_SELECTED_SUBTITLE": "Process {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Search Templates", - "NO_TEMPLATES_FOUND": "No templates found for", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Language", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter {variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Templates", + "SUBTITLE": "Select the whatsapp template you want to send", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Search Templates", + "NO_TEMPLATES_FOUND": "No templates found for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Language", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Go Back", + "SEND_MESSAGE_LABEL": "Send Message", + "FORM_ERROR_MESSAGE": "Please fill all variables before sending", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/vi/automation.json b/app/javascript/dashboard/i18n/locale/vi/automation.json index cb483e847..1f8d5ea79 100644 --- a/app/javascript/dashboard/i18n/locale/vi/automation.json +++ b/app/javascript/dashboard/i18n/locale/vi/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Cuộc trò chuyện đã được tạo", "CONVERSATION_UPDATED": "Cuộc trò chuyện đã được cập nhật", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/vi/integrations.json b/app/javascript/dashboard/i18n/locale/vi/integrations.json index fdb96d792..10a6df6b9 100644 --- a/app/javascript/dashboard/i18n/locale/vi/integrations.json +++ b/app/javascript/dashboard/i18n/locale/vi/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Các tính năng", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/vi/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/vi/whatsappTemplates.json index a4abce833..fefd680ec 100644 --- a/app/javascript/dashboard/i18n/locale/vi/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/vi/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Mẫu Whatsapp", - "SUBTITLE": "Chọn mẫu whatsapp bạn muốn gửi", - "TEMPLATE_SELECTED_SUBTITLE": "Xử lý {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Tìm kiếm Mẫu", - "NO_TEMPLATES_FOUND": "Không tìm thấy mẫu nào cho", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Ngôn ngữ", - "TEMPLATE_BODY": "Nội dung của Mẫu", - "CATEGORY": "Loại" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Biến", - "VARIABLE_PLACEHOLDER": "Nhập giá trị {variable}", - "GO_BACK_LABEL": "Quay lại", - "SEND_MESSAGE_LABEL": "Gửi tin nhắn", - "FORM_ERROR_MESSAGE": "Vui lòng điền vào tất cả các biến trước khi gửi" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Mẫu Whatsapp", + "SUBTITLE": "Chọn mẫu whatsapp bạn muốn gửi", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Tìm kiếm Mẫu", + "NO_TEMPLATES_FOUND": "Không tìm thấy mẫu nào cho", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Loại", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Ngôn ngữ", + "TEMPLATE_BODY": "Nội dung của Mẫu", + "CATEGORY": "Loại" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Biến", + "LANGUAGE": "Ngôn ngữ", + "CATEGORY": "Loại", + "VARIABLE_PLACEHOLDER": "Nhập giá trị {variable}", + "GO_BACK_LABEL": "Quay lại", + "SEND_MESSAGE_LABEL": "Gửi tin nhắn", + "FORM_ERROR_MESSAGE": "Vui lòng điền vào tất cả các biến trước khi gửi", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/automation.json b/app/javascript/dashboard/i18n/locale/zh_CN/automation.json index 5b6872011..206b50103 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/automation.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "对话创建", "CONVERSATION_UPDATED": "对话已更新", "MESSAGE_CREATED": "消息已创建", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "对话已打开" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json b/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json index 0132e71c6..24de2da6d 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "特性", "ALLOW_CONVERSATION_FAQS": "从已解决的对话中生成常见问题", - "ALLOW_MEMORIES": "从客户互动中捕获关键细节作为记忆" + "ALLOW_MEMORIES": "从客户互动中捕获关键细节作为记忆", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/zh_CN/whatsappTemplates.json index cade063c0..9ca1ae234 100644 --- a/app/javascript/dashboard/i18n/locale/zh_CN/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/zh_CN/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp 模板列表", - "SUBTITLE": "请选择想要发送的 Whatsapp 消息模板", - "TEMPLATE_SELECTED_SUBTITLE": "{templateName} 处理中" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "查找模板", - "NO_TEMPLATES_FOUND": "没有找到对应的模版", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "语言", - "TEMPLATE_BODY": "模板内容", - "CATEGORY": "类别" - } - }, - "PARSER": { - "VARIABLES_LABEL": "参数", - "VARIABLE_PLACEHOLDER": "请填写 {variable}", - "GO_BACK_LABEL": "返回", - "SEND_MESSAGE_LABEL": "发送消息", - "FORM_ERROR_MESSAGE": "你必须填写所有参数才能发送" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp 模板列表", + "SUBTITLE": "请选择想要发送的 Whatsapp 消息模板", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "查找模板", + "NO_TEMPLATES_FOUND": "没有找到对应的模版", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "类别", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "语言", + "TEMPLATE_BODY": "模板内容", + "CATEGORY": "类别" + } + }, + "PARSER": { + "VARIABLES_LABEL": "参数", + "LANGUAGE": "语言", + "CATEGORY": "类别", + "VARIABLE_PLACEHOLDER": "请填写 {variable}", + "GO_BACK_LABEL": "返回", + "SEND_MESSAGE_LABEL": "发送消息", + "FORM_ERROR_MESSAGE": "你必须填写所有参数才能发送", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/automation.json b/app/javascript/dashboard/i18n/locale/zh_TW/automation.json index d44d241ff..416683ea6 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/automation.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/automation.json @@ -131,6 +131,7 @@ "CONVERSATION_CREATED": "Conversation Created", "CONVERSATION_UPDATED": "Conversation Updated", "MESSAGE_CREATED": "Message Created", + "CONVERSATION_RESOLVED": "Conversation Resolved", "CONVERSATION_OPENED": "Conversation Opened" }, "ACTIONS": { diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json b/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json index df361a65c..598fc185b 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/integrations.json @@ -472,7 +472,8 @@ "FEATURES": { "TITLE": "Features", "ALLOW_CONVERSATION_FAQS": "Generate FAQs from resolved conversations", - "ALLOW_MEMORIES": "Capture key details as memories from customer interactions." + "ALLOW_MEMORIES": "Capture key details as memories from customer interactions.", + "ALLOW_CITATIONS": "Include source citations in responses" } }, "EDIT": { diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/whatsappTemplates.json b/app/javascript/dashboard/i18n/locale/zh_TW/whatsappTemplates.json index 4887d07b6..5f53faaa8 100644 --- a/app/javascript/dashboard/i18n/locale/zh_TW/whatsappTemplates.json +++ b/app/javascript/dashboard/i18n/locale/zh_TW/whatsappTemplates.json @@ -1,29 +1,46 @@ { - "WHATSAPP_TEMPLATES": { - "MODAL": { - "TITLE": "Whatsapp Templates", - "SUBTITLE": "Select the whatsapp template you want to send", - "TEMPLATE_SELECTED_SUBTITLE": "Process {templateName}" - }, - "PICKER": { - "SEARCH_PLACEHOLDER": "Search Templates", - "NO_TEMPLATES_FOUND": "No templates found for", - "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", - "REFRESH_BUTTON": "Refresh templates", - "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", - "REFRESH_ERROR": "Failed to refresh templates. Please try again.", - "LABELS": { - "LANGUAGE": "Language", - "TEMPLATE_BODY": "Template Body", - "CATEGORY": "Category" - } - }, - "PARSER": { - "VARIABLES_LABEL": "Variables", - "VARIABLE_PLACEHOLDER": "Enter {variable} value", - "GO_BACK_LABEL": "Go Back", - "SEND_MESSAGE_LABEL": "Send Message", - "FORM_ERROR_MESSAGE": "Please fill all variables before sending" - } + "WHATSAPP_TEMPLATES": { + "MODAL": { + "TITLE": "Whatsapp Templates", + "SUBTITLE": "Select the whatsapp template you want to send", + "TEMPLATE_SELECTED_SUBTITLE": "Configure template: {templateName}" + }, + "PICKER": { + "SEARCH_PLACEHOLDER": "Search Templates", + "NO_TEMPLATES_FOUND": "No templates found for", + "HEADER": "Header", + "BODY": "Body", + "FOOTER": "Footer", + "BUTTONS": "Buttons", + "CATEGORY": "Category", + "MEDIA_CONTENT": "Media Content", + "MEDIA_CONTENT_FALLBACK": "media content", + "NO_TEMPLATES_AVAILABLE": "No WhatsApp templates available. Click refresh to sync templates from WhatsApp.", + "REFRESH_BUTTON": "Refresh templates", + "REFRESH_SUCCESS": "Templates refresh initiated. It may take a couple of minutes to update.", + "REFRESH_ERROR": "Failed to refresh templates. Please try again.", + "LABELS": { + "LANGUAGE": "Language", + "TEMPLATE_BODY": "Template Body", + "CATEGORY": "Category" + } + }, + "PARSER": { + "VARIABLES_LABEL": "Variables", + "LANGUAGE": "Language", + "CATEGORY": "Category", + "VARIABLE_PLACEHOLDER": "Enter {variable} value", + "GO_BACK_LABEL": "Go Back", + "SEND_MESSAGE_LABEL": "Send Message", + "FORM_ERROR_MESSAGE": "Please fill all variables before sending", + "MEDIA_HEADER_LABEL": "{type} Header", + "OTP_CODE": "Enter 4-8 digit OTP", + "EXPIRY_MINUTES": "Enter expiry minutes", + "BUTTON_PARAMETERS": "Button Parameters", + "BUTTON_LABEL": "Button {index}", + "COUPON_CODE": "Enter coupon code (max 15 chars)", + "MEDIA_URL_LABEL": "Enter {type} URL", + "BUTTON_PARAMETER": "Enter button parameter" } + } } diff --git a/app/javascript/sdk/IFrameHelper.js b/app/javascript/sdk/IFrameHelper.js index 3ab1ba1f5..25f90912d 100644 --- a/app/javascript/sdk/IFrameHelper.js +++ b/app/javascript/sdk/IFrameHelper.js @@ -50,11 +50,35 @@ const updateCampaignReadStatus = baseDomain => { }); }; +const sanitizeURL = url => { + if (url === '') return ''; + + try { + // any invalid url will not be accepted + // example - JaVaScRiP%0at:alert(document.domain)" + // this has an obfuscated javascript protocol + const parsedURL = new URL(url); + + // filter out dangerous protocols like `javascript`, `data`, `vbscript` + if (!['https', 'http'].includes(parsedURL.protocol)) { + throw new Error('Invalid Protocol'); + } + } catch (e) { + // eslint-disable-next-line no-console + console.error('Invalid URL', e); + } + + return 'about:blank'; // blank page URL +}; + export const IFrameHelper = { getUrl({ baseUrl, websiteToken }) { + baseUrl = sanitizeURL(baseUrl); return `${baseUrl}/widget?website_token=${websiteToken}`; }, createFrame: ({ baseUrl, websiteToken }) => { + baseUrl = sanitizeURL(baseUrl); + if (IFrameHelper.getAppFrame()) { return; } @@ -102,10 +126,12 @@ export const IFrameHelper = { window.onmessage = e => { if ( typeof e.data !== 'string' || - e.data.indexOf('chatwoot-widget:') !== 0 + e.data.indexOf('chatwoot-widget:') !== 0 || + e.origin !== window.location.origin ) { return; } + const message = JSON.parse(e.data.replace('chatwoot-widget:', '')); if (typeof IFrameHelper.events[message.event] === 'function') { IFrameHelper.events[message.event](message); @@ -140,7 +166,9 @@ export const IFrameHelper = { }, setupAudioListeners: () => { - const { baseUrl = '' } = window.$chatwoot; + let { baseUrl = '' } = window.$chatwoot; + baseUrl = sanitizeURL(baseUrl); + getAlertAudio(baseUrl, { type: 'widget', alertTone: 'ding' }).then(() => initOnEvents.forEach(event => { document.removeEventListener( @@ -234,6 +262,7 @@ export const IFrameHelper = { }, popoutChatWindow: ({ baseUrl, websiteToken, locale }) => { + baseUrl = sanitizeURL(baseUrl); const cwCookie = Cookies.get('cw_conversation'); window.$chatwoot.toggle('close'); popoutChatWindow(baseUrl, websiteToken, locale, cwCookie); diff --git a/app/javascript/survey/i18n/index.js b/app/javascript/survey/i18n/index.js index 372017c5e..1a9ea1a59 100644 --- a/app/javascript/survey/i18n/index.js +++ b/app/javascript/survey/i18n/index.js @@ -1,4 +1,5 @@ import ar from './locale/ar.json'; +import bg from './locale/bg.json'; import ca from './locale/ca.json'; import cs from './locale/cs.json'; import da from './locale/da.json'; @@ -40,6 +41,7 @@ import zh_TW from './locale/zh_TW.json'; export default { ar, + bg, ca, cs, da, diff --git a/app/javascript/widget/i18n/index.js b/app/javascript/widget/i18n/index.js index 8e602a4b5..93a371391 100644 --- a/app/javascript/widget/i18n/index.js +++ b/app/javascript/widget/i18n/index.js @@ -1,4 +1,5 @@ import ar from './locale/ar.json'; +import bg from './locale/bg.json'; import ca from './locale/ca.json'; import cs from './locale/cs.json'; import da from './locale/da.json'; @@ -40,6 +41,7 @@ import zh_TW from './locale/zh_TW.json'; export default { ar, + bg, ca, cs, da, diff --git a/app/javascript/widget/i18n/locale/am.json b/app/javascript/widget/i18n/locale/am.json index 279ead47e..4f244c566 100644 --- a/app/javascript/widget/i18n/locale/am.json +++ b/app/javascript/widget/i18n/locale/am.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Couldn't send, try again" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "We are online", "OFFLINE": "We are away at the moment" diff --git a/app/javascript/widget/i18n/locale/ar.json b/app/javascript/widget/i18n/locale/ar.json index 66f271cdd..21b1c072e 100644 --- a/app/javascript/widget/i18n/locale/ar.json +++ b/app/javascript/widget/i18n/locale/ar.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "تعذر الإرسال! حاول مرة أخرى" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "متواجدون لخدمتك", "OFFLINE": "نحن بعيدون في الوقت الحالي" diff --git a/app/javascript/widget/i18n/locale/az.json b/app/javascript/widget/i18n/locale/az.json index 279ead47e..4f244c566 100644 --- a/app/javascript/widget/i18n/locale/az.json +++ b/app/javascript/widget/i18n/locale/az.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Couldn't send, try again" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "We are online", "OFFLINE": "We are away at the moment" diff --git a/app/javascript/widget/i18n/locale/bg.json b/app/javascript/widget/i18n/locale/bg.json index f289bf5eb..1fd4bc35d 100644 --- a/app/javascript/widget/i18n/locale/bg.json +++ b/app/javascript/widget/i18n/locale/bg.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Couldn't send, try again" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "На линия сме", "OFFLINE": "В момента не сме на линия" diff --git a/app/javascript/widget/i18n/locale/ca.json b/app/javascript/widget/i18n/locale/ca.json index 4e464a6eb..6ae69fcb6 100644 --- a/app/javascript/widget/i18n/locale/ca.json +++ b/app/javascript/widget/i18n/locale/ca.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "No s'ha pogut enviar, torna-ho a provar" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Estem en línia", "OFFLINE": "Estem fora en aquest moment" diff --git a/app/javascript/widget/i18n/locale/cs.json b/app/javascript/widget/i18n/locale/cs.json index e33d963f1..adefb1eb4 100644 --- a/app/javascript/widget/i18n/locale/cs.json +++ b/app/javascript/widget/i18n/locale/cs.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Odeslání se nezdařilo, zkuste to znovu" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Jsme online", "OFFLINE": "V současné době jsme pryč" diff --git a/app/javascript/widget/i18n/locale/da.json b/app/javascript/widget/i18n/locale/da.json index 0b5cb5722..31303d4d5 100644 --- a/app/javascript/widget/i18n/locale/da.json +++ b/app/javascript/widget/i18n/locale/da.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Kunne ikke sende, prøv igen" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Vi er online", "OFFLINE": "Vi er ikke tilgængelige i øjeblikket" diff --git a/app/javascript/widget/i18n/locale/de.json b/app/javascript/widget/i18n/locale/de.json index 7508c1f77..b7490c368 100644 --- a/app/javascript/widget/i18n/locale/de.json +++ b/app/javascript/widget/i18n/locale/de.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Senden nicht möglich, versuchen Sie es noch einmal" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Wir sind online", "OFFLINE": "Wir sind momentan abwesend" diff --git a/app/javascript/widget/i18n/locale/el.json b/app/javascript/widget/i18n/locale/el.json index 5ca095053..1cb35a76b 100644 --- a/app/javascript/widget/i18n/locale/el.json +++ b/app/javascript/widget/i18n/locale/el.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Αδυναμία αποστολής! Προσπαθήστε ξανά" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Είμαστε online", "OFFLINE": "Προς το παρόν, είμαστε εκτός" diff --git a/app/javascript/widget/i18n/locale/es.json b/app/javascript/widget/i18n/locale/es.json index 62837335b..9c807ed84 100644 --- a/app/javascript/widget/i18n/locale/es.json +++ b/app/javascript/widget/i18n/locale/es.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "¡No se pudo enviar! intente nuevamente" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Estamos en línea", "OFFLINE": "Estamos ausentes en este momento" diff --git a/app/javascript/widget/i18n/locale/fa.json b/app/javascript/widget/i18n/locale/fa.json index bd1854fc5..982df19ac 100644 --- a/app/javascript/widget/i18n/locale/fa.json +++ b/app/javascript/widget/i18n/locale/fa.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "ارسال نشد، دوباره امتحان کنید" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "ما آنلاین هستیم", "OFFLINE": "در حال حاضر دردسترس نیستیم" diff --git a/app/javascript/widget/i18n/locale/fi.json b/app/javascript/widget/i18n/locale/fi.json index 59b827bac..a5d742303 100644 --- a/app/javascript/widget/i18n/locale/fi.json +++ b/app/javascript/widget/i18n/locale/fi.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Ei voitu lähettää, yritä uudestaan" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Olemme online-tilassa", "OFFLINE": "Olemme tällä hetkellä poissa" diff --git a/app/javascript/widget/i18n/locale/fr.json b/app/javascript/widget/i18n/locale/fr.json index 4552a55cc..ff25bbd45 100644 --- a/app/javascript/widget/i18n/locale/fr.json +++ b/app/javascript/widget/i18n/locale/fr.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Échec de l'envoi, veuillez réessayer" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Nous sommes en ligne", "OFFLINE": "Nous sommes absents pour le moment" diff --git a/app/javascript/widget/i18n/locale/he.json b/app/javascript/widget/i18n/locale/he.json index 8b235cffc..1eaa103db 100644 --- a/app/javascript/widget/i18n/locale/he.json +++ b/app/javascript/widget/i18n/locale/he.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "לא ניתן לשלוח, נסה שוב" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "אנחנו אונליין", "OFFLINE": "אנחנו לא זמינים כרגע" diff --git a/app/javascript/widget/i18n/locale/hi.json b/app/javascript/widget/i18n/locale/hi.json index 279ead47e..4f244c566 100644 --- a/app/javascript/widget/i18n/locale/hi.json +++ b/app/javascript/widget/i18n/locale/hi.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Couldn't send, try again" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "We are online", "OFFLINE": "We are away at the moment" diff --git a/app/javascript/widget/i18n/locale/hr.json b/app/javascript/widget/i18n/locale/hr.json index 7d468f407..37cf7b53e 100644 --- a/app/javascript/widget/i18n/locale/hr.json +++ b/app/javascript/widget/i18n/locale/hr.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Nismo uspjeli poslati, pokušajte ponovno" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Online smo", "OFFLINE": "Trenutačno nismo online" diff --git a/app/javascript/widget/i18n/locale/hu.json b/app/javascript/widget/i18n/locale/hu.json index 578639c1e..81c4b6886 100644 --- a/app/javascript/widget/i18n/locale/hu.json +++ b/app/javascript/widget/i18n/locale/hu.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Nem sikerült az elküldés, kérjük próbáld később" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Online vagyunk", "OFFLINE": "Jelenleg nem vagyunk elérhetőek" diff --git a/app/javascript/widget/i18n/locale/hy.json b/app/javascript/widget/i18n/locale/hy.json index 279ead47e..4f244c566 100644 --- a/app/javascript/widget/i18n/locale/hy.json +++ b/app/javascript/widget/i18n/locale/hy.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Couldn't send, try again" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "We are online", "OFFLINE": "We are away at the moment" diff --git a/app/javascript/widget/i18n/locale/id.json b/app/javascript/widget/i18n/locale/id.json index 363fff802..e7fbec8ad 100644 --- a/app/javascript/widget/i18n/locale/id.json +++ b/app/javascript/widget/i18n/locale/id.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Tidak dapat mengirim, coba lagi" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Kami sedang online", "OFFLINE": "Kami sedang tidak tersedia saat ini" diff --git a/app/javascript/widget/i18n/locale/is.json b/app/javascript/widget/i18n/locale/is.json index f2d295418..b794493f4 100644 --- a/app/javascript/widget/i18n/locale/is.json +++ b/app/javascript/widget/i18n/locale/is.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Tókst ekki að senda skilaboðin, reyndu aftur" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Við erum tengd", "OFFLINE": "Það er enginn við í augnablikinu" diff --git a/app/javascript/widget/i18n/locale/it.json b/app/javascript/widget/i18n/locale/it.json index 0e58af2de..7e0385220 100644 --- a/app/javascript/widget/i18n/locale/it.json +++ b/app/javascript/widget/i18n/locale/it.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Impossibile inviare, riprova" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Siamo online", "OFFLINE": "Siamo offline in questo momento" diff --git a/app/javascript/widget/i18n/locale/ja.json b/app/javascript/widget/i18n/locale/ja.json index fa97a8d63..17c4beae0 100644 --- a/app/javascript/widget/i18n/locale/ja.json +++ b/app/javascript/widget/i18n/locale/ja.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "送信できませんでした。もう一度お試しください" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "オンライン", "OFFLINE": "留守中" diff --git a/app/javascript/widget/i18n/locale/ka.json b/app/javascript/widget/i18n/locale/ka.json index 279ead47e..4f244c566 100644 --- a/app/javascript/widget/i18n/locale/ka.json +++ b/app/javascript/widget/i18n/locale/ka.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Couldn't send, try again" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "We are online", "OFFLINE": "We are away at the moment" diff --git a/app/javascript/widget/i18n/locale/ko.json b/app/javascript/widget/i18n/locale/ko.json index f1c189070..ef8d15a6e 100644 --- a/app/javascript/widget/i18n/locale/ko.json +++ b/app/javascript/widget/i18n/locale/ko.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "전송하지 못했습니다. 다시 시도해보세요." } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "온라인", "OFFLINE": "부재중" diff --git a/app/javascript/widget/i18n/locale/lt.json b/app/javascript/widget/i18n/locale/lt.json index 98b89da99..fb61b586e 100644 --- a/app/javascript/widget/i18n/locale/lt.json +++ b/app/javascript/widget/i18n/locale/lt.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Nepavyko išsiųsti! bandykite dar kartą" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Mes prisijungę", "OFFLINE": "Šiuo metu esame atsijungę" diff --git a/app/javascript/widget/i18n/locale/lv.json b/app/javascript/widget/i18n/locale/lv.json index 19ca42914..5262e87f7 100644 --- a/app/javascript/widget/i18n/locale/lv.json +++ b/app/javascript/widget/i18n/locale/lv.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Nevarēja nosūtīt. Lūdzu, mēģiniet vēlreiz" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Mēs esam tiešsaistē", "OFFLINE": "Šobrīd mēs neesam uz vietas" diff --git a/app/javascript/widget/i18n/locale/ml.json b/app/javascript/widget/i18n/locale/ml.json index c1071b35a..c4761e99f 100644 --- a/app/javascript/widget/i18n/locale/ml.json +++ b/app/javascript/widget/i18n/locale/ml.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "അയയ്‌ക്കാനായില്ല, വീണ്ടും ശ്രമിക്കുക" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "ഞങ്ങൾ ഓൺലൈനിലാണ്", "OFFLINE": "ഞങ്ങൾ ഇപ്പോൾ അകലെയാണ്" diff --git a/app/javascript/widget/i18n/locale/ms.json b/app/javascript/widget/i18n/locale/ms.json index 78747073d..4dcbc5f57 100644 --- a/app/javascript/widget/i18n/locale/ms.json +++ b/app/javascript/widget/i18n/locale/ms.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Couldn't send, try again" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "We are online", "OFFLINE": "We are away at the moment" diff --git a/app/javascript/widget/i18n/locale/ne.json b/app/javascript/widget/i18n/locale/ne.json index a6041a758..5201951e5 100644 --- a/app/javascript/widget/i18n/locale/ne.json +++ b/app/javascript/widget/i18n/locale/ne.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Couldn't send, try again" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "हामी अनलाइन छौं", "OFFLINE": "We are away at the moment" diff --git a/app/javascript/widget/i18n/locale/nl.json b/app/javascript/widget/i18n/locale/nl.json index 48f62678d..a33be5f90 100644 --- a/app/javascript/widget/i18n/locale/nl.json +++ b/app/javascript/widget/i18n/locale/nl.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Verzenden mislukt, probeer het opnieuw" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "We zijn online", "OFFLINE": "We zijn momenteel afwezig" diff --git a/app/javascript/widget/i18n/locale/no.json b/app/javascript/widget/i18n/locale/no.json index f9d46a712..fa2c5a2b2 100644 --- a/app/javascript/widget/i18n/locale/no.json +++ b/app/javascript/widget/i18n/locale/no.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Kunne ikke sende, prøv på nytt" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Vi er pålogget", "OFFLINE": "Vi er for øyeblikket borte" diff --git a/app/javascript/widget/i18n/locale/pl.json b/app/javascript/widget/i18n/locale/pl.json index 704eb0567..c143e3b00 100644 --- a/app/javascript/widget/i18n/locale/pl.json +++ b/app/javascript/widget/i18n/locale/pl.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Nie udało się wysłać! Spróbuj ponownie" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Jesteśmy dostępni", "OFFLINE": "W tej chwili jesteśmy niedostępni" diff --git a/app/javascript/widget/i18n/locale/pt.json b/app/javascript/widget/i18n/locale/pt.json index fd320fbf9..c1fffb681 100644 --- a/app/javascript/widget/i18n/locale/pt.json +++ b/app/javascript/widget/i18n/locale/pt.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Não foi possível enviar, tente novamente" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Estamos online", "OFFLINE": "Estamos ausentes" diff --git a/app/javascript/widget/i18n/locale/pt_BR.json b/app/javascript/widget/i18n/locale/pt_BR.json index c3dde21aa..f979fddca 100644 --- a/app/javascript/widget/i18n/locale/pt_BR.json +++ b/app/javascript/widget/i18n/locale/pt_BR.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Não foi possível enviar, tente novamente" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Estamos conectados", "OFFLINE": "Estamos ausentes no momento" diff --git a/app/javascript/widget/i18n/locale/ro.json b/app/javascript/widget/i18n/locale/ro.json index 35150d67a..e030c50b2 100644 --- a/app/javascript/widget/i18n/locale/ro.json +++ b/app/javascript/widget/i18n/locale/ro.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Nu s-a putut trimite! Încearcă din nou" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Suntem online", "OFFLINE": "Suntem plecați în acest moment" diff --git a/app/javascript/widget/i18n/locale/ru.json b/app/javascript/widget/i18n/locale/ru.json index de468106d..734a3a035 100644 --- a/app/javascript/widget/i18n/locale/ru.json +++ b/app/javascript/widget/i18n/locale/ru.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Не удалось отправить! Попробуйте еще раз" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Мы в сети", "OFFLINE": "В данный момент мы отсутствуем" diff --git a/app/javascript/widget/i18n/locale/sh.json b/app/javascript/widget/i18n/locale/sh.json index 279ead47e..4f244c566 100644 --- a/app/javascript/widget/i18n/locale/sh.json +++ b/app/javascript/widget/i18n/locale/sh.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Couldn't send, try again" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "We are online", "OFFLINE": "We are away at the moment" diff --git a/app/javascript/widget/i18n/locale/sk.json b/app/javascript/widget/i18n/locale/sk.json index e61b9a498..60dc03162 100644 --- a/app/javascript/widget/i18n/locale/sk.json +++ b/app/javascript/widget/i18n/locale/sk.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Couldn't send, try again" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Sme online", "OFFLINE": "Momentálne nie sme k dispozícii" diff --git a/app/javascript/widget/i18n/locale/sl.json b/app/javascript/widget/i18n/locale/sl.json index 365132414..8665e1e1b 100644 --- a/app/javascript/widget/i18n/locale/sl.json +++ b/app/javascript/widget/i18n/locale/sl.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Ni bilo mogoče poslati, poskusite znova" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Smo na voljo", "OFFLINE": "Trenutno nismo na voljo" diff --git a/app/javascript/widget/i18n/locale/sq.json b/app/javascript/widget/i18n/locale/sq.json index 994317343..34fe645e9 100644 --- a/app/javascript/widget/i18n/locale/sq.json +++ b/app/javascript/widget/i18n/locale/sq.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Nuk mund të dërgohej, provo sërish" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Ne jemi online", "OFFLINE": "Nuk jemi online për momentin" diff --git a/app/javascript/widget/i18n/locale/sr.json b/app/javascript/widget/i18n/locale/sr.json index 8ac036a95..039982ee6 100644 --- a/app/javascript/widget/i18n/locale/sr.json +++ b/app/javascript/widget/i18n/locale/sr.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Slanje neuspešno, pokušajte ponovo" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Dostupni smo", "OFFLINE": "Trenutno nismo dostupni" diff --git a/app/javascript/widget/i18n/locale/sv.json b/app/javascript/widget/i18n/locale/sv.json index 91e6c682f..d65e39358 100644 --- a/app/javascript/widget/i18n/locale/sv.json +++ b/app/javascript/widget/i18n/locale/sv.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Kunde inte skicka, försök igen" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Vi är online", "OFFLINE": "Vi är borta för tillfället" diff --git a/app/javascript/widget/i18n/locale/ta.json b/app/javascript/widget/i18n/locale/ta.json index 5cb9152f9..27e069ea7 100644 --- a/app/javascript/widget/i18n/locale/ta.json +++ b/app/javascript/widget/i18n/locale/ta.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Couldn't send, try again" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "We are online", "OFFLINE": "We are away at the moment" diff --git a/app/javascript/widget/i18n/locale/th.json b/app/javascript/widget/i18n/locale/th.json index f562571fe..a1e39c2f5 100644 --- a/app/javascript/widget/i18n/locale/th.json +++ b/app/javascript/widget/i18n/locale/th.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "ไม่สามารถส่งได้ ลองอีกครั้ง" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "เรากำลังออนไลน์", "OFFLINE": "เราไม่อยู่" diff --git a/app/javascript/widget/i18n/locale/tl.json b/app/javascript/widget/i18n/locale/tl.json index 279ead47e..4f244c566 100644 --- a/app/javascript/widget/i18n/locale/tl.json +++ b/app/javascript/widget/i18n/locale/tl.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Couldn't send, try again" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "We are online", "OFFLINE": "We are away at the moment" diff --git a/app/javascript/widget/i18n/locale/tr.json b/app/javascript/widget/i18n/locale/tr.json index be37c488b..b346504fe 100644 --- a/app/javascript/widget/i18n/locale/tr.json +++ b/app/javascript/widget/i18n/locale/tr.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Gönderilemedi, tekrar deneyin" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Çevrimiçi", "OFFLINE": "Şu an operatörlerimiz müsait değil" diff --git a/app/javascript/widget/i18n/locale/uk.json b/app/javascript/widget/i18n/locale/uk.json index 679761f6a..aed413394 100644 --- a/app/javascript/widget/i18n/locale/uk.json +++ b/app/javascript/widget/i18n/locale/uk.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Не вдалося надіслати, спробуйте ще раз" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Ми онлайн", "OFFLINE": "Нас наразі немає" diff --git a/app/javascript/widget/i18n/locale/ur.json b/app/javascript/widget/i18n/locale/ur.json index 8e3c7687c..3869ab5d6 100644 --- a/app/javascript/widget/i18n/locale/ur.json +++ b/app/javascript/widget/i18n/locale/ur.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Couldn't send, try again" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "We are online", "OFFLINE": "We are away at the moment" diff --git a/app/javascript/widget/i18n/locale/ur_IN.json b/app/javascript/widget/i18n/locale/ur_IN.json index 279ead47e..4f244c566 100644 --- a/app/javascript/widget/i18n/locale/ur_IN.json +++ b/app/javascript/widget/i18n/locale/ur_IN.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Couldn't send, try again" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "We are online", "OFFLINE": "We are away at the moment" diff --git a/app/javascript/widget/i18n/locale/vi.json b/app/javascript/widget/i18n/locale/vi.json index 952a16f1f..d12dbc8db 100644 --- a/app/javascript/widget/i18n/locale/vi.json +++ b/app/javascript/widget/i18n/locale/vi.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "Không thể gửi, xin thử lại" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "Chúng tôi đang trực tuyến", "OFFLINE": "Hiện tại chúng tôi đang bận chút" diff --git a/app/javascript/widget/i18n/locale/zh_CN.json b/app/javascript/widget/i18n/locale/zh_CN.json index f7d27c267..dd834af87 100644 --- a/app/javascript/widget/i18n/locale/zh_CN.json +++ b/app/javascript/widget/i18n/locale/zh_CN.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "无法发送,请重试" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "在线", "OFFLINE": "当前已离线" diff --git a/app/javascript/widget/i18n/locale/zh_TW.json b/app/javascript/widget/i18n/locale/zh_TW.json index 85f08a135..3f46d258f 100644 --- a/app/javascript/widget/i18n/locale/zh_TW.json +++ b/app/javascript/widget/i18n/locale/zh_TW.json @@ -12,6 +12,11 @@ "ERROR_MESSAGE": "無法傳送!請重新嘗試。" } }, + "THUMBNAIL": { + "AUTHOR": { + "NOT_AVAILABLE": "Not available" + } + }, "TEAM_AVAILABILITY": { "ONLINE": "我們在線上", "OFFLINE": "我們目前不在線上" diff --git a/config/initializers/ai_agents.rb b/config/initializers/ai_agents.rb new file mode 100644 index 000000000..37bdd589f --- /dev/null +++ b/config/initializers/ai_agents.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +require 'agents' + +Rails.application.config.after_initialize do + api_key = InstallationConfig.find_by(name: 'CAPTAIN_OPEN_AI_API_KEY')&.value + model = InstallationConfig.find_by(name: 'CAPTAIN_OPEN_AI_MODEL')&.value.presence || OpenAiConstants::DEFAULT_MODEL + api_endpoint = InstallationConfig.find_by(name: 'CAPTAIN_OPEN_AI_ENDPOINT')&.value || OpenAiConstants::DEFAULT_ENDPOINT + + if api_key.present? + Agents.configure do |config| + config.openai_api_key = api_key + if api_endpoint.present? + api_base = "#{api_endpoint.chomp('/')}/v1" + config.openai_api_base = api_base + end + config.default_model = model + config.debug = false + end + end +rescue StandardError => e + Rails.logger.error "Failed to configure AI Agents SDK: #{e.message}" +end diff --git a/config/initializers/languages.rb b/config/initializers/languages.rb index 899359a4c..c34f7a605 100644 --- a/config/initializers/languages.rb +++ b/config/initializers/languages.rb @@ -41,7 +41,8 @@ LANGUAGES_CONFIG = { 36 => { name: 'íslenska (is)', iso_639_3_code: 'isl', iso_639_1_code: 'is', enabled: true }, 37 => { name: 'עִברִית (he)', iso_639_3_code: 'heb', iso_639_1_code: 'he', enabled: true }, 38 => { name: 'lietuvių (lt)', iso_639_3_code: 'lit', iso_639_1_code: 'lt', enabled: true }, - 39 => { name: 'Српски (sr)', iso_639_3_code: 'srp', iso_639_1_code: 'sr', enabled: true } + 39 => { name: 'Српски (sr)', iso_639_3_code: 'srp', iso_639_1_code: 'sr', enabled: true }, + 40 => { name: 'български (bg)', iso_639_3_code: 'bul', iso_639_1_code: 'bg', enabled: true } }.filter { |_key, val| val[:enabled] }.freeze Rails.configuration.i18n.available_locales = LANGUAGES_CONFIG.map { |_index, lang| lang[:iso_639_1_code].to_sym } diff --git a/enterprise/app/jobs/captain/conversation/response_builder_job.rb b/enterprise/app/jobs/captain/conversation/response_builder_job.rb index b207bd2a4..7ede1201d 100644 --- a/enterprise/app/jobs/captain/conversation/response_builder_job.rb +++ b/enterprise/app/jobs/captain/conversation/response_builder_job.rb @@ -26,9 +26,15 @@ class Captain::Conversation::ResponseBuilderJob < ApplicationJob delegate :account, :inbox, to: :@conversation def generate_and_process_response - @response = Captain::Llm::AssistantChatService.new(assistant: @assistant).generate_response( - message_history: collect_previous_messages - ) + @response = if captain_v2_enabled? + Captain::Assistant::AgentRunnerService.new(assistant: @assistant, conversation: @conversation).generate_response( + message_history: collect_previous_messages + ) + else + Captain::Llm::AssistantChatService.new(assistant: @assistant).generate_response( + message_history: collect_previous_messages + ) + end return process_action('handoff') if handoff_requested? @@ -104,4 +110,8 @@ class Captain::Conversation::ResponseBuilderJob < ApplicationJob def log_error(error) ChatwootExceptionTracker.new(error, account: account).capture_exception end + + def captain_v2_enabled? + return account.feature_enabled?('captain_integration_v2') + end end diff --git a/enterprise/app/models/captain/assistant.rb b/enterprise/app/models/captain/assistant.rb index cdf2b53f3..0423abf67 100644 --- a/enterprise/app/models/captain/assistant.rb +++ b/enterprise/app/models/captain/assistant.rb @@ -19,6 +19,7 @@ class Captain::Assistant < ApplicationRecord include Avatarable include Concerns::CaptainToolsHelpers + include Concerns::Agentable self.table_name = 'captain_assistants' @@ -35,6 +36,8 @@ class Captain::Assistant < ApplicationRecord has_many :copilot_threads, dependent: :destroy_async has_many :scenarios, class_name: 'Captain::Scenario', dependent: :destroy_async + store_accessor :config, :temperature, :feature_faq, :feature_memory, :product_name + validates :name, presence: true validates :description, presence: true validates :account_id, presence: true @@ -71,6 +74,33 @@ class Captain::Assistant < ApplicationRecord private + def agent_name + name + end + + def agent_tools + [ + self.class.resolve_tool_class('faq_lookup').new(self), + self.class.resolve_tool_class('handoff').new(self) + ] + end + + def prompt_context + { + name: name, + description: description, + product_name: config['product_name'] || 'this product', + scenarios: scenarios.enabled.map do |scenario| + { + key: scenario.title.parameterize.underscore, + description: scenario.description + } + end, + response_guidelines: response_guidelines || [], + guardrails: guardrails || [] + } + end + def default_avatar_url "#{ENV.fetch('FRONTEND_URL', nil)}/assets/images/dashboard/captain/logo.svg" end diff --git a/enterprise/app/models/captain/scenario.rb b/enterprise/app/models/captain/scenario.rb index ecfba396f..aac7e2411 100644 --- a/enterprise/app/models/captain/scenario.rb +++ b/enterprise/app/models/captain/scenario.rb @@ -22,6 +22,7 @@ # class Captain::Scenario < ApplicationRecord include Concerns::CaptainToolsHelpers + include Concerns::Agentable self.table_name = 'captain_scenarios' @@ -37,10 +38,43 @@ class Captain::Scenario < ApplicationRecord scope :enabled, -> { where(enabled: true) } + delegate :temperature, :feature_faq, :feature_memory, :product_name, to: :assistant + before_save :resolve_tool_references + def prompt_context + { + title: title, + instructions: resolved_instructions, + tools: resolved_tools + } + end + private + def agent_name + "#{title} Agent".titleize + end + + def agent_tools + resolved_tools.map { |tool| self.class.resolve_tool_class(tool[:id]) }.map { |tool| tool.new(assistant) } + end + + def resolved_instructions + instruction.gsub(TOOL_REFERENCE_REGEX) do |match| + "#{match} tool " + end + end + + def resolved_tools + return [] if tools.blank? + + available_tools = self.class.available_agent_tools + tools.filter_map do |tool_id| + available_tools.find { |tool| tool[:id] == tool_id } + end + end + # Validates that all tool references in the instruction are valid. # Parses the instruction for tool references and checks if they exist # in the available tools configuration. diff --git a/enterprise/app/models/concerns/agentable.rb b/enterprise/app/models/concerns/agentable.rb new file mode 100644 index 000000000..dab76a726 --- /dev/null +++ b/enterprise/app/models/concerns/agentable.rb @@ -0,0 +1,56 @@ +module Concerns::Agentable + extend ActiveSupport::Concern + + def agent + Agents::Agent.new( + name: agent_name, + instructions: ->(context) { agent_instructions(context) }, + tools: agent_tools, + model: agent_model, + temperature: temperature.to_f || 0.7, + response_schema: agent_response_schema + ) + end + + def agent_instructions(context = nil) + enhanced_context = prompt_context + + if context + state = context.context[:state] || {} + conversation_data = state[:conversation] || {} + contact_data = state[:contact] || {} + enhanced_context = enhanced_context.merge( + conversation: conversation_data, + contact: contact_data + ) + end + + Captain::PromptRenderer.render(template_name, enhanced_context.with_indifferent_access) + end + + private + + def agent_name + raise NotImplementedError, "#{self.class} must implement agent_name" + end + + def template_name + self.class.name.demodulize.underscore + end + + def agent_tools + [] # Default implementation, override if needed + end + + def agent_model + InstallationConfig.find_by(name: 'CAPTAIN_OPEN_AI_MODEL')&.value.presence || OpenAiConstants::DEFAULT_MODEL + end + + def agent_response_schema + Captain::ResponseSchema + end + + def prompt_context + raise NotImplementedError, "#{self.class} must implement prompt_context" + end +end diff --git a/enterprise/app/services/captain/assistant/agent_runner_service.rb b/enterprise/app/services/captain/assistant/agent_runner_service.rb new file mode 100644 index 000000000..7a35e6d07 --- /dev/null +++ b/enterprise/app/services/captain/assistant/agent_runner_service.rb @@ -0,0 +1,161 @@ +require 'agents' + +class Captain::Assistant::AgentRunnerService + CONVERSATION_STATE_ATTRIBUTES = %i[ + id display_id inbox_id contact_id status priority + label_list custom_attributes additional_attributes + ].freeze + + CONTACT_STATE_ATTRIBUTES = %i[ + id name email phone_number identifier contact_type + custom_attributes additional_attributes + ].freeze + + def initialize(assistant:, conversation: nil, callbacks: {}) + @assistant = assistant + @conversation = conversation + @callbacks = callbacks + end + + def generate_response(message_history: []) + agents = build_and_wire_agents + context = build_context(message_history) + message_to_process = extract_last_user_message(message_history) + runner = Agents::Runner.with_agents(*agents) + runner = add_callbacks_to_runner(runner) if @callbacks.any? + result = runner.run(message_to_process, context: context) + + process_agent_result(result) + rescue StandardError => e + # when running the agent runner service in a rake task, the conversation might not have an account associated + # for regular production usage, it will run just fine + ChatwootExceptionTracker.new(e, account: @conversation&.account).capture_exception + Rails.logger.error "[Captain V2] AgentRunnerService error: #{e.message}" + Rails.logger.error e.backtrace.join("\n") + + error_response(e.message) + end + + private + + def build_context(message_history) + conversation_history = message_history.map do |msg| + content = extract_text_from_content(msg[:content]) + + { + role: msg[:role].to_sym, + content: content, + agent_name: msg[:agent_name] + } + end + + { + conversation_history: conversation_history, + state: build_state + } + end + + def extract_last_user_message(message_history) + last_user_msg = message_history.reverse.find { |msg| msg[:role] == 'user' } + + extract_text_from_content(last_user_msg[:content]) + end + + def extract_text_from_content(content) + # Handle structured output from agents + return content[:response] || content['response'] || content.to_s if content.is_a?(Hash) + + return content unless content.is_a?(Array) + + text_parts = content.select { |part| part[:type] == 'text' }.pluck(:text) + text_parts.join(' ') + end + + # Response formatting methods + def process_agent_result(result) + Rails.logger.info "[Captain V2] Agent result: #{result.inspect}" + format_response(result.output) + end + + def format_response(output) + return output.with_indifferent_access if output.is_a?(Hash) + + # Fallback for backwards compatibility + { + 'response' => output.to_s, + 'reasoning' => 'Processed by agent' + } + end + + def error_response(error_message) + { + 'response' => 'conversation_handoff', + 'reasoning' => "Error occurred: #{error_message}" + } + end + + def build_state + state = { + account_id: @assistant.account_id, + assistant_id: @assistant.id, + assistant_config: @assistant.config + } + + if @conversation + state[:conversation] = @conversation.attributes.symbolize_keys.slice(*CONVERSATION_STATE_ATTRIBUTES) + state[:contact] = @conversation.contact.attributes.symbolize_keys.slice(*CONTACT_STATE_ATTRIBUTES) if @conversation.contact + end + + state + end + + def build_and_wire_agents + assistant_agent = @assistant.agent + scenario_agents = @assistant.scenarios.enabled.map(&:agent) + + assistant_agent.register_handoffs(*scenario_agents) if scenario_agents.any? + scenario_agents.each { |scenario_agent| scenario_agent.register_handoffs(assistant_agent) } + + [assistant_agent] + scenario_agents + end + + def add_callbacks_to_runner(runner) + runner = add_agent_thinking_callback(runner) if @callbacks[:on_agent_thinking] + runner = add_tool_start_callback(runner) if @callbacks[:on_tool_start] + runner = add_tool_complete_callback(runner) if @callbacks[:on_tool_complete] + runner = add_agent_handoff_callback(runner) if @callbacks[:on_agent_handoff] + runner + end + + def add_agent_thinking_callback(runner) + runner.on_agent_thinking do |*args| + @callbacks[:on_agent_thinking].call(*args) + rescue StandardError => e + Rails.logger.warn "[Captain] Callback error for agent_thinking: #{e.message}" + end + end + + def add_tool_start_callback(runner) + runner.on_tool_start do |*args| + @callbacks[:on_tool_start].call(*args) + rescue StandardError => e + Rails.logger.warn "[Captain] Callback error for tool_start: #{e.message}" + end + end + + def add_tool_complete_callback(runner) + runner.on_tool_complete do |*args| + @callbacks[:on_tool_complete].call(*args) + rescue StandardError => e + Rails.logger.warn "[Captain] Callback error for tool_complete: #{e.message}" + end + end + + def add_agent_handoff_callback(runner) + runner.on_agent_handoff do |*args| + @callbacks[:on_agent_handoff].call(*args) + rescue StandardError => e + Rails.logger.warn "[Captain] Callback error for agent_handoff: #{e.message}" + end + end +end diff --git a/enterprise/lib/captain/prompt_renderer.rb b/enterprise/lib/captain/prompt_renderer.rb new file mode 100644 index 000000000..1a73ddd15 --- /dev/null +++ b/enterprise/lib/captain/prompt_renderer.rb @@ -0,0 +1,25 @@ +require 'liquid' + +class Captain::PromptRenderer + class << self + def render(template_name, context = {}) + template = load_template(template_name) + liquid_template = Liquid::Template.parse(template) + liquid_template.render(stringify_keys(context)) + end + + private + + def load_template(template_name) + template_path = Rails.root.join('enterprise', 'lib', 'captain', 'prompts', "#{template_name}.liquid") + + raise "Template not found: #{template_name}" unless File.exist?(template_path) + + File.read(template_path) + end + + def stringify_keys(hash) + hash.deep_stringify_keys + end + end +end diff --git a/enterprise/lib/captain/prompts/assistant.liquid b/enterprise/lib/captain/prompts/assistant.liquid new file mode 100644 index 000000000..69c967d73 --- /dev/null +++ b/enterprise/lib/captain/prompts/assistant.liquid @@ -0,0 +1,80 @@ +# System Context +You are part of Captain, a multi-agent AI system designed for seamless agent coordination and task execution. You can transfer conversations to specialized agents using handoff functions (e.g., `handoff_to_[agent_name]`). These transfers happen in the background - never mention or draw attention to them in your responses. + +# Your Identity +You are {{name}}, a helpful and knowledgeable assistant. Your role is to provide accurate information, assist with tasks, and ensure users get the help they need. + +{{ description }} + +Don't digress away from your instructions, and use all the available tools at your disposal for solving customer issues. If you are to state something factual about {{product_name}} ensure you source that information from the FAQs only. Use the faq_lookup tool for this. + +# Current Context + +Here's the metadata we have about the current conversation and the contact associated with it: + +{% if conversation -%} +{% render 'conversation' %} +{% endif -%} + +{% if contact -%} +{% render 'contact' %} +{% endif -%} + +{% if response_guidelines.size > 0 -%} +# Response Guidelines +Your responses should follow these guidelines: +{% for guideline in response_guidelines -%} +- {{ guideline }} +{% endfor %} +{% endif -%} + +{% if guardrails.size > 0 -%} +# Guardrails +Always respect these boundaries: +{% for guardrail in guardrails -%} +- {{ guardrail }} +{% endfor %} +{% endif -%} + +# Decision Framework + +## 1. Analyze the Request +First, understand what the user is asking: +- **Intent**: What are they trying to achieve? +- **Type**: Is it a question, task, complaint, or request? +- **Complexity**: Can you handle it or does it need specialized expertise? + +## 2. Check for Specialized Scenarios First +Before using any tools, check if the request matches any of these scenarios. If unclear, ask clarifying questions to determine if a scenario applies: + +{% for scenario in scenarios -%} +### handoff_to_{{ scenario.key }} +{{ scenario.description }} +{% endfor -%} + +## 3. Handle the Request +If no specialized scenario clearly matches, handle it yourself: + +### For Questions and Information Requests +1. **First, check existing knowledge**: Use `faq_lookup` tool to search for relevant information +2. **If not found in FAQs**: Provide your best answer based on available context +3. **If unable to answer**: Use `handoff` tool to transfer to a human expert + +### For Complex or Unclear Requests +1. **Ask clarifying questions**: Gather more information if needed +2. **Break down complex tasks**: Handle step by step or hand off if too complex +3. **Escalate when necessary**: Use `handoff` tool for issues beyond your capabilities + +## Response Best Practices +- Be conversational but professional +- Provide actionable information +- Include relevant details from tool responses + +# Human Handoff Protocol +Transfer to a human agent when: +- User explicitly requests human assistance +- You cannot find needed information after checking FAQs +- The issue requires specialized knowledge or permissions you don't have +- Multiple attempts to help have been unsuccessful + +When using the `handoff` tool, provide a clear reason that helps the human agent understand the context. diff --git a/enterprise/lib/captain/prompts/scenario.liquid b/enterprise/lib/captain/prompts/scenario.liquid new file mode 100644 index 000000000..339820b83 --- /dev/null +++ b/enterprise/lib/captain/prompts/scenario.liquid @@ -0,0 +1,24 @@ +# System context +You are part of a multi-agent system where you've been handed off a conversation to handle a specific task. +The handoff was seamless - the user is not aware of any transfer. Continue the conversation naturally. + +# Your Role +You are a specialized agent called {{ title }}, your task is to handle the following scenario: + +{{ instructions }} + +{% if conversation -%} +{% render 'conversation' %} + +{% if contact -%} +{% render 'contact' %} +{% endif -%} +{% endif -%} + +{% if tools.size > 0 -%} +# Available Tools +You have access to these tools: +{% for tool in tools -%} +- {{ tool.id }}: {{ tool.description }} +{% endfor %} +{%- endif %} diff --git a/enterprise/lib/captain/prompts/snippets/contact.liquid b/enterprise/lib/captain/prompts/snippets/contact.liquid new file mode 100644 index 000000000..372389cbb --- /dev/null +++ b/enterprise/lib/captain/prompts/snippets/contact.liquid @@ -0,0 +1,17 @@ +# Contact Information +- Contact ID: {{ contact.id }} +- Name: {{ contact.name || "Unknown" }} +- Email: {{ contact.email || "None" }} +- Phone: {{ contact.phone_number || "None" }} +- Identifier: {{ contact.identifier || "None" }} +- Type: {{ contact.contact_type || "visitor" }} +{% if contact.custom_attributes -%} + {% for attribute in contact.custom_attributes -%} +- {{ attribute[0] }}: {{ attribute[1] }} + {% endfor -%} +{% endif -%} +{% if contact.additional_attributes -%} + {% for attribute in contact.additional_attributes -%} +- {{ attribute[0] }}: {{ attribute[1] }} + {% endfor -%} +{% endif -%} \ No newline at end of file diff --git a/enterprise/lib/captain/prompts/snippets/conversation.liquid b/enterprise/lib/captain/prompts/snippets/conversation.liquid new file mode 100644 index 000000000..b5faee7d6 --- /dev/null +++ b/enterprise/lib/captain/prompts/snippets/conversation.liquid @@ -0,0 +1,18 @@ +# Current Conversation Context +- Conversation ID: {{ conversation.display_id }} +- Contact ID: {{ conversation.contact_id }} +- Status: {{ conversation.status }} +- Priority: {{ conversation.priority || "None" }} +{% if conversation.label_list.size > 0 -%} +- Labels: {{ conversation.label_list | join: ", " }} +{% endif -%} +{% if conversation.custom_attributes -%} + {% for attribute in conversation.custom_attributes -%} +- {{ attribute[0] }}: {{ attribute[1] }} + {% endfor -%} +{% endif -%} +{% if conversation.additional_attributes -%} + {% for attribute in conversation.additional_attributes -%} +- {{ attribute[0] }}: {{ attribute[1] }} + {% endfor -%} +{% endif -%} \ No newline at end of file diff --git a/enterprise/lib/captain/response_schema.rb b/enterprise/lib/captain/response_schema.rb new file mode 100644 index 000000000..651eb7e23 --- /dev/null +++ b/enterprise/lib/captain/response_schema.rb @@ -0,0 +1,6 @@ +# TODO: Wrap the schema lib under ai-agents +# So we can extend it as Agents::Schema +class Captain::ResponseSchema < RubyLLM::Schema + string :response, description: 'The message to send to the user' + string :reasoning, description: "Agent's thought process" +end diff --git a/lib/open_ai_constants.rb b/lib/open_ai_constants.rb new file mode 100644 index 000000000..2c87f3378 --- /dev/null +++ b/lib/open_ai_constants.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +module OpenAiConstants + DEFAULT_MODEL = 'gpt-4.1-mini' + DEFAULT_ENDPOINT = 'https://api.openai.com' +end diff --git a/lib/tasks/captain_chat.rake b/lib/tasks/captain_chat.rake new file mode 100644 index 000000000..cfe257196 --- /dev/null +++ b/lib/tasks/captain_chat.rake @@ -0,0 +1,235 @@ +require 'io/console' +require 'readline' + +namespace :captain do + desc 'Start interactive chat with Captain assistant - Usage: rake captain:chat[assistant_id] or rake captain:chat -- assistant_id' + task :chat, [:assistant_id] => :environment do |_, args| + assistant_id = args[:assistant_id] || ARGV[1] + + unless assistant_id + puts '❌ Please provide an assistant ID' + puts 'Usage: rake captain:chat[assistant_id]' + puts "\nAvailable assistants:" + Captain::Assistant.includes(:account).each do |assistant| + puts " ID: #{assistant.id} - #{assistant.name} (Account: #{assistant.account.name})" + end + exit 1 + end + + assistant = Captain::Assistant.find_by(id: assistant_id) + unless assistant + puts "❌ Assistant with ID #{assistant_id} not found" + exit 1 + end + + # Clear ARGV to prevent gets from reading files + ARGV.clear + + chat_session = CaptainChatSession.new(assistant) + chat_session.start + end +end + +class CaptainChatSession + def initialize(assistant) + @assistant = assistant + @message_history = [] + end + + def start + show_assistant_info + show_instructions + chat_loop + show_exit_message + end + + private + + def show_instructions + puts "💡 Type 'exit', 'quit', or 'bye' to end the session" + puts "💡 Type 'clear' to clear message history" + puts('-' * 50) + end + + def chat_loop + loop do + puts '' # Add spacing before prompt + user_input = Readline.readline('👤 You: ', true) + next unless user_input # Handle Ctrl+D + + break unless handle_user_input(user_input.strip) + end + end + + def handle_user_input(user_input) + case user_input.downcase + when 'exit', 'quit', 'bye' + false + when 'clear' + clear_history + true + when '' + true + else + process_user_message(user_input) + true + end + end + + def show_exit_message + puts "\nChat session ended" + puts "Final conversation log has #{@message_history.length} messages" + end + + def show_assistant_info + show_basic_info + show_scenarios + show_available_tools + puts '' + end + + def show_basic_info + puts "🤖 Starting chat with #{@assistant.name}" + puts "🏢 Account: #{@assistant.account.name}" + puts "🆔 Assistant ID: #{@assistant.id}" + end + + def show_scenarios + scenarios = @assistant.scenarios.enabled + if scenarios.any? + puts "⚡ Enabled Scenarios (#{scenarios.count}):" + scenarios.each { |scenario| display_scenario(scenario) } + else + puts '⚡ No scenarios enabled' + end + end + + def display_scenario(scenario) + tools_count = scenario.tools&.length || 0 + puts " • #{scenario.title} (#{tools_count} tools)" + return if scenario.description.blank? + + description = truncate_description(scenario.description) + puts " #{description}" + end + + def truncate_description(description) + description.length > 60 ? "#{description[0..60]}..." : description + end + + def show_available_tools + available_tools = Captain::Assistant.available_tool_ids + if available_tools.any? + puts "🔧 Available Tools (#{available_tools.count}): #{available_tools.join(', ')}" + else + puts '🔧 No tools available' + end + end + + def process_user_message(user_input) + add_to_history('user', user_input) + + begin + print "🤖 #{@assistant.name}: " + @current_system_messages = [] + + result = generate_assistant_response + display_response(result) + rescue StandardError => e + handle_error(e) + end + end + + def generate_assistant_response + runner = Captain::Assistant::AgentRunnerService.new(assistant: @assistant, callbacks: build_callbacks) + runner.generate_response(message_history: @message_history) + end + + def build_callbacks + { + on_agent_thinking: method(:handle_agent_thinking), + on_tool_start: method(:handle_tool_start), + on_tool_complete: method(:handle_tool_complete), + on_agent_handoff: method(:handle_agent_handoff) + } + end + + def handle_agent_thinking(agent, _input) + agent_name = extract_name(agent) + @current_system_messages << "#{agent_name} is thinking..." + add_to_history('system', "#{agent_name} is thinking...") + end + + def handle_tool_start(tool, _args) + tool_name = extract_tool_name(tool) + @current_system_messages << "Using tool: #{tool_name}" + add_to_history('system', "Using tool: #{tool_name}") + end + + def handle_tool_complete(tool, _result) + tool_name = extract_tool_name(tool) + @current_system_messages << "Tool #{tool_name} completed" + add_to_history('system', "Tool #{tool_name} completed") + end + + def handle_agent_handoff(from, to, reason) + @current_system_messages << "Handoff: #{extract_name(from)} → #{extract_name(to)} (#{reason})" + add_to_history('system', "Agent handoff: #{extract_name(from)} → #{extract_name(to)} (#{reason})") + end + + def display_response(result) + response_text = result['response'] || 'No response generated' + reasoning = result['reasoning'] + + puts dim_text("\n#{@current_system_messages.join("\n")}") if @current_system_messages.any? + puts response_text + puts dim_italic_text("(Reasoning: #{reasoning})") if reasoning && reasoning != 'Processed by agent' + + add_to_history('assistant', response_text, reasoning: reasoning) + end + + def handle_error(error) + error_msg = "Error: #{error.message}" + puts "❌ #{error_msg}" + add_to_history('system', error_msg) + end + + def add_to_history(role, content, agent_name: nil, reasoning: nil) + message = { + role: role, + content: content, + timestamp: Time.current, + agent_name: agent_name || (role == 'assistant' ? @assistant.name : nil) + } + message[:reasoning] = reasoning if reasoning + + @message_history << message + end + + def clear_history + @message_history.clear + puts 'Message history cleared' + end + + def dim_text(text) + # ANSI escape code for very dim gray text (bright black/dark gray) + "\e[90m#{text}\e[0m" + end + + def dim_italic_text(text) + # ANSI escape codes for dim gray + italic text + "\e[90m\e[3m#{text}\e[0m" + end + + def extract_tool_name(tool) + return tool if tool.is_a?(String) + + tool.class.name.split('::').last.gsub('Tool', '') + rescue StandardError + tool.to_s + end + + def extract_name(obj) + obj.respond_to?(:name) ? obj.name : obj.to_s + end +end diff --git a/spec/enterprise/jobs/captain/conversation/response_builder_job_spec.rb b/spec/enterprise/jobs/captain/conversation/response_builder_job_spec.rb index c21205d52..23ed2ecec 100644 --- a/spec/enterprise/jobs/captain/conversation/response_builder_job_spec.rb +++ b/spec/enterprise/jobs/captain/conversation/response_builder_job_spec.rb @@ -9,6 +9,7 @@ RSpec.describe Captain::Conversation::ResponseBuilderJob, type: :job do describe '#perform' do let(:conversation) { create(:conversation, inbox: inbox, account: account) } let(:mock_llm_chat_service) { instance_double(Captain::Llm::AssistantChatService) } + let(:mock_agent_runner_service) { instance_double(Captain::Assistant::AgentRunnerService) } before do create(:message, conversation: conversation, content: 'Hello', message_type: :incoming) @@ -16,19 +17,79 @@ RSpec.describe Captain::Conversation::ResponseBuilderJob, type: :job do allow(inbox).to receive(:captain_active?).and_return(true) allow(Captain::Llm::AssistantChatService).to receive(:new).and_return(mock_llm_chat_service) allow(mock_llm_chat_service).to receive(:generate_response).and_return({ 'response' => 'Hey, welcome to Captain Specs' }) + allow(Captain::Assistant::AgentRunnerService).to receive(:new).and_return(mock_agent_runner_service) + allow(mock_agent_runner_service).to receive(:generate_response).and_return({ 'response' => 'Hey, welcome to Captain V2' }) end - it 'generates and processes response' do - described_class.perform_now(conversation, assistant) - expect(conversation.messages.count).to eq(2) - expect(conversation.messages.outgoing.count).to eq(1) - expect(conversation.messages.last.content).to eq('Hey, welcome to Captain Specs') + context 'when captain_v2 is disabled' do + before do + allow(account).to receive(:feature_enabled?).and_return(false) + allow(account).to receive(:feature_enabled?).with('captain_integration_v2').and_return(false) + end + + it 'uses Captain::Llm::AssistantChatService' do + expect(Captain::Llm::AssistantChatService).to receive(:new).with(assistant: assistant) + expect(Captain::Assistant::AgentRunnerService).not_to receive(:new) + + described_class.perform_now(conversation, assistant) + expect(conversation.messages.last.content).to eq('Hey, welcome to Captain Specs') + end + + it 'generates and processes response' do + described_class.perform_now(conversation, assistant) + expect(conversation.messages.count).to eq(2) + expect(conversation.messages.outgoing.count).to eq(1) + expect(conversation.messages.last.content).to eq('Hey, welcome to Captain Specs') + end + + it 'increments usage response' do + described_class.perform_now(conversation, assistant) + account.reload + expect(account.usage_limits[:captain][:responses][:consumed]).to eq(1) + end end - it 'increments usage response' do - described_class.perform_now(conversation, assistant) - account.reload - expect(account.usage_limits[:captain][:responses][:consumed]).to eq(1) + context 'when captain_v2 is enabled' do + before do + allow(account).to receive(:feature_enabled?).and_return(false) + allow(account).to receive(:feature_enabled?).with('captain_integration_v2').and_return(true) + end + + it 'uses Captain::Assistant::AgentRunnerService' do + expect(Captain::Assistant::AgentRunnerService).to receive(:new).with( + assistant: assistant, + conversation: conversation + ) + expect(Captain::Llm::AssistantChatService).not_to receive(:new) + + described_class.perform_now(conversation, assistant) + expect(conversation.messages.last.content).to eq('Hey, welcome to Captain V2') + end + + it 'passes message history to agent runner service' do + expected_messages = [ + { content: 'Hello', role: 'user' } + ] + + expect(mock_agent_runner_service).to receive(:generate_response).with( + message_history: expected_messages + ) + + described_class.perform_now(conversation, assistant) + end + + it 'generates and processes response' do + described_class.perform_now(conversation, assistant) + expect(conversation.messages.count).to eq(2) + expect(conversation.messages.outgoing.count).to eq(1) + expect(conversation.messages.last.content).to eq('Hey, welcome to Captain V2') + end + + it 'increments usage response' do + described_class.perform_now(conversation, assistant) + account.reload + expect(account.usage_limits[:captain][:responses][:consumed]).to eq(1) + end end context 'when message contains an image' do diff --git a/spec/enterprise/lib/captain/prompt_renderer_spec.rb b/spec/enterprise/lib/captain/prompt_renderer_spec.rb new file mode 100644 index 000000000..761d55f99 --- /dev/null +++ b/spec/enterprise/lib/captain/prompt_renderer_spec.rb @@ -0,0 +1,123 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe Captain::PromptRenderer do + let(:template_name) { 'test_template' } + let(:template_content) { 'Hello {{name}}, your balance is {{balance}}' } + let(:template_path) { Rails.root.join('enterprise', 'lib', 'captain', 'prompts', "#{template_name}.liquid") } + let(:context) { { name: 'John', balance: 100 } } + + before do + allow(File).to receive(:exist?).and_return(false) + allow(File).to receive(:exist?).with(template_path).and_return(true) + allow(File).to receive(:read).with(template_path).and_return(template_content) + end + + describe '.render' do + it 'renders template with context' do + result = described_class.render(template_name, context) + + expect(result).to eq('Hello John, your balance is 100') + end + + it 'handles string keys in context' do + string_context = { 'name' => 'Jane', 'balance' => 200 } + result = described_class.render(template_name, string_context) + + expect(result).to eq('Hello Jane, your balance is 200') + end + + it 'handles mixed symbol and string keys' do + mixed_context = { :name => 'Bob', 'balance' => 300 } + result = described_class.render(template_name, mixed_context) + + expect(result).to eq('Hello Bob, your balance is 300') + end + + it 'handles nested hash context' do + nested_template = 'User: {{user.name}}, Account: {{user.account.type}}' + nested_context = { user: { name: 'Alice', account: { type: 'premium' } } } + + allow(File).to receive(:read).with(template_path).and_return(nested_template) + + result = described_class.render(template_name, nested_context) + + expect(result).to eq('User: Alice, Account: premium') + end + + it 'handles empty context' do + simple_template = 'Hello World' + allow(File).to receive(:read).with(template_path).and_return(simple_template) + + result = described_class.render(template_name, {}) + + expect(result).to eq('Hello World') + end + + it 'loads and parses liquid template' do + liquid_template_double = instance_double(Liquid::Template) + allow(Liquid::Template).to receive(:parse).with(template_content).and_return(liquid_template_double) + allow(liquid_template_double).to receive(:render).with(hash_including('name', 'balance')).and_return('rendered') + + result = described_class.render(template_name, context) + + expect(result).to eq('rendered') + expect(Liquid::Template).to have_received(:parse).with(template_content) + end + end + + describe '.load_template' do + it 'reads template file from correct path' do + described_class.send(:load_template, template_name) + + expect(File).to have_received(:read).with(template_path) + end + + it 'raises error when template does not exist' do + allow(File).to receive(:exist?).with(template_path).and_return(false) + + expect { described_class.send(:load_template, template_name) } + .to raise_error("Template not found: #{template_name}") + end + + it 'constructs correct template path' do + expected_path = Rails.root.join('enterprise/lib/captain/prompts/my_template.liquid') + allow(File).to receive(:exist?).with(expected_path).and_return(true) + allow(File).to receive(:read).with(expected_path).and_return('test content') + + described_class.send(:load_template, 'my_template') + + expect(File).to have_received(:exist?).with(expected_path) + end + end + + describe '.stringify_keys' do + it 'converts symbol keys to strings' do + hash = { name: 'John', age: 30 } + result = described_class.send(:stringify_keys, hash) + + expect(result).to eq({ 'name' => 'John', 'age' => 30 }) + end + + it 'handles nested hashes' do + hash = { user: { name: 'John', profile: { age: 30 } } } + result = described_class.send(:stringify_keys, hash) + + expect(result).to eq({ 'user' => { 'name' => 'John', 'profile' => { 'age' => 30 } } }) + end + + it 'handles arrays with hashes' do + hash = { users: [{ name: 'John' }, { name: 'Jane' }] } + result = described_class.send(:stringify_keys, hash) + + expect(result).to eq({ 'users' => [{ 'name' => 'John' }, { 'name' => 'Jane' }] }) + end + + it 'handles empty hash' do + result = described_class.send(:stringify_keys, {}) + + expect(result).to eq({}) + end + end +end diff --git a/spec/enterprise/models/concerns/agentable_spec.rb b/spec/enterprise/models/concerns/agentable_spec.rb new file mode 100644 index 000000000..767e51d44 --- /dev/null +++ b/spec/enterprise/models/concerns/agentable_spec.rb @@ -0,0 +1,186 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe Concerns::Agentable do + let(:dummy_class) do + Class.new do + include Concerns::Agentable + + attr_accessor :temperature + + def initialize(name: 'Test Agent', temperature: 0.8) + @name = name + @temperature = temperature + end + + def self.name + 'DummyClass' + end + + private + + def agent_name + @name + end + + def prompt_context + { base_key: 'base_value' } + end + end + end + + let(:dummy_instance) { dummy_class.new } + let(:mock_agents_agent) { instance_double(Agents::Agent) } + let(:mock_installation_config) { instance_double(InstallationConfig, value: 'gpt-4-turbo') } + + before do + allow(Agents::Agent).to receive(:new).and_return(mock_agents_agent) + allow(InstallationConfig).to receive(:find_by).with(name: 'CAPTAIN_OPEN_AI_MODEL').and_return(mock_installation_config) + allow(Captain::PromptRenderer).to receive(:render).and_return('rendered_template') + end + + describe '#agent' do + it 'creates an Agents::Agent with correct parameters' do + expect(Agents::Agent).to receive(:new).with( + name: 'Test Agent', + instructions: instance_of(Proc), + tools: [], + model: 'gpt-4-turbo', + temperature: 0.8, + response_schema: Captain::ResponseSchema + ) + + dummy_instance.agent + end + + it 'converts nil temperature to 0.0' do + dummy_instance.temperature = nil + + expect(Agents::Agent).to receive(:new).with( + hash_including(temperature: 0.0) + ) + + dummy_instance.agent + end + + it 'converts temperature to float' do + dummy_instance.temperature = '0.5' + + expect(Agents::Agent).to receive(:new).with( + hash_including(temperature: 0.5) + ) + + dummy_instance.agent + end + end + + describe '#agent_instructions' do + it 'calls Captain::PromptRenderer with base context' do + expect(Captain::PromptRenderer).to receive(:render).with( + 'dummy_class', + hash_including(base_key: 'base_value') + ) + + dummy_instance.agent_instructions + end + + it 'merges context state when provided' do + context_double = instance_double(Agents::RunContext, + context: { + state: { + conversation: { id: 123 }, + contact: { name: 'John' } + } + }) + + expected_context = { + base_key: 'base_value', + conversation: { id: 123 }, + contact: { name: 'John' } + } + + expect(Captain::PromptRenderer).to receive(:render).with( + 'dummy_class', + hash_including(expected_context) + ) + + dummy_instance.agent_instructions(context_double) + end + + it 'handles context without state' do + context_double = instance_double(Agents::RunContext, context: {}) + + expect(Captain::PromptRenderer).to receive(:render).with( + 'dummy_class', + hash_including( + base_key: 'base_value', + conversation: {}, + contact: {} + ) + ) + + dummy_instance.agent_instructions(context_double) + end + end + + describe '#template_name' do + it 'returns underscored class name' do + expect(dummy_instance.send(:template_name)).to eq('dummy_class') + end + end + + describe '#agent_tools' do + it 'returns empty array by default' do + expect(dummy_instance.send(:agent_tools)).to eq([]) + end + end + + describe '#agent_model' do + it 'returns value from InstallationConfig when present' do + expect(dummy_instance.send(:agent_model)).to eq('gpt-4-turbo') + end + + it 'returns default model when config not found' do + allow(InstallationConfig).to receive(:find_by).and_return(nil) + + expect(dummy_instance.send(:agent_model)).to eq('gpt-4.1-mini') + end + + it 'returns default model when config value is nil' do + allow(mock_installation_config).to receive(:value).and_return(nil) + + expect(dummy_instance.send(:agent_model)).to eq('gpt-4.1-mini') + end + end + + describe '#agent_response_schema' do + it 'returns Captain::ResponseSchema' do + expect(dummy_instance.send(:agent_response_schema)).to eq(Captain::ResponseSchema) + end + end + + describe 'required methods' do + let(:incomplete_class) do + Class.new do + include Concerns::Agentable + end + end + + let(:incomplete_instance) { incomplete_class.new } + + describe '#agent_name' do + it 'raises NotImplementedError when not implemented' do + expect { incomplete_instance.send(:agent_name) } + .to raise_error(NotImplementedError, /must implement agent_name/) + end + end + + describe '#prompt_context' do + it 'raises NotImplementedError when not implemented' do + expect { incomplete_instance.send(:prompt_context) } + .to raise_error(NotImplementedError, /must implement prompt_context/) + end + end + end +end diff --git a/spec/enterprise/services/captain/assistant/agent_runner_service_spec.rb b/spec/enterprise/services/captain/assistant/agent_runner_service_spec.rb new file mode 100644 index 000000000..f31177fc2 --- /dev/null +++ b/spec/enterprise/services/captain/assistant/agent_runner_service_spec.rb @@ -0,0 +1,320 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe Captain::Assistant::AgentRunnerService do + let(:account) { create(:account) } + let(:inbox) { create(:inbox, account: account) } + let(:contact) { create(:contact, account: account) } + let(:conversation) { create(:conversation, account: account, inbox: inbox, contact: contact) } + let(:assistant) { create(:captain_assistant, account: account) } + let(:scenario) { create(:captain_scenario, assistant: assistant, enabled: true) } + + let(:mock_runner) { instance_double(Agents::Runner) } + let(:mock_agent) { instance_double(Agents::Agent) } + let(:mock_scenario_agent) { instance_double(Agents::Agent) } + let(:mock_result) { instance_double(Agents::RunResult, output: { 'response' => 'Test response' }) } + + let(:message_history) do + [ + { role: 'user', content: 'Hello there' }, + { role: 'assistant', content: 'Hi! How can I help you?', agent_name: 'Assistant' }, + { role: 'user', content: 'I need help with my account' } + ] + end + + before do + allow(assistant).to receive(:agent).and_return(mock_agent) + scenarios_relation = instance_double(Captain::Scenario) + allow(scenarios_relation).to receive(:enabled).and_return([scenario]) + allow(assistant).to receive(:scenarios).and_return(scenarios_relation) + allow(scenario).to receive(:agent).and_return(mock_scenario_agent) + allow(Agents::Runner).to receive(:with_agents).and_return(mock_runner) + allow(mock_runner).to receive(:run).and_return(mock_result) + allow(mock_agent).to receive(:register_handoffs) + allow(mock_scenario_agent).to receive(:register_handoffs) + end + + describe '#initialize' do + it 'sets instance variables correctly' do + service = described_class.new(assistant: assistant, conversation: conversation) + + expect(service.instance_variable_get(:@assistant)).to eq(assistant) + expect(service.instance_variable_get(:@conversation)).to eq(conversation) + expect(service.instance_variable_get(:@callbacks)).to eq({}) + end + + it 'accepts callbacks parameter' do + callbacks = { on_agent_thinking: proc { |x| x } } + service = described_class.new(assistant: assistant, callbacks: callbacks) + + expect(service.instance_variable_get(:@callbacks)).to eq(callbacks) + end + end + + describe '#generate_response' do + subject(:service) { described_class.new(assistant: assistant, conversation: conversation) } + + it 'builds agents and wires them together' do + expect(assistant).to receive(:agent).and_return(mock_agent) + scenarios_relation = instance_double(Captain::Scenario) + allow(scenarios_relation).to receive(:enabled).and_return([scenario]) + expect(assistant).to receive(:scenarios).and_return(scenarios_relation) + expect(scenario).to receive(:agent).and_return(mock_scenario_agent) + expect(mock_agent).to receive(:register_handoffs).with(mock_scenario_agent) + expect(mock_scenario_agent).to receive(:register_handoffs).with(mock_agent) + + service.generate_response(message_history: message_history) + end + + it 'creates runner with agents' do + expect(Agents::Runner).to receive(:with_agents).with(mock_agent, mock_scenario_agent) + + service.generate_response(message_history: message_history) + end + + it 'runs agent with extracted user message and context' do + expected_context = { + conversation_history: [ + { role: :user, content: 'Hello there', agent_name: nil }, + { role: :assistant, content: 'Hi! How can I help you?', agent_name: 'Assistant' }, + { role: :user, content: 'I need help with my account', agent_name: nil } + ], + state: hash_including( + account_id: account.id, + assistant_id: assistant.id, + conversation: hash_including(id: conversation.id), + contact: hash_including(id: contact.id) + ) + } + + expect(mock_runner).to receive(:run).with( + 'I need help with my account', + context: expected_context + ) + + service.generate_response(message_history: message_history) + end + + it 'processes and formats agent result' do + result = service.generate_response(message_history: message_history) + + expect(result).to eq({ 'response' => 'Test response' }) + end + + context 'when no scenarios are enabled' do + before do + scenarios_relation = instance_double(Captain::Scenario) + allow(scenarios_relation).to receive(:enabled).and_return([]) + allow(assistant).to receive(:scenarios).and_return(scenarios_relation) + end + + it 'only uses assistant agent' do + expect(Agents::Runner).to receive(:with_agents).with(mock_agent) + expect(mock_agent).not_to receive(:register_handoffs) + + service.generate_response(message_history: message_history) + end + end + + context 'when agent result is a string' do + let(:mock_result) { instance_double(Agents::RunResult, output: 'Simple string response') } + + it 'formats string response correctly' do + result = service.generate_response(message_history: message_history) + + expect(result).to eq({ + 'response' => 'Simple string response', + 'reasoning' => 'Processed by agent' + }) + end + end + + context 'when an error occurs' do + let(:error) { StandardError.new('Test error') } + + before do + allow(mock_runner).to receive(:run).and_raise(error) + allow(ChatwootExceptionTracker).to receive(:new).and_return( + instance_double(ChatwootExceptionTracker, capture_exception: true) + ) + end + + it 'captures exception and returns error response' do + expect(ChatwootExceptionTracker).to receive(:new).with(error, account: conversation.account) + + result = service.generate_response(message_history: message_history) + + expect(result).to eq({ + 'response' => 'conversation_handoff', + 'reasoning' => 'Error occurred: Test error' + }) + end + + it 'logs error details' do + expect(Rails.logger).to receive(:error).with('[Captain V2] AgentRunnerService error: Test error') + expect(Rails.logger).to receive(:error).with(kind_of(String)) + + service.generate_response(message_history: message_history) + end + + context 'when conversation is nil' do + subject(:service) { described_class.new(assistant: assistant, conversation: nil) } + + it 'handles missing conversation gracefully' do + expect(ChatwootExceptionTracker).to receive(:new).with(error, account: nil) + + result = service.generate_response(message_history: message_history) + + expect(result).to eq({ + 'response' => 'conversation_handoff', + 'reasoning' => 'Error occurred: Test error' + }) + end + end + end + end + + describe '#build_context' do + subject(:service) { described_class.new(assistant: assistant, conversation: conversation) } + + it 'builds context with conversation history and state' do + context = service.send(:build_context, message_history) + + expect(context).to include( + conversation_history: array_including( + { role: :user, content: 'Hello there', agent_name: nil }, + { role: :assistant, content: 'Hi! How can I help you?', agent_name: 'Assistant' } + ), + state: hash_including( + account_id: account.id, + assistant_id: assistant.id + ) + ) + end + + context 'with multimodal content' do + let(:multimodal_message_history) do + [ + { + role: 'user', + content: [ + { type: 'text', text: 'Can you help with this image?' }, + { type: 'image_url', image_url: { url: 'https://example.com/image.jpg' } } + ] + } + ] + end + + it 'extracts text content from multimodal messages' do + context = service.send(:build_context, multimodal_message_history) + + expect(context[:conversation_history].first[:content]).to eq('Can you help with this image?') + end + end + end + + describe '#extract_last_user_message' do + subject(:service) { described_class.new(assistant: assistant, conversation: conversation) } + + it 'extracts the last user message' do + result = service.send(:extract_last_user_message, message_history) + + expect(result).to eq('I need help with my account') + end + end + + describe '#extract_text_from_content' do + subject(:service) { described_class.new(assistant: assistant, conversation: conversation) } + + it 'extracts text from string content' do + result = service.send(:extract_text_from_content, 'Simple text') + + expect(result).to eq('Simple text') + end + + it 'extracts response from hash content' do + content = { 'response' => 'Hash response' } + result = service.send(:extract_text_from_content, content) + + expect(result).to eq('Hash response') + end + + it 'extracts text from multimodal array content' do + content = [ + { type: 'text', text: 'First part' }, + { type: 'image_url', image_url: { url: 'image.jpg' } }, + { type: 'text', text: 'Second part' } + ] + + result = service.send(:extract_text_from_content, content) + + expect(result).to eq('First part Second part') + end + end + + describe '#build_state' do + subject(:service) { described_class.new(assistant: assistant, conversation: conversation) } + + it 'builds state with assistant and account information' do + state = service.send(:build_state) + + expect(state).to include( + account_id: account.id, + assistant_id: assistant.id, + assistant_config: assistant.config + ) + end + + it 'includes conversation attributes when conversation is present' do + state = service.send(:build_state) + + expect(state[:conversation]).to include( + id: conversation.id, + inbox_id: inbox.id, + contact_id: contact.id, + status: conversation.status + ) + end + + it 'includes contact attributes when contact is present' do + state = service.send(:build_state) + + expect(state[:contact]).to include( + id: contact.id, + name: contact.name, + email: contact.email + ) + end + + context 'when conversation is nil' do + subject(:service) { described_class.new(assistant: assistant, conversation: nil) } + + it 'builds state without conversation and contact' do + state = service.send(:build_state) + + expect(state).to include( + account_id: account.id, + assistant_id: assistant.id, + assistant_config: assistant.config + ) + expect(state).not_to have_key(:conversation) + expect(state).not_to have_key(:contact) + end + end + end + + describe 'constants' do + it 'defines conversation state attributes' do + expect(described_class::CONVERSATION_STATE_ATTRIBUTES).to include( + :id, :display_id, :inbox_id, :contact_id, :status, :priority + ) + end + + it 'defines contact state attributes' do + expect(described_class::CONTACT_STATE_ATTRIBUTES).to include( + :id, :name, :email, :phone_number, :identifier, :contact_type + ) + end + end +end