@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
@@ -7,7 +7,7 @@ import { getSessionTaskPlan, setSessionTaskPlan } from "../../storage/sqlite/ses
7
7
  import "../../storage/sqlite/index.js";
8
8
  import { init_agent_scope, resolveDefaultAgentId } from "../agent-scope.js";
9
9
  import { resolveEffectiveAgentConfigForSession } from "../../config/agent-profile.js";
10
- import { getEmbeddedExecutionSession } from "../embedded/execution-context.js";
10
+ import { getEmbeddedExecutionRunId, getEmbeddedExecutionSession } from "../embedded/execution-context.js";
11
11
  import { wrapToolsWithProtection } from "./executor.js";
12
12
  import { EXTERNAL_TOOL_NAMES } from "../external-tools/gateway-tools.js";
13
13
  import { buildRuntimeEnvironment } from "../../runtime-tools/environment.js";
@@ -36,15 +36,14 @@ import { createUpdatePlanTool } from "./update-plan-tool.js";
36
36
  import { createSessionStatusTool } from "./session-status-tool.js";
37
37
  import { createMemoryMaintenanceTool } from "./memory-maintenance-tool.js";
38
38
  import { createClarifyTool } from "./clarify-tool.js";
39
- import { BrowserManager } from "../../browser/manager.js";
40
- import { resolveBrowserBackendFromConfig } from "../../browser/backend-from-config.js";
39
+ import { BrowserRuntime } from "../../browser/runtime/browser-runtime.js";
40
+ import { createBrowserDriver } from "../../browser/drivers/create-driver.js";
41
41
  import { checkBrowserReadiness } from "../../browser/readiness.js";
42
- import { CdpSupervisor } from "../../browser/cdp-supervisor.js";
43
42
  import "../../browser/index.js";
44
43
  import { createDelegateTool } from "./delegate-tool.js";
45
44
  import { createWorkflowTool } from "./workflow-tool.js";
46
45
  import { createAutomationTool } from "./automation-tool.js";
47
- import { createBrowserRecipeTool } from "./browser-recipe-tool.js";
46
+ import { createBrowserAutomationTool } from "./browser-automation-tool.js";
48
47
  import { createXopcUseTool } from "./xopc-use-tool.js";
49
48
  import { createSkillViewTool, createSkillsListTool } from "./skills-tools.js";
50
49
  import { createSkillManageTool } from "./skill-manage-tool.js";
@@ -78,10 +77,8 @@ const CLARIFY_SUPPORTED_CHANNELS = new Set([
78
77
  "cli"
79
78
  ]);
80
79
  var AgentToolsFactory = class AgentToolsFactory {
81
- browserManager = null;
82
- /** One dialog/console supervisor per chat session (browser tab). */
83
- browserTaskSupervisors = /* @__PURE__ */ new Map();
84
- /** Cached readiness probe — keyed by backend mode + extension host:port. */
80
+ browserRuntime = null;
81
+ /** Cached readiness probe keyed by the active driver configuration. */
85
82
  browserReadinessCache = null;
86
83
  constructor(deps) {
87
84
  this.deps = deps;
@@ -99,13 +96,7 @@ var AgentToolsFactory = class AgentToolsFactory {
99
96
  })).env;
100
97
  };
101
98
  browserReadinessKey() {
102
- const cfg = this.deps.getConfig?.();
103
- const backend = resolveBrowserBackendFromConfig(cfg);
104
- const host = "127.0.0.1";
105
- const port = 19820;
106
- const cdpUrl = backend.mode === "cdp" ? backend.config.wsEndpoint : "";
107
- const cloudKind = backend.mode === "cloud" ? backend.config.type : "";
108
- return `${backend.mode}@${host}:${port}|${cdpUrl}|${cloudKind}`;
99
+ return JSON.stringify(this.deps.getConfig?.()?.browser.driver ?? null);
109
100
  }
