minimal-agent 0.12.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. package/README.md +6 -5
  2. package/package.json +62 -5
  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 +204 -185
  16. package/plugins/workflow-runner/src/index.ts +249 -224
  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 +404 -467
  28. package/plugins/workflow-runner/src/runner.ts +491 -535
  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 +172 -152
  54. package/plugins/workflow-runner/src/taskIdentity.ts +233 -200
  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 -105
  58. package/plugins/workflow-runner/src/types.ts +155 -520
  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 +542 -469
  68. package/plugins/workflow-runner/src/workflowState.ts +639 -589
  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/skill-creator/scripts/run_eval.py +3 -2
  92. package/skills/ui-design/SKILL.md +5 -2
  93. package/skills/ui-design/references/layout-composition.md +1 -1
  94. package/skills/workflow-creator/SKILL.md +344 -0
  95. package/skills/workflow-creator/assets/template/workflow.mjs +48 -0
  96. package/skills/workflow-creator/references/api.md +216 -0
  97. package/skills/workflow-creator/references/migration.md +103 -0
  98. package/skills/workflow-creator/references/patterns.md +779 -0
  99. package/skills/workflow-creator/scripts/list-resources.mjs +205 -0
  100. package/skills/workflow-creator/scripts/scaffold.mjs +148 -0
  101. package/skills/workflow-creator/scripts/validate.mjs +275 -0
  102. package/skills/workflow-creator/scripts/workflow-creator.test.mjs +82 -0
  103. package/src/advisor/advisorCoordinator.js +503 -0
  104. package/src/advisor/advisorCoordinator.ts +657 -0
  105. package/src/cli/configMenu.tsx +0 -1
  106. package/src/cli/print.js +44 -6
  107. package/src/cli/print.ts +73 -4
  108. package/src/cli/streamJson.js +5 -6
  109. package/src/cli/streamJson.ts +8 -4
  110. package/src/cli/wizards/advisorWizard.js +4 -2
  111. package/src/cli/wizards/advisorWizard.tsx +8 -2
  112. package/src/cli/wizards/contextAdvisorWizard.js +5 -4
  113. package/src/cli/wizards/contextAdvisorWizard.tsx +7 -6
  114. package/src/collaboration/taskFlow.js +115 -0
  115. package/src/collaboration/taskFlow.ts +169 -0
  116. package/src/config/configDefaults.js +41 -1
  117. package/src/config/configDefaults.ts +43 -1
  118. package/src/config/configDiagnostics.ts +2 -2
  119. package/src/config/configFile.js +40 -9
  120. package/src/config/configFile.ts +60 -11
  121. package/src/config/configService.js +443 -74
  122. package/src/config/configService.ts +723 -142
  123. package/src/config/numericLimits.js +22 -0
  124. package/src/config/numericLimits.ts +24 -0
  125. package/src/config.js +1 -0
  126. package/src/config.ts +3 -2
  127. package/src/context/budgetPlan.js +1 -1
  128. package/src/context/budgetPlan.ts +1 -1
  129. package/src/context/compact.js +7 -2
  130. package/src/context/compact.ts +9 -2
  131. package/src/context/microCompactLite.js +212 -13
  132. package/src/context/microCompactLite.ts +261 -12
  133. package/src/context/sessionRegistry.js +8 -1
  134. package/src/context/sessionRegistry.ts +18 -5
  135. package/src/context/toolResultArchive.js +72 -0
  136. package/src/context/toolResultArchive.ts +95 -0
  137. package/src/goal/errors.js +8 -0
  138. package/src/goal/errors.ts +18 -0
  139. package/src/goal/goalRuntime.js +344 -0
  140. package/src/goal/goalRuntime.ts +466 -0
  141. package/src/goal/goalStore.js +200 -0
  142. package/src/goal/goalStore.ts +219 -0
  143. package/src/goal/index.js +4 -0
  144. package/src/goal/index.ts +4 -0
  145. package/src/goal/statusMapping.js +71 -0
  146. package/src/goal/statusMapping.ts +95 -0
  147. package/src/goal/types.js +7 -0
  148. package/src/goal/types.ts +179 -0
  149. package/src/goal/workflowController.js +306 -0
  150. package/src/goal/workflowController.ts +360 -0
  151. package/src/harness/evidenceLedger.js +2 -0
  152. package/src/harness/evidenceLedger.ts +1 -0
  153. package/src/harness/stallGuard.js +9 -3
  154. package/src/harness/stallGuard.ts +7 -3
  155. package/src/images/imageResolver.js +161 -0
  156. package/src/images/imageResolver.ts +189 -0
  157. package/src/infra/verification.js +56 -20
  158. package/src/infra/verification.ts +87 -20
  159. package/src/llm/client.js +79 -21
  160. package/src/llm/client.ts +182 -35
  161. package/src/llm/gatewayClient.js +201 -0
  162. package/src/llm/gatewayClient.ts +299 -0
  163. package/src/llm/messageProvenance.js +46 -0
  164. package/src/llm/messageProvenance.ts +58 -0
  165. package/src/llm/modelProvider.js +1 -0
  166. package/src/llm/modelProvider.ts +22 -0
  167. package/src/llm/providers/anthropicFormat.js +108 -1
  168. package/src/llm/providers/anthropicFormat.ts +115 -4
  169. package/src/llm/providers/openaiFormat.js +9 -0
  170. package/src/llm/providers/openaiFormat.ts +12 -3
  171. package/src/loop.js +319 -54
  172. package/src/loop.ts +373 -57
  173. package/src/main.js +4 -1
  174. package/src/main.tsx +4 -1
  175. package/src/managedExecution/index.js +2 -0
  176. package/src/managedExecution/index.ts +2 -0
  177. package/src/managedExecution/registry.js +15 -0
  178. package/src/managedExecution/registry.ts +20 -0
  179. package/src/managedExecution/types.js +1 -0
  180. package/src/managedExecution/types.ts +86 -0
  181. package/src/modelRef.js +9 -0
  182. package/src/modelRef.ts +31 -0
  183. package/src/multimodal.js +14 -28
  184. package/src/multimodal.ts +17 -33
  185. package/src/net/lanDiscovery.js +65 -0
  186. package/src/net/lanDiscovery.ts +82 -0
  187. package/src/plugin-sdk.js +28 -3
  188. package/src/plugin-sdk.ts +39 -6
  189. package/src/plugins/pluginApi.ts +16 -1
  190. package/src/plugins/pluginLoader.js +4 -0
  191. package/src/plugins/pluginLoader.ts +6 -0
  192. package/src/plugins/pluginRunner.js +152 -9
  193. package/src/plugins/pluginRunner.ts +186 -8
  194. package/src/plugins/slashFallback.js +113 -0
  195. package/src/plugins/slashFallback.ts +137 -0
  196. package/src/prompts/policyRegistry.js +15 -8
  197. package/src/prompts/policyRegistry.ts +18 -8
  198. package/src/prompts/promptAssembly.js +103 -12
  199. package/src/prompts/promptAssembly.ts +114 -12
  200. package/src/prompts/skillList.js +21 -3
  201. package/src/prompts/skillList.ts +27 -2
  202. package/src/prompts/stableSystemPrompt.js +18 -0
  203. package/src/prompts/stableSystemPrompt.ts +33 -0
  204. package/src/runtime/agentRuntimeContext.js +8 -2
  205. package/src/runtime/agentRuntimeContext.ts +17 -4
  206. package/src/session/runAgentTurn.js +78 -12
  207. package/src/session/runAgentTurn.ts +105 -23
  208. package/src/session/runTurn.js +10 -9
  209. package/src/session/runTurn.ts +17 -8
  210. package/src/session/sessionState.ts +2 -0
  211. package/src/team/auth.js +186 -0
  212. package/src/team/auth.ts +298 -0
  213. package/src/team/cli.js +105 -0
  214. package/src/team/cli.ts +122 -0
  215. package/src/team/onlineToolContract.js +64 -0
  216. package/src/team/onlineToolContract.ts +109 -0
  217. package/src/team/toolPolicy.js +36 -0
  218. package/src/team/toolPolicy.ts +75 -0
  219. package/src/tools/advisor/advisor.js +148 -37
  220. package/src/tools/advisor/advisor.ts +161 -38
  221. package/src/tools/advisor/advisorDecision.js +71 -0
  222. package/src/tools/advisor/advisorDecision.ts +85 -0
  223. package/src/tools/agent/agent.js +18 -5
  224. package/src/tools/agent/agent.ts +21 -7
  225. package/src/tools/agent/agentControl.js +246 -0
  226. package/src/tools/agent/agentControl.ts +284 -0
  227. package/src/tools/agent/agentTaskService.js +40 -1
  228. package/src/tools/agent/agentTaskService.ts +44 -1
  229. package/src/tools/agent/agentTypes.js +14 -2
  230. package/src/tools/agent/agentTypes.ts +15 -2
  231. package/src/tools/applypatch/applyPatch.js +362 -0
  232. package/src/tools/applypatch/applyPatch.ts +428 -0
  233. package/src/tools/bash/bash.js +70 -18
  234. package/src/tools/bash/bash.ts +75 -20
  235. package/src/tools/capabilities.js +10 -5
  236. package/src/tools/capabilities.ts +10 -5
  237. package/src/tools/computeruse/computerIntent.js +32 -0
  238. package/src/tools/computeruse/computerIntent.ts +46 -0
  239. package/src/tools/computeruse/telemetryLog.js +12 -0
  240. package/src/tools/computeruse/telemetryLog.ts +16 -0
  241. package/src/tools/computeruse/vision/telemetry.js +1 -0
  242. package/src/tools/computeruse/vision/telemetry.ts +1 -0
  243. package/src/tools/effectiveToolSet.js +4 -0
  244. package/src/tools/effectiveToolSet.ts +4 -0
  245. package/src/tools/index.js +21 -2
  246. package/src/tools/index.ts +33 -2
  247. package/src/tools/powershell/powershell.js +18 -1
  248. package/src/tools/powershell/powershell.ts +18 -2
  249. package/src/tools/presentresult/presentresult.js +6 -15
  250. package/src/tools/presentresult/presentresult.ts +6 -15
  251. package/src/tools/read/read.js +69 -11
  252. package/src/tools/read/read.ts +70 -11
  253. package/src/tools/shared/fileUtils.js +1 -2
  254. package/src/tools/shared/fileUtils.ts +1 -2
  255. package/src/tools/shared/permanentDeleteGuard.js +34 -3
  256. package/src/tools/shared/permanentDeleteGuard.ts +43 -6
  257. package/src/tools/shared/toolOutputStore.js +23 -1
  258. package/src/tools/shared/toolOutputStore.ts +22 -1
  259. package/src/tools/skill/skill.js +9 -3
  260. package/src/tools/skill/skill.ts +8 -4
  261. package/src/tools/toolPromptGuides.js +117 -0
  262. package/src/tools/toolPromptGuides.ts +137 -0
  263. package/src/tools/webbrowser/agentBrowserPath.js +19 -9
  264. package/src/tools/webbrowser/agentBrowserPath.ts +70 -28
  265. package/src/tools/webbrowser/browser.js +27 -11
  266. package/src/tools/webbrowser/browser.ts +68 -24
  267. package/src/tools/webbrowser/browserAutomation.js +329 -0
  268. package/src/tools/webbrowser/browserAutomation.ts +467 -0
  269. package/src/tools/webbrowser/browserAxState.js +97 -0
  270. package/src/tools/webbrowser/browserAxState.ts +142 -0
  271. package/src/tools/webbrowser/browserBatch.js +1578 -0
  272. package/src/tools/webbrowser/browserBatch.ts +2382 -0
  273. package/src/tools/webbrowser/browserCdp.js +208 -0
  274. package/src/tools/webbrowser/browserCdp.ts +255 -0
  275. package/src/tools/webbrowser/browserConditions.js +24 -0
  276. package/src/tools/webbrowser/browserConditions.ts +45 -0
  277. package/src/tools/webbrowser/browserContent.js +281 -0
  278. package/src/tools/webbrowser/browserContent.ts +438 -0
  279. package/src/tools/webbrowser/browserControl.js +131 -30
  280. package/src/tools/webbrowser/browserControl.ts +210 -50
  281. package/src/tools/webbrowser/browserDaemon.js +22 -14
  282. package/src/tools/webbrowser/browserDaemon.ts +54 -21
  283. package/src/tools/webbrowser/browserFrames.js +47 -0
  284. package/src/tools/webbrowser/browserFrames.ts +54 -0
  285. package/src/tools/webbrowser/browserInteractionResolver.js +17 -0
  286. package/src/tools/webbrowser/browserInteractionResolver.ts +40 -0
  287. package/src/tools/webbrowser/browserLocator.js +140 -0
  288. package/src/tools/webbrowser/browserLocator.ts +194 -0
  289. package/src/tools/webbrowser/browserOutcome.js +10 -17
  290. package/src/tools/webbrowser/browserOutcome.ts +48 -31
  291. package/src/tools/webbrowser/browserRecovery.js +58 -0
  292. package/src/tools/webbrowser/browserRecovery.ts +83 -0
  293. package/src/tools/webbrowser/browserRunRegistry.js +35 -3
  294. package/src/tools/webbrowser/browserRunRegistry.ts +91 -15
  295. package/src/tools/webbrowser/browserService.js +28 -2
  296. package/src/tools/webbrowser/browserService.ts +49 -9
  297. package/src/tools/webbrowser/browserStream.js +132 -33
  298. package/src/tools/webbrowser/browserStream.ts +224 -50
  299. package/src/tools/webbrowser/browserTabs.js +48 -15
  300. package/src/tools/webbrowser/browserTabs.ts +178 -96
  301. package/src/tools/webbrowser/webbrowser.js +683 -144
  302. package/src/tools/webbrowser/webbrowser.ts +979 -236
  303. package/src/tools/webfetch/preapproved.js +0 -2
  304. package/src/tools/webfetch/preapproved.ts +0 -2
  305. package/src/tools/websearch/websearch.js +129 -8
  306. package/src/tools/websearch/websearch.ts +138 -6
  307. package/src/types.ts +450 -42
  308. package/src/ui/App.js +377 -58
  309. package/src/ui/App.tsx +576 -111
  310. package/src/ui/LiveArea.js +14 -8
  311. package/src/ui/LiveArea.tsx +14 -10
  312. package/src/ui/MessageList.js +63 -20
  313. package/src/ui/MessageList.tsx +101 -16
  314. package/src/ui/ModelPicker.js +7 -4
  315. package/src/ui/ModelPicker.tsx +55 -8
  316. package/src/ui/hooks/useChat.js +152 -163
  317. package/src/ui/hooks/useChat.ts +396 -334
  318. package/src/ui/loginCommand.js +56 -0
  319. package/src/ui/loginCommand.ts +63 -0
  320. package/src/ui/toolProgress.js +41 -0
  321. package/src/ui/toolProgress.ts +44 -0
  322. package/src/web/browserBridge.js +20 -2
  323. package/src/web/browserBridge.ts +20 -2
  324. package/src/web/protocol.ts +1897 -194
  325. package/workflows/adaptive-research/workflow.mjs +86 -0
  326. package/workflows/e2e-capabilities/workflow.mjs +102 -0
  327. package/workflows/e2e-llm/workflow.mjs +52 -0
  328. package/workflows/e2e-smoke/workflow.mjs +59 -0
  329. package/workflows/e2e-vision-schema/README.md +48 -0
  330. package/workflows/e2e-vision-schema/workflow.mjs +149 -0
  331. package/workflows/e2e-write-greet/workflow.mjs +37 -0
  332. package/workflows/file-census/README.md +14 -0
  333. package/workflows/file-census/scripts/.gitkeep +2 -0
  334. package/workflows/file-census/workflow.mjs +110 -0
  335. package/workflows/goal/README.md +166 -0
  336. package/workflows/goal/prompts/audit.md +57 -0
  337. package/workflows/goal/prompts/contract.md +56 -0
  338. package/workflows/goal/prompts/iterate.md +37 -0
  339. package/workflows/goal/workflow.mjs +501 -0
  340. package/workflows/illustrate/README.md +90 -0
  341. package/workflows/illustrate/assets/engines.json +20 -0
  342. package/workflows/illustrate/assets/extract-baidu.js +21 -0
  343. package/workflows/illustrate/assets/extract-bing.js +33 -0
  344. package/workflows/illustrate/assets/extract-google.js +31 -0
  345. package/workflows/illustrate/workflow.mjs +301 -0
  346. package/workflows/plan/workflow.mjs +389 -0
  347. package/workflows/question-crops/README.md +35 -0
  348. package/workflows/question-crops/prompts/inventory.md +23 -0
  349. package/workflows/question-crops/scripts/image-ops.mjs +305 -0
  350. package/workflows/question-crops/scripts/image-ops.test.mjs +95 -0
  351. package/workflows/question-crops/workflow.mjs +172 -0
  352. package/workflows/ralph-loop/workflow.mjs +162 -0
  353. package/workflows/research/DESIGN.md +449 -0
  354. package/workflows/research/README.md +74 -0
  355. package/workflows/research/prompts/s0-goal.md +43 -0
  356. package/workflows/research/prompts/s1-early-exit.md +22 -0
  357. package/workflows/research/prompts/s1-map.md +58 -0
  358. package/workflows/research/prompts/s2-options.md +53 -0
  359. package/workflows/research/prompts/s3-deep-dive.md +56 -0
  360. package/workflows/research/prompts/s4-verify.md +74 -0
  361. package/workflows/research/prompts/s5-synthesis.md +81 -0
  362. package/workflows/research/prompts/s5b-fill-gaps.md +32 -0
  363. package/workflows/research/prompts/s6-package.md +32 -0
  364. package/workflows/research/scripts/build-report.mjs +98 -0
  365. package/workflows/research/workflow.mjs +288 -0
  366. package/workflows/wechat-reading-shots/prompts/collect-params.md +16 -0
  367. package/workflows/wechat-reading-shots/prompts/evaluate.md +20 -0
  368. package/workflows/wechat-reading-shots/prompts/open-book.md +28 -0
  369. package/workflows/wechat-reading-shots/prompts/read-page.md +13 -0
  370. package/workflows/wechat-reading-shots/prompts/turn-batch.md +24 -0
  371. package/workflows/wechat-reading-shots/test/control-flow.test.ts +329 -0
  372. package/workflows/wechat-reading-shots/workflow.mjs +266 -0
  373. package/workflows/wrong-question-docx/README.md +55 -0
  374. package/workflows/wrong-question-docx/prompts/figure-qa.md +8 -0
  375. package/workflows/wrong-question-docx/prompts/transcribe.md +25 -0
  376. package/workflows/wrong-question-docx/scripts/workbook.mjs +857 -0
  377. package/workflows/wrong-question-docx/test/control-flow.test.ts +165 -0
  378. package/workflows/wrong-question-docx/test/workbook.test.mjs +303 -0
  379. package/workflows/wrong-question-docx/workflow.mjs +485 -0
  380. package/plugins/workflow-runner/src/agentCommon.js +0 -354
  381. package/plugins/workflow-runner/src/agentCommon.ts +0 -435
  382. package/plugins/workflow-runner/src/controlFlow/branch.js +0 -40
  383. package/plugins/workflow-runner/src/controlFlow/branch.ts +0 -46
  384. package/plugins/workflow-runner/src/controlFlow/loop.js +0 -211
  385. package/plugins/workflow-runner/src/controlFlow/loop.ts +0 -248
  386. package/plugins/workflow-runner/src/controlFlow/pause.js +0 -129
  387. package/plugins/workflow-runner/src/controlFlow/pause.ts +0 -141
  388. package/plugins/workflow-runner/src/controlFlow/signal.js +0 -21
  389. package/plugins/workflow-runner/src/controlFlow/signal.ts +0 -29
  390. package/plugins/workflow-runner/src/controlFlow/types.js +0 -18
  391. package/plugins/workflow-runner/src/controlFlow/types.ts +0 -63
  392. package/plugins/workflow-runner/src/dslManifest.js +0 -72
  393. package/plugins/workflow-runner/src/dslManifest.ts +0 -127
  394. package/plugins/workflow-runner/src/expressions.js +0 -618
  395. package/plugins/workflow-runner/src/expressions.ts +0 -622
  396. package/plugins/workflow-runner/src/loader.js +0 -573
  397. package/plugins/workflow-runner/src/loader.ts +0 -721
  398. package/plugins/workflow-runner/src/multimodal.js +0 -38
  399. package/plugins/workflow-runner/src/multimodal.ts +0 -64
  400. package/plugins/workflow-runner/src/recovery.js +0 -119
  401. package/plugins/workflow-runner/src/recovery.ts +0 -149
  402. package/plugins/workflow-runner/src/stepExecutors/agent.js +0 -173
  403. package/plugins/workflow-runner/src/stepExecutors/agent.ts +0 -234
  404. package/plugins/workflow-runner/src/stepExecutors/assert.js +0 -41
  405. package/plugins/workflow-runner/src/stepExecutors/assert.ts +0 -50
  406. package/plugins/workflow-runner/src/stepExecutors/echo.js +0 -31
  407. package/plugins/workflow-runner/src/stepExecutors/echo.ts +0 -38
  408. package/plugins/workflow-runner/src/stepExecutors/llm.js +0 -99
  409. package/plugins/workflow-runner/src/stepExecutors/llm.ts +0 -133
  410. package/plugins/workflow-runner/src/stepExecutors/set.js +0 -49
  411. package/plugins/workflow-runner/src/stepExecutors/set.ts +0 -56
  412. package/plugins/workflow-runner/src/stepExecutors/skill.js +0 -111
  413. package/plugins/workflow-runner/src/stepExecutors/skill.ts +0 -140
  414. package/plugins/workflow-runner/src/stepExecutors/tool.js +0 -208
  415. package/plugins/workflow-runner/src/stepExecutors/tool.ts +0 -256
  416. package/plugins/workflow-runner/src/stepExecutors/verify.js +0 -58
  417. package/plugins/workflow-runner/src/stepExecutors/verify.ts +0 -68
  418. package/plugins/workflow-runner/src/stepPipeline.js +0 -277
  419. package/plugins/workflow-runner/src/stepPipeline.ts +0 -366
  420. package/plugins/workflow-runner/test/agent.test.ts +0 -587
  421. package/plugins/workflow-runner/test/agentLlmError.test.ts +0 -373
  422. package/plugins/workflow-runner/test/bashBlacklist.sweep.test.ts +0 -65
  423. package/plugins/workflow-runner/test/captureMisbind.test.ts +0 -99
  424. package/plugins/workflow-runner/test/cli.e2e.test.ts +0 -147
  425. package/plugins/workflow-runner/test/context-files.test.ts +0 -320
  426. package/plugins/workflow-runner/test/e2e.test.ts +0 -370
  427. package/plugins/workflow-runner/test/engineRobustness.test.ts +0 -226
  428. package/plugins/workflow-runner/test/expressions.test.ts +0 -397
  429. package/plugins/workflow-runner/test/foundation.test.ts +0 -126
  430. package/plugins/workflow-runner/test/graceful.test.ts +0 -139
  431. package/plugins/workflow-runner/test/greedyInputs.load.test.ts +0 -47
  432. package/plugins/workflow-runner/test/hostCapability.test.ts +0 -108
  433. package/plugins/workflow-runner/test/illustrate.load.test.ts +0 -183
  434. package/plugins/workflow-runner/test/jsonPayload.test.ts +0 -83
  435. package/plugins/workflow-runner/test/loader.test.ts +0 -617
  436. package/plugins/workflow-runner/test/maxTurnsRetryDelay.test.ts +0 -33
  437. package/plugins/workflow-runner/test/multimodal.test.ts +0 -342
  438. package/plugins/workflow-runner/test/output-schema.test.ts +0 -213
  439. package/plugins/workflow-runner/test/parseWorkflowArgs.test.ts +0 -87
  440. package/plugins/workflow-runner/test/pluginRunner.isolation.test.ts +0 -269
  441. package/plugins/workflow-runner/test/ppt.load.test.ts +0 -1220
  442. package/plugins/workflow-runner/test/ralphLoop.e2e.test.ts +0 -220
  443. package/plugins/workflow-runner/test/recovery.test.ts +0 -265
  444. package/plugins/workflow-runner/test/runner.test.ts +0 -911
  445. package/plugins/workflow-runner/test/runnerPreflight.test.ts +0 -379
  446. package/plugins/workflow-runner/test/skillTurnDone.test.ts +0 -71
  447. package/plugins/workflow-runner/test/stateLifecycle.test.ts +0 -150
  448. package/plugins/workflow-runner/test/stepPipeline.test.ts +0 -114
  449. package/plugins/workflow-runner/test/taskArbitration.test.ts +0 -338
  450. package/plugins/workflow-runner/test/taskLifecycle.test.ts +0 -270
  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 -199
  468. package/workflows/schema.json +0 -176
  469. package/workflows/webppt.yaml +0 -496
  470. package/workflows/wechat-reading-shots.yaml +0 -315
  471. package/workflows/word.yaml +0 -720
  472. package/workflows/youtube-shorts.yaml +0 -202
