@xopcai/xopc 0.0.251 → 0.0.253

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 (376) hide show
  1. package/README.md +8 -5
  2. package/README.zh-CN.md +8 -5
  3. package/dist/browser-ext/dist/background.js +358 -768
  4. package/dist/browser-ext/manifest.json +1 -2
  5. package/dist/extensions/telegram/src/inbound-processor.js +2 -2
  6. package/dist/extensions/telegram/src/plugin.js +3 -2
  7. package/dist/extensions/telegram/xopc.extension.json +1 -1
  8. package/dist/gateway/static/root/assets/{activity-store-DfBjTSo9.js → activity-store-CeS1bgXP.js} +1 -1
  9. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-Bo_dmLv8.js → agent-avatar-dicebear-BdF3HhCW.js} +1 -1
  10. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-Bs34Kp0K.js +1 -0
  11. package/dist/gateway/static/root/assets/{agents-yuUn8n-f.js → agents-DARlgjTm.js} +1 -1
  12. package/dist/gateway/static/root/assets/{api-zxpcJfgj.js → api-zMPeC0yU.js} +1 -1
  13. package/dist/gateway/static/root/assets/{app-management-settings-panel-Cz56nrVF.js → app-management-settings-panel-BaAFln8W.js} +1 -1
  14. package/dist/gateway/static/root/assets/{appearance-settings-DxSws5U4.js → appearance-settings-CXvsoBlw.js} +1 -1
  15. package/dist/gateway/static/root/assets/apps-page-BhgvfBJT.js +1 -0
  16. package/dist/gateway/static/root/assets/{archive-plugin-7k15-hqo.js → archive-plugin-C0o_mVQI.js} +1 -1
  17. package/dist/gateway/static/root/assets/{attachment-load-B-SFpjd9.js → attachment-load-B5Ry3tGL.js} +1 -1
  18. package/dist/gateway/static/root/assets/{automations-page-Qy36j19q.js → automations-page-DY5QAEQd.js} +1 -1
  19. package/dist/gateway/static/root/assets/automations-workspace-BzX4lILP.js +6 -0
  20. package/dist/gateway/static/root/assets/{binary-plugins-CPOZQt8F.js → binary-plugins-BydpEgBA.js} +1 -1
  21. package/dist/gateway/static/root/assets/{block-editor-DhvVlIp9.js → block-editor-D0CpUOMo.js} +3 -3
  22. package/dist/gateway/static/root/assets/browser-automation-inputs-DzbTsGI6.js +1 -0
  23. package/dist/gateway/static/root/assets/browser-automations-page-D7fZYjni.js +3 -0
  24. package/dist/gateway/static/root/assets/browser-settings-page-BBdMqxl0.js +3 -0
  25. package/dist/gateway/static/root/assets/capabilities-settings-panel-D_WfftDW.js +7 -0
  26. package/dist/gateway/static/root/assets/channels-settings-bdRLT9KA.js +1 -0
  27. package/dist/gateway/static/root/assets/{channels-status-swr-CX-yWwLD.js → channels-status-swr-BGGRTkn6.js} +1 -1
  28. package/dist/gateway/static/root/assets/{chat-terminal-dock-1PJoxRuV.js → chat-terminal-dock-_CP4nvlg.js} +2 -2
  29. package/dist/gateway/static/root/assets/connectors-page-CPDjU5wU.js +2 -0
  30. package/dist/gateway/static/root/assets/{cron-expression-CBCc6zFA.js → cron-expression-g2U8Rllf.js} +1 -1
  31. package/dist/gateway/static/root/assets/{date-picker-u8K5Kt_N.js → date-picker-SmVlhtj_.js} +1 -1
  32. package/dist/gateway/static/root/assets/{dependency-picker-y_i_cnpz.js → dependency-picker-D-0gcbbM.js} +1 -1
  33. package/dist/gateway/static/root/assets/{desktop-pet-DyL0JxLm.js → desktop-pet-Cl3JRIu6.js} +1 -1
  34. package/dist/gateway/static/root/assets/{desktop-pet-settings-d2d_IsyP.js → desktop-pet-settings-D7kvWQ9H.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-debug-page-DqIBKJwl.js → extension-debug-page-DtP2tJHY.js} +1 -1
  36. package/dist/gateway/static/root/assets/{extension-page-DUW1xxj2.js → extension-page-CphZDdoT.js} +1 -1
  37. package/dist/gateway/static/root/assets/{extension-settings-page-BHY9qaNw.js → extension-settings-page-CsxVLV4-.js} +1 -1
  38. package/dist/gateway/static/root/assets/{gateway-config-swr-CMNbl0FZ.js → gateway-config-swr-BW3Bx-aV.js} +1 -1
  39. package/dist/gateway/static/root/assets/gateway-settings-DxBZ05dX.js +1 -0
  40. package/dist/gateway/static/root/assets/{gateway-startup-retry-CR7Xg8As.js → gateway-startup-retry-DAq74TZe.js} +1 -1
  41. package/dist/gateway/static/root/assets/{heartbeat-settings-7CD9iPR7.js → heartbeat-settings-DWcKsIoZ.js} +1 -1
  42. package/dist/gateway/static/root/assets/home-page-BdvLZKQZ.js +1 -0
  43. package/dist/gateway/static/root/assets/{image-generation-api-C5mn73ca.js → image-generation-api-MPuaXDRs.js} +1 -1
  44. package/dist/gateway/static/root/assets/index-C7RDs6S-.js +74 -0
  45. package/dist/gateway/static/root/assets/index-Cu8xqZQ9.css +2 -0
  46. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BtlqMleF.js → keyboard-shortcuts-settings-CfhaTqgE.js} +1 -1
  47. package/dist/gateway/static/root/assets/{local-app-workbench-page-BjxfkjxE.js → local-app-workbench-page-CR6asX7L.js} +2 -2
  48. package/dist/gateway/static/root/assets/{local-apps-page-B7xqQe2s.js → local-apps-page-g01W3kEK.js} +1 -1
  49. package/dist/gateway/static/root/assets/{locale-store-CF4erhjB.js → locale-store-BkeaPZpn.js} +1 -1
  50. package/dist/gateway/static/root/assets/{logs-page-kACaPZKL.js → logs-page-ZP4QTWoC.js} +2 -2
  51. package/dist/gateway/static/root/assets/{management-settings-A432siER.js → management-settings-DeGxJF_Z.js} +1 -1
  52. package/dist/gateway/static/root/assets/markdown-view-Ca7BRBLL.js +201 -0
  53. package/dist/gateway/static/root/assets/{media-plugins-CpvYiauZ.js → media-plugins-FmOhmzlD.js} +1 -1
  54. package/dist/gateway/static/root/assets/messages-C72stReU.js +3 -0
  55. package/dist/gateway/static/root/assets/{mobile-pairing-wizard-DyjVGngO.js → mobile-pairing-wizard-BXNbn05L.js} +1 -1
  56. package/dist/gateway/static/root/assets/note-detail-panel-EeVeF4II.js +5 -0
  57. package/dist/gateway/static/root/assets/notes-page-D7bMff96.js +8 -0
  58. package/dist/gateway/static/root/assets/{page-tabs-B3FKzjR6.js → page-tabs-pyukZ1PJ.js} +1 -1
  59. package/dist/gateway/static/root/assets/{preview-open-alternatives-DnjrwAHD.js → preview-open-alternatives-slFHoMUe.js} +1 -1
  60. package/dist/gateway/static/root/assets/{product-open-page-COcr_NUJ.js → product-open-page-CXa3FNNk.js} +1 -1
  61. package/dist/gateway/static/root/assets/project-detail-page-BDF88VdN.js +1 -0
  62. package/dist/gateway/static/root/assets/projects-page-DeTD6pu1.js +1 -0
  63. package/dist/gateway/static/root/assets/{registry-api-BsRBlji7.js → registry-api-CviQoUBf.js} +1 -1
  64. package/dist/gateway/static/root/assets/remote-access-hub-CxKrdQ6a.js +1 -0
  65. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-LO4wZ_dO.js → runtime-tools-settings-panel-O9D9o7-O.js} +2 -2
  66. package/dist/gateway/static/root/assets/{schema-form-crcj4-Pm.js → schema-form-8FesicnL.js} +1 -1
  67. package/dist/gateway/static/root/assets/sessions-page-DUFJN-2t.js +1 -0
  68. package/dist/gateway/static/root/assets/settings-advanced-gate-CcSYDjaH.js +1 -0
  69. package/dist/gateway/static/root/assets/{settings-form-section-Bl4MvTmq.js → settings-form-section-CBic9TFH.js} +1 -1
  70. package/dist/gateway/static/root/assets/{settings-page-DplrjZ6x.js → settings-page-Xz66_Mjg.js} +1 -1
  71. package/dist/gateway/static/root/assets/setup-status-panel-C6DuwrP5.js +1 -0
  72. package/dist/gateway/static/root/assets/{share-preview-page-CJP1kURj.js → share-preview-page--JpjwB58.js} +1 -1
  73. package/dist/gateway/static/root/assets/{shares-settings-CemgzEi4.js → shares-settings-CovcdHSC.js} +1 -1
  74. package/dist/gateway/static/root/assets/skill-reload-api-CrHagTsE.js +1 -0
  75. package/dist/gateway/static/root/assets/{skills-page-DsjcKg9Q.js → skills-page-fVKExKv5.js} +1 -1
  76. package/dist/gateway/static/root/assets/{skills-page.utils-D6gWBbvy.js → skills-page.utils-Yv9u3uJp.js} +1 -1
  77. package/dist/gateway/static/root/assets/{system-settings-panel-_eCXfqCo.js → system-settings-panel-CCWjVdc2.js} +1 -1
  78. package/dist/gateway/static/root/assets/{task-detail-page-D0Z_K5JT.js → task-detail-page-I8hueJnG.js} +1 -1
  79. package/dist/gateway/static/root/assets/{theme-store-BOgkc_9D.js → theme-store-BtkaVpMm.js} +1 -1
  80. package/dist/gateway/static/root/assets/{tunnel-api-W5mktxl1.js → tunnel-api-C__W9BaN.js} +1 -1
  81. package/dist/gateway/static/root/assets/{use-autosave-Na2DYzT3.js → use-autosave-Dow9RRcq.js} +1 -1
  82. package/dist/gateway/static/root/assets/user-model-page-CU6nxmoM.js +2 -0
  83. package/dist/gateway/static/root/assets/{voice-api-key-field-OXweUxS_.js → voice-api-key-field-CvF3lEyx.js} +1 -1
  84. package/dist/gateway/static/root/assets/{voice-config-api-C-ryeIxj.js → voice-config-api-BEUVAyM6.js} +1 -1
  85. package/dist/gateway/static/root/assets/{work-discovery-overlay-BqOsO47I.js → work-discovery-overlay-B9PDfReq.js} +1 -1
  86. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-B9S_lfT1.js → workflow-run-setup-panel-kWGFkhjz.js} +2 -2
  87. package/dist/gateway/static/root/assets/workflows-page-B4Is5E42.js +5 -0
  88. package/dist/gateway/static/root/index.html +10 -10
  89. package/dist/package.js +1 -1
  90. package/dist/packages/gateway-contract/src/new-session.js +9 -0
  91. package/dist/packages/realtime-protocol/src/voice.js +6 -1
  92. package/dist/src/agent/agent-manager.d.ts +2 -1
  93. package/dist/src/agent/agent-manager.js +26 -8
  94. package/dist/src/agent/background-review/run-background-review.js +1 -1
  95. package/dist/src/agent/coding/repository-instructions.js +2 -2
  96. package/dist/src/agent/coding/workspace-revision.js +2 -2
  97. package/dist/src/agent/commands/command-isolation.js +2 -2
  98. package/dist/src/agent/embedded/execution-context.d.ts +2 -1
  99. package/dist/src/agent/embedded/execution-context.js +10 -4
  100. package/dist/src/agent/embedded/index.d.ts +1 -1
  101. package/dist/src/agent/embedded/index.js +2 -2
  102. package/dist/src/agent/embedded/model-runtime.js +1 -1
  103. package/dist/src/agent/embedded/run-for-session.js +5 -4
  104. package/dist/src/agent/embedded/run-turn.js +22 -3
  105. package/dist/src/agent/embedded/types.d.ts +1 -1
  106. package/dist/src/agent/external-tools/composio-provider.d.ts +1 -0
  107. package/dist/src/agent/external-tools/composio-provider.js +64 -34
  108. package/dist/src/agent/external-tools/search-error.js +5 -3
  109. package/dist/src/agent/image/tool-model-config.js +1 -1
  110. package/dist/src/agent/mcp/oauth/mcp-oauth-store.js +1 -1
  111. package/dist/src/agent/service/direct-turn-helpers.js +6 -3
  112. package/dist/src/agent/service/process-direct-streaming.js +6 -3
  113. package/dist/src/agent/service.d.ts +2 -0
  114. package/dist/src/agent/service.js +25 -10
  115. package/dist/src/agent/service.types.d.ts +2 -1
  116. package/dist/src/agent/session/session-inspector.js +1 -1
  117. package/dist/src/agent/skills/hub-lock.js +1 -1
  118. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js +4 -0
  119. package/dist/src/agent/tasks/task-judge-service.js +3 -3
  120. package/dist/src/agent/tool-manuals/browser.d.ts +1 -1
  121. package/dist/src/agent/tool-manuals/browser.js +15 -226
  122. package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +4 -21
  123. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +48 -165
  124. package/dist/src/agent/tools/browser/tool/schemas.d.ts +203 -16
  125. package/dist/src/agent/tools/browser/tool/schemas.js +146 -16
  126. package/dist/src/agent/tools/browser-automation-tool.d.ts +121 -0
  127. package/dist/src/agent/tools/browser-automation-tool.js +197 -0
  128. package/dist/src/agent/tools/clarify-tool.d.ts +17 -3
  129. package/dist/src/agent/tools/clarify-tool.js +27 -32
  130. package/dist/src/agent/tools/cli-clarify.js +23 -8
  131. package/dist/src/agent/tools/factory.d.ts +6 -9
  132. package/dist/src/agent/tools/factory.js +42 -59
  133. package/dist/src/agent/tools/index.d.ts +2 -2
  134. package/dist/src/agent/tools/index.js +3 -3
  135. package/dist/src/agent/tools/review-workspace.js +2 -2
  136. package/dist/src/ai-assist/text-assist.js +1 -1
  137. package/dist/src/auth/credentials.js +2 -2
  138. package/dist/src/auth/oauth/xopc-cloud.js +3 -1
  139. package/dist/src/auth/profiles/store.js +1 -1
  140. package/dist/src/auth/sync-provider-auth.js +2 -2
  141. package/dist/src/automations/domain/defaults.js +1 -1
  142. package/dist/src/automations/domain/types.d.ts +5 -5
  143. package/dist/src/automations/domain/validation.d.ts +16 -16
  144. package/dist/src/automations/domain/validation.js +3 -3
  145. package/dist/src/automations/draft/automation-draft-validator.d.ts +4 -4
  146. package/dist/src/automations/draft/automation-draft-validator.js +1 -1
  147. package/dist/src/automations/service/action-executor.d.ts +1 -1
  148. package/dist/src/automations/service/action-executor.js +7 -7
  149. package/dist/src/browser/{recipes → automations}/index.d.ts +1 -0
  150. package/dist/src/browser/automations/index.js +4 -0
  151. package/dist/src/browser/automations/repository.d.ts +13 -0
  152. package/dist/src/browser/automations/repository.js +60 -0
  153. package/dist/src/browser/automations/runner.d.ts +17 -0
  154. package/dist/src/browser/automations/runner.js +173 -0
  155. package/dist/src/browser/automations/runtime-service.d.ts +6 -0
  156. package/dist/src/browser/automations/runtime-service.js +37 -0
  157. package/dist/src/browser/automations/schema.d.ts +144 -0
  158. package/dist/src/browser/automations/schema.js +135 -0
  159. package/dist/src/browser/automations/service.d.ts +146 -0
  160. package/dist/src/browser/automations/service.js +168 -0
  161. package/dist/src/browser/automations/types.d.ts +90 -0
  162. package/dist/src/browser/cache-dir-policy.d.ts +1 -1
  163. package/dist/src/browser/cache-dir-policy.js +1 -4
  164. package/dist/src/browser/drivers/browser-driver.d.ts +17 -0
  165. package/dist/src/browser/drivers/create-driver.d.ts +3 -0
  166. package/dist/src/browser/drivers/create-driver.js +84 -0
  167. package/dist/src/browser/drivers/extension-driver.d.ts +20 -0
  168. package/dist/src/browser/drivers/extension-driver.js +47 -0
  169. package/dist/src/browser/drivers/playwright-driver.d.ts +38 -0
  170. package/dist/src/browser/drivers/playwright-driver.js +406 -0
  171. package/dist/src/browser/index.d.ts +10 -15
  172. package/dist/src/browser/index.js +10 -15
  173. package/dist/src/browser/install-lock.d.ts +1 -2
  174. package/dist/src/browser/install-lock.js +3 -9
  175. package/dist/src/browser/install-progress.d.ts +1 -1
  176. package/dist/src/browser/observation/format.d.ts +2 -0
  177. package/dist/src/browser/observation/format.js +26 -0
  178. package/dist/src/browser/policy/approval-store.d.ts +17 -0
  179. package/dist/src/browser/policy/approval-store.js +62 -0
  180. package/dist/src/browser/policy/browser-policy.d.ts +3 -0
  181. package/dist/src/browser/policy/browser-policy.js +27 -0
  182. package/dist/src/browser/providers/browser-ext-install.d.ts +1 -1
  183. package/dist/src/browser/providers/browser-ext-install.js +4 -6
  184. package/dist/src/browser/providers/browser-use.js +1 -1
  185. package/dist/src/browser/providers/browserbase.js +1 -1
  186. package/dist/src/browser/providers/extension-ws-acquire.d.ts +1 -4
  187. package/dist/src/browser/providers/extension-ws-acquire.js +1 -13
  188. package/dist/src/browser/providers/extension.d.ts +3 -22
  189. package/dist/src/browser/providers/extension.js +7 -15
  190. package/dist/src/browser/providers/index.d.ts +2 -2
  191. package/dist/src/browser/providers/index.js +3 -3
  192. package/dist/src/browser/providers/types.d.ts +0 -94
  193. package/dist/src/browser/readiness.d.ts +4 -22
  194. package/dist/src/browser/readiness.js +55 -118
  195. package/dist/src/browser/runtime/browser-runtime.d.ts +30 -0
  196. package/dist/src/browser/runtime/browser-runtime.js +362 -0
  197. package/dist/src/browser/url-policy.d.ts +3 -3
  198. package/dist/src/browser/url-policy.js +7 -6
  199. package/dist/src/browser/verification/expectation.d.ts +2 -0
  200. package/dist/src/browser/verification/expectation.js +17 -0
  201. package/dist/src/cli/command-loaders.js +1 -0
  202. package/dist/src/cli/command-manifest.js +5 -1
  203. package/dist/src/cli/commands/browser-cli-helpers.d.ts +0 -6
  204. package/dist/src/cli/commands/browser-cli-helpers.js +11 -144
  205. package/dist/src/cli/commands/browser.d.ts +0 -5
  206. package/dist/src/cli/commands/browser.js +11 -152
  207. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  208. package/dist/src/cli/commands/doctor/checks/node-version.js +25 -9
  209. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  210. package/dist/src/cli/commands/models.js +1 -1
  211. package/dist/src/cli/commands/platform.d.ts +1 -0
  212. package/dist/src/cli/commands/platform.js +111 -0
  213. package/dist/src/config/index.js +4 -4
  214. package/dist/src/config/loader.js +10 -4
  215. package/dist/src/config/models-json.js +1 -1
  216. package/dist/src/config/schema.d.ts +131 -84
  217. package/dist/src/config/schema.js +112 -59
  218. package/dist/src/connectors/composio-sessions.js +1 -3
  219. package/dist/src/extensions/lockfile.js +1 -1
  220. package/dist/src/extensions/marketplace.js +4 -0
  221. package/dist/src/gateway/agents-admin.js +1 -1
  222. package/dist/src/gateway/chat-stream/mapper.js +5 -1
  223. package/dist/src/gateway/chat-stream/protocol.d.ts +5 -1
  224. package/dist/src/gateway/clarify-runtime.d.ts +7 -5
  225. package/dist/src/gateway/clarify-runtime.js +8 -11
  226. package/dist/src/gateway/ephemeral-clarification-waiter.d.ts +17 -0
  227. package/dist/src/gateway/ephemeral-clarification-waiter.js +46 -0
  228. package/dist/src/gateway/file-path-classifier.js +1 -1
  229. package/dist/src/gateway/heartbeat/service.js +1 -1
  230. package/dist/src/gateway/hono/lib/config-payload.d.ts +12 -26
  231. package/dist/src/gateway/hono/lib/config-payload.js +11 -40
  232. package/dist/src/gateway/hono/routes/agent-stream.js +44 -18
  233. package/dist/src/gateway/hono/routes/browser-automations.d.ts +3 -0
  234. package/dist/src/gateway/hono/routes/browser-automations.js +77 -0
  235. package/dist/src/gateway/hono/routes/browser-install.js +0 -32
  236. package/dist/src/gateway/hono/routes/browser.d.ts +0 -17
  237. package/dist/src/gateway/hono/routes/browser.js +46 -568
  238. package/dist/src/gateway/hono/routes/config-patch/misc.js +8 -1
  239. package/dist/src/gateway/hono/routes/config.js +0 -11
  240. package/dist/src/gateway/hono/routes/lazy-bundles.js +5 -5
  241. package/dist/src/gateway/hono/routes/models.js +1 -1
  242. package/dist/src/gateway/hono/routes/session-input-handler.d.ts +10 -2
  243. package/dist/src/gateway/hono/routes/side-chats.js +24 -4
  244. package/dist/src/gateway/security/gateway-scopes.js +1 -1
  245. package/dist/src/gateway/service/agent-runner.d.ts +25 -36
  246. package/dist/src/gateway/service/agent-runner.js +103 -32
  247. package/dist/src/gateway/service/config-coordinator.js +1 -1
  248. package/dist/src/gateway/service/run-gateway-agent.js +5 -2
  249. package/dist/src/gateway/service/session-input-coordinator.js +4 -1
  250. package/dist/src/gateway/service/sessions-api.js +1 -1
  251. package/dist/src/gateway/service.d.ts +8 -8
  252. package/dist/src/gateway/service.js +50 -37
  253. package/dist/src/gateway/side-chat/manager.d.ts +2 -1
  254. package/dist/src/gateway/side-chat/manager.js +5 -4
  255. package/dist/src/gateway/side-chat/run-service.d.ts +5 -1
  256. package/dist/src/gateway/side-chat/run-service.js +24 -23
  257. package/dist/src/gateway/side-chat/types.d.ts +3 -1
  258. package/dist/src/heartbeat/index.js +1 -1
  259. package/dist/src/platform/client.d.ts +121 -0
  260. package/dist/src/platform/client.js +108 -0
  261. package/dist/src/platform/contracts.d.ts +194 -0
  262. package/dist/src/platform/contracts.js +150 -0
  263. package/dist/src/platform/index.d.ts +4 -0
  264. package/dist/src/platform/index.js +9 -0
  265. package/dist/src/platform/resolution.d.ts +4 -0
  266. package/dist/src/platform/resolution.js +16 -0
  267. package/dist/src/platform/worker.d.ts +6 -0
  268. package/dist/src/platform/worker.js +75 -0
  269. package/dist/src/providers/auth-runtime/resolve-auth.js +1 -1
  270. package/dist/src/providers/index.js +2 -2
  271. package/dist/src/providers/model-registry.js +1 -1
  272. package/dist/src/providers/register-runtime-providers.js +1 -1
  273. package/dist/src/providers/xopc-cloud-config.js +3 -1
  274. package/dist/src/session/session-context-for-llm.js +41 -1
  275. package/dist/src/share/hosted-session-share.js +3 -1
  276. package/dist/src/share/share-thumbnail.js +1 -1
  277. package/dist/src/storage/sqlite/clarification-wait-repository.d.ts +41 -0
  278. package/dist/src/storage/sqlite/clarification-wait-repository.js +418 -0
  279. package/dist/src/storage/sqlite/index.d.ts +2 -1
  280. package/dist/src/storage/sqlite/index.js +2 -1
  281. package/dist/src/storage/sqlite/migrations/153_browser_control_v2.sql +45 -0
  282. package/dist/src/storage/sqlite/migrations/154_session_clarification_waits.sql +60 -0
  283. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  284. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  285. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  286. package/dist/src/storage/sqlite/schema.js +1 -1
  287. package/dist/src/storage/sqlite/schema.sql +16 -20
  288. package/dist/src/storage/sqlite/session-input-repository.d.ts +11 -6
  289. package/dist/src/tasks/home-query-service.js +1 -1
  290. package/dist/src/tui/tui-startup-resources.js +1 -1
  291. package/dist/src/tui/tui.js +1 -1
  292. package/dist/src/tunnel/env.js +3 -1
  293. package/dist/src/voice/realtime/agentEngine.js +7 -2
  294. package/dist/src/voice/realtime/runtime.types.d.ts +5 -0
  295. package/dist/src/work-discovery/service.js +1 -1
  296. package/dist/src/workflows/service/workflow-run-service.js +1 -1
  297. package/package.json +7 -7
  298. package/skills/creative/hatch-pet/SKILL.md +1 -1
  299. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-kILWelNb.js +0 -1
  300. package/dist/gateway/static/root/assets/apps-page-BnizTdgs.js +0 -1
  301. package/dist/gateway/static/root/assets/automations-workspace-CZRKqSqY.js +0 -6
  302. package/dist/gateway/static/root/assets/browser-settings-page-pN5LbChY.js +0 -8
  303. package/dist/gateway/static/root/assets/browser-workflow-inputs-BX1-uM9L.js +0 -1
  304. package/dist/gateway/static/root/assets/browser-workflows-page-C65MI57t.js +0 -3
  305. package/dist/gateway/static/root/assets/capabilities-settings-panel-CJw2e16J.js +0 -7
  306. package/dist/gateway/static/root/assets/channels-settings-CRgjb4Ck.js +0 -1
  307. package/dist/gateway/static/root/assets/connectors-page-Dcpdy06y.js +0 -2
  308. package/dist/gateway/static/root/assets/gateway-config-api-e3BRcgDx.js +0 -1
  309. package/dist/gateway/static/root/assets/gateway-settings-Cheo0Rkc.js +0 -1
  310. package/dist/gateway/static/root/assets/home-page-DVrTRqNc.js +0 -1
  311. package/dist/gateway/static/root/assets/index-B7CX4Qob.css +0 -2
  312. package/dist/gateway/static/root/assets/index-BHrpyJ4t.js +0 -72
  313. package/dist/gateway/static/root/assets/markdown-view-CQvzsE24.js +0 -201
  314. package/dist/gateway/static/root/assets/messages-Cf5hpZE6.js +0 -3
  315. package/dist/gateway/static/root/assets/note-detail-panel-CUd8O4K7.js +0 -5
  316. package/dist/gateway/static/root/assets/notes-page-BLQwd39W.js +0 -8
  317. package/dist/gateway/static/root/assets/project-detail-page-NttW338u.js +0 -1
  318. package/dist/gateway/static/root/assets/projects-page-BzH8pjEz.js +0 -1
  319. package/dist/gateway/static/root/assets/remote-access-hub-BxpjSDnL.js +0 -1
  320. package/dist/gateway/static/root/assets/sessions-page-BLMaibOb.js +0 -1
  321. package/dist/gateway/static/root/assets/settings-advanced-gate-BRvvKhoH.js +0 -1
  322. package/dist/gateway/static/root/assets/setup-status-panel-DTOsxQC1.js +0 -1
  323. package/dist/gateway/static/root/assets/skill-reload-api-BWYanBlQ.js +0 -1
  324. package/dist/gateway/static/root/assets/user-model-page-B_-SNat-.js +0 -2
  325. package/dist/gateway/static/root/assets/workflows-page-CNOT2Coo.js +0 -5
  326. package/dist/src/agent/tools/browser-recipe-tool.d.ts +0 -12
  327. package/dist/src/agent/tools/browser-recipe-tool.js +0 -113
  328. package/dist/src/browser/actions/extension-registry-bridge.d.ts +0 -5
  329. package/dist/src/browser/actions/extension-registry-bridge.js +0 -312
  330. package/dist/src/browser/actions/registry.d.ts +0 -5
  331. package/dist/src/browser/actions/registry.js +0 -741
  332. package/dist/src/browser/actions/types.d.ts +0 -65
  333. package/dist/src/browser/backend-from-config.d.ts +0 -22
  334. package/dist/src/browser/backend-from-config.js +0 -99
  335. package/dist/src/browser/browser-command-timeout.d.ts +0 -2
  336. package/dist/src/browser/browser-command-timeout.js +0 -11
  337. package/dist/src/browser/cdp-local-launcher.d.ts +0 -35
  338. package/dist/src/browser/cdp-local-launcher.js +0 -154
  339. package/dist/src/browser/cdp-supervisor.d.ts +0 -58
  340. package/dist/src/browser/cdp-supervisor.js +0 -133
  341. package/dist/src/browser/humanize.d.ts +0 -80
  342. package/dist/src/browser/humanize.js +0 -363
  343. package/dist/src/browser/manager.d.ts +0 -50
  344. package/dist/src/browser/manager.js +0 -251
  345. package/dist/src/browser/pipeline/output.d.ts +0 -35
  346. package/dist/src/browser/pipeline/output.js +0 -74
  347. package/dist/src/browser/pipeline/runner.d.ts +0 -27
  348. package/dist/src/browser/pipeline/runner.js +0 -453
  349. package/dist/src/browser/pipeline/schema.d.ts +0 -42
  350. package/dist/src/browser/pipeline/schema.js +0 -116
  351. package/dist/src/browser/pipeline/template.d.ts +0 -30
  352. package/dist/src/browser/pipeline/template.js +0 -112
  353. package/dist/src/browser/providers/cloakbrowser.d.ts +0 -83
  354. package/dist/src/browser/providers/cloakbrowser.js +0 -612
  355. package/dist/src/browser/recipes/index.js +0 -3
  356. package/dist/src/browser/recipes/repository.d.ts +0 -13
  357. package/dist/src/browser/recipes/repository.js +0 -81
  358. package/dist/src/browser/recipes/runtime-service.d.ts +0 -6
  359. package/dist/src/browser/recipes/runtime-service.js +0 -30
  360. package/dist/src/browser/recipes/service.d.ts +0 -36
  361. package/dist/src/browser/recipes/service.js +0 -186
  362. package/dist/src/browser/recipes/types.d.ts +0 -36
  363. package/dist/src/browser/schemas.d.ts +0 -53
  364. package/dist/src/browser/schemas.js +0 -68
  365. package/dist/src/browser/session-lifecycle.d.ts +0 -40
  366. package/dist/src/browser/session-lifecycle.js +0 -136
  367. package/dist/src/browser/snapshot-helpers.d.ts +0 -24
  368. package/dist/src/browser/snapshot-helpers.js +0 -70
  369. package/dist/src/browser/stealth.d.ts +0 -46
  370. package/dist/src/browser/stealth.js +0 -163
  371. package/dist/src/gateway/clarify-bridge.d.ts +0 -46
  372. package/dist/src/gateway/clarify-bridge.js +0 -111
  373. package/dist/src/gateway/hono/routes/browser-workflows.d.ts +0 -3
  374. package/dist/src/gateway/hono/routes/browser-workflows.js +0 -78
  375. /package/dist/src/browser/{actions → automations}/types.js +0 -0
  376. /package/dist/src/browser/{recipes/types.js → drivers/browser-driver.js} +0 -0
