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,56 @@
1
+ /**
2
+ * `/login` `/logout` 命令解析(纯函数,与 `ui/advisorCommand.ts`/`ui/computerCommand.ts`
3
+ * 同构,单独导出可测)。
4
+ *
5
+ * 原来这套能力叫 `/team`(login/logout/status/models/usage/tools)。改名理由:
6
+ * 登录本身就是登录,不登录自然用不了团队在线模型和协作,不需要在命令名里
7
+ * 反复强调"team"——多一个词只会让用户敲错、也让它看起来像一个跟本机模型
8
+ * 无关的独立子系统(其实完全相反:不登录时本机模型照常可用,`/login` 只影响
9
+ * "要不要多一路在线模型可选")。`/login`/`/logout` 与 Claude Code 的顶层命令
10
+ * 保持同名,降低用户的记忆负担。
11
+ *
12
+ * 普通用户不需要也不应该每次输入服务器地址。服务器地址由发行配置解析,
13
+ * 只有明确输入 http(s) 地址时才保留开发/自托管兼容入口。
14
+ */
15
+ export function parseLoginCommand(input) {
16
+ const trimmed = input.trim();
17
+ // 裸 `/login` = 使用内置/已配置地址发起登录;纯查询使用 `/login status`。
18
+ if (trimmed === '/login')
19
+ return { matched: true, command: 'login' };
20
+ const match = /^\/login\s+([\s\S]+)$/.exec(trimmed);
21
+ if (!match)
22
+ return { matched: false };
23
+ const rest = match[1].trim();
24
+ if (rest === 'status')
25
+ return { matched: true, command: 'status' };
26
+ if (rest === 'help')
27
+ return { matched: true, command: 'help' };
28
+ if (rest === 'models' || rest === 'refresh')
29
+ return { matched: true, command: 'models' };
30
+ if (rest === 'usage')
31
+ return { matched: true, command: 'usage' };
32
+ if (rest === 'tools' || rest.startsWith('tools ')) {
33
+ return { matched: true, command: 'tools', value: rest.slice('tools'.length).trim() };
34
+ }
35
+ // 仅保留显式 URL 作为开发/自托管兼容入口,避免把拼写错误发到网络。
36
+ if (/^https?:\/\//i.test(rest))
37
+ return { matched: true, command: 'login', server: rest };
38
+ return { matched: true, command: 'help' };
39
+ }
40
+ /** `/logout` 精确匹配,不接受多余文字(与 `/advisor` 等硬拦截命令同规则)。 */
41
+ export function isLogoutCommand(input) {
42
+ return input.trim() === '/logout';
43
+ }
44
+ /** `/login help` 的文案(纯数据,测试可断言它覆盖了全部子命令)。 */
45
+ export function loginHelpText() {
46
+ return [
47
+ '[/login] 团队在线模型登录 —— 不登录不影响本机模型正常使用。',
48
+ ' /login 使用已配置的服务端登录',
49
+ ' /login status 只查看状态,不打开浏览器',
50
+ ' /login models 列出可用在线模型',
51
+ ' /login usage 查看订阅与用量',
52
+ ' /login tools [list|workspace,web,…] 查看/设置当前 Session 的在线工具类别',
53
+ ' /login help 显示本说明',
54
+ ' /logout 登出并撤销本机设备授权',
55
+ ].join('\n');
56
+ }
@@ -0,0 +1,63 @@
1
+ /**
2
+ * `/login` `/logout` 命令解析(纯函数,与 `ui/advisorCommand.ts`/`ui/computerCommand.ts`
3
+ * 同构,单独导出可测)。
4
+ *
5
+ * 原来这套能力叫 `/team`(login/logout/status/models/usage/tools)。改名理由:
6
+ * 登录本身就是登录,不登录自然用不了团队在线模型和协作,不需要在命令名里
7
+ * 反复强调"team"——多一个词只会让用户敲错、也让它看起来像一个跟本机模型
8
+ * 无关的独立子系统(其实完全相反:不登录时本机模型照常可用,`/login` 只影响
9
+ * "要不要多一路在线模型可选")。`/login`/`/logout` 与 Claude Code 的顶层命令
10
+ * 保持同名,降低用户的记忆负担。
11
+ *
12
+ * 普通用户不需要也不应该每次输入服务器地址。服务器地址由发行配置解析,
13
+ * 只有明确输入 http(s) 地址时才保留开发/自托管兼容入口。
14
+ */
15
+
16
+ export type LoginCommand = 'status' | 'help' | 'login' | 'models' | 'usage' | 'tools';
17
+
18
+ export type LoginCommandParseResult =
19
+ | { matched: false }
20
+ | { matched: true; command: 'status' | 'help' | 'models' | 'usage' }
21
+ | { matched: true; command: 'login'; server?: string }
22
+ /** value: '' 或 'list' = 查看当前设置;其余按逗号/空格拆分成类别列表。 */
23
+ | { matched: true; command: 'tools'; value: string };
24
+
25
+ export function parseLoginCommand(input: string): LoginCommandParseResult {
26
+ const trimmed = input.trim();
27
+ // 裸 `/login` = 使用内置/已配置地址发起登录;纯查询使用 `/login status`。
28
+ if (trimmed === '/login') return { matched: true, command: 'login' };
29
+
30
+ const match = /^\/login\s+([\s\S]+)$/.exec(trimmed);
31
+ if (!match) return { matched: false };
32
+
33
+ const rest = match[1]!.trim();
34
+ if (rest === 'status') return { matched: true, command: 'status' };
35
+ if (rest === 'help') return { matched: true, command: 'help' };
36
+ if (rest === 'models' || rest === 'refresh') return { matched: true, command: 'models' };
37
+ if (rest === 'usage') return { matched: true, command: 'usage' };
38
+ if (rest === 'tools' || rest.startsWith('tools ')) {
39
+ return { matched: true, command: 'tools', value: rest.slice('tools'.length).trim() };
40
+ }
41
+ // 仅保留显式 URL 作为开发/自托管兼容入口,避免把拼写错误发到网络。
42
+ if (/^https?:\/\//i.test(rest)) return { matched: true, command: 'login', server: rest };
43
+ return { matched: true, command: 'help' };
44
+ }
45
+
46
+ /** `/logout` 精确匹配,不接受多余文字(与 `/advisor` 等硬拦截命令同规则)。 */
47
+ export function isLogoutCommand(input: string): boolean {
48
+ return input.trim() === '/logout';
49
+ }
50
+
51
+ /** `/login help` 的文案(纯数据,测试可断言它覆盖了全部子命令)。 */
52
+ export function loginHelpText(): string {
53
+ return [
54
+ '[/login] 团队在线模型登录 —— 不登录不影响本机模型正常使用。',
55
+ ' /login 使用已配置的服务端登录',
56
+ ' /login status 只查看状态,不打开浏览器',
57
+ ' /login models 列出可用在线模型',
58
+ ' /login usage 查看订阅与用量',
59
+ ' /login tools [list|workspace,web,…] 查看/设置当前 Session 的在线工具类别',
60
+ ' /login help 显示本说明',
61
+ ' /logout 登出并撤销本机设备授权',
62
+ ].join('\n');
63
+ }
@@ -0,0 +1,41 @@
1
+ import { friendlyToolDescription } from '../loop.js';
2
+ /** 把内核的人话工具描述统一成 TUI 的中文工作进展文案。 */
3
+ export function humanizeToolProgress(text) {
4
+ const replacements = [
5
+ [/^Reading\s+/i, '读取 '],
6
+ [/^Editing\s+/i, '编辑 '],
7
+ [/^Writing\s+/i, '写入 '],
8
+ [/^Running\s+/i, '运行 '],
9
+ [/^Searching\s+/i, '搜索 '],
10
+ [/^Globbing\s+/i, '查找 '],
11
+ [/^Fetching\s+/i, '访问 '],
12
+ ];
13
+ for (const [pattern, replacement] of replacements) {
14
+ if (pattern.test(text))
15
+ return text.replace(pattern, replacement);
16
+ }
17
+ if (/^PresentResult\b/.test(text))
18
+ return '提交最终结果';
19
+ return text;
20
+ }
21
+ /**
22
+ * 一批工具调用在 scrollback 中只占一条阶段摘要;保留短 id,用户仍可 `/show id`。
23
+ */
24
+ export function toolBatchSummary(calls, maxItems = 2) {
25
+ const shown = calls.slice(0, maxItems).map((call) => {
26
+ const friendly = humanizeToolProgress(friendlyToolDescription(call.function.name, call.function.arguments));
27
+ return `${friendly} #${call.id.slice(-8)}`;
28
+ });
29
+ const rest = Math.max(0, calls.length - shown.length);
30
+ return `${shown.join(';')}${rest > 0 ? `;另 ${rest} 项` : ''}`;
31
+ }
32
+ /** 成功的普通工具结果不写 scrollback;失败和高价值结果仍保留。 */
33
+ export function toolHistoryVisibility(toolName, content) {
34
+ if (toolName === 'Advisor' || toolName === 'AdvisorDecision' || toolName === 'PresentResult')
35
+ return 'full';
36
+ if (toolName === 'Agent')
37
+ return 'compact';
38
+ if (/^\s*(?:Error:|错误[::]|失败[::])/i.test(content))
39
+ return 'full';
40
+ return 'hidden';
41
+ }
@@ -0,0 +1,44 @@
1
+ import { friendlyToolDescription } from '../loop.js';
2
+ import type { ToolCall } from '../types.js';
3
+
4
+ /** 把内核的人话工具描述统一成 TUI 的中文工作进展文案。 */
5
+ export function humanizeToolProgress(text: string): string {
6
+ const replacements: Array<[RegExp, string]> = [
7
+ [/^Reading\s+/i, '读取 '],
8
+ [/^Editing\s+/i, '编辑 '],
9
+ [/^Writing\s+/i, '写入 '],
10
+ [/^Running\s+/i, '运行 '],
11
+ [/^Searching\s+/i, '搜索 '],
12
+ [/^Globbing\s+/i, '查找 '],
13
+ [/^Fetching\s+/i, '访问 '],
14
+ ];
15
+ for (const [pattern, replacement] of replacements) {
16
+ if (pattern.test(text)) return text.replace(pattern, replacement);
17
+ }
18
+ if (/^PresentResult\b/.test(text)) return '提交最终结果';
19
+ return text;
20
+ }
21
+
22
+ /**
23
+ * 一批工具调用在 scrollback 中只占一条阶段摘要;保留短 id,用户仍可 `/show id`。
24
+ */
25
+ export function toolBatchSummary(calls: ToolCall[], maxItems = 2): string {
26
+ const shown = calls.slice(0, maxItems).map((call) => {
27
+ const friendly = humanizeToolProgress(
28
+ friendlyToolDescription(call.function.name, call.function.arguments),
29
+ );
30
+ return `${friendly} #${call.id.slice(-8)}`;
31
+ });
32
+ const rest = Math.max(0, calls.length - shown.length);
33
+ return `${shown.join(';')}${rest > 0 ? `;另 ${rest} 项` : ''}`;
34
+ }
35
+
36
+ export type ToolHistoryVisibility = 'hidden' | 'compact' | 'full';
37
+
38
+ /** 成功的普通工具结果不写 scrollback;失败和高价值结果仍保留。 */
39
+ export function toolHistoryVisibility(toolName: string | undefined, content: string): ToolHistoryVisibility {
40
+ if (toolName === 'Advisor' || toolName === 'AdvisorDecision' || toolName === 'PresentResult') return 'full';
41
+ if (toolName === 'Agent') return 'compact';
42
+ if (/^\s*(?:Error:|错误[::]|失败[::])/i.test(content)) return 'full';
43
+ return 'hidden';
44
+ }
@@ -56,8 +56,15 @@ function pickScript(x, y) {
56
56
  if (same.length > 1) selector += ':nth-of-type(' + (Array.from(el.parentElement?.children || []).filter((n) => n.tagName === el.tagName).indexOf(el) + 1) + ')';
57
57
  }
58
58
  const role = el.getAttribute('role') || ({A:'link',BUTTON:'button',INPUT:'textbox',SELECT:'combobox',TEXTAREA:'textbox',IMG:'img'}[el.tagName] || undefined);
59
- const accessibleName = el.getAttribute('aria-label') || el.getAttribute('alt') || el.getAttribute('title') || String(el.innerText || el.textContent || '').trim().slice(0, 160);
60
- return { ref: selector, tag: el.tagName.toLowerCase(), role, accessibleName, text: String(el.innerText || el.textContent || '').trim().slice(0, 1000), boundingBox: { x: r.x, y: r.y, width: r.width, height: r.height }, attributes: attrs };
59
+ const label = el.labels?.length ? Array.from(el.labels).map((item) => String(item.textContent || '').trim()).filter(Boolean).join(' ') : undefined;
60
+ const accessibleName = el.getAttribute('aria-label') || label || el.getAttribute('alt') || el.getAttribute('title') || String(el.innerText || el.textContent || '').trim().slice(0, 160);
61
+ const style = getComputedStyle(el);
62
+ const visible = !!(r.width || r.height) && style.display !== 'none' && style.visibility !== 'hidden';
63
+ const enabled = !(el instanceof HTMLButtonElement || el instanceof HTMLInputElement || el instanceof HTMLSelectElement || el instanceof HTMLTextAreaElement) || !el.disabled;
64
+ const editable = el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el.isContentEditable;
65
+ const clickable = el instanceof HTMLButtonElement || el instanceof HTMLAnchorElement || el.getAttribute('role') === 'button' || typeof el.onclick === 'function';
66
+ const cssCandidates = [selector, el.id ? '#' + escape(el.id) : '', el.getAttribute('data-testid') ? '[data-testid="' + escape(el.getAttribute('data-testid')) + '"]' : ''].filter(Boolean);
67
+ return { ref: selector, tag: el.tagName.toLowerCase(), role, accessibleName, label, placeholder: el.getAttribute('placeholder') || undefined, testId: el.getAttribute('data-testid') || undefined, cssCandidates, framePath: [], visible, enabled, editable, clickable, confidence: el.id || el.getAttribute('data-testid') ? 'high' : 'medium', text: String(el.innerText || el.textContent || '').trim().slice(0, 1000), boundingBox: { x: r.x, y: r.y, width: r.width, height: r.height }, attributes: attrs };
61
68
  })()`;
62
69
  }
63
70
  function mapStreamEvent(event) {
@@ -108,6 +115,17 @@ function mapStreamEvent(event) {
108
115
  case 'navigation': return { t: 'browser/navigation', url: String(event.url ?? ''), state: (event.state === 'start' || event.state === 'commit' || event.state === 'domcontentloaded') ? event.state : 'load' };
109
116
  case 'console': return { t: 'browser/console', level: typeof event.level === 'string' ? event.level : undefined, text: String(event.text ?? '') };
110
117
  case 'page_error': return { t: 'browser/page_error', text: String(event.text ?? event.message ?? '') };
118
+ case 'download': return {
119
+ t: 'browser/download',
120
+ id: typeof event.id === 'string' ? event.id : undefined,
121
+ url: String(event.url ?? ''), filename: typeof event.filename === 'string' ? event.filename : undefined,
122
+ path: typeof event.path === 'string' ? event.path : undefined,
123
+ mime: typeof event.mime === 'string' ? event.mime : undefined,
124
+ error: typeof event.error === 'string' ? event.error : undefined,
125
+ state: (event.state === 'progress' || event.state === 'complete' || event.state === 'failed' || event.state === 'canceled') ? event.state : 'start',
126
+ receivedBytes: typeof event.receivedBytes === 'number' ? event.receivedBytes : undefined,
127
+ totalBytes: typeof event.totalBytes === 'number' ? event.totalBytes : undefined,
128
+ };
111
129
  case 'dialog': return { t: 'browser/dialog', type: (event.dialogType ?? event.kind ?? 'alert'), message: String(event.message ?? ''), defaultValue: typeof event.defaultValue === 'string' ? event.defaultValue : undefined };
112
130
  case 'error': return { t: 'browser/error', message: String(event.message ?? '浏览器流错误') };
113
131
  case 'mode': return { t: 'browser/mode', mode: event.mode };
@@ -66,8 +66,15 @@ function pickScript(x: number, y: number): string {
66
66
  if (same.length > 1) selector += ':nth-of-type(' + (Array.from(el.parentElement?.children || []).filter((n) => n.tagName === el.tagName).indexOf(el) + 1) + ')';
67
67
  }
68
68
  const role = el.getAttribute('role') || ({A:'link',BUTTON:'button',INPUT:'textbox',SELECT:'combobox',TEXTAREA:'textbox',IMG:'img'}[el.tagName] || undefined);
69
- const accessibleName = el.getAttribute('aria-label') || el.getAttribute('alt') || el.getAttribute('title') || String(el.innerText || el.textContent || '').trim().slice(0, 160);
70
- return { ref: selector, tag: el.tagName.toLowerCase(), role, accessibleName, text: String(el.innerText || el.textContent || '').trim().slice(0, 1000), boundingBox: { x: r.x, y: r.y, width: r.width, height: r.height }, attributes: attrs };
69
+ const label = el.labels?.length ? Array.from(el.labels).map((item) => String(item.textContent || '').trim()).filter(Boolean).join(' ') : undefined;
70
+ const accessibleName = el.getAttribute('aria-label') || label || el.getAttribute('alt') || el.getAttribute('title') || String(el.innerText || el.textContent || '').trim().slice(0, 160);
71
+ const style = getComputedStyle(el);
72
+ const visible = !!(r.width || r.height) && style.display !== 'none' && style.visibility !== 'hidden';
73
+ const enabled = !(el instanceof HTMLButtonElement || el instanceof HTMLInputElement || el instanceof HTMLSelectElement || el instanceof HTMLTextAreaElement) || !el.disabled;
74
+ const editable = el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el.isContentEditable;
75
+ const clickable = el instanceof HTMLButtonElement || el instanceof HTMLAnchorElement || el.getAttribute('role') === 'button' || typeof el.onclick === 'function';
76
+ const cssCandidates = [selector, el.id ? '#' + escape(el.id) : '', el.getAttribute('data-testid') ? '[data-testid="' + escape(el.getAttribute('data-testid')) + '"]' : ''].filter(Boolean);
77
+ return { ref: selector, tag: el.tagName.toLowerCase(), role, accessibleName, label, placeholder: el.getAttribute('placeholder') || undefined, testId: el.getAttribute('data-testid') || undefined, cssCandidates, framePath: [], visible, enabled, editable, clickable, confidence: el.id || el.getAttribute('data-testid') ? 'high' : 'medium', text: String(el.innerText || el.textContent || '').trim().slice(0, 1000), boundingBox: { x: r.x, y: r.y, width: r.width, height: r.height }, attributes: attrs };
71
78
  })()`;
