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
@@ -1,5 +1,5 @@
1
- import { browserService } from './browserService.js';
2
1
  import { browserRunRegistry, } from './browserRunRegistry.js';
2
+ import { browserService } from './browserService.js';
3
3
  export function parseTabList(text) {
4
4
  try {
5
5
  const parsed = JSON.parse(text);
@@ -11,13 +11,17 @@ export function parseTabList(text) {
11
11
  : Number.isInteger(tab.index)
12
12
  ? String(tab.index)
13
13
  : '';
14
- return id ? [{
15
- id,
16
- active: Boolean(tab.active),
17
- ...(typeof tab.url === 'string' ? { url: tab.url } : {}),
18
- ...(typeof tab.title === 'string' ? { title: tab.title } : {}),
19
- ...(typeof tab.type === 'string' ? { type: tab.type } : {}),
20
- }] : [];
14
+ return id
15
+ ? [
16
+ {
17
+ id,
18
+ active: Boolean(tab.active),
19
+ ...(typeof tab.url === 'string' ? { url: tab.url } : {}),
20
+ ...(typeof tab.title === 'string' ? { title: tab.title } : {}),
21
+ ...(typeof tab.type === 'string' ? { type: tab.type } : {}),
22
+ },
23
+ ]
24
+ : [];
21
25
  });
22
26
  }
