From 2211598b14416d2960d4c04b94cde0dada06f769 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Wed, 17 Dec 2025 18:42:25 +0530 Subject: [PATCH] feat: use new APIs for captain tasks --- .../dashboard/api/captain/editor.js | 111 ++++++++++++------ 1 file changed, 77 insertions(+), 34 deletions(-) diff --git a/app/javascript/dashboard/api/captain/editor.js b/app/javascript/dashboard/api/captain/editor.js index f51a56290..6066abcd6 100644 --- a/app/javascript/dashboard/api/captain/editor.js +++ b/app/javascript/dashboard/api/captain/editor.js @@ -11,56 +11,99 @@ class EditorAPI extends ApiClient { */ constructor() { super('captain/editor', { accountScoped: true }); - - /** - * The conversation events supported by the API. - * @type {string[]} - */ - this.conversation_events = [ - 'summarize', - 'reply_suggestion', - 'label_suggestion', - ]; } /** * Processes an event using the Captain Editor API. * @param {Object} options - The options for the event. - * @param {string} [options.type='rephrase'] - The type of event to process. + * @param {string} [options.type='improve'] - The type of event to process. * @param {string} [options.content] - The content of the event. - * @param {string} [options.tone] - The tone of the event. * @param {string} [options.conversationId] - The ID of the conversation to process the event for. * @param {AbortSignal} [signal] - AbortSignal to cancel the request. * @returns {Promise} A promise that resolves with the result of the event processing. */ - processEvent({ type = 'improve', content, tone, conversationId }, signal) { - /** - * @type {Object} - */ - let data = { - tone, - content, - }; - - // Always include conversation_display_id when available for session tracking - if (conversationId) { - data.conversation_display_id = conversationId; + processEvent({ type = 'improve', content, conversationId }, signal) { + // Route to appropriate endpoint based on type + if (type === 'summarize') { + return this.summarize(conversationId, signal); } - // For conversation-level events, only send conversation_display_id - if (this.conversation_events.includes(type)) { - data = { - conversation_display_id: conversationId, - }; + if (type === 'reply_suggestion') { + return this.replySuggestion(conversationId, signal); } + if (type === 'label_suggestion') { + return this.labelSuggestion(conversationId, signal); + } + + // All other types are rewrite actions + return this.rewrite({ content, action: type, conversationId }, signal); + } + + /** + * Rewrites content with a specific action. + * @param {Object} options - The rewrite options. + * @param {string} options.content - The content to rewrite. + * @param {string} options.action - The rewrite action (fix_spelling_grammar, casual, professional, etc). + * @param {string} [options.conversationId] - The conversation ID for context (required for 'improve'). + * @param {AbortSignal} [signal] - AbortSignal to cancel the request. + * @returns {Promise} A promise that resolves with the rewritten content. + */ + rewrite({ content, action, conversationId }, signal) { return axios.post( - `${this.url}/process_event`, + `${this.url}/rewrite`, { - event: { - name: type, - data, - }, + content, + action, + conversation_display_id: conversationId, + }, + { signal } + ); + } + + /** + * Summarizes a conversation. + * @param {string} conversationId - The conversation ID to summarize. + * @param {AbortSignal} [signal] - AbortSignal to cancel the request. + * @returns {Promise} A promise that resolves with the summary. + */ + summarize(conversationId, signal) { + return axios.post( + `${this.url}/summarize`, + { + conversation_display_id: conversationId, + }, + { signal } + ); + } + + /** + * Gets a reply suggestion for a conversation. + * @param {string} conversationId - The conversation ID. + * @param {AbortSignal} [signal] - AbortSignal to cancel the request. + * @returns {Promise} A promise that resolves with the reply suggestion. + */ + replySuggestion(conversationId, signal) { + return axios.post( + `${this.url}/reply_suggestion`, + { + conversation_display_id: conversationId, + }, + { signal } + ); + } + + /** + * Gets label suggestions for a conversation. + * @param {string} conversationId - The conversation ID. + * @param {AbortSignal} [signal] - AbortSignal to cancel the request. + * @returns {Promise} A promise that resolves with label suggestions. + */ + labelSuggestion(conversationId, signal) { + return axios.post( + `${this.url}/label_suggestion`, + { + conversation_display_id: conversationId, }, { signal } );