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,12 +1,33 @@
1
1
  /**
2
- * The workflow identity stays anchored to the registered workspace, while file
3
- * and process tools follow a session worktree as soon as EnterWorktree creates
4
- * one. Keeping this decision in one helper prevents executors from drifting.
2
+ * ============================================================
3
+ * plugins/workflow-runner/src/toolRuntime.ts —— 工具调用的运行上下文
4
+ * ------------------------------------------------------------
5
+ * 宿主能力由每次工具调用的显式 `uses` 数组收敛 ——
6
+ * 代码形态里没有「step」这个东西,宿主能力由调用点在 `tool()`/`agent()` 的
7
+ * 选项里显式声明。
8
+ *
9
+ * ⚠️ `effectiveWorkflowCwd` 是**红线级**的单一出处,别在别处再算一次:
10
+ * 会话可能在运行途中进入 worktree(模型可自主调 EnterWorktree),此后写文件的
11
+ * 工具跟着 worktree 走。验收侧(verify/exists/readJson)必须用**同一个**函数取 cwd,
12
+ * 否则就是「产物写进 worktree、验收去原工作区的空目录里找」——条件恒 false,
13
+ * 引擎反复重试后莫名失败,而产物其实好好躺在 worktree 里。
14
+ *
15
+ * 也正因为 worktree 是**运行途中**才进入的,取 cwd 必须在**每次调用时**现算,
16
+ * 不能在运行开始时快照一次存起来。
17
+ * ============================================================
5
18
  */
19
+ /** 当前有效工作目录 —— 进了 worktree 就跟着走。见文件头注的红线说明。 */
6
20
  export function effectiveWorkflowCwd(ctx) {
7
21
  return ctx.sessionState?.activeWorktree?.path ?? ctx.cwd;
8
22
  }
