@xopcai/xopc 0.0.251 → 0.0.252

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 (329) 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/xopc.extension.json +1 -1
  6. package/dist/gateway/static/root/assets/{activity-store-DfBjTSo9.js → activity-store-w3eq3YpP.js} +1 -1
  7. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-Bo_dmLv8.js → agent-avatar-dicebear-k039rbUz.js} +1 -1
  8. package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-kILWelNb.js → agent-defaults-settings-panel-D4J4oq8p.js} +1 -1
  9. package/dist/gateway/static/root/assets/{agents-yuUn8n-f.js → agents-Bmth_bSQ.js} +1 -1
  10. package/dist/gateway/static/root/assets/{api-zxpcJfgj.js → api-2joIfbrH.js} +1 -1
  11. package/dist/gateway/static/root/assets/{app-management-settings-panel-Cz56nrVF.js → app-management-settings-panel-ByJ4kiD0.js} +1 -1
  12. package/dist/gateway/static/root/assets/{appearance-settings-DxSws5U4.js → appearance-settings-BK2Jga-B.js} +1 -1
  13. package/dist/gateway/static/root/assets/apps-page-B3ky7cWU.js +1 -0
  14. package/dist/gateway/static/root/assets/{archive-plugin-7k15-hqo.js → archive-plugin-DMDKtYpi.js} +1 -1
  15. package/dist/gateway/static/root/assets/{attachment-load-B-SFpjd9.js → attachment-load-B764Ql3Z.js} +1 -1
  16. package/dist/gateway/static/root/assets/{automations-page-Qy36j19q.js → automations-page-D-sO8CZe.js} +1 -1
  17. package/dist/gateway/static/root/assets/automations-workspace-Ds5-_-9z.js +6 -0
  18. package/dist/gateway/static/root/assets/{binary-plugins-CPOZQt8F.js → binary-plugins-fxtzYRpv.js} +1 -1
  19. package/dist/gateway/static/root/assets/{block-editor-DhvVlIp9.js → block-editor-Bcjtvckh.js} +3 -3
  20. package/dist/gateway/static/root/assets/browser-automation-inputs-BSmnusjD.js +1 -0
  21. package/dist/gateway/static/root/assets/browser-automations-page-DC_OQIBk.js +3 -0
  22. package/dist/gateway/static/root/assets/browser-settings-page-C1FojyG6.js +3 -0
  23. package/dist/gateway/static/root/assets/capabilities-settings-panel-Bs59UCut.js +7 -0
  24. package/dist/gateway/static/root/assets/channels-settings-CM9vNmoo.js +1 -0
  25. package/dist/gateway/static/root/assets/{channels-status-swr-CX-yWwLD.js → channels-status-swr-BuWjIG_a.js} +1 -1
  26. package/dist/gateway/static/root/assets/{chat-terminal-dock-1PJoxRuV.js → chat-terminal-dock-5SevEo_I.js} +2 -2
  27. package/dist/gateway/static/root/assets/connectors-page-BPZ44D-V.js +2 -0
  28. package/dist/gateway/static/root/assets/{cron-expression-CBCc6zFA.js → cron-expression-DtsfalBM.js} +1 -1
  29. package/dist/gateway/static/root/assets/{date-picker-u8K5Kt_N.js → date-picker-tDEQV5TP.js} +1 -1
  30. package/dist/gateway/static/root/assets/{dependency-picker-y_i_cnpz.js → dependency-picker-HhNwg0Y2.js} +1 -1
  31. package/dist/gateway/static/root/assets/{desktop-pet-DyL0JxLm.js → desktop-pet-acU4Li-C.js} +1 -1
  32. package/dist/gateway/static/root/assets/{desktop-pet-settings-d2d_IsyP.js → desktop-pet-settings-R84AR0Pe.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-debug-page-DqIBKJwl.js → extension-debug-page-CrLlRkSN.js} +1 -1
  34. package/dist/gateway/static/root/assets/{extension-page-DUW1xxj2.js → extension-page-BH5lmZXE.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-settings-page-BHY9qaNw.js → extension-settings-page-BscjNAd1.js} +1 -1
  36. package/dist/gateway/static/root/assets/{gateway-config-swr-CMNbl0FZ.js → gateway-config-swr-9HidFZUd.js} +1 -1
  37. package/dist/gateway/static/root/assets/gateway-settings-BxLcW6ij.js +1 -0
  38. package/dist/gateway/static/root/assets/{gateway-startup-retry-CR7Xg8As.js → gateway-startup-retry-DRCPXONr.js} +1 -1
  39. package/dist/gateway/static/root/assets/{heartbeat-settings-7CD9iPR7.js → heartbeat-settings-K5Zhl2rx.js} +1 -1
  40. package/dist/gateway/static/root/assets/home-page-CZAg9RBv.js +1 -0
  41. package/dist/gateway/static/root/assets/{image-generation-api-C5mn73ca.js → image-generation-api-CR6Kle8H.js} +1 -1
  42. package/dist/gateway/static/root/assets/index-D4Ykja-U.js +72 -0
  43. package/dist/gateway/static/root/assets/index-zIJ3AXgR.css +2 -0
  44. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BtlqMleF.js → keyboard-shortcuts-settings-B1QR49-7.js} +1 -1
  45. package/dist/gateway/static/root/assets/{local-app-workbench-page-BjxfkjxE.js → local-app-workbench-page-wicoV-ti.js} +2 -2
  46. package/dist/gateway/static/root/assets/{local-apps-page-B7xqQe2s.js → local-apps-page-C74It-T8.js} +1 -1
  47. package/dist/gateway/static/root/assets/{locale-store-CF4erhjB.js → locale-store-BfZGZKSs.js} +1 -1
  48. package/dist/gateway/static/root/assets/{logs-page-kACaPZKL.js → logs-page-xX-7S49A.js} +2 -2
  49. package/dist/gateway/static/root/assets/{management-settings-A432siER.js → management-settings-1kNnYL97.js} +1 -1
  50. package/dist/gateway/static/root/assets/{markdown-view-CQvzsE24.js → markdown-view-DjiwT28p.js} +2 -2
  51. package/dist/gateway/static/root/assets/{media-plugins-CpvYiauZ.js → media-plugins-B5c0AoS1.js} +1 -1
  52. package/dist/gateway/static/root/assets/messages-DaIwVWar.js +3 -0
  53. package/dist/gateway/static/root/assets/{mobile-pairing-wizard-DyjVGngO.js → mobile-pairing-wizard-CsIZqK51.js} +1 -1
  54. package/dist/gateway/static/root/assets/note-detail-panel-CfWxopl4.js +5 -0
  55. package/dist/gateway/static/root/assets/notes-page-CYN-LCHJ.js +8 -0
  56. package/dist/gateway/static/root/assets/{page-tabs-B3FKzjR6.js → page-tabs-CqJN6Ljz.js} +1 -1
  57. package/dist/gateway/static/root/assets/{preview-open-alternatives-DnjrwAHD.js → preview-open-alternatives-DqRIGxf4.js} +1 -1
  58. package/dist/gateway/static/root/assets/{product-open-page-COcr_NUJ.js → product-open-page-DE2nPE_K.js} +1 -1
  59. package/dist/gateway/static/root/assets/project-detail-page-B5G3LzDq.js +1 -0
  60. package/dist/gateway/static/root/assets/{projects-page-BzH8pjEz.js → projects-page-CuVK2mKu.js} +1 -1
  61. package/dist/gateway/static/root/assets/{registry-api-BsRBlji7.js → registry-api-Bpy8XX-5.js} +1 -1
  62. package/dist/gateway/static/root/assets/remote-access-hub-Dnd73xWt.js +1 -0
  63. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-LO4wZ_dO.js → runtime-tools-settings-panel-Bb4b74-P.js} +2 -2
  64. package/dist/gateway/static/root/assets/{schema-form-crcj4-Pm.js → schema-form-DoPU5j3J.js} +1 -1
  65. package/dist/gateway/static/root/assets/sessions-page-XL4LyKZe.js +1 -0
  66. package/dist/gateway/static/root/assets/settings-advanced-gate-0ForzDSS.js +1 -0
  67. package/dist/gateway/static/root/assets/{settings-form-section-Bl4MvTmq.js → settings-form-section-Ci-9WajJ.js} +1 -1
  68. package/dist/gateway/static/root/assets/{settings-page-DplrjZ6x.js → settings-page-CL_2F95D.js} +1 -1
  69. package/dist/gateway/static/root/assets/setup-status-panel-DVws6XZc.js +1 -0
  70. package/dist/gateway/static/root/assets/{share-preview-page-CJP1kURj.js → share-preview-page-XUA3oKQX.js} +1 -1
  71. package/dist/gateway/static/root/assets/shares-settings-BwDvcacF.js +1 -0
  72. package/dist/gateway/static/root/assets/skill-reload-api-BJjrATqE.js +1 -0
  73. package/dist/gateway/static/root/assets/{skills-page-DsjcKg9Q.js → skills-page-sXXAZDc9.js} +1 -1
  74. package/dist/gateway/static/root/assets/{skills-page.utils-D6gWBbvy.js → skills-page.utils-DD79Bl1I.js} +1 -1
  75. package/dist/gateway/static/root/assets/{system-settings-panel-_eCXfqCo.js → system-settings-panel-BEH64qBV.js} +1 -1
  76. package/dist/gateway/static/root/assets/task-detail-page-0jxMi75O.js +1 -0
  77. package/dist/gateway/static/root/assets/{theme-store-BOgkc_9D.js → theme-store-CISSxU1c.js} +1 -1
  78. package/dist/gateway/static/root/assets/{tunnel-api-W5mktxl1.js → tunnel-api-DrKDhnJm.js} +1 -1
  79. package/dist/gateway/static/root/assets/{use-autosave-Na2DYzT3.js → use-autosave-CPYePL-Q.js} +1 -1
  80. package/dist/gateway/static/root/assets/user-model-page-B6zLDfDl.js +2 -0
  81. package/dist/gateway/static/root/assets/{voice-api-key-field-OXweUxS_.js → voice-api-key-field-DKqzrCXx.js} +1 -1
  82. package/dist/gateway/static/root/assets/{voice-config-api-C-ryeIxj.js → voice-config-api-e9xWjwBX.js} +1 -1
  83. package/dist/gateway/static/root/assets/{work-discovery-overlay-BqOsO47I.js → work-discovery-overlay-kTQug6bq.js} +1 -1
  84. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-B9S_lfT1.js → workflow-run-setup-panel-m9SKj_GT.js} +2 -2
  85. package/dist/gateway/static/root/assets/workflows-page-Bcd1XqP7.js +5 -0
  86. package/dist/gateway/static/root/index.html +10 -10
  87. package/dist/package.js +1 -1
  88. package/dist/packages/gateway-contract/src/new-session.js +9 -0
  89. package/dist/src/agent/agent-manager.d.ts +2 -1
  90. package/dist/src/agent/agent-manager.js +6 -5
  91. package/dist/src/agent/background-review/run-background-review.js +1 -1
  92. package/dist/src/agent/coding/repository-instructions.js +2 -2
  93. package/dist/src/agent/coding/workspace-revision.js +2 -2
  94. package/dist/src/agent/commands/command-isolation.js +2 -2
  95. package/dist/src/agent/embedded/model-runtime.js +1 -1
  96. package/dist/src/agent/embedded/run-for-session.js +1 -1
  97. package/dist/src/agent/external-tools/composio-provider.d.ts +1 -0
  98. package/dist/src/agent/external-tools/composio-provider.js +64 -34
  99. package/dist/src/agent/external-tools/search-error.js +5 -3
  100. package/dist/src/agent/image/tool-model-config.js +1 -1
  101. package/dist/src/agent/mcp/oauth/mcp-oauth-store.js +1 -1
  102. package/dist/src/agent/service.js +4 -3
  103. package/dist/src/agent/service.types.d.ts +2 -1
  104. package/dist/src/agent/session/session-inspector.js +1 -1
  105. package/dist/src/agent/skills/hub-lock.js +1 -1
  106. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js +4 -0
  107. package/dist/src/agent/tasks/task-judge-service.js +3 -3
  108. package/dist/src/agent/tool-manuals/browser.d.ts +1 -1
  109. package/dist/src/agent/tool-manuals/browser.js +15 -226
  110. package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +4 -21
  111. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +48 -165
  112. package/dist/src/agent/tools/browser/tool/schemas.d.ts +203 -16
  113. package/dist/src/agent/tools/browser/tool/schemas.js +146 -16
  114. package/dist/src/agent/tools/browser-automation-tool.d.ts +121 -0
  115. package/dist/src/agent/tools/browser-automation-tool.js +197 -0
  116. package/dist/src/agent/tools/factory.d.ts +6 -9
  117. package/dist/src/agent/tools/factory.js +28 -55
  118. package/dist/src/agent/tools/index.d.ts +2 -2
  119. package/dist/src/agent/tools/index.js +3 -3
  120. package/dist/src/agent/tools/review-workspace.js +2 -2
  121. package/dist/src/ai-assist/text-assist.js +1 -1
  122. package/dist/src/auth/credentials.js +2 -2
  123. package/dist/src/auth/oauth/xopc-cloud.js +3 -1
  124. package/dist/src/auth/profiles/store.js +1 -1
  125. package/dist/src/auth/sync-provider-auth.js +2 -2
  126. package/dist/src/automations/domain/defaults.js +1 -1
  127. package/dist/src/automations/domain/types.d.ts +5 -5
  128. package/dist/src/automations/domain/validation.d.ts +12 -12
  129. package/dist/src/automations/domain/validation.js +3 -3
  130. package/dist/src/automations/draft/automation-draft-validator.d.ts +3 -3
  131. package/dist/src/automations/draft/automation-draft-validator.js +1 -1
  132. package/dist/src/automations/service/action-executor.d.ts +1 -1
  133. package/dist/src/automations/service/action-executor.js +7 -7
  134. package/dist/src/browser/{recipes → automations}/index.d.ts +1 -0
  135. package/dist/src/browser/automations/index.js +4 -0
  136. package/dist/src/browser/automations/repository.d.ts +13 -0
  137. package/dist/src/browser/automations/repository.js +60 -0
  138. package/dist/src/browser/automations/runner.d.ts +17 -0
  139. package/dist/src/browser/automations/runner.js +173 -0
  140. package/dist/src/browser/automations/runtime-service.d.ts +6 -0
  141. package/dist/src/browser/automations/runtime-service.js +37 -0
  142. package/dist/src/browser/automations/schema.d.ts +144 -0
  143. package/dist/src/browser/automations/schema.js +135 -0
  144. package/dist/src/browser/automations/service.d.ts +146 -0
  145. package/dist/src/browser/automations/service.js +168 -0
  146. package/dist/src/browser/automations/types.d.ts +90 -0
  147. package/dist/src/browser/cache-dir-policy.d.ts +1 -1
  148. package/dist/src/browser/cache-dir-policy.js +1 -4
  149. package/dist/src/browser/drivers/browser-driver.d.ts +17 -0
  150. package/dist/src/browser/drivers/create-driver.d.ts +3 -0
  151. package/dist/src/browser/drivers/create-driver.js +84 -0
  152. package/dist/src/browser/drivers/extension-driver.d.ts +20 -0
  153. package/dist/src/browser/drivers/extension-driver.js +47 -0
  154. package/dist/src/browser/drivers/playwright-driver.d.ts +38 -0
  155. package/dist/src/browser/drivers/playwright-driver.js +406 -0
  156. package/dist/src/browser/index.d.ts +10 -15
  157. package/dist/src/browser/index.js +10 -15
  158. package/dist/src/browser/install-lock.d.ts +1 -2
  159. package/dist/src/browser/install-lock.js +3 -9
  160. package/dist/src/browser/install-progress.d.ts +1 -1
  161. package/dist/src/browser/observation/format.d.ts +2 -0
  162. package/dist/src/browser/observation/format.js +26 -0
  163. package/dist/src/browser/policy/approval-store.d.ts +17 -0
  164. package/dist/src/browser/policy/approval-store.js +62 -0
  165. package/dist/src/browser/policy/browser-policy.d.ts +3 -0
  166. package/dist/src/browser/policy/browser-policy.js +27 -0
  167. package/dist/src/browser/providers/browser-ext-install.d.ts +1 -1
  168. package/dist/src/browser/providers/browser-ext-install.js +4 -6
  169. package/dist/src/browser/providers/browser-use.js +1 -1
  170. package/dist/src/browser/providers/browserbase.js +1 -1
  171. package/dist/src/browser/providers/extension-ws-acquire.d.ts +1 -4
  172. package/dist/src/browser/providers/extension-ws-acquire.js +1 -13
  173. package/dist/src/browser/providers/extension.d.ts +3 -22
  174. package/dist/src/browser/providers/extension.js +7 -15
  175. package/dist/src/browser/providers/index.d.ts +2 -2
  176. package/dist/src/browser/providers/index.js +3 -3
  177. package/dist/src/browser/providers/types.d.ts +0 -94
  178. package/dist/src/browser/readiness.d.ts +4 -22
  179. package/dist/src/browser/readiness.js +55 -118
  180. package/dist/src/browser/runtime/browser-runtime.d.ts +30 -0
  181. package/dist/src/browser/runtime/browser-runtime.js +362 -0
  182. package/dist/src/browser/url-policy.d.ts +3 -3
  183. package/dist/src/browser/url-policy.js +7 -6
  184. package/dist/src/browser/verification/expectation.d.ts +2 -0
  185. package/dist/src/browser/verification/expectation.js +17 -0
  186. package/dist/src/cli/command-loaders.js +1 -0
  187. package/dist/src/cli/command-manifest.js +5 -1
  188. package/dist/src/cli/commands/browser-cli-helpers.d.ts +0 -6
  189. package/dist/src/cli/commands/browser-cli-helpers.js +11 -144
  190. package/dist/src/cli/commands/browser.d.ts +0 -5
  191. package/dist/src/cli/commands/browser.js +11 -152
  192. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  193. package/dist/src/cli/commands/doctor/checks/node-version.js +25 -9
  194. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  195. package/dist/src/cli/commands/models.js +1 -1
  196. package/dist/src/cli/commands/platform.d.ts +1 -0
  197. package/dist/src/cli/commands/platform.js +111 -0
  198. package/dist/src/config/index.js +4 -4
  199. package/dist/src/config/loader.js +10 -4
  200. package/dist/src/config/models-json.js +1 -1
  201. package/dist/src/config/schema.d.ts +131 -84
  202. package/dist/src/config/schema.js +112 -59
  203. package/dist/src/connectors/composio-sessions.js +1 -3
  204. package/dist/src/extensions/lockfile.js +1 -1
  205. package/dist/src/extensions/marketplace.js +4 -0
  206. package/dist/src/gateway/agents-admin.js +1 -1
  207. package/dist/src/gateway/file-path-classifier.js +1 -1
  208. package/dist/src/gateway/heartbeat/service.js +1 -1
  209. package/dist/src/gateway/hono/lib/config-payload.d.ts +12 -26
  210. package/dist/src/gateway/hono/lib/config-payload.js +11 -40
  211. package/dist/src/gateway/hono/routes/browser-automations.d.ts +3 -0
  212. package/dist/src/gateway/hono/routes/browser-automations.js +77 -0
  213. package/dist/src/gateway/hono/routes/browser-install.js +0 -32
  214. package/dist/src/gateway/hono/routes/browser.d.ts +0 -17
  215. package/dist/src/gateway/hono/routes/browser.js +46 -568
  216. package/dist/src/gateway/hono/routes/config-patch/misc.js +8 -1
  217. package/dist/src/gateway/hono/routes/config.js +0 -11
  218. package/dist/src/gateway/hono/routes/lazy-bundles.js +5 -5
  219. package/dist/src/gateway/hono/routes/models.js +1 -1
  220. package/dist/src/gateway/service/config-coordinator.js +1 -1
  221. package/dist/src/gateway/service.d.ts +4 -6
  222. package/dist/src/gateway/service.js +24 -27
  223. package/dist/src/heartbeat/index.js +1 -1
  224. package/dist/src/platform/client.d.ts +121 -0
  225. package/dist/src/platform/client.js +108 -0
  226. package/dist/src/platform/contracts.d.ts +194 -0
  227. package/dist/src/platform/contracts.js +150 -0
  228. package/dist/src/platform/index.d.ts +4 -0
  229. package/dist/src/platform/index.js +9 -0
  230. package/dist/src/platform/resolution.d.ts +4 -0
  231. package/dist/src/platform/resolution.js +16 -0
  232. package/dist/src/platform/worker.d.ts +6 -0
  233. package/dist/src/platform/worker.js +75 -0
  234. package/dist/src/providers/auth-runtime/resolve-auth.js +1 -1
  235. package/dist/src/providers/index.js +2 -2
  236. package/dist/src/providers/model-registry.js +1 -1
  237. package/dist/src/providers/register-runtime-providers.js +1 -1
  238. package/dist/src/providers/xopc-cloud-config.js +3 -1
  239. package/dist/src/session/session-context-for-llm.js +41 -1
  240. package/dist/src/share/hosted-session-share.js +3 -1
  241. package/dist/src/share/share-thumbnail.js +1 -1
  242. package/dist/src/storage/sqlite/migrations/153_browser_control_v2.sql +45 -0
  243. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  244. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  245. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  246. package/dist/src/storage/sqlite/schema.js +1 -1
  247. package/dist/src/storage/sqlite/schema.sql +16 -20
  248. package/dist/src/tasks/home-query-service.js +1 -1
  249. package/dist/src/tui/tui-startup-resources.js +1 -1
  250. package/dist/src/tui/tui.js +1 -1
  251. package/dist/src/tunnel/env.js +3 -1
  252. package/dist/src/work-discovery/service.js +1 -1
  253. package/dist/src/workflows/service/workflow-run-service.js +1 -1
  254. package/package.json +6 -6
  255. package/dist/gateway/static/root/assets/apps-page-BnizTdgs.js +0 -1
  256. package/dist/gateway/static/root/assets/automations-workspace-CZRKqSqY.js +0 -6
  257. package/dist/gateway/static/root/assets/browser-settings-page-pN5LbChY.js +0 -8
  258. package/dist/gateway/static/root/assets/browser-workflow-inputs-BX1-uM9L.js +0 -1
  259. package/dist/gateway/static/root/assets/browser-workflows-page-C65MI57t.js +0 -3
  260. package/dist/gateway/static/root/assets/capabilities-settings-panel-CJw2e16J.js +0 -7
  261. package/dist/gateway/static/root/assets/channels-settings-CRgjb4Ck.js +0 -1
  262. package/dist/gateway/static/root/assets/connectors-page-Dcpdy06y.js +0 -2
  263. package/dist/gateway/static/root/assets/gateway-config-api-e3BRcgDx.js +0 -1
  264. package/dist/gateway/static/root/assets/gateway-settings-Cheo0Rkc.js +0 -1
  265. package/dist/gateway/static/root/assets/home-page-DVrTRqNc.js +0 -1
  266. package/dist/gateway/static/root/assets/index-B7CX4Qob.css +0 -2
  267. package/dist/gateway/static/root/assets/index-BHrpyJ4t.js +0 -72
  268. package/dist/gateway/static/root/assets/messages-Cf5hpZE6.js +0 -3
  269. package/dist/gateway/static/root/assets/note-detail-panel-CUd8O4K7.js +0 -5
  270. package/dist/gateway/static/root/assets/notes-page-BLQwd39W.js +0 -8
  271. package/dist/gateway/static/root/assets/project-detail-page-NttW338u.js +0 -1
  272. package/dist/gateway/static/root/assets/remote-access-hub-BxpjSDnL.js +0 -1
  273. package/dist/gateway/static/root/assets/sessions-page-BLMaibOb.js +0 -1
  274. package/dist/gateway/static/root/assets/settings-advanced-gate-BRvvKhoH.js +0 -1
  275. package/dist/gateway/static/root/assets/setup-status-panel-DTOsxQC1.js +0 -1
  276. package/dist/gateway/static/root/assets/shares-settings-CemgzEi4.js +0 -1
  277. package/dist/gateway/static/root/assets/skill-reload-api-BWYanBlQ.js +0 -1
  278. package/dist/gateway/static/root/assets/task-detail-page-D0Z_K5JT.js +0 -1
  279. package/dist/gateway/static/root/assets/user-model-page-B_-SNat-.js +0 -2
  280. package/dist/gateway/static/root/assets/workflows-page-CNOT2Coo.js +0 -5
  281. package/dist/src/agent/tools/browser-recipe-tool.d.ts +0 -12
  282. package/dist/src/agent/tools/browser-recipe-tool.js +0 -113
  283. package/dist/src/browser/actions/extension-registry-bridge.d.ts +0 -5
  284. package/dist/src/browser/actions/extension-registry-bridge.js +0 -312
  285. package/dist/src/browser/actions/registry.d.ts +0 -5
  286. package/dist/src/browser/actions/registry.js +0 -741
  287. package/dist/src/browser/actions/types.d.ts +0 -65
  288. package/dist/src/browser/backend-from-config.d.ts +0 -22
  289. package/dist/src/browser/backend-from-config.js +0 -99
  290. package/dist/src/browser/browser-command-timeout.d.ts +0 -2
  291. package/dist/src/browser/browser-command-timeout.js +0 -11
  292. package/dist/src/browser/cdp-local-launcher.d.ts +0 -35
  293. package/dist/src/browser/cdp-local-launcher.js +0 -154
  294. package/dist/src/browser/cdp-supervisor.d.ts +0 -58
  295. package/dist/src/browser/cdp-supervisor.js +0 -133
  296. package/dist/src/browser/humanize.d.ts +0 -80
  297. package/dist/src/browser/humanize.js +0 -363
  298. package/dist/src/browser/manager.d.ts +0 -50
  299. package/dist/src/browser/manager.js +0 -251
  300. package/dist/src/browser/pipeline/output.d.ts +0 -35
  301. package/dist/src/browser/pipeline/output.js +0 -74
  302. package/dist/src/browser/pipeline/runner.d.ts +0 -27
  303. package/dist/src/browser/pipeline/runner.js +0 -453
  304. package/dist/src/browser/pipeline/schema.d.ts +0 -42
  305. package/dist/src/browser/pipeline/schema.js +0 -116
  306. package/dist/src/browser/pipeline/template.d.ts +0 -30
  307. package/dist/src/browser/pipeline/template.js +0 -112
  308. package/dist/src/browser/providers/cloakbrowser.d.ts +0 -83
  309. package/dist/src/browser/providers/cloakbrowser.js +0 -612
  310. package/dist/src/browser/recipes/index.js +0 -3
  311. package/dist/src/browser/recipes/repository.d.ts +0 -13
  312. package/dist/src/browser/recipes/repository.js +0 -81
  313. package/dist/src/browser/recipes/runtime-service.d.ts +0 -6
  314. package/dist/src/browser/recipes/runtime-service.js +0 -30
  315. package/dist/src/browser/recipes/service.d.ts +0 -36
  316. package/dist/src/browser/recipes/service.js +0 -186
  317. package/dist/src/browser/recipes/types.d.ts +0 -36
  318. package/dist/src/browser/schemas.d.ts +0 -53
  319. package/dist/src/browser/schemas.js +0 -68
  320. package/dist/src/browser/session-lifecycle.d.ts +0 -40
  321. package/dist/src/browser/session-lifecycle.js +0 -136
  322. package/dist/src/browser/snapshot-helpers.d.ts +0 -24
  323. package/dist/src/browser/snapshot-helpers.js +0 -70
  324. package/dist/src/browser/stealth.d.ts +0 -46
  325. package/dist/src/browser/stealth.js +0 -163
  326. package/dist/src/gateway/hono/routes/browser-workflows.d.ts +0 -3
  327. package/dist/src/gateway/hono/routes/browser-workflows.js +0 -78
  328. /package/dist/src/browser/{actions → automations}/types.js +0 -0
  329. /package/dist/src/browser/{recipes/types.js → drivers/browser-driver.js} +0 -0
