minimal-agent 0.12.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 (472) hide show
  1. package/README.md +6 -5
  2. package/package.json +62 -5
  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 +204 -185
  16. package/plugins/workflow-runner/src/index.ts +249 -224
  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 +404 -467
  28. package/plugins/workflow-runner/src/runner.ts +491 -535
  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 +172 -152
  54. package/plugins/workflow-runner/src/taskIdentity.ts +233 -200
  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 -105
  58. package/plugins/workflow-runner/src/types.ts +155 -520
  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 +542 -469
  68. package/plugins/workflow-runner/src/workflowState.ts +639 -589
  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/skill-creator/scripts/run_eval.py +3 -2
  92. package/skills/ui-design/SKILL.md +5 -2
  93. package/skills/ui-design/references/layout-composition.md +1 -1
  94. package/skills/workflow-creator/SKILL.md +344 -0
  95. package/skills/workflow-creator/assets/template/workflow.mjs +48 -0
  96. package/skills/workflow-creator/references/api.md +216 -0
  97. package/skills/workflow-creator/references/migration.md +103 -0
  98. package/skills/workflow-creator/references/patterns.md +779 -0
  99. package/skills/workflow-creator/scripts/list-resources.mjs +205 -0
  100. package/skills/workflow-creator/scripts/scaffold.mjs +148 -0
  101. package/skills/workflow-creator/scripts/validate.mjs +275 -0
  102. package/skills/workflow-creator/scripts/workflow-creator.test.mjs +82 -0
  103. package/src/advisor/advisorCoordinator.js +503 -0
  104. package/src/advisor/advisorCoordinator.ts +657 -0
  105. package/src/cli/configMenu.tsx +0 -1
  106. package/src/cli/print.js +44 -6
  107. package/src/cli/print.ts +73 -4
  108. package/src/cli/streamJson.js +5 -6
  109. package/src/cli/streamJson.ts +8 -4
  110. package/src/cli/wizards/advisorWizard.js +4 -2
  111. package/src/cli/wizards/advisorWizard.tsx +8 -2
  112. package/src/cli/wizards/contextAdvisorWizard.js +5 -4
  113. package/src/cli/wizards/contextAdvisorWizard.tsx +7 -6
  114. package/src/collaboration/taskFlow.js +115 -0
  115. package/src/collaboration/taskFlow.ts +169 -0
  116. package/src/config/configDefaults.js +41 -1
  117. package/src/config/configDefaults.ts +43 -1
  118. package/src/config/configDiagnostics.ts +2 -2
  119. package/src/config/configFile.js +40 -9
  120. package/src/config/configFile.ts +60 -11
  121. package/src/config/configService.js +443 -74
  122. package/src/config/configService.ts +723 -142
  123. package/src/config/numericLimits.js +22 -0
  124. package/src/config/numericLimits.ts +24 -0
  125. package/src/config.js +1 -0
  126. package/src/config.ts +3 -2
  127. package/src/context/budgetPlan.js +1 -1
  128. package/src/context/budgetPlan.ts +1 -1
  129. package/src/context/compact.js +7 -2
  130. package/src/context/compact.ts +9 -2
  131. package/src/context/microCompactLite.js +212 -13
  132. package/src/context/microCompactLite.ts +261 -12
  133. package/src/context/sessionRegistry.js +8 -1
  134. package/src/context/sessionRegistry.ts +18 -5
  135. package/src/context/toolResultArchive.js +72 -0
  136. package/src/context/toolResultArchive.ts +95 -0
  137. package/src/goal/errors.js +8 -0
  138. package/src/goal/errors.ts +18 -0
  139. package/src/goal/goalRuntime.js +344 -0
  140. package/src/goal/goalRuntime.ts +466 -0
  141. package/src/goal/goalStore.js +200 -0
  142. package/src/goal/goalStore.ts +219 -0
  143. package/src/goal/index.js +4 -0
  144. package/src/goal/index.ts +4 -0
  145. package/src/goal/statusMapping.js +71 -0
  146. package/src/goal/statusMapping.ts +95 -0
  147. package/src/goal/types.js +7 -0
  148. package/src/goal/types.ts +179 -0
  149. package/src/goal/workflowController.js +306 -0
  150. package/src/goal/workflowController.ts +360 -0
  151. package/src/harness/evidenceLedger.js +2 -0
  152. package/src/harness/evidenceLedger.ts +1 -0
  153. package/src/harness/stallGuard.js +9 -3
  154. package/src/harness/stallGuard.ts +7 -3
  155. package/src/images/imageResolver.js +161 -0
  156. package/src/images/imageResolver.ts +189 -0
  157. package/src/infra/verification.js +56 -20
  158. package/src/infra/verification.ts +87 -20
  159. package/src/llm/client.js +79 -21
  160. package/src/llm/client.ts +182 -35
  161. package/src/llm/gatewayClient.js +201 -0
  162. package/src/llm/gatewayClient.ts +299 -0
  163. package/src/llm/messageProvenance.js +46 -0
  164. package/src/llm/messageProvenance.ts +58 -0
  165. package/src/llm/modelProvider.js +1 -0
  166. package/src/llm/modelProvider.ts +22 -0
  167. package/src/llm/providers/anthropicFormat.js +108 -1
  168. package/src/llm/providers/anthropicFormat.ts +115 -4
  169. package/src/llm/providers/openaiFormat.js +9 -0
  170. package/src/llm/providers/openaiFormat.ts +12 -3
  171. package/src/loop.js +319 -54
  172. package/src/loop.ts +373 -57
  173. package/src/main.js +4 -1
  174. package/src/main.tsx +4 -1
  175. package/src/managedExecution/index.js +2 -0
  176. package/src/managedExecution/index.ts +2 -0
  177. package/src/managedExecution/registry.js +15 -0
  178. package/src/managedExecution/registry.ts +20 -0
  179. package/src/managedExecution/types.js +1 -0
  180. package/src/managedExecution/types.ts +86 -0
  181. package/src/modelRef.js +9 -0
  182. package/src/modelRef.ts +31 -0
  183. package/src/multimodal.js +14 -28
  184. package/src/multimodal.ts +17 -33
  185. package/src/net/lanDiscovery.js +65 -0
  186. package/src/net/lanDiscovery.ts +82 -0
  187. package/src/plugin-sdk.js +28 -3
  188. package/src/plugin-sdk.ts +39 -6
  189. package/src/plugins/pluginApi.ts +16 -1
  190. package/src/plugins/pluginLoader.js +4 -0
  191. package/src/plugins/pluginLoader.ts +6 -0
  192. package/src/plugins/pluginRunner.js +152 -9
  193. package/src/plugins/pluginRunner.ts +186 -8
  194. package/src/plugins/slashFallback.js +113 -0
  195. package/src/plugins/slashFallback.ts +137 -0
  196. package/src/prompts/policyRegistry.js +15 -8
  197. package/src/prompts/policyRegistry.ts +18 -8
  198. package/src/prompts/promptAssembly.js +103 -12
  199. package/src/prompts/promptAssembly.ts +114 -12
  200. package/src/prompts/skillList.js +21 -3
  201. package/src/prompts/skillList.ts +27 -2
  202. package/src/prompts/stableSystemPrompt.js +18 -0
  203. package/src/prompts/stableSystemPrompt.ts +33 -0
  204. package/src/runtime/agentRuntimeContext.js +8 -2
  205. package/src/runtime/agentRuntimeContext.ts +17 -4
  206. package/src/session/runAgentTurn.js +78 -12
  207. package/src/session/runAgentTurn.ts +105 -23
  208. package/src/session/runTurn.js +10 -9
  209. package/src/session/runTurn.ts +17 -8
  210. package/src/session/sessionState.ts +2 -0
  211. package/src/team/auth.js +186 -0
  212. package/src/team/auth.ts +298 -0
  213. package/src/team/cli.js +105 -0
  214. package/src/team/cli.ts +122 -0
  215. package/src/team/onlineToolContract.js +64 -0
  216. package/src/team/onlineToolContract.ts +109 -0
  217. package/src/team/toolPolicy.js +36 -0
  218. package/src/team/toolPolicy.ts +75 -0
  219. package/src/tools/advisor/advisor.js +148 -37
  220. package/src/tools/advisor/advisor.ts +161 -38
  221. package/src/tools/advisor/advisorDecision.js +71 -0
  222. package/src/tools/advisor/advisorDecision.ts +85 -0
  223. package/src/tools/agent/agent.js +18 -5
  224. package/src/tools/agent/agent.ts +21 -7
  225. package/src/tools/agent/agentControl.js +246 -0
  226. package/src/tools/agent/agentControl.ts +284 -0
  227. package/src/tools/agent/agentTaskService.js +40 -1
  228. package/src/tools/agent/agentTaskService.ts +44 -1
  229. package/src/tools/agent/agentTypes.js +14 -2
  230. package/src/tools/agent/agentTypes.ts +15 -2
  231. package/src/tools/applypatch/applyPatch.js +362 -0
  232. package/src/tools/applypatch/applyPatch.ts +428 -0
  233. package/src/tools/bash/bash.js +70 -18
  234. package/src/tools/bash/bash.ts +75 -20
  235. package/src/tools/capabilities.js +10 -5
  236. package/src/tools/capabilities.ts +10 -5
  237. package/src/tools/computeruse/computerIntent.js +32 -0
  238. package/src/tools/computeruse/computerIntent.ts +46 -0
  239. package/src/tools/computeruse/telemetryLog.js +12 -0
  240. package/src/tools/computeruse/telemetryLog.ts +16 -0
  241. package/src/tools/computeruse/vision/telemetry.js +1 -0
  242. package/src/tools/computeruse/vision/telemetry.ts +1 -0
  243. package/src/tools/effectiveToolSet.js +4 -0
  244. package/src/tools/effectiveToolSet.ts +4 -0
  245. package/src/tools/index.js +21 -2
  246. package/src/tools/index.ts +33 -2
  247. package/src/tools/powershell/powershell.js +18 -1
  248. package/src/tools/powershell/powershell.ts +18 -2
  249. package/src/tools/presentresult/presentresult.js +6 -15
  250. package/src/tools/presentresult/presentresult.ts +6 -15
  251. package/src/tools/read/read.js +69 -11
  252. package/src/tools/read/read.ts +70 -11
  253. package/src/tools/shared/fileUtils.js +1 -2
  254. package/src/tools/shared/fileUtils.ts +1 -2
  255. package/src/tools/shared/permanentDeleteGuard.js +34 -3
  256. package/src/tools/shared/permanentDeleteGuard.ts +43 -6
  257. package/src/tools/shared/toolOutputStore.js +23 -1
  258. package/src/tools/shared/toolOutputStore.ts +22 -1
  259. package/src/tools/skill/skill.js +9 -3
  260. package/src/tools/skill/skill.ts +8 -4
  261. package/src/tools/toolPromptGuides.js +117 -0
  262. package/src/tools/toolPromptGuides.ts +137 -0
  263. package/src/tools/webbrowser/agentBrowserPath.js +19 -9
  264. package/src/tools/webbrowser/agentBrowserPath.ts +70 -28
  265. package/src/tools/webbrowser/browser.js +27 -11
  266. package/src/tools/webbrowser/browser.ts +68 -24
  267. package/src/tools/webbrowser/browserAutomation.js +329 -0
  268. package/src/tools/webbrowser/browserAutomation.ts +467 -0
  269. package/src/tools/webbrowser/browserAxState.js +97 -0
  270. package/src/tools/webbrowser/browserAxState.ts +142 -0
  271. package/src/tools/webbrowser/browserBatch.js +1578 -0
  272. package/src/tools/webbrowser/browserBatch.ts +2382 -0
  273. package/src/tools/webbrowser/browserCdp.js +208 -0
  274. package/src/tools/webbrowser/browserCdp.ts +255 -0
  275. package/src/tools/webbrowser/browserConditions.js +24 -0
  276. package/src/tools/webbrowser/browserConditions.ts +45 -0
  277. package/src/tools/webbrowser/browserContent.js +281 -0
  278. package/src/tools/webbrowser/browserContent.ts +438 -0
  279. package/src/tools/webbrowser/browserControl.js +131 -30
  280. package/src/tools/webbrowser/browserControl.ts +210 -50
  281. package/src/tools/webbrowser/browserDaemon.js +22 -14
  282. package/src/tools/webbrowser/browserDaemon.ts +54 -21
  283. package/src/tools/webbrowser/browserFrames.js +47 -0
  284. package/src/tools/webbrowser/browserFrames.ts +54 -0
  285. package/src/tools/webbrowser/browserInteractionResolver.js +17 -0
  286. package/src/tools/webbrowser/browserInteractionResolver.ts +40 -0
  287. package/src/tools/webbrowser/browserLocator.js +140 -0
  288. package/src/tools/webbrowser/browserLocator.ts +194 -0
  289. package/src/tools/webbrowser/browserOutcome.js +10 -17
  290. package/src/tools/webbrowser/browserOutcome.ts +48 -31
  291. package/src/tools/webbrowser/browserRecovery.js +58 -0
  292. package/src/tools/webbrowser/browserRecovery.ts +83 -0
  293. package/src/tools/webbrowser/browserRunRegistry.js +35 -3
  294. package/src/tools/webbrowser/browserRunRegistry.ts +91 -15
  295. package/src/tools/webbrowser/browserService.js +28 -2
  296. package/src/tools/webbrowser/browserService.ts +49 -9
  297. package/src/tools/webbrowser/browserStream.js +132 -33
  298. package/src/tools/webbrowser/browserStream.ts +224 -50
  299. package/src/tools/webbrowser/browserTabs.js +48 -15
  300. package/src/tools/webbrowser/browserTabs.ts +178 -96
  301. package/src/tools/webbrowser/webbrowser.js +683 -144
  302. package/src/tools/webbrowser/webbrowser.ts +979 -236
  303. package/src/tools/webfetch/preapproved.js +0 -2
  304. package/src/tools/webfetch/preapproved.ts +0 -2
  305. package/src/tools/websearch/websearch.js +129 -8
  306. package/src/tools/websearch/websearch.ts +138 -6
  307. package/src/types.ts +450 -42
  308. package/src/ui/App.js +377 -58
  309. package/src/ui/App.tsx +576 -111
  310. package/src/ui/LiveArea.js +14 -8
  311. package/src/ui/LiveArea.tsx +14 -10
  312. package/src/ui/MessageList.js +63 -20
  313. package/src/ui/MessageList.tsx +101 -16
  314. package/src/ui/ModelPicker.js +7 -4
  315. package/src/ui/ModelPicker.tsx +55 -8
  316. package/src/ui/hooks/useChat.js +152 -163
  317. package/src/ui/hooks/useChat.ts +396 -334
  318. package/src/ui/loginCommand.js +56 -0
  319. package/src/ui/loginCommand.ts +63 -0
  320. package/src/ui/toolProgress.js +41 -0
  321. package/src/ui/toolProgress.ts +44 -0
  322. package/src/web/browserBridge.js +20 -2
  323. package/src/web/browserBridge.ts +20 -2
  324. package/src/web/protocol.ts +1897 -194
  325. package/workflows/adaptive-research/workflow.mjs +86 -0
  326. package/workflows/e2e-capabilities/workflow.mjs +102 -0
  327. package/workflows/e2e-llm/workflow.mjs +52 -0
  328. package/workflows/e2e-smoke/workflow.mjs +59 -0
  329. package/workflows/e2e-vision-schema/README.md +48 -0
  330. package/workflows/e2e-vision-schema/workflow.mjs +149 -0
  331. package/workflows/e2e-write-greet/workflow.mjs +37 -0
  332. package/workflows/file-census/README.md +14 -0
  333. package/workflows/file-census/scripts/.gitkeep +2 -0
  334. package/workflows/file-census/workflow.mjs +110 -0
  335. package/workflows/goal/README.md +166 -0
  336. package/workflows/goal/prompts/audit.md +57 -0
  337. package/workflows/goal/prompts/contract.md +56 -0
  338. package/workflows/goal/prompts/iterate.md +37 -0
  339. package/workflows/goal/workflow.mjs +501 -0
  340. package/workflows/illustrate/README.md +90 -0
  341. package/workflows/illustrate/assets/engines.json +20 -0
  342. package/workflows/illustrate/assets/extract-baidu.js +21 -0
  343. package/workflows/illustrate/assets/extract-bing.js +33 -0
  344. package/workflows/illustrate/assets/extract-google.js +31 -0
  345. package/workflows/illustrate/workflow.mjs +301 -0
  346. package/workflows/plan/workflow.mjs +389 -0
  347. package/workflows/question-crops/README.md +35 -0
  348. package/workflows/question-crops/prompts/inventory.md +23 -0
  349. package/workflows/question-crops/scripts/image-ops.mjs +305 -0
  350. package/workflows/question-crops/scripts/image-ops.test.mjs +95 -0
  351. package/workflows/question-crops/workflow.mjs +172 -0
  352. package/workflows/ralph-loop/workflow.mjs +162 -0
  353. package/workflows/research/DESIGN.md +449 -0
  354. package/workflows/research/README.md +74 -0
  355. package/workflows/research/prompts/s0-goal.md +43 -0
  356. package/workflows/research/prompts/s1-early-exit.md +22 -0
  357. package/workflows/research/prompts/s1-map.md +58 -0
  358. package/workflows/research/prompts/s2-options.md +53 -0
  359. package/workflows/research/prompts/s3-deep-dive.md +56 -0
  360. package/workflows/research/prompts/s4-verify.md +74 -0
  361. package/workflows/research/prompts/s5-synthesis.md +81 -0
  362. package/workflows/research/prompts/s5b-fill-gaps.md +32 -0
  363. package/workflows/research/prompts/s6-package.md +32 -0
  364. package/workflows/research/scripts/build-report.mjs +98 -0
  365. package/workflows/research/workflow.mjs +288 -0
  366. package/workflows/wechat-reading-shots/prompts/collect-params.md +16 -0
  367. package/workflows/wechat-reading-shots/prompts/evaluate.md +20 -0
  368. package/workflows/wechat-reading-shots/prompts/open-book.md +28 -0
  369. package/workflows/wechat-reading-shots/prompts/read-page.md +13 -0
  370. package/workflows/wechat-reading-shots/prompts/turn-batch.md +24 -0
  371. package/workflows/wechat-reading-shots/test/control-flow.test.ts +329 -0
  372. package/workflows/wechat-reading-shots/workflow.mjs +266 -0
  373. package/workflows/wrong-question-docx/README.md +55 -0
  374. package/workflows/wrong-question-docx/prompts/figure-qa.md +8 -0
  375. package/workflows/wrong-question-docx/prompts/transcribe.md +25 -0
  376. package/workflows/wrong-question-docx/scripts/workbook.mjs +857 -0
  377. package/workflows/wrong-question-docx/test/control-flow.test.ts +165 -0
  378. package/workflows/wrong-question-docx/test/workbook.test.mjs +303 -0
  379. package/workflows/wrong-question-docx/workflow.mjs +485 -0
  380. package/plugins/workflow-runner/src/agentCommon.js +0 -354
  381. package/plugins/workflow-runner/src/agentCommon.ts +0 -435
  382. package/plugins/workflow-runner/src/controlFlow/branch.js +0 -40
  383. package/plugins/workflow-runner/src/controlFlow/branch.ts +0 -46
  384. package/plugins/workflow-runner/src/controlFlow/loop.js +0 -211
  385. package/plugins/workflow-runner/src/controlFlow/loop.ts +0 -248
  386. package/plugins/workflow-runner/src/controlFlow/pause.js +0 -129
  387. package/plugins/workflow-runner/src/controlFlow/pause.ts +0 -141
  388. package/plugins/workflow-runner/src/controlFlow/signal.js +0 -21
  389. package/plugins/workflow-runner/src/controlFlow/signal.ts +0 -29
  390. package/plugins/workflow-runner/src/controlFlow/types.js +0 -18
  391. package/plugins/workflow-runner/src/controlFlow/types.ts +0 -63
  392. package/plugins/workflow-runner/src/dslManifest.js +0 -72
  393. package/plugins/workflow-runner/src/dslManifest.ts +0 -127
  394. package/plugins/workflow-runner/src/expressions.js +0 -618
  395. package/plugins/workflow-runner/src/expressions.ts +0 -622
  396. package/plugins/workflow-runner/src/loader.js +0 -573
  397. package/plugins/workflow-runner/src/loader.ts +0 -721
  398. package/plugins/workflow-runner/src/multimodal.js +0 -38
  399. package/plugins/workflow-runner/src/multimodal.ts +0 -64
  400. package/plugins/workflow-runner/src/recovery.js +0 -119
  401. package/plugins/workflow-runner/src/recovery.ts +0 -149
  402. package/plugins/workflow-runner/src/stepExecutors/agent.js +0 -173
  403. package/plugins/workflow-runner/src/stepExecutors/agent.ts +0 -234
  404. package/plugins/workflow-runner/src/stepExecutors/assert.js +0 -41
  405. package/plugins/workflow-runner/src/stepExecutors/assert.ts +0 -50
  406. package/plugins/workflow-runner/src/stepExecutors/echo.js +0 -31
  407. package/plugins/workflow-runner/src/stepExecutors/echo.ts +0 -38
  408. package/plugins/workflow-runner/src/stepExecutors/llm.js +0 -99
  409. package/plugins/workflow-runner/src/stepExecutors/llm.ts +0 -133
  410. package/plugins/workflow-runner/src/stepExecutors/set.js +0 -49
  411. package/plugins/workflow-runner/src/stepExecutors/set.ts +0 -56
  412. package/plugins/workflow-runner/src/stepExecutors/skill.js +0 -111
  413. package/plugins/workflow-runner/src/stepExecutors/skill.ts +0 -140
  414. package/plugins/workflow-runner/src/stepExecutors/tool.js +0 -208
  415. package/plugins/workflow-runner/src/stepExecutors/tool.ts +0 -256
  416. package/plugins/workflow-runner/src/stepExecutors/verify.js +0 -58
  417. package/plugins/workflow-runner/src/stepExecutors/verify.ts +0 -68
  418. package/plugins/workflow-runner/src/stepPipeline.js +0 -277
  419. package/plugins/workflow-runner/src/stepPipeline.ts +0 -366
  420. package/plugins/workflow-runner/test/agent.test.ts +0 -587
  421. package/plugins/workflow-runner/test/agentLlmError.test.ts +0 -373
  422. package/plugins/workflow-runner/test/bashBlacklist.sweep.test.ts +0 -65
  423. package/plugins/workflow-runner/test/captureMisbind.test.ts +0 -99
  424. package/plugins/workflow-runner/test/cli.e2e.test.ts +0 -147
  425. package/plugins/workflow-runner/test/context-files.test.ts +0 -320
  426. package/plugins/workflow-runner/test/e2e.test.ts +0 -370
  427. package/plugins/workflow-runner/test/engineRobustness.test.ts +0 -226
  428. package/plugins/workflow-runner/test/expressions.test.ts +0 -397
  429. package/plugins/workflow-runner/test/foundation.test.ts +0 -126
  430. package/plugins/workflow-runner/test/graceful.test.ts +0 -139
  431. package/plugins/workflow-runner/test/greedyInputs.load.test.ts +0 -47
  432. package/plugins/workflow-runner/test/hostCapability.test.ts +0 -108
  433. package/plugins/workflow-runner/test/illustrate.load.test.ts +0 -183
  434. package/plugins/workflow-runner/test/jsonPayload.test.ts +0 -83
  435. package/plugins/workflow-runner/test/loader.test.ts +0 -617
  436. package/plugins/workflow-runner/test/maxTurnsRetryDelay.test.ts +0 -33
  437. package/plugins/workflow-runner/test/multimodal.test.ts +0 -342
  438. package/plugins/workflow-runner/test/output-schema.test.ts +0 -213
  439. package/plugins/workflow-runner/test/parseWorkflowArgs.test.ts +0 -87
  440. package/plugins/workflow-runner/test/pluginRunner.isolation.test.ts +0 -269
  441. package/plugins/workflow-runner/test/ppt.load.test.ts +0 -1220
  442. package/plugins/workflow-runner/test/ralphLoop.e2e.test.ts +0 -220
  443. package/plugins/workflow-runner/test/recovery.test.ts +0 -265
  444. package/plugins/workflow-runner/test/runner.test.ts +0 -911
  445. package/plugins/workflow-runner/test/runnerPreflight.test.ts +0 -379
  446. package/plugins/workflow-runner/test/skillTurnDone.test.ts +0 -71
  447. package/plugins/workflow-runner/test/stateLifecycle.test.ts +0 -150
  448. package/plugins/workflow-runner/test/stepPipeline.test.ts +0 -114
  449. package/plugins/workflow-runner/test/taskArbitration.test.ts +0 -338
  450. package/plugins/workflow-runner/test/taskLifecycle.test.ts +0 -270
  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 -199
  468. package/workflows/schema.json +0 -176
  469. package/workflows/webppt.yaml +0 -496
  470. package/workflows/wechat-reading-shots.yaml +0 -315
  471. package/workflows/word.yaml +0 -720
  472. package/workflows/youtube-shorts.yaml +0 -202
@@ -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' };