9
- export function buildWorkflowToolContext(step, ctx, toolCallId, reportProgress) {
23
+ /**
24
+ * 组装一次工具调用的 ToolCallContext。
25
+ *
26
+ * @param uses 本次调用显式声明需要的宿主能力;缺省表示不需要任何授权切片。
27
+ * @returns 成功返回上下文;宿主没提供所声明的能力时返回 `{ error }`(不抛,
28
+ * 让调用方把原因当 tool_result 回填给模型)。
29
+ */
30
+ export function buildWorkflowToolContext(ctx, toolCallId, reportProgress, uses) {
10
31
  const context = {
11
32
  ...ctx.toolContext,
12
33
  history: ctx.history,
@@ -21,12 +42,12 @@ export function buildWorkflowToolContext(step, ctx, toolCallId, reportProgress)
21
42
  toolCallId,
22
43
  reportProgress,
23
44
  };
24
- for (const capability of step.uses ?? []) {
45
+ for (const capability of uses ?? []) {
25
46
  if (capability === 'computer') {
26
47
  if (!ctx.host?.computerRun) {
27
48
  return {
28
- error: 'uses:[computer] 声明了需要电脑操控能力,但本次运行的宿主没有提供 —— ' +
29
- '请在支持 Computer Use 的宿主启动,或去掉该步的 uses 声明。',
49
+ error: "声明了 uses:['computer'](需要电脑操控能力),但本次运行的宿主没有提供 —— " +
50
+ '请在支持 Computer Use 的宿主里启动,或去掉该声明。',
30
51
  };
31
52
  }
32
53
  context.computerRun = ctx.host.computerRun;
@@ -38,7 +59,7 @@ export function buildWorkflowToolContext(step, ctx, toolCallId, reportProgress)
38
59
  if (capability === 'browser') {
39
60
  if (!ctx.host?.browserRun) {
40
61
  return {
41
- error: 'uses:[browser] 声明了需要浏览器授权上下文,但本次运行的宿主没有提供。',
62
+ error: "声明了 uses:['browser'](需要浏览器授权上下文),但本次运行的宿主没有提供。",
42
63
  };
43
64
  }
44
65
  context.browserRun = ctx.host.browserRun;
@@ -1,20 +1,45 @@
1
- import type { ToolCallContext } from '../../../src/plugin-sdk.js';
2
- import type { RunContext, StepDef } from './types.js';
3
-
4
1
  /**
5
- * The workflow identity stays anchored to the registered workspace, while file
6
- * and process tools follow a session worktree as soon as EnterWorktree creates
7
- * one. Keeping this decision in one helper prevents executors from drifting.
2
+ * ============================================================
3
+ * plugins/workflow-runner/src/toolRuntime.ts —— 工具调用的运行上下文
4
+ * ------------------------------------------------------------
5
+ * 宿主能力由每次工具调用的显式 `uses` 数组收敛 ——
6
+ * 代码形态里没有「step」这个东西,宿主能力由调用点在 `tool()`/`agent()` 的
7
+ * 选项里显式声明。
8
+ *
9
+ * ⚠️ `effectiveWorkflowCwd` 是**红线级**的单一出处,别在别处再算一次:
10
+ * 会话可能在运行途中进入 worktree(模型可自主调 EnterWorktree),此后写文件的
11
+ * 工具跟着 worktree 走。验收侧(verify/exists/readJson)必须用**同一个**函数取 cwd,
12
+ * 否则就是「产物写进 worktree、验收去原工作区的空目录里找」——条件恒 false,
13
+ * 引擎反复重试后莫名失败,而产物其实好好躺在 worktree 里。
14
+ *
15
+ * 也正因为 worktree 是**运行途中**才进入的,取 cwd 必须在**每次调用时**现算,
16
+ * 不能在运行开始时快照一次存起来。
17
+ * ============================================================
8
18
  */
19
+
20
+ import type { ToolCallContext } from '../../../src/plugin-sdk.js';
21
+ import type { RunContext } from './types.js';
22
+
23
+ /** 宿主能力声明:需要浏览器或电脑操控时由调用点显式列出。 */
24
+ export type HostCapability = 'browser' | 'computer';
25
+
26
+ /** 当前有效工作目录 —— 进了 worktree 就跟着走。见文件头注的红线说明。 */
9
27
  export function effectiveWorkflowCwd(ctx: RunContext): string {
10
28
  return ctx.sessionState?.activeWorktree?.path ?? ctx.cwd;
11
29
  }
12
30
 
31
+ /**
32
+ * 组装一次工具调用的 ToolCallContext。
33
+ *
34
+ * @param uses 本次调用显式声明需要的宿主能力;缺省表示不需要任何授权切片。
35
+ * @returns 成功返回上下文;宿主没提供所声明的能力时返回 `{ error }`(不抛,
36
+ * 让调用方把原因当 tool_result 回填给模型)。
37
+ */
13
38
  export function buildWorkflowToolContext(
14
- step: StepDef,
15
39
  ctx: RunContext,
16
40
  toolCallId: string,
17
41
  reportProgress: NonNullable<ToolCallContext['reportProgress']>,
42
+ uses?: HostCapability[],
18
43
  ): ToolCallContext | { error: string } {
19
44
  const context: ToolCallContext = {
20
45
  ...ctx.toolContext,
@@ -33,13 +58,13 @@ export function buildWorkflowToolContext(
33
58
  reportProgress,
34
59
  };
35
60
 
36
- for (const capability of step.uses ?? []) {
61
+ for (const capability of uses ?? []) {
37
62
  if (capability === 'computer') {
38
63
  if (!ctx.host?.computerRun) {
39
64
  return {
40
65
  error:
41
- 'uses:[computer] 声明了需要电脑操控能力,但本次运行的宿主没有提供 —— ' +
42
- '请在支持 Computer Use 的宿主启动,或去掉该步的 uses 声明。',
66
+ "声明了 uses:['computer'](需要电脑操控能力),但本次运行的宿主没有提供 —— " +
67
+ '请在支持 Computer Use 的宿主里启动,或去掉该声明。',
43
68
  };
44
69
  }
45
70
  context.computerRun = ctx.host.computerRun;
@@ -53,7 +78,7 @@ export function buildWorkflowToolContext(
53
78
  if (!ctx.host?.browserRun) {
54
79
  return {
55
80
  error:
56
- 'uses:[browser] 声明了需要浏览器授权上下文,但本次运行的宿主没有提供。',
81
+ "声明了 uses:['browser'](需要浏览器授权上下文),但本次运行的宿主没有提供。",
57
82
  };
58
83
  }
59
84
  context.browserRun = ctx.host.browserRun;
@@ -1,217 +1,13 @@
1
1
  /**
2
2
  * ============================================================
3
- * plugins/workflow-runner/src/types.ts —— workflow runner 核心类型
3
+ * plugins/workflow-runner/src/types.ts —— 代码编排引擎的核心类型
4
4
  * ------------------------------------------------------------
5
- * 外层确定性 step 列表驱动执行,LLM 只在 llm: / skill: / agent: 节点出场。
6
- * 后的内存形态(WorkflowDef / StepDef),以及运行时上下文(VarStack /
7
- * RunContext)和 UI 事件(WorkflowEvent)。
5
+ * V2 只定义 ESM 元数据、宿主上下文和运行时边界;业务控制流由 JavaScript 本身
6
+ * 表达,Runner 不维护具体步骤类型。
8
7
  *
9
- * 与 src/types.ts 关系:WorkflowEvent 是插件**私有**事件,结构上满足
10
- * framework 的 PluginEvent 开放契约(type: string + 任意 payload),
11
- * 经 plugin.ts -> pluginRunner 原样透传给 UI;UI 不识别即静默忽略。
12
- * src/types.ts 的 LoopEvent union **不**包含 workflow_*,框架零插件耦合。
8
+ * ⚠️ 这里**没有** name 字段:工作流名恒等于目录名(`workflows/<name>/`)。
9
+ * legacy 时代 yaml 里的 `name:` 与文件名是两处真值,实测漂移过(workflow-evolve
10
+ * 的配置里专门写了「`name` 取 yaml 头部字段,不是文件名」这条注意事项)。
13
11
  * ============================================================
14
12
  */
15
- import { resolve, sep } from 'node:path';
16
- // ---------------- 2. 变量栈(loop scope 用) ----------------
17
- /**
18
- * 简单的多帧变量栈:
19
- * - 最外层(frame 0)放 inputs + 全局变量
20
- * - 进入 loop 时 push() 新帧,存当前迭代的 as / as_idx
21
- * - 退出 loop 时 pop()
22
- *
23
- * get(key) 从栈顶往下找第一个匹配的 frame,类似 JS 的 lexical scope。
24
- *
25
- * ════════════════ 原型污染防护(v2) ════════════════
26
- * 三层防线,任何一层破了都还有下一层兜底:
27
- * ① 所有 frame 对象用 `Object.create(null)` 创建 → 根本没有原型访问器,
28
- * obj["__proto__"] = {...} 不会触发 setter(因为 Object.create(null)
29
- * 的 [[Prototype]] 是 null,没有 Object.prototype.__proto__ 那个 getter/
30
- * setter),只会写成 own property。
31
- * ② set* 写入口统一过滤 DANGEROUS_KEYS(`__proto__/constructor/prototype`)
32
- * → 即使将来有人改回普通 {} 对象,写操作也到不了原型。
33
- * ③ 读侧(expressions 点路径访问)另有 S1 黑名防护(parsePrimary L451),
34
- * 即使值真写进去了也读不出来。
35
- * ════════════════════════════════════════════════════
36
- */
37
- export class VarStack {
38
- frames = [Object.create(null)];
39
- /**
40
- * 哪些帧是「循环迭代帧」—— 只为装 `as` / `as_idx` 这类**每轮重置**的迭代变量而生。
41
- *
42
- * ⚠️ 区分这个的原因是一个真实 bug:loop 每轮 `push()`…`pop()`,于是循环体里
43
- * `capture` 出来的变量**随迭代帧一起被弹掉**,循环一结束就没了。
44
- * 实测代价:seek 循环一路把书翻到第 12 页、`cur_page` 明明是「PAGE=12 13」,
45
- * 循环外的 `guard_landing` 读到的却是空串,于是报「没能翻到第 12 页(最后读到的
46
- * 页码:)」—— 一个刚刚成功的任务被判成失败,而且报错文案完全指不向真因。
47
- *
48
- * 正确的语义分界:**迭代变量按帧作用域,作者显式命名的变量不按**。
49
- * yaml 作者写 `capture: { text: cur_page }` 时期待的是「cur_page 存着最后读到的值」,
50
- * 而不是「它只在这一轮迭代里活着」。
51
- */
52
- iterationFrames = new Set();
53
- /**
54
- * 本次运行「当前有效工作目录」的解析器,供 fileExists / readJson 这类**读磁盘**的
55
- * 内置函数取锚点用。不是 yaml 变量(不进 frames,`${cwd}` 取不到它)。
56
- *
57
- * ⚠️ 存的是**函数**不是字符串:worktree 是运行途中才进入的(模型调 EnterWorktree),
58
- * 创建 VarStack 时固定成字符串的话,之后所有 done_when 仍会锚在旧目录上。
59
- * 未设置时由调用方回落 getWorkingDir()。
60
- */
61
- resolveCwd;
62
- /**
63
- * 写一个**作者命名**的变量(capture / set 步 / 引擎内部状态)。
64
- *
65
- * 穿透所有迭代帧,落到最近的非迭代帧上 —— 这样它在循环结束后依然存在。
66
- * 危险键(__proto__/constructor/prototype)直接忽略(防线②)。
67
- */
68
- set(key, val) {
69
- if (DANGEROUS_KEYS.has(key))
70
- return;
71
- for (let i = this.frames.length - 1; i >= 0; i--) {
72
- if (!this.iterationFrames.has(i)) {
73
- this.frames[i][key] = val;
74
- return;
75
- }
76
- }
77
- this.frames[0][key] = val;
78
- }
79
- /** 写一个**迭代变量**(`as` / `as_idx`):落在当前迭代帧,随 pop 一起消失。
80
- * 危险键直接忽略(防线②)。 */
81
- setIteration(key, val) {
82
- if (DANGEROUS_KEYS.has(key))
83
- return;
84
- this.frames[this.frames.length - 1][key] = val;
85
- }
86
- /** 写到栈底(root frame),用于 inputs / 全局常量。危险键直接忽略(防线②)。 */
87
- setGlobal(key, val) {
88
- if (DANGEROUS_KEYS.has(key))
89
- return;
90
- this.frames[0][key] = val;
91
- }
92
- get(key) {
93
- // 读侧也过危险键:防止 Object.create(null) 上若后续被别的代码写入了 own property
94
- // 形式的 __proto__,读出来再被其他地方当对象 key 造成二次污染。
95
- if (DANGEROUS_KEYS.has(key))
96
- return undefined;
97
- for (let i = this.frames.length - 1; i >= 0; i--) {
98
- if (key in this.frames[i])
99
- return this.frames[i][key];
100
- }
101
- return undefined;
102
- }
103
- has(key) {
104
- if (DANGEROUS_KEYS.has(key))
105
- return false;
106
- for (let i = this.frames.length - 1; i >= 0; i--) {
107
- if (key in this.frames[i])
108
- return true;
109
- }
110
- return false;
111
- }
112
- push() {
113
- this.frames.push(Object.create(null));
114
- }
115
- /** 压一个迭代帧:只有 `setIteration` 写进来的东西会随 `pop` 消失。 */
116
- pushIteration() {
117
- this.frames.push(Object.create(null));
118
- this.iterationFrames.add(this.frames.length - 1);
119
- }
120
- pop() {
121
- if (this.frames.length > 1) {
122
- this.iterationFrames.delete(this.frames.length - 1);
123
- this.frames.pop();
124
- }
125
- }
126
- /** 合并所有帧为一个普通对象(外层覆盖内层),用于 vars 持久化与事件。
127
- * 危险键不进入快照(双重保险:帧是 Object.create(null),读的时候也过不了 get)。*/
128
- snapshot() {
129
- const out = {};
130
- for (const frame of this.frames) {
131
- for (const k of Object.keys(frame)) {
132
- if (DANGEROUS_KEYS.has(k))
133
- continue;
134
- out[k] = frame[k];
135
- }
136
- }
137
- return out;
138
- }
139
- }
140
- /**
141
- * 把 yaml 的 capture 归一化成 { resultField: varName } map。支持两种写法
142
- * (通用 DSL,根治「裸字符串 capture 被 Object.entries/values 迭代成单字符」的静默 footgun):
143
- * - map 形式: capture: { text: foo, args.content: bar }
144
- * - 简写字符串: capture: foo ≡ capture: { result: foo }
145
- * 绑 StepResult.raw.result —— llm/agent=文本、tool=回执,各 executor 都提供 result 别名。
146
- *
147
- * 放在 types.ts(零依赖)供 runner.ts(bindCapture)与 agentCommon.ts(describeCaptureContract)
148
- * 共用,避免 runner↔agentCommon 循环引用。
149
- */
150
- export function normalizeCapture(cap) {
151
- if (cap == null)
152
- return {};
153
- if (typeof cap === 'string')
154
- return { result: cap };
155
- return cap;
156
- }
157
- // ---------------- 6. 路径安全守卫(declaredArtifacts / 表达式层共用) ----------------
158
- /**
159
- * 规范化 + cwd 范围校验的产物路径。
160
- *
161
- * 安全背景:declaredArtifacts 来自 YAML 定义,若作者写 "../../.ssh/id_rsa",
162
- * path.join(workingDir, p) 会跟随 ../ 跳出工作目录,new-task 清理时就可能
163
- * 删掉工作目录外的文件(唯一能造成真实数据损失的入口)。
164
- *
165
- * 行为:
166
- * - 先用 resolve(workingDir, rawPath) 得到绝对路径(自动归一化 ../)
167
- * - 再检查它是否严格在 resolve(workingDir) 目录树之内
168
- * - 命中:返回【相对 workingDir 的规范化相对路径】(./ 前缀去除、\\→/),
169
- * 保证后续 join(workingDir, result) 一定不会越界
170
- * - 越界/空串/解析失败:返回 null,调用方应跳过(fail-closed)
171
- *
172
- * 跨平台:win32 上 compare 前双方都 normalizeCase(lowercase),其他平台保持大小写敏感。
173
- */
174
- export function safeArtifactPath(workingDir, rawPath) {
175
- if (!rawPath || typeof rawPath !== 'string')
176
- return null;
177
- const base = resolve(workingDir);
178
- // 必须加路径分隔符作为前缀匹配边界:防止 base=/repo 匹配到 /repo-hack/evil
179
- const baseWithSep = base.endsWith(sep) ? base : base + sep;
180
- let abs;
181
- try {
182
- abs = resolve(workingDir, rawPath);
183
- }
184
- catch {
185
- return null;
186
- }
187
- const sameCase = (p) => process.platform === 'win32' ? p.toLowerCase() : p;
188
- const nAbs = sameCase(abs);
189
- const nBase = sameCase(base);
190
- const nBaseSep = sameCase(baseWithSep);
191
- // 恰好等于 base 本身(极端的 rawPath='.' 情形)也视为合法,但 caller 一般
192
- // 用的是具体文件;这里允许不报错。
193
- if (nAbs !== nBase && !nAbs.startsWith(nBaseSep))
194
- return null;
195
- // 导出【相对 workingDir 的相对路径】(去掉 base 前缀)
196
- const rel = abs.slice(base.length).replace(/^[/\\]/, '');
197
- return rel.length === 0 ? '.' : rel;
198
- }
199
- /**
200
- * 表达式/任意场景的通用「绝对路径是否在 cwd 内」判定。
201
- * - abs 必须是【已 resolve 后的绝对路径】
202
- * - 越界/空 → false
203
- */
204
- export function isAbsWithinCwd(workingDir, abs) {
205
- if (!abs)
206
- return false;
207
- const base = resolve(workingDir);
208
- const baseWithSep = base.endsWith(sep) ? base : base + sep;
209
- const sameCase = (p) => process.platform === 'win32' ? p.toLowerCase() : p;
210
- const nAbs = sameCase(abs);
211
- return nAbs === sameCase(base) || nAbs.startsWith(sameCase(baseWithSep));
212
- }
213
- /**
214
- * 危险键黑名单:VarStack.set* / interpolateDeep 对象 key / 点路径访问统一过滤。
215
- * 防止原型污染 / 构造函数逃逸。与 expressions.ts parsePrimary S1 白名单保持一致。
216
- */
217
- export const DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
13
+ export {};