23
27
  catch {
@@ -40,7 +44,9 @@ function parseListedTabs(result) {
40
44
  let reportedCount = 0;
41
45
  try {
42
46
  const parsed = JSON.parse(result.stdout);
43
- reportedCount = Array.isArray(parsed.data?.tabs) ? parsed.data.tabs.length : 0;
47
+ reportedCount = Array.isArray(parsed.data?.tabs)
48
+ ? parsed.data.tabs.length
49
+ : 0;
44
50
  }
45
51
  catch {
46
52
  throw new BrowserTabError('browser_protocol_mismatch', '浏览器标签列表不是有效 JSON');
@@ -108,22 +114,30 @@ export async function ensureConversationTab(input) {
108
114
  tabId = claimed.find((candidate) => tabs.some((tab) => tab.id === candidate));
109
115
  }
110
116
  if (!tabId) {
111
- const hasClaimedTabs = browserRunRegistry.claimedTabs(input.context.conversationKey).length > 0;
117
+ const hasClaimedTabs = browserRunRegistry.claimedTabs(input.context.conversationKey).length >
118
+ 0;
112
119
  const reusableBlank = !hasClaimedTabs
113
- ? tabs.find((tab) => tab.url === 'about:blank' && browserRunRegistry.ownerOf(tab.id) === undefined)
120
+ ? tabs.find((tab) => tab.url === 'about:blank' &&
121
+ browserRunRegistry.ownerOf(tab.id) === undefined)
114
122
  : undefined;
115
123
  if (reusableBlank) {
116
124
  tabId = reusableBlank.id;
117
125
  }
118
126
  else {
119
127
  const beforeIds = new Set(tabs.map((tab) => tab.id));
120
- const created = await run([...input.globals, 'tab', 'new', 'about:blank']);
128
+ const created = await run([
129
+ ...input.globals,
130
+ 'tab',
131
+ 'new',
132
+ 'about:blank',
133
+ ]);
121
134
  if (created.code !== 0) {
122
135
  throw new BrowserTabError('tab_bootstrap_failed', created.stderr || created.stdout || '无法创建会话浏览器标签');
123
136
  }
124
137
  const after = parseListedTabs(await run([...input.globals, 'tab', 'list', '--json']));
125
138
  const added = after.filter((tab) => !beforeIds.has(tab.id));
126
- tabId = (added.find((candidate) => candidate.active) ?? added.at(-1))?.id;
139
+ tabId = (added.find((candidate) => candidate.active) ?? added.at(-1))
140
+ ?.id;
127
141
  if (!tabId) {
128
142
  throw new BrowserTabError('tab_bootstrap_failed', '新标签创建成功,但 Runtime 未返回其标签 ID');
129
143
  }
@@ -139,5 +153,24 @@ export async function ensureConversationTab(input) {
139
153
  return tabId;
140
154
  });
141
155
  }
142
- /** Compatibility alias for callers compiled against the previous helper name. */
143
- export const claimConversationTab = ensureConversationTab;
156
+ export async function claimConversationTabById(input, tabId) {
157
+ return browserService.exclusive({
158
+ sessionName: input.sessionName,
159
+ bin: input.bin,
160
+ runner: input.runner,
161
+ signal: input.signal,
162
+ }, async (run) => {
163
+ const tabs = parseListedTabs(await run([...input.globals, 'tab', 'list', '--json']));
164
+ if (!tabs.some((tab) => tab.id === tabId)) {
165
+ throw new BrowserTabError('tab_not_found', `浏览器标签不存在:${tabId}`);
166
+ }
167
+ try {
168
+ browserRunRegistry.claimTab(input.context, tabId);
169
+ }
170
+ catch (error) {
171
+ throw new BrowserTabError('tab_owned_by_other_conversation', error instanceof Error ? error.message : String(error));
172
+ }
173
+ assertSwitched(await run([...input.globals, 'tab', tabId]));
174
+ return tabId;
175
+ });
176
+ }
@@ -1,9 +1,9 @@
1
1
  import type { AgentBrowserRun, AgentBrowserRunner } from './browser.js';
2
- import { browserService } from './browserService.js';
3
2
  import {
4
- browserRunRegistry,
5
3
  type BrowserRunContext,
4
+ browserRunRegistry,
6
5
  } from './browserRunRegistry.js';
6
+ import { browserService } from './browserService.js';
7
7
 
8
8
  export interface BrowserTabRecord {
9
9
  id: string;
@@ -29,20 +29,25 @@ export function parseTabList(text: string): BrowserTabRecord[] {
29
29
  };
30
30
  };
31
31
  return (parsed.data?.tabs ?? []).flatMap((tab) => {
32
- const id = typeof tab.tabId === 'string' && tab.tabId
33
- ? tab.tabId
34
- : typeof tab.id === 'string' && tab.id
35
- ? tab.id
36
- : Number.isInteger(tab.index)
37
- ? String(tab.index)
38
- : '';
39
- return id ? [{
40
- id,
41
- active: Boolean(tab.active),
42
- ...(typeof tab.url === 'string' ? { url: tab.url } : {}),
43
- ...(typeof tab.title === 'string' ? { title: tab.title } : {}),
44
- ...(typeof tab.type === 'string' ? { type: tab.type } : {}),
45
- }] : [];
32
+ const id =
33
+ typeof tab.tabId === 'string' && tab.tabId
34
+ ? tab.tabId
35
+ : typeof tab.id === 'string' && tab.id
36
+ ? tab.id
37
+ : Number.isInteger(tab.index)
38
+ ? String(tab.index)
39
+ : '';
40
+ return id
41
+ ? [
42
+ {
43
+ id,
44
+ active: Boolean(tab.active),
45
+ ...(typeof tab.url === 'string' ? { url: tab.url } : {}),
46
+ ...(typeof tab.title === 'string' ? { title: tab.title } : {}),
47
+ ...(typeof tab.type === 'string' ? { type: tab.type } : {}),
48
+ },
49
+ ]
50
+ : [];
46
51
  });
47
52
  } catch {
48
53
  return [];
@@ -84,9 +89,14 @@ function parseListedTabs(result: AgentBrowserRun): BrowserTabRecord[] {
84
89
  let reportedCount = 0;
85
90
  try {
86
91
  const parsed = JSON.parse(result.stdout) as { data?: { tabs?: unknown[] } };
87
- reportedCount = Array.isArray(parsed.data?.tabs) ? parsed.data.tabs.length : 0;
92
+ reportedCount = Array.isArray(parsed.data?.tabs)
93
+ ? parsed.data.tabs.length
94
+ : 0;
88
95
  } catch {
89
- throw new BrowserTabError('browser_protocol_mismatch', '浏览器标签列表不是有效 JSON');
96
+ throw new BrowserTabError(
97
+ 'browser_protocol_mismatch',
98
+ '浏览器标签列表不是有效 JSON',
99
+ );
90
100
  }
91
101
  if (reportedCount > 0 && tabs.length === 0) {
92
102
  throw new BrowserTabError(
@@ -97,7 +107,9 @@ function parseListedTabs(result: AgentBrowserRun): BrowserTabRecord[] {
97
107
  return tabs;
98
108
  }
99
109
 
100
- export async function listBrowserTabs(input: Omit<BrowserTabInput, 'context'>): Promise<BrowserTabRecord[]> {
110
+ export async function listBrowserTabs(
111
+ input: Omit<BrowserTabInput, 'context'>,
112
+ ): Promise<BrowserTabRecord[]> {
101
113
  const result = await browserService.run({
102
114
  sessionName: input.sessionName,
103
115
  bin: input.bin,
@@ -121,90 +133,160 @@ export async function createConversationTab(
121
133
  input: BrowserTabInput,
122
134
  url = 'about:blank',
123
135
  ): Promise<string> {
124
- return browserService.exclusive({
125
- sessionName: input.sessionName,
126
- bin: input.bin,
127
- runner: input.runner,
128
- signal: input.signal,
129
- }, async (run) => {
130
- const before = parseListedTabs(await run([...input.globals, 'tab', 'list', '--json']));
131
- const beforeIds = new Set(before.map((tab) => tab.id));
132
- const created = await run([...input.globals, 'tab', 'new', url]);
133
- if (created.code !== 0) {
134
- throw new BrowserTabError(
135
- 'tab_bootstrap_failed',
136
- created.stderr || created.stdout || '无法创建会话浏览器标签',
136
+ return browserService.exclusive(
137
+ {
138
+ sessionName: input.sessionName,
139
+ bin: input.bin,
140
+ runner: input.runner,
141
+ signal: input.signal,
142
+ },
143
+ async (run) => {
144
+ const before = parseListedTabs(
145
+ await run([...input.globals, 'tab', 'list', '--json']),
137
146
  );
138
- }
139
- const after = parseListedTabs(await run([...input.globals, 'tab', 'list', '--json']));
140
- const added = after.filter((tab) => !beforeIds.has(tab.id));
141
- const tab = added.find((candidate) => candidate.active) ?? added.at(-1);
142
- if (!tab) {
143
- throw new BrowserTabError('tab_bootstrap_failed', '新标签创建成功,但 Runtime 未返回其标签 ID');
144
- }
145
- try {
146
- browserRunRegistry.claimTab(input.context, tab.id);
147
- } catch (error) {
148
- throw new BrowserTabError(
149
- 'tab_owned_by_other_conversation',
150
- error instanceof Error ? error.message : String(error),
147
+ const beforeIds = new Set(before.map((tab) => tab.id));
148
+ const created = await run([...input.globals, 'tab', 'new', url]);
149
+ if (created.code !== 0) {
150
+ throw new BrowserTabError(
151
+ 'tab_bootstrap_failed',
152
+ created.stderr || created.stdout || '无法创建会话浏览器标签',
153
+ );
154
+ }
155
+ const after = parseListedTabs(
156
+ await run([...input.globals, 'tab', 'list', '--json']),
151
157
  );
152
- }
153
- assertSwitched(await run([...input.globals, 'tab', tab.id]));
154
- return tab.id;
155
- });
158
+ const added = after.filter((tab) => !beforeIds.has(tab.id));
159
+ const tab = added.find((candidate) => candidate.active) ?? added.at(-1);
160
+ if (!tab) {
161
+ throw new BrowserTabError(
162
+ 'tab_bootstrap_failed',
163
+ '新标签创建成功,但 Runtime 未返回其标签 ID',
164
+ );
165
+ }
166
+ try {
167
+ browserRunRegistry.claimTab(input.context, tab.id);
168
+ } catch (error) {
169
+ throw new BrowserTabError(
170
+ 'tab_owned_by_other_conversation',
171
+ error instanceof Error ? error.message : String(error),
172
+ );
173
+ }
174
+ assertSwitched(await run([...input.globals, 'tab', tab.id]));
175
+ return tab.id;
176
+ },
177
+ );
156
178
  }
157
179
 
158
- export async function ensureConversationTab(input: BrowserTabInput): Promise<string> {
159
- return browserService.exclusive({
160
- sessionName: input.sessionName,
161
- bin: input.bin,
162
- runner: input.runner,
163
- signal: input.signal,
164
- }, async (run) => {
165
- const tabs = parseListedTabs(await run([...input.globals, 'tab', 'list', '--json']));
166
- let tabId = input.context.activeTabId;
167
- if (!tabId || !tabs.some((tab) => tab.id === tabId)) {
168
- const claimed = browserRunRegistry.claimedTabs(input.context.conversationKey);
169
- tabId = claimed.find((candidate) => tabs.some((tab) => tab.id === candidate));
170
- }
171
- if (!tabId) {
172
- const hasClaimedTabs = browserRunRegistry.claimedTabs(input.context.conversationKey).length > 0;
173
- const reusableBlank = !hasClaimedTabs
174
- ? tabs.find((tab) => tab.url === 'about:blank' && browserRunRegistry.ownerOf(tab.id) === undefined)
175
- : undefined;
176
- if (reusableBlank) {
177
- tabId = reusableBlank.id;
178
- } else {
179
- const beforeIds = new Set(tabs.map((tab) => tab.id));
180
- const created = await run([...input.globals, 'tab', 'new', 'about:blank']);
181
- if (created.code !== 0) {
182
- throw new BrowserTabError(
183
- 'tab_bootstrap_failed',
184
- created.stderr || created.stdout || '无法创建会话浏览器标签',
180
+ export async function ensureConversationTab(
181
+ input: BrowserTabInput,
182
+ ): Promise<string> {
183
+ return browserService.exclusive(
184
+ {
185
+ sessionName: input.sessionName,
186
+ bin: input.bin,
187
+ runner: input.runner,
188
+ signal: input.signal,
189
+ },
190
+ async (run) => {
191
+ const tabs = parseListedTabs(
192
+ await run([...input.globals, 'tab', 'list', '--json']),
193
+ );
194
+ let tabId = input.context.activeTabId;
195
+ if (!tabId || !tabs.some((tab) => tab.id === tabId)) {
196
+ const claimed = browserRunRegistry.claimedTabs(
197
+ input.context.conversationKey,
198
+ );
199
+ tabId = claimed.find((candidate) =>
200
+ tabs.some((tab) => tab.id === candidate),
201
+ );
202
+ }
203
+ if (!tabId) {
204
+ const hasClaimedTabs =
205
+ browserRunRegistry.claimedTabs(input.context.conversationKey).length >
206
+ 0;
207
+ const reusableBlank = !hasClaimedTabs
208
+ ? tabs.find(
209
+ (tab) =>
210
+ tab.url === 'about:blank' &&
211
+ browserRunRegistry.ownerOf(tab.id) === undefined,
212
+ )
213
+ : undefined;
214
+ if (reusableBlank) {
215
+ tabId = reusableBlank.id;
216
+ } else {
217
+ const beforeIds = new Set(tabs.map((tab) => tab.id));
218
+ const created = await run([
219
+ ...input.globals,
220
+ 'tab',
221
+ 'new',
222
+ 'about:blank',
223
+ ]);
224
+ if (created.code !== 0) {
225
+ throw new BrowserTabError(
226
+ 'tab_bootstrap_failed',
227
+ created.stderr || created.stdout || '无法创建会话浏览器标签',
228
+ );
229
+ }
230
+ const after = parseListedTabs(
231
+ await run([...input.globals, 'tab', 'list', '--json']),
185
232
  );
186
- }
187
- const after = parseListedTabs(await run([...input.globals, 'tab', 'list', '--json']));
188
- const added = after.filter((tab) => !beforeIds.has(tab.id));
189
- tabId = (added.find((candidate) => candidate.active) ?? added.at(-1))?.id;
190
- if (!tabId) {
191
- throw new BrowserTabError('tab_bootstrap_failed', '新标签创建成功,但 Runtime 未返回其标签 ID');
233
+ const added = after.filter((tab) => !beforeIds.has(tab.id));
234
+ tabId = (added.find((candidate) => candidate.active) ?? added.at(-1))
235
+ ?.id;
236
+ if (!tabId) {
237
+ throw new BrowserTabError(
238
+ 'tab_bootstrap_failed',
239
+ '新标签创建成功,但 Runtime 未返回其标签 ID',
240
+ );
241
+ }
192
242
  }
193
243
  }
194
- }
195
244
 
196
- try {
197
- browserRunRegistry.claimTab(input.context, tabId);
198
- } catch (error) {
199
- throw new BrowserTabError(
200
- 'tab_owned_by_other_conversation',
201
- error instanceof Error ? error.message : String(error),
202
- );
203
- }
204
- assertSwitched(await run([...input.globals, 'tab', tabId]));
205
- return tabId;
206
- });
245
+ try {
246
+ browserRunRegistry.claimTab(input.context, tabId);
247
+ } catch (error) {
248
+ throw new BrowserTabError(
249
+ 'tab_owned_by_other_conversation',
250
+ error instanceof Error ? error.message : String(error),
251
+ );
252
+ }
253
+ assertSwitched(await run([...input.globals, 'tab', tabId]));
254
+ return tabId;
255
+ },
256
+ );
207
257
  }
208
258
 
209
- /** Compatibility alias for callers compiled against the previous helper name. */
210
- export const claimConversationTab = ensureConversationTab;
259
+ export async function claimConversationTabById(
260
+ input: BrowserTabInput,
261
+ tabId: string,
262
+ ): Promise<string> {
263
+ return browserService.exclusive(
264
+ {
265
+ sessionName: input.sessionName,
266
+ bin: input.bin,
267
+ runner: input.runner,
268
+ signal: input.signal,
269
+ },
270
+ async (run) => {
271
+ const tabs = parseListedTabs(
272
+ await run([...input.globals, 'tab', 'list', '--json']),
273
+ );
274
+ if (!tabs.some((tab) => tab.id === tabId)) {
275
+ throw new BrowserTabError(
276
+ 'tab_not_found',
277
+ `浏览器标签不存在:${tabId}`,
278
+ );
279
+ }
280
+ try {
281
+ browserRunRegistry.claimTab(input.context, tabId);
282
+ } catch (error) {
283
+ throw new BrowserTabError(
284
+ 'tab_owned_by_other_conversation',
285
+ error instanceof Error ? error.message : String(error),
286
+ );
287
+ }
288
+ assertSwitched(await run([...input.globals, 'tab', tabId]));
289
+ return tabId;
290
+ },
291
+ );
292
+ }