minimal-agent 0.12.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 +62 -5
- 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 +204 -185
- package/plugins/workflow-runner/src/index.ts +249 -224
- 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 +404 -467
- package/plugins/workflow-runner/src/runner.ts +491 -535
- 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 +172 -152
- package/plugins/workflow-runner/src/taskIdentity.ts +233 -200
- 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 -105
- package/plugins/workflow-runner/src/types.ts +155 -520
- 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 +542 -469
- package/plugins/workflow-runner/src/workflowState.ts +639 -589
- 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/skill-creator/scripts/run_eval.py +3 -2
- 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 +44 -6
- package/src/cli/print.ts +73 -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 +443 -74
- package/src/config/configService.ts +723 -142
- 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 +56 -20
- package/src/infra/verification.ts +87 -20
- 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 +152 -9
- package/src/plugins/pluginRunner.ts +186 -8
- package/src/plugins/slashFallback.js +113 -0
- package/src/plugins/slashFallback.ts +137 -0
- package/src/prompts/policyRegistry.js +15 -8
- package/src/prompts/policyRegistry.ts +18 -8
- 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 +148 -37
- package/src/tools/advisor/advisor.ts +161 -38
- 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 +70 -18
- package/src/tools/bash/bash.ts +75 -20
- 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/powershell/powershell.js +18 -1
- package/src/tools/powershell/powershell.ts +18 -2
- package/src/tools/presentresult/presentresult.js +6 -15
- package/src/tools/presentresult/presentresult.ts +6 -15
- package/src/tools/read/read.js +69 -11
- package/src/tools/read/read.ts +70 -11
- package/src/tools/shared/fileUtils.js +1 -2
- package/src/tools/shared/fileUtils.ts +1 -2
- package/src/tools/shared/permanentDeleteGuard.js +34 -3
- package/src/tools/shared/permanentDeleteGuard.ts +43 -6
- 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 -30
- package/src/tools/webbrowser/browserControl.ts +210 -50
- 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 +683 -144
- package/src/tools/webbrowser/webbrowser.ts +979 -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 +450 -42
- 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/DESIGN.md +449 -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 -618
- package/plugins/workflow-runner/src/expressions.ts +0 -622
- 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 -119
- package/plugins/workflow-runner/src/recovery.ts +0 -149
- 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 -41
- package/plugins/workflow-runner/src/stepExecutors/assert.ts +0 -50
- 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 -208
- package/plugins/workflow-runner/src/stepExecutors/tool.ts +0 -256
- package/plugins/workflow-runner/src/stepExecutors/verify.js +0 -58
- package/plugins/workflow-runner/src/stepExecutors/verify.ts +0 -68
- 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 -147
- 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/engineRobustness.test.ts +0 -226
- package/plugins/workflow-runner/test/expressions.test.ts +0 -397
- 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 -87
- 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 -220
- package/plugins/workflow-runner/test/recovery.test.ts +0 -265
- package/plugins/workflow-runner/test/runner.test.ts +0 -911
- package/plugins/workflow-runner/test/runnerPreflight.test.ts +0 -379
- package/plugins/workflow-runner/test/skillTurnDone.test.ts +0 -71
- package/plugins/workflow-runner/test/stateLifecycle.test.ts +0 -150
- package/plugins/workflow-runner/test/stepPipeline.test.ts +0 -114
- package/plugins/workflow-runner/test/taskArbitration.test.ts +0 -338
- package/plugins/workflow-runner/test/taskLifecycle.test.ts +0 -270
- 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 -199
- 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/src/cli/print.js
CHANGED
|
@@ -27,10 +27,12 @@ import { updateSessionMetadata } from '../context/sessionRegistry.js';
|
|
|
27
27
|
import { workspaceIndexService } from '../context/workspaceIndex.js';
|
|
28
28
|
import { normalizeImageDetail } from '../multimodal.js';
|
|
29
29
|
import { runWithPlugins } from '../plugins/pluginRunner.js';
|
|
30
|
-
import {
|
|
30
|
+
import { buildTransientPromptBundle } from '../prompts/system.js';
|
|
31
|
+
import { refreshStableSystemPrompt } from '../prompts/stableSystemPrompt.js';
|
|
31
32
|
import { getOrCreateSessionState, sessionStateKey } from '../session/sessionState.js';
|
|
32
33
|
import { hydrateSessionWorktree } from '../tools/worktree/sessionWorktree.js';
|
|
33
34
|
import { ALL_TOOLS } from '../tools/index.js';
|
|
35
|
+
import { classifyComputerAutomationIntent } from '../tools/computeruse/computerIntent.js';
|
|
34
36
|
import { createPromptCacheContext } from '../llm/promptCache.js';
|
|
35
37
|
import { createAgentRuntimeContext, filterToolsForRuntime, memoryContextFromRuntime, } from '../runtime/agentRuntimeContext.js';
|
|
36
38
|
import { createCliComputerRun } from './computerUse.js';
|
|
@@ -108,8 +110,16 @@ export function extractImageOptions(args) {
|
|
|
108
110
|
* stop_reason = end_turn | max_turns | stalled | error | interrupted | config_error
|
|
109
111
|
* num_turns = assistant_message 事件计数
|
|
110
112
|
* error = 失败文案(成功时 null)
|
|
113
|
+
* warnings = 本轮所有非致命警告(与 stderr 同源;宿主要结构化的那一份)
|
|
111
114
|
* session_file(可选)= 当前对话落盘路径;拿得到才填,拿不到省略该键
|
|
112
115
|
*
|
|
116
|
+
* completionStatus = 本层从 stop_reason + deliverables 重算:跑完了没、产物验没验
|
|
117
|
+
* delivery_status(可选)= 内核 turn_done 的交付判定,**回答的是另一个问题**:
|
|
118
|
+
* completed / delivery_incomplete / delivery_unverified / claims_unverified。
|
|
119
|
+
* 两者并列而非替代 —— `ok:true` 配 `delivery_status:'claims_unverified'` 是
|
|
120
|
+
* 完全合法的一行:Agent 确实正常收尾了,但它宣称的「测试已通过」没有证据支撑。
|
|
121
|
+
* 判断「任务是否真做成」的宿主应当读它,而不是只看 ok。
|
|
122
|
+
*
|
|
113
123
|
* 导出供单测断言。
|
|
114
124
|
*/
|
|
115
125
|
export function emitJsonResult(result, sessionFile) {
|
|
@@ -136,6 +146,11 @@ export function emitJsonResult(result, sessionFile) {
|
|
|
136
146
|
num_turns: result.numTurns,
|
|
137
147
|
error: result.error,
|
|
138
148
|
completionStatus,
|
|
149
|
+
...(result.deliveryStatus ? { delivery_status: result.deliveryStatus } : {}),
|
|
150
|
+
// ⚠️ 读了就必须输出。本仓库在 `turn_done.completionStatus` 上正犯过反面错误:
|
|
151
|
+
// 事件被读进 result 却没进 JSON,于是模型谎报成功时宿主拿到的 JSON
|
|
152
|
+
// 与一切正常逐字节相同。goal_status 同理,不能只留在进程里。
|
|
153
|
+
...(result.goalStatus ? { goal_status: result.goalStatus } : {}),
|
|
139
154
|
deliverables,
|
|
140
155
|
verification: allVerified ? 'passed' : deliverables.length > 0 ? 'not_run' : 'none',
|
|
141
156
|
warnings,
|
|
@@ -265,13 +280,10 @@ export async function runPrintMode(provider, args, initialHistory, options) {
|
|
|
265
280
|
memoryAccess: options.memoryAccess ?? 'read-only',
|
|
266
281
|
interactiveAsk: false,
|
|
267
282
|
computer: computerRun,
|
|
283
|
+
computerIntent: classifyComputerAutomationIntent(prompt, sessionState.computerAutomation),
|
|
268
284
|
});
|
|
269
285
|
const turnTools = filterToolsForRuntime(ALL_TOOLS, runtimeContext);
|
|
270
|
-
|
|
271
|
-
if (history[0]?.role === 'system')
|
|
272
|
-
history[0] = { ...history[0], content: stablePrompt };
|
|
273
|
-
else
|
|
274
|
-
history.unshift({ role: 'system', content: stablePrompt });
|
|
286
|
+
await refreshStableSystemPrompt(history, cwd, turnTools);
|
|
275
287
|
const transientBundle = await buildTransientPromptBundle({
|
|
276
288
|
cwd,
|
|
277
289
|
tools: turnTools,
|
|
@@ -353,6 +365,10 @@ export function handleEvent(event, result, verbose, outputFormat = 'text') {
|
|
|
353
365
|
// 一轮 assistant 消息完整组装 → 回合计数 +1(json 契约的 num_turns)
|
|
354
366
|
result.numTurns++;
|
|
355
367
|
return {};
|
|
368
|
+
case 'assistant_draft_discarded':
|
|
369
|
+
if (event.textLength > 0)
|
|
370
|
+
result.buffer = result.buffer.slice(0, Math.max(0, result.buffer.length - event.textLength));
|
|
371
|
+
return {};
|
|
356
372
|
case 'tool_start':
|
|
357
373
|
if (verbose) {
|
|
358
374
|
process.stderr.write(`\n🔧 工具: ${event.toolName}(${event.argsPreview})\n`);
|
|
@@ -399,11 +415,23 @@ export function handleEvent(event, result, verbose, outputFormat = 'text') {
|
|
|
399
415
|
// 通用非致命警告(如 workflow 多余参数、pause 被自动跳过等)始终走 stderr,
|
|
400
416
|
// 不受 verbose 控制 —— 这是用户必须看到的信号,避免静默丢弃语义被忽略。
|
|
401
417
|
process.stderr.write(`${event.message}\n`);
|
|
418
|
+
// 同时收进结局契约:stderr 是给人看的,spawn 它的宿主要的是结构化的一条。
|
|
419
|
+
// (此前 PrintResult.warnings 声明了、读了、也输出了,就是没有任何地方写它 ——
|
|
420
|
+
// json 那行的 warnings 恒为空数组。)
|
|
421
|
+
(result.warnings ??= []).push(event.message);
|
|
402
422
|
return {};
|
|
403
423
|
case 'turn_done':
|
|
404
424
|
// text 模式:非 verbose 时这里一次性把累积答案打到 stdout(旧行为,逐字节不变)。
|
|
405
425
|
// json 模式:只记 stopReason='end_turn',stdout 保持静默。
|
|
406
426
|
result.stopReason = 'end_turn';
|
|
427
|
+
// 内核的交付判定必须过进程边界:模型谎称「已验证」时,若不记这一笔,
|
|
428
|
+
// 宿主收到的 JSON 与一切正常逐字节相同,唯一线索只剩 stderr 上一行中文。
|
|
429
|
+
if (event.completionStatus)
|
|
430
|
+
result.deliveryStatus = event.completionStatus;
|
|
431
|
+
// 托管运行时的生命周期状态(goal 等)。同上:读了就必须输出,
|
|
432
|
+
// 否则「Agent 自检通过但还没人验收」在宿主眼里与「办完了」逐字节相同。
|
|
433
|
+
if (event.managedStatus)
|
|
434
|
+
result.goalStatus = event.managedStatus;
|
|
407
435
|
if (!isJson && !verbose)
|
|
408
436
|
console.log(result.buffer);
|
|
409
437
|
return {};
|
|
@@ -435,6 +463,16 @@ export function handleEvent(event, result, verbose, outputFormat = 'text') {
|
|
|
435
463
|
if (isJson)
|
|
436
464
|
result.stopReason = 'interrupted';
|
|
437
465
|
return {};
|
|
466
|
+
case 'workflow_progress': {
|
|
467
|
+
if (!isJson) {
|
|
468
|
+
const count = event.current !== undefined && event.total !== undefined
|
|
469
|
+
? ` ${event.current}/${event.total}`
|
|
470
|
+
: '';
|
|
471
|
+
const indent = ' '.repeat(event.depth ?? 0);
|
|
472
|
+
console.error(`${indent}[${event.workflow}]${count}${event.message ? ` ${event.message}` : ''}`);
|
|
473
|
+
}
|
|
474
|
+
return {};
|
|
475
|
+
}
|
|
438
476
|
// 已知但 -p 模式无需呈现的框架事件:显式忽略,好让 default 只剩"真正未知"的插件私有事件。
|
|
439
477
|
case 'user_message_committed':
|
|
440
478
|
case 'tool_messages_committed':
|
package/src/cli/print.ts
CHANGED
|
@@ -29,10 +29,12 @@ import { workspaceIndexService } from '../context/workspaceIndex.js';
|
|
|
29
29
|
import { normalizeImageDetail } from '../multimodal.js';
|
|
30
30
|
import type { DeliverableManifest, FileActivityMetadata, HarnessDiagnostics, ImageInputSpec, LoopEvent, Message, Provider } from '../types.js';
|
|
31
31
|
import { runWithPlugins } from '../plugins/pluginRunner.js';
|
|
32
|
-
import {
|
|
32
|
+
import { buildTransientPromptBundle } from '../prompts/system.js';
|
|
33
|
+
import { refreshStableSystemPrompt } from '../prompts/stableSystemPrompt.js';
|
|
33
34
|
import { getOrCreateSessionState, sessionStateKey } from '../session/sessionState.js';
|
|
34
35
|
import { hydrateSessionWorktree } from '../tools/worktree/sessionWorktree.js';
|
|
35
36
|
import { ALL_TOOLS } from '../tools/index.js';
|
|
37
|
+
import { classifyComputerAutomationIntent } from '../tools/computeruse/computerIntent.js';
|
|
36
38
|
import { createPromptCacheContext } from '../llm/promptCache.js';
|
|
37
39
|
import {
|
|
38
40
|
createAgentRuntimeContext,
|
|
@@ -98,6 +100,26 @@ export interface PrintResult {
|
|
|
98
100
|
deliverables?: DeliverableManifest['files'];
|
|
99
101
|
warnings?: string[];
|
|
100
102
|
harnessDiagnostics?: HarnessDiagnostics;
|
|
103
|
+
/**
|
|
104
|
+
* 内核 `turn_done` 给出的交付判定(loop.ts 的四态词表)。
|
|
105
|
+
*
|
|
106
|
+
* 与下面 json 里那个从 stopReason+deliverables 重算的 `completionStatus` **不是**
|
|
107
|
+
* 一回事:那个只回答「跑完了没、产物验没验」,这个回答「模型宣称的事到底做没做」。
|
|
108
|
+
* 尤其 `claims_unverified` —— 模型说「测试已全部通过」但本轮证据台账里没有一条
|
|
109
|
+
* 成功的验证记录 —— 是重不重要全看它能不能过进程边界。
|
|
110
|
+
*/
|
|
111
|
+
deliveryStatus?: string;
|
|
112
|
+
/**
|
|
113
|
+
* Goal 生命周期状态(跑的是 `/workflow goal` 这类托管运行时才有)。
|
|
114
|
+
*
|
|
115
|
+
* ⚠️ 它与 `completionStatus` / `delivery_status` 都不是一回事,三者并列:
|
|
116
|
+
* · completionStatus = 本层重算:跑完了没、产物验没验
|
|
117
|
+
* · delivery_status = 内核 turn_done:模型宣称的事做没做
|
|
118
|
+
* · goal_status = **生命周期事实源**:这件事有没有被人验收
|
|
119
|
+
* `ok:true` + `goal_status:'ready_for_acceptance'` 是正常且重要的组合 ——
|
|
120
|
+
* 机器自检通过,但还没有人点头。宿主把它当成「办完了」就会错。
|
|
121
|
+
*/
|
|
122
|
+
goalStatus?: string;
|
|
101
123
|
}
|
|
102
124
|
|
|
103
125
|
/** handleEvent 返回的结构 */
|
|
@@ -191,8 +213,16 @@ export function extractImageOptions(args: string[]): {
|
|
|
191
213
|
* stop_reason = end_turn | max_turns | stalled | error | interrupted | config_error
|
|
192
214
|
* num_turns = assistant_message 事件计数
|
|
193
215
|
* error = 失败文案(成功时 null)
|
|
216
|
+
* warnings = 本轮所有非致命警告(与 stderr 同源;宿主要结构化的那一份)
|
|
194
217
|
* session_file(可选)= 当前对话落盘路径;拿得到才填,拿不到省略该键
|
|
195
218
|
*
|
|
219
|
+
* completionStatus = 本层从 stop_reason + deliverables 重算:跑完了没、产物验没验
|
|
220
|
+
* delivery_status(可选)= 内核 turn_done 的交付判定,**回答的是另一个问题**:
|
|
221
|
+
* completed / delivery_incomplete / delivery_unverified / claims_unverified。
|
|
222
|
+
* 两者并列而非替代 —— `ok:true` 配 `delivery_status:'claims_unverified'` 是
|
|
223
|
+
* 完全合法的一行:Agent 确实正常收尾了,但它宣称的「测试已通过」没有证据支撑。
|
|
224
|
+
* 判断「任务是否真做成」的宿主应当读它,而不是只看 ok。
|
|
225
|
+
*
|
|
196
226
|
* 导出供单测断言。
|
|
197
227
|
*/
|
|
198
228
|
export function emitJsonResult(result: PrintResult, sessionFile?: string): void {
|
|
@@ -220,6 +250,11 @@ export function emitJsonResult(result: PrintResult, sessionFile?: string): void
|
|
|
220
250
|
num_turns: result.numTurns,
|
|
221
251
|
error: result.error,
|
|
222
252
|
completionStatus,
|
|
253
|
+
...(result.deliveryStatus ? { delivery_status: result.deliveryStatus } : {}),
|
|
254
|
+
// ⚠️ 读了就必须输出。本仓库在 `turn_done.completionStatus` 上正犯过反面错误:
|
|
255
|
+
// 事件被读进 result 却没进 JSON,于是模型谎报成功时宿主拿到的 JSON
|
|
256
|
+
// 与一切正常逐字节相同。goal_status 同理,不能只留在进程里。
|
|
257
|
+
...(result.goalStatus ? { goal_status: result.goalStatus } : {}),
|
|
223
258
|
deliverables,
|
|
224
259
|
verification: allVerified ? 'passed' : deliverables.length > 0 ? 'not_run' : 'none',
|
|
225
260
|
warnings,
|
|
@@ -358,11 +393,13 @@ export async function runPrintMode(
|
|
|
358
393
|
memoryAccess: options.memoryAccess ?? 'read-only',
|
|
359
394
|
interactiveAsk: false,
|
|
360
395
|
computer: computerRun,
|
|
396
|
+
computerIntent: classifyComputerAutomationIntent(
|
|
397
|
+
prompt,
|
|
398
|
+
sessionState.computerAutomation,
|
|
399
|
+
),
|
|
361
400
|
});
|
|
362
401
|
const turnTools = filterToolsForRuntime(ALL_TOOLS, runtimeContext);
|
|
363
|
-
|
|
364
|
-
if (history[0]?.role === 'system') history[0] = { ...history[0], content: stablePrompt };
|
|
365
|
-
else history.unshift({ role: 'system', content: stablePrompt });
|
|
402
|
+
await refreshStableSystemPrompt(history, cwd, turnTools);
|
|
366
403
|
const transientBundle = await buildTransientPromptBundle({
|
|
367
404
|
cwd,
|
|
368
405
|
tools: turnTools,
|
|
@@ -457,6 +494,14 @@ export function handleEvent(
|
|
|
457
494
|
result.numTurns++;
|
|
458
495
|
return {};
|
|
459
496
|
|
|
497
|
+
case 'assistant_draft_discarded':
|
|
498
|
+
if (event.textLength > 0)
|
|
499
|
+
result.buffer = result.buffer.slice(
|
|
500
|
+
0,
|
|
501
|
+
Math.max(0, result.buffer.length - event.textLength),
|
|
502
|
+
);
|
|
503
|
+
return {};
|
|
504
|
+
|
|
460
505
|
case 'tool_start':
|
|
461
506
|
if (verbose) {
|
|
462
507
|
process.stderr.write(`\n🔧 工具: ${event.toolName}(${event.argsPreview})\n`);
|
|
@@ -509,12 +554,22 @@ export function handleEvent(
|
|
|
509
554
|
// 通用非致命警告(如 workflow 多余参数、pause 被自动跳过等)始终走 stderr,
|
|
510
555
|
// 不受 verbose 控制 —— 这是用户必须看到的信号,避免静默丢弃语义被忽略。
|
|
511
556
|
process.stderr.write(`${event.message}\n`);
|
|
557
|
+
// 同时收进结局契约:stderr 是给人看的,spawn 它的宿主要的是结构化的一条。
|
|
558
|
+
// (此前 PrintResult.warnings 声明了、读了、也输出了,就是没有任何地方写它 ——
|
|
559
|
+
// json 那行的 warnings 恒为空数组。)
|
|
560
|
+
(result.warnings ??= []).push(event.message);
|
|
512
561
|
return {};
|
|
513
562
|
|
|
514
563
|
case 'turn_done':
|
|
515
564
|
// text 模式:非 verbose 时这里一次性把累积答案打到 stdout(旧行为,逐字节不变)。
|
|
516
565
|
// json 模式:只记 stopReason='end_turn',stdout 保持静默。
|
|
517
566
|
result.stopReason = 'end_turn';
|
|
567
|
+
// 内核的交付判定必须过进程边界:模型谎称「已验证」时,若不记这一笔,
|
|
568
|
+
// 宿主收到的 JSON 与一切正常逐字节相同,唯一线索只剩 stderr 上一行中文。
|
|
569
|
+
if (event.completionStatus) result.deliveryStatus = event.completionStatus;
|
|
570
|
+
// 托管运行时的生命周期状态(goal 等)。同上:读了就必须输出,
|
|
571
|
+
// 否则「Agent 自检通过但还没人验收」在宿主眼里与「办完了」逐字节相同。
|
|
572
|
+
if (event.managedStatus) result.goalStatus = event.managedStatus;
|
|
518
573
|
if (!isJson && !verbose) console.log(result.buffer);
|
|
519
574
|
return {};
|
|
520
575
|
|
|
@@ -547,6 +602,20 @@ export function handleEvent(
|
|
|
547
602
|
if (isJson) result.stopReason = 'interrupted';
|
|
548
603
|
return {};
|
|
549
604
|
|
|
605
|
+
case 'workflow_progress': {
|
|
606
|
+
if (!isJson) {
|
|
607
|
+
const count =
|
|
608
|
+
event.current !== undefined && event.total !== undefined
|
|
609
|
+
? ` ${event.current}/${event.total}`
|
|
610
|
+
: '';
|
|
611
|
+
const indent = ' '.repeat(event.depth ?? 0);
|
|
612
|
+
console.error(
|
|
613
|
+
`${indent}[${event.workflow}]${count}${event.message ? ` ${event.message}` : ''}`,
|
|
614
|
+
);
|
|
615
|
+
}
|
|
616
|
+
return {};
|
|
617
|
+
}
|
|
618
|
+
|
|
550
619
|
// 已知但 -p 模式无需呈现的框架事件:显式忽略,好让 default 只剩"真正未知"的插件私有事件。
|
|
551
620
|
case 'user_message_committed':
|
|
552
621
|
case 'tool_messages_committed':
|
package/src/cli/streamJson.js
CHANGED
|
@@ -28,10 +28,12 @@ import { saveContext } from '../context/persistContext.js';
|
|
|
28
28
|
import { setAskHandler } from '../askBridge.js';
|
|
29
29
|
import { normalizeImageDetail } from '../multimodal.js';
|
|
30
30
|
import { runWithPlugins } from '../plugins/pluginRunner.js';
|
|
31
|
-
import {
|
|
31
|
+
import { buildTransientPromptBundle } from '../prompts/system.js';
|
|
32
|
+
import { refreshStableSystemPrompt } from '../prompts/stableSystemPrompt.js';
|
|
32
33
|
import { getOrCreateSessionState, sessionStateKey } from '../session/sessionState.js';
|
|
33
34
|
import { hydrateSessionWorktree } from '../tools/worktree/sessionWorktree.js';
|
|
34
35
|
import { ALL_TOOLS } from '../tools/index.js';
|
|
36
|
+
import { classifyComputerAutomationIntent } from '../tools/computeruse/computerIntent.js';
|
|
35
37
|
import { createPromptCacheContext } from '../llm/promptCache.js';
|
|
36
38
|
import { createAgentRuntimeContext, filterToolsForRuntime, memoryContextFromRuntime, } from '../runtime/agentRuntimeContext.js';
|
|
37
39
|
import { extractImageOptions, extractPromptArgs } from './print.js';
|
|
@@ -300,13 +302,10 @@ export async function runStreamJsonMode(provider, args, initialHistory, options)
|
|
|
300
302
|
memoryAccess: options.memoryAccess ?? 'read-only',
|
|
301
303
|
interactiveAsk: control,
|
|
302
304
|
computer: computerRun,
|
|
305
|
+
computerIntent: classifyComputerAutomationIntent(prompt, sessionState.computerAutomation),
|
|
303
306
|
});
|
|
304
307
|
const turnTools = filterToolsForRuntime(ALL_TOOLS, runtimeContext);
|
|
305
|
-
|
|
306
|
-
if (history[0]?.role === 'system')
|
|
307
|
-
history[0] = { ...history[0], content: stablePrompt };
|
|
308
|
-
else
|
|
309
|
-
history.unshift({ role: 'system', content: stablePrompt });
|
|
308
|
+
await refreshStableSystemPrompt(history, cwd, turnTools);
|
|
310
309
|
const transientBundle = await buildTransientPromptBundle({
|
|
311
310
|
cwd,
|
|
312
311
|
tools: turnTools,
|
package/src/cli/streamJson.ts
CHANGED
|
@@ -33,10 +33,12 @@ export type { AskAnswer } from '../askBridge.js';
|
|
|
33
33
|
import { normalizeImageDetail } from '../multimodal.js';
|
|
34
34
|
import type { ImageInputSpec, Message, Provider } from '../types.js';
|
|
35
35
|
import { runWithPlugins } from '../plugins/pluginRunner.js';
|
|
36
|
-
import {
|
|
36
|
+
import { buildTransientPromptBundle } from '../prompts/system.js';
|
|
37
|
+
import { refreshStableSystemPrompt } from '../prompts/stableSystemPrompt.js';
|
|
37
38
|
import { getOrCreateSessionState, sessionStateKey } from '../session/sessionState.js';
|
|
38
39
|
import { hydrateSessionWorktree } from '../tools/worktree/sessionWorktree.js';
|
|
39
40
|
import { ALL_TOOLS } from '../tools/index.js';
|
|
41
|
+
import { classifyComputerAutomationIntent } from '../tools/computeruse/computerIntent.js';
|
|
40
42
|
import { createPromptCacheContext } from '../llm/promptCache.js';
|
|
41
43
|
import {
|
|
42
44
|
createAgentRuntimeContext,
|
|
@@ -377,11 +379,13 @@ export async function runStreamJsonMode(
|
|
|
377
379
|
memoryAccess: options.memoryAccess ?? 'read-only',
|
|
378
380
|
interactiveAsk: control,
|
|
379
381
|
computer: computerRun,
|
|
382
|
+
computerIntent: classifyComputerAutomationIntent(
|
|
383
|
+
prompt,
|
|
384
|
+
sessionState.computerAutomation,
|
|
385
|
+
),
|
|
380
386
|
});
|
|
381
387
|
const turnTools = filterToolsForRuntime(ALL_TOOLS, runtimeContext);
|
|
382
|
-
|
|
383
|
-
if (history[0]?.role === 'system') history[0] = { ...history[0], content: stablePrompt };
|
|
384
|
-
else history.unshift({ role: 'system', content: stablePrompt });
|
|
388
|
+
await refreshStableSystemPrompt(history, cwd, turnTools);
|
|
385
389
|
const transientBundle = await buildTransientPromptBundle({
|
|
386
390
|
cwd,
|
|
387
391
|
tools: turnTools,
|
|
@@ -14,6 +14,8 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
14
14
|
*/
|
|
15
15
|
import { useState } from 'react';
|
|
16
16
|
import { configService } from '../../config/configService.js';
|
|
17
|
+
import { DEFAULT_ADVISOR_CONFIG } from '../../config/configDefaults.js';
|
|
18
|
+
import { CONFIG_LIMITS, normalizeLimited } from '../../config/numericLimits.js';
|
|
17
19
|
import { FieldForm } from './fieldForm.js';
|
|
18
20
|
const NEW_MODEL_OPTION = '+ 新建模型(作为顾问专用,可与基座用不同 provider)';
|
|
19
21
|
function parsePositiveInt(value, fallback) {
|
|
@@ -94,7 +96,7 @@ export function AdvisorWizard({ existing, models, onDone, onCancel }) {
|
|
|
94
96
|
key: 'timeoutSeconds',
|
|
95
97
|
label: '最长等待(秒)',
|
|
96
98
|
type: 'text',
|
|
97
|
-
default: String(Math.round((existing?.timeoutMs ??
|
|
99
|
+
default: String(Math.round((existing?.timeoutMs ?? DEFAULT_ADVISOR_CONFIG.timeoutMs) / 1000)),
|
|
98
100
|
optional: true,
|
|
99
101
|
},
|
|
100
102
|
{
|
|
@@ -140,7 +142,7 @@ export function AdvisorWizard({ existing, models, onDone, onCancel }) {
|
|
|
140
142
|
mode: values.mode === 'manual' ? 'manual' : 'auto',
|
|
141
143
|
modelId,
|
|
142
144
|
shareSensitive: values.shareSensitive,
|
|
143
|
-
timeoutMs:
|
|
145
|
+
timeoutMs: normalizeLimited(parsePositiveInt(values.timeoutSeconds, DEFAULT_ADVISOR_CONFIG.timeoutMs / 1000) * 1000, CONFIG_LIMITS.advisorTimeoutMs, DEFAULT_ADVISOR_CONFIG.timeoutMs),
|
|
144
146
|
},
|
|
145
147
|
});
|
|
146
148
|
onDone();
|
|
@@ -16,6 +16,8 @@ import React, { useState } from 'react';
|
|
|
16
16
|
|
|
17
17
|
import type { ModelConfig } from '../../config/configFile.js';
|
|
18
18
|
import { configService } from '../../config/configService.js';
|
|
19
|
+
import { DEFAULT_ADVISOR_CONFIG } from '../../config/configDefaults.js';
|
|
20
|
+
import { CONFIG_LIMITS, normalizeLimited } from '../../config/numericLimits.js';
|
|
19
21
|
import { FieldForm, type FieldValues } from './fieldForm.js';
|
|
20
22
|
|
|
21
23
|
type ResolvedAdvisor = Awaited<ReturnType<typeof configService.advisor>>;
|
|
@@ -138,7 +140,7 @@ export function AdvisorWizard({ existing, models, onDone, onCancel }: Props): JS
|
|
|
138
140
|
key: 'timeoutSeconds',
|
|
139
141
|
label: '最长等待(秒)',
|
|
140
142
|
type: 'text',
|
|
141
|
-
default: String(Math.round((existing?.timeoutMs ??
|
|
143
|
+
default: String(Math.round((existing?.timeoutMs ?? DEFAULT_ADVISOR_CONFIG.timeoutMs) / 1000)),
|
|
142
144
|
optional: true,
|
|
143
145
|
},
|
|
144
146
|
{
|
|
@@ -184,7 +186,11 @@ export function AdvisorWizard({ existing, models, onDone, onCancel }: Props): JS
|
|
|
184
186
|
mode: values.mode === 'manual' ? 'manual' : 'auto',
|
|
185
187
|
modelId,
|
|
186
188
|
shareSensitive: values.shareSensitive as boolean,
|
|
187
|
-
timeoutMs:
|
|
189
|
+
timeoutMs: normalizeLimited(
|
|
190
|
+
parsePositiveInt(values.timeoutSeconds, DEFAULT_ADVISOR_CONFIG.timeoutMs / 1000) * 1000,
|
|
191
|
+
CONFIG_LIMITS.advisorTimeoutMs,
|
|
192
|
+
DEFAULT_ADVISOR_CONFIG.timeoutMs,
|
|
193
|
+
),
|
|
188
194
|
},
|
|
189
195
|
});
|
|
190
196
|
onDone();
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { configService } from '../../config/configService.js';
|
|
3
3
|
import { CONFIG_LIMITS, normalizeLimited } from '../../config/numericLimits.js';
|
|
4
|
+
import { DEFAULT_ADVISOR_CONFIG } from '../../config/configDefaults.js';
|
|
4
5
|
import { FieldForm } from './fieldForm.js';
|
|
5
6
|
function numberValue(value, fallback) {
|
|
6
7
|
const parsed = Number(String(value ?? '').trim());
|
|
@@ -48,13 +49,13 @@ export function ContextAdvisorWizard({ compactRatio, advisor, models, onDone, on
|
|
|
48
49
|
key: 'inputTokenBudget',
|
|
49
50
|
label: '顾问输入 Token 预算',
|
|
50
51
|
type: 'text',
|
|
51
|
-
default: String(advisor?.inputTokenBudget ??
|
|
52
|
+
default: String(advisor?.inputTokenBudget ?? DEFAULT_ADVISOR_CONFIG.inputTokenBudget),
|
|
52
53
|
},
|
|
53
54
|
{
|
|
54
55
|
key: 'timeoutSeconds',
|
|
55
56
|
label: '最长等待(秒)',
|
|
56
57
|
type: 'text',
|
|
57
|
-
default: String(Math.round((advisor?.timeoutMs ??
|
|
58
|
+
default: String(Math.round((advisor?.timeoutMs ?? DEFAULT_ADVISOR_CONFIG.timeoutMs) / 1000)),
|
|
58
59
|
},
|
|
59
60
|
{
|
|
60
61
|
key: 'shareSensitive',
|
|
@@ -73,8 +74,8 @@ export function ContextAdvisorWizard({ compactRatio, advisor, models, onDone, on
|
|
|
73
74
|
enabled: values.enabled === true,
|
|
74
75
|
mode: values.mode === 'manual' ? 'manual' : 'auto',
|
|
75
76
|
modelId,
|
|
76
|
-
inputTokenBudget: normalizeLimited(numberValue(values.inputTokenBudget,
|
|
77
|
-
timeoutMs: normalizeLimited(numberValue(values.timeoutSeconds,
|
|
77
|
+
inputTokenBudget: normalizeLimited(numberValue(values.inputTokenBudget, DEFAULT_ADVISOR_CONFIG.inputTokenBudget), CONFIG_LIMITS.advisorInputTokenBudget, DEFAULT_ADVISOR_CONFIG.inputTokenBudget),
|
|
78
|
+
timeoutMs: normalizeLimited(numberValue(values.timeoutSeconds, DEFAULT_ADVISOR_CONFIG.timeoutMs / 1000) * 1000, CONFIG_LIMITS.advisorTimeoutMs, DEFAULT_ADVISOR_CONFIG.timeoutMs),
|
|
78
79
|
shareSensitive: values.shareSensitive === true,
|
|
79
80
|
}
|
|
80
81
|
: { clear: true },
|
|
@@ -3,6 +3,7 @@ import React from 'react';
|
|
|
3
3
|
import type { AdvisorConfig, ModelConfig } from '../../config/configFile.js';
|
|
4
4
|
import { configService } from '../../config/configService.js';
|
|
5
5
|
import { CONFIG_LIMITS, normalizeLimited } from '../../config/numericLimits.js';
|
|
6
|
+
import { DEFAULT_ADVISOR_CONFIG } from '../../config/configDefaults.js';
|
|
6
7
|
import { FieldForm } from './fieldForm.js';
|
|
7
8
|
|
|
8
9
|
interface Props {
|
|
@@ -72,13 +73,13 @@ export function ContextAdvisorWizard({
|
|
|
72
73
|
key: 'inputTokenBudget',
|
|
73
74
|
label: '顾问输入 Token 预算',
|
|
74
75
|
type: 'text',
|
|
75
|
-
default: String(advisor?.inputTokenBudget ??
|
|
76
|
+
default: String(advisor?.inputTokenBudget ?? DEFAULT_ADVISOR_CONFIG.inputTokenBudget),
|
|
76
77
|
},
|
|
77
78
|
{
|
|
78
79
|
key: 'timeoutSeconds',
|
|
79
80
|
label: '最长等待(秒)',
|
|
80
81
|
type: 'text',
|
|
81
|
-
default: String(Math.round((advisor?.timeoutMs ??
|
|
82
|
+
default: String(Math.round((advisor?.timeoutMs ?? DEFAULT_ADVISOR_CONFIG.timeoutMs) / 1000)),
|
|
82
83
|
},
|
|
83
84
|
{
|
|
84
85
|
key: 'shareSensitive',
|
|
@@ -103,14 +104,14 @@ export function ContextAdvisorWizard({
|
|
|
103
104
|
mode: values.mode === 'manual' ? 'manual' : 'auto',
|
|
104
105
|
modelId,
|
|
105
106
|
inputTokenBudget: normalizeLimited(
|
|
106
|
-
numberValue(values.inputTokenBudget,
|
|
107
|
+
numberValue(values.inputTokenBudget, DEFAULT_ADVISOR_CONFIG.inputTokenBudget),
|
|
107
108
|
CONFIG_LIMITS.advisorInputTokenBudget,
|
|
108
|
-
|
|
109
|
+
DEFAULT_ADVISOR_CONFIG.inputTokenBudget,
|
|
109
110
|
),
|
|
110
111
|
timeoutMs: normalizeLimited(
|
|
111
|
-
numberValue(values.timeoutSeconds,
|
|
112
|
+
numberValue(values.timeoutSeconds, DEFAULT_ADVISOR_CONFIG.timeoutMs / 1000) * 1000,
|
|
112
113
|
CONFIG_LIMITS.advisorTimeoutMs,
|
|
113
|
-
|
|
114
|
+
DEFAULT_ADVISOR_CONFIG.timeoutMs,
|
|
114
115
|
),
|
|
115
116
|
shareSensitive: values.shareSensitive === true,
|
|
116
117
|
}
|
|
@@ -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
|
+
}
|