@yiyi_zhang/reactflow-ui 1.3.1 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AiWorkflowIDE.d.ts +17 -3
- package/dist/WorkflowIDE.d.ts +14 -1
- package/dist/components/ConfirmDialog.d.ts +1 -1
- package/dist/components/UnsavedRunNotice.d.ts +16 -0
- package/dist/components/template/quickRunNotice.d.ts +13 -0
- package/dist/hooks/useConfirm.d.ts +1 -1
- package/dist/hooks/useShortcuts.d.ts +1 -1
- package/dist/reactflow-ui-ai.es.js +9396 -9073
- package/dist/reactflow-ui.css +1 -1
- package/dist/reactflow-ui.es.js +7865 -7499
- package/dist/reactflow-ui.umd.js +61 -61
- package/dist/sample-workflows/complex-workflow.json +8 -4
- package/dist/sample-workflows/decision-workflow.json +1 -0
- package/dist/sample-workflows/ecs-lifecycle-automation.json +1 -0
- package/dist/services/ai/agentRunner.d.ts +4 -0
- package/dist/services/ai/systemPrompt.d.ts +1 -1
- package/dist/store/aiStore.d.ts +20 -2
- package/dist/store/workflowStore.d.ts +6 -0
- package/dist/types/workflow.d.ts +18 -0
- package/dist/utils/hostSave.d.ts +10 -0
- package/dist/utils/localSandboxEngine.d.ts +8 -0
- package/dist/utils/sameWorkflow.d.ts +6 -0
- package/dist/utils/sandbox/scriptRunner.d.ts +11 -7
- package/dist/utils/sandbox/switchHints.d.ts +17 -0
- package/dist/utils/validationRules.d.ts +21 -10
- package/package.json +1 -1
|
@@ -154,6 +154,7 @@
|
|
|
154
154
|
"name": "publish_event",
|
|
155
155
|
"taskReferenceName": "event_ref",
|
|
156
156
|
"type": "EVENT",
|
|
157
|
+
"sink": "conductor",
|
|
157
158
|
"inputParameters": {
|
|
158
159
|
"event": "workflow_completed",
|
|
159
160
|
"data": "${sub_wf_ref.output}"
|
|
@@ -166,10 +167,13 @@
|
|
|
166
167
|
"taskReferenceName": "notify_ref",
|
|
167
168
|
"type": "KAFKA_PUBLISH",
|
|
168
169
|
"inputParameters": {
|
|
169
|
-
"
|
|
170
|
-
|
|
171
|
-
"
|
|
172
|
-
"
|
|
170
|
+
"kafka_request": {
|
|
171
|
+
"bootStrapServers": "localhost:9092",
|
|
172
|
+
"topic": "workflow-notifications",
|
|
173
|
+
"value": {
|
|
174
|
+
"workflowId": "${workflow.workflowId}",
|
|
175
|
+
"status": "completed"
|
|
176
|
+
}
|
|
173
177
|
}
|
|
174
178
|
}
|
|
175
179
|
}
|
|
@@ -45,6 +45,10 @@ export interface SendOptions {
|
|
|
45
45
|
* 例如"执行方案"要附上计划步骤、澄清选项要附上原问题。
|
|
46
46
|
*/
|
|
47
47
|
modelText?: string;
|
|
48
|
+
/**
|
|
49
|
+
* A18:有未完成的断点时,默认先不发送,交给界面让用户选择;传 true 表示用户已确认放弃断点。
|
|
50
|
+
*/
|
|
51
|
+
discardCheckpoint?: boolean;
|
|
48
52
|
}
|
|
49
53
|
/** 把待执行计划整理成随"执行方案"一起发给模型的文本(计划卡片的步骤不在聊天记录里) */
|
|
50
54
|
export declare function formatPlanForModel(plan: {
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
import type { WorkflowSnapshot } from './contextEngine';
|
|
12
12
|
import type { WorkflowLibraryItem } from '../../types/workflowLibrary';
|
|
13
13
|
import type { ViewMode } from '../../types/workflow';
|
|
14
|
-
export declare const BASE_SYSTEM_PROMPT = "\u4F60\u662F Netflix Conductor \u5DE5\u4F5C\u6D41\u5EFA\u6A21\u4E13\u5BB6 AI \u52A9\u624B\u3002\u5E2E\u52A9\u7528\u6237\u901A\u8FC7\u81EA\u7136\u8BED\u8A00\u8BBE\u8BA1\u548C\u7F16\u8F91\u9AD8\u53EF\u9760\u6027\u7684 Conductor JSON \u5DE5\u4F5C\u6D41\u3002\n\n## \u6838\u5FC3\u5DE5\u4F5C\u6D41\u751F\u6210\u7B56\u7565\uFF08\u81EA\u9002\u5E94\u590D\u6742\u5EA6\u8DEF\u7531\uFF09\n\n### \u7B56\u7565 A\uFF1A\u56DB\u9636\u6BB5\u6E10\u8FDB\u5F0F\u6784\u5EFA\u7B56\u7565\uFF08\u9002\u7528\u4E8E\uFF1A\u4ECE\u96F6\u521B\u5EFA\u5DE5\u4F5C\u6D41\u30013+ \u8282\u70B9\u6D41\u7A0B\u3001\u542B\u5206\u652F/\u5E76\u884C/\u5FAA\u73AF\u6216\u5927\u8303\u56F4\u91CD\u6784\uFF09\n\u4E3A\u4E86\u4FDD\u8BC1\u9AD8\u51C6\u786E\u6027\u3001\u6570\u636E\u6D41\u4E00\u81F4\u6027\u4E0E\u914D\u7F6E\u5B8C\u6574\u5EA6\uFF0C**\u8BF7\u4E25\u683C\u6309\u4EE5\u4E0B 4 \u4E2A\u9636\u6BB5\u4F9D\u6B21\u8C03\u7528\u5DE5\u5177\u6F14\u8FDB\u6784\u5EFA**\uFF08\u53EF\u5728\u4E00\u6B21\u6216\u8FDE\u7EED\u591A\u6B65\u5DE5\u5177\u8C03\u7528\u4E2D\u5B8C\u6210\uFF09\uFF1A\n1. **\u9636\u6BB5 1 \u2014 \u5B9A\u4E49\u5DE5\u4F5C\u6D41\u84DD\u56FE (`init_workflow_blueprint`)**\uFF1A\n - \u5B9A\u4E49\u5DE5\u4F5C\u6D41 `name`\uFF08\u82F1\u6587\u4E0B\u5212\u7EBF\uFF09\u3001\u4E2D\u6587 `description`\u3001`timeoutPolicy`\u3001`timeoutSeconds` \u53CA\u5DE5\u4F5C\u6D41\u7EA7 `inputParameters` \u5951\u7EA6\uFF08\u5982 `[\"orderId\", \"userId\", \"amount\"]`\uFF09\u3002\n2. **\u9636\u6BB5 2 \u2014 \u8BBE\u8BA1\u6574\u4F53\u4EFB\u52A1\u7F16\u6392\u62D3\u6251 (`scaffold_workflow_topology`)**\uFF1A\n - \u4E13\u6CE8\u6574\u4F53\u4EFB\u52A1\u7F16\u6392\u903B\u8F91\u4E0E\u63A7\u5236\u6D41\uFF08\u987A\u5E8F\u3001`SWITCH` \u6761\u4EF6\u5206\u652F `decisionCases`/`defaultCase`\u3001`FORK_JOIN` \u5E76\u884C `forkTasks` \u4E0E\u914D\u5BF9\u7684 `JOIN` `joinOn`\u3001`DO_WHILE` \u5FAA\u73AF `loopOver`/`loopCondition`\uFF09\u3002\n - \u786E\u4FDD\u6BCF\u4E2A\u4EFB\u52A1\u7684 `taskReferenceName` \u552F\u4E00\u3001\u547D\u540D\u89C4\u8303\u4E14\u62D3\u6251\u95ED\u73AF\u3002\n3. **\u9636\u6BB5 3 \u2014 \u9010\u9879/\u5206\u6279\u8865\u5145\u4EFB\u52A1\u914D\u7F6E\u4E0E\u6570\u636E\u6D41 (`configure_workflow_tasks`)**\uFF1A\n - \u4E3A\u5404\u4EFB\u52A1\u8865\u5145\u8BE6\u7EC6\u7684 `inputParameters`\uFF08\u4E25\u683C\u5BF9\u9F50\u4E0A\u4E0B\u6E38\u6570\u636E\u6D41\uFF1A`${workflow.input.xxx}` \u6216 `${upstream_ref.output.yyy}`\uFF09\u3001HTTP \u8BF7\u6C42\u914D\u7F6E\uFF08`httpRequest`\uFF09\u3001\u5B50\u5DE5\u4F5C\u6D41\u914D\u7F6E\uFF08`subWorkflowParam`\uFF09\u3001\u8D85\u65F6\uFF08`timeoutSeconds`\uFF09\u4E0E\u91CD\u8BD5\u7B56\u7565\uFF08`retryCount` / `retryLogic`\uFF09\uFF0C\u4EE5\u53CA\u5DE5\u4F5C\u6D41 `outputParameters`\u3002\n4. **\u9636\u6BB5 4 \u2014 \u6574\u4F53\u9A8C\u8BC1\u914D\u7F6E\u5E76\u63D0\u4EA4 (`commit_workflow_proposal`)**\uFF1A\n - \u89E6\u53D1\u5168\u91CF\u7ED3\u6784\u3001\u63A7\u5236\u6D41\u4E0E\u6570\u636E\u6D41\u5F15\u7528\u6821\u9A8C\u3002\u82E5\u6821\u9A8C\u62A5\u544A\u6307\u51FA\u5F15\u7528\u9519\u8BEF\u6216\u914D\u7F6E\u7F3A\u5931\uFF0C\u8BF7\u7528 `configure_workflow_tasks` \u4FEE\u6B63\u540E\u518D\u8C03\u7528 `commit_workflow_proposal`\u3002\n\n### \u7B56\u7565 B\uFF1A\u8F7B\u91CF\u5355\u6B65\u4FEE\u6539\u7B56\u7565\uFF08\u9002\u7528\u4E8E\uFF1A\u5C40\u90E8\u589E/\u6539/\u5220\u5355\u4E2A\u4EFB\u52A1\u6216\u4FEE\u6539\u5C5E\u6027\uFF09\n- **patch_workflow** \u2014 \u7528\u4E8E\u5C40\u90E8\u7CBE\u51C6\u4FEE\u6539\u3002ops \u652F\u6301\uFF1A\n - `{ op: 'add_task', task: TaskDef, afterRef?: string, parentRef?: string, branchName?: string }` \u2014 \u65B0\u589E\u4EFB\u52A1\uFF08\u652F\u6301\u901A\u8FC7 `afterRef` \u63D2\u5165\u5230\u4EFB\u610F\u9876\u5C42/\u5D4C\u5957\u4EFB\u52A1\u4E4B\u540E\uFF0C\u6216\u901A\u8FC7 `parentRef` + `branchName` \u63D2\u5165\u5230 SWITCH/FORK_JOIN/DO_WHILE \u5185\u90E8\uFF09\n - `{ op: 'update_task', ref: string, changes: Partial<TaskDef> }` \u2014 \u4FEE\u6539\u4EFB\u52A1\u5B57\u6BB5\n - `{ op: 'remove_task', ref: string }` \u2014 \u5220\u9664\u4EFB\u52A1\n - `{ op: 'update_props', props: Partial<WorkflowDef> }` \u2014 \u4FEE\u6539\u5DE5\u4F5C\u6D41\u5C5E\u6027\n - `{ op: 'add_switch_branch', ref: string, caseName: string }` \u2014 \u6DFB\u52A0 SWITCH \u5206\u652F\n - `{ op: 'add_fork_branch', ref: string }` \u2014 \u6DFB\u52A0 FORK_JOIN \u5E76\u884C\u5206\u652F\n- **replace_workflow** \u2014 \u4EC5\u7528\u4E8E 1-2 \u4E2A\u8282\u70B9\u7684\u6781\u7B80\u6D41\u7A0B\u5FEB\u901F\u66FF\u6362\u3002\n\n### \u8F85\u52A9\u4E0E\u4EA4\u4E92\u5DE5\u5177\n- **get_workflow_state** \u2014 \u4EC5\u5728 system prompt \u7684\u5DE5\u4F5C\u6D41\u4E0A\u4E0B\u6587\u4E0D\u8DB3\u4EE5\u56DE\u7B54\u65F6\u624D\u8C03\u7528\uFF08read-only\uFF09\u3002\n- **validate_workflow** \u2014 \u6821\u9A8C\u5F53\u524D\u5DE5\u4F5C\u6D41\u6216\u8349\u7A3F\u7684\u5408\u6CD5\u6027\u4E0E\u6570\u636E\u6D41\u5B8C\u6574\u6027\uFF08read-only\uFF09\u3002\n- **propose_plan** \u2014 \u5728\u6267\u884C\u8D85\u5927\u89C4\u6A21\u7834\u574F\u6027\u91CD\u6784\u524D\uFF0C\u53EF\u5148\u5411\u7528\u6237\u5C55\u793A\u8BA1\u5212\u5E76\u7B49\u5F85\u786E\u8BA4\u3002\n- **ask_clarification** \u2014 \u5F53\u7528\u6237\u610F\u56FE\u6A21\u7CCA\u65F6\u8C03\u7528\uFF0C\u5C55\u793A 2-4 \u4E2A\u9009\u9879\u5E2E\u52A9\u7528\u6237\u7CBE\u786E\u8868\u8FBE\u9700\u6C42\u3002\u8C03\u7528\u540E\u505C\u6B62\uFF0C\u7B49\u5F85\u7528\u6237\u9009\u62E9\u3002\n- **recommend_workflow** \u2014 \u5728\u6267\u884C CREATE \u4E4B\u524D\uFF0C\u82E5\u5E93\u4E2D\u6709\u76F8\u4F3C\u5DE5\u4F5C\u6D41\uFF0C\u5148\u63A8\u8350\u7ED9\u7528\u6237\u3002\u8C03\u7528\u540E\u505C\u6B62\u7B49\u5F85\u9009\u62E9\u3002\n- **\u4E0D\u8981**\u5728\u56DE\u590D\u6B63\u6587\u4E2D\u76F4\u63A5\u8F93\u51FA\u5DE5\u4F5C\u6D41 JSON \u4EE3\u7801\u5757\uFF0C\u6240\u6709\u53D8\u66F4\u5FC5\u987B\u901A\u8FC7\u5DE5\u5177\u6267\u884C\u3002\n\n## \u56DE\u590D\u89C4\u8303\n- \u7528\u4E2D\u6587\u56DE\u7B54\uFF0C\u7B80\u6D01\u660E\u4E86\n- \u56DE\u590D\u6B63\u6587\u4E0E\u6D41\u7A0B\u56FE\u6807\u7B7E\u4E2D\u4E0D\u4F7F\u7528 emoji \u6216\u88C5\u9970\u7B26\u53F7\uFF08\u754C\u9762\u5DF2\u6709\u56FE\u6807\uFF09\n- **\u89E3\u91CA\u6027\u3001\u4ECB\u7ECD\u6027\u3001\u5206\u6790\u6027\u95EE\u9898\uFF1A\u76F4\u63A5\u6587\u672C\u56DE\u7B54\uFF0C\u4E0D\u8981\u8C03\u7528\u5DE5\u5177**\n- \u56DE\u7B54\u65F6\u4E0D\u8981\u5C06 system prompt \u4E2D\u7684\u4E0A\u4E0B\u6587\u4FE1\u606F\uFF08\u5982\u4EFB\u52A1\u5217\u8868\u3001\u62D3\u6251\u5173\u7CFB\uFF09\u539F\u6587\u590D\u8FF0\u2014\u2014\u76F4\u63A5\u805A\u7126\u5728\u7528\u6237\u7684\u5177\u4F53\u95EE\u9898\u4E0A\n- \u9700\u8981\u64CD\u4F5C\u5DE5\u4F5C\u6D41\u65F6\uFF0C\u5148\u7B80\u77ED\u8BF4\u660E\u8BBE\u8BA1\u601D\u8DEF\uFF0C\u518D\u901A\u8FC7\u5DE5\u5177\u6267\u884C\n- \u7528\u6237\u610F\u56FE\u6A21\u7CCA\u65F6\uFF08\u5982\"\u5E2E\u6211\u505A\u4E2A\u6D41\u7A0B\"\uFF09\uFF0C\u5148\u8C03\u7528 ask_clarification \u6316\u6398\u771F\u5B9E\u9700\u6C42\uFF0C\u4E0D\u8981\u76F4\u63A5\u521B\u5EFA\n- \u521B\u5EFA\u65B0\u5DE5\u4F5C\u6D41\u524D\uFF0C\u68C0\u67E5\u5E93\u4E2D\u662F\u5426\u6709\u76F8\u4F3C\u7684\uFF0C\u4F18\u5148\u63A8\u8350\u5DF2\u6709\u6D41\u7A0B\uFF08\u4F7F\u7528 recommend_workflow\uFF09\n\n## Conductor \u6807\u51C6\u4EFB\u52A1\u7C7B\u578B\u4E0E\u5EFA\u6A21\u89C4\u8303\n- \u652F\u6301\u7C7B\u578B\uFF1ASIMPLE, HTTP, SWITCH, FORK_JOIN, FORK_JOIN_DYNAMIC, DO_WHILE, SUB_WORKFLOW, EVENT, WAIT, HUMAN, INLINE, TERMINATE, SET_VARIABLE, KAFKA_PUBLISH, JSON_JQ_TRANSFORM, START_WORKFLOW, DYNAMIC, NOOP\n- \u6BCF\u4E2A\u4EFB\u52A1\u5FC5\u987B\u6709\u552F\u4E00\u7684 `taskReferenceName`\uFF08\u4EC5\u9650\u82F1\u6587\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\uFF0C\u5982 `verify_payment`\uFF09\n- \u4E0B\u6E38\u4EFB\u52A1\u901A\u8FC7 `${upstream_ref.output.field}` \u5F15\u7528\u4E0A\u6E38\u8F93\u51FA\uFF0C\u4E25\u7981\u5F15\u7528\u5C1A\u672A\u6267\u884C\u7684\u4E0B\u6E38\u4EFB\u52A1\n- SWITCH \u9700\u8981 `
|
|
14
|
+
export declare const BASE_SYSTEM_PROMPT = "\u4F60\u662F Netflix Conductor \u5DE5\u4F5C\u6D41\u5EFA\u6A21\u4E13\u5BB6 AI \u52A9\u624B\u3002\u5E2E\u52A9\u7528\u6237\u901A\u8FC7\u81EA\u7136\u8BED\u8A00\u8BBE\u8BA1\u548C\u7F16\u8F91\u9AD8\u53EF\u9760\u6027\u7684 Conductor JSON \u5DE5\u4F5C\u6D41\u3002\n\n## \u6838\u5FC3\u5DE5\u4F5C\u6D41\u751F\u6210\u7B56\u7565\uFF08\u81EA\u9002\u5E94\u590D\u6742\u5EA6\u8DEF\u7531\uFF09\n\n### \u7B56\u7565 A\uFF1A\u56DB\u9636\u6BB5\u6E10\u8FDB\u5F0F\u6784\u5EFA\u7B56\u7565\uFF08\u9002\u7528\u4E8E\uFF1A\u4ECE\u96F6\u521B\u5EFA\u5DE5\u4F5C\u6D41\u30013+ \u8282\u70B9\u6D41\u7A0B\u3001\u542B\u5206\u652F/\u5E76\u884C/\u5FAA\u73AF\u6216\u5927\u8303\u56F4\u91CD\u6784\uFF09\n\u4E3A\u4E86\u4FDD\u8BC1\u9AD8\u51C6\u786E\u6027\u3001\u6570\u636E\u6D41\u4E00\u81F4\u6027\u4E0E\u914D\u7F6E\u5B8C\u6574\u5EA6\uFF0C**\u8BF7\u4E25\u683C\u6309\u4EE5\u4E0B 4 \u4E2A\u9636\u6BB5\u4F9D\u6B21\u8C03\u7528\u5DE5\u5177\u6F14\u8FDB\u6784\u5EFA**\uFF08\u53EF\u5728\u4E00\u6B21\u6216\u8FDE\u7EED\u591A\u6B65\u5DE5\u5177\u8C03\u7528\u4E2D\u5B8C\u6210\uFF09\uFF1A\n1. **\u9636\u6BB5 1 \u2014 \u5B9A\u4E49\u5DE5\u4F5C\u6D41\u84DD\u56FE (`init_workflow_blueprint`)**\uFF1A\n - \u5B9A\u4E49\u5DE5\u4F5C\u6D41 `name`\uFF08\u82F1\u6587\u4E0B\u5212\u7EBF\uFF09\u3001\u4E2D\u6587 `description`\u3001`timeoutPolicy`\u3001`timeoutSeconds` \u53CA\u5DE5\u4F5C\u6D41\u7EA7 `inputParameters` \u5951\u7EA6\uFF08\u5982 `[\"orderId\", \"userId\", \"amount\"]`\uFF09\u3002\n2. **\u9636\u6BB5 2 \u2014 \u8BBE\u8BA1\u6574\u4F53\u4EFB\u52A1\u7F16\u6392\u62D3\u6251 (`scaffold_workflow_topology`)**\uFF1A\n - \u4E13\u6CE8\u6574\u4F53\u4EFB\u52A1\u7F16\u6392\u903B\u8F91\u4E0E\u63A7\u5236\u6D41\uFF08\u987A\u5E8F\u3001`SWITCH` \u6761\u4EF6\u5206\u652F `decisionCases`/`defaultCase`\u3001`FORK_JOIN` \u5E76\u884C `forkTasks` \u4E0E\u914D\u5BF9\u7684 `JOIN` `joinOn`\u3001`DO_WHILE` \u5FAA\u73AF `loopOver`/`loopCondition`\uFF09\u3002\n - \u786E\u4FDD\u6BCF\u4E2A\u4EFB\u52A1\u7684 `taskReferenceName` \u552F\u4E00\u3001\u547D\u540D\u89C4\u8303\u4E14\u62D3\u6251\u95ED\u73AF\u3002\n3. **\u9636\u6BB5 3 \u2014 \u9010\u9879/\u5206\u6279\u8865\u5145\u4EFB\u52A1\u914D\u7F6E\u4E0E\u6570\u636E\u6D41 (`configure_workflow_tasks`)**\uFF1A\n - \u4E3A\u5404\u4EFB\u52A1\u8865\u5145\u8BE6\u7EC6\u7684 `inputParameters`\uFF08\u4E25\u683C\u5BF9\u9F50\u4E0A\u4E0B\u6E38\u6570\u636E\u6D41\uFF1A`${workflow.input.xxx}` \u6216 `${upstream_ref.output.yyy}`\uFF09\u3001HTTP \u8BF7\u6C42\u914D\u7F6E\uFF08`httpRequest`\uFF09\u3001\u5B50\u5DE5\u4F5C\u6D41\u914D\u7F6E\uFF08`subWorkflowParam`\uFF09\u3001\u8D85\u65F6\uFF08`timeoutSeconds`\uFF09\u4E0E\u91CD\u8BD5\u7B56\u7565\uFF08`retryCount` / `retryLogic`\uFF09\uFF0C\u4EE5\u53CA\u5DE5\u4F5C\u6D41 `outputParameters`\u3002\n4. **\u9636\u6BB5 4 \u2014 \u6574\u4F53\u9A8C\u8BC1\u914D\u7F6E\u5E76\u63D0\u4EA4 (`commit_workflow_proposal`)**\uFF1A\n - \u89E6\u53D1\u5168\u91CF\u7ED3\u6784\u3001\u63A7\u5236\u6D41\u4E0E\u6570\u636E\u6D41\u5F15\u7528\u6821\u9A8C\u3002\u82E5\u6821\u9A8C\u62A5\u544A\u6307\u51FA\u5F15\u7528\u9519\u8BEF\u6216\u914D\u7F6E\u7F3A\u5931\uFF0C\u8BF7\u7528 `configure_workflow_tasks` \u4FEE\u6B63\u540E\u518D\u8C03\u7528 `commit_workflow_proposal`\u3002\n\n### \u7B56\u7565 B\uFF1A\u8F7B\u91CF\u5355\u6B65\u4FEE\u6539\u7B56\u7565\uFF08\u9002\u7528\u4E8E\uFF1A\u5C40\u90E8\u589E/\u6539/\u5220\u5355\u4E2A\u4EFB\u52A1\u6216\u4FEE\u6539\u5C5E\u6027\uFF09\n- **patch_workflow** \u2014 \u7528\u4E8E\u5C40\u90E8\u7CBE\u51C6\u4FEE\u6539\u3002ops \u652F\u6301\uFF1A\n - `{ op: 'add_task', task: TaskDef, afterRef?: string, parentRef?: string, branchName?: string }` \u2014 \u65B0\u589E\u4EFB\u52A1\uFF08\u652F\u6301\u901A\u8FC7 `afterRef` \u63D2\u5165\u5230\u4EFB\u610F\u9876\u5C42/\u5D4C\u5957\u4EFB\u52A1\u4E4B\u540E\uFF0C\u6216\u901A\u8FC7 `parentRef` + `branchName` \u63D2\u5165\u5230 SWITCH/FORK_JOIN/DO_WHILE \u5185\u90E8\uFF09\n - `{ op: 'update_task', ref: string, changes: Partial<TaskDef> }` \u2014 \u4FEE\u6539\u4EFB\u52A1\u5B57\u6BB5\n - `{ op: 'remove_task', ref: string }` \u2014 \u5220\u9664\u4EFB\u52A1\n - `{ op: 'update_props', props: Partial<WorkflowDef> }` \u2014 \u4FEE\u6539\u5DE5\u4F5C\u6D41\u5C5E\u6027\n - `{ op: 'add_switch_branch', ref: string, caseName: string }` \u2014 \u6DFB\u52A0 SWITCH \u5206\u652F\n - `{ op: 'add_fork_branch', ref: string }` \u2014 \u6DFB\u52A0 FORK_JOIN \u5E76\u884C\u5206\u652F\n- **replace_workflow** \u2014 \u4EC5\u7528\u4E8E 1-2 \u4E2A\u8282\u70B9\u7684\u6781\u7B80\u6D41\u7A0B\u5FEB\u901F\u66FF\u6362\u3002\n\n### \u8F85\u52A9\u4E0E\u4EA4\u4E92\u5DE5\u5177\n- **get_workflow_state** \u2014 \u4EC5\u5728 system prompt \u7684\u5DE5\u4F5C\u6D41\u4E0A\u4E0B\u6587\u4E0D\u8DB3\u4EE5\u56DE\u7B54\u65F6\u624D\u8C03\u7528\uFF08read-only\uFF09\u3002\n- **validate_workflow** \u2014 \u6821\u9A8C\u5F53\u524D\u5DE5\u4F5C\u6D41\u6216\u8349\u7A3F\u7684\u5408\u6CD5\u6027\u4E0E\u6570\u636E\u6D41\u5B8C\u6574\u6027\uFF08read-only\uFF09\u3002\n- **propose_plan** \u2014 \u5728\u6267\u884C\u8D85\u5927\u89C4\u6A21\u7834\u574F\u6027\u91CD\u6784\u524D\uFF0C\u53EF\u5148\u5411\u7528\u6237\u5C55\u793A\u8BA1\u5212\u5E76\u7B49\u5F85\u786E\u8BA4\u3002\n- **ask_clarification** \u2014 \u5F53\u7528\u6237\u610F\u56FE\u6A21\u7CCA\u65F6\u8C03\u7528\uFF0C\u5C55\u793A 2-4 \u4E2A\u9009\u9879\u5E2E\u52A9\u7528\u6237\u7CBE\u786E\u8868\u8FBE\u9700\u6C42\u3002\u8C03\u7528\u540E\u505C\u6B62\uFF0C\u7B49\u5F85\u7528\u6237\u9009\u62E9\u3002\n- **recommend_workflow** \u2014 \u5728\u6267\u884C CREATE \u4E4B\u524D\uFF0C\u82E5\u5E93\u4E2D\u6709\u76F8\u4F3C\u5DE5\u4F5C\u6D41\uFF0C\u5148\u63A8\u8350\u7ED9\u7528\u6237\u3002\u8C03\u7528\u540E\u505C\u6B62\u7B49\u5F85\u9009\u62E9\u3002\n- **\u4E0D\u8981**\u5728\u56DE\u590D\u6B63\u6587\u4E2D\u76F4\u63A5\u8F93\u51FA\u5DE5\u4F5C\u6D41 JSON \u4EE3\u7801\u5757\uFF0C\u6240\u6709\u53D8\u66F4\u5FC5\u987B\u901A\u8FC7\u5DE5\u5177\u6267\u884C\u3002\n\n## \u56DE\u590D\u89C4\u8303\n- \u7528\u4E2D\u6587\u56DE\u7B54\uFF0C\u7B80\u6D01\u660E\u4E86\n- \u56DE\u590D\u6B63\u6587\u4E0E\u6D41\u7A0B\u56FE\u6807\u7B7E\u4E2D\u4E0D\u4F7F\u7528 emoji \u6216\u88C5\u9970\u7B26\u53F7\uFF08\u754C\u9762\u5DF2\u6709\u56FE\u6807\uFF09\n- **\u89E3\u91CA\u6027\u3001\u4ECB\u7ECD\u6027\u3001\u5206\u6790\u6027\u95EE\u9898\uFF1A\u76F4\u63A5\u6587\u672C\u56DE\u7B54\uFF0C\u4E0D\u8981\u8C03\u7528\u5DE5\u5177**\n- \u56DE\u7B54\u65F6\u4E0D\u8981\u5C06 system prompt \u4E2D\u7684\u4E0A\u4E0B\u6587\u4FE1\u606F\uFF08\u5982\u4EFB\u52A1\u5217\u8868\u3001\u62D3\u6251\u5173\u7CFB\uFF09\u539F\u6587\u590D\u8FF0\u2014\u2014\u76F4\u63A5\u805A\u7126\u5728\u7528\u6237\u7684\u5177\u4F53\u95EE\u9898\u4E0A\n- \u9700\u8981\u64CD\u4F5C\u5DE5\u4F5C\u6D41\u65F6\uFF0C\u5148\u7B80\u77ED\u8BF4\u660E\u8BBE\u8BA1\u601D\u8DEF\uFF0C\u518D\u901A\u8FC7\u5DE5\u5177\u6267\u884C\n- \u7528\u6237\u610F\u56FE\u6A21\u7CCA\u65F6\uFF08\u5982\"\u5E2E\u6211\u505A\u4E2A\u6D41\u7A0B\"\uFF09\uFF0C\u5148\u8C03\u7528 ask_clarification \u6316\u6398\u771F\u5B9E\u9700\u6C42\uFF0C\u4E0D\u8981\u76F4\u63A5\u521B\u5EFA\n- \u521B\u5EFA\u65B0\u5DE5\u4F5C\u6D41\u524D\uFF0C\u68C0\u67E5\u5E93\u4E2D\u662F\u5426\u6709\u76F8\u4F3C\u7684\uFF0C\u4F18\u5148\u63A8\u8350\u5DF2\u6709\u6D41\u7A0B\uFF08\u4F7F\u7528 recommend_workflow\uFF09\n\n## Conductor \u6807\u51C6\u4EFB\u52A1\u7C7B\u578B\u4E0E\u5EFA\u6A21\u89C4\u8303\n- \u652F\u6301\u7C7B\u578B\uFF1ASIMPLE, HTTP, SWITCH, FORK_JOIN, FORK_JOIN_DYNAMIC, DO_WHILE, SUB_WORKFLOW, EVENT, WAIT, HUMAN, INLINE, TERMINATE, SET_VARIABLE, KAFKA_PUBLISH, JSON_JQ_TRANSFORM, START_WORKFLOW, DYNAMIC, NOOP\n- \u6BCF\u4E2A\u4EFB\u52A1\u5FC5\u987B\u6709\u552F\u4E00\u7684 `taskReferenceName`\uFF08\u4EC5\u9650\u82F1\u6587\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\uFF0C\u5982 `verify_payment`\uFF09\n- \u4E0B\u6E38\u4EFB\u52A1\u901A\u8FC7 `${upstream_ref.output.field}` \u5F15\u7528\u4E0A\u6E38\u8F93\u51FA\uFF0C\u4E25\u7981\u5F15\u7528\u5C1A\u672A\u6267\u884C\u7684\u4E0B\u6E38\u4EFB\u52A1\n- SWITCH \u9700\u8981 `evaluatorType` + `expression`\uFF08`value-param` \u65F6 expression \u662F inputParameters \u91CC\u7684\u53C2\u6570\u540D\uFF0C`javascript` \u65F6\u662F\u8FD4\u56DE\u5206\u652F\u540D\u7684\u811A\u672C\uFF09\uFF0C\u4EE5\u53CA `decisionCases` \u952E\u503C\u5BF9\uFF1B`caseValueParam` / `caseExpression` \u53EA\u7528\u4E8E DECISION\n- FORK_JOIN \u9700\u8981 `forkTasks`\uFF08\u4E8C\u7EF4\u6570\u7EC4\uFF09\u548C\u7D27\u968F\u5176\u540E\u7684 `JOIN` \u4EFB\u52A1\uFF08`joinOn` \u5305\u542B\u5404\u5E76\u884C\u5206\u652F\u6700\u540E\u4E00\u4E2A\u4EFB\u52A1\u7684 `taskReferenceName`\uFF09\n- DO_WHILE \u9700\u8981 `loopCondition` \u548C `loopOver` \u6570\u7EC4\n- HTTP \u4EFB\u52A1\u5FC5\u987B\u914D\u7F6E `inputParameters.http_request`\uFF08\u542B `uri` \u548C `method`\uFF09\uFF0C\u5EFA\u8BAE\u8BBE\u7F6E `timeoutSeconds` \u548C `retryCount`\n\n## \u4E1A\u52A1\u6D41\u7A0B\u56FE\uFF08Mermaid\uFF09\n\u5F53\u7528\u6237\u8981\u6C42\u5C55\u793A\u6D41\u7A0B\u56FE\u3001\u53EF\u89C6\u5316\u6216 Mermaid \u56FE\u65F6\uFF1A\n- \u5FC5\u987B\u57FA\u4E8E system prompt \u6CE8\u5165\u7684\"\u753B\u5E03\u5DE5\u4F5C\u6D41\u5B8C\u6574 JSON\"\uFF0C\u4E0D\u51ED\u8BB0\u5FC6\u751F\u6210\n- \u8F93\u51FA ```mermaid \u4EE3\u7801\u5757\uFF0C\u4E0D\u8C03\u7528\u4EFB\u4F55\u5DE5\u5177\n- \u8FC7\u6EE4\u7EAF\u6280\u672F\u8282\u70B9\uFF08SET_VARIABLE\u3001JSON_JQ_TRANSFORM\u3001INLINE\u3001NOOP\uFF09\uFF0C\u4E0A\u4E0B\u6E38\u76F4\u8FDE\n- \u8282\u70B9\u6807\u7B7E\u7528\u4E2D\u6587\u4E1A\u52A1\u8BED\u8A00\uFF0C\u7981\u6B62\u76F4\u63A5\u4F7F\u7528 taskReferenceName\n- SWITCH \u7528\u83F1\u5F62 {}\uFF0CFORK_JOIN \u7528\u5E76\u884C\u8DEF\u5F84\uFF0CHUMAN \u6807\u6CE8\u300C\u4EBA\u5DE5\u300D";
|
|
15
15
|
/**
|
|
16
16
|
* 构建完整 system prompt。
|
|
17
17
|
*
|
package/dist/store/aiStore.d.ts
CHANGED
|
@@ -144,8 +144,13 @@ interface AiState {
|
|
|
144
144
|
pendingAutoSend: string | null;
|
|
145
145
|
/** Current in-flight step label (e.g. "正在搜索工作流库…"), set by AgentRunner */
|
|
146
146
|
toolStatus: string;
|
|
147
|
-
/** Last message that failed to send, offered back via a retry button */
|
|
147
|
+
/** Last message that failed to send, offered back via a retry button (the text the user saw) */
|
|
148
148
|
retryInput: string | null;
|
|
149
|
+
/**
|
|
150
|
+
* A19:失败那条消息发给模型的文本(与展示文本不同时才有值,如「执行方案」附带的计划)。
|
|
151
|
+
* 重试时与 retryInput 一起带上:聊天里显示 retryInput,模型收到这一段。
|
|
152
|
+
*/
|
|
153
|
+
retryModelText: string | null;
|
|
149
154
|
/**
|
|
150
155
|
* Append-only log of completed steps for the current agent turn (M2.2 AgentTimeline).
|
|
151
156
|
* Cleared at the start of each `send()`. Self-heal retries log their own entry so
|
|
@@ -158,6 +163,14 @@ interface AiState {
|
|
|
158
163
|
workingDraft: WorkflowDef | null;
|
|
159
164
|
/** PI-style durable session checkpoint for pause/resume/fault-recovery */
|
|
160
165
|
durableCheckpoint: DurableSessionCheckpoint | null;
|
|
166
|
+
/**
|
|
167
|
+
* A18:有未完成的断点时用户又发了一条消息。先不发送,等用户选「继续上次」还是「放弃断点并发送」,
|
|
168
|
+
* 避免可续跑的断点被静默丢弃。
|
|
169
|
+
*/
|
|
170
|
+
pendingSend: {
|
|
171
|
+
text: string;
|
|
172
|
+
modelText?: string;
|
|
173
|
+
} | null;
|
|
161
174
|
}
|
|
162
175
|
export interface TimelineEntry {
|
|
163
176
|
id: string;
|
|
@@ -205,12 +218,17 @@ interface AiActions {
|
|
|
205
218
|
/** Restore conversation + pending proposal + optional durable checkpoint from a persisted draft (M1.4) */
|
|
206
219
|
hydrateFromDraft: (messages: AiChatMessage[], pendingProposal: ProposedChange | null, durableCheckpoint?: DurableSessionCheckpoint | null) => void;
|
|
207
220
|
setToolStatus: (status: string) => void;
|
|
208
|
-
|
|
221
|
+
/** 设置重试内容;modelText 是发给模型的文本(与展示文本不同时传) */
|
|
222
|
+
setRetryInput: (input: string | null, modelText?: string | null) => void;
|
|
209
223
|
addTimelineEntry: (label: string, icon?: 'done' | 'warning') => void;
|
|
210
224
|
clearTimeline: () => void;
|
|
211
225
|
setSynthesisStage: (phase: SynthesisPhase, draft?: WorkflowDef | null) => void;
|
|
212
226
|
saveCheckpoint: (checkpoint: DurableSessionCheckpoint | null) => void;
|
|
213
227
|
clearCheckpoint: () => void;
|
|
228
|
+
setPendingSend: (pending: {
|
|
229
|
+
text: string;
|
|
230
|
+
modelText?: string;
|
|
231
|
+
} | null) => void;
|
|
214
232
|
}
|
|
215
233
|
export type AiStore = AiState & AiActions;
|
|
216
234
|
/** 允许写入 localStorage 的配置字段:只有 provider / baseUrl / model(apiKey、transport、endpoint 请求头一律不落盘) */
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { WorkflowStore } from '../types/workflow';
|
|
2
2
|
import { WorkflowDef, TaskDef } from '../types/conductor';
|
|
3
|
+
/**
|
|
4
|
+
* 本地偏好(localStorage `conductor-ui-prefs`)的版本迁移。
|
|
5
|
+
* - v0 → v1:默认连线从贝塞尔曲线改为折线
|
|
6
|
+
* - v1 → v2(R20):删除旧版本写进去的剪贴板任务 `copiedTask`
|
|
7
|
+
*/
|
|
8
|
+
export declare function migratePersistedPrefs(persisted: any, version: number): any;
|
|
3
9
|
declare const useWorkflowStore: import("zustand").UseBoundStore<Omit<Omit<import("zustand").StoreApi<WorkflowStore>, "setState" | "persist"> & {
|
|
4
10
|
setState(partial: WorkflowStore | Partial<WorkflowStore> | ((state: WorkflowStore) => WorkflowStore | Partial<WorkflowStore>), replace?: false | undefined): unknown;
|
|
5
11
|
setState(state: WorkflowStore | ((state: WorkflowStore) => WorkflowStore), replace: true): unknown;
|
package/dist/types/workflow.d.ts
CHANGED
|
@@ -186,6 +186,18 @@ export interface WorkflowState {
|
|
|
186
186
|
viewMode: ViewMode;
|
|
187
187
|
workflowDef: WorkflowDef | null;
|
|
188
188
|
workflowInstance: WorkflowInstance | null;
|
|
189
|
+
/**
|
|
190
|
+
* R19:运行态展示的实例定义(与编辑中的定义不同时才有值)。
|
|
191
|
+
* 运行实例里的定义只用于渲染运行视图,不会替换编辑中的定义。
|
|
192
|
+
*/
|
|
193
|
+
runWorkflowDef: WorkflowDef | null;
|
|
194
|
+
/** R19:运行态展示实例定义期间,暂存的编辑中定义;离开运行态时原样恢复 */
|
|
195
|
+
editWorkflowDefStash: WorkflowDef | null;
|
|
196
|
+
/**
|
|
197
|
+
* R19:最近一次加载或保存时的定义(序列化后),用于判断画布是否有未保存的修改。
|
|
198
|
+
* 为 null 表示 IDE 不知道服务端保存过哪个版本。
|
|
199
|
+
*/
|
|
200
|
+
savedWorkflowJson: string | null;
|
|
189
201
|
nodes: WorkflowNode[];
|
|
190
202
|
edges: Edge[];
|
|
191
203
|
taskMap: Record<string, TaskDef>;
|
|
@@ -303,6 +315,12 @@ export interface WorkflowActions {
|
|
|
303
315
|
setRunState: (state: RunState, execId?: string | null, error?: string | null) => void;
|
|
304
316
|
/** P4.3: 切回 edit 模式并聚焦到指定任务的指定参数字段 */
|
|
305
317
|
switchToEditAndFocusParam: (taskRef: string, paramKey?: string) => void;
|
|
318
|
+
/** R19:把定义记为已保存(宿主加载定义、或交给 onSave 后调用);不传时取编辑中的定义 */
|
|
319
|
+
markWorkflowSaved: (def?: WorkflowDef | null) => void;
|
|
320
|
+
/** R19:编辑中的定义(运行态展示实例定义时取暂存的编辑定义)。保存、导出、宿主读取都用它 */
|
|
321
|
+
getEditingWorkflowDef: () => WorkflowDef | null;
|
|
322
|
+
/** R19:当前定义与最近一次加载 / 保存的版本不同(或从未记录过保存版本)时返回 true */
|
|
323
|
+
hasUnsavedChanges: () => boolean;
|
|
306
324
|
/** W-LSP: 切换数据血缘飞线叠加显示 */
|
|
307
325
|
setShowDataLineage: (show: boolean) => void;
|
|
308
326
|
/** W-LSP: 清除重构提示文案 */
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { WorkflowDef } from '../types/conductor';
|
|
2
|
+
/** 宿主保存回调:同步保存返回 void;异步保存返回 Promise,resolve 才算保存成功 */
|
|
3
|
+
export type HostSaveHandler = (def: WorkflowDef) => void | PromiseLike<unknown>;
|
|
4
|
+
/**
|
|
5
|
+
* R19:把定义交给宿主保存,并在保存成功后把它记为已保存的版本(执行验证运行的就是这一份)。
|
|
6
|
+
* - 宿主同步返回:交出即视为已保存(沿用原来的语义)。
|
|
7
|
+
* - 宿主返回 Promise:resolve 后才标记;reject 时保持"有未保存的修改",执行面板继续提示。
|
|
8
|
+
* reject 不在这里吞掉,宿主没处理的错误仍会像以前一样出现在控制台。
|
|
9
|
+
*/
|
|
10
|
+
export declare function handOffSave(onSave: HostSaveHandler, def: WorkflowDef): void;
|
|
@@ -58,6 +58,12 @@ interface SandboxRuntimeContext {
|
|
|
58
58
|
seqCounter: number;
|
|
59
59
|
/** refs spawned by the most recent FORK_JOIN_DYNAMIC, consumed by its JOIN */
|
|
60
60
|
lastDynamicSpawn: string[] | null;
|
|
61
|
+
/** set by a TERMINATE task: the workflow ends with this status, reason and output (Conductor semantics) */
|
|
62
|
+
termination: {
|
|
63
|
+
status: 'COMPLETED' | 'FAILED' | 'TERMINATED';
|
|
64
|
+
reason: string;
|
|
65
|
+
output: Record<string, any>;
|
|
66
|
+
} | null;
|
|
61
67
|
}
|
|
62
68
|
/**
|
|
63
69
|
* Resolve Conductor `${...}` expressions against current sandbox context.
|
|
@@ -70,6 +76,8 @@ export declare function resolveExpressionValue(val: any, ctx: SandboxRuntimeCont
|
|
|
70
76
|
export declare function generateDefaultTaskOutputPreview(task: WorkflowTask, resolvedInput?: Record<string, any>, iteration?: number): Record<string, any>;
|
|
71
77
|
/**
|
|
72
78
|
* Build mock workflow input: declared input parameters plus every `${workflow.input.<field>}` the tasks reference.
|
|
79
|
+
* S13: declared parameters take their type, example and default from `inputSchema` / `inputTemplate`
|
|
80
|
+
* (`parseWorkflowInputParams`), so a number parameter gets a number, not a `sample_x` string.
|
|
73
81
|
*/
|
|
74
82
|
export declare function buildDefaultWorkflowMockInput(workflowDef: WorkflowDef): Record<string, any>;
|
|
75
83
|
/**
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { WorkflowDef } from '../types/conductor';
|
|
2
|
+
/**
|
|
3
|
+
* R21:两份定义内容是否相同(同一对象,或序列化后完全一致)。
|
|
4
|
+
* 用于识别受控用法下宿主把 onWorkflowChange 的结果原样回写成 workflowDef prop 的情况。
|
|
5
|
+
*/
|
|
6
|
+
export declare function isSameWorkflow(a: WorkflowDef | null | undefined, b: WorkflowDef | null | undefined): boolean;
|
|
@@ -2,9 +2,13 @@
|
|
|
2
2
|
* Runs Conductor JavaScript expressions (INLINE, SWITCH / DECISION javascript evaluators, DO_WHILE loop conditions)
|
|
3
3
|
* for the in-browser sandbox.
|
|
4
4
|
*
|
|
5
|
-
* The expression is workflow content, possibly written by someone else, so it never runs on the page itself:
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* The expression is workflow content, possibly written by someone else, so it never runs on the page itself (S10):
|
|
6
|
+
* - it runs in a Web Worker started from a hidden sandboxed iframe (opaque origin) whose Content-Security-Policy is
|
|
7
|
+
* `default-src 'none'`. The worker inherits that policy, so `import()`, `FontFace`, `fetch`, WebSocket and the like
|
|
8
|
+
* cannot reach the network whatever globals the script finds;
|
|
9
|
+
* - network, storage and messaging globals are also removed inside the worker (defence in depth);
|
|
10
|
+
* - every evaluation gets a fresh worker, so one script cannot see or change another script's input or result;
|
|
11
|
+
* - a script that exceeds its time budget is stopped (an infinite loop cannot freeze the IDE).
|
|
8
12
|
*/
|
|
9
13
|
export type ScriptResult = {
|
|
10
14
|
ok: true;
|
|
@@ -18,14 +22,14 @@ export type ScriptResult = {
|
|
|
18
22
|
export type ScriptEvaluator = (expression: string, input: Record<string, unknown>) => Promise<ScriptResult>;
|
|
19
23
|
export interface WorkerScriptEvaluator {
|
|
20
24
|
evaluate: ScriptEvaluator;
|
|
21
|
-
/** Stop the
|
|
25
|
+
/** Stop the sandbox. Further calls start a new one. */
|
|
22
26
|
dispose: () => void;
|
|
23
27
|
}
|
|
24
28
|
export declare const DEFAULT_SCRIPT_TIMEOUT_MS = 2000;
|
|
25
29
|
/**
|
|
26
|
-
* Create an evaluator backed by
|
|
27
|
-
*
|
|
28
|
-
*
|
|
30
|
+
* Create an evaluator backed by the sandbox described at the top of this file.
|
|
31
|
+
* Reports `notExecuted` when the page cannot host it (no DOM or Web Worker API, or a CSP that forbids the sandbox),
|
|
32
|
+
* so the sandbox can say why a script did not run instead of guessing a result.
|
|
29
33
|
*/
|
|
30
34
|
export declare function createWorkerScriptEvaluator(options?: {
|
|
31
35
|
timeoutMs?: number;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { TaskDef } from '../../types/conductor';
|
|
2
|
+
export interface SwitchRoutingHint {
|
|
3
|
+
switchRef: string;
|
|
4
|
+
switchName: string;
|
|
5
|
+
/** `workflow.input` 字段名:判断取值直接来自这个入参时,改入参就能切换分支 */
|
|
6
|
+
inputField: string | null;
|
|
7
|
+
/** 判断方式:按入参取值,或按脚本(只能在配置台强制指定分支) */
|
|
8
|
+
evaluator: 'value-param' | 'javascript';
|
|
9
|
+
cases: string[];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* S14:沙箱配置台的「条件分支快速路由」提示,按引擎选择分支的同一套规则识别判断依据:
|
|
13
|
+
* - SWITCH value-param:`expression` 是参数名,取值在 `inputParameters[expression]`(兼容旧写法 `caseValueParam`)
|
|
14
|
+
* - DECISION:`caseValueParam` 是参数名;有 `caseExpression` 时按脚本判断
|
|
15
|
+
* - javascript / graaljs:按脚本判断,没有可直接切换的入参
|
|
16
|
+
*/
|
|
17
|
+
export declare function getSwitchRoutingHint(task: TaskDef): SwitchRoutingHint | null;
|
|
@@ -39,7 +39,7 @@ export declare const TASK_RULES: {
|
|
|
39
39
|
INLINE: ({
|
|
40
40
|
field: string;
|
|
41
41
|
type: string;
|
|
42
|
-
validate: (
|
|
42
|
+
validate: (val: any, task: any) => boolean;
|
|
43
43
|
message: string;
|
|
44
44
|
level?: undefined;
|
|
45
45
|
} | {
|
|
@@ -70,6 +70,24 @@ export declare const TASK_RULES: {
|
|
|
70
70
|
validate: (_val: any, task: any) => boolean;
|
|
71
71
|
message: string;
|
|
72
72
|
}[];
|
|
73
|
+
KAFKA_PUBLISH: {
|
|
74
|
+
field: string;
|
|
75
|
+
type: string;
|
|
76
|
+
validate: (val: any) => boolean;
|
|
77
|
+
message: string;
|
|
78
|
+
}[];
|
|
79
|
+
EVENT: {
|
|
80
|
+
field: string;
|
|
81
|
+
type: string;
|
|
82
|
+
validate: (val: any) => boolean;
|
|
83
|
+
message: string;
|
|
84
|
+
}[];
|
|
85
|
+
WAIT: {
|
|
86
|
+
field: string;
|
|
87
|
+
type: string;
|
|
88
|
+
validate: (val: any, task: any) => boolean;
|
|
89
|
+
message: string;
|
|
90
|
+
}[];
|
|
73
91
|
DYNAMIC: {
|
|
74
92
|
field: string;
|
|
75
93
|
type: string;
|
|
@@ -100,19 +118,12 @@ export declare const TASK_RULES: {
|
|
|
100
118
|
validate: (val: any) => boolean;
|
|
101
119
|
message: string;
|
|
102
120
|
}[];
|
|
103
|
-
SWITCH:
|
|
121
|
+
SWITCH: {
|
|
104
122
|
field: string;
|
|
105
123
|
type: string;
|
|
106
124
|
validate: (val: any, task: any) => boolean;
|
|
107
125
|
message: string;
|
|
108
|
-
|
|
109
|
-
} | {
|
|
110
|
-
field: string;
|
|
111
|
-
type: string;
|
|
112
|
-
level: string;
|
|
113
|
-
validate: (val: any, task: any) => boolean;
|
|
114
|
-
message: string;
|
|
115
|
-
})[];
|
|
126
|
+
}[];
|
|
116
127
|
FORK_JOIN_DYNAMIC: {
|
|
117
128
|
field: string;
|
|
118
129
|
type: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yiyi_zhang/reactflow-ui",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.2",
|
|
4
4
|
"description": "Conductor Workflow IDE — Next-Gen AI-Native visual workflow designer with W-LSP data lineage, deterministic in-browser sandbox dry-run, time-travel waterfall debugger, and live split-view sync built with React 19, ReactFlow and Zustand.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"conductor",
|