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.
Files changed (474) hide show
  1. package/README.md +6 -5
  2. package/package.json +60 -4
  3. package/plugins/computer_use/.claude-plugin/plugin.json +1 -1
  4. package/plugins/cron-runner/src/commands.js +4 -4
  5. package/plugins/cron-runner/src/commands.ts +4 -4
  6. package/plugins/workflow-runner/.claude-plugin/plugin.json +2 -2
  7. package/plugins/workflow-runner/commands/workflow.md +57 -90
  8. package/plugins/workflow-runner/commands/workflows.md +4 -4
  9. package/plugins/workflow-runner/plugin.js +24 -13
  10. package/plugins/workflow-runner/plugin.ts +28 -13
  11. package/plugins/workflow-runner/src/discovery.js +160 -0
  12. package/plugins/workflow-runner/src/discovery.ts +194 -0
  13. package/plugins/workflow-runner/src/goalAnchor.js +53 -0
  14. package/plugins/workflow-runner/src/goalAnchor.ts +59 -0
  15. package/plugins/workflow-runner/src/index.js +197 -206
  16. package/plugins/workflow-runner/src/index.ts +248 -249
  17. package/plugins/workflow-runner/src/inputCoercion.js +40 -0
  18. package/plugins/workflow-runner/src/inputCoercion.ts +43 -0
  19. package/plugins/workflow-runner/src/journal.js +224 -0
  20. package/plugins/workflow-runner/src/journal.ts +274 -0
  21. package/plugins/workflow-runner/src/jsonSchema.js +132 -0
  22. package/plugins/workflow-runner/src/jsonSchema.ts +162 -0
  23. package/plugins/workflow-runner/src/moduleResolution.js +64 -0
  24. package/plugins/workflow-runner/src/moduleResolution.ts +71 -0
  25. package/plugins/workflow-runner/src/resourceInputs.js +220 -0
  26. package/plugins/workflow-runner/src/resourceInputs.ts +300 -0
  27. package/plugins/workflow-runner/src/runner.js +400 -489
  28. package/plugins/workflow-runner/src/runner.ts +488 -560
  29. package/plugins/workflow-runner/src/runtime/config.js +46 -0
  30. package/plugins/workflow-runner/src/runtime/config.ts +69 -0
  31. package/plugins/workflow-runner/src/runtime/context.js +1304 -0
  32. package/plugins/workflow-runner/src/runtime/context.ts +1786 -0
  33. package/plugins/workflow-runner/src/runtime/exec.js +34 -0
  34. package/plugins/workflow-runner/src/runtime/exec.ts +53 -0
  35. package/plugins/workflow-runner/src/runtime/flow.js +8 -0
  36. package/plugins/workflow-runner/src/runtime/flow.ts +12 -0
  37. package/plugins/workflow-runner/src/runtime/fs.js +27 -0
  38. package/plugins/workflow-runner/src/runtime/fs.ts +41 -0
  39. package/plugins/workflow-runner/src/runtime/model.js +6 -0
  40. package/plugins/workflow-runner/src/runtime/model.ts +8 -0
  41. package/plugins/workflow-runner/src/runtime/output.js +7 -0
  42. package/plugins/workflow-runner/src/runtime/output.ts +21 -0
  43. package/plugins/workflow-runner/src/runtime/scheduler.js +141 -0
  44. package/plugins/workflow-runner/src/runtime/scheduler.ts +166 -0
  45. package/plugins/workflow-runner/src/runtime/state.js +16 -0
  46. package/plugins/workflow-runner/src/runtime/state.ts +19 -0
  47. package/plugins/workflow-runner/src/runtime/tools.js +3 -0
  48. package/plugins/workflow-runner/src/runtime/tools.ts +6 -0
  49. package/plugins/workflow-runner/src/sandbox.js +141 -0
  50. package/plugins/workflow-runner/src/sandbox.ts +182 -0
  51. package/plugins/workflow-runner/src/scriptGuard.d.mts +38 -0
  52. package/plugins/workflow-runner/src/scriptGuard.mjs +449 -0
  53. package/plugins/workflow-runner/src/taskIdentity.js +151 -307
  54. package/plugins/workflow-runner/src/taskIdentity.ts +207 -355
  55. package/plugins/workflow-runner/src/toolRuntime.js +29 -8
  56. package/plugins/workflow-runner/src/toolRuntime.ts +36 -11
  57. package/plugins/workflow-runner/src/types.js +7 -211
  58. package/plugins/workflow-runner/src/types.ts +154 -623
  59. package/plugins/workflow-runner/src/util.js +47 -0
  60. package/plugins/workflow-runner/src/util.ts +51 -0
  61. package/plugins/workflow-runner/src/workflowContext.js +20 -0
  62. package/plugins/workflow-runner/src/workflowContext.ts +58 -0
  63. package/plugins/workflow-runner/src/workflowDependencies.js +36 -0
  64. package/plugins/workflow-runner/src/workflowDependencies.ts +59 -0
  65. package/plugins/workflow-runner/src/workflowFingerprint.js +118 -0
  66. package/plugins/workflow-runner/src/workflowFingerprint.ts +122 -0
  67. package/plugins/workflow-runner/src/workflowState.js +474 -802
  68. package/plugins/workflow-runner/src/workflowState.ts +575 -970
  69. package/plugins/workflow-runner/test/api.test.ts +223 -0
  70. package/plugins/workflow-runner/test/apiCapabilities.test.ts +614 -0
  71. package/plugins/workflow-runner/test/apiConcurrencyGate.test.ts +104 -0
  72. package/plugins/workflow-runner/test/apiEcho.test.ts +210 -0
  73. package/plugins/workflow-runner/test/apiReadText.test.ts +178 -0
  74. package/plugins/workflow-runner/test/apiResourceLedger.test.ts +184 -0
  75. package/plugins/workflow-runner/test/childWorkflow.test.ts +304 -0
  76. package/plugins/workflow-runner/test/discovery.test.ts +234 -0
  77. package/plugins/workflow-runner/test/goalAnchor.test.ts +106 -0
  78. package/plugins/workflow-runner/test/goalController.test.ts +317 -0
  79. package/plugins/workflow-runner/test/journalLanes.test.ts +198 -0
  80. package/plugins/workflow-runner/test/listResources.test.ts +106 -0
  81. package/plugins/workflow-runner/test/resourceInputs.test.ts +294 -0
  82. package/plugins/workflow-runner/test/sandbox.test.ts +126 -0
  83. package/plugins/workflow-runner/test/scheduler.test.ts +70 -0
  84. package/plugins/workflow-runner/test/scriptGuard.test.ts +276 -0
  85. package/plugins/workflow-runner/test/skillDocSync.test.ts +78 -0
  86. package/plugins/workflow-runner/test/taskIdentity.test.ts +288 -179
  87. package/plugins/workflow-runner/test/workflowFingerprint.test.ts +106 -0
  88. package/plugins/workflow-runner/test/workflowState.test.ts +429 -0
  89. package/skills/pptx/examples/assets/cover-bg.svg +23 -0
  90. package/skills/pptx/examples/assets/icon-spark.svg +5 -0
  91. package/skills/ui-design/SKILL.md +5 -2
  92. package/skills/ui-design/references/layout-composition.md +1 -1
  93. package/skills/workflow-creator/SKILL.md +344 -0
  94. package/skills/workflow-creator/assets/template/workflow.mjs +48 -0
  95. package/skills/workflow-creator/references/api.md +216 -0
  96. package/skills/workflow-creator/references/migration.md +103 -0
  97. package/skills/workflow-creator/references/patterns.md +779 -0
  98. package/skills/workflow-creator/scripts/list-resources.mjs +205 -0
  99. package/skills/workflow-creator/scripts/scaffold.mjs +148 -0
  100. package/skills/workflow-creator/scripts/validate.mjs +275 -0
  101. package/skills/workflow-creator/scripts/workflow-creator.test.mjs +82 -0
  102. package/src/advisor/advisorCoordinator.js +536 -0
  103. package/src/advisor/advisorCoordinator.ts +693 -0
  104. package/src/cli/configMenu.tsx +0 -1
  105. package/src/cli/print.js +27 -6
  106. package/src/cli/print.ts +48 -4
  107. package/src/cli/quickModelSetup.js +12 -1
  108. package/src/cli/quickModelSetup.tsx +15 -3
  109. package/src/cli/streamJson.js +5 -6
  110. package/src/cli/streamJson.ts +8 -4
  111. package/src/cli/wizards/advisorWizard.js +4 -2
  112. package/src/cli/wizards/advisorWizard.tsx +8 -2
  113. package/src/cli/wizards/contextAdvisorWizard.js +5 -4
  114. package/src/cli/wizards/contextAdvisorWizard.tsx +7 -6
  115. package/src/cli/wizards/providerPresets.js +18 -8
  116. package/src/cli/wizards/providerPresets.ts +18 -8
  117. package/src/collaboration/taskFlow.js +115 -0
  118. package/src/collaboration/taskFlow.ts +169 -0
  119. package/src/config/configDefaults.js +41 -1
  120. package/src/config/configDefaults.ts +43 -1
  121. package/src/config/configDiagnostics.ts +2 -2
  122. package/src/config/configFile.js +40 -9
  123. package/src/config/configFile.ts +60 -11
  124. package/src/config/configService.js +419 -74
  125. package/src/config/configService.ts +703 -145
  126. package/src/config/numericLimits.js +22 -0
  127. package/src/config/numericLimits.ts +24 -0
  128. package/src/config.js +1 -0
  129. package/src/config.ts +3 -2
  130. package/src/context/budgetPlan.js +1 -1
  131. package/src/context/budgetPlan.ts +1 -1
  132. package/src/context/compact.js +7 -2
  133. package/src/context/compact.ts +9 -2
  134. package/src/context/microCompactLite.js +212 -13
  135. package/src/context/microCompactLite.ts +261 -12
  136. package/src/context/sessionRegistry.js +8 -1
  137. package/src/context/sessionRegistry.ts +18 -5
  138. package/src/context/toolResultArchive.js +72 -0
  139. package/src/context/toolResultArchive.ts +95 -0
  140. package/src/goal/errors.js +8 -0
  141. package/src/goal/errors.ts +18 -0
  142. package/src/goal/goalRuntime.js +344 -0
  143. package/src/goal/goalRuntime.ts +466 -0
  144. package/src/goal/goalStore.js +200 -0
  145. package/src/goal/goalStore.ts +219 -0
  146. package/src/goal/index.js +4 -0
  147. package/src/goal/index.ts +4 -0
  148. package/src/goal/statusMapping.js +71 -0
  149. package/src/goal/statusMapping.ts +95 -0
  150. package/src/goal/types.js +7 -0
  151. package/src/goal/types.ts +179 -0
  152. package/src/goal/workflowController.js +306 -0
  153. package/src/goal/workflowController.ts +360 -0
  154. package/src/harness/evidenceLedger.js +2 -0
  155. package/src/harness/evidenceLedger.ts +1 -0
  156. package/src/harness/stallGuard.js +9 -3
  157. package/src/harness/stallGuard.ts +7 -3
  158. package/src/images/imageResolver.js +161 -0
  159. package/src/images/imageResolver.ts +189 -0
  160. package/src/infra/verification.js +34 -5
  161. package/src/infra/verification.ts +39 -4
  162. package/src/llm/client.js +79 -21
  163. package/src/llm/client.ts +182 -35
  164. package/src/llm/gatewayClient.js +201 -0
  165. package/src/llm/gatewayClient.ts +299 -0
  166. package/src/llm/messageProvenance.js +46 -0
  167. package/src/llm/messageProvenance.ts +58 -0
  168. package/src/llm/modelProvider.js +1 -0
  169. package/src/llm/modelProvider.ts +22 -0
  170. package/src/llm/providers/anthropicFormat.js +108 -1
  171. package/src/llm/providers/anthropicFormat.ts +115 -4
  172. package/src/llm/providers/openaiFormat.js +9 -0
  173. package/src/llm/providers/openaiFormat.ts +12 -3
  174. package/src/loop.js +328 -55
  175. package/src/loop.ts +382 -58
  176. package/src/main.js +4 -1
  177. package/src/main.tsx +4 -1
  178. package/src/managedExecution/index.js +2 -0
  179. package/src/managedExecution/index.ts +2 -0
  180. package/src/managedExecution/registry.js +15 -0
  181. package/src/managedExecution/registry.ts +20 -0
  182. package/src/managedExecution/types.js +1 -0
  183. package/src/managedExecution/types.ts +86 -0
  184. package/src/modelRef.js +9 -0
  185. package/src/modelRef.ts +31 -0
  186. package/src/multimodal.js +14 -28
  187. package/src/multimodal.ts +17 -33
  188. package/src/net/lanDiscovery.js +65 -0
  189. package/src/net/lanDiscovery.ts +82 -0
  190. package/src/plugin-sdk.js +28 -3
  191. package/src/plugin-sdk.ts +39 -6
  192. package/src/plugins/pluginApi.ts +16 -1
  193. package/src/plugins/pluginLoader.js +4 -0
  194. package/src/plugins/pluginLoader.ts +6 -0
  195. package/src/plugins/pluginRunner.js +139 -7
  196. package/src/plugins/pluginRunner.ts +173 -9
  197. package/src/plugins/slashFallback.js +113 -0
  198. package/src/plugins/slashFallback.ts +137 -0
  199. package/src/prompts/policyRegistry.js +12 -32
  200. package/src/prompts/policyRegistry.ts +15 -32
  201. package/src/prompts/promptAssembly.js +103 -12
  202. package/src/prompts/promptAssembly.ts +114 -12
  203. package/src/prompts/skillList.js +21 -3
  204. package/src/prompts/skillList.ts +27 -2
  205. package/src/prompts/stableSystemPrompt.js +18 -0
  206. package/src/prompts/stableSystemPrompt.ts +33 -0
  207. package/src/runtime/agentRuntimeContext.js +8 -2
  208. package/src/runtime/agentRuntimeContext.ts +17 -4
  209. package/src/session/runAgentTurn.js +78 -12
  210. package/src/session/runAgentTurn.ts +105 -23
  211. package/src/session/runTurn.js +10 -9
  212. package/src/session/runTurn.ts +17 -8
  213. package/src/session/sessionState.ts +2 -0
  214. package/src/team/auth.js +186 -0
  215. package/src/team/auth.ts +298 -0
  216. package/src/team/cli.js +105 -0
  217. package/src/team/cli.ts +122 -0
  218. package/src/team/onlineToolContract.js +64 -0
  219. package/src/team/onlineToolContract.ts +109 -0
  220. package/src/team/toolPolicy.js +36 -0
  221. package/src/team/toolPolicy.ts +75 -0
  222. package/src/tools/advisor/advisor.js +115 -50
  223. package/src/tools/advisor/advisor.ts +124 -51
  224. package/src/tools/advisor/advisorDecision.js +71 -0
  225. package/src/tools/advisor/advisorDecision.ts +85 -0
  226. package/src/tools/agent/agent.js +18 -5
  227. package/src/tools/agent/agent.ts +21 -7
  228. package/src/tools/agent/agentControl.js +246 -0
  229. package/src/tools/agent/agentControl.ts +284 -0
  230. package/src/tools/agent/agentTaskService.js +40 -1
  231. package/src/tools/agent/agentTaskService.ts +44 -1
  232. package/src/tools/agent/agentTypes.js +14 -2
  233. package/src/tools/agent/agentTypes.ts +15 -2
  234. package/src/tools/applypatch/applyPatch.js +362 -0
  235. package/src/tools/applypatch/applyPatch.ts +428 -0
  236. package/src/tools/bash/bash.js +22 -15
  237. package/src/tools/bash/bash.ts +23 -17
  238. package/src/tools/capabilities.js +10 -5
  239. package/src/tools/capabilities.ts +10 -5
  240. package/src/tools/computeruse/computerIntent.js +32 -0
  241. package/src/tools/computeruse/computerIntent.ts +46 -0
  242. package/src/tools/computeruse/telemetryLog.js +12 -0
  243. package/src/tools/computeruse/telemetryLog.ts +16 -0
  244. package/src/tools/computeruse/vision/telemetry.js +1 -0
  245. package/src/tools/computeruse/vision/telemetry.ts +1 -0
  246. package/src/tools/effectiveToolSet.js +4 -0
  247. package/src/tools/effectiveToolSet.ts +4 -0
  248. package/src/tools/index.js +21 -2
  249. package/src/tools/index.ts +33 -2
  250. package/src/tools/presentresult/presentresult.js +6 -15
  251. package/src/tools/presentresult/presentresult.ts +6 -15
  252. package/src/tools/read/read.js +62 -9
  253. package/src/tools/read/read.ts +63 -9
  254. package/src/tools/shared/fileUtils.js +1 -2
  255. package/src/tools/shared/fileUtils.ts +1 -2
  256. package/src/tools/shared/toolOutputStore.js +23 -1
  257. package/src/tools/shared/toolOutputStore.ts +22 -1
  258. package/src/tools/skill/skill.js +9 -3
  259. package/src/tools/skill/skill.ts +8 -4
  260. package/src/tools/toolPromptGuides.js +125 -0
  261. package/src/tools/toolPromptGuides.ts +146 -0
  262. package/src/tools/webbrowser/agentBrowserPath.js +19 -9
  263. package/src/tools/webbrowser/agentBrowserPath.ts +70 -28
  264. package/src/tools/webbrowser/browser.js +27 -11
  265. package/src/tools/webbrowser/browser.ts +68 -24
  266. package/src/tools/webbrowser/browserAutomation.js +329 -0
  267. package/src/tools/webbrowser/browserAutomation.ts +467 -0
  268. package/src/tools/webbrowser/browserAxState.js +97 -0
  269. package/src/tools/webbrowser/browserAxState.ts +142 -0
  270. package/src/tools/webbrowser/browserBatch.js +1578 -0
  271. package/src/tools/webbrowser/browserBatch.ts +2382 -0
  272. package/src/tools/webbrowser/browserCdp.js +208 -0
  273. package/src/tools/webbrowser/browserCdp.ts +255 -0
  274. package/src/tools/webbrowser/browserConditions.js +24 -0
  275. package/src/tools/webbrowser/browserConditions.ts +45 -0
  276. package/src/tools/webbrowser/browserContent.js +281 -0
  277. package/src/tools/webbrowser/browserContent.ts +438 -0
  278. package/src/tools/webbrowser/browserControl.js +131 -34
  279. package/src/tools/webbrowser/browserControl.ts +210 -56
  280. package/src/tools/webbrowser/browserDaemon.js +22 -14
  281. package/src/tools/webbrowser/browserDaemon.ts +54 -21
  282. package/src/tools/webbrowser/browserFrames.js +47 -0
  283. package/src/tools/webbrowser/browserFrames.ts +54 -0
  284. package/src/tools/webbrowser/browserInteractionResolver.js +17 -0
  285. package/src/tools/webbrowser/browserInteractionResolver.ts +40 -0
  286. package/src/tools/webbrowser/browserLocator.js +140 -0
  287. package/src/tools/webbrowser/browserLocator.ts +194 -0
  288. package/src/tools/webbrowser/browserOutcome.js +10 -17
  289. package/src/tools/webbrowser/browserOutcome.ts +48 -31
  290. package/src/tools/webbrowser/browserRecovery.js +58 -0
  291. package/src/tools/webbrowser/browserRecovery.ts +83 -0
  292. package/src/tools/webbrowser/browserRunRegistry.js +35 -3
  293. package/src/tools/webbrowser/browserRunRegistry.ts +91 -15
  294. package/src/tools/webbrowser/browserService.js +28 -2
  295. package/src/tools/webbrowser/browserService.ts +49 -9
  296. package/src/tools/webbrowser/browserStream.js +132 -33
  297. package/src/tools/webbrowser/browserStream.ts +224 -50
  298. package/src/tools/webbrowser/browserTabs.js +48 -15
  299. package/src/tools/webbrowser/browserTabs.ts +178 -96
  300. package/src/tools/webbrowser/webbrowser.js +679 -144
  301. package/src/tools/webbrowser/webbrowser.ts +975 -236
  302. package/src/tools/webfetch/preapproved.js +0 -2
  303. package/src/tools/webfetch/preapproved.ts +0 -2
  304. package/src/tools/websearch/websearch.js +129 -8
  305. package/src/tools/websearch/websearch.ts +138 -6
  306. package/src/types.ts +459 -40
  307. package/src/ui/App.js +377 -58
  308. package/src/ui/App.tsx +576 -111
  309. package/src/ui/LiveArea.js +14 -8
  310. package/src/ui/LiveArea.tsx +14 -10
  311. package/src/ui/MessageList.js +63 -20
  312. package/src/ui/MessageList.tsx +101 -16
  313. package/src/ui/ModelPicker.js +7 -4
  314. package/src/ui/ModelPicker.tsx +55 -8
  315. package/src/ui/hooks/useChat.js +152 -163
  316. package/src/ui/hooks/useChat.ts +396 -334
  317. package/src/ui/loginCommand.js +56 -0
  318. package/src/ui/loginCommand.ts +63 -0
  319. package/src/ui/toolProgress.js +41 -0
  320. package/src/ui/toolProgress.ts +44 -0
  321. package/src/web/browserBridge.js +20 -2
  322. package/src/web/browserBridge.ts +20 -2
  323. package/src/web/protocol.ts +1897 -194
  324. package/workflows/adaptive-research/workflow.mjs +86 -0
  325. package/workflows/e2e-capabilities/workflow.mjs +102 -0
  326. package/workflows/e2e-llm/workflow.mjs +52 -0
  327. package/workflows/e2e-smoke/workflow.mjs +59 -0
  328. package/workflows/e2e-vision-schema/README.md +48 -0
  329. package/workflows/e2e-vision-schema/workflow.mjs +149 -0
  330. package/workflows/e2e-write-greet/workflow.mjs +37 -0
  331. package/workflows/file-census/README.md +14 -0
  332. package/workflows/file-census/scripts/.gitkeep +2 -0
  333. package/workflows/file-census/workflow.mjs +110 -0
  334. package/workflows/goal/README.md +166 -0
  335. package/workflows/goal/prompts/audit.md +57 -0
  336. package/workflows/goal/prompts/contract.md +56 -0
  337. package/workflows/goal/prompts/iterate.md +37 -0
  338. package/workflows/goal/workflow.mjs +501 -0
  339. package/workflows/illustrate/README.md +90 -0
  340. package/workflows/illustrate/assets/engines.json +20 -0
  341. package/workflows/illustrate/assets/extract-baidu.js +21 -0
  342. package/workflows/illustrate/assets/extract-bing.js +33 -0
  343. package/workflows/illustrate/assets/extract-google.js +31 -0
  344. package/workflows/illustrate/workflow.mjs +301 -0
  345. package/workflows/plan/workflow.mjs +389 -0
  346. package/workflows/question-crops/README.md +35 -0
  347. package/workflows/question-crops/prompts/inventory.md +23 -0
  348. package/workflows/question-crops/scripts/image-ops.mjs +305 -0
  349. package/workflows/question-crops/scripts/image-ops.test.mjs +95 -0
  350. package/workflows/question-crops/workflow.mjs +172 -0
  351. package/workflows/ralph-loop/workflow.mjs +162 -0
  352. package/workflows/research/README.md +74 -0
  353. package/workflows/research/prompts/s0-goal.md +43 -0
  354. package/workflows/research/prompts/s1-early-exit.md +22 -0
  355. package/workflows/research/prompts/s1-map.md +58 -0
  356. package/workflows/research/prompts/s2-options.md +53 -0
  357. package/workflows/research/prompts/s3-deep-dive.md +56 -0
  358. package/workflows/research/prompts/s4-verify.md +74 -0
  359. package/workflows/research/prompts/s5-synthesis.md +81 -0
  360. package/workflows/research/prompts/s5b-fill-gaps.md +32 -0
  361. package/workflows/research/prompts/s6-package.md +32 -0
  362. package/workflows/research/scripts/build-report.mjs +98 -0
  363. package/workflows/research/workflow.mjs +288 -0
  364. package/workflows/wechat-reading-shots/prompts/collect-params.md +16 -0
  365. package/workflows/wechat-reading-shots/prompts/evaluate.md +20 -0
  366. package/workflows/wechat-reading-shots/prompts/open-book.md +28 -0
  367. package/workflows/wechat-reading-shots/prompts/read-page.md +13 -0
  368. package/workflows/wechat-reading-shots/prompts/turn-batch.md +24 -0
  369. package/workflows/wechat-reading-shots/test/control-flow.test.ts +329 -0
  370. package/workflows/wechat-reading-shots/workflow.mjs +266 -0
  371. package/workflows/wrong-question-docx/README.md +55 -0
  372. package/workflows/wrong-question-docx/prompts/figure-qa.md +8 -0
  373. package/workflows/wrong-question-docx/prompts/transcribe.md +25 -0
  374. package/workflows/wrong-question-docx/scripts/workbook.mjs +857 -0
  375. package/workflows/wrong-question-docx/test/control-flow.test.ts +165 -0
  376. package/workflows/wrong-question-docx/test/workbook.test.mjs +303 -0
  377. package/workflows/wrong-question-docx/workflow.mjs +485 -0
  378. package/plugins/workflow-runner/src/agentCommon.js +0 -354
  379. package/plugins/workflow-runner/src/agentCommon.ts +0 -435
  380. package/plugins/workflow-runner/src/controlFlow/branch.js +0 -40
  381. package/plugins/workflow-runner/src/controlFlow/branch.ts +0 -46
  382. package/plugins/workflow-runner/src/controlFlow/loop.js +0 -211
  383. package/plugins/workflow-runner/src/controlFlow/loop.ts +0 -248
  384. package/plugins/workflow-runner/src/controlFlow/pause.js +0 -129
  385. package/plugins/workflow-runner/src/controlFlow/pause.ts +0 -141
  386. package/plugins/workflow-runner/src/controlFlow/signal.js +0 -21
  387. package/plugins/workflow-runner/src/controlFlow/signal.ts +0 -29
  388. package/plugins/workflow-runner/src/controlFlow/types.js +0 -18
  389. package/plugins/workflow-runner/src/controlFlow/types.ts +0 -63
  390. package/plugins/workflow-runner/src/dslManifest.js +0 -72
  391. package/plugins/workflow-runner/src/dslManifest.ts +0 -127
  392. package/plugins/workflow-runner/src/expressions.js +0 -639
  393. package/plugins/workflow-runner/src/expressions.ts +0 -640
  394. package/plugins/workflow-runner/src/loader.js +0 -573
  395. package/plugins/workflow-runner/src/loader.ts +0 -721
  396. package/plugins/workflow-runner/src/multimodal.js +0 -38
  397. package/plugins/workflow-runner/src/multimodal.ts +0 -64
  398. package/plugins/workflow-runner/src/recovery.js +0 -126
  399. package/plugins/workflow-runner/src/recovery.ts +0 -156
  400. package/plugins/workflow-runner/src/stepExecutors/agent.js +0 -173
  401. package/plugins/workflow-runner/src/stepExecutors/agent.ts +0 -234
  402. package/plugins/workflow-runner/src/stepExecutors/assert.js +0 -42
  403. package/plugins/workflow-runner/src/stepExecutors/assert.ts +0 -52
  404. package/plugins/workflow-runner/src/stepExecutors/echo.js +0 -31
  405. package/plugins/workflow-runner/src/stepExecutors/echo.ts +0 -38
  406. package/plugins/workflow-runner/src/stepExecutors/llm.js +0 -99
  407. package/plugins/workflow-runner/src/stepExecutors/llm.ts +0 -133
  408. package/plugins/workflow-runner/src/stepExecutors/set.js +0 -49
  409. package/plugins/workflow-runner/src/stepExecutors/set.ts +0 -56
  410. package/plugins/workflow-runner/src/stepExecutors/skill.js +0 -111
  411. package/plugins/workflow-runner/src/stepExecutors/skill.ts +0 -140
  412. package/plugins/workflow-runner/src/stepExecutors/tool.js +0 -227
  413. package/plugins/workflow-runner/src/stepExecutors/tool.ts +0 -274
  414. package/plugins/workflow-runner/src/stepExecutors/verify.js +0 -61
  415. package/plugins/workflow-runner/src/stepExecutors/verify.ts +0 -72
  416. package/plugins/workflow-runner/src/stepPipeline.js +0 -277
  417. package/plugins/workflow-runner/src/stepPipeline.ts +0 -366
  418. package/plugins/workflow-runner/test/agent.test.ts +0 -587
  419. package/plugins/workflow-runner/test/agentLlmError.test.ts +0 -373
  420. package/plugins/workflow-runner/test/bashBlacklist.sweep.test.ts +0 -65
  421. package/plugins/workflow-runner/test/captureMisbind.test.ts +0 -99
  422. package/plugins/workflow-runner/test/cli.e2e.test.ts +0 -167
  423. package/plugins/workflow-runner/test/context-files.test.ts +0 -320
  424. package/plugins/workflow-runner/test/e2e.test.ts +0 -370
  425. package/plugins/workflow-runner/test/e2eNewLayout.test.ts +0 -314
  426. package/plugins/workflow-runner/test/engineRobustness.test.ts +0 -234
  427. package/plugins/workflow-runner/test/expressions.test.ts +0 -439
  428. package/plugins/workflow-runner/test/foundation.test.ts +0 -126
  429. package/plugins/workflow-runner/test/graceful.test.ts +0 -139
  430. package/plugins/workflow-runner/test/greedyInputs.load.test.ts +0 -47
  431. package/plugins/workflow-runner/test/hostCapability.test.ts +0 -108
  432. package/plugins/workflow-runner/test/illustrate.load.test.ts +0 -183
  433. package/plugins/workflow-runner/test/jsonPayload.test.ts +0 -83
  434. package/plugins/workflow-runner/test/loader.test.ts +0 -617
  435. package/plugins/workflow-runner/test/maxTurnsRetryDelay.test.ts +0 -33
  436. package/plugins/workflow-runner/test/multimodal.test.ts +0 -342
  437. package/plugins/workflow-runner/test/output-schema.test.ts +0 -213
  438. package/plugins/workflow-runner/test/parseWorkflowArgs.test.ts +0 -106
  439. package/plugins/workflow-runner/test/pluginRunner.isolation.test.ts +0 -269
  440. package/plugins/workflow-runner/test/ppt.load.test.ts +0 -1220
  441. package/plugins/workflow-runner/test/ralphLoop.e2e.test.ts +0 -221
  442. package/plugins/workflow-runner/test/recovery.test.ts +0 -265
  443. package/plugins/workflow-runner/test/research.load.test.ts +0 -328
  444. package/plugins/workflow-runner/test/runner.test.ts +0 -911
  445. package/plugins/workflow-runner/test/runnerPreflight.test.ts +0 -436
  446. package/plugins/workflow-runner/test/skillTurnDone.test.ts +0 -71
  447. package/plugins/workflow-runner/test/stateLifecycle.test.ts +0 -198
  448. package/plugins/workflow-runner/test/stepPipeline.test.ts +0 -114
  449. package/plugins/workflow-runner/test/taskArbitration.test.ts +0 -354
  450. package/plugins/workflow-runner/test/taskLifecycle.test.ts +0 -324
  451. package/plugins/workflow-runner/test/toolArtifactOverwrite.test.ts +0 -221
  452. package/plugins/workflow-runner/test/toolCapabilityBoundary.test.ts +0 -29
  453. package/plugins/workflow-runner/test/toolRuntimeIntegration.test.ts +0 -168
  454. package/plugins/workflow-runner/test/webppt.load.test.ts +0 -250
  455. package/plugins/workflow-runner/test/word.load.test.ts +0 -208
  456. package/plugins/workflow-runner/test/workflows.smoke.test.ts +0 -76
  457. package/plugins/workflow-runner/test/yamlGuardConditions.test.ts +0 -207
  458. package/src/advisorState.js +0 -22
  459. package/src/cli/configWizard.js +0 -293
  460. package/src/tools/toolProgressBridge.js +0 -48
  461. package/workflows/adaptive-research.yaml +0 -50
  462. package/workflows/book-review-short.yaml +0 -125
  463. package/workflows/e2e-write-greet.yaml +0 -31
  464. package/workflows/illustrate.yaml +0 -227
  465. package/workflows/plan.yaml +0 -470
  466. package/workflows/ppt.yaml +0 -1670
  467. package/workflows/ralph-loop.yaml +0 -201
  468. package/workflows/research.yaml +0 -873
  469. package/workflows/schema.json +0 -176
  470. package/workflows/webppt.yaml +0 -496
  471. package/workflows/wechat-reading-shots.yaml +0 -315
  472. package/workflows/word.yaml +0 -720
  473. package/workflows/youtube-shorts.yaml +0 -202
  474. /package/workflows/{research.md → research/DESIGN.md} +0 -0
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 { buildBaseSystemPrompt, buildTransientPromptBundle } from '../prompts/system.js';
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';
@@ -145,6 +147,10 @@ export function emitJsonResult(result, sessionFile) {
145
147
  error: result.error,
146
148
  completionStatus,
147
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 } : {}),
148
154
  deliverables,
