@fieldwangai/agentflow 0.1.153 → 0.1.154

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 (192) hide show
  1. package/README.md +16 -34
  2. package/README.zh-CN.md +14 -34
  3. package/agents/agentflow-node-executor-code.md +13 -3
  4. package/agents/agentflow-node-executor-planning.md +13 -3
  5. package/agents/agentflow-node-executor-requirement.md +13 -3
  6. package/agents/agentflow-node-executor-test.md +13 -3
  7. package/agents/agentflow-node-executor-ui.md +13 -3
  8. package/agents/agentflow-node-executor.md +13 -3
  9. package/agents/en/agentflow-node-executor.md +13 -3
  10. package/agents/zh/agentflow-node-executor.md +13 -3
  11. package/bin/agentflow.mjs +3 -3
  12. package/bin/lib/admin-builtin-pipelines.mjs +3 -2
  13. package/bin/lib/agent-runners.mjs +0 -929
  14. package/bin/lib/auth.mjs +2 -1
  15. package/bin/lib/catalog-agents.mjs +2 -1
  16. package/bin/lib/catalog-flows.mjs +165 -90
  17. package/bin/lib/composer-agent.mjs +3 -793
  18. package/bin/lib/composer-skill-router.mjs +3 -323
  19. package/bin/lib/exec-buffered.mjs +32 -0
  20. package/bin/lib/flow-dsl/cli.mjs +276 -0
  21. package/bin/lib/flow-dsl/codegen.mjs +358 -0
  22. package/bin/lib/flow-dsl/defs.mjs +103 -0
  23. package/bin/lib/flow-dsl/index.mjs +77 -0
  24. package/bin/lib/flow-dsl/ir.mjs +305 -0
  25. package/bin/lib/flow-dsl/layout.mjs +115 -0
  26. package/bin/lib/flow-dsl/legacy-yaml.mjs +268 -0
  27. package/bin/lib/flow-dsl/lint.mjs +241 -0
  28. package/bin/lib/flow-dsl/packages.mjs +251 -0
  29. package/bin/lib/flow-dsl/parser.mjs +444 -0
  30. package/bin/lib/flow-import.mjs +96 -26
  31. package/bin/lib/flow-write.mjs +48 -12
  32. package/bin/lib/help.mjs +8 -28
  33. package/bin/lib/html-escape.mjs +19 -0
  34. package/bin/lib/http-util.mjs +49 -0
  35. package/bin/lib/legacy-flow-execution.mjs +37 -0
  36. package/bin/lib/locales/en.json +1 -1
  37. package/bin/lib/locales/zh.json +1 -1
  38. package/bin/lib/main.mjs +152 -286
  39. package/bin/lib/marketplace.mjs +206 -61
  40. package/bin/lib/model-config.mjs +10 -0
  41. package/bin/lib/node-package-archive.mjs +240 -0
  42. package/bin/lib/node-package-bootstrap.mjs +72 -0
  43. package/bin/lib/node-package-manifest.mjs +174 -0
  44. package/bin/lib/paths.mjs +42 -19
  45. package/bin/lib/prd-workflow-routes.mjs +2949 -0
  46. package/bin/lib/prd-workflow-server.mjs +4884 -0
  47. package/bin/lib/run-events.mjs +0 -66
  48. package/bin/lib/schedule-config.mjs +4 -4
  49. package/bin/lib/skill-runtime.mjs +35 -0
  50. package/bin/lib/startup-storage-migrations.mjs +274 -0
  51. package/bin/lib/ui-server.mjs +1087 -18122
  52. package/bin/lib/user-env.mjs +16 -0
  53. package/bin/lib/workspace-auto-layout.mjs +234 -0
  54. package/bin/lib/workspace-flow-store.mjs +478 -0
  55. package/bin/lib/workspace-graph-merge.mjs +41 -34
  56. package/bin/lib/workspace-routes.mjs +3088 -0
  57. package/bin/lib/workspace-server.mjs +6199 -0
  58. package/bin/lib/workspace-state.mjs +331 -0
  59. package/bin/lib/workspace.mjs +2 -1
  60. package/builtin/nodes/agent_subAgent.md +1 -0
  61. package/builtin/nodes/control_agent_toBool.md +2 -0
  62. package/builtin/nodes/control_anyOne.md +2 -0
  63. package/builtin/nodes/control_cancelled.md +2 -0
  64. package/builtin/nodes/control_cd_workspace.md +5 -11
  65. package/builtin/nodes/control_delay.md +2 -0
  66. package/builtin/nodes/control_end.md +2 -0
  67. package/builtin/nodes/control_if.md +1 -0
  68. package/builtin/nodes/control_interval_loop.md +2 -0
  69. package/builtin/nodes/control_load_mcp.md +24 -0
  70. package/builtin/nodes/control_load_skills.md +8 -23
  71. package/builtin/nodes/control_start.md +2 -0
  72. package/builtin/nodes/control_toBool.md +2 -0
  73. package/builtin/nodes/control_user_workspace.md +2 -0
  74. package/builtin/nodes/control_wait_until.md +2 -0
  75. package/builtin/nodes/display_ascii.md +1 -0
  76. package/builtin/nodes/display_chart.md +1 -0
  77. package/builtin/nodes/display_html.md +1 -0
  78. package/builtin/nodes/display_image.md +1 -0
  79. package/builtin/nodes/display_markdown.md +1 -0
  80. package/builtin/nodes/display_mermaid.md +1 -0
  81. package/builtin/nodes/display_react_app.md +1 -0
  82. package/builtin/nodes/display_table.md +1 -0
  83. package/builtin/nodes/provide_bool.md +1 -0
  84. package/builtin/nodes/provide_file.md +1 -0
  85. package/builtin/nodes/provide_password.md +1 -0
  86. package/builtin/nodes/provide_str.md +1 -0
  87. package/builtin/nodes/tool_display_share_link.md +1 -0
  88. package/builtin/nodes/tool_get_env.md +2 -0
  89. package/builtin/nodes/tool_git_checkout.md +1 -0
  90. package/builtin/nodes/tool_git_worktree_load.md +1 -0
  91. package/builtin/nodes/tool_git_worktree_unload.md +1 -0
  92. package/builtin/nodes/tool_gitlab_create_mr.md +1 -0
  93. package/builtin/nodes/tool_jenkins_build.md +2 -0
  94. package/builtin/nodes/tool_load_key.md +2 -0
  95. package/builtin/nodes/tool_nodejs.md +17 -19
  96. package/builtin/nodes/tool_print.md +2 -0
  97. package/builtin/nodes/tool_save_key.md +2 -0
  98. package/builtin/nodes/tool_set_run_env.md +1 -0
  99. package/builtin/nodes/tool_user_ask.md +2 -0
  100. package/builtin/nodes/tool_user_check.md +2 -0
  101. package/builtin/nodes/tool_wecom_send_app_markdown.md +1 -0
  102. package/builtin/nodes/tool_wecom_send_group_markdown.md +1 -0
  103. package/builtin/nodes/workspace_one_click_task.md +44 -0
  104. package/builtin/nodes/workspace_run.md +16 -0
  105. package/builtin/nodes/workspace_scheduled_run.md +16 -0
  106. package/builtin/pipelines/module-migrate/scripts/gate.mjs +37 -0
  107. package/builtin/pipelines/module-migrate/scripts/static-check.mjs +82 -0
  108. package/builtin/pipelines/module-migrate/workspace.flow.js +172 -0
  109. package/builtin/pipelines/module-migrate/workspace.layout.json +134 -0
  110. package/builtin/pipelines/new/scripts/lint-flow.mjs +38 -0
  111. package/builtin/pipelines/new/workspace.flow.js +91 -0
  112. package/builtin/pipelines/new/workspace.layout.json +70 -0
  113. package/builtin/web-ui/dist/assets/{WorkflowAssistantThread-B9xslwI0.js → WorkflowAssistantThread-CKClwj96.js} +1 -1
  114. package/builtin/web-ui/dist/assets/index-BZ5KqLur.js +870 -0
  115. package/builtin/web-ui/dist/assets/index-CEXmmwM2.css +1 -0
  116. package/builtin/web-ui/dist/index.html +2 -2
  117. package/package.json +2 -1
  118. package/reference/flow-control-capabilities.md +77 -158
  119. package/reference/flow-layout.md +1 -1
  120. package/reference/flow-prompt-handler-check.md +2 -2
  121. package/skills/agentflow-author-flow/SKILL.md +1 -1
  122. package/skills/agentflow-cli/SKILL.md +139 -24
  123. package/skills/agentflow-cli/agents/openai.yaml +2 -2
  124. package/skills/agentflow-cli/scripts/agentflow-cli.mjs +654 -20
  125. package/skills/agentflow-cli/scripts/agentflow-runtime.mjs +97 -0
  126. package/skills/agentflow-flow-add-instances/SKILL.md +1 -1
  127. package/skills/agentflow-flow-dsl/SKILL.md +206 -0
  128. package/skills/agentflow-flow-dsl/agents/openai.yaml +4 -0
  129. package/skills/agentflow-flow-dsl/references/node-calls.md +39 -0
  130. package/skills/agentflow-flow-edit-node-fields/SKILL.md +1 -1
  131. package/skills/agentflow-flow-recipes/SKILL.md +7 -4
  132. package/skills/agentflow-flow-recipes/references/recipes.md +97 -43
  133. package/skills/agentflow-flow-sync-ui/SKILL.md +1 -1
  134. package/skills/agentflow-node-dsl/SKILL.md +212 -0
  135. package/skills/agentflow-node-dsl/agents/openai.yaml +4 -0
  136. package/skills/agentflow-node-reference/SKILL.md +2 -2
  137. package/skills/agentflow-node-reference/references/builtin-nodes.md +166 -115
  138. package/skills/agentflow-runtime-reference/references/runtime.md +1 -1
  139. package/skills/agentflow-workspace-ascii/SKILL.md +9 -16
  140. package/skills/agentflow-workspace-graph/SKILL.md +62 -48
  141. package/skills/agentflow-workspace-html/SKILL.md +7 -2
  142. package/skills/agentflow-workspace-image/SKILL.md +6 -2
  143. package/skills/agentflow-workspace-markdown/SKILL.md +14 -21
  144. package/skills/agentflow-workspace-mermaid/SKILL.md +8 -16
  145. package/bin/lib/api-runner.mjs +0 -387
  146. package/bin/lib/apply.mjs +0 -903
  147. package/bin/lib/composer-flow-instances.mjs +0 -68
  148. package/bin/lib/composer-flow-skeleton.mjs +0 -334
  149. package/bin/lib/composer-flow-validate.mjs +0 -47
  150. package/bin/lib/composer-model-router.mjs +0 -185
  151. package/bin/lib/composer-node-schema.mjs +0 -303
  152. package/bin/lib/composer-planner.mjs +0 -751
  153. package/bin/lib/composer-script-ops.mjs +0 -233
  154. package/bin/lib/flow-static-preview.mjs +0 -104
  155. package/bin/lib/hub-login.mjs +0 -54
  156. package/bin/lib/hub-publish.mjs +0 -159
  157. package/bin/lib/hub-remote.mjs +0 -189
  158. package/bin/lib/hub.mjs +0 -299
  159. package/bin/lib/jenkins.mjs +0 -380
  160. package/bin/lib/node-execute.mjs +0 -539
  161. package/bin/lib/normalize-node-tool-command.mjs +0 -97
  162. package/bin/lib/runtime-context.mjs +0 -243
  163. package/bin/lib/scheduler.mjs +0 -601
  164. package/bin/lib/ui-print.mjs +0 -94
  165. package/bin/pipeline/build-node-prompt.mjs +0 -271
  166. package/bin/pipeline/check-cache.mjs +0 -191
  167. package/bin/pipeline/check-flow.mjs +0 -543
  168. package/bin/pipeline/collect-nodes.mjs +0 -212
  169. package/bin/pipeline/compute-cache-md5.mjs +0 -177
  170. package/bin/pipeline/ensure-run-dir.mjs +0 -71
  171. package/bin/pipeline/gc.mjs +0 -129
  172. package/bin/pipeline/get-env.mjs +0 -59
  173. package/bin/pipeline/get-resolved-values.mjs +0 -344
  174. package/bin/pipeline/load-key.mjs +0 -62
  175. package/bin/pipeline/parse-flow.mjs +0 -708
  176. package/bin/pipeline/post-process-control-if.mjs +0 -23
  177. package/bin/pipeline/post-process-node.mjs +0 -490
  178. package/bin/pipeline/pre-process-node.mjs +0 -1430
  179. package/bin/pipeline/resolve-inputs.mjs +0 -201
  180. package/bin/pipeline/run-tool-nodejs.mjs +0 -167
  181. package/bin/pipeline/save-key.mjs +0 -93
  182. package/bin/pipeline/snapshot-prior-round.mjs +0 -70
  183. package/bin/pipeline/validate-for-ui.mjs +0 -234
  184. package/bin/pipeline/validate-script-output.mjs +0 -130
  185. package/bin/pipeline/write-result.mjs +0 -182
  186. package/builtin/pipelines/module-migrate/flow.yaml +0 -819
  187. package/builtin/pipelines/new/flow.yaml +0 -545
  188. package/builtin/pipelines/new/scripts/check-flow.mjs +0 -9
  189. package/builtin/pipelines/new/scripts/collect-nodes.mjs +0 -211
  190. package/builtin/web-ui/dist/assets/index-DZ328oSo.css +0 -1
  191. package/builtin/web-ui/dist/assets/index-DmUV7ZCL.js +0 -888
  192. package/skills/agentflow-node-authoring/SKILL.md +0 -57
