diff --git a/ee/app/assets/images/duo_pro/code_explanations_feature_icon.png b/ee/app/assets/images/mailers/duo/code_explanations_feature_icon.png similarity index 100% rename from ee/app/assets/images/duo_pro/code_explanations_feature_icon.png rename to ee/app/assets/images/mailers/duo/code_explanations_feature_icon.png diff --git a/ee/app/assets/images/duo_pro/code_suggestions_demo.gif b/ee/app/assets/images/mailers/duo/code_suggestions_demo.gif similarity index 100% rename from ee/app/assets/images/duo_pro/code_suggestions_demo.gif rename to ee/app/assets/images/mailers/duo/code_suggestions_demo.gif diff --git a/ee/app/assets/images/duo_pro/code_suggestions_feature_icon.png b/ee/app/assets/images/mailers/duo/code_suggestions_feature_icon.png similarity index 100% rename from ee/app/assets/images/duo_pro/code_suggestions_feature_icon.png rename to ee/app/assets/images/mailers/duo/code_suggestions_feature_icon.png diff --git a/ee/app/assets/images/mailers/duo/duo_book_epic_icon.png b/ee/app/assets/images/mailers/duo/duo_book_epic_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..93c31b42ddeaafe679faeae7ab97fdf61e04fada Binary files /dev/null and b/ee/app/assets/images/mailers/duo/duo_book_epic_icon.png differ diff --git a/ee/app/assets/images/duo_pro/duo_white_logo.png b/ee/app/assets/images/mailers/duo/duo_white_logo.png similarity index 100% rename from ee/app/assets/images/duo_pro/duo_white_logo.png rename to ee/app/assets/images/mailers/duo/duo_white_logo.png diff --git a/ee/app/assets/images/mailers/duo/root_cause_analysis_preview.png b/ee/app/assets/images/mailers/duo/root_cause_analysis_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..d68a0a94ef368a7a7bf667601b688547ba522d99 Binary files /dev/null and b/ee/app/assets/images/mailers/duo/root_cause_analysis_preview.png differ diff --git a/ee/app/assets/images/duo_pro/test_generation_feature_icon.png b/ee/app/assets/images/mailers/duo/test_generation_feature_icon.png similarity index 100% rename from ee/app/assets/images/duo_pro/test_generation_feature_icon.png rename to ee/app/assets/images/mailers/duo/test_generation_feature_icon.png diff --git a/ee/app/assets/images/mailers/duo/vulnerability_ai_icon.png b/ee/app/assets/images/mailers/duo/vulnerability_ai_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..76688f48c0fcaff75039f03d5c94f98bb3cc8f18 Binary files /dev/null and b/ee/app/assets/images/mailers/duo/vulnerability_ai_icon.png differ diff --git a/ee/app/mailers/gitlab_subscriptions/duo_seat_assignment_mailer.rb b/ee/app/mailers/gitlab_subscriptions/duo_seat_assignment_mailer.rb index 76c953f8f4c1826d2773f392e765e215f0421b2e..40ca83b2d2841444a6ab60d619a9de36ec228af1 100644 --- a/ee/app/mailers/gitlab_subscriptions/duo_seat_assignment_mailer.rb +++ b/ee/app/mailers/gitlab_subscriptions/duo_seat_assignment_mailer.rb @@ -9,5 +9,10 @@ def duo_pro_email(user) email = user.notification_email_or_default mail_with_locale(to: email, subject: s_('CodeSuggestions|Welcome to GitLab Duo Pro!')) end + + def duo_enterprise_email(user) + email = user.notification_email_or_default + mail_with_locale(to: email, subject: s_('DuoEnterprise|Welcome to GitLab Duo Enterprise!')) + end end end diff --git a/ee/app/mailers/previews/gitlab_subscriptions/duo_seat_assignment_mailer_preview.rb b/ee/app/mailers/previews/gitlab_subscriptions/duo_seat_assignment_mailer_preview.rb index 728acc1c75933ae3231f418686e509144dccfa77..178c8cdeb556845ec1c4408e55cf630b55fe1713 100644 --- a/ee/app/mailers/previews/gitlab_subscriptions/duo_seat_assignment_mailer_preview.rb +++ b/ee/app/mailers/previews/gitlab_subscriptions/duo_seat_assignment_mailer_preview.rb @@ -5,5 +5,9 @@ class DuoSeatAssignmentMailerPreview < ActionMailer::Preview def duo_pro_email ::GitlabSubscriptions::DuoSeatAssignmentMailer.duo_pro_email(User.last).message end + + def duo_enterprise_email + ::GitlabSubscriptions::DuoSeatAssignmentMailer.duo_enterprise_email(User.last).message + end end end diff --git a/ee/app/services/gitlab_subscriptions/user_add_on_assignments/self_managed/create_service.rb b/ee/app/services/gitlab_subscriptions/user_add_on_assignments/self_managed/create_service.rb index 7c32bd37bc07e5f2f7df166c1c54da581fd53164..57d91f078bb69a780ca27215b26f194fd262f9e4 100644 --- a/ee/app/services/gitlab_subscriptions/user_add_on_assignments/self_managed/create_service.rb +++ b/ee/app/services/gitlab_subscriptions/user_add_on_assignments/self_managed/create_service.rb @@ -22,14 +22,14 @@ def eligible_for_gitlab_duo_pro_seat? strong_memoize_attr :eligible_for_gitlab_duo_pro_seat? def send_duo_seat_assignment_email - DuoSeatAssignmentMailer.duo_pro_email(user).deliver_later + DuoSeatAssignmentMailer.duo_pro_email(user).deliver_later if add_on_purchase.add_on.code_suggestions? + DuoSeatAssignmentMailer.duo_enterprise_email(user).deliver_later if add_on_purchase.add_on.duo_enterprise? end def should_send_duo_seat_assignment_email?(response) Feature.enabled?(:duo_seat_assignment_email_for_sm, :instance) && !user_already_assigned? && - response.success? && - add_on_purchase.add_on.code_suggestions? # checking if it is a duo_pro add_on + response.success? end end end diff --git a/ee/app/views/gitlab_subscriptions/duo_seat_assignment_mailer/duo_enterprise_email.html.haml b/ee/app/views/gitlab_subscriptions/duo_seat_assignment_mailer/duo_enterprise_email.html.haml new file mode 100644 index 0000000000000000000000000000000000000000..f541e67a8a4fed78052e0054b36fcd2884274ef2 --- /dev/null +++ b/ee/app/views/gitlab_subscriptions/duo_seat_assignment_mailer/duo_enterprise_email.html.haml @@ -0,0 +1,91 @@ +- demo_link = 'https://gitlab.navattic.com/duo-enterprise?utm_medium=email&utm_source=iterable&utm_campaign=eg_global_lfc_nurture_aisdlc_en_duoenterpriseseatallocation&utm_content=onboarding_email_x' +- click_through_demo_link = link_to('', demo_link, target: '_blank', rel: 'noopener noreferrer') +:css + a {color: #A989F5 } + table { border-collapse: collapse !important; } +%table{ border: "0", cellpadding: "0", cellspacing: "0", role: "presentation", width: "100%" } + %tr + %td{ align: "center", style: "padding: 0px;" } + %table{ border: "0", cellpadding: "0", cellspacing: "0", role: "presentation", style: "background-color: #171321", width: "600" } + %tr + %td{ style: "padding: 0px;" } + %table{ border: "0", cellpadding: "0", cellspacing: "0", role: "presentation", width: "100%" } + %tr + %td{ align: "left", style: "padding: 20px;" } + %a{ href: "https://about.gitlab.com/", target: "_blank", rel: "noopener noreferrer nofollow" } + %img{ alt: "go to demo", src: image_url('mailers/duo/duo_white_logo.png'), width: "150" } + + %tr + %td{ style: "max-width: 600px; width: 100%; text-align: left; height: 62px; padding: 0 20px; min-height: 40px; font-family: 'Source Sans Pro', helvetica, arial, sans-serif;", valign: "middle", width: "100%" } + %h1{ style: "padding-bottom: 13px; color: #ffffff; margin: 0;" } + = s_('DuoEnterprise|You have been assigned a GitLab Duo Enterprise seat') + + %tr + %td{ align: "left", style: "padding: 0 20px;" } + %a.logo{ href: demo_link } + %img{ alt: "sign in", src: image_url('mailers/duo/root_cause_analysis_preview'), width: "540" } + + %tr + %td{ style: "padding: 20px 50px 20px 30px; font-family: 'Source Sans Pro', helvetica, arial, sans-serif; color: #ffffff; line-height: 20px;" } + %p + = safe_format(s_('DuoEnterprise|You now have access to %{link_start}GitLab Duo Enterprise%{link_end}, the only AI solution that supports developers at every stage of the software development lifecycle.'), tag_pair(click_through_demo_link, :link_start, :link_end)) + %p + - help_link = link_to('', help_page_url('editor_extensions/index.md'), target: '_blank', rel: 'noopener noreferrer') + = safe_format(s_('DuoEnterprise|To get started using GitLab Duo Enterprise features, %{link_start}set up your IDE for success.%{link_end}.'), tag_pair(help_link, :link_start, :link_end)) + + %tr + %td{ align: "left", style: "padding: 10px 40px 30px 40px; font-family: 'Source Sans Pro', helvetica, arial, sans-serif; color: #ffffff;" } + %a{ href: help_page_url('user/gitlab_duo/turn_on_off.md', anchor: 'configure-gitlab-duo-on-a-self-managed-instance'), style: "font-weight: bold; font-family: 'Source Sans Pro', helvetica, arial, sans-serif; color: #ffffff; text-decoration: none; border-radius: 3px; border-top: 10px solid #7759c2; border-bottom: 10px solid #7759c2; border-right: 25px solid #7759c2; border-left: 25px solid #7759c2; background-color: #7759c2; display: inline-block;", target: "_blank", rel: "noopener noreferrer nofollow" } + = _('Get started') + %p{ style: "padding-left: 10px; font-size: 12px;" } + = safe_format(s_('DuoEnterprise|Need help enabling features? Check to make sure an administrator has %{link_start}configured GitLab Duo on your instance%{link_end}.'), tag_pair(click_through_demo_link, :link_start, :link_end)) + + %tr + %td{ style: "text-align: left; height: 56px; padding: 0 40px; min-height: 40px; font-family: 'Source Sans Pro', helvetica, arial, sans-serif;", valign: "middle", width: "100%" } + %h3{ style: "font-size: 26px; line-height: 30px; color: #ffffff; font-weight: 600;" } + = s_('DuoEnterprise|Get started with these Duo Enterprise features:') + + %tr + %td{ style: "font-family: 'Source Sans Pro', helvetica, arial, sans-serif; " } + %table{ role: "presentation", style: "color: #ffffff; width: 540px" } + %tr + %td{ style: "vertical-align: top; padding: 0px 15px 20px 40px" } + %a{ href: help_page_url('user/gitlab_duo_chat/examples.md', anchor: 'troubleshoot-failed-cicd-jobs-with-root-cause-analysis') } + %img{ alt: "AI-assisted Root Cause Analysis", src: image_url('mailers/duo/code_suggestions_feature_icon'), width: "60" } + %td{ align: "left", style: "vertical-align: middle" } + %h3{ style: "line-height: 20px; margin: 0;" } + %a{ href: help_page_url('user/gitlab_duo_chat/examples.md', anchor: 'troubleshoot-failed-cicd-jobs-with-root-cause-analysis') } + = s_('DuoEnterprise|AI-assisted root cause analysis') + %p{ style: "margin: 13px 0px" } + = s_('DuoEnterprise|Quickly resolve CI/CD pipeline issues so developers can focus on critical tasks') + %tr + %td{ style: "vertical-align: top; padding: 20px 15px 0px 40px" } + %a{ href: help_page_url('user/application_security/vulnerabilities/index.md', anchor: 'vulnerability-resolution') } + %img{ alt: "AI-powered Vulnerability Remediation", src: image_url('mailers/duo/vulnerability_ai_icon'), width: "60" } + %td{ align: "left", style: "vertical-align: middle; padding: 20px 15px 0px 0px" } + %h3{ style: "line-height: 20px; margin: 0;" } + %a{ href: help_page_url('user/application_security/vulnerabilities/index.md', anchor: 'vulnerability-resolution') } + = s_('DuoEnterprise|AI-powered vulnerability remediation') + %p{ style: "margin: 13px 0px" } + = s_('DuoEnterprise|Understand and remediate vulnerabilities more efficiently to mitigate security risks') + %tr + %td{ style: "vertical-align: top; padding: 20px 15px 20px 40px" } + %a{ href: help_page_url('user/project/merge_requests/duo_in_merge_requests.md') } + %img{ alt: "Collaboration and Summarization Tools", src: image_url('mailers/duo/duo_book_epic_icon'), width: "60" } + %td{ align: "left", style: "vertical-align: middle; padding: 20px 15px 20px 0px" } + %h3{ style: "line-height: 20px; margin: 0;" } + %a{ href: help_page_url('user/project/merge_requests/duo_in_merge_requests.md') } + = s_('DuoEnterprise|Collaboration and summarization tools') + %p{ style: "margin: 13px 0px" } + = s_('DuoEnterprise|Easily get up to speed on issue discussions with concise overviews of proposed code changes') + + %tr + %td{ align: "left", style: "padding: 10px 40px 30px 40px; font-family: 'Source Sans Pro', helvetica, arial, sans-serif;" } + %a{ href: demo_link, style: "font-weight: bold; font-family: 'Source Sans Pro', helvetica, arial, sans-serif; color: #ffffff; text-decoration: none; border-radius: 3px; border-top: 10px solid #7759c2; border-bottom: 10px solid #7759c2; border-right: 25px solid #7759c2; border-left: 25px solid #7759c2; background-color: #7759c2; display: inline-block;", target: "_blank", rel: "noopener noreferrer nofollow" } + = _('Learn more') + + %tr + %td{ align: "center", style: "color: #ffffff; padding-top: 20px; font-family: 'Source Sans Pro', helvetica, arial, sans-serif;" } + %img{ alt: "GitLab", src: image_url('mailers/gitlab_logo.png'), width: "36" } + %p{ style: "font-size: 13px; padding: 20px" } + = notification_reason_text(show_manage_notifications_link: true, show_help_link: true, unsubscribe_url: @unsubscribe_url, format: :html) diff --git a/ee/app/views/gitlab_subscriptions/duo_seat_assignment_mailer/duo_enterprise_email.text.haml b/ee/app/views/gitlab_subscriptions/duo_seat_assignment_mailer/duo_enterprise_email.text.haml new file mode 100644 index 0000000000000000000000000000000000000000..603578a2fcf8c90f27a50136a58ceef634774958 --- /dev/null +++ b/ee/app/views/gitlab_subscriptions/duo_seat_assignment_mailer/duo_enterprise_email.text.haml @@ -0,0 +1,5 @@ += s_('DuoEnterprise|You have been assigned a GitLab Duo Enterprise seat!') + += s_('DuoEnterprise|You now have access to GitLab Duo Enterprise, the only AI solution that supports developers at every stage of the software development lifecycle.') + += _('Go to GitLab, visit %{login_url}.') % {login_url: new_session_url(:user)} diff --git a/ee/app/views/gitlab_subscriptions/duo_seat_assignment_mailer/duo_pro_email.html.haml b/ee/app/views/gitlab_subscriptions/duo_seat_assignment_mailer/duo_pro_email.html.haml index 284cb23cae28ec5bca1e78216c0cdf83153f1a21..759d46369af22b6d64924e8703a423124fae83d3 100644 --- a/ee/app/views/gitlab_subscriptions/duo_seat_assignment_mailer/duo_pro_email.html.haml +++ b/ee/app/views/gitlab_subscriptions/duo_seat_assignment_mailer/duo_pro_email.html.haml @@ -14,7 +14,7 @@ %tr %td{ align: "left", style: "padding: 20px;" } %a{ href: "https://about.gitlab.com/" } - %img{ alt: "go to about.gitlab", src: image_url('duo_pro/duo_white_logo.png'), width: "150" } + %img{ alt: "go to about.gitlab", src: image_url('mailers/duo/duo_white_logo.png'), width: "150" } / /logo header / title @@ -28,7 +28,7 @@ %tr %td{ align: "left", style: "padding: 0 20px;" } %a.logo{ href: new_session_path(:user) } - %img{ alt: "sign in", src: image_url('duo_pro/code_suggestions_demo.gif'), width: "540" } + %img{ alt: "sign in", src: image_url('mailers/duo/code_suggestions_demo.gif'), width: "540" } / /demo / Two body paragraph @@ -61,7 +61,7 @@ %tr %td{ style: "vertical-align: top; padding: 0px 15px 20px 40px" } %a{ href: help_page_url('user/gitlab_duo/index.md', anchor: 'code-suggestions') } - %img{ alt: "Code Suggestions", src: image_url('duo_pro/code_suggestions_feature_icon'), width: "60" } + %img{ alt: "Code Suggestions", src: image_url('mailers/duo/code_suggestions_feature_icon'), width: "60" } %td{ align: "left", style: "vertical-align: middle" } %h3{ style: "line-height: 20px; margin: 0;" } %a{ href: help_page_url('user/gitlab_duo/index.md', anchor: 'code-suggestions') } @@ -71,7 +71,7 @@ %tr %td{ style: "vertical-align: top; padding: 20px 15px 0px 40px" } %a{ href: help_page_url('user/gitlab_duo/index.md', anchor: 'code-explanation') } - %img{ alt: "Code Explanations", src: image_url('duo_pro/code_explanations_feature_icon'), width: "60" } + %img{ alt: "Code Explanations", src: image_url('mailers/duo/code_explanations_feature_icon'), width: "60" } %td{ align: "left", style: "vertical-align: middle; padding: 20px 15px 0px 0px" } %h3{ style: "line-height: 20px; margin: 0;" } %a{ href: help_page_url('user/gitlab_duo/index.md', anchor: 'code-explanation') } @@ -81,7 +81,7 @@ %tr %td{ style: "vertical-align: top; padding: 20px 15px 20px 40px" } %a{ href: help_page_url('user/gitlab_duo/index.md', anchor: 'test-generation') } - %img{ alt: "Test Generation", src: image_url('duo_pro/test_generation_feature_icon'), width: "60" } + %img{ alt: "Test Generation", src: image_url('mailers/duo/test_generation_feature_icon'), width: "60" } %td{ align: "left", style: "vertical-align: middle; padding: 20px 15px 20px 0px" } %h3{ style: "line-height: 20px; margin: 0;" } %a{ href: help_page_url('user/gitlab_duo/index.md', anchor: 'test-generation') } diff --git a/ee/spec/mailers/gitlab_subscriptions/duo_seat_assignment_mailer_spec.rb b/ee/spec/mailers/gitlab_subscriptions/duo_seat_assignment_mailer_spec.rb index 341221c05661776e300e67d35054e25b220089b8..1c3320c97ed04c099587ee4516be55750ee91015 100644 --- a/ee/spec/mailers/gitlab_subscriptions/duo_seat_assignment_mailer_spec.rb +++ b/ee/spec/mailers/gitlab_subscriptions/duo_seat_assignment_mailer_spec.rb @@ -6,15 +6,27 @@ include EmailSpec::Matchers let_it_be(:user) { build(:user) } - let_it_be(:email_subject) { s_('CodeSuggestions|Welcome to GitLab Duo Pro!') } describe '#duo_pro_email' do subject(:email) { described_class.duo_pro_email(user) } + let(:email_subject) { s_('CodeSuggestions|Welcome to GitLab Duo Pro!') } + it 'sends mail with expected contents' do expect(email).to have_subject(email_subject) expect(email).to have_body_text(s_('CodeSuggestions|Get started with GitLab Duo Pro today to boost your ' \ 'efficiency and effectiveness by reducing the time required to write and understand code.')) end end + + describe '#duo_enterprise_email' do + subject(:email) { described_class.duo_enterprise_email(user) } + + let(:email_subject) { s_('DuoEnterprise|Welcome to GitLab Duo Enterprise!') } + + it 'sends mail with expected contents' do + expect(email).to have_subject(email_subject) + expect(email).to have_body_text(s_('DuoEnterprise|You have been assigned a GitLab Duo Enterprise seat')) + end + end end diff --git a/ee/spec/services/gitlab_subscriptions/user_add_on_assignments/self_managed/create_service_spec.rb b/ee/spec/services/gitlab_subscriptions/user_add_on_assignments/self_managed/create_service_spec.rb index ee38a97a39afc56be0095f3e240f111a26ddc60d..4a284914ebd1d5aacc510133936f67c75ae82f4a 100644 --- a/ee/spec/services/gitlab_subscriptions/user_add_on_assignments/self_managed/create_service_spec.rb +++ b/ee/spec/services/gitlab_subscriptions/user_add_on_assignments/self_managed/create_service_spec.rb @@ -143,23 +143,8 @@ end end - context 'with duo pro seat assignment email' do - it 'sends seat assignment email' do - expect { response }.to have_enqueued_mail( - GitlabSubscriptions::DuoSeatAssignmentMailer, :duo_pro_email).with(user) - end - - context 'when the add_on is not duo_pro' do - let(:add_on) { create(:gitlab_subscription_add_on, :duo_enterprise) } - let(:add_on_purchase) { create(:gitlab_subscription_add_on_purchase, :self_managed, add_on: add_on) } - let(:user) { create(:user) } - - it 'does not enqueue the seat assignment email' do - expect { response }.not_to have_enqueued_mail(GitlabSubscriptions::DuoSeatAssignmentMailer, :duo_pro_email) - end - end - - context 'when duo_seat_assignment_email_for_sm flag is off' do + context 'with duo assignment emails' do + context 'when feature flag `duo_seat_assignment_email_for_sm` is not enabled' do before do stub_feature_flags(duo_seat_assignment_email_for_sm: false) end @@ -170,6 +155,40 @@ end.not_to have_enqueued_mail(GitlabSubscriptions::DuoSeatAssignmentMailer, :duo_pro_email) end end + + context 'when feature flag `duo_seat_assignment_email_for_sm` is enabled' do + context 'when add on is not duo related' do + let_it_be(:add_on) { create(:gitlab_subscription_add_on, :product_analytics) } + let_it_be(:add_on_purchase) { create(:gitlab_subscription_add_on_purchase, :self_managed, add_on: add_on) } + + it 'does not send a duo pro email' do + expect { response } + .not_to have_enqueued_mail(GitlabSubscriptions::DuoSeatAssignmentMailer, :duo_pro_email) + end + + it 'does not send a duo enterprise email' do + expect { response } + .not_to have_enqueued_mail(GitlabSubscriptions::DuoSeatAssignmentMailer, :duo_enterprise_email) + end + end + + context 'when add on is duo pro' do + it 'sends seat assignment email' do + expect { response }.to have_enqueued_mail( + GitlabSubscriptions::DuoSeatAssignmentMailer, :duo_pro_email).with(user) + end + end + + context 'when add on is duo enterprise' do + let_it_be(:add_on) { create(:gitlab_subscription_add_on, :duo_enterprise) } + let_it_be(:add_on_purchase) { create(:gitlab_subscription_add_on_purchase, :self_managed, add_on: add_on) } + + it 'sends seat assignment email' do + expect { response }.to have_enqueued_mail( + GitlabSubscriptions::DuoSeatAssignmentMailer, :duo_enterprise_email).with(user) + end + end + end end end end diff --git a/locale/gitlab.pot b/locale/gitlab.pot index b29bf87359a2ad410036d616e79b348dc5e4b9a3..55c5adcf2af6ac097c5f96ed217868273a60812a 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -20410,6 +20410,48 @@ msgstr "" msgid "DuoEnterpriseTrial|You have successfully started a Duo Enterprise trial that will expire on %{exp_date}. To give members access to new GitLab Duo Enterprise features, %{assign_link_start}assign them%{assign_link_end} to GitLab Duo Enterprise seats." msgstr "" +msgid "DuoEnterprise|AI-assisted root cause analysis" +msgstr "" + +msgid "DuoEnterprise|AI-powered vulnerability remediation" +msgstr "" + +msgid "DuoEnterprise|Collaboration and summarization tools" +msgstr "" + +msgid "DuoEnterprise|Easily get up to speed on issue discussions with concise overviews of proposed code changes" +msgstr "" + +msgid "DuoEnterprise|Get started with these Duo Enterprise features:" +msgstr "" + +msgid "DuoEnterprise|Need help enabling features? Check to make sure an administrator has %{link_start}configured GitLab Duo on your instance%{link_end}." +msgstr "" + +msgid "DuoEnterprise|Quickly resolve CI/CD pipeline issues so developers can focus on critical tasks" +msgstr "" + +msgid "DuoEnterprise|To get started using GitLab Duo Enterprise features, %{link_start}set up your IDE for success.%{link_end}." +msgstr "" + +msgid "DuoEnterprise|Understand and remediate vulnerabilities more efficiently to mitigate security risks" +msgstr "" + +msgid "DuoEnterprise|Welcome to GitLab Duo Enterprise!" +msgstr "" + +msgid "DuoEnterprise|You have been assigned a GitLab Duo Enterprise seat" +msgstr "" + +msgid "DuoEnterprise|You have been assigned a GitLab Duo Enterprise seat!" +msgstr "" + +msgid "DuoEnterprise|You now have access to %{link_start}GitLab Duo Enterprise%{link_end}, the only AI solution that supports developers at every stage of the software development lifecycle." +msgstr "" + +msgid "DuoEnterprise|You now have access to GitLab Duo Enterprise, the only AI solution that supports developers at every stage of the software development lifecycle." +msgstr "" + msgid "DuoFreeAccessEndingBanner|Buy Duo Pro" msgstr ""