From 3e5ca9bca95df2c7ea5d1dc86e04f8a79724281f Mon Sep 17 00:00:00 2001 From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Date: Wed, 9 Jul 2025 09:23:20 +0530 Subject: [PATCH 01/20] fix: Widget message input resize issue (#11896) --- app/javascript/shared/components/ResizableTextArea.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/shared/components/ResizableTextArea.vue b/app/javascript/shared/components/ResizableTextArea.vue index 088753a23..4dda62cf9 100644 --- a/app/javascript/shared/components/ResizableTextArea.vue +++ b/app/javascript/shared/components/ResizableTextArea.vue @@ -69,7 +69,7 @@ export default { }, }, watch: { - value() { + modelValue() { this.resizeTextarea(); // 🚨 watch triggers every time the value is changed, we cannot set this to focus then // when this runs, it sets the cursor to the end of the body, ignoring the signature From 5140deb6f682026594f1be847a643466829bbb96 Mon Sep 17 00:00:00 2001 From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Date: Wed, 9 Jul 2025 22:21:25 +0530 Subject: [PATCH 02/20] feat: Captain settings header component (#11912) --- .../settings/SettingsHeader.story.vue | 28 +++++++++++++++++++ .../settings/SettingsHeader.vue | 19 +++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 app/javascript/dashboard/components-next/captain/pageComponents/settings/SettingsHeader.story.vue create mode 100644 app/javascript/dashboard/components-next/captain/pageComponents/settings/SettingsHeader.vue diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/settings/SettingsHeader.story.vue b/app/javascript/dashboard/components-next/captain/pageComponents/settings/SettingsHeader.story.vue new file mode 100644 index 000000000..654e5ab16 --- /dev/null +++ b/app/javascript/dashboard/components-next/captain/pageComponents/settings/SettingsHeader.story.vue @@ -0,0 +1,28 @@ + + + diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/settings/SettingsHeader.vue b/app/javascript/dashboard/components-next/captain/pageComponents/settings/SettingsHeader.vue new file mode 100644 index 000000000..dc6b7dda9 --- /dev/null +++ b/app/javascript/dashboard/components-next/captain/pageComponents/settings/SettingsHeader.vue @@ -0,0 +1,19 @@ + + + From 17500cc62d3fdf23c5ff1c8c238e866289de7dab Mon Sep 17 00:00:00 2001 From: Muhsin Keloth Date: Thu, 10 Jul 2025 11:36:37 +0530 Subject: [PATCH 03/20] chore: Auto assign PR to author when PR opened (#11890) - gh action to auto-assign PR to author when PR opened --- .github/workflows/auto-assign-pr.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/workflows/auto-assign-pr.yml diff --git a/.github/workflows/auto-assign-pr.yml b/.github/workflows/auto-assign-pr.yml new file mode 100644 index 000000000..98df89707 --- /dev/null +++ b/.github/workflows/auto-assign-pr.yml @@ -0,0 +1,28 @@ +name: Auto-assign PR to Author + +on: + pull_request: + types: [opened] + +jobs: + auto-assign: + runs-on: ubuntu-latest + permissions: + pull-requests: write + steps: + - name: Auto-assign PR to author + uses: actions/github-script@v7 + with: + script: | + const { owner, repo } = context.repo; + const pull_number = context.payload.pull_request.number; + const author = context.payload.pull_request.user.login; + + await github.rest.issues.addAssignees({ + owner, + repo, + issue_number: pull_number, + assignees: [author] + }); + + console.log(`Assigned PR #${pull_number} to ${author}`); \ No newline at end of file From 802f0694ed9971d5ab441bd06b82638e403cc1bb Mon Sep 17 00:00:00 2001 From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Date: Fri, 11 Jul 2025 11:46:15 +0530 Subject: [PATCH 04/20] chore: Alphabetically sort inbox list on settings page (#11921) # Pull Request Template ## Description This PR updates the inbox list on the settings page to be sorted alphabetically. ## Type of change - [x] Bug fix (non-breaking change which fixes an issue) ## How Has This Been Tested? ### Screenshot image ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [ ] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- .../routes/dashboard/settings/inbox/Index.vue | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/Index.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/Index.vue index aae2263a7..c4cf5f5ad 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/inbox/Index.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/Index.vue @@ -1,12 +1,16 @@ @@ -24,22 +24,25 @@ const onClick = event => { diff --git a/app/javascript/dashboard/components-next/captain/SettingsPageLayout.vue b/app/javascript/dashboard/components-next/captain/SettingsPageLayout.vue new file mode 100644 index 000000000..4a48794b3 --- /dev/null +++ b/app/javascript/dashboard/components-next/captain/SettingsPageLayout.vue @@ -0,0 +1,91 @@ + + + diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/assistant/settings/AssistantBasicSettingsForm.vue b/app/javascript/dashboard/components-next/captain/pageComponents/assistant/settings/AssistantBasicSettingsForm.vue new file mode 100644 index 000000000..236791793 --- /dev/null +++ b/app/javascript/dashboard/components-next/captain/pageComponents/assistant/settings/AssistantBasicSettingsForm.vue @@ -0,0 +1,151 @@ + + + diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/assistant/settings/AssistantControlItems.vue b/app/javascript/dashboard/components-next/captain/pageComponents/assistant/settings/AssistantControlItems.vue new file mode 100644 index 000000000..2bbede899 --- /dev/null +++ b/app/javascript/dashboard/components-next/captain/pageComponents/assistant/settings/AssistantControlItems.vue @@ -0,0 +1,43 @@ + + + diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/assistant/settings/AssistantSystemSettingsForm.vue b/app/javascript/dashboard/components-next/captain/pageComponents/assistant/settings/AssistantSystemSettingsForm.vue new file mode 100644 index 000000000..b86bdacb4 --- /dev/null +++ b/app/javascript/dashboard/components-next/captain/pageComponents/assistant/settings/AssistantSystemSettingsForm.vue @@ -0,0 +1,125 @@ + + + diff --git a/app/javascript/dashboard/featureFlags.js b/app/javascript/dashboard/featureFlags.js index 1a6ada9fa..98234539b 100644 --- a/app/javascript/dashboard/featureFlags.js +++ b/app/javascript/dashboard/featureFlags.js @@ -36,6 +36,7 @@ export const FEATURE_FLAGS = { REPORT_V4: 'report_v4', CHANNEL_INSTAGRAM: 'channel_instagram', CONTACT_CHATWOOT_SUPPORT_TEAM: 'contact_chatwoot_support_team', + CAPTAIN_V2: 'captain_integration_v2', }; export const PREMIUM_FEATURES = [ @@ -44,4 +45,5 @@ export const PREMIUM_FEATURES = [ FEATURE_FLAGS.CUSTOM_ROLES, FEATURE_FLAGS.AUDIT_LOGS, FEATURE_FLAGS.HELP_CENTER, + FEATURE_FLAGS.CAPTAIN_V2, ]; diff --git a/app/javascript/dashboard/i18n/locale/en/integrations.json b/app/javascript/dashboard/i18n/locale/en/integrations.json index b3e091722..fc8cff644 100644 --- a/app/javascript/dashboard/i18n/locale/en/integrations.json +++ b/app/javascript/dashboard/i18n/locale/en/integrations.json @@ -478,6 +478,37 @@ "ERROR_MESSAGE": "There was an error updating the assistant, please try again.", "NOT_FOUND": "Could not find the assistant. Please try again." }, + "SETTINGS": { + "BREADCRUMB": { + "ASSISTANT": "Assistant" + }, + "BASIC_SETTINGS": { + "TITLE": "Basic settings", + "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." + }, + "SYSTEM_SETTINGS": { + "TITLE": "System settings", + "DESCRIPTION": "Customize what the assistant says when ending a conversation or transferring to a human." + }, + "CONTROL_ITEMS": { + "TITLE": "The Fun Stuff", + "DESCRIPTION": "Add more control to the assistant. (a bit more visual like a story : Query guardrail → scenarios → output) Nudges user to actually utilise these.", + "OPTIONS": { + "GUARDRAILS": { + "TITLE": "Guardrails", + "DESCRIPTION": "Keeps things on track—only the kinds of questions you want your assistant to answer, nothing off-limits or off-topic." + }, + "SCENARIOS": { + "TITLE": "Scenarios", + "DESCRIPTION": "Give your assistant some context—like “what to do when a user is stuck,” or “how to act during a refund request.”" + }, + "RESPONSE_GUIDELINES": { + "TITLE": "Response guidelines", + "DESCRIPTION": "The vibe and structure of your assistant’s replies—clear and friendly? Short and snappy? Detailed and formal?" + } + } + } + }, "OPTIONS": { "EDIT_ASSISTANT": "Edit Assistant", "DELETE_ASSISTANT": "Delete Assistant", diff --git a/app/javascript/dashboard/routes/dashboard/captain/assistants/Edit.vue b/app/javascript/dashboard/routes/dashboard/captain/assistants/Edit.vue index 8b64e2663..2b2506934 100644 --- a/app/javascript/dashboard/routes/dashboard/captain/assistants/Edit.vue +++ b/app/javascript/dashboard/routes/dashboard/captain/assistants/Edit.vue @@ -5,10 +5,13 @@ import { useStore } from 'dashboard/composables/store'; import { useMapGetter } from 'dashboard/composables/store'; import { useAlert } from 'dashboard/composables'; import { useI18n } from 'vue-i18n'; +import { FEATURE_FLAGS } from 'dashboard/featureFlags'; import PageLayout from 'dashboard/components-next/captain/PageLayout.vue'; import EditAssistantForm from '../../../../components-next/captain/pageComponents/assistant/EditAssistantForm.vue'; import AssistantPlayground from 'dashboard/components-next/captain/assistant/AssistantPlayground.vue'; +import AssistantSettings from 'dashboard/routes/dashboard/captain/assistants/settings/Settings.vue'; + const route = useRoute(); const store = useStore(); const { t } = useI18n(); @@ -19,6 +22,16 @@ const assistant = computed(() => store.getters['captainAssistants/getRecord'](Number(assistantId)) ); +const isFeatureEnabledonAccount = useMapGetter( + 'accounts/isFeatureEnabledonAccount' +); +const currentAccountId = useMapGetter('getCurrentAccountId'); + +const isCaptainV2Enabled = isFeatureEnabledonAccount.value( + currentAccountId.value, + FEATURE_FLAGS.CAPTAIN_V2 +); + const isAssistantAvailable = computed(() => !!assistant.value?.id); const handleSubmit = async updatedAssistant => { @@ -36,14 +49,16 @@ const handleSubmit = async updatedAssistant => { }; onMounted(() => { - if (!isAssistantAvailable.value) { + if (!isAssistantAvailable.value || !isCaptainV2Enabled) { store.dispatch('captainAssistants/show', assistantId); } });