@@ -1,211 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * 收集所有节点(内置 + 当前流水线)的元数据,按 tool_nodejs 约定向 stdout 输出一行 JSON。
4
- * 用法:agentflow apply -ai collect-nodes <workspaceRoot> <flowName> [runDir]
5
- * 输出(仅 stdout 一行):{ "err_code": 0, "message": { "result": "<节点元数据 markdown>" } };err_code 0=成功 1=失败,无 next。
6
- * 不写任何文件,由 agentflow apply -ai run-tool-nodejs 根据 message 写入 output。
7
- */
8
-
9
- import fs from "fs";
10
- import path from "path";
11
- import { fileURLToPath } from "url";
12
- import yaml from "js-yaml";
13
- import { LEGACY_NODES_DIR, PIPELINES_DIR, PROJECT_NODES_DIR } from "../../../../bin/lib/paths.mjs";
14
- import { getFlowDir } from "../../../../bin/lib/workspace.mjs";
15
-
16
- const __dirnameScript = path.dirname(fileURLToPath(import.meta.url));
17
- const PACKAGE_BUILTIN_NODES_DIR = path.join(path.resolve(__dirnameScript, "..", "..", ".."), "nodes");
18
-
19
- function extractFrontmatter(raw) {
20
- const m = raw.match(/^---\s*\n([\s\S]*?)\n---/);
21
- return m ? m[1] : "";
22
- }
23
-
24
- function parseDescription(fm) {
25
- const match = fm.match(/\bdescription:\s*["']?([^"'\n#][^\n]*)["']?/);
26
- return match ? match[1].trim().replace(/^["']|["']$/g, "") : "";
27
- }
28
-
29
- function parseDisplayName(fm) {
30
- const match = fm.match(/\bdisplayName:\s*["']?([^"'\n#][^\n]*)["']?/);
31
- return match ? match[1].trim().replace(/^["']|["']$/g, "") : "";
32
- }
33
-
34
- /** 解析 frontmatter 中的 input/output 数组,返回 [{ type, name, defaultOrValue }, ...] */
35
- function parseSlots(fm, key) {
36
- const slots = [];
37
- const re = new RegExp(`\\b${key}:\\s*\\n([\\s\\S]*?)(?=\\n[a-zA-Z_][a-zA-Z0-9_]*\\s*:|---|$)`, "m");
38
- const blockMatch = fm.match(re);
39
- if (!blockMatch) return slots;
40
- const block = blockMatch[1];
41
- let current = {};
42
- for (const line of block.split("\n")) {
43
- const typeMatch = line.match(/^\s*-\s+type:\s*["']?([^"'\n]*)["']?/);
44
- if (typeMatch) {
45
- if (current.type) slots.push({ ...current });
46
- current = { type: typeMatch[1].trim() };
47
- continue;
48
- }
49
- const nameMatch = line.match(/^\s+name:\s*["']?([^"'\n]*)["']?/);
50
- if (nameMatch) {
51
- current.name = nameMatch[1].trim();
52
- continue;
53
- }
54
- const defaultMatch = line.match(/^\s+(?:default|value):\s*(.*)$/);
55
- if (defaultMatch) {
56
- current.defaultOrValue = defaultMatch[1].trim().replace(/^["']|["']$/g, "");
57
- slots.push({ ...current });
58
- current = {};
59
- }
60
- }
61
- if (current.type) slots.push({ ...current });
62
- return slots;
63
- }
64
-
65
- function readNodeMeta(filePath) {
66
- try {
67
- if (!fs.existsSync(filePath)) return null;
68
- const raw = fs.readFileSync(filePath, "utf-8");
69
- const fm = extractFrontmatter(raw);
70
- return {
71
- description: parseDescription(fm),
72
- displayName: parseDisplayName(fm),
73
- input: parseSlots(fm, "input"),
74
- output: parseSlots(fm, "output"),
75
- };
76
- } catch {
77
- return null;
78
- }
79
- }
80
-
81
- /** 从 flow.yaml 的 instances 得到节点列表,每项 { id, label, definitionId, input, output },input/output 为 [{ type, name, defaultOrValue }] */
82
- function loadFlowYamlNodes(flowDir) {
83
- const flowPath = path.join(flowDir, "flow.yaml");
84
- if (!fs.existsSync(flowPath)) return [];
85
- try {
86
- const raw = fs.readFileSync(flowPath, "utf-8");
87
- const data = yaml.load(raw);
88
- const instances = data?.instances && typeof data.instances === "object" ? data.instances : {};
89
- return Object.entries(instances).map(([id, inst]) => {
90
- const inp = Array.isArray(inst.input) ? inst.input : [];
91
- const out = Array.isArray(inst.output) ? inst.output : [];
92
- const input = inp.map((s) => ({
93
- type: (s && s.type != null) ? String(s.type).trim() : "",
94
- name: (s && s.name != null) ? String(s.name).trim() : "",
95
- defaultOrValue: (s && (s.value != null || s.default != null)) ? String(s.value ?? s.default ?? "").trim() : "",
96
- }));
97
- const output = out.map((s) => ({
98
- type: (s && s.type != null) ? String(s.type).trim() : "",
99
- name: (s && s.name != null) ? String(s.name).trim() : "",
100
- defaultOrValue: (s && (s.value != null || s.default != null)) ? String(s.value ?? s.default ?? "").trim() : "",
101
- }));
102
- return {
103
- id,
104
- label: (inst.label != null) ? String(inst.label) : id,
105
- definitionId: (inst.definitionId != null) ? String(inst.definitionId) : id,
106
- input,
107
- output,
108
- };
109
- });
110
- } catch (_) {
111
- return [];
112
- }
113
- }
114
-
115
- function main() {
116
- const args = process.argv.slice(2);
117
- if (args.length < 2) {
118
- const payload = { err_code: 1, message: { result: "Usage: agentflow apply -ai collect-nodes <workspaceRoot> <flowName> [runDir]" } };
119
- console.log(JSON.stringify(payload));
120
- process.exit(1);
121
- }
122
-
123
- const [workspaceRoot, flowName] = args.map((p) => path.resolve(p));
124
- const nodesDirLegacy = path.join(workspaceRoot, LEGACY_NODES_DIR);
125
- const nodesDirNew = path.join(workspaceRoot, PROJECT_NODES_DIR);
126
- const flowDir = getFlowDir(workspaceRoot, flowName) || path.join(workspaceRoot, PIPELINES_DIR, flowName);
127
-
128
- const out = [];
129
-
130
- // 1. 项目级节点目录:旧 .cursor 与新 .workspace 合并(同 id 新路径优先)
131
- out.push("# 节点元数据(内置 + 当前流水线)\n");
132
- out.push("## 1. 内置节点元数据\n\n");
133
- const projectById = new Map();
134
- const mergeProjectDir = (dir) => {
135
- if (!fs.existsSync(dir)) return;
136
- for (const file of fs.readdirSync(dir).filter((f) => f.endsWith(".md")).sort()) {
137
- projectById.set(file.replace(/\.md$/, ""), path.join(dir, file));
138
- }
139
- };
140
- mergeProjectDir(nodesDirLegacy);
141
- mergeProjectDir(nodesDirNew);
142
- if (projectById.size === 0) {
143
- out.push("(无项目内节点目录)\n");
144
- } else {
145
- for (const definitionId of [...projectById.keys()].sort()) {
146
- const meta = readNodeMeta(projectById.get(definitionId));
147
- if (!meta) continue;
148
- out.push(`### ${definitionId}\n`);
149
- out.push(`- **displayName**: ${meta.displayName || definitionId}\n`);
150
- out.push(`- **description**: ${meta.description || ""}\n`);
151
- out.push(`- **input** (handle: input-0, input-1, …):\n`);
152
- if (meta.input.length) meta.input.forEach((s, i) => out.push(` - \`${s.name || "?"}\` (${s.type || "?"}) → input-${i}\n`));
153
- else out.push(" - 无\n");
154
- out.push(`- **output** (handle: output-0, output-1, …):\n`);
155
- if (meta.output.length) meta.output.forEach((s, i) => out.push(` - \`${s.name || "?"}\` (${s.type || "?"}) → output-${i}\n`));
156
- else out.push(" - 无\n");
157
- out.push("\n");
158
- }
159
- }
160
-
161
- // 2. 当前流水线节点(来自 flow.yaml instances)
162
- out.push("## 2. 当前流水线节点元数据\n\n");
163
- const flowNodes = loadFlowYamlNodes(flowDir);
164
- for (const node of flowNodes) {
165
- const { id, label, definitionId, input: nodeInput, output: nodeOutput } = node;
166
- let input = nodeInput || [];
167
- let output = nodeOutput || [];
168
- if (input.length === 0 && output.length === 0) {
169
- const tryPaths = [
170
- path.join(flowDir, "nodes", `${definitionId}.md`),
171
- path.join(nodesDirNew, `${definitionId}.md`),
172
- path.join(nodesDirLegacy, `${definitionId}.md`),
173
- path.join(PACKAGE_BUILTIN_NODES_DIR, `${definitionId}.md`),
174
- ];
175
- let meta = null;
176
- for (const defPath of tryPaths) {
177
- meta = readNodeMeta(defPath);
178
- if (meta) break;
179
- }
180
- if (meta) {
181
- input = meta.input;
182
- output = meta.output;
183
- }
184
- }
185
- out.push(`### ${id}\n`);
186
- out.push(`- **label**: ${label || id}\n`);
187
- out.push(`- **definitionId**: ${definitionId || ""}\n`);
188
- out.push(`- **input** (handle):\n`);
189
- if (input.length) input.forEach((s, i) => out.push(` - \`${s.name || "?"}\` (${s.type || "?"}) → input-${i}\n`));
190
- else out.push(" - 无\n");
191
- out.push(`- **output** (handle):\n`);
192
- if (output.length) output.forEach((s, i) => out.push(` - \`${s.name || "?"}\` (${s.type || "?"}) → output-${i}\n`));
193
- else out.push(" - 无\n");
194
- out.push("\n");
195
- }
196
-
197
- const content = out.join("");
198
-
199
- // 优先写入 output 引脚文件(直接写文件模式)
200
- const resultOutPath = args[2] ? String(args[2]).trim() : "";
201
- if (resultOutPath) {
202
- fs.mkdirSync(path.dirname(resultOutPath), { recursive: true });
203
- fs.writeFileSync(resultOutPath, content, "utf-8");
204
- } else {
205
- // 兼容旧模式:通过 JSON stdout 输出
206
- const payload = { err_code: 0, message: { result: content } };
207
- console.log(JSON.stringify(payload));
208
- }
209
- }
210
-
211
- main();