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,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ============================================================
|
|
3
|
+
* plugins/workflow-runner/src/discovery.ts —— 工作流目录发现
|
|
4
|
+
* ------------------------------------------------------------
|
|
5
|
+
* 一个工作流 = 一个目录:`workflows/<name>/workflow.mjs`。目录名即工作流名。
|
|
6
|
+
*
|
|
7
|
+
* 三源搜索沿用框架既有契约 `getResourceSearchPaths('workflows', ...)`:
|
|
8
|
+
* cwd/workflows/ → exe 同级 workflows/(绿色版)→ packageRoot/workflows/
|
|
9
|
+
* 先扫到的同名条目胜出,用户可以在自己项目里覆盖包内自带的工作流。
|
|
10
|
+
*
|
|
11
|
+
* ------------------------------------------------------------
|
|
12
|
+
* 与 legacy loader 的一处**有意不同**:坏脚本不再只 `console.warn` 后消失。
|
|
13
|
+
*
|
|
14
|
+
* legacy 的行为是「一个坏 yaml 不拖累其它工作流」——这条对,但它把坏文件
|
|
15
|
+
* 静默丢出列表,用户看到的是「我的工作流不见了」,而不是「我的工作流写错了」。
|
|
16
|
+
* 这里改成继续扫描 + **把失败原因带出去**(`DiscoveryResult.failures`),由
|
|
17
|
+
* /workflows 如实报出。静默降级是本项目反复吃过亏的失败模式(漏注册插件退化成
|
|
18
|
+
* markdown、漏拷资产目录报「未找到说明书」),不在新引擎里重演。
|
|
19
|
+
* ============================================================
|
|
20
|
+
*/
|
|
21
|
+
import { readFile, readdir } from 'node:fs/promises';
|
|
22
|
+
import { basename, join } from 'node:path';
|
|
23
|
+
import { getResourceSearchPaths } from '../../../src/plugin-sdk.js';
|
|
24
|
+
import { validateScript } from './scriptGuard.mjs';
|
|
25
|
+
/** 编排脚本的固定文件名。目录里没有它就不是工作流目录。 */
|
|
26
|
+
export const SCRIPT_FILENAME = 'workflow.mjs';
|
|
27
|
+
/**
|
|
28
|
+
* 把 scriptGuard 求值出的 meta(形状是 unknown 的宽松对象)收紧成 WorkflowMeta。
|
|
29
|
+
* 调用前 validateScript 已保证 description 是非空字符串、inputs/artifacts 是数组。
|
|
30
|
+
*/
|
|
31
|
+
function narrowMeta(raw) {
|
|
32
|
+
const meta = {
|
|
33
|
+
apiVersion: 2,
|
|
34
|
+
description: String(raw.description),
|
|
35
|
+
};
|
|
36
|
+
if (Array.isArray(raw.dependencies))
|
|
37
|
+
meta.dependencies = raw.dependencies;
|
|
38
|
+
if (Array.isArray(raw.packages))
|
|
39
|
+
meta.packages = raw.packages;
|
|
40
|
+
if (Array.isArray(raw.inputs))
|
|
41
|
+
meta.inputs = raw.inputs;
|
|
42
|
+
if (Array.isArray(raw.artifacts)) {
|
|
43
|
+
meta.artifacts = raw.artifacts.map((a) => String(a));
|
|
44
|
+
}
|
|
45
|
+
if (typeof raw.resumeBackoff === 'number') {
|
|
46
|
+
meta.resumeBackoff = raw.resumeBackoff;
|
|
47
|
+
}
|
|
48
|
+
if (typeof raw.managedRuntime === 'string' && raw.managedRuntime.trim()) {
|
|
49
|
+
meta.managedRuntime = raw.managedRuntime.trim();
|
|
50
|
+
}
|
|
51
|
+
return meta;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 读并校验单个工作流目录。
|
|
55
|
+
*
|
|
56
|
+
* @returns 成功返回 WorkflowScript;失败返回 errors(调用方决定怎么报)
|
|
57
|
+
*/
|
|
58
|
+
export async function loadWorkflowDir(dir) {
|
|
59
|
+
const scriptPath = join(dir, SCRIPT_FILENAME);
|
|
60
|
+
let source;
|
|
61
|
+
try {
|
|
62
|
+
source = await readFile(scriptPath, 'utf8');
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
return {
|
|
66
|
+
ok: false,
|
|
67
|
+
// ⚠️ 这里必须给**类型化**的原因,调用方据此区分「这不是工作流目录」与
|
|
68
|
+
// 「这是个写错的工作流」。曾经是让调用方去 `errors[0].includes('读取')`
|
|
69
|
+
// 匹配中文文案 —— 那意味着有人给错误信息换个措辞,`assets/`、模板目录
|
|
70
|
+
// 这些普通目录就会全部变成「坏工作流」刷进 /workflows 列表。
|
|
71
|
+
reason: 'no-script',
|
|
72
|
+
errors: [
|
|
73
|
+
`读取 ${scriptPath} 失败:${e instanceof Error ? e.message : String(e)}`,
|
|
74
|
+
],
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
const name = basename(dir);
|
|
78
|
+
const verdict = validateScript(source, {
|
|
79
|
+
filename: join('workflows', name, SCRIPT_FILENAME),
|
|
80
|
+
});
|
|
81
|
+
if (!verdict.ok || !verdict.meta || verdict.bodyOffset === undefined) {
|
|
82
|
+
return { ok: false, reason: 'invalid-script', errors: verdict.errors };
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
ok: true,
|
|
86
|
+
workflow: {
|
|
87
|
+
name,
|
|
88
|
+
dir,
|
|
89
|
+
scriptPath,
|
|
90
|
+
source,
|
|
91
|
+
meta: narrowMeta(verdict.meta),
|
|
92
|
+
bodyOffset: verdict.bodyOffset,
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 按给定的搜索根扫描(前面的根优先)。
|
|
98
|
+
*
|
|
99
|
+
* 独立导出是为了让「cwd 覆盖 packageRoot」这类多根语义可被单测直接驱动 ——
|
|
100
|
+
* 项目惯例是用依赖注入而不是 `mock.module`(后者会全局泄漏、污染同批其它测试)。
|
|
101
|
+
*
|
|
102
|
+
* 永不抛:目录不存在 / 读不动 / 脚本写错,都降级成「少一个工作流 + 一条 failure」。
|
|
103
|
+
*/
|
|
104
|
+
export async function discoverWorkflowsIn(roots) {
|
|
105
|
+
const workflows = [];
|
|
106
|
+
const failures = [];
|
|
107
|
+
const seen = new Set();
|
|
108
|
+
for (const root of roots) {
|
|
109
|
+
// ⚠️ 显式写 `Dirent[]`,别用 `Awaited<ReturnType<typeof readdir>>` ——
|
|
110
|
+
// readdir 是重载函数,ReturnType 只会挑中其中一个(Buffer 那条),于是这里
|
|
111
|
+
// 拿到 `Dirent<NonSharedBuffer>[]`,下面每个 `entry.name` 都变成 Buffer,
|
|
112
|
+
// 连报 6 个类型错。运行时完全正常,所以只有 `tsc --build` 才看得见。
|
|
113
|
+
let entries;
|
|
114
|
+
try {
|
|
115
|
+
entries = await readdir(root, { withFileTypes: true });
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
continue; // 目录不存在 → 静默跳过(与既有资源目录契约一致)
|
|
119
|
+
}
|
|
120
|
+
for (const entry of entries) {
|
|
121
|
+
if (!entry.isDirectory())
|
|
122
|
+
continue; // 工作流恒为目录,散落的文件一律不认
|
|
123
|
+
const name = entry.name;
|
|
124
|
+
if (seen.has(name))
|
|
125
|
+
continue; // 先扫到的胜出(cwd 覆盖 packageRoot)
|
|
126
|
+
const dir = join(root, name);
|
|
127
|
+
const loaded = await loadWorkflowDir(dir);
|
|
128
|
+
if (loaded.ok) {
|
|
129
|
+
seen.add(name);
|
|
130
|
+
workflows.push(loaded.workflow);
|
|
131
|
+
}
|
|
132
|
+
else if (loaded.reason === 'invalid-script') {
|
|
133
|
+
// 占位:别让 packageRoot 的同名工作流顶替一个写错的 cwd 版本 ——
|
|
134
|
+
// 否则现象是「我改坏了自己项目里的工作流,跑起来却是包内那个旧版本」。
|
|
135
|
+
seen.add(name);
|
|
136
|
+
failures.push({
|
|
137
|
+
name,
|
|
138
|
+
scriptPath: join(dir, SCRIPT_FILENAME),
|
|
139
|
+
errors: loaded.errors,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
// reason === 'no-script':普通目录,静默跳过(不占名、不报错)
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
workflows.sort((a, b) => a.name.localeCompare(b.name));
|
|
146
|
+
failures.sort((a, b) => a.name.localeCompare(b.name));
|
|
147
|
+
return { workflows, failures };
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* 扫描三源目录(cwd → 绿色版 exe 同级 → packageRoot),返回全部代码形态工作流
|
|
151
|
+
* 与全部加载失败。
|
|
152
|
+
*/
|
|
153
|
+
export async function discoverWorkflows(workingDir) {
|
|
154
|
+
return discoverWorkflowsIn(getResourceSearchPaths('workflows', import.meta.url, workingDir));
|
|
155
|
+
}
|
|
156
|
+
/** 按名字找一个代码形态工作流;不存在返回 null(可能是 legacy yaml,由调用方决定)。 */
|
|
157
|
+
export async function findWorkflowByName(name, workingDir) {
|
|
158
|
+
const { workflows } = await discoverWorkflows(workingDir);
|
|
159
|
+
return workflows.find((w) => w.name === name) ?? null;
|
|
160
|
+
}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ============================================================
|
|
3
|
+
* plugins/workflow-runner/src/discovery.ts —— 工作流目录发现
|
|
4
|
+
* ------------------------------------------------------------
|
|
5
|
+
* 一个工作流 = 一个目录:`workflows/<name>/workflow.mjs`。目录名即工作流名。
|
|
6
|
+
*
|
|
7
|
+
* 三源搜索沿用框架既有契约 `getResourceSearchPaths('workflows', ...)`:
|
|
8
|
+
* cwd/workflows/ → exe 同级 workflows/(绿色版)→ packageRoot/workflows/
|
|
9
|
+
* 先扫到的同名条目胜出,用户可以在自己项目里覆盖包内自带的工作流。
|
|
10
|
+
*
|
|
11
|
+
* ------------------------------------------------------------
|
|
12
|
+
* 与 legacy loader 的一处**有意不同**:坏脚本不再只 `console.warn` 后消失。
|
|
13
|
+
*
|
|
14
|
+
* legacy 的行为是「一个坏 yaml 不拖累其它工作流」——这条对,但它把坏文件
|
|
15
|
+
* 静默丢出列表,用户看到的是「我的工作流不见了」,而不是「我的工作流写错了」。
|
|
16
|
+
* 这里改成继续扫描 + **把失败原因带出去**(`DiscoveryResult.failures`),由
|
|
17
|
+
* /workflows 如实报出。静默降级是本项目反复吃过亏的失败模式(漏注册插件退化成
|
|
18
|
+
* markdown、漏拷资产目录报「未找到说明书」),不在新引擎里重演。
|
|
19
|
+
* ============================================================
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import type { Dirent } from 'node:fs';
|
|
23
|
+
import { readFile, readdir } from 'node:fs/promises';
|
|
24
|
+
import { basename, join } from 'node:path';
|
|
25
|
+
|
|
26
|
+
import { getResourceSearchPaths } from '../../../src/plugin-sdk.js';
|
|
27
|
+
import { validateScript } from './scriptGuard.mjs';
|
|
28
|
+
import type {
|
|
29
|
+
DiscoveryResult,
|
|
30
|
+
InputDef,
|
|
31
|
+
WorkflowMeta,
|
|
32
|
+
WorkflowScript,
|
|
33
|
+
} from './types.js';
|
|
34
|
+
|
|
35
|
+
/** 编排脚本的固定文件名。目录里没有它就不是工作流目录。 */
|
|
36
|
+
export const SCRIPT_FILENAME = 'workflow.mjs';
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* 加载失败的**类型化**原因。两者的处理方式完全不同:
|
|
40
|
+
* - `no-script` 这压根不是工作流目录(assets/、模板目录…)→ 静默跳过
|
|
41
|
+
* - `invalid-script` 这是个写错了的工作流 → 必须报给用户
|
|
42
|
+
*/
|
|
43
|
+
export type LoadFailureReason = 'no-script' | 'invalid-script';
|
|
44
|
+
|
|
45
|
+
export type LoadWorkflowResult =
|
|
46
|
+
| { ok: true; workflow: WorkflowScript }
|
|
47
|
+
| { ok: false; reason: LoadFailureReason; errors: string[] };
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* 把 scriptGuard 求值出的 meta(形状是 unknown 的宽松对象)收紧成 WorkflowMeta。
|
|
51
|
+
* 调用前 validateScript 已保证 description 是非空字符串、inputs/artifacts 是数组。
|
|
52
|
+
*/
|
|
53
|
+
function narrowMeta(raw: Record<string, unknown>): WorkflowMeta {
|
|
54
|
+
const meta: WorkflowMeta = {
|
|
55
|
+
apiVersion: 2,
|
|
56
|
+
description: String(raw.description),
|
|
57
|
+
};
|
|
58
|
+
if (Array.isArray(raw.dependencies))
|
|
59
|
+
meta.dependencies = raw.dependencies as string[];
|
|
60
|
+
if (Array.isArray(raw.packages)) meta.packages = raw.packages as string[];
|
|
61
|
+
if (Array.isArray(raw.inputs)) meta.inputs = raw.inputs as InputDef[];
|
|
62
|
+
if (Array.isArray(raw.artifacts)) {
|
|
63
|
+
meta.artifacts = raw.artifacts.map((a) => String(a));
|
|
64
|
+
}
|
|
65
|
+
if (typeof raw.resumeBackoff === 'number') {
|
|
66
|
+
meta.resumeBackoff = raw.resumeBackoff;
|
|
67
|
+
}
|
|
68
|
+
if (typeof raw.managedRuntime === 'string' && raw.managedRuntime.trim()) {
|
|
69
|
+
meta.managedRuntime = raw.managedRuntime.trim();
|
|
70
|
+
}
|
|
71
|
+
return meta;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* 读并校验单个工作流目录。
|
|
76
|
+
*
|
|
77
|
+
* @returns 成功返回 WorkflowScript;失败返回 errors(调用方决定怎么报)
|
|
78
|
+
*/
|
|
79
|
+
export async function loadWorkflowDir(
|
|
80
|
+
dir: string,
|
|
81
|
+
): Promise<LoadWorkflowResult> {
|
|
82
|
+
const scriptPath = join(dir, SCRIPT_FILENAME);
|
|
83
|
+
let source: string;
|
|
84
|
+
try {
|
|
85
|
+
source = await readFile(scriptPath, 'utf8');
|
|
86
|
+
} catch (e) {
|
|
87
|
+
return {
|
|
88
|
+
ok: false,
|
|
89
|
+
// ⚠️ 这里必须给**类型化**的原因,调用方据此区分「这不是工作流目录」与
|
|
90
|
+
// 「这是个写错的工作流」。曾经是让调用方去 `errors[0].includes('读取')`
|
|
91
|
+
// 匹配中文文案 —— 那意味着有人给错误信息换个措辞,`assets/`、模板目录
|
|
92
|
+
// 这些普通目录就会全部变成「坏工作流」刷进 /workflows 列表。
|
|
93
|
+
reason: 'no-script',
|
|
94
|
+
errors: [
|
|
95
|
+
`读取 ${scriptPath} 失败:${e instanceof Error ? e.message : String(e)}`,
|
|
96
|
+
],
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const name = basename(dir);
|
|
101
|
+
const verdict = validateScript(source, {
|
|
102
|
+
filename: join('workflows', name, SCRIPT_FILENAME),
|
|
103
|
+
});
|
|
104
|
+
if (!verdict.ok || !verdict.meta || verdict.bodyOffset === undefined) {
|
|
105
|
+
return { ok: false, reason: 'invalid-script', errors: verdict.errors };
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return {
|
|
109
|
+
ok: true,
|
|
110
|
+
workflow: {
|
|
111
|
+
name,
|
|
112
|
+
dir,
|
|
113
|
+
scriptPath,
|
|
114
|
+
source,
|
|
115
|
+
meta: narrowMeta(verdict.meta as Record<string, unknown>),
|
|
116
|
+
bodyOffset: verdict.bodyOffset,
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* 按给定的搜索根扫描(前面的根优先)。
|
|
123
|
+
*
|
|
124
|
+
* 独立导出是为了让「cwd 覆盖 packageRoot」这类多根语义可被单测直接驱动 ——
|
|
125
|
+
* 项目惯例是用依赖注入而不是 `mock.module`(后者会全局泄漏、污染同批其它测试)。
|
|
126
|
+
*
|
|
127
|
+
* 永不抛:目录不存在 / 读不动 / 脚本写错,都降级成「少一个工作流 + 一条 failure」。
|
|
128
|
+
*/
|
|
129
|
+
export async function discoverWorkflowsIn(
|
|
130
|
+
roots: string[],
|
|
131
|
+
): Promise<DiscoveryResult> {
|
|
132
|
+
const workflows: WorkflowScript[] = [];
|
|
133
|
+
const failures: DiscoveryResult['failures'] = [];
|
|
134
|
+
const seen = new Set<string>();
|
|
135
|
+
|
|
136
|
+
for (const root of roots) {
|
|
137
|
+
// ⚠️ 显式写 `Dirent[]`,别用 `Awaited<ReturnType<typeof readdir>>` ——
|
|
138
|
+
// readdir 是重载函数,ReturnType 只会挑中其中一个(Buffer 那条),于是这里
|
|
139
|
+
// 拿到 `Dirent<NonSharedBuffer>[]`,下面每个 `entry.name` 都变成 Buffer,
|
|
140
|
+
// 连报 6 个类型错。运行时完全正常,所以只有 `tsc --build` 才看得见。
|
|
141
|
+
let entries: Dirent[];
|
|
142
|
+
try {
|
|
143
|
+
entries = await readdir(root, { withFileTypes: true });
|
|
144
|
+
} catch {
|
|
145
|
+
continue; // 目录不存在 → 静默跳过(与既有资源目录契约一致)
|
|
146
|
+
}
|
|
147
|
+
for (const entry of entries) {
|
|
148
|
+
if (!entry.isDirectory()) continue; // 工作流恒为目录,散落的文件一律不认
|
|
149
|
+
const name = entry.name;
|
|
150
|
+
if (seen.has(name)) continue; // 先扫到的胜出(cwd 覆盖 packageRoot)
|
|
151
|
+
const dir = join(root, name);
|
|
152
|
+
const loaded = await loadWorkflowDir(dir);
|
|
153
|
+
if (loaded.ok) {
|
|
154
|
+
seen.add(name);
|
|
155
|
+
workflows.push(loaded.workflow);
|
|
156
|
+
} else if (loaded.reason === 'invalid-script') {
|
|
157
|
+
// 占位:别让 packageRoot 的同名工作流顶替一个写错的 cwd 版本 ——
|
|
158
|
+
// 否则现象是「我改坏了自己项目里的工作流,跑起来却是包内那个旧版本」。
|
|
159
|
+
seen.add(name);
|
|
160
|
+
failures.push({
|
|
161
|
+
name,
|
|
162
|
+
scriptPath: join(dir, SCRIPT_FILENAME),
|
|
163
|
+
errors: loaded.errors,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
// reason === 'no-script':普通目录,静默跳过(不占名、不报错)
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
workflows.sort((a, b) => a.name.localeCompare(b.name));
|
|
171
|
+
failures.sort((a, b) => a.name.localeCompare(b.name));
|
|
172
|
+
return { workflows, failures };
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* 扫描三源目录(cwd → 绿色版 exe 同级 → packageRoot),返回全部代码形态工作流
|
|
177
|
+
* 与全部加载失败。
|
|
178
|
+
*/
|
|
179
|
+
export async function discoverWorkflows(
|
|
180
|
+
workingDir?: string,
|
|
181
|
+
): Promise<DiscoveryResult> {
|
|
182
|
+
return discoverWorkflowsIn(
|
|
183
|
+
getResourceSearchPaths('workflows', import.meta.url, workingDir),
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/** 按名字找一个代码形态工作流;不存在返回 null(可能是 legacy yaml,由调用方决定)。 */
|
|
188
|
+
export async function findWorkflowByName(
|
|
189
|
+
name: string,
|
|
190
|
+
workingDir?: string,
|
|
191
|
+
): Promise<WorkflowScript | null> {
|
|
192
|
+
const { workflows } = await discoverWorkflows(workingDir);
|
|
193
|
+
return workflows.find((w) => w.name === name) ?? null;
|
|
194
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ============================================================
|
|
3
|
+
* plugins/workflow-runner/src/goalAnchor.ts —— 目标锚定与补充要求
|
|
4
|
+
* ------------------------------------------------------------
|
|
5
|
+
* 自 legacy `agentCommon.ts` 移植这一小块(其余部分与「怎么消费 runQuery」
|
|
6
|
+
* 绑得紧,随 API 面一起走)。
|
|
7
|
+
*
|
|
8
|
+
* 解决的是一个真实失效模式:多步长跑(尤其自动压缩发生过之后),模型会逐渐
|
|
9
|
+
* 「忘记」用户的原始目标而偏航。锚由引擎在每次 agent/llm/skill 调用前自动
|
|
10
|
+
* 前置注入,**对脚本作者透明** —— 作者不需要在每个 prompt 里手写目标。
|
|
11
|
+
*
|
|
12
|
+
* 补充要求(`ask()` 里用户的自由输入、`addGoalSupplement()` 的产出、仲裁
|
|
13
|
+
* 延续时的新指令)与原始目标**同等贯穿**,不只活在被修订的那个文件里。
|
|
14
|
+
* ============================================================
|
|
15
|
+
*/
|
|
16
|
+
import { extractGoal } from './taskIdentity.js';
|
|
17
|
+
/**
|
|
18
|
+
* 从 inputs 里构造锚定串。
|
|
19
|
+
*
|
|
20
|
+
* 取值顺序:名为 `goal` 的输入 → 第一个 required 的字符串输入 → 第一个长度 >2
|
|
21
|
+
* 的字符串输入。都没有则返回空串(= 无锚,调用方跳过注入,不硬凑)。
|
|
22
|
+
*/
|
|
23
|
+
export function buildGoalAnchor(inputs, defs) {
|
|
24
|
+
// 委托 extractGoal —— 任务身份(computeTaskId)用的是同一个函数。
|
|
25
|
+
// 两处各写一套取值规则,就会出现「按 A 算的 taskId」配「按 B 注入的目标」。
|
|
26
|
+
const goal = extractGoal(inputs, defs).trim();
|
|
27
|
+
// 取不到真实文本时 extractGoal 会回退成整体 JSON —— 那种东西不该当目标注入给
|
|
28
|
+
// 模型(它会朝着一坨 JSON 努力),此时视为无锚。
|
|
29
|
+
if (!goal || goal.startsWith('{'))
|
|
30
|
+
return '';
|
|
31
|
+
return `> 🎯 本次任务的原始目标:${goal}`;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 锚 + 补充要求的最终渲染。返回空串 = 无锚,调用方跳过注入。
|
|
35
|
+
*
|
|
36
|
+
* ⚠️ 补充要求即使在**没有**原始锚的情况下也要注入 —— 那种场景下它们就是仅有的
|
|
37
|
+
* 约束,漏掉等于用户白说。所以没有 base 时额外补一句说明它们的效力等级。
|
|
38
|
+
*/
|
|
39
|
+
export function effectiveGoalAnchor(ctx) {
|
|
40
|
+
const base = ctx.goalAnchor ?? '';
|
|
41
|
+
const supps = (ctx.goalSupplements ?? []).filter((s) => s.trim());
|
|
42
|
+
if (supps.length === 0)
|
|
43
|
+
return base;
|
|
44
|
+
const lines = supps.map((s) => `> 📌 用户补充要求:${s}`).join('\n');
|
|
45
|
+
return base
|
|
46
|
+
? `${base}\n${lines}`
|
|
47
|
+
: `${lines}\n> ⚠️ 以上补充要求与原始目标同等约束所有操作。`;
|
|
48
|
+
}
|
|
49
|
+
/** 把锚前置到一段 prompt 前面。无锚时原样返回(不留多余空行)。 */
|
|
50
|
+
export function withGoalAnchor(ctx, prompt) {
|
|
51
|
+
const anchor = effectiveGoalAnchor(ctx);
|
|
52
|
+
return anchor ? `${anchor}\n\n${prompt}` : prompt;
|
|
53
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ============================================================
|
|
3
|
+
* plugins/workflow-runner/src/goalAnchor.ts —— 目标锚定与补充要求
|
|
4
|
+
* ------------------------------------------------------------
|
|
5
|
+
* 自 legacy `agentCommon.ts` 移植这一小块(其余部分与「怎么消费 runQuery」
|
|
6
|
+
* 绑得紧,随 API 面一起走)。
|
|
7
|
+
*
|
|
8
|
+
* 解决的是一个真实失效模式:多步长跑(尤其自动压缩发生过之后),模型会逐渐
|
|
9
|
+
* 「忘记」用户的原始目标而偏航。锚由引擎在每次 agent/llm/skill 调用前自动
|
|
10
|
+
* 前置注入,**对脚本作者透明** —— 作者不需要在每个 prompt 里手写目标。
|
|
11
|
+
*
|
|
12
|
+
* 补充要求(`ask()` 里用户的自由输入、`addGoalSupplement()` 的产出、仲裁
|
|
13
|
+
* 延续时的新指令)与原始目标**同等贯穿**,不只活在被修订的那个文件里。
|
|
14
|
+
* ============================================================
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { extractGoal } from './taskIdentity.js';
|
|
18
|
+
import type { InputDef, RunContext } from './types.js';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* 从 inputs 里构造锚定串。
|
|
22
|
+
*
|
|
23
|
+
* 取值顺序:名为 `goal` 的输入 → 第一个 required 的字符串输入 → 第一个长度 >2
|
|
24
|
+
* 的字符串输入。都没有则返回空串(= 无锚,调用方跳过注入,不硬凑)。
|
|
25
|
+
*/
|
|
26
|
+
export function buildGoalAnchor(
|
|
27
|
+
inputs: Record<string, unknown>,
|
|
28
|
+
defs?: InputDef[],
|
|
29
|
+
): string {
|
|
30
|
+
// 委托 extractGoal —— 任务身份(computeTaskId)用的是同一个函数。
|
|
31
|
+
// 两处各写一套取值规则,就会出现「按 A 算的 taskId」配「按 B 注入的目标」。
|
|
32
|
+
const goal = extractGoal(inputs, defs).trim();
|
|
33
|
+
// 取不到真实文本时 extractGoal 会回退成整体 JSON —— 那种东西不该当目标注入给
|
|
34
|
+
// 模型(它会朝着一坨 JSON 努力),此时视为无锚。
|
|
35
|
+
if (!goal || goal.startsWith('{')) return '';
|
|
36
|
+
return `> 🎯 本次任务的原始目标:${goal}`;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* 锚 + 补充要求的最终渲染。返回空串 = 无锚,调用方跳过注入。
|
|
41
|
+
*
|
|
42
|
+
* ⚠️ 补充要求即使在**没有**原始锚的情况下也要注入 —— 那种场景下它们就是仅有的
|
|
43
|
+
* 约束,漏掉等于用户白说。所以没有 base 时额外补一句说明它们的效力等级。
|
|
44
|
+
*/
|
|
45
|
+
export function effectiveGoalAnchor(ctx: RunContext): string {
|
|
46
|
+
const base = ctx.goalAnchor ?? '';
|
|
47
|
+
const supps = (ctx.goalSupplements ?? []).filter((s) => s.trim());
|
|
48
|
+
if (supps.length === 0) return base;
|
|
49
|
+
const lines = supps.map((s) => `> 📌 用户补充要求:${s}`).join('\n');
|
|
50
|
+
return base
|
|
51
|
+
? `${base}\n${lines}`
|
|
52
|
+
: `${lines}\n> ⚠️ 以上补充要求与原始目标同等约束所有操作。`;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** 把锚前置到一段 prompt 前面。无锚时原样返回(不留多余空行)。 */
|
|
56
|
+
export function withGoalAnchor(ctx: RunContext, prompt: string): string {
|
|
57
|
+
const anchor = effectiveGoalAnchor(ctx);
|
|
58
|
+
return anchor ? `${anchor}\n\n${prompt}` : prompt;
|
|
59
|
+
}
|