@@ -1,363 +0,0 @@
1
- //#region src/browser/humanize.ts
2
- const DEFAULT_CONFIG = {
3
- typingDelayMs: 70,
4
- typingDelaySpreadMs: 40,
5
- typingPauseChance: .1,
6
- typingPauseRangeMs: [400, 1e3],
7
- keyHoldMs: [15, 35],
8
- mouseStepsDivisor: 8,
9
- mouseMinSteps: 25,
10
- mouseMaxSteps: 80,
11
- mouseWobbleMax: 1.5,
12
- mouseOvershootChance: .15,
13
- mouseOvershootPx: [3, 6],
14
- mouseBurstSize: [3, 5],
15
- mouseBurstPauseMs: [8, 18],
16
- clickAimDelayMs: [60, 140],
17
- clickHoldMs: [40, 100],
18
- clickInputXRange: [.05, .3],
19
- scrollDeltaBase: [80, 130],
20
- scrollDeltaVariance: .2,
21
- scrollPauseFastMs: [30, 80],
22
- scrollPauseSlowMs: [80, 200],
23
- scrollAccelSteps: [2, 3],
24
- scrollDecelSteps: [2, 3],
25
- scrollOvershootChance: .1,
26
- scrollOvershootPx: [50, 150],
27
- scrollSettleDelayMs: [300, 600],
28
- initialCursorX: [400, 700],
29
- initialCursorY: [45, 60]
30
- };
31
- const CAREFUL_CONFIG = {
32
- ...DEFAULT_CONFIG,
33
- typingDelayMs: 100,
34
- typingDelaySpreadMs: 50,
35
- typingPauseChance: .15,
36
- typingPauseRangeMs: [500, 1200],
37
- keyHoldMs: [20, 45],
38
- mouseBurstPauseMs: [12, 25],
39
- clickAimDelayMs: [80, 200],
40
- clickHoldMs: [60, 150],
41
- scrollPauseFastMs: [100, 200],
42
- scrollPauseSlowMs: [250, 600],
43
- scrollSettleDelayMs: [400, 800]
44
- };
45
- function resolveHumanConfig(preset = "default") {
46
- return preset === "careful" ? { ...CAREFUL_CONFIG } : { ...DEFAULT_CONFIG };
47
- }
48
- function randRange(min, max) {
49
- return min + Math.random() * (max - min);
50
- }
51
- function randInt(min, max) {
52
- return Math.floor(randRange(min, max + 1));
53
- }
54
- function easeInOut(t) {
55
- return (1 - Math.cos(Math.PI * t)) / 2;
56
- }
57
- function bezier(p0, p1, p2, p3, t) {
58
- const u = 1 - t;
59
- const tt = t * t;
60
- const uu = u * u;
61
- const uuu = uu * u;
62
- const ttt = tt * t;
63
- return {
64
- x: uuu * p0.x + 3 * uu * t * p1.x + 3 * u * tt * p2.x + ttt * p3.x,
65
- y: uuu * p0.y + 3 * uu * t * p1.y + 3 * u * tt * p2.y + ttt * p3.y
66
- };
67
- }
68
- /** Generate a human-like mouse path from start to end using cubic Bezier with wobble. */
69
- function generateMousePath(start, end, cfg) {
70
- const dx = end.x - start.x;
71
- const dy = end.y - start.y;
72
- const distance = Math.sqrt(dx * dx + dy * dy);
73
- const steps = Math.min(cfg.mouseMaxSteps, Math.max(cfg.mouseMinSteps, Math.round(distance / cfg.mouseStepsDivisor)));
74
- const cp1 = {
75
- x: start.x + dx * randRange(.2, .4) + randRange(-30, 30),
76
- y: start.y + dy * randRange(0, .3) + randRange(-30, 30)
77
- };
78
- const cp2 = {
79
- x: start.x + dx * randRange(.6, .8) + randRange(-30, 30),
80
- y: start.y + dy * randRange(.7, 1) + randRange(-30, 30)
81
- };
82
- const path = [];
83
- for (let i = 0; i <= steps; i++) {
84
- const raw = i / steps;
85
- const pt = bezier(start, cp1, cp2, end, easeInOut(raw));
86
- const wobble = cfg.mouseWobbleMax * (1 - raw);
87
- pt.x += randRange(-wobble, wobble);
88
- pt.y += randRange(-wobble, wobble);
89
- path.push(pt);
90
- }
91
- if (Math.random() < cfg.mouseOvershootChance) {
92
- const overshootPx = randRange(cfg.mouseOvershootPx[0], cfg.mouseOvershootPx[1]);
93
- const angle = Math.atan2(dy, dx);
94
- path.push({
95
- x: end.x + Math.cos(angle) * overshootPx,
96
- y: end.y + Math.sin(angle) * overshootPx
97
- });
98
- path.push({
99
- x: end.x + randRange(-1, 1),
100
- y: end.y + randRange(-1, 1)
101
- });
102
- }
103
- return path;
104
- }
105
- /** Generate a plan of typing actions for a given text. */
106
- function generateTypingPlan(text, cfg) {
107
- const actions = [];
108
- const chars = [...text];
109
- for (let i = 0; i < chars.length; i++) {
110
- const hold = randRange(cfg.keyHoldMs[0], cfg.keyHoldMs[1]);
111
- actions.push({
112
- kind: "char",
113
- ch: chars[i],
114
- holdMs: hold
115
- });
116
- if (i < chars.length - 1) if (Math.random() < cfg.typingPauseChance) {
117
- const pause = randRange(cfg.typingPauseRangeMs[0], cfg.typingPauseRangeMs[1]);
118
- actions.push({
119
- kind: "pause",
120
- ms: pause
121
- });
122
- } else {
123
- const delay = cfg.typingDelayMs + (Math.random() - .5) * 2 * cfg.typingDelaySpreadMs;
124
- actions.push({
125
- kind: "delay",
126
- ms: Math.max(10, delay)
127
- });
128
- }
129
- }
130
- return actions;
131
- }
132
- /** Generate a scroll plan to move totalDelta pixels vertically. */
133
- function generateScrollPlan(totalDelta, cfg) {
134
- const direction = totalDelta > 0 ? 1 : -1;
135
- const absDistance = Math.abs(totalDelta);
136
- const avgDelta = (cfg.scrollDeltaBase[0] + cfg.scrollDeltaBase[1]) / 2;
137
- const totalClicks = Math.max(3, Math.ceil(absDistance / avgDelta));
138
- const accelSteps = randInt(cfg.scrollAccelSteps[0], cfg.scrollAccelSteps[1]);
139
- const decelSteps = randInt(cfg.scrollDecelSteps[0], cfg.scrollDecelSteps[1]);
140
- const actions = [];
141
- let scrolled = 0;
142
- for (let i = 0; i < totalClicks; i++) {
143
- if (scrolled >= absDistance) break;
144
- let delta;
145
- let pause;
146
- if (i < accelSteps) {
147
- delta = randRange(60, 100);
148
- pause = randRange(cfg.scrollPauseSlowMs[0], cfg.scrollPauseSlowMs[1]);
149
- } else if (i >= totalClicks - decelSteps) {
150
- delta = randRange(50, 90);
151
- pause = randRange(cfg.scrollPauseSlowMs[0], cfg.scrollPauseSlowMs[1]);
152
- } else {
153
- delta = randRange(cfg.scrollDeltaBase[0], cfg.scrollDeltaBase[1]);
154
- pause = randRange(cfg.scrollPauseFastMs[0], cfg.scrollPauseFastMs[1]);
155
- }
156
- const variance = 1 + (Math.random() - .5) * 2 * cfg.scrollDeltaVariance;
157
- const finalDelta = Math.round(delta * variance * direction);
158
- actions.push({
159
- kind: "wheel",
160
- deltaY: finalDelta
161
- });
162
- actions.push({
163
- kind: "pause",
164
- ms: pause
165
- });
166
- scrolled += delta * variance;
167
- }
168
- if (Math.random() < cfg.scrollOvershootChance) {
169
- const overshoot = Math.round(randRange(cfg.scrollOvershootPx[0], cfg.scrollOvershootPx[1]) * direction);
170
- actions.push({
171
- kind: "wheel",
172
- deltaY: overshoot
173
- });
174
- const settle = randRange(cfg.scrollSettleDelayMs[0], cfg.scrollSettleDelayMs[1]);
175
- actions.push({
176
- kind: "pause",
177
- ms: settle
178
- });
179
- const correction = Math.round(randRange(40, 80) * -direction);
180
- actions.push({
181
- kind: "wheel",
182
- deltaY: correction
183
- });
184
- }
185
- return actions;
186
- }
187
- function clickTarget(bbox, isInput, cfg) {
188
- return {
189
- x: isInput ? bbox.x + bbox.width * randRange(cfg.clickInputXRange[0], cfg.clickInputXRange[1]) : bbox.x + randRange(bbox.width * .15, bbox.width * .85),
190
- y: bbox.y + randRange(bbox.height * .2, bbox.height * .8)
191
- };
192
- }
193
- function sleepMs(ms) {
194
- if (ms <= 0) return Promise.resolve();
195
- return new Promise((resolve) => setTimeout(resolve, Math.round(ms)));
196
- }
197
- async function ensureCdpSession(page) {
198
- return page.context().newCDPSession(page);
199
- }
200
- async function dispatchMouseMove(cdp, x, y) {
201
- await cdp.send("Input.dispatchMouseEvent", {
202
- type: "mouseMoved",
203
- x,
204
- y
205
- });
206
- }
207
- async function dispatchMouseEvent(cdp, eventType, x, y, clickCount) {
208
- await cdp.send("Input.dispatchMouseEvent", {
209
- type: eventType,
210
- x,
211
- y,
212
- button: "left",
213
- clickCount
214
- });
215
- }
216
- async function dispatchWheel(cdp, x, y, deltaY) {
217
- await cdp.send("Input.dispatchMouseEvent", {
218
- type: "mouseWheel",
219
- x,
220
- y,
221
- deltaX: 0,
222
- deltaY
223
- });
224
- }
225
- async function dispatchChar(cdp, ch, holdMs) {
226
- await cdp.send("Input.dispatchKeyEvent", {
227
- type: "keyDown",
228
- key: ch,
229
- text: ch
230
- });
231
- await sleepMs(holdMs);
232
- await cdp.send("Input.dispatchKeyEvent", {
233
- type: "keyUp",
234
- key: ch
235
- });
236
- }
237
- async function dispatchKey(cdp, key, modifiers) {
238
- await cdp.send("Input.dispatchKeyEvent", {
239
- type: "keyDown",
240
- key,
241
- ...modifiers !== void 0 ? { modifiers } : {}
242
- });
243
- await cdp.send("Input.dispatchKeyEvent", {
244
- type: "keyUp",
245
- key,
246
- ...modifiers !== void 0 ? { modifiers } : {}
247
- });
248
- }
249
- async function executeMousePath(cdp, path, cfg) {
250
- const burstSize = randInt(cfg.mouseBurstSize[0], cfg.mouseBurstSize[1]);
251
- let burstCounter = 0;
252
- for (const pt of path) {
253
- await dispatchMouseMove(cdp, pt.x, pt.y);
254
- burstCounter++;
255
- if (burstCounter >= burstSize) {
256
- await sleepMs(randRange(cfg.mouseBurstPauseMs[0], cfg.mouseBurstPauseMs[1]));
257
- burstCounter = 0;
258
- }
259
- }
260
- }
261
- async function getElementBBox(page, selector) {
262
- const bbox = await page.locator(selector).boundingBox();
263
- if (!bbox) throw new Error(`selector not found: ${selector}`);
264
- return bbox;
265
- }
266
- /** Humanized click on a CSS selector. */
267
- async function humanizedClick(page, selector, preset = "default") {
268
- const cfg = resolveHumanConfig(preset);
269
- const cdp = await ensureCdpSession(page);
270
- try {
271
- let cx = randRange(cfg.initialCursorX[0], cfg.initialCursorX[1]);
272
- let cy = randRange(cfg.initialCursorY[0], cfg.initialCursorY[1]);
273
- await dispatchMouseMove(cdp, cx, cy);
274
- const target = clickTarget(await getElementBBox(page, selector), false, cfg);
275
- const path = generateMousePath({
276
- x: cx,
277
- y: cy
278
- }, target, cfg);
279
- await executeMousePath(cdp, path, cfg);
280
- const last = path[path.length - 1];
281
- if (last) {
282
- cx = last.x;
283
- cy = last.y;
284
- }
285
- await sleepMs(randRange(cfg.clickAimDelayMs[0], cfg.clickAimDelayMs[1]));
286
- await dispatchMouseEvent(cdp, "mousePressed", cx, cy, 1);
287
- await sleepMs(randRange(cfg.clickHoldMs[0], cfg.clickHoldMs[1]));
288
- await dispatchMouseEvent(cdp, "mouseReleased", cx, cy, 1);
289
- } finally {
290
- await cdp.detach().catch(() => {});
291
- }
292
- }
293
- /** Humanized fill: click the field, clear, type character by character. */
294
- async function humanizedFill(page, selector, value, preset = "default") {
295
- const cfg = resolveHumanConfig(preset);
296
- const cdp = await ensureCdpSession(page);
297
- try {
298
- let cx = randRange(cfg.initialCursorX[0], cfg.initialCursorX[1]);
299
- let cy = randRange(cfg.initialCursorY[0], cfg.initialCursorY[1]);
300
- await dispatchMouseMove(cdp, cx, cy);
301
- const target = clickTarget(await getElementBBox(page, selector), true, cfg);
302
- const path = generateMousePath({
303
- x: cx,
304
- y: cy
305
- }, target, cfg);
306
- await executeMousePath(cdp, path, cfg);
307
- const last = path[path.length - 1];
308
- if (last) {
309
- cx = last.x;
310
- cy = last.y;
311
- }
312
- await sleepMs(randRange(cfg.clickAimDelayMs[0], cfg.clickAimDelayMs[1]));
313
- await dispatchMouseEvent(cdp, "mousePressed", cx, cy, 1);
314
- await sleepMs(randRange(cfg.clickHoldMs[0], cfg.clickHoldMs[1]));
315
- await dispatchMouseEvent(cdp, "mouseReleased", cx, cy, 1);
316
- await sleepMs(100);
317
- await dispatchKey(cdp, "a", 8);
318
- await sleepMs(50);
319
- await dispatchKey(cdp, "Backspace");
320
- await sleepMs(80);
321
- const plan = generateTypingPlan(value, cfg);
322
- for (const action of plan) if (action.kind === "char") await dispatchChar(cdp, action.ch, action.holdMs);
323
- else await sleepMs(action.ms);
324
- } finally {
325
- await cdp.detach().catch(() => {});
326
- }
327
- }
328
- /** Humanized key press with hold delay. */
329
- async function humanizedPress(page, key, preset = "default") {
330
- const cfg = resolveHumanConfig(preset);
331
- const cdp = await ensureCdpSession(page);
332
- try {
333
- const hold = randRange(cfg.keyHoldMs[0], cfg.keyHoldMs[1]);
334
- await cdp.send("Input.dispatchKeyEvent", {
335
- type: "keyDown",
336
- key
337
- });
338
- await sleepMs(hold);
339
- await cdp.send("Input.dispatchKeyEvent", {
340
- type: "keyUp",
341
- key
342
- });
343
- } finally {
344
- await cdp.detach().catch(() => {});
345
- }
346
- }
347
- /** Humanized scroll by deltaY pixels using wheel events. */
348
- async function humanizedScroll(page, deltaY, preset = "default") {
349
- const cfg = resolveHumanConfig(preset);
350
- const cdp = await ensureCdpSession(page);
351
- try {
352
- const cx = randRange(cfg.initialCursorX[0], cfg.initialCursorX[1]);
353
- const cy = randRange(cfg.initialCursorY[0], cfg.initialCursorY[1]);
354
- await dispatchMouseMove(cdp, cx, cy);
355
- const plan = generateScrollPlan(deltaY, cfg);
356
- for (const action of plan) if (action.kind === "wheel") await dispatchWheel(cdp, cx, cy, action.deltaY);
357
- else await sleepMs(action.ms);
358
- } finally {
359
- await cdp.detach().catch(() => {});
360
- }
361
- }
362
- //#endregion
363
- export { generateMousePath, generateScrollPlan, generateTypingPlan, humanizedClick, humanizedFill, humanizedPress, humanizedScroll, resolveHumanConfig };
@@ -1,50 +0,0 @@
1
- import type { Page } from 'playwright-core';
2
- import type { BrowserBackend } from './providers/types.js';
3
- import type { ExtensionBrowserProvider } from './providers/extension.js';
4
- export interface BrowserManagerOptions {
5
- getHeadless: () => boolean;
6
- /** Backend connection mode. Default: local Playwright. */
7
- getBackend?: () => BrowserBackend;
8
- }
9
- /**
10
- * Multi-backend browser manager — supports local Playwright, direct CDP, and cloud providers.
11
- *
12
- * One browser context shared by all sessions; one {@link Page} per task/session key (max {@link MAX_PAGES}).
13
- * Backend is selected at first connection based on {@link BrowserManagerOptions.getBackend}.
14
- */
15
- export declare class BrowserManager {
16
- private browser;
17
- private context;
18
- private cloudProvider;
19
- private extensionProvider;
20
- private extensionRelease;
21
- private cloakChildProcess;
22
- private cloakTempProfileDir;
23
- private pages;
24
- private readonly options;
25
- private activeBackendMode;
26
- constructor(options: BrowserManagerOptions);
27
- /** Current backend mode (null if not yet connected). */
28
- get backendMode(): string | null;
29
- private evictIdlePages;
30
- private _isPlaywrightConnectionAlive;
31
- private _wireBrowserLifecycle;
32
- /** Drop Playwright handles without tearing down extension bridge. */
33
- private _clearPlaywrightSessionRefs;
34
- private _resetStalePlaywrightSession;
35
- /**
36
- * Ensure Playwright context or Chrome Extension provider is ready.
37
- * Extension mode does not create a Playwright {@link BrowserContext}.
38
- */
39
- ensureConnected(): Promise<void>;
40
- private _launchLocal;
41
- private _connectViaCdp;
42
- private _connectViaCloud;
43
- private _connectViaExtension;
44
- private _connectViaCloakBrowser;
45
- getPage(taskId: string): Promise<Page>;
46
- closePage(taskId: string): Promise<void>;
47
- /** Get the extension provider (only available in extension mode). */
48
- getExtensionProvider(): ExtensionBrowserProvider | null;
49
- shutdown(): Promise<void>;
50
- }
@@ -1,251 +0,0 @@
1
- import { createLogger } from "../utils/logger/index.js";
2
- import { init_logger } from "../utils/logger.js";
3
- import { loadPlaywrightCoreModule } from "./providers/playwright-doctor.js";
4
- //#region src/browser/manager.ts
5
- init_logger();
6
- const log = createLogger("browser-manager");
7
- const MAX_PAGES = 3;
8
- const PAGE_IDLE_TIMEOUT_MS = 300 * 1e3;
9
- /**
10
- * Multi-backend browser manager — supports local Playwright, direct CDP, and cloud providers.
11
- *
12
- * One browser context shared by all sessions; one {@link Page} per task/session key (max {@link MAX_PAGES}).
13
- * Backend is selected at first connection based on {@link BrowserManagerOptions.getBackend}.
14
- */
15
- var BrowserManager = class {
16
- browser = null;
17
- context = null;
18
- cloudProvider = null;
19
- extensionProvider = null;
20
- extensionRelease = null;
21
- cloakChildProcess = null;
22
- cloakTempProfileDir = null;
23
- pages = /* @__PURE__ */ new Map();
24
- options;
25
- activeBackendMode = null;
26
- constructor(options) {
27
- this.options = options;
28
- }
29
- /** Current backend mode (null if not yet connected). */
30
- get backendMode() {
31
- return this.activeBackendMode;
32
- }
33
- evictIdlePages() {
34
- const now = Date.now();
35
- for (const [id, entry] of this.pages) if (entry.page.isClosed() || now - entry.lastUsed > PAGE_IDLE_TIMEOUT_MS) {
36
- entry.page.close().catch(() => {});
37
- this.pages.delete(id);
38
- log.debug({ taskId: id }, "Evicted idle or closed browser page");
39
- }
40
- }
41
- _isPlaywrightConnectionAlive() {
42
- if (!this.browser || !this.context) return false;
43
- try {
44
- if (typeof this.browser.isConnected === "function" && !this.browser.isConnected()) return false;
45
- return true;
46
- } catch {
47
- return false;
48
- }
49
- }
50
- _wireBrowserLifecycle(browser) {
51
- browser.on("disconnected", () => {
52
- log.warn({ mode: this.activeBackendMode }, "Browser disconnected — clearing stale session");
53
- this._clearPlaywrightSessionRefs();
54
- });
55
- }
56
- /** Drop Playwright handles without tearing down extension bridge. */
57
- _clearPlaywrightSessionRefs() {
58
- this.pages.clear();
59
- this.context = null;
60
- this.browser = null;
61
- this.cloakChildProcess = null;
62
- this.cloakTempProfileDir = null;
63
- if (this.cloudProvider) {
64
- this.cloudProvider.disconnect().catch(() => {});
65
- this.cloudProvider = null;
66
- }
67
- }
68
- async _resetStalePlaywrightSession() {
69
- for (const [, entry] of this.pages) await entry.page.close().catch(() => {});
70
- this.pages.clear();
71
- if (this.cloudProvider) {
72
- await this.cloudProvider.disconnect().catch(() => {});
73
- this.cloudProvider = null;
74
- }
75
- if (this.cloakChildProcess || this.cloakTempProfileDir) {
76
- const { cleanupCloakBrowser } = await import("./providers/cloakbrowser.js");
77
- await cleanupCloakBrowser(this.cloakChildProcess, this.cloakTempProfileDir).catch(() => {});
78
- this.cloakChildProcess = null;
79
- this.cloakTempProfileDir = null;
80
- }
81
- await this.context?.close().catch(() => {});
82
- await this.browser?.close().catch(() => {});
83
- this.context = null;
84
- this.browser = null;
85
- }
86
- /**
87
- * Ensure Playwright context or Chrome Extension provider is ready.
88
- * Extension mode does not create a Playwright {@link BrowserContext}.
89
- */
90
- async ensureConnected() {
91
- if (this.extensionProvider) return;
92
- if (this.context && this._isPlaywrightConnectionAlive()) return;
93
- if (this.context || this.browser) {
94
- log.warn({ mode: this.activeBackendMode }, "Browser session unavailable — reconnecting");
95
- await this._resetStalePlaywrightSession();
96
- }
97
- const backend = this.options.getBackend?.() ?? {
98
- mode: "local",
99
- headless: false
100
- };
101
- switch (backend.mode) {
102
- case "cdp":
103
- await this._connectViaCdp(backend.config.wsEndpoint);
104
- break;
105
- case "cloud":
106
- await this._connectViaCloud(backend.config);
107
- break;
108
- case "extension":
109
- await this._connectViaExtension(backend.config);
110
- break;
111
- case "cloakbrowser":
112
- await this._connectViaCloakBrowser(backend.config);
113
- break;
114
- default:
115
- await this._launchLocal(backend.mode === "local" ? backend.headless : this.options.getHeadless() === true);
116
- break;
117
- }
118
- this.activeBackendMode = backend.mode;
119
- if (this.browser) this._wireBrowserLifecycle(this.browser);
120
- }
121
- async _launchLocal(headless) {
122
- const pw = await loadPlaywrightCoreModule();
123
- const chromium = pw.chromium ?? pw.default?.chromium;
124
- if (!chromium?.launch) throw new Error("playwright-core did not expose chromium (try reinstall: pnpm install playwright-core; install browser: npx playwright install chromium)");
125
- this.browser = await chromium.launch({
126
- headless,
127
- ...headless ? { channel: "chromium" } : {},
128
- args: ["--no-sandbox", "--disable-setuid-sandbox"]
129
- });
130
- this.context = await this.browser.newContext({
131
- viewport: {
132
- width: 1280,
133
- height: 720
134
- },
135
- userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
136
- });
137
- log.info({
138
- headless,
139
- mode: "local"
140
- }, "Browser launched (local)");
141
- }
142
- async _connectViaCdp(wsEndpoint) {
143
- const pw = await loadPlaywrightCoreModule();
144
- const chromium = pw.chromium ?? pw.default?.chromium;
145
- if (!chromium?.connectOverCDP) throw new Error("playwright-core does not support connectOverCDP");
146
- this.browser = await chromium.connectOverCDP(wsEndpoint);
147
- const contexts = this.browser.contexts();
148
- this.context = contexts.length > 0 ? contexts[0] : await this.browser.newContext();
149
- log.info({
150
- mode: "cdp",
151
- wsEndpoint
152
- }, "Browser connected (CDP)");
153
- }
154
- async _connectViaCloud(config) {
155
- const { BrowserbaseProvider } = await import("./providers/browserbase.js");
156
- const { BrowserUseProvider } = await import("./providers/browser-use.js");
157
- const provider = config.type === "browserbase" ? new BrowserbaseProvider(config) : new BrowserUseProvider(config);
158
- const { browser, context } = await provider.connect();
159
- this.browser = browser;
160
- this.context = context;
161
- this.cloudProvider = provider;
162
- log.info({
163
- mode: "cloud",
164
- provider: config.type
165
- }, `Browser connected (${config.type})`);
166
- }
167
- async _connectViaExtension(config) {
168
- const { acquireExtensionBrowserServer } = await import("./providers/extension-ws-acquire.js");
169
- const { provider, release } = await acquireExtensionBrowserServer(config);
170
- this.extensionProvider = provider;
171
- this.extensionRelease = release;
172
- log.info({ port: config?.port ?? 19820 }, "Extension WS server ready, waiting for Chrome Extension...");
173
- await provider.waitForConnection();
174
- log.info({ mode: "extension" }, "Browser connected (Chrome Extension)");
175
- }
176
- async _connectViaCloakBrowser(config) {
177
- const { launchCloakBrowser } = await import("./providers/cloakbrowser.js");
178
- const result = await launchCloakBrowser(config);
179
- if (!result.browser || !result.context) throw new Error("BrowserManager: CloakBrowser launch did not return a Playwright connection");
180
- this.browser = result.browser;
181
- this.context = result.context;
182
- this.cloakChildProcess = result.childProcess;
183
- this.cloakTempProfileDir = result.temporaryProfileDir;
184
- log.info({ mode: "cloakbrowser" }, "Browser connected (CloakBrowser)");
185
- }
186
- async getPage(taskId) {
187
- if (this.extensionProvider) throw new Error("BrowserManager.getPage is not used in Chrome Extension backend mode");
188
- this.evictIdlePages();
189
- await this.ensureConnected();
190
- const existing = this.pages.get(taskId);
191
- if (existing && !existing.page.isClosed()) {
192
- existing.lastUsed = Date.now();
193
- return existing.page;
194
- }
195
- if (existing) this.pages.delete(taskId);
196
- if (this.pages.size >= MAX_PAGES) {
197
- const oldest = [...this.pages.entries()].sort((a, b) => a[1].lastUsed - b[1].lastUsed)[0];
198
- if (oldest) {
199
- await oldest[1].page.close().catch(() => {});
200
- this.pages.delete(oldest[0]);
201
- }
202
- }
203
- const ctx = this.context;
204
- if (!ctx) throw new Error("BrowserManager: Playwright context missing after ensureConnected");
205
- const page = await ctx.newPage();
206
- this.pages.set(taskId, {
207
- page,
208
- lastUsed: Date.now()
209
- });
210
- return page;
211
- }
212
- async closePage(taskId) {
213
- if (this.extensionProvider) return;
214
- const entry = this.pages.get(taskId);
215
- if (entry) {
216
- await entry.page.close().catch(() => {});
217
- this.pages.delete(taskId);
218
- }
219
- }
220
- /** Get the extension provider (only available in extension mode). */
221
- getExtensionProvider() {
222
- return this.extensionProvider;
223
- }
224
- async shutdown() {
225
- for (const [, entry] of this.pages) await entry.page.close().catch(() => {});
226
- this.pages.clear();
227
- if (this.cloudProvider) {
228
- await this.cloudProvider.disconnect().catch(() => {});
229
- this.cloudProvider = null;
230
- }
231
- if (this.extensionRelease) {
232
- await this.extensionRelease().catch(() => {});
233
- this.extensionRelease = null;
234
- }
235
- this.extensionProvider = null;
236
- if (this.cloakChildProcess || this.cloakTempProfileDir) {
237
- const { cleanupCloakBrowser } = await import("./providers/cloakbrowser.js");
238
- await cleanupCloakBrowser(this.cloakChildProcess, this.cloakTempProfileDir).catch(() => {});
239
- this.cloakChildProcess = null;
240
- this.cloakTempProfileDir = null;
241
- }
242
- await this.context?.close().catch(() => {});
243
- await this.browser?.close().catch(() => {});
244
- this.context = null;
245
- this.browser = null;
246
- this.activeBackendMode = null;
247
- log.info("Browser shut down");
248
- }
249
- };
250
- //#endregion
251
- export { BrowserManager };
@@ -1,35 +0,0 @@
1
- /**
2
- * Pipeline output formatting.
3
- */
4
- import type { BrowserActionResult, BrowserArtifact, BrowserDiagnostics } from '../actions/types.js';
5
- export interface PipelineStepTrace {
6
- index: number;
7
- scope: string;
8
- action: string;
9
- ok: boolean;
10
- elapsedMs: number;
11
- text?: string;
12
- data?: unknown;
13
- error?: {
14
- code: string;
15
- message: string;
16
- };
17
- }
18
- export interface PipelineOutput {
19
- ok: boolean;
20
- name: string;
21
- last: unknown;
22
- outputs: unknown[];
23
- artifacts: BrowserArtifact[];
24
- diagnostics: BrowserDiagnostics;
25
- trace: PipelineStepTrace[];
26
- error?: {
27
- step: number;
28
- action: string;
29
- code: string;
30
- message: string;
31
- };
32
- }
33
- export declare function createPipelineOutput(name: string): PipelineOutput;
34
- export declare function addStepTrace(output: PipelineOutput, trace: PipelineStepTrace, result: BrowserActionResult): void;
35
- export declare function formatPipelineResult(output: PipelineOutput): BrowserActionResult;