minimal-agent 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (470) 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 +503 -0
  103. package/src/advisor/advisorCoordinator.ts +657 -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/streamJson.js +5 -6
  108. package/src/cli/streamJson.ts +8 -4
  109. package/src/cli/wizards/advisorWizard.js +4 -2
  110. package/src/cli/wizards/advisorWizard.tsx +8 -2
  111. package/src/cli/wizards/contextAdvisorWizard.js +5 -4
  112. package/src/cli/wizards/contextAdvisorWizard.tsx +7 -6
  113. package/src/collaboration/taskFlow.js +115 -0
  114. package/src/collaboration/taskFlow.ts +169 -0
  115. package/src/config/configDefaults.js +41 -1
  116. package/src/config/configDefaults.ts +43 -1
  117. package/src/config/configDiagnostics.ts +2 -2
  118. package/src/config/configFile.js +40 -9
  119. package/src/config/configFile.ts +60 -11
  120. package/src/config/configService.js +419 -74
  121. package/src/config/configService.ts +703 -145
  122. package/src/config/numericLimits.js +22 -0
  123. package/src/config/numericLimits.ts +24 -0
  124. package/src/config.js +1 -0
  125. package/src/config.ts +3 -2
  126. package/src/context/budgetPlan.js +1 -1
  127. package/src/context/budgetPlan.ts +1 -1
  128. package/src/context/compact.js +7 -2
  129. package/src/context/compact.ts +9 -2
  130. package/src/context/microCompactLite.js +212 -13
  131. package/src/context/microCompactLite.ts +261 -12
  132. package/src/context/sessionRegistry.js +8 -1
  133. package/src/context/sessionRegistry.ts +18 -5
  134. package/src/context/toolResultArchive.js +72 -0
  135. package/src/context/toolResultArchive.ts +95 -0
  136. package/src/goal/errors.js +8 -0
  137. package/src/goal/errors.ts +18 -0
  138. package/src/goal/goalRuntime.js +344 -0
  139. package/src/goal/goalRuntime.ts +466 -0
  140. package/src/goal/goalStore.js +200 -0
  141. package/src/goal/goalStore.ts +219 -0
  142. package/src/goal/index.js +4 -0
  143. package/src/goal/index.ts +4 -0
  144. package/src/goal/statusMapping.js +71 -0
  145. package/src/goal/statusMapping.ts +95 -0
  146. package/src/goal/types.js +7 -0
  147. package/src/goal/types.ts +179 -0
  148. package/src/goal/workflowController.js +306 -0
  149. package/src/goal/workflowController.ts +360 -0
  150. package/src/harness/evidenceLedger.js +2 -0
  151. package/src/harness/evidenceLedger.ts +1 -0
  152. package/src/harness/stallGuard.js +9 -3
  153. package/src/harness/stallGuard.ts +7 -3
  154. package/src/images/imageResolver.js +161 -0
  155. package/src/images/imageResolver.ts +189 -0
  156. package/src/infra/verification.js +34 -5
  157. package/src/infra/verification.ts +39 -4
  158. package/src/llm/client.js +79 -21
  159. package/src/llm/client.ts +182 -35
  160. package/src/llm/gatewayClient.js +201 -0
  161. package/src/llm/gatewayClient.ts +299 -0
  162. package/src/llm/messageProvenance.js +46 -0
  163. package/src/llm/messageProvenance.ts +58 -0
  164. package/src/llm/modelProvider.js +1 -0
  165. package/src/llm/modelProvider.ts +22 -0
  166. package/src/llm/providers/anthropicFormat.js +108 -1
  167. package/src/llm/providers/anthropicFormat.ts +115 -4
  168. package/src/llm/providers/openaiFormat.js +9 -0
  169. package/src/llm/providers/openaiFormat.ts +12 -3
  170. package/src/loop.js +319 -54
  171. package/src/loop.ts +373 -57
  172. package/src/main.js +4 -1
  173. package/src/main.tsx +4 -1
  174. package/src/managedExecution/index.js +2 -0
  175. package/src/managedExecution/index.ts +2 -0
  176. package/src/managedExecution/registry.js +15 -0
  177. package/src/managedExecution/registry.ts +20 -0
  178. package/src/managedExecution/types.js +1 -0
  179. package/src/managedExecution/types.ts +86 -0
  180. package/src/modelRef.js +9 -0
  181. package/src/modelRef.ts +31 -0
  182. package/src/multimodal.js +14 -28
  183. package/src/multimodal.ts +17 -33
  184. package/src/net/lanDiscovery.js +65 -0
  185. package/src/net/lanDiscovery.ts +82 -0
  186. package/src/plugin-sdk.js +28 -3
  187. package/src/plugin-sdk.ts +39 -6
  188. package/src/plugins/pluginApi.ts +16 -1
  189. package/src/plugins/pluginLoader.js +4 -0
  190. package/src/plugins/pluginLoader.ts +6 -0
  191. package/src/plugins/pluginRunner.js +139 -7
  192. package/src/plugins/pluginRunner.ts +173 -9
  193. package/src/plugins/slashFallback.js +113 -0
  194. package/src/plugins/slashFallback.ts +137 -0
  195. package/src/prompts/policyRegistry.js +12 -32
  196. package/src/prompts/policyRegistry.ts +15 -32
  197. package/src/prompts/promptAssembly.js +103 -12
  198. package/src/prompts/promptAssembly.ts +114 -12
  199. package/src/prompts/skillList.js +21 -3
  200. package/src/prompts/skillList.ts +27 -2
  201. package/src/prompts/stableSystemPrompt.js +18 -0
  202. package/src/prompts/stableSystemPrompt.ts +33 -0
  203. package/src/runtime/agentRuntimeContext.js +8 -2
  204. package/src/runtime/agentRuntimeContext.ts +17 -4
  205. package/src/session/runAgentTurn.js +78 -12
  206. package/src/session/runAgentTurn.ts +105 -23
  207. package/src/session/runTurn.js +10 -9
  208. package/src/session/runTurn.ts +17 -8
  209. package/src/session/sessionState.ts +2 -0
  210. package/src/team/auth.js +186 -0
  211. package/src/team/auth.ts +298 -0
  212. package/src/team/cli.js +105 -0
  213. package/src/team/cli.ts +122 -0
  214. package/src/team/onlineToolContract.js +64 -0
  215. package/src/team/onlineToolContract.ts +109 -0
  216. package/src/team/toolPolicy.js +36 -0
  217. package/src/team/toolPolicy.ts +75 -0
  218. package/src/tools/advisor/advisor.js +90 -46
  219. package/src/tools/advisor/advisor.ts +100 -47
  220. package/src/tools/advisor/advisorDecision.js +71 -0
  221. package/src/tools/advisor/advisorDecision.ts +85 -0
  222. package/src/tools/agent/agent.js +18 -5
  223. package/src/tools/agent/agent.ts +21 -7
  224. package/src/tools/agent/agentControl.js +246 -0
  225. package/src/tools/agent/agentControl.ts +284 -0
  226. package/src/tools/agent/agentTaskService.js +40 -1
  227. package/src/tools/agent/agentTaskService.ts +44 -1
  228. package/src/tools/agent/agentTypes.js +14 -2
  229. package/src/tools/agent/agentTypes.ts +15 -2
  230. package/src/tools/applypatch/applyPatch.js +362 -0
  231. package/src/tools/applypatch/applyPatch.ts +428 -0
  232. package/src/tools/bash/bash.js +22 -15
  233. package/src/tools/bash/bash.ts +23 -17
  234. package/src/tools/capabilities.js +10 -5
  235. package/src/tools/capabilities.ts +10 -5
  236. package/src/tools/computeruse/computerIntent.js +32 -0
  237. package/src/tools/computeruse/computerIntent.ts +46 -0
  238. package/src/tools/computeruse/telemetryLog.js +12 -0
  239. package/src/tools/computeruse/telemetryLog.ts +16 -0
  240. package/src/tools/computeruse/vision/telemetry.js +1 -0
  241. package/src/tools/computeruse/vision/telemetry.ts +1 -0
  242. package/src/tools/effectiveToolSet.js +4 -0
  243. package/src/tools/effectiveToolSet.ts +4 -0
  244. package/src/tools/index.js +21 -2
  245. package/src/tools/index.ts +33 -2
  246. package/src/tools/presentresult/presentresult.js +6 -15
  247. package/src/tools/presentresult/presentresult.ts +6 -15
  248. package/src/tools/read/read.js +62 -9
  249. package/src/tools/read/read.ts +63 -9
  250. package/src/tools/shared/fileUtils.js +1 -2
  251. package/src/tools/shared/fileUtils.ts +1 -2
  252. package/src/tools/shared/toolOutputStore.js +23 -1
  253. package/src/tools/shared/toolOutputStore.ts +22 -1
  254. package/src/tools/skill/skill.js +9 -3
  255. package/src/tools/skill/skill.ts +8 -4
  256. package/src/tools/toolPromptGuides.js +117 -0
  257. package/src/tools/toolPromptGuides.ts +137 -0
  258. package/src/tools/webbrowser/agentBrowserPath.js +19 -9
  259. package/src/tools/webbrowser/agentBrowserPath.ts +70 -28
  260. package/src/tools/webbrowser/browser.js +27 -11
  261. package/src/tools/webbrowser/browser.ts +68 -24
  262. package/src/tools/webbrowser/browserAutomation.js +329 -0
  263. package/src/tools/webbrowser/browserAutomation.ts +467 -0
  264. package/src/tools/webbrowser/browserAxState.js +97 -0
  265. package/src/tools/webbrowser/browserAxState.ts +142 -0
  266. package/src/tools/webbrowser/browserBatch.js +1578 -0
  267. package/src/tools/webbrowser/browserBatch.ts +2382 -0
  268. package/src/tools/webbrowser/browserCdp.js +208 -0
  269. package/src/tools/webbrowser/browserCdp.ts +255 -0
  270. package/src/tools/webbrowser/browserConditions.js +24 -0
  271. package/src/tools/webbrowser/browserConditions.ts +45 -0
  272. package/src/tools/webbrowser/browserContent.js +281 -0
  273. package/src/tools/webbrowser/browserContent.ts +438 -0
  274. package/src/tools/webbrowser/browserControl.js +131 -34
  275. package/src/tools/webbrowser/browserControl.ts +210 -56
  276. package/src/tools/webbrowser/browserDaemon.js +22 -14
  277. package/src/tools/webbrowser/browserDaemon.ts +54 -21
  278. package/src/tools/webbrowser/browserFrames.js +47 -0
  279. package/src/tools/webbrowser/browserFrames.ts +54 -0
  280. package/src/tools/webbrowser/browserInteractionResolver.js +17 -0
  281. package/src/tools/webbrowser/browserInteractionResolver.ts +40 -0
  282. package/src/tools/webbrowser/browserLocator.js +140 -0
  283. package/src/tools/webbrowser/browserLocator.ts +194 -0
  284. package/src/tools/webbrowser/browserOutcome.js +10 -17
  285. package/src/tools/webbrowser/browserOutcome.ts +48 -31
  286. package/src/tools/webbrowser/browserRecovery.js +58 -0
  287. package/src/tools/webbrowser/browserRecovery.ts +83 -0
  288. package/src/tools/webbrowser/browserRunRegistry.js +35 -3
  289. package/src/tools/webbrowser/browserRunRegistry.ts +91 -15
  290. package/src/tools/webbrowser/browserService.js +28 -2
  291. package/src/tools/webbrowser/browserService.ts +49 -9
  292. package/src/tools/webbrowser/browserStream.js +132 -33
  293. package/src/tools/webbrowser/browserStream.ts +224 -50
  294. package/src/tools/webbrowser/browserTabs.js +48 -15
  295. package/src/tools/webbrowser/browserTabs.ts +178 -96
  296. package/src/tools/webbrowser/webbrowser.js +679 -144
  297. package/src/tools/webbrowser/webbrowser.ts +975 -236
  298. package/src/tools/webfetch/preapproved.js +0 -2
  299. package/src/tools/webfetch/preapproved.ts +0 -2
  300. package/src/tools/websearch/websearch.js +129 -8
  301. package/src/tools/websearch/websearch.ts +138 -6
  302. package/src/types.ts +440 -38
  303. package/src/ui/App.js +377 -58
  304. package/src/ui/App.tsx +576 -111
  305. package/src/ui/LiveArea.js +14 -8
  306. package/src/ui/LiveArea.tsx +14 -10
  307. package/src/ui/MessageList.js +63 -20
  308. package/src/ui/MessageList.tsx +101 -16
  309. package/src/ui/ModelPicker.js +7 -4
  310. package/src/ui/ModelPicker.tsx +55 -8
  311. package/src/ui/hooks/useChat.js +152 -163
  312. package/src/ui/hooks/useChat.ts +396 -334
  313. package/src/ui/loginCommand.js +56 -0
  314. package/src/ui/loginCommand.ts +63 -0
  315. package/src/ui/toolProgress.js +41 -0
  316. package/src/ui/toolProgress.ts +44 -0
  317. package/src/web/browserBridge.js +20 -2
  318. package/src/web/browserBridge.ts +20 -2
  319. package/src/web/protocol.ts +1897 -194
  320. package/workflows/adaptive-research/workflow.mjs +86 -0
  321. package/workflows/e2e-capabilities/workflow.mjs +102 -0
  322. package/workflows/e2e-llm/workflow.mjs +52 -0
  323. package/workflows/e2e-smoke/workflow.mjs +59 -0
  324. package/workflows/e2e-vision-schema/README.md +48 -0
  325. package/workflows/e2e-vision-schema/workflow.mjs +149 -0
  326. package/workflows/e2e-write-greet/workflow.mjs +37 -0
  327. package/workflows/file-census/README.md +14 -0
  328. package/workflows/file-census/scripts/.gitkeep +2 -0
  329. package/workflows/file-census/workflow.mjs +110 -0
  330. package/workflows/goal/README.md +166 -0
  331. package/workflows/goal/prompts/audit.md +57 -0
  332. package/workflows/goal/prompts/contract.md +56 -0
  333. package/workflows/goal/prompts/iterate.md +37 -0
  334. package/workflows/goal/workflow.mjs +501 -0
  335. package/workflows/illustrate/README.md +90 -0
  336. package/workflows/illustrate/assets/engines.json +20 -0
  337. package/workflows/illustrate/assets/extract-baidu.js +21 -0
  338. package/workflows/illustrate/assets/extract-bing.js +33 -0
  339. package/workflows/illustrate/assets/extract-google.js +31 -0
  340. package/workflows/illustrate/workflow.mjs +301 -0
  341. package/workflows/plan/workflow.mjs +389 -0
  342. package/workflows/question-crops/README.md +35 -0
  343. package/workflows/question-crops/prompts/inventory.md +23 -0
  344. package/workflows/question-crops/scripts/image-ops.mjs +305 -0
  345. package/workflows/question-crops/scripts/image-ops.test.mjs +95 -0
  346. package/workflows/question-crops/workflow.mjs +172 -0
  347. package/workflows/ralph-loop/workflow.mjs +162 -0
  348. package/workflows/research/README.md +74 -0
  349. package/workflows/research/prompts/s0-goal.md +43 -0
  350. package/workflows/research/prompts/s1-early-exit.md +22 -0
  351. package/workflows/research/prompts/s1-map.md +58 -0
  352. package/workflows/research/prompts/s2-options.md +53 -0
  353. package/workflows/research/prompts/s3-deep-dive.md +56 -0
  354. package/workflows/research/prompts/s4-verify.md +74 -0
  355. package/workflows/research/prompts/s5-synthesis.md +81 -0
  356. package/workflows/research/prompts/s5b-fill-gaps.md +32 -0
  357. package/workflows/research/prompts/s6-package.md +32 -0
  358. package/workflows/research/scripts/build-report.mjs +98 -0
  359. package/workflows/research/workflow.mjs +288 -0
  360. package/workflows/wechat-reading-shots/prompts/collect-params.md +16 -0
  361. package/workflows/wechat-reading-shots/prompts/evaluate.md +20 -0
  362. package/workflows/wechat-reading-shots/prompts/open-book.md +28 -0
  363. package/workflows/wechat-reading-shots/prompts/read-page.md +13 -0
  364. package/workflows/wechat-reading-shots/prompts/turn-batch.md +24 -0
  365. package/workflows/wechat-reading-shots/test/control-flow.test.ts +329 -0
  366. package/workflows/wechat-reading-shots/workflow.mjs +266 -0
  367. package/workflows/wrong-question-docx/README.md +55 -0
  368. package/workflows/wrong-question-docx/prompts/figure-qa.md +8 -0
  369. package/workflows/wrong-question-docx/prompts/transcribe.md +25 -0
  370. package/workflows/wrong-question-docx/scripts/workbook.mjs +857 -0
  371. package/workflows/wrong-question-docx/test/control-flow.test.ts +165 -0
  372. package/workflows/wrong-question-docx/test/workbook.test.mjs +303 -0
  373. package/workflows/wrong-question-docx/workflow.mjs +485 -0
  374. package/plugins/workflow-runner/src/agentCommon.js +0 -354
  375. package/plugins/workflow-runner/src/agentCommon.ts +0 -435
  376. package/plugins/workflow-runner/src/controlFlow/branch.js +0 -40
  377. package/plugins/workflow-runner/src/controlFlow/branch.ts +0 -46
  378. package/plugins/workflow-runner/src/controlFlow/loop.js +0 -211
  379. package/plugins/workflow-runner/src/controlFlow/loop.ts +0 -248
  380. package/plugins/workflow-runner/src/controlFlow/pause.js +0 -129
  381. package/plugins/workflow-runner/src/controlFlow/pause.ts +0 -141
  382. package/plugins/workflow-runner/src/controlFlow/signal.js +0 -21
  383. package/plugins/workflow-runner/src/controlFlow/signal.ts +0 -29
  384. package/plugins/workflow-runner/src/controlFlow/types.js +0 -18
  385. package/plugins/workflow-runner/src/controlFlow/types.ts +0 -63
  386. package/plugins/workflow-runner/src/dslManifest.js +0 -72
  387. package/plugins/workflow-runner/src/dslManifest.ts +0 -127
  388. package/plugins/workflow-runner/src/expressions.js +0 -639
  389. package/plugins/workflow-runner/src/expressions.ts +0 -640
  390. package/plugins/workflow-runner/src/loader.js +0 -573
  391. package/plugins/workflow-runner/src/loader.ts +0 -721
  392. package/plugins/workflow-runner/src/multimodal.js +0 -38
  393. package/plugins/workflow-runner/src/multimodal.ts +0 -64
  394. package/plugins/workflow-runner/src/recovery.js +0 -126
  395. package/plugins/workflow-runner/src/recovery.ts +0 -156
  396. package/plugins/workflow-runner/src/stepExecutors/agent.js +0 -173
  397. package/plugins/workflow-runner/src/stepExecutors/agent.ts +0 -234
  398. package/plugins/workflow-runner/src/stepExecutors/assert.js +0 -42
  399. package/plugins/workflow-runner/src/stepExecutors/assert.ts +0 -52
  400. package/plugins/workflow-runner/src/stepExecutors/echo.js +0 -31
  401. package/plugins/workflow-runner/src/stepExecutors/echo.ts +0 -38
  402. package/plugins/workflow-runner/src/stepExecutors/llm.js +0 -99
  403. package/plugins/workflow-runner/src/stepExecutors/llm.ts +0 -133
  404. package/plugins/workflow-runner/src/stepExecutors/set.js +0 -49
  405. package/plugins/workflow-runner/src/stepExecutors/set.ts +0 -56
  406. package/plugins/workflow-runner/src/stepExecutors/skill.js +0 -111
  407. package/plugins/workflow-runner/src/stepExecutors/skill.ts +0 -140
  408. package/plugins/workflow-runner/src/stepExecutors/tool.js +0 -227
  409. package/plugins/workflow-runner/src/stepExecutors/tool.ts +0 -274
  410. package/plugins/workflow-runner/src/stepExecutors/verify.js +0 -61
  411. package/plugins/workflow-runner/src/stepExecutors/verify.ts +0 -72
  412. package/plugins/workflow-runner/src/stepPipeline.js +0 -277
  413. package/plugins/workflow-runner/src/stepPipeline.ts +0 -366
  414. package/plugins/workflow-runner/test/agent.test.ts +0 -587
  415. package/plugins/workflow-runner/test/agentLlmError.test.ts +0 -373
  416. package/plugins/workflow-runner/test/bashBlacklist.sweep.test.ts +0 -65
  417. package/plugins/workflow-runner/test/captureMisbind.test.ts +0 -99
  418. package/plugins/workflow-runner/test/cli.e2e.test.ts +0 -167
  419. package/plugins/workflow-runner/test/context-files.test.ts +0 -320
  420. package/plugins/workflow-runner/test/e2e.test.ts +0 -370
  421. package/plugins/workflow-runner/test/e2eNewLayout.test.ts +0 -314
  422. package/plugins/workflow-runner/test/engineRobustness.test.ts +0 -234
  423. package/plugins/workflow-runner/test/expressions.test.ts +0 -439
  424. package/plugins/workflow-runner/test/foundation.test.ts +0 -126
  425. package/plugins/workflow-runner/test/graceful.test.ts +0 -139
  426. package/plugins/workflow-runner/test/greedyInputs.load.test.ts +0 -47
  427. package/plugins/workflow-runner/test/hostCapability.test.ts +0 -108
  428. package/plugins/workflow-runner/test/illustrate.load.test.ts +0 -183
  429. package/plugins/workflow-runner/test/jsonPayload.test.ts +0 -83
  430. package/plugins/workflow-runner/test/loader.test.ts +0 -617
  431. package/plugins/workflow-runner/test/maxTurnsRetryDelay.test.ts +0 -33
  432. package/plugins/workflow-runner/test/multimodal.test.ts +0 -342
  433. package/plugins/workflow-runner/test/output-schema.test.ts +0 -213
  434. package/plugins/workflow-runner/test/parseWorkflowArgs.test.ts +0 -106
  435. package/plugins/workflow-runner/test/pluginRunner.isolation.test.ts +0 -269
  436. package/plugins/workflow-runner/test/ppt.load.test.ts +0 -1220
  437. package/plugins/workflow-runner/test/ralphLoop.e2e.test.ts +0 -221
  438. package/plugins/workflow-runner/test/recovery.test.ts +0 -265
  439. package/plugins/workflow-runner/test/research.load.test.ts +0 -328
  440. package/plugins/workflow-runner/test/runner.test.ts +0 -911
  441. package/plugins/workflow-runner/test/runnerPreflight.test.ts +0 -436
  442. package/plugins/workflow-runner/test/skillTurnDone.test.ts +0 -71
  443. package/plugins/workflow-runner/test/stateLifecycle.test.ts +0 -198
  444. package/plugins/workflow-runner/test/stepPipeline.test.ts +0 -114
  445. package/plugins/workflow-runner/test/taskArbitration.test.ts +0 -354
  446. package/plugins/workflow-runner/test/taskLifecycle.test.ts +0 -324
  447. package/plugins/workflow-runner/test/toolArtifactOverwrite.test.ts +0 -221
  448. package/plugins/workflow-runner/test/toolCapabilityBoundary.test.ts +0 -29
  449. package/plugins/workflow-runner/test/toolRuntimeIntegration.test.ts +0 -168
  450. package/plugins/workflow-runner/test/webppt.load.test.ts +0 -250
  451. package/plugins/workflow-runner/test/word.load.test.ts +0 -208
  452. package/plugins/workflow-runner/test/workflows.smoke.test.ts +0 -76
  453. package/plugins/workflow-runner/test/yamlGuardConditions.test.ts +0 -207
  454. package/src/advisorState.js +0 -22
  455. package/src/cli/configWizard.js +0 -293
  456. package/src/tools/toolProgressBridge.js +0 -48
  457. package/workflows/adaptive-research.yaml +0 -50
  458. package/workflows/book-review-short.yaml +0 -125
  459. package/workflows/e2e-write-greet.yaml +0 -31
  460. package/workflows/illustrate.yaml +0 -227
  461. package/workflows/plan.yaml +0 -470
  462. package/workflows/ppt.yaml +0 -1670
  463. package/workflows/ralph-loop.yaml +0 -201
  464. package/workflows/research.yaml +0 -873
  465. package/workflows/schema.json +0 -176
  466. package/workflows/webppt.yaml +0 -496
  467. package/workflows/wechat-reading-shots.yaml +0 -315
  468. package/workflows/word.yaml +0 -720
  469. package/workflows/youtube-shorts.yaml +0 -202
  470. /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':
@@ -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
  }
@@ -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
+ }