@yiyi_zhang/reactflow-ui 1.3.0 → 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.
Files changed (91) hide show
  1. package/README.md +8 -6
  2. package/dist/AiWorkflowIDE.d.ts +23 -3
  3. package/dist/WorkflowIDE.d.ts +14 -1
  4. package/dist/actions/builtin/coerce.d.ts +9 -0
  5. package/dist/actions/types.d.ts +1 -0
  6. package/dist/ai.d.ts +5 -2
  7. package/dist/components/AiNative/AgentTimeline.d.ts +1 -1
  8. package/dist/components/AiNative/ClarificationCard.d.ts +3 -2
  9. package/dist/components/AiNative/InlineCanvasCopilot.d.ts +2 -1
  10. package/dist/components/AiNative/RepairCard.d.ts +3 -2
  11. package/dist/components/AiNative/mermaidParser.d.ts +31 -0
  12. package/dist/components/AiNative/repairActions.d.ts +16 -0
  13. package/dist/components/AiNative/runInputs.d.ts +13 -0
  14. package/dist/components/BrandLogo.d.ts +2 -3
  15. package/dist/components/ConfirmDialog.d.ts +3 -1
  16. package/dist/components/DraftCodeField.d.ts +26 -0
  17. package/dist/components/PromptDialog.d.ts +3 -1
  18. package/dist/components/UnsavedRunNotice.d.ts +16 -0
  19. package/dist/components/business/ActionPickerModal.d.ts +2 -0
  20. package/dist/components/business/BusinessEditorContext.d.ts +38 -0
  21. package/dist/components/business/DataPillInput.d.ts +10 -0
  22. package/dist/components/business/DecisionBranchCard.d.ts +2 -1
  23. package/dist/components/business/ForkJoinCard.d.ts +2 -1
  24. package/dist/components/business/LibraryVersionBadge.d.ts +1 -1
  25. package/dist/components/business/LoopDoWhileCard.d.ts +2 -1
  26. package/dist/components/business/NestedControlStep.d.ts +7 -1
  27. package/dist/components/business/RunStoryTimeline.d.ts +7 -0
  28. package/dist/components/business/StepCardParts.d.ts +73 -0
  29. package/dist/components/business/StepFlowEditor.d.ts +12 -1
  30. package/dist/components/business/StepListEditor.d.ts +6 -2
  31. package/dist/components/business/deleteMessage.d.ts +6 -0
  32. package/dist/components/business/runStatus.d.ts +11 -0
  33. package/dist/components/icons/CmIcon.d.ts +17 -0
  34. package/dist/components/icons/iconRegistry.d.ts +80 -0
  35. package/dist/components/onboarding/OnboardingController.d.ts +7 -0
  36. package/dist/components/onboarding/PromotionPanel.d.ts +9 -1
  37. package/dist/components/template/quickRunNotice.d.ts +13 -0
  38. package/dist/hooks/useConfirm.d.ts +3 -1
  39. package/dist/hooks/useShortcuts.d.ts +1 -1
  40. package/dist/import/common.d.ts +7 -1
  41. package/dist/import/selection.d.ts +17 -0
  42. package/dist/index.d.ts +5 -2
  43. package/dist/library/versionStatus.d.ts +2 -2
  44. package/dist/logo.svg +9 -36
  45. package/dist/onboarding/naming.d.ts +5 -0
  46. package/dist/onboarding/poll.d.ts +6 -3
  47. package/dist/parser/conductorGenerator.d.ts +17 -2
  48. package/dist/product-launch.html +10 -1394
  49. package/dist/providers/types.d.ts +2 -0
  50. package/dist/reactflow-ui-ai.es.js +18497 -14329
  51. package/dist/reactflow-ui.css +1 -1
  52. package/dist/reactflow-ui.es.js +21578 -15400
  53. package/dist/reactflow-ui.umd.js +183 -41
  54. package/dist/sample-workflows/complex-workflow.json +8 -4
  55. package/dist/sample-workflows/decision-workflow.json +1 -0
  56. package/dist/sample-workflows/ecs-lifecycle-automation.json +37 -4
  57. package/dist/services/ai/agentRunner.d.ts +46 -1
  58. package/dist/services/ai/errorMessages.d.ts +9 -1
  59. package/dist/services/ai/protocolAdapter.d.ts +5 -0
  60. package/dist/services/ai/systemPrompt.d.ts +1 -1
  61. package/dist/services/ai/toolExecutor.d.ts +26 -0
  62. package/dist/services/ai/workflowSynthesizer.d.ts +4 -4
  63. package/dist/services/aiService.d.ts +5 -1
  64. package/dist/stepmodel/compile.d.ts +2 -1
  65. package/dist/stepmodel/factory.d.ts +5 -0
  66. package/dist/stepmodel/pills.d.ts +32 -0
  67. package/dist/stepmodel/types.d.ts +10 -0
  68. package/dist/stepmodel/validate.d.ts +20 -0
  69. package/dist/store/aiStore.d.ts +30 -5
  70. package/dist/store/sandboxRunObserver.d.ts +2 -1
  71. package/dist/store/workflowStore.d.ts +8 -9
  72. package/dist/template/templateStore.d.ts +6 -0
  73. package/dist/template/types.d.ts +1 -0
  74. package/dist/types/conductor.d.ts +25 -1
  75. package/dist/types/workflow.d.ts +38 -3
  76. package/dist/types/workflowLibrary.d.ts +5 -5
  77. package/dist/utils/executionAnalyzer.d.ts +5 -0
  78. package/dist/utils/executionImport.d.ts +52 -0
  79. package/dist/utils/executionPoller.d.ts +37 -0
  80. package/dist/utils/hostSave.d.ts +10 -0
  81. package/dist/utils/localSandboxEngine.d.ts +51 -6
  82. package/dist/utils/runStory.d.ts +20 -0
  83. package/dist/utils/sameWorkflow.d.ts +6 -0
  84. package/dist/utils/sandbox/jq.d.ts +13 -0
  85. package/dist/utils/sandbox/scriptRunner.d.ts +38 -0
  86. package/dist/utils/sandbox/switchHints.d.ts +17 -0
  87. package/dist/utils/statusMeta.d.ts +35 -0
  88. package/dist/utils/taskEditing.d.ts +59 -0
  89. package/dist/utils/taskTypeMeta.d.ts +1 -0
  90. package/dist/utils/validationRules.d.ts +29 -4
  91. package/package.json +6 -2
