minimal-agent 0.13.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (474) hide show
  1. package/README.md +6 -5
  2. package/package.json +60 -4
  3. package/plugins/computer_use/.claude-plugin/plugin.json +1 -1
  4. package/plugins/cron-runner/src/commands.js +4 -4
  5. package/plugins/cron-runner/src/commands.ts +4 -4
  6. package/plugins/workflow-runner/.claude-plugin/plugin.json +2 -2
  7. package/plugins/workflow-runner/commands/workflow.md +57 -90
  8. package/plugins/workflow-runner/commands/workflows.md +4 -4
  9. package/plugins/workflow-runner/plugin.js +24 -13
  10. package/plugins/workflow-runner/plugin.ts +28 -13
  11. package/plugins/workflow-runner/src/discovery.js +160 -0
  12. package/plugins/workflow-runner/src/discovery.ts +194 -0
  13. package/plugins/workflow-runner/src/goalAnchor.js +53 -0
  14. package/plugins/workflow-runner/src/goalAnchor.ts +59 -0
  15. package/plugins/workflow-runner/src/index.js +197 -206
  16. package/plugins/workflow-runner/src/index.ts +248 -249
  17. package/plugins/workflow-runner/src/inputCoercion.js +40 -0
  18. package/plugins/workflow-runner/src/inputCoercion.ts +43 -0
  19. package/plugins/workflow-runner/src/journal.js +224 -0
  20. package/plugins/workflow-runner/src/journal.ts +274 -0
  21. package/plugins/workflow-runner/src/jsonSchema.js +132 -0
  22. package/plugins/workflow-runner/src/jsonSchema.ts +162 -0
  23. package/plugins/workflow-runner/src/moduleResolution.js +64 -0
  24. package/plugins/workflow-runner/src/moduleResolution.ts +71 -0
  25. package/plugins/workflow-runner/src/resourceInputs.js +220 -0
  26. package/plugins/workflow-runner/src/resourceInputs.ts +300 -0
  27. package/plugins/workflow-runner/src/runner.js +400 -489
  28. package/plugins/workflow-runner/src/runner.ts +488 -560
  29. package/plugins/workflow-runner/src/runtime/config.js +46 -0
  30. package/plugins/workflow-runner/src/runtime/config.ts +69 -0
  31. package/plugins/workflow-runner/src/runtime/context.js +1304 -0
  32. package/plugins/workflow-runner/src/runtime/context.ts +1786 -0
  33. package/plugins/workflow-runner/src/runtime/exec.js +34 -0
  34. package/plugins/workflow-runner/src/runtime/exec.ts +53 -0
  35. package/plugins/workflow-runner/src/runtime/flow.js +8 -0
  36. package/plugins/workflow-runner/src/runtime/flow.ts +12 -0
  37. package/plugins/workflow-runner/src/runtime/fs.js +27 -0
  38. package/plugins/workflow-runner/src/runtime/fs.ts +41 -0
  39. package/plugins/workflow-runner/src/runtime/model.js +6 -0
  40. package/plugins/workflow-runner/src/runtime/model.ts +8 -0
  41. package/plugins/workflow-runner/src/runtime/output.js +7 -0
  42. package/plugins/workflow-runner/src/runtime/output.ts +21 -0
  43. package/plugins/workflow-runner/src/runtime/scheduler.js +141 -0
  44. package/plugins/workflow-runner/src/runtime/scheduler.ts +166 -0
  45. package/plugins/workflow-runner/src/runtime/state.js +16 -0
  46. package/plugins/workflow-runner/src/runtime/state.ts +19 -0
  47. package/plugins/workflow-runner/src/runtime/tools.js +3 -0
  48. package/plugins/workflow-runner/src/runtime/tools.ts +6 -0
  49. package/plugins/workflow-runner/src/sandbox.js +141 -0
  50. package/plugins/workflow-runner/src/sandbox.ts +182 -0
  51. package/plugins/workflow-runner/src/scriptGuard.d.mts +38 -0
  52. package/plugins/workflow-runner/src/scriptGuard.mjs +449 -0
  53. package/plugins/workflow-runner/src/taskIdentity.js +151 -307
  54. package/plugins/workflow-runner/src/taskIdentity.ts +207 -355
  55. package/plugins/workflow-runner/src/toolRuntime.js +29 -8
  56. package/plugins/workflow-runner/src/toolRuntime.ts +36 -11
  57. package/plugins/workflow-runner/src/types.js +7 -211
  58. package/plugins/workflow-runner/src/types.ts +154 -623
  59. package/plugins/workflow-runner/src/util.js +47 -0
  60. package/plugins/workflow-runner/src/util.ts +51 -0
  61. package/plugins/workflow-runner/src/workflowContext.js +20 -0
  62. package/plugins/workflow-runner/src/workflowContext.ts +58 -0
  63. package/plugins/workflow-runner/src/workflowDependencies.js +36 -0
  64. package/plugins/workflow-runner/src/workflowDependencies.ts +59 -0
  65. package/plugins/workflow-runner/src/workflowFingerprint.js +118 -0
  66. package/plugins/workflow-runner/src/workflowFingerprint.ts +122 -0
  67. package/plugins/workflow-runner/src/workflowState.js +474 -802
  68. package/plugins/workflow-runner/src/workflowState.ts +575 -970
  69. package/plugins/workflow-runner/test/api.test.ts +223 -0
  70. package/plugins/workflow-runner/test/apiCapabilities.test.ts +614 -0
  71. package/plugins/workflow-runner/test/apiConcurrencyGate.test.ts +104 -0
  72. package/plugins/workflow-runner/test/apiEcho.test.ts +210 -0
  73. package/plugins/workflow-runner/test/apiReadText.test.ts +178 -0
  74. package/plugins/workflow-runner/test/apiResourceLedger.test.ts +184 -0
  75. package/plugins/workflow-runner/test/childWorkflow.test.ts +304 -0
  76. package/plugins/workflow-runner/test/discovery.test.ts +234 -0
  77. package/plugins/workflow-runner/test/goalAnchor.test.ts +106 -0
  78. package/plugins/workflow-runner/test/goalController.test.ts +317 -0
  79. package/plugins/workflow-runner/test/journalLanes.test.ts +198 -0
  80. package/plugins/workflow-runner/test/listResources.test.ts +106 -0
  81. package/plugins/workflow-runner/test/resourceInputs.test.ts +294 -0
  82. package/plugins/workflow-runner/test/sandbox.test.ts +126 -0
  83. package/plugins/workflow-runner/test/scheduler.test.ts +70 -0
  84. package/plugins/workflow-runner/test/scriptGuard.test.ts +276 -0
  85. package/plugins/workflow-runner/test/skillDocSync.test.ts +78 -0
  86. package/plugins/workflow-runner/test/taskIdentity.test.ts +288 -179
  87. package/plugins/workflow-runner/test/workflowFingerprint.test.ts +106 -0
  88. package/plugins/workflow-runner/test/workflowState.test.ts +429 -0
  89. package/skills/pptx/examples/assets/cover-bg.svg +23 -0
  90. package/skills/pptx/examples/assets/icon-spark.svg +5 -0
  91. package/skills/ui-design/SKILL.md +5 -2
  92. package/skills/ui-design/references/layout-composition.md +1 -1
  93. package/skills/workflow-creator/SKILL.md +344 -0
  94. package/skills/workflow-creator/assets/template/workflow.mjs +48 -0
  95. package/skills/workflow-creator/references/api.md +216 -0
  96. package/skills/workflow-creator/references/migration.md +103 -0
  97. package/skills/workflow-creator/references/patterns.md +779 -0
  98. package/skills/workflow-creator/scripts/list-resources.mjs +205 -0
  99. package/skills/workflow-creator/scripts/scaffold.mjs +148 -0
  100. package/skills/workflow-creator/scripts/validate.mjs +275 -0
  101. package/skills/workflow-creator/scripts/workflow-creator.test.mjs +82 -0
  102. package/src/advisor/advisorCoordinator.js +536 -0
  103. package/src/advisor/advisorCoordinator.ts +693 -0
  104. package/src/cli/configMenu.tsx +0 -1
  105. package/src/cli/print.js +27 -6
  106. package/src/cli/print.ts +48 -4
  107. package/src/cli/quickModelSetup.js +12 -1
  108. package/src/cli/quickModelSetup.tsx +15 -3
  109. package/src/cli/streamJson.js +5 -6
  110. package/src/cli/streamJson.ts +8 -4
  111. package/src/cli/wizards/advisorWizard.js +4 -2
  112. package/src/cli/wizards/advisorWizard.tsx +8 -2
  113. package/src/cli/wizards/contextAdvisorWizard.js +5 -4
  114. package/src/cli/wizards/contextAdvisorWizard.tsx +7 -6
  115. package/src/cli/wizards/providerPresets.js +18 -8
  116. package/src/cli/wizards/providerPresets.ts +18 -8
  117. package/src/collaboration/taskFlow.js +115 -0
  118. package/src/collaboration/taskFlow.ts +169 -0
  119. package/src/config/configDefaults.js +41 -1
  120. package/src/config/configDefaults.ts +43 -1
  121. package/src/config/configDiagnostics.ts +2 -2
  122. package/src/config/configFile.js +40 -9
  123. package/src/config/configFile.ts +60 -11
  124. package/src/config/configService.js +419 -74
  125. package/src/config/configService.ts +703 -145
  126. package/src/config/numericLimits.js +22 -0
  127. package/src/config/numericLimits.ts +24 -0
  128. package/src/config.js +1 -0
  129. package/src/config.ts +3 -2
  130. package/src/context/budgetPlan.js +1 -1
  131. package/src/context/budgetPlan.ts +1 -1
  132. package/src/context/compact.js +7 -2
  133. package/src/context/compact.ts +9 -2
  134. package/src/context/microCompactLite.js +212 -13
  135. package/src/context/microCompactLite.ts +261 -12
  136. package/src/context/sessionRegistry.js +8 -1
  137. package/src/context/sessionRegistry.ts +18 -5
  138. package/src/context/toolResultArchive.js +72 -0
  139. package/src/context/toolResultArchive.ts +95 -0
  140. package/src/goal/errors.js +8 -0
  141. package/src/goal/errors.ts +18 -0
  142. package/src/goal/goalRuntime.js +344 -0
  143. package/src/goal/goalRuntime.ts +466 -0
  144. package/src/goal/goalStore.js +200 -0
  145. package/src/goal/goalStore.ts +219 -0
  146. package/src/goal/index.js +4 -0
  147. package/src/goal/index.ts +4 -0
  148. package/src/goal/statusMapping.js +71 -0
  149. package/src/goal/statusMapping.ts +95 -0
  150. package/src/goal/types.js +7 -0
  151. package/src/goal/types.ts +179 -0
  152. package/src/goal/workflowController.js +306 -0
  153. package/src/goal/workflowController.ts +360 -0
  154. package/src/harness/evidenceLedger.js +2 -0
  155. package/src/harness/evidenceLedger.ts +1 -0
  156. package/src/harness/stallGuard.js +9 -3
  157. package/src/harness/stallGuard.ts +7 -3
  158. package/src/images/imageResolver.js +161 -0
  159. package/src/images/imageResolver.ts +189 -0
  160. package/src/infra/verification.js +34 -5
  161. package/src/infra/verification.ts +39 -4
  162. package/src/llm/client.js +79 -21
  163. package/src/llm/client.ts +182 -35
  164. package/src/llm/gatewayClient.js +201 -0
  165. package/src/llm/gatewayClient.ts +299 -0
  166. package/src/llm/messageProvenance.js +46 -0
  167. package/src/llm/messageProvenance.ts +58 -0
  168. package/src/llm/modelProvider.js +1 -0
  169. package/src/llm/modelProvider.ts +22 -0
  170. package/src/llm/providers/anthropicFormat.js +108 -1
  171. package/src/llm/providers/anthropicFormat.ts +115 -4
  172. package/src/llm/providers/openaiFormat.js +9 -0
  173. package/src/llm/providers/openaiFormat.ts +12 -3
  174. package/src/loop.js +328 -55
  175. package/src/loop.ts +382 -58
  176. package/src/main.js +4 -1
  177. package/src/main.tsx +4 -1
  178. package/src/managedExecution/index.js +2 -0
  179. package/src/managedExecution/index.ts +2 -0
  180. package/src/managedExecution/registry.js +15 -0
  181. package/src/managedExecution/registry.ts +20 -0
  182. package/src/managedExecution/types.js +1 -0
  183. package/src/managedExecution/types.ts +86 -0
  184. package/src/modelRef.js +9 -0
  185. package/src/modelRef.ts +31 -0
  186. package/src/multimodal.js +14 -28
  187. package/src/multimodal.ts +17 -33
  188. package/src/net/lanDiscovery.js +65 -0
  189. package/src/net/lanDiscovery.ts +82 -0
  190. package/src/plugin-sdk.js +28 -3
  191. package/src/plugin-sdk.ts +39 -6
  192. package/src/plugins/pluginApi.ts +16 -1
  193. package/src/plugins/pluginLoader.js +4 -0
  194. package/src/plugins/pluginLoader.ts +6 -0
  195. package/src/plugins/pluginRunner.js +139 -7
  196. package/src/plugins/pluginRunner.ts +173 -9
  197. package/src/plugins/slashFallback.js +113 -0
  198. package/src/plugins/slashFallback.ts +137 -0
  199. package/src/prompts/policyRegistry.js +12 -32
  200. package/src/prompts/policyRegistry.ts +15 -32
  201. package/src/prompts/promptAssembly.js +103 -12
  202. package/src/prompts/promptAssembly.ts +114 -12
  203. package/src/prompts/skillList.js +21 -3
  204. package/src/prompts/skillList.ts +27 -2
  205. package/src/prompts/stableSystemPrompt.js +18 -0
  206. package/src/prompts/stableSystemPrompt.ts +33 -0
  207. package/src/runtime/agentRuntimeContext.js +8 -2
  208. package/src/runtime/agentRuntimeContext.ts +17 -4
  209. package/src/session/runAgentTurn.js +78 -12
  210. package/src/session/runAgentTurn.ts +105 -23
  211. package/src/session/runTurn.js +10 -9
  212. package/src/session/runTurn.ts +17 -8
  213. package/src/session/sessionState.ts +2 -0
  214. package/src/team/auth.js +186 -0
  215. package/src/team/auth.ts +298 -0
  216. package/src/team/cli.js +105 -0
  217. package/src/team/cli.ts +122 -0
  218. package/src/team/onlineToolContract.js +64 -0
  219. package/src/team/onlineToolContract.ts +109 -0
  220. package/src/team/toolPolicy.js +36 -0
  221. package/src/team/toolPolicy.ts +75 -0
  222. package/src/tools/advisor/advisor.js +115 -50
  223. package/src/tools/advisor/advisor.ts +124 -51
  224. package/src/tools/advisor/advisorDecision.js +71 -0
  225. package/src/tools/advisor/advisorDecision.ts +85 -0
  226. package/src/tools/agent/agent.js +18 -5
  227. package/src/tools/agent/agent.ts +21 -7
  228. package/src/tools/agent/agentControl.js +246 -0
  229. package/src/tools/agent/agentControl.ts +284 -0
  230. package/src/tools/agent/agentTaskService.js +40 -1
  231. package/src/tools/agent/agentTaskService.ts +44 -1
  232. package/src/tools/agent/agentTypes.js +14 -2
  233. package/src/tools/agent/agentTypes.ts +15 -2
  234. package/src/tools/applypatch/applyPatch.js +362 -0
  235. package/src/tools/applypatch/applyPatch.ts +428 -0
  236. package/src/tools/bash/bash.js +22 -15
  237. package/src/tools/bash/bash.ts +23 -17
  238. package/src/tools/capabilities.js +10 -5
  239. package/src/tools/capabilities.ts +10 -5
  240. package/src/tools/computeruse/computerIntent.js +32 -0
  241. package/src/tools/computeruse/computerIntent.ts +46 -0
  242. package/src/tools/computeruse/telemetryLog.js +12 -0
  243. package/src/tools/computeruse/telemetryLog.ts +16 -0
  244. package/src/tools/computeruse/vision/telemetry.js +1 -0
  245. package/src/tools/computeruse/vision/telemetry.ts +1 -0
  246. package/src/tools/effectiveToolSet.js +4 -0
  247. package/src/tools/effectiveToolSet.ts +4 -0
  248. package/src/tools/index.js +21 -2
  249. package/src/tools/index.ts +33 -2
  250. package/src/tools/presentresult/presentresult.js +6 -15
  251. package/src/tools/presentresult/presentresult.ts +6 -15
  252. package/src/tools/read/read.js +62 -9
  253. package/src/tools/read/read.ts +63 -9
  254. package/src/tools/shared/fileUtils.js +1 -2
  255. package/src/tools/shared/fileUtils.ts +1 -2
  256. package/src/tools/shared/toolOutputStore.js +23 -1
  257. package/src/tools/shared/toolOutputStore.ts +22 -1
  258. package/src/tools/skill/skill.js +9 -3
  259. package/src/tools/skill/skill.ts +8 -4
  260. package/src/tools/toolPromptGuides.js +125 -0
  261. package/src/tools/toolPromptGuides.ts +146 -0
  262. package/src/tools/webbrowser/agentBrowserPath.js +19 -9
  263. package/src/tools/webbrowser/agentBrowserPath.ts +70 -28
  264. package/src/tools/webbrowser/browser.js +27 -11
  265. package/src/tools/webbrowser/browser.ts +68 -24
  266. package/src/tools/webbrowser/browserAutomation.js +329 -0
  267. package/src/tools/webbrowser/browserAutomation.ts +467 -0
  268. package/src/tools/webbrowser/browserAxState.js +97 -0
  269. package/src/tools/webbrowser/browserAxState.ts +142 -0
  270. package/src/tools/webbrowser/browserBatch.js +1578 -0
  271. package/src/tools/webbrowser/browserBatch.ts +2382 -0
  272. package/src/tools/webbrowser/browserCdp.js +208 -0
  273. package/src/tools/webbrowser/browserCdp.ts +255 -0
  274. package/src/tools/webbrowser/browserConditions.js +24 -0
  275. package/src/tools/webbrowser/browserConditions.ts +45 -0
  276. package/src/tools/webbrowser/browserContent.js +281 -0
  277. package/src/tools/webbrowser/browserContent.ts +438 -0
  278. package/src/tools/webbrowser/browserControl.js +131 -34
  279. package/src/tools/webbrowser/browserControl.ts +210 -56
  280. package/src/tools/webbrowser/browserDaemon.js +22 -14
  281. package/src/tools/webbrowser/browserDaemon.ts +54 -21
  282. package/src/tools/webbrowser/browserFrames.js +47 -0
  283. package/src/tools/webbrowser/browserFrames.ts +54 -0
  284. package/src/tools/webbrowser/browserInteractionResolver.js +17 -0
  285. package/src/tools/webbrowser/browserInteractionResolver.ts +40 -0
  286. package/src/tools/webbrowser/browserLocator.js +140 -0
  287. package/src/tools/webbrowser/browserLocator.ts +194 -0
  288. package/src/tools/webbrowser/browserOutcome.js +10 -17
  289. package/src/tools/webbrowser/browserOutcome.ts +48 -31
  290. package/src/tools/webbrowser/browserRecovery.js +58 -0
  291. package/src/tools/webbrowser/browserRecovery.ts +83 -0
  292. package/src/tools/webbrowser/browserRunRegistry.js +35 -3
  293. package/src/tools/webbrowser/browserRunRegistry.ts +91 -15
  294. package/src/tools/webbrowser/browserService.js +28 -2
  295. package/src/tools/webbrowser/browserService.ts +49 -9
  296. package/src/tools/webbrowser/browserStream.js +132 -33
  297. package/src/tools/webbrowser/browserStream.ts +224 -50
  298. package/src/tools/webbrowser/browserTabs.js +48 -15
  299. package/src/tools/webbrowser/browserTabs.ts +178 -96
  300. package/src/tools/webbrowser/webbrowser.js +679 -144
  301. package/src/tools/webbrowser/webbrowser.ts +975 -236
  302. package/src/tools/webfetch/preapproved.js +0 -2
  303. package/src/tools/webfetch/preapproved.ts +0 -2
  304. package/src/tools/websearch/websearch.js +129 -8
  305. package/src/tools/websearch/websearch.ts +138 -6
  306. package/src/types.ts +459 -40
  307. package/src/ui/App.js +377 -58
  308. package/src/ui/App.tsx +576 -111
  309. package/src/ui/LiveArea.js +14 -8
  310. package/src/ui/LiveArea.tsx +14 -10
  311. package/src/ui/MessageList.js +63 -20
  312. package/src/ui/MessageList.tsx +101 -16
  313. package/src/ui/ModelPicker.js +7 -4
  314. package/src/ui/ModelPicker.tsx +55 -8
  315. package/src/ui/hooks/useChat.js +152 -163
  316. package/src/ui/hooks/useChat.ts +396 -334
  317. package/src/ui/loginCommand.js +56 -0
  318. package/src/ui/loginCommand.ts +63 -0
  319. package/src/ui/toolProgress.js +41 -0
  320. package/src/ui/toolProgress.ts +44 -0
  321. package/src/web/browserBridge.js +20 -2
  322. package/src/web/browserBridge.ts +20 -2
  323. package/src/web/protocol.ts +1897 -194
  324. package/workflows/adaptive-research/workflow.mjs +86 -0
  325. package/workflows/e2e-capabilities/workflow.mjs +102 -0
  326. package/workflows/e2e-llm/workflow.mjs +52 -0
  327. package/workflows/e2e-smoke/workflow.mjs +59 -0
  328. package/workflows/e2e-vision-schema/README.md +48 -0
  329. package/workflows/e2e-vision-schema/workflow.mjs +149 -0
  330. package/workflows/e2e-write-greet/workflow.mjs +37 -0
  331. package/workflows/file-census/README.md +14 -0
  332. package/workflows/file-census/scripts/.gitkeep +2 -0
  333. package/workflows/file-census/workflow.mjs +110 -0
  334. package/workflows/goal/README.md +166 -0
  335. package/workflows/goal/prompts/audit.md +57 -0
  336. package/workflows/goal/prompts/contract.md +56 -0
  337. package/workflows/goal/prompts/iterate.md +37 -0
  338. package/workflows/goal/workflow.mjs +501 -0
  339. package/workflows/illustrate/README.md +90 -0
  340. package/workflows/illustrate/assets/engines.json +20 -0
  341. package/workflows/illustrate/assets/extract-baidu.js +21 -0
  342. package/workflows/illustrate/assets/extract-bing.js +33 -0
  343. package/workflows/illustrate/assets/extract-google.js +31 -0
  344. package/workflows/illustrate/workflow.mjs +301 -0
  345. package/workflows/plan/workflow.mjs +389 -0
  346. package/workflows/question-crops/README.md +35 -0
  347. package/workflows/question-crops/prompts/inventory.md +23 -0
  348. package/workflows/question-crops/scripts/image-ops.mjs +305 -0
  349. package/workflows/question-crops/scripts/image-ops.test.mjs +95 -0
  350. package/workflows/question-crops/workflow.mjs +172 -0
  351. package/workflows/ralph-loop/workflow.mjs +162 -0
  352. package/workflows/research/README.md +74 -0
  353. package/workflows/research/prompts/s0-goal.md +43 -0
  354. package/workflows/research/prompts/s1-early-exit.md +22 -0
  355. package/workflows/research/prompts/s1-map.md +58 -0
  356. package/workflows/research/prompts/s2-options.md +53 -0
  357. package/workflows/research/prompts/s3-deep-dive.md +56 -0
  358. package/workflows/research/prompts/s4-verify.md +74 -0
  359. package/workflows/research/prompts/s5-synthesis.md +81 -0
  360. package/workflows/research/prompts/s5b-fill-gaps.md +32 -0
  361. package/workflows/research/prompts/s6-package.md +32 -0
  362. package/workflows/research/scripts/build-report.mjs +98 -0
  363. package/workflows/research/workflow.mjs +288 -0
  364. package/workflows/wechat-reading-shots/prompts/collect-params.md +16 -0
  365. package/workflows/wechat-reading-shots/prompts/evaluate.md +20 -0
  366. package/workflows/wechat-reading-shots/prompts/open-book.md +28 -0
  367. package/workflows/wechat-reading-shots/prompts/read-page.md +13 -0
  368. package/workflows/wechat-reading-shots/prompts/turn-batch.md +24 -0
  369. package/workflows/wechat-reading-shots/test/control-flow.test.ts +329 -0
  370. package/workflows/wechat-reading-shots/workflow.mjs +266 -0
  371. package/workflows/wrong-question-docx/README.md +55 -0
  372. package/workflows/wrong-question-docx/prompts/figure-qa.md +8 -0
  373. package/workflows/wrong-question-docx/prompts/transcribe.md +25 -0
  374. package/workflows/wrong-question-docx/scripts/workbook.mjs +857 -0
  375. package/workflows/wrong-question-docx/test/control-flow.test.ts +165 -0
  376. package/workflows/wrong-question-docx/test/workbook.test.mjs +303 -0
  377. package/workflows/wrong-question-docx/workflow.mjs +485 -0
  378. package/plugins/workflow-runner/src/agentCommon.js +0 -354
  379. package/plugins/workflow-runner/src/agentCommon.ts +0 -435
  380. package/plugins/workflow-runner/src/controlFlow/branch.js +0 -40
  381. package/plugins/workflow-runner/src/controlFlow/branch.ts +0 -46
  382. package/plugins/workflow-runner/src/controlFlow/loop.js +0 -211
  383. package/plugins/workflow-runner/src/controlFlow/loop.ts +0 -248
  384. package/plugins/workflow-runner/src/controlFlow/pause.js +0 -129
  385. package/plugins/workflow-runner/src/controlFlow/pause.ts +0 -141
  386. package/plugins/workflow-runner/src/controlFlow/signal.js +0 -21
  387. package/plugins/workflow-runner/src/controlFlow/signal.ts +0 -29
  388. package/plugins/workflow-runner/src/controlFlow/types.js +0 -18
  389. package/plugins/workflow-runner/src/controlFlow/types.ts +0 -63
  390. package/plugins/workflow-runner/src/dslManifest.js +0 -72
  391. package/plugins/workflow-runner/src/dslManifest.ts +0 -127
  392. package/plugins/workflow-runner/src/expressions.js +0 -639
  393. package/plugins/workflow-runner/src/expressions.ts +0 -640
  394. package/plugins/workflow-runner/src/loader.js +0 -573
  395. package/plugins/workflow-runner/src/loader.ts +0 -721
  396. package/plugins/workflow-runner/src/multimodal.js +0 -38
  397. package/plugins/workflow-runner/src/multimodal.ts +0 -64
  398. package/plugins/workflow-runner/src/recovery.js +0 -126
  399. package/plugins/workflow-runner/src/recovery.ts +0 -156
  400. package/plugins/workflow-runner/src/stepExecutors/agent.js +0 -173
  401. package/plugins/workflow-runner/src/stepExecutors/agent.ts +0 -234
  402. package/plugins/workflow-runner/src/stepExecutors/assert.js +0 -42
  403. package/plugins/workflow-runner/src/stepExecutors/assert.ts +0 -52
  404. package/plugins/workflow-runner/src/stepExecutors/echo.js +0 -31
  405. package/plugins/workflow-runner/src/stepExecutors/echo.ts +0 -38
  406. package/plugins/workflow-runner/src/stepExecutors/llm.js +0 -99
  407. package/plugins/workflow-runner/src/stepExecutors/llm.ts +0 -133
  408. package/plugins/workflow-runner/src/stepExecutors/set.js +0 -49
  409. package/plugins/workflow-runner/src/stepExecutors/set.ts +0 -56
  410. package/plugins/workflow-runner/src/stepExecutors/skill.js +0 -111
  411. package/plugins/workflow-runner/src/stepExecutors/skill.ts +0 -140
  412. package/plugins/workflow-runner/src/stepExecutors/tool.js +0 -227
  413. package/plugins/workflow-runner/src/stepExecutors/tool.ts +0 -274
  414. package/plugins/workflow-runner/src/stepExecutors/verify.js +0 -61
  415. package/plugins/workflow-runner/src/stepExecutors/verify.ts +0 -72
  416. package/plugins/workflow-runner/src/stepPipeline.js +0 -277
  417. package/plugins/workflow-runner/src/stepPipeline.ts +0 -366
  418. package/plugins/workflow-runner/test/agent.test.ts +0 -587
  419. package/plugins/workflow-runner/test/agentLlmError.test.ts +0 -373
  420. package/plugins/workflow-runner/test/bashBlacklist.sweep.test.ts +0 -65
  421. package/plugins/workflow-runner/test/captureMisbind.test.ts +0 -99
  422. package/plugins/workflow-runner/test/cli.e2e.test.ts +0 -167
  423. package/plugins/workflow-runner/test/context-files.test.ts +0 -320
  424. package/plugins/workflow-runner/test/e2e.test.ts +0 -370
  425. package/plugins/workflow-runner/test/e2eNewLayout.test.ts +0 -314
  426. package/plugins/workflow-runner/test/engineRobustness.test.ts +0 -234
  427. package/plugins/workflow-runner/test/expressions.test.ts +0 -439
  428. package/plugins/workflow-runner/test/foundation.test.ts +0 -126
  429. package/plugins/workflow-runner/test/graceful.test.ts +0 -139
  430. package/plugins/workflow-runner/test/greedyInputs.load.test.ts +0 -47
  431. package/plugins/workflow-runner/test/hostCapability.test.ts +0 -108
  432. package/plugins/workflow-runner/test/illustrate.load.test.ts +0 -183
  433. package/plugins/workflow-runner/test/jsonPayload.test.ts +0 -83
  434. package/plugins/workflow-runner/test/loader.test.ts +0 -617
  435. package/plugins/workflow-runner/test/maxTurnsRetryDelay.test.ts +0 -33
  436. package/plugins/workflow-runner/test/multimodal.test.ts +0 -342
  437. package/plugins/workflow-runner/test/output-schema.test.ts +0 -213
  438. package/plugins/workflow-runner/test/parseWorkflowArgs.test.ts +0 -106
  439. package/plugins/workflow-runner/test/pluginRunner.isolation.test.ts +0 -269
  440. package/plugins/workflow-runner/test/ppt.load.test.ts +0 -1220
  441. package/plugins/workflow-runner/test/ralphLoop.e2e.test.ts +0 -221
  442. package/plugins/workflow-runner/test/recovery.test.ts +0 -265
  443. package/plugins/workflow-runner/test/research.load.test.ts +0 -328
  444. package/plugins/workflow-runner/test/runner.test.ts +0 -911
  445. package/plugins/workflow-runner/test/runnerPreflight.test.ts +0 -436
  446. package/plugins/workflow-runner/test/skillTurnDone.test.ts +0 -71
  447. package/plugins/workflow-runner/test/stateLifecycle.test.ts +0 -198
  448. package/plugins/workflow-runner/test/stepPipeline.test.ts +0 -114
  449. package/plugins/workflow-runner/test/taskArbitration.test.ts +0 -354
  450. package/plugins/workflow-runner/test/taskLifecycle.test.ts +0 -324
  451. package/plugins/workflow-runner/test/toolArtifactOverwrite.test.ts +0 -221
  452. package/plugins/workflow-runner/test/toolCapabilityBoundary.test.ts +0 -29
  453. package/plugins/workflow-runner/test/toolRuntimeIntegration.test.ts +0 -168
  454. package/plugins/workflow-runner/test/webppt.load.test.ts +0 -250
  455. package/plugins/workflow-runner/test/word.load.test.ts +0 -208
  456. package/plugins/workflow-runner/test/workflows.smoke.test.ts +0 -76
  457. package/plugins/workflow-runner/test/yamlGuardConditions.test.ts +0 -207
  458. package/src/advisorState.js +0 -22
  459. package/src/cli/configWizard.js +0 -293
  460. package/src/tools/toolProgressBridge.js +0 -48
  461. package/workflows/adaptive-research.yaml +0 -50
  462. package/workflows/book-review-short.yaml +0 -125
  463. package/workflows/e2e-write-greet.yaml +0 -31
  464. package/workflows/illustrate.yaml +0 -227
  465. package/workflows/plan.yaml +0 -470
  466. package/workflows/ppt.yaml +0 -1670
  467. package/workflows/ralph-loop.yaml +0 -201
  468. package/workflows/research.yaml +0 -873
  469. package/workflows/schema.json +0 -176
  470. package/workflows/webppt.yaml +0 -496
  471. package/workflows/wechat-reading-shots.yaml +0 -315
  472. package/workflows/word.yaml +0 -720
  473. package/workflows/youtube-shorts.yaml +0 -202
  474. /package/workflows/{research.md → research/DESIGN.md} +0 -0