72
79
  }
73
80
 
@@ -119,6 +126,17 @@ function mapStreamEvent(event: BrowserStreamEvent): ServerFrame | null {
119
126
  case 'navigation': return { t: 'browser/navigation', url: String(event.url ?? ''), state: (event.state === 'start' || event.state === 'commit' || event.state === 'domcontentloaded') ? event.state : 'load' };
120
127
  case 'console': return { t: 'browser/console', level: typeof event.level === 'string' ? event.level : undefined, text: String(event.text ?? '') };
121
128
  case 'page_error': return { t: 'browser/page_error', text: String(event.text ?? event.message ?? '') };
129
+ case 'download': return {
130
+ t: 'browser/download',
131
+ id: typeof event.id === 'string' ? event.id : undefined,
132
+ url: String(event.url ?? ''), filename: typeof event.filename === 'string' ? event.filename : undefined,
133
+ path: typeof event.path === 'string' ? event.path : undefined,
134
+ mime: typeof event.mime === 'string' ? event.mime : undefined,
135
+ error: typeof event.error === 'string' ? event.error : undefined,
136
+ state: (event.state === 'progress' || event.state === 'complete' || event.state === 'failed' || event.state === 'canceled') ? event.state : 'start',
137
+ receivedBytes: typeof event.receivedBytes === 'number' ? event.receivedBytes : undefined,
138
+ totalBytes: typeof event.totalBytes === 'number' ? event.totalBytes : undefined,
139
+ };
122
140
  case 'dialog': return { t: 'browser/dialog', type: (event.dialogType ?? event.kind ?? 'alert') as 'alert' | 'confirm' | 'prompt' | 'beforeunload', message: String(event.message ?? ''), defaultValue: typeof event.defaultValue === 'string' ? event.defaultValue : undefined };
123
141
  case 'error': return { t: 'browser/error', message: String(event.message ?? '浏览器流错误') };
124
142
  case 'mode': return { t: 'browser/mode', mode: event.mode as 'browse' | 'assist' | 'auto' };