149
155
  verification: allVerified ? 'passed' : deliverables.length > 0 ? 'not_run' : 'none',
150
156
  warnings,
@@ -274,13 +280,10 @@ export async function runPrintMode(provider, args, initialHistory, options) {
274
280
  memoryAccess: options.memoryAccess ?? 'read-only',
275
281
  interactiveAsk: false,
276
282
  computer: computerRun,
283
+ computerIntent: classifyComputerAutomationIntent(prompt, sessionState.computerAutomation),
277
284
  });
278
285
  const turnTools = filterToolsForRuntime(ALL_TOOLS, runtimeContext);
279
- const stablePrompt = await buildBaseSystemPrompt(cwd, turnTools);
280
- if (history[0]?.role === 'system')
281
- history[0] = { ...history[0], content: stablePrompt };
282
- else
283
- history.unshift({ role: 'system', content: stablePrompt });
286
+ await refreshStableSystemPrompt(history, cwd, turnTools);
284
287
  const transientBundle = await buildTransientPromptBundle({
285
288
  cwd,
286
289
  tools: turnTools,
@@ -362,6 +365,10 @@ export function handleEvent(event, result, verbose, outputFormat = 'text') {
362
365
  // 一轮 assistant 消息完整组装 → 回合计数 +1(json 契约的 num_turns)
363
366
  result.numTurns++;
364
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 {};
365
372
  case 'tool_start':
366
373
  if (verbose) {
367
374
  process.stderr.write(`\n🔧 工具: ${event.toolName}(${event.argsPreview})\n`);
@@ -421,6 +428,10 @@ export function handleEvent(event, result, verbose, outputFormat = 'text') {
421
428
  // 宿主收到的 JSON 与一切正常逐字节相同,唯一线索只剩 stderr 上一行中文。
422
429
  if (event.completionStatus)
423
430
  result.deliveryStatus = event.completionStatus;
431
+ // 托管运行时的生命周期状态(goal 等)。同上:读了就必须输出,
432
+ // 否则「Agent 自检通过但还没人验收」在宿主眼里与「办完了」逐字节相同。
433
+ if (event.managedStatus)
434
+ result.goalStatus = event.managedStatus;
424
435
  if (!isJson && !verbose)
425
436
  console.log(result.buffer);
426
437
  return {};
@@ -452,6 +463,16 @@ export function handleEvent(event, result, verbose, outputFormat = 'text') {
452
463
  if (isJson)
453
464
  result.stopReason = 'interrupted';
454
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
+ }
455
476
  // 已知但 -p 模式无需呈现的框架事件:显式忽略,好让 default 只剩"真正未知"的插件私有事件。
456
477
  case 'user_message_committed':
457
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 { buildBaseSystemPrompt, buildTransientPromptBundle } from '../prompts/system.js';
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,
@@ -107,6 +109,17 @@ export interface PrintResult {
107
109
  * 成功的验证记录 —— 是重不重要全看它能不能过进程边界。
108
110
  */
109
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;
110
123
  }
111
124
 
112
125
  /** handleEvent 返回的结构 */
@@ -238,6 +251,10 @@ export function emitJsonResult(result: PrintResult, sessionFile?: string): void
238
251
  error: result.error,
239
252
  completionStatus,
240
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 } : {}),
241
258
  deliverables,
242
259
  verification: allVerified ? 'passed' : deliverables.length > 0 ? 'not_run' : 'none',
243
260
  warnings,
@@ -376,11 +393,13 @@ export async function runPrintMode(
376
393
  memoryAccess: options.memoryAccess ?? 'read-only',
377
394
  interactiveAsk: false,
378
395
  computer: computerRun,
396
+ computerIntent: classifyComputerAutomationIntent(
397
+ prompt,
398
+ sessionState.computerAutomation,
399
+ ),
379
400
  });
380
401
  const turnTools = filterToolsForRuntime(ALL_TOOLS, runtimeContext);
381
- const stablePrompt = await buildBaseSystemPrompt(cwd, turnTools);
382
- if (history[0]?.role === 'system') history[0] = { ...history[0], content: stablePrompt };
383
- else history.unshift({ role: 'system', content: stablePrompt });
402
+ await refreshStableSystemPrompt(history, cwd, turnTools);
384
403
  const transientBundle = await buildTransientPromptBundle({
385
404
  cwd,
386
405
  tools: turnTools,
@@ -475,6 +494,14 @@ export function handleEvent(
475
494
  result.numTurns++;
476
495
  return {};
477
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
+
478
505
  case 'tool_start':
479
506
  if (verbose) {
480
507
  process.stderr.write(`\n🔧 工具: ${event.toolName}(${event.argsPreview})\n`);
@@ -540,6 +567,9 @@ export function handleEvent(
540
567
  // 内核的交付判定必须过进程边界:模型谎称「已验证」时,若不记这一笔,
541
568
  // 宿主收到的 JSON 与一切正常逐字节相同,唯一线索只剩 stderr 上一行中文。
542
569
  if (event.completionStatus) result.deliveryStatus = event.completionStatus;
570
+ // 托管运行时的生命周期状态(goal 等)。同上:读了就必须输出,
571
+ // 否则「Agent 自检通过但还没人验收」在宿主眼里与「办完了」逐字节相同。
572
+ if (event.managedStatus) result.goalStatus = event.managedStatus;
543
573
  if (!isJson && !verbose) console.log(result.buffer);
544
574
  return {};
545
575
 
@@ -572,6 +602,20 @@ export function handleEvent(
572
602
  if (isJson) result.stopReason = 'interrupted';
573
603
  return {};
574
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
+
575
619
  // 已知但 -p 模式无需呈现的框架事件:显式忽略,好让 default 只剩"真正未知"的插件私有事件。
576
620
  case 'user_message_committed':
577
621
  case 'tool_messages_committed':
@@ -9,10 +9,17 @@ export function QuickModelSetup({ onDone }) {
9
9
  const [adding, setAdding] = useState(false);
10
10
  const [readOnly, setReadOnly] = useState(false);
11
11
  const [message, setMessage] = useState(null);
12
+ // config.json 与 env 都不存在时 reload() 返回 config:null——这是唯一能安全
13
+ // 区分「本机从未配置过」与「配置存在但暂无可用模型」的信号。只在前者把
14
+ // 内置浏览器的 CLI 默认值显式落盘为关闭(见 DEFAULT_BROWSER_CONFIG 的注释:
15
+ // 这个共享常量本身仍是 true,Desktop 走同一常量不受影响;只有 CLI 首次建档
16
+ // 这一次性写入路径改默认)。
17
+ const [freshInstall, setFreshInstall] = useState(false);
12
18
  useEffect(() => {
13
19
  void configService.reload().then((snapshot) => {
14
20
  setReadOnly(snapshot.readOnly);
15
21
  setModels(snapshot.config?.models ?? []);
22
+ setFreshInstall(snapshot.config === null);
16
23
  });
17
24
  }, []);
18
25
  useInput((input, key) => {
@@ -50,7 +57,11 @@ export function QuickModelSetup({ onDone }) {
50
57
  return (_jsxs(Box, { flexDirection: "column", paddingX: 1, children: [_jsx(Text, { color: "yellow", bold: true, children: "\u5F53\u524D\u4E3A\u73AF\u5883\u53D8\u91CF\u53EA\u8BFB\u914D\u7F6E\uFF0C\u4F46\u6CA1\u6709\u53EF\u7528\u57FA\u5EA7\u6A21\u578B" }), _jsx(Text, { children: "\u8BF7\u68C0\u67E5 MINIMAL_AGENT_BASE_URL\u3001MINIMAL_AGENT_API_KEY \u548C MINIMAL_AGENT_MODEL\uFF0C\u7136\u540E\u91CD\u65B0\u542F\u52A8\u3002" })] }));
51
58
  if (adding)
52
59
  return (_jsx(ProviderWizard, { quick: true, setAsBase: true, onDone: () => {
53
- void configService.provider().then((provider) => {
60
+ void (freshInstall
61
+ ? configService.savePatch({ browser: { enabled: false } })
62
+ : Promise.resolve())
63
+ .then(() => configService.provider())
64
+ .then((provider) => {
54
65
  if (provider)
55
66
  onDone(provider);
56
67
  });
@@ -16,10 +16,17 @@ export function QuickModelSetup({ onDone }: Props): JSX.Element {
16
16
  const [adding, setAdding] = useState(false);
17
17
  const [readOnly, setReadOnly] = useState(false);
18
18
  const [message, setMessage] = useState<string | null>(null);
19
+ // config.json 与 env 都不存在时 reload() 返回 config:null——这是唯一能安全
20
+ // 区分「本机从未配置过」与「配置存在但暂无可用模型」的信号。只在前者把
21
+ // 内置浏览器的 CLI 默认值显式落盘为关闭(见 DEFAULT_BROWSER_CONFIG 的注释:
22
+ // 这个共享常量本身仍是 true,Desktop 走同一常量不受影响;只有 CLI 首次建档
23
+ // 这一次性写入路径改默认)。
24
+ const [freshInstall, setFreshInstall] = useState(false);
19
25
  useEffect(() => {
20
26
  void configService.reload().then((snapshot) => {
21
27
  setReadOnly(snapshot.readOnly);
22
28
  setModels(snapshot.config?.models ?? []);
29
+ setFreshInstall(snapshot.config === null);
23
30
  });
24
31
  }, []);
25
32
  useInput((input, key) => {
@@ -63,9 +70,14 @@ export function QuickModelSetup({ onDone }: Props): JSX.Element {
63
70
  quick
64
71
  setAsBase
65
72
  onDone={() => {
66
- void configService.provider().then((provider) => {
67
- if (provider) onDone(provider);
68
- });
73
+ void (freshInstall
74
+ ? configService.savePatch({ browser: { enabled: false } })
75
+ : Promise.resolve()
76
+ )
77
+ .then(() => configService.provider())
78
+ .then((provider) => {
79
+ if (provider) onDone(provider);
80
+ });
69
81
  }}
70
82
  onCancel={() => setAdding(false)}
71
83
  />
@@ -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 { buildBaseSystemPrompt, buildTransientPromptBundle } from '../prompts/system.js';
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
- const stablePrompt = await buildBaseSystemPrompt(cwd, turnTools);
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,
@@ -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 { buildBaseSystemPrompt, buildTransientPromptBundle } from '../prompts/system.js';
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
- const stablePrompt = await buildBaseSystemPrompt(cwd, turnTools);
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 ?? 180_000) / 1000)),
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: Math.min(180_000, Math.max(15_000, parsePositiveInt(values.timeoutSeconds, 180) * 1000)),
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 ?? 180_000) / 1000)),
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: Math.min(180_000, Math.max(15_000, parsePositiveInt(values.timeoutSeconds, 180) * 1000)),
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 ?? 128_000),
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 ?? 180_000) / 1000)),
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, 128_000), CONFIG_LIMITS.advisorInputTokenBudget, 128_000),
77
- timeoutMs: normalizeLimited(numberValue(values.timeoutSeconds, 180) * 1000, CONFIG_LIMITS.advisorTimeoutMs, 180_000),
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 ?? 128_000),
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 ?? 180_000) / 1000)),
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, 128_000),
107
+ numberValue(values.inputTokenBudget, DEFAULT_ADVISOR_CONFIG.inputTokenBudget),
107
108
  CONFIG_LIMITS.advisorInputTokenBudget,
108
- 128_000,
109
+ DEFAULT_ADVISOR_CONFIG.inputTokenBudget,
109
110
  ),
110
111
  timeoutMs: normalizeLimited(
111
- numberValue(values.timeoutSeconds, 180) * 1000,
112
+ numberValue(values.timeoutSeconds, DEFAULT_ADVISOR_CONFIG.timeoutMs / 1000) * 1000,
112
113
  CONFIG_LIMITS.advisorTimeoutMs,
113
- 180_000,
114
+ DEFAULT_ADVISOR_CONFIG.timeoutMs,
114
115
  ),
115
116
  shareSensitive: values.shareSensitive === true,
116
117
  }
@@ -20,22 +20,32 @@ export const PRESETS = [
20
20
  },
21
21
  {
22
22
  // 火山方舟 ARK Coding Plan —— 一个 endpoint 后挂多个 model id,
23
- // model 字段大小写严格匹配('glm-5.1' 而非 'GLM-5.1')。
23
+ // model 字段大小写严格匹配('glm-5.3' 而非 'GLM-5.3')。
24
+ // ⚠️ 必须是 /api/coding/v3/(Coding Plan 折扣路由),不是 /api/v3/
25
+ // (官网原价路由)——控制台原文明确警告后者「会产生额外费用」。
26
+ // 2026-09 按控制台最新模型列表刷新(原列表含已下线的 doubao-seed-2.0-pro/
27
+ // doubao-seed-code/glm-5.1/minimax-latest/deepseek-v3.2/kimi-k2.6)。
24
28
  name: 'volces',
25
29
  label: '火山方舟 Coding Plan (ARK)',
26
30
  baseURL: 'https://ark.cn-beijing.volces.com/api/coding/v3/chat/completions',
27
31
  models: [
28
- 'doubao-seed-2.0-pro',
29
- 'doubao-seed-2.0-code',
30
- 'doubao-seed-code',
31
- 'glm-5.1',
32
- 'minimax-latest',
33
- 'deepseek-v3.2',
32
+ 'auto',
33
+ 'doubao-seed-evolving',
34
+ 'doubao-seed-2.1-turbo',
35
+ 'doubao-seed-2.0-lite',
36
+ 'glm-5.3-flash',
37
+ 'glm-5.3',
38
+ 'deepseek-v4-pro',
39
+ 'deepseek-v4-flash',
34
40
  'kimi-k2.7-code',
35
- 'kimi-k2.6',
41
+ 'minimax-m3',
36
42
  ],
37
43
  contextWindow: 204_800,
38
44
  modelContextWindows: {
45
+ // 控制台标注「支持 1M 超长上下文」的三个。
46
+ 'doubao-seed-evolving': 1_000_000,
47
+ 'glm-5.3': 1_000_000,
48
+ 'deepseek-v4-pro': 1_000_000,
39
49
  'kimi-k2.7-code': 512_000,
40
50
  },
41
51
  },
@@ -35,22 +35,32 @@ export const PRESETS: ProviderPreset[] = [
35
35
  },
36
36
  {
37
37
  // 火山方舟 ARK Coding Plan —— 一个 endpoint 后挂多个 model id,
38
- // model 字段大小写严格匹配('glm-5.1' 而非 'GLM-5.1')。
38
+ // model 字段大小写严格匹配('glm-5.3' 而非 'GLM-5.3')。
39
+ // ⚠️ 必须是 /api/coding/v3/(Coding Plan 折扣路由),不是 /api/v3/
40
+ // (官网原价路由)——控制台原文明确警告后者「会产生额外费用」。
41
+ // 2026-09 按控制台最新模型列表刷新(原列表含已下线的 doubao-seed-2.0-pro/
42
+ // doubao-seed-code/glm-5.1/minimax-latest/deepseek-v3.2/kimi-k2.6)。
39
43
  name: 'volces',
40
44
  label: '火山方舟 Coding Plan (ARK)',
41
45
  baseURL: 'https://ark.cn-beijing.volces.com/api/coding/v3/chat/completions',
42
46
  models: [
43
- 'doubao-seed-2.0-pro',
44
- 'doubao-seed-2.0-code',
45
- 'doubao-seed-code',
46
- 'glm-5.1',
47
- 'minimax-latest',
48
- 'deepseek-v3.2',
47
+ 'auto',
48
+ 'doubao-seed-evolving',
49
+ 'doubao-seed-2.1-turbo',
50
+ 'doubao-seed-2.0-lite',
51
+ 'glm-5.3-flash',
52
+ 'glm-5.3',
53
+ 'deepseek-v4-pro',
54
+ 'deepseek-v4-flash',
49
55
  'kimi-k2.7-code',
50
- 'kimi-k2.6',
56
+ 'minimax-m3',
51
57
  ],
52
58
  contextWindow: 204_800,
53
59
  modelContextWindows: {
60
+ // 控制台标注「支持 1M 超长上下文」的三个。
61
+ 'doubao-seed-evolving': 1_000_000,
62
+ 'glm-5.3': 1_000_000,
63
+ 'deepseek-v4-pro': 1_000_000,
54
64
  'kimi-k2.7-code': 512_000,
55
65
  },
56
66
  },