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