From 16e1b0a77ed1e7dae4d6b22921d8fdf2de0e328f Mon Sep 17 00:00:00 2001 From: RonnyChan Date: Tue, 6 Jan 2026 11:18:39 +0800 Subject: [PATCH 1/2] [agent-flow] Remove agent-flow module --- PUBLISH_GUIDE.md | 23 +- README.md | 47 - agent-flow/.eslintrc.cjs | 21 - agent-flow/.gitignore | 3 - agent-flow/.npmrc | 3 - agent-flow/README.md | 154 --- .../docs/features/llm-tool-detail-view.md | 173 --- .../docs/features/loop-tool-detail-view.md | 108 -- .../features/parallel-tool-detail-view.md | 118 -- .../shape-data-validation/design-picture.png | Bin 96694 -> 0 bytes .../features/shape-data-validation/index.md | 289 ---- agent-flow/index.html | 12 - agent-flow/package.json | 57 - agent-flow/src/App.jsx | 339 ----- agent-flow/src/common/Consts.js | 290 ---- .../src/components/AdvancedConfiguration.jsx | 109 -- agent-flow/src/components/DefaultRoot.jsx | 216 --- agent-flow/src/components/Footer.jsx | 69 - agent-flow/src/components/Header.jsx | 186 --- .../src/components/appNode/AppNodeConst.js | 7 - .../src/components/appNode/AppWrapper.jsx | 33 - .../src/components/appNode/appComponent.jsx | 67 - .../src/components/appNode/appNodeDrawer.jsx | 46 - .../src/components/appNode/appNodeState.jsx | 55 - .../asserts/form-default-preview.svg | 97 -- .../components/asserts/icon-add-subitem.svg | 8 - .../components/asserts/icon-agent-header.svg | 11 - .../src/components/asserts/icon-agent.svg | 13 - .../src/components/asserts/icon-ai-prompt.svg | 15 - .../components/asserts/icon-api-invoke.svg | 25 - .../src/components/asserts/icon-api-key.svg | 7 - .../asserts/icon-chatbot-header.svg | 20 - .../src/components/asserts/icon-close.svg | 7 - .../asserts/icon-code-collapsed.svg | 11 - .../components/asserts/icon-code-expanded.svg | 12 - .../src/components/asserts/icon-code.svg | 20 - .../src/components/asserts/icon-condition.svg | 8 - .../src/components/asserts/icon-config.svg | 7 - .../components/asserts/icon-default-form.svg | 100 -- .../asserts/icon-delete-trash-bin.svg | 10 - .../src/components/asserts/icon-delete.svg | 12 - .../src/components/asserts/icon-edit.svg | 8 - .../components/asserts/icon-empty-circle.svg | 7 - .../src/components/asserts/icon-end.svg | 14 - .../asserts/icon-evaluation-algorithm.svg | 15 - .../asserts/icon-evaluation-end.svg | 20 - .../asserts/icon-evaluation-start.svg | 15 - .../asserts/icon-evaluation-test-set.svg | 15 - .../asserts/icon-file-extraction.svg | 15 - .../components/asserts/icon-fit-invoke.svg | 8 - .../src/components/asserts/icon-font-bold.svg | 8 - .../asserts/icon-font-color-btn.svg | 8 - .../components/asserts/icon-font-italic.svg | 14 - .../asserts/icon-font-underline.svg | 8 - .../components/asserts/icon-full-screen.svg | 11 - .../src/components/asserts/icon-http.svg | 19 - .../asserts/icon-huggingface-header.svg | 12 - .../components/asserts/icon-huggingface.svg | 21 - .../src/components/asserts/icon-langchain.svg | 12 - .../components/asserts/icon-llamaindex.svg | 13 - .../src/components/asserts/icon-llm.svg | 14 - .../src/components/asserts/icon-loop.svg | 23 - .../components/asserts/icon-manual-check.svg | 23 - .../src/components/asserts/icon-no-form.svg | 100 -- .../asserts/icon-note-align-center.svg | 11 - .../asserts/icon-note-align-left.svg | 12 - .../asserts/icon-note-align-right.svg | 12 - .../src/components/asserts/icon-note-copy.svg | 14 - .../components/asserts/icon-note-custom.svg | 10 - .../asserts/icon-note-default-color.svg | 8 - .../components/asserts/icon-note-delete.svg | 10 - .../asserts/icon-note-fourth-color.svg | 8 - .../asserts/icon-note-second-color.svg | 8 - .../asserts/icon-note-third-color.svg | 8 - .../src/components/asserts/icon-official.svg | 12 - .../components/asserts/icon-optimization.svg | 15 - .../components/asserts/icon-ordered-list.svg | 16 - .../src/components/asserts/icon-parallel.svg | 22 - .../asserts/icon-plugin-type-tool.svg | 7 - .../asserts/icon-question-classification.svg | 14 - .../src/components/asserts/icon-reply.svg | 10 - .../src/components/asserts/icon-resize.svg | 7 - .../src/components/asserts/icon-retrieval.svg | 14 - .../asserts/icon-running-failed.svg | 17 - .../asserts/icon-running-loading.svg | 19 - .../asserts/icon-running-result.svg | 8 - .../asserts/icon-running-success.svg | 13 - .../asserts/icon-running-terminated.svg | 8 - .../asserts/icon-running-unRunning.svg | 12 - .../asserts/icon-search-args-config.svg | 11 - .../src/components/asserts/icon-start.svg | 14 - .../asserts/icon-text-concatenation.svg | 14 - .../components/asserts/icon-text-to-image.svg | 15 - .../asserts/icon-textExtraction.svg | 15 - .../components/asserts/icon-tool-delete.svg | 8 - .../src/components/asserts/icon-tool.svg | 7 - .../asserts/icon-unordered-list.svg | 16 - .../asserts/icon-variable-aggregation.svg | 15 - .../asserts/icon-variable-update.svg | 15 - .../asserts/icon-workflow-header.svg | 22 - .../src/components/asserts/icon-workflow.svg | 13 - .../src/components/asserts/svgIcons.jsx | 20 - .../src/components/base/baseToolNode.jsx | 75 - .../components/base/baseToolNodeDrawer.jsx | 16 - .../src/components/base/baseToolNodeState.js | 79 -- agent-flow/src/components/base/detections.js | 21 - .../src/components/base/emptyStatusManager.js | 54 - agent-flow/src/components/base/jadeNode.jsx | 529 ------- .../src/components/base/jadeNodeDrawer.jsx | 407 ------ .../src/components/base/observerProxy.js | 81 -- agent-flow/src/components/base/overrides.js | 168 --- agent-flow/src/components/base/references.js | 112 -- .../src/components/base/statusManager.js | 96 -- agent-flow/src/components/base/validator.js | 100 -- .../src/components/code/CodeNodeDrawer.jsx | 29 - agent-flow/src/components/code/CodePanel.jsx | 181 --- .../src/components/code/CodeWrapper.jsx | 89 -- .../src/components/code/codeComponent.jsx | 221 --- .../src/components/code/codeNodeState.jsx | 100 -- agent-flow/src/components/code/style.css | 55 - .../src/components/common/AiPromptPanel.jsx | 218 --- .../components/common/ConnectorProvider.jsx | 121 -- .../common/CustomizedModelSelect.jsx | 73 - .../src/components/common/InvokeInput.jsx | 68 - .../src/components/common/InvokeOutput.jsx | 92 -- .../src/components/common/JadeCollapse.jsx | 40 - .../src/components/common/JadeFieldName.jsx | 88 -- .../src/components/common/JadeFormText.jsx | 48 - .../src/components/common/JadeInput.jsx | 26 - .../src/components/common/JadeInputForm.jsx | 381 ------ .../src/components/common/JadeInputTree.jsx | 470 ------- .../common/JadeInputTreeCollapse.jsx | 79 -- .../components/common/JadeObservableInput.jsx | 74 - .../common/JadeObservableOutput.jsx | 416 ------ .../common/JadeObservableSwitch.jsx | 56 - .../components/common/JadeObservableTree.jsx | 128 -- .../src/components/common/JadePanelHeader.jsx | 60 - .../common/JadeReferenceMultiTreeSelect.jsx | 134 -- .../common/JadeReferenceTreeSelect.jsx | 175 --- .../components/common/JadeScrollSelect.jsx | 104 -- .../common/JadeStopPropagationSelect.jsx | 41 - .../src/components/common/JadeTagRender.jsx | 126 -- agent-flow/src/components/common/JadeTree.jsx | 95 -- .../src/components/common/JsonViewer.jsx | 22 - .../src/components/common/ModelConfig.jsx | 127 -- .../src/components/common/OutputForm.jsx | 65 - .../src/components/common/TemplatePanel.jsx | 144 -- .../src/components/common/TextDisplay.jsx | 42 - .../components/common/TreeSwitcherIcon.jsx | 29 - agent-flow/src/components/common/Type.jsx | 61 - .../src/components/common/UseUpdateEffect.jsx | 36 - .../src/components/common/code/CodeDrawer.jsx | 104 -- .../src/components/common/code/CodeEditor.jsx | 136 -- .../components/common/code/CodePlayground.jsx | 185 --- .../src/components/common/code/Tester.jsx | 147 -- .../common/code/codePlaygroundStyle.css | 179 --- .../src/components/common/custom-antd.css | 3 - .../src/components/common/jadeInputTree.css | 53 - .../components/common/jadeObservableTree.css | 31 - .../components/common/json/JadeJsonTree.jsx | 36 - .../src/components/common/json/JsonNode.jsx | 106 -- .../components/common/json/jadeJsonTree.css | 60 - .../src/components/common/prompt/Prompt.jsx | 148 -- .../components/common/prompt/PromptDrawer.jsx | 176 --- .../src/components/common/prompt/prompt.css | 59 - .../common/reducers/commonReducers.js | 435 ------ agent-flow/src/components/common/style.css | 726 ---------- .../condition/ConditionFormWrapper.jsx | 113 -- .../src/components/condition/ElseForm.jsx | 29 - .../src/components/condition/IfForm.jsx | 567 -------- .../condition/conditionComponent.jsx | 300 ---- .../condition/conditionNodeCondition.jsx | 249 ---- .../condition/conditionNodeDrawer.jsx | 29 - agent-flow/src/components/condition/style.css | 61 - agent-flow/src/components/contentStyle.css | 12 - agent-flow/src/components/defaultComponent.js | 45 - agent-flow/src/components/end/EndConst.js | 9 - .../src/components/end/EndInputForm.jsx | 87 -- .../src/components/end/EndNodeHeader.jsx | 38 - .../src/components/end/EndNodeWrapper.jsx | 115 -- .../src/components/end/OutputVariable.jsx | 90 -- .../src/components/end/OutputVariableRow.jsx | 154 --- agent-flow/src/components/end/SelectMode.jsx | 61 - .../src/components/end/endComponent.jsx | 117 -- .../src/components/end/endNodeDrawer.jsx | 66 - agent-flow/src/components/end/endNodeEnd.jsx | 214 --- agent-flow/src/components/end/endNodeUtils.js | 11 - .../src/components/end/reducers/reducers.js | 359 ----- agent-flow/src/components/end/style.css | 57 - .../EvaluationAlgorithmsSelect.jsx | 101 -- .../EvaluationAlgorithmsWrapper.jsx | 90 -- .../evaluationAlgorithms/EvaluationInput.jsx | 71 - .../evaluationAlgorithms/PassingScore.jsx | 65 - .../evaluationAlgorithmsComponent.jsx | 186 --- .../evaluationAlgorithmsNodeDrawer.jsx | 29 - .../evaluationAlgorithmsNodeState.jsx | 55 - .../evaluationEnd/EvaluationEndWrapper.jsx | 28 - .../evaluationEnd/EvaluationOutput.jsx | 289 ---- .../evaluationEnd/evaluationEndComponent.jsx | 133 -- .../evaluationEnd/evaluationEndNodeDrawer.jsx | 42 - .../evaluationEnd/evaluationEndNodeEnd.jsx | 88 -- .../components/evaluation/evaluationNode.jsx | 20 - .../evaluation/evaluationNodeDrawer.jsx | 19 - .../EvaluationStartWrapper.jsx | 23 - .../evaluationStartComponent.jsx | 54 - .../evaluationStartNodeDrawer.jsx | 29 - .../evaluationStartNodeStart.jsx | 61 - .../EvaluationTestSetSelect.jsx | 148 -- .../EvaluationTestSetWrapper.jsx | 57 - .../evaluationTestset/TestQuantity.jsx | 40 - .../evaluationTestSetComponent.jsx | 131 -- .../evaluationTestSetNodeDrawer.jsx | 29 - .../evaluationTestSetNodeState.jsx | 38 - .../evaluation/evaluationTestset/style.css | 68 - .../fileExtraction/FileExtractionWrapper.jsx | 98 -- .../fileExtractionComponent.jsx | 91 -- .../fileExtractionNodeDrawer.jsx | 29 - .../fileExtractionNodeState.jsx | 46 - .../src/components/fileExtraction/reducers.js | 84 -- .../src/components/fileExtraction/style.css | 20 - .../fitInvokeNode/FitInvokeFormWrapper.jsx | 26 - .../fitInvokeNode/FitInvokeOutput.jsx | 37 - .../fitInvokeNode/FitInvokeService.jsx | 40 - .../fitInvokeNode/FitSelectGenericable.jsx | 71 - .../fitInvokeNode/FitSelectTool.jsx | 76 -- .../fitInvokeNode/fitInvokeComponent.jsx | 119 -- .../fitInvokeNode/fitInvokeNodeDrawer.jsx | 29 - .../fitInvokeNode/fitInvokeNodeState.jsx | 65 - .../src/components/fitInvokeNode/style.css | 14 - .../components/flowRunComponent/RunReport.jsx | 70 - .../flowRunComponent/RunningStatusPanel.jsx | 225 --- .../flowRunComponent/SectionContent.jsx | 151 -- .../flowRunComponent/SectionFactory.jsx | 137 -- .../flowRunComponent/SectionHeader.jsx | 78 -- .../src/components/flowRunComponent/style.css | 216 --- agent-flow/src/components/headerStyle.css | 70 - .../components/httpNode/AuthInputField.jsx | 93 -- .../httpNode/AuthenticationButton.jsx | 46 - .../httpNode/AuthenticationModal.jsx | 153 --- .../httpNode/AuthenticationModalConetnt.jsx | 141 -- .../src/components/httpNode/BodyEditor.jsx | 151 -- .../components/httpNode/BodyTypeSelector.jsx | 44 - .../src/components/httpNode/HttpWrapper.jsx | 130 -- .../src/components/httpNode/ParamInfo.jsx | 45 - .../src/components/httpNode/ParamList.jsx | 80 -- .../src/components/httpNode/ParamRow.jsx | 94 -- .../src/components/httpNode/RequestConfig.jsx | 235 ---- .../src/components/httpNode/RequestParams.jsx | 200 --- .../src/components/httpNode/TimeOutInput.jsx | 69 - .../src/components/httpNode/httpComponent.jsx | 244 ---- .../components/httpNode/httpNodeDrawer.jsx | 29 - .../src/components/httpNode/httpNodeState.jsx | 70 - .../src/components/httpNode/reducers.js | 507 ------- agent-flow/src/components/httpNode/style.css | 389 ------ .../huggingFace/HuggingFaceFormWrapper.jsx | 37 - .../huggingFace/huggingFaceComponent.jsx | 91 -- .../huggingFace/huggingFaceNodeDrawer.jsx | 29 - .../huggingFace/huggingFaceNodeState.jsx | 44 - .../src/components/intelligentForm/Consts.js | 47 - .../intelligentForm/FormItemDisplayName.jsx | 67 - .../intelligentForm/FormItemFieldType.jsx | 86 -- .../intelligentForm/FormItemName.jsx | 70 - .../intelligentForm/FormItemRenderType.jsx | 66 - .../intelligentForm/FormItemSelectValue.jsx | 169 --- .../IntelligentFormWrapper.jsx | 60 - .../IntelligentInputFormItem.jsx | 133 -- .../intelligentForm/SimpleFormWrapper.jsx | 142 -- .../intelligentFormComponent.jsx | 73 - .../intelligentFormNodeDrawer.jsx | 29 - .../intelligentFormNodeState.jsx | 109 -- .../components/intelligentForm/reducers.js | 237 ---- agent-flow/src/components/jadeEvent.jsx | 228 ---- .../KnowledgeRetrievalWrapper.jsx | 58 - .../knowledgeRetrieval/OutsideRerankForm.jsx | 157 --- .../knowledgeRetrieval/SearchForm.jsx | 139 -- .../knowledgeRetrieval/knowledge.css | 41 - .../knowledgeRetrievalComponent.jsx | 198 --- .../knowledgeRetrievalNodeDrawer.jsx | 29 - .../knowledgeRetrievalNodeState.jsx | 82 -- .../components/knowledgeRetrieval/reducers.js | 276 ---- .../src/components/llm/KnowledgeForm.jsx | 98 -- .../src/components/llm/LlmFormWrapper.jsx | 211 --- agent-flow/src/components/llm/LlmOutput.jsx | 83 -- .../src/components/llm/McpConfigForm.jsx | 97 -- agent-flow/src/components/llm/Model.jsx | 206 --- agent-flow/src/components/llm/ModelForm.jsx | 226 --- agent-flow/src/components/llm/SkillForm.jsx | 285 ---- .../src/components/llm/llmComponent.jsx | 168 --- .../src/components/llm/llmNodeDrawer.jsx | 29 - .../src/components/llm/llmNodeState.jsx | 44 - .../src/components/llm/reducers/reducers.js | 868 ------------ agent-flow/src/components/llm/style.css | 143 -- .../src/components/loopNode/LoopConsts.js | 33 - .../src/components/loopNode/LoopWrapper.jsx | 73 - .../src/components/loopNode/SkillForm.jsx | 210 --- .../src/components/loopNode/loopComponent.jsx | 79 -- .../components/loopNode/loopNodeDrawer.jsx | 29 - .../src/components/loopNode/loopNodeState.jsx | 55 - .../components/loopNode/reducers/reducers.js | 184 --- .../manualCheck/JadePanelCollapse.jsx | 64 - .../manualCheck/ManualCheckForm.jsx | 195 --- .../manualCheck/ManualCheckFormOutput.jsx | 48 - .../manualCheck/ManualCheckFormWrapper.jsx | 67 - .../src/components/manualCheck/OriginForm.jsx | 37 - .../manualCheck/manualCheckComponent.jsx | 60 - .../manualCheck/manualCheckNodeDrawer.jsx | 29 - .../manualCheck/manualCheckNodeState.jsx | 76 -- .../manualCheck/reducers/reducers.js | 89 -- .../src/components/manualCheck/style.css | 8 - .../src/components/note/BgColorSelector.jsx | 141 -- .../src/components/note/CustomButton.jsx | 113 -- .../src/components/note/EditorToolBar.jsx | 106 -- .../src/components/note/FontColorIcon.jsx | 34 - .../components/note/FontPropertySelector.jsx | 147 -- .../src/components/note/FontStyleSetter.jsx | 65 - .../src/components/note/NoteWrapper.jsx | 46 - .../src/components/note/ResizeButton.jsx | 119 -- agent-flow/src/components/note/SplitLine.jsx | 18 - agent-flow/src/components/note/TextEditor.jsx | 349 ----- .../src/components/note/TextStyleSelector.jsx | 210 --- agent-flow/src/components/note/const.js | 57 - agent-flow/src/components/note/editor.css | 119 -- .../src/components/note/noteComponent.jsx | 109 -- agent-flow/src/components/note/noteNode.jsx | 95 -- .../src/components/note/noteNodeDrawer.jsx | 76 -- agent-flow/src/components/note/reducers.js | 64 - agent-flow/src/components/note/style.css | 263 ---- .../parallelNode/ParallelPluginItem.jsx | 199 --- .../parallelNode/ParallelTopBar.jsx | 89 -- .../parallelNode/ParallelWrapper.jsx | 91 -- .../src/components/parallelNode/consts.js | 13 - .../parallelNode/parallelComponent.jsx | 70 - .../parallelNode/parallelNodeDrawer.jsx | 29 - .../parallelNode/parallelNodeState.jsx | 58 - .../parallelNode/reducers/reducers.js | 239 ---- .../queryOptimization/MemoryConfig.jsx | 277 ---- .../queryOptimization/OptimizationConfig.jsx | 91 -- .../QueryOptimizationWrapper.jsx | 145 -- .../components/queryOptimization/Template.jsx | 208 --- .../queryOptimizationComponent.jsx | 173 --- .../queryOptimizationNodeDrawer.jsx | 29 - .../queryOptimizationNodeState.jsx | 67 - .../components/queryOptimization/reducers.js | 93 -- .../components/queryOptimization/style.css | 4 - .../QuestionClassificationPanel.jsx | 275 ---- .../QuestionClassificationWrapper.jsx | 140 -- .../questionClassificationComponent.jsx | 225 --- .../questionClassificationNodeCondition.jsx | 120 -- .../questionClassificationNodeDrawer.jsx | 29 - .../questionClassification/reducers.js | 199 --- .../questionClassification/style.css | 119 -- .../replaceDemo/replaceComponent.jsx | 58 - .../components/replaceDemo/testComponent.jsx | 60 - .../src/components/replaceDemo/testNode.jsx | 24 - .../src/components/replyNode/ReplyWrapper.jsx | 92 -- .../components/replyNode/reducers/reducer.js | 191 --- .../replyNode/replyNodeComponent.jsx | 85 -- .../components/replyNode/replyNodeDrawer.jsx | 29 - .../components/replyNode/replyNodeState.jsx | 46 - agent-flow/src/components/replyNode/style.css | 6 - .../src/components/retrieval/InputForm.jsx | 230 ---- .../components/retrieval/KnowledgeConfig.jsx | 91 -- .../components/retrieval/KnowledgeForm.jsx | 218 --- .../components/retrieval/RetrievalWrapper.jsx | 40 - .../src/components/retrieval/reducers.js | 188 --- .../retrieval/retrievalComponent.jsx | 110 -- .../retrieval/retrievalNodeDrawer.jsx | 29 - .../retrieval/retrievalNodeState.jsx | 47 - agent-flow/src/components/retrieval/style.css | 42 - .../src/components/start/AppConfiguration.jsx | 156 --- .../components/start/ByConversationTurn.jsx | 67 - agent-flow/src/components/start/ByNumber.jsx | 40 - agent-flow/src/components/start/ByTime.jsx | 54 - .../src/components/start/ByTokenSize.jsx | 47 - .../src/components/start/Customizing.jsx | 71 - .../src/components/start/Description.jsx | 47 - .../src/components/start/DisplayName.jsx | 87 -- agent-flow/src/components/start/Memory.jsx | 152 --- .../components/start/MultiConversation.jsx | 70 - .../start/MultiConversationContent.jsx | 193 --- agent-flow/src/components/start/Name.jsx | 80 -- agent-flow/src/components/start/Required.jsx | 36 - .../src/components/start/StartFormWrapper.jsx | 293 ---- .../src/components/start/StartInputForm.jsx | 95 -- agent-flow/src/components/start/Visible.jsx | 76 -- .../src/components/start/chat-screenshot.jpg | Bin 880210 -> 0 bytes .../src/components/start/startComponent.jsx | 282 ---- .../src/components/start/startNodeDrawer.jsx | 64 - .../src/components/start/startNodeHeader.jsx | 38 - .../src/components/start/startNodeStart.jsx | 142 -- agent-flow/src/components/start/style.css | 121 -- .../src/components/testDemo/AddTask.jsx | 30 - .../src/components/testDemo/TaskList.jsx | 68 - .../src/components/testDemo/taskNode.jsx | 73 - .../textConcatenationNode/reducers/reducer.js | 188 --- .../textConcatenateNodeComponent.jsx | 93 -- .../textConcatenateNodeDrawer.jsx | 29 - .../textConcatenateNodeState.jsx | 52 - .../textConcatenateNodeWrapper.jsx | 98 -- .../textExtraction/HistoryConfig.jsx | 102 -- .../textExtraction/TextExtractionInput.jsx | 262 ---- .../textExtraction/TextExtractionSchema.jsx | 245 ---- .../textExtraction/TextExtractionWrapper.jsx | 91 -- .../src/components/textExtraction/reducers.js | 359 ----- .../src/components/textExtraction/style.css | 43 - .../textExtractionComponent.jsx | 159 --- .../textExtractionNodeDrawer.jsx | 29 - .../textExtractionNodeState.jsx | 45 - .../textToImage/TextToImageParamConfig.jsx | 76 -- .../textToImage/TextToImageWrapper.jsx | 116 -- .../src/components/textToImage/reducers.js | 44 - .../src/components/textToImage/style.css | 36 - .../textToImage/textToImageComponent.jsx | 107 -- .../textToImage/textToImageNodeDrawer.jsx | 29 - .../textToImage/textToImageNodeState.jsx | 46 - .../toolInvokeNode/ToolInvokeFormWrapper.jsx | 31 - .../components/toolInvokeNode/VersionInfo.jsx | 52 - .../src/components/toolInvokeNode/style.css | 36 - .../toolInvokeNode/toolInvokeComponent.jsx | 61 - .../toolInvokeNode/toolInvokeNodeDrawer.jsx | 84 -- .../toolInvokeNode/toolInvokeNodeState.jsx | 74 - agent-flow/src/components/util/ArrayUtil.js | 30 - agent-flow/src/components/util/BranchUtil.js | 17 - agent-flow/src/components/util/CssUtil.js | 24 - agent-flow/src/components/util/FlowMeta.js | 26 - .../src/components/util/JadeConfigUtils.js | 567 -------- .../components/util/MethodMetaDataParser.js | 181 --- .../src/components/util/ReferenceUtil.js | 44 - agent-flow/src/components/util/StringUtil.js | 20 - .../src/components/util/TreeSelectUtils.jsx | 104 -- agent-flow/src/components/util/httpUtil.jsx | 150 -- .../VariableAggregationInputForm.jsx | 222 --- .../VariableAggregationOutputForm.jsx | 31 - .../VariableAggregationWrapper.jsx | 32 - .../variableAggregation/variable.css | 10 - .../variableAggregationComponent.jsx | 76 -- .../variableAggregationConstant.js | 16 - .../variableAggregationDrawer.jsx | 29 - .../variableAggregationNodeState.jsx | 56 - .../variableAggregationReducers.js | 126 -- .../components/variableUpdater/Constant.js | 34 - .../variableUpdater/VariableUpdateWrapper.jsx | 72 - .../VariableUpdaterInputForm.jsx | 253 ---- .../variableUpdater/reducers/reducers.js | 107 -- .../variableUpdater/variableUpdater.css | 11 - .../variableUpdaterComponent.jsx | 68 - .../variableUpdater/variableUpdaterDrawer.jsx | 29 - .../variableUpdaterNodeState.jsx | 31 - agent-flow/src/data/GraphOperator.js | 243 ---- .../src/data/ShapeDataValidationProcessor.js | 349 ----- .../src/flow/compatibility/compatibilities.js | 46 - .../compatibility/compatibilityProcessors.js | 509 ------- .../evaluation/decorators/eventDecorator.js | 71 - .../flow/evaluation/jadeEvaluationGraph.js | 109 -- .../src/flow/evaluation/jadeEvaluationPage.js | 296 ---- .../src/flow/evaluation/runnableProcessors.js | 244 ---- agent-flow/src/flow/evaluation/runners.js | 90 -- .../evaluationInitializationProcessor.js | 136 -- agent-flow/src/flow/jadeFlowEntry.jsx | 509 ------- agent-flow/src/flow/jadeFlowGraph.js | 247 ---- agent-flow/src/flow/jadeFlowPage.js | 839 ------------ agent-flow/src/flow/pageProcessors.js | 39 - agent-flow/src/flow/runners.js | 177 --- agent-flow/src/i18n/en_US.json | 438 ------ agent-flow/src/i18n/i18n.js | 35 - agent-flow/src/i18n/zh_CN.json | 731 ---------- agent-flow/src/index.js | 13 - agent-flow/src/main.jsx | 16 - agent-flow/src/shapes/systemEnv.jsx | 56 - agent-flow/src/testFlowData.js | 1210 ----------------- agent-flow/vite.config.js | 46 - 471 files changed, 1 insertion(+), 48489 deletions(-) delete mode 100644 agent-flow/.eslintrc.cjs delete mode 100644 agent-flow/.gitignore delete mode 100644 agent-flow/.npmrc delete mode 100644 agent-flow/README.md delete mode 100644 agent-flow/docs/features/llm-tool-detail-view.md delete mode 100644 agent-flow/docs/features/loop-tool-detail-view.md delete mode 100644 agent-flow/docs/features/parallel-tool-detail-view.md delete mode 100644 agent-flow/docs/features/shape-data-validation/design-picture.png delete mode 100644 agent-flow/docs/features/shape-data-validation/index.md delete mode 100644 agent-flow/index.html delete mode 100644 agent-flow/package.json delete mode 100644 agent-flow/src/App.jsx delete mode 100644 agent-flow/src/common/Consts.js delete mode 100644 agent-flow/src/components/AdvancedConfiguration.jsx delete mode 100644 agent-flow/src/components/DefaultRoot.jsx delete mode 100644 agent-flow/src/components/Footer.jsx delete mode 100644 agent-flow/src/components/Header.jsx delete mode 100644 agent-flow/src/components/appNode/AppNodeConst.js delete mode 100644 agent-flow/src/components/appNode/AppWrapper.jsx delete mode 100644 agent-flow/src/components/appNode/appComponent.jsx delete mode 100644 agent-flow/src/components/appNode/appNodeDrawer.jsx delete mode 100644 agent-flow/src/components/appNode/appNodeState.jsx delete mode 100644 agent-flow/src/components/asserts/form-default-preview.svg delete mode 100644 agent-flow/src/components/asserts/icon-add-subitem.svg delete mode 100644 agent-flow/src/components/asserts/icon-agent-header.svg delete mode 100644 agent-flow/src/components/asserts/icon-agent.svg delete mode 100644 agent-flow/src/components/asserts/icon-ai-prompt.svg delete mode 100644 agent-flow/src/components/asserts/icon-api-invoke.svg delete mode 100644 agent-flow/src/components/asserts/icon-api-key.svg delete mode 100644 agent-flow/src/components/asserts/icon-chatbot-header.svg delete mode 100644 agent-flow/src/components/asserts/icon-close.svg delete mode 100644 agent-flow/src/components/asserts/icon-code-collapsed.svg delete mode 100644 agent-flow/src/components/asserts/icon-code-expanded.svg delete mode 100644 agent-flow/src/components/asserts/icon-code.svg delete mode 100644 agent-flow/src/components/asserts/icon-condition.svg delete mode 100644 agent-flow/src/components/asserts/icon-config.svg delete mode 100644 agent-flow/src/components/asserts/icon-default-form.svg delete mode 100644 agent-flow/src/components/asserts/icon-delete-trash-bin.svg delete mode 100644 agent-flow/src/components/asserts/icon-delete.svg delete mode 100644 agent-flow/src/components/asserts/icon-edit.svg delete mode 100644 agent-flow/src/components/asserts/icon-empty-circle.svg delete mode 100644 agent-flow/src/components/asserts/icon-end.svg delete mode 100644 agent-flow/src/components/asserts/icon-evaluation-algorithm.svg delete mode 100644 agent-flow/src/components/asserts/icon-evaluation-end.svg delete mode 100644 agent-flow/src/components/asserts/icon-evaluation-start.svg delete mode 100644 agent-flow/src/components/asserts/icon-evaluation-test-set.svg delete mode 100644 agent-flow/src/components/asserts/icon-file-extraction.svg delete mode 100644 agent-flow/src/components/asserts/icon-fit-invoke.svg delete mode 100644 agent-flow/src/components/asserts/icon-font-bold.svg delete mode 100644 agent-flow/src/components/asserts/icon-font-color-btn.svg delete mode 100644 agent-flow/src/components/asserts/icon-font-italic.svg delete mode 100644 agent-flow/src/components/asserts/icon-font-underline.svg delete mode 100644 agent-flow/src/components/asserts/icon-full-screen.svg delete mode 100644 agent-flow/src/components/asserts/icon-http.svg delete mode 100644 agent-flow/src/components/asserts/icon-huggingface-header.svg delete mode 100644 agent-flow/src/components/asserts/icon-huggingface.svg delete mode 100644 agent-flow/src/components/asserts/icon-langchain.svg delete mode 100644 agent-flow/src/components/asserts/icon-llamaindex.svg delete mode 100644 agent-flow/src/components/asserts/icon-llm.svg delete mode 100644 agent-flow/src/components/asserts/icon-loop.svg delete mode 100644 agent-flow/src/components/asserts/icon-manual-check.svg delete mode 100644 agent-flow/src/components/asserts/icon-no-form.svg delete mode 100644 agent-flow/src/components/asserts/icon-note-align-center.svg delete mode 100644 agent-flow/src/components/asserts/icon-note-align-left.svg delete mode 100644 agent-flow/src/components/asserts/icon-note-align-right.svg delete mode 100644 agent-flow/src/components/asserts/icon-note-copy.svg delete mode 100644 agent-flow/src/components/asserts/icon-note-custom.svg delete mode 100644 agent-flow/src/components/asserts/icon-note-default-color.svg delete mode 100644 agent-flow/src/components/asserts/icon-note-delete.svg delete mode 100644 agent-flow/src/components/asserts/icon-note-fourth-color.svg delete mode 100644 agent-flow/src/components/asserts/icon-note-second-color.svg delete mode 100644 agent-flow/src/components/asserts/icon-note-third-color.svg delete mode 100644 agent-flow/src/components/asserts/icon-official.svg delete mode 100644 agent-flow/src/components/asserts/icon-optimization.svg delete mode 100644 agent-flow/src/components/asserts/icon-ordered-list.svg delete mode 100644 agent-flow/src/components/asserts/icon-parallel.svg delete mode 100644 agent-flow/src/components/asserts/icon-plugin-type-tool.svg delete mode 100644 agent-flow/src/components/asserts/icon-question-classification.svg delete mode 100644 agent-flow/src/components/asserts/icon-reply.svg delete mode 100644 agent-flow/src/components/asserts/icon-resize.svg delete mode 100644 agent-flow/src/components/asserts/icon-retrieval.svg delete mode 100644 agent-flow/src/components/asserts/icon-running-failed.svg delete mode 100644 agent-flow/src/components/asserts/icon-running-loading.svg delete mode 100644 agent-flow/src/components/asserts/icon-running-result.svg delete mode 100644 agent-flow/src/components/asserts/icon-running-success.svg delete mode 100644 agent-flow/src/components/asserts/icon-running-terminated.svg delete mode 100644 agent-flow/src/components/asserts/icon-running-unRunning.svg delete mode 100644 agent-flow/src/components/asserts/icon-search-args-config.svg delete mode 100644 agent-flow/src/components/asserts/icon-start.svg delete mode 100644 agent-flow/src/components/asserts/icon-text-concatenation.svg delete mode 100644 agent-flow/src/components/asserts/icon-text-to-image.svg delete mode 100644 agent-flow/src/components/asserts/icon-textExtraction.svg delete mode 100644 agent-flow/src/components/asserts/icon-tool-delete.svg delete mode 100644 agent-flow/src/components/asserts/icon-tool.svg delete mode 100644 agent-flow/src/components/asserts/icon-unordered-list.svg delete mode 100644 agent-flow/src/components/asserts/icon-variable-aggregation.svg delete mode 100644 agent-flow/src/components/asserts/icon-variable-update.svg delete mode 100644 agent-flow/src/components/asserts/icon-workflow-header.svg delete mode 100644 agent-flow/src/components/asserts/icon-workflow.svg delete mode 100644 agent-flow/src/components/asserts/svgIcons.jsx delete mode 100644 agent-flow/src/components/base/baseToolNode.jsx delete mode 100644 agent-flow/src/components/base/baseToolNodeDrawer.jsx delete mode 100644 agent-flow/src/components/base/baseToolNodeState.js delete mode 100644 agent-flow/src/components/base/detections.js delete mode 100644 agent-flow/src/components/base/emptyStatusManager.js delete mode 100644 agent-flow/src/components/base/jadeNode.jsx delete mode 100644 agent-flow/src/components/base/jadeNodeDrawer.jsx delete mode 100644 agent-flow/src/components/base/observerProxy.js delete mode 100644 agent-flow/src/components/base/overrides.js delete mode 100644 agent-flow/src/components/base/references.js delete mode 100644 agent-flow/src/components/base/statusManager.js delete mode 100644 agent-flow/src/components/base/validator.js delete mode 100644 agent-flow/src/components/code/CodeNodeDrawer.jsx delete mode 100644 agent-flow/src/components/code/CodePanel.jsx delete mode 100644 agent-flow/src/components/code/CodeWrapper.jsx delete mode 100644 agent-flow/src/components/code/codeComponent.jsx delete mode 100644 agent-flow/src/components/code/codeNodeState.jsx delete mode 100644 agent-flow/src/components/code/style.css delete mode 100644 agent-flow/src/components/common/AiPromptPanel.jsx delete mode 100644 agent-flow/src/components/common/ConnectorProvider.jsx delete mode 100644 agent-flow/src/components/common/CustomizedModelSelect.jsx delete mode 100644 agent-flow/src/components/common/InvokeInput.jsx delete mode 100644 agent-flow/src/components/common/InvokeOutput.jsx delete mode 100644 agent-flow/src/components/common/JadeCollapse.jsx delete mode 100644 agent-flow/src/components/common/JadeFieldName.jsx delete mode 100644 agent-flow/src/components/common/JadeFormText.jsx delete mode 100644 agent-flow/src/components/common/JadeInput.jsx delete mode 100644 agent-flow/src/components/common/JadeInputForm.jsx delete mode 100644 agent-flow/src/components/common/JadeInputTree.jsx delete mode 100644 agent-flow/src/components/common/JadeInputTreeCollapse.jsx delete mode 100644 agent-flow/src/components/common/JadeObservableInput.jsx delete mode 100644 agent-flow/src/components/common/JadeObservableOutput.jsx delete mode 100644 agent-flow/src/components/common/JadeObservableSwitch.jsx delete mode 100644 agent-flow/src/components/common/JadeObservableTree.jsx delete mode 100644 agent-flow/src/components/common/JadePanelHeader.jsx delete mode 100644 agent-flow/src/components/common/JadeReferenceMultiTreeSelect.jsx delete mode 100644 agent-flow/src/components/common/JadeReferenceTreeSelect.jsx delete mode 100644 agent-flow/src/components/common/JadeScrollSelect.jsx delete mode 100644 agent-flow/src/components/common/JadeStopPropagationSelect.jsx delete mode 100644 agent-flow/src/components/common/JadeTagRender.jsx delete mode 100644 agent-flow/src/components/common/JadeTree.jsx delete mode 100644 agent-flow/src/components/common/JsonViewer.jsx delete mode 100644 agent-flow/src/components/common/ModelConfig.jsx delete mode 100644 agent-flow/src/components/common/OutputForm.jsx delete mode 100644 agent-flow/src/components/common/TemplatePanel.jsx delete mode 100644 agent-flow/src/components/common/TextDisplay.jsx delete mode 100644 agent-flow/src/components/common/TreeSwitcherIcon.jsx delete mode 100644 agent-flow/src/components/common/Type.jsx delete mode 100644 agent-flow/src/components/common/UseUpdateEffect.jsx delete mode 100644 agent-flow/src/components/common/code/CodeDrawer.jsx delete mode 100644 agent-flow/src/components/common/code/CodeEditor.jsx delete mode 100644 agent-flow/src/components/common/code/CodePlayground.jsx delete mode 100644 agent-flow/src/components/common/code/Tester.jsx delete mode 100644 agent-flow/src/components/common/code/codePlaygroundStyle.css delete mode 100644 agent-flow/src/components/common/custom-antd.css delete mode 100644 agent-flow/src/components/common/jadeInputTree.css delete mode 100644 agent-flow/src/components/common/jadeObservableTree.css delete mode 100644 agent-flow/src/components/common/json/JadeJsonTree.jsx delete mode 100644 agent-flow/src/components/common/json/JsonNode.jsx delete mode 100644 agent-flow/src/components/common/json/jadeJsonTree.css delete mode 100644 agent-flow/src/components/common/prompt/Prompt.jsx delete mode 100644 agent-flow/src/components/common/prompt/PromptDrawer.jsx delete mode 100644 agent-flow/src/components/common/prompt/prompt.css delete mode 100644 agent-flow/src/components/common/reducers/commonReducers.js delete mode 100644 agent-flow/src/components/common/style.css delete mode 100644 agent-flow/src/components/condition/ConditionFormWrapper.jsx delete mode 100644 agent-flow/src/components/condition/ElseForm.jsx delete mode 100644 agent-flow/src/components/condition/IfForm.jsx delete mode 100644 agent-flow/src/components/condition/conditionComponent.jsx delete mode 100644 agent-flow/src/components/condition/conditionNodeCondition.jsx delete mode 100644 agent-flow/src/components/condition/conditionNodeDrawer.jsx delete mode 100644 agent-flow/src/components/condition/style.css delete mode 100644 agent-flow/src/components/contentStyle.css delete mode 100644 agent-flow/src/components/defaultComponent.js delete mode 100644 agent-flow/src/components/end/EndConst.js delete mode 100644 agent-flow/src/components/end/EndInputForm.jsx delete mode 100644 agent-flow/src/components/end/EndNodeHeader.jsx delete mode 100644 agent-flow/src/components/end/EndNodeWrapper.jsx delete mode 100644 agent-flow/src/components/end/OutputVariable.jsx delete mode 100644 agent-flow/src/components/end/OutputVariableRow.jsx delete mode 100644 agent-flow/src/components/end/SelectMode.jsx delete mode 100644 agent-flow/src/components/end/endComponent.jsx delete mode 100644 agent-flow/src/components/end/endNodeDrawer.jsx delete mode 100644 agent-flow/src/components/end/endNodeEnd.jsx delete mode 100644 agent-flow/src/components/end/endNodeUtils.js delete mode 100644 agent-flow/src/components/end/reducers/reducers.js delete mode 100644 agent-flow/src/components/end/style.css delete mode 100644 agent-flow/src/components/evaluation/evaluationAlgorithms/EvaluationAlgorithmsSelect.jsx delete mode 100644 agent-flow/src/components/evaluation/evaluationAlgorithms/EvaluationAlgorithmsWrapper.jsx delete mode 100644 agent-flow/src/components/evaluation/evaluationAlgorithms/EvaluationInput.jsx delete mode 100644 agent-flow/src/components/evaluation/evaluationAlgorithms/PassingScore.jsx delete mode 100644 agent-flow/src/components/evaluation/evaluationAlgorithms/evaluationAlgorithmsComponent.jsx delete mode 100644 agent-flow/src/components/evaluation/evaluationAlgorithms/evaluationAlgorithmsNodeDrawer.jsx delete mode 100644 agent-flow/src/components/evaluation/evaluationAlgorithms/evaluationAlgorithmsNodeState.jsx delete mode 100644 agent-flow/src/components/evaluation/evaluationEnd/EvaluationEndWrapper.jsx delete mode 100644 agent-flow/src/components/evaluation/evaluationEnd/EvaluationOutput.jsx delete mode 100644 agent-flow/src/components/evaluation/evaluationEnd/evaluationEndComponent.jsx delete mode 100644 agent-flow/src/components/evaluation/evaluationEnd/evaluationEndNodeDrawer.jsx delete mode 100644 agent-flow/src/components/evaluation/evaluationEnd/evaluationEndNodeEnd.jsx delete mode 100644 agent-flow/src/components/evaluation/evaluationNode.jsx delete mode 100644 agent-flow/src/components/evaluation/evaluationNodeDrawer.jsx delete mode 100644 agent-flow/src/components/evaluation/evaluationStart/EvaluationStartWrapper.jsx delete mode 100644 agent-flow/src/components/evaluation/evaluationStart/evaluationStartComponent.jsx delete mode 100644 agent-flow/src/components/evaluation/evaluationStart/evaluationStartNodeDrawer.jsx delete mode 100644 agent-flow/src/components/evaluation/evaluationStart/evaluationStartNodeStart.jsx delete mode 100644 agent-flow/src/components/evaluation/evaluationTestset/EvaluationTestSetSelect.jsx delete mode 100644 agent-flow/src/components/evaluation/evaluationTestset/EvaluationTestSetWrapper.jsx delete mode 100644 agent-flow/src/components/evaluation/evaluationTestset/TestQuantity.jsx delete mode 100644 agent-flow/src/components/evaluation/evaluationTestset/evaluationTestSetComponent.jsx delete mode 100644 agent-flow/src/components/evaluation/evaluationTestset/evaluationTestSetNodeDrawer.jsx delete mode 100644 agent-flow/src/components/evaluation/evaluationTestset/evaluationTestSetNodeState.jsx delete mode 100644 agent-flow/src/components/evaluation/evaluationTestset/style.css delete mode 100644 agent-flow/src/components/fileExtraction/FileExtractionWrapper.jsx delete mode 100644 agent-flow/src/components/fileExtraction/fileExtractionComponent.jsx delete mode 100644 agent-flow/src/components/fileExtraction/fileExtractionNodeDrawer.jsx delete mode 100644 agent-flow/src/components/fileExtraction/fileExtractionNodeState.jsx delete mode 100644 agent-flow/src/components/fileExtraction/reducers.js delete mode 100644 agent-flow/src/components/fileExtraction/style.css delete mode 100644 agent-flow/src/components/fitInvokeNode/FitInvokeFormWrapper.jsx delete mode 100644 agent-flow/src/components/fitInvokeNode/FitInvokeOutput.jsx delete mode 100644 agent-flow/src/components/fitInvokeNode/FitInvokeService.jsx delete mode 100644 agent-flow/src/components/fitInvokeNode/FitSelectGenericable.jsx delete mode 100644 agent-flow/src/components/fitInvokeNode/FitSelectTool.jsx delete mode 100644 agent-flow/src/components/fitInvokeNode/fitInvokeComponent.jsx delete mode 100644 agent-flow/src/components/fitInvokeNode/fitInvokeNodeDrawer.jsx delete mode 100644 agent-flow/src/components/fitInvokeNode/fitInvokeNodeState.jsx delete mode 100644 agent-flow/src/components/fitInvokeNode/style.css delete mode 100644 agent-flow/src/components/flowRunComponent/RunReport.jsx delete mode 100644 agent-flow/src/components/flowRunComponent/RunningStatusPanel.jsx delete mode 100644 agent-flow/src/components/flowRunComponent/SectionContent.jsx delete mode 100644 agent-flow/src/components/flowRunComponent/SectionFactory.jsx delete mode 100644 agent-flow/src/components/flowRunComponent/SectionHeader.jsx delete mode 100644 agent-flow/src/components/flowRunComponent/style.css delete mode 100644 agent-flow/src/components/headerStyle.css delete mode 100644 agent-flow/src/components/httpNode/AuthInputField.jsx delete mode 100644 agent-flow/src/components/httpNode/AuthenticationButton.jsx delete mode 100644 agent-flow/src/components/httpNode/AuthenticationModal.jsx delete mode 100644 agent-flow/src/components/httpNode/AuthenticationModalConetnt.jsx delete mode 100644 agent-flow/src/components/httpNode/BodyEditor.jsx delete mode 100644 agent-flow/src/components/httpNode/BodyTypeSelector.jsx delete mode 100644 agent-flow/src/components/httpNode/HttpWrapper.jsx delete mode 100644 agent-flow/src/components/httpNode/ParamInfo.jsx delete mode 100644 agent-flow/src/components/httpNode/ParamList.jsx delete mode 100644 agent-flow/src/components/httpNode/ParamRow.jsx delete mode 100644 agent-flow/src/components/httpNode/RequestConfig.jsx delete mode 100644 agent-flow/src/components/httpNode/RequestParams.jsx delete mode 100644 agent-flow/src/components/httpNode/TimeOutInput.jsx delete mode 100644 agent-flow/src/components/httpNode/httpComponent.jsx delete mode 100644 agent-flow/src/components/httpNode/httpNodeDrawer.jsx delete mode 100644 agent-flow/src/components/httpNode/httpNodeState.jsx delete mode 100644 agent-flow/src/components/httpNode/reducers.js delete mode 100644 agent-flow/src/components/httpNode/style.css delete mode 100644 agent-flow/src/components/huggingFace/HuggingFaceFormWrapper.jsx delete mode 100644 agent-flow/src/components/huggingFace/huggingFaceComponent.jsx delete mode 100644 agent-flow/src/components/huggingFace/huggingFaceNodeDrawer.jsx delete mode 100644 agent-flow/src/components/huggingFace/huggingFaceNodeState.jsx delete mode 100644 agent-flow/src/components/intelligentForm/Consts.js delete mode 100644 agent-flow/src/components/intelligentForm/FormItemDisplayName.jsx delete mode 100644 agent-flow/src/components/intelligentForm/FormItemFieldType.jsx delete mode 100644 agent-flow/src/components/intelligentForm/FormItemName.jsx delete mode 100644 agent-flow/src/components/intelligentForm/FormItemRenderType.jsx delete mode 100644 agent-flow/src/components/intelligentForm/FormItemSelectValue.jsx delete mode 100644 agent-flow/src/components/intelligentForm/IntelligentFormWrapper.jsx delete mode 100644 agent-flow/src/components/intelligentForm/IntelligentInputFormItem.jsx delete mode 100644 agent-flow/src/components/intelligentForm/SimpleFormWrapper.jsx delete mode 100644 agent-flow/src/components/intelligentForm/intelligentFormComponent.jsx delete mode 100644 agent-flow/src/components/intelligentForm/intelligentFormNodeDrawer.jsx delete mode 100644 agent-flow/src/components/intelligentForm/intelligentFormNodeState.jsx delete mode 100644 agent-flow/src/components/intelligentForm/reducers.js delete mode 100644 agent-flow/src/components/jadeEvent.jsx delete mode 100644 agent-flow/src/components/knowledgeRetrieval/KnowledgeRetrievalWrapper.jsx delete mode 100644 agent-flow/src/components/knowledgeRetrieval/OutsideRerankForm.jsx delete mode 100644 agent-flow/src/components/knowledgeRetrieval/SearchForm.jsx delete mode 100644 agent-flow/src/components/knowledgeRetrieval/knowledge.css delete mode 100644 agent-flow/src/components/knowledgeRetrieval/knowledgeRetrievalComponent.jsx delete mode 100644 agent-flow/src/components/knowledgeRetrieval/knowledgeRetrievalNodeDrawer.jsx delete mode 100644 agent-flow/src/components/knowledgeRetrieval/knowledgeRetrievalNodeState.jsx delete mode 100644 agent-flow/src/components/knowledgeRetrieval/reducers.js delete mode 100644 agent-flow/src/components/llm/KnowledgeForm.jsx delete mode 100644 agent-flow/src/components/llm/LlmFormWrapper.jsx delete mode 100644 agent-flow/src/components/llm/LlmOutput.jsx delete mode 100644 agent-flow/src/components/llm/McpConfigForm.jsx delete mode 100644 agent-flow/src/components/llm/Model.jsx delete mode 100644 agent-flow/src/components/llm/ModelForm.jsx delete mode 100644 agent-flow/src/components/llm/SkillForm.jsx delete mode 100644 agent-flow/src/components/llm/llmComponent.jsx delete mode 100644 agent-flow/src/components/llm/llmNodeDrawer.jsx delete mode 100644 agent-flow/src/components/llm/llmNodeState.jsx delete mode 100644 agent-flow/src/components/llm/reducers/reducers.js delete mode 100644 agent-flow/src/components/llm/style.css delete mode 100644 agent-flow/src/components/loopNode/LoopConsts.js delete mode 100644 agent-flow/src/components/loopNode/LoopWrapper.jsx delete mode 100644 agent-flow/src/components/loopNode/SkillForm.jsx delete mode 100644 agent-flow/src/components/loopNode/loopComponent.jsx delete mode 100644 agent-flow/src/components/loopNode/loopNodeDrawer.jsx delete mode 100644 agent-flow/src/components/loopNode/loopNodeState.jsx delete mode 100644 agent-flow/src/components/loopNode/reducers/reducers.js delete mode 100644 agent-flow/src/components/manualCheck/JadePanelCollapse.jsx delete mode 100644 agent-flow/src/components/manualCheck/ManualCheckForm.jsx delete mode 100644 agent-flow/src/components/manualCheck/ManualCheckFormOutput.jsx delete mode 100644 agent-flow/src/components/manualCheck/ManualCheckFormWrapper.jsx delete mode 100644 agent-flow/src/components/manualCheck/OriginForm.jsx delete mode 100644 agent-flow/src/components/manualCheck/manualCheckComponent.jsx delete mode 100644 agent-flow/src/components/manualCheck/manualCheckNodeDrawer.jsx delete mode 100644 agent-flow/src/components/manualCheck/manualCheckNodeState.jsx delete mode 100644 agent-flow/src/components/manualCheck/reducers/reducers.js delete mode 100644 agent-flow/src/components/manualCheck/style.css delete mode 100644 agent-flow/src/components/note/BgColorSelector.jsx delete mode 100644 agent-flow/src/components/note/CustomButton.jsx delete mode 100644 agent-flow/src/components/note/EditorToolBar.jsx delete mode 100644 agent-flow/src/components/note/FontColorIcon.jsx delete mode 100644 agent-flow/src/components/note/FontPropertySelector.jsx delete mode 100644 agent-flow/src/components/note/FontStyleSetter.jsx delete mode 100644 agent-flow/src/components/note/NoteWrapper.jsx delete mode 100644 agent-flow/src/components/note/ResizeButton.jsx delete mode 100644 agent-flow/src/components/note/SplitLine.jsx delete mode 100644 agent-flow/src/components/note/TextEditor.jsx delete mode 100644 agent-flow/src/components/note/TextStyleSelector.jsx delete mode 100644 agent-flow/src/components/note/const.js delete mode 100644 agent-flow/src/components/note/editor.css delete mode 100644 agent-flow/src/components/note/noteComponent.jsx delete mode 100644 agent-flow/src/components/note/noteNode.jsx delete mode 100644 agent-flow/src/components/note/noteNodeDrawer.jsx delete mode 100644 agent-flow/src/components/note/reducers.js delete mode 100644 agent-flow/src/components/note/style.css delete mode 100644 agent-flow/src/components/parallelNode/ParallelPluginItem.jsx delete mode 100644 agent-flow/src/components/parallelNode/ParallelTopBar.jsx delete mode 100644 agent-flow/src/components/parallelNode/ParallelWrapper.jsx delete mode 100644 agent-flow/src/components/parallelNode/consts.js delete mode 100644 agent-flow/src/components/parallelNode/parallelComponent.jsx delete mode 100644 agent-flow/src/components/parallelNode/parallelNodeDrawer.jsx delete mode 100644 agent-flow/src/components/parallelNode/parallelNodeState.jsx delete mode 100644 agent-flow/src/components/parallelNode/reducers/reducers.js delete mode 100644 agent-flow/src/components/queryOptimization/MemoryConfig.jsx delete mode 100644 agent-flow/src/components/queryOptimization/OptimizationConfig.jsx delete mode 100644 agent-flow/src/components/queryOptimization/QueryOptimizationWrapper.jsx delete mode 100644 agent-flow/src/components/queryOptimization/Template.jsx delete mode 100644 agent-flow/src/components/queryOptimization/queryOptimizationComponent.jsx delete mode 100644 agent-flow/src/components/queryOptimization/queryOptimizationNodeDrawer.jsx delete mode 100644 agent-flow/src/components/queryOptimization/queryOptimizationNodeState.jsx delete mode 100644 agent-flow/src/components/queryOptimization/reducers.js delete mode 100644 agent-flow/src/components/queryOptimization/style.css delete mode 100644 agent-flow/src/components/questionClassification/QuestionClassificationPanel.jsx delete mode 100644 agent-flow/src/components/questionClassification/QuestionClassificationWrapper.jsx delete mode 100644 agent-flow/src/components/questionClassification/questionClassificationComponent.jsx delete mode 100644 agent-flow/src/components/questionClassification/questionClassificationNodeCondition.jsx delete mode 100644 agent-flow/src/components/questionClassification/questionClassificationNodeDrawer.jsx delete mode 100644 agent-flow/src/components/questionClassification/reducers.js delete mode 100644 agent-flow/src/components/questionClassification/style.css delete mode 100644 agent-flow/src/components/replaceDemo/replaceComponent.jsx delete mode 100644 agent-flow/src/components/replaceDemo/testComponent.jsx delete mode 100644 agent-flow/src/components/replaceDemo/testNode.jsx delete mode 100644 agent-flow/src/components/replyNode/ReplyWrapper.jsx delete mode 100644 agent-flow/src/components/replyNode/reducers/reducer.js delete mode 100644 agent-flow/src/components/replyNode/replyNodeComponent.jsx delete mode 100644 agent-flow/src/components/replyNode/replyNodeDrawer.jsx delete mode 100644 agent-flow/src/components/replyNode/replyNodeState.jsx delete mode 100644 agent-flow/src/components/replyNode/style.css delete mode 100644 agent-flow/src/components/retrieval/InputForm.jsx delete mode 100644 agent-flow/src/components/retrieval/KnowledgeConfig.jsx delete mode 100644 agent-flow/src/components/retrieval/KnowledgeForm.jsx delete mode 100644 agent-flow/src/components/retrieval/RetrievalWrapper.jsx delete mode 100644 agent-flow/src/components/retrieval/reducers.js delete mode 100644 agent-flow/src/components/retrieval/retrievalComponent.jsx delete mode 100644 agent-flow/src/components/retrieval/retrievalNodeDrawer.jsx delete mode 100644 agent-flow/src/components/retrieval/retrievalNodeState.jsx delete mode 100644 agent-flow/src/components/retrieval/style.css delete mode 100644 agent-flow/src/components/start/AppConfiguration.jsx delete mode 100644 agent-flow/src/components/start/ByConversationTurn.jsx delete mode 100644 agent-flow/src/components/start/ByNumber.jsx delete mode 100644 agent-flow/src/components/start/ByTime.jsx delete mode 100644 agent-flow/src/components/start/ByTokenSize.jsx delete mode 100644 agent-flow/src/components/start/Customizing.jsx delete mode 100644 agent-flow/src/components/start/Description.jsx delete mode 100644 agent-flow/src/components/start/DisplayName.jsx delete mode 100644 agent-flow/src/components/start/Memory.jsx delete mode 100644 agent-flow/src/components/start/MultiConversation.jsx delete mode 100644 agent-flow/src/components/start/MultiConversationContent.jsx delete mode 100644 agent-flow/src/components/start/Name.jsx delete mode 100644 agent-flow/src/components/start/Required.jsx delete mode 100644 agent-flow/src/components/start/StartFormWrapper.jsx delete mode 100644 agent-flow/src/components/start/StartInputForm.jsx delete mode 100644 agent-flow/src/components/start/Visible.jsx delete mode 100644 agent-flow/src/components/start/chat-screenshot.jpg delete mode 100644 agent-flow/src/components/start/startComponent.jsx delete mode 100644 agent-flow/src/components/start/startNodeDrawer.jsx delete mode 100644 agent-flow/src/components/start/startNodeHeader.jsx delete mode 100644 agent-flow/src/components/start/startNodeStart.jsx delete mode 100644 agent-flow/src/components/start/style.css delete mode 100644 agent-flow/src/components/testDemo/AddTask.jsx delete mode 100644 agent-flow/src/components/testDemo/TaskList.jsx delete mode 100644 agent-flow/src/components/testDemo/taskNode.jsx delete mode 100644 agent-flow/src/components/textConcatenationNode/reducers/reducer.js delete mode 100644 agent-flow/src/components/textConcatenationNode/textConcatenateNodeComponent.jsx delete mode 100644 agent-flow/src/components/textConcatenationNode/textConcatenateNodeDrawer.jsx delete mode 100644 agent-flow/src/components/textConcatenationNode/textConcatenateNodeState.jsx delete mode 100644 agent-flow/src/components/textConcatenationNode/textConcatenateNodeWrapper.jsx delete mode 100644 agent-flow/src/components/textExtraction/HistoryConfig.jsx delete mode 100644 agent-flow/src/components/textExtraction/TextExtractionInput.jsx delete mode 100644 agent-flow/src/components/textExtraction/TextExtractionSchema.jsx delete mode 100644 agent-flow/src/components/textExtraction/TextExtractionWrapper.jsx delete mode 100644 agent-flow/src/components/textExtraction/reducers.js delete mode 100644 agent-flow/src/components/textExtraction/style.css delete mode 100644 agent-flow/src/components/textExtraction/textExtractionComponent.jsx delete mode 100644 agent-flow/src/components/textExtraction/textExtractionNodeDrawer.jsx delete mode 100644 agent-flow/src/components/textExtraction/textExtractionNodeState.jsx delete mode 100644 agent-flow/src/components/textToImage/TextToImageParamConfig.jsx delete mode 100644 agent-flow/src/components/textToImage/TextToImageWrapper.jsx delete mode 100644 agent-flow/src/components/textToImage/reducers.js delete mode 100644 agent-flow/src/components/textToImage/style.css delete mode 100644 agent-flow/src/components/textToImage/textToImageComponent.jsx delete mode 100644 agent-flow/src/components/textToImage/textToImageNodeDrawer.jsx delete mode 100644 agent-flow/src/components/textToImage/textToImageNodeState.jsx delete mode 100644 agent-flow/src/components/toolInvokeNode/ToolInvokeFormWrapper.jsx delete mode 100644 agent-flow/src/components/toolInvokeNode/VersionInfo.jsx delete mode 100644 agent-flow/src/components/toolInvokeNode/style.css delete mode 100644 agent-flow/src/components/toolInvokeNode/toolInvokeComponent.jsx delete mode 100644 agent-flow/src/components/toolInvokeNode/toolInvokeNodeDrawer.jsx delete mode 100644 agent-flow/src/components/toolInvokeNode/toolInvokeNodeState.jsx delete mode 100644 agent-flow/src/components/util/ArrayUtil.js delete mode 100644 agent-flow/src/components/util/BranchUtil.js delete mode 100644 agent-flow/src/components/util/CssUtil.js delete mode 100644 agent-flow/src/components/util/FlowMeta.js delete mode 100644 agent-flow/src/components/util/JadeConfigUtils.js delete mode 100644 agent-flow/src/components/util/MethodMetaDataParser.js delete mode 100644 agent-flow/src/components/util/ReferenceUtil.js delete mode 100644 agent-flow/src/components/util/StringUtil.js delete mode 100644 agent-flow/src/components/util/TreeSelectUtils.jsx delete mode 100644 agent-flow/src/components/util/httpUtil.jsx delete mode 100644 agent-flow/src/components/variableAggregation/VariableAggregationInputForm.jsx delete mode 100644 agent-flow/src/components/variableAggregation/VariableAggregationOutputForm.jsx delete mode 100644 agent-flow/src/components/variableAggregation/VariableAggregationWrapper.jsx delete mode 100644 agent-flow/src/components/variableAggregation/variable.css delete mode 100644 agent-flow/src/components/variableAggregation/variableAggregationComponent.jsx delete mode 100644 agent-flow/src/components/variableAggregation/variableAggregationConstant.js delete mode 100644 agent-flow/src/components/variableAggregation/variableAggregationDrawer.jsx delete mode 100644 agent-flow/src/components/variableAggregation/variableAggregationNodeState.jsx delete mode 100644 agent-flow/src/components/variableAggregation/variableAggregationReducers.js delete mode 100644 agent-flow/src/components/variableUpdater/Constant.js delete mode 100644 agent-flow/src/components/variableUpdater/VariableUpdateWrapper.jsx delete mode 100644 agent-flow/src/components/variableUpdater/VariableUpdaterInputForm.jsx delete mode 100644 agent-flow/src/components/variableUpdater/reducers/reducers.js delete mode 100644 agent-flow/src/components/variableUpdater/variableUpdater.css delete mode 100644 agent-flow/src/components/variableUpdater/variableUpdaterComponent.jsx delete mode 100644 agent-flow/src/components/variableUpdater/variableUpdaterDrawer.jsx delete mode 100644 agent-flow/src/components/variableUpdater/variableUpdaterNodeState.jsx delete mode 100644 agent-flow/src/data/GraphOperator.js delete mode 100644 agent-flow/src/data/ShapeDataValidationProcessor.js delete mode 100644 agent-flow/src/flow/compatibility/compatibilities.js delete mode 100644 agent-flow/src/flow/compatibility/compatibilityProcessors.js delete mode 100644 agent-flow/src/flow/evaluation/decorators/eventDecorator.js delete mode 100644 agent-flow/src/flow/evaluation/jadeEvaluationGraph.js delete mode 100644 agent-flow/src/flow/evaluation/jadeEvaluationPage.js delete mode 100644 agent-flow/src/flow/evaluation/runnableProcessors.js delete mode 100644 agent-flow/src/flow/evaluation/runners.js delete mode 100644 agent-flow/src/flow/initialization/evaluationInitializationProcessor.js delete mode 100644 agent-flow/src/flow/jadeFlowEntry.jsx delete mode 100644 agent-flow/src/flow/jadeFlowGraph.js delete mode 100644 agent-flow/src/flow/jadeFlowPage.js delete mode 100644 agent-flow/src/flow/pageProcessors.js delete mode 100644 agent-flow/src/flow/runners.js delete mode 100644 agent-flow/src/i18n/en_US.json delete mode 100644 agent-flow/src/i18n/i18n.js delete mode 100644 agent-flow/src/i18n/zh_CN.json delete mode 100644 agent-flow/src/index.js delete mode 100644 agent-flow/src/main.jsx delete mode 100644 agent-flow/src/shapes/systemEnv.jsx delete mode 100644 agent-flow/src/testFlowData.js delete mode 100644 agent-flow/vite.config.js diff --git a/PUBLISH_GUIDE.md b/PUBLISH_GUIDE.md index 09d2f11..79d6498 100644 --- a/PUBLISH_GUIDE.md +++ b/PUBLISH_GUIDE.md @@ -33,12 +33,7 @@ ## 发布流程 -ELSA 项目包含两个模块,发布时需要按照以下顺序进行: - -1. **首先发布 @fit-elsa/elsa**(核心框架模块) -2. **然后发布 @fit-elsa/agent-flow**(React前端应用模块) - -这是因为 agent-flow 依赖于 elsa,确保依赖的模块先发布可以避免版本冲突。 +1. **发布 @fit-elsa/elsa**(核心框架模块) ## 使用发布脚本 @@ -58,22 +53,6 @@ ELSA 项目包含两个模块,发布时需要按照以下顺序进行: npm publish --access public ``` -### 直接发布 @fit-elsa/agent-flow - -1. 打开命令行终端 -2. 导航到 agent-flow 目录 -3. 执行以下命令: - ```bash - # 安装依赖 - npm install - - # 构建项目 - npm run build - - # 发布到 npm(确保已登录且有发布权限) - npm publish --access public - ``` - ### 脚本流程 运行每个模块的发布脚本后,它将执行以下操作: diff --git a/README.md b/README.md index a954147..f696dcd 100644 --- a/README.md +++ b/README.md @@ -12,24 +12,11 @@ - 支持图形拖拽和画布拖拽,并提供节点整理和一键显示所有节点的能力 -### 前端应用 (agent-flow) - -- **集成React能力** - - - 基于Context的上下文传递 - - 节点渲染缓存:React.memo + 自定义shouldComponentUpdate -- **集成Ant Design能力** - - - 基于Form组件的实时校验提示系统 - - 基于Tree组件封装的节点上下文观察者机制 - ## 🚀 核心架构概览 ### 1. 分层架构 ```markdown -├─ agent-flow/ # React前端应用 -│ └─ src/ # 前端源代码 └─ elsa/ # 核心框架 ├─ common/ # 通用工具 ├─ core/ # 工作流运行时引擎 @@ -54,28 +41,6 @@ | **国际化** | `i18next@21.6`(多语言支持) | | **视频处理** | `video.js@8.9`(视频播放器集成) | -### @elsa/agent-flow(React 前端模块) -#### **核心框架** -| 类别 | 技术栈 | -| ----------- | ----------------------------------------- | -| **前端框架** | React 18 + TypeScript(隐式依赖) | -| **状态管理** | 原生 React Hooks(未显式引入 Redux) | -| **UI 组件库** | Ant Design@4.24 +`@ant-design/icons@5.3` | - -#### **开发工具链** -| 类别 | 技术栈 | -| --------- | ------------------------------------------ | -| **构建工具** | Vite@5(替代 Webpack) +`vite-plugin-react@4` | -| **代码规范** | ESLint +`react-hooks`/`refresh`插件 | -| **特殊集成** | `vite-plugin-svgr`(SVG 转 React 组件) | - -#### **关键功能依赖** -| 类别 | 技术栈 | -| ------------- | ---------------------------------------------------------------------- | -| **编辑器** | `monaco-editor@0.34`(代码编辑器) +`@tinymce/tinymce-react@4.3`(注释节点富文本编辑器) | -| **HTTP 客户端** | `axios@1.8`(API 请求) | -| **核心依赖** | `@fit-elsa/elsa`(本地路径引用) | - ## 快速开始 所需要的环境: @@ -95,16 +60,4 @@ npm i # 编译构建 npm run build - -# 进入agent-flow目录 -cd ../agent-flow - -# 安装依赖 -npm i - -# 编译构建 -npm run build - -#启动 fit-agent-flow -npm run dev ``` \ No newline at end of file diff --git a/agent-flow/.eslintrc.cjs b/agent-flow/.eslintrc.cjs deleted file mode 100644 index 3e212e1..0000000 --- a/agent-flow/.eslintrc.cjs +++ /dev/null @@ -1,21 +0,0 @@ -module.exports = { - root: true, - env: { browser: true, es2020: true }, - extends: [ - 'eslint:recommended', - 'plugin:react/recommended', - 'plugin:react/jsx-runtime', - 'plugin:react-hooks/recommended', - ], - ignorePatterns: ['dist', '.eslintrc.cjs'], - parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, - settings: { react: { version: '18.2' } }, - plugins: ['react-refresh'], - rules: { - 'react/jsx-no-target-blank': 'off', - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], - }, -} diff --git a/agent-flow/.gitignore b/agent-flow/.gitignore deleted file mode 100644 index 2a170a8..0000000 --- a/agent-flow/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -package-lock.json -node_modules/ -build/ diff --git a/agent-flow/.npmrc b/agent-flow/.npmrc deleted file mode 100644 index 1130e2a..0000000 --- a/agent-flow/.npmrc +++ /dev/null @@ -1,3 +0,0 @@ -strict-ssl=false -package-lock=true # 启用lockfiles -registry=https://registry.npmjs.org/ diff --git a/agent-flow/README.md b/agent-flow/README.md deleted file mode 100644 index 065631e..0000000 --- a/agent-flow/README.md +++ /dev/null @@ -1,154 +0,0 @@ -# @fit-elsa/agent-flow - -## 简介 - -@fit-elsa/agent-flow 是基于React的前端应用模块,为 @fit-elsa/elsa 核心框架提供React封装和UI组件。 - -## 功能亮点 - -### 集成React能力 -- 基于Context的上下文传递 -- 节点渲染缓存:React.memo + 自定义shouldComponentUpdate - -### 集成Ant Design能力 -- 基于Form组件的实时校验提示系统 -- 基于Tree组件封装的节点上下文观察者机制 - -## 安装 - -```bash -npm install @fit-elsa/agent-flow @fit-elsa/elsa -``` - -## 快速开始 - -### 基本用法 - -```jsx -import React from 'react'; -import { JadeFlow, createGraphOperator } from '@fit-elsa/agent-flow'; - -function MyFlowApp() { - // 创建图形操作器 - const graphOperator = createGraphOperator(); - - // 处理图形数据变更 - const handleGraphChange = (graphData) => { - console.log('图形数据已变更:', graphData); - }; - - return ( -
- -
- ); -} - -export default MyFlowApp; -``` - -### 多会话示例 - -```jsx -import React, { useState } from 'react'; -import { MultiConversation, MultiConversationContent } from '@fit-elsa/agent-flow'; - -function MultiConvApp() { - const [selectedConversation, setSelectedConversation] = useState(null); - - const conversations = [ - { id: '1', title: '会话 1', content: '这是第一个会话的内容' }, - { id: '2', title: '会话 2', content: '这是第二个会话的内容' } - ]; - - return ( -
-
- -
-
- {selectedConversation && ( - - )} -
-
- ); -} - -export default MultiConvApp; -``` - -## 组件API - -### JadeFlow - -主要的流程图组件,用于显示和编辑流程图。 - -**属性**: -- `graphOperator`: 图形操作器实例 -- `onGraphChange`: 图形数据变更时的回调函数 -- `height`: 流程图高度 -- `width`: 流程图宽度 -- `readOnly`: 是否只读模式 -- `locale`: 语言设置 - -### MultiConversation - -多会话列表组件,用于显示和选择多个会话。 - -**属性**: -- `conversations`: 会话列表数据 -- `onSelectConversation`: 选择会话时的回调函数 -- `selectedConversationId`: 当前选中的会话ID - -### MultiConversationContent - -会话内容组件,用于显示选中会话的详细内容。 - -**属性**: -- `conversation`: 会话对象数据 - -### createGraphOperator - -创建图形操作器的函数,用于管理图形数据和操作。 - -## 开发 - -### 构建命令 - -```bash -# 安装依赖 -npm install - -# 启动开发服务器 -npm run dev - -# 构建生产版本 -npm run build - -# 预览生产版本 -npm run preview -``` - -## 许可证 - -MIT License - -## 版权 - -/*--------------------------------------------------------------------------------------------- - * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved. - * This file is a part of the ModelEngine Project. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ \ No newline at end of file diff --git a/agent-flow/docs/features/llm-tool-detail-view.md b/agent-flow/docs/features/llm-tool-detail-view.md deleted file mode 100644 index b1a4efc..0000000 --- a/agent-flow/docs/features/llm-tool-detail-view.md +++ /dev/null @@ -1,173 +0,0 @@ -# 大模型节点工具详情查看功能 - -## 功能概述 - -为大模型节点的工具卡片添加了查看详情功能,用户可以点击眼睛图标跳转到对应工具流的详情页面。 - -## 实现细节 - -### 1. 数据存储 - -在选择工具时,系统会自动提取并存储以下信息: -- **appId**: 从 `selectedData.runnables.APP.appId` 提取 -- **tenantId**: 从 `selectedData.schema.parameters.properties.tenantId.default` 提取 - -这些信息会保存在 `tools` 的 `value` 数组中,每个工具项包含 `appId` 和 `tenantId` 字段。 - -### 2. UI 增强 - -每个工具卡片显示: -- **工具图标** (左侧) -- **工具名称和类型** (中间) -- **版本号** (右侧) -- **眼睛图标** (右侧,仅当存在 appId 和 tenantId 时显示) - 用于查看详情 -- **删除图标** (最右侧) - -眼睛图标按钮特性: -- **仅在工具包含 appId 和 tenantId 时显示** -- 鼠标悬停时显示"工具详情"提示 -- 在禁用状态下不可点击 -- 点击时不会触发父元素的点击事件 - -### 3. 跳转逻辑 - -点击眼睛图标时: -1. 从工具配置中获取 `appId` 和 `tenantId` -2. 从 graph configs 中获取 `endpoint` 配置(如果未配置,使用当前域名) -3. 构建跳转 URL: `{endpoint}/app-develop/{tenantId}/add-flow/${appId}?type=workFlow` -4. 在新标签页中打开目标页面 - -### 4. 配置说明 - -如果需要自定义 endpoint,可以在 configs 中配置: - -```javascript -configs.push({ - node: 'llmNodeState', - urls: { - endpoint: 'https://your-domain.com' - } -}); -``` - -如果未配置 endpoint,系统会自动使用 `window.location.origin`。 - -## 修改文件列表 - -1. **SkillForm.jsx** - - 导入 `EyeOutlined` 图标 - - 在 `onSelect` 中提取 `appId` 和 `tenantId` - - 添加 `handleViewDetails` 函数实现跳转逻辑 - - 添加 `renderViewIcon` 函数渲染眼睛图标(包含条件判断) - - 在工具卡片上显示眼睛图标 - -2. **LlmFormWrapper.jsx** - - 在 `processToolData` 函数中,从 `tool.value` 获取 `appId` 和 `tenantId` - - 将 `appId` 和 `tenantId` 添加到 `toolOptions` 中 - -3. **reducers/reducers.js** - - 更新 `AddSkillReducer` 中的 `newSkill` 对象 - - 将 `appId` 和 `tenantId` 作为新的字段存储 - -## 数据结构 - -大模型节点中的工具数据结构示例: - -```javascript -{ - inputParams: [ - { - name: "tools", - value: [ - { - id: "uuid", - type: "String", - from: "Input", - value: "tool-unique-name", - appId: "app-123", // 新增 - tenantId: "tenant-456", // 新增 - name: "工具名称", // updateTools 时更新 - tags: ["TOOL"], // updateTools 时更新 - version: "1.0.0" // updateTools 时更新 - } - ] - } - ] -} -``` - -## 工作流程 - -1. **用户选择工具**: 用户点击"添加技能"按钮选择工具 -2. **数据提取**: `onSelect` 回调从选择的数据中提取 `appId` 和 `tenantId` -3. **数据存储**: `AddSkillReducer` 将工具信息(包括 `appId` 和 `tenantId`)存储到 config 中 -4. **获取详情**: `getSkillInfo` 函数从后端获取工具的详细信息(名称、标签、版本等) -5. **构建选项**: `processToolData` 函数构建 `toolOptions`,同时保留 `appId` 和 `tenantId` -6. **更新显示**: `updateTools` reducer 更新工具的显示信息 -7. **渲染卡片**: `SkillContent` 组件渲染工具卡片,包括眼睛图标(如果有 `appId` 和 `tenantId`) - -## 注意事项 - -1. **眼睛图标显示条件**: 只有当工具同时包含 `appId` 和 `tenantId` 信息时,才会显示眼睛图标 -2. **老数据兼容**: 对于不包含 `appId` 和 `tenantId` 的老数据,不显示眼睛图标,只显示工具名称、版本和删除功能 -3. 跳转在新标签页中打开,不影响当前编辑状态 -4. 即使没有配置 endpoint,系统也会使用当前域名作为默认值 -5. 工具信息通过 `getSkillInfo` 从后端获取,`appId` 和 `tenantId` 从本地 config 中保留 - -## 兼容性 - -- 不会影响现有功能 -- 对于不包含 `appId` 和 `tenantId` 的旧数据,不显示眼睛图标,工具卡片正常显示所有其他功能 -- 所有更改向后兼容,老数据可以正常使用 -- 与循环节点和并行节点的实现保持一致,使用相同的数据提取逻辑 - -## 与其他节点的对比 - -| 特性 | 循环节点 | 并行节点 | 大模型节点 | -|------|---------|---------|-----------| -| 数据提取 | 相同 | 相同 | 相同 | -| 存储位置 | toolInfo 对象 | plugin.value 数组 | tools.value 数组 | -| 显示位置 | 工具卡片右侧 | 折叠面板 header | 工具卡片右侧 | -| 跳转逻辑 | 相同 | 相同 | 相同 | -| 配置节点名 | loopNodeState | parallelNodeState | llmNodeState | -| 额外处理 | - | - | 需要通过 getSkillInfo 获取工具详情 | - -## 使用示例 - -```javascript -// 用户选择工具时,系统会自动提取数据 -{ - uniqueName: "my-tool", - name: "我的工具", - tags: ["WATER_FLOW"], - version: "1.0.0", - runnables: { - APP: { - appId: "app-123" - } - }, - schema: { - parameters: { - properties: { - tenantId: { - default: "tenant-456" - } - } - } - } -} - -// 存储后的数据结构 -{ - id: "uuid", - type: "String", - from: "Input", - value: "my-tool", - appId: "app-123", - tenantId: "tenant-456" -} - -// 点击眼睛图标后跳转到 -// https://your-domain.com/app-develop/tenant-456/add-flow/app-123?type=workFlow -``` - diff --git a/agent-flow/docs/features/loop-tool-detail-view.md b/agent-flow/docs/features/loop-tool-detail-view.md deleted file mode 100644 index 7434d61..0000000 --- a/agent-flow/docs/features/loop-tool-detail-view.md +++ /dev/null @@ -1,108 +0,0 @@ -# 循环节点工具详情查看功能 - -## 功能概述 - -为循环节点的工具卡片添加了查看详情功能,用户可以点击眼睛图标跳转到对应工具流的详情页面。 - -## 实现细节 - -### 1. 数据存储 - -在选择工具时,系统会自动提取并存储以下信息: -- **appId**: 从 `selectedData.runnables.APP.appId` 提取 -- **tenantId**: 从 `selectedData.schema.parameters.properties.tenantId.default` 提取 - -这些信息会保存在 `toolInfo` 对象中,随节点配置一起持久化。 - -### 2. UI 增强 - -每个选中的工具卡片显示: -- **工具名称** (左侧) -- **眼睛图标** (中间,仅当存在 appId 和 tenantId 时显示) - 用于查看详情 -- **删除图标** (右侧) - -眼睛图标按钮特性: -- **仅在工具包含 appId 和 tenantId 时显示** -- 鼠标悬停时显示"工具详情"提示 -- 在禁用状态下不可点击 -- 点击时不会触发父元素的点击事件 - -### 3. 跳转逻辑 - -点击眼睛图标时: -1. 从工具配置中获取 `appId` 和 `tenantId` -2. 从 graph configs 中获取 `endpoint` 配置(如果未配置,使用当前域名) -3. 构建跳转 URL: `{endpoint}/app-develop/{tenantId}/add-flow/{appId}?type=workFlow` -4. 在新标签页中打开目标页面 -5. 触发 `VIEW_TOOL_DETAIL` 事件(供外部监听) - -### 4. 配置说明 - -如果需要自定义 endpoint,可以在 configs 中配置: - -```javascript -configs.push({ - node: 'loopNodeState', - urls: { - endpoint: 'https://your-domain.com' - } -}); -``` - -如果未配置 endpoint,系统会自动使用 `window.location.origin`。 - -## 修改文件列表 - -1. **SkillForm.jsx** - - 导入 `EyeOutlined` 图标 - - 在 `onSelect` 中提取 `appId` 和 `tenantId` - - 添加 `handleViewDetails` 函数实现跳转逻辑 - - 添加 `renderViewIcon` 函数渲染眼睛图标 - - 在工具卡片上显示眼睛图标 - -2. **LoopWrapper.jsx** - - 更新 `handlePluginChange` 函数签名,接收 `appId` 和 `tenantId` - - 更新 dispatch action,传递 `appId` 和 `tenantId` - - 在组装 plugin 对象时包含 `appId` 和 `tenantId` - -3. **reducers/reducers.js** - - 更新 `ChangePluginByMetaDataReducer` 中的 `updateToolInfo` 函数 - - 将 `appId` 和 `tenantId` 存储到 `toolInfo` 中 - -4. **jadeFlowEntry.jsx** - - 添加 `onViewToolDetail` 方法,允许外部订阅查看详情事件 - -## 事件监听示例 - -外部应用可以监听查看工具详情事件: - -```javascript -jadeFlowAgent.onViewToolDetail((event) => { - const { pluginId, pluginName, uniqueName, appId, tenantId } = event; - - console.log('查看工具详情:', { - pluginId, - pluginName, - uniqueName, - appId, - tenantId - }); - - // 可以在这里实现自定义的详情展示逻辑 -}); -``` - -## 注意事项 - -1. **眼睛图标显示条件**: 只有当工具同时包含 `appId` 和 `tenantId` 信息时,才会显示眼睛图标 -2. **老数据兼容**: 对于不包含 `appId` 和 `tenantId` 的老数据,不显示眼睛图标,只显示工具名称和删除图标 -3. 跳转在新标签页中打开,不影响当前编辑状态 -4. 即使没有配置 endpoint,系统也会使用当前域名作为默认值 -5. 查看详情事件只有在点击眼睛图标时才会被触发 - -## 兼容性 - -- 不会影响现有功能 -- 对于不包含 `appId` 和 `tenantId` 的旧数据,不显示眼睛图标,工具卡片正常显示工具名称和删除功能 -- 所有更改向后兼容,老数据可以正常使用 - diff --git a/agent-flow/docs/features/parallel-tool-detail-view.md b/agent-flow/docs/features/parallel-tool-detail-view.md deleted file mode 100644 index bae8ab8..0000000 --- a/agent-flow/docs/features/parallel-tool-detail-view.md +++ /dev/null @@ -1,118 +0,0 @@ -# 并行节点工具详情查看功能 - -## 功能概述 - -为并行节点的工具卡片添加了查看详情功能,用户可以点击眼睛图标跳转到对应工具流的详情页面。 - -## 实现细节 - -### 1. 数据存储 - -在选择工具时,系统会自动提取并存储以下信息: -- **appId**: 从 `selectedData.runnables.APP.appId` 提取 -- **tenantId**: 从 `selectedData.schema.parameters.properties.tenantId.default` 提取 - -这些信息会保存在每个工具的 `value` 数组中,随节点配置一起持久化。 - -### 2. UI 增强 - -每个并行任务的工具卡片的 header 显示: -- **工具输出名称** (左侧) -- **眼睛图标** (中间,仅当存在 appId 和 tenantId 时显示) - 用于查看详情 -- **删除图标** (右侧) - -眼睛图标按钮特性: -- **仅在工具包含 appId 和 tenantId 时显示** -- 鼠标悬停时显示"工具详情"提示 -- 在禁用状态下不可点击 -- 点击时不会触发父元素的点击事件 - -### 3. 跳转逻辑 - -点击眼睛图标时: -1. 从工具配置中获取 `appId` 和 `tenantId` -2. 从 graph configs 中获取 `endpoint` 配置(如果未配置,使用当前域名) -3. 构建跳转 URL: `{endpoint}/app-develop/{tenantId}/add-flow/{appId}?type=workFlow` -4. 在新标签页中打开目标页面 - -### 4. 配置说明 - -如果需要自定义 endpoint,可以在 configs 中配置: - -```javascript -configs.push({ - node: 'parallelNodeState', - urls: { - endpoint: 'https://your-domain.com' - } -}); -``` - -如果未配置 endpoint,系统会自动使用 `window.location.origin`。 - -## 修改文件列表 - -1. **ParallelPluginItem.jsx** - - 导入 `EyeOutlined` 图标 - - 添加 `handleViewDetails` 函数实现跳转逻辑 - - 添加 `renderViewIcon` 函数渲染眼睛图标(包含条件判断) - - 在工具卡片 header 上显示眼睛图标 - -2. **ParallelTopBar.jsx** - - 在 `onSelect` 中提取 `appId` 和 `tenantId` - - 更新 `handlePluginAdd` 调用,传递 `appId` 和 `tenantId` - -3. **ParallelWrapper.jsx** - - 更新 `handlePluginAdd` 函数签名,接收 `appId` 和 `tenantId` - - 更新 dispatch action,传递 `appId` 和 `tenantId` - -4. **reducers/reducers.js** - - 更新 `AddPluginByMetaDataReducer` 中的 `PLUGIN_INPUT` 对象 - - 将 `appId` 和 `tenantId` 作为新的字段存储到 plugin value 中 - -## 数据结构 - -并行节点中的每个工具数据结构示例: - -```javascript -{ - id: "uuid", - type: "Object", - from: "Expand", - value: [ - { name: "uniqueName", value: "tool-unique-name" }, - { name: "args", value: [...] }, - { name: "order", value: [...] }, - { name: "outputName", value: "task_1" }, - { name: "tags", value: [...] }, - { name: "appId", value: "app-123" }, // 新增 - { name: "tenantId", value: "tenant-456" } // 新增 - ] -} -``` - -## 注意事项 - -1. **眼睛图标显示条件**: 只有当工具同时包含 `appId` 和 `tenantId` 信息时,才会显示眼睛图标 -2. **老数据兼容**: 对于不包含 `appId` 和 `tenantId` 的老数据,不显示眼睛图标,只显示工具名称和删除功能 -3. 跳转在新标签页中打开,不影响当前编辑状态 -4. 即使没有配置 endpoint,系统也会使用当前域名作为默认值 -5. 每个并行任务独立显示眼睛图标(如果满足条件) - -## 兼容性 - -- 不会影响现有功能 -- 对于不包含 `appId` 和 `tenantId` 的旧数据,不显示眼睛图标,工具卡片正常显示输出名称和删除功能 -- 所有更改向后兼容,老数据可以正常使用 -- 与循环节点的实现保持一致,使用相同的数据提取逻辑 - -## 与循环节点的对比 - -| 特性 | 循环节点 | 并行节点 | -|------|---------|---------| -| 数据提取 | 相同 | 相同 | -| 存储位置 | toolInfo 对象 | plugin.value 数组 | -| 显示位置 | 工具卡片右侧 | 折叠面板 header 中间 | -| 跳转逻辑 | 相同 | 相同 | -| 配置节点名 | loopNodeState | parallelNodeState | - diff --git a/agent-flow/docs/features/shape-data-validation/design-picture.png b/agent-flow/docs/features/shape-data-validation/design-picture.png deleted file mode 100644 index 4991c378d66504e36676640c6f99e8c3eb31efcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96694 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