@@ -0,0 +1,406 @@
1
+ import { verifyBrowserExpectation } from "../verification/expectation.js";
2
+ import { randomUUID } from "node:crypto";
3
+ //#region src/browser/drivers/playwright-driver.ts
4
+ const INTERACTIVE_SELECTOR = [
5
+ "a[href]",
6
+ "button",
7
+ "input:not([type=\"hidden\"])",
8
+ "textarea",
9
+ "select",
10
+ "summary",
11
+ "[contenteditable=\"true\"]",
12
+ "[role=\"button\"]",
13
+ "[role=\"link\"]",
14
+ "[role=\"checkbox\"]",
15
+ "[role=\"radio\"]",
16
+ "[role=\"combobox\"]",
17
+ "[role=\"menuitem\"]",
18
+ "[role=\"option\"]",
19
+ "[role=\"tab\"]",
20
+ "[tabindex]:not([tabindex=\"-1\"])"
21
+ ].join(",");
22
+ var PlaywrightDriver = class {
23
+ kind = "playwright";
24
+ connection = null;
25
+ sessions = /* @__PURE__ */ new Map();
26
+ constructor(options) {
27
+ this.options = options;
28
+ }
29
+ async connect() {
30
+ if (this.connection?.browser.isConnected()) return;
31
+ this.connection = await this.options.connect();
32
+ }
33
+ async disconnect() {
34
+ for (const session of this.sessions.values()) for (const state of session.tabs.values()) await state.page.close().catch(() => {});
35
+ this.sessions.clear();
36
+ await this.connection?.release?.().catch(() => {});
37
+ await this.connection?.context.close().catch(() => {});
38
+ await this.connection?.browser.close().catch(() => {});
39
+ this.connection = null;
40
+ }
41
+ async createSession(sessionId) {
42
+ if (this.sessions.has(sessionId)) return;
43
+ await this.connect();
44
+ const page = await this.context().newPage();
45
+ const state = this.createPageState(page);
46
+ this.sessions.set(sessionId, {
47
+ activeTabId: state.id,
48
+ tabs: new Map([[state.id, state]])
49
+ });
50
+ }
51
+ async closeSession(sessionId) {
52
+ const session = this.sessions.get(sessionId);
53
+ if (!session) return;
54
+ for (const state of session.tabs.values()) await state.page.close().catch(() => {});
55
+ this.sessions.delete(sessionId);
56
+ }
57
+ async navigate(sessionId, input, signal) {
58
+ const startedAt = Date.now();
59
+ const state = await this.activeState(sessionId);
60
+ try {
61
+ throwIfAborted(signal);
62
+ await state.page.goto(input.url, {
63
+ waitUntil: "domcontentloaded",
64
+ timeout: this.options.actionTimeoutMs
65
+ });
66
+ const observation = await this.observe(sessionId, {
67
+ action: "observe",
68
+ visual: "auto"
69
+ }, signal);
70
+ return this.verifiedResult(input, observation, startedAt, "read");
71
+ } catch (error) {
72
+ return failureFrom(error);
73
+ }
74
+ }
75
+ async observe(sessionId, input, signal) {
76
+ throwIfAborted(signal);
77
+ const state = await this.activeState(sessionId);
78
+ const marker = await state.page.evaluate(() => {
79
+ const root = globalThis;
80
+ return `${root.location.href}|${root.performance.timeOrigin}`;
81
+ });
82
+ if (marker !== state.documentMarker) {
83
+ state.documentMarker = marker;
84
+ state.documentId = randomUUID();
85
+ state.revision = 0;
86
+ state.refs.clear();
87
+ state.lastNodes = [];
88
+ }
89
+ const candidates = state.page.locator(INTERACTIVE_SELECTOR);
90
+ const count = Math.min(await candidates.count(), this.options.maxNodes * 3);
91
+ const nodes = [];
92
+ const refs = /* @__PURE__ */ new Map();
93
+ let characters = 0;
94
+ for (let index = 0; index < count && nodes.length < this.options.maxNodes; index += 1) {
95
+ throwIfAborted(signal);
96
+ const locator = candidates.nth(index);
97
+ if (!await locator.isVisible().catch(() => false)) continue;
98
+ const handle = await locator.elementHandle();
99
+ if (!handle) continue;
100
+ let raw = await handle.evaluate((element, elementIndex) => {
101
+ const html = element;
102
+ const tag = element.tagName.toLowerCase();
103
+ const input = element;
104
+ const explicitRole = element.getAttribute("role");
105
+ const implicitRole = tag === "a" ? "link" : tag === "button" ? "button" : tag === "select" ? "combobox" : tag === "textarea" ? "textbox" : tag === "summary" ? "button" : tag === "input" && input.type === "checkbox" ? "checkbox" : tag === "input" && input.type === "radio" ? "radio" : tag === "input" ? "textbox" : "interactive";
106
+ const label = tag === "input" || tag === "textarea" || tag === "select" ? input.labels?.[0]?.innerText ?? "" : "";
107
+ const name = element.getAttribute("aria-label") ?? label ?? element.getAttribute("alt") ?? element.getAttribute("placeholder") ?? html.innerText ?? element.getAttribute("title") ?? "";
108
+ const rect = element.getBoundingClientRect();
109
+ const root = globalThis;
110
+ root.__xopcRefCounter = (root.__xopcRefCounter ?? 0) + 1;
111
+ const existing = element.getAttribute("data-xopc-ref");
112
+ const ref = existing && /^xopc-e\d+$/.test(existing) ? existing : `xopc-e${root.__xopcRefCounter}`;
113
+ if (ref !== existing) element.setAttribute("data-xopc-ref", ref);
114
+ const states = [];
115
+ const autocomplete = element.getAttribute("autocomplete")?.toLowerCase() ?? "";
116
+ const sensitive = input.type === "password" || /^(cc-|one-time-code$|transaction-)/.test(autocomplete);
117
+ if (element.disabled) states.push("disabled");
118
+ if (element.checked) states.push("checked");
119
+ if (globalThis.document.activeElement === element) states.push("focused");
120
+ if (element.getAttribute("aria-expanded") === "true") states.push("expanded");
121
+ if (sensitive) states.push("sensitive");
122
+ if ((tag === "button" || tag === "input") && input.type === "submit") states.push("submit");
123
+ return {
124
+ ref,
125
+ role: explicitRole || implicitRole,
126
+ name: name.trim().replace(/\s+/g, " ").slice(0, 240),
127
+ value: !sensitive && "value" in element ? String(element.value ?? "").slice(0, 500) : void 0,
128
+ description: element.getAttribute("aria-description") ?? void 0,
129
+ states,
130
+ bounds: {
131
+ x: rect.x,
132
+ y: rect.y,
133
+ width: rect.width,
134
+ height: rect.height
135
+ },
136
+ elementIndex
137
+ };
138
+ }, index);
139
+ if (refs.has(raw.ref)) {
140
+ const ref = `xopc-e${Date.now()}${index}`;
141
+ await handle.evaluate((element, nextRef) => element.setAttribute("data-xopc-ref", nextRef), ref);
142
+ raw = {
143
+ ...raw,
144
+ ref
145
+ };
146
+ }
147
+ characters += raw.name.length + (raw.value?.length ?? 0) + (raw.description?.length ?? 0);
148
+ if (characters > this.options.maxCharacters) break;
149
+ const node = raw;
150
+ nodes.push(node);
151
+ refs.set(node.ref, handle);
152
+ }
153
+ state.revision += 1;
154
+ state.refs = refs;
155
+ const changes = diffNodes(state.lastNodes, nodes);
156
+ state.lastNodes = nodes;
157
+ const focused = nodes.find((node) => node.states.includes("focused"))?.ref;
158
+ const visual = await this.captureVisual(state.page, input.visual ?? "auto", nodes.length);
159
+ return {
160
+ sessionId,
161
+ tabId: state.id,
162
+ revision: state.revision,
163
+ documentId: state.documentId,
164
+ url: state.page.url(),
165
+ title: await state.page.title().catch(() => ""),
166
+ focused,
167
+ nodes,
168
+ changes,
169
+ visual
170
+ };
171
+ }
172
+ async perform(sessionId, input, signal) {
173
+ const startedAt = Date.now();
174
+ try {
175
+ throwIfAborted(signal);
176
+ const state = await this.activeState(sessionId);
177
+ if ("revision" in input && input.revision !== state.revision) return stale(await this.observe(sessionId, {
178
+ action: "observe",
179
+ visual: "never"
180
+ }, signal));
181
+ const handle = "ref" in input && input.ref ? state.refs.get(input.ref) : void 0;
182
+ if ("ref" in input && input.ref && !handle) return targetNotFound(input.ref);
183
+ switch (input.action) {
184
+ case "click":
185
+ await handle.click({ timeout: this.options.actionTimeoutMs });
186
+ break;
187
+ case "fill":
188
+ await handle.fill(input.value, { timeout: this.options.actionTimeoutMs });
189
+ if (input.submit) await handle.press("Enter");
190
+ break;
191
+ case "select":
192
+ await handle.selectOption(input.value);
193
+ break;
194
+ case "press":
195
+ if (handle) await handle.press(input.key);
196
+ else await state.page.keyboard.press(input.key);
197
+ break;
198
+ case "scroll":
199
+ if (handle) await handle.evaluate((element, deltaY) => element.scrollBy({ top: deltaY }), input.deltaY);
200
+ else await state.page.mouse.wheel(0, input.deltaY);
201
+ break;
202
+ case "wait":
203
+ await this.wait(state, input, signal);
204
+ break;
205
+ case "upload":
206
+ await handle.setInputFiles(input.paths);
207
+ break;
208
+ }
209
+ await state.page.waitForTimeout(200);
210
+ const observation = await this.observe(sessionId, {
211
+ action: "observe",
212
+ visual: "auto"
213
+ }, signal);
214
+ return this.verifiedResult(input, observation, startedAt, "draft");
215
+ } catch (error) {
216
+ return failureFrom(error);
217
+ }
218
+ }
219
+ async tabs(sessionId, input, signal) {
220
+ const startedAt = Date.now();
221
+ try {
222
+ throwIfAborted(signal);
223
+ const session = await this.session(sessionId);
224
+ if (input.operation === "create") {
225
+ const page = await this.context().newPage();
226
+ const state = this.createPageState(page);
227
+ session.tabs.set(state.id, state);
228
+ session.activeTabId = state.id;
229
+ if (input.url) await page.goto(input.url, {
230
+ waitUntil: "domcontentloaded",
231
+ timeout: this.options.actionTimeoutMs
232
+ });
233
+ } else if (input.operation === "activate") {
234
+ if (!input.tabId || !session.tabs.has(input.tabId)) return targetNotFound(input.tabId ?? "");
235
+ session.activeTabId = input.tabId;
236
+ await session.tabs.get(input.tabId).page.bringToFront();
237
+ } else if (input.operation === "close") {
238
+ if (!input.tabId || !session.tabs.has(input.tabId)) return targetNotFound(input.tabId ?? "");
239
+ await session.tabs.get(input.tabId).page.close();
240
+ session.tabs.delete(input.tabId);
241
+ if (session.tabs.size === 0) {
242
+ const next = this.createPageState(await this.context().newPage());
243
+ session.tabs.set(next.id, next);
244
+ }
245
+ session.activeTabId = session.tabs.keys().next().value;
246
+ }
247
+ const tabs = await this.listTabs(session);
248
+ return {
249
+ ok: true,
250
+ receipt: {
251
+ action: "tabs",
252
+ risk: "read",
253
+ durationMs: Date.now() - startedAt,
254
+ verified: true,
255
+ tabs
256
+ }
257
+ };
258
+ } catch (error) {
259
+ return failureFrom(error);
260
+ }
261
+ }
262
+ async wait(state, input, signal) {
263
+ const timeout = input.timeoutMs ?? this.options.actionTimeoutMs;
264
+ if (input.condition === "page_idle") {
265
+ await state.page.waitForLoadState("networkidle", { timeout });
266
+ return;
267
+ }
268
+ if (input.condition === "text") {
269
+ if (!input.value) throw new Error("wait text requires value");
270
+ await state.page.getByText(input.value, { exact: false }).first().waitFor({
271
+ state: "visible",
272
+ timeout
273
+ });
274
+ return;
275
+ }
276
+ if (!input.ref) throw new Error(`wait ${input.condition} requires ref`);
277
+ const handle = state.refs.get(input.ref);
278
+ if (!handle && input.condition === "hidden") return;
279
+ if (!handle) throw new Error(`Target ${input.ref} was not found`);
280
+ const deadline = Date.now() + timeout;
281
+ while (Date.now() < deadline) {
282
+ throwIfAborted(signal);
283
+ const visible = await handle.isVisible().catch(() => false);
284
+ if (input.condition === "visible" && visible || input.condition === "hidden" && !visible) return;
285
+ await state.page.waitForTimeout(100);
286
+ }
287
+ throw new Error(`Timed out waiting for ${input.ref} to become ${input.condition}`);
288
+ }
289
+ verifiedResult(input, observation, startedAt, risk) {
290
+ const failed = verifyBrowserExpectation("expect" in input ? input.expect : void 0, observation);
291
+ if (failed) return {
292
+ ok: false,
293
+ error: {
294
+ code: "EXPECTATION_FAILED",
295
+ message: failed,
296
+ observation
297
+ }
298
+ };
299
+ return {
300
+ ok: true,
301
+ receipt: {
302
+ action: input.action,
303
+ risk,
304
+ durationMs: Date.now() - startedAt,
305
+ verified: true,
306
+ observation
307
+ }
308
+ };
309
+ }
310
+ async captureVisual(page, mode, nodeCount) {
311
+ if (mode === "never") return void 0;
312
+ if (!(mode === "always" || this.options.visualFallback && (nodeCount === 0 || await page.locator("canvas,embed[type=\"application/pdf\"],object[type=\"application/pdf\"]").count() > 0))) return void 0;
313
+ const data = await page.screenshot({
314
+ type: "jpeg",
315
+ quality: 70,
316
+ fullPage: false,
317
+ scale: "css"
318
+ });
319
+ const viewport = page.viewportSize();
320
+ return {
321
+ mimeType: "image/jpeg",
322
+ data: data.toString("base64"),
323
+ width: viewport?.width,
324
+ height: viewport?.height
325
+ };
326
+ }
327
+ async activeState(sessionId) {
328
+ const session = await this.session(sessionId);
329
+ const state = session.tabs.get(session.activeTabId);
330
+ if (!state) throw new Error(`Active tab is missing for session ${sessionId}`);
331
+ return state;
332
+ }
333
+ async session(sessionId) {
334
+ await this.createSession(sessionId);
335
+ return this.sessions.get(sessionId);
336
+ }
337
+ createPageState(page) {
338
+ return {
339
+ id: `tab_${randomUUID()}`,
340
+ page,
341
+ documentId: randomUUID(),
342
+ documentMarker: "",
343
+ revision: 0,
344
+ refs: /* @__PURE__ */ new Map(),
345
+ lastNodes: []
346
+ };
347
+ }
348
+ context() {
349
+ if (!this.connection) throw new Error("Playwright driver is not connected");
350
+ return this.connection.context;
351
+ }
352
+ async listTabs(session) {
353
+ return Promise.all([...session.tabs.values()].map(async (state) => ({
354
+ id: state.id,
355
+ url: state.page.url(),
356
+ title: await state.page.title().catch(() => ""),
357
+ active: state.id === session.activeTabId
358
+ })));
359
+ }
360
+ };
361
+ function diffNodes(previous, next) {
362
+ const before = new Map(previous.map((node) => [node.ref, node]));
363
+ const after = new Map(next.map((node) => [node.ref, node]));
364
+ return {
365
+ added: next.filter((node) => !before.has(node.ref)),
366
+ changed: next.filter((node) => {
367
+ const old = before.get(node.ref);
368
+ return old && JSON.stringify(old) !== JSON.stringify(node);
369
+ }),
370
+ removed: previous.filter((node) => !after.has(node.ref)).map((node) => node.ref)
371
+ };
372
+ }
373
+ function stale(observation) {
374
+ return {
375
+ ok: false,
376
+ error: {
377
+ code: "STALE_OBSERVATION",
378
+ message: "The page changed. Use the attached observation and retry with its revision.",
379
+ observation
380
+ }
381
+ };
382
+ }
383
+ function targetNotFound(ref) {
384
+ return {
385
+ ok: false,
386
+ error: {
387
+ code: "TARGET_NOT_FOUND",
388
+ message: `Target ${ref || "(missing)"} was not found.`
389
+ }
390
+ };
391
+ }
392
+ function failureFrom(error) {
393
+ const message = error instanceof Error ? error.message : String(error);
394
+ return {
395
+ ok: false,
396
+ error: {
397
+ code: /aborted/i.test(message) ? "ABORTED" : /timeout|timed out/i.test(message) ? "TIMEOUT" : "DRIVER_UNAVAILABLE",
398
+ message
399
+ }
400
+ };
401
+ }
402
+ function throwIfAborted(signal) {
403
+ if (signal?.aborted) throw signal.reason instanceof Error ? signal.reason : /* @__PURE__ */ new Error("Operation was aborted");
404
+ }
405
+ //#endregion
406
+ export { PlaywrightDriver };
@@ -1,16 +1,11 @@
1
- export { BrowserManager, type BrowserManagerOptions } from './manager.js';
2
- export { resolveBrowserBackendFromConfig } from './backend-from-config.js';
3
- export { resolveBrowserCommandTimeoutMs } from './browser-command-timeout.js';
4
- export { BrowserNotReadyError, buildBrowserSetupDeepLink, checkBrowserReadiness, type BrowserBackendKind, type BrowserNotReadyReason, type BrowserSetupHint, } from './readiness.js';
1
+ export { BrowserRuntime, type BrowserRuntimeOptions } from './runtime/browser-runtime.js';
2
+ export { createBrowserDriver } from './drivers/create-driver.js';
3
+ export type { BrowserDriver, BrowserPrimitiveInput } from './drivers/browser-driver.js';
4
+ export { PlaywrightDriver, type PlaywrightDriverOptions } from './drivers/playwright-driver.js';
5
+ export { ExtensionDriver } from './drivers/extension-driver.js';
6
+ export { formatBrowserObservation } from './observation/format.js';
7
+ export { classifyBrowserRisk, browserRiskNeedsApproval } from './policy/browser-policy.js';
8
+ export { createBrowserApproval, consumeBrowserApproval, decideBrowserApproval, listBrowserApprovals, } from './policy/approval-store.js';
9
+ export { verifyBrowserExpectation } from './verification/expectation.js';
10
+ export { BrowserNotReadyError, buildBrowserSetupDeepLink, checkBrowserReadiness, type BrowserDriverKind, type BrowserNotReadyReason, type BrowserSetupHint, } from './readiness.js';
5
11
  export { assertBrowserUrlAllowed, checkPostRedirectUrl, containsApiKeyPattern, isAlwaysBlockedUrl, } from './url-policy.js';