@@ -1,71 +1,26 @@
1
1
  /**
2
2
  * ============================================================
3
- * plugins/workflow-runner/src/index.ts —— /workflow 与 /workflows 命令的胶水层
3
+ * plugins/workflow-runner/src/index.ts —— /workflow 与 /workflows 的命令胶水
4
4
  * ------------------------------------------------------------
5
- * 作为 pluginRunner 与 runner 之间的桥:
6
- * - runWorkflowFromCommand:解析 /workflow <name> --input k=v args 调度
7
- * - runWorkflowsList:处理 /workflows 列表展示(yield "text" 事件让 UI 显示)
5
+ * 工作流只有一种形态:`workflows/<name>/workflow.mjs`。
8
6
  *
9
- * R1 红线:本文件只在 pluginRunner 命中 workflow 模式时才被 import。
10
- * 不污染默认 T-A-O-R 路径。
7
+ * 这里曾有一段「找不到就回落到 legacy yaml 引擎」的迁移期分支,随 yaml 引擎
8
+ * 一起删除了 —— 现在找不到就是找不到,直接报错并让用户看 /workflows。
11
9
  * ============================================================
12
10
  */
13
- import { buildBaseSystemPrompt, } from '../../../src/plugin-sdk.js';
14
- import { findWorkflowByName, listWorkflows } from './loader.js';
15
- import { runWorkflow } from './runner.js';
11
+ import { existsSync } from 'node:fs';
12
+ import { resolve } from 'node:path';
13
+ import { managedCommandController } from '../../../src/managedExecution/registry.js';
14
+ import { refreshStableSystemPrompt } from '../../../src/plugin-sdk.js';
15
+ import { discoverWorkflows } from './discovery.js';
16
+ import { coerceInputs } from './inputCoercion.js';
17
+ import { bindResourceInputs } from './resourceInputs.js';
18
+ import { runWorkflowScript } from './runner.js';
16
19
  /**
17
- * 把 "/workflow <name> [pos1 pos2 ...] [--input k=v ...]" 拆成 name + 显式 inputs + 位置参数。
18
- * 简单解析器(不依赖第三方):
19
- * - 第一个非 flag token = name;末尾 ".yaml" / ".yml" 自动剥(便于直接用文件名)
20
- * - 之后所有非 flag token 收进 positional[],由调用方按 def.inputs 声明顺序映射
21
- * - --input k=v 显式 KV,优先级高于位置参数(同名 input 不会被位置参数覆盖)
22
- * - 不识别其他 flag(保守跳过其后一个 token)
23
- */
24
- export function parseWorkflowArgs(rawArgs) {
25
- const tokens = tokenizeArgs(rawArgs);
26
- const inputs = {};
27
- const positional = [];
28
- let name = null;
29
- for (let i = 0; i < tokens.length; i++) {
30
- const t = tokens[i];
31
- if (t === '--input') {
32
- const kv = tokens[i + 1];
33
- if (!kv)
34
- break;
35
- const eq = kv.indexOf('=');
36
- if (eq > 0) {
37
- inputs[kv.slice(0, eq)] = kv.slice(eq + 1);
38
- }
39
- i++;
40
- continue;
41
- }
42
- if (t.startsWith('--')) {
43
- // 未知 flag:跳过其后一个 token(保守地认为它带值)
44
- i++;
45
- continue;
46
- }
47
- if (name === null) {
48
- name = t.replace(/\.ya?ml$/i, '');
49
- }
50
- else {
51
- positional.push(t);
52
- }
53
- }
54
- return { name, inputs, positional };
55
- }
56
- /**
57
- * shell 风格 token 化:空白切分 token;引号(' 或 ")在 token **任意位置**(不只开头)
58
- * 出现即进入引号模式——引号内的空白不切分、引号字符本身被剥离。
59
- *
60
- * 修复:`--input topic="带空格的值"`(引号在 `=` 后,token 开头是 `t`)曾被按空白
61
- * 硬切 → 值截断 + 引号残留(实测 inputs.topic 带 `"` 尾,positional 里散落被拆的字)。
62
- * 现在 token 内任意位置的引号都正确分组。
20
+ * shell 风格 token 化:引号在 token **任意位置**出现即进入引号模式。
63
21
  *
64
- * 边界语义(被 parseWorkflowArgs.test.ts 冻结):
65
- * - 未闭合引号:剩余部分并入当前 token(不报错)
66
- * - 双引号内的单引号是字面量(不触发嵌套)
67
- * - 反斜杠不转义(`a\"b` 中 `"` 仍开启引号模式,行为变化但测试用 toBeDefined 容错)
68
- * - 连续空白合并、`""` 产生空 token
22
+ * 自 legacy 移植。`--input topic="带空格的值"` 里引号在 `=` 之后、token 开头是 `t`,
23
+ * 只认「开头引号」的写法会把值截断并留下引号残留 —— 这是实测过的。
69
24
  */
