From c0490794d12926ff1e9babb2d08231cc2d3104c2 Mon Sep 17 00:00:00 2001 From: Pranav Date: Fri, 27 Feb 2026 21:05:26 -0800 Subject: [PATCH] feat: Workflows v1 --- .../dashboard/api/captain/workflows.js | 40 ++++ .../captain/workflows/NodeConfigPanel.vue | 159 ++++++++++++++ .../captain/workflows/NodePalette.vue | 123 +++++++++++ .../captain/workflows/WorkflowToolbar.vue | 93 +++++++++ .../captain/workflows/nodes/ActionNode.vue | 31 +++ .../captain/workflows/nodes/ConditionNode.vue | 47 +++++ .../captain/workflows/nodes/ShopifyNode.vue | 28 +++ .../captain/workflows/nodes/TriggerNode.vue | 27 +++ .../components-next/sidebar/Sidebar.vue | 11 + .../i18n/locale/en/integrations.json | 68 ++++++ .../dashboard/i18n/locale/en/settings.json | 1 + .../captain/assistants/workflows/Editor.vue | 194 ++++++++++++++++++ .../captain/assistants/workflows/Index.vue | 170 +++++++++++++++ .../dashboard/captain/captain.routes.js | 16 ++ .../captain/pages/AssistantsIndexPage.vue | 1 + .../dashboard/store/captain/workflows.js | 81 ++++++++ app/javascript/dashboard/store/index.js | 2 + config/routes.rb | 5 + ...20260227100001_create_captain_workflows.rb | 19 ++ ...0002_create_captain_workflow_executions.rb | 17 ++ db/schema.rb | 153 +++++++++++--- .../accounts/captain/workflows_controller.rb | 54 +++++ .../jobs/captain/workflows/execution_job.rb | 7 + enterprise/app/listeners/captain_listener.rb | 35 ++++ enterprise/app/models/captain/assistant.rb | 1 + enterprise/app/models/captain/workflow.rb | 16 ++ .../app/models/captain/workflow_execution.rb | 10 + .../app/models/enterprise/concerns/account.rb | 1 + .../app/policies/captain/workflow_policy.rb | 25 +++ .../captain/workflows/execution_service.rb | 88 ++++++++ .../captain/workflows/node_registry.rb | 21 ++ .../captain/workflows/nodes/add_label_node.rb | 8 + .../workflows/nodes/add_private_note_node.rb | 12 ++ .../workflows/nodes/assign_agent_node.rb | 7 + .../workflows/nodes/assign_team_node.rb | 7 + .../captain/workflows/nodes/base_node.rb | 40 ++++ .../captain/workflows/nodes/condition_node.rb | 42 ++++ .../nodes/resolve_conversation_node.rb | 6 + .../workflows/nodes/send_message_node.rb | 11 + .../nodes/shopify/base_shopify_node.rb | 31 +++ .../nodes/shopify/get_customer_orders_node.rb | 17 ++ .../nodes/shopify/search_customer_node.rb | 23 +++ .../captain/workflows/nodes/trigger_node.rb | 5 + .../workflows/nodes/update_priority_node.rb | 7 + .../captain/workflows/create.json.jbuilder | 1 + .../workflows/executions.json.jbuilder | 14 ++ .../captain/workflows/index.json.jbuilder | 10 + .../captain/workflows/show.json.jbuilder | 1 + .../captain/workflows/update.json.jbuilder | 1 + .../v1/models/captain/_workflow.json.jbuilder | 12 ++ package.json | 1 + pnpm-lock.yaml | 136 ++++++++++++ 52 files changed, 1903 insertions(+), 33 deletions(-) create mode 100644 app/javascript/dashboard/api/captain/workflows.js create mode 100644 app/javascript/dashboard/components-next/captain/workflows/NodeConfigPanel.vue create mode 100644 app/javascript/dashboard/components-next/captain/workflows/NodePalette.vue create mode 100644 app/javascript/dashboard/components-next/captain/workflows/WorkflowToolbar.vue create mode 100644 app/javascript/dashboard/components-next/captain/workflows/nodes/ActionNode.vue create mode 100644 app/javascript/dashboard/components-next/captain/workflows/nodes/ConditionNode.vue create mode 100644 app/javascript/dashboard/components-next/captain/workflows/nodes/ShopifyNode.vue create mode 100644 app/javascript/dashboard/components-next/captain/workflows/nodes/TriggerNode.vue create mode 100644 app/javascript/dashboard/routes/dashboard/captain/assistants/workflows/Editor.vue create mode 100644 app/javascript/dashboard/routes/dashboard/captain/assistants/workflows/Index.vue create mode 100644 app/javascript/dashboard/store/captain/workflows.js create mode 100644 db/migrate/20260227100001_create_captain_workflows.rb create mode 100644 db/migrate/20260227100002_create_captain_workflow_executions.rb create mode 100644 enterprise/app/controllers/api/v1/accounts/captain/workflows_controller.rb create mode 100644 enterprise/app/jobs/captain/workflows/execution_job.rb create mode 100644 enterprise/app/models/captain/workflow.rb create mode 100644 enterprise/app/models/captain/workflow_execution.rb create mode 100644 enterprise/app/policies/captain/workflow_policy.rb create mode 100644 enterprise/app/services/captain/workflows/execution_service.rb create mode 100644 enterprise/app/services/captain/workflows/node_registry.rb create mode 100644 enterprise/app/services/captain/workflows/nodes/add_label_node.rb create mode 100644 enterprise/app/services/captain/workflows/nodes/add_private_note_node.rb create mode 100644 enterprise/app/services/captain/workflows/nodes/assign_agent_node.rb create mode 100644 enterprise/app/services/captain/workflows/nodes/assign_team_node.rb create mode 100644 enterprise/app/services/captain/workflows/nodes/base_node.rb create mode 100644 enterprise/app/services/captain/workflows/nodes/condition_node.rb create mode 100644 enterprise/app/services/captain/workflows/nodes/resolve_conversation_node.rb create mode 100644 enterprise/app/services/captain/workflows/nodes/send_message_node.rb create mode 100644 enterprise/app/services/captain/workflows/nodes/shopify/base_shopify_node.rb create mode 100644 enterprise/app/services/captain/workflows/nodes/shopify/get_customer_orders_node.rb create mode 100644 enterprise/app/services/captain/workflows/nodes/shopify/search_customer_node.rb create mode 100644 enterprise/app/services/captain/workflows/nodes/trigger_node.rb create mode 100644 enterprise/app/services/captain/workflows/nodes/update_priority_node.rb create mode 100644 enterprise/app/views/api/v1/accounts/captain/workflows/create.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/workflows/executions.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/workflows/index.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/workflows/show.json.jbuilder create mode 100644 enterprise/app/views/api/v1/accounts/captain/workflows/update.json.jbuilder create mode 100644 enterprise/app/views/api/v1/models/captain/_workflow.json.jbuilder diff --git a/app/javascript/dashboard/api/captain/workflows.js b/app/javascript/dashboard/api/captain/workflows.js new file mode 100644 index 000000000..9d9fc4a80 --- /dev/null +++ b/app/javascript/dashboard/api/captain/workflows.js @@ -0,0 +1,40 @@ +/* global axios */ +import ApiClient from '../ApiClient'; + +class CaptainWorkflows extends ApiClient { + constructor() { + super('captain/assistants', { accountScoped: true }); + } + + get({ assistantId, page = 1 } = {}) { + return axios.get(`${this.url}/${assistantId}/workflows`, { + params: { page }, + }); + } + + show({ assistantId, id }) { + return axios.get(`${this.url}/${assistantId}/workflows/${id}`); + } + + create({ assistantId, ...data } = {}) { + return axios.post(`${this.url}/${assistantId}/workflows`, { + workflow: data, + }); + } + + update({ assistantId, id }, data = {}) { + return axios.put(`${this.url}/${assistantId}/workflows/${id}`, { + workflow: data, + }); + } + + delete({ assistantId, id }) { + return axios.delete(`${this.url}/${assistantId}/workflows/${id}`); + } + + executions({ assistantId, id }) { + return axios.get(`${this.url}/${assistantId}/workflows/${id}/executions`); + } +} + +export default new CaptainWorkflows(); diff --git a/app/javascript/dashboard/components-next/captain/workflows/NodeConfigPanel.vue b/app/javascript/dashboard/components-next/captain/workflows/NodeConfigPanel.vue new file mode 100644 index 000000000..48ffc80c4 --- /dev/null +++ b/app/javascript/dashboard/components-next/captain/workflows/NodeConfigPanel.vue @@ -0,0 +1,159 @@ + + +