wechen-agent-editor-v1 1.0.0
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/LICENSE +21 -0
- package/README.md +196 -0
- package/dist/WechenAgentEditor.d.ts +51 -0
- package/dist/WechenAgentEditor.d.ts.map +1 -0
- package/dist/WechenAgentEditorContext.d.ts +10 -0
- package/dist/WechenAgentEditorContext.d.ts.map +1 -0
- package/dist/config/componentLibraryConfig.d.ts +77 -0
- package/dist/config/componentLibraryConfig.d.ts.map +1 -0
- package/dist/config/componentLibraryDynamic.d.ts +10 -0
- package/dist/config/componentLibraryDynamic.d.ts.map +1 -0
- package/dist/config/componentLibraryIconTypes.d.ts +6 -0
- package/dist/config/componentLibraryIconTypes.d.ts.map +1 -0
- package/dist/flow/WechenAgentEdgeFlowStyles.d.ts +6 -0
- package/dist/flow/WechenAgentEdgeFlowStyles.d.ts.map +1 -0
- package/dist/flow/dragPayload.d.ts +11 -0
- package/dist/flow/dragPayload.d.ts.map +1 -0
- package/dist/flow/dropNodes.d.ts +12 -0
- package/dist/flow/dropNodes.d.ts.map +1 -0
- package/dist/flow/flowJsonUtils.d.ts +15 -0
- package/dist/flow/flowJsonUtils.d.ts.map +1 -0
- package/dist/flow/initialFlow.d.ts +9 -0
- package/dist/flow/initialFlow.d.ts.map +1 -0
- package/dist/flow/mergeNodeData.d.ts +11 -0
- package/dist/flow/mergeNodeData.d.ts.map +1 -0
- package/dist/flow/nodeTypes.d.ts +9 -0
- package/dist/flow/nodeTypes.d.ts.map +1 -0
- package/dist/flow/nodes/CardNode.d.ts +3 -0
- package/dist/flow/nodes/CardNode.d.ts.map +1 -0
- package/dist/flow/nodes/MainAgentNode.d.ts +3 -0
- package/dist/flow/nodes/MainAgentNode.d.ts.map +1 -0
- package/dist/flow/nodes/PillNode.d.ts +3 -0
- package/dist/flow/nodes/PillNode.d.ts.map +1 -0
- package/dist/flow/wechenAgentEdgeTypes.d.ts +11 -0
- package/dist/flow/wechenAgentEdgeTypes.d.ts.map +1 -0
- package/dist/flowTypes.d.ts +118 -0
- package/dist/flowTypes.d.ts.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9309 -0
- package/dist/index.js.map +1 -0
- package/dist/panels/ComponentLibraryPanel.d.ts +6 -0
- package/dist/panels/ComponentLibraryPanel.d.ts.map +1 -0
- package/dist/panels/EdgeConfigPanel.d.ts +8 -0
- package/dist/panels/EdgeConfigPanel.d.ts.map +1 -0
- package/dist/panels/NodeConfigPanel.d.ts +25 -0
- package/dist/panels/NodeConfigPanel.d.ts.map +1 -0
- package/dist/panels/RightConfigPanel.d.ts +17 -0
- package/dist/panels/RightConfigPanel.d.ts.map +1 -0
- package/dist/panels/libraryIconRender.d.ts +7 -0
- package/dist/panels/libraryIconRender.d.ts.map +1 -0
- package/dist/panels/libraryPalette.d.ts +5 -0
- package/dist/panels/libraryPalette.d.ts.map +1 -0
- package/dist/panels/paletteAntIcon.d.ts +18 -0
- package/dist/panels/paletteAntIcon.d.ts.map +1 -0
- package/dist/wechenAgentConfigPanel.d.ts +32 -0
- package/dist/wechenAgentConfigPanel.d.ts.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { RefObject } from 'react';
|
|
2
|
+
import { Edge, FitViewOptions, Node, Viewport, ViewportHelperFunctionOptions } from '@xyflow/react';
|
|
3
|
+
/**
|
|
4
|
+
* 画布完整结构(初始值与持久化):`title` + `nodes` + `edges`。
|
|
5
|
+
* **`initialFlow` prop** 与 **`WechenAgentSnapshot.flow`**(以及 `flowJson` 反序列化结果)为同一形状,可互换使用。
|
|
6
|
+
* 持久化时不会包含 React Flow 运行期字段(如 `measured`),与 `defaultInitialFlow` 一致。
|
|
7
|
+
*/
|
|
8
|
+
export interface WechenAgentFlowJson {
|
|
9
|
+
/** 画布/方案标题;保存时写入 `flow` / `flowJson` */
|
|
10
|
+
title?: string;
|
|
11
|
+
nodes: Node[];
|
|
12
|
+
edges: Edge[];
|
|
13
|
+
}
|
|
14
|
+
/** Extra fields stored on the main Agent canvas node */
|
|
15
|
+
export interface MainAgentNodeData extends Record<string, unknown> {
|
|
16
|
+
label: string;
|
|
17
|
+
baseModel: string;
|
|
18
|
+
version: string;
|
|
19
|
+
strategy: string;
|
|
20
|
+
systemPrompt: string;
|
|
21
|
+
maxSteps: number;
|
|
22
|
+
tools: {
|
|
23
|
+
id: string;
|
|
24
|
+
title: string;
|
|
25
|
+
description: string;
|
|
26
|
+
}[];
|
|
27
|
+
}
|
|
28
|
+
export interface SimpleNodeData extends Record<string, unknown> {
|
|
29
|
+
label: string;
|
|
30
|
+
}
|
|
31
|
+
/** Payload passed to `onSave` / `onTestRun` */
|
|
32
|
+
export interface WechenAgentSnapshot {
|
|
33
|
+
/** 当前生效标题(`props.title ?? initialFlow.title ?? 内置默认`) */
|
|
34
|
+
title: string;
|
|
35
|
+
nodes: Node[];
|
|
36
|
+
edges: Edge[];
|
|
37
|
+
/**
|
|
38
|
+
* 完整画布对象,与 `defaultInitialFlow` / `initialFlow` 同形(`title` + `nodes` + `edges`),
|
|
39
|
+
* **深拷贝**;推荐持久化或 `JSON.stringify` 时使用本字段。
|
|
40
|
+
*/
|
|
41
|
+
flow: WechenAgentFlowJson;
|
|
42
|
+
/**
|
|
43
|
+
* 与 `flow` 等价内容的 JSON 字符串,兼容仅需 POST 字符串的集成;新代码优先使用 **`flow`**。
|
|
44
|
+
*/
|
|
45
|
+
flowJson: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 传给 `renderHeaderActions` 的上下文:语义化操作与宿主 `ref` 一致,便于自定义顶栏右侧时调用。
|
|
49
|
+
*/
|
|
50
|
+
export interface WechenAgentHeaderActionsRenderContext {
|
|
51
|
+
/** 与默认「保存」、`ref.save()` 相同(触发 `onSave` 若已传入) */
|
|
52
|
+
save: () => void;
|
|
53
|
+
/** 与默认「测试运行」、`ref.testRun()` 相同(触发 `onTestRun` 若已传入) */
|
|
54
|
+
testRun: () => void;
|
|
55
|
+
/**
|
|
56
|
+
* 与 `<WechenAgentEditor ref={...} />` 为同一 ref 对象(推荐对象 ref)。
|
|
57
|
+
* 首帧或 StrictMode 下 `current` 可能为 `null`,应在事件或 `useEffect` 内使用。
|
|
58
|
+
*/
|
|
59
|
+
editorRef: RefObject<WechenAgentEditorRef | null>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* `WechenAgentEditor` 通过 `ref` 暴露的实例(与顶栏「保存」「测试运行」及右侧面板行为一致)。
|
|
63
|
+
*/
|
|
64
|
+
export interface WechenAgentEditorRef {
|
|
65
|
+
/** 解析后的顶栏/持久化标题(`title` prop → `replaceFlow` 写入的 title → `initialFlow.title` → 默认) */
|
|
66
|
+
getTitle(): string;
|
|
67
|
+
getSnapshot(): WechenAgentSnapshot;
|
|
68
|
+
/** 规范化后的完整画布(无 React Flow 运行期字段) */
|
|
69
|
+
getFlow(): WechenAgentFlowJson;
|
|
70
|
+
getNodes(): Node[];
|
|
71
|
+
getEdges(): Edge[];
|
|
72
|
+
/** 等同点击「保存」:调用 `onSave`(若已传入) */
|
|
73
|
+
save(): void;
|
|
74
|
+
/** 等同「测试运行」:调用 `onTestRun`(若已传入) */
|
|
75
|
+
testRun(): void;
|
|
76
|
+
/**
|
|
77
|
+
* 将 `patch` **深度合并**进指定节点的 **`node.data`**(内部为 `mergeNodeData`),与右侧节点配置 / `renderConfigPanel` 的 **`patchNode`** 一致。
|
|
78
|
+
*
|
|
79
|
+
* - **`patch` 表示 `data` 上的部分字段**,可包含 **多个顶层键**(一次调用统一写多字段);键集合与 `mergeNodeData` 的第二个参数相同。
|
|
80
|
+
* - **`patch` 的顶层键对应 `node.data` 的键**,不是整颗 React Flow `Node`(不含 `id` / `type` / `position`)。例:`patchNodeData(id, { label: "x" })` → `node.data.label`。
|
|
81
|
+
* - **错误嵌套**:不要用 `patchNodeData(id, { data: { label } })` 表示「把 `label` 写进 data」——除非业务模型里 **`node.data` 下确有名 `data` 的嵌套对象**;否则合并路径是 **`data.data.label`**,而非替换整个 `node.data`。
|
|
82
|
+
*/
|
|
83
|
+
patchNodeData(nodeId: string, patch: Record<string, unknown>): void;
|
|
84
|
+
/**
|
|
85
|
+
* 将 `patch` **浅合并**到边对象(`animated`、`label` 等顶层字段),与右侧连线配置 / `renderConfigPanel` 的 `patchEdge` 一致。
|
|
86
|
+
* 若 `patch` 含 **`data`**,则与现有 **`edge.data` 按键合并**(浅合并 `data` 对象),避免覆盖宿主在 `data` 中的其它键(如 `wechenFlowDirection`)。
|
|
87
|
+
*/
|
|
88
|
+
patchEdge(edgeId: string, patch: Partial<Edge>): void;
|
|
89
|
+
/** 用完整 flow 替换画布(深拷贝 + 规范化);会记录 `flow.title` 供后续 `getSnapshot` 使用 */
|
|
90
|
+
replaceFlow(flow: WechenAgentFlowJson): void;
|
|
91
|
+
/** 与右侧面板一致的选中节点 id;未选中节点时为 `null` */
|
|
92
|
+
getSelectedNodeId(): string | null;
|
|
93
|
+
/** 与右侧面板一致的选中边 id;未选中边时为 `null` */
|
|
94
|
+
getSelectedEdgeId(): string | null;
|
|
95
|
+
/**
|
|
96
|
+
* 选中节点并驱动右侧「节点配置」;与画布点击行为一致(会取消边选中)。
|
|
97
|
+
* 传入 `null` 表示清空节点与边的选中(等同画布空白处点击)。
|
|
98
|
+
*/
|
|
99
|
+
selectNode(nodeId: string | null): void;
|
|
100
|
+
/**
|
|
101
|
+
* 选中边并驱动右侧「连线配置」;与画布点击行为一致(会取消节点选中)。
|
|
102
|
+
* 传入 `null` 表示清空选中。
|
|
103
|
+
*/
|
|
104
|
+
selectEdge(edgeId: string | null): void;
|
|
105
|
+
/** 将视口适配为可见全部节点/边(封装 `@xyflow/react` 的 `fitView`) */
|
|
106
|
+
fitView(options?: FitViewOptions): Promise<boolean>;
|
|
107
|
+
/** 当前视口(封装 `getViewport`) */
|
|
108
|
+
getViewport(): Viewport;
|
|
109
|
+
/** 设置视口(封装 `setViewport`) */
|
|
110
|
+
setViewport(viewport: Viewport, options?: ViewportHelperFunctionOptions): void;
|
|
111
|
+
/** 删除节点并移除所有以该节点为端点的边;若删除的是当前选中节点则清空选中 */
|
|
112
|
+
removeNode(nodeId: string): void;
|
|
113
|
+
/** 删除边;若删除的是当前选中边则清空边选中 */
|
|
114
|
+
removeEdge(edgeId: string): void;
|
|
115
|
+
/** 与 `getSnapshot().flowJson` 相同,便于仅要字符串时使用 */
|
|
116
|
+
getFlowJson(): string;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=flowTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flowTypes.d.ts","sourceRoot":"","sources":["../src/flowTypes.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @packageDocumentation
|
|
3
|
+
* @li/wechen-agent — 可执行 AI 流程编排编辑器(节点=模块,连线=顺序/控制流;非仅关系图)。
|
|
4
|
+
*
|
|
5
|
+
* **宿主必做**
|
|
6
|
+
* - 安装下方 **peer** 依赖,并在入口引入 `@xyflow/react/dist/style.css`。
|
|
7
|
+
* - 配置 **Monaco worker**(见 README),否则代码编辑区无法初始化。
|
|
8
|
+
*
|
|
9
|
+
* **最小示例**
|
|
10
|
+
* ```tsx
|
|
11
|
+
* import "@xyflow/react/dist/style.css";
|
|
12
|
+
* import { WechenAgentEditor } from "@li/wechen-agent";
|
|
13
|
+
* <WechenAgentEditor onSave={(s) => api.save(s.flow)} />
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export { WechenAgentEditor } from './WechenAgentEditor';
|
|
17
|
+
export type { WechenAgentEditorProps } from './WechenAgentEditor';
|
|
18
|
+
export { WechenAgentEditorRenderContext, useWechenAgentEditorRender, } from './WechenAgentEditorContext';
|
|
19
|
+
export type { WechenAgentRenderFlowNodeFn } from './WechenAgentEditorContext';
|
|
20
|
+
export type { WechenAgentRenderNodeConfigFn } from './panels/NodeConfigPanel';
|
|
21
|
+
export type { WechenAgentConfigPanelContext, WechenAgentConfigPanelEdgeContext, WechenAgentConfigPanelNodeContext, WechenAgentRenderConfigPanelFn, } from './wechenAgentConfigPanel';
|
|
22
|
+
export type { ComponentLibraryGroup, ComponentLibraryIconSlot, ComponentLibraryItem, WechenAgentComponentLibraryGroupPayload, WechenAgentComponentLibraryItemPayload, WechenAgentComponentLibraryList, } from './config/componentLibraryConfig';
|
|
23
|
+
export { COMPONENT_LIBRARY_GROUP_APP, COMPONENT_LIBRARY_GROUP_MAIN, defaultAppAgentComponentItems, defaultMainAgentComponentItems, fromWechenAgentComponentLibraryList, getDefaultComponentLibraryGroups, isLibraryIconSet, isLibraryIconString, toWechenAgentComponentLibraryList, } from './config/componentLibraryConfig';
|
|
24
|
+
export { appendComponentToLibrary, removeComponentFromLibrary, } from './config/componentLibraryDynamic';
|
|
25
|
+
export type { MainAgentNodeData, SimpleNodeData, WechenAgentEditorRef, WechenAgentFlowJson, WechenAgentHeaderActionsRenderContext, WechenAgentSnapshot, } from './flowTypes';
|
|
26
|
+
export { defaultInitialEdges, defaultInitialFlow, defaultInitialNodes, emptyInitialFlow, } from './flow/initialFlow';
|
|
27
|
+
export { cloneWechenAgentFlow, normalizeWechenAgentFlowJson, parseWechenAgentFlowJson, } from './flow/flowJsonUtils';
|
|
28
|
+
export { mergeNodeData } from './flow/mergeNodeData';
|
|
29
|
+
export type { WechenAgentEdgeFlowDirection } from './flow/wechenAgentEdgeTypes';
|
|
30
|
+
export { WECHEN_AGENT_FLOW_DRAG_MIME, decodePaletteDragPayload, encodePaletteDragPayload, } from './flow/dragPayload';
|
|
31
|
+
export type { PaletteDragPayload } from './flow/dragPayload';
|
|
32
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAGlE,OAAO,EACL,8BAA8B,EAC9B,0BAA0B,GAC3B,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AAG9E,YAAY,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAC9E,YAAY,EACV,6BAA6B,EAC7B,iCAAiC,EACjC,iCAAiC,EACjC,8BAA8B,GAC/B,MAAM,0BAA0B,CAAC;AAGlC,YAAY,EACV,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,uCAAuC,EACvC,sCAAsC,EACtC,+BAA+B,GAChC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,6BAA6B,EAC7B,8BAA8B,EAC9B,mCAAmC,EACnC,gCAAgC,EAChC,gBAAgB,EAChB,mBAAmB,EACnB,iCAAiC,GAClC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,kCAAkC,CAAC;AAG1C,YAAY,EACV,iBAAiB,EACjB,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,qCAAqC,EACrC,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,oBAAoB,EACpB,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,YAAY,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAChF,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
|