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
@@ -0,0 +1,32 @@
1
+ 你在执行最后的「精选交付」步骤:把值得交付的验证脚本从 `{{dir}}/verify/` 精选、
2
+ 清理后复制进 `{{dir}}/deliverable/scripts/`。
3
+
4
+ `{{dir}}/verify/` 里的失败/废弃/探索性脚本是**过程记录,一律不进入交付目录**。
5
+
6
+ 请先 Read:
7
+ - `{{dir}}/05-verification.md`(哪些脚本验证通过、对应什么结论)
8
+ - `{{dir}}/06-synthesis.md` 的「三b、已通过脚本验证的关键结论」小节(哪些结论被最终引用)
9
+ - Glob `{{dir}}/verify/*`(现有脚本清单)
10
+
11
+ ## 筛选规则(**三条同时满足**才复制)
12
+ 1. 该脚本对应的验证记录是「验证通过」;
13
+ 2. 对应结论被 06-synthesis.md 引用了;
14
+ 3. 脚本能独立用 `bun run` / `node` 运行。
15
+
16
+ ## 复制时做最小整理
17
+ - 去掉纯调试用的打印;
18
+ - 文件头补 2-3 行注释:这个脚本验证什么结论、怎么运行、预期输出;
19
+ - 文件名要能看出验证内容(如 `verify_binance_kline_fetch.ts`,不要 `test3_v2.ts`)。
20
+
21
+ ## 必须写 `{{dir}}/deliverable/scripts/README.md`(脚本清单表)
22
+
23
+ | 脚本文件名 | 对应结论(简述) | 运行方式 | 预期输出说明 |
24
+ |---|---|---|---|
25
+
26
+ 交付目录里每个脚本都必须在表里有一行。
27
+ 若没有可交付脚本(提前退出路径 / 全部验证失败 / 全部待人工验证),
28
+ README 直接写明原因(例:「本次调研提前退出,未产生验证脚本」),**不要硬凑**。
29
+
30
+ ## 约束
31
+ - 只准往 `{{dir}}/deliverable/scripts/` 写,**不改 `{{dir}}/verify/` 里的原件**。
32
+ - 不确定某脚本是否该交付时,**宁可不交付**、在 README 里说明。
@@ -0,0 +1,98 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * workflows/research/scripts/build-report.mjs —— 把各阶段产物拼装成最终报告
4
+ *
5
+ * 用法:node workflows/research/scripts/build-report.mjs <研究目录> <depth>
6
+ *
7
+ * 自 research.yaml 的 s6_build_report 迁移。原来是一大段 bash:
8
+ * sec() { sed -E 's/^(#+) /\1## /' "$1"; }
9
+ * 改写成 node 的三个理由(不是为了好看):
10
+ * ① **可移植**:原版依赖 `sed -E`、`set -euo pipefail`、`basename`,Windows 上要靠
11
+ * Git Bash 才有;宿主回落 cmd 时整段直接不可用(本项目为此踩过坑)。
12
+ * ② **可单独跑**:拼装出问题时 `node scripts/build-report.mjs out/research/x standard`
13
+ * 一条命令复现,不用启动整条工作流等前面五个阶段跑完。
14
+ * ③ **注入面为零**:原版把 depth 内插进 shell 命令体(虽是 enum 白名单所以当时安全),
15
+ * 这里根本不经过 shell。
16
+ *
17
+ * 标题降级的取舍与原版一致:子文档的 `#` 降两级成 `###`,落在章节 `##` 之下。
18
+ * 已知副作用:代码块里顶格的 `# 注释` 也会被降级 —— 纯视觉影响,不改语义。
19
+ */
20
+
21
+ import { existsSync, readFileSync, readdirSync, writeFileSync, mkdirSync } from 'node:fs';
22
+ import { basename, join } from 'node:path';
23
+
24
+ const [dir, depth = 'standard'] = process.argv.slice(2);
25
+ if (!dir) {
26
+ console.error('用法:build-report.mjs <研究目录> [depth]');
27
+ process.exit(1);
28
+ }
29
+
30
+ /** 读文件并把所有标题降两级;文件不存在返回占位说明而不是空串。 */
31
+ function section(file) {
32
+ if (!existsSync(file)) {
33
+ return `> ⚠️ 缺少 \`${basename(file)}\` —— 该阶段可能被跳过或失败,详见 progress.md。`;
34
+ }
35
+ return readFileSync(file, 'utf8').replace(/^(#+) /gm, '$1## ');
36
+ }
37
+
38
+ const out = [];
39
+ const push = (...lines) => out.push(...lines);
40
+ const rule = () => push('', '---', '');
41
+
42
+ push('# 技术研究报告', '');
43
+ push(`_调研深度:${depth} | 由 minimal-agent research 工作流自动生成_`);
44
+ rule();
45
+
46
+ push('## 1. 目标与边界', '');
47
+ push(section(join(dir, '01-goal.md')));
48
+ rule();
49
+
50
+ push('## 2. 领域地图', '');
51
+ push(section(join(dir, '02-map.md')));
52
+ rule();
53
+
54
+ push('## 3. 候选方案对比', '');
55
+ push(section(join(dir, '03-options.md')));
56
+ rule();
57
+
58
+ push('## 4. 深度调研', '');
59
+ let dives = [];
60
+ try {
61
+ dives = readdirSync(dir)
62
+ .filter((f) => f.startsWith('04-deep-dive-') && f.endsWith('.md'))
63
+ .sort();
64
+ } catch {
65
+ /* 目录读不到就当没有深挖文件 */
66
+ }
67
+ if (dives.length === 0) {
68
+ push('> 本次调研未产生深度调研分支(可能走了提前退出路径)。', '');
69
+ } else {
70
+ for (const f of dives) {
71
+ push(`### ${f.replace(/^04-deep-dive-/, '').replace(/\.md$/, '')}`, '');
72
+ push(section(join(dir, f)), '');
73
+ }
74
+ }
75
+ rule();
76
+
77
+ push('## 5. 动手验证', '');
78
+ push(section(join(dir, '05-verification.md')));
79
+ rule();
80
+
81
+ push('## 6. 综合结论与建议', '');
82
+ push(section(join(dir, '06-synthesis.md')));
83
+
84
+ if (existsSync(join(dir, '07-learning-debt.md'))) {
85
+ rule();
86
+ push('## 7. 学习债务与后续研究方向', '');
87
+ push(section(join(dir, '07-learning-debt.md')));
88
+ }
89
+
90
+ rule();
91
+ push('_本报告由 minimal-agent research 工作流自动生成。验证脚本见 deliverable/scripts/ 及其 README。_');
92
+
93
+ const target = join(dir, 'deliverable', 'report.md');
94
+ mkdirSync(join(dir, 'deliverable', 'scripts'), { recursive: true });
95
+ writeFileSync(target, `${out.join('\n')}\n`, 'utf8');
96
+
97
+ // 输出给调用方解析:路径 + 拼进去了几个深挖分支
98
+ console.log(JSON.stringify({ ok: true, path: target, dives: dives.length }));
@@ -0,0 +1,288 @@
1
+ export const meta = {
2
+ apiVersion: 2,
3
+ description:
4
+ '六阶段技术深度调研:定义问题→测绘领域地图→候选方案对比→分支深度调研→动手验证→综合升华。产出含知识地图、对比矩阵、验证记录与最终建议的报告',
5
+ inputs: [
6
+ {
7
+ name: 'topic',
8
+ required: true,
9
+ greedy: true,
10
+ description: '要调研的技术主题/问题/领域(自然语言一句话,越具体越好)',
11
+ },
12
+ {
13
+ name: 'depth',
14
+ type: 'enum',
15
+ values: ['light', 'standard', 'deep'],
16
+ default: 'standard',
17
+ description: '调研深度(light=快速扫盲;standard=可用结论;deep=学术级深度)',
18
+ },
19
+ {
20
+ name: 'max_iterations',
21
+ type: 'number',
22
+ default: 2,
23
+ description: '综合阶段自检-补洞最大轮数(防无限递归)',
24
+ },
25
+ ],
26
+ artifacts: [],
27
+ }
28
+
29
+ export default async function run(wf) {
30
+ const { values: args } = wf.input
31
+ const { sessionId: session, taskId: task, workflowDir } = wf.runtime
32
+ const { agent } = wf.model
33
+ const { shell: sh, file: execFile } = wf.exec
34
+ const { readText, readJson, exists } = wf.fs
35
+ const { ask } = wf.flow
36
+ const { budget, resetModelContext: resetContext, addGoalSupplement } = wf.state
37
+ const echo = wf.output.message
38
+ const declareArtifact = wf.output.artifact
39
+ const log = (message) => wf.output.progress({ phase: 'workflow', status: 'update', message: String(message) })
40
+
41
+ // ============================================================
42
+ // 自 research.yaml 迁移。本文件是**流程的目录** —— 细节下沉到:
43
+ // prompts/*.md 九段长 prompt(改措辞不用动代码,diff 干净)
44
+ // scripts/build-report.mjs 报告拼装(原 bash 用 sed/basename,Windows 上不可靠)
45
+ //
46
+ // 六阶段 + 两个可选分支:
47
+ // 阶段0 定义问题 →(用户确认闸门)
48
+ // 阶段1 测绘地图 →【提前退出判定】→ 是:简化报告直奔阶段6
49
+ // 阶段2 方案对比 → 阶段3 逐分支深挖 → 阶段4 动手验证 → 阶段5 综合
50
+ // 阶段5b 自检补洞循环(缺口清空即退出)
51
+ // 阶段6 确定性拼装报告 + 精选脚本交付
52
+ // ============================================================
53
+
54
+ const DIR = `out/research/${session}/${task}`
55
+ const REPORT = `${DIR}/deliverable/report.md`
56
+ const PROMPTS = typeof workflowDir === 'string' && workflowDir ? `${workflowDir}/prompts` : 'workflows/research/prompts'
57
+
58
+ /** 读 prompt 文件并填占位符。用 readText 而不是 tool('Read'):后者返回的是
59
+ * 给模型看的格式(每行带「行号+TAB」前缀),整段行号会跟着进 prompt。 */
60
+ async function prompt(name, vars = {}) {
61
+ const raw = await readText(`${PROMPTS}/${name}.md`)
62
+ if (raw === null) throw new Error(`读不到 prompt 文件:${PROMPTS}/${name}.md`)
63
+ let text = raw
64
+ for (const [k, v] of Object.entries({ topic: args.topic, depth: args.depth, dir: DIR, ...vars })) {
65
+ text = text.split(`{{${k}}}`).join(String(v ?? ''))
66
+ }
67
+ return text
68
+ }
69
+
70
+ /**
71
+ * 跑一个阶段并核实它该产出的文件;没产出就有界 nudge。
72
+ * 这是脊梁规则的统一实现 —— 每个写文件的阶段都必须经它,不许直接 agent()。
73
+ */
74
+ async function stage(label, promptText, outputs, opts = {}) {
75
+ let out = await agent(promptText, { label, maxTurns: opts.maxTurns ?? 25, ...opts })
76
+ for (let i = 1; i <= 2; i++) {
77
+ const missing = []
78
+ for (const f of outputs) if (!(await exists(f))) missing.push(f)
79
+ if (missing.length === 0) break
80
+ log(`${label}:还缺 ${missing.length} 个文件,第 ${i} 次提醒`)
81
+ out = await agent(
82
+ `以下文件还没有生成:\n${missing.map((m) => `- ${m}`).join('\n')}\n\n` +
83
+ '请**现在就调用 Write 工具**把它们写出来,不要只描述你打算做什么。内容要求见上一条消息。',
84
+ { label: `${label}·nudge-${i}`, allowedTools: opts.allowedTools, maxTurns: 12 },
85
+ )
86
+ }
87
+ const still = []
88
+ for (const f of outputs) if (!(await exists(f))) still.push(f)
89
+ if (still.length > 0) {
90
+ throw new Error(`${label} 未能产出:${still.join('、')}`)
91
+ }
92
+ for (const f of outputs) declareArtifact(f)
93
+ return out
94
+ }
95
+
96
+ const RESEARCH_TOOLS = ['WebSearch', 'WebFetch', 'Read', 'Write', 'Bash', 'Glob']
97
+
98
+ // ── 初始化:只 mkdir,不删任何文件 ──────────────────────────────────
99
+ // 产物路径唯一且命名固定,子 agent 用 Write 覆盖本身就幂等;用 rm 反而会
100
+ // 静默删掉用户预先放在这里的东西,也会撞上 Bash 的永久删除守卫。
101
+ await sh(`mkdir -p ${DIR}/verify ${DIR}/deliverable/scripts`)
102
+
103
+ // ── 阶段 0:定义问题 ────────────────────────────────────────────────
104
+ await stage('阶段0/6·定义问题', await prompt('s0-goal'), [`${DIR}/01-goal.md`], {
105
+ allowedTools: ['Read', 'Write'],
106
+ maxTurns: 12,
107
+ })
108
+ // 澄清结论并入贯穿目标,后续每一步(含打回重来轮)都看得到
109
+ await addGoalSupplement(`调研目标定义见 ${DIR}/01-goal.md`)
110
+
111
+ // ── 用户确认闸门(非交互宿主自动选推荐项,不挂起)────────────────────
112
+ const approval = await ask(
113
+ `已完成问题定义,请阅读 ${DIR}/01-goal.md。\n` +
114
+ '确认核心问题、范围边界、验收标准是否符合预期;要调整范围或补充要求就选「其他」输入,' +
115
+ '工作流会把它作为补充要求贯穿全程。',
116
+ [
117
+ { label: '继续执行 (推荐)', description: '按当前问题定义继续调研' },
118
+ { label: '停止', description: '中止本次运行;现场保留可续跑' },
119
+ ],
120
+ )
121
+ if (approval.includes('停止')) {
122
+ throw new Error('用户在问题定义确认闸门选择停止(现场已保留,重跑同目标可续跑)')
123
+ }
124
+ if (!approval.includes('继续执行') && approval.trim()) {
125
+ await addGoalSupplement(approval)
126
+ log('已把你的补充要求并入贯穿目标')
127
+ }
128
+
129
+ // ── 阶段 1:测绘领域地图 + 提前退出判定 ─────────────────────────────
130
+ await stage(
131
+ '阶段1/6·测绘领域地图',
132
+ await prompt('s1-map'),
133
+ [`${DIR}/02-map.md`, `${DIR}/early-exit.json`],
134
+ { allowedTools: RESEARCH_TOOLS, maxTurns: 25 },
135
+ )
136
+
137
+ const exitJson = await readJson(`${DIR}/early-exit.json`)
138
+ const earlyExit = exitJson?.early === true
139
+ if (earlyExit) {
140
+ log(`提前退出:${exitJson?.reason ?? '(未给理由)'}`)
141
+ }
142
+
143
+ if (earlyExit) {
144
+ // ── 简化路径:一次补齐全套文件,让阶段6 的拼装无需分叉 ──────────────
145
+ await stage(
146
+ '简化路径·补齐全套文件',
147
+ await prompt('s1-early-exit'),
148
+ [
149
+ `${DIR}/03-options.md`,
150
+ `${DIR}/branches.json`,
151
+ `${DIR}/05-verification.md`,
152
+ `${DIR}/06-synthesis.md`,
153
+ `${DIR}/07-learning-debt.md`,
154
+ `${DIR}/gaps.json`,
155
+ ],
156
+ { allowedTools: ['Read', 'Write'], maxTurns: 12 },
157
+ )
158
+ } else {
159
+ // ── 阶段 2:候选方案对比 ──────────────────────────────────────────
160
+ await stage(
161
+ '阶段2/6·候选方案对比',
162
+ await prompt('s2-options'),
163
+ [`${DIR}/03-options.md`, `${DIR}/branches.json`],
164
+ { allowedTools: RESEARCH_TOOLS, maxTurns: 25 },
165
+ )
166
+
167
+ const branches = await readJson(`${DIR}/branches.json`)
168
+ if (!Array.isArray(branches) || branches.length === 0) {
169
+ throw new Error(
170
+ `未能从 ${DIR}/branches.json 读到任何深度调研分支(JSON 格式错误或数组为空)`,
171
+ )
172
+ }
173
+
174
+ // ── 阶段 3:逐分支深挖。每轮重置上下文,分支之间互不干扰 ────────────
175
+ for (const [i, branch] of branches.entries()) {
176
+ resetContext()
177
+ const safe = String(branch.safe_name ?? `branch-${i + 1}`).replace(/[^\w.-]/g, '-')
178
+ await stage(
179
+ `阶段3/6·深挖「${branch.name ?? safe}」`,
180
+ await prompt('s3-deep-dive', {
181
+ branchName: branch.name ?? safe,
182
+ branchDesc: branch.description ?? '(未给描述,按分支名自行判断)',
183
+ safeName: safe,
184
+ }),
185
+ [`${DIR}/04-deep-dive-${safe}.md`],
186
+ { allowedTools: RESEARCH_TOOLS, maxTurns: 30 },
187
+ )
188
+ }
189
+
190
+ // ── 阶段 4:动手验证 ─────────────────────────────────────────────
191
+ resetContext()
192
+ await stage('阶段4/6·动手验证', await prompt('s4-verify'), [`${DIR}/05-verification.md`], {
193
+ allowedTools: ['Bash', 'Read', 'Write', 'Glob', 'WebSearch', 'WebFetch'],
194
+ maxTurns: 25,
195
+ })
196
+
197
+ // ── 阶段 5:综合升华 ─────────────────────────────────────────────
198
+ resetContext()
199
+ await stage(
200
+ '阶段5/6·综合结论',
201
+ await prompt('s5-synthesis'),
202
+ [`${DIR}/06-synthesis.md`, `${DIR}/07-learning-debt.md`, `${DIR}/gaps.json`],
203
+ { allowedTools: ['Read', 'Write', 'Glob', 'WebSearch', 'WebFetch'], maxTurns: 20 },
204
+ )
205
+
206
+ // ── 阶段 5b:自检补洞循环,缺口清空即退出 ──────────────────────────
207
+ const maxRounds = Number(args.max_iterations ?? 2)
208
+ for (let round = 1; round <= maxRounds; round++) {
209
+ // 预算闸只在开新一轮之前判 —— 补洞循环是本工作流里唯一「不断开新一轮」的地方,
210
+ // 前面那些 for 都是按数据项遍历(有界,不会失控),不需要也不该加。
211
+ const money = await budget()
212
+ if (money.exhausted) {
213
+ echo(`\n💰 token 预算已用尽(已花 ${money.used} / 上限 ${money.limit}),补洞循环停在第 ${round - 1} 轮。`)
214
+ echo('已产出的部分完好;加大预算后重跑可从断点继续。')
215
+ break
216
+ }
217
+ const gaps = await readJson(`${DIR}/gaps.json`)
218
+ if (!Array.isArray(gaps) || gaps.length === 0) {
219
+ echo('✅ 自检无缺口,补洞循环结束。')
220
+ break
221
+ }
222
+ resetContext()
223
+ log(`补洞第 ${round}/${maxRounds} 轮,待补 ${gaps.length} 条`)
224
+ await agent(
225
+ await prompt('s5b-fill-gaps', {
226
+ round: String(round),
227
+ gaps: gaps.map((g) => `- ${g}`).join('\n'),
228
+ }),
229
+ {
230
+ label: `阶段5b·补洞第 ${round}/${maxRounds} 轮`,
231
+ allowedTools: RESEARCH_TOOLS,
232
+ maxTurns: 20,
233
+ },
234
+ )
235
+ }
236
+ }
237
+
238
+ // ── 综合报告形式校验:确定性,不依赖 agent 自觉 ─────────────────────
239
+ // 「核心结论」兼容两种表述:prompt 要求的字面 + agent 改写时常见的
240
+ // 「核心问题的一句话答案」(实战中补洞轮曾改写标题导致误判 halt)。
241
+ const synth = await sh(
242
+ `grep -E '^#+ .*(核心结论|核心问题的一句话答案|推荐方案)' ${DIR}/06-synthesis.md || true`,
243
+ )
244
+ const hasConclusion = /核心结论|一句话答案/.test(synth.stdout)
245
+ const hasRecommend = synth.stdout.includes('推荐方案')
246
+ if (!hasConclusion || !hasRecommend) {
247
+ throw new Error(
248
+ `${DIR}/06-synthesis.md 缺少「核心结论」或「推荐方案」章节 —— ` +
249
+ '综合报告没有直接回答核心问题,不允许进入拼装。',
250
+ )
251
+ }
252
+
253
+ // ── 阶段 6:确定性拼装最终报告 ──────────────────────────────────────
254
+ const built = await execFile('./scripts/build-report.mjs', [DIR, String(args.depth ?? 'standard')])
255
+ if (built.exitCode !== 0) {
256
+ throw new Error(`报告拼装失败:${built.stderr || built.stdout}`)
257
+ }
258
+ if (!(await exists(REPORT))) {
259
+ throw new Error(`报告拼装脚本报告成功,但 ${REPORT} 不存在`)
260
+ }
261
+ declareArtifact(REPORT)
262
+
263
+ // ── 阶段 6:精选验证脚本交付(失败不阻断,报告已经在手)──────────────
264
+ try {
265
+ await stage(
266
+ '阶段6/6·精选脚本交付',
267
+ await prompt('s6-package'),
268
+ [`${DIR}/deliverable/scripts/README.md`],
269
+ { allowedTools: ['Read', 'Write', 'Bash', 'Glob'], maxTurns: 12 },
270
+ )
271
+ } catch (e) {
272
+ log(`精选交付降级(不阻断,报告已生成):${e.message}`)
273
+ }
274
+
275
+ // ── 收尾 ───────────────────────────────────────────────────────────
276
+ const remaining = await readJson(`${DIR}/gaps.json`)
277
+ const gapCount = Array.isArray(remaining) ? remaining.length : 0
278
+
279
+ echo(`✅ 技术调研完成\n\n主题:${args.topic}\n深度:${args.depth ?? 'standard'}`)
280
+ echo(
281
+ gapCount > 0
282
+ ? `⚠️ 补洞循环达上限退出,仍有 ${gapCount} 条缺口未补全(见 ${DIR}/gaps.json 与 06-synthesis.md 的「调研局限」),结论使用时注意置信度。`
283
+ : '✅ 调研缺口已全部收敛。',
284
+ )
285
+ echo(`★ 请直接阅读汇总报告:${REPORT}\n 过程产物在 ${DIR}/,精选脚本在 ${DIR}/deliverable/scripts/`)
286
+
287
+ return { report: REPORT, dir: DIR, remainingGaps: gapCount, earlyExit }
288
+ }
@@ -0,0 +1,16 @@
1
+ 本次任务需要三个参数。**已经给了的直接用,只问缺的那些**:
2
+
3
+ 书名 book = 「{{book}}」 (空字符串 = 未提供)
4
+ 起始页 start_page = {{startPage}} (0 = 未提供)
5
+ 截图张数 shots = {{shots}} (0 = 未提供)
6
+
7
+ 有缺失就用 **AskUserQuestion 一次性问清所有缺的项**(不要一项一项分多轮问)。
8
+ 给选项的同时也允许自由输入:起始页给 1 / 12 / 50 之类,张数给 5 / 10 / 20 之类。
9
+
10
+ 三项都齐了就**不要问任何问题**,直接输出结果。
11
+
12
+ 最后**只回复一行 JSON**,不要任何解释、不要代码块围栏:
13
+
14
+ ```
15
+ {"book":"书名","page":起始页数字,"shots":张数数字}
16
+ ```
@@ -0,0 +1,20 @@
1
+ 评估**这次自动化跑得成不成功**(不是评估书的内容)。
2
+
3
+ 本次流程:打开《{{book}}》正文 → 翻到第 {{targetPage}} 页(落点 {{landing}})→
4
+ 循环 {{shots}} 次「截图 + 翻页」,实际拍了 {{actualShots}} 张。
5
+
6
+ observe 一次(用说明书的 `read_page_number` 流程读清当前页码),结合过程中看到的
7
+ 截图,如实回答:
8
+
9
+ 1. 打开的确实是《{{book}}》吗?依据是什么?
10
+ 2. 截图是否都是**不同**的页面?依据是每次翻页回执里的变化率(0.0% = 没翻动)。
11
+ 3. 过程中有没有误触?(弹出菜单、放大插图、跳转别的界面、触发购买/分享)
12
+ 4. 当前停在第几页?用放大镜读出来的真实数字,不要猜。
13
+
14
+ 要求:
15
+
16
+ - 每条结论都要说清依据,不要笼统说"成功"
17
+ - 拿不准就明说拿不准
18
+ - **不要凭记忆报按键次数或截图张数** —— 那两个数字上面已经给你了,
19
+ 它们由引擎的循环结构保证,比你的记忆可靠
20
+ - 最后一句总评:成功 / 部分成功 / 失败,以及卡在哪一步
@@ -0,0 +1,28 @@
1
+ 把微信读书弄到《{{book}}》的**正文页**。
2
+
3
+ 判据只有一条:**能读出页码**(形如「N / 总数」)。读得到就算完成。
4
+ 读页码的方法、界面各处的位置、遇到奇怪界面怎么退回去 —— 说明书里都有,
5
+ 它的摘要就在你每次 observe 的回执里,照着做。
6
+
7
+ ⛔ **这一步只负责「打开到正文页」,到此为止。**
8
+ **不要**去翻到第几页 —— 说明书里那条 seek_to_page 流程不归你执行,
9
+ 下一步由引擎驱动,它会先读页码再决定翻多少。你在这里翻页只会把落点搞乱。
10
+ **一旦读到页码,立刻回 OPEN=ok 结束本步**,一个多余动作都不要做。
11
+ (实测教训:这一步曾自作主张把书翻到目标页,干了 4 分钟、还忘了给结论行,
12
+ 整条工作流因为「没有产出任何结果」而 halt。)
13
+
14
+ 纪律:
15
+
16
+ - 第一个动作必须是 observe,先看清在哪再决定做什么
17
+ - 只读任务:不点购买 / 订阅 / 分享 / 赠一得一 / 加入书架
18
+ - **搜索结果里出现多本书名高度相似的书时(这在本应用里非常常见),
19
+ 不要自己挑 —— 用 AskUserQuestion 把候选的完整书名 + 作者列给用户确认。**
20
+ 点错书的代价是后面全部十几张截图都白拍。
21
+ - 操作飞到了不认识的界面:按说明书的 back_to_home 流程复位。
22
+ **别在原地反复试**,也别用鼠标去正文里乱点。
23
+ - 其它卡住、拿不准的地方一样用 AskUserQuestion 问,不要瞎试
24
+
25
+ ⚠️ 无论过程如何,**最后一行必须是下面两者之一**,缺了这行整步算失败:
26
+
27
+ - 已停在能读到页码的正文页 → `OPEN=ok`
28
+ - 试过各种办法仍进不去 → `OPEN=fail`
@@ -0,0 +1,13 @@
1
+ 只做一件事:**读出当前页码**。不要翻页,不要点任何东西。
2
+
3
+ 方法见说明书的 `read_page_number` 流程(摘要就在你每次 observe 的回执里)。
4
+
5
+ **只回复一行**,格式严格如下,不要任何解释:
6
+
7
+ ```
8
+ PAGE=<左页码> <右页码>
9
+ ```
10
+
11
+ 例:`PAGE=84 85`;单页显示时两个写一样:`PAGE=12 12`。
12
+
13
+ 实在读不出来就回复:`PAGE=0 0`
@@ -0,0 +1,24 @@
1
+ 当前页码:{{curPage}} 目标页:{{targetPage}}
2
+
3
+ 照这三步做,**不要自由发挥**:
4
+
5
+ ① 取当前左页码 L —— 就是 `{{curPage}}` 里的第一个数字
6
+
7
+ ② 方向 = L > {{targetPage}} 时用 `left`,否则用 `right`
8
+ N(还要按几次)= 向上取整( |L − {{targetPage}}| ÷ 2 )
9
+ (每次按键翻几页由说明书 `seek_to_page` 给出,别自己假设)
10
+
11
+ ③ 按 N 发**一次**工具调用,然后立刻结束本步:
12
+ - N ≥ 5 → `{action:"key", key:"<方向>", repeat:<min(N,8)>, repeatFrames:"last"}`
13
+ - N ≤ 4 → `{action:"key", key:"<方向>"}`
14
+
15
+ ⛔ **N ≥ 5 时必须用 repeat 一次发满,不许一下一下按。**
16
+ 一下一下按,每按一次都要多花一个完整的 LLM 往返(约 30 秒),
17
+ 而 repeat 一轮就干完(约 1 秒)—— 实测 N=6 时一次一按比批量多花了 5 分钟。
18
+ `repeatFrames:"last"` 也必须带上:不带的话 `repeat:8` 会回 8 张全屏图
19
+ (约 1 万 token),而中间那些页你根本不看。
20
+
21
+ ⛔ 发完就结束本步。不要自己循环、不要自己再 observe 确认 ——
22
+ 外层引擎下一轮会先重新读页码,那才是权威值。
23
+
24
+ ⛔ 全程零鼠标。