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,36 @@
|
|
|
1
|
+
import { ONLINE_TOOL_CATEGORY_BY_NAME, onlineToolCategory as sharedOnlineToolCategory, } from './onlineToolContract.js';
|
|
2
|
+
const TOOL_SECURITY_METADATA = Object.fromEntries(Object.entries(ONLINE_TOOL_CATEGORY_BY_NAME).map(([name, category]) => [
|
|
3
|
+
name,
|
|
4
|
+
{
|
|
5
|
+
name,
|
|
6
|
+
category,
|
|
7
|
+
mayTransmitLocalData: category === 'workspace' || category === 'computer',
|
|
8
|
+
},
|
|
9
|
+
]));
|
|
10
|
+
export function onlineToolCategory(name) {
|
|
11
|
+
return sharedOnlineToolCategory(name);
|
|
12
|
+
}
|
|
13
|
+
export function toolSecurityMetadata(name) {
|
|
14
|
+
return TOOL_SECURITY_METADATA[name];
|
|
15
|
+
}
|
|
16
|
+
/** Applies the remote model's maximum category boundary before schemas leave
|
|
17
|
+
* the device. Local providers retain their original complete tool set. */
|
|
18
|
+
export function filterToolsForProvider(tools, provider) {
|
|
19
|
+
if (provider.source !== 'gateway')
|
|
20
|
+
return [...tools];
|
|
21
|
+
return filterToolsForCategories(tools,
|
|
22
|
+
// The server maximum is the non-negotiable upper bound. The compatibility
|
|
23
|
+
// field is only a fallback for old descriptors that lack the explicit
|
|
24
|
+
// max/default split; it must never override the maximum with defaults.
|
|
25
|
+
provider.gatewayMaxToolCategories ?? provider.gatewayToolCategories);
|
|
26
|
+
}
|
|
27
|
+
/** Applies the per-Session switch inside the server/model upper bound. */
|
|
28
|
+
export function filterToolsForCategories(tools, categories) {
|
|
29
|
+
if (!categories)
|
|
30
|
+
return [...tools];
|
|
31
|
+
const allowed = new Set(categories);
|
|
32
|
+
return tools.filter((tool) => {
|
|
33
|
+
const category = onlineToolCategory(tool.name);
|
|
34
|
+
return category !== undefined && allowed.has(category);
|
|
35
|
+
});
|
|
36
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { Provider, Tool } from '../types.js';
|
|
2
|
+
import {
|
|
3
|
+
ONLINE_TOOL_CATEGORY_BY_NAME,
|
|
4
|
+
type OnlineToolCategory,
|
|
5
|
+
onlineToolCategory as sharedOnlineToolCategory,
|
|
6
|
+
} from './onlineToolContract.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Categories shared with minimal-server. They are a server-enforced upper
|
|
10
|
+
* bound when a remote model is selected. Unknown/dynamic tools fail closed:
|
|
11
|
+
* a plugin cannot silently gain remote-model visibility just by registering a
|
|
12
|
+
* new tool name.
|
|
13
|
+
*/
|
|
14
|
+
export type { OnlineToolCategory } from './onlineToolContract.js';
|
|
15
|
+
|
|
16
|
+
export interface ToolSecurityMetadata {
|
|
17
|
+
name: string;
|
|
18
|
+
category: OnlineToolCategory;
|
|
19
|
+
/** Reserved for the privacy UI and future per-tool redaction policy. */
|
|
20
|
+
mayTransmitLocalData: boolean;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const TOOL_SECURITY_METADATA: Readonly<Record<string, ToolSecurityMetadata>> =
|
|
24
|
+
Object.fromEntries(
|
|
25
|
+
Object.entries(ONLINE_TOOL_CATEGORY_BY_NAME).map(([name, category]) => [
|
|
26
|
+
name,
|
|
27
|
+
{
|
|
28
|
+
name,
|
|
29
|
+
category,
|
|
30
|
+
mayTransmitLocalData:
|
|
31
|
+
category === 'workspace' || category === 'computer',
|
|
32
|
+
},
|
|
33
|
+
]),
|
|
34
|
+
) as Readonly<Record<string, ToolSecurityMetadata>>;
|
|
35
|
+
|
|
36
|
+
export function onlineToolCategory(
|
|
37
|
+
name: string,
|
|
38
|
+
): OnlineToolCategory | undefined {
|
|
39
|
+
return sharedOnlineToolCategory(name);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function toolSecurityMetadata(
|
|
43
|
+
name: string,
|
|
44
|
+
): ToolSecurityMetadata | undefined {
|
|
45
|
+
return TOOL_SECURITY_METADATA[name];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Applies the remote model's maximum category boundary before schemas leave
|
|
49
|
+
* the device. Local providers retain their original complete tool set. */
|
|
50
|
+
export function filterToolsForProvider(
|
|
51
|
+
tools: readonly Tool[],
|
|
52
|
+
provider: Provider,
|
|
53
|
+
): Tool[] {
|
|
54
|
+
if (provider.source !== 'gateway') return [...tools];
|
|
55
|
+
return filterToolsForCategories(
|
|
56
|
+
tools,
|
|
57
|
+
// The server maximum is the non-negotiable upper bound. The compatibility
|
|
58
|
+
// field is only a fallback for old descriptors that lack the explicit
|
|
59
|
+
// max/default split; it must never override the maximum with defaults.
|
|
60
|
+
provider.gatewayMaxToolCategories ?? provider.gatewayToolCategories,
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Applies the per-Session switch inside the server/model upper bound. */
|
|
65
|
+
export function filterToolsForCategories(
|
|
66
|
+
tools: readonly Tool[],
|
|
67
|
+
categories?: readonly string[],
|
|
68
|
+
): Tool[] {
|
|
69
|
+
if (!categories) return [...tools];
|
|
70
|
+
const allowed = new Set(categories as OnlineToolCategory[]);
|
|
71
|
+
return tools.filter((tool) => {
|
|
72
|
+
const category = onlineToolCategory(tool.name);
|
|
73
|
+
return category !== undefined && allowed.has(category);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* ------------------------------------------------------------
|
|
5
5
|
* 独立配置的第二个 LLM,供主循环的模型在关键判断点(方案/诊断成型后动手写改之前、
|
|
6
6
|
* 受阻或要改方向时、收尾汇报之前)主动调用,拿到一个不同模型的第二意见。
|
|
7
|
-
* 时机规则的真身在 `prompts/
|
|
7
|
+
* 时机规则的真身在 `prompts/policyRegistry.ts` 的 `capability.advisor` 能力块 + 本文件的
|
|
8
8
|
* `description`;配额曲线在 `loop.ts::advisorQuotaFor`。
|
|
9
9
|
*
|
|
10
10
|
* 设计要点(吸收自 Claude Code 官方 /advisor 的架构,但按 minimal-agent
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
import { z } from 'zod';
|
|
26
26
|
import { configService } from '../../config/configService.js';
|
|
27
27
|
import { CONFIG_LIMITS, normalizeLimited } from '../../config/numericLimits.js';
|
|
28
|
+
import { DEFAULT_ADVISOR_CONFIG } from '../../config/configDefaults.js';
|
|
28
29
|
import { countMessagesTokens } from '../../context/tokenCounter.js';
|
|
29
30
|
import { chat } from '../../llm/client.js';
|
|
30
31
|
import { derivePromptCacheContext } from '../../llm/promptCache.js';
|
|
@@ -34,31 +35,21 @@ import { DEFAULT_MAX_RESULT_SIZE_CHARS } from '../types.js';
|
|
|
34
35
|
const inputSchema = z.object({
|
|
35
36
|
note: z
|
|
36
37
|
.string()
|
|
37
|
-
|
|
38
|
+
// 上限只做护栏,不做实用约束:note 是顾问唯一能看到的「模型主动强调的证据」,
|
|
39
|
+
// 卡太低(曾经 2000 字符)会让完整方案+关键代码原文根本塞不进去。真正的预算
|
|
40
|
+
// 闸门在 buildAdvisorMessages -> fitAdvisorBudget(inputTokenBudget 配置 +
|
|
41
|
+
// 顾问 contextWindow 推导),note 超预算只会挤掉历史消息,不会炸请求。
|
|
42
|
+
.max(100_000, 'note 太长(>100000 字符)')
|
|
38
43
|
.optional()
|
|
39
|
-
.describe('
|
|
44
|
+
.describe('可选。大多数情况下不需要填--你此前说过的方案/诊断已经在会话历史里,顾问会自动看到。' +
|
|
40
45
|
'只有需要额外强调、历史里没体现的点时才填一句话。'),
|
|
41
46
|
});
|
|
42
47
|
const parameters = toToolParameters(inputSchema);
|
|
43
48
|
// ---------------- 2. Description(给 LLM 看的工具说明) ----------------
|
|
44
|
-
const description =
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
- Orientation is NOT substantive work: finding files, reading code, running a command to see the current state. Do that first, then consult.
|
|
49
|
-
- Substantive work IS: writing or editing files, committing to an interpretation, building on an assumption, declaring an answer.
|
|
50
|
-
- **MUST call Advisor in all 5 of these situations — do not wait for errors or user prompts:**
|
|
51
|
-
1. After a plan / development plan is finalized, **before** executing it (get critique first, avoid discovering wrong direction halfway)
|
|
52
|
-
2. **Before** submitting final results to the user (before PresentResult): code reviews, assessment reports, technical selections, refactoring plans — any time you "deliver a conclusion"
|
|
53
|
-
3. The same error occurs 2+ times in a row, or fixes are not converging (early sign of infinite loop — switch approach immediately)
|
|
54
|
-
4. The user gives unsatisfied feedback a **second time** in the same turn (stop spinning in place, get a fresh perspective first)
|
|
55
|
-
5. Decisions involving security, data loss, or irreversible operations (advisor double-check)
|
|
56
|
-
- **Make your work durable BEFORE calling in situation 2.** Write the file, save the result. This call takes time; if the turn ends during it, a written file survives and an unwritten answer does not.
|
|
57
|
-
- On a long task, consult at least twice: once before the approach is locked in, once before you declare it done. On a short reactive task whose next step is dictated by output you just read, one call is enough — the advisor adds most of its value early.
|
|
58
|
-
- **Take the advice seriously, but do not obey it blindly.** Adapt if you follow a step and it empirically fails, or you hold primary-source evidence contradicting a specific claim (the file says X, the test output says Y). A passing self-test is NOT evidence the advice is wrong — it is evidence your test does not check what the advice checks.
|
|
59
|
-
- **If the advisor contradicts evidence you already gathered, do not silently switch.** Call Advisor once more stating the conflict outright ("I measured X, you advise Y — which constraint breaks the tie?"). The advisor saw your evidence but may have underweighted it; one reconciling call is far cheaper than committing to the wrong branch.
|
|
60
|
-
- The advisor has no tool access and does a single read-only pass over the transcript — it cannot verify anything itself, only reason about what it's shown.
|
|
61
|
-
- If this tool errors (advisor not configured in shared settings, disabled, manual-only, or a call failure), that's not a signal to stop — treat it as "no second opinion available this time" and continue with your own judgment, but **explicitly note "not cross-verified by advisor" in your final output**. Do not block or retry in a loop.`;
|
|
49
|
+
const description = `Consult an independently configured, read-only advisor model for a second opinion.
|
|
50
|
+
The advisor receives a bounded view of the current session. Usually omit note; use it only for decisive evidence or visual facts that are absent or easy to miss in history.
|
|
51
|
+
The result includes a full consultationId. After a successful automatic consultation, record the main Agent's evidence-based accept/partial/reject judgment with AdvisorDecision.
|
|
52
|
+
The advisor is neither a fact source nor an authority. If it is unavailable or fails, follow the returned degradation guidance and do not retry in a loop.`;
|
|
62
53
|
// ---------------- 3. 顾问 persona system prompt ----------------
|
|
63
54
|
const ADVISOR_SYSTEM_PROMPT = `你是一位经验丰富的全栈开发专家技术顾问,为正在独立执行任务的另一个 AI 助手提供第二意见评审。
|
|
64
55
|
你的职责:技术方案评估、代码评审、疑难问题的根因定位与解决方向判断。
|
|
@@ -104,8 +95,19 @@ const ADVISOR_SYSTEM_PROMPT = `你是一位经验丰富的全栈开发专家技
|
|
|
104
95
|
* 和 TUI 的 ephemeral 提示消息(两者都是 role:'system'),换成顾问自己的 persona。
|
|
105
96
|
*/
|
|
106
97
|
const MAX_TOOL_RESULT_CHARS = 12_000;
|
|
98
|
+
/**
|
|
99
|
+
* 工具调用参数与思维链的截断上限——与 `fitAdvisorBudget` 的预算裁剪是两回事:
|
|
100
|
+
* 那个只在总量超预算时才生效、按消息整条丢弃;这两个是每条消息内部无条件应用的
|
|
101
|
+
* 字段级上限,不看当前预算是否宽裕。思维链截得比正文更狠:重思考模型的
|
|
102
|
+
* reasoning 常比 content 长几倍,不设限会把预算吃光、挤掉更该保留的工具结果原文。
|
|
103
|
+
* 未发现过当前取值导致顾问漏判的实例,因此只命名、不改值——真出现具体案例
|
|
104
|
+
* 再调,不做没有证据支撑的预防性放宽。
|
|
105
|
+
*/
|
|
106
|
+
const ADVISOR_TOOL_ARGS_TRUNCATE_CHARS = 2_000;
|
|
107
|
+
const ADVISOR_REASONING_TRUNCATE_CHARS = 2_000;
|
|
107
108
|
/** 归一化后的工具结果前缀;裁剪统计要靠它反查,两处必须共用同一常量。 */
|
|
108
109
|
const TOOL_RESULT_PREFIX = '[工具结果 ';
|
|
110
|
+
const CONTEXT_PACKET_PREFIX = '[Advisor 结构化上下文包]';
|
|
109
111
|
function truncateMiddle(value, limit = MAX_TOOL_RESULT_CHARS) {
|
|
110
112
|
if (value.length <= limit)
|
|
111
113
|
return value;
|
|
@@ -190,18 +192,16 @@ function normalizeAdvisorMessage(message, supportsVision, allowImages, imageBudg
|
|
|
190
192
|
return { role: 'user', content: `${TOOL_RESULT_PREFIX}${message.tool_call_id}]\n${truncateMiddle(message.content)}` };
|
|
191
193
|
}
|
|
192
194
|
if (message.role === 'assistant') {
|
|
193
|
-
const calls = message.tool_calls?.map((call) => `[调用工具 ${call.function.name}] ${truncateMiddle(call.function.arguments,
|
|
195
|
+
const calls = message.tool_calls?.map((call) => `[调用工具 ${call.function.name}] ${truncateMiddle(call.function.arguments, ADVISOR_TOOL_ARGS_TRUNCATE_CHARS)}`).join('\n');
|
|
194
196
|
// 思维链一并送给顾问:评审「方案对不对」很大程度上要看**它是怎么想到这个方案的**——
|
|
195
197
|
// 推理里的跳跃(把推断当已验证、跳过一个没排除的可能)在最终结论文本里往往看不出来。
|
|
196
|
-
// 截断比正文更狠(2000):重思考模型的 reasoning 常比 content 长几倍,不设限会把
|
|
197
|
-
// 预算吃光、反而挤掉更该保留的工具结果原文。
|
|
198
198
|
// reasoning_details(结构化数组)不传:结构因 provider 而异,既无法可靠脱敏也无法
|
|
199
199
|
// 稳定转成文本,传过去只会变成噪声。
|
|
200
200
|
const thinking = typeof message.reasoning_content === 'string' && message.reasoning_content.length > 0
|
|
201
201
|
? message.reasoning_content
|
|
202
202
|
: (typeof message.reasoning === 'string' ? message.reasoning : '');
|
|
203
203
|
const thinkingLine = thinking.length > 0
|
|
204
|
-
? `[思考过程]\n${truncateMiddle(thinking,
|
|
204
|
+
? `[思考过程]\n${truncateMiddle(thinking, ADVISOR_REASONING_TRUNCATE_CHARS)}`
|
|
205
205
|
: '';
|
|
206
206
|
return {
|
|
207
207
|
role: 'assistant',
|
|
@@ -224,13 +224,18 @@ function fitAdvisorBudget(messages, inputBudget) {
|
|
|
224
224
|
const system = messages[0];
|
|
225
225
|
const closing = messages[messages.length - 1];
|
|
226
226
|
const body = messages.slice(1, -1);
|
|
227
|
-
const
|
|
227
|
+
const packetIndex = body.findIndex((message) => message.role === 'user'
|
|
228
|
+
&& typeof message.content === 'string'
|
|
229
|
+
&& message.content.startsWith(CONTEXT_PACKET_PREFIX));
|
|
230
|
+
const firstUserIndex = body.findIndex((message, index) => index !== packetIndex && message.role === 'user');
|
|
228
231
|
const selected = [];
|
|
229
232
|
let used = countMessagesTokens([system, closing]);
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
233
|
+
for (const index of [packetIndex, firstUserIndex]) {
|
|
234
|
+
if (index < 0)
|
|
235
|
+
continue;
|
|
236
|
+
const pinned = body[index];
|
|
237
|
+
selected.push(pinned);
|
|
238
|
+
used += countMessagesTokens([pinned]);
|
|
234
239
|
}
|
|
235
240
|
// 从最近往前收,**装不下就停**(break,不是 continue)。
|
|
236
241
|
//
|
|
@@ -241,7 +246,7 @@ function fitAdvisorBudget(messages, inputBudget) {
|
|
|
241
246
|
// 宁可少给,不可给错:连续的尾部 + 如实说明从哪里开始省略。
|
|
242
247
|
const recent = [];
|
|
243
248
|
for (let index = body.length - 1; index >= 0; index--) {
|
|
244
|
-
if (index === firstUserIndex)
|
|
249
|
+
if (index === firstUserIndex || index === packetIndex)
|
|
245
250
|
continue;
|
|
246
251
|
const message = body[index];
|
|
247
252
|
const cost = countMessagesTokens([message]);
|
|
@@ -284,12 +289,18 @@ export function buildAdvisorMessages(history, note, options = {}) {
|
|
|
284
289
|
.join('\n');
|
|
285
290
|
const messages = [
|
|
286
291
|
{ role: 'system', content: ADVISOR_SYSTEM_PROMPT },
|
|
292
|
+
...(options.contextPacket
|
|
293
|
+
? [{
|
|
294
|
+
role: 'user',
|
|
295
|
+
content: `${CONTEXT_PACKET_PREFIX}\n${JSON.stringify(options.contextPacket, null, 2)}`,
|
|
296
|
+
}]
|
|
297
|
+
: []),
|
|
287
298
|
...nonSystem,
|
|
288
299
|
{ role: 'user', content: closing },
|
|
289
300
|
];
|
|
290
301
|
const contextWindow = options.contextWindow ?? 128_000;
|
|
291
302
|
const maxTokens = options.maxTokens ?? 4096;
|
|
292
|
-
const configuredBudget = normalizeLimited(options.inputTokenBudget, CONFIG_LIMITS.advisorInputTokenBudget,
|
|
303
|
+
const configuredBudget = normalizeLimited(options.inputTokenBudget, CONFIG_LIMITS.advisorInputTokenBudget, DEFAULT_ADVISOR_CONFIG.inputTokenBudget);
|
|
293
304
|
const providerBudget = Math.max(CONFIG_LIMITS.advisorInputTokenBudget.min, contextWindow - maxTokens - 4096);
|
|
294
305
|
const inputBudget = Math.min(configuredBudget, providerBudget);
|
|
295
306
|
return fitAdvisorBudget(messages, inputBudget);
|
|
@@ -318,40 +329,88 @@ function classifyAdvisorError(e) {
|
|
|
318
329
|
* `chatFn: typeof chat = chat` 模式),不需要 mock.module。
|
|
319
330
|
*/
|
|
320
331
|
export async function runAdvisor(input, signal, ctx, chatFn = chat, runtime = {}) {
|
|
332
|
+
const consultation = ctx?.advisorInvocation === 'agent'
|
|
333
|
+
? ctx.advisorRuntime?.beginConsultation()
|
|
334
|
+
: undefined;
|
|
335
|
+
const finish = (result) => {
|
|
336
|
+
if (!consultation || !ctx?.advisorRuntime)
|
|
337
|
+
return result;
|
|
338
|
+
const metadata = ctx.advisorRuntime.finishConsultation(consultation, result.ok);
|
|
339
|
+
return {
|
|
340
|
+
...result,
|
|
341
|
+
...(result.ok
|
|
342
|
+
? {
|
|
343
|
+
content: `consultationId: ${metadata.consultationId}\n调用 AdvisorDecision 时必须原样使用上面的完整 consultationId。\n\n${result.content}`,
|
|
344
|
+
}
|
|
345
|
+
: {}),
|
|
346
|
+
metadata,
|
|
347
|
+
};
|
|
348
|
+
};
|
|
321
349
|
const advisor = await configService.advisor();
|
|
322
350
|
if (!advisor) {
|
|
323
|
-
return {
|
|
351
|
+
return finish({
|
|
324
352
|
ok: false,
|
|
325
353
|
error: '顾问模型未配置。请在设置 → 模型中完成专家顾问配置。' +
|
|
326
354
|
'本回合后续不要再次尝试调用 Advisor;可继续凭自己判断推进,不必等待顾问。',
|
|
327
|
-
};
|
|
355
|
+
});
|
|
328
356
|
}
|
|
329
357
|
if (!advisor.enabled) {
|
|
330
|
-
return {
|
|
358
|
+
return finish({
|
|
331
359
|
ok: false,
|
|
332
360
|
error: '顾问模型当前已关闭(/advisor on 开启)。' +
|
|
333
361
|
'本回合后续不要再次尝试调用 Advisor;可继续凭自己判断推进,不必等待顾问。',
|
|
334
|
-
};
|
|
362
|
+
});
|
|
335
363
|
}
|
|
336
364
|
if (advisor.mode === 'manual' && ctx?.advisorInvocation !== 'manual') {
|
|
337
|
-
return {
|
|
365
|
+
return finish({
|
|
338
366
|
ok: false,
|
|
339
367
|
error: '顾问模型当前为"仅手动"模式;请使用 /advisor ask 发起咨询。' +
|
|
340
368
|
'本回合后续不要再次尝试自动调用 Advisor。',
|
|
341
|
-
};
|
|
369
|
+
});
|
|
342
370
|
}
|
|
343
|
-
|
|
371
|
+
// 复核豁免:有一个已成功、还没被 AdvisorDecision 结清的咨询时,这次调用是对它
|
|
372
|
+
// 的复核而不是一次新检查点的咨询——工具说明书要求"顾问意见与证据冲突时再问一次",
|
|
373
|
+
// 若复核也照常计费/受配额拦截,短任务(配额恒为 1)会在第二次调用直接撞墙,
|
|
374
|
+
// 而配额耗尽的处理是把这次咨询标记失败并**顺带结清 #pending 指向的检查点**——
|
|
375
|
+
// 模型想认真复核,反而因为差一点配额把本该把关的高风险检查点悄悄放行了。
|
|
376
|
+
// 豁免只覆盖第一次复核:协调器按 checkpoint 记录成功咨询次数,完成一次复核后
|
|
377
|
+
// canReconcileConsultation 会变为 false,后续调用重新受正常配额约束。
|
|
378
|
+
const isReconcile = ctx?.advisorInvocation === 'agent'
|
|
379
|
+
&& Boolean(ctx.advisorRuntime?.pendingConsultationId)
|
|
380
|
+
&& ctx.advisorRuntime?.canReconcileConsultation === true;
|
|
381
|
+
// 检查点强制咨询 vs 自愿咨询分池计费:宿主主动拦下模型、强制它咨询的这一次
|
|
382
|
+
// 调用(hasActiveGate === true)走独立的 mandatoryUsed/mandatoryMax 池,
|
|
383
|
+
// 永远不会被自愿/复核性质的咨询挤占配额。旧版只有一个共享池,配额起点为 1
|
|
384
|
+
// 时一个回合里第二个检查点几乎必然撞墙——这不是顾问后端配置问题,是结构性的。
|
|
385
|
+
const isMandated = ctx?.advisorInvocation === 'agent'
|
|
386
|
+
&& ctx.advisorRuntime?.hasActiveGate === true;
|
|
387
|
+
const quota = ctx?.advisorCalls;
|
|
388
|
+
const usesMandatoryPool = isMandated && quota?.mandatoryMax !== undefined;
|
|
389
|
+
const quotaUsed = usesMandatoryPool ? (quota.mandatoryUsed ?? 0) : quota?.used;
|
|
390
|
+
const quotaMax = usesMandatoryPool ? quota.mandatoryMax : quota?.max;
|
|
391
|
+
if (!isReconcile && quota && quotaUsed !== undefined && quotaMax !== undefined && quotaUsed >= quotaMax) {
|
|
344
392
|
// ⚠️ 必须说明「配额会增长」:配额随本回合工作量上调(loop.ts::advisorQuotaFor),
|
|
345
393
|
// 若这里只说「已达上限」,模型会当成本回合的硬上限而不再尝试 —— 那样长回合里
|
|
346
394
|
// 「批次做完再复核一次」的配额永远不会被用到,增长机制等于没做。
|
|
347
|
-
|
|
395
|
+
// ⚠️ 只有确实存在一个待结清的咨询(pendingConsultationId)时才能说"按已有
|
|
396
|
+
// 意见继续"——否则这一步可能压根没有产生过任何意见,那句话就是误导。
|
|
397
|
+
const hasPendingAdvice = ctx?.advisorRuntime?.pendingConsultationId !== undefined;
|
|
398
|
+
const poolLabel = usesMandatoryPool ? '检查点强制咨询配额' : '顾问咨询配额';
|
|
399
|
+
const guidance = hasPendingAdvice
|
|
400
|
+
? '配额会随本回合的工作量增长,继续推进一段后可以再次咨询;现在请按已有意见继续。'
|
|
401
|
+
: '配额会随本回合的工作量增长,继续推进一段后可以再次咨询;这一步目前没有可参考的顾问意见,' +
|
|
402
|
+
'请基于代码、测试等一手证据自行判断,并在汇报时如实说明这一步未获得第二意见背书。';
|
|
403
|
+
return finish({
|
|
348
404
|
ok: false,
|
|
349
|
-
error:
|
|
350
|
-
|
|
351
|
-
|
|
405
|
+
error: `本回合${poolLabel}暂时用完(当前 ${quotaMax} 次)。${guidance}`,
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
if (!isReconcile && quota) {
|
|
409
|
+
if (usesMandatoryPool)
|
|
410
|
+
quota.mandatoryUsed = (quota.mandatoryUsed ?? 0) + 1;
|
|
411
|
+
else
|
|
412
|
+
quota.used++;
|
|
352
413
|
}
|
|
353
|
-
if (ctx?.advisorCalls)
|
|
354
|
-
ctx.advisorCalls.used++;
|
|
355
414
|
const provider = advisor.provider;
|
|
356
415
|
const snapshot = await configService.getSnapshot();
|
|
357
416
|
const secrets = [
|
|
@@ -370,6 +429,9 @@ export async function runAdvisor(input, signal, ctx, chatFn = chat, runtime = {}
|
|
|
370
429
|
contextWindow: provider.contextWindow,
|
|
371
430
|
maxTokens: provider.maxTokens,
|
|
372
431
|
inputTokenBudget: advisor.inputTokenBudget,
|
|
432
|
+
...(ctx?.advisorRuntime
|
|
433
|
+
? { contextPacket: ctx.advisorRuntime.contextPacket(input.note) }
|
|
434
|
+
: {}),
|
|
373
435
|
});
|
|
374
436
|
// Advisor 是可降级的第二意见:使用独立、可配置的总时限,不影响主模型的流式时限。
|
|
375
437
|
// 默认 180 秒,直接使用所选模型的上下文窗口配置。
|
|
@@ -431,22 +493,25 @@ export async function runAdvisor(input, signal, ctx, chatFn = chat, runtime = {}
|
|
|
431
493
|
contextWindow: provider.contextWindow,
|
|
432
494
|
maxTokens: provider.maxTokens,
|
|
433
495
|
inputTokenBudget: advisor.inputTokenBudget,
|
|
496
|
+
...(ctx?.advisorRuntime
|
|
497
|
+
? { contextPacket: ctx.advisorRuntime.contextPacket(input.note) }
|
|
498
|
+
: {}),
|
|
434
499
|
}));
|
|
435
500
|
degradedWithoutImages = true;
|
|
436
501
|
}
|
|
437
502
|
}
|
|
438
503
|
catch (e) {
|
|
439
504
|
if (timeoutController.signal.aborted && !signal?.aborted) {
|
|
440
|
-
return {
|
|
505
|
+
return finish({
|
|
441
506
|
ok: false,
|
|
442
507
|
error: `顾问模型响应超过 ${Math.round(timeoutMs / 1000)}s 未完成,已跳过。` +
|
|
443
508
|
'可继续凭自己判断推进,不必等待顾问。',
|
|
444
|
-
};
|
|
509
|
+
});
|
|
445
510
|
}
|
|
446
|
-
return {
|
|
511
|
+
return finish({
|
|
447
512
|
ok: false,
|
|
448
513
|
error: `${classifyAdvisorError(e)} 可继续凭自己判断推进,不必等待顾问。`,
|
|
449
|
-
};
|
|
514
|
+
});
|
|
450
515
|
}
|
|
451
516
|
finally {
|
|
452
517
|
clearTimeout(timer);
|
|
@@ -460,7 +525,7 @@ export async function runAdvisor(input, signal, ctx, chatFn = chat, runtime = {}
|
|
|
460
525
|
content.slice(0, DEFAULT_MAX_RESULT_SIZE_CHARS) +
|
|
461
526
|
`\n\n... (输出超过 ${DEFAULT_MAX_RESULT_SIZE_CHARS} 字符,已截断)`;
|
|
462
527
|
}
|
|
463
|
-
return { ok: true, content };
|
|
528
|
+
return finish({ ok: true, content });
|
|
464
529
|
}
|
|
465
530
|
// 无宿主上下文的调用视为用户手动咨询;生产主循环使用 callWithContext。
|
|
466
531
|
async function call(input, signal) {
|