From 3e3d5dda80b46e2cb8c35a8115e73b796cb9f26f Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Fri, 3 Oct 2025 18:02:23 +0530 Subject: [PATCH] feat: add custom tools page --- .../emptyStates/CustomToolsPageEmptyState.vue | 29 +++++++ .../components-next/sidebar/Sidebar.vue | 5 ++ app/javascript/dashboard/featureFlags.js | 1 + .../i18n/locale/en/integrations.json | 12 +++ .../dashboard/i18n/locale/en/settings.json | 1 + .../dashboard/captain/captain.routes.js | 14 ++++ .../routes/dashboard/captain/tools/Index.vue | 79 +++++++++++++++++++ 7 files changed, 141 insertions(+) create mode 100644 app/javascript/dashboard/components-next/captain/pageComponents/emptyStates/CustomToolsPageEmptyState.vue create mode 100644 app/javascript/dashboard/routes/dashboard/captain/tools/Index.vue diff --git a/app/javascript/dashboard/components-next/captain/pageComponents/emptyStates/CustomToolsPageEmptyState.vue b/app/javascript/dashboard/components-next/captain/pageComponents/emptyStates/CustomToolsPageEmptyState.vue new file mode 100644 index 000000000..420f953da --- /dev/null +++ b/app/javascript/dashboard/components-next/captain/pageComponents/emptyStates/CustomToolsPageEmptyState.vue @@ -0,0 +1,29 @@ + + + diff --git a/app/javascript/dashboard/components-next/sidebar/Sidebar.vue b/app/javascript/dashboard/components-next/sidebar/Sidebar.vue index ab6537031..cef4346e9 100644 --- a/app/javascript/dashboard/components-next/sidebar/Sidebar.vue +++ b/app/javascript/dashboard/components-next/sidebar/Sidebar.vue @@ -232,6 +232,11 @@ const menuItems = computed(() => { label: t('SIDEBAR.CAPTAIN_RESPONSES'), to: accountScopedRoute('captain_responses_index'), }, + { + name: 'Tools', + label: t('SIDEBAR.CAPTAIN_TOOLS'), + to: accountScopedRoute('captain_tools_index'), + }, ], }, { diff --git a/app/javascript/dashboard/featureFlags.js b/app/javascript/dashboard/featureFlags.js index 0fb2322d2..43af96e9b 100644 --- a/app/javascript/dashboard/featureFlags.js +++ b/app/javascript/dashboard/featureFlags.js @@ -41,6 +41,7 @@ export const FEATURE_FLAGS = { CAPTAIN_V2: 'captain_integration_v2', SAML: 'saml', QUOTED_EMAIL_REPLY: 'quoted_email_reply', + CAPTAIN_CUSTOM_TOOLS: 'captain_custom_tools', }; export const PREMIUM_FEATURES = [ diff --git a/app/javascript/dashboard/i18n/locale/en/integrations.json b/app/javascript/dashboard/i18n/locale/en/integrations.json index 8a812dff3..8d098829f 100644 --- a/app/javascript/dashboard/i18n/locale/en/integrations.json +++ b/app/javascript/dashboard/i18n/locale/en/integrations.json @@ -750,6 +750,18 @@ } } }, + "CUSTOM_TOOLS": { + "HEADER": "Tools", + "ADD_NEW": "Create a new tool", + "EMPTY_STATE": { + "TITLE": "No custom tools available", + "SUBTITLE": "Create custom tools to connect your assistant with external APIs and services, enabling it to fetch data and perform actions on your behalf.", + "FEATURE_SPOTLIGHT": { + "TITLE": "Custom Tools", + "NOTE": "Custom tools allow your assistant to interact with external APIs and services. Create tools to fetch data, perform actions, or integrate with your existing systems to enhance your assistant's capabilities." + } + } + }, "RESPONSES": { "HEADER": "FAQs", "ADD_NEW": "Create new FAQ", diff --git a/app/javascript/dashboard/i18n/locale/en/settings.json b/app/javascript/dashboard/i18n/locale/en/settings.json index 9ddc3b805..812b0cd8b 100644 --- a/app/javascript/dashboard/i18n/locale/en/settings.json +++ b/app/javascript/dashboard/i18n/locale/en/settings.json @@ -304,6 +304,7 @@ "CAPTAIN_ASSISTANTS": "Assistants", "CAPTAIN_DOCUMENTS": "Documents", "CAPTAIN_RESPONSES": "FAQs", + "CAPTAIN_TOOLS": "Tools", "HOME": "Home", "AGENTS": "Agents", "AGENT_BOTS": "Bots", diff --git a/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js b/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js index 52fda537b..bf4ba0c7a 100644 --- a/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js +++ b/app/javascript/dashboard/routes/dashboard/captain/captain.routes.js @@ -10,6 +10,7 @@ import AssistantGuidelinesIndex from './assistants/guidelines/Index.vue'; import AssistantScenariosIndex from './assistants/scenarios/Index.vue'; import DocumentsIndex from './documents/Index.vue'; import ResponsesIndex from './responses/Index.vue'; +import CustomToolsIndex from './tools/Index.vue'; export const routes = [ { @@ -124,4 +125,17 @@ export const routes = [ ], }, }, + { + path: frontendURL('accounts/:accountId/captain/tools'), + component: CustomToolsIndex, + name: 'captain_tools_index', + meta: { + permissions: ['administrator', 'agent'], + featureFlag: FEATURE_FLAGS.CAPTAIN_CUSTOM_TOOLS, + installationTypes: [ + INSTALLATION_TYPES.CLOUD, + INSTALLATION_TYPES.ENTERPRISE, + ], + }, + }, ]; diff --git a/app/javascript/dashboard/routes/dashboard/captain/tools/Index.vue b/app/javascript/dashboard/routes/dashboard/captain/tools/Index.vue new file mode 100644 index 000000000..86e887630 --- /dev/null +++ b/app/javascript/dashboard/routes/dashboard/captain/tools/Index.vue @@ -0,0 +1,79 @@ + + +