UNPKG

ai-ip-plugin

Version:

AI-IP Plugin for MCP Workflow Management with SSE streaming and event handling

272 lines 9.45 kB
"use strict"; /** * Data Manager - Manages workflow data and state */ Object.defineProperty(exports, "__esModule", { value: true }); exports.DataManager = void 0; const agent_1 = require("../utils/agent"); const parser_1 = require("../utils/parser"); const common_1 = require("../utils/common"); class DataManager { constructor() { this.workflowData = new Map(); this.currentWorkflowItem = null; this.currentTaskId = null; } /** * Get workflow data */ getWorkflowData() { return new Map(this.workflowData); } /** * Add workflow item */ addWorkflowItem(uuid, item) { this.workflowData.set(uuid, item); } /** * Update workflow item */ updateWorkflowItem(uuid, updates) { const existing = this.workflowData.get(uuid); if (existing) { this.workflowData.set(uuid, { ...existing, ...updates }); } } /** * Remove workflow item */ removeWorkflowItem(uuid) { this.workflowData.delete(uuid); } /** * Clear all data */ clear() { this.workflowData.clear(); this.currentWorkflowItem = null; this.currentTaskId = null; } /** * Handle start of agent event */ handleStartOfAgent(data) { // Skip topic feedback agent if (data.agent_name === 'topic_wait_for_user_feedback') { return; } const template = (0, agent_1.createAgentTemplate)(data.agent_name); const uuid = (0, common_1.generateUUID)(); let defaultData = { ...template, content: '', type: 'ai', uuid: uuid, event: 'start_of_agent' }; // Handle tool-based agents (persona, rag) if ((0, agent_1.isToolAgent)(data.agent_name)) { defaultData = { ...defaultData, session_id: (0, common_1.generateUUID)(), tool_content: [], additional_kwargs: { tool_calls: [{ index: 0, id: '', function: { arguments: '', name: 'rag_tool' }, type: 'function' }] }, tool_calls: [{ name: 'rag_tool', args: { query: '', pid: 0, limit: 0 }, id: '', type: 'tool_call' }] }; } this.currentWorkflowItem = defaultData; this.workflowData.set(uuid, defaultData); } /** * Handle end of agent event */ handleEndOfAgent(data) { if (this.currentWorkflowItem) { // Handle empty agent (only had start_of_agent) if (this.currentWorkflowItem.event === 'start_of_agent') { this.workflowData.delete(this.currentWorkflowItem.uuid); } else { this.currentWorkflowItem.event = 'end_of_agent'; this.currentWorkflowItem.finished = true; this.workflowData.set(this.currentWorkflowItem.uuid, this.currentWorkflowItem); } // Special handling for audio feedback if (data.agent_name === 'audio_wait_for_user_feedback' && data.event === 'end_of_agent') { this.workflowData.delete(data.uuid); } } } /** * Handle message event */ handleMessage(data) { if (!this.currentWorkflowItem) return; const values = data?.delta ?? {}; const agentItem = { ...this.currentWorkflowItem, event: 'message' }; // Handle content generation agents if ((0, agent_1.isContentAgent)(values.agent_name) && agentItem) { this.currentWorkflowItem = { ...agentItem, content: `${agentItem.content}${values?.content ?? ''}` }; this.workflowData.set(agentItem.uuid, this.currentWorkflowItem); } // Handle polisher agent (separate reasoning and content) if ((0, agent_1.isPolisherAgent)(values.agent_name)) { let txt = `${agentItem.content}${values?.content ?? ''}`; let reasoning = agentItem.reasoning || ''; let writing = agentItem.writing || ''; if (values.type === 'reasoning') { reasoning = `${agentItem.reasoning || ''}${values?.reasoning ?? ''}`; } if (values.type === 'content') { writing = `${agentItem.writing || ''}${values?.content ?? ''}`; } this.currentWorkflowItem = { ...agentItem, content: txt, reasoning: reasoning, writing: writing }; } // Handle tool-based agents if ((0, agent_1.isToolAgent)(agentItem.agent_type)) { const delta = data.delta; const tool_call_chunks = data.tool_call_chunks || []; if (data && tool_call_chunks.length <= 0) { agentItem.content += delta?.content ?? ''; } this.currentWorkflowItem = agentItem; this.workflowData.set(agentItem.uuid, this.currentWorkflowItem); } } /** * Handle tool call event */ handleToolCall(data) { // Tool call handling logic can be implemented here if needed // Currently, the original implementation doesn't do much for tool_call events } /** * Handle tool call result event */ handleToolCallResult(data) { if (!this.currentWorkflowItem) return; const AGENT_AUDIO_RESULT = ['audio_wait_for_user_feedback']; if (AGENT_AUDIO_RESULT.includes(data.agent_name)) { const audioResultContent = (0, parser_1.parseAudioResult)(data.tool_result, this.currentWorkflowItem.uuid); this.currentWorkflowItem = { ...this.currentWorkflowItem, content: audioResultContent, tool_content: [], agent_type: 'audio_wait_for_user_feedback', name: (0, agent_1.getAgentName)(data.agent_name), tool_call_id: data.tool_call_id, event: 'tool_call_result', finished: false }; } else { const tool_content_array = this.currentWorkflowItem.tool_content ?? []; tool_content_array.push(data.tool_result); this.currentWorkflowItem = { ...this.currentWorkflowItem, tool_content: tool_content_array, tool_call_id: data.tool_call_id, event: 'tool_call_result', finished: false }; } this.workflowData.set(this.currentWorkflowItem.uuid, this.currentWorkflowItem); } /** * Handle workflow interrupted event */ handleWorkflowInterrupted(data) { // User initiated interruption if (data.interrupt_data.type === 1) { // Stop current agent if (this.currentWorkflowItem) { this.currentWorkflowItem.event = 'end_of_agent'; this.workflowData.set(this.currentWorkflowItem.uuid, this.currentWorkflowItem); } // Create interruption data const uuid = (0, common_1.generateUUID)(); const interrupted = (0, agent_1.createAgentTemplate)('workflow_interrupted'); interrupted.content = data.interrupt_data; interrupted.event = 'workflow_interrupted'; interrupted.uuid = uuid; this.workflowData.set(interrupted.uuid, interrupted); } // System interruption if (data.interrupt_data.type === 2) { // Remove current agent if it only has start_of_agent if (this.currentWorkflowItem?.event === 'start_of_agent') { this.workflowData.delete(this.currentWorkflowItem.uuid); } } } /** * Handle error event */ handleError(data) { // Stop current agent if (this.currentWorkflowItem) { this.currentWorkflowItem = { ...this.currentWorkflowItem, finished: true, event: 'end_of_agent' }; this.workflowData.set(this.currentWorkflowItem.uuid, this.currentWorkflowItem); } // Add error message const uuid = (0, common_1.generateUUID)(); const errorItem = (0, agent_1.createAgentTemplate)('error'); const agentItem = { ...errorItem, content: `data: ${data.message || '未知错误'}`, uuid: uuid }; this.workflowData.set(agentItem.uuid, agentItem); } /** * Set current task ID */ setCurrentTaskId(taskId) { this.currentTaskId = taskId; } /** * Get current task ID */ getCurrentTaskId() { return this.currentTaskId; } } exports.DataManager = DataManager; //# sourceMappingURL=DataManager.js.map