From df4de508e70deefb8fa88b09bc69add7a0bdb798 Mon Sep 17 00:00:00 2001 From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Date: Wed, 30 Jul 2025 19:34:27 +0530 Subject: [PATCH] feat: New Scenarios page (#11975) --- .../dashboard/api/captain/scenarios.js | 36 ++ app/javascript/dashboard/api/captain/tools.js | 16 + .../components-next/Editor/Editor.vue | 2 + .../captain/assistant/AddNewRulesDialog.vue | 6 +- .../assistant/AddNewScenariosDialog.vue | 155 +++++++++ .../captain/assistant/RuleCard.vue | 1 - .../captain/assistant/ScenariosCard.story.vue | 45 +++ .../captain/assistant/ScenariosCard.vue | 218 ++++++++++++ .../captain/assistant/ToolsDropdown.story.vue | 37 ++ .../captain/assistant/ToolsDropdown.vue | 54 +++ .../components/widgets/WootWriter/Editor.vue | 26 +- .../widgets/conversation/TagTools.vue | 56 +++ .../helper/AnalyticsHelper/events.js | 1 + .../dashboard/helper/editorHelper.js | 11 + .../i18n/locale/en/integrations.json | 69 ++++ .../captain/assistants/guardrails/Index.vue | 5 + .../captain/assistants/guidelines/Index.vue | 7 + .../captain/assistants/scenarios/Index.vue | 320 ++++++++++++++++++ .../captain/assistants/settings/Settings.vue | 2 +- .../dashboard/captain/captain.routes.js | 16 + .../dashboard/store/captain/scenarios.js | 38 +++ .../dashboard/store/captain/tools.js | 24 ++ app/javascript/dashboard/store/index.js | 4 + .../captain/scenarios/index.json.jbuilder | 7 +- package.json | 2 +- pnpm-lock.yaml | 10 +- .../captain/scenarios_controller_spec.rb | 8 +- 27 files changed, 1161 insertions(+), 15 deletions(-) create mode 100644 app/javascript/dashboard/api/captain/scenarios.js create mode 100644 app/javascript/dashboard/api/captain/tools.js create mode 100644 app/javascript/dashboard/components-next/captain/assistant/AddNewScenariosDialog.vue create mode 100644 app/javascript/dashboard/components-next/captain/assistant/ScenariosCard.story.vue create mode 100644 app/javascript/dashboard/components-next/captain/assistant/ScenariosCard.vue create mode 100644 app/javascript/dashboard/components-next/captain/assistant/ToolsDropdown.story.vue create mode 100644 app/javascript/dashboard/components-next/captain/assistant/ToolsDropdown.vue create mode 100644 app/javascript/dashboard/components/widgets/conversation/TagTools.vue create mode 100644 app/javascript/dashboard/routes/dashboard/captain/assistants/scenarios/Index.vue create mode 100644 app/javascript/dashboard/store/captain/scenarios.js create mode 100644 app/javascript/dashboard/store/captain/tools.js diff --git a/app/javascript/dashboard/api/captain/scenarios.js b/app/javascript/dashboard/api/captain/scenarios.js new file mode 100644 index 000000000..3e61c28a3 --- /dev/null +++ b/app/javascript/dashboard/api/captain/scenarios.js @@ -0,0 +1,36 @@ +/* global axios */ +import ApiClient from '../ApiClient'; + +class CaptainScenarios extends ApiClient { + constructor() { + super('captain/assistants', { accountScoped: true }); + } + + get({ assistantId, page = 1, searchKey } = {}) { + return axios.get(`${this.url}/${assistantId}/scenarios`, { + params: { page, searchKey }, + }); + } + + show({ assistantId, id }) { + return axios.get(`${this.url}/${assistantId}/scenarios/${id}`); + } + + create({ assistantId, ...data } = {}) { + return axios.post(`${this.url}/${assistantId}/scenarios`, { + scenario: data, + }); + } + + update({ assistantId, id }, data = {}) { + return axios.put(`${this.url}/${assistantId}/scenarios/${id}`, { + scenario: data, + }); + } + + delete({ assistantId, id }) { + return axios.delete(`${this.url}/${assistantId}/scenarios/${id}`); + } +} + +export default new CaptainScenarios(); diff --git a/app/javascript/dashboard/api/captain/tools.js b/app/javascript/dashboard/api/captain/tools.js new file mode 100644 index 000000000..20edaa95e --- /dev/null +++ b/app/javascript/dashboard/api/captain/tools.js @@ -0,0 +1,16 @@ +/* global axios */ +import ApiClient from '../ApiClient'; + +class CaptainTools extends ApiClient { + constructor() { + super('captain/assistants/tools', { accountScoped: true }); + } + + get(params = {}) { + return axios.get(this.url, { + params, + }); + } +} + +export default new CaptainTools(); diff --git a/app/javascript/dashboard/components-next/Editor/Editor.vue b/app/javascript/dashboard/components-next/Editor/Editor.vue index 9e5ff6ab5..a2f139bdc 100644 --- a/app/javascript/dashboard/components-next/Editor/Editor.vue +++ b/app/javascript/dashboard/components-next/Editor/Editor.vue @@ -20,6 +20,7 @@ const props = defineProps({ enableVariables: { type: Boolean, default: false }, enableCannedResponses: { type: Boolean, default: true }, enabledMenuOptions: { type: Array, default: () => [] }, + enableCaptainTools: { type: Boolean, default: false }, }); const emit = defineEmits(['update:modelValue']); @@ -98,6 +99,7 @@ watch( :enable-variables="enableVariables" :enable-canned-responses="enableCannedResponses" :enabled-menu-options="enabledMenuOptions" + :enable-captain-tools="enableCaptainTools" @input="handleInput" @focus="handleFocus" @blur="handleBlur" diff --git a/app/javascript/dashboard/components-next/captain/assistant/AddNewRulesDialog.vue b/app/javascript/dashboard/components-next/captain/assistant/AddNewRulesDialog.vue index ecdb2d654..c1a465c64 100644 --- a/app/javascript/dashboard/components-next/captain/assistant/AddNewRulesDialog.vue +++ b/app/javascript/dashboard/components-next/captain/assistant/AddNewRulesDialog.vue @@ -1,5 +1,6 @@