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
@@ -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' };