110
101
  async checkBrowserReadinessCached() {
111
102
  const key = this.browserReadinessKey();
@@ -137,45 +128,33 @@ var AgentToolsFactory = class AgentToolsFactory {
137
128
  invalidateBrowserReadinessCache() {
138
129
  this.browserReadinessCache = null;
139
130
  }
140
- browserSupervisorForTask(taskId) {
141
- let s = this.browserTaskSupervisors.get(taskId);
142
- if (!s) {
143
- s = new CdpSupervisor({
144
- dialogPolicy: "auto_dismiss",
145
- dialogTimeoutSeconds: 300
146
- });
147
- this.browserTaskSupervisors.set(taskId, s);
148
- }
149
- return s;
150
- }
151
- async acquireBrowserPage() {
152
- const taskId = this.deps.getCurrentContext()?.sessionKey ?? "default";
153
- const mgr = this.ensureBrowserManager();
154
- await mgr.ensureConnected();
155
- if (mgr.getExtensionProvider()) return null;
156
- const page = await mgr.getPage(taskId);
157
- this.browserSupervisorForTask(taskId).attach(page);
158
- return page;
159
- }
160
- ensureBrowserManager() {
161
- if (!this.browserManager) this.browserManager = new BrowserManager({
162
- getHeadless: () => false,
163
- getBackend: () => resolveBrowserBackendFromConfig(this.deps.getConfig?.())
131
+ ensureBrowserRuntime() {
132
+ if (!this.browserRuntime) this.browserRuntime = new BrowserRuntime({
133
+ getConfig: () => {
134
+ const config = this.deps.getConfig?.();
135
+ if (!config) throw new Error("Browser configuration is unavailable");
136
+ return config.browser;
137
+ },
138
+ createDriver: async () => {
139
+ const config = this.deps.getConfig?.();
140
+ if (!config) throw new Error("Browser configuration is unavailable");
141
+ return createBrowserDriver(config.browser);
142
+ },
143
+ allowedUploadRoots: [this.deps.workspace],
144
+ emit: this.deps.emitBrowserEvent
164
145
  });
165
- return this.browserManager;
146
+ return this.browserRuntime;
166
147
  }
167
148
  /** Close Playwright and all pages (gateway stop, agent manager dispose, or config hot-reload). */
168
149
  async shutdownBrowser() {
169
150
  this.browserReadinessCache = null;
170
- if (!this.browserManager) return;
171
- await this.browserManager.shutdown();
172
- this.browserManager = null;
173
- this.browserTaskSupervisors.clear();
151
+ if (!this.browserRuntime) return;
152
+ await this.browserRuntime.shutdown();
153
+ this.browserRuntime = null;
174
154
  }
175
155
  /** Drop the tab for a session when its agent instance is removed. */
176
156
  async closeBrowserPageForSession(sessionKey) {
177
- this.browserTaskSupervisors.delete(sessionKey);
178
- await this.browserManager?.closePage(sessionKey);
157
+ await this.browserRuntime?.closeTaskSession(sessionKey);
179
158
  }
180
159
  createCoreTools(options) {
181
160
  const workspace = options?.workspace ?? this.deps.workspace;
@@ -236,15 +215,25 @@ var AgentToolsFactory = class AgentToolsFactory {
236
215
  createSessionStatusTool(),
237
216
  createMemoryMaintenanceTool({ getConfig: () => this.deps.getConfig?.() }),
238
217
  createToolManualTool(),
239
- createClarifyTool({ resolveAskUser: () => {
218
+ createClarifyTool({ resolveAskUser: (toolCallId) => {
240
219
  const req = this.deps.gatewayClarify?.requestClarification;
241
220
  if (!req) return null;
242
221
  const executionSession = getEmbeddedExecutionSession();
243
- if (executionSession) return (r) => req(executionSession, r);
222
+ const runId = getEmbeddedExecutionRunId();
223
+ if (executionSession && runId) return (request) => req({
224
+ sessionKey: executionSession,
225
+ runId,
226
+ toolCallId
227
+ }, request);
244
228
  const ctx = this.deps.getCurrentContext();
245
229
  if (!ctx?.sessionKey) return null;
246
230
  if (!CLARIFY_SUPPORTED_CHANNELS.has(ctx.channel)) return null;
247
- return (r) => req(ctx.sessionKey, r);
231
+ if (!runId) return null;
232
+ return (request) => req({
233
+ sessionKey: ctx.sessionKey,
234
+ runId,
235
+ toolCallId
236
+ }, request);
248
237
  } }),
249
238
  createTodoTool({
250
239
  getSessionKey: () => this.deps.getCurrentContext()?.sessionKey,
@@ -376,7 +365,7 @@ var AgentToolsFactory = class AgentToolsFactory {
376
365
  canAccess: () => currentAccess().crossSessionHistory
377
366
  })] : [],
378
367
  ...this.deps.getAutomationService ? [createAutomationTool({ getAutomationService: this.deps.getAutomationService })] : [],
379
- ...browserEnabled && this.deps.getBrowserRecipeService ? [createBrowserRecipeTool({ getBrowserRecipeService: this.deps.getBrowserRecipeService })] : [],
368
+ ...browserEnabled && this.deps.getBrowserAutomationService ? [createBrowserAutomationTool({ getBrowserAutomationService: this.deps.getBrowserAutomationService })] : [],
380
369
  ...this.deps.getAutomationService || this.deps.getProjectService || this.deps.getNotesService || this.deps.getLocalAppService || this.deps.dispatchTaskEvents || this.deps.dispatchTaskRuns ? [createXopcUseTool({
381
370
  getConfig: () => this.deps.getConfig?.(),
382
371
  getCurrentAgentId: () => options.agentId,
@@ -389,15 +378,9 @@ var AgentToolsFactory = class AgentToolsFactory {
389
378
  dispatchTaskRuns: this.deps.dispatchTaskRuns
390
379
  })] : [],
391
380
  ...browserEnabled ? [createBrowserUseTool({
392
- getManager: () => this.ensureBrowserManager(),
393
- getPageForTask: () => this.acquireBrowserPage(),
381
+ getRuntime: () => this.ensureBrowserRuntime(),
394
382
  getTaskId: () => this.deps.getCurrentContext()?.sessionKey ?? "default",
395
- getConfig: () => this.deps.getConfig?.(),
396
- getReadiness: () => this.checkBrowserReadinessCached(),
397
- getSupervisor: () => this.browserSupervisorForTask(this.deps.getCurrentContext()?.sessionKey ?? "default"),
398
- notifyBrowserPageClosed: (taskId) => {
399
- this.browserTaskSupervisors.delete(taskId);
400
- }
383
+ getReadiness: () => this.checkBrowserReadinessCached()
401
384
  })] : [],
402
385
  ...primary ? [createWorkflowTool({
403
386
  catalog: createWorkflowCatalog(),
@@ -23,11 +23,11 @@ export { createUpdatePlanTool, type TurnPlanDetails, type TurnPlanStatus, type T
23
23
  export { createSessionStatusTool } from './session-status-tool.js';
24
24
  export { createMemoryMaintenanceTool, type MemoryMaintenanceToolDeps } from './memory-maintenance-tool.js';
25
25
  export { createClarifyTool, type ClarifyRequestPayload, type GatewayClarifyRequestFn, } from './clarify-tool.js';
26
- export { BrowserManager, assertBrowserUrlAllowed } from '../../browser/index.js';
26
+ export { BrowserRuntime, assertBrowserUrlAllowed } from '../../browser/index.js';
27
27
  export { createDelegateTool, DEFAULT_DELEGATE_TOOLS, DELEGATE_BLOCKED_TOOLS, } from './delegate-tool.js';
28
28
  export { createWorkflowTool, type WorkflowToolDeps, type WorkflowToolInput } from './workflow-tool.js';
29
29
  export { createAutomationTool, type AutomationToolDeps } from './automation-tool.js';
30
- export { createBrowserRecipeTool } from './browser-recipe-tool.js';
30
+ export { createBrowserAutomationTool } from './browser-automation-tool.js';
31
31
  export { createXopcUseTool, type XopcUseToolDeps, type XopcUseToolInput } from './xopc-use-tool.js';
32
32
  export { createSkillsListTool, createSkillViewTool, type SkillsToolsDeps } from './skills-tools.js';
33
33
  export { createSkillManageTool, type SkillManageToolDeps } from './skill-manage-tool.js';
@@ -25,14 +25,14 @@ import { createUpdatePlanTool } from "./update-plan-tool.js";
25
25
  import { createSessionStatusTool } from "./session-status-tool.js";
26
26
  import { createMemoryMaintenanceTool } from "./memory-maintenance-tool.js";
27
27
  import { createClarifyTool } from "./clarify-tool.js";
28
- import { BrowserManager } from "../../browser/manager.js";
29
28
  import { assertBrowserUrlAllowed } from "../../browser/url-policy.js";
29
+ import { BrowserRuntime } from "../../browser/runtime/browser-runtime.js";
30
30
  import "../../browser/index.js";
31
31
  import { resolveImageModelConfigForTool } from "../image/tool-model-config.js";
32
32
  import { DEFAULT_DELEGATE_TOOLS, DELEGATE_BLOCKED_TOOLS, createDelegateTool } from "./delegate-tool.js";
33
33
  import { createWorkflowTool } from "./workflow-tool.js";
34
34
  import { createAutomationTool } from "./automation-tool.js";
35
- import { createBrowserRecipeTool } from "./browser-recipe-tool.js";
35
+ import { createBrowserAutomationTool } from "./browser-automation-tool.js";
36
36
  import { createXopcUseTool } from "./xopc-use-tool.js";
37
37
  import { createSkillViewTool, createSkillsListTool } from "./skills-tools.js";
38
38
  import { createSkillManageTool } from "./skill-manage-tool.js";
@@ -43,4 +43,4 @@ import { createDesktopPetTool } from "./desktop-pet-tool.js";
43
43
  import { createManagedJobTool } from "./managed-job-tool.js";
44
44
  import { createImageTool } from "./image-tool.js";
45
45
  import { createImageGenerateTool, resolveImageGenerationModelConfigForTool } from "./image-generate-tool.js";
46
- export { BrowserManager, DEFAULT_DELEGATE_TOOLS, DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, DEFAULT_TOOL_METADATA, DEFAULT_WEB_EXTRACT_MAX_LENGTH, DELEGATE_BLOCKED_TOOLS, GREP_MAX_LINE_LENGTH, MAX_RAW_HTML_CHARS_FOR_WEB_EXTRACT, TodoStore, ToolConcurrencyController, assertBrowserUrlAllowed, createApplyPatchTool, createAutomationTool, createBrowserRecipeTool, createClarifyTool, createCreateShareTool, createDelegateTool, createDesktopPetTool, createExecCommandTool, createFindTool, createGrepTool, createImageGenerateTool, createImageTool, createKnowledgeGetTool, createKnowledgeSearchTool, createKnowledgeWriteTool, createListDirTool, createManagedJobTool, createMemoryMaintenanceTool, createMessageTool, createPublishArtifactsTool, createReadFileTool, createReadMediaTool, createSendMediaTool, createSessionRecallTool, createSessionSearchTool, createSessionStatusTool, createSkillInstallTool, createSkillManageTool, createSkillViewTool, createSkillsListTool, createSkillsMarketplaceSearchTool, createTodoTool, createToolManualTool, createUpdatePlanTool, createUserContextGetTool, createUserContextSearchTool, createWebExtractTool, createWebFetchTool, createWebSearchTool, createWorkflowTool, createWriteFileTool, createXopcUseTool, findTool, formatSize, fuzzyFindText, generateDiffString, getToolMetadata, grepTool, isShareToolAvailable, listDirTool, normalizeForFuzzyMatch, normalizeToLF, resolveImageGenerationModelConfigForTool, resolveImageModelConfigForTool, resolveToolLockMode, restoreLineEndings, stripBom, stripHtmlBoilerplate, truncateHead, truncateLine, truncateTail, writeFileTool };
46
+ export { BrowserRuntime, DEFAULT_DELEGATE_TOOLS, DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, DEFAULT_TOOL_METADATA, DEFAULT_WEB_EXTRACT_MAX_LENGTH, DELEGATE_BLOCKED_TOOLS, GREP_MAX_LINE_LENGTH, MAX_RAW_HTML_CHARS_FOR_WEB_EXTRACT, TodoStore, ToolConcurrencyController, assertBrowserUrlAllowed, createApplyPatchTool, createAutomationTool, createBrowserAutomationTool, createClarifyTool, createCreateShareTool, createDelegateTool, createDesktopPetTool, createExecCommandTool, createFindTool, createGrepTool, createImageGenerateTool, createImageTool, createKnowledgeGetTool, createKnowledgeSearchTool, createKnowledgeWriteTool, createListDirTool, createManagedJobTool, createMemoryMaintenanceTool, createMessageTool, createPublishArtifactsTool, createReadFileTool, createReadMediaTool, createSendMediaTool, createSessionRecallTool, createSessionSearchTool, createSessionStatusTool, createSkillInstallTool, createSkillManageTool, createSkillViewTool, createSkillsListTool, createSkillsMarketplaceSearchTool, createTodoTool, createToolManualTool, createUpdatePlanTool, createUserContextGetTool, createUserContextSearchTool, createWebExtractTool, createWebFetchTool, createWebSearchTool, createWorkflowTool, createWriteFileTool, createXopcUseTool, findTool, formatSize, fuzzyFindText, generateDiffString, getToolMetadata, grepTool, isShareToolAvailable, listDirTool, normalizeForFuzzyMatch, normalizeToLF, resolveImageGenerationModelConfigForTool, resolveImageModelConfigForTool, resolveToolLockMode, restoreLineEndings, stripBom, stripHtmlBoilerplate, truncateHead, truncateLine, truncateTail, writeFileTool };
@@ -5,7 +5,7 @@ import { lstat, readFile, readlink, realpath } from "node:fs/promises";
5
5
  import { promisify } from "node:util";
6
6
  import { Type } from "@sinclair/typebox";
7
7
  //#region src/agent/tools/review-workspace.ts
8
- const exec$1 = promisify(execFile);
8
+ const exec = promisify(execFile);
9
9
  function createReviewWorkspaceTool(workspace) {
10
10
  return {
11
11
  name: "review_workspace",
@@ -16,7 +16,7 @@ function createReviewWorkspaceTool(workspace) {
16
16
  idempotent: true,
17
17
  async execute(_id, _args, signal) {
18
18
  let cwd = workspace;
19
- const git = async (args) => (await exec$1("git", [
19
+ const git = async (args) => (await exec("git", [
20
20
  "-c",
21
21
  "core.fsmonitor=false",
22
22
  ...args
@@ -1,9 +1,9 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
- import { getAssistantMessageErrorReason, stripCodeFences } from "../providers/model-response.js";
4
3
  import { getDefaultModelSync, init_providers, resolveModel } from "../providers/index.js";
5
4
  import { createExtensionAwareStreamFn } from "../providers/extension-stream-bridge.js";
6
5
  import { isLocalModelBaseUrl, resolveModelCallApiKey, resolveModelCallOptions } from "../providers/model-call.js";
6
+ import { getAssistantMessageErrorReason, stripCodeFences } from "../providers/model-response.js";
7
7
  //#region src/ai-assist/text-assist.ts
8
8
  init_providers();
9
9
  init_logger();
@@ -1,10 +1,10 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
2
  import { createLogger } from "../utils/logger/index.js";
3
3
  import { init_logger } from "../utils/logger.js";
4
- import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
5
4
  import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveCredentialsDir, resolveOAuthPath } from "../config/paths.js";
6
- import { getApiKeyFromEnv, init_env_keys } from "../providers/env-keys.js";
5
+ import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
7
6
  import { getOAuthProviderDefinition, init_registry } from "./oauth/registry.js";
7
+ import { getApiKeyFromEnv, init_env_keys } from "../providers/env-keys.js";
8
8
  import { init_oauth_provider_lock, withOAuthProviderLock } from "./oauth-provider-lock.js";
9
9
  import { dirname, join } from "path";
10
10
  import { mkdir, readFile, readdir, rm } from "fs/promises";
@@ -1,4 +1,5 @@
1
1
  import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
2
+ import { init_resolution, resolveConnectedPlatformEndpoint } from "../../platform/resolution.js";
2
3
  import { generatePKCE, init_pkce } from "./pkce.js";
3
4
  import { hostname } from "node:os";
4
5
  import { randomBytes } from "node:crypto";
@@ -6,7 +7,7 @@ import http from "node:http";
6
7
  import { setTimeout as setTimeout$1 } from "node:timers/promises";
7
8
  //#region src/auth/oauth/xopc-cloud.ts
8
9
  function consoleUrl() {
9
- return (process.env.XOPC_CONSOLE_URL ?? DEFAULT_CONSOLE_URL).replace(/\/+$/, "");
10
+ return (process.env.XOPC_CONSOLE_URL ?? resolveConnectedPlatformEndpoint("authorizationServer") ?? DEFAULT_CONSOLE_URL).replace(/\/+$/, "");
10
11
  }
11
12
  async function readJson(response) {
12
13
  const body = await response.json().catch(() => null);
@@ -391,6 +392,7 @@ function createXopcOAuthProvider(options) {
391
392
  var CLIENT_ID, DEFAULT_CONSOLE_URL, MODEL_SERVICE_SCOPE, TUNNEL_REGISTRATION_SCOPE, HOSTED_SHARE_SCOPE, CALLBACK_PATH, AUTHORIZATION_TIMEOUT_MS, xopcCloudOAuthProvider, xopcTunnelOAuthProvider, xopcShareOAuthProvider;
392
393
  var init_xopc_cloud = __esmMin((() => {
393
394
  init_pkce();
395
+ init_resolution();
394
396
  CLIENT_ID = "xopc-native";
395
397
  DEFAULT_CONSOLE_URL = "https://console.xopc.ai";
396
398
  MODEL_SERVICE_SCOPE = "models:read models:invoke account:usage connectors:read connectors:manage connectors:execute offline_access";
@@ -1,5 +1,5 @@
1
- import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
2
1
  import { init_paths, resolveCredentialsDir } from "../../config/paths.js";
2
+ import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
3
3
  import path from "node:path";
4
4
  import { chmodSync, existsSync, mkdirSync, readFileSync } from "node:fs";
5
5
  //#region src/auth/profiles/store.ts
@@ -1,8 +1,8 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
+ import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
2
3
  import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveOAuthPath } from "../config/paths.js";
3
- import { init_registry, isOAuthOnlyProvider } from "./oauth/registry.js";
4
4
  import { init_loader, loadConfig } from "../config/loader.js";
5
- import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
5
+ import { init_registry, isOAuthOnlyProvider } from "./oauth/registry.js";
6
6
  import { existsSync, readFileSync } from "node:fs";
7
7
  //#region src/auth/sync-provider-auth.ts
8
8
  /**
@@ -2,7 +2,7 @@
2
2
  const DEFAULT_AUTOMATION_TIMEOUT_SECONDS = 1800;
3
3
  const DEFAULT_BROWSER_AUTOMATION_TIMEOUT_SECONDS = 600;
4
4
  function defaultAutomationTimeoutSeconds(action) {
5
- return action.kind === "browser_recipe" ? 600 : DEFAULT_AUTOMATION_TIMEOUT_SECONDS;
5
+ return action.kind === "browser_automation" ? 600 : DEFAULT_AUTOMATION_TIMEOUT_SECONDS;
6
6
  }
7
7
  function resolveAutomationTimeoutSeconds(action, reliability) {
8
8
  return reliability?.executionTimeoutSeconds ?? ("timeoutSeconds" in action ? action.timeoutSeconds : void 0) ?? reliability?.timeoutSeconds ?? defaultAutomationTimeoutSeconds(action);
@@ -46,9 +46,9 @@ export type AutomationAction = {
46
46
  maxSubagents?: number;
47
47
  timeoutSeconds?: number;
48
48
  } | {
49
- kind: 'browser_recipe';
50
- recipeId: string;
51
- args?: Record<string, unknown>;
49
+ kind: 'browser_automation';
50
+ automationId: string;
51
+ inputs?: Record<string, unknown>;
52
52
  timeoutSeconds?: number;
53
53
  } | {
54
54
  kind: 'task_command';
@@ -189,8 +189,8 @@ export interface AutomationDeps {
189
189
  getDefaultAgentId?: () => string;
190
190
  prepareAgentSession?: (input: PrepareAutomationAgentSessionInput) => Promise<void>;
191
191
  workflowRunService?: WorkflowRunServiceLike;
192
- browserRecipeService?: {
193
- runAndWait(recipeId: string, args: Record<string, unknown>, signal?: AbortSignal): Promise<{
192
+ browserAutomationService?: {
193
+ runAndWait(automationId: string, inputs: Record<string, unknown>, signal?: AbortSignal): Promise<{
194
194
  id: string;
195
195
  status: 'queued' | 'running' | 'succeeded' | 'failed' | 'cancelled';
196
196
  result?: unknown;
@@ -59,9 +59,9 @@ export declare const AutomationActionSchema: z.ZodDiscriminatedUnion<[z.ZodObjec
59
59
  maxSubagents: z.ZodOptional<z.ZodNumber>;
60
60
  timeoutSeconds: z.ZodOptional<z.ZodNumber>;
61
61
  }, z.core.$strict>, z.ZodObject<{
62
- kind: z.ZodLiteral<"browser_recipe">;
63
- recipeId: z.ZodString;
64
- args: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
62
+ kind: z.ZodLiteral<"browser_automation">;
63
+ automationId: z.ZodString;
64
+ inputs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
65
65
  timeoutSeconds: z.ZodOptional<z.ZodNumber>;
66
66
  }, z.core.$strict>, z.ZodObject<{
67
67
  kind: z.ZodLiteral<"task_command">;
@@ -117,9 +117,9 @@ export declare const AutomationActionSchema: z.ZodDiscriminatedUnion<[z.ZodObjec
117
117
  type: z.ZodLiteral<"add_wait">;
118
118
  wait: z.ZodObject<{
119
119
  kind: z.ZodEnum<{
120
+ approval: "approval";
120
121
  dependency: "dependency";
121
122
  user_input: "user_input";
122
- approval: "approval";
123
123
  external_event: "external_event";
124
124
  scheduled_time: "scheduled_time";
125
125
  retry_backoff: "retry_backoff";
@@ -236,9 +236,9 @@ export declare const AutomationSchema: z.ZodObject<{
236
236
  maxSubagents: z.ZodOptional<z.ZodNumber>;
237
237
  timeoutSeconds: z.ZodOptional<z.ZodNumber>;
238
238
  }, z.core.$strict>, z.ZodObject<{
239
- kind: z.ZodLiteral<"browser_recipe">;
240
- recipeId: z.ZodString;
241
- args: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
239
+ kind: z.ZodLiteral<"browser_automation">;
240
+ automationId: z.ZodString;
241
+ inputs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
242
242
  timeoutSeconds: z.ZodOptional<z.ZodNumber>;
243
243
  }, z.core.$strict>, z.ZodObject<{
244
244
  kind: z.ZodLiteral<"task_command">;
@@ -294,9 +294,9 @@ export declare const AutomationSchema: z.ZodObject<{
294
294
  type: z.ZodLiteral<"add_wait">;
295
295
  wait: z.ZodObject<{
296
296
  kind: z.ZodEnum<{
297
+ approval: "approval";
297
298
  dependency: "dependency";
298
299
  user_input: "user_input";
299
- approval: "approval";
300
300
  external_event: "external_event";
301
301
  scheduled_time: "scheduled_time";
302
302
  retry_backoff: "retry_backoff";
@@ -398,9 +398,9 @@ export declare const CreateAutomationSchema: z.ZodObject<{
398
398
  maxSubagents: z.ZodOptional<z.ZodNumber>;
399
399
  timeoutSeconds: z.ZodOptional<z.ZodNumber>;
400
400
  }, z.core.$strict>, z.ZodObject<{
401
- kind: z.ZodLiteral<"browser_recipe">;
402
- recipeId: z.ZodString;
403
- args: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
401
+ kind: z.ZodLiteral<"browser_automation">;
402
+ automationId: z.ZodString;
403
+ inputs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
404
404
  timeoutSeconds: z.ZodOptional<z.ZodNumber>;
405
405
  }, z.core.$strict>, z.ZodObject<{
406
406
  kind: z.ZodLiteral<"task_command">;
@@ -456,9 +456,9 @@ export declare const CreateAutomationSchema: z.ZodObject<{
456
456
  type: z.ZodLiteral<"add_wait">;
457
457
  wait: z.ZodObject<{
458
458
  kind: z.ZodEnum<{
459
+ approval: "approval";
459
460
  dependency: "dependency";
460
461
  user_input: "user_input";
461
- approval: "approval";
462
462
  external_event: "external_event";
463
463
  scheduled_time: "scheduled_time";
464
464
  retry_backoff: "retry_backoff";
@@ -587,9 +587,9 @@ export declare const UpdateAutomationSchema: z.ZodObject<{
587
587
  maxSubagents: z.ZodOptional<z.ZodNumber>;
588
588
  timeoutSeconds: z.ZodOptional<z.ZodNumber>;
589
589
  }, z.core.$strict>, z.ZodObject<{
590
- kind: z.ZodLiteral<"browser_recipe">;
591
- recipeId: z.ZodString;
592
- args: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
590
+ kind: z.ZodLiteral<"browser_automation">;
591
+ automationId: z.ZodString;
592
+ inputs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
593
593
  timeoutSeconds: z.ZodOptional<z.ZodNumber>;
594
594
  }, z.core.$strict>, z.ZodObject<{
595
595
  kind: z.ZodLiteral<"task_command">;
@@ -645,9 +645,9 @@ export declare const UpdateAutomationSchema: z.ZodObject<{
645
645
  type: z.ZodLiteral<"add_wait">;
646
646
  wait: z.ZodObject<{
647
647
  kind: z.ZodEnum<{
648
+ approval: "approval";
648
649
  dependency: "dependency";
649
650
  user_input: "user_input";
650
- approval: "approval";
651
651
  external_event: "external_event";
652
652
  scheduled_time: "scheduled_time";
653
653
  retry_backoff: "retry_backoff";
@@ -83,9 +83,9 @@ const AutomationActionSchema = z.discriminatedUnion("kind", [
83
83
  timeoutSeconds: z.number().int().min(1).max(86400).optional()
84
84
  }).strict(),
85
85
  z.object({
86
- kind: z.literal("browser_recipe"),
87
- recipeId: nonEmptyString.max(100),
88
- args: z.record(z.string(), z.unknown()).optional(),
86
+ kind: z.literal("browser_automation"),
87
+ automationId: nonEmptyString.max(100),
88
+ inputs: z.record(z.string(), z.unknown()).optional(),
89
89
  timeoutSeconds: z.number().int().min(1).max(86400).optional()
90
90
  }).strict(),
91
91
  z.object({
@@ -37,9 +37,9 @@ export declare function buildAutomationDraftResponse(draft: GeneratedAutomationD
37
37
  maxSubagents?: number;
38
38
  timeoutSeconds?: number;
39
39
  } | {
40
- kind: "browser_recipe";
41
- recipeId: string;
42
- args?: Record<string, unknown>;
40
+ kind: "browser_automation";
41
+ automationId: string;
42
+ inputs?: Record<string, unknown>;
43
43
  timeoutSeconds?: number;
44
44
  } | {
45
45
  kind: "task_command";
@@ -79,7 +79,7 @@ export declare function buildAutomationDraftResponse(draft: GeneratedAutomationD
79
79
  } | {
80
80
  type: "add_wait";
81
81
  wait: {
82
- kind: "dependency" | "user_input" | "approval" | "external_event" | "scheduled_time" | "retry_backoff" | "paused";
82
+ kind: "approval" | "dependency" | "user_input" | "external_event" | "scheduled_time" | "retry_backoff" | "paused";
83
83
  reason: string;
84
84
  condition: Record<string, unknown>;
85
85
  resumeAt?: number;
@@ -90,7 +90,7 @@ function summarizeTrigger(trigger) {
90
90
  }
91
91
  function summarizeAction(action) {
92
92
  if (action.kind === "workflow") return `Starts workflow ${action.workflowId}.`;
93
- if (action.kind === "browser_recipe") return `Runs browser automation ${action.recipeId}.`;
93
+ if (action.kind === "browser_automation") return `Runs browser automation ${action.automationId}.`;
94
94
  if (action.kind === "task_command") return `Applies ${action.command?.type ?? "a command"} to task ${action.taskId}.`;
95
95
  return action.agentId ? `Runs agent ${action.agentId}.` : "Runs the default agent.";
96
96
  }
@@ -4,7 +4,7 @@ export declare class AutomationActionExecutor {
4
4
  setDeps(deps: AutomationDeps): void;
5
5
  execute(automation: Automation, run: AutomationRun, signal: AbortSignal, hooks?: AutomationActionExecutionHooks): Promise<AutomationActionTask>;
6
6
  private executeWithoutTimeout;
7
- private executeBrowserRecipe;
7
+ private executeBrowserAutomation;
8
8
  private executeAgent;
9
9
  private executeWorkflow;
10
10
  }
@@ -105,7 +105,7 @@ var AutomationActionExecutor = class {
105
105
  error: "Automation run was cancelled"
106
106
  };
107
107
  if (automation.action.kind === "workflow") return this.executeWorkflow(automation, automation.action, run, signal, hooks);
108
- if (automation.action.kind === "browser_recipe") return this.executeBrowserRecipe(automation, automation.action, signal, hooks);
108
+ if (automation.action.kind === "browser_automation") return this.executeBrowserAutomation(automation, automation.action, signal, hooks);
109
109
  if (automation.action.kind === "task_command") {
110
110
  await hooks.onRunPatch?.({ currentPhase: "action" });
111
111
  const execute = this.deps.executeTaskCommand;
@@ -128,26 +128,26 @@ var AutomationActionExecutor = class {
128
128
  }
129
129
  return this.executeAgent(automation, automation.action, run, signal, hooks, deadlineAtMs);
130
130
  }
131
- async executeBrowserRecipe(automation, action, signal, hooks) {
131
+ async executeBrowserAutomation(automation, action, signal, hooks) {
132
132
  await hooks.onRunPatch?.({ currentPhase: "action" });
133
133
  const safetyMode = automation.safety?.mode ?? "auto_apply";
134
134
  if (safetyMode !== "auto_apply") return {
135
135
  status: "succeeded",
136
- summary: `${safetyMode === "suggest_only" ? "Suggest only" : "Ask before applying"}: Browser automation ${action.recipeId} was not run.`
136
+ summary: `${safetyMode === "suggest_only" ? "Suggest only" : "Ask before applying"}: Browser automation ${action.automationId} was not run.`
137
137
  };
138
- const service = this.deps.browserRecipeService;
138
+ const service = this.deps.browserAutomationService;
139
139
  if (!service) return {
140
140
  status: "failed",
141
141
  error: "Browser automation is not available"
142
142
  };
143
- const run = await service.runAndWait(action.recipeId, action.args ?? {}, signal);
143
+ const run = await service.runAndWait(action.automationId, action.inputs ?? {}, signal);
144
144
  if (run.status === "succeeded") return {
145
145
  status: "succeeded",
146
- summary: `Browser automation ${action.recipeId} completed: ${JSON.stringify(run.result ?? null).slice(0, 3500)}`
146
+ summary: `Browser automation ${action.automationId} completed: ${JSON.stringify(run.result ?? null).slice(0, 3500)}`
147
147
  };
148
148
  return {
149
149
  status: run.status === "cancelled" ? "cancelled" : "failed",
150
- error: run.error ?? `Browser automation ${action.recipeId} ${run.status}`
150
+ error: run.error ?? `Browser automation ${action.automationId} ${run.status}`
151
151
  };
152
152
  }
153
153
  async executeAgent(automation, action, run, signal, hooks, deadlineAtMs) {
@@ -1,3 +1,4 @@
1
1
  export * from './types.js';
2
+ export * from './schema.js';
2
3
  export * from './service.js';
3
4
  export * from './runtime-service.js';
@@ -0,0 +1,4 @@
1
+ import { BrowserAutomationDefinitionSchema } from "./schema.js";
2
+ import { BrowserAutomationService } from "./service.js";
3
+ import { createRuntimeBrowserAutomationService } from "./runtime-service.js";
4
+ export { BrowserAutomationDefinitionSchema, BrowserAutomationService, createRuntimeBrowserAutomationService };
@@ -0,0 +1,13 @@
1
+ import type { BrowserAutomation, BrowserAutomationRun, BrowserAutomationRunEvent } from './types.js';
2
+ export declare const listBrowserAutomations: () => BrowserAutomation[];
3
+ export declare const getBrowserAutomation: (id: string) => BrowserAutomation | null;
4
+ export declare function saveBrowserAutomation(value: BrowserAutomation): void;
5
+ export declare const deleteBrowserAutomation: (id: string) => boolean;
6
+ export declare function saveBrowserAutomationRun(value: BrowserAutomationRun): void;
7
+ export declare const getBrowserAutomationRun: (id: string) => BrowserAutomationRun | null;
8
+ export declare const listBrowserAutomationRuns: (automationId?: string) => BrowserAutomationRun[];
9
+ export declare const listActiveBrowserAutomationRuns: () => BrowserAutomationRun[];
10
+ export declare const hasActiveBrowserAutomationRuns: (automationId: string) => boolean;
11
+ export declare const nextBrowserAutomationRunEventSeq: (runId: string) => number;
12
+ export declare function appendBrowserAutomationRunEvent(value: BrowserAutomationRunEvent): void;
13
+ export declare const listBrowserAutomationRunEvents: (runId: string) => BrowserAutomationRunEvent[];
@@ -0,0 +1,60 @@
1
+ import { getSqliteDatabase, runSqliteWriteTransaction } from "../../storage/sqlite/transaction.js";
2
+ import "../../storage/sqlite/index.js";
3
+ //#region src/browser/automations/repository.ts
4
+ const AUTOMATION_SELECT = "SELECT automation_id, revision, status, definition_json, created_at_ms, updated_at_ms FROM browser_automations";
5
+ const RUN_SELECT = "SELECT run_id, automation_id, automation_revision, definition_json, status, inputs_json, result_json, error, created_at_ms, started_at_ms, ended_at_ms, duration_ms FROM browser_automation_runs";
6
+ const parseAutomation = (row) => ({
7
+ id: row.automation_id,
8
+ revision: row.revision,
9
+ status: row.status,
10
+ definition: JSON.parse(row.definition_json),
11
+ createdAtMs: row.created_at_ms,
12
+ updatedAtMs: row.updated_at_ms
13
+ });
14
+ const parseRun = (row) => ({
15
+ id: row.run_id,
16
+ automationId: row.automation_id,
17
+ automationRevision: row.automation_revision,
18
+ definition: JSON.parse(row.definition_json),
19
+ status: row.status,
20
+ inputs: JSON.parse(row.inputs_json),
21
+ result: row.result_json ? JSON.parse(row.result_json) : void 0,
22
+ error: row.error ?? void 0,
23
+ createdAtMs: row.created_at_ms,
24
+ startedAtMs: row.started_at_ms ?? void 0,
25
+ endedAtMs: row.ended_at_ms ?? void 0,
26
+ durationMs: row.duration_ms ?? void 0
27
+ });
28
+ const listBrowserAutomations = () => getSqliteDatabase().prepare(`${AUTOMATION_SELECT} ORDER BY updated_at_ms DESC`).all().map(parseAutomation);
29
+ const getBrowserAutomation = (id) => {
30
+ const row = getSqliteDatabase().prepare(`${AUTOMATION_SELECT} WHERE automation_id = ?`).get(id);
31
+ return row ? parseAutomation(row) : null;
32
+ };
33
+ function saveBrowserAutomation(value) {
34
+ runSqliteWriteTransaction((db) => db.prepare("INSERT INTO browser_automations (automation_id, revision, status, definition_json, created_at_ms, updated_at_ms) VALUES (?, ?, ?, ?, ?, ?) ON CONFLICT(automation_id) DO UPDATE SET revision=excluded.revision, status=excluded.status, definition_json=excluded.definition_json, updated_at_ms=excluded.updated_at_ms").run(value.id, value.revision, value.status, JSON.stringify(value.definition), value.createdAtMs, value.updatedAtMs));
35
+ }
36
+ const deleteBrowserAutomation = (id) => runSqliteWriteTransaction((db) => db.prepare("DELETE FROM browser_automations WHERE automation_id = ?").run(id).changes > 0);
37
+ function saveBrowserAutomationRun(value) {
38
+ runSqliteWriteTransaction((db) => db.prepare("INSERT INTO browser_automation_runs (run_id, automation_id, automation_revision, definition_json, status, inputs_json, result_json, error, created_at_ms, started_at_ms, ended_at_ms, duration_ms) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT(run_id) DO UPDATE SET status=excluded.status, result_json=excluded.result_json, error=excluded.error, started_at_ms=excluded.started_at_ms, ended_at_ms=excluded.ended_at_ms, duration_ms=excluded.duration_ms").run(value.id, value.automationId, value.automationRevision, JSON.stringify(value.definition), value.status, JSON.stringify(value.inputs), value.result === void 0 ? null : JSON.stringify(value.result), value.error ?? null, value.createdAtMs, value.startedAtMs ?? null, value.endedAtMs ?? null, value.durationMs ?? null));
39
+ }
40
+ const getBrowserAutomationRun = (id) => {
41
+ const row = getSqliteDatabase().prepare(`${RUN_SELECT} WHERE run_id = ?`).get(id);
42
+ return row ? parseRun(row) : null;
43
+ };
44
+ const listBrowserAutomationRuns = (automationId) => (automationId ? getSqliteDatabase().prepare(`${RUN_SELECT} WHERE automation_id = ? ORDER BY created_at_ms DESC`).all(automationId) : getSqliteDatabase().prepare(`${RUN_SELECT} ORDER BY created_at_ms DESC`).all()).map(parseRun);
45
+ const listActiveBrowserAutomationRuns = () => getSqliteDatabase().prepare(`${RUN_SELECT} WHERE status IN ('queued', 'running')`).all().map(parseRun);
46
+ const hasActiveBrowserAutomationRuns = (automationId) => Boolean(getSqliteDatabase().prepare("SELECT 1 FROM browser_automation_runs WHERE automation_id = ? AND status IN ('queued', 'running') LIMIT 1").get(automationId));
47
+ const nextBrowserAutomationRunEventSeq = (runId) => getSqliteDatabase().prepare("SELECT COALESCE(MAX(seq), 0) + 1 AS seq FROM browser_action_audit WHERE run_id = ?").get(runId).seq;
48
+ function appendBrowserAutomationRunEvent(value) {
49
+ runSqliteWriteTransaction((db) => db.prepare("INSERT INTO browser_action_audit (event_id, run_id, seq, type, data_json, created_at_ms) VALUES (?, ?, ?, ?, ?, ?)").run(value.id, value.runId, value.seq, value.type, value.data === void 0 ? null : JSON.stringify(value.data), value.createdAtMs));
50
+ }
51
+ const listBrowserAutomationRunEvents = (runId) => getSqliteDatabase().prepare("SELECT event_id, run_id, seq, type, data_json, created_at_ms FROM browser_action_audit WHERE run_id = ? ORDER BY seq").all(runId).map((row) => ({
52
+ id: row.event_id,
53
+ runId: row.run_id,
54
+ seq: row.seq,
55
+ type: row.type,
56
+ data: row.data_json ? JSON.parse(row.data_json) : void 0,
57
+ createdAtMs: row.created_at_ms
58
+ }));
59
+ //#endregion
60
+ export { appendBrowserAutomationRunEvent, deleteBrowserAutomation, getBrowserAutomation, getBrowserAutomationRun, hasActiveBrowserAutomationRuns, listActiveBrowserAutomationRuns, listBrowserAutomationRunEvents, listBrowserAutomationRuns, listBrowserAutomations, nextBrowserAutomationRunEventSeq, saveBrowserAutomation, saveBrowserAutomationRun };