@@ -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
- "topic": "workflow-notifications",
170
- "message": {
171
- "workflowId": "${workflow.workflowId}",
172
- "status": "completed"
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
  }
@@ -91,6 +91,7 @@
91
91
  "name": "log_unknown_user",
92
92
  "taskReferenceName": "log_unknown_ref",
93
93
  "type": "EVENT",
94
+ "sink": "conductor",
94
95
  "inputParameters": {
95
96
  "event": "unknown_user_type",
96
97
  "userId": "${workflow.input.userId}"
@@ -16,7 +16,18 @@
16
16
  "instanceType": "ecs.c7.xlarge",
17
17
  "imageId": "image-alilinux-3",
18
18
  "instanceName": "app-server-node",
19
- "systemDiskSize": 120
19
+ "systemDiskSize": 120,
20
+ "http_request": {
21
+ "uri": "https://ecs.internal.cloud/api/v2/instances",
22
+ "method": "POST",
23
+ "body": {
24
+ "regionId": "cn-hangzhou",
25
+ "instanceType": "ecs.c7.xlarge",
26
+ "imageId": "image-alilinux-3",
27
+ "instanceName": "app-server-node",
28
+ "systemDiskSize": 120
29
+ }
30
+ }
20
31
  }
21
32
  },
22
33
  {
@@ -27,7 +38,11 @@
27
38
  "inputParameters": {
28
39
  "_actionId": "ecs.query_instance",
29
40
  "actionName": "查询云主机详情",
30
- "instanceId": "${create_app_node.output.instanceId}"
41
+ "instanceId": "${create_app_node.output.instanceId}",
42
+ "http_request": {
43
+ "uri": "https://ecs.internal.cloud/api/v2/instances/${create_app_node.output.instanceId}",
44
+ "method": "GET"
45
+ }
31
46
  }
32
47
  },
