ai-ip-plugin
Version:
AI-IP Plugin for MCP Workflow Management with SSE streaming and event handling
272 lines • 9.45 kB
JavaScript
"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