minimal-agent 0.13.0 → 0.15.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 +536 -0
- package/src/advisor/advisorCoordinator.ts +693 -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/quickModelSetup.js +12 -1
- package/src/cli/quickModelSetup.tsx +15 -3
- 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/cli/wizards/providerPresets.js +18 -8
- package/src/cli/wizards/providerPresets.ts +18 -8
- 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 +328 -55
- package/src/loop.ts +382 -58
- 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 +115 -50
- package/src/tools/advisor/advisor.ts +124 -51
- 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 +125 -0
- package/src/tools/toolPromptGuides.ts +146 -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 +459 -40
- 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,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 旧项目任务板状态机(兼容层)。
|
|
3
|
+
*
|
|
4
|
+
* KakadeAI 新群协作主流程使用 CollaborationEvent,并在一次目标确认后直接运行;
|
|
5
|
+
* 本文件只负责已有 `conversation/workspace` 数据和旧插件的状态/动作兼容。
|
|
6
|
+
*
|
|
7
|
+
* ⚠️ 这张表原先内联在 `minimal-server/src/core/collaboration/projects.ts` 里
|
|
8
|
+
* (`WORK_ITEM_TRANSITIONS`),只有服务端看得到。前端要预测"按钮该不该亮"就得再抄一份,
|
|
9
|
+
* 两份必然漂移,漂移的后果是「界面能点、点了被拒」——最糟的一类交互。
|
|
10
|
+
* 所以兼容代码仍共享这一份,避免旧前后端漂移。
|
|
11
|
+
*
|
|
12
|
+
* 相对原表只加了一个状态 `proposed`(方案待审)。「待验收」沿用既有的 `review`
|
|
13
|
+
* (UI 里本来就叫"评审"),不造同义状态。
|
|
14
|
+
*
|
|
15
|
+
* 与 projects.ts 里其余守卫的分工:
|
|
16
|
+
* 这里管「状态怎么流转」和「谁有资格推动」;
|
|
17
|
+
* projects.ts 继续管数据完整性类守卫(验收条件必填、执行者不能评审自己、
|
|
18
|
+
* 进入执行要有仓库/分支/文件范围、完成前要有已接受的交接单)。两者互补,不重叠。
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* 合法流转表。**服务端与前端共用这一份。**
|
|
22
|
+
*
|
|
23
|
+
* `ready → in_progress` 是新旧迁移的默认直连。`submitPlan/approvePlan` 仅在旧任务
|
|
24
|
+
* 显式选择方案评审时使用,服务端不得再把它强制成所有 Agent 任务的第二次人工确认。
|
|
25
|
+
*/
|
|
26
|
+
export const TASK_TRANSITIONS = {
|
|
27
|
+
backlog: ['ready'],
|
|
28
|
+
ready: ['backlog', 'proposed', 'in_progress', 'blocked'],
|
|
29
|
+
proposed: ['ready', 'in_progress', 'blocked'],
|
|
30
|
+
in_progress: ['review', 'blocked'],
|
|
31
|
+
blocked: ['in_progress', 'backlog'],
|
|
32
|
+
review: ['in_progress', 'done', 'blocked'],
|
|
33
|
+
done: [],
|
|
34
|
+
};
|
|
35
|
+
const TRANSITION = {
|
|
36
|
+
assign: 'ready',
|
|
37
|
+
submitPlan: 'proposed',
|
|
38
|
+
approvePlan: 'in_progress',
|
|
39
|
+
rejectPlan: 'ready', // 打回回到已派单:同一张卡、同一个执行者重提方案
|
|
40
|
+
submitHandoff: 'review',
|
|
41
|
+
accept: 'done',
|
|
42
|
+
rework: 'in_progress',
|
|
43
|
+
block: 'blocked',
|
|
44
|
+
unblock: 'in_progress',
|
|
45
|
+
};
|
|
46
|
+
const ALLOWED_FROM = {
|
|
47
|
+
assign: ['backlog'],
|
|
48
|
+
submitPlan: ['ready'],
|
|
49
|
+
approvePlan: ['proposed'],
|
|
50
|
+
rejectPlan: ['proposed'],
|
|
51
|
+
submitHandoff: ['in_progress'],
|
|
52
|
+
accept: ['review'],
|
|
53
|
+
rework: ['review'],
|
|
54
|
+
block: ['ready', 'proposed', 'in_progress', 'review'],
|
|
55
|
+
unblock: ['blocked'],
|
|
56
|
+
};
|
|
57
|
+
const AGENT_ACTIONS = ['submitPlan', 'submitHandoff'];
|
|
58
|
+
/** 旧任务板中由人触发的动作;新主流程只保留目标确认和最终验收。 */
|
|
59
|
+
const HUMAN_ACTIONS = ['assign', 'approvePlan', 'rejectPlan', 'accept', 'rework', 'block', 'unblock'];
|
|
60
|
+
/** 打回和返工不写原因,对面无从改起。 */
|
|
61
|
+
const REASON_REQUIRED = ['rejectPlan', 'rework'];
|
|
62
|
+
export function isAgentMember(memberId) {
|
|
63
|
+
return memberId.startsWith('agent:') || memberId.startsWith('agent-session:');
|
|
64
|
+
}
|
|
65
|
+
export function nextStatus(action) {
|
|
66
|
+
return TRANSITION[action];
|
|
67
|
+
}
|
|
68
|
+
/** 纯粹的流转合法性(不看是谁)。projects.ts 用它替换原先内联的表。 */
|
|
69
|
+
export function canTransition(from, to) {
|
|
70
|
+
return from === to || TASK_TRANSITIONS[from].includes(to);
|
|
71
|
+
}
|
|
72
|
+
export function canAct(task, action, actor, input = {}) {
|
|
73
|
+
if (task.status === 'done')
|
|
74
|
+
return { allowed: false, reason: '任务已完成,不能再改动' };
|
|
75
|
+
if (!ALLOWED_FROM[action].includes(task.status)) {
|
|
76
|
+
if (action === 'approvePlan')
|
|
77
|
+
return { allowed: false, reason: '还没有待审的方案' };
|
|
78
|
+
if (action === 'accept' || action === 'rework')
|
|
79
|
+
return { allowed: false, reason: '任务还没有进入待验收' };
|
|
80
|
+
if (action === 'submitHandoff')
|
|
81
|
+
return { allowed: false, reason: '进入执行后才能交付' };
|
|
82
|
+
return { allowed: false, reason: '当前状态不允许该操作' };
|
|
83
|
+
}
|
|
84
|
+
if (AGENT_ACTIONS.includes(action)) {
|
|
85
|
+
if (actor.kind !== 'agent')
|
|
86
|
+
return { allowed: false, reason: '该动作由被指派的 agent 提交' };
|
|
87
|
+
if (actor.memberId !== task.ownerMemberId)
|
|
88
|
+
return { allowed: false, reason: '只有被指派的 agent 能提交' };
|
|
89
|
+
return { allowed: true };
|
|
90
|
+
}
|
|
91
|
+
if (HUMAN_ACTIONS.includes(action)) {
|
|
92
|
+
// agent 永远不能替人拍板,否则"人只对方案/结果负责"就是空话。
|
|
93
|
+
if (actor.kind !== 'human')
|
|
94
|
+
return { allowed: false, reason: '只有人类成员能拍板' };
|
|
95
|
+
const isVerdict = action === 'approvePlan' || action === 'rejectPlan' || action === 'accept' || action === 'rework';
|
|
96
|
+
if (isVerdict && task.reviewerIds.length > 0 && !task.reviewerIds.includes(actor.memberId)) {
|
|
97
|
+
return { allowed: false, reason: '这张卡指定了评审人,只有评审人能拍板' };
|
|
98
|
+
}
|
|
99
|
+
if (REASON_REQUIRED.includes(action) && !input.reason?.trim()) {
|
|
100
|
+
return { allowed: false, reason: '请填写原因,对方才知道要改什么' };
|
|
101
|
+
}
|
|
102
|
+
return { allowed: true };
|
|
103
|
+
}
|
|
104
|
+
return { allowed: false, reason: '未知操作' };
|
|
105
|
+
}
|
|
106
|
+
/** @deprecated 新主流程在一次目标确认后直接执行;仅保留导出避免旧插件崩溃。 */
|
|
107
|
+
export function requiresPlanApproval(_ownerMemberId, _from, _to) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
/** 给 UI:当前这个人/agent 在这张卡上能做哪些动作(决定按钮亮不亮)。 */
|
|
111
|
+
export function taskActionsFor(task, actor) {
|
|
112
|
+
const all = Object.keys(TRANSITION);
|
|
113
|
+
// 带理由的动作按"已填理由"预判:按钮要先亮出来,用户才有地方填理由。
|
|
114
|
+
return all.filter((action) => canAct(task, action, actor, { reason: '预检' }).allowed);
|
|
115
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 旧项目任务板状态机(兼容层)。
|
|
3
|
+
*
|
|
4
|
+
* KakadeAI 新群协作主流程使用 CollaborationEvent,并在一次目标确认后直接运行;
|
|
5
|
+
* 本文件只负责已有 `conversation/workspace` 数据和旧插件的状态/动作兼容。
|
|
6
|
+
*
|
|
7
|
+
* ⚠️ 这张表原先内联在 `minimal-server/src/core/collaboration/projects.ts` 里
|
|
8
|
+
* (`WORK_ITEM_TRANSITIONS`),只有服务端看得到。前端要预测"按钮该不该亮"就得再抄一份,
|
|
9
|
+
* 两份必然漂移,漂移的后果是「界面能点、点了被拒」——最糟的一类交互。
|
|
10
|
+
* 所以兼容代码仍共享这一份,避免旧前后端漂移。
|
|
11
|
+
*
|
|
12
|
+
* 相对原表只加了一个状态 `proposed`(方案待审)。「待验收」沿用既有的 `review`
|
|
13
|
+
* (UI 里本来就叫"评审"),不造同义状态。
|
|
14
|
+
*
|
|
15
|
+
* 与 projects.ts 里其余守卫的分工:
|
|
16
|
+
* 这里管「状态怎么流转」和「谁有资格推动」;
|
|
17
|
+
* projects.ts 继续管数据完整性类守卫(验收条件必填、执行者不能评审自己、
|
|
18
|
+
* 进入执行要有仓库/分支/文件范围、完成前要有已接受的交接单)。两者互补,不重叠。
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/** 任务卡状态。与 protocol.ts 的 `WorkItemStatus` 同一套值。 */
|
|
22
|
+
export type TaskStatus =
|
|
23
|
+
| 'backlog' // 待规划:还没指派
|
|
24
|
+
| 'ready' // 已派单:等被指派者提方案(执行者是人时可直接开工)
|
|
25
|
+
| 'proposed' // 方案待审:**人拍板点 #2**
|
|
26
|
+
| 'in_progress' // 执行中
|
|
27
|
+
| 'review' // 待验收:**人拍板点 #3**
|
|
28
|
+
| 'blocked' // 阻塞
|
|
29
|
+
| 'done'; // 完成(终态)
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* 合法流转表。**服务端与前端共用这一份。**
|
|
33
|
+
*
|
|
34
|
+
* `ready → in_progress` 是新旧迁移的默认直连。`submitPlan/approvePlan` 仅在旧任务
|
|
35
|
+
* 显式选择方案评审时使用,服务端不得再把它强制成所有 Agent 任务的第二次人工确认。
|
|
36
|
+
*/
|
|
37
|
+
export const TASK_TRANSITIONS: Record<TaskStatus, TaskStatus[]> = {
|
|
38
|
+
backlog: ['ready'],
|
|
39
|
+
ready: ['backlog', 'proposed', 'in_progress', 'blocked'],
|
|
40
|
+
proposed: ['ready', 'in_progress', 'blocked'],
|
|
41
|
+
in_progress: ['review', 'blocked'],
|
|
42
|
+
blocked: ['in_progress', 'backlog'],
|
|
43
|
+
review: ['in_progress', 'done', 'blocked'],
|
|
44
|
+
done: [],
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export type TaskAction =
|
|
48
|
+
| 'assign' // 人:派单
|
|
49
|
+
| 'submitPlan' // agent:提方案
|
|
50
|
+
| 'approvePlan' // 兼容旧任务:显式方案评审(新主流程不要求)
|
|
51
|
+
| 'rejectPlan' // 人:打回方案(须带理由)
|
|
52
|
+
| 'submitHandoff' // agent:交交接单 + 自检
|
|
53
|
+
| 'accept' // 人:验收通过
|
|
54
|
+
| 'rework' // 人:返工(须带理由)
|
|
55
|
+
| 'block'
|
|
56
|
+
| 'unblock';
|
|
57
|
+
|
|
58
|
+
export interface TaskActor {
|
|
59
|
+
/** 群成员 id:'user:<id>' 或 'agent-session:<id>'。 */
|
|
60
|
+
memberId: string;
|
|
61
|
+
kind: 'human' | 'agent';
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** 判定所需的任务卡最小切片(不依赖完整 WorkItem,便于服务端与 UI 共用)。 */
|
|
65
|
+
export interface TaskFlowState {
|
|
66
|
+
status: TaskStatus;
|
|
67
|
+
/** 被指派干活的成员。 */
|
|
68
|
+
ownerMemberId: string;
|
|
69
|
+
/** 指定评审人;为空表示任意人类成员都可拍板(小团队默认不设卡点)。 */
|
|
70
|
+
reviewerIds: string[];
|
|
71
|
+
createdBy: string;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export interface TaskDecision {
|
|
75
|
+
allowed: boolean;
|
|
76
|
+
reason?: string;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const TRANSITION: Record<TaskAction, TaskStatus> = {
|
|
80
|
+
assign: 'ready',
|
|
81
|
+
submitPlan: 'proposed',
|
|
82
|
+
approvePlan: 'in_progress',
|
|
83
|
+
rejectPlan: 'ready', // 打回回到已派单:同一张卡、同一个执行者重提方案
|
|
84
|
+
submitHandoff: 'review',
|
|
85
|
+
accept: 'done',
|
|
86
|
+
rework: 'in_progress',
|
|
87
|
+
block: 'blocked',
|
|
88
|
+
unblock: 'in_progress',
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
const ALLOWED_FROM: Record<TaskAction, TaskStatus[]> = {
|
|
92
|
+
assign: ['backlog'],
|
|
93
|
+
submitPlan: ['ready'],
|
|
94
|
+
approvePlan: ['proposed'],
|
|
95
|
+
rejectPlan: ['proposed'],
|
|
96
|
+
submitHandoff: ['in_progress'],
|
|
97
|
+
accept: ['review'],
|
|
98
|
+
rework: ['review'],
|
|
99
|
+
block: ['ready', 'proposed', 'in_progress', 'review'],
|
|
100
|
+
unblock: ['blocked'],
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
const AGENT_ACTIONS: TaskAction[] = ['submitPlan', 'submitHandoff'];
|
|
104
|
+
/** 旧任务板中由人触发的动作;新主流程只保留目标确认和最终验收。 */
|
|
105
|
+
const HUMAN_ACTIONS: TaskAction[] = ['assign', 'approvePlan', 'rejectPlan', 'accept', 'rework', 'block', 'unblock'];
|
|
106
|
+
/** 打回和返工不写原因,对面无从改起。 */
|
|
107
|
+
const REASON_REQUIRED: TaskAction[] = ['rejectPlan', 'rework'];
|
|
108
|
+
|
|
109
|
+
export function isAgentMember(memberId: string): boolean {
|
|
110
|
+
return memberId.startsWith('agent:') || memberId.startsWith('agent-session:');
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export function nextStatus(action: TaskAction): TaskStatus {
|
|
114
|
+
return TRANSITION[action];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** 纯粹的流转合法性(不看是谁)。projects.ts 用它替换原先内联的表。 */
|
|
118
|
+
export function canTransition(from: TaskStatus, to: TaskStatus): boolean {
|
|
119
|
+
return from === to || TASK_TRANSITIONS[from].includes(to);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export function canAct(
|
|
123
|
+
task: TaskFlowState,
|
|
124
|
+
action: TaskAction,
|
|
125
|
+
actor: TaskActor,
|
|
126
|
+
input: { reason?: string } = {},
|
|
127
|
+
): TaskDecision {
|
|
128
|
+
if (task.status === 'done') return { allowed: false, reason: '任务已完成,不能再改动' };
|
|
129
|
+
|
|
130
|
+
if (!ALLOWED_FROM[action].includes(task.status)) {
|
|
131
|
+
if (action === 'approvePlan') return { allowed: false, reason: '还没有待审的方案' };
|
|
132
|
+
if (action === 'accept' || action === 'rework') return { allowed: false, reason: '任务还没有进入待验收' };
|
|
133
|
+
if (action === 'submitHandoff') return { allowed: false, reason: '进入执行后才能交付' };
|
|
134
|
+
return { allowed: false, reason: '当前状态不允许该操作' };
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (AGENT_ACTIONS.includes(action)) {
|
|
138
|
+
if (actor.kind !== 'agent') return { allowed: false, reason: '该动作由被指派的 agent 提交' };
|
|
139
|
+
if (actor.memberId !== task.ownerMemberId) return { allowed: false, reason: '只有被指派的 agent 能提交' };
|
|
140
|
+
return { allowed: true };
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (HUMAN_ACTIONS.includes(action)) {
|
|
144
|
+
// agent 永远不能替人拍板,否则"人只对方案/结果负责"就是空话。
|
|
145
|
+
if (actor.kind !== 'human') return { allowed: false, reason: '只有人类成员能拍板' };
|
|
146
|
+
const isVerdict = action === 'approvePlan' || action === 'rejectPlan' || action === 'accept' || action === 'rework';
|
|
147
|
+
if (isVerdict && task.reviewerIds.length > 0 && !task.reviewerIds.includes(actor.memberId)) {
|
|
148
|
+
return { allowed: false, reason: '这张卡指定了评审人,只有评审人能拍板' };
|
|
149
|
+
}
|
|
150
|
+
if (REASON_REQUIRED.includes(action) && !input.reason?.trim()) {
|
|
151
|
+
return { allowed: false, reason: '请填写原因,对方才知道要改什么' };
|
|
152
|
+
}
|
|
153
|
+
return { allowed: true };
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return { allowed: false, reason: '未知操作' };
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** @deprecated 新主流程在一次目标确认后直接执行;仅保留导出避免旧插件崩溃。 */
|
|
160
|
+
export function requiresPlanApproval(_ownerMemberId: string, _from: TaskStatus, _to: TaskStatus): boolean {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/** 给 UI:当前这个人/agent 在这张卡上能做哪些动作(决定按钮亮不亮)。 */
|
|
165
|
+
export function taskActionsFor(task: TaskFlowState, actor: TaskActor): TaskAction[] {
|
|
166
|
+
const all = Object.keys(TRANSITION) as TaskAction[];
|
|
167
|
+
// 带理由的动作按"已填理由"预判:按钮要先亮出来,用户才有地方填理由。
|
|
168
|
+
return all.filter((action) => canAct(task, action, actor, { reason: '预检' }).allowed);
|
|
169
|
+
}
|
|
@@ -2,13 +2,26 @@
|
|
|
2
2
|
* 浏览器与 Node/Bun 都可安全加载的纯配置默认值。
|
|
3
3
|
* 不得在此模块引入 node:*、文件系统或运行时路径逻辑。
|
|
4
4
|
*/
|
|
5
|
+
/**
|
|
6
|
+
* 子任务默认值。
|
|
7
|
+
*
|
|
8
|
+
* **为什么 explore(200) 比 general(100) 还宽**(这不是漂移,是刻意的,但此前没写下来):
|
|
9
|
+
* explore 的工具面被 `agentTypes.ts::EXPLORE_ALLOWED_TOOLS` 硬裁成严格只读,
|
|
10
|
+
* 跑再多轮也**毁不掉任何东西**,代价只有 token;general 能写工作区,失控的代价是
|
|
11
|
+
* 真实损坏,所以反而要收紧。「安全的那个给宽、危险的那个给窄」——
|
|
12
|
+
* 这与 `resolveAgentType` 未知类型一律回落 explore 是同一条安全默认原则。
|
|
13
|
+
*
|
|
14
|
+
* ⚠️ `agentTypes.ts` 的 `EXPLORE_DEF/GENERAL_DEF.maxTurns` 从这里取值,**不要在那边
|
|
15
|
+
* 再写一份字面量**:那两个数曾经各存一份(都是 200/100),改一处漏一处就会出现
|
|
16
|
+
* 「有 subagentConfig 时 200、没有时 50」这种只在缺省路径上显形的分裂。
|
|
17
|
+
*/
|
|
5
18
|
export const DEFAULT_SUBAGENTS_CONFIG = {
|
|
6
19
|
enabled: true,
|
|
7
20
|
maxCallsPerTurn: 6,
|
|
8
21
|
maxConcurrent: 3,
|
|
9
22
|
defaultWriteIsolation: 'none',
|
|
10
23
|
timeoutMs: 1_800_000,
|
|
11
|
-
exploreMaxTurns:
|
|
24
|
+
exploreMaxTurns: 200,
|
|
12
25
|
generalMaxTurns: 100,
|
|
13
26
|
};
|
|
14
27
|
export const DEFAULT_BROWSER_CONFIG = {
|
|
@@ -23,3 +36,30 @@ export const DEFAULT_COMPUTER_USE_CONFIG = {
|
|
|
23
36
|
maxImagePixels: 1_600_000,
|
|
24
37
|
observationFrames: 1,
|
|
25
38
|
};
|
|
39
|
+
/**
|
|
40
|
+
* Advisor 默认值——5 处散落魔术数字的「唯一真值」。
|
|
41
|
+
* 任何 advisor 默认值变更只能改这里,否则就是 numericLimits.ts 注释预言的
|
|
42
|
+
*「用户改不回值」事故类型(同 DEFAULT_SUBAGENTS_CONFIG / DEFAULT_BROWSER_CONFIG 范式)。
|
|
43
|
+
*
|
|
44
|
+
* inputTokenBudget:256K 是 2026-08 的新默认值,从 128K 提到 256K 的理由:
|
|
45
|
+
* 1. note 上限放宽到 100K 字符(≈100K token)后,128K 预算几乎被 note 吃光,
|
|
46
|
+
* 历史只能塞几十 K——首句级评审失效。
|
|
47
|
+
* 2. 主模型普遍升级到 1M 上下文,顾问模型同档位;256K 仍远小于 1M,预算充裕。
|
|
48
|
+
* 3. fitAdvisorBudget 会自动按「顾问模型 contextWindow - maxTokens - 4096」二次收窄,
|
|
49
|
+
* 小窗口模型不会被撑爆。
|
|
50
|
+
*
|
|
51
|
+
* timeoutMs:120s 是 2026-08 的新默认值,从 180s 压到 120s 的理由:
|
|
52
|
+
* 180s 在快模型上等太久(用户实际配置中已主动压到 90s 撞墙过),
|
|
53
|
+
* 60s 在重思考模型上 P95 不够;120s 是 openai / Claude / DeepSeek 系列 P95 的折中。
|
|
54
|
+
* 重思考专家(DeepSeek-R1、o1/o3 类)用户可上调到 300-600s。
|
|
55
|
+
*/
|
|
56
|
+
export const DEFAULT_ADVISOR_CONFIG = {
|
|
57
|
+
// 顾问会增加额外模型调用和延迟;必须由用户显式开启。
|
|
58
|
+
enabled: false,
|
|
59
|
+
mode: 'auto',
|
|
60
|
+
modelId: null,
|
|
61
|
+
contextPolicy: 'full-relevant',
|
|
62
|
+
shareSensitive: false,
|
|
63
|
+
inputTokenBudget: 256_000,
|
|
64
|
+
timeoutMs: 120_000,
|
|
65
|
+
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type {
|
|
2
|
+
AdvisorConfig,
|
|
2
3
|
BrowserConfig,
|
|
3
4
|
ComputerUseConfig,
|
|
4
5
|
SubagentsConfig,
|
|
@@ -8,13 +9,26 @@ import type {
|
|
|
8
9
|
* 浏览器与 Node/Bun 都可安全加载的纯配置默认值。
|
|
9
10
|
* 不得在此模块引入 node:*、文件系统或运行时路径逻辑。
|
|
10
11
|
*/
|
|
12
|
+
/**
|
|
13
|
+
* 子任务默认值。
|
|
14
|
+
*
|
|
15
|
+
* **为什么 explore(200) 比 general(100) 还宽**(这不是漂移,是刻意的,但此前没写下来):
|
|
16
|
+
* explore 的工具面被 `agentTypes.ts::EXPLORE_ALLOWED_TOOLS` 硬裁成严格只读,
|
|
17
|
+
* 跑再多轮也**毁不掉任何东西**,代价只有 token;general 能写工作区,失控的代价是
|
|
18
|
+
* 真实损坏,所以反而要收紧。「安全的那个给宽、危险的那个给窄」——
|
|
19
|
+
* 这与 `resolveAgentType` 未知类型一律回落 explore 是同一条安全默认原则。
|
|
20
|
+
*
|
|
21
|
+
* ⚠️ `agentTypes.ts` 的 `EXPLORE_DEF/GENERAL_DEF.maxTurns` 从这里取值,**不要在那边
|
|
22
|
+
* 再写一份字面量**:那两个数曾经各存一份(都是 200/100),改一处漏一处就会出现
|
|
23
|
+
* 「有 subagentConfig 时 200、没有时 50」这种只在缺省路径上显形的分裂。
|
|
24
|
+
*/
|
|
11
25
|
export const DEFAULT_SUBAGENTS_CONFIG: SubagentsConfig = {
|
|
12
26
|
enabled: true,
|
|
13
27
|
maxCallsPerTurn: 6,
|
|
14
28
|
maxConcurrent: 3,
|
|
15
29
|
defaultWriteIsolation: 'none',
|
|
16
30
|
timeoutMs: 1_800_000,
|
|
17
|
-
exploreMaxTurns:
|
|
31
|
+
exploreMaxTurns: 200,
|
|
18
32
|
generalMaxTurns: 100,
|
|
19
33
|
};
|
|
20
34
|
|
|
@@ -31,3 +45,31 @@ export const DEFAULT_COMPUTER_USE_CONFIG: ComputerUseConfig = {
|
|
|
31
45
|
maxImagePixels: 1_600_000,
|
|
32
46
|
observationFrames: 1,
|
|
33
47
|
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Advisor 默认值——5 处散落魔术数字的「唯一真值」。
|
|
51
|
+
* 任何 advisor 默认值变更只能改这里,否则就是 numericLimits.ts 注释预言的
|
|
52
|
+
*「用户改不回值」事故类型(同 DEFAULT_SUBAGENTS_CONFIG / DEFAULT_BROWSER_CONFIG 范式)。
|
|
53
|
+
*
|
|
54
|
+
* inputTokenBudget:256K 是 2026-08 的新默认值,从 128K 提到 256K 的理由:
|
|
55
|
+
* 1. note 上限放宽到 100K 字符(≈100K token)后,128K 预算几乎被 note 吃光,
|
|
56
|
+
* 历史只能塞几十 K——首句级评审失效。
|
|
57
|
+
* 2. 主模型普遍升级到 1M 上下文,顾问模型同档位;256K 仍远小于 1M,预算充裕。
|
|
58
|
+
* 3. fitAdvisorBudget 会自动按「顾问模型 contextWindow - maxTokens - 4096」二次收窄,
|
|
59
|
+
* 小窗口模型不会被撑爆。
|
|
60
|
+
*
|
|
61
|
+
* timeoutMs:120s 是 2026-08 的新默认值,从 180s 压到 120s 的理由:
|
|
62
|
+
* 180s 在快模型上等太久(用户实际配置中已主动压到 90s 撞墙过),
|
|
63
|
+
* 60s 在重思考模型上 P95 不够;120s 是 openai / Claude / DeepSeek 系列 P95 的折中。
|
|
64
|
+
* 重思考专家(DeepSeek-R1、o1/o3 类)用户可上调到 300-600s。
|
|
65
|
+
*/
|
|
66
|
+
export const DEFAULT_ADVISOR_CONFIG: AdvisorConfig = {
|
|
67
|
+
// 顾问会增加额外模型调用和延迟;必须由用户显式开启。
|
|
68
|
+
enabled: false,
|
|
69
|
+
mode: 'auto',
|
|
70
|
+
modelId: null,
|
|
71
|
+
contextPolicy: 'full-relevant',
|
|
72
|
+
shareSensitive: false,
|
|
73
|
+
inputTokenBudget: 256_000,
|
|
74
|
+
timeoutMs: 120_000,
|
|
75
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { LocalProvider } from '../types.js';
|
|
2
2
|
import type { ModelConfig } from './configFile.js';
|
|
3
3
|
import { type ConfigService, configService } from './configService.js';
|
|
4
4
|
|
|
@@ -27,7 +27,7 @@ function providerFromModel(
|
|
|
27
27
|
| 'supportsVision'
|
|
28
28
|
| 'promptCache'
|
|
29
29
|
>,
|
|
30
|
-
):
|
|
30
|
+
): LocalProvider {
|
|
31
31
|
return {
|
|
32
32
|
name: model.displayName ?? model.model,
|
|
33
33
|
apiFormat: model.apiFormat,
|
package/src/config/configFile.js
CHANGED
|
@@ -2,11 +2,11 @@ import { randomUUID } from 'node:crypto';
|
|
|
2
2
|
import { chmod, copyFile, mkdir, readFile, rename, rm, stat, unlink, writeFile } from 'node:fs/promises';
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
4
|
import { dirname, join } from 'node:path';
|
|
5
|
-
import { execSiblingDir } from '../utils/greenRoot.js';
|
|
6
5
|
import { normalizePromptCacheMode } from '../llm/promptCache.js';
|
|
6
|
+
import { execSiblingDir } from '../utils/greenRoot.js';
|
|
7
|
+
import { DEFAULT_ADVISOR_CONFIG, DEFAULT_BROWSER_CONFIG, DEFAULT_COMPUTER_USE_CONFIG, DEFAULT_SUBAGENTS_CONFIG, } from './configDefaults.js';
|
|
7
8
|
import { CONFIG_LIMITS, normalizeLimited } from './numericLimits.js';
|
|
8
|
-
|
|
9
|
-
export { DEFAULT_BROWSER_CONFIG, DEFAULT_COMPUTER_USE_CONFIG, DEFAULT_SUBAGENTS_CONFIG, } from './configDefaults.js';
|
|
9
|
+
export { DEFAULT_ADVISOR_CONFIG, DEFAULT_BROWSER_CONFIG, DEFAULT_COMPUTER_USE_CONFIG, DEFAULT_SUBAGENTS_CONFIG, } from './configDefaults.js';
|
|
10
10
|
const DEFAULT_CONTEXT_WINDOW = 128_000;
|
|
11
11
|
const LOCK_STALE_MS = 120_000;
|
|
12
12
|
const LOCK_WAIT_MS = 15_000;
|
|
@@ -72,6 +72,9 @@ function parseModel(value) {
|
|
|
72
72
|
contextWindow: positiveNumber(raw.contextWindow) ?? DEFAULT_CONTEXT_WINDOW,
|
|
73
73
|
...(positiveNumber(raw.maxTokens) !== undefined ? { maxTokens: positiveNumber(raw.maxTokens) } : {}),
|
|
74
74
|
supportsVision: raw.supportsVision !== false,
|
|
75
|
+
...(typeof raw.supportsJsonSchema === 'boolean'
|
|
76
|
+
? { supportsJsonSchema: raw.supportsJsonSchema }
|
|
77
|
+
: {}),
|
|
75
78
|
promptCache: {
|
|
76
79
|
mode: normalizePromptCacheMode(raw.promptCache?.mode
|
|
77
80
|
?? defaultPromptCacheMode(baseURL)),
|
|
@@ -81,6 +84,19 @@ function parseModel(value) {
|
|
|
81
84
|
updatedAt: positiveNumber(raw.updatedAt) ?? now,
|
|
82
85
|
};
|
|
83
86
|
}
|
|
87
|
+
function parseWorkflowModels(value) {
|
|
88
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
89
|
+
return undefined;
|
|
90
|
+
const roles = {};
|
|
91
|
+
for (const [role, candidate] of Object.entries(value)) {
|
|
92
|
+
if (!/^[a-z][a-z0-9_-]{0,63}$/i.test(role))
|
|
93
|
+
continue;
|
|
94
|
+
const modelId = nonEmpty(candidate);
|
|
95
|
+
if (modelId)
|
|
96
|
+
roles[role] = modelId;
|
|
97
|
+
}
|
|
98
|
+
return Object.keys(roles).length > 0 ? roles : undefined;
|
|
99
|
+
}
|
|
84
100
|
function parseModels(value) {
|
|
85
101
|
if (!Array.isArray(value))
|
|
86
102
|
return [];
|
|
@@ -130,13 +146,14 @@ function parseAdvisor(value) {
|
|
|
130
146
|
return undefined;
|
|
131
147
|
const raw = value;
|
|
132
148
|
return {
|
|
133
|
-
enabled:
|
|
149
|
+
// 默认关闭;旧配置显式 enabled:true 仍保持用户选择。
|
|
150
|
+
enabled: raw.enabled === true,
|
|
134
151
|
mode: raw.mode === 'manual' ? 'manual' : 'auto',
|
|
135
152
|
modelId: nonEmpty(raw.modelId) ?? null,
|
|
136
153
|
contextPolicy: 'full-relevant',
|
|
137
154
|
shareSensitive: raw.shareSensitive === true,
|
|
138
|
-
inputTokenBudget: normalizeLimited(raw.inputTokenBudget, CONFIG_LIMITS.advisorInputTokenBudget,
|
|
139
|
-
timeoutMs: normalizeLimited(raw.timeoutMs, CONFIG_LIMITS.advisorTimeoutMs,
|
|
155
|
+
inputTokenBudget: normalizeLimited(raw.inputTokenBudget, CONFIG_LIMITS.advisorInputTokenBudget, DEFAULT_ADVISOR_CONFIG.inputTokenBudget),
|
|
156
|
+
timeoutMs: normalizeLimited(raw.timeoutMs, CONFIG_LIMITS.advisorTimeoutMs, DEFAULT_ADVISOR_CONFIG.timeoutMs),
|
|
140
157
|
};
|
|
141
158
|
}
|
|
142
159
|
function parseSubagents(value) {
|
|
@@ -147,7 +164,7 @@ function parseSubagents(value) {
|
|
|
147
164
|
maxConcurrent: normalizeLimited(raw.maxConcurrent, CONFIG_LIMITS.subagentMaxConcurrent, 3),
|
|
148
165
|
defaultWriteIsolation: raw.defaultWriteIsolation === 'worktree' ? 'worktree' : 'none',
|
|
149
166
|
timeoutMs: normalizeLimited(raw.timeoutMs, CONFIG_LIMITS.subagentTimeoutMs, 1_800_000),
|
|
150
|
-
exploreMaxTurns: normalizeLimited(raw.exploreMaxTurns, CONFIG_LIMITS.subagentExploreMaxTurns,
|
|
167
|
+
exploreMaxTurns: normalizeLimited(raw.exploreMaxTurns, CONFIG_LIMITS.subagentExploreMaxTurns, 200),
|
|
151
168
|
generalMaxTurns: normalizeLimited(raw.generalMaxTurns, CONFIG_LIMITS.subagentGeneralMaxTurns, 100),
|
|
152
169
|
};
|
|
153
170
|
}
|
|
@@ -177,13 +194,16 @@ function parseCurrent(data) {
|
|
|
177
194
|
if (data.version !== 4)
|
|
178
195
|
return null;
|
|
179
196
|
const advisor = parseAdvisor(data.advisor);
|
|
197
|
+
const workflowModels = parseWorkflowModels(data.workflowModels);
|
|
180
198
|
const compactRatio = parseCompactRatio(data.compactRatio);
|
|
181
199
|
return {
|
|
182
200
|
version: 4,
|
|
183
201
|
models: parseModels(data.models),
|
|
184
202
|
baseModelId: nonEmpty(data.baseModelId) ?? null,
|
|
203
|
+
teamServerUrl: nonEmpty(data.teamServerUrl) ?? null,
|
|
185
204
|
...(compactRatio !== undefined ? { compactRatio } : {}),
|
|
186
205
|
...(advisor ? { advisor } : {}),
|
|
206
|
+
...(workflowModels ? { workflowModels } : {}),
|
|
187
207
|
subagents: parseSubagents(data.subagents),
|
|
188
208
|
browser: parseBrowser(data.browser),
|
|
189
209
|
computerUse: parseComputerUse(data.computerUse),
|
|
@@ -227,8 +247,8 @@ function parseLegacyAdvisorConfig(value) {
|
|
|
227
247
|
provider,
|
|
228
248
|
supportsVision: raw.supportsVision === true,
|
|
229
249
|
shareSensitive: raw.shareSensitive === true,
|
|
230
|
-
inputTokenBudget: normalizeLimited(raw.inputTokenBudget, CONFIG_LIMITS.advisorInputTokenBudget,
|
|
231
|
-
timeoutMs: normalizeLimited(raw.timeoutMs, CONFIG_LIMITS.advisorTimeoutMs,
|
|
250
|
+
inputTokenBudget: normalizeLimited(raw.inputTokenBudget, CONFIG_LIMITS.advisorInputTokenBudget, DEFAULT_ADVISOR_CONFIG.inputTokenBudget),
|
|
251
|
+
timeoutMs: normalizeLimited(raw.timeoutMs, CONFIG_LIMITS.advisorTimeoutMs, DEFAULT_ADVISOR_CONFIG.timeoutMs),
|
|
232
252
|
};
|
|
233
253
|
}
|
|
234
254
|
/**
|
|
@@ -294,6 +314,7 @@ function buildV4FromLegacy(legacyProvider, legacyAdvisor, subagents, tools, save
|
|
|
294
314
|
version: 4,
|
|
295
315
|
models,
|
|
296
316
|
baseModelId: baseModel.id,
|
|
317
|
+
teamServerUrl: null,
|
|
297
318
|
...(legacyProvider.compactRatio !== undefined ? { compactRatio: legacyProvider.compactRatio } : {}),
|
|
298
319
|
...(advisor ? { advisor } : {}),
|
|
299
320
|
subagents,
|
|
@@ -449,8 +470,10 @@ export async function saveMinimalAgentConfig(config) {
|
|
|
449
470
|
version: 4,
|
|
450
471
|
models: config.models,
|
|
451
472
|
baseModelId: config.baseModelId,
|
|
473
|
+
teamServerUrl: config.teamServerUrl ?? null,
|
|
452
474
|
...(config.compactRatio !== undefined ? { compactRatio: config.compactRatio } : {}),
|
|
453
475
|
advisor: config.advisor,
|
|
476
|
+
workflowModels: config.workflowModels,
|
|
454
477
|
subagents: config.subagents ?? DEFAULT_SUBAGENTS_CONFIG,
|
|
455
478
|
browser: config.browser ?? DEFAULT_BROWSER_CONFIG,
|
|
456
479
|
computerUse: config.computerUse ?? DEFAULT_COMPUTER_USE_CONFIG,
|
|
@@ -472,8 +495,16 @@ export async function updateMinimalAgentConfig(mutate) {
|
|
|
472
495
|
version: 4,
|
|
473
496
|
models: value.models,
|
|
474
497
|
baseModelId: value.baseModelId,
|
|
498
|
+
// 沿用现有值而不是重置为 null——大多数配置写入根本不碰这个字段(如加/删模型、
|
|
499
|
+
// 改 advisor),不该每次都把用户配置的默认服务器地址悄悄抹掉。同一条纪律见
|
|
500
|
+
// subagents/browser/computerUse。
|
|
501
|
+
// ⚠️ 必须用 `!== undefined` 而不是 `??`:清空地址走的是显式 `teamServerUrl: null`,
|
|
502
|
+
// `??` 会把这个合法的 null 也当成"没提供"处理,退回旧值——清空操作因此悄悄失效。
|
|
503
|
+
// 这正是仓库自己反复强调的 `undefined ≠ 0`(这里是 `undefined ≠ null`)纪律。
|
|
504
|
+
teamServerUrl: value.teamServerUrl !== undefined ? value.teamServerUrl : (current?.teamServerUrl ?? null),
|
|
475
505
|
...(value.compactRatio !== undefined ? { compactRatio: value.compactRatio } : {}),
|
|
476
506
|
advisor: value.advisor,
|
|
507
|
+
workflowModels: value.workflowModels ?? current?.workflowModels,
|
|
477
508
|
subagents: value.subagents ?? current?.subagents ?? DEFAULT_SUBAGENTS_CONFIG,
|
|
478
509
|
browser: value.browser ?? current?.browser ?? DEFAULT_BROWSER_CONFIG,
|
|
479
510
|
computerUse: value.computerUse ?? current?.computerUse ?? DEFAULT_COMPUTER_USE_CONFIG,
|