├── .nvmrc ├── log └── .keep ├── tmp └── .keep ├── lib ├── assets │ └── .keep ├── tasks │ ├── .keep │ └── ip_lookup.rake ├── integrations │ └── openai │ │ └── openai_prompts │ │ └── summary.txt └── url_helper.rb ├── spec ├── mailers │ └── .keep ├── models │ ├── .keep │ ├── installation_config_spec.rb │ ├── team_member_spec.rb │ ├── portal_member_spec.rb │ └── related_category_spec.rb ├── controllers │ └── .keep ├── fixtures │ ├── .keep │ ├── files │ │ ├── .keep │ │ └── mail_with_no_date.eml │ ├── data_import │ │ ├── with_emoji.csv │ │ └── invalid_bytes.csv │ ├── accounts.yml │ ├── inbox_members.yml │ └── inboxes.yml ├── integration │ └── .keep ├── assets │ ├── attachment.pdf │ ├── avatar.png │ ├── sample.mov │ ├── sample.mp3 │ ├── sample.mp4 │ ├── sample.ogg │ ├── sample.pdf │ └── sample.png ├── factories │ ├── email_template.rb │ ├── portal_members.rb │ ├── platform_apps.rb │ ├── related_categories.rb │ ├── team_members.rb │ ├── agent_bot_inboxes.rb │ ├── installation_config.rb │ ├── labels.rb │ ├── platform_apps_permissibles.rb │ ├── portals.rb │ ├── inbox_members.rb │ ├── account_users.rb │ ├── teams.rb │ ├── folders.rb │ ├── captain │ │ ├── inbox.rb │ │ └── assistant.rb │ ├── mentions.rb │ ├── notes.rb │ ├── canned_responses.rb │ └── data_import.rb └── support │ └── negated_matchers.rb ├── vendor ├── db │ └── .keep └── assets │ ├── javascripts │ └── .keep │ └── stylesheets │ └── .keep ├── .ruby-version ├── .slugignore ├── VERSION_CW ├── VERSION_CWCTL ├── app ├── assets │ ├── images │ │ └── .keep │ ├── stylesheets │ │ └── administrate │ │ │ ├── utilities │ │ │ └── _text-color.scss │ │ │ ├── components │ │ │ ├── _form-actions.scss │ │ │ └── _app-container.scss │ │ │ └── library │ │ │ ├── _clearfix.scss │ │ │ └── _data-label.scss │ └── config │ │ └── manifest.js ├── models │ ├── concerns │ │ ├── .keep │ │ ├── llm_formattable.rb │ │ └── reportable.rb │ ├── kbase.rb │ └── integrations.rb ├── controllers │ ├── concerns │ │ ├── .keep │ │ ├── hmac_concern.rb │ │ ├── domain_helper.rb │ │ └── label_concern.rb │ ├── twitter │ │ └── base_controller.rb │ ├── android_app_controller.rb │ ├── webhooks │ │ ├── sms_controller.rb │ │ ├── telegram_controller.rb │ │ └── notifica_me_controller.rb │ └── api │ │ └── v1 │ │ └── widget │ │ └── campaigns_controller.rb ├── views │ ├── dashboard │ │ └── index.html.erb │ ├── fields │ │ ├── count_field │ │ │ ├── _index.html.erb │ │ │ └── _show.html.erb │ │ ├── account_limits_field │ │ │ ├── _index.html.erb │ │ │ └── _show.html.erb │ │ ├── avatar_field │ │ │ ├── _index.html.erb │ │ │ └── _show.html.erb │ │ └── serialized_field │ │ │ ├── _show.html.erb │ │ │ └── _index.html.erb │ ├── api │ │ ├── v1 │ │ │ ├── accounts │ │ │ │ ├── contacts │ │ │ │ │ ├── labels │ │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ │ └── index.json.jbuilder │ │ │ │ │ ├── notes │ │ │ │ │ │ ├── show.json.jbuilder │ │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ │ ├── update.json.jbuilder │ │ │ │ │ │ └── index.json.jbuilder │ │ │ │ │ ├── contact_inboxes │ │ │ │ │ │ └── create.json.jbuilder │ │ │ │ │ ├── avatar.json.jbuilder │ │ │ │ │ ├── destroy_custom_attributes.json.jbuilder │ │ │ │ │ ├── show.json.jbuilder │ │ │ │ │ ├── update.json.jbuilder │ │ │ │ │ └── conversations │ │ │ │ │ │ └── index.json.jbuilder │ │ │ │ ├── conversations │ │ │ │ │ ├── labels │ │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ │ └── index.json.jbuilder │ │ │ │ │ ├── custom_attributes.json.jbuilder │ │ │ │ │ ├── messages │ │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ │ ├── destroy.json.jbuilder │ │ │ │ │ │ └── retry.json.jbuilder │ │ │ │ │ ├── show.json.jbuilder │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ ├── unread.json.jbuilder │ │ │ │ │ ├── update.json.jbuilder │ │ │ │ │ ├── update_last_seen.json.jbuilder │ │ │ │ │ ├── assignments │ │ │ │ │ │ └── create.json.jbuilder │ │ │ │ │ └── participants │ │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ │ └── show.json.jbuilder │ │ │ │ ├── portals │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ ├── update.json.jbuilder │ │ │ │ │ ├── add_members.json.jbuilder │ │ │ │ │ └── show.json.jbuilder │ │ │ │ ├── inboxes │ │ │ │ │ ├── show.json.jbuilder │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ ├── update.json.jbuilder │ │ │ │ │ ├── campaigns.json.jbuilder │ │ │ │ │ ├── agent_bot.json.jbuilder │ │ │ │ │ ├── index.json.jbuilder │ │ │ │ │ └── assignable_agents.json.jbuilder │ │ │ │ ├── teams │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ ├── show.json.jbuilder │ │ │ │ │ ├── update.json.jbuilder │ │ │ │ │ └── index.json.jbuilder │ │ │ │ ├── update.json.jbuilder │ │ │ │ ├── agents │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ ├── update.json.jbuilder │ │ │ │ │ └── index.json.jbuilder │ │ │ │ ├── articles │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ ├── edit.json.jbuilder │ │ │ │ │ ├── show.json.jbuilder │ │ │ │ │ └── update.json.jbuilder │ │ │ │ ├── campaigns │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ ├── show.json.jbuilder │ │ │ │ │ ├── update.json.jbuilder │ │ │ │ │ └── index.json.jbuilder │ │ │ │ ├── categories │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ ├── show.json.jbuilder │ │ │ │ │ ├── update.json.jbuilder │ │ │ │ │ └── index.json.jbuilder │ │ │ │ ├── integrations │ │ │ │ │ ├── apps │ │ │ │ │ │ ├── show.json.jbuilder │ │ │ │ │ │ └── index.json.jbuilder │ │ │ │ │ ├── hooks │ │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ │ └── update.json.jbuilder │ │ │ │ │ ├── linear │ │ │ │ │ │ └── create.json.jbuilder │ │ │ │ │ └── slack │ │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ │ ├── update.json.jbuilder │ │ │ │ │ │ └── list_all_channels.json.jbuilder │ │ │ │ ├── channels │ │ │ │ │ └── twilio_channels │ │ │ │ │ │ └── create.json.jbuilder │ │ │ │ ├── custom_filters │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ ├── show.json.jbuilder │ │ │ │ │ ├── update.json.jbuilder │ │ │ │ │ └── index.json.jbuilder │ │ │ │ ├── dashboard_apps │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ ├── show.json.jbuilder │ │ │ │ │ ├── update.json.jbuilder │ │ │ │ │ └── index.json.jbuilder │ │ │ │ ├── actions │ │ │ │ │ └── contact_merges │ │ │ │ │ │ └── create.json.jbuilder │ │ │ │ ├── macros │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ ├── show.json.jbuilder │ │ │ │ │ ├── update.json.jbuilder │ │ │ │ │ └── index.json.jbuilder │ │ │ │ ├── agent_bots │ │ │ │ │ ├── show.json.jbuilder │ │ │ │ │ ├── avatar.json.jbuilder │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ ├── update.json.jbuilder │ │ │ │ │ └── index.json.jbuilder │ │ │ │ ├── webhooks │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ ├── update.json.jbuilder │ │ │ │ │ └── index.json.jbuilder │ │ │ │ ├── callbacks │ │ │ │ │ ├── reauthorize_page.json.jbuilder │ │ │ │ │ └── facebook_pages.json.jbuilder │ │ │ │ ├── contact_inboxes │ │ │ │ │ └── filter.json.jbuilder │ │ │ │ ├── search │ │ │ │ │ ├── _inbox.json.jbuilder │ │ │ │ │ ├── _agent.json.jbuilder │ │ │ │ │ ├── _contact.json.jbuilder │ │ │ │ │ ├── contacts.json.jbuilder │ │ │ │ │ └── messages.json.jbuilder │ │ │ │ ├── custom_attribute_definitions │ │ │ │ │ ├── show.json.jbuilder │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ ├── update.json.jbuilder │ │ │ │ │ └── index.json.jbuilder │ │ │ │ ├── automation_rules │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ ├── clone.json.jbuilder │ │ │ │ │ ├── show.json.jbuilder │ │ │ │ │ └── update.json.jbuilder │ │ │ │ ├── team_members │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ └── index.json.jbuilder │ │ │ │ ├── csat_survey_responses │ │ │ │ │ ├── metrics.json.jbuilder │ │ │ │ │ └── index.json.jbuilder │ │ │ │ ├── inbox_members │ │ │ │ │ ├── show.json.jbuilder │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ └── update.json.jbuilder │ │ │ │ ├── labels │ │ │ │ │ ├── show.json.jbuilder │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ └── update.json.jbuilder │ │ │ │ └── assignable_agents │ │ │ │ │ └── index.json.jbuilder │ │ │ ├── widget │ │ │ │ ├── messages │ │ │ │ │ └── update.json.jbuilder │ │ │ │ ├── contacts │ │ │ │ │ ├── update.json.jbuilder │ │ │ │ │ └── show.json.jbuilder │ │ │ │ └── conversations │ │ │ │ │ └── index.json.jbuilder │ │ │ ├── profiles │ │ │ │ ├── show.json.jbuilder │ │ │ │ ├── auto_offline.jbuilder │ │ │ │ ├── availability.jbuilder │ │ │ │ ├── avatar.json.jbuilder │ │ │ │ └── update.json.jbuilder │ │ │ └── models │ │ │ │ ├── _dashboard_app.json.jbuilder │ │ │ │ ├── _contact_inbox.json.jbuilder │ │ │ │ ├── _portal_config.json.jbuilder │ │ │ │ ├── _custom_filter.json.jbuilder │ │ │ │ └── _inbox_slim.json.jbuilder │ │ └── v2 │ │ │ └── accounts │ │ │ └── reports │ │ │ └── conversation_traffic.erb │ ├── platform │ │ └── api │ │ │ └── v1 │ │ │ ├── users │ │ │ ├── show.json.jbuilder │ │ │ ├── create.json.jbuilder │ │ │ └── update.json.jbuilder │ │ │ ├── accounts │ │ │ ├── show.json.jbuilder │ │ │ ├── create.json.jbuilder │ │ │ └── update.json.jbuilder │ │ │ ├── agent_bots │ │ │ ├── show.json.jbuilder │ │ │ ├── avatar.json.jbuilder │ │ │ ├── create.json.jbuilder │ │ │ ├── update.json.jbuilder │ │ │ └── index.json.jbuilder │ │ │ └── models │ │ │ └── _agent_bot.json.jbuilder │ ├── public │ │ └── api │ │ │ └── v1 │ │ │ ├── portals │ │ │ ├── show.json.jbuilder │ │ │ ├── articles │ │ │ │ └── show.json.jbuilder │ │ │ ├── categories │ │ │ │ ├── show.json.jbuilder │ │ │ │ └── index.json.jbuilder │ │ │ └── index.json.jbuilder │ │ │ ├── csat_survey │ │ │ ├── show.json.jbuilder │ │ │ └── update.json.jbuilder │ │ │ ├── inboxes │ │ │ ├── messages │ │ │ │ ├── create.json.jbuilder │ │ │ │ ├── update.json.jbuilder │ │ │ │ └── index.json.jbuilder │ │ │ ├── conversations │ │ │ │ ├── create.json.jbuilder │ │ │ │ ├── show.json.jbuilder │ │ │ │ ├── toggle_status.json.jbuilder │ │ │ │ └── index.json.jbuilder │ │ │ ├── contacts │ │ │ │ ├── create.json.jbuilder │ │ │ │ ├── show.json.jbuilder │ │ │ │ └── update.json.jbuilder │ │ │ └── show.json.jbuilder │ │ │ └── models │ │ │ ├── hc │ │ │ └── _author.json.jbuilder │ │ │ ├── _contact.json.jbuilder │ │ │ └── _associated_category.json.jbuilder │ ├── devise │ │ ├── _auth.json.jbuilder │ │ ├── mailer │ │ │ └── password_change.html.erb │ │ └── token.json.jbuilder │ ├── microsoft │ │ └── identity_association.json.jbuilder │ ├── icons │ │ ├── _chevron-down.html.erb │ │ └── _check-mark.html.erb │ └── mailers │ │ └── team_notifications │ │ └── automation_notification_mailer │ │ ├── message_created.liquid │ │ ├── conversation_updated.liquid │ │ └── conversation_creation.liquid ├── helpers │ ├── home_helper.rb │ ├── api │ │ ├── base_helper.rb │ │ └── v1 │ │ │ ├── agents_helper.rb │ │ │ ├── conversations_helper.rb │ │ │ ├── canned_responses_helper.rb │ │ │ └── widget │ │ │ └── messages_helper.rb │ └── frontend_urls_helper.rb ├── javascript │ ├── dashboard │ │ ├── assets │ │ │ ├── scss │ │ │ │ ├── app.scss │ │ │ │ └── views │ │ │ │ │ └── settings │ │ │ │ │ ├── inbox.scss │ │ │ │ │ └── integrations.scss │ │ │ ├── audio │ │ │ │ ├── ring.mp3 │ │ │ │ └── calling.mp3 │ │ │ └── images │ │ │ │ ├── Mask.png │ │ │ │ ├── typing.gif │ │ │ │ ├── bottom-nav.png │ │ │ │ ├── chatwoot_bot.png │ │ │ │ ├── no_page_image.png │ │ │ │ └── channels │ │ │ │ └── facebook_login.png │ │ ├── components │ │ │ ├── widgets │ │ │ │ └── conversation │ │ │ │ │ ├── ChatFilter.vue │ │ │ │ │ └── linear │ │ │ │ │ └── validations.js │ │ │ └── layout │ │ │ │ └── config │ │ │ │ └── sidebarItems │ │ │ │ ├── notifications.js │ │ │ │ └── profileSettings.js │ │ ├── i18n │ │ │ └── locale │ │ │ │ ├── ko │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── ja │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── fa │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── he │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── ro │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── th │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── vi │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── zh_CN │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── zh_TW │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── am │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── ar │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── az │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── bg │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── ca │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── cs │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── el │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── en │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── fi │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── hi │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── hr │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── hu │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── hy │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── id │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── is │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── it │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── ka │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── lt │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── lv │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── ms │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── ne │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── nl │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── pl │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── ru │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── sh │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── sk │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── sq │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── ta │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── tl │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── tr │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── uk │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── ur │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── ur_IN │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── zh │ │ │ │ └── webhooks.json │ │ │ │ ├── da │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── de │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── es │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── fr │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── ml │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── no │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── pt │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── sl │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── sr │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ ├── sv │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ │ │ └── pt_BR │ │ │ │ ├── webhooks.json │ │ │ │ └── emoji.json │ │ ├── store │ │ │ ├── modules │ │ │ │ └── specs │ │ │ │ │ ├── draftMessages │ │ │ │ │ └── fixtures.js │ │ │ │ │ └── bulkActions │ │ │ │ │ └── fixtures.js │ │ │ └── captain │ │ │ │ ├── document.js │ │ │ │ └── assistant.js │ │ ├── components-next │ │ │ └── dropdown-menu │ │ │ │ └── base │ │ │ │ └── DropdownSeparator.vue │ │ ├── constants │ │ │ ├── installationTypes.js │ │ │ └── appEvents.js │ │ ├── helper │ │ │ └── CacheHelper │ │ │ │ └── version.js │ │ ├── routes │ │ │ └── dashboard │ │ │ │ └── settings │ │ │ │ └── helper │ │ │ │ └── settingsHelper.js │ │ └── api │ │ │ ├── sla.js │ │ │ ├── webhooks.js │ │ │ ├── campaigns.js │ │ │ ├── customRole.js │ │ │ ├── agentBots.js │ │ │ ├── channel │ │ │ └── webChannel.js │ │ │ └── bulkActions.js │ ├── widget │ │ ├── constants │ │ │ └── errorTypes.js │ │ ├── assets │ │ │ ├── scss │ │ │ │ └── _utilities.scss │ │ │ └── images │ │ │ │ ├── send.png │ │ │ │ ├── typing.gif │ │ │ │ └── defaultUser.png │ │ └── helpers │ │ │ └── WidgetAudioNotificationHelper.js │ ├── entrypoints │ │ └── superadmin.js │ ├── shared │ │ ├── helpers │ │ │ ├── mitt.js │ │ │ └── specs │ │ │ │ └── Emoji.spec.js │ │ ├── constants │ │ │ ├── contentType.js │ │ │ ├── sharedFrameEvents.js │ │ │ └── campaign.js │ │ ├── assets │ │ │ ├── audio │ │ │ │ ├── bell.mp3 │ │ │ │ └── ding.mp3 │ │ │ ├── fonts │ │ │ │ ├── Inter │ │ │ │ │ ├── Inter-Bold.woff2 │ │ │ │ │ ├── Inter-Thin.woff2 │ │ │ │ │ ├── Inter-Black.woff2 │ │ │ │ │ ├── Inter-Italic.woff2 │ │ │ │ │ ├── Inter-Light.woff2 │ │ │ │ │ ├── Inter-Medium.woff2 │ │ │ │ │ ├── Inter-Regular.woff2 │ │ │ │ │ ├── Inter-ExtraBold.woff2 │ │ │ │ │ ├── Inter-SemiBold.woff2 │ │ │ │ │ ├── Inter-BlackItalic.woff2 │ │ │ │ │ ├── Inter-BoldItalic.woff2 │ │ │ │ │ ├── Inter-ExtraLight.woff2 │ │ │ │ │ ├── Inter-LightItalic.woff2 │ │ │ │ │ ├── Inter-MediumItalic.woff2 │ │ │ │ │ ├── Inter-ThinItalic.woff2 │ │ │ │ │ ├── Inter-SemiBoldItalic.woff2 │ │ │ │ │ ├── Inter-ExtraBoldItalic.woff2 │ │ │ │ │ └── Inter-ExtraLightItalic.woff2 │ │ │ │ └── InterDisplay │ │ │ │ │ ├── InterDisplay-Black.woff2 │ │ │ │ │ ├── InterDisplay-Bold.woff2 │ │ │ │ │ ├── InterDisplay-Light.woff2 │ │ │ │ │ ├── InterDisplay-Thin.woff2 │ │ │ │ │ ├── InterDisplay-Italic.woff2 │ │ │ │ │ ├── InterDisplay-Medium.woff2 │ │ │ │ │ ├── InterDisplay-Regular.woff2 │ │ │ │ │ ├── InterDisplay-SemiBold.woff2 │ │ │ │ │ ├── InterDisplay-BoldItalic.woff2 │ │ │ │ │ ├── InterDisplay-ExtraBold.woff2 │ │ │ │ │ ├── InterDisplay-ExtraLight.woff2 │ │ │ │ │ ├── InterDisplay-ThinItalic.woff2 │ │ │ │ │ ├── InterDisplay-BlackItalic.woff2 │ │ │ │ │ ├── InterDisplay-LightItalic.woff2 │ │ │ │ │ ├── InterDisplay-MediumItalic.woff2 │ │ │ │ │ ├── InterDisplay-ExtraBoldItalic.woff2 │ │ │ │ │ ├── InterDisplay-SemiBoldItalic.woff2 │ │ │ │ │ └── InterDisplay-ExtraLightItalic.woff2 │ │ │ └── stylesheets │ │ │ │ └── font-weights.scss │ │ ├── mixins │ │ │ └── specs │ │ │ │ └── MockComponent.vue │ │ └── components │ │ │ └── specs │ │ │ └── __snapshots__ │ │ │ └── Spinner.spec.js.snap │ ├── design-system │ │ └── images │ │ │ ├── logo.png │ │ │ └── logo-dark.png │ ├── superadmin_pages │ │ └── components │ │ │ └── playground │ │ │ └── assets │ │ │ └── typing.gif │ ├── sdk │ │ └── constants.js │ ├── survey │ │ ├── helpers │ │ │ └── axios.js │ │ └── store │ │ │ └── index.js │ └── v3 │ │ ├── api │ │ ├── apiClient.js │ │ └── testimonials.js │ │ └── store │ │ └── index.js ├── jobs │ ├── agent_bots │ │ └── webhook_job.rb │ ├── campaigns │ │ └── trigger_oneoff_campaign_job.rb │ ├── channels │ │ ├── notifica_me │ │ │ └── templates_sync_job.rb │ │ └── whatsapp │ │ │ └── templates_sync_job.rb │ ├── internal │ │ └── seed_account_job.rb │ ├── conversations │ │ └── activity_message_job.rb │ ├── event_dispatcher_job.rb │ └── notification │ │ └── push_notification_job.rb ├── drops │ ├── inbox_drop.rb │ ├── account_drop.rb │ └── base_drop.rb ├── mailboxes │ └── default_mailbox.rb ├── channels │ └── application_cable │ │ ├── channel.rb │ │ └── connection.rb ├── fields │ ├── secret_field.rb │ ├── count_field.rb │ └── enterprise │ │ └── account_features_field.rb ├── policies │ ├── conversation_policy.rb │ └── report_policy.rb ├── services │ ├── whatsapp │ │ ├── incoming_message_unoapi_service.rb │ │ └── incoming_message_service.rb │ └── llm_formatter │ │ └── default_llm_formatter.rb ├── presenters │ └── agent_bot_presenter.rb └── dispatchers │ └── base_dispatcher.rb ├── .browserslistrc ├── public ├── apple-touch-icon.png ├── apple-touch-icon-precomposed.png ├── apple-icon.png ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon-96x96.png ├── ms-icon-70x70.png ├── apple-icon-57x57.png ├── apple-icon-60x60.png ├── apple-icon-72x72.png ├── apple-icon-76x76.png ├── favicon-512x512.png ├── ms-icon-144x144.png ├── ms-icon-150x150.png ├── ms-icon-310x310.png ├── android-icon-36x36.png ├── android-icon-48x48.png ├── android-icon-72x72.png ├── android-icon-96x96.png ├── apple-icon-114x114.png ├── apple-icon-120x120.png ├── apple-icon-144x144.png ├── apple-icon-152x152.png ├── apple-icon-180x180.png ├── audio │ ├── widget │ │ └── ding.mp3 │ └── dashboard │ │ ├── bell.mp3 │ │ ├── chime.mp3 │ │ ├── ding.mp3 │ │ ├── magic.mp3 │ │ └── ping.mp3 ├── favicon-badge-16x16.png ├── favicon-badge-32x32.png ├── favicon-badge-96x96.png ├── android-icon-144x144.png ├── android-icon-192x192.png ├── assets │ ├── images │ │ ├── typing.gif │ │ ├── chatwoot_bot.png │ │ ├── dashboard │ │ │ ├── channels │ │ │ │ ├── api.png │ │ │ │ ├── sms.png │ │ │ │ ├── email.png │ │ │ │ ├── google.png │ │ │ │ ├── line.png │ │ │ │ ├── twilio.png │ │ │ │ ├── facebook.png │ │ │ │ ├── telegram.png │ │ │ │ ├── twitter.png │ │ │ │ ├── website.png │ │ │ │ ├── whatsapp.png │ │ │ │ ├── microsoft.png │ │ │ │ └── notifica_me.png │ │ │ └── editor │ │ │ │ ├── cmd-editor.png │ │ │ │ └── enter-editor.png │ │ └── hc │ │ │ ├── grid.svg │ │ │ └── grid_dark.svg │ └── administrate │ │ ├── bot │ │ └── avatar.png │ │ └── user │ │ └── avatar.png ├── apple-icon-precomposed.png ├── integrations │ ├── slack │ │ ├── bot.png │ │ ├── user.png │ │ ├── contact.png │ │ └── system.png │ └── channels │ │ └── badges │ │ ├── line.png │ │ ├── sms.png │ │ ├── messenger.png │ │ ├── telegram.png │ │ ├── twitter-dm.png │ │ ├── whatsapp.png │ │ ├── instagram-dm.png │ │ ├── notifica_me.png │ │ └── twitter-tweet.png ├── dashboard │ └── images │ │ ├── agent-bots │ │ └── csml.png │ │ ├── integrations │ │ ├── dyte.png │ │ ├── linear.png │ │ ├── openai.png │ │ ├── slack.png │ │ ├── captain.png │ │ ├── dyte-dark.png │ │ ├── webhook.png │ │ ├── dialogflow.png │ │ ├── linear-dark.png │ │ ├── openai-dark.png │ │ ├── slack-dark.png │ │ ├── captain-dark.png │ │ ├── dashboard_apps.png │ │ ├── webhook-dark.png │ │ ├── dialogflow-dark.png │ │ ├── google_translate.png │ │ ├── dashboard_apps-dark.png │ │ └── google_translate-dark.png │ │ └── onboarding │ │ ├── labels.png │ │ ├── teams.png │ │ ├── canned-responses.png │ │ └── omnichannel-inbox.png └── robots.txt ├── .rspec ├── __mocks__ └── fileMock.js ├── enterprise ├── lib │ └── enterprise.rb ├── app │ ├── views │ │ ├── enterprise │ │ │ └── api │ │ │ │ └── v1 │ │ │ │ └── accounts │ │ │ │ └── partials │ │ │ │ └── _account.json.jbuilder │ │ └── api │ │ │ └── v1 │ │ │ ├── accounts │ │ │ ├── captain │ │ │ │ ├── documents │ │ │ │ │ ├── show.json.jbuilder │ │ │ │ │ └── create.json.jbuilder │ │ │ │ ├── inboxes │ │ │ │ │ └── create.json.jbuilder │ │ │ │ ├── assistants │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ ├── show.json.jbuilder │ │ │ │ │ └── update.json.jbuilder │ │ │ │ ├── assistant_responses │ │ │ │ │ ├── show.json.jbuilder │ │ │ │ │ ├── create.json.jbuilder │ │ │ │ │ └── update.json.jbuilder │ │ │ │ └── bulk_actions │ │ │ │ │ └── create.json.jbuilder │ │ │ ├── custom_roles │ │ │ │ ├── create.json.jbuilder │ │ │ │ ├── show.json.jbuilder │ │ │ │ ├── update.json.jbuilder │ │ │ │ └── index.json.jbuilder │ │ │ ├── sla_policies │ │ │ │ ├── create.json.jbuilder │ │ │ │ ├── show.json.jbuilder │ │ │ │ ├── update.json.jbuilder │ │ │ │ └── index.json.jbuilder │ │ │ └── applied_slas │ │ │ │ └── metrics.json.jbuilder │ │ │ └── models │ │ │ ├── _account_user.json.jbuilder │ │ │ └── _sla_event.json.jbuilder │ ├── models │ │ └── enterprise │ │ │ ├── conversation.rb │ │ │ ├── application_record.rb │ │ │ ├── audit │ │ │ ├── macro.rb │ │ │ ├── team.rb │ │ │ ├── webhook.rb │ │ │ ├── automation_rule.rb │ │ │ ├── inbox.rb │ │ │ └── account.rb │ │ │ ├── account_user.rb │ │ │ ├── concerns │ │ │ └── account_user.rb │ │ │ └── automation_rule.rb │ ├── controllers │ │ └── api │ │ │ └── v1 │ │ │ └── accounts │ │ │ └── enterprise_accounts_controller.rb │ ├── dispatchers │ │ └── enterprise │ │ │ └── async_dispatcher.rb │ ├── policies │ │ └── enterprise │ │ │ └── report_policy.rb │ ├── drops │ │ └── sla_policy_drop.rb │ ├── jobs │ │ ├── portal │ │ │ └── article_indexing_job.rb │ │ └── sla │ │ │ └── process_applied_sla_job.rb │ └── finders │ │ └── enterprise │ │ └── conversation_finder.rb └── config │ └── premium_features.yml ├── clevercloud └── ruby.json ├── .husky └── pre-push ├── .github ├── dashboard-screen.png ├── CODEOWNERS └── FUNDING.yml ├── config ├── initializers │ ├── 00_init.rb │ ├── stripe.rb │ ├── active_record_query_trace.rb │ ├── custom_error_codes.rb │ ├── datadog.rb │ ├── audited.rb │ ├── mime_types.rb │ ├── session_store.rb │ ├── liquid_handler.rb │ ├── event_handlers.rb │ ├── rack_profiler.rb │ ├── omniauth.rb │ └── rack_timeout.rb ├── spring.rb ├── environment.rb ├── app.yml └── boot.rb ├── swagger ├── definitions │ ├── resource │ │ ├── extension │ │ │ ├── generic.yml │ │ │ ├── conversation │ │ │ │ ├── with_display_id.yml │ │ │ │ ├── show.yml │ │ │ │ └── labels.yml │ │ │ ├── message │ │ │ │ └── with_source_sender.yml │ │ │ └── contact │ │ │ │ └── labels.yml │ │ ├── contact_inboxes.yml │ │ ├── contactable_inboxes.yml │ │ └── platform_account.yml │ ├── request │ │ ├── account │ │ │ └── create_update_payload.yml │ │ ├── public │ │ │ ├── message │ │ │ │ └── update_payload.yml │ │ │ └── conversation │ │ │ │ └── create_payload.yml │ │ └── integrations │ │ │ └── hook_update_payload.yml │ └── error │ │ ├── request.yml │ │ └── bad_request.yml └── parameters │ ├── inbox_id.yml │ ├── page.yml │ ├── portal_id.yml │ ├── team_id.yml │ ├── account_id.yml │ ├── agent_bot_id.yml │ ├── message_id.yml │ ├── webhook_id.yml │ ├── hook_id.yml │ ├── platform_user_id.yml │ ├── conversation_id.yml │ ├── conversation_uuid.yml │ ├── custom_filter_id.yml │ ├── public │ ├── inbox_identifier.yml │ └── contact_identifier.yml │ └── report_type.yml ├── .vscode └── settings.json ├── bin ├── rake └── rails ├── .prettierrc ├── deployment └── chatwoot.target ├── workbox-config.js ├── .bundler-audit.yml ├── Procfile.test ├── config.ru ├── semantic.yml ├── Procfile.dev ├── db └── migrate │ ├── 20231013072802_add_icon_to_categories.rb │ ├── 20250207040150_add_meta_to_attachment.rb │ ├── 20230614044633_add_sender_name_to_in.rb │ ├── 20240215065844_add_meta_to_notifications.rb │ ├── 20230620132319_add_sla_policy_to_conversations.rb │ ├── 20230706090122_sentiment_column_to_messages.rb │ ├── 20230714054138_add_api_key_sid_to_twilio_sms.rb │ ├── 20231011041615_ensure_message_private_not_null.rb │ ├── 20240124054340_add_contact_type_to_contacts.rb │ ├── 20240528173755_alter_message_source_id_length.rb │ ├── 20231129091149_add_snoozed_until_to_notifications.rb │ ├── 20250105005821_remove_not_null_from_captain_documents.rb │ ├── 20230525085402_add_custom_sender_name_toggle.rb │ ├── 20230510113208_set_default_empty_string_for_contact_name.rb │ ├── 20250107030743_add_config_to_captain_assistant.rb │ ├── 20231201014644_remove_notifications_with_message_primary_actor.rb │ ├── 20250108211541_remove_index_from_captain_assistants.rb │ ├── 20230608040738_add_processed_message_content_to_messages.rb │ ├── 20240131040316_remove_imap_inbox_syned_at_from_channel_email.rb │ ├── 20240213131252_add_blocked_to_contacts.rb │ └── 20230620212340_add_waiting_since_to_conversations.rb ├── Procfile ├── docker ├── dockerfiles │ ├── vite.Dockerfile │ └── rails.Dockerfile └── entrypoints │ └── vite.sh ├── CONTRIBUTING.md ├── Rakefile └── .dockerignore /.nvmrc: -------------------------------------------------------------------------------- 1 | 20.5.1 -------------------------------------------------------------------------------- /log/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tmp/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /lib/assets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /lib/tasks/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /spec/mailers/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /spec/models/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vendor/db/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.ruby-version: -------------------------------------------------------------------------------- 1 | 3.3.3 2 | -------------------------------------------------------------------------------- /.slugignore: -------------------------------------------------------------------------------- 1 | /spec 2 | -------------------------------------------------------------------------------- /VERSION_CW: -------------------------------------------------------------------------------- 1 | 3.13.0 2 | -------------------------------------------------------------------------------- /VERSION_CWCTL: -------------------------------------------------------------------------------- 1 | 3.2.0 2 | -------------------------------------------------------------------------------- /app/assets/images/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /spec/controllers/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /spec/fixtures/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /spec/integration/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.browserslistrc: -------------------------------------------------------------------------------- 1 | defaults 2 | -------------------------------------------------------------------------------- /app/models/concerns/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/apple-touch-icon.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /spec/assets/attachment.pdf: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /spec/fixtures/files/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.rspec: -------------------------------------------------------------------------------- 1 | --require spec_helper 2 | -------------------------------------------------------------------------------- /app/controllers/concerns/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vendor/assets/javascripts/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vendor/assets/stylesheets/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/views/dashboard/index.html.erb: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/apple-touch-icon-precomposed.png: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /__mocks__/fileMock.js: -------------------------------------------------------------------------------- 1 | module.exports = ''; 2 | -------------------------------------------------------------------------------- /app/helpers/home_helper.rb: -------------------------------------------------------------------------------- 1 | module HomeHelper 2 | end 3 | -------------------------------------------------------------------------------- /enterprise/lib/enterprise.rb: -------------------------------------------------------------------------------- 1 | module Enterprise 2 | end 3 | -------------------------------------------------------------------------------- /app/helpers/api/base_helper.rb: -------------------------------------------------------------------------------- 1 | module Api::BaseHelper 2 | end 3 | -------------------------------------------------------------------------------- /app/javascript/dashboard/assets/scss/app.scss: -------------------------------------------------------------------------------- 1 | @import 'woot'; 2 | -------------------------------------------------------------------------------- /app/views/fields/count_field/_index.html.erb: -------------------------------------------------------------------------------- 1 | <%= field.to_s %> 2 | -------------------------------------------------------------------------------- /app/views/fields/count_field/_show.html.erb: -------------------------------------------------------------------------------- 1 | <%= field.to_s %> 2 | -------------------------------------------------------------------------------- /app/helpers/api/v1/agents_helper.rb: -------------------------------------------------------------------------------- 1 | module Api::V1::AgentsHelper 2 | end 3 | -------------------------------------------------------------------------------- /app/views/fields/account_limits_field/_index.html.erb: -------------------------------------------------------------------------------- 1 | <%= field.to_s %> 2 | -------------------------------------------------------------------------------- /app/javascript/dashboard/assets/scss/views/settings/inbox.scss: -------------------------------------------------------------------------------- 1 | // to be removed 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/contacts/labels/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload @labels 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/contacts/labels/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload @labels 2 | -------------------------------------------------------------------------------- /clevercloud/ruby.json: -------------------------------------------------------------------------------- 1 | { 2 | "deploy": { 3 | "sidekiq": true 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /spec/fixtures/data_import/with_emoji.csv: -------------------------------------------------------------------------------- 1 | phone_number,name 2 | +123456,T 🏠 🔥 Test 3 | -------------------------------------------------------------------------------- /app/helpers/api/v1/conversations_helper.rb: -------------------------------------------------------------------------------- 1 | module Api::V1::ConversationsHelper 2 | end 3 | -------------------------------------------------------------------------------- /app/javascript/dashboard/assets/scss/views/settings/integrations.scss: -------------------------------------------------------------------------------- 1 | // to be removed 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/conversations/labels/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload @labels 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/conversations/labels/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload @labels 2 | -------------------------------------------------------------------------------- /app/views/api/v1/widget/messages/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.contact @contact if @contact 2 | -------------------------------------------------------------------------------- /.husky/pre-push: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | sh bin/validate_push 5 | -------------------------------------------------------------------------------- /app/helpers/api/v1/canned_responses_helper.rb: -------------------------------------------------------------------------------- 1 | module Api::V1::CannedResponsesHelper 2 | end 3 | -------------------------------------------------------------------------------- /app/helpers/api/v1/widget/messages_helper.rb: -------------------------------------------------------------------------------- 1 | module Api::V1::Widget::MessagesHelper 2 | end 3 | -------------------------------------------------------------------------------- /app/javascript/widget/constants/errorTypes.js: -------------------------------------------------------------------------------- 1 | export const SET_USER_ERROR = 'SET_USER_ERROR'; 2 | -------------------------------------------------------------------------------- /public/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/apple-icon.png -------------------------------------------------------------------------------- /spec/assets/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/spec/assets/avatar.png -------------------------------------------------------------------------------- /spec/assets/sample.mov: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/spec/assets/sample.mov -------------------------------------------------------------------------------- /spec/assets/sample.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/spec/assets/sample.mp3 -------------------------------------------------------------------------------- /spec/assets/sample.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/spec/assets/sample.mp4 -------------------------------------------------------------------------------- /spec/assets/sample.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/spec/assets/sample.ogg -------------------------------------------------------------------------------- /spec/assets/sample.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/spec/assets/sample.pdf -------------------------------------------------------------------------------- /spec/assets/sample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/spec/assets/sample.png -------------------------------------------------------------------------------- /app/javascript/entrypoints/superadmin.js: -------------------------------------------------------------------------------- 1 | import '../dashboard/assets/scss/super_admin/index.scss'; 2 | -------------------------------------------------------------------------------- /app/javascript/widget/assets/scss/_utilities.scss: -------------------------------------------------------------------------------- 1 | .icon-button { 2 | @include button-size; 3 | } 4 | -------------------------------------------------------------------------------- /public/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/favicon-32x32.png -------------------------------------------------------------------------------- /public/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/favicon-96x96.png -------------------------------------------------------------------------------- /public/ms-icon-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/ms-icon-70x70.png -------------------------------------------------------------------------------- /app/jobs/agent_bots/webhook_job.rb: -------------------------------------------------------------------------------- 1 | class AgentBots::WebhookJob < WebhookJob 2 | queue_as :high 3 | end 4 | -------------------------------------------------------------------------------- /app/models/kbase.rb: -------------------------------------------------------------------------------- 1 | module Kbase 2 | def self.table_name_prefix 3 | 'kbase_' 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /public/apple-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/apple-icon-57x57.png -------------------------------------------------------------------------------- /public/apple-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/apple-icon-60x60.png -------------------------------------------------------------------------------- /public/apple-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/apple-icon-72x72.png -------------------------------------------------------------------------------- /public/apple-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/apple-icon-76x76.png -------------------------------------------------------------------------------- /public/favicon-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/favicon-512x512.png -------------------------------------------------------------------------------- /public/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/ms-icon-144x144.png -------------------------------------------------------------------------------- /public/ms-icon-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/ms-icon-150x150.png -------------------------------------------------------------------------------- /public/ms-icon-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/ms-icon-310x310.png -------------------------------------------------------------------------------- /.github/dashboard-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/.github/dashboard-screen.png -------------------------------------------------------------------------------- /app/drops/inbox_drop.rb: -------------------------------------------------------------------------------- 1 | class InboxDrop < BaseDrop 2 | def name 3 | @obj.try(:name) 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/components/widgets/conversation/ChatFilter.vue: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/mailboxes/default_mailbox.rb: -------------------------------------------------------------------------------- 1 | class DefaultMailbox < ApplicationMailbox 2 | def process; end 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/portals/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'portal', portal: @portal, articles: [] 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/portals/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'portal', portal: @portal, articles: [] 2 | -------------------------------------------------------------------------------- /app/views/fields/avatar_field/_index.html.erb: -------------------------------------------------------------------------------- 1 | <%= image_tag field.avatar_url if field.avatar_url.present? %> 2 | -------------------------------------------------------------------------------- /app/views/fields/avatar_field/_show.html.erb: -------------------------------------------------------------------------------- 1 | <%= image_tag field.avatar_url if field.avatar_url.present? %> 2 | -------------------------------------------------------------------------------- /config/initializers/00_init.rb: -------------------------------------------------------------------------------- 1 | APPS_CONFIG = YAML.load_file(Rails.root.join('config/integration/apps.yml')) 2 | -------------------------------------------------------------------------------- /config/initializers/stripe.rb: -------------------------------------------------------------------------------- 1 | require 'stripe' 2 | 3 | Stripe.api_key = ENV.fetch('STRIPE_SECRET_KEY', nil) 4 | -------------------------------------------------------------------------------- /public/android-icon-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/android-icon-36x36.png -------------------------------------------------------------------------------- /public/android-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/android-icon-48x48.png -------------------------------------------------------------------------------- /public/android-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/android-icon-72x72.png -------------------------------------------------------------------------------- /public/android-icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/android-icon-96x96.png -------------------------------------------------------------------------------- /public/apple-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/apple-icon-114x114.png -------------------------------------------------------------------------------- /public/apple-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/apple-icon-120x120.png -------------------------------------------------------------------------------- /public/apple-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/apple-icon-144x144.png -------------------------------------------------------------------------------- /public/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/apple-icon-152x152.png -------------------------------------------------------------------------------- /public/apple-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/apple-icon-180x180.png -------------------------------------------------------------------------------- /public/audio/widget/ding.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/audio/widget/ding.mp3 -------------------------------------------------------------------------------- /public/favicon-badge-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/favicon-badge-16x16.png -------------------------------------------------------------------------------- /public/favicon-badge-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/favicon-badge-32x32.png -------------------------------------------------------------------------------- /public/favicon-badge-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/favicon-badge-96x96.png -------------------------------------------------------------------------------- /swagger/definitions/resource/extension/generic.yml: -------------------------------------------------------------------------------- 1 | type: object 2 | properties: 3 | id: 4 | type: number -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.words": [ 3 | "chatwoot", 4 | "dompurify" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /app/assets/stylesheets/administrate/utilities/_text-color.scss: -------------------------------------------------------------------------------- 1 | .text-color-red { 2 | color: $alert-color; 3 | } 4 | -------------------------------------------------------------------------------- /app/channels/application_cable/channel.rb: -------------------------------------------------------------------------------- 1 | class ApplicationCable::Channel < ActionCable::Channel::Base 2 | end 3 | -------------------------------------------------------------------------------- /app/drops/account_drop.rb: -------------------------------------------------------------------------------- 1 | class AccountDrop < BaseDrop 2 | def name 3 | @obj.try(:name) 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/javascript/shared/helpers/mitt.js: -------------------------------------------------------------------------------- 1 | import mitt from 'mitt'; 2 | const emitter = mitt(); 3 | export { emitter }; 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/portals/add_members.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'portal', portal: @portal, articles: [] 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/portals/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'portal', portal: @portal, articles: @articles 2 | -------------------------------------------------------------------------------- /app/views/api/v1/profiles/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/user', formats: [:json], resource: @user 2 | -------------------------------------------------------------------------------- /bin/rake: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | require_relative '../config/boot' 3 | require 'rake' 4 | Rake.application.run 5 | -------------------------------------------------------------------------------- /config/initializers/active_record_query_trace.rb: -------------------------------------------------------------------------------- 1 | ActiveRecordQueryTrace.enabled = true if Rails.env.development? 2 | -------------------------------------------------------------------------------- /public/android-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/android-icon-144x144.png -------------------------------------------------------------------------------- /public/android-icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/android-icon-192x192.png -------------------------------------------------------------------------------- /public/assets/images/typing.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/assets/images/typing.gif -------------------------------------------------------------------------------- /public/audio/dashboard/bell.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/audio/dashboard/bell.mp3 -------------------------------------------------------------------------------- /public/audio/dashboard/chime.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/audio/dashboard/chime.mp3 -------------------------------------------------------------------------------- /public/audio/dashboard/ding.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/audio/dashboard/ding.mp3 -------------------------------------------------------------------------------- /public/audio/dashboard/magic.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/audio/dashboard/magic.mp3 -------------------------------------------------------------------------------- /public/audio/dashboard/ping.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/audio/dashboard/ping.mp3 -------------------------------------------------------------------------------- /app/channels/application_cable/connection.rb: -------------------------------------------------------------------------------- 1 | class ApplicationCable::Connection < ActionCable::Connection::Base 2 | end 3 | -------------------------------------------------------------------------------- /app/views/api/v1/profiles/auto_offline.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/user', formats: [:json], resource: @user 2 | -------------------------------------------------------------------------------- /app/views/api/v1/profiles/availability.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/user', formats: [:json], resource: @user 2 | -------------------------------------------------------------------------------- /app/views/api/v1/profiles/avatar.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/user', formats: [:json], resource: @user 2 | -------------------------------------------------------------------------------- /app/views/api/v1/profiles/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/user', formats: [:json], resource: @user 2 | -------------------------------------------------------------------------------- /public/apple-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/apple-icon-precomposed.png -------------------------------------------------------------------------------- /public/integrations/slack/bot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/integrations/slack/bot.png -------------------------------------------------------------------------------- /public/integrations/slack/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/integrations/slack/user.png -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ko/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "웹훅 설정" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/shared/constants/contentType.js: -------------------------------------------------------------------------------- 1 | export const CONTENT_TYPES = { 2 | INCOMING_EMAIL: 'incoming_email', 3 | }; 4 | -------------------------------------------------------------------------------- /app/javascript/shared/constants/sharedFrameEvents.js: -------------------------------------------------------------------------------- 1 | export const SDK_SET_BUBBLE_VISIBILITY = 'sdk-set-bubble-visibility'; 2 | -------------------------------------------------------------------------------- /app/models/integrations.rb: -------------------------------------------------------------------------------- 1 | module Integrations 2 | def self.table_name_prefix 3 | 'integrations_' 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/inboxes/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/inbox', formats: [:json], resource: @inbox 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/teams/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/team', formats: [:json], resource: @team 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/teams/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/team', formats: [:json], resource: @team 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/teams/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/team', formats: [:json], resource: @team 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/account', formats: [:json], resource: @account 2 | -------------------------------------------------------------------------------- /public/assets/images/chatwoot_bot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/assets/images/chatwoot_bot.png -------------------------------------------------------------------------------- /public/integrations/slack/contact.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/integrations/slack/contact.png -------------------------------------------------------------------------------- /public/integrations/slack/system.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/integrations/slack/system.png -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | ## All enterprise related files should be reviewed by sojan before merging 2 | /enterprise/* @sojan-official 3 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 80, 3 | "singleQuote": true, 4 | "trailingComma": "es5", 5 | "arrowParens": "avoid" 6 | } 7 | -------------------------------------------------------------------------------- /app/assets/stylesheets/administrate/components/_form-actions.scss: -------------------------------------------------------------------------------- 1 | .form-actions { 2 | margin-left: calc(15% + 1.25rem); 3 | } 4 | -------------------------------------------------------------------------------- /app/fields/secret_field.rb: -------------------------------------------------------------------------------- 1 | require 'administrate/field/base' 2 | 3 | class SecretField < Administrate::Field::String 4 | end 5 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ja/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook設定" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/policies/conversation_policy.rb: -------------------------------------------------------------------------------- 1 | class ConversationPolicy < ApplicationPolicy 2 | def index? 3 | true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/agents/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/agent', formats: [:json], resource: @agent 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/agents/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/agent', formats: [:json], resource: @agent 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/articles/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.partial! 'article', article: @article 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/articles/edit.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.partial! 'article', article: @article 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/articles/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.partial! 'article', article: @article 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/articles/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.partial! 'article', article: @article 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/contacts/notes/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/note', formats: [:json], resource: @note 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/conversations/custom_attributes.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.custom_attributes @conversation.custom_attributes 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/conversations/messages/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/message', message: @message 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/conversations/messages/destroy.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/message', message: @message 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/conversations/messages/retry.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/message', message: @message 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/inboxes/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/inbox', formats: [:json], resource: @inbox 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/inboxes/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/inbox', formats: [:json], resource: @inbox 2 | -------------------------------------------------------------------------------- /app/controllers/twitter/base_controller.rb: -------------------------------------------------------------------------------- 1 | class Twitter::BaseController < ApplicationController 2 | include TwitterConcern 3 | end 4 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/fa/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "تنظیمات وب هوک" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/he/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "הגדרות Webhook" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ro/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Setări Webhook" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/th/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "ตั้งค่า Webhook" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/vi/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Cài đặt Webhook" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/zh_CN/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook设置" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/zh_TW/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook 設定" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/shared/constants/campaign.js: -------------------------------------------------------------------------------- 1 | export const CAMPAIGN_TYPES = { 2 | ONGOING: 'ongoing', 3 | ONE_OFF: 'one_off', 4 | }; 5 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/campaigns/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/campaign', formats: [:json], resource: @campaign 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/campaigns/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/campaign', formats: [:json], resource: @campaign 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/campaigns/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/campaign', formats: [:json], resource: @campaign 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/categories/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.partial! 'category', category: @category 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/categories/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.partial! 'category', category: @category 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/categories/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.partial! 'category', category: @category 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/contacts/notes/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/note', formats: [:json], resource: @note 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/contacts/notes/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/note', formats: [:json], resource: @note 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/integrations/apps/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/app', formats: [:json], resource: @app 2 | -------------------------------------------------------------------------------- /app/views/platform/api/v1/users/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'platform/api/v1/models/user', formats: [:json], resource: @resource 2 | -------------------------------------------------------------------------------- /app/views/public/api/v1/portals/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'public/api/v1/models/hc/portal', formats: [:json], portal: @portal 2 | -------------------------------------------------------------------------------- /config/spring.rb: -------------------------------------------------------------------------------- 1 | Spring.watch( 2 | '.ruby-version', 3 | '.rbenv-vars', 4 | 'tmp/restart.txt', 5 | 'tmp/caching-dev.txt' 6 | ) 7 | -------------------------------------------------------------------------------- /enterprise/app/views/enterprise/api/v1/accounts/partials/_account.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.subscribed_features @account.subscribed_features 2 | -------------------------------------------------------------------------------- /public/assets/administrate/bot/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/assets/administrate/bot/avatar.png -------------------------------------------------------------------------------- /public/assets/administrate/user/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/assets/administrate/user/avatar.png -------------------------------------------------------------------------------- /spec/factories/email_template.rb: -------------------------------------------------------------------------------- 1 | FactoryBot.define do 2 | factory :email_template do 3 | name { 'MyString' } 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /spec/factories/portal_members.rb: -------------------------------------------------------------------------------- 1 | FactoryBot.define do 2 | factory :portal_member do 3 | portal 4 | user 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /swagger/parameters/inbox_id.yml: -------------------------------------------------------------------------------- 1 | in: path 2 | name: inbox_id 3 | type: integer 4 | required: true 5 | description: The ID of the Inbox 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/am/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook Settings" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ar/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "إعدادات الـ Webhook" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/az/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook Settings" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/bg/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook Settings" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ca/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Paràmetres Webhook" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/cs/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Nastavení webhooku" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/el/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Ρυθμίσεις Webhook" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/en/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook Settings" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/fi/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook-asetukset" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/hi/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook Settings" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/hr/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook postavke" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/hu/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook beállítások" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/hy/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook Settings" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/id/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Pengaturan Webhook" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/is/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook Settings" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/it/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Impostazioni Webhook" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ka/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook Settings" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/lt/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook nustatymai" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/lv/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook Iestatījumi" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ms/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook Settings" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ne/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook Settings" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/nl/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook instellingen" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/pl/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Ustawienia webhooka" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ru/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Настройки вебхуков" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/sh/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook Settings" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/sk/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Nastavenia webhooku" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/sq/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook Settings" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ta/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "வெப்ஹூக் அமைப்புகள்" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/tl/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook Settings" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/tr/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook Ayarları" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/uk/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Налаштування вебхука" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ur/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook Settings" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ur_IN/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook Settings" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/zh/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook Settings" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/design-system/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/design-system/images/logo.png -------------------------------------------------------------------------------- /app/javascript/shared/assets/audio/bell.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/audio/bell.mp3 -------------------------------------------------------------------------------- /app/javascript/shared/assets/audio/ding.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/audio/ding.mp3 -------------------------------------------------------------------------------- /app/javascript/widget/assets/images/send.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/widget/assets/images/send.png -------------------------------------------------------------------------------- /app/views/api/v1/accounts/integrations/hooks/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/hook', formats: [:json], resource: @hook 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/integrations/hooks/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/hook', formats: [:json], resource: @hook 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/integrations/linear/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/app', formats: [:json], resource: @hook.app 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/integrations/slack/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/app', formats: [:json], resource: @hook.app 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/integrations/slack/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/app', formats: [:json], resource: @hook.app 2 | -------------------------------------------------------------------------------- /app/views/devise/_auth.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.data do 2 | json.partial! 'api/v1/models/user', formats: [:json], resource: resource 3 | end 4 | -------------------------------------------------------------------------------- /app/views/fields/account_limits_field/_show.html.erb: -------------------------------------------------------------------------------- 1 | <% JSON.parse(field.to_s).each do |k,v| %> 2 | <%= k %>: <%= v %> 3 | <% end %> 4 | -------------------------------------------------------------------------------- /app/views/platform/api/v1/accounts/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'platform/api/v1/models/account', formats: [:json], resource: @resource 2 | -------------------------------------------------------------------------------- /app/views/platform/api/v1/users/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'platform/api/v1/models/user', formats: [:json], resource: @resource 2 | -------------------------------------------------------------------------------- /app/views/platform/api/v1/users/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'platform/api/v1/models/user', formats: [:json], resource: @resource 2 | -------------------------------------------------------------------------------- /deployment/chatwoot.target: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Wants=chatwoot-web.1.service chatwoot-worker.1.service 3 | 4 | [Install] 5 | WantedBy=multi-user.target -------------------------------------------------------------------------------- /public/dashboard/images/agent-bots/csml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/dashboard/images/agent-bots/csml.png -------------------------------------------------------------------------------- /public/dashboard/images/integrations/dyte.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/dashboard/images/integrations/dyte.png -------------------------------------------------------------------------------- /public/dashboard/images/onboarding/labels.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/dashboard/images/onboarding/labels.png -------------------------------------------------------------------------------- /public/dashboard/images/onboarding/teams.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/dashboard/images/onboarding/teams.png -------------------------------------------------------------------------------- /public/integrations/channels/badges/line.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/integrations/channels/badges/line.png -------------------------------------------------------------------------------- /public/integrations/channels/badges/sms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/integrations/channels/badges/sms.png -------------------------------------------------------------------------------- /spec/factories/platform_apps.rb: -------------------------------------------------------------------------------- 1 | FactoryBot.define do 2 | factory :platform_app do 3 | name { Faker::Book.name } 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /spec/fixtures/data_import/invalid_bytes.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/spec/fixtures/data_import/invalid_bytes.csv -------------------------------------------------------------------------------- /swagger/definitions/resource/extension/conversation/with_display_id.yml: -------------------------------------------------------------------------------- 1 | type: object 2 | properties: 3 | display_id: 4 | type: number 5 | -------------------------------------------------------------------------------- /swagger/definitions/resource/extension/message/with_source_sender.yml: -------------------------------------------------------------------------------- 1 | type: object 2 | properties: 3 | source_id: 4 | type: number 5 | -------------------------------------------------------------------------------- /app/javascript/dashboard/assets/audio/ring.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/dashboard/assets/audio/ring.mp3 -------------------------------------------------------------------------------- /app/javascript/dashboard/assets/images/Mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/dashboard/assets/images/Mask.png -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/da/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook Indstillinger" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/de/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook-Einstellungen" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/es/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Configuración del Webhook" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/fr/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Paramètres de Webhook" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ml/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "വെബ്ഹൂക്ക് ക്രമീകരണങ്ങൾ" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/no/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook-innstillinger" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/pt/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Configurações do Webhook" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/sl/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Nastavitve Webhook-ov" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/sr/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Podešavanja veb zakački" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/sv/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Webhook-inställningar" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/widget/assets/images/typing.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/widget/assets/images/typing.gif -------------------------------------------------------------------------------- /app/views/api/v1/accounts/channels/twilio_channels/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/inbox', formats: [:json], resource: @inbox 2 | -------------------------------------------------------------------------------- /app/views/platform/api/v1/accounts/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'platform/api/v1/models/account', formats: [:json], resource: @resource 2 | -------------------------------------------------------------------------------- /app/views/platform/api/v1/accounts/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'platform/api/v1/models/account', formats: [:json], resource: @resource 2 | -------------------------------------------------------------------------------- /app/views/platform/api/v1/agent_bots/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'platform/api/v1/models/agent_bot', formats: [:json], resource: @resource 2 | -------------------------------------------------------------------------------- /app/views/public/api/v1/csat_survey/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'public/api/v1/models/csat_survey', formats: [:json], resource: @message 2 | -------------------------------------------------------------------------------- /app/views/public/api/v1/csat_survey/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'public/api/v1/models/csat_survey', formats: [:json], resource: @message 2 | -------------------------------------------------------------------------------- /app/views/public/api/v1/inboxes/messages/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'public/api/v1/models/message', formats: [:json], resource: @message 2 | -------------------------------------------------------------------------------- /app/views/public/api/v1/inboxes/messages/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'public/api/v1/models/message', formats: [:json], resource: @message 2 | -------------------------------------------------------------------------------- /app/views/public/api/v1/portals/articles/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'public/api/v1/models/article', formats: [:json], article: @article 2 | -------------------------------------------------------------------------------- /public/assets/images/dashboard/channels/api.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/assets/images/dashboard/channels/api.png -------------------------------------------------------------------------------- /public/assets/images/dashboard/channels/sms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/assets/images/dashboard/channels/sms.png -------------------------------------------------------------------------------- /public/dashboard/images/integrations/linear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/dashboard/images/integrations/linear.png -------------------------------------------------------------------------------- /public/dashboard/images/integrations/openai.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/dashboard/images/integrations/openai.png -------------------------------------------------------------------------------- /public/dashboard/images/integrations/slack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/dashboard/images/integrations/slack.png -------------------------------------------------------------------------------- /swagger/parameters/page.yml: -------------------------------------------------------------------------------- 1 | in: query 2 | name: page 3 | type: integer 4 | default: 1 5 | required: false 6 | description: The page parameter 7 | -------------------------------------------------------------------------------- /swagger/parameters/portal_id.yml: -------------------------------------------------------------------------------- 1 | in: path 2 | name: portal_id 3 | type: integer 4 | required: true 5 | description: The numeric ID of the portal 6 | -------------------------------------------------------------------------------- /swagger/parameters/team_id.yml: -------------------------------------------------------------------------------- 1 | in: path 2 | name: team_id 3 | type: integer 4 | required: true 5 | description: The ID of the team to be updated 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/assets/audio/calling.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/dashboard/assets/audio/calling.mp3 -------------------------------------------------------------------------------- /app/javascript/dashboard/assets/images/typing.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/dashboard/assets/images/typing.gif -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/pt_BR/webhooks.json: -------------------------------------------------------------------------------- 1 | { 2 | "WEBHOOKS_SETTINGS": { 3 | "HEADER": "Configurações do Webhook" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/javascript/design-system/images/logo-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/design-system/images/logo-dark.png -------------------------------------------------------------------------------- /app/views/api/v1/accounts/custom_filters/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/custom_filter', formats: [:json], resource: @custom_filter 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/custom_filters/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/custom_filter', formats: [:json], resource: @custom_filter 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/custom_filters/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/custom_filter', formats: [:json], resource: @custom_filter 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/dashboard_apps/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/dashboard_app', formats: [:json], resource: @dashboard_app 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/dashboard_apps/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/dashboard_app', formats: [:json], resource: @dashboard_app 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/dashboard_apps/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/dashboard_app', formats: [:json], resource: @dashboard_app 2 | -------------------------------------------------------------------------------- /app/views/platform/api/v1/agent_bots/avatar.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'platform/api/v1/models/agent_bot', formats: [:json], resource: @resource 2 | -------------------------------------------------------------------------------- /app/views/platform/api/v1/agent_bots/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'platform/api/v1/models/agent_bot', formats: [:json], resource: @resource 2 | -------------------------------------------------------------------------------- /app/views/platform/api/v1/agent_bots/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'platform/api/v1/models/agent_bot', formats: [:json], resource: @resource 2 | -------------------------------------------------------------------------------- /app/views/public/api/v1/portals/categories/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'public/api/v1/models/category', formats: [:json], category: @category 2 | -------------------------------------------------------------------------------- /app/views/public/api/v1/portals/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.array! @portals, partial: 'public/api/v1/models/hc/portal', formats: [:json], as: :portal 2 | -------------------------------------------------------------------------------- /public/assets/images/dashboard/channels/email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/assets/images/dashboard/channels/email.png -------------------------------------------------------------------------------- /public/assets/images/dashboard/channels/google.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/assets/images/dashboard/channels/google.png -------------------------------------------------------------------------------- /public/assets/images/dashboard/channels/line.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/assets/images/dashboard/channels/line.png -------------------------------------------------------------------------------- /public/assets/images/dashboard/channels/twilio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/assets/images/dashboard/channels/twilio.png -------------------------------------------------------------------------------- /public/dashboard/images/integrations/captain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/dashboard/images/integrations/captain.png -------------------------------------------------------------------------------- /public/dashboard/images/integrations/dyte-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/dashboard/images/integrations/dyte-dark.png -------------------------------------------------------------------------------- /public/dashboard/images/integrations/webhook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/dashboard/images/integrations/webhook.png -------------------------------------------------------------------------------- /public/integrations/channels/badges/messenger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/integrations/channels/badges/messenger.png -------------------------------------------------------------------------------- /public/integrations/channels/badges/telegram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/integrations/channels/badges/telegram.png -------------------------------------------------------------------------------- /public/integrations/channels/badges/twitter-dm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/integrations/channels/badges/twitter-dm.png -------------------------------------------------------------------------------- /public/integrations/channels/badges/whatsapp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/integrations/channels/badges/whatsapp.png -------------------------------------------------------------------------------- /swagger/parameters/account_id.yml: -------------------------------------------------------------------------------- 1 | in: path 2 | name: account_id 3 | type: integer 4 | required: true 5 | description: The numeric ID of the account 6 | -------------------------------------------------------------------------------- /swagger/parameters/agent_bot_id.yml: -------------------------------------------------------------------------------- 1 | in: path 2 | name: id 3 | type: integer 4 | required: true 5 | description: The ID of the agentbot to be updated 6 | -------------------------------------------------------------------------------- /swagger/parameters/message_id.yml: -------------------------------------------------------------------------------- 1 | in: path 2 | name: message_id 3 | type: integer 4 | required: true 5 | description: The numeric ID of the message 6 | -------------------------------------------------------------------------------- /swagger/parameters/webhook_id.yml: -------------------------------------------------------------------------------- 1 | in: path 2 | name: webhook_id 3 | type: integer 4 | required: true 5 | description: The numeric ID of the webhook 6 | -------------------------------------------------------------------------------- /workbox-config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | globDirectory: 'public/', 3 | globPatterns: ['**/*.{png,ico}'], 4 | swDest: 'public/sw.js', 5 | }; 6 | -------------------------------------------------------------------------------- /.bundler-audit.yml: -------------------------------------------------------------------------------- 1 | --- 2 | ignore: 3 | - CVE-2021-41098 # https://github.com/chatwoot/chatwoot/issues/3097 (update once azure blob storage is updated) 4 | -------------------------------------------------------------------------------- /app/javascript/dashboard/store/modules/specs/draftMessages/fixtures.js: -------------------------------------------------------------------------------- 1 | export const data = { 'draft-32-REPLY': 'Hey how ', 'draft-31-REPLY': 'Nice' }; 2 | -------------------------------------------------------------------------------- /app/javascript/widget/assets/images/defaultUser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/widget/assets/images/defaultUser.png -------------------------------------------------------------------------------- /app/views/api/v1/accounts/actions/contact_merges/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/contact', formats: [:json], resource: @base_contact 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/macros/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.partial! 'api/v1/models/macro', formats: [:json], macro: @macro 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/macros/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.partial! 'api/v1/models/macro', formats: [:json], macro: @macro 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/macros/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.partial! 'api/v1/models/macro', formats: [:json], macro: @macro 3 | end 4 | -------------------------------------------------------------------------------- /public/assets/images/dashboard/channels/facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/assets/images/dashboard/channels/facebook.png -------------------------------------------------------------------------------- /public/assets/images/dashboard/channels/telegram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/assets/images/dashboard/channels/telegram.png -------------------------------------------------------------------------------- /public/assets/images/dashboard/channels/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/assets/images/dashboard/channels/twitter.png -------------------------------------------------------------------------------- /public/assets/images/dashboard/channels/website.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/assets/images/dashboard/channels/website.png -------------------------------------------------------------------------------- /public/assets/images/dashboard/channels/whatsapp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/assets/images/dashboard/channels/whatsapp.png -------------------------------------------------------------------------------- /public/assets/images/dashboard/editor/cmd-editor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/assets/images/dashboard/editor/cmd-editor.png -------------------------------------------------------------------------------- /public/dashboard/images/integrations/dialogflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/dashboard/images/integrations/dialogflow.png -------------------------------------------------------------------------------- /public/dashboard/images/integrations/linear-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/dashboard/images/integrations/linear-dark.png -------------------------------------------------------------------------------- /public/dashboard/images/integrations/openai-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/dashboard/images/integrations/openai-dark.png -------------------------------------------------------------------------------- /public/dashboard/images/integrations/slack-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/dashboard/images/integrations/slack-dark.png -------------------------------------------------------------------------------- /public/integrations/channels/badges/instagram-dm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/integrations/channels/badges/instagram-dm.png -------------------------------------------------------------------------------- /public/integrations/channels/badges/notifica_me.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/integrations/channels/badges/notifica_me.png -------------------------------------------------------------------------------- /spec/factories/related_categories.rb: -------------------------------------------------------------------------------- 1 | FactoryBot.define do 2 | factory :related_category do 3 | category 4 | related_category 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /swagger/parameters/hook_id.yml: -------------------------------------------------------------------------------- 1 | in: path 2 | name: hook_id 3 | type: integer 4 | required: true 5 | description: The numeric ID of the integration hook 6 | -------------------------------------------------------------------------------- /Procfile.test: -------------------------------------------------------------------------------- 1 | backend: RAILS_ENV=test bin/rails s -p 5050 2 | vite: bin/vite dev 3 | worker: RAILS_ENV=test dotenv bundle exec sidekiq -C config/sidekiq.yml 4 | -------------------------------------------------------------------------------- /app/javascript/dashboard/assets/images/bottom-nav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/dashboard/assets/images/bottom-nav.png -------------------------------------------------------------------------------- /app/javascript/dashboard/assets/images/chatwoot_bot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/dashboard/assets/images/chatwoot_bot.png -------------------------------------------------------------------------------- /app/services/whatsapp/incoming_message_unoapi_service.rb: -------------------------------------------------------------------------------- 1 | class Whatsapp::IncomingMessageUnoapiService < Whatsapp::IncomingMessageWhatsappCloudService 2 | end 3 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/agent_bots/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/agent_bot', formats: [:json], resource: AgentBotPresenter.new(@agent_bot) 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/contacts/contact_inboxes/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/contact_inbox', formats: [:json], resource: @contact_inbox 2 | -------------------------------------------------------------------------------- /app/views/public/api/v1/inboxes/conversations/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'public/api/v1/models/conversation', formats: [:json], resource: @conversation 2 | -------------------------------------------------------------------------------- /app/views/public/api/v1/inboxes/conversations/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'public/api/v1/models/conversation', formats: [:json], resource: @conversation 2 | -------------------------------------------------------------------------------- /config.ru: -------------------------------------------------------------------------------- 1 | # This file is used by Rack-based servers to start the application. 2 | 3 | require_relative 'config/environment' 4 | 5 | run Rails.application 6 | -------------------------------------------------------------------------------- /config/initializers/custom_error_codes.rb: -------------------------------------------------------------------------------- 1 | Rack::Utils::HTTP_STATUS_CODES[901] = 'Trial Expired' 2 | Rack::Utils::HTTP_STATUS_CODES[902] = 'Account Suspended' 3 | -------------------------------------------------------------------------------- /enterprise/app/models/enterprise/conversation.rb: -------------------------------------------------------------------------------- 1 | module Enterprise::Conversation 2 | def list_of_keys 3 | super + %w[sla_policy_id] 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /enterprise/app/views/api/v1/accounts/captain/documents/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/captain/document', formats: [:json], resource: @document 2 | -------------------------------------------------------------------------------- /enterprise/app/views/api/v1/accounts/captain/inboxes/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/inbox', formats: [:json], resource: @captain_inbox.inbox 2 | -------------------------------------------------------------------------------- /enterprise/app/views/api/v1/accounts/custom_roles/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/custom_role', formats: [:json], custom_role: @custom_role 2 | -------------------------------------------------------------------------------- /enterprise/app/views/api/v1/accounts/custom_roles/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/custom_role', formats: [:json], custom_role: @custom_role 2 | -------------------------------------------------------------------------------- /enterprise/app/views/api/v1/accounts/custom_roles/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/custom_role', formats: [:json], custom_role: @custom_role 2 | -------------------------------------------------------------------------------- /public/assets/images/dashboard/channels/microsoft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/assets/images/dashboard/channels/microsoft.png -------------------------------------------------------------------------------- /public/assets/images/dashboard/channels/notifica_me.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/assets/images/dashboard/channels/notifica_me.png -------------------------------------------------------------------------------- /public/assets/images/dashboard/editor/enter-editor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/assets/images/dashboard/editor/enter-editor.png -------------------------------------------------------------------------------- /public/dashboard/images/integrations/captain-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/dashboard/images/integrations/captain-dark.png -------------------------------------------------------------------------------- /public/dashboard/images/integrations/dashboard_apps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/dashboard/images/integrations/dashboard_apps.png -------------------------------------------------------------------------------- /public/dashboard/images/integrations/webhook-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/dashboard/images/integrations/webhook-dark.png -------------------------------------------------------------------------------- /public/dashboard/images/onboarding/canned-responses.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/dashboard/images/onboarding/canned-responses.png -------------------------------------------------------------------------------- /public/integrations/channels/badges/twitter-tweet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/integrations/channels/badges/twitter-tweet.png -------------------------------------------------------------------------------- /swagger/parameters/platform_user_id.yml: -------------------------------------------------------------------------------- 1 | in: path 2 | name: id 3 | type: integer 4 | required: true 5 | description: The numeric ID of the user on the platform 6 | -------------------------------------------------------------------------------- /app/controllers/android_app_controller.rb: -------------------------------------------------------------------------------- 1 | class AndroidAppController < ApplicationController 2 | def assetlinks 3 | render layout: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/assets/images/no_page_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/dashboard/assets/images/no_page_image.png -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/Inter/Inter-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/Inter/Inter-Bold.woff2 -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/Inter/Inter-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/Inter/Inter-Thin.woff2 -------------------------------------------------------------------------------- /app/views/api/v1/accounts/agent_bots/avatar.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/agent_bot', formats: [:json], resource: AgentBotPresenter.new(@agent_bot) 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/agent_bots/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/agent_bot', formats: [:json], resource: AgentBotPresenter.new(@agent_bot) 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/agent_bots/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/agent_bot', formats: [:json], resource: AgentBotPresenter.new(@agent_bot) 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/conversations/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/conversations/partials/conversation', formats: [:json], conversation: @conversation 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/teams/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.array! @teams do |team| 2 | json.partial! 'api/v1/models/team', formats: [:json], resource: team 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/webhooks/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.webhook do 3 | json.partial! 'webhook', webhook: @webhook 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/webhooks/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.webhook do 3 | json.partial! 'webhook', webhook: @webhook 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /bin/rails: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | APP_PATH = File.expand_path('../config/application', __dir__) 3 | require_relative '../config/boot' 4 | require 'rails/commands' 5 | -------------------------------------------------------------------------------- /enterprise/app/models/enterprise/application_record.rb: -------------------------------------------------------------------------------- 1 | module Enterprise::ApplicationRecord 2 | def droppables 3 | super + %w[SlaPolicy] 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /enterprise/app/views/api/v1/accounts/captain/assistants/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/captain/assistant', formats: [:json], resource: @assistant 2 | -------------------------------------------------------------------------------- /enterprise/app/views/api/v1/accounts/captain/assistants/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/captain/assistant', formats: [:json], resource: @assistant 2 | -------------------------------------------------------------------------------- /enterprise/app/views/api/v1/accounts/captain/assistants/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/captain/assistant', formats: [:json], resource: @assistant 2 | -------------------------------------------------------------------------------- /enterprise/app/views/api/v1/accounts/captain/documents/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/captain/document', formats: [:json], resource: @document 2 | -------------------------------------------------------------------------------- /public/dashboard/images/integrations/dialogflow-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/dashboard/images/integrations/dialogflow-dark.png -------------------------------------------------------------------------------- /public/dashboard/images/integrations/google_translate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/dashboard/images/integrations/google_translate.png -------------------------------------------------------------------------------- /public/dashboard/images/onboarding/omnichannel-inbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/dashboard/images/onboarding/omnichannel-inbox.png -------------------------------------------------------------------------------- /spec/factories/team_members.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | FactoryBot.define do 4 | factory :team_member do 5 | user 6 | team 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /swagger/definitions/request/account/create_update_payload.yml: -------------------------------------------------------------------------------- 1 | type: object 2 | properties: 3 | name: 4 | type: string 5 | description: Name of the account 6 | -------------------------------------------------------------------------------- /swagger/parameters/conversation_id.yml: -------------------------------------------------------------------------------- 1 | in: path 2 | name: conversation_id 3 | type: integer 4 | required: true 5 | description: The numeric ID of the conversation 6 | -------------------------------------------------------------------------------- /swagger/parameters/conversation_uuid.yml: -------------------------------------------------------------------------------- 1 | in: path 2 | name: conversation_uuid 3 | type: integer 4 | required: true 5 | description: The uuid of the conversation 6 | -------------------------------------------------------------------------------- /app/fields/count_field.rb: -------------------------------------------------------------------------------- 1 | require 'administrate/field/base' 2 | 3 | class CountField < Administrate::Field::Base 4 | def to_s 5 | data.count 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/components-next/dropdown-menu/base/DropdownSeparator.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/Inter/Inter-Black.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/Inter/Inter-Black.woff2 -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/Inter/Inter-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/Inter/Inter-Italic.woff2 -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/Inter/Inter-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/Inter/Inter-Light.woff2 -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/Inter/Inter-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/Inter/Inter-Medium.woff2 -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/Inter/Inter-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/Inter/Inter-Regular.woff2 -------------------------------------------------------------------------------- /app/views/api/v1/accounts/agents/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.array! @agents do |agent| 2 | json.partial! 'api/v1/models/agent', formats: [:json], resource: agent 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/callbacks/reauthorize_page.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.data do 2 | json.partial! 'api/v1/models/inbox', formats: [:json], resource: @inbox 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/contact_inboxes/filter.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/contact', formats: [:json], resource: @contact, with_contact_inboxes: true 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/conversations/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/conversations/partials/conversation', formats: [:json], conversation: @conversation 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/conversations/unread.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/conversations/partials/conversation', formats: [:json], conversation: @conversation 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/conversations/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/conversations/partials/conversation', formats: [:json], conversation: @conversation 2 | -------------------------------------------------------------------------------- /app/views/public/api/v1/inboxes/conversations/toggle_status.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'public/api/v1/models/conversation', formats: [:json], resource: @conversation 2 | -------------------------------------------------------------------------------- /app/views/public/api/v1/models/hc/_author.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.available_name resource.available_name 2 | json.name resource.name 3 | json.thumbnail resource.avatar_url 4 | -------------------------------------------------------------------------------- /config/environment.rb: -------------------------------------------------------------------------------- 1 | # Load the Rails application. 2 | require_relative 'application' 3 | 4 | # Initialize the Rails application. 5 | Rails.application.initialize! 6 | -------------------------------------------------------------------------------- /public/dashboard/images/integrations/dashboard_apps-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/dashboard/images/integrations/dashboard_apps-dark.png -------------------------------------------------------------------------------- /spec/factories/agent_bot_inboxes.rb: -------------------------------------------------------------------------------- 1 | FactoryBot.define do 2 | factory :agent_bot_inbox do 3 | inbox 4 | agent_bot 5 | status { 'active' } 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /swagger/definitions/error/request.yml: -------------------------------------------------------------------------------- 1 | type: object 2 | properties: 3 | field: 4 | type: string 5 | message: 6 | type: string 7 | code: 8 | type: string 9 | -------------------------------------------------------------------------------- /swagger/parameters/custom_filter_id.yml: -------------------------------------------------------------------------------- 1 | in: path 2 | name: custom_filter_id 3 | type: integer 4 | required: true 5 | description: The numeric ID of the custom filter 6 | -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/Inter/Inter-ExtraBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/Inter/Inter-ExtraBold.woff2 -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/Inter/Inter-SemiBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/Inter/Inter-SemiBold.woff2 -------------------------------------------------------------------------------- /app/views/api/v1/accounts/callbacks/facebook_pages.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.data do 2 | json.page_details @page_details 3 | json.user_access_token @user_access_token 4 | end 5 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/contacts/notes/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.array! @notes do |note| 2 | json.partial! 'api/v1/models/note', formats: [:json], resource: note 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/search/_inbox.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.id inbox.id 2 | json.channel_id inbox.channel_id 3 | json.name inbox.name 4 | json.channel_type inbox.channel_type 5 | -------------------------------------------------------------------------------- /app/views/devise/mailer/password_change.html.erb: -------------------------------------------------------------------------------- 1 |
Hello <%= @resource.email %>!
2 | 3 |We're contacting you to notify you that your password has been changed.
4 | -------------------------------------------------------------------------------- /enterprise/app/controllers/api/v1/accounts/enterprise_accounts_controller.rb: -------------------------------------------------------------------------------- 1 | class Api::V1::Accounts::EnterpriseAccountsController < Api::V1::Accounts::BaseController 2 | end 3 | -------------------------------------------------------------------------------- /public/dashboard/images/integrations/google_translate-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/public/dashboard/images/integrations/google_translate-dark.png -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file 2 | # 3 | 4 | User-agent: * 5 | Disallow: /widget 6 | 7 | -------------------------------------------------------------------------------- /swagger/definitions/resource/extension/conversation/show.yml: -------------------------------------------------------------------------------- 1 | type: object 2 | allOf: 3 | - $ref: '#/definitions/conversation' 4 | - $ref: '../contact/conversation.yml' 5 | -------------------------------------------------------------------------------- /app/controllers/concerns/hmac_concern.rb: -------------------------------------------------------------------------------- 1 | module HmacConcern 2 | def hmac_verified? 3 | ActiveModel::Type::Boolean.new.cast(params[:hmac_verified]).present? 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/zh_CN/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "搜索表情符号", 4 | "NOT_FOUND": "没有适合你的搜索结果", 5 | "REMOVE": "删除" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/store/modules/specs/bulkActions/fixtures.js: -------------------------------------------------------------------------------- 1 | export default { 2 | type: 'Conversation', 3 | ids: [64, 39], 4 | fields: { assignee_id: 6 }, 5 | }; 6 | -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/Inter/Inter-BlackItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/Inter/Inter-BlackItalic.woff2 -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/Inter/Inter-BoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/Inter/Inter-BoldItalic.woff2 -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/Inter/Inter-ExtraLight.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/Inter/Inter-ExtraLight.woff2 -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/Inter/Inter-LightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/Inter/Inter-LightItalic.woff2 -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/Inter/Inter-MediumItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/Inter/Inter-MediumItalic.woff2 -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/Inter/Inter-ThinItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/Inter/Inter-ThinItalic.woff2 -------------------------------------------------------------------------------- /app/views/api/v1/accounts/conversations/update_last_seen.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/conversations/partials/conversation', formats: [:json], conversation: @conversation 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/integrations/slack/list_all_channels.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.array! @channels do |channel| 2 | json.id channel['id'] 3 | json.name channel['name'] 4 | end 5 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/webhooks/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.webhooks do 3 | json.array! @webhooks, partial: 'webhook', as: :webhook 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/views/api/v1/models/_dashboard_app.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.id resource.id 2 | json.title resource.title 3 | json.content resource.content 4 | json.created_at resource.created_at 5 | -------------------------------------------------------------------------------- /app/views/public/api/v1/models/_contact.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.id resource.id 2 | json.name resource.name 3 | json.email resource.email 4 | json.phone_number resource.phone_number 5 | -------------------------------------------------------------------------------- /config/initializers/datadog.rb: -------------------------------------------------------------------------------- 1 | if ENV['DD_TRACE_AGENT_URL'].present? 2 | Datadog.configure do |c| 3 | # Instrumentation 4 | c.tracing.instrument :rails 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /enterprise/app/views/api/v1/accounts/captain/assistant_responses/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/captain/assistant_response', formats: [:json], resource: @response 2 | -------------------------------------------------------------------------------- /lib/tasks/ip_lookup.rake: -------------------------------------------------------------------------------- 1 | require 'rubygems/package' 2 | 3 | namespace :ip_lookup do 4 | task setup: :environment do 5 | Geocoder::SetupService.new.perform 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/assets/images/channels/facebook_login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/dashboard/assets/images/channels/facebook_login.png -------------------------------------------------------------------------------- /app/javascript/dashboard/constants/installationTypes.js: -------------------------------------------------------------------------------- 1 | export const INSTALLATION_TYPES = { 2 | CLOUD: 'cloud', 3 | ENTERPRISE: 'enterprise', 4 | COMMUNITY: 'community', 5 | }; 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ja/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "絵文字を検索", 4 | "NOT_FOUND": "検索条件に一致する絵文字が見つかりません", 5 | "REMOVE": "削除" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/Inter/Inter-SemiBoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/Inter/Inter-SemiBoldItalic.woff2 -------------------------------------------------------------------------------- /app/views/api/v1/accounts/campaigns/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.array! @campaigns do |campaign| 2 | json.partial! 'api/v1/models/campaign', formats: [:json], resource: campaign 3 | end 4 | -------------------------------------------------------------------------------- /enterprise/app/views/api/v1/accounts/captain/assistant_responses/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/captain/assistant_response', formats: [:json], resource: @response 2 | -------------------------------------------------------------------------------- /enterprise/app/views/api/v1/accounts/captain/assistant_responses/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/captain/assistant_response', formats: [:json], resource: @response 2 | -------------------------------------------------------------------------------- /enterprise/app/views/api/v1/accounts/sla_policies/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.partial! 'api/v1/models/sla_policy', formats: [:json], sla_policy: @sla_policy 3 | end 4 | -------------------------------------------------------------------------------- /enterprise/app/views/api/v1/accounts/sla_policies/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.partial! 'api/v1/models/sla_policy', formats: [:json], sla_policy: @sla_policy 3 | end 4 | -------------------------------------------------------------------------------- /enterprise/app/views/api/v1/accounts/sla_policies/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.partial! 'api/v1/models/sla_policy', formats: [:json], sla_policy: @sla_policy 3 | end 4 | -------------------------------------------------------------------------------- /spec/factories/installation_config.rb: -------------------------------------------------------------------------------- 1 | FactoryBot.define do 2 | factory :installation_config do 3 | name { 'xyc' } 4 | value { 1.5 } 5 | locked { true } 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /swagger/parameters/public/inbox_identifier.yml: -------------------------------------------------------------------------------- 1 | in: path 2 | name: inbox_identifier 3 | type: string 4 | required: true 5 | description: The identifier obtained from API inbox channel 6 | -------------------------------------------------------------------------------- /app/assets/stylesheets/administrate/library/_clearfix.scss: -------------------------------------------------------------------------------- 1 | @mixin administrate-clearfix { 2 | &::after { 3 | clear: both; 4 | content: ''; 5 | display: block; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/helper/CacheHelper/version.js: -------------------------------------------------------------------------------- 1 | // Monday, 13 March 2023 2 | // Change this version if you want to invalidate old data 3 | export const DATA_VERSION = '1678706392'; 4 | -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/Inter/Inter-ExtraBoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/Inter/Inter-ExtraBoldItalic.woff2 -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/Inter/Inter-ExtraLightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/Inter/Inter-ExtraLightItalic.woff2 -------------------------------------------------------------------------------- /app/views/api/v1/accounts/custom_attribute_definitions/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/custom_attribute_definition', formats: [:json], resource: @custom_attribute_definition 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/inboxes/campaigns.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.array! @campaigns do |campaign| 2 | json.partial! 'api/v1/models/campaign', formats: [:json], resource: campaign 3 | end 4 | -------------------------------------------------------------------------------- /spec/factories/labels.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | FactoryBot.define do 4 | factory :label do 5 | account 6 | sequence(:title) { |n| "Label_#{n}" } 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /spec/factories/platform_apps_permissibles.rb: -------------------------------------------------------------------------------- 1 | FactoryBot.define do 2 | factory :platform_app_permissible do 3 | platform_app 4 | permissible { create(:user) } 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /spec/fixtures/accounts.yml: -------------------------------------------------------------------------------- 1 | # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html 2 | 3 | one: 4 | name: MyString 5 | 6 | two: 7 | name: MyString 8 | -------------------------------------------------------------------------------- /swagger/definitions/request/public/message/update_payload.yml: -------------------------------------------------------------------------------- 1 | 2 | type: object 3 | properties: 4 | submitted_values: 5 | type: object 6 | description: Replies to the Bot Message Types -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-Black.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-Black.woff2 -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-Bold.woff2 -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-Light.woff2 -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-Thin.woff2 -------------------------------------------------------------------------------- /app/javascript/superadmin_pages/components/playground/assets/typing.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/superadmin_pages/components/playground/assets/typing.gif -------------------------------------------------------------------------------- /app/views/api/v1/accounts/automation_rules/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/accounts/automation_rules/partials/automation_rule', formats: [:json], automation_rule: @automation_rule 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/contacts/avatar.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.partial! 'api/v1/models/contact', formats: [:json], resource: @contact, with_contact_inboxes: false 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/conversations/assignments/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.assignee @conversation.assignee 3 | json.conversation_id @conversation.display_id 4 | end 5 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/custom_attribute_definitions/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/custom_attribute_definition', formats: [:json], resource: @custom_attribute_definition 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/custom_attribute_definitions/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.partial! 'api/v1/models/custom_attribute_definition', formats: [:json], resource: @custom_attribute_definition 2 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/inboxes/agent_bot.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.agent_bot do 2 | json.partial! 'api/v1/models/agent_bot', formats: [:json], resource: @agent_bot if @agent_bot.present? 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/search/_agent.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.id agent.id 2 | json.available_name agent.available_name 3 | json.email agent.email 4 | json.name agent.name 5 | json.role agent.role 6 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/team_members/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.array! @team_members do |team_member| 2 | json.partial! 'api/v1/models/agent', formats: [:json], resource: team_member 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/team_members/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.array! @team_members do |team_member| 2 | json.partial! 'api/v1/models/agent', formats: [:json], resource: team_member 3 | end 4 | -------------------------------------------------------------------------------- /app/views/microsoft/identity_association.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.associatedApplications do 2 | json.array! [@identity_json] do |identity_id| 3 | json.applicationId identity_id 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/views/public/api/v1/inboxes/messages/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.array! @messages do |message| 2 | json.partial! 'public/api/v1/models/message', formats: [:json], resource: message 3 | end 4 | -------------------------------------------------------------------------------- /app/views/public/api/v1/portals/categories/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.array! @categories, partial: 'public/api/v1/models/category', formats: [:json], as: :category 3 | end 4 | -------------------------------------------------------------------------------- /enterprise/app/dispatchers/enterprise/async_dispatcher.rb: -------------------------------------------------------------------------------- 1 | module Enterprise::AsyncDispatcher 2 | def listeners 3 | super + [ 4 | CaptainListener.instance 5 | ] 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /semantic.yml: -------------------------------------------------------------------------------- 1 | titleOnly: true 2 | types: 3 | - Feature 4 | - Fix 5 | - Docs 6 | - Style 7 | - Refactor 8 | - Perf 9 | - Test 10 | - Build 11 | - Chore 12 | - Revert 13 | -------------------------------------------------------------------------------- /spec/factories/portals.rb: -------------------------------------------------------------------------------- 1 | FactoryBot.define do 2 | factory :portal, class: 'Portal' do 3 | account 4 | name { Faker::Book.name } 5 | slug { SecureRandom.hex } 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /swagger/definitions/request/integrations/hook_update_payload.yml: -------------------------------------------------------------------------------- 1 | type: object 2 | properties: 3 | settings: 4 | type: object 5 | description: The settings required by the integration 6 | -------------------------------------------------------------------------------- /swagger/parameters/public/contact_identifier.yml: -------------------------------------------------------------------------------- 1 | in: path 2 | name: contact_identifier 3 | type: string 4 | required: true 5 | description: The source id of contact obtained on contact create 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ko/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "제거" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/tr/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Emoji ara", 4 | "NOT_FOUND": "Aramanızla eşleşen emoji yok", 5 | "REMOVE": "Kaldır" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/vi/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "Xoá" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-Italic.woff2 -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-Medium.woff2 -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-Regular.woff2 -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-SemiBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-SemiBold.woff2 -------------------------------------------------------------------------------- /app/views/api/v1/accounts/csat_survey_responses/metrics.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.total_count @total_count 2 | json.ratings_count @ratings_count 3 | json.total_sent_messages_count @total_sent_messages_count 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/macros/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.array! @macros do |macro| 3 | json.partial! 'api/v1/models/macro', formats: [:json], macro: macro 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /enterprise/app/models/enterprise/audit/macro.rb: -------------------------------------------------------------------------------- 1 | module Enterprise::Audit::Macro 2 | extend ActiveSupport::Concern 3 | 4 | included do 5 | audited associated_with: :account 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /enterprise/app/models/enterprise/audit/team.rb: -------------------------------------------------------------------------------- 1 | module Enterprise::Audit::Team 2 | extend ActiveSupport::Concern 3 | 4 | included do 5 | audited associated_with: :account 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /enterprise/app/views/api/v1/accounts/applied_slas/metrics.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.total_applied_slas @total_applied_slas 2 | json.number_of_sla_misses @number_of_sla_misses 3 | json.hit_rate @hit_rate 4 | -------------------------------------------------------------------------------- /enterprise/config/premium_features.yml: -------------------------------------------------------------------------------- 1 | # List of the premium features in EE edition 2 | - disable_branding 3 | - audit_logs 4 | - response_bot 5 | - sla 6 | - captain_integration 7 | - custom_roles 8 | -------------------------------------------------------------------------------- /spec/factories/inbox_members.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | FactoryBot.define do 4 | factory :inbox_member do 5 | user { create(:user, :with_avatar) } 6 | inbox 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /swagger/definitions/resource/extension/contact/labels.yml: -------------------------------------------------------------------------------- 1 | type: object 2 | properties: 3 | payload: 4 | type: array 5 | description: Array of labels 6 | items: 7 | type: string 8 | -------------------------------------------------------------------------------- /Procfile.dev: -------------------------------------------------------------------------------- 1 | backend: bin/rails s -p 3000 2 | # https://github.com/mperham/sidekiq/issues/3090#issuecomment-389748695 3 | worker: dotenv bundle exec sidekiq -C config/sidekiq.yml 4 | vite: bin/vite dev 5 | -------------------------------------------------------------------------------- /app/fields/enterprise/account_features_field.rb: -------------------------------------------------------------------------------- 1 | require 'administrate/field/base' 2 | 3 | class Enterprise::AccountFeaturesField < Administrate::Field::Base 4 | def to_s 5 | data 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/am/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "Remove" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ar/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "ابحث في الايموجي", 4 | "NOT_FOUND": "لا يوجد إيموجي يطابق بحثك", 5 | "REMOVE": "حذف" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/az/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "Remove" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/bg/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "Remove" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/cs/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "Odebrat" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/da/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Søg emojis", 4 | "NOT_FOUND": "Ingen emoji matcher din søgning", 5 | "REMOVE": "Fjern" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/en/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "Remove" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/fi/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "Poista" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/he/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "חפש אימוג'י", 4 | "NOT_FOUND": "אין אמוג'י שתואם את החיפוש שלך", 5 | "REMOVE": "הסר" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/hi/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "Remove" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/hr/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "Izbaci" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/hu/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Emoji keresése", 4 | "NOT_FOUND": "Nem található emoji", 5 | "REMOVE": "Eltávolítás" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/hy/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "Remove" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/is/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "Fjarlægja" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/it/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "Rimuovi" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ka/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "Remove" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ms/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "Remove" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ne/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "Remove" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/no/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "Fjern" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/sh/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "Remove" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/sk/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "Remove" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/sq/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "Remove" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/sr/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "Ukloni" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/sv/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Sök emoji", 4 | "NOT_FOUND": "Ingen emoji matchar din sökning", 5 | "REMOVE": "Radera" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ta/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "நீக்கு" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/th/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "ลบรูปภาพ" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/tl/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "Remove" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ur/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "Remove" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ur_IN/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "Remove" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/zh_TW/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "刪除" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/sdk/constants.js: -------------------------------------------------------------------------------- 1 | export const BUBBLE_DESIGN = ['standard', 'expanded_bubble']; 2 | export const WIDGET_DESIGN = ['standard', 'flat']; 3 | export const DARK_MODE = ['light', 'auto', 'dark']; 4 | -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-BoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-BoldItalic.woff2 -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-ExtraBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-ExtraBold.woff2 -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-ExtraLight.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-ExtraLight.woff2 -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-ThinItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-ThinItalic.woff2 -------------------------------------------------------------------------------- /app/models/concerns/llm_formattable.rb: -------------------------------------------------------------------------------- 1 | module LlmFormattable 2 | extend ActiveSupport::Concern 3 | 4 | def to_llm_text 5 | LlmFormatter::LlmTextFormatterService.new(self).format 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/inboxes/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.array! @inboxes do |inbox| 3 | json.partial! 'api/v1/models/inbox', formats: [:json], resource: inbox 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/views/api/v1/models/_contact_inbox.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.source_id resource.source_id 2 | json.inbox do 3 | json.partial! 'api/v1/models/inbox_slim', formats: [:json], resource: resource.inbox 4 | end 5 | -------------------------------------------------------------------------------- /config/initializers/audited.rb: -------------------------------------------------------------------------------- 1 | # configuration related audited gem : https://github.com/collectiveidea/audited 2 | 3 | Audited.config do |config| 4 | config.audit_class = 'Enterprise::AuditLog' 5 | end 6 | -------------------------------------------------------------------------------- /config/initializers/mime_types.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Add new mime types for use in respond_to blocks: 4 | # Mime::Type.register "text/richtext", :rtf 5 | -------------------------------------------------------------------------------- /config/initializers/session_store.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | Rails.application.config.session_store :cookie_store, key: '_chatwoot_session', same_site: :lax 4 | -------------------------------------------------------------------------------- /db/migrate/20231013072802_add_icon_to_categories.rb: -------------------------------------------------------------------------------- 1 | class AddIconToCategories < ActiveRecord::Migration[7.0] 2 | def change 3 | add_column :categories, :icon, :string, default: '' 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20250207040150_add_meta_to_attachment.rb: -------------------------------------------------------------------------------- 1 | class AddMetaToAttachment < ActiveRecord::Migration[7.0] 2 | def change 3 | add_column :attachments, :meta, :jsonb, default: {} 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /enterprise/app/models/enterprise/account_user.rb: -------------------------------------------------------------------------------- 1 | module Enterprise::AccountUser 2 | def permissions 3 | custom_role.present? ? (custom_role.permissions + ['custom_role']) : super 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /enterprise/app/models/enterprise/audit/webhook.rb: -------------------------------------------------------------------------------- 1 | module Enterprise::Audit::Webhook 2 | extend ActiveSupport::Concern 3 | 4 | included do 5 | audited associated_with: :account 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /enterprise/app/policies/enterprise/report_policy.rb: -------------------------------------------------------------------------------- 1 | module Enterprise::ReportPolicy 2 | def view? 3 | @account_user.custom_role&.permissions&.include?('report_manage') || super 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /spec/factories/account_users.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | FactoryBot.define do 4 | factory :account_user do 5 | account 6 | user 7 | role { 'agent' } 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /swagger/definitions/request/public/conversation/create_payload.yml: -------------------------------------------------------------------------------- 1 | type: object 2 | properties: 3 | custom_attributes: 4 | type: object 5 | description: Custom attributes of the conversation 6 | -------------------------------------------------------------------------------- /swagger/definitions/resource/extension/conversation/labels.yml: -------------------------------------------------------------------------------- 1 | type: object 2 | properties: 3 | payload: 4 | type: array 5 | description: Array of labels 6 | items: 7 | type: string 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/fa/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "جستجوی اموجی", 4 | "NOT_FOUND": "هیچ اموجی با جستجوی شما مطابقت ندارد", 5 | "REMOVE": "حذف" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ml/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Search emojis", 4 | "NOT_FOUND": "No emoji match your search", 5 | "REMOVE": "നീക്കം ചെയ്യുക" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-BlackItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-BlackItalic.woff2 -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-LightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-LightItalic.woff2 -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-MediumItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-MediumItalic.woff2 -------------------------------------------------------------------------------- /app/javascript/shared/mixins/specs/MockComponent.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/javascript/survey/helpers/axios.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | import { APP_BASE_URL } from 'widget/helpers/constants'; 3 | 4 | export const API = axios.create({ 5 | baseURL: APP_BASE_URL, 6 | }); 7 | -------------------------------------------------------------------------------- /app/jobs/campaigns/trigger_oneoff_campaign_job.rb: -------------------------------------------------------------------------------- 1 | class Campaigns::TriggerOneoffCampaignJob < ApplicationJob 2 | queue_as :low 3 | 4 | def perform(campaign) 5 | campaign.trigger! 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/policies/report_policy.rb: -------------------------------------------------------------------------------- 1 | class ReportPolicy < ApplicationPolicy 2 | def view? 3 | @account_user.administrator? 4 | end 5 | end 6 | 7 | ReportPolicy.prepend_mod_with('Enterprise::ReportPolicy') 8 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/contacts/destroy_custom_attributes.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.partial! 'api/v1/models/contact', formats: [:json], resource: @contact, with_contact_inboxes: true 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/contacts/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.partial! 'api/v1/models/contact', formats: [:json], resource: @contact, with_contact_inboxes: @include_contact_inboxes 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/contacts/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.partial! 'api/v1/models/contact', formats: [:json], resource: @contact, with_contact_inboxes: @include_contact_inboxes 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/conversations/participants/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.array! @participants do |participant| 2 | json.partial! 'api/v1/models/agent', format: :json, resource: participant.user 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/conversations/participants/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.array! @participants do |participant| 2 | json.partial! 'api/v1/models/agent', format: :json, resource: participant.user 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/custom_filters/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.array! @custom_filters do |custom_filter| 2 | json.partial! 'api/v1/models/custom_filter', formats: [:json], resource: custom_filter 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/dashboard_apps/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.array! @dashboard_apps do |dashboard_app| 2 | json.partial! 'api/v1/models/dashboard_app', formats: [:json], resource: dashboard_app 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/inbox_members/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.array! @agents do |agent| 3 | json.partial! 'api/v1/models/agent', formats: [:json], resource: agent 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/integrations/apps/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.array! @apps do |app| 3 | json.partial! 'api/v1/models/app', formats: [:json], resource: app 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/views/platform/api/v1/agent_bots/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.array! @resources do |resource| 2 | json.partial! 'platform/api/v1/models/agent_bot', formats: [:json], resource: resource.permissible 3 | end 4 | -------------------------------------------------------------------------------- /config/initializers/liquid_handler.rb: -------------------------------------------------------------------------------- 1 | require Rails.root.join('lib/action_view/template/handlers/liquid') 2 | 3 | ActionView::Template.register_template_handler :liquid, ActionView::Template::Handlers::Liquid 4 | -------------------------------------------------------------------------------- /db/migrate/20230614044633_add_sender_name_to_in.rb: -------------------------------------------------------------------------------- 1 | class AddSenderNameToIn < ActiveRecord::Migration[7.0] 2 | def change 3 | add_column :inboxes, :business_name, :string, null: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /enterprise/app/drops/sla_policy_drop.rb: -------------------------------------------------------------------------------- 1 | class SlaPolicyDrop < BaseDrop 2 | def name 3 | @obj.try(:name) 4 | end 5 | 6 | def description 7 | @obj.try(:description) 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/es/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Buscar emojis", 4 | "NOT_FOUND": "Ningún emoji coincide con tu búsqueda", 5 | "REMOVE": "Eliminar" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ru/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Поиск эмодзи", 4 | "NOT_FOUND": "Эмодзи не соответствуют вашему запросу", 5 | "REMOVE": "Удалить" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/routes/dashboard/settings/helper/settingsHelper.js: -------------------------------------------------------------------------------- 1 | export const getI18nKey = (prefix, event) => { 2 | const eventName = event.toUpperCase(); 3 | return `${prefix}.${eventName}`; 4 | }; 5 | -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-ExtraBoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-ExtraBoldItalic.woff2 -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-SemiBoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-SemiBoldItalic.woff2 -------------------------------------------------------------------------------- /app/jobs/channels/notifica_me/templates_sync_job.rb: -------------------------------------------------------------------------------- 1 | class Channels::NotificaMe::TemplatesSyncJob < ApplicationJob 2 | queue_as :low 3 | 4 | def perform(channel) 5 | channel.sync_templates 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/agent_bots/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.array! @agent_bots do |agent_bot| 2 | json.partial! 'api/v1/models/agent_bot', formats: [:json], resource: AgentBotPresenter.new(agent_bot) 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/inbox_members/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.array! @agents do |agent| 3 | json.partial! 'api/v1/models/agent', formats: [:json], resource: agent 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/inbox_members/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.array! @agents do |agent| 3 | json.partial! 'api/v1/models/agent', formats: [:json], resource: agent 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/labels/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.id @label.id 2 | json.title @label.title 3 | json.description @label.description 4 | json.color @label.color 5 | json.show_on_sidebar @label.show_on_sidebar 6 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/search/_contact.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.email contact.email 2 | json.id contact.id 3 | json.name contact.name 4 | json.phone_number contact.phone_number 5 | json.identifier contact.identifier 6 | -------------------------------------------------------------------------------- /app/views/api/v1/widget/contacts/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.id @contact.id 2 | json.has_email @contact.email.present? 3 | json.has_name @contact.name.present? 4 | json.has_phone_number @contact.phone_number.present? 5 | -------------------------------------------------------------------------------- /db/migrate/20240215065844_add_meta_to_notifications.rb: -------------------------------------------------------------------------------- 1 | class AddMetaToNotifications < ActiveRecord::Migration[7.0] 2 | def change 3 | add_column :notifications, :meta, :jsonb, default: {} 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /enterprise/app/views/api/v1/accounts/custom_roles/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.array! @custom_roles do |custom_role| 2 | json.partial! 'api/v1/models/custom_role', formats: [:json], custom_role: custom_role 3 | end 4 | -------------------------------------------------------------------------------- /spec/factories/teams.rb: -------------------------------------------------------------------------------- 1 | FactoryBot.define do 2 | factory :team do 3 | sequence(:name) { |n| "Team #{n}" } 4 | description { 'MyText' } 5 | allow_auto_assign { true } 6 | account 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /spec/models/installation_config_spec.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require 'rails_helper' 4 | 5 | RSpec.describe InstallationConfig do 6 | it { is_expected.to validate_presence_of(:name) } 7 | end 8 | -------------------------------------------------------------------------------- /spec/support/negated_matchers.rb: -------------------------------------------------------------------------------- 1 | # "not_change" is needed to support chaining "change" matchers 2 | # see https://stackoverflow.com/a/34969429/58876 3 | RSpec::Matchers.define_negated_matcher :not_change, :change 4 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ca/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Cerca emojis", 4 | "NOT_FOUND": "Cap emoji coincideix amb la teva cerca", 5 | "REMOVE": "Suprimeix" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/de/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Emojis durchsuchen", 4 | "NOT_FOUND": "Kein Emoji entspricht deiner Suche", 5 | "REMOVE": "Entfernen" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/lt/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Ieškoti emodžių", 4 | "NOT_FOUND": "Jūsų paieška neatitinka jokių emodži", 5 | "REMOVE": "Pašalinti" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/pt/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Pesquisar emojis", 4 | "NOT_FOUND": "Nenhum emoji corresponde à sua pesquisa", 5 | "REMOVE": "Excluir" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/ro/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Caută emoji-uri", 4 | "NOT_FOUND": "Niciun emoji nu corespunde căutării tale", 5 | "REMOVE": "Elimină" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-ExtraLightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/clairton/chatwoot/HEAD/app/javascript/shared/assets/fonts/InterDisplay/InterDisplay-ExtraLightItalic.woff2 -------------------------------------------------------------------------------- /app/javascript/v3/api/apiClient.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | 3 | const { apiHost = '' } = window.chatwootConfig || {}; 4 | const wootAPI = axios.create({ baseURL: `${apiHost}/` }); 5 | 6 | export default wootAPI; 7 | -------------------------------------------------------------------------------- /app/jobs/internal/seed_account_job.rb: -------------------------------------------------------------------------------- 1 | class Internal::SeedAccountJob < ApplicationJob 2 | queue_as :low 3 | 4 | def perform(account) 5 | Seeders::AccountSeeder.new(account: account).perform! 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/automation_rules/clone.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.partial! 'api/v1/accounts/automation_rules/partials/automation_rule', formats: [:json], automation_rule: @automation_rule 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/automation_rules/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.partial! 'api/v1/accounts/automation_rules/partials/automation_rule', formats: [:json], automation_rule: @automation_rule 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/labels/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.id @label.id 2 | json.title @label.title 3 | json.description @label.description 4 | json.color @label.color 5 | json.show_on_sidebar @label.show_on_sidebar 6 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/labels/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.id @label.id 2 | json.title @label.title 3 | json.description @label.description 4 | json.color @label.color 5 | json.show_on_sidebar @label.show_on_sidebar 6 | -------------------------------------------------------------------------------- /app/views/api/v1/models/_portal_config.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.code locale 2 | json.articles_count portal.articles.search({ locale: locale }).size 3 | json.categories_count portal.categories.search_by_locale(locale).size 4 | -------------------------------------------------------------------------------- /app/views/public/api/v1/inboxes/conversations/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.array! @conversations do |conversation| 2 | json.partial! 'public/api/v1/models/conversation', formats: [:json], resource: conversation 3 | end 4 | -------------------------------------------------------------------------------- /db/migrate/20230620132319_add_sla_policy_to_conversations.rb: -------------------------------------------------------------------------------- 1 | class AddSlaPolicyToConversations < ActiveRecord::Migration[7.0] 2 | def change 3 | add_column :conversations, :sla_policy_id, :bigint 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20230706090122_sentiment_column_to_messages.rb: -------------------------------------------------------------------------------- 1 | class SentimentColumnToMessages < ActiveRecord::Migration[7.0] 2 | def change 3 | add_column :messages, :sentiment, :jsonb, default: {} 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20230714054138_add_api_key_sid_to_twilio_sms.rb: -------------------------------------------------------------------------------- 1 | class AddApiKeySidToTwilioSms < ActiveRecord::Migration[7.0] 2 | def change 3 | add_column :channel_twilio_sms, :api_key_sid, :string 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /enterprise/app/models/enterprise/audit/automation_rule.rb: -------------------------------------------------------------------------------- 1 | module Enterprise::Audit::AutomationRule 2 | extend ActiveSupport::Concern 3 | 4 | included do 5 | audited associated_with: :account 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /enterprise/app/views/api/v1/models/_account_user.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.custom_role_id account_user&.custom_role_id 2 | json.custom_role account_user&.custom_role&.as_json(only: [:id, :name, :description, :permissions]) 3 | -------------------------------------------------------------------------------- /public/assets/images/hc/grid.svg: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /spec/factories/folders.rb: -------------------------------------------------------------------------------- 1 | FactoryBot.define do 2 | factory :folder, class: 'Folder' do 3 | account_id { 1 } 4 | name { 'MyString' } 5 | description { 'MyText' } 6 | category_id { 1 } 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/nl/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Zoek emojis", 4 | "NOT_FOUND": "Er zijn geen overeenkomende emoji's gevonden", 5 | "REMOVE": "Verwijderen" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/pl/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Wyszukaj emoji", 4 | "NOT_FOUND": "Nie znaleziono emoji pasującego do wyszukiwania", 5 | "REMOVE": "Usuń" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/pt_BR/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Pesquisar emojis", 4 | "NOT_FOUND": "Nenhum emoji corresponde à sua pesquisa", 5 | "REMOVE": "Excluir" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/sl/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Iskanje emojijev", 4 | "NOT_FOUND": "Z vašim iskanjem se ne ujema noben emoji", 5 | "REMOVE": "Odstrani" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/uk/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Пошук смайлів", 4 | "NOT_FOUND": "Немає смайликів, які відповідають вашому запиту", 5 | "REMOVE": "Видалити" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/survey/store/index.js: -------------------------------------------------------------------------------- 1 | import { createStore } from 'vuex'; 2 | import globalConfig from 'shared/store/globalConfig'; 3 | 4 | export default createStore({ 5 | modules: { 6 | globalConfig, 7 | }, 8 | }); 9 | -------------------------------------------------------------------------------- /app/javascript/v3/store/index.js: -------------------------------------------------------------------------------- 1 | import { createStore } from 'vuex'; 2 | import globalConfig from 'shared/store/globalConfig'; 3 | 4 | export default createStore({ 5 | modules: { 6 | globalConfig, 7 | }, 8 | }); 9 | -------------------------------------------------------------------------------- /app/presenters/agent_bot_presenter.rb: -------------------------------------------------------------------------------- 1 | class AgentBotPresenter < SimpleDelegator 2 | def access_token 3 | return if account_id.blank? 4 | 5 | Current.account.id == account_id ? super&.token : nil 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/assignable_agents/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.array! @assignable_agents do |agent| 3 | json.partial! 'api/v1/models/agent', formats: [:json], resource: agent 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/automation_rules/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.partial! 'api/v1/accounts/automation_rules/partials/automation_rule', formats: [:json], automation_rule: @automation_rule 3 | end 4 | -------------------------------------------------------------------------------- /app/views/devise/token.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.success true 3 | json.partial! 'auth', formats: [:json], resource: @resource 4 | json.data do 5 | json.created_at @resource.created_at 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /config/app.yml: -------------------------------------------------------------------------------- 1 | shared: &shared 2 | version: '4.0.3-uno' 3 | 4 | development: 5 | <<: *shared 6 | 7 | production: 8 | <<: *shared 9 | 10 | staging: 11 | <<: *shared 12 | 13 | test: 14 | <<: *shared 15 | -------------------------------------------------------------------------------- /db/migrate/20231011041615_ensure_message_private_not_null.rb: -------------------------------------------------------------------------------- 1 | class EnsureMessagePrivateNotNull < ActiveRecord::Migration[7.0] 2 | def change 3 | change_column_null :messages, :private, false, false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20240124054340_add_contact_type_to_contacts.rb: -------------------------------------------------------------------------------- 1 | class AddContactTypeToContacts < ActiveRecord::Migration[7.0] 2 | def change 3 | add_column :contacts, :contact_type, :integer, default: 0 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20240528173755_alter_message_source_id_length.rb: -------------------------------------------------------------------------------- 1 | class AlterMessageSourceIdLength < ActiveRecord::Migration[7.0] 2 | def change 3 | change_column :messages, :source_id, :string, limit: 512 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /enterprise/app/jobs/portal/article_indexing_job.rb: -------------------------------------------------------------------------------- 1 | class Portal::ArticleIndexingJob < ApplicationJob 2 | queue_as :low 3 | 4 | def perform(article) 5 | article.generate_and_save_article_seach_terms 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /enterprise/app/models/enterprise/audit/inbox.rb: -------------------------------------------------------------------------------- 1 | module Enterprise::Audit::Inbox 2 | extend ActiveSupport::Concern 3 | 4 | included do 5 | audited associated_with: :account, on: [:create, :update] 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /enterprise/app/models/enterprise/concerns/account_user.rb: -------------------------------------------------------------------------------- 1 | module Enterprise::Concerns::AccountUser 2 | extend ActiveSupport::Concern 3 | 4 | included do 5 | belongs_to :custom_role, optional: true 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /enterprise/app/views/api/v1/accounts/captain/bulk_actions/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.array! @responses do |response| 2 | json.partial! 'api/v1/models/captain/assistant_response', formats: [:json], resource: response 3 | end 4 | -------------------------------------------------------------------------------- /public/assets/images/hc/grid_dark.svg: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /spec/factories/captain/inbox.rb: -------------------------------------------------------------------------------- 1 | FactoryBot.define do 2 | factory :captain_inbox, class: 'CaptainInbox' do 3 | association :captain_assistant, factory: :captain_assistant 4 | association :inbox 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /swagger/parameters/report_type.yml: -------------------------------------------------------------------------------- 1 | in: query 2 | name: type 3 | type: string 4 | enum: 5 | - account 6 | - agent 7 | - inbox 8 | - label 9 | - team 10 | required: true 11 | description: Type of report 12 | -------------------------------------------------------------------------------- /app/assets/config/manifest.js: -------------------------------------------------------------------------------- 1 | //= link_tree ../images 2 | //= link administrate/application.css 3 | //= link administrate/application.js 4 | //= link administrate-field-active_storage/application.css 5 | //= link secretField.js 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/el/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Αναζήτηση emojis", 4 | "NOT_FOUND": "Κανένα emoji δεν ταιριάζει με την αναζήτησή σας", 5 | "REMOVE": "Διαγραφή" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/fr/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Rechercher des émojis", 4 | "NOT_FOUND": "Aucun émoji ne correspond à votre recherche", 5 | "REMOVE": "Supprimer" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/id/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Cari emoji", 4 | "NOT_FOUND": "Tidak ditemukan emoji yang sesuai dengan pencarian Anda", 5 | "REMOVE": "Hapus" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/jobs/channels/whatsapp/templates_sync_job.rb: -------------------------------------------------------------------------------- 1 | class Channels::Whatsapp::TemplatesSyncJob < ApplicationJob 2 | queue_as :low 3 | 4 | def perform(whatsapp_channel) 5 | whatsapp_channel.sync_templates 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/services/llm_formatter/default_llm_formatter.rb: -------------------------------------------------------------------------------- 1 | class LlmFormatter::DefaultLlmFormatter 2 | def initialize(record) 3 | @record = record 4 | end 5 | 6 | def format 7 | # override this 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/inboxes/assignable_agents.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.array! @assignable_agents do |agent| 3 | json.partial! 'api/v1/models/agent', formats: [:json], resource: agent 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/views/icons/_chevron-down.html.erb: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /app/views/public/api/v1/models/_associated_category.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.name category.name 2 | json.slug category.slug 3 | json.locale category.locale 4 | json.description category.description 5 | json.position category.position 6 | -------------------------------------------------------------------------------- /config/initializers/event_handlers.rb: -------------------------------------------------------------------------------- 1 | Rails.application.configure do 2 | config.to_prepare do 3 | Rails.configuration.dispatcher = Dispatcher.instance 4 | Rails.configuration.dispatcher.load_listeners 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /db/migrate/20231129091149_add_snoozed_until_to_notifications.rb: -------------------------------------------------------------------------------- 1 | class AddSnoozedUntilToNotifications < ActiveRecord::Migration[7.0] 2 | def change 3 | add_column :notifications, :snoozed_until, :datetime 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /spec/factories/mentions.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | FactoryBot.define do 4 | factory :mention do 5 | mentioned_at { Time.current } 6 | account 7 | conversation 8 | user 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /spec/factories/notes.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | FactoryBot.define do 4 | factory :note do 5 | content { 'Hey welcome to chatwoot' } 6 | account 7 | user 8 | contact 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /spec/fixtures/files/mail_with_no_date.eml: -------------------------------------------------------------------------------- 1 | Date: 2 | From: testemail@gmail.com 3 | To: imap@outlook.com 4 | Subject: test text only mail 5 | Message-Id: <0CB459E0-0336-41DA-BC88-E6E28C697DDB@chatwoot.com> 6 | 7 | text only mail 8 | -------------------------------------------------------------------------------- /spec/fixtures/inbox_members.yml: -------------------------------------------------------------------------------- 1 | # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html 2 | 3 | one: 4 | user_id: 1 5 | inbox_id: 1 6 | 7 | two: 8 | user_id: 1 9 | inbox_id: 1 10 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | release: POSTGRES_STATEMENT_TIMEOUT=600s bundle exec rails db:chatwoot_prepare && echo $SOURCE_VERSION > .git_sha 2 | web: bundle exec rails server -p $PORT -e $RAILS_ENV 3 | worker: bundle exec sidekiq -C config/sidekiq.yml 4 | -------------------------------------------------------------------------------- /app/drops/base_drop.rb: -------------------------------------------------------------------------------- 1 | class BaseDrop < Liquid::Drop 2 | def initialize(obj) 3 | @obj = obj 4 | end 5 | 6 | def id 7 | @obj.try(:id) 8 | end 9 | 10 | def name 11 | @obj.try(:name) 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /app/models/concerns/reportable.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | module Reportable 4 | extend ActiveSupport::Concern 5 | 6 | included do 7 | has_many :reporting_events, dependent: :destroy 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /config/boot.rb: -------------------------------------------------------------------------------- 1 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) 2 | 3 | require 'bundler/setup' # Set up gems listed in the Gemfile. 4 | require 'bootsnap/setup' # Speed up boot time by caching expensive operations. 5 | -------------------------------------------------------------------------------- /db/migrate/20250105005821_remove_not_null_from_captain_documents.rb: -------------------------------------------------------------------------------- 1 | class RemoveNotNullFromCaptainDocuments < ActiveRecord::Migration[7.0] 2 | def change 3 | change_column_null :captain_documents, :name, true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /spec/fixtures/inboxes.yml: -------------------------------------------------------------------------------- 1 | # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html 2 | 3 | one: 4 | channel_id: 1 5 | account_id: 1 6 | 7 | two: 8 | channel_id: 1 9 | account_id: 1 10 | -------------------------------------------------------------------------------- /swagger/definitions/error/bad_request.yml: -------------------------------------------------------------------------------- 1 | title: data 2 | type: object 3 | properties: 4 | description: 5 | type: string 6 | errors: 7 | type: array 8 | items: 9 | $ref: '#/definitions/request_error' 10 | -------------------------------------------------------------------------------- /swagger/definitions/resource/contact_inboxes.yml: -------------------------------------------------------------------------------- 1 | type: object 2 | properties: 3 | source_id: 4 | type: string 5 | description: Contact Inbox Source Id 6 | inbox: 7 | type: object 8 | $ref: '#/definitions/inbox' 9 | -------------------------------------------------------------------------------- /swagger/definitions/resource/contactable_inboxes.yml: -------------------------------------------------------------------------------- 1 | type: object 2 | properties: 3 | source_id: 4 | type: string 5 | description: Contact Inbox Source Id 6 | inbox: 7 | type: object 8 | $ref: '#/definitions/inbox' 9 | -------------------------------------------------------------------------------- /swagger/definitions/resource/platform_account.yml: -------------------------------------------------------------------------------- 1 | type: object 2 | properties: 3 | id: 4 | type: number 5 | description: Account ID 6 | name: 7 | type: string 8 | description: Name of the account 9 | 10 | -------------------------------------------------------------------------------- /app/assets/stylesheets/administrate/components/_app-container.scss: -------------------------------------------------------------------------------- 1 | .app-container { 2 | align-items: stretch; 3 | display: flex; 4 | margin-left: auto; 5 | margin-right: auto; 6 | max-width: 100rem; 7 | min-height: 100vh; 8 | } 9 | -------------------------------------------------------------------------------- /app/javascript/dashboard/i18n/locale/lv/emoji.json: -------------------------------------------------------------------------------- 1 | { 2 | "EMOJI": { 3 | "PLACEHOLDER": "Meklēt emocijzīmes", 4 | "NOT_FOUND": "Neviena emocijzīme neatbilst jūsu meklēšanas vaicājumam", 5 | "REMOVE": "Noņemt" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /db/migrate/20230525085402_add_custom_sender_name_toggle.rb: -------------------------------------------------------------------------------- 1 | class AddCustomSenderNameToggle < ActiveRecord::Migration[7.0] 2 | def change 3 | add_column :inboxes, :sender_name_type, :integer, default: 0, null: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /spec/models/team_member_spec.rb: -------------------------------------------------------------------------------- 1 | require 'rails_helper' 2 | 3 | RSpec.describe TeamMember do 4 | describe 'associations' do 5 | it { is_expected.to belong_to(:team) } 6 | it { is_expected.to belong_to(:user) } 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /app/controllers/webhooks/sms_controller.rb: -------------------------------------------------------------------------------- 1 | class Webhooks::SmsController < ActionController::API 2 | def process_payload 3 | Webhooks::SmsEventsJob.perform_later(params['_json']&.first&.to_unsafe_hash) 4 | head :ok 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /app/controllers/webhooks/telegram_controller.rb: -------------------------------------------------------------------------------- 1 | class Webhooks::TelegramController < ActionController::API 2 | def process_payload 3 | Webhooks::TelegramEventsJob.perform_later(params.to_unsafe_hash) 4 | head :ok 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/csat_survey_responses/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.array! @csat_survey_responses do |csat_survey_response| 2 | json.partial! 'api/v1/models/csat_survey_response', formats: [:json], resource: csat_survey_response 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v2/accounts/reports/conversation_traffic.erb: -------------------------------------------------------------------------------- 1 | <%= CSV.generate_line [I18n.t('reports.conversation_traffic_csv.timezone'), @timezone] %> 2 | 3 | <% @report_data.each do |row| %> 4 | <%= CSVSafe.generate_line row -%> 5 | <% end %> 6 | -------------------------------------------------------------------------------- /db/migrate/20230510113208_set_default_empty_string_for_contact_name.rb: -------------------------------------------------------------------------------- 1 | class SetDefaultEmptyStringForContactName < ActiveRecord::Migration[7.0] 2 | def change 3 | change_column_default :contacts, :name, from: nil, to: '' 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20250107030743_add_config_to_captain_assistant.rb: -------------------------------------------------------------------------------- 1 | class AddConfigToCaptainAssistant < ActiveRecord::Migration[7.0] 2 | def change 3 | add_column :captain_assistants, :config, :jsonb, default: {}, null: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /enterprise/app/models/enterprise/audit/account.rb: -------------------------------------------------------------------------------- 1 | module Enterprise::Audit::Account 2 | extend ActiveSupport::Concern 3 | 4 | included do 5 | audited except: :updated_at, on: [:update] 6 | has_associated_audits 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /enterprise/app/views/api/v1/accounts/sla_policies/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.array! @sla_policies do |sla_policy| 3 | json.partial! 'api/v1/models/sla_policy', formats: [:json], sla_policy: sla_policy 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /enterprise/app/views/api/v1/models/_sla_event.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.id sla_event.id 2 | json.event_type sla_event.event_type 3 | json.meta sla_event.meta 4 | json.updated_at sla_event.updated_at.to_i 5 | json.created_at sla_event.created_at.to_i 6 | -------------------------------------------------------------------------------- /spec/models/portal_member_spec.rb: -------------------------------------------------------------------------------- 1 | require 'rails_helper' 2 | 3 | RSpec.describe PortalMember do 4 | describe 'associations' do 5 | it { is_expected.to belong_to(:portal) } 6 | it { is_expected.to belong_to(:user) } 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [clairton] 2 | custom: ['00020126580014br.gov.bcb.pix01360e42d192-f4d6-4672-810b-41d69eba336e5204000053039865406100.005802BR5924CLAIRTON RODRIGO HEINZEN6005Xaxim610989825-00062290525MWPT78825270172816811340663042E8F'] 3 | -------------------------------------------------------------------------------- /app/controllers/webhooks/notifica_me_controller.rb: -------------------------------------------------------------------------------- 1 | class Webhooks::NotificaMeController < ActionController::API 2 | def process_payload 3 | Webhooks::NotificaMeEventsJob.perform_later(params.to_unsafe_hash) 4 | head :ok 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /app/helpers/frontend_urls_helper.rb: -------------------------------------------------------------------------------- 1 | module FrontendUrlsHelper 2 | def frontend_url(path, **query_params) 3 | url_params = query_params.blank? ? '' : "?#{query_params.to_query}" 4 | "#{root_url}app/#{path}#{url_params}" 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /app/javascript/widget/helpers/WidgetAudioNotificationHelper.js: -------------------------------------------------------------------------------- 1 | import { IFrameHelper } from 'widget/helpers/utils'; 2 | 3 | export const playNewMessageNotificationInWidget = () => { 4 | IFrameHelper.sendMessage({ event: 'playAudio' }); 5 | }; 6 | -------------------------------------------------------------------------------- /app/jobs/conversations/activity_message_job.rb: -------------------------------------------------------------------------------- 1 | class Conversations::ActivityMessageJob < ApplicationJob 2 | queue_as :high 3 | 4 | def perform(conversation, message_params) 5 | conversation.messages.create!(message_params) 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/search/contacts.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.contacts do 3 | json.array! @result[:contacts] do |contact| 4 | json.partial! 'contact', formats: [:json], contact: contact 5 | end 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/search/messages.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.messages do 3 | json.array! @result[:messages] do |message| 4 | json.partial! 'message', formats: [:json], message: message 5 | end 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /docker/dockerfiles/vite.Dockerfile: -------------------------------------------------------------------------------- 1 | FROM chatwoot:development 2 | 3 | ENV PNPM_HOME="/root/.local/share/pnpm" 4 | ENV PATH="$PNPM_HOME:$PATH" 5 | 6 | RUN chmod +x docker/entrypoints/vite.sh 7 | 8 | EXPOSE 3036 9 | CMD ["bin/vite", "dev"] 10 | -------------------------------------------------------------------------------- /enterprise/app/finders/enterprise/conversation_finder.rb: -------------------------------------------------------------------------------- 1 | module Enterprise::ConversationFinder 2 | def conversations_base_query 3 | current_account.feature_enabled?('sla') ? super.includes(:applied_sla, :sla_events) : super 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to Chatwoot 2 | 3 | Thanks for taking the time to contribute! :tada::+1: 4 | 5 | Please refer to our [Contributing Guide](https://www.chatwoot.com/docs/contributing-guide) for detailed instructions on how to contribute. 6 | -------------------------------------------------------------------------------- /app/assets/stylesheets/administrate/library/_data-label.scss: -------------------------------------------------------------------------------- 1 | @mixin data-label { 2 | color: $hint-grey; 3 | font-size: 0.8em; 4 | font-weight: 400; 5 | letter-spacing: 0.0357em; 6 | position: relative; 7 | text-transform: uppercase; 8 | } 9 | -------------------------------------------------------------------------------- /app/dispatchers/base_dispatcher.rb: -------------------------------------------------------------------------------- 1 | class BaseDispatcher 2 | include Wisper::Publisher 3 | 4 | def listeners 5 | [] 6 | end 7 | 8 | def load_listeners 9 | listeners.each { |listener| subscribe(listener) } 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /app/javascript/dashboard/api/sla.js: -------------------------------------------------------------------------------- 1 | import ApiClient from './ApiClient'; 2 | 3 | class SlaAPI extends ApiClient { 4 | constructor() { 5 | super('sla_policies', { accountScoped: true }); 6 | } 7 | } 8 | 9 | export default new SlaAPI(); 10 | -------------------------------------------------------------------------------- /app/javascript/dashboard/components/layout/config/sidebarItems/notifications.js: -------------------------------------------------------------------------------- 1 | const notifications = () => ({ 2 | parentNav: 'notifications', 3 | routes: ['notifications_index'], 4 | menuItems: [], 5 | }); 6 | 7 | export default notifications; 8 | -------------------------------------------------------------------------------- /app/javascript/v3/api/testimonials.js: -------------------------------------------------------------------------------- 1 | import wootConstants from 'dashboard/constants/globals'; 2 | import wootAPI from './apiClient'; 3 | 4 | export const getTestimonialContent = () => { 5 | return wootAPI.get(wootConstants.TESTIMONIAL_URL); 6 | }; 7 | -------------------------------------------------------------------------------- /app/views/api/v1/models/_custom_filter.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.id resource.id 2 | json.name resource.name 3 | json.filter_type resource.filter_type 4 | json.query resource.query 5 | json.created_at resource.created_at 6 | json.updated_at resource.updated_at 7 | -------------------------------------------------------------------------------- /app/views/api/v1/widget/contacts/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.id @contact.id 2 | json.has_email @contact.email.present? 3 | json.has_name @contact.name.present? 4 | json.has_phone_number @contact.phone_number.present? 5 | json.identifier @contact.identifier 6 | -------------------------------------------------------------------------------- /app/views/fields/serialized_field/_show.html.erb: -------------------------------------------------------------------------------- 1 | <% if field.array? %> 2 | <% field.data.each do |sub_field| %> 3 |Hi {{user.available_name}}
2 | 3 | 4 |{{ custom_message }}
5 | 6 |7 | Click here to get cracking. 8 |
9 | -------------------------------------------------------------------------------- /app/views/public/api/v1/inboxes/contacts/create.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.source_id @contact_inbox.source_id 2 | json.pubsub_token @contact_inbox.pubsub_token 3 | json.partial! 'public/api/v1/models/contact', resource: @contact_inbox.contact, formats: [:json] 4 | -------------------------------------------------------------------------------- /app/views/public/api/v1/inboxes/contacts/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.source_id @contact_inbox.source_id 2 | json.pubsub_token @contact_inbox.pubsub_token 3 | json.partial! 'public/api/v1/models/contact', formats: [:json], resource: @contact_inbox.contact 4 | -------------------------------------------------------------------------------- /app/views/public/api/v1/inboxes/contacts/update.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.source_id @contact_inbox.source_id 2 | json.pubsub_token @contact_inbox.pubsub_token 3 | json.partial! 'public/api/v1/models/contact', formats: [:json], resource: @contact_inbox.contact 4 | -------------------------------------------------------------------------------- /db/migrate/20231201014644_remove_notifications_with_message_primary_actor.rb: -------------------------------------------------------------------------------- 1 | class RemoveNotificationsWithMessagePrimaryActor < ActiveRecord::Migration[7.0] 2 | def change 3 | Migration::RemoveMessageNotifications.perform_later 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20250108211541_remove_index_from_captain_assistants.rb: -------------------------------------------------------------------------------- 1 | class RemoveIndexFromCaptainAssistants < ActiveRecord::Migration[7.0] 2 | def change 3 | remove_index :captain_assistants, [:account_id, :name], if_exists: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /docker/entrypoints/vite.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -x 3 | 4 | rm -rf /app/tmp/pids/server.pid 5 | rm -rf /app/tmp/cache/* 6 | 7 | pnpm store prune 8 | pnpm install --force 9 | 10 | echo "Ready to run Vite development server." 11 | 12 | exec "$@" 13 | -------------------------------------------------------------------------------- /enterprise/app/jobs/sla/process_applied_sla_job.rb: -------------------------------------------------------------------------------- 1 | class Sla::ProcessAppliedSlaJob < ApplicationJob 2 | queue_as :medium 3 | 4 | def perform(applied_sla) 5 | Sla::EvaluateAppliedSlaService.new(applied_sla: applied_sla).perform 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /enterprise/app/models/enterprise/automation_rule.rb: -------------------------------------------------------------------------------- 1 | module Enterprise::AutomationRule 2 | def conditions_attributes 3 | super + %w[sla_policy_id] 4 | end 5 | 6 | def actions_attributes 7 | super + %w[add_sla] 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /lib/integrations/openai/openai_prompts/summary.txt: -------------------------------------------------------------------------------- 1 | Please summarize the key points from the following conversation between support agents and customer as bullet points for the next support agent looking into the conversation. Reply in the user's language. -------------------------------------------------------------------------------- /spec/factories/canned_responses.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | FactoryBot.define do 4 | factory :canned_response do 5 | content { 'Content' } 6 | sequence(:short_code) { |n| "CODE#{n}" } 7 | account 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | # Add your own tasks in files placed in lib/tasks ending in .rake, 2 | # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. 3 | 4 | require_relative 'config/application' 5 | 6 | Rails.application.load_tasks 7 | -------------------------------------------------------------------------------- /app/controllers/concerns/domain_helper.rb: -------------------------------------------------------------------------------- 1 | module DomainHelper 2 | def self.chatwoot_domain?(domain = request.host) 3 | [URI.parse(ENV.fetch('FRONTEND_URL', '')).host, URI.parse(ENV.fetch('HELPCENTER_URL', '')).host].include?(domain) 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/api/webhooks.js: -------------------------------------------------------------------------------- 1 | import ApiClient from './ApiClient'; 2 | 3 | class WebHooks extends ApiClient { 4 | constructor() { 5 | super('webhooks', { accountScoped: true }); 6 | } 7 | } 8 | 9 | export default new WebHooks(); 10 | -------------------------------------------------------------------------------- /app/javascript/dashboard/components/widgets/conversation/linear/validations.js: -------------------------------------------------------------------------------- 1 | import { required } from '@vuelidate/validators'; 2 | 3 | export default { 4 | title: { 5 | required, 6 | }, 7 | teamId: { 8 | required, 9 | }, 10 | }; 11 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/categories/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.array! @categories, partial: 'category', as: :category 3 | end 4 | 5 | json.meta do 6 | json.current_page @current_page 7 | json.categories_count @categories.size 8 | end 9 | -------------------------------------------------------------------------------- /app/views/fields/serialized_field/_index.html.erb: -------------------------------------------------------------------------------- 1 | <% if field.array? %> 2 | <% field.data.each do |sub_field| %> 3 |Hi {{user.available_name}}
2 | 3 | 4 |{{ custom_message }}
5 | 6 |7 | Click here to get cracking. 8 |
9 | -------------------------------------------------------------------------------- /app/views/public/api/v1/inboxes/show.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.identifier @inbox_channel.identifier 2 | json.identity_validation_enabled @inbox_channel.hmac_mandatory 3 | json.partial! 'public/api/v1/models/inbox', formats: [:json], resource: @inbox_channel.inbox 4 | -------------------------------------------------------------------------------- /config/initializers/rack_profiler.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | if Rails.env.development? 4 | require 'rack-mini-profiler' 5 | 6 | # initialization is skipped so trigger it 7 | Rack::MiniProfilerRails.initialize!(Rails.application) 8 | end 9 | -------------------------------------------------------------------------------- /db/migrate/20230608040738_add_processed_message_content_to_messages.rb: -------------------------------------------------------------------------------- 1 | class AddProcessedMessageContentToMessages < ActiveRecord::Migration[7.0] 2 | def change 3 | add_column :messages, :processed_message_content, :text, null: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20240131040316_remove_imap_inbox_syned_at_from_channel_email.rb: -------------------------------------------------------------------------------- 1 | class RemoveImapInboxSynedAtFromChannelEmail < ActiveRecord::Migration[7.0] 2 | def change 3 | remove_column :channel_email, :imap_inbox_synced_at, :datetime 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /spec/factories/data_import.rb: -------------------------------------------------------------------------------- 1 | FactoryBot.define do 2 | factory :data_import do 3 | data_type { 'contacts' } 4 | import_file { Rack::Test::UploadedFile.new(Rails.root.join('spec/assets/contacts.csv'), 'text/csv') } 5 | account 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/controllers/concerns/label_concern.rb: -------------------------------------------------------------------------------- 1 | module LabelConcern 2 | def create 3 | model.update_labels(permitted_params[:labels]) 4 | @labels = model.label_list 5 | end 6 | 7 | def index 8 | @labels = model.label_list 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /app/javascript/dashboard/components/layout/config/sidebarItems/profileSettings.js: -------------------------------------------------------------------------------- 1 | const profileSettings = () => ({ 2 | parentNav: 'profileSettings', 3 | routes: ['profile_settings_index'], 4 | menuItems: [], 5 | }); 6 | 7 | export default profileSettings; 8 | -------------------------------------------------------------------------------- /app/views/icons/_check-mark.html.erb: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /db/migrate/20240213131252_add_blocked_to_contacts.rb: -------------------------------------------------------------------------------- 1 | class AddBlockedToContacts < ActiveRecord::Migration[7.0] 2 | def change 3 | add_column :contacts, :blocked, :boolean, default: false, null: false 4 | add_index :contacts, :blocked 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /lib/url_helper.rb: -------------------------------------------------------------------------------- 1 | require 'uri' 2 | module UrlHelper 3 | def url_valid?(url) 4 | url = begin 5 | URI.parse(url) 6 | rescue StandardError 7 | false 8 | end 9 | url.is_a?(URI::HTTP) || url.is_a?(URI::HTTPS) 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /spec/factories/captain/assistant.rb: -------------------------------------------------------------------------------- 1 | FactoryBot.define do 2 | factory :captain_assistant, class: 'Captain::Assistant' do 3 | sequence(:name) { |n| "Assistant #{n}" } 4 | description { 'Test description' } 5 | association :account 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /spec/models/related_category_spec.rb: -------------------------------------------------------------------------------- 1 | require 'rails_helper' 2 | 3 | RSpec.describe RelatedCategory do 4 | describe 'associations' do 5 | it { is_expected.to belong_to(:category) } 6 | it { is_expected.to belong_to(:related_category) } 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /app/javascript/dashboard/api/campaigns.js: -------------------------------------------------------------------------------- 1 | import ApiClient from './ApiClient'; 2 | 3 | class CampaignsAPI extends ApiClient { 4 | constructor() { 5 | super('campaigns', { accountScoped: true }); 6 | } 7 | } 8 | 9 | export default new CampaignsAPI(); 10 | -------------------------------------------------------------------------------- /app/javascript/dashboard/api/customRole.js: -------------------------------------------------------------------------------- 1 | import ApiClient from './ApiClient'; 2 | 3 | class CustomRole extends ApiClient { 4 | constructor() { 5 | super('custom_roles', { accountScoped: true }); 6 | } 7 | } 8 | 9 | export default new CustomRole(); 10 | -------------------------------------------------------------------------------- /app/javascript/shared/assets/stylesheets/font-weights.scss: -------------------------------------------------------------------------------- 1 | :root { 2 | --font-weight-feather: 100; 3 | --font-weight-light: 300; 4 | --font-weight-normal: 400; 5 | --font-weight-medium: 500; 6 | --font-weight-bold: 600; 7 | --font-weight-black: 700; 8 | } 9 | -------------------------------------------------------------------------------- /app/javascript/shared/components/specs/__snapshots__/Spinner.spec.js.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[`Spinner > matches snapshot 1`] = ` 4 | 8 | `; 9 | -------------------------------------------------------------------------------- /app/javascript/shared/helpers/specs/Emoji.spec.js: -------------------------------------------------------------------------------- 1 | import { removeEmoji } from '../emoji'; 2 | 3 | describe('#removeEmoji', () => { 4 | it('returns values without emoji', () => { 5 | expect(removeEmoji('😄Hi👋🏻 there❕')).toEqual('Hi there'); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /app/jobs/event_dispatcher_job.rb: -------------------------------------------------------------------------------- 1 | class EventDispatcherJob < ApplicationJob 2 | queue_as :critical 3 | 4 | def perform(event_name, timestamp, data) 5 | Rails.configuration.dispatcher.async_dispatcher.publish_event(event_name, timestamp, data) 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/jobs/notification/push_notification_job.rb: -------------------------------------------------------------------------------- 1 | class Notification::PushNotificationJob < ApplicationJob 2 | queue_as :default 3 | 4 | def perform(notification) 5 | Notification::PushNotificationService.new(notification: notification).perform 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/services/whatsapp/incoming_message_service.rb: -------------------------------------------------------------------------------- 1 | # https://docs.360dialog.com/whatsapp-api/whatsapp-api/media 2 | # https://developers.facebook.com/docs/whatsapp/api/media/ 3 | 4 | class Whatsapp::IncomingMessageService < Whatsapp::IncomingMessageBaseService 5 | end 6 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/contacts/conversations/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.payload do 2 | json.array! @conversations do |conversation| 3 | json.partial! 'api/v1/conversations/partials/conversation', formats: [:json], conversation: conversation 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/views/mailers/team_notifications/automation_notification_mailer/conversation_creation.liquid: -------------------------------------------------------------------------------- 1 |This is the mail from Automation System
2 | 3 |{{ custom_message }}
4 | 5 |6 | Click here to get cracking. 7 |
8 | -------------------------------------------------------------------------------- /config/initializers/omniauth.rb: -------------------------------------------------------------------------------- 1 | Rails.application.config.middleware.use OmniAuth::Builder do 2 | provider :google_oauth2, ENV.fetch('GOOGLE_OAUTH_CLIENT_ID', nil), ENV.fetch('GOOGLE_OAUTH_CLIENT_SECRET', nil), { 3 | provider_ignores_state: true 4 | } 5 | end 6 | -------------------------------------------------------------------------------- /config/initializers/rack_timeout.rb: -------------------------------------------------------------------------------- 1 | require 'rack-timeout' 2 | 3 | # Reduce noise by filtering state=ready and state=completed which are logged at INFO level 4 | Rails.application.config.after_initialize do 5 | Rack::Timeout::Logger.level = Logger::ERROR 6 | end 7 | -------------------------------------------------------------------------------- /docker/dockerfiles/rails.Dockerfile: -------------------------------------------------------------------------------- 1 | FROM chatwoot:development 2 | 3 | ENV PNPM_HOME="/root/.local/share/pnpm" 4 | ENV PATH="$PNPM_HOME:$PATH" 5 | 6 | RUN chmod +x docker/entrypoints/rails.sh 7 | 8 | EXPOSE 3000 9 | CMD ["rails", "server", "-b", "0.0.0.0", "-p", "3000"] -------------------------------------------------------------------------------- /app/javascript/dashboard/api/agentBots.js: -------------------------------------------------------------------------------- 1 | import ApiClient from './ApiClient'; 2 | 3 | class AgentBotsAPI extends ApiClient { 4 | constructor() { 5 | super('agent_bots', { accountScoped: true }); 6 | } 7 | } 8 | 9 | export default new AgentBotsAPI(); 10 | -------------------------------------------------------------------------------- /app/javascript/dashboard/api/channel/webChannel.js: -------------------------------------------------------------------------------- 1 | import ApiClient from '../ApiClient'; 2 | 3 | class WebChannel extends ApiClient { 4 | constructor() { 5 | super('inboxes', { accountScoped: true }); 6 | } 7 | } 8 | 9 | export default new WebChannel(); 10 | -------------------------------------------------------------------------------- /app/javascript/dashboard/constants/appEvents.js: -------------------------------------------------------------------------------- 1 | export const CHATWOOT_SET_USER = 'CHATWOOT_SET_USER'; 2 | export const CHATWOOT_RESET = 'CHATWOOT_RESET'; 3 | 4 | export const ANALYTICS_IDENTITY = 'ANALYTICS_IDENTITY'; 5 | export const ANALYTICS_RESET = 'ANALYTICS_RESET'; 6 | -------------------------------------------------------------------------------- /app/javascript/dashboard/store/captain/document.js: -------------------------------------------------------------------------------- 1 | import CaptainDocumentAPI from 'dashboard/api/captain/document'; 2 | import { createStore } from './storeFactory'; 3 | 4 | export default createStore({ 5 | name: 'CaptainDocument', 6 | API: CaptainDocumentAPI, 7 | }); 8 | -------------------------------------------------------------------------------- /app/views/platform/api/v1/models/_agent_bot.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.id resource.id 2 | json.name resource.name 3 | json.description resource.description 4 | json.outgoing_url resource.name 5 | json.account_id resource.account_id 6 | json.access_token resource.access_token.token 7 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | .bundle 2 | .env 3 | .env.* 4 | docker-compose.* 5 | docker/Dockerfile 6 | docker/dockerfiles 7 | log 8 | storage 9 | public/system 10 | tmp 11 | .codeclimate.yml 12 | public/packs 13 | node_modules 14 | vendor/bundle 15 | .DS_Store 16 | *.swp 17 | *~ 18 | -------------------------------------------------------------------------------- /app/controllers/api/v1/widget/campaigns_controller.rb: -------------------------------------------------------------------------------- 1 | class Api::V1::Widget::CampaignsController < Api::V1::Widget::BaseController 2 | skip_before_action :set_contact 3 | 4 | def index 5 | @campaigns = @web_widget.inbox.campaigns.where(enabled: true) 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/javascript/dashboard/api/bulkActions.js: -------------------------------------------------------------------------------- 1 | import ApiClient from './ApiClient'; 2 | 3 | class BulkActionsAPI extends ApiClient { 4 | constructor() { 5 | super('bulk_actions', { accountScoped: true }); 6 | } 7 | } 8 | 9 | export default new BulkActionsAPI(); 10 | -------------------------------------------------------------------------------- /app/javascript/dashboard/store/captain/assistant.js: -------------------------------------------------------------------------------- 1 | import CaptainAssistantAPI from 'dashboard/api/captain/assistant'; 2 | import { createStore } from './storeFactory'; 3 | 4 | export default createStore({ 5 | name: 'CaptainAssistant', 6 | API: CaptainAssistantAPI, 7 | }); 8 | -------------------------------------------------------------------------------- /app/views/api/v1/accounts/custom_attribute_definitions/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.array! @custom_attribute_definitions do |custom_attribute_definition| 2 | json.partial! 'api/v1/models/custom_attribute_definition', formats: [:json], resource: custom_attribute_definition 3 | end 4 | -------------------------------------------------------------------------------- /app/views/api/v1/models/_inbox_slim.json.jbuilder: -------------------------------------------------------------------------------- 1 | json.id resource.id 2 | json.avatar_url resource.try(:avatar_url) 3 | json.channel_id resource.channel_id 4 | json.name resource.name 5 | json.channel_type resource.channel_type 6 | json.provider resource.channel.try(:provider) 7 | -------------------------------------------------------------------------------- /app/views/api/v1/widget/conversations/index.json.jbuilder: -------------------------------------------------------------------------------- 1 | if @conversation 2 | json.id @conversation.display_id 3 | json.inbox_id @conversation.inbox_id 4 | json.contact_last_seen_at @conversation.contact_last_seen_at.to_i 5 | json.status @conversation.status 6 | end 7 | -------------------------------------------------------------------------------- /db/migrate/20230620212340_add_waiting_since_to_conversations.rb: -------------------------------------------------------------------------------- 1 | class AddWaitingSinceToConversations < ActiveRecord::Migration[7.0] 2 | def change 3 | add_column :conversations, :waiting_since, :datetime 4 | add_index :conversations, :waiting_since 5 | end 6 | end 7 | --------------------------------------------------------------------------------