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,141 @@
|
|
|
1
|
+
/** Trusted ESM workflow module loader. This is an execution environment, not a security sandbox. */
|
|
2
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
3
|
+
import { mkdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { createRequire } from 'node:module';
|
|
5
|
+
import { tmpdir } from 'node:os';
|
|
6
|
+
import { dirname, extname, join, relative, resolve } from 'node:path';
|
|
7
|
+
import { pathToFileURL } from 'node:url';
|
|
8
|
+
import { pathContains } from '../../../src/plugin-sdk.js';
|
|
9
|
+
import { STATIC_IMPORT, resolveRelativeModule } from './moduleResolution.js';
|
|
10
|
+
export class WorkflowScriptError extends Error {
|
|
11
|
+
workflowName;
|
|
12
|
+
scriptPath;
|
|
13
|
+
cause;
|
|
14
|
+
workflowOutcome;
|
|
15
|
+
constructor(message, workflowName, scriptPath, cause, workflowOutcome) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.workflowName = workflowName;
|
|
18
|
+
this.scriptPath = scriptPath;
|
|
19
|
+
this.cause = cause;
|
|
20
|
+
this.name = 'WorkflowScriptError';
|
|
21
|
+
this.workflowOutcome = workflowOutcome ?? readWorkflowOutcome(cause);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function readWorkflowOutcome(value) {
|
|
25
|
+
let current = value;
|
|
26
|
+
for (let depth = 0; depth < 8 && current && typeof current === 'object'; depth++) {
|
|
27
|
+
const outcome = current.workflowOutcome;
|
|
28
|
+
if (typeof outcome === 'string' && outcome.trim())
|
|
29
|
+
return outcome.trim();
|
|
30
|
+
current = current.cause;
|
|
31
|
+
}
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Bun deliberately caches file modules by physical path and ignores URL query strings.
|
|
36
|
+
* Materialize the executable graph at a content-addressed physical path so changing a
|
|
37
|
+
* workflow cannot execute a stale module. Bare packages are resolved from the original
|
|
38
|
+
* workflow location and rewritten to file URLs; relative modules remain a native ESM graph.
|
|
39
|
+
*
|
|
40
|
+
* ⚠️ 裸包名是否声明在 `meta.packages` 里,这里**不重复校验**——那是
|
|
41
|
+
* `workflowFingerprint.ts` 的职责,`workflowDependencies.ts::resolveWorkflowBundle`
|
|
42
|
+
* 保证指纹计算总是先于本函数执行,所以未声明的包在到达这里之前就已经被拒绝。
|
|
43
|
+
* 这个调用顺序一旦改变,要在这里补上同样的校验,不要假设它仍然成立。
|
|
44
|
+
*/
|
|
45
|
+
async function materializeModuleGraph(script, bundleHash) {
|
|
46
|
+
const sourceIdentity = createHash('sha256')
|
|
47
|
+
.update(resolve(script.dir))
|
|
48
|
+
.digest('hex')
|
|
49
|
+
.slice(0, 16);
|
|
50
|
+
const cacheRoot = join(tmpdir(), 'minimal-agent-workflow-esm-v2', sourceIdentity, bundleHash);
|
|
51
|
+
const entry = resolve(script.scriptPath);
|
|
52
|
+
const seen = new Set();
|
|
53
|
+
const requireFromEntry = createRequire(entry);
|
|
54
|
+
async function copyModule(path, knownSource) {
|
|
55
|
+
const absolute = resolve(path);
|
|
56
|
+
if (!pathContains(script.dir, absolute)) {
|
|
57
|
+
throw new Error(`工作流相对模块越出工作流目录:${absolute}`);
|
|
58
|
+
}
|
|
59
|
+
if (seen.has(absolute))
|
|
60
|
+
return;
|
|
61
|
+
seen.add(absolute);
|
|
62
|
+
const destination = join(cacheRoot, relative(script.dir, absolute));
|
|
63
|
+
await mkdir(dirname(destination), { recursive: true });
|
|
64
|
+
const original = knownSource ?? (await readFile(absolute, 'utf8'));
|
|
65
|
+
if (extname(absolute).toLowerCase() === '.json') {
|
|
66
|
+
const temporary = `${destination}.tmp-${process.pid}-${randomUUID()}`;
|
|
67
|
+
try {
|
|
68
|
+
await writeFile(temporary, original, 'utf8');
|
|
69
|
+
await rename(temporary, destination).catch(async (error) => {
|
|
70
|
+
const code = error.code;
|
|
71
|
+
// 内容寻址:目标一旦存在必然与本次要写的字节相同(同一份 knownSource/hash)。
|
|
72
|
+
// POSIX 覆盖式 rename 是原子操作,只会报 EEXIST;Windows 上并发 rename 到
|
|
73
|
+
// 同一目标可能因瞬时占用报 EPERM/EBUSY 而不是 EEXIST——都容忍,重新
|
|
74
|
+
// stat 一次确认目标确实已由并发的另一次调用写入,不是的话照原样抛出。
|
|
75
|
+
if (code !== 'EEXIST' && code !== 'EPERM' && code !== 'EBUSY')
|
|
76
|
+
throw error;
|
|
77
|
+
await stat(destination);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
await rm(temporary, { force: true }).catch(() => undefined);
|
|
82
|
+
}
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const dependencies = [];
|
|
86
|
+
const rewritten = original.replace(STATIC_IMPORT, (whole, prefix, specifier, suffix) => {
|
|
87
|
+
if (specifier.startsWith('node:'))
|
|
88
|
+
return whole;
|
|
89
|
+
if (specifier.startsWith('.')) {
|
|
90
|
+
dependencies.push(resolveRelativeModule(absolute, specifier).then((dependency) => copyModule(dependency)));
|
|
91
|
+
return whole;
|
|
92
|
+
}
|
|
93
|
+
const resolvedPackage = requireFromEntry.resolve(specifier);
|
|
94
|
+
return `${prefix}${pathToFileURL(resolvedPackage).href}${suffix}`;
|
|
95
|
+
});
|
|
96
|
+
await Promise.all(dependencies);
|
|
97
|
+
const temporary = `${destination}.tmp-${process.pid}-${randomUUID()}`;
|
|
98
|
+
try {
|
|
99
|
+
await writeFile(temporary, rewritten, 'utf8');
|
|
100
|
+
await rename(temporary, destination).catch(async (error) => {
|
|
101
|
+
// 同上:内容寻址下并发 rename 到同一目标是无害的,只是容错码在 Windows 上
|
|
102
|
+
// 不是 EEXIST。re-stat 确认目标真的已经落地,不是的话照原样抛出。
|
|
103
|
+
const code = error.code;
|
|
104
|
+
if (code !== 'EEXIST' && code !== 'EPERM' && code !== 'EBUSY')
|
|
105
|
+
throw error;
|
|
106
|
+
await stat(destination);
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
await rm(temporary, { force: true }).catch(() => undefined);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
await copyModule(entry, script.source);
|
|
114
|
+
return join(cacheRoot, relative(script.dir, entry));
|
|
115
|
+
}
|
|
116
|
+
export async function loadWorkflowModule(script, bundleHash) {
|
|
117
|
+
const materializedEntry = await materializeModuleGraph(script, bundleHash);
|
|
118
|
+
const url = pathToFileURL(materializedEntry);
|
|
119
|
+
let loaded;
|
|
120
|
+
try {
|
|
121
|
+
loaded = (await import(url.href));
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
throw new WorkflowScriptError(`工作流模块加载失败:${error instanceof Error ? error.message : String(error)}`, script.name, script.scriptPath, error);
|
|
125
|
+
}
|
|
126
|
+
if (typeof loaded.default !== 'function') {
|
|
127
|
+
throw new WorkflowScriptError('工作流必须 `export default async function run(wf) { ... }`', script.name, script.scriptPath);
|
|
128
|
+
}
|
|
129
|
+
return loaded;
|
|
130
|
+
}
|
|
131
|
+
export async function runScript(script, context, bundleHash) {
|
|
132
|
+
const module = await loadWorkflowModule(script, bundleHash);
|
|
133
|
+
try {
|
|
134
|
+
return await module.default(context);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
if (error instanceof Error && error.name === 'AbortError')
|
|
138
|
+
throw error;
|
|
139
|
+
throw new WorkflowScriptError(`工作流 "${script.name}" 执行失败:${error instanceof Error ? error.message : String(error)}`, script.name, script.scriptPath, error);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/** Trusted ESM workflow module loader. This is an execution environment, not a security sandbox. */
|
|
2
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
3
|
+
import { mkdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { createRequire } from 'node:module';
|
|
5
|
+
import { tmpdir } from 'node:os';
|
|
6
|
+
import { dirname, extname, join, relative, resolve } from 'node:path';
|
|
7
|
+
import { pathToFileURL } from 'node:url';
|
|
8
|
+
|
|
9
|
+
import { pathContains } from '../../../src/plugin-sdk.js';
|
|
10
|
+
import { STATIC_IMPORT, resolveRelativeModule } from './moduleResolution.js';
|
|
11
|
+
import type { WorkflowScript } from './types.js';
|
|
12
|
+
|
|
13
|
+
export class WorkflowScriptError extends Error {
|
|
14
|
+
readonly workflowOutcome?: string;
|
|
15
|
+
|
|
16
|
+
constructor(
|
|
17
|
+
message: string,
|
|
18
|
+
readonly workflowName: string,
|
|
19
|
+
readonly scriptPath: string,
|
|
20
|
+
readonly cause?: unknown,
|
|
21
|
+
workflowOutcome?: string,
|
|
22
|
+
) {
|
|
23
|
+
super(message);
|
|
24
|
+
this.name = 'WorkflowScriptError';
|
|
25
|
+
this.workflowOutcome = workflowOutcome ?? readWorkflowOutcome(cause);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function readWorkflowOutcome(value: unknown): string | undefined {
|
|
30
|
+
let current = value;
|
|
31
|
+
for (let depth = 0; depth < 8 && current && typeof current === 'object'; depth++) {
|
|
32
|
+
const outcome = (current as { workflowOutcome?: unknown }).workflowOutcome;
|
|
33
|
+
if (typeof outcome === 'string' && outcome.trim()) return outcome.trim();
|
|
34
|
+
current = (current as { cause?: unknown }).cause;
|
|
35
|
+
}
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
interface WorkflowModule {
|
|
40
|
+
default?: (context: unknown) => unknown | Promise<unknown>;
|
|
41
|
+
meta?: unknown;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Bun deliberately caches file modules by physical path and ignores URL query strings.
|
|
46
|
+
* Materialize the executable graph at a content-addressed physical path so changing a
|
|
47
|
+
* workflow cannot execute a stale module. Bare packages are resolved from the original
|
|
48
|
+
* workflow location and rewritten to file URLs; relative modules remain a native ESM graph.
|
|
49
|
+
*
|
|
50
|
+
* ⚠️ 裸包名是否声明在 `meta.packages` 里,这里**不重复校验**——那是
|
|
51
|
+
* `workflowFingerprint.ts` 的职责,`workflowDependencies.ts::resolveWorkflowBundle`
|
|
52
|
+
* 保证指纹计算总是先于本函数执行,所以未声明的包在到达这里之前就已经被拒绝。
|
|
53
|
+
* 这个调用顺序一旦改变,要在这里补上同样的校验,不要假设它仍然成立。
|
|
54
|
+
*/
|
|
55
|
+
async function materializeModuleGraph(
|
|
56
|
+
script: WorkflowScript,
|
|
57
|
+
bundleHash: string,
|
|
58
|
+
): Promise<string> {
|
|
59
|
+
const sourceIdentity = createHash('sha256')
|
|
60
|
+
.update(resolve(script.dir))
|
|
61
|
+
.digest('hex')
|
|
62
|
+
.slice(0, 16);
|
|
63
|
+
const cacheRoot = join(
|
|
64
|
+
tmpdir(),
|
|
65
|
+
'minimal-agent-workflow-esm-v2',
|
|
66
|
+
sourceIdentity,
|
|
67
|
+
bundleHash,
|
|
68
|
+
);
|
|
69
|
+
const entry = resolve(script.scriptPath);
|
|
70
|
+
const seen = new Set<string>();
|
|
71
|
+
const requireFromEntry = createRequire(entry);
|
|
72
|
+
|
|
73
|
+
async function copyModule(path: string, knownSource?: string): Promise<void> {
|
|
74
|
+
const absolute = resolve(path);
|
|
75
|
+
if (!pathContains(script.dir, absolute)) {
|
|
76
|
+
throw new Error(`工作流相对模块越出工作流目录:${absolute}`);
|
|
77
|
+
}
|
|
78
|
+
if (seen.has(absolute)) return;
|
|
79
|
+
seen.add(absolute);
|
|
80
|
+
const destination = join(cacheRoot, relative(script.dir, absolute));
|
|
81
|
+
await mkdir(dirname(destination), { recursive: true });
|
|
82
|
+
const original = knownSource ?? (await readFile(absolute, 'utf8'));
|
|
83
|
+
if (extname(absolute).toLowerCase() === '.json') {
|
|
84
|
+
const temporary = `${destination}.tmp-${process.pid}-${randomUUID()}`;
|
|
85
|
+
try {
|
|
86
|
+
await writeFile(temporary, original, 'utf8');
|
|
87
|
+
await rename(temporary, destination).catch(async (error) => {
|
|
88
|
+
const code = (error as NodeJS.ErrnoException).code;
|
|
89
|
+
// 内容寻址:目标一旦存在必然与本次要写的字节相同(同一份 knownSource/hash)。
|
|
90
|
+
// POSIX 覆盖式 rename 是原子操作,只会报 EEXIST;Windows 上并发 rename 到
|
|
91
|
+
// 同一目标可能因瞬时占用报 EPERM/EBUSY 而不是 EEXIST——都容忍,重新
|
|
92
|
+
// stat 一次确认目标确实已由并发的另一次调用写入,不是的话照原样抛出。
|
|
93
|
+
if (code !== 'EEXIST' && code !== 'EPERM' && code !== 'EBUSY') throw error;
|
|
94
|
+
await stat(destination);
|
|
95
|
+
});
|
|
96
|
+
} finally {
|
|
97
|
+
await rm(temporary, { force: true }).catch(() => undefined);
|
|
98
|
+
}
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const dependencies: Promise<void>[] = [];
|
|
102
|
+
const rewritten = original.replace(
|
|
103
|
+
STATIC_IMPORT,
|
|
104
|
+
(whole, prefix: string, specifier: string, suffix: string) => {
|
|
105
|
+
if (specifier.startsWith('node:')) return whole;
|
|
106
|
+
if (specifier.startsWith('.')) {
|
|
107
|
+
dependencies.push(
|
|
108
|
+
resolveRelativeModule(absolute, specifier).then((dependency) =>
|
|
109
|
+
copyModule(dependency),
|
|
110
|
+
),
|
|
111
|
+
);
|
|
112
|
+
return whole;
|
|
113
|
+
}
|
|
114
|
+
const resolvedPackage = requireFromEntry.resolve(specifier);
|
|
115
|
+
return `${prefix}${pathToFileURL(resolvedPackage).href}${suffix}`;
|
|
116
|
+
},
|
|
117
|
+
);
|
|
118
|
+
await Promise.all(dependencies);
|
|
119
|
+
const temporary = `${destination}.tmp-${process.pid}-${randomUUID()}`;
|
|
120
|
+
try {
|
|
121
|
+
await writeFile(temporary, rewritten, 'utf8');
|
|
122
|
+
await rename(temporary, destination).catch(async (error) => {
|
|
123
|
+
// 同上:内容寻址下并发 rename 到同一目标是无害的,只是容错码在 Windows 上
|
|
124
|
+
// 不是 EEXIST。re-stat 确认目标真的已经落地,不是的话照原样抛出。
|
|
125
|
+
const code = (error as NodeJS.ErrnoException).code;
|
|
126
|
+
if (code !== 'EEXIST' && code !== 'EPERM' && code !== 'EBUSY') throw error;
|
|
127
|
+
await stat(destination);
|
|
128
|
+
});
|
|
129
|
+
} finally {
|
|
130
|
+
await rm(temporary, { force: true }).catch(() => undefined);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
await copyModule(entry, script.source);
|
|
135
|
+
return join(cacheRoot, relative(script.dir, entry));
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export async function loadWorkflowModule(
|
|
139
|
+
script: WorkflowScript,
|
|
140
|
+
bundleHash: string,
|
|
141
|
+
): Promise<WorkflowModule> {
|
|
142
|
+
const materializedEntry = await materializeModuleGraph(script, bundleHash);
|
|
143
|
+
const url = pathToFileURL(materializedEntry);
|
|
144
|
+
let loaded: WorkflowModule;
|
|
145
|
+
try {
|
|
146
|
+
loaded = (await import(url.href)) as WorkflowModule;
|
|
147
|
+
} catch (error) {
|
|
148
|
+
throw new WorkflowScriptError(
|
|
149
|
+
`工作流模块加载失败:${error instanceof Error ? error.message : String(error)}`,
|
|
150
|
+
script.name,
|
|
151
|
+
script.scriptPath,
|
|
152
|
+
error,
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
if (typeof loaded.default !== 'function') {
|
|
156
|
+
throw new WorkflowScriptError(
|
|
157
|
+
'工作流必须 `export default async function run(wf) { ... }`',
|
|
158
|
+
script.name,
|
|
159
|
+
script.scriptPath,
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
return loaded;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export async function runScript(
|
|
166
|
+
script: WorkflowScript,
|
|
167
|
+
context: unknown,
|
|
168
|
+
bundleHash: string,
|
|
169
|
+
): Promise<unknown> {
|
|
170
|
+
const module = await loadWorkflowModule(script, bundleHash);
|
|
171
|
+
try {
|
|
172
|
+
return await module.default!(context);
|
|
173
|
+
} catch (error) {
|
|
174
|
+
if (error instanceof Error && error.name === 'AbortError') throw error;
|
|
175
|
+
throw new WorkflowScriptError(
|
|
176
|
+
`工作流 "${script.name}" 执行失败:${error instanceof Error ? error.message : String(error)}`,
|
|
177
|
+
script.name,
|
|
178
|
+
script.scriptPath,
|
|
179
|
+
error,
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* plugins/workflow-runner/src/scriptGuard.d.mts —— scriptGuard.mjs 的类型声明
|
|
3
|
+
*
|
|
4
|
+
* 实现刻意是 `.mjs`(纯 JS、零依赖),见该文件头注:它同时被 TS 引擎 import
|
|
5
|
+
* 和被 `node` 直接 spawn,只有 `.mjs` 两条路都走得通。这份 `.d.mts` 只是给
|
|
6
|
+
* TS 侧补类型,不参与运行时。
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export interface WorkflowMetaShape {
|
|
10
|
+
description?: unknown;
|
|
11
|
+
inputs?: unknown;
|
|
12
|
+
artifacts?: unknown;
|
|
13
|
+
resumeBackoff?: unknown;
|
|
14
|
+
[key: string]: unknown;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** 把字符串字面量与注释的内容抹成等长空格,保留换行与其余字节。 */
|
|
18
|
+
export function blankLiteralsAndComments(source: string): string;
|
|
19
|
+
|
|
20
|
+
export function extractMetaLiteral(
|
|
21
|
+
source: string,
|
|
22
|
+
):
|
|
23
|
+
| { ok: true; literal: string; bodyOffset: number; metaStart: number }
|
|
24
|
+
| { ok: false; error: string };
|
|
25
|
+
|
|
26
|
+
export function evaluateMetaLiteral(
|
|
27
|
+
literal: string,
|
|
28
|
+
): { ok: true; value: WorkflowMetaShape } | { ok: false; error: string };
|
|
29
|
+
|
|
30
|
+
export function validateScript(
|
|
31
|
+
source: string,
|
|
32
|
+
opts?: { filename?: string },
|
|
33
|
+
): {
|
|
34
|
+
ok: boolean;
|
|
35
|
+
errors: string[];
|
|
36
|
+
meta?: WorkflowMetaShape;
|
|
37
|
+
bodyOffset?: number;
|
|
38
|
+
};
|