33
48
  {
@@ -41,7 +56,16 @@
41
56
  "instanceId": "${create_app_node.output.instanceId}",
42
57
  "commandType": "RunShellScript",
43
58
  "commandContent": "yum update -y && systemctl start docker && docker ps",
44
- "timeoutSeconds": 60
59
+ "timeoutSeconds": 60,
60
+ "http_request": {
61
+ "uri": "https://ecs.internal.cloud/api/v2/instances/${create_app_node.output.instanceId}/commands",
62
+ "method": "POST",
63
+ "body": {
64
+ "commandType": "RunShellScript",
65
+ "commandContent": "yum update -y && systemctl start docker && docker ps",
66
+ "timeoutSeconds": 60
67
+ }
68
+ }
45
69
  }
46
70
  },
47
71
  {
@@ -54,13 +78,22 @@
54
78
  "actionName": "创建云盘快照",
55
79
  "instanceId": "${create_app_node.output.instanceId}",
56
80
  "snapshotName": "init-baseline-snapshot",
57
- "retentionDays": 14
81
+ "retentionDays": 14,
82
+ "http_request": {
83
+ "uri": "https://ecs.internal.cloud/api/v2/instances/${create_app_node.output.instanceId}/snapshots",
84
+ "method": "POST",
85
+ "body": {
86
+ "snapshotName": "init-baseline-snapshot",
87
+ "retentionDays": 14
88
+ }
89
+ }
58
90
  }
59
91
  },
