@xopcai/xopc 0.0.368 → 0.0.369

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 (244) hide show
  1. package/dist/browser-ext/_locales/en/messages.json +30 -1
  2. package/dist/browser-ext/_locales/zh_CN/messages.json +30 -1
  3. package/dist/browser-ext/dist/assets/{auth-beGtbLPS.js → page-context-BeworyNB.js} +1331 -1355
  4. package/dist/browser-ext/dist/assets/{sidepanel-BT0ojEzG.css → sidepanel-Ccl0eSa1.css} +43 -0
  5. package/dist/browser-ext/dist/background.js +680 -182
  6. package/dist/browser-ext/dist/sidepanel.html +2 -2
  7. package/dist/browser-ext/dist/sidepanel.js +372 -193
  8. package/dist/browser-ext/manifest.json +2 -8
  9. package/dist/extensions/telegram/xopc.extension.json +1 -1
  10. package/dist/gateway/static/root/assets/{activity-store-D9ZMh5ZR.js → activity-store-BQ3PMp2q.js} +1 -1
  11. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-Bj3rvcTm.js → agent-avatar-dicebear-Stj17S9u.js} +1 -1
  12. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-CCRfvuov.js +1 -0
  13. package/dist/gateway/static/root/assets/{agent-plugin-dialog-BjdgKCnk.js → agent-plugin-dialog-CRlzd8El.js} +1 -1
  14. package/dist/gateway/static/root/assets/agents-_ug2LCQb.js +66 -0
  15. package/dist/gateway/static/root/assets/{agents-admin-api-B5QDepbW.js → agents-admin-api-HBZvVyzF.js} +1 -1
  16. package/dist/gateway/static/root/assets/{app-management-settings-panel-2rTEtB_X.js → app-management-settings-panel-pJFe6M6c.js} +1 -1
  17. package/dist/gateway/static/root/assets/{appearance-settings-BPVBS80k.js → appearance-settings-BrxSpBWa.js} +1 -1
  18. package/dist/gateway/static/root/assets/{apps-page-1FuKlZYP.js → apps-page-DegSl5Lh.js} +1 -1
  19. package/dist/gateway/static/root/assets/{archive-plugin-BbT1O7oK.js → archive-plugin-BO3I9zRP.js} +1 -1
  20. package/dist/gateway/static/root/assets/{automations-page-DjwP_h8h.js → automations-page-BZQ_VHjp.js} +1 -1
  21. package/dist/gateway/static/root/assets/automations-workspace-BQywN6nG.js +6 -0
  22. package/dist/gateway/static/root/assets/{binary-plugins-gS7Wg68v.js → binary-plugins-gFD7vH9R.js} +1 -1
  23. package/dist/gateway/static/root/assets/{block-editor-DbwMaivP.js → block-editor-3XjFv3kK.js} +3 -3
  24. package/dist/gateway/static/root/assets/browser-automation-inputs-DxRoKFun.js +1 -0
  25. package/dist/gateway/static/root/assets/browser-automations-page-yiEuG1v7.js +3 -0
  26. package/dist/gateway/static/root/assets/browser-settings-page-ch2_bQF0.js +3 -0
  27. package/dist/gateway/static/root/assets/{capabilities-Dd1PZRQw.js → capabilities-B48r0DDa.js} +1 -1
  28. package/dist/gateway/static/root/assets/{capabilities-Lswa0hv8.js → capabilities-DO-vfNKI.js} +1 -1
  29. package/dist/gateway/static/root/assets/{capabilities-page-djBsC_tG.js → capabilities-page-BEnFt_dj.js} +2 -2
  30. package/dist/gateway/static/root/assets/{capabilities-settings-panel-DTHR1DrJ.js → capabilities-settings-panel-NckMsJ5N.js} +4 -4
  31. package/dist/gateway/static/root/assets/{capability-header-actions-494dnJsj.js → capability-header-actions-CY8KCO9j.js} +1 -1
  32. package/dist/gateway/static/root/assets/channels-CHOS2CGa.js +1 -0
  33. package/dist/gateway/static/root/assets/{chat-terminal-dock-Bl7-Zk-x.js → chat-terminal-dock-Bwknnb4c.js} +2 -2
  34. package/dist/gateway/static/root/assets/{computer-settings-page-ByExKr_6.js → computer-settings-page-B2xeFCSt.js} +1 -1
  35. package/dist/gateway/static/root/assets/{connector-service-page-BK_5aFxO.js → connector-service-page-C83DnAqK.js} +1 -1
  36. package/dist/gateway/static/root/assets/connectors-page-D6wTmWA6.js +2 -0
  37. package/dist/gateway/static/root/assets/{date-picker-BXJv6472.js → date-picker-Bq9GR-DU.js} +1 -1
  38. package/dist/gateway/static/root/assets/{dependency-picker-CWbbhKZa.js → dependency-picker-BTERkA9X.js} +1 -1
  39. package/dist/gateway/static/root/assets/{desktop-pet-DWNEC3mk.js → desktop-pet-BwsbQw8V.js} +1 -1
  40. package/dist/gateway/static/root/assets/{desktop-pet-settings-BYwlxGiN.js → desktop-pet-settings-sL9i44pP.js} +1 -1
  41. package/dist/gateway/static/root/assets/device-pairing-wizard-DI2bqaKO.js +1 -0
  42. package/dist/gateway/static/root/assets/{directory-picker-path-field-D26tSY8Z.js → directory-picker-path-field-BFlDmsS5.js} +1 -1
  43. package/dist/gateway/static/root/assets/{extension-debug-page-xYIGNegB.js → extension-debug-page-7Z1Tp7-w.js} +1 -1
  44. package/dist/gateway/static/root/assets/{extension-page-BoQ1-3AW.js → extension-page-uGqvb8QX.js} +1 -1
  45. package/dist/gateway/static/root/assets/{extension-provider-Cw_JU6RR.js → extension-provider-xlSyz4Z6.js} +1 -1
  46. package/dist/gateway/static/root/assets/{extension-settings-page-BH5TFGPe.js → extension-settings-page-CKHgrjOs.js} +1 -1
  47. package/dist/gateway/static/root/assets/{fallback-models-04Wqmw14.js → fallback-models-BwQg0G1D.js} +1 -1
  48. package/dist/gateway/static/root/assets/{gateway-config-swr-CNf0ZeRw.js → gateway-config-swr-7RKqgU_U.js} +1 -1
  49. package/dist/gateway/static/root/assets/{gateway-realtime-C4KtwMY3.js → gateway-realtime-DDWymi-o.js} +1 -1
  50. package/dist/gateway/static/root/assets/gateway-realtime-store-BheKaO6d.js +1 -0
  51. package/dist/gateway/static/root/assets/{gateway-settings-BqvCJVUC.js → gateway-settings-BAQnSEMJ.js} +1 -1
  52. package/dist/gateway/static/root/assets/{gateway-startup-retry-DIxHacUw.js → gateway-startup-retry-jiV5sbEX.js} +1 -1
  53. package/dist/gateway/static/root/assets/home-page-BZDjvwet.js +2 -0
  54. package/dist/gateway/static/root/assets/{image-generation-api-CS0q0Kto.js → image-generation-api-DO4mXb6I.js} +1 -1
  55. package/dist/gateway/static/root/assets/{imports-page-n_rSLo6b.js → imports-page-re1_Nh64.js} +1 -1
  56. package/dist/gateway/static/root/assets/index-BB1z8QxA.js +106 -0
  57. package/dist/gateway/static/root/assets/index-D9R6tU7r.css +1 -0
  58. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-tVkrHbYF.js → keyboard-shortcuts-settings-B_xja9LN.js} +1 -1
  59. package/dist/gateway/static/root/assets/{local-app-workbench-page-L8tYuas0.js → local-app-workbench-page-CErdCrPX.js} +1 -1
  60. package/dist/gateway/static/root/assets/{local-apps-page-SSJ9B1bH.js → local-apps-page-BPL2RXdK.js} +1 -1
  61. package/dist/gateway/static/root/assets/{local-session-drafts-B_McurIj.js → local-session-drafts-DRPsDCj1.js} +1 -1
  62. package/dist/gateway/static/root/assets/{locale-store-D6_rF-qT.js → locale-store-COVscAqC.js} +1 -1
  63. package/dist/gateway/static/root/assets/{logs-page-BWD63eg1.js → logs-page-DL-BM0xq.js} +2 -2
  64. package/dist/gateway/static/root/assets/management-settings-BOVRHhXk.js +1 -0
  65. package/dist/gateway/static/root/assets/{markdown-view-_xwUuKce.js → markdown-view-B_qnAcW2.js} +1 -1
  66. package/dist/gateway/static/root/assets/{media-plugins-C631CDu4.js → media-plugins-C0Pc-wSY.js} +1 -1
  67. package/dist/gateway/static/root/assets/messages-Bb2GK-Nj.js +3 -0
  68. package/dist/gateway/static/root/assets/models-hub-cache-DyPPksMP.js +1 -0
  69. package/dist/gateway/static/root/assets/note-detail-panel-DJJK2yL4.js +5 -0
  70. package/dist/gateway/static/root/assets/{notes-api-vIZWQ9Yt.js → notes-api-sBgBcyLW.js} +1 -1
  71. package/dist/gateway/static/root/assets/notes-page-oCxO7ZTv.js +8 -0
  72. package/dist/gateway/static/root/assets/{page-context-capture-button-BlPDM7GM.js → page-context-capture-button-tf77xIz3.js} +1 -1
  73. package/dist/gateway/static/root/assets/personal-page-DOk9gUK5.js +1 -0
  74. package/dist/gateway/static/root/assets/{product-open-page-BJjWvoER.js → product-open-page-Dc3Y-Y7J.js} +1 -1
  75. package/dist/gateway/static/root/assets/{product-preview-content-CEd4E7Gf.js → product-preview-content-MG_hmVA3.js} +1 -1
  76. package/dist/gateway/static/root/assets/{project-detail-page-DM4_VLNX.js → project-detail-page-3uAzbW4T.js} +1 -1
  77. package/dist/gateway/static/root/assets/{projects-page-lszV8HuS.js → projects-page-MllfNLGA.js} +1 -1
  78. package/dist/gateway/static/root/assets/{registry-api-uJnjqTcn.js → registry-api-Bh9UBb-f.js} +1 -1
  79. package/dist/gateway/static/root/assets/{remote-access-hub-O6j9CWX0.js → remote-access-hub-Bs-C70el.js} +1 -1
  80. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-CjnNQYW8.js → runtime-tools-settings-panel-DpJ5jNzR.js} +1 -1
  81. package/dist/gateway/static/root/assets/{scenes-page-B3T3dDOR.js → scenes-page-Dpxamkw6.js} +2 -2
  82. package/dist/gateway/static/root/assets/{schema-form-DT3c4Vd_.js → schema-form-DUeyQ1zh.js} +1 -1
  83. package/dist/gateway/static/root/assets/{send-session-input-CICkGwn-.js → send-session-input-Dgn4BRk_.js} +1 -1
  84. package/dist/gateway/static/root/assets/{session-api-BcQodoAu.js → session-api-yjpEz4pP.js} +1 -1
  85. package/dist/gateway/static/root/assets/{session-manager-B0tOE4qz.js → session-manager-LInoZ_Yi.js} +1 -1
  86. package/dist/gateway/static/root/assets/sessions-page-BCVlNHtq.js +1 -0
  87. package/dist/gateway/static/root/assets/settings-advanced-gate-Bz-ue9fZ.js +1 -0
  88. package/dist/gateway/static/root/assets/{settings-page-D-PZjcss.js → settings-page-DouHuBXt.js} +1 -1
  89. package/dist/gateway/static/root/assets/{setup-status-panel-Ce3gTbT3.js → setup-status-panel-B5BoZ-1y.js} +1 -1
  90. package/dist/gateway/static/root/assets/{share-link-dialog-CWS8EkJS.js → share-link-dialog-DJTabLAM.js} +1 -1
  91. package/dist/gateway/static/root/assets/{share-preview-page-23NJAKiq.js → share-preview-page-jw7h4t_B.js} +1 -1
  92. package/dist/gateway/static/root/assets/{shares-api-iKhHbvBD.js → shares-api-c0dfWz6h.js} +1 -1
  93. package/dist/gateway/static/root/assets/shares-settings-BlnlzGjH.js +1 -0
  94. package/dist/gateway/static/root/assets/{skill-api-C-MWdQwl.js → skill-api-CfyX_0zN.js} +1 -1
  95. package/dist/gateway/static/root/assets/{skill-reload-api-iy02aB13.js → skill-reload-api-Ge5XymHa.js} +1 -1
  96. package/dist/gateway/static/root/assets/skills-page-DjdTeYzm.js +2 -0
  97. package/dist/gateway/static/root/assets/system-settings-panel-DWf256TE.js +1 -0
  98. package/dist/gateway/static/root/assets/{task-detail-page-B2SIEyhZ.js → task-detail-page-DE6N1ZQe.js} +2 -2
  99. package/dist/gateway/static/root/assets/{task-expandable-content-D2LRR4BC.js → task-expandable-content-hYcgCEE3.js} +1 -1
  100. package/dist/gateway/static/root/assets/{theme-store-BJfhz-Zq.js → theme-store-BOfCKgl6.js} +1 -1
  101. package/dist/gateway/static/root/assets/{tracing-settings-page-aHD56iaS.js → tracing-settings-page-DDWFXcST.js} +1 -1
  102. package/dist/gateway/static/root/assets/{tunnel-api-BCf8CfTC.js → tunnel-api-BBm9esrY.js} +1 -1
  103. package/dist/gateway/static/root/assets/{usage-page-B4XUkuJd.js → usage-page-C93x89uW.js} +1 -1
  104. package/dist/gateway/static/root/assets/{use-autosave-BnnTw9RE.js → use-autosave-CSckcjFx.js} +1 -1
  105. package/dist/gateway/static/root/assets/{use-composer-attachments-Itczg0y1.js → use-composer-attachments-C7Gaaai1.js} +1 -1
  106. package/dist/gateway/static/root/assets/{use-file-preview-expanded-DJ5vyrvM.js → use-file-preview-expanded-Db2VYg1b.js} +2 -2
  107. package/dist/gateway/static/root/assets/user-model-page-B74LkVbp.js +2 -0
  108. package/dist/gateway/static/root/assets/{voice-api-key-field-BphJku8x.js → voice-api-key-field-GEw5x2fU.js} +1 -1
  109. package/dist/gateway/static/root/assets/{voice-config-api-B4u4coFj.js → voice-config-api-3yyVwXln.js} +1 -1
  110. package/dist/gateway/static/root/assets/{work-discovery-overlay-jgOEP1xw.js → work-discovery-overlay-Bs2MKiTv.js} +1 -1
  111. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-N69crzRu.js → workflow-run-setup-panel-BR_U_snV.js} +2 -2
  112. package/dist/gateway/static/root/assets/workflows-page-Crk4SxtC.js +6 -0
  113. package/dist/gateway/static/root/assets/{workspace-api-Lzv6GDO8.js → workspace-api-Si2o3inw.js} +2 -2
  114. package/dist/gateway/static/root/index.html +27 -27
  115. package/dist/package.js +1 -1
  116. package/dist/packages/browser-control-contract/src/automation.js +213 -0
  117. package/dist/packages/browser-control-contract/src/index.js +43 -12
  118. package/dist/packages/gateway-contract/src/gateway-scopes.js +3 -1
  119. package/dist/packages/gateway-contract/src/notifications.js +1 -0
  120. package/dist/packages/realtime-protocol/src/voice.js +9 -3
  121. package/dist/src/agent/coding/repository-instructions.js +8 -1
  122. package/dist/src/agent/tool-manuals/browser.d.ts +1 -1
  123. package/dist/src/agent/tool-manuals/browser.js +3 -3
  124. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -1
  125. package/dist/src/agent/tools/browser/tool/schemas.d.ts +0 -13
  126. package/dist/src/agent/tools/browser/tool/schemas.js +0 -4
  127. package/dist/src/agent/tools/browser-automation-tool.d.ts +74 -1
  128. package/dist/src/agent/tools/browser-automation-tool.js +52 -6
  129. package/dist/src/automations/capabilities/write.d.ts +2 -0
  130. package/dist/src/automations/domain/types.d.ts +11 -0
  131. package/dist/src/automations/domain/validation.d.ts +4 -0
  132. package/dist/src/automations/domain/validation.js +1 -0
  133. package/dist/src/automations/draft/automation-draft-validator.d.ts +1 -0
  134. package/dist/src/automations/service/action-executor.js +11 -3
  135. package/dist/src/automations/service/automation-service.d.ts +1 -0
  136. package/dist/src/automations/service/automation-service.js +13 -1
  137. package/dist/src/bootstrap/application-state.js +1 -1
  138. package/dist/src/browser/automations/repository.d.ts +4 -0
  139. package/dist/src/browser/automations/repository.js +27 -6
  140. package/dist/src/browser/automations/runner.js +101 -9
  141. package/dist/src/browser/automations/runtime-service.js +4 -3
  142. package/dist/src/browser/automations/schema.d.ts +84 -1
  143. package/dist/src/browser/automations/schema.js +68 -2
  144. package/dist/src/browser/automations/service.d.ts +78 -1
  145. package/dist/src/browser/automations/service.js +36 -4
  146. package/dist/src/browser/automations/types.d.ts +19 -4
  147. package/dist/src/browser/drivers/extension-driver.d.ts +5 -5
  148. package/dist/src/browser/drivers/extension-driver.js +10 -10
  149. package/dist/src/browser/drivers/playwright-driver.js +46 -0
  150. package/dist/src/browser/index.d.ts +1 -2
  151. package/dist/src/browser/index.js +2 -3
  152. package/dist/src/browser/policy/browser-policy.d.ts +0 -1
  153. package/dist/src/browser/policy/browser-policy.js +1 -4
  154. package/dist/src/browser/providers/index.d.ts +1 -1
  155. package/dist/src/browser/providers/index.js +2 -2
  156. package/dist/src/browser/providers/realtime-extension.d.ts +1 -1
  157. package/dist/src/browser/providers/realtime-extension.js +5 -1
  158. package/dist/src/browser/recordings/service.d.ts +22 -0
  159. package/dist/src/browser/recordings/service.js +160 -0
  160. package/dist/src/browser/runtime/browser-runtime.d.ts +1 -1
  161. package/dist/src/browser/runtime/browser-runtime.js +19 -56
  162. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  163. package/dist/src/computer/runtime.js +2 -2
  164. package/dist/src/config/schema.d.ts +12 -12
  165. package/dist/src/config/schema.js +12 -12
  166. package/dist/src/endpoint-tools/policy.js +4 -3
  167. package/dist/src/gateway/hono/routes/browser-automations.js +23 -7
  168. package/dist/src/gateway/hono/routes/browser-recordings.d.ts +3 -0
  169. package/dist/src/gateway/hono/routes/browser-recordings.js +78 -0
  170. package/dist/src/gateway/hono/routes/browser.js +1 -34
  171. package/dist/src/gateway/hono/routes/device-push.js +1 -0
  172. package/dist/src/gateway/hono/routes/home.js +1 -1
  173. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  174. package/dist/src/gateway/hono/routes/personal-agent.js +35 -0
  175. package/dist/src/gateway/hono/routes/voice.js +5 -2
  176. package/dist/src/gateway/security/gateway-scopes.js +3 -1
  177. package/dist/src/gateway/service/agent-runner.js +1 -0
  178. package/dist/src/home-intelligence/generator.d.ts +2 -0
  179. package/dist/src/home-intelligence/generator.js +53 -4
  180. package/dist/src/home-intelligence/host.d.ts +2 -1
  181. package/dist/src/home-intelligence/host.js +23 -3
  182. package/dist/src/migrations/cloud-public-models.js +1 -0
  183. package/dist/src/notifications/clarification.d.ts +5 -0
  184. package/dist/src/notifications/clarification.js +66 -0
  185. package/dist/src/notifications/device-store.js +1 -0
  186. package/dist/src/notifications/harmony-push.d.ts +1 -0
  187. package/dist/src/notifications/harmony-push.js +3 -1
  188. package/dist/src/notifications/planner.d.ts +1 -0
  189. package/dist/src/notifications/service.d.ts +2 -2
  190. package/dist/src/notifications/service.js +20 -4
  191. package/dist/src/notifications/store.d.ts +2 -0
  192. package/dist/src/notifications/store.js +7 -1
  193. package/dist/src/notifications/types.d.ts +1 -0
  194. package/dist/src/notifications/types.js +1 -0
  195. package/dist/src/storage/sqlite/clarification-wait-repository.js +1 -0
  196. package/dist/src/storage/sqlite/migrations/238_browser_record_replay.sql +45 -0
  197. package/dist/src/storage/sqlite/migrations/239_clarification_notifications.sql +26 -0
  198. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  199. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  200. package/dist/src/storage/sqlite/schema.js +1 -1
  201. package/dist/src/tasks/home-query-service.d.ts +1 -1
  202. package/dist/src/tasks/home-query-service.js +6 -2
  203. package/dist/src/voice/dashscope/streaming-tts-stream.d.ts +2 -1
  204. package/dist/src/voice/dashscope/streaming-tts-stream.js +135 -79
  205. package/dist/src/voice/realtime/agentEngine.js +78 -1
  206. package/dist/src/voice/realtime/speakable-segmenter.d.ts +2 -0
  207. package/dist/src/voice/realtime/speakable-segmenter.js +30 -0
  208. package/dist/src/voice/tts/providers/alibaba-speech.js +17 -1
  209. package/dist/src/voice/tts/speak-core.d.ts +3 -0
  210. package/dist/src/voice/tts/speak-core.js +21 -1
  211. package/dist/src/voice/tts/speech-provider-types.d.ts +8 -0
  212. package/package.json +3 -3
  213. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-D0tD3kCe.js +0 -1
  214. package/dist/gateway/static/root/assets/agents-CWXKzX5L.js +0 -66
  215. package/dist/gateway/static/root/assets/automations-workspace-C9ZT6TAU.js +0 -6
  216. package/dist/gateway/static/root/assets/browser-automation-inputs-CXG_JveC.js +0 -1
  217. package/dist/gateway/static/root/assets/browser-automations-page-CJc7OKR3.js +0 -3
  218. package/dist/gateway/static/root/assets/browser-settings-page-BjaTEUR8.js +0 -3
  219. package/dist/gateway/static/root/assets/channels-BaYRJtz3.js +0 -1
  220. package/dist/gateway/static/root/assets/connectors-page-DyqRwSH2.js +0 -2
  221. package/dist/gateway/static/root/assets/device-pairing-wizard-BAc4F35b.js +0 -1
  222. package/dist/gateway/static/root/assets/gateway-realtime-store-ChZUzVbe.js +0 -1
  223. package/dist/gateway/static/root/assets/home-page-DhPPLbdD.js +0 -2
  224. package/dist/gateway/static/root/assets/index-CK4O2xMa.css +0 -1
  225. package/dist/gateway/static/root/assets/index-DpLD-7Hc.js +0 -106
  226. package/dist/gateway/static/root/assets/management-settings-aKSibklM.js +0 -1
  227. package/dist/gateway/static/root/assets/messages-Bnx3GMDB.js +0 -3
  228. package/dist/gateway/static/root/assets/models-hub-cache-Di83uIPw.js +0 -1
  229. package/dist/gateway/static/root/assets/note-detail-panel-B_fve3_2.js +0 -5
  230. package/dist/gateway/static/root/assets/notes-page-DnChyp8S.js +0 -8
  231. package/dist/gateway/static/root/assets/personal-page-BM2qAgg_.js +0 -1
  232. package/dist/gateway/static/root/assets/sessions-page-BIixHXlQ.js +0 -1
  233. package/dist/gateway/static/root/assets/settings-advanced-gate-49SUEWPh.js +0 -1
  234. package/dist/gateway/static/root/assets/shares-settings-CNEZjF66.js +0 -1
  235. package/dist/gateway/static/root/assets/skills-page-BndNdYsJ.js +0 -2
  236. package/dist/gateway/static/root/assets/system-settings-panel-EpZeMlvp.js +0 -1
  237. package/dist/gateway/static/root/assets/user-model-page-Bz5lkFG9.js +0 -2
  238. package/dist/gateway/static/root/assets/workflows-page-CPCgOfHh.js +0 -6
  239. package/dist/src/browser/policy/approval-store.d.ts +0 -17
  240. package/dist/src/browser/policy/approval-store.js +0 -62
  241. package/dist/src/browser/providers/extension-ws-acquire.d.ts +0 -19
  242. package/dist/src/browser/providers/extension-ws-acquire.js +0 -78
  243. package/dist/src/browser/providers/extension.d.ts +0 -61
  244. package/dist/src/browser/providers/extension.js +0 -378