package/src/cli/print.js CHANGED
@@ -27,10 +27,12 @@ import { updateSessionMetadata } from '../context/sessionRegistry.js';
27
27
  import { workspaceIndexService } from '../context/workspaceIndex.js';
28
28
  import { normalizeImageDetail } from '../multimodal.js';
29
29
  import { runWithPlugins } from '../plugins/pluginRunner.js';
30
- import { 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';
@@ -108,8 +110,16 @@ export function extractImageOptions(args) {
108
110
  * stop_reason = end_turn | max_turns | stalled | error | interrupted | config_error
109
111
  * num_turns = assistant_message 事件计数
110
112
  * error = 失败文案(成功时 null)
113
+ * warnings = 本轮所有非致命警告(与 stderr 同源;宿主要结构化的那一份)
111
114
  * session_file(可选)= 当前对话落盘路径;拿得到才填,拿不到省略该键
112
115
  *
116
+ * completionStatus = 本层从 stop_reason + deliverables 重算:跑完了没、产物验没验
117
+ * delivery_status(可选)= 内核 turn_done 的交付判定,**回答的是另一个问题**:
118
+ * completed / delivery_incomplete / delivery_unverified / claims_unverified。
119
+ * 两者并列而非替代 —— `ok:true` 配 `delivery_status:'claims_unverified'` 是
120
+ * 完全合法的一行:Agent 确实正常收尾了,但它宣称的「测试已通过」没有证据支撑。
121
+ * 判断「任务是否真做成」的宿主应当读它,而不是只看 ok。
122
+ *
113
123
  * 导出供单测断言。
114
124
  */
115
125
  export function emitJsonResult(result, sessionFile) {
@@ -136,6 +146,11 @@ export function emitJsonResult(result, sessionFile) {
136
146
  num_turns: result.numTurns,
137
147
  error: result.error,
138
148
  completionStatus,
149
+ ...(result.deliveryStatus ? { delivery_status: result.deliveryStatus } : {}),
150
+ // ⚠️ 读了就必须输出。本仓库在 `turn_done.completionStatus` 上正犯过反面错误:
151
+ // 事件被读进 result 却没进 JSON,于是模型谎报成功时宿主拿到的 JSON
152
+ // 与一切正常逐字节相同。goal_status 同理,不能只留在进程里。
153
+ ...(result.goalStatus ? { goal_status: result.goalStatus } : {}),
139
154
  deliverables,
140
155
  verification: allVerified ? 'passed' : deliverables.length > 0 ? 'not_run' : 'none',
141
156
  warnings,
@@ -265,13 +280,10 @@ export async function runPrintMode(provider, args, initialHistory, options) {
265
280
  memoryAccess: options.memoryAccess ?? 'read-only',
266
281
  interactiveAsk: false,
267
282
  computer: computerRun,
283
+ computerIntent: classifyComputerAutomationIntent(prompt, sessionState.computerAutomation),
268
284
  });
269
285
  const turnTools = filterToolsForRuntime(ALL_TOOLS, runtimeContext);
270
- const stablePrompt = await buildBaseSystemPrompt(cwd, turnTools);
271
- if (history[0]?.role === 'system')
272
- history[0] = { ...history[0], content: stablePrompt };
273
- else
274
- history.unshift({ role: 'system', content: stablePrompt });
286
+ await refreshStableSystemPrompt(history, cwd, turnTools);
275
287
  const transientBundle = await buildTransientPromptBundle({
276
288
  cwd,
277
289
  tools: turnTools,
@@ -353,6 +365,10 @@ export function handleEvent(event, result, verbose, outputFormat = 'text') {
353
365
  // 一轮 assistant 消息完整组装 → 回合计数 +1(json 契约的 num_turns)
354
366
  result.numTurns++;
355
367
  return {};
368
+ case 'assistant_draft_discarded':
369
+ if (event.textLength > 0)
370
+ result.buffer = result.buffer.slice(0, Math.max(0, result.buffer.length - event.textLength));
371
+ return {};
356
372
  case 'tool_start':
357
373
  if (verbose) {
358
374
  process.stderr.write(`\n🔧 工具: ${event.toolName}(${event.argsPreview})\n`);
@@ -399,11 +415,23 @@ export function handleEvent(event, result, verbose, outputFormat = 'text') {
399
415
  // 通用非致命警告(如 workflow 多余参数、pause 被自动跳过等)始终走 stderr,
400
416
  // 不受 verbose 控制 —— 这是用户必须看到的信号,避免静默丢弃语义被忽略。
401
417
  process.stderr.write(`${event.message}\n`);
418
+ // 同时收进结局契约:stderr 是给人看的,spawn 它的宿主要的是结构化的一条。
419
+ // (此前 PrintResult.warnings 声明了、读了、也输出了,就是没有任何地方写它 ——
420
+ // json 那行的 warnings 恒为空数组。)
421
+ (result.warnings ??= []).push(event.message);
402
422
  return {};
403
423
  case 'turn_done':
404
424
  // text 模式:非 verbose 时这里一次性把累积答案打到 stdout(旧行为,逐字节不变)。
405
425
  // json 模式:只记 stopReason='end_turn',stdout 保持静默。
406
426
  result.stopReason = 'end_turn';
427
+ // 内核的交付判定必须过进程边界:模型谎称「已验证」时,若不记这一笔,
428
+ // 宿主收到的 JSON 与一切正常逐字节相同,唯一线索只剩 stderr 上一行中文。
429
+ if (event.completionStatus)
430
+ result.deliveryStatus = event.completionStatus;
431
+ // 托管运行时的生命周期状态(goal 等)。同上:读了就必须输出,
432
+ // 否则「Agent 自检通过但还没人验收」在宿主眼里与「办完了」逐字节相同。
433
+ if (event.managedStatus)
434
+ result.goalStatus = event.managedStatus;
407
435
  if (!isJson && !verbose)
408
436
  console.log(result.buffer);
409
437
  return {};
@@ -435,6 +463,16 @@ export function handleEvent(event, result, verbose, outputFormat = 'text') {
435
463
  if (isJson)
436
464
  result.stopReason = 'interrupted';
437
465
  return {};
466
+ case 'workflow_progress': {
467
+ if (!isJson) {
468
+ const count = event.current !== undefined && event.total !== undefined
469
+ ? ` ${event.current}/${event.total}`
470
+ : '';
471
+ const indent = ' '.repeat(event.depth ?? 0);
472
+ console.error(`${indent}[${event.workflow}]${count}${event.message ? ` ${event.message}` : ''}`);
473
+ }
474
+ return {};
475
+ }
438
476
  // 已知但 -p 模式无需呈现的框架事件:显式忽略,好让 default 只剩"真正未知"的插件私有事件。
439
477
  case 'user_message_committed':
440
478
  case 'tool_messages_committed':
package/src/cli/print.ts CHANGED
@@ -29,10 +29,12 @@ import { workspaceIndexService } from '../context/workspaceIndex.js';
29
29
  import { normalizeImageDetail } from '../multimodal.js';
30
30
  import type { DeliverableManifest, FileActivityMetadata, HarnessDiagnostics, ImageInputSpec, LoopEvent, Message, Provider } from '../types.js';
31
31
  import { runWithPlugins } from '../plugins/pluginRunner.js';
32
- import { 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,
@@ -98,6 +100,26 @@ export interface PrintResult {
98
100
  deliverables?: DeliverableManifest['files'];
99
101
  warnings?: string[];
100
102
  harnessDiagnostics?: HarnessDiagnostics;
103
+ /**
104
+ * 内核 `turn_done` 给出的交付判定(loop.ts 的四态词表)。
105
+ *
106
+ * 与下面 json 里那个从 stopReason+deliverables 重算的 `completionStatus` **不是**
107
+ * 一回事:那个只回答「跑完了没、产物验没验」,这个回答「模型宣称的事到底做没做」。
108
+ * 尤其 `claims_unverified` —— 模型说「测试已全部通过」但本轮证据台账里没有一条
109
+ * 成功的验证记录 —— 是重不重要全看它能不能过进程边界。
110
+ */
111
+ deliveryStatus?: string;
112
+ /**
113
+ * Goal 生命周期状态(跑的是 `/workflow goal` 这类托管运行时才有)。
114
+ *
115
+ * ⚠️ 它与 `completionStatus` / `delivery_status` 都不是一回事,三者并列:
116
+ * · completionStatus = 本层重算:跑完了没、产物验没验
117
+ * · delivery_status = 内核 turn_done:模型宣称的事做没做
118
+ * · goal_status = **生命周期事实源**:这件事有没有被人验收
119
+ * `ok:true` + `goal_status:'ready_for_acceptance'` 是正常且重要的组合 ——
120
+ * 机器自检通过,但还没有人点头。宿主把它当成「办完了」就会错。
121
+ */
122
+ goalStatus?: string;
101
123
  }
102
124
 
103
125
  /** handleEvent 返回的结构 */
@@ -191,8 +213,16 @@ export function extractImageOptions(args: string[]): {
191
213
  * stop_reason = end_turn | max_turns | stalled | error | interrupted | config_error
192
214
  * num_turns = assistant_message 事件计数
193
215
  * error = 失败文案(成功时 null)
216
+ * warnings = 本轮所有非致命警告(与 stderr 同源;宿主要结构化的那一份)
194
217
  * session_file(可选)= 当前对话落盘路径;拿得到才填,拿不到省略该键
195
218
  *
219
+ * completionStatus = 本层从 stop_reason + deliverables 重算:跑完了没、产物验没验
220
+ * delivery_status(可选)= 内核 turn_done 的交付判定,**回答的是另一个问题**:
221
+ * completed / delivery_incomplete / delivery_unverified / claims_unverified。
222
+ * 两者并列而非替代 —— `ok:true` 配 `delivery_status:'claims_unverified'` 是
223
+ * 完全合法的一行:Agent 确实正常收尾了,但它宣称的「测试已通过」没有证据支撑。
224
+ * 判断「任务是否真做成」的宿主应当读它,而不是只看 ok。
225
+ *
196
226
  * 导出供单测断言。
197
227
  */
198
228
  export function emitJsonResult(result: PrintResult, sessionFile?: string): void {
@@ -220,6 +250,11 @@ export function emitJsonResult(result: PrintResult, sessionFile?: string): void
220
250
  num_turns: result.numTurns,
221
251
  error: result.error,
222
252
  completionStatus,
253
+ ...(result.deliveryStatus ? { delivery_status: result.deliveryStatus } : {}),
254
+ // ⚠️ 读了就必须输出。本仓库在 `turn_done.completionStatus` 上正犯过反面错误:
255
+ // 事件被读进 result 却没进 JSON,于是模型谎报成功时宿主拿到的 JSON
256
+ // 与一切正常逐字节相同。goal_status 同理,不能只留在进程里。
257
+ ...(result.goalStatus ? { goal_status: result.goalStatus } : {}),
223
258
  deliverables,
224
259
  verification: allVerified ? 'passed' : deliverables.length > 0 ? 'not_run' : 'none',
225
260
  warnings,
@@ -358,11 +393,13 @@ export async function runPrintMode(
358
393
  memoryAccess: options.memoryAccess ?? 'read-only',
359
394
  interactiveAsk: false,
360
395
  computer: computerRun,
396
+ computerIntent: classifyComputerAutomationIntent(
397
+ prompt,
398
+ sessionState.computerAutomation,
399
+ ),
361
400
  });
362
401
  const turnTools = filterToolsForRuntime(ALL_TOOLS, runtimeContext);
363
- const stablePrompt = await buildBaseSystemPrompt(cwd, turnTools);
364
- if (history[0]?.role === 'system') history[0] = { ...history[0], content: stablePrompt };
365
- else history.unshift({ role: 'system', content: stablePrompt });
402
+ await refreshStableSystemPrompt(history, cwd, turnTools);
366
403
  const transientBundle = await buildTransientPromptBundle({
367
404
  cwd,
368
405
  tools: turnTools,
@@ -457,6 +494,14 @@ export function handleEvent(
457
494
  result.numTurns++;
458
495
  return {};
459
496
 
497
+ case 'assistant_draft_discarded':
498
+ if (event.textLength > 0)
499
+ result.buffer = result.buffer.slice(
500
+ 0,
501
+ Math.max(0, result.buffer.length - event.textLength),
502
+ );
503
+ return {};
504
+
460
505
  case 'tool_start':
461
506
  if (verbose) {
462
507
  process.stderr.write(`\n🔧 工具: ${event.toolName}(${event.argsPreview})\n`);
@@ -509,12 +554,22 @@ export function handleEvent(
509
554
  // 通用非致命警告(如 workflow 多余参数、pause 被自动跳过等)始终走 stderr,
510
555
  // 不受 verbose 控制 —— 这是用户必须看到的信号,避免静默丢弃语义被忽略。
511
556
  process.stderr.write(`${event.message}\n`);
557
+ // 同时收进结局契约:stderr 是给人看的,spawn 它的宿主要的是结构化的一条。
558
+ // (此前 PrintResult.warnings 声明了、读了、也输出了,就是没有任何地方写它 ——
559
+ // json 那行的 warnings 恒为空数组。)
560
+ (result.warnings ??= []).push(event.message);
512
561
  return {};
513
562
 
514
563
  case 'turn_done':
515
564
  // text 模式:非 verbose 时这里一次性把累积答案打到 stdout(旧行为,逐字节不变)。
516
565
  // json 模式:只记 stopReason='end_turn',stdout 保持静默。
517
566
  result.stopReason = 'end_turn';
567
+ // 内核的交付判定必须过进程边界:模型谎称「已验证」时,若不记这一笔,
568
+ // 宿主收到的 JSON 与一切正常逐字节相同,唯一线索只剩 stderr 上一行中文。
569
+ if (event.completionStatus) result.deliveryStatus = event.completionStatus;
570
+ // 托管运行时的生命周期状态(goal 等)。同上:读了就必须输出,
571
+ // 否则「Agent 自检通过但还没人验收」在宿主眼里与「办完了」逐字节相同。
572
+ if (event.managedStatus) result.goalStatus = event.managedStatus;
518
573
  if (!isJson && !verbose) console.log(result.buffer);
519
574
  return {};
520
575
 
@@ -547,6 +602,20 @@ export function handleEvent(
547
602
  if (isJson) result.stopReason = 'interrupted';
548
603
  return {};
549
604
 
605
+ case 'workflow_progress': {
606
+ if (!isJson) {
607
+ const count =
608
+ event.current !== undefined && event.total !== undefined
609
+ ? ` ${event.current}/${event.total}`
610
+ : '';
611
+ const indent = ' '.repeat(event.depth ?? 0);
612
+ console.error(
613
+ `${indent}[${event.workflow}]${count}${event.message ? ` ${event.message}` : ''}`,
614
+ );
615
+ }
616
+ return {};
617
+ }
618
+
550
619
  // 已知但 -p 模式无需呈现的框架事件:显式忽略,好让 default 只剩"真正未知"的插件私有事件。
551
620
  case 'user_message_committed':
552
621
  case 'tool_messages_committed':
@@ -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
+ }