GjplJGPXVM%H*uW+gCHzPrJxCU8x_ zAi;=1v7>#HzyH=mGF_HyBUtzV*=o=1uPCGHJ6{Tv+%@G`y>EIywVtgsoLAj1cztR; z-R^AALla@`onPFxrpNZE$y=ZCvi$0uv-bhER5z8_M=QG<1%3z0zp}O{|Jauq?#HT^ z-#Z{zZA+{&UxrhwNpIV%O`;`1-X>M+rjYLa;f11r13Ux#N&U*5^w2YMIlGv+Ns@iY zN~3!`hD+lv3^VLhU^-K&SfRh<>Ja*~6JQWY;bf%o^16qH4Gi+glEV+?o2W^cXP}7c zmiU?N=yIoRv*yl8H`&e+sE7%xB*Y1|cnQ%w`vFJ$HE@(AA_?@98vfl{&ucGWOy8$g z8+n^5I&SJF|cxzHC|nFvq80o}1SKc_gJ|A_FhFB8_sbbOZjMe>1IyDm}~G z^gunjzH`>Wh4I1u|B^>jq#{W>1K=b=1Pas7_(eT8MA5i_jNdMOofEmlPfuZ45 z&SnqIp5HOGY?!sCY~wgcivJHK12c(7u?Sy;oBuf{KIT6YV$J)mGhnVKZ`^Yq&I26VyyQI9p|@&R&B`9OJCP7Op2Z+0*DFZ&zGyM+UZ!GBQor+?Kh_h}ghJblMX2LIyOR5>{4{7R(4Py)yi zf7F!=CDE@=%mQg3azU2yzC!oDjm_J?UMM#L z!__{e!LpFB!09z&qpJyG91#Ch6R=IHL{)t!8acwcm)3%I^U(TiO>eDZjs8%58ky)= zvJU{_dhJ4E2Y({-HL0cS7=1bkai-lioZ`K09q0n{%zKM}5&W0A6}j;wdQ9`-_~F8LtLP*z%nAH_X#; zs3o@@EP*zss533G{z@tL5fEO`kD~(2BrLG0-<#xtRV`#D@>b0T zh@sx|Q9I7SDl-_+1^!3*2qJ>!`0C-d!IZ&&It1_{05UvpNHs{6Nc)ynJ4j1)XPWX~ zwe=u>T$*%E6Ie!xy+zaoG7|}!sf$de#o2`0o)o{Q~M zy(=3gWxe_YVy@%X7Uc86WicoeN}pr?zSqzj2^YXTj0oIiJ#)c*+u_hC9XdRc_yw#4 z#7aAHZv_0nN&^*++I{V6t$W4ZUIiUWATb#4V{+E;R3xAUj@AC@2we%YB~zT*g)NSJvad?UlVgc)@K zQh!y=?mf?&cUY6&Xv-YQxMXZ5{Z(4BX2c$U0)5P}m^xO_C*YiG4-=Q(O+Owizv{G> zc3Qs--~hVuHUyFdj>{HqAeZdaMNQo}zesx2;$F?~6LgVy^L&A-&V}kd@{w*)=C~$b za|2t`vIH>-sl~HHja=iaqBA=hjURR!bFVx6KqxtujrL0js#j?h4-qAddZAD$3+Jmb zbQX@V(*Fkj<_-Vr*hmd7Bjl9b*SM57Lt{vERJtrIsKM>S--ioN=vtV?F%=?BGgq>F zA#|BV>A&<g5y1zI)s&Ho2i?Y)DsfKHg!|=v}R@=1{uyoXRyQ zLdM?ZyKWavcG3d9RjW(LF#;EAWfF3rekCE2h_!B_3lHE1kH~mBnes63%}p~a%+i=B zo#&tS$cu)DR~KLp7Mr@yV-4^3MFmV=BReaq$14x6bJD3E={A?{ID-m2zj)w+mP2;I z#6iH4J9K)@5kq;pv268duWgjq>*umLXOp}i^vp(wIa6&^U7q!nC3uSC*AI4gGv|7g zp2S9_wkZn{oR#y6JxLlzs@3A1`A}OH0}bLTv%rRj72eP6@K5#R);C=he)>_#GT48j=_ZgPu1Xyj^M>H7K?~v*Tbtf4W|PvhP0lvaja% zD;(r*a(kqIuzG*9QhZCYda)r?{ymg8(I&a}0Z2Id6^KANBk)`E&L7C{lRP-cvJ8^) z${=v4_XF;zM%Yx6evHGfz#m;uE6~%z# z0{^>Wi>DfYP#WLy%Uku&kOT9O!4Y?;u^60nGa?=J4j~lP=Ik8)pEOU9*ug-GM;6?D zB4-S^`z)*sEHXGoH-&F+U5uInN^IXL17H{--ZzDki3ms50Kedq{_At1co2WrROnU? z2tzJ{YBdT;;m$YV?rT2?7BSU785NujGjm|~FRfLiP>c!p)Xa_%cWFek2Am&0;707e z+sZjM;6JECXE`w2tJT0ZABTPu4u+YmDu<&H^`Lem&c@te1=s^GTDAZNkEEyO-1>7` zohI-rZ}L}`Iv^VscGvIx>5>fBI{3eWt+_X;Dlb^g)dR6Wk2&0*lYTnHX~ zyziGTMWLE5HEQr`Ba!KkJN$#v(O}E#HPQ2!xV9O>SjXb=_nRrw8_N^%6L^>N=T4VR zyjymxe4L3a2j1{lrn|d6x zRP(H+%Jw5|V*BKWlpomnJ@Knydy2qt$93|{QEUI19fCkoZX(G%v@&!Tw^W%#ajLC= z&6~c2sJoQp6UVq^rH8hv=8>jSG{JaPRo=R1wwmzRPIL%QENb|SRhRD2+52=EYRh6G z`$Ev$+1-Mw zS9bB|`-|lp8A>a1l4nOupZH-wpd>Rl5Y$^uD#VRhs+f z-0XB6L4xbDk)Tvpk+tx=20rpZ$OKT3jgh42Hj7p6*^XF0op%yJcAXUR<%=Y^N2Nli zG3f@9iD|c5?)3#lbx%L>{_4F~w>7iJ$x)?~A;P8c~F zCnqxu9tG}A59a?V?cetzq}`xlPx$?V$I@9EBgq=q?wM@BmBPA2g+eV8O`Lfx2D`QE z0QeyMM;w#?@cr|qotbA-c$)zn#@8^KPufsOQK{ei?MkB@RW@RAqa%mCh>Ep-rJwwg zh9}(~jlXyFpPL*xOh%n^&5XQU2WE`*8jRGKERKJ5PHv7e9u6pA`=n9FIXqJ7Yh&g( z5c6@YJrFE%+Qq+!-8)e9IGmLN`kIKF)whT#abjxPfa}W+j>Ps@Qj!_R)X|NgjoFe0 zq$%J8%^euLgf#dTBz9mAd1dt4P7A?a30)XvgFsz(bgIB`b?iiWI3=5}F;!>RF|_3j z*ha|b4)2T2I|}x!U|L2U>H3+$Jk>8$S7j{-LpOK^DDQ?f5Q30tb6>a3X~u*&7CyQ4rwcrNqf(rPrP}m3xg@V#LD`eLuU1v9XT%v)*B>0c#p}|apP<0p0u*X3*kAoav~h_1h+159 z`wAjh$jPBTTGcmpH8b?4`G3hM8?~$vE$B69F$f%;XZ3;a)IjVGnA=8FJqT zkFuJ3idm6YpSk1Tv`WI@dX?ngwI$5%8C@+df6S75wF+->6me$R`SXP85|i4@o^GHQ z7&-zdRmJKPoR!JfMauZ-moo?QYh9rvEyE6iN96I>Nj21^N`vj|kqY!A*tz6@olD{H zM0VXf_fnGGdL?4Ie6Hg_n_?LnN*z`jfo6zsv7i}0T2^fRpPVh1r^)9A~9aoL72K{^CUUwirCwU(M^QddsnUmp-KPoVnT9QAvhL8|I)kU;w>irEwx`n7j{ z_o&NG^JWX(s`Tya1GD-?e`m+7VmqS%N+H) z{ZR5nhJnv_e#2^6dJ^es2VG13l8Kzez`+N0!~$AA+n6R80=W)W-5lPJVEbjf`)y$A zz%8TG+q3XTBx;RoSuj*IoW*+r!L)zMq{-*an!_*|=1XN8@M8506}_p9IGTLop$?^)H=Y7_~0=3Fogy`sXm;hu= zo`?lmk{_EG9f_#kvlVK#a9uV$E7g^f!e7UV^3HtgZmBfSyjqs4o0?FWsuVsB`UgZD zfhtXO}3UHD_F#9K&pIQNaD z7mGAe4mI@U9^?xUdCDR~cM%ujJQ(Ef7Fnwt;3UTo2t%8ZW%+Ln5R;N#SI1A`<-b~q z{N5se)h>vqsjj&fVH?TH*CnX=_(w&9$HSl3s|l7+Ne9)Fh{ZtHi+<1e=jSH@|E2#L zT*TD7df@2LFJoEiYX$J$&p|XGKn^C*Bi$CUT!h>+ItxV0hxESczECIOg-0Kts+kS&BbB^n&hx6A8=Ww<<^C3jwH zA+66pjaEA`mgRBg2`*&%YzL5hA&`^feTK&VL-Gv^P^oh2%yE}atR*W+zW-oP?&qFu zeBPsU8z3l-V4mYw&~5<629jKkqI>T>20jlA*F(@LLBWpJa$HrXXQAcNfI5eHVE72u z4dHU1>3q#goi5blRw3PH>_x6}`Rpeu`g$5@Pwcg!O(yM;vnjrM(y)RTVe7zl&D_eR z^Y>+F(LS|H=E07#PWQ%w;EQx8pw?Qaa?<@=IPoA5=l`IFCe@9oTk{OfxO zy;#1`~I5c|sVO9&tUuTXBv`3)2 zvT`JF4(Tmi9@n2J`{Qh`O|_h@qrx1?=XMR=hk6M|8YVdage5Tc^1tT+XqEW*J>}C8 z9!QG~;RPR@s(-u(>TS&i^zG2H>5iXq9K%Q{n5H!LLTQRa7r!&OBJLWj5afNwJ$*TR z$NfbCQ|XVb*J?3VB2|-og8)!Id>iU4z=7HDyZgc^4ivt+Kv>@W{2p-WrjkI|E#`x> z%q`6iCR-xM5&W<~4*8iP{7lCZ7+e+Kp42UiTR1rpOA04A6DyK9r{TUmRQ{ikES6t? zb34Q82(a{$`d*Y2iMJTYe97bN;CLGJ1bvD)rSYW*GuTa?;4|wa#^Ts;s0{V3nu25x z(NRq_JG#toc}lp7g?ShY{B%yE`-c1!l=Fz09AMv?Fk~PU(a{`Lu)A>nm;b6r-k^`h1&IqI}$- zhG~}D)eY=;X(lvbKhROj)bm<#1Foq`sRP73jXKrG8{`GJA^UXgO)0UP#98d?%H1R{q~d2R*>Nai$1Yx2#>uP zX7wN2wH_mG|DL@>rr#Wk7@)3frKoPLvj=^_)MOs`KuT^R0K@GE(5=uDGA`Dbt$ z>E$MK{(a2A2brk`5+UHyuUJWk1k_()lcgZ=1J~C>iWPD5Mbq9WcbUvl_m1kM z;UhO1HY;9Q>s{&sAc)n))BIOAfRzX8(|s+FKX?+y=Q;*1ldXN|W<%ATa~bUZPQRAv z7N0s?TNUQbFn|}U(_+B5{6k$l$VMSuh%hmD_c$f~VLmH4-JL7FyO_r?*<6yVgVLYg zruTvF_rL*O*$mER2RLD(uqa_{uHSn06`Ke)<%i~aTzuQ7D+exrg&N~3nG=aATD&_l zx380i`6mrgf0e?(mxc+fpY21Q(So9NdKIcP4Lr;&bwi*sSs}pmU2;?hX2-0B<>%cb zmkc?%g68(n<7nhfOUw4;o^rL|?S1yTT2bB7`h?uTSB1d=vDjKyYaN!v02l!wut~5E z70!#kV9Cx`Gk2!jH?Ba{3vga^=-e5;JG=9{+jWL*s8#~Otk$f>d$!=6IAn2f?B?5H^|Wre|VWl9#<+W9$otCn42bg(#1quD7qLR^4u0 zWpk{+=~1rD2(1Uv7cb)&=`B1WTVA^lmx@mV1VeAMSIash)J#dRU#6#)lN>8{vgz`1 zGz_RjJdDpZ^xoj{^<*&(xQD1TFPhh(x!Q7H1$n7~t>YN_K&oznUXod5YEn&gNFNiI zfJs*~vYW+^rA(v4^>9qjU8S1@C+3Rs*(3H4^e6edf-a z33yjD)V?kotfU9Nn(op52H}u{2Ae7Z?omFP0}i4hQe1K~l1n1vDT4iJGue-m=k;`V zHu&nq-+~sqQMK`t^jIn4PZC}CfXg;`eZ4_2N>pxG*cc26-x}>ylQL%{+=MB*9m+oIYyR%+(h$)hnKK#16Ff`rLy`%rTQqHy*!pF)D zdD4oPKKmA|hD+bOkl(|T&~4+in32z-v-7OE&1>~Ou9ArKK0>FI3@gU#mlXt%5{Ac< zVCG;R0ao3Bq1Czs?1dMTa`3Qee975J(Lnl{3r3S=hep%M4MeWTy_kSPRqN9ujEX3` zFqZ?5&QW|xhBk_)t5tJ!9_2E+C*ysi?q+qj@n@xa`5Kk|UeT2t^~u6zCG+wBbeZkB z2otLI9A^z(DK+hUz``GX(0x`@vPY3f3%M-A7=9FC;8@Hv`rKFa$(WnsK6A00HK?nW z|8s$`(`VB2{6;yCd}mmIKGw6#rPEiy8T~p5!!K7=h%HS$ODe1EsaD$;FBlcbyrx*| zR!474Ksp!E%hO^q4Gt-(!7Lg_skpcVC2|sA5mW$eOm}IKD?5rH5nz+2$w7Bu&N-ai zm!iz{!9sRiT-6I)*TF!7mQplHN~|oz*QNgcu8eT6PHEMK7uR<4f zf0p9qvrfQo9pD)$lmra5d5@l|oU(aO>{QmE?YgMD@OoZ~-3)%>am&%xg8y^|;TZ`0 zXX^r)7LAyk;AxN&PEQGQv@3fJwsDnXCqsiH{?H99T8%Bgqf@hJ-1Yw=9yqh=OY$#& zki$vG$S|PiHPlO9r_iEB99OK!G?>n2>*V)>DRlxYw_vKBBaZ2@7Bt2GniK%m@oj!K zgfO(MbZ7afj_vftOzGjMa6XN%-MEOi5K_1OO@P)LX7lOw<{IX!LFt$la{}BEy}%Fu zbK94W60E$a3|HZEc`pZW3DJScPBxH*#eW8d)_(|Q08{1_&5RRAosXU17V~45z|gr_ zN}Uc2@HG1l$u43_Kt?1ljFl&kay!$CDKKf^mv_jy8poBEJeDxVrtGs!HxM=ZlqwPP zFR%t_!zw^&hfG~SW<`fskBW&|i@Xq`dXX}6yl0wqX8Z1z1TR{Lh|g;qFNKPSzj+tw zGg@oEbwZ~ zKHu$$^+Z4BF(NIFxeDL|S+S{G4{Mhu4{~#|4D3CG(xbypxMiFdF(kKU-WJm4Pq*za z#c3?xH(9(Mp^$;E9Q~-vl;jd95nK=8+$V@en>p2myxyVVA!qAjJpR*vPt31`j&WKw z2XufxL7`AU)CZppEVvRr&c^r4LOH&aE6;4$dtBssJZ+BN^2qs?htKM-e}sFg`aMf0-OG4({)HrQ;`ttVhM? ze-6H&wQ_kv;ZhLuPy9lb({!1<$O&Eh^eVuCOu<6Tb$`$Dsx?U$&lc9J6MnE|$6ed~ zM)p6Mz2CCApxg?b#Y^38DUK3YkKFX1zzCEsQh{!~lEd_FiH(PuUUKElo#i4h7V|Mx zeU@oZ-8gI|Z7$%ntBNj{fAb}f;Zxey28}a!+Lf1*eFH+Ov~3DBtgKUPP8r}csnh~7 zH7mUOY9>i+C_yII(cGq>OiV2YSGF1ihyU}d z%jmJmR`9oCx}UDGp(L31*gtuOXzmtT6@Q>cFvTbWr7y0v(_c2o!r-2Ry*L$GCBbPC zSig|rS6J`RzR8!{8fQ1(DjJyd?R4m3{FuduUMF~4sGu94sTxK$LMr(vjQuQm`Q*5O{i z-{sA;TtO)DsD4?EouLfvQh~UP|7tP1AEYb5*mfUIuJmfnxO~6m*tEAAeJ*y~OD&CF z5Q3FO$*zW@ebMS>7iUj__TK!*T@#V+5ov;&PCJ5n=EQ zDWSoagl3M|O%G<)ap+oE5(P6w-m6oOkc(vo*rak&(h|x#Z^6R>&$x~ z9#hoC2$&@m-vBaLw2WE6*$mGP@+fBN>UW32(27{ys;mThY>RuI$(}R{Y$DG!IRuxg zBcH&!*86P2_%#b<`#Nk)J#MgH3^6(;yXvu(I{oKV74sBupVG+~v26QCVwj=4e)Bpy z`4gD0kJnaBdZo9Gk7OvLWS9NV4Fd%E)0D?-#t!#z%Sb^V(-bY}Esn-em6__%CW@)# zn`wogSYqL|2B+=grlKvP?c*vnXBD@{V?MAiZ?boBQI-~W0a}9Kr0Gz48pYpASrn#x zfnMKUR2)r-_MI)z0L0*5zBTQ_4k>~@)9VQ-^^vY^SXCM}j+m=M15o*7 zqf5Q%6I$|1ml;(>8orXn{9G_NkmB_;olMNlzC-Y7^@^dcgL!HrjPF)rE?}wV9ROIz z|9q7ex4DS7m9Y*hbM(Wzhaeu$)qVFcZ7gGQ171OB+q3UtGC@&}WZ$*}4J2B+2-|?Y zs}-|ejeXcI&ZoPLx`z$cej|Rn#qz2OE>Fdga~WjupmDVUIamVrb34ml?**jy93>+l?1VMoG{H19Q(b!Zk%?Y75N1>qIN`qO>5y9%R${e)gFBTVJk-P=!I|mH1}t2lwMHnDqW)ybu1x z8i|2)`?_?BglM)-O}dhJ_y)Xd2c0t3sE#ytA1+k0uR35p9EbbW+s{ol!}p~&mC0u` z8~AbDIuQ0+mHeV*7mU0_fBiAzI!3pqx1IzC%DIFPhg7d}>{l`H0>w{NmD9#>IWWe} ztggiKjAUZo*QEZ}FRiM`Q+?TFU|sp|$+MTMPCr?oDj^guU$S$uEYx5W8lKt;HE^RN zUN|7s;h3sBwe>l+HK33uLvIiP5w;f!L9(-wf(drVC zd6H#rk{?Ylx8mO0o-wCjt*BGxmxiP27=>8NG3=U<4+O^!tk2-1q%lBS20bjq1zmLd zQ!}E_dzs@XlraaV$PHM?OJ;2#(Fkjn#X*_Vyp_(G9t zhTQuC3t)0hVq4YJwEK$_a$Pp3Ph!a;c+q{^ZB5EIj0v=&o!+q4H2_?3AvUJ(GWTo5 z-RW1qLN<$M1D&=i+UA46*38Hj_v?c96b(uX5`v!>r1vOQa--ukm6CyqhPKTuHik0j*uKlUY7C3mNa%B_x<6Vqnu6fl*`QNk0q;xd{1(Z` z^XrNYUsUWZMo~=BMTXVyV(K?x9H(R1{+bt#seu9cAlT6l&^;Q5kHBnBVHf3AYq@Hl zl5(oTBnfgqB(FitzuY_rtz759=4d>G2Qnp*IT7i2Nf9c&ol~H8LLUjE}!H5-wbYf zkY9S=A^h^oK8e$BR^P7K*Iuu`uW-!1p!ZB;(G9%S}uegRJRV9W5Vf{Ua0Q~ z3>xGSxyC;CcFR{=GY09|jD9~8+xn*8%c|d;)LnSka3`>7QT3O8LCj5$%X4yaXomv= zYDaHDEB4k=2G`cjo8otIxQ9|ee~}tZs+$Pbv}Rfc@}CL1NYFB^O~gsIH^yq6S20r3 z+pmVB(Tx>Bbm2rXl;BdLO?Ua-KQ1TgI5I18c^W!j3sBB7*i#c+wHDxiBKRnz9J;>9n!?-5`|qraVh6NzT6k$3nz zG!dgY4-OD-zvVD4X>F1&cPL31nNn?;WWZlKkiD_eG2Br%q<8_BVShHPUPoU)t}(>Y}cp_DboIv9o`RFfrx!7#QEV;^H5o@<7) ze9!m$dVbIIdS1^z=akGn_jTR(^;zDZ_vihQV>06YjD{wfMEu!+e1q3Qlvtm*$g7Ji z(Yh-D_4s}EqA_Tc?`hgDECMi}H5>_mEBabMjt0IR&4UlST7#`CaA5}QX@8ar|3(h} z5$tX0Is5~A-;R(#i!taY?erA>?x(rA(xRDqGK|NB*`F*W03IO=@&>+kni4$oef}Pe zISZYv>9VCJa|p;o<^YvV@i$gL<_ZB+9T!D{mhwjJR-lR0XQ9l7P@RLBj%Tyaw6BAf z(3fN0d>5d!O9Jr?wcoR*r^Xb(y3#KKIdd>+Z)R|bGU3q|u*6cu)UxFRBT5$i{FXoh z%i>N5kahy@i2){3pJ2}{pb-EP{+5;G|LtXSya22Ef!8`_qZGKq9OODv9WofF#T2Oa zuoKz@LRP>dR?oQ6=g;TPS^Xhz%1Vr%Ai+5JGw);H%fLp6y{yCL|XEI650dW))(Z}MospXmg3-A7K$UnLYRO3Fq`Ul=$da8Z?s}&LYKV$(8867hFzsu}>k$%3f z&)Da{c&*H};T-L`qyJNq8@wxjdPz?(|E~RQ0~{!P?oWgndmOqq6>o&`TJm_op$0_H z{i~|f%n!*O^*iML$Nkes5s5LMk{VWwshM7O&aDYqm|iC|W$gJ_?fB&S#F}C> zh>h0lz#N|(;o>LwW>LGUin+fYMsw;8H>$9Ruh#lehREM~m2@%69Tp&n`VJ30o)2Ovg(x zjmngm%#+z;z7N`}0owoh@6y)x@dBs$xxVI?G9MTb?01H@Nul%W%q*vu5^b)72;rp% zcCt+5lm%sODM!R^LE2Jm(nC_6r+Q6}Wsck6MhGP_o^7sIX+05{rTK*%3su9u^Dv4X zz(^KY5aCZ8OAylY5)h_L-MYd#Ht9jBUN8Z|>(rfd!)@n(uQD}oD3Oxr%Qv>6RizhF zWWW+1u$IU~>eu@wY9bL+#MIz%uaPLby?}nArMiXx<{pxZ^^bE4zIipZQQ2yAL?pF= zsv;u!dMwdc+AhO_9VwU}z}&CDssUCTkALph($m`W(US0i)iZ#icN8c-)$4qW7>PAc zME!QJw6)r>D4Ho2PGEz4V%a%R(8%`mK1Gq5XdAzUvuqwWe*Csq*&*4-MnIaTk#WTV z;P?l(aD4qkMi1f1nw!F>_MAM0Jy9{@m_DKN@Y@L)VT|J?SR?%w$Bl%mZ>d>joqFH- zmu}1j|6oMCrdPc>(oqr}RH3)@9ijO~08o}#rIM&ap3h!9|3&|*wFc%b?a``BMdLn! z^y7jAwRzd# zw&vO&M0rac`OzY#>#NBZeK-XT`U{+@gSwFEiw7aNmaWAC^;dvpj$Q;tmW9?w?$PR_ z^GPqI?$<39(m&gxZ=?4x+LQ!JONH;eQesBE-yo}{`XjLFIq(?LTrm0sDrWf56kpo` zPIqbH1B2!`t_EhgZV_7k;dg+Lc}S1-Wp=JTl6#~d=Ul(HFUPItjnq-M z6ds{op2|dC!5N;Ll=tW!oyu@9y=5wk)?53b zFvw^rgO~JDGp~?A+crx*aEQh8`4`CT*;dK8F~d>vLEuzbM8{PaF$e}7Q^4Me0P|Z8 zPdLAhGvwA+#yp=%ihDvPe8n*`2NeM25B_r@u?vAOzXn_g!hy zutsm=a=}h>J)jEo{hcGM@dpizc`s5soHJ4+HDg}_!`+7w;;-TrW*mbT7Uearf|^tb z35em9%s>i2q5{}GMBY7Tm?49sn_KQu@a9|5zv6&XcfN$ID%5SHd&ZnHJC}E3EPQAD zF9{RlML|#JEMB|PZ?0wF)i5IC$g?@`XaZxt-q$(|s#{L=0Oy8xc?2ZJrUFNt5H|8*i*gx@T(4e(sw((=lG&U5Oo~aasqcMY`ySiiSKoX2e zceqps^4M9`FRTifLPr|jSW>WgaRcDa;6Yz-$5{!4pCCov(OeExRosva~s_B z`VW9sESF2~L2}O=^a`BxAHBpX7F>Vi(ey5%Q>zVlZlj`ed{)`+g11RQGGJ5AUlJMi zvKsZJ;jTNrS_6%^Ch~@*K9)Ta5-eUE00n^&xG26&#sdRhh03c7kHO-jUxeZk$^mH< zocOD+{!h?7*eacnMe&1Yf{NEahZo%Fs9BZt2J)=Hy~J- zA;T6vy~>7Cx~-njs}*9XHzfVQolL>j;N za*5iZ@Tgj4la{BdilUh-UY*k2K)ck2Rfwp0aob>ce!D%J*$4*-HDUe_pctE!5<6n$HhURPaF?e z@lC4!0zUI#Ca}(^IvC!ETHzGEk!08d#RbJIE_l6$6sL4YW0Av10XRlxk(*;EMlSj`kbO!QB;EtvlcRpG;Kme+~iqdpe}Jpbr>w#1gdr zf6Qe}`#tRTzew!=*?!COWJ{1t$M}CH9>6MD&0Z}PiWWBKxDj;qfj&X1A)-UwXl*t?4c`(LMmKOYjU{DgXq)SC^hBai+E{$s>+ABaHEWmTCclR2{=vZ6f zhLFX+l3%mT9)gZ2*D>&%S*&^1!)6X?-_r6ETS?tP6)N+d!N)hFGQjkp`zcmqUdB|M z7N1Ee@^K>G=k<2A@VW+=IQkl>k{K;{zyGeEWu7-SK4YoZ0{X&!+{$Adn&{xfq?tYZ z(R~$@Yq!Qt&!MZ))nCJ^bFq?uN(W(0nmJ>y+?={g-%roeGGWhSNkW;iuf29$REf_` zd07)Z-VU1MG=_2BDy}&R0BrQ@Wv_;D*HcNyOJcC&g*s~>m_ewsY?v2VTg{K?{CCWp z2XH6BVU}W9FwoHp8abyyH<5oD$3VIN{u|fyZU8x)b4PF0O&}La8s5%J^C4D(3~#l> z2M9K-#mQU*VS<$|Dl%H{yM<<>mmXRlCj|uU6Pz+uUxs>uD&s%9CGV8j>^+PEym0&9 zdB5b^(|vGP*zZ}nykdz)zt$ZTx%Aze$7`1rDFr#wm;IzgXUjZI^BfyO$kCXdDGpZdY4^$-J*T45(yrsi-4Yj#ojE zKB-_b4CsS-?Mp=IeMcJCuo_`lCSgS?q)8alc%ge*))KrBDrWFPg znUqsFj{HAvCJD4cCqnCA?YvXn0+<=Fvy_-XSBgu3N-BmM64l6B4X~s144KsiV32=% z#?zie6aa<|G&O^s+U=P!x@}*r0798h_nF?4NBt>)dVka>e}wSh zal8zzq-?DEJ2tH02?$24f3%1~wtdPCt-hv%sLKF{fBNW`f!oY1M-hxk0#fB*?$T=M4yc=6KMy2az*hN!9}B5p&`rQyls#;l^A0Q}3m^7nF1I z1NId9JdF!{dhc}n9V=Y|an9AYe0pxBI>Em5w~`sTH>ftGm8RYOD%oIIL*utAOhIr~ zNdFBq{rR&2S0bJN0MJZX^XovD0Bed1N7}~kp9?e(=Rf|X^Y}_!R8f$P3Z~FFwWLPe zO5>W#&617dpp6=ICG48YovY?VqtA5PL4KZQh4i5Peclo{G^3<#KMw>kf^_ek+abOl z^q-vv-=t0*58>Ji+74eXKp(Pt7J-OfxOiGv>h$VmPyzoYv7IFRT{wU9cSFJdH@-hB zssLc~UgqenDg69b$)@3^B&E9ZKzZ*UiW2~`^4)^~>{lM887qN!R#E%PlG*5ot@2v$-DiA zh8USj@hpHNl`A`$Yi=Mf8Uqqe6eEYG#<+OdZgFAg&h6G=5CVL~ z4ZIg)TRN~GC{xQQ`rb9i{M0jexE+$;U*9CJ(T?l2(VA(*5UW?JZIhpGzA$SPZSUIe z$D2LRI52|>?RPj2={i6TX&uly zbV{53_-{$&mEZUI@U`CV=!lJV{&6rM^>&ACtmVkpRA=?9GD^@8;v@{c;JK;cBpT%z z(w90rdmXy8?D)%QY;JvyAkHPp@;QoAe={TX?wedczR@UlS_hQ(~=hZgQt_iy)yy&ws1g~SFXI*Pq} zdph`9UTvNd=O}S|x)Lt#uNE%z@PRGg&&-TVnDgzrj0ZtQUyshGA32j_eoX4p@L3=ApiZ}S9wYU3$wmb%{cGuFhkjMztwpOIjg#OAx8IIc zxXGC%`fUOyt`R@4#HQQ&sb){sEJ5R-vwcGCdF~%lXNpHWzF8#jan;Eu@p4Z-mBx&? z_h1_v++oW7$Vhj~r2S==gp??Lk%T3O)OlKi8vdaUB;m-$>EofN#kRhpUUS#W0$f<= zVr~{C!9`8n$K*~1PxCa@?6rkj%R`mEC!=H^gd`Sr{iC%Sv?N76!zG1Y>{~m<8Ax`x zcZqr!9c3U0w|1}GJ*T7IM9kbVMGP6VxaYzNsW`~a?s7;+3!-Iv+cGTluvsRQeR0+2 zW$o$cdfHkc z+sQe7d>QU)WhgIeV@Q*7=bo`fd#a>JEG{QXC<@EK3EdYITc#rkk;AW-O~dLqAE{3* z&H8fM#Va4@`0vXLZ=O!uX_(FtdY3KnzW9cMrGey`sQ9vxAvtNA&WyaWJW&~kVZZ*2 z4pkdnyt}XifqcQLaXOIDNOr4j6o^>#k1PMWdEv`i+^-t;Bo2LO zs+H&dTs|pih{`mr;!uTJwp=;o}4bNI4W z_#NKGvwJUc)ek+pIka|YiD;qR630#2*I2*Wop66@uFkRcPMe5iZ-eJI_FB(leGTrx z<-wXNbL7m8Pu$Dy?@7v#n}@`}d+Tb#nH35hw5x$KERX+;zI~O1p(woH>HOOBCaHRG zzEgr%X4p8j!2cVyTOXsLI2}z-Ut*&KL7uS|pSY^0bXhs)a_iI{#$miFGZX~4LwIDojyqAiOBmN~o`E&4?mgM7fsQk- z@r11>Kb0m&d8BqKb)HP-EAoYun8#k_RJJ!bz;<5X)ofi9o2?Oo!1m!PIBu<{4EC_m zbE_%qu#W?2(7ghcBKt0%<^B|Lj8BlHkUvT;n)A)~?-N|w(^wVYCoJ5|9k`c(?GQYy z9r_i(LsiOGRZ-+}9Yc-r~-=hqd-#o9el?TU+2OPLRPKSjuG=eAn-cXh_X>ImCbvlwPWu-*X`0fx$!v{cm^1hznNR|T@;e-4M)^2dJ z1v1VR?B!yMT#3C?IB;Xo>}&Z>*Yn(8Y8{7N>3i2)dv%l!W70>Y2Z|ks*6;~0ycT)9j~89 zp}D$3Y2kz}i*m!>x~}0s2d@Kj$iT@tcftA;XJuKNOcHjX#}6`f+wnFy@l&ENqCxqx zckYPF!CcZbrCK%R2D690ukhA{IK{%una_Y$6aj_+{TM85UnV(XH;=|4hR^QbPn!v`?L|6dKbQ_7 zJ73Coq=RM|z8UZ-`sdP?h2Cal^rpgT<~N=rJ1h2u@yLy6G7^I~jg{X*^apS8|6=)B z;Txj-se!dtMgZ?`dO{Do)vPIT#dGDD26xN8i1*Ozgl=4+_V8(nQ(+@|ENMA_AHx^w zms_+eJoM|Fylu*kN3^WHd)br}%bvUx^sXQ6#Hyy~@Ex5f#dZ2Nnlh(l4Vg3wL*K!M zqU*tDXf1Z<^3@r8#g0SL%pQb=65=s0KwHoUNsUdt8=P65*TyK*s}amgXijuk!n_(y zvq_V^4^`vt*%z8F5)Otjq0$E&nOlmQ0l<3~W-~kbr@=k}LCwV^rIdU3g9|6eqTfwO zVdC&dkjUY)IBJq3M(ATUQ=p~U!8QB&jKv|iRBZlQ2O;JiIH_%t?NkML0>lWp(=0Kw zz^%3XOfT0Cg-Xl{w)&G;!l-2eFXceE{VV$8_+#>;$0Rr=OY<7AR~b{)pVk}_8h5w4 z-|kG~0mNsLvr`mMQ}rHed#$7O%F`Rro-cPuHtu|ql7<|?X_?E;HQarqqlMQ_44e)C zCr~Tz2Pd0(zKwK?mz%krn*YZ07d%FMXH=Gud}p$ce9a>Dt}l~zuD*VU%=0Dn&E3M8 z8G{Be@Zg!Kx;1$$q$ufY{@jE0H1l7hkR#;{M2Xg%u1zI)pI@V?OHw;w?F;f8sxQ|( z20GKNLGY3~`{EWRs=Ptu6HK4%46LAIf+uu1J5@j^a;Fu(p>|w(fh#jG{BEK%El@qi zsOU8f<9aXsc_z3bTM9Gkp#tildP_ zk?^2Z_(xvO3G?tNQn;hhb?|bd&$$_Kx{T>QZg~|Jdh$4kcW#~pYd2^s;b}dyTzp(^ z?+&~p8-#v~>7)3;i*ZMQ8MFM65fKW;owGdG-#`6FB=b*G!virgzs)N)5C%R8Zinfh zwgW4s7YG9va{ZUH|Nr5V7Pgl^JR(L3TiV&}hRC-A;ds6N8N9c)Cis3}4*$Bx4rvZG z71T#1Ma3KBOfuFV`4JGWPoq-fOG``djx99h`NMvO^MDNno&++H!?aTcD&e8X%UMbf zx!8Sw1;35%BR;QbW>bPfS1FfHfSve{Ak0=rYi9_O##eKe15y$RMsm{c%%~j%!EEa( z=2qZxm`>%r46r$)PAg}hE$r5t9`~zz6essPAqYUuI3h<+sCpP-4)??z1_&d(89_xyG1KoDsK2JQ{>4jdpIUD zvEsb>JoCJKSQ(Q&N=jW35CiYV-G%X4?GQmZUC#2Ll^X#uR9N76?+VmJ=L6`PoVTIa z_Im=e129b$g5)&f99>`$cjsAnyyTw2$&M_^;2W(0ljb_`#1tVJl%8@=tboN6OX&Y6K**XD+$D)Y{Y=&;bQBM+`7_-ik14JRHe8Z z|NQYK^gCQc=tM^e_^4?x7vv~E(&7A0Yp$B16)ud_@`O_U8m_}fC?j0m{bfOQ)j#`x&2F%J@9ur6m{n@!)u56)h))9`1a>GfTDGM9x(&;o(15 z@Gh2l!_mhu&gB$2^{3KQdh+SI2);!dhrtUt7p_e2IT1pw{hf2w4W==G{4!iGLJ*9)O)piv+!}!r|ho7A;FFmbltIu2OqH3q; zpIZ73V-Cv*Hq%l>nQoMM5cR~;3|}aENSNWjKZSc7>qC#f9cwz!|1ARj?tI??=)@q( zI+KrzS+k-{LzC?5xXH3&Qy9;e2rGBZ1BWntZHQ$RWG$>`zqDv|iWr=sqQ56$VSS-j zebEX*b+vP~A#?|~sgWZSML`T#hY7US;LSgY$JSY!xsxwjDW*tJ{0w!zy8S{{nG6yv zCe_0P;VL!~LDF?2?fMR>>8DlNp8*=La3`*^~_qCwi(opk2v1bYH5pq(HG(CHy_QtXZyQCnQHo=ffVi zyPQA!NFM7A#L;khk(!EFPvPiDb#WWns(z~1&0c-tq6P7kc-3#?I_do-E~53s9=ky` zIR06g;WrUo%;jZd1OY+I(7wm1e7!0LB~4z%Zp!z~lop~qh?F9HCuukgC6kJCO;z11KG1~lD zmm~{p&x;VAH?*YYlavI+Fc(=K>TXkYTq*_YTjyon|B337vNMRcp?*ny(C?ngv;*yO zqNrx|_j$^2c4lYcc>}?w1DV6VY$edGWQ3D#s_EUUXLU*mewsmt1@ie!55TKCNh(%$ zlZCa7WsXzTc@E@(LJhGzH?p#H#6H;)*}FZv2QSQ(xYT?iS}7%uD%3Sc1@U@SNrZ)*7@>UP@@O4|W1-X{B0m#tFmzl431dnGqPb<6Z z9D9!T@SDOHuJrGhq>>lIs4f9Xm|#D{7oI9MEm-xvQ%GqCT5SsU>Gul)v{AQ}*+L&T z_v*)_-K`odudJ{FBo64)WEGW<-AU$wkIoIMC1I?sTSf!WM>S&Zd%S|VTf*HF--hua zs|!7k;bjI(J`voG!C_Uf>x3>h0WLcU>2z!A(dxKs)UF5MrQmqFWGvO|jI9!eCSp-e z!wi^UpshQyouo*~NQnDB9EQ3)IEzl4``N>@s+(_P0v)U*Y)+>v)|SW#abH$Byx3Z9ESksMS9vF5LsBMv zYR==E2(*mh5^#8Nk81@&^{Y);#l z5yA=V&%4K3a%B{WciB524wXF>!ak|1Dxt!e|Lb*tDak;Z82 zsQk^u2j`;$X?2ZUfiBhR_dhqteg*G1V$GF*QQ)_!CC`*kgvK>e(tgsxrUOg4t6}KO zHOla@KaV&Pm4hKkuto0Mf7EO|=y0>?XGa<{;ZxZJ?J(pEIQWo8C%LnOp{zz!*(!1wQqJbxAm(stS#&n%>aelhpAd{nVXleOnf-t)JtCCqVr&#BIzc_hpB{uj5A) zgk>bL$xTb0+$40P&zmXwHH6h(L0Fdt*Z4{#*kr|)#aH0JvM|}VjRGa9rBD0JHKpOS zS~?v;Tuj`zCNLf_UO`=XG8O5W(sY1SOwwLb5SdN|jaQLicf)8mmo4TJq64Yn=wpjn zx%RM=>Jowbo+`C;A$vqA<%{}iP(lMb)A}$pat%Oam<$i8AX|ASnmWsW0asP4G4mV+ z<4lrk9BAsgH^y)4Vn=(y)@Mevf_w#AS6$THgS+}^nEJ*EA z8LV=BKEEg9SxVWIemY9XkgP`b$EJ!i?VEs;CK>y)GceEBZUHffBpw&%X!mZ<>k2Mq z2=yz0OY}Fq&oqdV7R{Hy_FrbetgS;@sfVgla2WElCR*pK7a)Ub=~zUM9_WG3Su7`u zi`$x4XXx`N1g=G z>NfCk2c?N{HO0vy6;cmMJtAZGP6W28ZnkrGtH_p7n}f3p7(~K#rh-3H-uIN?wM*9q z^IW8Yq@rKW8srz!Zz}hTNKArP4(V&|$oX?hKhI&UWr6GP(=tP;AmK^HUX8v3nVBH% z}6KEB0s9(LV(W2ja0-P=`(;mTWE4>jaSGLXyMHwyehA z_g3~#mbQBD4_`a^i-QtYHvz^ZdK%z;mwuE4dVU4=fC?7a33JgxAx`o&0trHkJ- zxB?q#?$))1AVCYox>|Aan+#+^jLO17Aaba!L-rN3gSzh>ey|OTHc zLtOx1h2!Ar@6mV}MJG(=l1gWH0o(JG%#^a}$d-;#w@YN%L5)^5!2?S#^W5<6$KdML zq|swd#a{IJ)i8Hqa&B6O-938-2O1p(dvsJXHPA4m8&Zy@di%MsYwe`(AgNJ zeyna;;xrwhC=yf8di|bX1{j>rb_^JDST1>g6}DTR1uf?Q^0FqYI%2k99Ke%z8sqJq`xEtICT-_8 z*Tr?f(m&li$6-_Ppj53f&lWYuO5(IC8$kNw12VW;36eqsXglb3%d4D@$+V*0f5GsX z8j8+LNU}Q<$SUc)cB{0(`>^G}F2M+3&TWx-zMC38W@5~iGqX)Go3z-RubNW3SW`^_ z=^pa%Gq+7@MYef9CWOuefADdu0^dvUA6bhvU||{+L0+!ico}|v_6c^!(FU7<*VECN ztyg1^dHKG5;1XcsUwJzdk%~t+6l#m5QG{#*SDD^~wUYJ&IG?|>Q7zlFpS?*Z%ZWfD z(l?G4whyFZVOAECFBkyy0!r|*whK(~3Jfs06x>=_7Gkt$Wohfp%v^8dOZuzkZh6z9 z95vxmx19q@C&9$rA2FFf^Wkv-`g+0?wg)Mj&Bs^B#~_megP#n{NjOz&7(*r6zQWj+PlfbA#)Dg83V_ z#+y=>)cGK-hF`r|b|LpNXV;WplrRGs1@mlg`#%2b&n8{etUyP96Y=>=CDAbt>fM2b zssTW-1#kK3Y<! zlQ(B_?q3BEjmHFd9t$WlFk|gvmKG1B)&2S2&G#&P|Jj=}PjakT8J0>!=n?Scw|%$J zFy&o`a=I8fHS1X1{97l3tXyr;s?yQYK^8_@3v9zG#9eGnQu0+yT96Y zeePnJh}wgVe}8QcFMIIdIGl&W;SKI{aGi47fou)mPRa;m1 zQL|KOePA@kE{q8oG>fHG_fH^2!1GUs*`ZCDk0^u3(<=bKm%U~qI$or(x{#KpzgaW@ zefO;Sj0<Z_#}XM!r^R(8Lfc0w%H-fG8ra)|xDo>by`P-fwR zWTibK{!uU(LTZNYXPY*~pr~dQ8|aMt5i&D|J23jx{5cmJDZko6%C6dk(lDl}w};Kw~5r)2w>N&T#`El@f;LMnPcK{-tEdBPK zuxJ_M=I#M)W?(>ROXQ5ryTe&H^2KIh4o7dy3VeR_tXP` z7K{dKyPB$$q64ItV^1oZaOVCC-TjaH5b&pc^d=BG@EGAAi0JFT3TpfV;gAia`(b`k z9pW59K7IQkE(aKTzvYA|AdEPHJRbF8@$`X(h*jSK5OmC+nuvbKB;xkrP#Y&7ryF5} z_zd4{7rT%SB^zyYtH{uh*&)#*@b$?SUc2Owd#7d?4bSUaP}5@~K2$s2p0lCck8pBt zi45gmh$V5+b;{Dz*tnz8#N1jCm!bvlKWaL#h9E1An`j-`?T*)x;C{X<+ysCM;T||q zbD>Y!Wzu{UbJq&bZsT)7YJK;RR<(tm{Z;|ATZ_H#kAjrsw%F_%vOcgepr^Xg_eIGLxp<@TInM@5xK zhtIk|mb`3ozuTpAcDB~|wd;s@!dlG(8uMuGPC+iWXiuj+-6ZNTc{f<#{(qusc0x+x zH?CZXWzlZ{h!2H@6eS1unPMboB-@Ku02mhiI6PQUR)OP|B_|*CD0`0l{XrW{(SVFi z!*nF0&ZDr1{$BSwtt43ZE2w=40T5sOy&!3bmf&ttLb*SeIPZ+DbEX$yX` zPk9(H~N_we3i&}z}Wnuq$Kj~7-q{X>u3cZu_A$xVVij(f3UF75n3v zo@e()g9&u+<$3cR2A_wU%&nfYZs`1uSm(!9e~lwu7!1mV(eO`1$r+Khn{Om3!5(E9 zdG6KbXV)GJ;5Typ@27IlHPAPg>Cr<;uPP6S*q7r9gKajN|L=UTJTU}6-Q8%x#)8$J*d!C(pn-p)3wRmH5fB6cY?5X<)xDB z-nc5S+chh578pl5f5ndXFtmbnERI3h$jHeKS-!FX-LX-rNtUK8j@J#1R6e?l^$!}& zS}wDzG0R_~h5RvQ8hTEL714lNXzrg#NluD&2!+v7Q-^RGal4G-GO|zHc`rxq!$o^e z=hrsnG3Hhp`^VgEW9idZk7~w^x>=!yi+nTkPSeLPplYMvWW3`oi-|I?$qtnHOwfK! ziOSv3+Z5FIf0DX3j30vIr`@|}0%%TNf6R$SGNVdCa0lB2uz!SuzxU!4dg|NLJmI}L zxXqH=v0`bfIhr*MHw+x`trgamJj=p0tIMeoZ(KFlGR-%$@)bYy z^=o0J2xMSri;gzNV+5a#0Ao}UGQEP76!KyE-I}`-(Ic~}@Ie1}3}dK4_EdUcy=K7X z^hq|#sr8A-10wF)6jo?zu#Zi1vrTW#LA2a1h%|F#2V)_XB3rEp<>!R>nzATQ!k{il z^xy=weCP4QK|di2`t8ij%?VI3Y9voN|EhICgR1O;4zmsp%89|N z6X~h!w^~UUDb5n3+3;AJSXxl=#bsisy$fHYtNlO*Lkl=zClP ztYvufoza;9YR)LFo^GTCOxa{cA7aRdG9wu*! zc)0Rn+ztFE!6@LTNU$n19}HgJj57=BhOoO1S`UVnmzO^tJB=UWF&Zn6rd~uRuid=C zSzhVyXFCubeS+lstIXTxeC~N02bZJ=>QLKWFqSWyRZAz}H@z2#_3rtwKfE_*0Qm`j zM2?AX%%!+ho+4>b^WiU0K0(Og><0iUBfYP_Ca*pvHX!Lgox(kHMf;8{WjCAru!~BE*%)%NK z1wx~6hl$c6+-OW@Yke-#wI*OVdvuhK5Df5+=J|Ww)PdR0!qD%w{ZfG=oSzqf$oqfA zng)TK z;=Te=#rXzPmzuGOccKfUJ)5f~=0^dy+A|aAAYFQ>N{u~Pjzz^e0I+RjLY&1s3zVie z=n{z{?3D32y$?dw@Xt{88~mT^Cr$kUvp6Q+*pn~9E3wl;=x6sj;!@>|dWw3?_X~4X z2w_OM%NDcB&#iCYl1+0zhtS7U8>iDczI=JS2Ie?@C};qd?MclZ&a{{eb&eMy{0svv z2C61_gmI&w^YPf`57B*_nc+v?)Z4$>^9T>4xucr6ci;*#!%=S>-K+Cv@`(CX8jyD5 z*xM`p9G}upA7jq}HWiXCpai)E40TpIsF0;^_}}4X$a~Oq;Edi`^3e#-^E1x_z`rrt_WmN9za4vt5 zlt731gX$NqBZM=~6GiK&7~I5`vzNnCKhPfH5h-~y(z%{8$=CpF&~g_xxcB5Jog);- zVna@z(D_iXkYUIN#J@g0*coE~=Uw_6;umevyAX@x8qj688vKU!tY+}$EbtnOuGO$1 zBbmJuKDmxQ{Tda{!wii+=fTvSp$)6`w9AVKh>9o>*K2h}8066O z)ja4(H_)F&{P%AGKeo|SITEr!e~7ndOr~Zs1mqxTDy%y>xCJ0F<0jwsx4 zabr*Q0AV1W<;1pN zIz=W-r*iKe=b7DQ)4U;z>w0qynl*Moo2sJwHZ~}gPlgOcE6msHm7q_|rsu~ zX91rxkICBP>pCcty_@(E4x41SR(A(-Wk!L+= z;D@F$mzKZ~*?tdasaX2ggT37w=AjeOnMMQeV3%UV)ytCC?10nPcWnFvbtvxd+jm&C zr(6dd&dT3FKMVKM;bDiRC~in-*OxDPSh;5`qYBMybj@n@RQ25kF(C(T~5Tx0;A3p6YLw{CXWYv z!qUAQvbMM%&AUUftPsoHMC^DC3UTh^kH)ZRZPhsec=Q7fVTU~UE2v_@tecA(iI&1V{)EoOgC;2QB^%^Im_FR&W^wDAvnBZg(2abS}!Qd4Eg~r z@DlZ&2>bB09T1&AP4e<;4GxH)QK#%?7-hfcGGgzrmICPY{Ss?O76WKUA&UZnS3ch6 zM}#}@z6d8`-PP{1r8Y%nUPj)e+7n!0%K6sZ1MU^Gg$@G5qPhsrLB+iUazrqh1M-?> z8$lUneOj~HeEpSw-)_i&5V*d_cd%7SvW$lsC}e9=KYFJ#CE?RB*Jy34{?ahdO@iAc z!7@47AL0Xtx*!N2o*J!253)anHgf8TH58bMi(MaMPmVNtC03dCBR=*Jp84h0S zJ`Ap(*9Pw2E`cNqrqY@}y!?p07-92kyh}>ofw~Kz&7@k|8Ff=AqdSQD+P8KN@e)xT z?&s%5Ta^}V;R|%{Yj9Xps|~a2N`AKlT;|0*F_Y2mrDvud@^3&+<2iRAG!;!RFUj^Z% z&XP_L5^BkAyH7KMVZq?zZtMM!SyoBcRfkjgYsl)Z}UP9foP-v2GNkIs>})kVl+nrMf^=AR6}y(v!{NAOmy<9!yZ}3$P2gH`^~5 zFm-^DrK%bJ%A$^Ym#Q}PN8ikqeGm`b?Y(-Uqb1u;8$By8G-4V`@huq*lv;07sK}_Z z7QE<}m%lbxT4~_+YPL{8He+sfRr42WK&{7=E}@=QJGI~UgKC-va4r{SV$=^kt2fbjbN|O#le zg&$fnq}Pi<55aKy62z18R_DVA!Tjq#!2A0%lX3rt_KthwEF~OJlVB?0j9aw`LRr<4 z?c(^G|4|%|J?Re8%Q(D`5a^5epQ)9?c~DxGzs#!fD^LI_`7X+V)?49|1$r%@mt=TK z#ek<~zY4vDe_)$NeW=4=mBoQ9tWydDxnf#r?A8TkZ%BP{F_CYV>mv(K=McVDcFjsz z`+`iK)@gmA)%sz^!rCvXOKQMf4pe~>x}1w1%IHy>5`>PtUGL1Yx&IEyLgOV7bi& z;yO1yv3QU*^g%BcOXo{#1RVYwPRfxwT|GJ*yIcIK;vs2u)X|fYk)aZcwx?G}HLq2f zY+N3$!F{ga#{VK7h>=gbMqjB7Lp6cA)?-kKp@=7&g_o(vhOOd94MAb>J>+7AW}8bip98NKMVANDkhAvR1#J zr1T*lBfJL1A0EpaF@FV}w?u|Zn#iX{oZr`<`YEVNb`?sC8?QgtF5EHt$wF~vg#4y{ zIn*jdEaCS3@1V+dho6!0@V9y!;UYlo^1tK4AR-EBgD}`OSB&6mNNW3{vrT|PE1XMW zI(u$K34JU-qgEkh>qup>3@WXX8`jE)#ilTJx_qcKg~=XyxC(dfI|CiBvLS0y?gc=D zZP|9VWE}O_cuR)y#NvTlFC3`b_XQiR|tjwkkI z2OsDFeiY?6gT~8_!T7`yT3CiZ^>*tup`U(Rc`;}Az^MU=2VGC^cr*mIuHgzVB_2i4 zt7U7Rx-sg0kF~EJYLCiEcZ@F5ONxnp+KalA@wo&1PQ2E=(*~Y-?Z%L$9aWA^4A`SX5Dd$wU5nq&Kof;!T#aU?<4i1NWSNjX+=d~ z_sIn@)SVAA@y59(_EKTg3CwMcNKqtnYA2amu?vhuiw(m0h@!CC&G4M#BZw3 zd~96qbT?;Lc@V2AcU?P1vJOrlSf%0QtM!<>goS);IRpg|`^9W_i$$=R%I&)*V~_!` zrv4pwqZOU#H`0E}XLjG|&5Y^ZVZT*kd0>A*ygE4$l$BENm%S_L6=ety!Gh&Zd@ruy zDg*K$FnQ~`6>zQ|m71c4<;PB3G%~d9ZbU1Wkp%Zdg#V`b>8Z`8iHY$9;&DT!)JA%TRG z!oPnJ=t(L)k}}X?R~E`^tjTFqAc4JY$r|&vlkCijuFG)Sz}(<)J&D^?6P7O0!Xm6C zQ?*%LCkQlx-rnw;E}U-thEk3n4X9_PTW#mJL1>HID`|hJBtm`_<{QKZqf(qiW%ZWVM4h3<8Fw}#m+m;f; zwIFPN5ivt}u{U@pxj{qV=*f&t#w?Xtp`V`a9w@q|;>2eugG0#b%g^@j(2&So%Ti;` zk}Z4oRFGwZb-VZF4XtkyCXE!T5Q{eco8tKXN)Y3KW#ST8CjP+}U;R++<4S3l_cRejzeIoUGe7>K<#X6IU##6C!&6+g28WxQjKmHFX zBA|d@HKO8Yg3iY^%I$RDZCi3J!bPKxrx5)V9aWc;%2SB0Two5k-H@#>>UQY9$ChUZ zWkD%hVEh?M`l3a=vxfh*T7OENxq-S?OlZHgu0e{(MK$5ZYOi;?)&$bPpLO%m^*BAO z@+!WIC5~4bdIn2-nD6*UFRY{h++8tv2YzfhqN97B5IXqivLva}Xd`3WOtY zA$R&zhe!lZ*{2mNqta47V@xv5uU@@+>G6BF&3mW!0c3r_aC_d+=rZK}FG9=@!!ynr z{LkJQFT`L3_@xj)?MJC)dMo{2osy~s-!%j-`%c5CX7ucxNkbOOF0eo1Zwull%%cKP zB3>AE5qXm}-(}7$P~U`NIj^yt7VHdqggB@xNh44rgMNB6^mD=mScYJ!*q;=SuaPF3 zn)Qi>eE2E$F~OO3upxGhK+Mw^3rM8<5KQoUTM9%G87g$YS`9-N7rNZQ*fHk4G@NIC zq5jAo!(&xqjYh;!M=DiAWLkVSf(|pA^y57~ZS4QyND;@es4P$LdC(fpcNP{?cheiI zbg#vo#melwyp)3}IfPEX94<7Zyt8#_YHi52#11#9iHEL1*2jzCb&kJhcqNL+?RRW= z@VNL=!;5aI!_?!gcjQ>Inecsncg_CbyvgS#c_8(WLxiV&4X|61n03lxZ8_1@%Es8N zfxO*yEBV%?Jfu7`Sr=pNyx!vk19sO(=oK6;N%_>R)6a|`QXDDue+FAQr^K`BDgc61 zLm*WXn3JI%{9^R%@0zXG|#l+lC*|}k%L1r!=9Ch$@Vo!5;3OM z@g;8yz4oN)Q+I(|YNlIgpaEGz$vW2}BK93ZR^XjD&@w-Q*Sy#+ZS5e>_y?JY%(J*C z3by*Tb|Zu>jiba4O$~r6b@GOI!vPS&mv|4J%bSh%kVsINI$$_y;aPL?aKj~se&4F? ziMb9d9y~Q{{1o&&v94W7q@y57lHaO%wsKoi(RgbC<7#d9y{o}i5%|lB$PKq`|BAo? zm*%)1N^dFY!~r`8WQ9FUWIiLMJaY1*^2!rT9{I{I7U$+R2{>XwUppA`0DH(D5mc+T z?sX$CRUKjO;wGL>Hu~abC*9h`>JfE^E*Au@l!atq`4oZKjsOSEtjooD;jxH(+QHP> zsmdXK)cXTLhq--6Vej$qZM|3~clpnL%aX@{Ppn-QM(f-JZ9ul#C3@X4 zp{}-8el6kN>Xvz{x(ixhd5~Sby<6W}As0&@NO`}kn|%}c`X7PO!1SQfpmuKXcm@x1 zWbDHZk!9>-!G1hDzk&jV38AZ0FhIGz`c&2!4+Tb6nMmTf1fYi&DPqjDvAAEx-hCN# ziJy50ic)TVe*N>-Z8FD^!PtM4+JnE%;z2dkv!hFjhV5VVq3uwueCQwOGn^F zK2Ahu=mf{qxOJzAc`jv8Yd^h-e!a&q?`<>xbG4a#uSB#}N8L`hfjc4#op|da(yfSy zJ0fz$3HD&#@>2QNwY?T6Zk-u8ZiS%-N1W>qQE_U>j_fUdI@g~Q7hl-2_#{?upRQfT z_Qb3OVv&z2#6ziLF=D2^F*l|V2Gp~gK!0j8PNe`EJp8YN#F-jn58d{rk-~$yLl2+r zA^MuYEY&paRxoD>?v9AZxWV@t#F$cCSJB9YZfVS4KIOj?y+ayDO9yc=_pm^oA|^Z$ zD^i6!!ehQ-vK$r81eNuEBKhz``_PS+BmuJD_OP{{0)BJ#o8$#OmyEQeqY_q<%njEa zuCJb>?I3nsS?yzJX($2Qx&Fl`xW>t2OYy~dfx4^saw-OKIdYgR35dW)K;pa54^sSF zHz8VVv#p|MKL=v;4I$LAIJOBWaO=g?mPc5V7n8R5nI1jHTv-)`%y`n_mU#QCpD^FC zdHrmR;F@LphP#Frh|`G&kg8o>U7)~DIJf1#XiQQDW-6j;I{1j+&vw$NJLi$W-nLy} zm2saB@J0Q9=31?+=2Ni$TkbEnQ_g*~8;&qTV=SQI+;koV^TtZY#JT$Xn0kFxV=1i= zP^PB-jN+GC&dVTQ>B`^B`nfX_haYSKAWCKF@!=mh6S+pE?*FZNv>$mRDiF(9;C+$v|iWlt}b8QUXr#L#yvb zBg5P-KGb%+QN`;GTLf%C%+U;xlVS2%Cxm?Zpfw^J$fwbA{G+cPTEs+cM55+biGNBc z7Y0z${x|4o+ohJ$;_}LVWWJ6FDlCw>KDUp`;EF1^%8<7}p+$NML{!1QL2&>7=|p~Z zclmz`SDWFMK$>}^8yc`py{&Tb*{qEY1n`I}8$QlDr-f1;!u#x9x@n2`W}o)z9N+Ni zMmX4bD66goROZ~T;84J%6i&-zbhBw-20cr|@@M##sF<$32x9y(^A=1Q!${z!{wK{jnXPg5FV-d$K z6=E1-6R|;@f7B+|Co@2G$b&y79OgIR#ItDfCEsWN4>la!Vt~g>`>vqW6VNTg7tdBR zZctbVqdpqbqZB%ao>*5k_bRwHxYC<2`#SmtC2kiRhYFAShe-!w-O)=Npaif-v9wO> zC`x%~Rxzm}eJgpcHn?`;uRib?^!i+Met9-pUWiQ%Bw(&i29?XrGp64Mtg9We)A3s1 zL#gijXW=Zt&(0>Kl*sozVUGn}Fho6w`U=&5t%ny|hw6k;jS2)Y0e-`cTzb`aK>$cg zad8fsZ>4Jks&cl*7sd3}(?SLxIz?$#4JJ=?Zld8vH}_ZUzKkEk;?3nmQCt2EZ&=CK zH|xaeHS{<-kEtdP1d3M^nUSFd73vxW5(FpZKZO%ob;~Dne!=z3=G6)_UFQPX#Z{xb zni_u!*Wt39el&HG)QJrhnp$esJ=>Fx<=l;ISf40qB|~Wqmw2q`n-B9F@!W{#Hd4>J zKy)`P@uJIniwND7Xu7DihTzn_&OQC?iAgWiXD-;cfCE#OsVnH7;9o0Xl6tNuzE?~6 zs^oFm!;$Q%uIFLWZ!f4vINM8Q&GjpcxoRhN+{)Zjl$+zxP**)z;kOy9AR;v2O#PX# z93{ye0Q~3~#Q}N6Fo9oGnt$}TIREA6X>)U;eF1W4@ylmnq%1k@oRTBg6h+E+JR~!G zMa84qjg}dl^PdkjFm+h@1HE$xnShF9_XjVJ4By9RB_(h!Wx@r!6{~+g97AC|PL)Jm zZg?@4_v^%n$v1A+x2yQ7ATm6%coC4sNqlg>{+X9XYQWYrhR23OCvcIKZrN6i{Wg=4E zuG7G#xpQEoGCpsCqKBQeT!S&5EkT(s{|C}_n<-|BUC7;Evuo)Nf!$<>CKLEvu)3W6 zWP?S*PfEX2B|B^RtaY0^NV>v<;%!0HE=w&tx~np_el0;1QW4ihYHT7dx?$~u-%?Hm z54ry0M~%+X($d`)?1oUCzM?PVqft;Jfu@NEK*3o5Xv#nt39G}k6MCB~?ECWo;OTyV%X|j9oc$vb`Y2JDb?V zAyEvmiHFZDzv;tb~-UtCbV3+ zgjy?1uf`0Fgi7(_&finX&eM94AG9HMs2g{8DsK;YfdARvhlrJwP6AbC*tP-qOP`IT zPN-h;JCgOkp>jdvh&s3VixW)4I{wj~?tl8f+)1|ftT$6p_J93(f{yq{UE225{zcsA zA?fw#9mH`8TsoINMQ7bfv{PRAV*es@-W~CN0hoT^v+geAaHYcm@P{m$ut4vMN7#l_ zE}!{4%vXlTN-F0*#;s-1beH&d3I=0WNHyg%h>io#&`D16sqTB}0}MCi`-2s8YjTB= z#|jDB8z$%9xPs^>Xo8zwUYScKX@h;#rS^vI>qj1ZpCxZQRbiF!bU`FDA=Xh0=YZsa z4s3-#4{p+LPxqOuru@AtWgAKTGJg(|VtyM_uiJzRMWhfdFj5&@A-?X#M__H;^|EDg zdKQhklS^Ti1D2Ll+*1^_c|!)rsIL*+o0u zBjUw&G`VJn)ce%UBA=?CV4hn`y><>NCphlhNXQ0rj*@?ixse+YMe0jfXn<6FTuIG$P+p!!m}exXWdF$+~|q$fOSq#>c|L9gj9 zNmyC$+8c;{q-7}pl~+#)F_Ac#Dv~+KvFYlvq3|!5PNKvfZ8?S!!DzBnl&3 zQv}lK{ME=Xj{GFZ?hp!fUk7PY{STnwVj|1{Q&qH_BxkOB>7<9H!PLY(%g&EWKcU)o zbCVBfdB7VFWvH4CtV|vaNKxSCkYsEWsj^#icG=v13>lpp0CnGILR8|>6%RCB=RaO% zacOEZTl|u^3?LI>K1V-R$!tc|9}Cjwxyh9LS08NE-pdt?{`AzHj6H&l@;#VstqlndOVo6D(!_d=Xfc~v>0Q{<7QK9?rngpfS87E);N z3`1c+^8be(1+&-<5A!tRDIcaDjB(3Wrs#AFHT_J0DUBmK~Z zBVV|wKe}A~*C?lbLCp5wOs;(Y`mZi|-j|*rDyW2*pP<Mp;I(-j|A(pX9p%iP{Uc=0R7%Q)ZV#3Ol$~Ha^5YE z$dos#12gH_P(+x#u+VZ9NufPO*NYEnp_3+~*9*Ex%qS|~s0Zt>9=!EFqOTp@&9C;ei59qE_b6fI->NBZzYSMq>gjdM^IdS$7Tc@l~#OBXf=i}jen1aa^}=Fk(a;U zO{!ZL(p3;0VSh_7NFz72zhuHCr4ICU>KlPglPt+^Y+@hg6>cR?sr&9#G zJQ>!c6iw8N&-FI9&pvty;b{U~UWGDEoktvdunrfumOS+|DYpO9@p*hPP>Aer3!b)8 zUDbQ4V-M9?J4aHLu&|*O;FKj-qGe}|bZmxl_V|;bEI(H(in9m)v#;w9G|Pi4I;o`K z1wnlJrErO)AcuRVN;1V_Z!-N1l8PMflS*F1I>)A4s}L9}rumM+j5XGF^D0i&j;_Ib zh#kdjjhy=S>HZz4w_k8`h$=Tn*$)ST_j(1+v!`8*_tF;ZRIc{T`W~sEp|4UHa*9_| z=guBkY^jf;sHCE=##We$D+TYRO^>KQ*UQn`%ZsOC{4pD5qBrm}g(`lPExvxJKS9t# zqGP@Az)m~rdmZ`cNN_e=yWFM2fE@4HQ(ZdcMRcqgtQon^5F-6d$ch&&UWc0hj`3;M ztEYIi$^A&hxG*b9Gjv9ImO4_im!>2Kv{GiqLT%$N(G7=weQ98`CU@x% znYvnvp|Z&I&dg13>eO@Qimqk)Nndtdqo1qd0OQrH8b@F0X3^p!tin*OGp(m$H|mG# zLO!Hm??|}aa7(yC5=3z&F1!fpH&n6}Yom14ZfTZC$>J=A(#j0bS5w)ZM;3ePuTmOQ ztL!Rkq@grr5sgrsmc z>uOWefxH4A8)esCl}{QI;^p+z~XU~(BHF>upur+Ur#SYQ;&~$?t(A{{+CqWKE&nX{F z1|)8E;f31^T(#V(mS_j+CHk*66AZ1>~wRo^kdK!IOao^rd~qM|=` zQi8x47@*va$giRWu&_sDQimr6$Y`u~rCm>%4?(L0Pw3RwRV@pyuWey^(Ts);(_+vv zk_OZ48d3$-7Mw5uS(7kV$fog154@o)#_VfU>jAz#snZ$-j*ZWxVLUQ57#bf>k0U`$0YT)~O6 z+0vKOL|dXTlY?vDjRRir?m%8;n2oQ0OcZz=Ty+}4DzYgpO10>vE~Q#b*fWl(ynW|T z9?kQFHJ0zBRx>hAx&s6#Fftsg-JK@6YMa_2PzlTkz24c^>Y{5yvb?oLV#DQzbD>hQ zR=2c3&!=>;E;>FR{Pl|3i(aMYd7ene_Rpxril!xh3!3Kw;O^~F)DK|XUu4(`b1DaS z1C>FzgCHYIHiHRCaF0YMd?5fq2uv66cnH!{}F4Z>F_Jz4jYGxAo^%95TA}*DF zA&H6$1`F{A3x+UVYOrd7e~Di>A=ZHw%l?hpcEIIO`%8R62_Zqx;jsf?6AwZ)~=Znysy{8!rr7acTfD$uI}9)vBN8`JT;i zO-8SY0fhUgHzREEZW?AHMW-^LN=rMV>ZibkxZpv&w!Zel&JVAfyxw(nge|W$4`I|b z)TV|oj?+ZRxa`^3&>&CnMiP1(csJ#f^IQqsJv)!J?g77*9}e!wmv*7DJRmm8g_OH4 z-^XWAo8sH?aH00in?vu$a}yeds|3*Qy(-w@3bT-j(Q!(Efmily)ly3%Wg*mM3VQKp z!Y9O}juSA8T_L?O=E$}B%(3Ue$=oMtW@VMd1la&jx47w{%K0G5PMiI(+`v*MCFRmF zoH;O>G2*aFV(Ua7`l@xnL>y=R?Cq|EsJ?}samoTaOf!l@m-dh_SgIs@9IC-AF@*V4 zhSw^oWX)NrCK;SVvcoS>Tq9^BcpXS5TGx*C81b0#|B0U0*mFxM2(h5y67;CeA<^8+ zd^ZELFyaA~LwK=WXvQohq0%N~iQ1f;67CW2P_Mwc+Kgul!)0-uqgGo-D%5HwU={Tl z)#H?^;K@cxyNA{`c8zAQvOYUxQdmHE3fgiF^kP9Om}kiq0#|+T^}lh|=jQ7&p>y__ zZO`U{v!=Pi_KHL?jmB%Y=?*L>WL;3EUPyKkZ3@+RQ4|b3EF82KHW*1N@E{ z|Apz6ZL!`=dqA-$pb6{^91e7+V@sJ~uhp5Gia3lAbrS^C=Hi$orG>|OZY2j0gfD~h zDWwTCU0ezO=mvf)*OLdHnPmz3D@($t*f~v(`?8&GA|8E88ca+jqZrjkFSV{^vGda@ z2D4r16a}(hc_%T5v%45)A;qr>ehuH@C#D`B!CCcZnGwoYOIfqd57GaCok#8gQ}M3L zE@0nty}yy=!0_qI0*|4`HDQ3%vv{hjS=tyJtyO{tSNZ~fMdEDq9@vtlG?Z7+_9{U6 zM<<`$M~|P&fAIIhpYi9Goz!PY@uN>;O<&wJ^`Ya{$oPT00Q&t-Z5_oTk=O>#ii)Q` z#kXv$%yo;WylGtx#aHFRNR1TEywCnx(M4tsW&ZtvxztNpcj0TK*0~0id*MI*<&y%I z6hO=A9c{$vYCKBr)eB&672gy{Hy`ZT65-}l3<8THj*oy9Q?XoUf@6b!!8{>SWLxGL zTW>aE{<18G>eINHyyf$K3n+PG>)ersOG75|0y2Euwk|^lKWPCOhDoiYE-35`n7nV< ztG9r8mM&MwQ1^;5-TeD;*C>Y)RGc1(cEUDM=>QaEMvB%Fd?ccgzZlY4)e>N zEj1`PR>4?H5Vz1#7*tr1^`F%>6tgGAL7rw61-Pt0f94=13QbnkpLvr*aZ81lQ}YSp zcBTF{W0+TcsB7FP{{OhQjbFnrn_4LaU$nS-W84~kvOW<-Yf464x4yCGS+Y~=l7xp0 z%G86~lK1NNc9Er1Zy7ziIFu4RwF7C-+kB57Trr%i$(JT%vWgF#S{W8N+D=gQh|ZKu z4ZHw$Lz#bYL;n0Rg~@2l*n28=Kew+p!S~J%+NpLJu)SC|lJurTlxf74h;X4-O)E)$^|!q=YU7QlpC0$z*$7W~T#mO}rHk zmsj&8^sy>W^*4HiemTPqpS}fRExA2=qIBZtRNrtcTYD&4JCR?n=CG( zHX)oHEQ-~L`Q78zOx+b|F7IU)x;MQM@0)!tr!2B-BYZlYG5=nlEvTb+5yCy{iN)3j zn>=qlGv$lt&sBSA=IPkqo#yopkN!hAftIagSy?yj*=e3AiYxm*UXye%m z+&dlIA-BmVu6l^wKfG;tP24)xYSTYFZu$OAUW}>=oHFBmC2^taEK^-sO+I;v*47i+ zYf+Ehf~+oel*)LePmG287d56Xk$=4*b0GXtU!c?l=i6!_t=|59i7`O~P_M2^ua6nJ z?Fqi1D^qJWDK>0Skt4KvB%%rsBkn-H7!8dcO~brKbjaPsotrqDZy_CZQA=MTej>Os zOUugEuh}clI?JPs_~k=aVHShvdsAg+J_U>WD&C*2&JG>uUjp!pwOK@RJQSe_maU`y zOi#IZ);8ERSfA{@C8V+ls~pl)mq-Ze--$v7DUyaBz7?8=DW!e$Ig|`i75jMu+_Za- zFwjd=qg|7WO{b_)cD~JSLsKji-yutcRAvu?WmAWm#e+{S^;^C!;ol)l-YId}lg4G` zb%7(F5lzPmOZPKaHSFs`56%lMYP?f4UZ78&riDlg7jM3g#a3a7ysaLAyDtM4r>$c< zQA;A`me7={rax>>hp+p=e20>YORXm7xxv;B{TX>y#iw@)ABjGjQAZ;XBU@8(vxvJk zk4YsL)P&!RRhmRL)V5k}0fRlKwluVT9Dibvw@<$5nW^j8EX*5ujC)t?R3 z+DH&ivJB#MOg+5~ z!y2cJ%|!u8)A_{8As4+w4`Q`*u+8Vq5-|E*XPg{24apP=1Y4#R&o1vpF4l)G%;S(e z&T8HG$S&+^-wGATWp6-0*O^pGdl|Bnew~2{xfkM-ff1Ytp+zm`aQm`q-{$ zVW!7I%Rai;1%F&zXZ6*W&zin(N&I9JmETt2p+x|G5%cTB*n}f>GaxPt%OfWOuObA^ z1XVW7js2suNY5e3FDTc$loIo;nXmn#oq*Q<5@FD`cCq`wJg*Z53*cRpvQ%}$kCP2f zdJo46+vx4S0NZ|T+_t3gXRF!dFVp~m6}E5K(7ZwTZGQF)%g?3tUZ_T2V5|y{6*!|s zUc9B3!q5c5VI(z>exFqI6T;m@e0s`jGaOlECm)D;g32&n_(d;q>FM_x!yxvuzhIux z(cIX&QLa*Z4NUF^j!^ArM`ppp{r2gS6ZbH zEO{Obt2)kkGwK=Cr5CV%Db0AOWTG&kQr!cZpwZ}xCZcw=hV9}53ny(%XBsx&C&=i3 z@SrEi7!3Dz8*B~!k@dPwFl+S73JVdDdQtImSYd${E~xwLKmU3iXz#!J6sdz7-rI!f zhx#L+?{Sbg+f~5-RPCDdPWOi4AY@Z@=S2^feG^cJ0YjKhy9YC(jVgDoo0e zhCc$SPhk0}ugu5QYx%LMw>PQ?h^x0I9V}9+VcRXtI6c+de}rJuoWF28r2BXyyZMQ27QQWe;dXNwI0cNO^W0iVe*zcF zF1w2rb~%(OL(DsJvpcSzYUJ&1O<1a0s21MC8S1;<cbBXI|HV6A6OCh}~C}V2U6T4ET@t;^5=-1Zp zp9{(%xmZWLMRiW6+#DBtdkD0^fJfGp<_L=ntzLsdncT-br$!eB92N*aaMlby2n(EO zLmf-{`b1sJ?2Yt(8+%IgR*dCCT|}a}x)*iEs3tgF0A+YXCin4FUpSvlNoK?s{SaXs zL=%S)!2iiU_hhW+6fldzGbwAKOS*SO9%hc~kskTZJHoPhj4 zZh=vISqK=L~*nKlQ0c*)#GOze#F_( zY^2PNIA;0CVa3@D&5J?;K)KU+HPw9XJ2$#zm&4B~m+G&)1^d|_;06QNZe{8c^NzmX z0zM$}nZlCe#WJZSZ$k~J>TG&jMBMzxPL5Ed4`U7ENR^D_ur}*93{|d361!d(HW%oX z;tu34ZDv}1n*TKuH$nw{yuDri=m>BKSVF)=;xHNwEYPn?IXM&BkVps$&rySfir7-U}%io z7T#m|&Sk0(d_MC8+hLcILs=8OX%JyA!GGqF2)=RkoWp8xk=vplfT-S3s9W%OLe+^l zqKd(fhS^_jM-AaeRE`n%aEOH{_bC(l>i)@lfdBF0Hg$oDFixnKx3`&$oSbC9Bv}x( z^Lk}HHF${_%#wwDur^=9LK$>NoE2kKHi zDOjNOj_`+oOA$n>Ztb2WMQhcXev=dRLucu6Gzt0M|Z*D=eMIq+DfO<7tYw$Y0@*twVt-fka~ z9z>Dl(Pgs0CanKEcWpa>O!uiLJh+}3pADnUq>Y~SrkB@}Bx0gsVX~ngGID?RMcfU_ zTVOHieU@>3xgZy3JtFYv{PhA5jVE5<;~h2Tm>+yFl)Mhix# zU8y-SC;6#GjAlR3N6A{l|AO2>jMrvyswrl`G|BpP#xE6dgkqC4V-QygaFGgD@xiaz zM)JRca5ra`?In6oaC#sBPp+p6JJtWKsR1#^OEqsYPaA9e@Dyigb|!@Z1?ET~at_-_ zr6yeEFO-X6_`i8^Y27tQfpQ}6gI+Bh`wIv(xrTYU3wF&IgqYpI;$|M<=ZP}>q0HJF z6eoS(s@dE=Mch2l*U*)^K9pQ8r=mlxN~8jmegwp^5_!Zj53k+xtcx)~q4D+GjY;a` z2mogJ^Z1F!MiBRENb_Z2SU(#lUGM%<^O{^>z>yG#E0ESl?}3nm7Y@Lcze>XZhdPU} zI7*5Rih)xdLQUZn9GREGcSQz7$t@BK?D!@I_mji=@Yg~sr`z%;7I#w^`$m2nbx8Cg zEf0T$RBrHw5IKO#=n?iQMS3`TlvSm>s6m`lnN-Fu>@l#q?2Kr>JVQ%TE;(p4$6q1k zIYzTO*W@}-$e)k_lpcvMJPO&m#(VQEu#K-fmc3zWAypArg1F$NNLkga1%GMg>_qXp z+UF`9+9{!T%GZQ1YBa+7k(~6mCa`L??s06RFzM$+$!Xbo;RUdHof0mVM2%*C`@}2w z45r?^`h_nAL^c^-Dp?o&U$dEO)&|M1-=zBQThBmtl;A`gw34|%rb0VP(Qi$a=2B;CB2VTa~3ra zR0Yop^;K^&*_{~S;-v*zXb?&<{(6!X9SQFLZ)A-rX>Wx^#({5%m>(G;Uqj9gurtd^ zm;^gB@1VwALagn3gu1IyCdEv}UA>~f+|+8ubp{grTuZOZHVDtW=vdpGiEU*D_Uj@R zS6^yG;0#U;`}@g%V2S+9Z)K_=aX+Y9t+~V8)M-Fyuv)grrUI)~MbasgBV;+cX|(!A4R+jswNdEg4w^v>iGG zI1R*1?_y2*^zY#F+i9Ss93143Zi?1(hQb%2{NzjiYm(ju1-RL;`WvFHHY+TKu)V9h znWgLZ_CbP(vIi7GDN|1`+hfxs?BIw{|oj za3{N{J%E#{w|`PV`)dC9YdU`W5Nm83Gc1LAp(rTYA9(9N2Lf_&*67u}?* z?9>+w`hpbeVIGY*&P8_ncQlhf46lwo^ZOUlM=}1fh>u%?s`wp$jn!67DWgg|qKVJQfmflfcnW|} zE6{C()evnjH0^CJ?xF9#*fD=gkX}cU>6R_eb0LjwM&=>h_T^E&YkkYChb&|=uMg4S zDW&WN0xVfsWA5HQU||B`sw?k4;b#xs+SlibfrDw;vi&|bC?*4h2SqS%`D?+lh57*b z#2PZjICo?(-<{;_zP$UB3qW^t&38C3qyVq2ad2*gbEFsJ26x3vAf9|67Y16Tsqud; zx6i@a4Y}a{7poa&`2P8+Fk$fcNajIHhy`@*eBIob6JjCJ_L=GglBg@TNE7lWZV)$+ zhS=ee$42);687+S;|!H{_MyT3Pdvb%B|Gz)ZZ#U6KR-A-b3Y{&q-UvELnzP2EML=L z>o_dx9BJJD#n_wlv?4s9&b%}4rb0=lVsMU=R{TsM7(kFqz+Vr_omtqQQdQ{>1(bGG z0?>ASusUy`7*ZhV=Yt<#`nD!x@Sb=SIg~+Tg(Wu|7lF1I>^06d1ih+c`$T+jf?LOL zcMP_u8T=*uV;VkhKc@vfgn9Aeh|hrF`P7m_VCUp_#1Wt&Rj3T9T+J|KyN9g>Vy2Z- z;K2IRBy&$Cmi=yFLbADuuJjCLssMH|-X&XB16gteB zl$_*@9`G89`634}ME*FZrAqGE~8x@r(KaewwqB!922KJ|iuFn_e*c}h;eU#hlcM}>y;z~X9RNgUhf75(0) zZ3xBPEA{ym_r>1oGlrtqM;pMJZ_=pwc_EOywT=(O8ep$ZcJC1C-#M9AFT2oD(n~7o zy-e*~w1@f4jFx?~{fllsR1NTESM#--7VBK8b9jhoeY!!x7}2v>U3nzC66)X0!&IN~RHydkLd3+4XEq&1q#N6+eQbt%{|2T6u zUeKE&c)EYSOfI&2hlbsfYw~QU%$pIK>qeEe&7uqMy|?FNfu6r8Mz0caq)-OFzNHpg zTwfM-iCfZs8d-ecSWVCTx3$Fz?*Aq9k;nW=ny<0ssDyLD0LQf3_91I(OiB4C< zaN|@hBI81Ee9LXS;%C%hlx}%q9G1Sw80%baQ)_%h)VFX4&>2)&==6WmvyFuk+2H``3KBG1 z7+>%dp2OWkE-~sv@hz)JHw2bjvk;%RBr}e|Npg{k!)f9iG$g)o>b!in)^eKwjunjZZu0%@ADV)G{ zq3aWE@%V?N4(5p9{ohh35H%s1-ebB#ducU_1kNyjmsvJ_uMOU4|B2xjj(!p+CrZ z5eql-d${Ia*uRtH)5gPgB^0X*9GcsC@{N&3te}g=#^r%!gdh#KhE84Kx;6!IW?Mo0 z${JWb?Pc9j=SsXK=*yHM@7RZ@xLvEI{@JmzenzWfIcgb*CL+VFvq%Q?2|qqwn0?j; zRU6m*<8eYLc&RC`Dy4`ir$`8TNz^$XVinrFyr7pp_!uMexNFh#_AOX89|&7H`%7|M zT%`y6Ty>McxNFm1M66suPk%9V*oYf;%(GSk3h^#d(+=n$4>_Aon_6auE6I=wI<|YE zG9BG2bEpi`4u8AdcQRo(<7L-K$8|l`Fc@p4<`ss_&eCob$9!_$DBbGNso}gav8a9- z3fYDE1#^uQOSK&Qs(#3u+jJ8Kd$u@xh@}>UUjCCIG&+4rD^n0s4 zI(j6}71{1pbg0C&Qz^-#J6FG-*?9}bcG3Wae5s*%7lA4{%@7vV^9q+}SyX%Qo5Z~c zx^iItrZ<)+&p-*z_;bi*NzM1S{%H+&`U}}#lAOBJ7c|Z^jDXva!gU!M)k+J)I>;2g z!@7N7DAT+>X*r7c{n659=8xJDF#MUzB8mLy#{6*A(?CNFyi?>jAod1~+)ijY5o@+L zKj_~e4`h7AA(4k0nS<^WPgYo{5c9l=5n&3IE3b%RY+&&hd%iI;f{`Mu2P?AqV|TJ< zmEB8Cu-X~i+_NRNj^gN+==wgM)&W-JU$8Qmx{EKY>%;P;3PvbaEz?~o@%M?7pH$Xf zb}Z_7Lcz*|M^C+YPZyq1u!&$7CY?V%ycsJBzBpgLyF21w;XBi%z*d%NBdlVk6R!+hLWM&3PE&>5BhtVbMYJZx*Oa{1$S%oZ$pQ#0; zg~@4}z;ieMZU?3N>L0015o6=Beul3~cHJQ%3rmJ0tX4)D*P;B6BtIzW8Q4L1-; za1SGKgPolD_h!Ic2gJN`F54oPG~Lhc^Fzj;Bm@`#*HF*_1ycyc#6x{PZN_~UVfF;O zT3i<%ZybX1*222USeqHvu&`=nNP=(*!;Uay%{x7$^|hSdrjJId zn$JQ|gtGn$cA0GxNCNnL@RU!0N7YziSqGfL@T-R;idjmO5MnpbZswFR<`?LTRPj-G zMvL$mA{Dy<-Uo&Th}7(dd5sf1A@vjUE6zUpbkb(DW0aj=SO^w?VQ*oLigvM&l+et++xh z-`;fWJQ>6oZyC362r8fa0BJOAn{hmm+-Ip4au0&&1gx-O&o-A?W$I2Yv(;ci?{?t; zu_Eut$M>o*j_l6FD1O4H6u-s;{Pwo;HEr1oSkj#h^A-sH+Hu=boMPOv7XZOp&Fukk zDgL`te=#-KrAjU4FrYHW#ah6 z(usc*n6f-6;c`6P5*LWw5XQ0avia1>(HR0Rn@d+dHYmj@1dH7LAgob;L-@(%{Q_#) zmtg;Se)SD``cDI`uZ3>hme2YP_Fr;}dQd+mNTded`=}y{dXV)kCMXK5sxjz|trzFV zIUFm8jqS9LH!!dn;M&ueAzHm0y7;+t!`^P4*A8d9E9Ov}zQtU#6=zdt>2=rm4OKK> zZ8GJ%Ejg@+it4(>uWk}a)dNo^au-+%KE`?hiul7{Ik`tX`@6Ih<>XyoPtah8+4AhxM5EL|bLH&t|U4Iz% zIed+uTp7Y@aKekQ6?#;05?CpM&Zofir1O`gB1T)Q^rSkbA@Xh_>~)r`i-4swNsK%< zM!Y1W*eiII1Cio~W6XTnAkI56@Sa;rhkeqkg!s(ayZ2~}$Z z!*8V(zeAOFD|5V3Gsm(0ww>Xn*yB?)g^*b{it7#>X?{NKP zG|QfPYL0WFQ!z7;*>epXW$g*r?iQDBz5w@9^6;CjrMCR$t z;i_?A*))Db!C)`3VZn<+tIYKUha>DY!fw&9=eZ77ME*+CPP=0Ajuw|CY<2yFLeHnE zIcBhOw}f@ax3#*E&P<~%j*}pfxk1o7T>WL=8P~vuyUM{h!_5rs5t#);U7hiEJ^Wu7 z^vNXNFcxbJ!(6~okUmA&g4j_Ogl))Qf-Gb<;&O~w6yT4bJ(Hubdj;(1-k#4vrVzH9 zhIo4#w*{*JQUQY+XeJWVAqDESxj6VVY{Ymm^^VuKTtJp0c;oHbNSEfvC&pp(0>C&( zW-|iLZcvjk0xJY5a-e|LOD_)v8fj93gak7F1Ez~3P9<9#83&G6+^2^_GMo&0SVH z=a!5rOiPmHU2r{ah%^S`yt+qFZ8Lcp813JJ4G{^0{I-&QqlIM}?1=CmwnIGPjegE9 zM(NnPf)X~$gxGZqOXidV_lU#zx)AGhd!&3}kh9oN6- zm{V6w#xL+?K_$T73xl6o4^z3%nAU4XT_Ys&XvC;A6IzMy+B(QG>a4u`q$6NHdejXd zo*sl6ymOaDmBWEPR=e>KAB@)EkQdUCLmHU2&sh_vHyU$ygvR9tLkWS5(Ej_#=Z2AC z`gO2KtY0_{^Rbj~;~m%&I{NXUaJh}-)>7OE#h5tr5wW?0ZJpcjPj?e%PQeL#PyEJ! zn~=?*UMgq4g2+8I{AzH}G|jW7_j^^au;ciSwyiJ<}L$#Weyiy@q# z#yNC9#>C(=hvKsnLZ>`Cl$u$4!NjogOilt9yb@XuEt1LJG3rT$raLYhbr;T2{zxzgZf^H9IfaBQ_v$@H*rhy?-%RI5xVCAs<%unGX#~erA ze;UJI1CNo#EUMzZBSmWJ4cHnHNllFYAZ2IS@DVM2?z2>hL}pY1=~ z!04aQMYN5U=mb^UZ6v_0NAdtj;HGt^{x|+EZ;T9G0_@)dcCH;~TvEJFJSB+lPNVcr zRSEw0Pc<@8%4evZIQu7=UW}DN)E5vJX%(T}@1oo=vof)THRyP` zySpVL+Z&ZtRT7925(yAnfI#TT+vV8a<@2W1xcfe~Y!)0ahils_``+sl!@a;9Wq&SG ztvkXf+D`IpDee{U2vtRw!Q(LhvPc!F$VG$4%LWv=%nog4SCcz=$)mXy?CuGUG59mx z8ACv$c!G}~2pTPYhyiMh2fGw^Wt=0k@CL_=T&}5zt--@|x>*W#J|$hhlvP!^AG(3Z z36%lCaObBOdox?KHA!s3XvKZ*T7>yOdYg>1T^M@kE@=G!K&IZ0dV@xulU!q5#*&6M z=M4c_?&*@p!ed4Gvps%9zhW>a=1>OND*iUe>^-rjC3^*HTZbg2%lq zC_!N7*T5L`gW#PO?iZtoYz zFLWq;oN5gu+I=hUe++N5zLKuIn*-6^0IfrBh0LIlwa73VzpyL*_2&q8{CGKhXZ3%_ z$TMF1C~v$;EC2_wt3CC9WA`)QwkzznL?TI2eao2561=3(0-d}Zz%YO1Ajv-;!W6&- z$OFk$?Mi)l1>D^XBW3%EGeq#%x=Y;-c#86f4p<_~8keO2pz|XavMp;K$Mb@<<2y;n zvy?i0K*p3I4O{FZVu49yd3FNS=@R*ASUA5VmGN;7YGG6`LS~ynpGhoD36l zed6iVbIiJZUVzI3`V>QxIe#^2Jinr^!TZu`r|!4_j^;vzum40N%j#1%hpCsIJCq@_ zm0RmgWN!ewV(y-u9P^(f@P>mWp%oRH z&9XHe03nM8HSaFS?f4mCf$sxzPL|dheW!G`*W_#|%8<7(`v}Q^T$+S94WUpcM|a8# zj7fe1R3s9X6oB;drk9|t#AW9<6E2|@uDUrXRvI#-3e$?1cv48O=ubM<`ZgM8mRu9n z-MXFe6^H@rndaYQTXj7`30TzoY-C2YlU90zOYV6F&Vn+k0^$)z?YBx&)pHHs@c&ls z(b|s?gI6w$R4TyMLn{oc9b=yeIFy5i?Ek9myu+G4zy2Rl6h(nn3MeX2^^45VR%OT% z>(?sERG|WiNEHDg%8(I~fQnWSunuCGF7^m}NdQrxLIq@nJq2VF0wK)&&K=P9Yk%!? zJZ^#J+X~9>y$TZdI ztH?pJhr^{U&paEUJHy29WxazS8JN3Occ!W_aMM;*=6?MGt2Ba`rA2=@iOH0Gx zgD~Zcz#cI^`H8yNrIsC#bjtkWd2BueRi5uYC8z%PsyrWKa8H4_vP1`mG4l<`#Sodc z@OaCQ`}2wheKtF*Q>ZOXG;dA<5p=@AP9fm82BeE-wduNFph*q`=CuK{azt63WLIQ? zB6(0U)C)=GfcQpiroI+EO;k9l_ZMXD04;A<3+go) zA>QPzUkOcI^|`(w8`xMaF%E+_nnsB87=@IaV0OP+9~L@XUP`nxnVaKS>4K{$;<6&C zWt3&p!s&FE82Zb1S7gM$;Oi&?2!*u{bCK5D+q=&8w!Qr$aLL=!;nw_l@3qV?U~~OP zh6#Kac%F1;hLRpY=Hv=$0=K*dLFiGrya@Rz7b4fm&( z-<5|YCyz#?Q*&hEUC&iF!1G0xLQN-WmM?$l2!|{X(6lT;eOLoYY4A`NX|89Ww4Cdo zeRPp6T*h6W4VWE7TP3*4ZFFeD)Wr2-{o=B$r*Kt_H}hOIekV3{F-jp9_Uy|rs)y2a z%t=IJA*&3s0AgGX*Ei3kZ+qz%RE_`z7vT7ALEVFdl6PG{vrIJR=V+~-b}kB?4)LkG zJC~}7xO4#AE;E8ywLj7}cR8*#yij6-i&O!PHpZ=QQAv8!fz?d93{qlDGILJY9L=zW_l0m+4U@ z0${qwK^+Wbs&~sYx9qv;miAWUMbBVYr2v(P!YxP#&_Lq=1BV`GJAY|m zk;X7uK`!UMhW*w&9{(ERx>hb=6XE!bZ0?M(5aaOl+;krOu9fSiiEY+~ech=mIGEr@9gb^3 zJnH2H=pWkID~v-jz|EJ}f6FmXIhAy}h!@uZoxp2ePN;KRziL)g8vHNaP=Z#dKGPkU z<+e4o$wSxjufi-^;fkzI{{Om!E$?$Hm=~6@(JRKWSPa1L1c(V-)8hY%f$NZ%un%4i z7p~Pof?4S5bcLrPuW2K1MDudk!a<0}SUU~OCb&)loRW+T?*VUtZsX_6O*l6lPAVh< z00ULQ^1EJr>LEfExE5`|ea38#(w@x$THA72aWF3)m{7Z`DP&$6+bpQ7K4^DD6l`<< z=V@%v7qm#-UWd_5SlZk5pL2^5v~nwPwv@I%1Ry4V1++D<5}dLW4@34}1ANRR;4)vp zywV}ACr^3;vr6hg@rx_%3kvH1ZK7jo@qz8v_09B^H71|rAC@VBhfg0=$AKQ7w zYEQXwH(%Ze#p%y?dsyk|j&Fiw27Su#X#$#cX8m^0vY(m)hbr<+RDO&pAC{iRne<{(B?F4cT6aw(#l+@`)5QjVlgw;DdnFt_S~bjE+A(K{_ABnCJT-` zNMMX8z?n`v(7A&@uX;R7p=a#5z#;l#j0Dj(&8NjEPS3dRG?0}lBru^L>nyM!->Vj6 zn=HPTYIB!*7DdyXPCB5|u!mGe8nJ8@!sPKX4)(s7yP^HHvgUM}14dVCAN2HUhX%-~ zm+-jhOj|j#;P1)P+jf@0qk*NFmQAhR^NEG8B7|39Oe4XWv3BBwD7+T`Jkt2`J+0x-}UwaGHO)k{Z_DacyRy5$xEa# zaheTFucNnV|LeVCYXiF3PdH&$NDS4k3Vew0&in{oTP9wAgkkRE1>CLr;Wt zUSFnQyR$v&c>agH>TW&X;S(+}n2KE?-OicmnEo70l`5ieC?ZcWC%P>pp37a#xU3{J z&{JcmxUnA8!Uz;l8V~g2ajElK&>!~(8cw=OM)iBeWu!63sdmDv2z2imOAl(LL&rBB zFBETNEW@dS6L&(grb|2M^_Cm!KA~Z!TTr^lmB+~eE^;^-`n8l(P>Hq@=g{uvuE`HKI1s!_i3TY) z(7a77j>F!t`2PW z(dk)bE?pN~41yCK%waST5!6T>{}kOoKi)6;4n5IM4V|a?3yR znI<1V-1FOi=%KE`UrpJjRW3X9zf~la}9SGh%=#73yXZs2px)3Ol;Dmus}z%qH1k+G6Pf0#1g zP#F{rK)TNCk!OoGBF`{JU#;^c%>C9y*?3O0;71>EL=Rssd@U3C`bl`8U13OY`Ch}E zZtpZ7EEp7?-FouJ>(B$cXSspP8)lizkv(FSX;yis(oT4?VIx!dp0l2QlIa#=(~6>` zjvJ4{a>|5HBqoUCJf3ih*J&FSbZ;W;L8Z&S!WG-#^>aX4d(NGzdtkUnj6?2beUJ*Zr=XTIUtTH+43ed#UCqAzAWd{`e zT1XFPjus1(M_-dPgZaIzA722d8dujnDK-Y}kDI}TN~Ff?qPpNr$v4AW(u-BZkWpxI z#a1@Mcb{0Ksvl%qq{HNobq8OQw^?PZMic68*jvAMM88$JwGmA0tj~_=qTZdDy6E-D zrlYOzTW9Tu~_@Qs6n@)>iyk;B^xHu{BrWtr*lPoFnl-afNX^W_B zOJ=@@4~CoPii7+91Y*x8)eF;=?2uqXjz7&+@!Xu%EWI9EYhr8}0dOt(9E#V*{NlA-PLS!d&w=A?pum z@q31f2U+CC4&qq!@-4A*qm{UQ6&k%ES~2E+GG{rV4nMZ;C$_tY@-8z5F0)%-)+vrU zl)<>kweZ3C3@tA?MSjpamJ)} zmUvYFHJErY&%;yce#RwyV7iW?WhEU;ueE9FogzBYc_;Jraz|(L8$K9&88f;1^*X*6 zib7lT&Ci^6K5Z}XL5Vi>)s$UCu31pJh)R-2XK6{T>lkV9;f_~&#r1|e;Guke9->1x ztnZRcjw^~}4yx@#0dVOBQz4stKi#%Z8P4}$8UOy?3`@2C$`3bHM)P} z?4|93bKv?|vVn1%DohMCU1Xo9B{<{R^2FogS)*p^IVi9BpWmgfABEFj?{{fd{@5xj znvnr(w-6`klH!i>eKb7HIMDze@{ecLN3Pn>8f*78CI0o^WQ^Rmt{uORd!@|i4~-$k zmv8T9nqGfv{nyhz^}tV0Y~$@~QhvH(YXUkEcRm0S>Dl~0-*ux? zasufSvd=xYKD$Y?Yo@k{F|#ug?%wIS>hb7&Atqd6p5hzOsG}ExNE6R$qs_7ddz~m`H)iH3~=Y z_yq_;0r_066rz$fJp(O%zA3o5In*!>e6r~m2Fi3o_SlCyw22r&E@Qj?)A8FwvE#o$ zmJC)aw0D4DQ@xPd3_=OFgRStp*LGCg9lDD9@<2#|VE3|GRyhYe_dP&1(6MwddyzH} zvXWH+c_ZWJn9)r^K}uYYO;zFZy*&rJm4q+F*Va8A$&6MtnShGysB2ByNx^`KbbOGi zg+ijkd90NsDogzbSNu56F6GLhVu)t{V%)Jek*X|$3M#mYFRp27VgtFWcO!B4 zSNlN`C-S;#S$+6{r%euW)i%NM;!+L61Zq_n-0sgyFRt5xDE?=_Y7Qi@rr-1CuzhKY zYwCpy6fqm&Mxf>i;3rZ4#`FZs5_-qbM`GQ3jilZ%>l~0?Mc&agh3sYBAX~0oC%F?U zCh=cdEhI2P$fYG)AcNRPb5OI1-!aBz9x}I5>u=#A6#B^Hi*^*KCZl>wuT(EMChc<) z@L-cg2**}^~)7gdi)RIg|uc$(5AaX$Z$G?5yd0!k{`9~<0yW*|ppO(w?3 zb*av?=7n-Uv|st{CJHvfd@w3jU|=MjYAfKOVSuc0PRRNBfP6~ktOxl{bp*_*=}+S9 zPy*|ba(CFaG-()6Q)Ry`ssG$>iX_dOhahJ}I#kSQlZZlpjz1kTuCs(ssaW->YFLA_ z^kH`OL02MoX>ncWC^*vYvG*DtYk$!>cj_!02LqGuBQ^ifel(E}ZZ3THE=(#-L}g)b zS36{IS3aPjuTzun=@pbAbvYV5tszqW?cY)-V&d$06Q*`|*mmOT_oS^5WNk&->(Ks5 zZGMTHKHci?4%k8_&F7NnQ=|IK#)!K62{Ue+FmberO~K-PEwQVKhA3%(|(V`>Y?WHURCMejsY}~+iIBG+E=lYY zUX`)f(qP;9B0kMM7}0S}JD6SJW5>0KEE|G9oa7aWi@s-n=hMSr61pOYyEZPpo?mm8 zCQ@@i=jO^==@TdJPHo^jAt4Z|BC!T@_FhR%^^JjK&SszZRgY030vsjoOl&gVw&sk4 z#JX!=77p@Z&ery@?nTfP7bI0NqI$aU7EIt5g>v6^hsCIE+{+BZVle-b)5bQ>Cg3@; z9eJtZAKz1?{%yBp+(h8R*MtJNZUN@((GnKboy@B8qw|h+{E=1W+az#2oE&x!m?8B$ zF&l$-h!eO?SD5RfiY&aDeg{fh*suBuc3|c*dS%55fBm*2Oc@UM_P`O(fp2>wxN|5| zf_a2_VNPU6A1I|QbRT6}5%Td1FSw5H7{UwSBfFjAX{neTl{`MpUlX;RxadL1hfnMs z-`2;ha(^Wu!RO>SF4{gFc+SP466r$TMG?oUOoXIi|X-9T-2>=M`1|sOl{F7GnC|B z+UNO6Gv!RQg_bzhwCG5hYUI<50uy!xbD9P^>S4*=84$8~)hLXoJ+O&_@;yqUKP?=H zesv5Gf6@iyM=&|U^`=j?K{^Z6>%&X8Q%9z1V=a6U1d)f)u-Lkx1LxJZNo5W;>RLW!CED?Mbf zu-t24f3?ZL$YMfJvfq3l@7#sp&3=8!^qD{Q$)r2S$SESw>Is*?>asXB*gC?HhgbXLc zE82@@$5WSnNPtQPDB#zjwHgsq_Wz&)RJdV6(=4w&*sR|QI=0_Pii2(^VZl2k8N^%O zJQd$o1yU3Tubp_=q(gEp-vnu`BLp?M$OR9$pW*cKZ6Q!O(g6|8-!KNwYyAJA!n3c+ z^9?xBI7~y!hHMc;1UEPAi}X^WCBZ|?jH=gv33-EKotqo5efQ;oSOb5H8`5+6FhFH~ z4mtuG0ZAR{nwj;`K=lluFuYp;C`<*;t7r%)6`P|^z&qjT7$i`2jS<{1W{eC=&-msIkMp z>m7);3sJaA=rW2e`5xKE#8LT9qDJNKJ5qqFSvUP7ZElpZ{ddR~uz+bzueDJ;CQ7`Oib)t|d) zkzZOgt-o$;vfojP#8KGUVI%wu{y;Mpqk4%+?-%BB#@N_gpRkcyO?Dh#MxF1FCH~f4o!NW%^z?o~wb4r*^2qpb@PaXiTSL#;6+vFZWX2w*Tj#RRDPx#}!kM-P?g&v*0-sc)C_VWM;JGA(R?O{%#7nmd3P%~%WXq*@&RW{M!+G(R1d03nK1WmuVnxiCN5B%;oia&gLMB^XwO+E6J4sUAF^HwO z4YG5t=@RDQ95H&jaKLZmyiEmiGAJh(=HJC)xMoGF<2OBfYjnicOZCb|%Lmatco!Oq`BPDr7EY5b-*WXb_6Yu?y`+Pq=Ir-kd`?bI zVh#@NNA%QZ8HEeGRg1stz2O7n0;@e~&gCd!sRy6)9d+D%P#Qj^cf$w%-Dy%2W7sjc z*#m2dr|fz#e?W)jFWKP-eLuM^<&l*4%tEdiEU`{G8+Y;Qh$5)>6Gp<9v;k^C+P*Wt z3kKixq0HM7UUXYs3>TT8%)Oy$O?m_`mb9O9b9;zizZRa&^7*X+sIPOi_nf3d@D1nt z++AG?r4<#&@|48*zFY(2xtO=DxKj+2`CKx2lPXv^;O8f)?U?HK3t>Low}ejl5Gr-{ z1v=}?yt2q0X`xk7`I&P+?2+ZNgei5KChq7J=eU^#1io+&(CO$vsp$O4lN*>I>>OUUixk#RFY3Vj>V_RVieBx^`xQE zP?Tx3pl6#l6=TXBUAV-|!IIuul@|;R5a6bcbAQVD;0iuLm`^8#E?}pSpAX)X-1m!- z!BPaH^UCUiD~r>@R@yV>*aEd`S+w>0c;uVwSM^aA$M{vDHBIM21O3R3-XopP=D)vv z%e%(MvU<932fu)p_7z1-)apFzjy;8=S{Va#+(BE7(uIYEJg(4)qbeM~Hbv42~3eNlvw1pGjDF^U#IP9afbRWzg_gF)=a!hK2@bBJT#QJkNsw)li11LIK=2 zu~BZX=++B?!i63w1Kh!)7tm%PzPYC?P_neP)?^m%KOKCGbLuP{P}82q;jZrBW3KL$ TUcCS>V2&O(_&!DN?6v;~tCs&d diff --git a/agent-flow/docs/features/shape-data-validation/index.md b/agent-flow/docs/features/shape-data-validation/index.md deleted file mode 100644 index 153c6bd..0000000 --- a/agent-flow/docs/features/shape-data-validation/index.md +++ /dev/null @@ -1,289 +0,0 @@ -#
agent-flow中节点表单的校验
- ------- - -## 需求背景 - -应用需要支持导入导出,在导入应用以后需要对应用的数据进行校验。当前覆盖范围有【知识检索-知识库】、【大模型-模型、插件】、【插件节点】、【智能表单节点-表单】、【结束节点-表单】 - -在设计稿中,对于校验失败的节点需要外框变为红色。 - -![img](design-picture.png) - -## 方案设计 - -由于应用导入后所依赖的插件、模型、知识库、表单等信息需要查询接口获取。并且错误信息在进入应用页面,还未进入编排页面时就需要进行展示,此时agent-flow还未被加载。以上信息的存储位置是agent-flow定义,因此提取逻辑也应由agent-flow完成才合适。 - -基于以上背景,设计校验流程如下: - -1.前端获取到graph后调用agent-flow提供对json格式的graph单独提取校验信息的接口,此接口不需要加载流程。 - -2.前端获取到需要校验的信息后,调用后端接口对信息进行校验。 - -3.前端右侧浮窗展示校验结果。 - -4.进入编排页面,对于校验失败项,需要高亮;包含校验失败项的图形需要红框包裹。 - -5.修改校验失败项后,该项高亮去除,右侧浮窗中对应校验结果去除。 - -6.一个图形中所有校验失败项去除后,该图形包裹边框变回蓝色。 - -附加项:在编排页面中点击右侧浮窗中具体图形,画布中心需要切换至该图形位置。 - - - -**过程示意图** - -```plantuml -actor AppDeveloper -participant "frontend" as FR -participant "agent-flow" as ER -participant "backend" as BA - -AppDeveloper -> FR : import App -activate AppDeveloper -activate FR -FR -> ER : Graph(JSON) -ER --> FR : Information to be verified -deactivate ER -activate BA -FR -> BA : Perform verification -BA --> FR : Verification result -deactivate BA -FR -> FR : Display verification result -activate ER -FR -> ER : Verification result displayed on the workflow page -AppDeveloper -> ER : Change invalid data -ER --> FR : Update the verification result. -deactivate ER -deactivate FR -deactivate AppDeveloper -``` - -## 数据结构设计 - -传入json类型的graph后,elsa返回需要校验信息: - -```json -[ - { - "type": "llmNodeState", - "nodeInfos": [ - { - "nodeId": "jadewdnjbq", - "nodeName": "大模型", - "configs": [ - { - "configCheckId": "db5fdafa-4cbf-44ba-9cca-8a98f1f77111", - "configName": "accessInfo", - "serviceName": "Fake Model", - "tag": "INTERNAL" - }, - { - "configCheckId": "ff895dfd-09b8-47b4-a0a0-04b5b83e8cd5", - "configName": "plugin", - "uniqueName": "92d4e409-ea01-45aa-8abc-d7f63ded531d" - }, - { - "configCheckId": "4ab1a267-96c4-4d17-966b-813bfa9142d4", - "configName": "plugin", - "uniqueName": "c04cee50-13e4-499b-a008-077459a2e552" - }, - { - "configCheckId": "ff895dfd-09b8-47b4-a0a0-04b5b83e8cd5", - "configName": "plugin", - "uniqueName": "92d4e409-ea01-45aa-8abc-d7f63ded531e" - }, - { - "configCheckId": "4ab1a267-96c4-4d17-966b-813bfa9142d4", - "configName": "plugin", - "uniqueName": "c04cee50-13e4-499b-a008-077459a2e553" - } - ] - } - ] - } -] -``` - -后端的校验结果: - -```json -[ - { - "nodeId": "jadewdnjbq", - "name": "大模型", - "type": "llmNodeState", - "isValid": false, - "configChecks": [ - { - "configCheckId": "db5fdafa-4cbf-44ba-9cca-8a98f1f77111", - "configName": "accessInfo", - "serviceName": "Fake Model", - "tag": "INTERNAL" - }, - { - "configCheckId": "ff895dfd-09b8-47b4-a0a0-04b5b83e8cd5", - "configName": "plugin", - "uniqueName": "92d4e409-ea01-45aa-8abc-d7f63ded531d" - }, - { - "configCheckId": "ff895dfd-09b8-47b4-a0a0-04b5b83e8cd5", - "configName": "plugin", - "uniqueName": "92d4e409-ea01-45aa-8abc-d7f63ded531e" - }, - { - "configCheckId": "4ab1a267-96c4-4d17-966b-813bfa9142d4", - "configName": "plugin", - "uniqueName": "c04cee50-13e4-499b-a008-077459a2e553" - } - ] - } -] -``` - -为了实现上方的4和5,需要改造原有对外公开的validate接口,改为可以传入validateInfo。 - -1.当validateInfo未传入时与原来逻辑一致,直接进行校验,返回校验结果。 - -2.当传入validateInfo时,更新系统中的validateInfo,需要进行特殊校验的表单项与validateInfo进行对比,不符合特殊校验规则就报错。 - -3.对系统中validateInfo进行监听,一旦validateInfo被修改,需要通知前端。 - -由于用户只会主动修改data,并不会主动修改validateInfo,因此在data进行变化时,需要验证validateInfo是否已经失效,若失效需要主动更新validateInfo。 - -实现上述功能需要修改原有onChangeCallback方法,在原有onChangeCallback直接进行callback之前,先进行validateInfo的校验,若shape的任意一个validateInfo已失效则剔除,若shape已没有validateInfo则整个shape信息从validateInfo中去除。 - -## 关键模块设计 - -### validate方法改造 -改造validate方法,使其可以传入validateInfo,并且传入validateInfo被修改时调用的refresh方法 - -```plantuml -participant "frontend" as FR -participant "agent-flow" as ER - -FR -> ER : Transfer validateInfo and refresh function -activate FR -activate ER -ER -> ER : Listen to the changes of validateInfo -ER -> FR : invoke refresh function -deactivate ER -deactivate FR -``` - - -### onChangeCallback方法改造 -改造onChangeCallback,增加对validateInfo的校验与更新 - -```plantuml -participant "graph" as Graph -participant "shape" as Shape - -activate Graph -activate Shape -Shape -> Graph : Data changed invoke onChangeCallback -Graph -> Graph : Update validateInfo -deactivate Graph -deactivate Shape -``` - - -### 新增ShapeDataValidationProcessor模块 -增加ShapeDataValidationProcessor,每一类需要有特殊校验逻辑的shape自行重写extractValidationInfo和isValidationInfoValid方法 - -```javascript -/** - * 普通节点处理器. - * - * @param shape 节点信息。 - * @return {{}} - */ -const normalDataValidationProcessor = (shape) => { - const self = {}; - self.shape = shape; - - /** - * 提取校验信息. - */ - self.extractValidationInfo = () => { - return null; - }; - - /** - * 验证校验信息是否合法. - */ - self.isValidationInfoValid = () => { - return true; - }; - - return self; -}; -``` - -## 当前shape中form校验现状 - -1.调用unselect的时候,触发整个shape中form的校验 - -2.调用page的validate时,触发整个page中所有shape对应form的校验 - -3.item中数据变化时,触发此item的校验 - - - -## 目标 - -### 红边框出现逻辑: - -红边框在shape失焦时,若shape中有表单项校验未通过,则出现;若shape中所有表单项均校验通过,则消失。 - -触发整个页面的校验时,其中校验不通过的shape出现红框。 - -### 红边框消失逻辑: - -在shape已经为红边框的前提下,该shape中数据有更改时触发shape的校验逻辑,若校验通过,则红边框消失。 - - - -## 设计方案 - -### 红边框出现逻辑: - -```plantuml -actor AppDeveloper -participant "agent-flow" as ER -participant "ShapeBorderColor" as SBC - -AppDeveloper -> ER : shape onblur -activate AppDeveloper -activate ER -activate SBC -ER -> SBC : render red color(if form validation has error) -deactivate ER -deactivate SBC - -AppDeveloper -> ER : page validate -activate ER -activate SBC -ER -> SBC : render red color(if form validation has error) -deactivate AppDeveloper -deactivate ER -deactivate SBC -``` - -### 红边框消失逻辑: - -```plantuml -actor AppDeveloper -participant "agent-flow" as ER -participant "ShapeBorderColor" as SBC - -AppDeveloper -> ER : Change data -activate AppDeveloper -activate ER -activate SBC -ER -> SBC : render blue color(if shape has error before and form verification is successful) -deactivate AppDeveloper -deactivate ER -deactivate SBC -``` diff --git a/agent-flow/index.html b/agent-flow/index.html deleted file mode 100644 index 86fa92c..0000000 --- a/agent-flow/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - Vite + React - - -
- - - diff --git a/agent-flow/package.json b/agent-flow/package.json deleted file mode 100644 index 1547952..0000000 --- a/agent-flow/package.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "name": "@fit-elsa/agent-flow", - "private": false, - "version": "1.0.0-alpha.8", - "type": "module", - "main": "./build/agent-flow.js", - "module": "./build/agent-flow.js", - "files": [ - "build", - "src/i18n" - ], - "exports": { - ".": { - "import": "./build/agent-flow.js", - "require": "./build/agent-flow.umd.cjs" - }, - "./locales/en.json": "./src/i18n/en_US.json", - "./locales/zh.json": "./src/i18n/zh_CN.json" - }, - "scripts": { - "dev": "vite", - "build": "vite build", - "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview" - }, - "dependencies": { - "@ant-design/icons": "5.3.0", - "@fit-elsa/elsa": "1.0.2", - "@tinymce/tinymce-react": "4.3.0", - "antd": "4.24.13", - "axios": "^1.12.0", - "monaco-editor": "^0.34.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "uuid": "^9.0.1" - }, - "devDependencies": { - "@types/react": "^18.2.66", - "@types/react-dom": "^18.2.22", - "@vitejs/plugin-react": "^4.2.1", - "eslint": "^8.57.0", - "eslint-plugin-react": "^7.34.1", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.6", - "i18next": "^21.6.0", - "react-i18next": "^11.18.3", - "vite": "^5.2.0", - "vite-plugin-libcss": "^1.1.1", - "vite-plugin-svgr": "^4.2.0" - }, - "overrides": { - "rc-util": "5.43.0", - "rc-motion": "2.9.2", - "rc-resize-observer": "1.4.0", - "rollup": "4.39.0" - } -} diff --git a/agent-flow/src/App.jsx b/agent-flow/src/App.jsx deleted file mode 100644 index 7542406..0000000 --- a/agent-flow/src/App.jsx +++ /dev/null @@ -1,339 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved. - * This file is a part of the ModelEngine Project. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import {useEffect, useRef, useState} from 'react'; -import {JadeFlow} from './flow/jadeFlowEntry.jsx'; -import {graphData} from './testFlowData.js'; -import {Button} from 'antd'; -import {CodeDrawer} from '@/components/common/code/CodeDrawer.jsx'; -import 'antd/dist/antd.css'; -import {createGraphOperator} from '@/data/GraphOperator.js'; -import {v4 as uuidv4} from 'uuid'; - -function App({i18n}) { - const [open, setOpen] = useState(false); - const ctlRef = useRef(); - const agentRef = useRef(); - - useEffect(() => { - const stage = document.getElementById('stage'); - const configs = []; - configs.push({ - node: 'startNodeStart', - urls: {customHistoryUrl: ''}, - }); - configs.push({ - node: 'llmNodeState', urls: { - llmModelEndpoint: '', - toolListEndpoint: '', - workflowListEndpoint: '', - }, params: { - tenantId: '', appId: '', - }, - }); - configs.push({ - node: 'knowledgeState', - urls: {knowledgeUrl: ''}, - }); - configs.push({ - node: 'fitInvokeState', urls: { - serviceListEndpoint: '', - fitableMetaInfoUrl: '', - }, - }); - configs.push({ - node: 'manualCheckNodeState', - urls: {runtimeFormUrl: ''}, - }); - configs.push({ - node: 'codeNodeState', urls: { - testCodeUrl: '', - }, - }); - configs.push({ - node: 'replyNodeState', urls: { - testCodeUrl: '', - }, - }); - configs.push({ - node: 'evaluationAlgorithmsNodeState', urls: { - evaluationAlgorithmsUrl: '', - }, - }); - configs.push({ - node: 'evaluationTestSetNodeState', urls: { - datasetUrlPrefix: '', - }, - }); - configs.push({ - node: 'queryOptimizationNodeState', - urls: { - llmModelEndpoint: '', - }, - }); - configs.push({ - node: 'textConcatenateNodeState' - }); - - JadeFlow.edit({ - div: stage, - tenant: '1111', - appId: 'xxx', - flowConfigData: graphData, - configs: configs, - i18n: i18n, - }).then(agent => { - window.agent = agent; - window.operator = createGraphOperator(JSON.stringify(graphData)); - agentRef.current = agent; - agent.onModelSelect((onModelSelectedCallback) => { - onModelSelectedCallback.onSelect({name: 'zy-model'}); - }); - agent.onCreateButtonClick(() => { - }); - agent.onChange(() => { - }); - agent.onKnowledgeSearchArgsSelect(({callback}) => { - callback({ - indexType: { - type: 'enum-string', - name: '语义检索', - description: 'sdfsdfsdfsdfsdf', - }, - similarityThreshold: 0.5, - referenceLimit: { - type: 'TOPK', - value: 4, - }, - rerankParam: { - enableRerank: true, - }, - }); - }); - agent.onKnowledgeBaseSelect((context) => { - context.onSelect([ - { - id: '1', - name: 'ssdfsdf速度快放假水电费', - description: '', - type: 'VECTOR', - createdAt: '2024-10-22 09:47:31', - checked: true, - }, - ]); - }); - agent.onAddInputParam(({ onAdd, existParam }) => { - const mockParam = { - id: 'input_' + uuidv4(), - name: 'userAge', - type: 'Boolean', - value: '', - displayName: 'test', - isRequired: true, - isVisible: true, - disableModifiable: false, - appearance: {}, - }; - - // 直接调用回调,模拟弹窗“确认”后的行为 - onAdd(mockParam); - console.log(existParam); - }); - - agent.onEditInputParam(({id, onEdit, selectedParam }) => { - const mockParam = { - id: id, - name: 'userAge', - type: 'String', - value: '', - displayName: 'test', - isRequired: true, - isVisible: true, - disableModifiable: false, - appearance: {}, - }; - - // 直接调用回调,模拟弹窗“确认”后的行为 - onEdit(mockParam); - - console.log(selectedParam); - }); - agent.listen('GENERATE_AI_PROMPT', (event) => { - event.applyPrompt('123'); - }); - agent.listen('SELECT_KNOWLEDGE_BASE_GROUP', (event) => { - event.onSelect('groupIdTest'); - }); - }); - }, []); - - const runTest = () => { - ctlRef.current = agentRef.current.run(); - setTimeout(() => { - ctlRef.current.refresh([ - { - parameters: [ - { - input: '{\"useMemory\":false,\"chatId\":\"9f1c069ec8224b7d93e72fa402217ebd\",\"Question\":\"11111\"}', - output: '{\"useMemory\":false,\"chatId\":\"9f1c069ec8224b7d93e72fa402217ebd\",\"Question\":\"11111\"}', - }, - ], - nodeId: 'jade6qm5eg', - nodeType: 'START', - startTime: 1724772633987, - runCost: 0, - status: 'ARCHIVED', - errorMsg: '', - }, - { - parameters: [ - { - input: '{\"query\":\"11111\",\"maximum\":3,\"knowledge\":[{}]}', - output: '{\"output\":{\"retrievalOutput\":\"\"}}', - }, - ], - nodeId: 'jade0pg2ag', - nodeType: 'STATE', - startTime: 1724772634000, - runCost: 47, - status: 'ARCHIVED', - errorMsg: '', - }, - ]); - setTimeout(() => { - ctlRef.current.stop([ - { - parameters: [ - { - input: '{\"chatId\":\"2ad84f7cbc2445798dc62d219f0fca42\",\"Question\":\"11111\"}', - output: '{\"chatId\":\"2ad84f7cbc2445798dc62d219f0fca42\",\"Question\":\"11111\"}', - }, - ], - nodeId: 'jade6qm5eg', - nodeType: 'START', - startTime: 1725290745940, - runCost: 0, - status: 'ARCHIVED', - errorMsg: '', - }, - { - parameters: [ - { - input: '{\"query\":\"11111\",\"maximum\":3,\"knowledge\":[{}]}', - output: '{\"output\":{\"retrievalOutput\":\"\"}}', - }, - ], - nodeId: 'jade0pg2ag', - nodeType: 'STATE', - startTime: 1725290745958, - runCost: 27, - status: 'ARCHIVED', - errorMsg: '', - }, - { - parameters: [ - { - input: '{\"branches\":[{\"conditionRelation\":\"and\",\"conditions\":[{\"condition\":\"equal\",\"left\":{\"type\":\"String\",\"value\":\"\",\"key\":\"jade0pg2ag.output.retrievalOutput\"},\"right\":{\"type\":\"String\",\"value\":\"123123\"}},{\"condition\":\"equal\",\"left\":{\"type\":\"String\",\"value\":\"11111\",\"key\":\"jade6qm5eg.Question\"},\"right\":{\"type\":\"String\",\"value\":\"2222\"}}]},{\"conditionRelation\":\"and\",\"conditions\":[{\"condition\":\"true\"}]}]}', - output: null, - }, - ], - errorMsg: 'Condition rule parse error. Condition Rule: (businessData.get(\"_internal\").get(\"outputScope\").get(\"jadeih9c4h\").get(\"output\").isEmpty())', - nodeId: 'jade62q33k', - nodeType: 'CONDITION', - startTime: 1725290746003, - runCost: 39, - status: 'ERROR', - }, - { - parameters: [ - { - input: '{\"finalOutput\":\"008a734011be4473ac87c268342b4630\"}', - output: null, - }, - ], - nodeId: 'jadesoux5i', - nodeType: 'END', - startTime: 1725290746284, - runCost: 63, - status: 'ARCHIVED', - errorMsg: '', - }, - ]); - }, 2000); - }, 500); - }; - - const runReset = () => { - ctlRef.current && ctlRef.current.reset(); - }; - - return (<> -
-
- - - - - - - - - -
-
- Output:\n return ret', - suggestions: [{label: 'zyyyyyyyyyyyy', insertText: 'zyyyyyyyyyyyy'}], - }} - onClose={() => setOpen(false)} - onConfirm={(v) => { - // 这里对编辑后的代码进行处理 - }} - executeFunc={(args, language, callback) => { - // 这里调用执行代码的接口 - - // 接口返回的output通过callback传递给组件,展示output - }}/> -
- ); -} - -export default App; diff --git a/agent-flow/src/common/Consts.js b/agent-flow/src/common/Consts.js deleted file mode 100644 index d929a08..0000000 --- a/agent-flow/src/common/Consts.js +++ /dev/null @@ -1,290 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved. - * This file is a part of the ModelEngine Project. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import {v4 as uuidv4} from 'uuid'; - -export const NODE_STATUS = { - RUNNING: 'RUNNING', - ERROR: 'ERROR', - SUCCESS: 'ARCHIVED', - DEFAULT: 'DEFAULT', - UN_RUNNING: 'UN_RUNNING', - TERMINATED: 'TERMINATED', -}; - -export const SECTION_TYPE = { - CONDITION: 'condition', - DEFAULT: 'default', -}; - -export const UNARY_OPERATOR = { - IS_EMPTY: 'is empty', - IS_NOT_EMPTY: 'is not empty', - IS_EMPTY_STRING: 'is empty string', - IS_NOT_EMPTY_STRING: 'is not empty string', - IS_TRUE: 'is true', - IS_FALSE: 'is false', - IS_NULL: 'is null', - IS_NOT_NULL: 'is not null', -}; - -export const BINARY_OPERATOR = { - LONGER_THAN: 'longer than', - LONGER_THAN_OR_EQUAL: 'longer than or equal', - SHORTER_THAN: 'shorter than', - SHORTER_THAN_OR_EQUAL: 'shorter than or equal', - STARTS_WITH: 'starts with', - ENDS_WITH: 'ends with', - EQUAL: 'equal', - NOT_EQUAL: 'not equal', - CONTAINS: 'contains', - DOES_NOT_CONTAIN: 'does not contain', - GREATER_THAN: 'greater than', - GREATER_THAN_OR_EQUAL: 'greater than or equal', - LESS_THAN: 'less than', - LESS_THAN_OR_EQUAL: 'less than or equal', -}; - -export const VIRTUAL_CONTEXT_NODE = { - id: '_systemEnv', - name: 'systemEnv', -}; - -export const VIRTUAL_CONTEXT_NODE_VARIABLES = { - INSTANCE_ID: 'instanceId', - APP_ID: 'appId', - MEMORIES: 'memories', - USE_MEMORY: 'useMemory', - USER_ID: 'userId', - FILE_URLS: 'fileUrls', - CHAT_ID: 'chatId', - IS_GUEST: 'isGuest', - APP_CREATE_BY: 'appCreateBy', -}; - -export const CONNECTOR = { - RADIUS: 6, - CONDITION_RADIUS: 4, -}; - -export const SOURCE_PLATFORM = { - OFFICIAL: 'official', - HUGGING_FACE: 'huggingface', - LLAMA_INDEX: 'llamaindex', - LANG_CHAIN: 'langchain', -}; - -export const DATA_TYPES = { - STRING: 'String', - INTEGER: 'Integer', - BOOLEAN: 'Boolean', - NUMBER: 'Number', - OBJECT: 'Object', - ARRAY: 'Array', -}; - -export const OBSERVER_STATUS = { - ENABLE: 'enable', - DISABLE: 'disable', -}; - -export const EVALUATION_ALGORITHM_NODE_CONST = { - ALGORITHM: 'algorithm', - UNIQUE_NAME: 'uniqueName', - PASS_SCORE: 'passScore', - IS_PASS: 'isPass', - SCORE: 'score', -}; - -export const FLOW_TYPE = { - APP: 'app', - WORK_FLOW: 'workflow', -}; - -export const FROM_TYPE = { - EXPAND: 'Expand', - INPUT: 'Input', - REFERENCE: 'Reference', -}; - -export const DEFAULT_FLOW_META = '{"triggerMode":"auto","jober":{"type":"STORE_JOBER","name":"","fitables":[],"converter":{"type":"mapping_converter"},"entity":{"uniqueName":"","params":[],"return":{"type":""}}},"joberFilter":{"type":"MINIMUM_SIZE_FILTER","threshold":1}}'; - -export const TOOL_TYPE = { - WATER_FLOW: 'WATERFLOW', - TOOL: 'TOOL', -}; - -export const HTTP_METHOD_TYPE = { - GET: 'get', - POST: 'post', - PUT: 'put', - DELETE: 'delete', - PATCH: 'patch', -}; - -export const HTTP_BODY_TYPE = { - X_WWW_FORM_URLENCODED: 'x-www-form-urlencoded', - JSON: 'json', - TEXT: 'text', -}; - -export const END_NODE_TYPE = { - VARIABLES: 'variables', - MANUAL_CHECK: 'manualCheck', -}; - -export const EVENT_NAME = { - NODE_NAME_CHANGED: 'NODE_NAME_CHANGED', -}; - -export const DEFAULT_KNOWLEDGE_REPO_GROUP = 'default'; - -export const DEFAULT_AP_PROMPT_MODEL_CONFIG = { - MODEL: 'Qwen1.5-32B-Chat', - TEMPERATURE: '0.3', -}; -export const SYSTEM_ACTION = { - JADE_NODE_CONFIG_CHANGE: 'jade_node_config_change', - PAGE_DATA_CHANGED: 'page_data_changed', -}; - -export const DEFAULT_MAX_MEMORY_ROUNDS = { - id: uuidv4(), - name: 'maxMemoryRounds', - type: DATA_TYPES.INTEGER, - from: FROM_TYPE.INPUT, - value: '3', -}; - -export const DEFAULT_LLM_KNOWLEDGE_BASES = { - id: uuidv4(), - from: FROM_TYPE.EXPAND, - name: 'knowledgeBases', - type: DATA_TYPES.ARRAY, - value: [], -}; - -export const DEFAULT_LLM_REFERENCE_OUTPUT = { - id: uuidv4(), - from: FROM_TYPE.INPUT, - name: 'reference', - description: '', - type: DATA_TYPES.ARRAY, - value: [], -}; - -export const DEFAULT_KNOWLEDGE_REPO_GROUP_STRUCT = { - id: uuidv4(), - name: 'groupId', - type: DATA_TYPES.STRING, - from: FROM_TYPE.INPUT, - value: DEFAULT_KNOWLEDGE_REPO_GROUP, -}; - -export const RENDER_TYPE = { - SELECT: 'Select', - RADIO: 'Radio', - INPUT: 'Input', - SWITCH: 'Switch', - CHECK_BOX: 'CheckBox', - LABEL: 'Label', -}; - -export const DEFAULT_ADD_TOOL_NODE_CONTEXT = { - id: uuidv4(), - name: 'context', - type: DATA_TYPES.OBJECT, - from: FROM_TYPE.EXPAND, - value: [{ - id: uuidv4(), - name: VIRTUAL_CONTEXT_NODE_VARIABLES.INSTANCE_ID, - type: DATA_TYPES.STRING, - from: FROM_TYPE.REFERENCE, - referenceId: VIRTUAL_CONTEXT_NODE_VARIABLES.INSTANCE_ID, - referenceKey: VIRTUAL_CONTEXT_NODE_VARIABLES.INSTANCE_ID, - referenceNode: VIRTUAL_CONTEXT_NODE.id, - value: [VIRTUAL_CONTEXT_NODE_VARIABLES.INSTANCE_ID], - }], -}; - -export const DEFAULT_KNOWLEDGE_RETRIEVAL_NODE_KNOWLEDGE_CONFIG_ID = { - id: `knowledgeConfigId_${uuidv4()}`, - name: 'knowledgeConfigId', - type: DATA_TYPES.STRING, - from: FROM_TYPE.INPUT, - value: '', -}; - -export const DEFAULT_MCP_SERVERS = { - id: uuidv4(), - name: "mcpServers", - type: DATA_TYPES.OBJECT, - from: FROM_TYPE.INPUT, - value: {} -}; - -export const DEFAULT_KNOWLEDGE_NODE_ACCESS_INFO = { - id: uuidv4(), - name: 'accessInfo', - type: DATA_TYPES.OBJECT, - from: FROM_TYPE.EXPAND, - value: [{ - id: uuidv4(), - name: 'serviceName', - type: DATA_TYPES.STRING, - from: FROM_TYPE.INPUT, - value: '', - }, { - id: uuidv4(), - name: 'tag', - type: DATA_TYPES.STRING, - from: FROM_TYPE.INPUT, - value: '', - }], -}; - -export const DEFAULT_KNOWLEDGE_NODE_RERANK_TOP_N = { - id: uuidv4(), - name: 'topN', - type: DATA_TYPES.INTEGER, - from: FROM_TYPE.INPUT, - value: 3, -}; - -export const DEFAULT_KNOWLEDGE_RETRIEVAL_NODE_EXTENSIONS = { - id: `knowledgeExtensions_${uuidv4()}`, - name: 'extensions', - type: DATA_TYPES.OBJECT, - from: FROM_TYPE.EXPAND, - value: [{ - id: uuidv4(), - name: VIRTUAL_CONTEXT_NODE_VARIABLES.USER_ID, - type: DATA_TYPES.STRING, - from: FROM_TYPE.REFERENCE, - referenceId: VIRTUAL_CONTEXT_NODE_VARIABLES.USER_ID, - referenceKey: VIRTUAL_CONTEXT_NODE_VARIABLES.USER_ID, - referenceNode: VIRTUAL_CONTEXT_NODE.id, - value: [VIRTUAL_CONTEXT_NODE_VARIABLES.USER_ID], - }, { - id: uuidv4(), - name: VIRTUAL_CONTEXT_NODE_VARIABLES.IS_GUEST, - type: DATA_TYPES.BOOLEAN, - from: FROM_TYPE.REFERENCE, - referenceId: VIRTUAL_CONTEXT_NODE_VARIABLES.IS_GUEST, - referenceKey: VIRTUAL_CONTEXT_NODE_VARIABLES.IS_GUEST, - referenceNode: VIRTUAL_CONTEXT_NODE.id, - value: [VIRTUAL_CONTEXT_NODE_VARIABLES.IS_GUEST], - }, { - id: uuidv4(), - name: VIRTUAL_CONTEXT_NODE_VARIABLES.APP_CREATE_BY, - type: DATA_TYPES.STRING, - from: FROM_TYPE.REFERENCE, - referenceId: VIRTUAL_CONTEXT_NODE_VARIABLES.APP_CREATE_BY, - referenceKey: VIRTUAL_CONTEXT_NODE_VARIABLES.APP_CREATE_BY, - referenceNode: VIRTUAL_CONTEXT_NODE.id, - value: [VIRTUAL_CONTEXT_NODE_VARIABLES.APP_CREATE_BY], - }], -}; \ No newline at end of file diff --git a/agent-flow/src/components/AdvancedConfiguration.jsx b/agent-flow/src/components/AdvancedConfiguration.jsx deleted file mode 100644 index 0f5ae8e..0000000 --- a/agent-flow/src/components/AdvancedConfiguration.jsx +++ /dev/null @@ -1,109 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved. - * This file is a part of the ModelEngine Project. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import {useState} from 'react'; -import {Button, Input, Modal, Popover, Switch} from 'antd'; -import {QuestionCircleOutlined} from '@ant-design/icons'; -import PropTypes from 'prop-types'; - -const {TextArea} = Input; - -/** - * 高级配置. - * - * @param data 数据. - * @param disabled 是否禁用. - * @param onConfirm 当点击确认时的回调. - * @param isAdvancedConfigurationOpen 组件是否需要打开. - * @param setAdvancedConfigurationOpen 组件打开设置修改方法. - * @return {JSX.Element} - * @constructor - */ -export const AdvancedConfiguration = ({data, - disabled, - onConfirm, - isAdvancedConfigurationOpen, - setAdvancedConfigurationOpen}) => { - const [stageData, setStageData] = - useState({enableStageDesc: data.enableStageDesc, stageDesc: data.stageDesc}); - - const onModalOk = () => { - onConfirm(stageData); - setAdvancedConfigurationOpen(false); - }; - - const onModalCancel = () => { - setAdvancedConfigurationOpen(false); - }; - - const advancedConfigurationContent = ( - <> -
-

说明:是否在节点运行前,打印过

-

程信息,告知用户当前在做什么操

-

作。如:数据库查询中...

-
- ); - - const handleProcessInfoSwitchChange = (e) => { - if (e === false) { - setStageData({...stageData, enableStageDesc: e, stageDesc: ''}); - } else { - setStageData({...stageData, enableStageDesc: e}); - } - }; - - const handleProcessInfoChange = (e) => { - setStageData({...stageData, stageDesc: e.target.value}); - }; - - return (<> - - - - , - ]}> -
- 是否打印过程信息 - - - - handleProcessInfoSwitchChange(e)} - checked={stageData?.enableStageDesc ?? false}> -
- {stageData.enableStageDesc && ( - <> - 请输入过程信息 -