UNPKG

@difizen/ai-flow

Version:

Scalable, out-of-the-box, agent-oriented flow

343 lines (338 loc) 13.2 kB
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } import { ControlMode, NodePanelTypeEnum } from "../interfaces/flow"; import { cleanEdges, getNodeId } from "../utils/reactflowUtils"; import { addEdge, applyEdgeChanges, applyNodeChanges } from '@xyflow/react'; import { produce } from 'immer'; import { cloneDeep } from 'lodash'; import { create } from 'zustand'; import { useFlowsManagerStore } from "./flowsManagerStore"; export var useFlowStore = create(function (set, get) { return { nodes: [], edges: [], nodePanel: NodePanelTypeEnum.Panel, setNodePanel: function setNodePanel(panel) { set({ nodePanel: panel }); }, controlMode: localStorage.getItem('ai-workflow-operation-mode') === ControlMode.Pointer ? ControlMode.Pointer : ControlMode.Hand, setControlMode: function setControlMode(mode) { set({ controlMode: mode }); localStorage.setItem('ai-workflow-operation-mode', mode); }, findUpstreamNodes: function findUpstreamNodes(targetNode) { var adjList = {}; get().nodes.forEach(function (node) { adjList[node.id] = []; }); get().edges.forEach(function (edge) { adjList[edge.target].push(edge.source); }); var visited = new Set(); var result = new Set(); var dfs = function dfs(node) { if (visited.has(node)) { return; } visited.add(node); if (adjList[node]) { adjList[node].forEach(function (upstreamNode) { result.add(upstreamNode); dfs(upstreamNode); }); } }; dfs(targetNode); return get().nodes.filter(function (node) { return Array.from(result).includes(node.id); }); }, nodeLinkMap: {}, calculateNodeLinkMap: function calculateNodeLinkMap() { set({ nodeLinkMap: get().nodes.reduce(function (pre, node) { return _objectSpread(_objectSpread({}, pre), {}, _defineProperty({}, node.id, get().findUpstreamNodes(node.id))); }, {}) }); }, initFlow: function initFlow(graph) { set({ nodes: graph.nodes, edges: graph.edges }); return { nodes: graph.nodes, edges: graph.edges }; }, reactFlowInstance: null, setReactFlowInstance: function setReactFlowInstance(newState) { set({ reactFlowInstance: newState }); }, getFlow: function getFlow() { var _get$reactFlowInstanc, _get$reactFlowInstanc2; return { nodes: get().nodes, edges: get().edges, viewport: (_get$reactFlowInstanc = (_get$reactFlowInstanc2 = get().reactFlowInstance) === null || _get$reactFlowInstanc2 === void 0 ? void 0 : _get$reactFlowInstanc2.getViewport()) !== null && _get$reactFlowInstanc !== void 0 ? _get$reactFlowInstanc : { x: 0, y: 0, zoom: 1 } }; }, onNodesChange: function onNodesChange(changes) { var newChanges = changes.filter(function (change) { return change.type !== 'position'; }); if (newChanges) { set({ nodes: applyNodeChanges(newChanges, get().nodes) }); } }, setNodeFolded: function setNodeFolded(id, folded) { get().setNode(id, function (old) { return _objectSpread(_objectSpread({}, old), {}, { data: _objectSpread(_objectSpread({}, old.data), {}, { folded: folded }) }); }); }, onEdgesChange: function onEdgesChange(changes) { set({ edges: applyEdgeChanges(changes, get().edges) }); }, setEdge: function setEdge(id, change) { var newChange = typeof change === 'function' ? change(get().edges.find(function (edge) { return edge.id === id; })) : change; get().setEdges(function (oldEdges) { return oldEdges.map(function (edge) { if (edge.id === id) { // if ((node.data as NodeDataType).node?.frozen) { // (newChange.data as NodeDataType).node!.frozen = false; // } return newChange; } return edge; }); }); }, setNode: function setNode(id, change) { var newChange = typeof change === 'function' ? change(get().nodes.find(function (node) { return node.id === id; })) : change; get().setNodes(function (oldNodes) { return oldNodes.map(function (node) { if (node.id === id) { return newChange; } return node; }); }); }, setNodes: function setNodes(change) { var newChange = typeof change === 'function' ? change(get().nodes) : change; var newEdges = cleanEdges(newChange, get().edges); set({ edges: newEdges, nodes: newChange }); var _useFlowsManagerStore = useFlowsManagerStore.getState(), autoSaveFlow = _useFlowsManagerStore.autoSaveFlow; autoSaveFlow === null || autoSaveFlow === void 0 || autoSaveFlow(); }, setEdges: function setEdges(change) { var newChange = typeof change === 'function' ? change(get().edges) : change; set({ edges: newChange }); // calculate link map get().calculateNodeLinkMap(); // autosave the flow var _useFlowsManagerStore2 = useFlowsManagerStore.getState(), autoSaveFlow = _useFlowsManagerStore2.autoSaveFlow; autoSaveFlow === null || autoSaveFlow === void 0 || autoSaveFlow(); }, getNode: function getNode(id) { return get().nodes.find(function (node) { return node.id === id; }); }, onConnect: function onConnect(connection) { var newEdges = []; get().setEdges(function (oldEdges) { newEdges = addEdge(_objectSpread(_objectSpread({}, connection), {}, { data: { targetHandle: connection.targetHandle, sourceHandle: connection.sourceHandle }, type: 'custom' }), oldEdges); return newEdges; }); }, deleteNode: function deleteNode(nodeId) { get().setNodes(get().nodes.filter(function (node) { return typeof nodeId === 'string' ? node.id !== nodeId : !nodeId.includes(node.id); })); get().setEdges(get().edges.filter(function (edge) { return typeof nodeId === 'string' ? edge.source !== nodeId && edge.target !== nodeId : !nodeId.includes(edge.source) && !nodeId.includes(edge.target); })); }, deleteEdge: function deleteEdge(edgeId) { get().setEdges(get().edges.filter(function (edge) { return typeof edgeId === 'string' ? edge.id !== edgeId : !edgeId.includes(edge.id); })); }, paste: function paste(selection, position) { // TODO:页面唯一节点检测 // if (selection.nodes.some((node) => node.data.type === 'start')) { // useAlertStore.getState().setErrorData({ // title: 'Error pasting components', // list: ['You can only have one Start Node in the flow'], // }); // return; // } var minimumX = Infinity; var minimumY = Infinity; // let idsMap = {}; var newNodes = get().nodes; // let newEdges = get().edges; selection.nodes.forEach(function (node) { if (node.position.y < minimumY) { minimumY = node.position.y; } if (node.position.x < minimumX) { minimumX = node.position.x; } }); var insidePosition = position.paneX ? { x: position.paneX + position.x, y: position.paneY + position.y } : get().reactFlowInstance.screenToFlowPosition({ x: position.x, y: position.y }); selection.nodes.forEach(function (node) { var newId = getNodeId(node.data['type']); var newNode = { id: newId, type: node.data['type'], position: { x: insidePosition.x + node.position.x - minimumX, y: insidePosition.y + node.position.y - minimumY }, data: _objectSpread(_objectSpread({}, cloneDeep(node.data)), {}, { id: newId }) }; // updateGroupRecursion( // newNode, // selection.edges, // useGlobalVariablesStore.getState().unavaliableFields, // useGlobalVariablesStore.getState().globalVariablesEntries, // ); // Add the new node to the list of nodes in state newNodes = newNodes // eslint-disable-next-line @typescript-eslint/no-shadow .map(function (node) { return _objectSpread(_objectSpread({}, node), {}, { selected: false }); }).concat(_objectSpread(_objectSpread({}, newNode), {}, { selected: false })); }); get().setNodes(newNodes); // selection.edges.forEach((edge: Edge) => { // let source = edge.source; // let target = edge.target; // const sourceHandleObject: sourceHandleType = scapeJSONParse( // edge.sourceHandle! // ); // let sourceHandle = scapedJSONStringfy({ // ...sourceHandleObject, // id: source, // }); // sourceHandleObject.id = source; // edge.data.sourceHandle = sourceHandleObject; // const targetHandleObject: targetHandleType = scapeJSONParse( // edge.targetHandle! // ); // let targetHandle = scapedJSONStringfy({ // ...targetHandleObject, // id: target, // }); // targetHandleObject.id = target; // edge.data.targetHandle = targetHandleObject; // let id = getHandleId(source, sourceHandle, target, targetHandle); // newEdges = addEdge( // { // source, // target, // sourceHandle, // targetHandle, // id, // data: cloneDeep(edge.data), // selected: false, // }, // newEdges.map((edge) => ({ ...edge, selected: false })) // ); // }); // get().setEdges(newEdges); }, lastCopiedSelection: null, setLastCopiedSelection: function setLastCopiedSelection(newSelection) { var isCrop = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; if (isCrop && newSelection) { var nodesIdsSelected = newSelection.nodes.map(function (node) { return node.id; }); var edgesIdsSelected = newSelection.edges.map(function (edge) { return edge.id; }); nodesIdsSelected.forEach(function (id) { get().deleteNode(id); }); edgesIdsSelected.forEach(function (id) { get().deleteEdge(id); }); var newNodes = get().nodes.filter(function (node) { return !nodesIdsSelected.includes(node.id); }); var newEdges = get().edges.filter(function (edge) { return !edgesIdsSelected.includes(edge.id); }); set({ nodes: newNodes, edges: newEdges }); } set({ lastCopiedSelection: newSelection }); }, handleNodeEdited: function handleNodeEdited(nodeId, cancelEdited) { var newNodes = produce(get().nodes, function (draft) { draft.forEach(function (node) { if (node.id === nodeId) node.data.edited = !cancelEdited;else node.data.edited = false; }); }); get().setNodes(newNodes); } }; });