@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.
Files changed (42) hide show
  1. package/bin/lib/catalog-flows.mjs +10 -1
  2. package/bin/lib/control-while.mjs +336 -0
  3. package/bin/lib/flow-dsl/codegen.mjs +74 -11
  4. package/bin/lib/flow-dsl/ir.mjs +33 -2
  5. package/bin/lib/flow-dsl/lint.mjs +128 -3
  6. package/bin/lib/flow-dsl/parser.mjs +168 -4
  7. package/bin/lib/marketplace.mjs +10 -2
  8. package/bin/lib/node-package-manifest.mjs +7 -2
  9. package/bin/lib/node-ui-kit.mjs +156 -0
  10. package/bin/lib/paths.mjs +2 -0
  11. package/bin/lib/workspace-flow-store.mjs +11 -2
  12. package/bin/lib/workspace-graph-merge.mjs +3 -0
  13. package/bin/lib/workspace-routes.mjs +10 -1
  14. package/bin/lib/workspace-server.mjs +592 -11
  15. package/bin/pipeline/validate-flow.mjs +3 -3
  16. package/builtin/nodes/control_parse_json.md +25 -0
  17. package/builtin/nodes/control_subflow_call.md +27 -0
  18. package/builtin/nodes/control_while.md +124 -0
  19. package/builtin/nodes/provide_json.md +14 -0
  20. package/builtin/nodes/workspace_subflow_input.md +14 -0
  21. package/builtin/pipelines/subflow-preview/workspace.flow.js +29 -0
  22. package/builtin/pipelines/subflow-preview/workspace.layout.json +38 -0
  23. package/builtin/pipelines/subflow-preview/workspace.nodes.json +19 -0
  24. package/builtin/pipelines/subflow-preview/workspace.state.json +93 -0
  25. package/builtin/pipelines/while-subflow-preview/workspace.flow.js +55 -0
  26. package/builtin/pipelines/while-subflow-preview/workspace.layout.json +66 -0
  27. package/builtin/pipelines/while-subflow-preview/workspace.nodes.json +49 -0
  28. package/builtin/pipelines/while-subflow-preview/workspace.state.json +194 -0
  29. package/builtin/web-ui/dist/assets/{WorkflowAssistantThread-CY19DsYq.js → WorkflowAssistantThread-Bfo9Ythw.js} +1 -1
  30. package/builtin/web-ui/dist/assets/index-XbeI5foV.js +872 -0
  31. package/builtin/web-ui/dist/assets/index-e1omCEau.css +1 -0
  32. package/builtin/web-ui/dist/index.html +2 -2
  33. package/package.json +2 -1
  34. package/reference/flow-control-capabilities.md +41 -16
  35. package/shared/slot-types.js +58 -0
  36. package/skills/agentflow-flow-dsl/SKILL.md +60 -6
  37. package/skills/agentflow-flow-dsl/references/node-calls.md +3 -0
  38. package/skills/agentflow-flow-dsl/references/subflow-authoring.md +230 -0
  39. package/skills/agentflow-node-dsl/SKILL.md +39 -0
  40. package/skills/agentflow-node-reference/references/builtin-nodes.md +25 -0
  41. package/builtin/web-ui/dist/assets/index-B9ppXv7e.css +0 -1
  42. 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({ instances, edges: [...new Set(edges)], ui: normalizeUi(design.ui) });
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", variant: "default", actions: [] } },
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) });