6
- export { CdpSupervisor, type DialogEvent, type ConsoleEntry, type DialogPolicy } from './cdp-supervisor.js';
7
- export { truncateSnapshotAtBoundary, snapshotSummaryHeader } from './snapshot-helpers.js';
8
- export { startTracing, stopTracing, checkBotDetection, cleanupOrphanProcesses, type TracingOptions, type BotDetectionResult, } from './session-lifecycle.js';
9
- export { BrowserBackSchema, BrowserCdpSchema, BrowserClickSchema, BrowserCloseSchema, BrowserConsoleSchema, BrowserDialogSchema, BrowserGetImagesSchema, BrowserNavigateSchema, BrowserPressSchema, BrowserScreenshotSchema, BrowserScrollSchema, BrowserSnapshotSchema, BrowserTypeSchema, BrowserVisionSchema, } from './schemas.js';
10
- export { humanizedClick, humanizedFill, humanizedPress, humanizedScroll, resolveHumanConfig, generateMousePath, generateTypingPlan, generateScrollPlan, type HumanConfig, type HumanPreset, } from './humanize.js';
11
- export { buildStealthArgs, buildLocalStealthArgs, generateFingerprintSeed, removeQuarantineAttr, makeExecutable, WEBDRIVER_OVERRIDE_SCRIPT, type StealthOptions, } from './stealth.js';
12
- export { createBrowserActionRegistry } from './actions/registry.js';
13
- export type { BrowserActionName, BrowserActionContext, BrowserActionHandler, BrowserActionRegistry as BrowserActionRegistryType, BrowserActionResult, BrowserArtifact, BrowserDiagnostics, } from './actions/types.js';
14
- export { parseBrowserPipeline, type PipelineDocument, type PipelineStep } from './pipeline/schema.js';
15
- export { runBrowserPipeline, validateBrowserPipeline } from './pipeline/runner.js';
16
- export { resolveTemplate, resolveTemplateDeep } from './pipeline/template.js';
@@ -1,16 +1,11 @@
1
- import { BrowserManager } from "./manager.js";
2
- import { resolveBrowserBackendFromConfig } from "./backend-from-config.js";
3
- import { resolveBrowserCommandTimeoutMs } from "./browser-command-timeout.js";
4
- import { BrowserNotReadyError, buildBrowserSetupDeepLink, checkBrowserReadiness } from "./readiness.js";
5
1
  import { assertBrowserUrlAllowed, checkPostRedirectUrl, containsApiKeyPattern, isAlwaysBlockedUrl } from "./url-policy.js";
