@fieldwangai/agentflow 0.1.159 → 0.1.160
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/bin/lib/catalog-flows.mjs +10 -1
- package/bin/lib/control-while.mjs +336 -0
- package/bin/lib/flow-dsl/codegen.mjs +74 -11
- package/bin/lib/flow-dsl/ir.mjs +33 -2
- package/bin/lib/flow-dsl/lint.mjs +128 -3
- package/bin/lib/flow-dsl/parser.mjs +168 -4
- package/bin/lib/marketplace.mjs +10 -2
- package/bin/lib/node-package-manifest.mjs +7 -2
- package/bin/lib/node-ui-kit.mjs +156 -0
- package/bin/lib/paths.mjs +2 -0
- package/bin/lib/workspace-flow-store.mjs +11 -2
- package/bin/lib/workspace-graph-merge.mjs +3 -0
- package/bin/lib/workspace-routes.mjs +10 -1
- package/bin/lib/workspace-server.mjs +592 -11
- package/bin/pipeline/validate-flow.mjs +3 -3
- package/builtin/nodes/control_parse_json.md +25 -0
- package/builtin/nodes/control_subflow_call.md +27 -0
- package/builtin/nodes/control_while.md +124 -0
- package/builtin/nodes/provide_json.md +14 -0
- package/builtin/nodes/workspace_subflow_input.md +14 -0
- package/builtin/pipelines/subflow-preview/workspace.flow.js +29 -0
- package/builtin/pipelines/subflow-preview/workspace.layout.json +38 -0
- package/builtin/pipelines/subflow-preview/workspace.nodes.json +19 -0
- package/builtin/pipelines/subflow-preview/workspace.state.json +93 -0
- package/builtin/pipelines/while-subflow-preview/workspace.flow.js +55 -0
- package/builtin/pipelines/while-subflow-preview/workspace.layout.json +66 -0
- package/builtin/pipelines/while-subflow-preview/workspace.nodes.json +49 -0
- package/builtin/pipelines/while-subflow-preview/workspace.state.json +194 -0
- package/builtin/web-ui/dist/assets/{WorkflowAssistantThread-CY19DsYq.js → WorkflowAssistantThread-Bfo9Ythw.js} +1 -1
- package/builtin/web-ui/dist/assets/index-XbeI5foV.js +872 -0
- package/builtin/web-ui/dist/assets/index-e1omCEau.css +1 -0
- package/builtin/web-ui/dist/index.html +2 -2
- package/package.json +2 -1
- package/reference/flow-control-capabilities.md +41 -16
- package/shared/slot-types.js +58 -0
- package/skills/agentflow-flow-dsl/SKILL.md +60 -6
- package/skills/agentflow-flow-dsl/references/node-calls.md +3 -0
- package/skills/agentflow-flow-dsl/references/subflow-authoring.md +230 -0
- package/skills/agentflow-node-dsl/SKILL.md +39 -0
- package/skills/agentflow-node-reference/references/builtin-nodes.md +25 -0
- package/builtin/web-ui/dist/assets/index-B9ppXv7e.css +0 -1
- package/builtin/web-ui/dist/assets/index-CdEQWRrp.js +0 -872
|
@@ -108,7 +108,7 @@ function readTextOrNull(file) {
|
|
|
108
108
|
}
|
|
109
109
|
|
|
110
110
|
export function emptyDesignGraph() {
|
|
111
|
-
return { version: 1, instances: {}, edges: [], ui: { nodePositions: {} } };
|
|
111
|
+
return { version: 1, instances: {}, edges: [], subflows: {}, ui: { nodePositions: {} } };
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
function normalizeDesignShape(raw) {
|
|
@@ -120,6 +120,10 @@ function normalizeDesignShape(raw) {
|
|
|
120
120
|
? graph.instances
|
|
121
121
|
: {},
|
|
122
122
|
edges: Array.isArray(graph.edges) ? graph.edges : [],
|
|
123
|
+
subflows:
|
|
124
|
+
graph.subflows && typeof graph.subflows === "object" && !Array.isArray(graph.subflows)
|
|
125
|
+
? graph.subflows
|
|
126
|
+
: {},
|
|
123
127
|
ui: graph.ui && typeof graph.ui === "object" ? graph.ui : { nodePositions: {} },
|
|
124
128
|
};
|
|
125
129
|
}
|
|
@@ -226,7 +230,12 @@ export function designFingerprint(graph) {
|
|
|
226
230
|
.filter((e) => e && design.instances[e.source] && design.instances[e.target])
|
|
227
231
|
.map((e) => `${e.source}|${asText(e.sourceHandle)}|${e.target}|${asText(e.targetHandle)}`)
|
|
228
232
|
.sort();
|
|
229
|
-
return stableStringify({
|
|
233
|
+
return stableStringify({
|
|
234
|
+
instances,
|
|
235
|
+
edges: [...new Set(edges)],
|
|
236
|
+
subflows: design.subflows,
|
|
237
|
+
ui: normalizeUi(design.ui),
|
|
238
|
+
});
|
|
230
239
|
}
|
|
231
240
|
|
|
232
241
|
// ── 读 ──────────────────────────────────────────────────────────────────────
|
|
@@ -34,6 +34,9 @@ function normalizedGraph(graph) {
|
|
|
34
34
|
version: Number(source.version) || 1,
|
|
35
35
|
instances: isPlainObject(source.instances) ? clone(source.instances) : {},
|
|
36
36
|
edges: Array.isArray(source.edges) ? clone(source.edges) : [],
|
|
37
|
+
// Subflows are first-class design metadata. Dropping them here makes every
|
|
38
|
+
// revision-aware canvas save silently erase call contracts and entry roots.
|
|
39
|
+
subflows: isPlainObject(source.subflows) ? clone(source.subflows) : {},
|
|
37
40
|
ui: isPlainObject(source.ui) ? clone(source.ui) : { nodePositions: {} },
|
|
38
41
|
};
|
|
39
42
|
}
|
|
@@ -538,6 +538,13 @@ function buildNodeStudioPrompt({ requirement, currentSource, parseError, history
|
|
|
538
538
|
" 真实运行时位于会被清理的临时目录里。",
|
|
539
539
|
"3. 槽位类型只能是 `text` `file` `bool` `node` `image` `json`。声明顺序 = 画布上的引脚顺序。",
|
|
540
540
|
"",
|
|
541
|
+
"## 可选 Node UI Kit",
|
|
542
|
+
"",
|
|
543
|
+
"需要让画布直接解释节点时,在 export default 里声明 `ui.card`。只能组合安全组件:",
|
|
544
|
+
"`binding`、`code`、`decision`、`metrics`、`summary`、`history`、`subflow`;不能写 React、HTML 或事件处理器。",
|
|
545
|
+
"组件里的 input/output 必须引用已声明槽位。template 可用 details / state-machine,tone 可用",
|
|
546
|
+
"neutral / blue / purple / green / amber / red。没有可解释内容时可以不声明 UI。",
|
|
547
|
+
"",
|
|
541
548
|
"失败用抛异常或非零退出表示,不要把 stdout 包成 JSON。",
|
|
542
549
|
currentSource ? `\n## 当前 ${NODE_PACKAGE_ENTRY}\n\n\`\`\`js\n${currentSource}\n\`\`\`` : "",
|
|
543
550
|
parseError ? `\n## 上一版解析失败,必须修掉\n\n${parseError}` : "",
|
|
@@ -568,7 +575,7 @@ function emptyNodeStudioDraft(userCtx = {}, draftId = "") {
|
|
|
568
575
|
inputs: [],
|
|
569
576
|
outputs: [],
|
|
570
577
|
configSchema: { fields: [] },
|
|
571
|
-
ui: { card: { icon: "extension",
|
|
578
|
+
ui: { card: { template: "details", icon: "extension", tone: "neutral", sections: [] } },
|
|
572
579
|
},
|
|
573
580
|
config: {},
|
|
574
581
|
test: { inputs: {}, log: [], status: "not run" },
|
|
@@ -2917,6 +2924,7 @@ async function workspaceRoutes(req, res, ctx) {
|
|
|
2917
2924
|
const flowSource = url.searchParams.get("flowSource") || "user";
|
|
2918
2925
|
const lang = url.searchParams.get("lang") || "en";
|
|
2919
2926
|
const marketplaceScope = url.searchParams.get("scope") === "owned" ? "owned" : "all";
|
|
2927
|
+
const includeHidden = url.searchParams.get("includeHidden") === "1";
|
|
2920
2928
|
if (flowId && !isValidFlowSourceRead(flowSource)) {
|
|
2921
2929
|
json(res, 400, { error: "Invalid flowSource" });
|
|
2922
2930
|
return;
|
|
@@ -2934,6 +2942,7 @@ async function workspaceRoutes(req, res, ctx) {
|
|
|
2934
2942
|
archived: nodesArchived,
|
|
2935
2943
|
...requestedContext.userCtx,
|
|
2936
2944
|
marketplaceScope,
|
|
2945
|
+
includeHidden,
|
|
2937
2946
|
}));
|
|
2938
2947
|
} catch (e) {
|
|
2939
2948
|
json(res, 500, { error: (e && e.message) || String(e) });
|