@@ -30,6 +30,26 @@ async function runBrowserAutomation(input) {
30
30
  sessionId = observation?.sessionId;
31
31
  }
32
32
  if (step.action === "navigate") assertAllowedDomain(input.definition.allowedDomains, render(step.url, values));
33
+ if ("target" in step && step.target) {
34
+ const resolved = await input.runtime.execute(input.taskKey, {
35
+ action: "resolve",
36
+ sessionId,
37
+ semanticTarget: step.target
38
+ }, input.signal);
39
+ if (!resolved.ok) {
40
+ input.onStep({
41
+ index,
42
+ action: step.action,
43
+ status: "failed",
44
+ result: resolved
45
+ });
46
+ return resolved;
47
+ }
48
+ observation = resolved.receipt.observation;
49
+ sessionId = observation?.sessionId ?? sessionId;
50
+ }
51
+ if (observation) assertAllowedDomain(input.definition.allowedDomains, observation.url);
52
+ if (step.action === "click" && observation?.nodes[0]?.href) assertAllowedDomain(input.definition.allowedDomains, observation.nodes[0].href);
33
53
  const action = buildAction(step, values, observation, sessionId);
34
54
  const result = await input.runtime.execute(input.taskKey, action, input.signal);
35
55
  if (!result.ok) {
@@ -43,7 +63,7 @@ async function runBrowserAutomation(input) {
43
63
  }
44
64
  observation = result.receipt.observation ?? observation;
45
65
  sessionId = observation?.sessionId ?? sessionId;
46
- if (step.action === "navigate") assertAllowedDomain(input.definition.allowedDomains, observation?.url ?? render(step.url, values));
66
+ if (observation) assertAllowedDomain(input.definition.allowedDomains, observation.url);
47
67
  input.onStep({
48
68
  index,
49
69
  action: step.action,
@@ -61,16 +81,80 @@ async function runBrowserAutomation(input) {
61
81
  return result;
62
82
  }
63
83
  }
64
- return {
65
- ok: true,
66
- receipt: {
67
- action: "sequence",
68
- risk: input.definition.risk,
69
- durationMs: Date.now() - startedAt,
70
- verified: true,
71
- observation
84
+ const readField = async (spec) => {
85
+ if (spec.target) {
86
+ const result = await input.runtime.execute(input.taskKey, {
87
+ action: "resolve",
88
+ sessionId,
89
+ semanticTarget: spec.target
90
+ }, input.signal);
91
+ if (!result.ok) return void 0;
92
+ observation = result.receipt.observation;
93
+ } else {
94
+ const result = await input.runtime.execute(input.taskKey, {
95
+ action: "observe",
96
+ sessionId,
97
+ visual: "never"
98
+ }, input.signal);
99
+ if (!result.ok) return void 0;
100
+ observation = result.receipt.observation;
72
101
  }
102
+ if (!observation) return void 0;
103
+ assertAllowedDomain(input.definition.allowedDomains, observation.url);
104
+ const node = observation.nodes[0];
105
+ if (spec.field === "url") return observation.url;
106
+ if (spec.field === "title") return observation.title;
107
+ if (spec.field === "checked") return node?.states.includes("checked");
108
+ if (spec.field === "text") return node?.description ?? node?.name;
109
+ return node?.[spec.field];
73
110
  };
111
+ try {
112
+ for (const assertion of input.definition.successCriteria ?? []) {
113
+ const deadline = Date.now() + 1e4;
114
+ let passed = false;
115
+ do {
116
+ if (input.signal.aborted) return automationFailure("INVALID_INPUT", "Run cancelled.", observation);
117
+ const actual = await readField(assertion);
118
+ passed = assertion.equals !== void 0 ? actual === (typeof assertion.equals === "string" ? render(assertion.equals, values) : assertion.equals) : typeof actual === "string" && actual.includes(render(assertion.includes, values));
119
+ if (!passed) await new Promise((resolve) => setTimeout(resolve, 200));
120
+ } while (!passed && Date.now() < deadline);
121
+ if (!passed) return {
122
+ ok: false,
123
+ error: {
124
+ code: "EXPECTATION_FAILED",
125
+ message: "The business result did not match its success criteria.",
126
+ observation
127
+ }
128
+ };
129
+ }
130
+ const outputs = {};
131
+ for (const [name, spec] of Object.entries(input.definition.outputs ?? {})) {
132
+ const value = await readField(spec);
133
+ if (typeof value !== "string" || !value) return {
134
+ ok: false,
135
+ error: {
136
+ code: "EXPECTATION_FAILED",
137
+ message: `Output ${name} is unavailable.`,
138
+ observation
139
+ }
140
+ };
141
+ outputs[name] = value;
142
+ }
143
+ return {
144
+ ok: true,
145
+ receipt: {
146
+ action: "sequence",
147
+ risk: input.definition.risk,
148
+ durationMs: Date.now() - startedAt,
149
+ verified: !!input.definition.successCriteria?.length,
150
+ businessOutcome: input.definition.successCriteria?.length ? "verified" : "completed",
151
+ outputs,
152
+ observation
153
+ }
154
+ };
155
+ } catch (error) {
156
+ return automationFailure("BLOCKED_URL", error, observation);
157
+ }
74
158
  }
75
159
  function buildAction(step, inputs, observation, sessionId) {
76
160
  if (step.action === "navigate") return {
@@ -98,6 +182,13 @@ function buildAction(step, inputs, observation, sessionId) {
98
182
  submit: step.submit,
99
183
  expect: step.expect
100
184
  };
185
+ case "check": return {
186
+ action: "check",
187
+ sessionId,
188
+ revision,
189
+ ref,
190
+ checked: step.checked
191
+ };
101
192
  case "select": return {
102
193
  action: "select",
103
194
  sessionId,
@@ -149,6 +240,7 @@ function resolveBrowserAutomationInputs(definition, provided) {
149
240
  for (const [name, spec] of Object.entries(definition.inputs)) {
150
241
  const value = values[name] ?? spec.default;
151
242
  if (value === void 0 && spec.required) throw new Error(`Missing required automation input: ${name}`);
243
+ if (value !== void 0 && spec.choices && !spec.choices.includes(value)) throw new Error(`Automation input ${name} is not an allowed choice.`);
152
244
  if (value !== void 0 && typeof value !== spec.type) throw new Error(`Automation input ${name} must be ${spec.type}.`);
153
245
  if (values[name] === void 0 && value !== void 0) values[name] = value;
154
246
  }
@@ -10,8 +10,8 @@ function createRuntimeBrowserAutomationService(deps) {
10
10
  allowedUploadRoots: [process.cwd()],
11
11
  emit: deps.emit
12
12
  });
13
- return new BrowserAutomationService(async ({ definition, inputs, signal, onStep }) => {
14
- const taskKey = `browser-automation:${crypto.randomUUID()}`;
13
+ return new BrowserAutomationService(async ({ runId, definition, inputs, signal, onStep }) => {
14
+ const taskKey = `browser-automation:${runId}`;
15
15
  try {
16
16
  const result = await runBrowserAutomation({
17
17
  definition,
@@ -23,7 +23,8 @@ function createRuntimeBrowserAutomationService(deps) {
23
23
  });
24
24
  return result.ok ? {
25
25
  ok: true,
26
- result: result.receipt
26
+ result: result.receipt.outputs ?? {},
27
+ businessOutcome: result.receipt.businessOutcome
27
28
  } : {
28
29
  ok: false,
29
30
  error: "error" in result ? result.error.message : "Browser automation failed."
@@ -8,8 +8,8 @@ export declare const BrowserAutomationDefinitionSchema: z.ZodObject<{
8
8
  read: "read";
9
9
  draft: "draft";
10
10
  destructive: "destructive";
11
- external_effect: "external_effect";
12
11
  sensitive: "sensitive";
12
+ external_effect: "external_effect";
13
13
  }>;
14
14
  inputs: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
15
15
  type: z.ZodEnum<{
@@ -41,6 +41,11 @@ export declare const BrowserAutomationDefinitionSchema: z.ZodObject<{
41
41
  role: z.ZodString;
42
42
  name: z.ZodOptional<z.ZodString>;
43
43
  nameIncludes: z.ZodOptional<z.ZodString>;
44
+ testId: z.ZodOptional<z.ZodString>;
45
+ scope: z.ZodOptional<z.ZodObject<{
46
+ role: z.ZodString;
47
+ name: z.ZodString;
48
+ }, z.core.$strict>>;
44
49
  }, z.core.$strict>;
45
50
  expect: z.ZodOptional<z.ZodObject<{
46
51
  urlIncludes: z.ZodOptional<z.ZodString>;
@@ -58,6 +63,11 @@ export declare const BrowserAutomationDefinitionSchema: z.ZodObject<{
58
63
  role: z.ZodString;
59
64
  name: z.ZodOptional<z.ZodString>;
60
65
  nameIncludes: z.ZodOptional<z.ZodString>;
66
+ testId: z.ZodOptional<z.ZodString>;
67
+ scope: z.ZodOptional<z.ZodObject<{
68
+ role: z.ZodString;
69
+ name: z.ZodString;
70
+ }, z.core.$strict>>;
61
71
  }, z.core.$strict>;
62
72
  value: z.ZodString;
63
73
  submit: z.ZodOptional<z.ZodBoolean>;
@@ -77,6 +87,11 @@ export declare const BrowserAutomationDefinitionSchema: z.ZodObject<{
77
87
  role: z.ZodString;
78
88
  name: z.ZodOptional<z.ZodString>;
79
89
  nameIncludes: z.ZodOptional<z.ZodString>;
90
+ testId: z.ZodOptional<z.ZodString>;
91
+ scope: z.ZodOptional<z.ZodObject<{
92
+ role: z.ZodString;
93
+ name: z.ZodString;
94
+ }, z.core.$strict>>;
80
95
  }, z.core.$strict>;
81
96
  value: z.ZodString;
82
97
  expect: z.ZodOptional<z.ZodObject<{
@@ -89,12 +104,30 @@ export declare const BrowserAutomationDefinitionSchema: z.ZodObject<{
89
104
  visible: "visible";
90
105
  }>>;
91
106
  }, z.core.$strict>>;
107
+ }, z.core.$strict>, z.ZodObject<{
108
+ action: z.ZodLiteral<"check">;
109
+ target: z.ZodObject<{
110
+ role: z.ZodString;
111
+ name: z.ZodOptional<z.ZodString>;
112
+ nameIncludes: z.ZodOptional<z.ZodString>;
113
+ testId: z.ZodOptional<z.ZodString>;
114
+ scope: z.ZodOptional<z.ZodObject<{
115
+ role: z.ZodString;
116
+ name: z.ZodString;
117
+ }, z.core.$strict>>;
118
+ }, z.core.$strict>;
119
+ checked: z.ZodBoolean;
92
120
  }, z.core.$strict>, z.ZodObject<{
93
121
  action: z.ZodLiteral<"press">;
94
122
  target: z.ZodOptional<z.ZodObject<{
95
123
  role: z.ZodString;
96
124
  name: z.ZodOptional<z.ZodString>;
97
125
  nameIncludes: z.ZodOptional<z.ZodString>;
126
+ testId: z.ZodOptional<z.ZodString>;
127
+ scope: z.ZodOptional<z.ZodObject<{
128
+ role: z.ZodString;
129
+ name: z.ZodString;
130
+ }, z.core.$strict>>;
98
131
  }, z.core.$strict>>;
99
132
  key: z.ZodString;
100
133
  expect: z.ZodOptional<z.ZodObject<{
@@ -113,6 +146,11 @@ export declare const BrowserAutomationDefinitionSchema: z.ZodObject<{
113
146
  role: z.ZodString;
114
147
  name: z.ZodOptional<z.ZodString>;
115
148
  nameIncludes: z.ZodOptional<z.ZodString>;
149
+ testId: z.ZodOptional<z.ZodString>;
150
+ scope: z.ZodOptional<z.ZodObject<{
151
+ role: z.ZodString;
152
+ name: z.ZodString;
153
+ }, z.core.$strict>>;
116
154
  }, z.core.$strict>>;
117
155
  deltaY: z.ZodNumber;
118
156
  expect: z.ZodOptional<z.ZodObject<{
@@ -138,7 +176,52 @@ export declare const BrowserAutomationDefinitionSchema: z.ZodObject<{
138
176
  role: z.ZodString;
139
177
  name: z.ZodOptional<z.ZodString>;
140
178
  nameIncludes: z.ZodOptional<z.ZodString>;
179
+ testId: z.ZodOptional<z.ZodString>;
180
+ scope: z.ZodOptional<z.ZodObject<{
181
+ role: z.ZodString;
182
+ name: z.ZodString;
183
+ }, z.core.$strict>>;
141
184
  }, z.core.$strict>>;
142
185
  timeoutMs: z.ZodOptional<z.ZodNumber>;
143
186
  }, z.core.$strict>], "action">>;
187
+ successCriteria: z.ZodOptional<z.ZodArray<z.ZodObject<{
188
+ target: z.ZodOptional<z.ZodObject<{
189
+ role: z.ZodString;
190
+ name: z.ZodOptional<z.ZodString>;
191
+ nameIncludes: z.ZodOptional<z.ZodString>;
192
+ testId: z.ZodOptional<z.ZodString>;
193
+ scope: z.ZodOptional<z.ZodObject<{
194
+ role: z.ZodString;
195
+ name: z.ZodString;
196
+ }, z.core.$strict>>;
197
+ }, z.core.$strict>>;
198
+ field: z.ZodEnum<{
199
+ value: "value";
200
+ text: "text";
201
+ title: "title";
202
+ url: "url";
203
+ checked: "checked";
204
+ }>;
205
+ equals: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodBoolean]>>;
206
+ includes: z.ZodOptional<z.ZodString>;
207
+ }, z.core.$strict>>>;
208
+ outputs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
209
+ target: z.ZodOptional<z.ZodObject<{
210
+ role: z.ZodString;
211
+ name: z.ZodOptional<z.ZodString>;
212
+ nameIncludes: z.ZodOptional<z.ZodString>;
213
+ testId: z.ZodOptional<z.ZodString>;
214
+ scope: z.ZodOptional<z.ZodObject<{
215
+ role: z.ZodString;
216
+ name: z.ZodString;
217
+ }, z.core.$strict>>;
218
+ }, z.core.$strict>>;
219
+ field: z.ZodEnum<{
220
+ value: "value";
221
+ text: "text";
222
+ title: "title";
223
+ url: "url";
224
+ href: "href";
225
+ }>;
226
+ }, z.core.$strict>>>;
144
227
  }, z.core.$strict>;
@@ -10,7 +10,12 @@ const ExpectationSchema = z.object({
10
10
  const TargetSchema = z.object({
11
11
  role: z.string().min(1),
12
12
  name: z.string().min(1).optional(),
13
- nameIncludes: z.string().min(1).optional()
13
+ nameIncludes: z.string().min(1).optional(),
14
+ testId: z.string().min(1).optional(),
15
+ scope: z.object({
16
+ role: z.string().min(1),
17
+ name: z.string().min(1)
18
+ }).strict().optional()
14
19
  }).strict().superRefine((target, ctx) => {
15
20
  if (target.name && target.nameIncludes) ctx.addIssue({
16
21
  code: "custom",
@@ -41,6 +46,11 @@ const StepSchema = z.discriminatedUnion("action", [
41
46
  value: z.string(),
42
47
  expect: ExpectationSchema.optional()
43
48
  }).strict(),
49
+ z.object({
50
+ action: z.literal("check"),
51
+ target: TargetSchema,
52
+ checked: z.boolean()
53
+ }).strict(),
44
54
  z.object({
45
55
  action: z.literal("press"),
46
56
  target: TargetSchema.optional(),
@@ -115,13 +125,61 @@ const BrowserAutomationDefinitionSchema = z.object({
115
125
  "sensitive"
116
126
  ]),
117
127
  inputs: z.record(z.string(), InputSchema).default({}),
118
- steps: z.array(StepSchema).min(1).max(100)
128
+ steps: z.array(StepSchema).min(1).max(100),
129
+ successCriteria: z.array(z.object({
130
+ target: TargetSchema.optional(),
131
+ field: z.enum([
132
+ "text",
133
+ "value",
134
+ "url",
135
+ "title",
136
+ "checked"
137
+ ]),
138
+ equals: z.union([z.string(), z.boolean()]).optional(),
139
+ includes: z.string().optional()
140
+ }).strict().superRefine((assertion, ctx) => {
141
+ if (assertion.equals === void 0 === (assertion.includes === void 0)) ctx.addIssue({
142
+ code: "custom",
143
+ message: "Specify exactly one comparison."
144
+ });
145
+ if (assertion.field === "checked" && typeof assertion.equals !== "boolean") ctx.addIssue({
146
+ code: "custom",
147
+ message: "Checked assertions require a boolean comparison."
148
+ });
149
+ if (assertion.field !== "checked" && typeof assertion.equals === "boolean") ctx.addIssue({
150
+ code: "custom",
151
+ message: "Text assertions require a string comparison."
152
+ });
153
+ if (!["url", "title"].includes(assertion.field) && !assertion.target) ctx.addIssue({
154
+ code: "custom",
155
+ message: "Element assertions require a target."
156
+ });
157
+ })).max(20).optional(),
158
+ outputs: z.record(z.string().regex(/^[a-zA-Z][a-zA-Z0-9_]*$/), z.object({
159
+ target: TargetSchema.optional(),
160
+ field: z.enum([
161
+ "text",
162
+ "value",
163
+ "url",
164
+ "title",
165
+ "href"
166
+ ])
167
+ }).strict().superRefine((output, ctx) => {
168
+ if (!["url", "title"].includes(output.field) && !output.target) ctx.addIssue({
169
+ code: "custom",
170
+ message: "Element outputs require a target."
171
+ });
172
+ })).optional()
119
173
  }).strict().superRefine((definition, ctx) => {
120
174
  if (new Set(definition.allowedDomains).size !== definition.allowedDomains.length) ctx.addIssue({
121
175
  code: "custom",
122
176
  path: ["allowedDomains"],
123
177
  message: "Domains must be unique."
124
178
  });
179
+ for (const spec of Object.values(definition.inputs)) if (spec.default !== void 0 && spec.choices && !spec.choices.includes(spec.default)) ctx.addIssue({
180
+ code: "custom",
181
+ message: "Default must be an allowed choice."
182
+ });
125
183
  for (const [index, step] of definition.steps.entries()) {
126
184
  const values = step.action === "navigate" ? [step.url] : step.action === "fill" || step.action === "select" ? [step.value] : step.action === "press" ? [step.key] : step.action === "wait" && step.value ? [step.value] : [];
127
185
  for (const value of values) for (const match of value.matchAll(/\$\{input\.([a-zA-Z][a-zA-Z0-9_]*)\}/g)) if (!definition.inputs[match[1]]) ctx.addIssue({
@@ -130,6 +188,14 @@ const BrowserAutomationDefinitionSchema = z.object({
130
188
  message: `Unknown input template: ${match[1]}.`
131
189
  });
132
190
  }
191
+ for (const [index, assertion] of (definition.successCriteria ?? []).entries()) for (const value of [assertion.equals, assertion.includes]) {
192
+ if (typeof value !== "string") continue;
193
+ for (const match of value.matchAll(/\$\{input\.([a-zA-Z][a-zA-Z0-9_]*)\}/g)) if (!definition.inputs[match[1]]) ctx.addIssue({
194
+ code: "custom",
195
+ path: ["successCriteria", index],
196
+ message: `Unknown input template: ${match[1]}.`
197
+ });
198
+ }
133
199
  });
134
200
  //#endregion
135
201
  export { BrowserAutomationDefinitionSchema };
@@ -4,10 +4,12 @@ export type BrowserAutomationExecutor = (input: {
4
4
  inputs: Record<string, unknown>;
5
5
  signal: AbortSignal;
6
6
  onStep: (event: unknown) => void;
7
+ runId: string;
7
8
  }) => Promise<{
8
9
  ok: boolean;
9
10
  result?: unknown;
10
11
  error?: string;
12
+ businessOutcome?: BrowserAutomationRun['businessOutcome'];
11
13
  }>;
12
14
  export declare class BrowserAutomationService {
13
15
  private readonly executor;
@@ -18,6 +20,7 @@ export declare class BrowserAutomationService {
18
20
  constructor(executor: BrowserAutomationExecutor, emit?: (type: string, payload: unknown) => void);
19
21
  list(): BrowserAutomation[];
20
22
  get(id: string): BrowserAutomation;
23
+ versions(id: string): BrowserAutomation[];
21
24
  listRuns(automationId?: string): BrowserAutomationRun[];
22
25
  getRun(id: string): BrowserAutomationRun;
23
26
  listRunEvents(id: string): import("./types.js").BrowserAutomationRunEvent[];
@@ -25,7 +28,7 @@ export declare class BrowserAutomationService {
25
28
  id: string;
26
29
  name: string;
27
30
  allowedDomains: string[];
28
- risk: "read" | "draft" | "destructive" | "external_effect" | "sensitive";
31
+ risk: "read" | "draft" | "destructive" | "sensitive" | "external_effect";
29
32
  inputs: Record<string, {
30
33
  type: "string" | "number" | "boolean";
31
34
  required?: boolean;
@@ -49,6 +52,11 @@ export declare class BrowserAutomationService {
49
52
  role: string;
50
53
  name?: string;
51
54
  nameIncludes?: string;
55
+ testId?: string;
56
+ scope?: {
57
+ role: string;
58
+ name: string;
59
+ };
52
60
  };
53
61
  expect?: {
54
62
  urlIncludes?: string;
@@ -63,6 +71,11 @@ export declare class BrowserAutomationService {
63
71
  role: string;
64
72
  name?: string;
65
73
  nameIncludes?: string;
74
+ testId?: string;
75
+ scope?: {
76
+ role: string;
77
+ name: string;
78
+ };
66
79
  };
67
80
  value: string;
68
81
  submit?: boolean;
@@ -79,6 +92,11 @@ export declare class BrowserAutomationService {
79
92
  role: string;
80
93
  name?: string;
81
94
  nameIncludes?: string;
95
+ testId?: string;
96
+ scope?: {
97
+ role: string;
98
+ name: string;
99
+ };
82
100
  };
83
101
  value: string;
84
102
  expect?: {
@@ -88,6 +106,19 @@ export declare class BrowserAutomationService {
88
106
  ref?: string;
89
107
  state?: "hidden" | "visible";
90
108
  };
109
+ } | {
110
+ action: "check";
111
+ target: {
112
+ role: string;
113
+ name?: string;
114
+ nameIncludes?: string;
115
+ testId?: string;
116
+ scope?: {
117
+ role: string;
118
+ name: string;
119
+ };
120
+ };
121
+ checked: boolean;
91
122
  } | {
92
123
  action: "press";
93
124
  key: string;
@@ -95,6 +126,11 @@ export declare class BrowserAutomationService {
95
126
  role: string;
96
127
  name?: string;
97
128
  nameIncludes?: string;
129
+ testId?: string;
130
+ scope?: {
131
+ role: string;
132
+ name: string;
133
+ };
98
134
  };
99
135
  expect?: {
100
136
  urlIncludes?: string;
@@ -110,6 +146,11 @@ export declare class BrowserAutomationService {
110
146
  role: string;
111
147
  name?: string;
112
148
  nameIncludes?: string;
149
+ testId?: string;
150
+ scope?: {
151
+ role: string;
152
+ name: string;
153
+ };
113
154
  };
114
155
  expect?: {
115
156
  urlIncludes?: string;
@@ -126,15 +167,49 @@ export declare class BrowserAutomationService {
126
167
  role: string;
127
168
  name?: string;
128
169
  nameIncludes?: string;
170
+ testId?: string;
171
+ scope?: {
172
+ role: string;
173
+ name: string;
174
+ };
129
175
  };
130
176
  timeoutMs?: number;
131
177
  })[];
132
178
  description?: string;
179
+ successCriteria?: {
180
+ field: "value" | "text" | "title" | "url" | "checked";
181
+ target?: {
182
+ role: string;
183
+ name?: string;
184
+ nameIncludes?: string;
185
+ testId?: string;
186
+ scope?: {
187
+ role: string;
188
+ name: string;
189
+ };
190
+ };
191
+ equals?: string | boolean;
192
+ includes?: string;
193
+ }[];
194
+ outputs?: Record<string, {
195
+ field: "value" | "text" | "title" | "url" | "href";
196
+ target?: {
197
+ role: string;
198
+ name?: string;
199
+ nameIncludes?: string;
200
+ testId?: string;
201
+ scope?: {
202
+ role: string;
203
+ name: string;
204
+ };
205
+ };
206
+ }>;
133
207
  }>;
134
208
  save(input: {
135
209
  definition: unknown;
136
210
  status?: BrowserAutomationStatus;
137
211
  expectedId?: string;
212
+ expectedRevision?: number;
138
213
  }): BrowserAutomation;
139
214
  remove(id: string): boolean;
140
215
  startRun(automationId: string, inputs: Record<string, unknown>, context?: BrowserAutomationExecutionContext): BrowserAutomationRun;
@@ -145,6 +220,8 @@ export declare class BrowserAutomationService {
145
220
  private execute;
146
221
  }
147
222
  export interface BrowserAutomationExecutionContext {
223
+ revision?: number;
224
+ clientRequestId?: string;
148
225
  triggerEvent?: {
149
226
  type: string;
150
227
  source?: string;