60
92
  {
61
93
  "name": "send_operation_notification",
62
94
  "taskReferenceName": "notify_devops_team",
63
95
  "type": "EVENT",
96
+ "sink": "conductor",
64
97
  "description": "发送协同群通知",
65
98
  "inputParameters": {
66
99
  "_actionId": "notify.send_message",
@@ -39,18 +39,61 @@ export interface AgentRunnerStores {
39
39
  /** 本 IDE 实例的流程库目录;提供后用于固定子工作流版本与服务端检索 */
40
40
  libraryCatalog?: LibraryCatalog;
41
41
  }
42
+ export interface SendOptions {
43
+ /**
44
+ * 发给模型的文本(缺省等于展示文本)。用于把聊天里看不到的上下文一起带给模型,
45
+ * 例如"执行方案"要附上计划步骤、澄清选项要附上原问题。
46
+ */
47
+ modelText?: string;
48
+ /**
49
+ * A18:有未完成的断点时,默认先不发送,交给界面让用户选择;传 true 表示用户已确认放弃断点。
50
+ */
51
+ discardCheckpoint?: boolean;
52
+ }
53
+ /** 把待执行计划整理成随"执行方案"一起发给模型的文本(计划卡片的步骤不在聊天记录里) */
54
+ export declare function formatPlanForModel(plan: {
55
+ title: string;
56
+ steps: Array<{
57
+ step: number;
58
+ action: string;
59
+ tool?: string;
60
+ }>;
61
+ summary?: string;
62
+ }): string;
63
+ /** 把用户选择的澄清选项连同原问题一起整理给模型(只发标签时模型不知道在回答什么) */
64
+ export declare function formatClarificationAnswer(clarification: {
65
+ question: string;
66
+ context?: string;
67
+ }, option: {
68
+ label: string;
69
+ description?: string;
70
+ }): string;
42
71
  export declare class AgentRunner {
43
72
  private getOptions;
44
73
  private stores;
45
74
  private controller;
75
+ /** reset() 之后,仍在收尾的旧会话不能再写断点 / 消息(否则"清空对话"后断点卡片又回来了) */
76
+ private generation;
46
77
  constructor(getOptions: () => AgentRunnerOptions, stores: AgentRunnerStores);
47
78
  abort(): void;
79
+ /** 中止当前会话并丢弃它的收尾写入(断点、消息、流式状态)。用于"清空对话"。 */
80
+ reset(): void;
81
+ private transportMode;
48
82
  private toolExecutionContext;
49
83
  /** 子工作流版本固定:把目录里的「当前最新版本」以查询函数的形式注入纯函数的工具执行层 */
50
84
  private latestVersionResolver;
51
85
  private buildHistory;
52
86
  /** 服务端检索:Provider 没有 search、或检索失败时返回 undefined(调用方退回本地匹配) */
53
87
  private serverLibrarySearch;
88
+ /** 取流程库中某个工作流的完整定义(目录未提供 / 取不到时返回 null) */
89
+ private fetchLibraryDefinition;
90
+ private publishProposal;
91
+ /**
92
+ * 推荐卡片"直接使用":不经过模型,直接把流程库中的工作流变成待确认方案。
93
+ * 流程库提供完整定义时打开该定义;只有摘要时以 SUB_WORKFLOW 步骤引用它。
94
+ * 返回是否生成了方案。
95
+ */
96
+ useLibraryWorkflow(name: string): Promise<boolean>;
54
97
  /**
55
98
  * Immediately promotes the current in-progress `workingDraft` (from an interrupted or paused
56
99
  * multi-phase session) into a reviewable `pendingProposal`.
@@ -61,6 +104,8 @@ export declare class AgentRunner {
61
104
  * Optionally accepts a `steerInput` instruction from the user to guide the remaining phases.
62
105
  */
63
106
  resume(steerInput?: string): Promise<void>;
64
- send(text: string): Promise<void>;
107
+ send(text: string, options?: SendOptions): Promise<void>;
65
108
  private runDurableLoop;
109
+ /** 停止生成:保留已经流式输出的文字,只在末尾注明已中止 */
110
+ private abortedText;
66
111
  }
@@ -13,4 +13,12 @@ export interface HumanizedError {
13
13
  /** 原始错误文本,仅用于审计事件,不展示给用户 */
14
14
  raw: string;
15
15
  }
16
- export declare function humanizeAiError(rawMessage: string | undefined | null): HumanizedError;
16
+ /** 错误发生时使用的传输方式:决定"怎么修"该找谁(自己的 API Key,还是代理服务的管理员) */
17
+ export type AiTransportMode = 'direct' | 'endpoint' | 'custom';
18
+ export interface HumanizeOptions {
19
+ /** 缺省视为 direct(浏览器直连模型服务商) */
20
+ mode?: AiTransportMode;
21
+ }
22
+ /** 直连模式下浏览器 fetch 抛出 TypeError 时的标记前缀(protocolAdapter 产生) */
23
+ export declare const DIRECT_FETCH_FAILED = "DIRECT_FETCH_FAILED";
24
+ export declare function humanizeAiError(rawMessage: string | undefined | null, options?: HumanizeOptions): HumanizedError;
@@ -106,6 +106,11 @@ export declare const PROVIDER_DEFAULTS: {
106
106
  readonly model: "claude-sonnet-4-6";
107
107
  };
108
108
  };
109
+ /**
110
+ * OpenAI o 系列推理模型(o1 / o3 / o4-mini …)与 gpt-5 系列只接受默认 temperature,
111
+ * 传 0.7 会直接 400。对这些模型不发送 temperature。
112
+ */
113
+ export declare function modelSupportsTemperature(model: string): boolean;
109
114
  export declare function streamChat(messages: Message[], tools: ToolDef[], config: AiConfig, signal?: AbortSignal): AsyncGenerator<StreamEvent>;
110
115
  export interface TestConnectionResult {
111
116
  ok: boolean;
@@ -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- **\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 `caseValueParam` \u6216 `caseExpression`\uFF0C\u4EE5\u53CA `decisionCases` \u952E\u503C\u5BF9\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\uD83D\uDC64 \u4EBA\u5DE5\u300D";
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
  *
@@ -94,12 +94,38 @@ export interface ToolExecutionContext {
94
94
  * 提供时 search_workflow_library 直接展示这些结果,不再在 libraryItems 内本地匹配。
95
95
  */
96
96
  librarySearchResults?: WorkflowLibraryItem[];
97
+ /**
98
+ * load_library_workflow 用:调用方预取的流程库完整定义(通常来自 LibraryCatalog.getVersion)。
99
+ * 只有摘要、取不到定义时为 null / undefined。
100
+ */
101
+ libraryWorkflowDef?: WorkflowDef | null;
97
102
  }
98
103
  /** 工作流库检索结果最多展示的条数(目录可能有上千项,避免一次塞满上下文) */
99
104
  export declare const LIBRARY_SEARCH_RESULT_LIMIT = 50;
105
+ export interface PatchReport {
106
+ workflow: WorkflowDef;
107
+ /** 没有生效的操作(目标 ref 不存在、父任务类型不支持等),每条附原因 */
108
+ unmatched: string[];
109
+ }
110
+ /**
111
+ * 应用 patch 操作并报告没有生效的操作。找不到目标时不再静默跳过或追加到末尾:
112
+ * 调用方(patch_workflow)据此返回失败结果,让模型修正 ref 后重试。
113
+ */
114
+ export declare function applyPatchWithReport(def: WorkflowDef, ops: PatchOp[]): PatchReport;
115
+ /** 应用 patch 操作(没有生效的操作会被忽略;需要知道哪些没生效时用 applyPatchWithReport) */
100
116
  export declare function applyPatch(def: WorkflowDef, ops: PatchOp[]): WorkflowDef;
117
+ /**
118
+ * 计算两份定义的任务差异。会递归进入 SWITCH 分支、FORK 并行分支和 DO_WHILE 循环体,
119
+ * 嵌套任务的新增 / 修改 / 删除同样会列出(之前只比较顶层任务,分支内的改动被漏掉)。
120
+ */
101
121
  export declare function computeDiff(before: WorkflowDef | null, after: WorkflowDef): DiffSummary;
102
122
  export declare function executeToolCall(toolName: string, args: Record<string, any>, ctx: ToolExecutionContext): ToolCallResult;
123
+ /**
124
+ * 把流程库里的一个工作流变成待确认方案(load_library_workflow 与推荐卡片的"直接使用"共用):
125
+ * - mode=open:流程库提供了完整定义时,以该定义作为方案(相对画布计算差异)
126
+ * - mode=reference:在当前草稿 / 画布末尾追加一个引用它的 SUB_WORKFLOW 步骤(版本固定为库当前版本)
127
+ */
128
+ export declare function buildLibraryWorkflowProposal(args: Record<string, any>, ctx: ToolExecutionContext): ToolCallResult;
103
129
  /**
104
130
  * Applies only the user-selected subset of changes from a proposal.
105
131
  * Used when the user accepts some changes but rejects others in ReviewBar.
@@ -104,10 +104,10 @@ export declare function normalizeWorkflowDef(def: WorkflowDef, options?: Normali
104
104
  autoFixed: string[];
105
105
  };
106
106
  /**
107
- * 只做「SUB_WORKFLOW 固定版本」的轻量规范化(供 replace_workflow / patch_workflow 使用,
107
+ * 只做 SUB_WORKFLOW 引用的轻量规范化(供 replace_workflow / patch_workflow 使用,
108
108
  * 这两条路径不经过完整的 normalizeWorkflowDef):
109
- * 为新建的、未记录版本的子工作流任务填入流程库当前版本。已有版本号、画布上已存在的任务一律不改。
110
- * 未提供 resolveLatestVersion 时原样返回。
109
+ * - `workflowName` 写法规范化为 `subWorkflowParam.name`(否则 Conductor 拒收)
110
+ * - 为新建的、未记录版本的子工作流任务填入流程库当前版本。已有版本号、画布上已存在的任务一律不改。
111
111
  */
112
112
  export declare function pinSubWorkflowVersions(def: WorkflowDef, options: NormalizeOptions): {
113
113
  workflow: WorkflowDef;
@@ -120,7 +120,7 @@ export declare function applyBlueprint(currentDraft: WorkflowDef | null, args: B
120
120
  /**
121
121
  * Phase 2: Scaffolds the task orchestration topology on top of the blueprint.
122
122
  */
123
- export declare function applyTopologyScaffold(currentDraft: WorkflowDef | null, args: TopologyArgs): {
123
+ export declare function applyTopologyScaffold(currentDraft: WorkflowDef | null, args: TopologyArgs, options?: NormalizeOptions): {
124
124
  workflow: WorkflowDef;
125
125
  autoFixed: string[];
126
126
  };
@@ -12,10 +12,14 @@ export interface ChatMessage {
12
12
  role: 'system' | 'user' | 'assistant';
13
13
  content: string;
14
14
  }
15
+ /** 未配置 AI 服务时抛出的错误文案(调用方直接展示给用户) */
16
+ export declare const AI_NOT_CONFIGURED_MESSAGE = "\u672A\u914D\u7F6E AI \u670D\u52A1\u3002\u8BF7\u5148\u586B\u5199 API Key\uFF08\u96C6\u6210\u65B9\u901A\u8FC7 aiConfig \u4F20\u5165\uFF0C\u6216\u5728 AI \u8BBE\u7F6E\u4E2D\u586B\u5199\uFF09\u540E\u91CD\u8BD5\u3002";
17
+ /** 是否已配置可用的 AI 服务:direct 模式需要 apiKey,endpoint / custom 传输不需要 */
18
+ export declare function isAiConfigured(config: Partial<AIServiceConfig> | null | undefined): boolean;
15
19
  /**
16
20
  * 非流式调用(兼容旧逻辑)
17
21
  */
18
- export declare const callAICopilot: (messages: ChatMessage[], config?: Partial<AIServiceConfig>, signal?: AbortSignal) => Promise<any>;
22
+ export declare const callAICopilot: (messages: ChatMessage[], config?: Partial<AIServiceConfig>, signal?: AbortSignal) => Promise<string>;
19
23
  /**
20
24
  * 流式调用 - 通过 onToken 回调逐 token 返回内容
21
25
  */
@@ -4,8 +4,9 @@ import { ActionRegistry } from '../actions/registry';
4
4
  export declare function compileStepToTaskDef(step: BusinessStep, index: number, workflowName: string, registry?: ActionRegistry): TaskDef;
5
5
  /**
6
6
  * 编译一组顺序步骤(顶层、分支内、泳道内、循环体内通用,可任意层级嵌套)。
7
- * 遇到 FORK_JOIN 时,会在其后自动补全配对的 JOIN 节点,
7
+ * 遇到并行组时,会在其后自动补全配对的 JOIN 节点,
8
8
  * joinOn 取各泳道编译后的最后一个任务(若泳道末尾是嵌套并行,则为其 JOIN)。
9
+ * 以专业步骤保留的动态并行(FORK_JOIN_DYNAMIC)同样输出其配对 JOIN。
9
10
  */
10
11
  export declare function compileStepList(steps: BusinessStep[], workflowName: string, registry?: ActionRegistry): TaskDef[];
11
12
  export declare function compileStepModelToWorkflowDef(model: BusinessWorkflowModel, registry?: ActionRegistry): WorkflowDef;
@@ -1,5 +1,10 @@
1
1
  import type { ActionDefinition } from '../actions/types';
2
2
  import type { BusinessStep } from './types';
3
+ /** 新建条件分支时,判断取值所在的入参名(inputParameters[caseValue]) */
4
+ export declare const DEFAULT_CASE_PARAM = "caseValue";
5
+ /** 新建循环的默认继续条件:按本循环自身的已执行轮次判断,最多执行 3 轮 */
6
+ export declare const DEFAULT_LOOP_MAX_ITERATIONS = 3;
7
+ export declare function defaultLoopCondition(loopRef: string, maxIterations?: number): string;
3
8
  /**
4
9
  * 根据动作定义创建一个新的业务步骤。
5
10
  * 控制流动作(分支 / 并行 / 循环)会生成带 controlType 的容器步骤,
@@ -0,0 +1,32 @@
1
+ import type { BusinessStep } from './types';
2
+ import type { ActionRegistry } from '../actions/registry';
3
+ export interface PillItem {
4
+ /** 引用路径(不含 `${}`),如 "create_vm.output.instanceId" */
5
+ rawRef: string;
6
+ label: string;
7
+ type: string;
8
+ example?: any;
9
+ /** 来源步骤的展示名 */
10
+ stepLabel: string;
11
+ }
12
+ export interface PillGroup {
13
+ /** 分组唯一键(来源引用名) */
14
+ key: string;
15
+ title: string;
16
+ icon: string;
17
+ /** 取值说明,如"仅在分支 A 命中时有值" */
18
+ note?: string;
19
+ items: PillItem[];
20
+ }
21
+ /** 并行组配对的 JOIN 引用名(与编译时补全的 JOIN 一致) */
22
+ export declare const joinRefOf: (step: BusinessStep) => string;
23
+ /**
24
+ * 生成数据胶囊选择器的可选项:
25
+ * - 工作流全局入参
26
+ * - 上游普通步骤的输出
27
+ * - 上游控制流内部(分支 / 泳道 / 循环体,任意层级)的步骤输出,并说明何时有值
28
+ * - 并行组引用其 JOIN 的汇聚输出;循环引用其已执行轮次
29
+ */
30
+ export declare function buildPillGroups(upstreamSteps: BusinessStep[], registry: ActionRegistry, workflowInputParams?: any[]): PillGroup[];
31
+ /** 把 `${...}` 内的引用翻译成可读标签;找不到时退回较通用的说明 */
32
+ export declare function describePillRef(ref: string, groups: PillGroup[]): string;
@@ -46,11 +46,21 @@ export interface BusinessStep {
46
46
  /** 引用流程库能力时记录的名称与版本(首次引用时固定,不随库升级自动变化) */
47
47
  libraryRef?: LibraryRef;
48
48
  controlType?: StepControlType;
49
+ /**
50
+ * 按参数取值时的参数名(DECISION 的 caseValueParam / SWITCH value-param 的 expression),如 "userType"。
51
+ * 判断用的取值本身绑定在 values[caseParam](编译为 inputParameters[caseParam],可为数据胶囊)。
52
+ */
49
53
  caseParam?: string;
54
+ /**
55
+ * 按表达式判断时的脚本(DECISION 的 caseExpression / SWITCH javascript 的 expression)。
56
+ * 不为 undefined(含空字符串)即表示"表达式模式",此时 caseParam 不参与编译。
57
+ */
50
58
  caseExpression?: string;
51
59
  branches?: BranchCase[];
52
60
  forkLanes?: ForkLane[];
53
61
  pairedJoinTaskRef?: string;
62
+ /** 反编译时配对 JOIN 的原始定义(保留其 name / description 等字段,往返不丢失) */
63
+ pairedJoinTaskDef?: TaskDef;
54
64
  loopCondition?: string;
55
65
  loopSteps?: BusinessStep[];
56
66
  }
@@ -0,0 +1,20 @@
1
+ import type { BusinessStep } from './types';
2
+ import type { ActionRegistry } from '../actions/registry';
3
+ import type { ValidationResults } from '../types/workflow';
4
+ export interface StepIssue {
5
+ /** 对应的表单字段 key;为空表示整步的问题 */
6
+ field?: string;
7
+ level: 'error' | 'warning';
8
+ message: string;
9
+ }
10
+ /** taskReferenceName -> 该步骤的问题列表 */
11
+ export type StepIssueMap = Record<string, StepIssue[]>;
12
+ /**
13
+ * 业务模式的步骤校验(纯函数):必填字段、数字字段、分支判断依据、循环条件、空泳道。
14
+ * 递归检查分支 / 泳道 / 循环体内的步骤。
15
+ */
16
+ export declare function validateBusinessSteps(steps: BusinessStep[], registry: ActionRegistry, map?: StepIssueMap): StepIssueMap;
17
+ /** 把工作流校验器(validateWorkflow)的结果按任务引用名归类,合并进业务校验结果 */
18
+ export declare function mergeWorkflowValidation(map: StepIssueMap, results?: ValidationResults | null): StepIssueMap;
19
+ /** 收集一个步骤及其内部所有步骤的问题(容器卡片徽标用) */
20
+ export declare function collectIssues(step: BusinessStep, map: StepIssueMap): StepIssue[];
@@ -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,21 +218,33 @@ 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
- setRetryInput: (input: string | null) => void;
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;
234
+ /** 允许写入 localStorage 的配置字段:只有 provider / baseUrl / model(apiKey、transport、endpoint 请求头一律不落盘) */
235
+ export declare function pickPersistedAiConfig(config: Partial<AiConfig> | undefined | null): Partial<AiConfig>;
236
+ /** 从 localStorage 恢复时只取安全字段(旧版本落盘的 transport / endpoint 请求头被丢弃) */
237
+ export declare function mergePersistedAiState<T extends {
238
+ config: AiConfig;
239
+ metrics: AiMetrics;
240
+ }>(persisted: unknown, current: T): T;
216
241
  /**
217
242
  * Creates an independent AiStore instance.
218
243
  *
219
244
  * @param persistKey localStorage key for provider/baseUrl/model + metrics (never
220
- * the apiKey or conversation itself). Pass `false` to keep this
221
- * instance fully in-memory — no localStorage writes at all.
222
- * Defaults to a stable shared key so existing single-instance
245
+ * the apiKey, transport / endpoint headers, or the conversation itself).
246
+ * Pass `false` to keep this instance fully in-memory — no localStorage
247
+ * writes at all. Defaults to a stable shared key so existing single-instance
223
248
  * integrations keep their persisted config across reloads;
224
249
  * pass a unique key per instance when embedding multiple
225
250
  * `<AiWorkflowIDE>` on the same page to avoid them clobbering
@@ -6,7 +6,8 @@
6
6
  * 不传输入 / 输出数据。业务模式(StepFlowEditor)与模板试跑不经过该 action,由各自的回调上报,因此不会重复。
7
7
  * - 新增步骤:画布「+」与 Cmd+K 内联 Copilot 都经过 store 的 `addNode`,来源固定为 'builtin'。
8
8
  *
9
- * 模块级集合:IDE 挂载时订阅、卸载时取消。store 本身是页面内单例,同一页面挂载多个 IDE 时各自都会收到通知。
9
+ * 模块级集合:IDE 挂载时订阅、卸载时取消。store 本身是页面内单例,同一页面同时挂载 WorkflowIDE 与 AiWorkflowIDE
10
+ * 时两者都会订阅;一次试跑只应上报一次,所以每次通知只交给最近订阅的那一个观察者(它卸载后,前一个接替)。
10
11
  */
11
12
  export type SandboxRunObserver = (result: string) => void;
12
13
  export type StepAddedObserver = (source: 'builtin') => void;
@@ -1,5 +1,11 @@
1
- import { WorkflowStore, LayoutDirection, EditorMode, ThemeMode, ThemeColor } from '../types/workflow';
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;
@@ -15,17 +21,10 @@ declare const useWorkflowStore: import("zustand").UseBoundStore<Omit<Omit<import
15
21
  }, "temporal"> & {
16
22
  temporal: import("zustand").StoreApi<import("zundo").TemporalState<{
17
23
  workflowDef: WorkflowDef | null;
18
- layoutDirection: LayoutDirection;
19
24
  nodes: import("../types/workflow").WorkflowNode[];
20
- graphStale: boolean;
21
25
  edges: import("reactflow").Edge[];
22
26
  taskMap: Record<string, TaskDef>;
23
- theme: ThemeMode;
24
- themeColor: ThemeColor;
25
- mode: EditorMode;
26
- edgeType: string;
27
- nodesLocked: boolean;
28
- copiedTask: TaskDef | null;
27
+ graphStale: boolean;
29
28
  }>>;
30
29
  }>;
31
30
  export default useWorkflowStore;
@@ -4,11 +4,17 @@ import type { WorkflowTemplate, TemplateCategory } from './types';
4
4
  */
5
5
  export declare class TemplateStore {
6
6
  private templates;
7
+ private version;
8
+ private listeners;
7
9
  constructor(initialTemplates?: WorkflowTemplate[]);
8
10
  /**
9
11
  * 注册单个工作流模板
10
12
  */
11
13
  register(template: WorkflowTemplate): void;
14
+ /** 每次注册后递增;界面据此刷新(R17) */
15
+ getVersion: () => number;
16
+ /** 订阅模板变化(兼容 React useSyncExternalStore);返回取消订阅函数 */
17
+ subscribe: (listener: () => void) => (() => void);
12
18
  /**
13
19
  * 批量注册工作流模板
14
20
  */
@@ -63,6 +63,7 @@ export interface WorkflowTemplate {
63
63
  /** 所属业务分类 */
64
64
  category: TemplateCategory;
65
65
  /** 模板视觉图标 Emoji */
66
+ /** CMASTER icon name (components/icons/iconRegistry.ts, e.g. 'rocket'); legacy emoji still render via aliases. */
66
67
  icon: string;
67
68
  /** 一句话核心业务价值主张(拒绝技术罗列,讲清节省的时间与业务成效) */
68
69
  valueProposition: string;