6
- import { CdpSupervisor } from "./cdp-supervisor.js";
7
- import { snapshotSummaryHeader, truncateSnapshotAtBoundary } from "./snapshot-helpers.js";
8
- import { checkBotDetection, cleanupOrphanProcesses, startTracing, stopTracing } from "./session-lifecycle.js";
9
- import { BrowserBackSchema, BrowserCdpSchema, BrowserClickSchema, BrowserCloseSchema, BrowserConsoleSchema, BrowserDialogSchema, BrowserGetImagesSchema, BrowserNavigateSchema, BrowserPressSchema, BrowserScreenshotSchema, BrowserScrollSchema, BrowserSnapshotSchema, BrowserTypeSchema, BrowserVisionSchema } from "./schemas.js";
10
- import { generateMousePath, generateScrollPlan, generateTypingPlan, humanizedClick, humanizedFill, humanizedPress, humanizedScroll, resolveHumanConfig } from "./humanize.js";
11
- import { WEBDRIVER_OVERRIDE_SCRIPT, buildLocalStealthArgs, buildStealthArgs, generateFingerprintSeed, makeExecutable, removeQuarantineAttr } from "./stealth.js";
12
- import { resolveTemplate, resolveTemplateDeep } from "./pipeline/template.js";
13
- import { createBrowserActionRegistry } from "./actions/registry.js";
14
- import { parseBrowserPipeline } from "./pipeline/schema.js";
15
- import { runBrowserPipeline, validateBrowserPipeline } from "./pipeline/runner.js";
16
- export { BrowserBackSchema, BrowserCdpSchema, BrowserClickSchema, BrowserCloseSchema, BrowserConsoleSchema, BrowserDialogSchema, BrowserGetImagesSchema, BrowserManager, BrowserNavigateSchema, BrowserNotReadyError, BrowserPressSchema, BrowserScreenshotSchema, BrowserScrollSchema, BrowserSnapshotSchema, BrowserTypeSchema, BrowserVisionSchema, CdpSupervisor, WEBDRIVER_OVERRIDE_SCRIPT, assertBrowserUrlAllowed, buildBrowserSetupDeepLink, buildLocalStealthArgs, buildStealthArgs, checkBotDetection, checkBrowserReadiness, checkPostRedirectUrl, cleanupOrphanProcesses, containsApiKeyPattern, createBrowserActionRegistry, generateFingerprintSeed, generateMousePath, generateScrollPlan, generateTypingPlan, humanizedClick, humanizedFill, humanizedPress, humanizedScroll, isAlwaysBlockedUrl, makeExecutable, parseBrowserPipeline, removeQuarantineAttr, resolveBrowserBackendFromConfig, resolveBrowserCommandTimeoutMs, resolveHumanConfig, resolveTemplate, resolveTemplateDeep, runBrowserPipeline, snapshotSummaryHeader, startTracing, stopTracing, truncateSnapshotAtBoundary, validateBrowserPipeline };
2
+ import { consumeBrowserApproval, createBrowserApproval, decideBrowserApproval, listBrowserApprovals } from "./policy/approval-store.js";
3
+ import { browserRiskNeedsApproval, classifyBrowserRisk } from "./policy/browser-policy.js";
4
+ import { BrowserRuntime } from "./runtime/browser-runtime.js";
5
+ import { ExtensionDriver } from "./drivers/extension-driver.js";
6
+ import { verifyBrowserExpectation } from "./verification/expectation.js";
7
+ import { PlaywrightDriver } from "./drivers/playwright-driver.js";
8
+ import { createBrowserDriver } from "./drivers/create-driver.js";
9
+ import { formatBrowserObservation } from "./observation/format.js";
10
+ import { BrowserNotReadyError, buildBrowserSetupDeepLink, checkBrowserReadiness } from "./readiness.js";
11
+ export { BrowserNotReadyError, BrowserRuntime, ExtensionDriver, PlaywrightDriver, assertBrowserUrlAllowed, browserRiskNeedsApproval, buildBrowserSetupDeepLink, checkBrowserReadiness, checkPostRedirectUrl, classifyBrowserRisk, consumeBrowserApproval, containsApiKeyPattern, createBrowserApproval, createBrowserDriver, decideBrowserApproval, formatBrowserObservation, isAlwaysBlockedUrl, listBrowserApprovals, verifyBrowserExpectation };
@@ -1,5 +1,4 @@
1
- /** Per-backend install mutex — Playwright and CloakBrowser may install in parallel. */
2
- export type BrowserInstallKind = 'playwright' | 'cloakbrowser';
1
+ export type BrowserInstallKind = 'playwright';
3
2
  export type BrowserInstallLock = {
4
3
  readonly signal: AbortSignal;
5
4
  release: () => void;
@@ -1,12 +1,6 @@
1
1
  //#region src/browser/install-lock.ts
2
- const locked = {
3
- playwright: false,
4
- cloakbrowser: false
5
- };
6
- const activeController = {
7
- playwright: null,
8
- cloakbrowser: null
9
- };
2
+ const locked = { playwright: false };
3
+ const activeController = { playwright: null };
10
4
  function acquireBrowserInstallLock(kind) {
11
5
  if (locked[kind]) return null;
12
6
  locked[kind] = true;
@@ -35,7 +29,7 @@ function isBrowserInstallRunning(kind) {
35
29
  }
36
30
  /** Test helper — reset lock state between unit tests. */
37
31
  function resetBrowserInstallLockForTests() {
38
- for (const kind of ["playwright", "cloakbrowser"]) {
32
+ for (const kind of ["playwright"]) {
39
33
  activeController[kind]?.abort();
40
34
  activeController[kind] = null;
41
35
  locked[kind] = false;
@@ -1,4 +1,4 @@
1
- /** Shared install progress events for CloakBrowser and Playwright Chromium. */
1
+ /** Playwright Chromium installation progress. */
2
2
  export type BrowserInstallPhase = 'starting' | 'downloading' | 'verifying' | 'extracting' | 'running' | 'ready';
3
3
  export type BrowserInstallProgress = {
4
4
  phase: BrowserInstallPhase;
@@ -0,0 +1,2 @@
1
+ import type { BrowserObservation } from '@xopcai/browser-control-contract';
2
+ export declare function formatBrowserObservation(observation: BrowserObservation): string;
@@ -0,0 +1,26 @@
1
+ //#region src/browser/observation/format.ts
2
+ function formatBrowserObservation(observation) {
3
+ const lines = [
4
+ `Session: ${observation.sessionId}`,
5
+ `Tab: ${observation.tabId}`,
6
+ `Revision: ${observation.revision}`,
7
+ `URL: ${observation.url}`,
8
+ `Title: ${observation.title}`
9
+ ];
10
+ if (observation.nodes.length === 0) lines.push("Interactive elements: none");
11
+ else {
12
+ lines.push("Interactive elements:");
13
+ for (const node of observation.nodes) lines.push(formatNode(node));
14
+ }
15
+ const { added, changed, removed } = observation.changes;
16
+ if (added.length || changed.length || removed.length) lines.push(`Changes: +${added.length} ~${changed.length} -${removed.length}`);
17
+ if (observation.visual) lines.push("Visual screenshot attached.");
18
+ return lines.join("\n");
19
+ }
20
+ function formatNode(node) {
21
+ const state = node.states.length ? ` [${node.states.join(",")}]` : "";
22
+ const value = node.value ? ` value=${JSON.stringify(node.value)}` : "";
23
+ return `- ${node.ref} ${node.role} ${JSON.stringify(node.name)}${value}${state}`;
24
+ }
25
+ //#endregion
26
+ export { formatBrowserObservation };
@@ -0,0 +1,17 @@
1
+ import type { BrowserActionInput, BrowserRiskLevel } from '@xopcai/browser-control-contract';
2
+ export type BrowserApprovalStatus = 'pending' | 'approved' | 'denied' | 'consumed' | 'expired';
3
+ export interface BrowserApproval {
4
+ id: string;
5
+ sessionKey: string;
6
+ risk: BrowserRiskLevel;
7
+ action: BrowserActionInput['action'];
8
+ summary: string;
9
+ argumentsHash: string;
10
+ status: BrowserApprovalStatus;
11
+ createdAt: string;
12
+ expiresAt: string;
13
+ }
14
+ export declare function createBrowserApproval(sessionKey: string, input: BrowserActionInput, risk: BrowserRiskLevel, summary: string): BrowserApproval;
15
+ export declare function listBrowserApprovals(sessionKey?: string): BrowserApproval[];
16
+ export declare function decideBrowserApproval(id: string, decision: 'approved' | 'denied'): BrowserApproval | undefined;
17
+ export declare function consumeBrowserApproval(id: string | undefined, sessionKey: string, input: BrowserActionInput): boolean;
@@ -0,0 +1,62 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ //#region src/browser/policy/approval-store.ts
3
+ const TTL_MS = 600 * 1e3;
4
+ const approvals = /* @__PURE__ */ new Map();
5
+ function createBrowserApproval(sessionKey, input, risk, summary) {
6
+ expireApprovals();
7
+ const argumentsHash = browserArgumentsHash(input);
8
+ const existing = [...approvals.values()].find((approval) => approval.sessionKey === sessionKey && approval.argumentsHash === argumentsHash && approval.status === "pending");
9
+ if (existing) return existing;
10
+ const now = Date.now();
11
+ const approval = {
12
+ id: randomUUID(),
13
+ sessionKey,
14
+ risk,
15
+ action: input.action,
16
+ summary,
17
+ argumentsHash,
18
+ status: "pending",
19
+ createdAt: new Date(now).toISOString(),
20
+ expiresAt: new Date(now + TTL_MS).toISOString()
21
+ };
22
+ approvals.set(approval.id, approval);
23
+ return approval;
24
+ }
25
+ function listBrowserApprovals(sessionKey) {
26
+ expireApprovals();
27
+ return [...approvals.values()].filter((approval) => !sessionKey || approval.sessionKey === sessionKey).sort((left, right) => right.createdAt.localeCompare(left.createdAt));
28
+ }
29
+ function decideBrowserApproval(id, decision) {
30
+ expireApprovals();
31
+ const approval = approvals.get(id);
32
+ if (!approval || approval.status !== "pending") return approval;
33
+ approval.status = decision;
34
+ return approval;
35
+ }
36
+ function consumeBrowserApproval(id, sessionKey, input) {
37
+ expireApprovals();
38
+ const argumentsHash = browserArgumentsHash(input);
39
+ const approval = id ? approvals.get(id) : [...approvals.values()].find((candidate) => candidate.sessionKey === sessionKey && candidate.argumentsHash === argumentsHash && candidate.status === "approved");
40
+ if (!approval || approval.status !== "approved") return false;
41
+ if (approval.sessionKey !== sessionKey || approval.argumentsHash !== argumentsHash) return false;
42
+ approval.status = "consumed";
43
+ return true;
44
+ }
45
+ function browserArgumentsHash(input) {
46
+ const canonical = {
47
+ ...input,
48
+ approvalId: void 0
49
+ };
50
+ return createHash("sha256").update(JSON.stringify(sortRecursively(canonical))).digest("hex");
51
+ }
52
+ function sortRecursively(value) {
53
+ if (Array.isArray(value)) return value.map(sortRecursively);
54
+ if (!value || typeof value !== "object") return value;
55
+ return Object.fromEntries(Object.entries(value).filter(([, child]) => child !== void 0).sort(([left], [right]) => left.localeCompare(right)).map(([key, child]) => [key, sortRecursively(child)]));
56
+ }
57
+ function expireApprovals() {
58
+ const now = Date.now();
59
+ for (const approval of approvals.values()) if ((approval.status === "pending" || approval.status === "approved") && Date.parse(approval.expiresAt) <= now) approval.status = "expired";
60
+ }
61
+ //#endregion
62
+ export { consumeBrowserApproval, createBrowserApproval, decideBrowserApproval, listBrowserApprovals };
@@ -0,0 +1,3 @@
1
+ import type { BrowserActionInput, BrowserNode, BrowserRiskLevel } from '@xopcai/browser-control-contract';
2
+ export declare function classifyBrowserRisk(input: BrowserActionInput, target?: BrowserNode): BrowserRiskLevel;
3
+ export declare function browserRiskNeedsApproval(risk: BrowserRiskLevel): boolean;
@@ -0,0 +1,27 @@
1
+ //#region src/browser/policy/browser-policy.ts
2
+ const DESTRUCTIVE_PATTERN = /\b(delete|remove|erase|destroy|cancel subscription|关闭账户|删除|移除|注销)\b/i;
3
+ const EXTERNAL_EFFECT_PATTERN = /\b(send|submit|publish|post|pay|buy|purchase|confirm|发送|提交|发布|支付|购买|确认)\b/i;
4
+ function classifyBrowserRisk(input, target) {
5
+ if (input.action === "upload") return "sensitive";
6
+ if (input.action === "fill") {
7
+ if (target?.states.includes("sensitive")) return "sensitive";
8
+ if (input.submit) return "external_effect";
9
+ return "draft";
10
+ }
11
+ if (input.action === "press") {
12
+ if (input.key === "Enter" && target?.states.includes("submit")) return "external_effect";
13
+ return "draft";
14
+ }
15
+ if (input.action === "select" || input.action === "scroll") return "draft";
16
+ if (input.action !== "click") return "read";
17
+ const label = `${target?.role ?? ""} ${target?.name ?? ""} ${target?.description ?? ""}`;
18
+ if (DESTRUCTIVE_PATTERN.test(label)) return "destructive";
19
+ if (target?.states.includes("submit")) return "external_effect";
20
+ if (EXTERNAL_EFFECT_PATTERN.test(label)) return "external_effect";
21
+ return "draft";
22
+ }
23
+ function browserRiskNeedsApproval(risk) {
24
+ return risk === "external_effect" || risk === "destructive" || risk === "sensitive";
25
+ }
26
+ //#endregion
27
+ export { browserRiskNeedsApproval, classifyBrowserRisk };
@@ -56,7 +56,7 @@ export declare function ensureBrowserExtensionArtifacts(opts?: {
56
56
  force?: boolean;
57
57
  cacheDir?: string;
58
58
  }): Promise<EnsureBrowserExtResult>;
59
- /** Gateway startup hook: ensure artifacts only while the extension backend is active. */
59
+ /** Gateway startup hook: ensure artifacts only while the extension driver is active. */
60
60
  export declare function ensureBrowserExtensionOnStartup(config: Config | undefined): Promise<void>;
61
61
  export declare function readInstalledExtensionDir(cacheDir?: string): Promise<string | null>;
62
62
  export type BrowserExtensionOpenAction = 'chrome' | 'folder' | 'both';