70
25
  function tokenizeArgs(s) {
71
26
  const out = [];
@@ -79,13 +34,12 @@ function tokenizeArgs(s) {
79
34
  while (i < s.length) {
80
35
  const c = s[i];
81
36
  if (c === '"' || c === "'") {
82
- // 引号模式:收集到闭合引号,引号内空白保留
83
37
  const q = c;
84
38
  i++;
85
39
  while (i < s.length && s[i] !== q)
86
40
  acc += s[i++];
87
41
  if (i < s.length)
88
- i++; // 跳过闭合引号
42
+ i++;
89
43
  }
90
44
  else if (/\s/.test(c)) {
91
45
  break;
@@ -99,152 +53,193 @@ function tokenizeArgs(s) {
99
53
  }
100
54
  return out;
101
55
  }
56
+ export function parseWorkflowArgs(rawArgs) {
57
+ const tokens = tokenizeArgs(rawArgs);
58
+ const inputs = {};
59
+ const positional = [];
60
+ let name = null;
61
+ for (let i = 0; i < tokens.length; i++) {
62
+ const t = tokens[i];
63
+ if (t === '--input') {
64
+ const kv = tokens[i + 1];
65
+ if (!kv)
66
+ break;
67
+ const eq = kv.indexOf('=');
68
+ if (eq > 0)
69
+ inputs[kv.slice(0, eq)] = kv.slice(eq + 1);
70
+ i++;
71
+ continue;
72
+ }
73
+ if (t.startsWith('--')) {
74
+ i++; // 未知 flag:保守跳过其后一个 token(认为它带值)
75
+ continue;
76
+ }
77
+ if (name === null)
78
+ name = t.replace(/\.ya?ml$/i, '');
79
+ else
80
+ positional.push(t);
81
+ }
82
+ return { name, inputs, positional };
83
+ }
102
84
  /**
103
- * 把字符串形态的 input 值按 InputDef.type 转成合适的 JS 类型 + 校验。
104
- * 校验失败抛 Error,pluginRunner 会把它转成 error event。
85
+ * 位置参数 → inputs 映射。
86
+ * **贪婪首参**(`inputs[0].greedy`):名后全部位置参数空格 join 进首参,不逐位拆。
87
+ * 存在理由是真实事故:不贪婪时用户打一句自然语言会被空格拆碎,第二段撞上
88
+ * number 类型的输入报「必须是数字」。
105
89
  */
106
- function coerceInputs(raw, defs) {
107
- const out = {};
108
- if (!defs)
109
- return { ...raw };
110
- for (const def of defs) {
111
- const rawVal = raw[def.name];
112
- if (rawVal === undefined) {
113
- if (def.required) {
114
- throw new Error(`缺少必填 input: ${def.name}`);
115
- }
116
- if (def.default !== undefined) {
117
- out[def.name] = def.default;
90
+ function mapPositional(rawInputs, positional, defs, cwd = process.cwd()) {
91
+ const warnings = [];
92
+ if (!defs || positional.length === 0)
93
+ return warnings;
94
+ if (defs[0]?.greedy === true) {
95
+ const name = defs[0].name;
96
+ if (defs[0].type === 'resource' && !(name in rawInputs)) {
97
+ // A Desktop invocation commonly has a natural-language tail after the
98
+ // command and no textual path. Do not mistake that tail for a file.
99
+ const first = positional[0] ?? '';
100
+ const looksLikePath = existsSync(resolve(cwd, first)) ||
101
+ first.startsWith('/') ||
102
+ first.startsWith('\\') ||
103
+ /^[A-Za-z]:[\\/]/.test(first) ||
104
+ first.startsWith('~/') ||
105
+ first.startsWith('~\\') ||
106
+ first.startsWith('./') ||
107
+ first.startsWith('.\\') ||
108
+ first.startsWith('../') ||
109
+ first.startsWith('..\\') ||
110
+ /\.[A-Za-z0-9]{1,16}$/.test(first);
111
+ if (!looksLikePath) {
112
+ if (positional.length)
113
+ rawInputs.requestText = positional.join(' ');
114
+ return warnings;
118
115
  }
119
- continue;
116
+ rawInputs[name] = first;
117
+ if (positional.length > 1)
118
+ rawInputs.requestText = positional.slice(1).join(' ');
119
+ return warnings;
120
120
  }
121
- if (def.type === 'number') {
122
- const n = Number.parseFloat(rawVal);
123
- if (Number.isNaN(n))
124
- throw new Error(`input ${def.name} 必须是数字,收到 "${rawVal}"`);
125
- out[def.name] = n;
121
+ if (defs[0]?.type === 'resource' && name in rawInputs) {
122
+ if (positional.length)
123
+ rawInputs.requestText = positional.join(' ');
124
+ return warnings;
126
125
  }
127
- else if (def.type === 'enum') {
128
- if (!def.values?.includes(rawVal)) {
129
- throw new Error(`input ${def.name} 必须是 [${def.values?.join(', ')}] 之一,收到 "${rawVal}"`);
130
- }
131
- out[def.name] = rawVal;
126
+ if (name in rawInputs) {
127
+ // 含空格的值没加引号会被 shell 拆开(只有第一段进 KV,其余散落成位置参数)。
128
+ // 静默丢弃曾把整段中文主题截成半句,连锁触发仲裁误判。这里拼回去并告警。
129
+ rawInputs[name] = [rawInputs[name], ...positional].join(' ');
130
+ warnings.push(`${name}:--input 值未加引号被拆成 ${positional.length} 段,已自动拼回(下次请写 --input "${name}=完整值")`);
132
131
  }
133
132
  else {
134
- out[def.name] = rawVal;
133
+ rawInputs[name] = positional.join(' ');
135
134
  }
135
+ return warnings;
136
136
  }
137
- // 未声明的 input 也透传(让 yaml 里可以引用 ad-hoc 变量)
138
- for (const k of Object.keys(raw)) {
139
- if (!(k in out))
140
- out[k] = raw[k];
137
+ const max = Math.min(positional.length, defs.length);
138
+ for (let i = 0; i < max; i++) {
139
+ const def = defs[i];
140
+ if (def.name in rawInputs) {
141
+ if (rawInputs[def.name] !== positional[i]) {
142
+ warnings.push(`--input 优先级高于位置参数:${def.name} 取 ${JSON.stringify(rawInputs[def.name])},位置参数 ${JSON.stringify(positional[i])} 被忽略`);
143
+ }
144
+ }
145
+ else {
146
+ rawInputs[def.name] = positional[i];
147
+ }
141
148
  }
142
- return out;
143
- }
144
- async function refreshWorkflowSystemPrompt(history, cwd, tools) {
145
- // 只刷稳定层:workflow 一跑就是几十步,system 消息若含日期/记忆等易变内容,
146
- // 每步都会重写 history[0]、把 provider 前缀缓存打散(见 prompts/system.ts)。
147
- const content = await buildBaseSystemPrompt(cwd, tools);
148
- const systemIndex = history.findIndex((m) => m.role === 'system' && !m._ephemeral);
149
- const fresh = { role: 'system', content };
150
- if (systemIndex === 0) {
151
- history[0] = fresh;
152
- return;
149
+ if (positional.length > defs.length) {
150
+ const dropped = positional.slice(defs.length);
151
+ warnings.push(`忽略了 ${dropped.length} 个多余位置参数:${dropped.map((d) => JSON.stringify(d)).join(' ')}`);
153
152
  }
154
- if (systemIndex > 0)
155
- history.splice(systemIndex, 1);
156
- history.unshift(fresh);
153
+ return warnings;
157
154
  }
158
- /** /workflow <name> [pos...] [--input k=v] —— 主入口,由 pluginRunner 调用。 */
155
+ /** `/workflow <name> …` 主入口。 */
159
156
  export async function* runWorkflowFromCommand(rawArgs, opts) {
160
157
  const { name, inputs: rawInputs, positional } = parseWorkflowArgs(rawArgs);
161
158
  if (!name) {
162
159
  yield {
163
160
  type: 'error',
164
- error: '/workflow 用法: /workflow <name> [val ...] [--input key=val ...]\n输入 /workflows 查看可用工作流。',
165
- };
166
- return;
167
- }
168
- const def = await findWorkflowByName(name);
169
- if (!def) {
170
- yield {
171
- type: 'error',
172
- error: `未找到 workflow "${name}"。输入 /workflows 查看可用列表。`,
161
+ error: '/workflow 用法:/workflow <name> [值 ...] [--input key=值 ...]\n输入 /workflows 查看可用工作流。',
173
162
  };
174
163
  return;
175
164
  }
176
165
  const cwd = opts.cwd ?? process.cwd();
177
166
  const tools = opts.tools ?? [];
178
- await refreshWorkflowSystemPrompt(opts.history, cwd, tools);
179
- // 位置参数映射,两种模式:
180
- // - 贪婪首参(def.inputs[0].greedy===true):把【全部】位置参数用空格 join 成整句写进
181
- // 首个 input(自然语言 brief 不被空格拆碎、也不会撞上后面的 number/enum 输入),
182
- // 其余 input 只走 --input。用户「打一句话」即可(见 webppt.yaml::topic)。
183
- // - 默认:严格按"第 i 个位置参数 ↔ def.inputs[i]"对应。
184
- // --input k=v 显式优先:已显式的 input 不被位置参数覆盖(对应位置参数被丢弃,会 warn)。
185
- const overriddenByKV = [];
186
- const greedyNotes = [];
187
- const greedyFirst = def.inputs?.[0]?.greedy === true;
188
- if (greedyFirst && def.inputs && positional.length > 0) {
189
- const greedyName = def.inputs[0].name;
190
- if (greedyName in rawInputs) {
191
- // 首参已由 --input 提供时,位置参数仍按贪婪语义【拼回】首参末尾--
192
- // 含空格的值未加引号时会被 shell 拆开(--input topic=A B C 只有 A 进 KV,
193
- // B C 散落成位置参数),静默丢弃曾把整段中文调研主题截成半句、
194
- // 连锁触发任务仲裁误判 new-task 清空全部产物。
195
- rawInputs[greedyName] = [rawInputs[greedyName], ...positional].join(' ');
196
- greedyNotes.push(`${greedyName}:--input 值未加引号被拆成 ${positional.length} 段位置参数,已自动拼回(下次请写 --input "${greedyName}=完整值")`);
167
+ const { workflows, failures } = await discoverWorkflows(cwd);
168
+ const script = workflows.find((w) => w.name === name);
169
+ if (!script) {
170
+ const broken = failures.find((f) => f.name === name);
171
+ if (broken) {
172
+ // 「有但写错了」与「没有」必须区分开 —— 否则用户会去找一个并不存在的拼写问题。
173
+ yield {
174
+ type: 'error',
175
+ error: `工作流「${name}」存在但写错了:\n${broken.errors.map((e) => ` · ${e}`).join('\n')}`,
176
+ };
177
+ return;
197
178
  }
198
- else {
199
- // 贪婪吸收:整句进首参(空格 join 还原用户原话,不逐位拆映射)
200
- rawInputs[greedyName] = positional.join(' ');
201
- }
202
- }
203
- else if (positional.length > 0 && def.inputs) {
204
- const max = Math.min(positional.length, def.inputs.length);
205
- for (let i = 0; i < max; i++) {
206
- const inputDef = def.inputs[i];
207
- if (inputDef.name in rawInputs) {
208
- // 已被 --input 占位,位置参数被丢弃
209
- if (rawInputs[inputDef.name] !== positional[i]) {
210
- overriddenByKV.push(`${inputDef.name}=${JSON.stringify(rawInputs[inputDef.name])} (位置参数 ${JSON.stringify(positional[i])} 被忽略)`);
211
- }
212
- }
213
- else {
214
- rawInputs[inputDef.name] = positional[i];
215
- }
216
- }
217
- }
218
- // warn:超量位置参数(仅非 greedy 模式;greedy 全部吸收进首参,不算多余)
219
- if (!greedyFirst && def.inputs && positional.length > def.inputs.length) {
220
- const dropped = positional.slice(def.inputs.length);
221
179
  yield {
222
- type: 'warning',
223
- message: `⚠ 忽略了 ${dropped.length} 个多余位置参数: ${dropped.map((d) => JSON.stringify(d)).join(' ')}(workflow "${name}" 只声明了 ${def.inputs.length} 个 input)`,
180
+ type: 'error',
181
+ error: `未找到工作流「${name}」。输入 /workflows 查看可用列表。`,
224
182
  };
183
+ return;
225
184
  }
226
- // warn:贪婪首参的 --input 值被 shell 拆开后自动拼回
227
- if (greedyNotes.length > 0) {
228
- yield {
229
- type: 'warning',
230
- message: `⚠ ${greedyNotes.join(';')}`,
231
- };
185
+ await refreshStableSystemPrompt(opts.history, cwd, tools);
186
+ for (const w of mapPositional(rawInputs, positional, script.meta.inputs, cwd)) {
187
+ yield { type: 'warning', message: `⚠ ${w}` };
232
188
  }
233
- // warn:位置参数被 --input 覆盖
234
- if (overriddenByKV.length > 0) {
235
- yield {
236
- type: 'warning',
237
- message: `⚠ --input 优先级高于位置参数,以下位置参数被覆盖:${overriddenByKV.join('; ')}`,
238
- };
239
- }
240
- let coerced;
189
+ const sessionId = opts.runtimeContext?.sessionId ?? 'default';
190
+ let inputs;
191
+ let inputResourceMap = {};
192
+ let resourceFingerprint = '';
241
193
  try {
242
- coerced = coerceInputs(rawInputs, def.inputs);
194
+ const bound = await bindResourceInputs({
195
+ workflowName: script.name,
196
+ sessionId,
197
+ cwd,
198
+ rawInputs,
199
+ defs: script.meta.inputs,
200
+ attachments: opts.inputResources,
201
+ });
202
+ for (const warning of bound.warnings)
203
+ yield {
204
+ type: 'plugin_progress',
205
+ pluginId: 'workflow-runner',
206
+ message: warning,
207
+ };
208
+ inputResourceMap = bound.resourceMap;
209
+ resourceFingerprint = bound.resourceIdentity.join('|');
210
+ if (resourceFingerprint)
211
+ bound.inputs.__resource_fingerprint = resourceFingerprint;
212
+ inputs = coerceInputs(bound.inputs, script.meta.inputs);
243
213
  }
244
214
  catch (e) {
245
215
  yield { type: 'error', error: e.message };
246
216
  return;
247
217
  }
218
+ let preparedManaged;
219
+ if (script.meta.managedRuntime) {
220
+ const controller = managedCommandController(script.meta.managedRuntime);
221
+ if (!controller) {
222
+ yield {
223
+ type: 'error',
224
+ error: `未知 managedRuntime:${script.meta.managedRuntime}`,
225
+ };
226
+ return;
227
+ }
228
+ preparedManaged = await controller(inputs, {
229
+ cwd,
230
+ runtimeContext: opts.runtimeContext,
231
+ context: opts.managedContext,
232
+ });
233
+ for (const event of preparedManaged.events)
234
+ yield event;
235
+ if (preparedManaged.handled)
236
+ return;
237
+ inputs = preparedManaged.inputs;
238
+ // A managed controller may normalize/replace public inputs, but it must not
239
+ // erase the resource component of task identity.
240
+ if (resourceFingerprint && !inputs.__resource_fingerprint)
241
+ inputs.__resource_fingerprint = resourceFingerprint;
242
+ }
248
243
  const ctx = {
249
244
  provider: opts.provider,
250
245
  runtimeContext: opts.runtimeContext,
@@ -259,42 +254,38 @@ export async function* runWorkflowFromCommand(rawArgs, opts) {
259
254
  promptCache: opts.promptCache,
260
255
  executeTool: opts.executeTool,
261
256
  toolContext: opts.toolContext,
257
+ managedExecution: preparedManaged?.execution,
258
+ managedBridge: preparedManaged?.bridge,
259
+ inputResources: opts.inputResources,
260
+ inputResourceMap,
262
261
  };
263
- // 透传 runWorkflow 的事件,并观察是否出现终结事件(error / interrupted = 失败或中断,
264
- // 与 gateway broker 的 TERMINAL 判定同一套逻辑)。成功(没见到终结事件)则在末尾补一条
265
- // 通用 `turn_done`,让对外流式协议以通用终结事件收口——否则成功 workflow 只发私有
266
- // workflow_done:gateway TERMINAL 不认它 → 子进程关闭时误补 interrupted;
267
- // `-p --output-format json` 因无 turn_done → stop_reason 兜底 error → ok:false(成功却报失败)。
268
- // 与 runWorkflowsList 末尾的 turn_done 是同一约定;失败/中断不补(error/interrupted 已是终结)。
269
- let sawTerminal = false;
270
- for await (const ev of runWorkflow(def, coerced, ctx)) {
271
- if (ev.type === 'error' || ev.type === 'interrupted')
272
- sawTerminal = true;
273
- yield ev;
274
- }
275
- if (!sawTerminal)
276
- yield { type: 'turn_done' };
262
+ yield* runWorkflowScript(script, { ctx, inputs });
277
263
  }
278
- /** /workflows —— 列出可用 workflow。yield 一条 text 事件让 UI 显示。 */
279
- export async function* runWorkflowsList() {
280
- const list = await listWorkflows();
281
- if (list.length === 0) {
282
- yield {
283
- type: 'text',
284
- delta: '当前没有可用工作流。在 cwd/workflows/ 下放 *.yaml 即可(参考 workflows/schema.json 或 docs/workflow-design.md)。\n',
285
- };
286
- yield { type: 'turn_done' };
287
- return;
264
+ /** `/workflows` —— 列出可用工作流,并如实报出写错的那些。 */
265
+ export async function* runWorkflowsList(cwd) {
266
+ const { workflows, failures } = await discoverWorkflows(cwd);
267
+ const lines = [];
268
+ if (workflows.length > 0) {
269
+ lines.push('可用工作流:');
270
+ for (const w of workflows) {
271
+ lines.push(` /workflow ${w.name} — ${w.meta.description.split('\n')[0].trim()}`);
272
+ }
288
273
  }
289
- const lines = ['可用工作流:'];
290
- for (const w of list) {
291
- lines.push(` /workflow ${w.name} — ${w.description.split('\n')[0].trim()}`);
274
+ if (workflows.length === 0) {
275
+ lines.push('当前没有可用工作流。在 workflows/<名字>/workflow.mjs 放一个脚本即可(`/skill workflow-creator` 会带你写)。');
276
+ }
277
+ // 写错的工作流必须报出来 —— 静默消失会让用户以为「我的工作流不见了」。
278
+ if (failures.length > 0) {
279
+ lines.push('');
280
+ lines.push(`⚠ 有 ${failures.length} 个工作流写错了,未能载入:`);
281
+ for (const f of failures) {
282
+ lines.push(` · ${f.name}:${f.errors[0]}`);
283
+ }
292
284
  }
293
285
  lines.push('');
294
- lines.push('运行示例:');
295
- lines.push(' /workflow <name> <val> 位置参数(按 inputs 声明顺序,第一个 input 直接写值)');
296
- lines.push(' /workflow <name>.yaml <val> .yaml 后缀可省');
297
- lines.push(' /workflow <name> --input k=v 显式 KV(多 input 或想跳过中间 input 时用)');
286
+ lines.push('运行示例:');
287
+ lines.push(' /workflow <name> <值> 位置参数(按 inputs 声明顺序)');
288
+ lines.push(' /workflow <name> --input k=v 显式 KV');
298
289
  yield { type: 'text', delta: `${lines.join('\n')}\n` };
299
290
  yield { type: 'turn_done' };
300
291
  }