minimal-agent 0.13.0 → 0.14.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/README.md +6 -5
- package/package.json +60 -4
- package/plugins/computer_use/.claude-plugin/plugin.json +1 -1
- package/plugins/cron-runner/src/commands.js +4 -4
- package/plugins/cron-runner/src/commands.ts +4 -4
- package/plugins/workflow-runner/.claude-plugin/plugin.json +2 -2
- package/plugins/workflow-runner/commands/workflow.md +57 -90
- package/plugins/workflow-runner/commands/workflows.md +4 -4
- package/plugins/workflow-runner/plugin.js +24 -13
- package/plugins/workflow-runner/plugin.ts +28 -13
- package/plugins/workflow-runner/src/discovery.js +160 -0
- package/plugins/workflow-runner/src/discovery.ts +194 -0
- package/plugins/workflow-runner/src/goalAnchor.js +53 -0
- package/plugins/workflow-runner/src/goalAnchor.ts +59 -0
- package/plugins/workflow-runner/src/index.js +197 -206
- package/plugins/workflow-runner/src/index.ts +248 -249
- package/plugins/workflow-runner/src/inputCoercion.js +40 -0
- package/plugins/workflow-runner/src/inputCoercion.ts +43 -0
- package/plugins/workflow-runner/src/journal.js +224 -0
- package/plugins/workflow-runner/src/journal.ts +274 -0
- package/plugins/workflow-runner/src/jsonSchema.js +132 -0
- package/plugins/workflow-runner/src/jsonSchema.ts +162 -0
- package/plugins/workflow-runner/src/moduleResolution.js +64 -0
- package/plugins/workflow-runner/src/moduleResolution.ts +71 -0
- package/plugins/workflow-runner/src/resourceInputs.js +220 -0
- package/plugins/workflow-runner/src/resourceInputs.ts +300 -0
- package/plugins/workflow-runner/src/runner.js +400 -489
- package/plugins/workflow-runner/src/runner.ts +488 -560
- package/plugins/workflow-runner/src/runtime/config.js +46 -0
- package/plugins/workflow-runner/src/runtime/config.ts +69 -0
- package/plugins/workflow-runner/src/runtime/context.js +1304 -0
- package/plugins/workflow-runner/src/runtime/context.ts +1786 -0
- package/plugins/workflow-runner/src/runtime/exec.js +34 -0
- package/plugins/workflow-runner/src/runtime/exec.ts +53 -0
- package/plugins/workflow-runner/src/runtime/flow.js +8 -0
- package/plugins/workflow-runner/src/runtime/flow.ts +12 -0
- package/plugins/workflow-runner/src/runtime/fs.js +27 -0
- package/plugins/workflow-runner/src/runtime/fs.ts +41 -0
- package/plugins/workflow-runner/src/runtime/model.js +6 -0
- package/plugins/workflow-runner/src/runtime/model.ts +8 -0
- package/plugins/workflow-runner/src/runtime/output.js +7 -0
- package/plugins/workflow-runner/src/runtime/output.ts +21 -0
- package/plugins/workflow-runner/src/runtime/scheduler.js +141 -0
- package/plugins/workflow-runner/src/runtime/scheduler.ts +166 -0
- package/plugins/workflow-runner/src/runtime/state.js +16 -0
- package/plugins/workflow-runner/src/runtime/state.ts +19 -0
- package/plugins/workflow-runner/src/runtime/tools.js +3 -0
- package/plugins/workflow-runner/src/runtime/tools.ts +6 -0
- package/plugins/workflow-runner/src/sandbox.js +141 -0
- package/plugins/workflow-runner/src/sandbox.ts +182 -0
- package/plugins/workflow-runner/src/scriptGuard.d.mts +38 -0
- package/plugins/workflow-runner/src/scriptGuard.mjs +449 -0
- package/plugins/workflow-runner/src/taskIdentity.js +151 -307
- package/plugins/workflow-runner/src/taskIdentity.ts +207 -355
- package/plugins/workflow-runner/src/toolRuntime.js +29 -8
- package/plugins/workflow-runner/src/toolRuntime.ts +36 -11
- package/plugins/workflow-runner/src/types.js +7 -211
- package/plugins/workflow-runner/src/types.ts +154 -623
- package/plugins/workflow-runner/src/util.js +47 -0
- package/plugins/workflow-runner/src/util.ts +51 -0
- package/plugins/workflow-runner/src/workflowContext.js +20 -0
- package/plugins/workflow-runner/src/workflowContext.ts +58 -0
- package/plugins/workflow-runner/src/workflowDependencies.js +36 -0
- package/plugins/workflow-runner/src/workflowDependencies.ts +59 -0
- package/plugins/workflow-runner/src/workflowFingerprint.js +118 -0
- package/plugins/workflow-runner/src/workflowFingerprint.ts +122 -0
- package/plugins/workflow-runner/src/workflowState.js +474 -802
- package/plugins/workflow-runner/src/workflowState.ts +575 -970
- package/plugins/workflow-runner/test/api.test.ts +223 -0
- package/plugins/workflow-runner/test/apiCapabilities.test.ts +614 -0
- package/plugins/workflow-runner/test/apiConcurrencyGate.test.ts +104 -0
- package/plugins/workflow-runner/test/apiEcho.test.ts +210 -0
- package/plugins/workflow-runner/test/apiReadText.test.ts +178 -0
- package/plugins/workflow-runner/test/apiResourceLedger.test.ts +184 -0
- package/plugins/workflow-runner/test/childWorkflow.test.ts +304 -0
- package/plugins/workflow-runner/test/discovery.test.ts +234 -0
- package/plugins/workflow-runner/test/goalAnchor.test.ts +106 -0
- package/plugins/workflow-runner/test/goalController.test.ts +317 -0
- package/plugins/workflow-runner/test/journalLanes.test.ts +198 -0
- package/plugins/workflow-runner/test/listResources.test.ts +106 -0
- package/plugins/workflow-runner/test/resourceInputs.test.ts +294 -0
- package/plugins/workflow-runner/test/sandbox.test.ts +126 -0
- package/plugins/workflow-runner/test/scheduler.test.ts +70 -0
- package/plugins/workflow-runner/test/scriptGuard.test.ts +276 -0
- package/plugins/workflow-runner/test/skillDocSync.test.ts +78 -0
- package/plugins/workflow-runner/test/taskIdentity.test.ts +288 -179
- package/plugins/workflow-runner/test/workflowFingerprint.test.ts +106 -0
- package/plugins/workflow-runner/test/workflowState.test.ts +429 -0
- package/skills/pptx/examples/assets/cover-bg.svg +23 -0
- package/skills/pptx/examples/assets/icon-spark.svg +5 -0
- package/skills/ui-design/SKILL.md +5 -2
- package/skills/ui-design/references/layout-composition.md +1 -1
- package/skills/workflow-creator/SKILL.md +344 -0
- package/skills/workflow-creator/assets/template/workflow.mjs +48 -0
- package/skills/workflow-creator/references/api.md +216 -0
- package/skills/workflow-creator/references/migration.md +103 -0
- package/skills/workflow-creator/references/patterns.md +779 -0
- package/skills/workflow-creator/scripts/list-resources.mjs +205 -0
- package/skills/workflow-creator/scripts/scaffold.mjs +148 -0
- package/skills/workflow-creator/scripts/validate.mjs +275 -0
- package/skills/workflow-creator/scripts/workflow-creator.test.mjs +82 -0
- package/src/advisor/advisorCoordinator.js +503 -0
- package/src/advisor/advisorCoordinator.ts +657 -0
- package/src/cli/configMenu.tsx +0 -1
- package/src/cli/print.js +27 -6
- package/src/cli/print.ts +48 -4
- package/src/cli/streamJson.js +5 -6
- package/src/cli/streamJson.ts +8 -4
- package/src/cli/wizards/advisorWizard.js +4 -2
- package/src/cli/wizards/advisorWizard.tsx +8 -2
- package/src/cli/wizards/contextAdvisorWizard.js +5 -4
- package/src/cli/wizards/contextAdvisorWizard.tsx +7 -6
- package/src/collaboration/taskFlow.js +115 -0
- package/src/collaboration/taskFlow.ts +169 -0
- package/src/config/configDefaults.js +41 -1
- package/src/config/configDefaults.ts +43 -1
- package/src/config/configDiagnostics.ts +2 -2
- package/src/config/configFile.js +40 -9
- package/src/config/configFile.ts +60 -11
- package/src/config/configService.js +419 -74
- package/src/config/configService.ts +703 -145
- package/src/config/numericLimits.js +22 -0
- package/src/config/numericLimits.ts +24 -0
- package/src/config.js +1 -0
- package/src/config.ts +3 -2
- package/src/context/budgetPlan.js +1 -1
- package/src/context/budgetPlan.ts +1 -1
- package/src/context/compact.js +7 -2
- package/src/context/compact.ts +9 -2
- package/src/context/microCompactLite.js +212 -13
- package/src/context/microCompactLite.ts +261 -12
- package/src/context/sessionRegistry.js +8 -1
- package/src/context/sessionRegistry.ts +18 -5
- package/src/context/toolResultArchive.js +72 -0
- package/src/context/toolResultArchive.ts +95 -0
- package/src/goal/errors.js +8 -0
- package/src/goal/errors.ts +18 -0
- package/src/goal/goalRuntime.js +344 -0
- package/src/goal/goalRuntime.ts +466 -0
- package/src/goal/goalStore.js +200 -0
- package/src/goal/goalStore.ts +219 -0
- package/src/goal/index.js +4 -0
- package/src/goal/index.ts +4 -0
- package/src/goal/statusMapping.js +71 -0
- package/src/goal/statusMapping.ts +95 -0
- package/src/goal/types.js +7 -0
- package/src/goal/types.ts +179 -0
- package/src/goal/workflowController.js +306 -0
- package/src/goal/workflowController.ts +360 -0
- package/src/harness/evidenceLedger.js +2 -0
- package/src/harness/evidenceLedger.ts +1 -0
- package/src/harness/stallGuard.js +9 -3
- package/src/harness/stallGuard.ts +7 -3
- package/src/images/imageResolver.js +161 -0
- package/src/images/imageResolver.ts +189 -0
- package/src/infra/verification.js +34 -5
- package/src/infra/verification.ts +39 -4
- package/src/llm/client.js +79 -21
- package/src/llm/client.ts +182 -35
- package/src/llm/gatewayClient.js +201 -0
- package/src/llm/gatewayClient.ts +299 -0
- package/src/llm/messageProvenance.js +46 -0
- package/src/llm/messageProvenance.ts +58 -0
- package/src/llm/modelProvider.js +1 -0
- package/src/llm/modelProvider.ts +22 -0
- package/src/llm/providers/anthropicFormat.js +108 -1
- package/src/llm/providers/anthropicFormat.ts +115 -4
- package/src/llm/providers/openaiFormat.js +9 -0
- package/src/llm/providers/openaiFormat.ts +12 -3
- package/src/loop.js +319 -54
- package/src/loop.ts +373 -57
- package/src/main.js +4 -1
- package/src/main.tsx +4 -1
- package/src/managedExecution/index.js +2 -0
- package/src/managedExecution/index.ts +2 -0
- package/src/managedExecution/registry.js +15 -0
- package/src/managedExecution/registry.ts +20 -0
- package/src/managedExecution/types.js +1 -0
- package/src/managedExecution/types.ts +86 -0
- package/src/modelRef.js +9 -0
- package/src/modelRef.ts +31 -0
- package/src/multimodal.js +14 -28
- package/src/multimodal.ts +17 -33
- package/src/net/lanDiscovery.js +65 -0
- package/src/net/lanDiscovery.ts +82 -0
- package/src/plugin-sdk.js +28 -3
- package/src/plugin-sdk.ts +39 -6
- package/src/plugins/pluginApi.ts +16 -1
- package/src/plugins/pluginLoader.js +4 -0
- package/src/plugins/pluginLoader.ts +6 -0
- package/src/plugins/pluginRunner.js +139 -7
- package/src/plugins/pluginRunner.ts +173 -9
- package/src/plugins/slashFallback.js +113 -0
- package/src/plugins/slashFallback.ts +137 -0
- package/src/prompts/policyRegistry.js +12 -32
- package/src/prompts/policyRegistry.ts +15 -32
- package/src/prompts/promptAssembly.js +103 -12
- package/src/prompts/promptAssembly.ts +114 -12
- package/src/prompts/skillList.js +21 -3
- package/src/prompts/skillList.ts +27 -2
- package/src/prompts/stableSystemPrompt.js +18 -0
- package/src/prompts/stableSystemPrompt.ts +33 -0
- package/src/runtime/agentRuntimeContext.js +8 -2
- package/src/runtime/agentRuntimeContext.ts +17 -4
- package/src/session/runAgentTurn.js +78 -12
- package/src/session/runAgentTurn.ts +105 -23
- package/src/session/runTurn.js +10 -9
- package/src/session/runTurn.ts +17 -8
- package/src/session/sessionState.ts +2 -0
- package/src/team/auth.js +186 -0
- package/src/team/auth.ts +298 -0
- package/src/team/cli.js +105 -0
- package/src/team/cli.ts +122 -0
- package/src/team/onlineToolContract.js +64 -0
- package/src/team/onlineToolContract.ts +109 -0
- package/src/team/toolPolicy.js +36 -0
- package/src/team/toolPolicy.ts +75 -0
- package/src/tools/advisor/advisor.js +90 -46
- package/src/tools/advisor/advisor.ts +100 -47
- package/src/tools/advisor/advisorDecision.js +71 -0
- package/src/tools/advisor/advisorDecision.ts +85 -0
- package/src/tools/agent/agent.js +18 -5
- package/src/tools/agent/agent.ts +21 -7
- package/src/tools/agent/agentControl.js +246 -0
- package/src/tools/agent/agentControl.ts +284 -0
- package/src/tools/agent/agentTaskService.js +40 -1
- package/src/tools/agent/agentTaskService.ts +44 -1
- package/src/tools/agent/agentTypes.js +14 -2
- package/src/tools/agent/agentTypes.ts +15 -2
- package/src/tools/applypatch/applyPatch.js +362 -0
- package/src/tools/applypatch/applyPatch.ts +428 -0
- package/src/tools/bash/bash.js +22 -15
- package/src/tools/bash/bash.ts +23 -17
- package/src/tools/capabilities.js +10 -5
- package/src/tools/capabilities.ts +10 -5
- package/src/tools/computeruse/computerIntent.js +32 -0
- package/src/tools/computeruse/computerIntent.ts +46 -0
- package/src/tools/computeruse/telemetryLog.js +12 -0
- package/src/tools/computeruse/telemetryLog.ts +16 -0
- package/src/tools/computeruse/vision/telemetry.js +1 -0
- package/src/tools/computeruse/vision/telemetry.ts +1 -0
- package/src/tools/effectiveToolSet.js +4 -0
- package/src/tools/effectiveToolSet.ts +4 -0
- package/src/tools/index.js +21 -2
- package/src/tools/index.ts +33 -2
- package/src/tools/presentresult/presentresult.js +6 -15
- package/src/tools/presentresult/presentresult.ts +6 -15
- package/src/tools/read/read.js +62 -9
- package/src/tools/read/read.ts +63 -9
- package/src/tools/shared/fileUtils.js +1 -2
- package/src/tools/shared/fileUtils.ts +1 -2
- package/src/tools/shared/toolOutputStore.js +23 -1
- package/src/tools/shared/toolOutputStore.ts +22 -1
- package/src/tools/skill/skill.js +9 -3
- package/src/tools/skill/skill.ts +8 -4
- package/src/tools/toolPromptGuides.js +117 -0
- package/src/tools/toolPromptGuides.ts +137 -0
- package/src/tools/webbrowser/agentBrowserPath.js +19 -9
- package/src/tools/webbrowser/agentBrowserPath.ts +70 -28
- package/src/tools/webbrowser/browser.js +27 -11
- package/src/tools/webbrowser/browser.ts +68 -24
- package/src/tools/webbrowser/browserAutomation.js +329 -0
- package/src/tools/webbrowser/browserAutomation.ts +467 -0
- package/src/tools/webbrowser/browserAxState.js +97 -0
- package/src/tools/webbrowser/browserAxState.ts +142 -0
- package/src/tools/webbrowser/browserBatch.js +1578 -0
- package/src/tools/webbrowser/browserBatch.ts +2382 -0
- package/src/tools/webbrowser/browserCdp.js +208 -0
- package/src/tools/webbrowser/browserCdp.ts +255 -0
- package/src/tools/webbrowser/browserConditions.js +24 -0
- package/src/tools/webbrowser/browserConditions.ts +45 -0
- package/src/tools/webbrowser/browserContent.js +281 -0
- package/src/tools/webbrowser/browserContent.ts +438 -0
- package/src/tools/webbrowser/browserControl.js +131 -34
- package/src/tools/webbrowser/browserControl.ts +210 -56
- package/src/tools/webbrowser/browserDaemon.js +22 -14
- package/src/tools/webbrowser/browserDaemon.ts +54 -21
- package/src/tools/webbrowser/browserFrames.js +47 -0
- package/src/tools/webbrowser/browserFrames.ts +54 -0
- package/src/tools/webbrowser/browserInteractionResolver.js +17 -0
- package/src/tools/webbrowser/browserInteractionResolver.ts +40 -0
- package/src/tools/webbrowser/browserLocator.js +140 -0
- package/src/tools/webbrowser/browserLocator.ts +194 -0
- package/src/tools/webbrowser/browserOutcome.js +10 -17
- package/src/tools/webbrowser/browserOutcome.ts +48 -31
- package/src/tools/webbrowser/browserRecovery.js +58 -0
- package/src/tools/webbrowser/browserRecovery.ts +83 -0
- package/src/tools/webbrowser/browserRunRegistry.js +35 -3
- package/src/tools/webbrowser/browserRunRegistry.ts +91 -15
- package/src/tools/webbrowser/browserService.js +28 -2
- package/src/tools/webbrowser/browserService.ts +49 -9
- package/src/tools/webbrowser/browserStream.js +132 -33
- package/src/tools/webbrowser/browserStream.ts +224 -50
- package/src/tools/webbrowser/browserTabs.js +48 -15
- package/src/tools/webbrowser/browserTabs.ts +178 -96
- package/src/tools/webbrowser/webbrowser.js +679 -144
- package/src/tools/webbrowser/webbrowser.ts +975 -236
- package/src/tools/webfetch/preapproved.js +0 -2
- package/src/tools/webfetch/preapproved.ts +0 -2
- package/src/tools/websearch/websearch.js +129 -8
- package/src/tools/websearch/websearch.ts +138 -6
- package/src/types.ts +440 -38
- package/src/ui/App.js +377 -58
- package/src/ui/App.tsx +576 -111
- package/src/ui/LiveArea.js +14 -8
- package/src/ui/LiveArea.tsx +14 -10
- package/src/ui/MessageList.js +63 -20
- package/src/ui/MessageList.tsx +101 -16
- package/src/ui/ModelPicker.js +7 -4
- package/src/ui/ModelPicker.tsx +55 -8
- package/src/ui/hooks/useChat.js +152 -163
- package/src/ui/hooks/useChat.ts +396 -334
- package/src/ui/loginCommand.js +56 -0
- package/src/ui/loginCommand.ts +63 -0
- package/src/ui/toolProgress.js +41 -0
- package/src/ui/toolProgress.ts +44 -0
- package/src/web/browserBridge.js +20 -2
- package/src/web/browserBridge.ts +20 -2
- package/src/web/protocol.ts +1897 -194
- package/workflows/adaptive-research/workflow.mjs +86 -0
- package/workflows/e2e-capabilities/workflow.mjs +102 -0
- package/workflows/e2e-llm/workflow.mjs +52 -0
- package/workflows/e2e-smoke/workflow.mjs +59 -0
- package/workflows/e2e-vision-schema/README.md +48 -0
- package/workflows/e2e-vision-schema/workflow.mjs +149 -0
- package/workflows/e2e-write-greet/workflow.mjs +37 -0
- package/workflows/file-census/README.md +14 -0
- package/workflows/file-census/scripts/.gitkeep +2 -0
- package/workflows/file-census/workflow.mjs +110 -0
- package/workflows/goal/README.md +166 -0
- package/workflows/goal/prompts/audit.md +57 -0
- package/workflows/goal/prompts/contract.md +56 -0
- package/workflows/goal/prompts/iterate.md +37 -0
- package/workflows/goal/workflow.mjs +501 -0
- package/workflows/illustrate/README.md +90 -0
- package/workflows/illustrate/assets/engines.json +20 -0
- package/workflows/illustrate/assets/extract-baidu.js +21 -0
- package/workflows/illustrate/assets/extract-bing.js +33 -0
- package/workflows/illustrate/assets/extract-google.js +31 -0
- package/workflows/illustrate/workflow.mjs +301 -0
- package/workflows/plan/workflow.mjs +389 -0
- package/workflows/question-crops/README.md +35 -0
- package/workflows/question-crops/prompts/inventory.md +23 -0
- package/workflows/question-crops/scripts/image-ops.mjs +305 -0
- package/workflows/question-crops/scripts/image-ops.test.mjs +95 -0
- package/workflows/question-crops/workflow.mjs +172 -0
- package/workflows/ralph-loop/workflow.mjs +162 -0
- package/workflows/research/README.md +74 -0
- package/workflows/research/prompts/s0-goal.md +43 -0
- package/workflows/research/prompts/s1-early-exit.md +22 -0
- package/workflows/research/prompts/s1-map.md +58 -0
- package/workflows/research/prompts/s2-options.md +53 -0
- package/workflows/research/prompts/s3-deep-dive.md +56 -0
- package/workflows/research/prompts/s4-verify.md +74 -0
- package/workflows/research/prompts/s5-synthesis.md +81 -0
- package/workflows/research/prompts/s5b-fill-gaps.md +32 -0
- package/workflows/research/prompts/s6-package.md +32 -0
- package/workflows/research/scripts/build-report.mjs +98 -0
- package/workflows/research/workflow.mjs +288 -0
- package/workflows/wechat-reading-shots/prompts/collect-params.md +16 -0
- package/workflows/wechat-reading-shots/prompts/evaluate.md +20 -0
- package/workflows/wechat-reading-shots/prompts/open-book.md +28 -0
- package/workflows/wechat-reading-shots/prompts/read-page.md +13 -0
- package/workflows/wechat-reading-shots/prompts/turn-batch.md +24 -0
- package/workflows/wechat-reading-shots/test/control-flow.test.ts +329 -0
- package/workflows/wechat-reading-shots/workflow.mjs +266 -0
- package/workflows/wrong-question-docx/README.md +55 -0
- package/workflows/wrong-question-docx/prompts/figure-qa.md +8 -0
- package/workflows/wrong-question-docx/prompts/transcribe.md +25 -0
- package/workflows/wrong-question-docx/scripts/workbook.mjs +857 -0
- package/workflows/wrong-question-docx/test/control-flow.test.ts +165 -0
- package/workflows/wrong-question-docx/test/workbook.test.mjs +303 -0
- package/workflows/wrong-question-docx/workflow.mjs +485 -0
- package/plugins/workflow-runner/src/agentCommon.js +0 -354
- package/plugins/workflow-runner/src/agentCommon.ts +0 -435
- package/plugins/workflow-runner/src/controlFlow/branch.js +0 -40
- package/plugins/workflow-runner/src/controlFlow/branch.ts +0 -46
- package/plugins/workflow-runner/src/controlFlow/loop.js +0 -211
- package/plugins/workflow-runner/src/controlFlow/loop.ts +0 -248
- package/plugins/workflow-runner/src/controlFlow/pause.js +0 -129
- package/plugins/workflow-runner/src/controlFlow/pause.ts +0 -141
- package/plugins/workflow-runner/src/controlFlow/signal.js +0 -21
- package/plugins/workflow-runner/src/controlFlow/signal.ts +0 -29
- package/plugins/workflow-runner/src/controlFlow/types.js +0 -18
- package/plugins/workflow-runner/src/controlFlow/types.ts +0 -63
- package/plugins/workflow-runner/src/dslManifest.js +0 -72
- package/plugins/workflow-runner/src/dslManifest.ts +0 -127
- package/plugins/workflow-runner/src/expressions.js +0 -639
- package/plugins/workflow-runner/src/expressions.ts +0 -640
- package/plugins/workflow-runner/src/loader.js +0 -573
- package/plugins/workflow-runner/src/loader.ts +0 -721
- package/plugins/workflow-runner/src/multimodal.js +0 -38
- package/plugins/workflow-runner/src/multimodal.ts +0 -64
- package/plugins/workflow-runner/src/recovery.js +0 -126
- package/plugins/workflow-runner/src/recovery.ts +0 -156
- package/plugins/workflow-runner/src/stepExecutors/agent.js +0 -173
- package/plugins/workflow-runner/src/stepExecutors/agent.ts +0 -234
- package/plugins/workflow-runner/src/stepExecutors/assert.js +0 -42
- package/plugins/workflow-runner/src/stepExecutors/assert.ts +0 -52
- package/plugins/workflow-runner/src/stepExecutors/echo.js +0 -31
- package/plugins/workflow-runner/src/stepExecutors/echo.ts +0 -38
- package/plugins/workflow-runner/src/stepExecutors/llm.js +0 -99
- package/plugins/workflow-runner/src/stepExecutors/llm.ts +0 -133
- package/plugins/workflow-runner/src/stepExecutors/set.js +0 -49
- package/plugins/workflow-runner/src/stepExecutors/set.ts +0 -56
- package/plugins/workflow-runner/src/stepExecutors/skill.js +0 -111
- package/plugins/workflow-runner/src/stepExecutors/skill.ts +0 -140
- package/plugins/workflow-runner/src/stepExecutors/tool.js +0 -227
- package/plugins/workflow-runner/src/stepExecutors/tool.ts +0 -274
- package/plugins/workflow-runner/src/stepExecutors/verify.js +0 -61
- package/plugins/workflow-runner/src/stepExecutors/verify.ts +0 -72
- package/plugins/workflow-runner/src/stepPipeline.js +0 -277
- package/plugins/workflow-runner/src/stepPipeline.ts +0 -366
- package/plugins/workflow-runner/test/agent.test.ts +0 -587
- package/plugins/workflow-runner/test/agentLlmError.test.ts +0 -373
- package/plugins/workflow-runner/test/bashBlacklist.sweep.test.ts +0 -65
- package/plugins/workflow-runner/test/captureMisbind.test.ts +0 -99
- package/plugins/workflow-runner/test/cli.e2e.test.ts +0 -167
- package/plugins/workflow-runner/test/context-files.test.ts +0 -320
- package/plugins/workflow-runner/test/e2e.test.ts +0 -370
- package/plugins/workflow-runner/test/e2eNewLayout.test.ts +0 -314
- package/plugins/workflow-runner/test/engineRobustness.test.ts +0 -234
- package/plugins/workflow-runner/test/expressions.test.ts +0 -439
- package/plugins/workflow-runner/test/foundation.test.ts +0 -126
- package/plugins/workflow-runner/test/graceful.test.ts +0 -139
- package/plugins/workflow-runner/test/greedyInputs.load.test.ts +0 -47
- package/plugins/workflow-runner/test/hostCapability.test.ts +0 -108
- package/plugins/workflow-runner/test/illustrate.load.test.ts +0 -183
- package/plugins/workflow-runner/test/jsonPayload.test.ts +0 -83
- package/plugins/workflow-runner/test/loader.test.ts +0 -617
- package/plugins/workflow-runner/test/maxTurnsRetryDelay.test.ts +0 -33
- package/plugins/workflow-runner/test/multimodal.test.ts +0 -342
- package/plugins/workflow-runner/test/output-schema.test.ts +0 -213
- package/plugins/workflow-runner/test/parseWorkflowArgs.test.ts +0 -106
- package/plugins/workflow-runner/test/pluginRunner.isolation.test.ts +0 -269
- package/plugins/workflow-runner/test/ppt.load.test.ts +0 -1220
- package/plugins/workflow-runner/test/ralphLoop.e2e.test.ts +0 -221
- package/plugins/workflow-runner/test/recovery.test.ts +0 -265
- package/plugins/workflow-runner/test/research.load.test.ts +0 -328
- package/plugins/workflow-runner/test/runner.test.ts +0 -911
- package/plugins/workflow-runner/test/runnerPreflight.test.ts +0 -436
- package/plugins/workflow-runner/test/skillTurnDone.test.ts +0 -71
- package/plugins/workflow-runner/test/stateLifecycle.test.ts +0 -198
- package/plugins/workflow-runner/test/stepPipeline.test.ts +0 -114
- package/plugins/workflow-runner/test/taskArbitration.test.ts +0 -354
- package/plugins/workflow-runner/test/taskLifecycle.test.ts +0 -324
- package/plugins/workflow-runner/test/toolArtifactOverwrite.test.ts +0 -221
- package/plugins/workflow-runner/test/toolCapabilityBoundary.test.ts +0 -29
- package/plugins/workflow-runner/test/toolRuntimeIntegration.test.ts +0 -168
- package/plugins/workflow-runner/test/webppt.load.test.ts +0 -250
- package/plugins/workflow-runner/test/word.load.test.ts +0 -208
- package/plugins/workflow-runner/test/workflows.smoke.test.ts +0 -76
- package/plugins/workflow-runner/test/yamlGuardConditions.test.ts +0 -207
- package/src/advisorState.js +0 -22
- package/src/cli/configWizard.js +0 -293
- package/src/tools/toolProgressBridge.js +0 -48
- package/workflows/adaptive-research.yaml +0 -50
- package/workflows/book-review-short.yaml +0 -125
- package/workflows/e2e-write-greet.yaml +0 -31
- package/workflows/illustrate.yaml +0 -227
- package/workflows/plan.yaml +0 -470
- package/workflows/ppt.yaml +0 -1670
- package/workflows/ralph-loop.yaml +0 -201
- package/workflows/research.yaml +0 -873
- package/workflows/schema.json +0 -176
- package/workflows/webppt.yaml +0 -496
- package/workflows/wechat-reading-shots.yaml +0 -315
- package/workflows/word.yaml +0 -720
- package/workflows/youtube-shorts.yaml +0 -202
- /package/workflows/{research.md → research/DESIGN.md} +0 -0
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: workflow-creator
|
|
3
|
+
description: 创建、修改、审查 V2 动态工作流——放在 workflows 命名子目录中、由 /workflow 执行的受信任 ESM 代码编排模块。用户说「写一个工作流」「把这个流程做成工作流」「改一下某个工作流」时使用。它说明 WorkflowContext、可靠性守卫和端到端验收方式。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# workflow-creator —— 写出**能扛事**的动态工作流
|
|
7
|
+
|
|
8
|
+
## 评价一条工作流的标准
|
|
9
|
+
|
|
10
|
+
**功能、性能、鲁棒性** —— 具体说是四样:**控制力**(流程按你设计的走)、
|
|
11
|
+
**越障能力**(某一步出意外能绕过去而不是整条崩)、**模板完成度**(该有的守卫都有)、
|
|
12
|
+
**稳定性**(同样的输入跑十遍结果一致)。
|
|
13
|
+
|
|
14
|
+
**行数不在其中。** 本项目的架构就是「轻引擎、重工作流」—— 不能让引擎膨胀,
|
|
15
|
+
工作流该多写就多写。看到一条工作流比对应的 yaml 长,那通常是好事而不是坏事。
|
|
16
|
+
|
|
17
|
+
举个真实的例子:`adaptive-research` 迁移后把 DSL 藏在 `done_when:` 两行声明里的守卫
|
|
18
|
+
**摆到了明面上**,占了 20 行。那 20 行是这条工作流唯一不会烂尾的原因 ——
|
|
19
|
+
删掉它跑起来一模一样,直到某天模型开始 announce-not-do。
|
|
20
|
+
|
|
21
|
+
## 这个 skill 要防的那件事
|
|
22
|
+
|
|
23
|
+
只看 API 参考的人会写出**没有任何守卫**的工作流,而且它**看起来更短更干净**。
|
|
24
|
+
**能跑通 ≠ 写好了。** 下面的流程与规则就是把「好」变成可检查的。
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 一、先搞清楚要写的是什么
|
|
29
|
+
|
|
30
|
+
动手前先答三个问题;答不上来就先问用户(**一次性合并问完**,别追问第二轮):
|
|
31
|
+
|
|
32
|
+
1. **成果和必需后置条件是什么?** 文件成果具体到路径与格式;非文件成果具体到 schema、协议令牌、
|
|
33
|
+
测试或目标应用状态。没有可观察判据的工作流没法验收,也就没法自动化。
|
|
34
|
+
2. **哪些步骤是确定性的,哪些需要随机应变?** 这决定用原生函数、`wf.tools.call()` 还是 `wf.model.agent()`。
|
|
35
|
+
3. **失败了怎么办?** 每个可能失败的地方,是「降级继续」「就地自愈」还是「诚实停止」?
|
|
36
|
+
|
|
37
|
+
> 判断不了执行方式时,优先把纯计算留在 ESM/JS、确定性副作用交给 `wf.tools.call()`/
|
|
38
|
+
> `wf.exec.file()`、开放判断交给 `wf.model.agent()`。失败语义必须由阶段契约决定:关键成果和验收证据失败要诚实停止;只有明确允许缺失的
|
|
39
|
+
> 增强项才能降级继续。
|
|
40
|
+
|
|
41
|
+
### 阶段契约不要只有 success / failed
|
|
42
|
+
|
|
43
|
+
复杂成果通常由多个可独立使用的部分组成。阶段输出至少要区分:
|
|
44
|
+
|
|
45
|
+
- **执行结局**:调用是否完成;
|
|
46
|
+
- **内容完整性**:`complete | partial | unknown`;
|
|
47
|
+
- **组件状态**:哪些部分已确认可用,哪些部分缺失;
|
|
48
|
+
- **限制来源**:原始输入本身缺失、当前定位/处理失败,还是归属仍有歧义。
|
|
49
|
+
|
|
50
|
+
父流程应继续使用已确认的组件,只对缺失组件降级或占位;不要因为一个可选或局部组件失败,
|
|
51
|
+
把已经可靠完成的主体清空。反过来,文件落盘或子流程正常 `return` 只证明“执行完成”,
|
|
52
|
+
不自动证明业务内容完整。结构化字段要进入 schema/result,不能只藏在人话 warning 里让下游再猜。
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 二、先查清楚你手上有什么(**动手前必做,不许跳过**)
|
|
57
|
+
|
|
58
|
+
工作流最容易犯的错不是写错,而是**让 agent 从零重造一个已经存在的能力** ——
|
|
59
|
+
自己写一段 PPT 生成逻辑,而项目里躺着一个沉淀了几十条踩坑经验的 `pptx` skill。
|
|
60
|
+
|
|
61
|
+
**每次写工作流之前先跑这一条**:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
node skills/workflow-creator/scripts/list-resources.mjs
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
它会现场列出这台机器上**当前**有什么:
|
|
68
|
+
|
|
69
|
+
- **工具**(40+ 个)—— 用于 `wf.tools.call()` 与 `allowedTools`,按用途归好组
|
|
70
|
+
- **Skills**(近 30 个)—— 用 `wf.model.skill(名字, 任务描述)` 调
|
|
71
|
+
- **插件** —— 各自暴露的命令
|
|
72
|
+
|
|
73
|
+
只想看一类就加 `--tools` / `--skills` / `--plugins`;要机器可读加 `--json`。
|
|
74
|
+
|
|
75
|
+
> ⚠️ **为什么是脚本而不是这里写一张表**:写死的清单必然过时。工具会增删、
|
|
76
|
+
> skills 是运行时扫目录的(用户还能在自己项目里放)、插件也可能装卸。
|
|
77
|
+
> 一张落后的表会让你**用不上已有能力**,或者**写出不存在的工具名**(那会被
|
|
78
|
+
> `allowedTools` 静默过滤,agent 少了能力还不明显报错)。
|
|
79
|
+
> **清单靠现场查,判断靠下面这几条。**
|
|
80
|
+
|
|
81
|
+
### 判断:这一步该用什么
|
|
82
|
+
|
|
83
|
+
| 情况 | 用什么 |
|
|
84
|
+
|---|---|
|
|
85
|
+
| 现有 Skill 的能力、输入和产出契约与本阶段匹配 | 优先 `wf.model.skill()` 复用沉淀;不匹配时使用更小的 tool/agent 组合,不为迁就 Skill 扭曲流程 |
|
|
86
|
+
| 没有现成 skill,任务开放 | `wf.model.agent()`,并在 prompt 里**点名让它先 Read 相关 SKILL.md** |
|
|
87
|
+
| 完全确定性 | `wf.tools.call()` / `wf.exec.shell()` |
|
|
88
|
+
| 已有普通动态工作流可完成一个阶段 | 在meta.dependencies声明名字,然后 `await wf.flow.child(name, inputs)`,从result读取结构化结果;不另起CLI进程 |
|
|
89
|
+
| 要看图 | `wf.model.generate(prompt, { images: [...] })` —— 唯一通道 |
|
|
90
|
+
| 产出不在文本里(截图等) | `wf.tools.callResult()` 而不是 `wf.tools.call()`,图在 `images` 字段 |
|
|
91
|
+
| **要 JSON 回来** | `{ schema: {...} }` —— **别再手写 `parseJson` + nudge 循环**,引擎会校验 + 有界修复,返回的直接是对象 |
|
|
92
|
+
| **同一件事做 N 遍** | `wf.flow.pipeline(items, { stages: [...] })` —— **不要**裸 `Promise.all(items.map(i => wf.model.agent(...)))`,那会让断点续跑静默失效 |
|
|
93
|
+
| **这一步不需要前文** | 加 `{ isolated: true }` —— 逐项打分/格式转换/批量抽取都属此类,主线 history 不会变长 |
|
|
94
|
+
| **这一步便宜/判断轻** | 可以 `{ model: '某个便宜模型 id' }`,但**随包分发的工作流别写死 id**(那是每台机器各自的配置) |
|
|
95
|
+
| **给个目标,自己持续推进** | 先判断是否应由外层 Goal Runtime 管理;生命周期不写进 Runner。具体循环策略参考 `patterns.md` 第 19 节和 `workflows/goal/workflow.mjs`,按业务契约裁剪,不整段照抄 |
|
|
96
|
+
|
|
97
|
+
例:`await wf.model.skill('pptx', '把 out/deck.json 转成 out/deck.pptx,要能被 PowerPoint 干净打开')`
|
|
98
|
+
|
|
99
|
+
### 别忘了这三样能力
|
|
100
|
+
|
|
101
|
+
`list-resources.mjs` 会列出全部,但下面三样最容易被忽略 —— 它们不像"工具",
|
|
102
|
+
更像"另一个世界的入口":
|
|
103
|
+
|
|
104
|
+
- **`ComputerUse`(桌面操控)** —— 能截屏、点击、按键、操控本机 GUI 应用。
|
|
105
|
+
应用的界面知识住在 `plugins/computer_use/app/<应用>.md`,**引擎会把说明书摘要
|
|
106
|
+
注入每一次观测**,所以工作流**不要**把界面知识抄进 prompt(抄了也打不过每次
|
|
107
|
+
新鲜送达的说明书,还只服务这一个工作流)。工作流只声明**目标和判据**。
|
|
108
|
+
调用时必须写 `{ uses: ['computer'] }`,否则宿主不转授权。
|
|
109
|
+
现成例子:`workflows/wechat-reading-shots/`。
|
|
110
|
+
⚠️ 目前只吃 macOS。
|
|
111
|
+
|
|
112
|
+
- **`WebBrowser`(真浏览器)** —— 需要登录、JS 渲染、要在页面里 `eval` 抽数据时用。
|
|
113
|
+
`{ uses: ['browser'] }`。⚠️ `eval` 还需要「设置 → 浏览器」开 Developer Mode。
|
|
114
|
+
现成例子:`workflows/illustrate/`。
|
|
115
|
+
|
|
116
|
+
- **`Agent`(子任务分身)** —— 但在工作流里你基本用不到它:`wf.model.agent()` 本身就是
|
|
117
|
+
子任务。除非要在一个 agent 内部再并行分身。
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 三、目录形态:**一个工作流可以有很多文件**
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
workflows/<名字>/ ← 目录名**就是**工作流名,脚本里不写 name
|
|
125
|
+
├── workflow.mjs 主入口(必需)
|
|
126
|
+
├── scripts/*.mjs 原生 import 的纯函数,或独立进程辅助程序
|
|
127
|
+
├── prompts/*.md 长 prompt 拆出来单独放(用 wf.fs.readText() 读取)
|
|
128
|
+
├── assets/ 模板、schema、示例数据
|
|
129
|
+
└── README.md 意图 / 输入 / 产物 / 已知坑
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**别把什么都塞进一个 `workflow.mjs`。** 复杂工作流该拆就拆,按架构需要来:
|
|
133
|
+
|
|
134
|
+
- **确定性的纯数据处理**(解析、统计、坐标换算)→ 抽成 `scripts/*.mjs` 并原生相对
|
|
135
|
+
`import`。只有需要独立进程或第三方 CLI 时才用 `wf.exec.file()`。
|
|
136
|
+
- **超过 30 行的 prompt** → 放 `prompts/xxx.md`,主脚本里用
|
|
137
|
+
用 `wf.runtime.workflowDir` 构造绝对路径,再交给 `wf.fs.readText()`。
|
|
138
|
+
(**不是** `wf.tools.call('Read')` —— 那个返回给模型看的格式。)
|
|
139
|
+
好处:改 prompt 不动代码,diff 干净。
|
|
140
|
+
- **schema / 模板 / 固定清单** → 放 `assets/`,`wf.fs.readJson()` 读进来。
|
|
141
|
+
|
|
142
|
+
主入口 `workflow.mjs` 应该读起来像**流程的目录**:一眼看清有几个阶段、每阶段干什么、
|
|
143
|
+
守卫在哪。细节下沉到脚本和 prompt 文件里。
|
|
144
|
+
|
|
145
|
+
需要用户文件、图片或目录时,把输入声明为 `type: 'resource'`,并按需设置
|
|
146
|
+
`accepts`、`allowFile`、`allowDirectory`、`multiple`、`maxItems` 和
|
|
147
|
+
`attachmentFallback: true`。这样 CLI/TUI 的路径与 Desktop 本轮拖入的附件会走同一条绑定链;
|
|
148
|
+
工作流从 `wf.input.values.<name>` 取得路径,从 `wf.input.resources.<name>` 取得资源清单。
|
|
149
|
+
如果工作流始终需要目录,即使用户只拖入一个文件,也要声明 `materialize: 'directory'`。
|
|
150
|
+
不要从 transient context 或消息文本中猜附件路径。显式 `--input name=路径` 始终优先;多附件会自动物化为稳定目录。
|
|
151
|
+
|
|
152
|
+
用 `node skills/workflow-creator/scripts/scaffold.mjs <名字>` 生成起步目录。
|
|
153
|
+
|
|
154
|
+
**辅助脚本一律写 `.mjs`,不要 `.ts`**:它们是被 `node` spawn 的,而 npm 安装形态和绿色版
|
|
155
|
+
U 盘上的 Node 版本不可控,`.ts` 需要 type-stripping 支持。同理**不要用 Python** ——
|
|
156
|
+
宿主必然有 JS 运行时,Python 环境不一定有(这个项目为此踩过坑)。
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## 四、脚本骨架
|
|
161
|
+
|
|
162
|
+
开头必须是带 `apiVersion: 2` 的**纯字面量** `meta`,默认导出 `run(wf)`;禁止顶层
|
|
163
|
+
启动业务,所有运行状态都放进 `run()`:
|
|
164
|
+
|
|
165
|
+
```javascript
|
|
166
|
+
export const meta = {
|
|
167
|
+
apiVersion: 2,
|
|
168
|
+
description: '一句话说清这个工作流做什么', // 必填
|
|
169
|
+
inputs: [{ name: 'topic', required: true, greedy: true }],
|
|
170
|
+
artifacts: [],
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export default async function run(wf) {
|
|
174
|
+
const { topic } = wf.input.values
|
|
175
|
+
const { sessionId, taskId } = wf.runtime
|
|
176
|
+
const OUT = `out/<名字>/${sessionId}/${taskId}/report.md`
|
|
177
|
+
|
|
178
|
+
await wf.model.agent(`……`, { label: '起草', allowedTools: ['Read', 'Write'] })
|
|
179
|
+
|
|
180
|
+
if (!(await wf.fs.exists(OUT))) throw new Error(`${OUT} 没产出`)
|
|
181
|
+
wf.output.artifact(OUT)
|
|
182
|
+
|
|
183
|
+
wf.output.message(`✅ 完成 → ${OUT}`)
|
|
184
|
+
return { path: OUT }
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
**控制流用 JS 原生的**:`if` / `for` / `while` / `break` / `continue` / `try`,
|
|
189
|
+
带标签的 `break outer` / `continue outer` 可跨嵌套循环跳。
|
|
190
|
+
引擎**不提供**这些的替代品,因为不需要。
|
|
191
|
+
|
|
192
|
+
**唯一的例外是扇出**:用 `wf.flow.pipeline()`,不要裸 `Promise.all` 并发记账调用。
|
|
193
|
+
原因见下面第五节和 `references/api.md` —— 一句话是账本按车道定位,裸 `Promise.all`
|
|
194
|
+
会让所有调用挤在同一条车道上并发记账,断点续跑静默失效。
|
|
195
|
+
|
|
196
|
+
完整能力清单见 `references/api.md`,结构模式见 `references/patterns.md`。
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## 五、脊梁规则:必需后置条件必须可观察
|
|
201
|
+
|
|
202
|
+
> **每个阶段的必需后置条件都必须有独立于 Agent 自述的可观察证据,并定义有界恢复。**
|
|
203
|
+
|
|
204
|
+
证据可以是文件存在与内容检查、结构化 schema、精确协议令牌、测试结果或目标应用实际打开结果。
|
|
205
|
+
恢复可以是 nudge、换工具、换来源、重做当前阶段或诚实停止;不是每个 `wf.model.agent()` 都必须写文件或 nudge。
|
|
206
|
+
纯分析、分类、候选探索等阶段只需验证其下游真正依赖的输出契约。
|
|
207
|
+
|
|
208
|
+
验收范围要与成果组件对齐:局部增强失败只影响该组件,不能否定已独立核实的主体;真正缺少
|
|
209
|
+
必需输入时则要明确标成 `source_limited` 一类的业务状态,不能靠降低阈值冒充通过。
|
|
210
|
+
每次重试还必须改变至少一项:输入、定位框、工具、模型提示中的具体错误证据或执行策略。
|
|
211
|
+
原始输入没有所需信息时立即停止该组件的重试;把同一输入和笼统的“再试一次”重复发送,
|
|
212
|
+
既不能补回不存在的信息,也会把模型延迟放大成工作流卡顿。
|
|
213
|
+
|
|
214
|
+
理由:弱模型的典型烂尾是 **announce-not-do** —— 输出「接下来我将创建该文件」然后就
|
|
215
|
+
`end_turn` 了,文本读起来像做完了。实测遇到过:`ralph-loop` 第一次跑,agent 输出
|
|
216
|
+
`<promise>DONE</promise>` 而文件根本不存在;加上验收门再跑才真做出来。
|
|
217
|
+
|
|
218
|
+
当“文件必须落盘”确实是阶段后置条件时,标准写法是:
|
|
219
|
+
|
|
220
|
+
```javascript
|
|
221
|
+
let out = await wf.model.agent(PROMPT, { label: '写报告', allowedTools: ['Read', 'Write'] })
|
|
222
|
+
|
|
223
|
+
for (let i = 1; i <= 2 && !(await wf.fs.exists(OUT)); i++) {
|
|
224
|
+
wf.output.progress(`${OUT} 还没落盘,第 ${i} 次提醒`)
|
|
225
|
+
out = await wf.model.agent(
|
|
226
|
+
`${OUT} 还没有生成。请**现在就调用 Write 工具**写进去,不要只描述你打算做什么。`,
|
|
227
|
+
{ label: `nudge-${i}`, allowedTools: ['Read', 'Write'] },
|
|
228
|
+
)
|
|
229
|
+
}
|
|
230
|
+
if (!(await wf.fs.exists(OUT))) throw new Error(`${OUT} 始终未生成`)
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
引擎侧还有一道**廉价兜底**:`wf.model.agent()` 产出了文本却一次工具都没调时,会往
|
|
234
|
+
`progress.md` 记一条 `⚠ #N agent 零工具调用` 并发 warning。
|
|
235
|
+
**跑完之后在 progress.md 里搜「零工具调用」** —— 搜得到就说明那一步的 prompt 在邀请模型叙述而不是动手。
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## 六、必踩的坑
|
|
240
|
+
|
|
241
|
+
0. **扇出用 `wf.flow.pipeline()`,不要裸 `Promise.all(wf.model.agent(...))`**。
|
|
242
|
+
账本按「**车道内序号** + 内容指纹」定位断点,而裸 `Promise.all` 让所有调用挤在同一条
|
|
243
|
+
车道上并发记账 —— 序号取决于谁先返回,也就是取决于 LLM 延迟。**断点续跑随之静默失效**。
|
|
244
|
+
扇出**超过并发上限 8** 时必然发生,而 N ≤ 8 的验证恒绿、根本看不出来。
|
|
245
|
+
`pipeline` 给每一项一条确定的车道,扇出与 resume 因此可以兼得。
|
|
246
|
+
→ 看到引擎发「断点续跑随之失效」这条 warning,就是在提示你改用 `pipeline`。
|
|
247
|
+
|
|
248
|
+
1. **`wf.tools.call('Bash', …)` 返回的是给模型看的展示文本**
|
|
249
|
+
(`<stdout>\n83 x.md\n</stdout>\n\n[exit code: 0]`),`split('\n')[0]` 拿到的是字面量 `<stdout>`。
|
|
250
|
+
→ 跑命令一律用 **`wf.exec.shell()`**,它返回 `{ stdout, stderr, exitCode }`。
|
|
251
|
+
|
|
252
|
+
2. **产物路径要带 `${session}/${task}` 命名空间**。不带的话,同一会话换个目标重跑会撞上
|
|
253
|
+
同一个路径(引擎会先把旧的归档进 `.trash/` 兜底,但那是安全网不是设计)。
|
|
254
|
+
|
|
255
|
+
3. **循环体里的逐迭代产物必须 `wf.output.artifact()`**。`meta.artifacts` 是静态字面量,
|
|
256
|
+
写不出 `out/${session}/page-${i}.png`。不登记 = 静默漏档:completed 少报、清理漏掉。
|
|
257
|
+
|
|
258
|
+
4. **禁 `Date.now()` / `Math.random()` / 无参 `new Date()`**。断点续跑靠「调用序号 + 内容指纹」
|
|
259
|
+
重放,任何不确定性都会让指纹必然失配,等于 resume 直接失效。启动前静态扫描会拒绝并指出行号。
|
|
260
|
+
需要变化就让 `args` 或循环下标参与。
|
|
261
|
+
|
|
262
|
+
5. **`meta` 必须是纯字面量、不许有 `name`**。它在执行前被静态求值,此时没有任何运行时值可用;
|
|
263
|
+
工作流名恒等于目录名(两处声明必然漂移)。
|
|
264
|
+
|
|
265
|
+
6. **读数据文件一律用 `wf.fs.readText()` / `wf.fs.readJson()`,绝不要用 `wf.tools.call('Read', …)`**。
|
|
266
|
+
|
|
267
|
+
`Read` 工具的输出是**给模型看**的,带两样对程序化读取有害的东西:
|
|
268
|
+
每行的 `<行号><TAB>` 前缀,以及**重复读同一文件时开头插的一句**
|
|
269
|
+
「⚠️ 重复读取空转:该区间未变化…」。
|
|
270
|
+
|
|
271
|
+
第二条尤其阴险 —— 它**只在第二次出现**,于是同一段代码时对时错。
|
|
272
|
+
真实事故:research 阶段2 的 agent 写完 `branches.json` 后自己 Read 校验了一遍,
|
|
273
|
+
脚本随后 `wf.fs.readJson()` 就成了「第二次」→ 解析失败 → 静默返回 `null` →
|
|
274
|
+
下游报「JSON 格式错误或数组为空」,而那个文件手工 `cat` 完全合法。
|
|
275
|
+
排查花了两轮才找到,因为**第一次跑通过、第二次才炸**。
|
|
276
|
+
|
|
277
|
+
`readText`/`readJson` 直接读文件,不经过那条通道。同理 `wf.exec.shell()` 之于 `wf.tools.call('Bash')`。
|
|
278
|
+
|
|
279
|
+
7. **看图只能走 `images` 通道**:`wf.model.generate(prompt, { images: [{ source: path, detail: 'high' }] })`。
|
|
280
|
+
内核的 tool 结果是纯字符串,把图片路径写进 prompt 文本模型是看不见的。
|
|
281
|
+
|
|
282
|
+
8. **`WebBrowser` 的 `eval` 结果要 `parseJson` 两层**。抽取器里 `JSON.stringify(...)`
|
|
283
|
+
返回字符串,agent-browser 显示结果时又 JSON 编码一次 —— 收到的是「带外层引号的
|
|
284
|
+
双编码串」。少套一层会**静默**拿到字符串而不是数组,后续 `.length` 变成字符数。
|
|
285
|
+
|
|
286
|
+
9. **工具返回的图片在 `wf.tools.callResult()` 的 `images` 里,`wf.tools.call()` 拿不到**。
|
|
287
|
+
ComputerUse 的 `observe`、任何看图类工具都一样。用 `wf.tools.call()` 的话那些截图
|
|
288
|
+
**被静默丢弃**,后面要看图的步骤没图可用、还不报错。
|
|
289
|
+
(legacy 引擎为这件事专门修过一次,新引擎一开始又漏了同一处。)
|
|
290
|
+
|
|
291
|
+
10. **协议令牌要精确取值,不要在自由文本里找关键词**。
|
|
292
|
+
`includes('ok')` 会把「ok 的路子都走不通」判成成功;
|
|
293
|
+
`includes('12')` 会把 `PAGE=112 113` 判成到了第 12 页。
|
|
294
|
+
一律 `text.match(/OPEN=([a-z]+)/)?.[1] === 'ok'` 这样精确取。
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
## 七、写完必做的三件事
|
|
299
|
+
|
|
300
|
+
```bash
|
|
301
|
+
# 0. 查清楚手上有什么(写之前就该跑过一次;改工具名之后再跑一次)
|
|
302
|
+
node skills/workflow-creator/scripts/list-resources.mjs --tools
|
|
303
|
+
|
|
304
|
+
# 1. 静态校验(语法、禁用构造、meta 形状、脊梁规则)
|
|
305
|
+
node skills/workflow-creator/scripts/validate.mjs workflows/<名字>/workflow.mjs
|
|
306
|
+
|
|
307
|
+
# 校验器会真实 import ESM(不执行 run),同时核实相对模块和运行时包解析。
|
|
308
|
+
|
|
309
|
+
# 2. 真跑一遍。先用最小输入,别一上来就跑真实大任务
|
|
310
|
+
bun run src/main.tsx -p "/workflow <名字> 一个最小的测试输入"
|
|
311
|
+
|
|
312
|
+
# 3. 看中间产物 —— 这一步最容易被跳过,但问题几乎都藏在这里
|
|
313
|
+
cat .minimal-agent-workflow/<名字>/*/*/progress.md # 每步的开始/完成/失败
|
|
314
|
+
cat .minimal-agent-workflow/<名字>/*/*/journal.jsonl # 每次调用的真实返回值
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
**看 `progress.md` 时重点找三样**:`✗`(失败)、`零工具调用`(announce-not-do)、
|
|
318
|
+
以及「某一步的结果预览是空的」(模型没产出)。同时核对实际模型调用数、每次恢复是否改变了
|
|
319
|
+
输入,以及 `partial/unknown` 项有没有被最终汇总;不要用“生成了文件”代替内容完整性结论。
|
|
320
|
+
|
|
321
|
+
**跑不了端到端怎么办**(依赖 macOS-only 的 ComputerUse、需要授权的浏览器、
|
|
322
|
+
收费 API…):给工作流写**单元测试** —— 构造 `wf` stub,直接调用真实默认导出,
|
|
323
|
+
只验证控制流。见 `references/patterns.md` §16,以及现成的例子
|
|
324
|
+
`plugins/workflow-runner/test/wechatReadingShots.test.ts`(15 条断言,全程不碰桌面)。
|
|
325
|
+
|
|
326
|
+
宿主要拿结构化结局就加 `--output-format json`:`ok` / `stop_reason` / `num_turns` / `result`。
|
|
327
|
+
用户可见结论必须显式调用 `wf.output.message()`;模型内部文本不应自动冒充最终交付。
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
## 八、改一个已有工作流
|
|
332
|
+
|
|
333
|
+
改脚本内容会让 `scriptHash` 变化,引擎据此**作废旧断点**并明示「脚本内容已改变,全新开始」——
|
|
334
|
+
这是有意的:上次那份结论是另一份脚本产出的。所以改完直接重跑同一目标即可,不用手工清状态。
|
|
335
|
+
|
|
336
|
+
真要清干净:删掉 `.minimal-agent-workflow/<名字>/` 即可(`.trash/` 里是旧产物的回收站,
|
|
337
|
+
删它才会真正丢东西)。
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## 九、把 yaml 工作流迁成代码形态
|
|
342
|
+
|
|
343
|
+
见 `references/migration.md` —— 里面是 13 种 StepKind 到 JS 原生写法的逐条对照,
|
|
344
|
+
以及「迁完怎么算合格」的四条判据(控制力 / 越障能力 / 模板完成度 / 稳定性)。
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export const meta = {
|
|
2
|
+
// 一句话说清这个工作流做什么。会显示在 /workflows 列表里,必填。
|
|
3
|
+
description: 'TODO:一句话说清做什么',
|
|
4
|
+
|
|
5
|
+
// 输入声明。位置参数按这里的**数组顺序**映射;首个可标 greedy 吸收整句自然语言。
|
|
6
|
+
inputs: [{ name: 'topic', required: true, greedy: true }],
|
|
7
|
+
|
|
8
|
+
// 静态产物种子。带 ${} 的路径写不了(meta 是执行前静态求值的纯字面量),
|
|
9
|
+
// 那些用运行时的 declareArtifact() 登记。
|
|
10
|
+
artifacts: [],
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// ⚠️ 目录名就是工作流名,这里不写 name。
|
|
14
|
+
// ⚠️ 不能 import;不能用 Date.now() / Math.random() / 无参 new Date()。
|
|
15
|
+
// 完整能力见 skills/workflow-creator/references/api.md
|
|
16
|
+
|
|
17
|
+
// 产物路径带 ${session}/${task} 两级命名空间:session 隔离并行会话,
|
|
18
|
+
// task 隔离「同一会话里换了个目标」。
|
|
19
|
+
const OUT = `out/TODO-名字/${session}/${task}/report.md`
|
|
20
|
+
|
|
21
|
+
log('开始')
|
|
22
|
+
|
|
23
|
+
// ── 步骤 1:确定性的活用 tool() / sh() ──────────────────────────────
|
|
24
|
+
// const r = await sh('node scripts/prepare.mjs')
|
|
25
|
+
// if (r.exitCode !== 0) throw new Error(r.stderr)
|
|
26
|
+
|
|
27
|
+
// ── 步骤 2:开放式的活用 agent() ────────────────────────────────────
|
|
28
|
+
let out = await agent(
|
|
29
|
+
`TODO:把任务描述清楚。要产出文件时,明确写出路径 ${OUT}。`,
|
|
30
|
+
{ label: 'TODO 这一步在干嘛', allowedTools: ['Read', 'Write', 'Grep', 'Glob'] },
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
// ── 脊梁规则:产出物必核实 + 有界 nudge ─────────────────────────────
|
|
34
|
+
// agent 可能「宣告要做却没动手」(announce-not-do),文本读起来像做完了。
|
|
35
|
+
// 删掉这段,这条工作流就失去了对该失效模式的全部防护。
|
|
36
|
+
for (let i = 1; i <= 2 && !(await exists(OUT)); i++) {
|
|
37
|
+
log(`${OUT} 还没落盘,第 ${i} 次提醒`)
|
|
38
|
+
out = await agent(
|
|
39
|
+
`${OUT} 还没有生成。请**现在就调用 Write 工具**写进去,不要只描述你打算做什么。`,
|
|
40
|
+
{ label: `nudge-${i}`, allowedTools: ['Read', 'Write'] },
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
if (!(await exists(OUT))) throw new Error(`${OUT} 始终未生成`)
|
|
44
|
+
declareArtifact(OUT)
|
|
45
|
+
|
|
46
|
+
// ── 收尾:echo 是 -p 模式 result 字段的唯一来源 ──────────────────────
|
|
47
|
+
echo(`✅ 完成 → ${OUT}`)
|
|
48
|
+
return { path: OUT }
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
# WorkflowContext V2 API
|
|
2
|
+
|
|
3
|
+
动态工作流是受信任的本地 ESM 模块,不是安全沙箱。入口固定为:
|
|
4
|
+
|
|
5
|
+
```js
|
|
6
|
+
export const meta = {
|
|
7
|
+
apiVersion: 2,
|
|
8
|
+
description: '一句话说明用途',
|
|
9
|
+
inputs: [],
|
|
10
|
+
dependencies: [],
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export default async function run(wf) {
|
|
14
|
+
return { ok: true }
|
|
15
|
+
}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
允许原生相对 `import`、`node:` 内置模块和已声明的运行时包。模块顶层只能放纯常量、
|
|
19
|
+
函数与类,不得保存每次运行会改变的状态;运行状态必须在 `run(wf)` 内。
|
|
20
|
+
|
|
21
|
+
本表与
|
|
22
|
+
`plugins/workflow-runner/src/workflowContextCapabilities.json` 自动对账;能力注册表、运行时
|
|
23
|
+
形状、类型与本参考共享这一份真值。
|
|
24
|
+
|
|
25
|
+
## 能力表
|
|
26
|
+
|
|
27
|
+
| 路径 | 说明 |
|
|
28
|
+
|---|---|
|
|
29
|
+
| `wf.input.values` | 经过 `meta.inputs` 强制类型后的输入 |
|
|
30
|
+
| `wf.input.resources` | 资源输入对应的 `InvocationResource[]` |
|
|
31
|
+
| `wf.runtime.workflowName` | 目录名,也是工作流唯一名称 |
|
|
32
|
+
| `wf.runtime.workflowDir` | 工作流包绝对目录 |
|
|
33
|
+
| `wf.runtime.cwd` | 本次有效工作目录 |
|
|
34
|
+
| `wf.runtime.sessionId` | 会话身份 |
|
|
35
|
+
| `wf.runtime.taskId` | 任务实例身份 |
|
|
36
|
+
| `wf.runtime.runId` | 当前运行身份 |
|
|
37
|
+
| `wf.runtime.rootRunId` | 整棵父子执行树身份 |
|
|
38
|
+
| `wf.runtime.goal` | 只读目标锚 |
|
|
39
|
+
| `wf.model.generate` | 零工具模型生成;支持 schema、images 等选项 |
|
|
40
|
+
| `wf.model.agent` | 有界 TAOR 子任务 |
|
|
41
|
+
| `wf.model.skill` | 调用一个 Skill agent |
|
|
42
|
+
| `wf.model.require` | 在昂贵步骤前核实模型角色能力 |
|
|
43
|
+
| `wf.tools.call` | 调用工具,返回文本 |
|
|
44
|
+
| `wf.tools.callResult` | 调用工具,返回 content/images/metadata |
|
|
45
|
+
| `wf.exec.shell` | 执行 shell 字符串,返回 stdout/stderr/exitCode |
|
|
46
|
+
| `wf.exec.file` | 用参数数组执行脚本或程序,避免 shell quoting |
|
|
47
|
+
| `wf.fs.exists` | 每次读取真实磁盘状态 |
|
|
48
|
+
| `wf.fs.readText` | 读取纯文本,失败返回 null |
|
|
49
|
+
| `wf.fs.readJson` | 读取 JSON,失败返回 null |
|
|
50
|
+
| `wf.fs.writeText` | 原子、幂等写文本 |
|
|
51
|
+
| `wf.fs.writeJson` | 原子、幂等写 JSON |
|
|
52
|
+
| `wf.fs.mkdir` | 递归建目录 |
|
|
53
|
+
| `wf.flow.pipeline` | 有界、稳定 lane 的结构化流水线 |
|
|
54
|
+
| `wf.flow.child` | 调用 `meta.dependencies` 声明的子工作流 |
|
|
55
|
+
| `wf.flow.ask` | 人在回路闸门 |
|
|
56
|
+
| `wf.check.verify` | 确定性检查 |
|
|
57
|
+
| `wf.state.budget` | 当前执行树 token 账本快照 |
|
|
58
|
+
| `wf.state.resetModelContext` | 长循环回到入口上下文 |
|
|
59
|
+
| `wf.state.addGoalSupplement` | 追加贯穿后续调用的目标补充 |
|
|
60
|
+
| `wf.state.syncManagedContract` | managedRuntime 将契约交回外层控制器 |
|
|
61
|
+
| `wf.output.message` | 用户可见且进入历史的最终输出 |
|
|
62
|
+
| `wf.output.progress` | 结构化进度事件 |
|
|
63
|
+
| `wf.output.artifact` | 动态登记产物 |
|
|
64
|
+
|
|
65
|
+
`wf.fs` 不进 journal;模型、工具、进程、询问和子工作流进入 journal。工作流返回值必须
|
|
66
|
+
可 JSON 序列化。Runner 只解释完成、失败与中断,不解释 `partial`、`suspected` 等业务字段。
|
|
67
|
+
|
|
68
|
+
## 模型选项
|
|
69
|
+
|
|
70
|
+
`wf.model.generate(prompt, options)`、`agent`、`skill` 支持:
|
|
71
|
+
|
|
72
|
+
```js
|
|
73
|
+
{
|
|
74
|
+
label: '识图',
|
|
75
|
+
allowedTools: ['Read', 'Write'],
|
|
76
|
+
maxTurns: 20,
|
|
77
|
+
uses: ['browser'],
|
|
78
|
+
images: [{ source: imagePath, detail: 'high' }],
|
|
79
|
+
contextFiles: [{ path: 'PLAN.md', hint: '验收标准' }],
|
|
80
|
+
timeoutMs: 900_000,
|
|
81
|
+
maxTokens: 8192,
|
|
82
|
+
model: 'vision',
|
|
83
|
+
isolated: true,
|
|
84
|
+
nativeSchema: false,
|
|
85
|
+
schema: {
|
|
86
|
+
type: 'object',
|
|
87
|
+
required: ['items'],
|
|
88
|
+
properties: { items: { type: 'array', items: { type: 'string' } } },
|
|
89
|
+
},
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
- 图片只能通过 `images` 通道送入模型,路径写进 prompt 不等于传图。
|
|
94
|
+
- `schema` 会执行 JSON 提取、校验和有界格式修复;不要另写无差别重问循环。
|
|
95
|
+
- `isolated` 适合逐项识别、分类、格式转换,避免扇出污染主历史。
|
|
96
|
+
- 随包工作流使用语义角色,不写死某台机器的模型 ID。
|
|
97
|
+
- 超时包含排队、工具轮和 schema 修复;等待调度不会占模型槽。
|
|
98
|
+
|
|
99
|
+
## pipeline
|
|
100
|
+
|
|
101
|
+
```js
|
|
102
|
+
const batch = await wf.flow.pipeline(items, {
|
|
103
|
+
label: '逐项识别',
|
|
104
|
+
concurrency: 6,
|
|
105
|
+
errorMode: 'collect', // collect | fail-fast
|
|
106
|
+
stages: [
|
|
107
|
+
async (_previous, item, index) =>
|
|
108
|
+
wf.model.generate(`识别第${index}项:${item}`, { isolated: true }),
|
|
109
|
+
async (text, item, index) => ({ item, index, text }),
|
|
110
|
+
],
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
const values = batch.results
|
|
114
|
+
.filter((entry) => entry.ok)
|
|
115
|
+
.map((entry) => entry.value)
|
|
116
|
+
const failures = batch.results.filter((entry) => !entry.ok)
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
- 返回顺序永远与输入一致;失败包含 `name/message/code`,不再用 `null` 丢原因。
|
|
120
|
+
- `collect` 继续其它项;`fail-fast` 停止尚未开始的项,等待已开始项退出后抛错。
|
|
121
|
+
- 取消始终抛 `AbortError`,不能变成普通项目失败。
|
|
122
|
+
- 并发缺省由 `MINIMAL_AGENT_WORKFLOW_PIPELINE_CONCURRENCY` 控制,不得超过
|
|
123
|
+
`MINIMAL_AGENT_WORKFLOW_PIPELINE_MAX_CONCURRENCY`。
|
|
124
|
+
- 扇出模型/工具/进程调用必须用 pipeline,不要裸 `Promise.all` 破坏 journal lane。
|
|
125
|
+
|
|
126
|
+
## 子工作流
|
|
127
|
+
|
|
128
|
+
```js
|
|
129
|
+
export const meta = {
|
|
130
|
+
apiVersion: 2,
|
|
131
|
+
description: '父工作流',
|
|
132
|
+
dependencies: ['question-crops'],
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export default async function run(wf) {
|
|
136
|
+
const child = await wf.flow.child(
|
|
137
|
+
'question-crops',
|
|
138
|
+
{ source: wf.input.values.source },
|
|
139
|
+
{ label: '分题' },
|
|
140
|
+
)
|
|
141
|
+
return { inventory: await wf.fs.readJson(child.result.manifest) }
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
子输入显式传递,不重新吸收父附件。父子共享取消、调用总量、用量账本与全局调度上限,
|
|
146
|
+
但 history、目标、journal、状态和产物所有权隔离。循环依赖、超过八层、未声明依赖及
|
|
147
|
+
managedRuntime 子调用都会拒绝。子工作流完成不会产生顶层终态。
|
|
148
|
+
|
|
149
|
+
## 文件、进程和原生 import
|
|
150
|
+
|
|
151
|
+
纯计算优先原生 import:
|
|
152
|
+
|
|
153
|
+
```js
|
|
154
|
+
import { normalize } from './scripts/normalize.mjs'
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
需要独立进程或第三方 CLI 才用:
|
|
158
|
+
|
|
159
|
+
```js
|
|
160
|
+
const result = await wf.exec.file('./scripts/render.mjs', ['build', jobPath], {
|
|
161
|
+
timeoutMs: 120_000,
|
|
162
|
+
})
|
|
163
|
+
if (result.exitCode !== 0) throw new Error(result.stderr)
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
`wf.exec.file()` 对 `.mjs`/`.js` 脚本使用宿主 Node 运行;其它路径按可执行文件处理。
|
|
167
|
+
不要为普通数组排序、坐标转换、字符串拼装等纯函数反复启动 Node。
|
|
168
|
+
|
|
169
|
+
## 输出和进度
|
|
170
|
+
|
|
171
|
+
```js
|
|
172
|
+
wf.output.progress({
|
|
173
|
+
phase: 'extract',
|
|
174
|
+
status: 'update',
|
|
175
|
+
current: 3,
|
|
176
|
+
total: 10,
|
|
177
|
+
message: '正在处理第3项',
|
|
178
|
+
})
|
|
179
|
+
wf.output.artifact(path)
|
|
180
|
+
wf.output.message(`完成:${path}`)
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
结构化事件自动补充 workflow/run/rootRunId,并写入 `events.jsonl`。`progress.md` 继续保存
|
|
184
|
+
人类可读记录。根工作流只产生一个终态。
|
|
185
|
+
|
|
186
|
+
## 环境限额
|
|
187
|
+
|
|
188
|
+
| 环境变量 | 默认值 |
|
|
189
|
+
|---|---:|
|
|
190
|
+
| `MINIMAL_AGENT_WORKFLOW_MAX_ACTIVE_RUNS` | 4 |
|
|
191
|
+
| `MINIMAL_AGENT_WORKFLOW_MODEL_CONCURRENCY` | 8 |
|
|
192
|
+
| `MINIMAL_AGENT_WORKFLOW_TOOL_CONCURRENCY` | 16 |
|
|
193
|
+
| `MINIMAL_AGENT_WORKFLOW_PROCESS_CONCURRENCY` | 8 |
|
|
194
|
+
| `MINIMAL_AGENT_WORKFLOW_PIPELINE_CONCURRENCY` | 4 |
|
|
195
|
+
| `MINIMAL_AGENT_WORKFLOW_PIPELINE_MAX_CONCURRENCY` | 32 |
|
|
196
|
+
| `MINIMAL_AGENT_WORKFLOW_MAX_CALLS` | 1000 |
|
|
197
|
+
|
|
198
|
+
非法数值会响亮报错,不静默回退默认值。限制只协调当前 minimal-agent 进程。
|
|
199
|
+
|
|
200
|
+
## verify 与 ask
|
|
201
|
+
|
|
202
|
+
```js
|
|
203
|
+
await wf.check.verify([
|
|
204
|
+
'file_exists:out/a.md',
|
|
205
|
+
'file_contains:out/a.md:标题',
|
|
206
|
+
'shell:bun test',
|
|
207
|
+
])
|
|
208
|
+
|
|
209
|
+
const answer = await wf.flow.ask('是否继续?', [
|
|
210
|
+
{ label: '继续(推荐)', description: '进入下一阶段' },
|
|
211
|
+
{ label: '停止', description: '保留现场' },
|
|
212
|
+
])
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
`ask` 的推荐项必须放第一位;非交互宿主按首项兜底。`budget()` 只在新一轮开始前读取,
|
|
216
|
+
不在一轮中途打断正在产生的成果。
|