@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
@@ -53,18 +53,18 @@ const AUTHENTICATED_LAZY_ROUTE_BUNDLES = [
53
53
  },
54
54
  {
55
55
  id: "browser-install",
56
- match: (path) => path === "/api/browser/playwright/install/stream" || path === "/api/browser/cloakbrowser/install/stream",
56
+ match: (path) => path === "/api/browser/playwright/install/stream",
57
57
  load: async () => {
58
58
  const { registerBrowserInstallRoutes } = await import("./browser-install.js");
59
59
  return { register: registerBrowserInstallRoutes };
60
60
  }
61
61
  },
62
62
  {
63
- id: "browser-workflows",
64
- match: (path) => startsWithAny(path, ["/api/browser/workflows", "/api/browser/workflow-runs"]),
63
+ id: "browser-automations",
64
+ match: (path) => startsWithAny(path, ["/api/browser/automations", "/api/browser/automation-runs"]),
65
65
  load: async () => {
66
- const { registerBrowserWorkflowRoutes } = await import("./browser-workflows.js");
67
- return { register: registerBrowserWorkflowRoutes };
66
+ const { registerBrowserAutomationRoutes } = await import("./browser-automations.js");
67
+ return { register: registerBrowserAutomationRoutes };
68
68
  }
69
69
  },
70
70
  {
@@ -1,5 +1,5 @@
1
- import { init_resolve_config_value, testApiKeyResolution } from "../../../config/resolve-config-value.js";
2
1
  import { resolveModelsJsonPath } from "../../../config/paths.js";
2
+ import { init_resolve_config_value, testApiKeyResolution } from "../../../config/resolve-config-value.js";
3
3
  import { init_models_json, loadModelsJson, saveModelsJson, validateModelsConfig } from "../../../config/models-json.js";
4
4
  import { getModelCatalogStore, init_model_catalog_store } from "../../../providers/model-catalog-store.js";
5
5
  import { getModelRegistry } from "../../../providers/model-registry.js";
@@ -45,11 +45,15 @@ export declare function submitSessionInput(c: Context, deps: AuthenticatedRouteD
45
45
  status: import("../../../storage/sqlite/session-input-repository.js").SessionInputStatus;
46
46
  content: string;
47
47
  taskRunId?: string;
48
- kind: "message" | "connection_resume";
48
+ kind: "message" | "connection_resume" | "clarification_resume";
49
49
  payload?: {
50
50
  waitId: string;
51
51
  objectiveRevision: number;
52
52
  resolution: "continued" | "skipped";
53
+ } | {
54
+ waitId: string;
55
+ objectiveRevision: number;
56
+ resolution: "answered" | "agent_decide" | "cancelled";
53
57
  };
54
58
  attachments?: import("hono/dist/types/utils/types.js").JSONValue[];
55
59
  contextRefs?: {
@@ -141,11 +145,15 @@ export declare function replaceLatestSessionTurn(c: Context, deps: Authenticated
141
145
  status: import("../../../storage/sqlite/session-input-repository.js").SessionInputStatus;
142
146
  content: string;
143
147
  taskRunId?: string;
144
- kind: "message" | "connection_resume";
148
+ kind: "message" | "connection_resume" | "clarification_resume";
145
149
  payload?: {
146
150
  waitId: string;
147
151
  objectiveRevision: number;
148
152
  resolution: "continued" | "skipped";
153
+ } | {
154
+ waitId: string;
155
+ objectiveRevision: number;
156
+ resolution: "answered" | "agent_decide" | "cancelled";
149
157
  };
150
158
  attachments?: import("hono/dist/types/utils/types.js").JSONValue[];
151
159
  contextRefs?: {
@@ -1,9 +1,13 @@
1
- import { validateWebchatContent } from "../../chat-limits.js";
1
+ import { chooseModelThinking } from "../../../../packages/gateway-contract/src/model-selection.js";
2
+ import { init_providers, resolveModel } from "../../../providers/index.js";
3
+ import { getModelThinking } from "../../../providers/model-thinking.js";
4
+ import { validateWebchatAttachments, validateWebchatContent } from "../../chat-limits.js";
2
5
  import { validateSideChatSelections } from "../../side-chat/context-snapshot.js";
3
6
  import { SideChatError, parseThinkingLevel } from "../../side-chat/manager.js";
4
7
  import "../../side-chat/index.js";
5
8
  import { createGatewayRouteLogger, logRouteError } from "../lib/route-logger.js";
6
9
  //#region src/gateway/hono/routes/side-chats.ts
10
+ init_providers();
7
11
  const CLIENT_HEADER = "x-xopc-client-instance-id";
8
12
  const log = createGatewayRouteLogger("SideChats");
9
13
  function registerSideChatRoutes(authenticated, deps) {
@@ -64,9 +68,18 @@ function registerSideChatRoutes(authenticated, deps) {
64
68
  const body = await c.req.json().catch(() => ({}));
65
69
  if (body.modelRef !== void 0 && typeof body.modelRef !== "string") throw new SideChatError("modelRef must be a string", "INVALID_REQUEST");
66
70
  const modelRef = typeof body.modelRef === "string" ? body.modelRef : void 0;
71
+ const current = service.sideChats.get(c.req.param("sideChatId"), readClientInstanceId(c, body.clientInstanceId));
72
+ const nextModelRef = modelRef ?? current.config.modelRef;
73
+ let thinking;
74
+ try {
75
+ thinking = getModelThinking(resolveModel(nextModelRef));
76
+ } catch {
77
+ throw new SideChatError(`Model unavailable: ${nextModelRef}`, "INVALID_REQUEST");
78
+ }
79
+ const requestedThinking = parseThinkingLevel(body.thinkingLevel);
67
80
  const sideChat = service.sideChats.updateConfig(c.req.param("sideChatId"), readClientInstanceId(c, body.clientInstanceId), {
68
- modelRef,
69
- thinkingLevel: parseThinkingLevel(body.thinkingLevel)
81
+ modelRef: nextModelRef,
82
+ thinkingLevel: chooseModelThinking(thinking, requestedThinking ?? current.config.thinkingLevel)
70
83
  });
71
84
  return c.json({
72
85
  ok: true,
@@ -101,9 +114,16 @@ function registerSideChatRoutes(authenticated, deps) {
101
114
  try {
102
115
  const body = await c.req.json().catch(() => ({}));
103
116
  const content = typeof body.content === "string" ? body.content : "";
117
+ const attachments = Array.isArray(body.attachments) ? body.attachments : void 0;
104
118
  const contentError = validateWebchatContent(content);
105
119
  if (contentError) throw new SideChatError(contentError, "INVALID_REQUEST");
106
- const result = service.sideChatRuns.submit(c.req.param("sideChatId"), readClientInstanceId(c, body.clientInstanceId), content);
120
+ const attachmentError = validateWebchatAttachments(attachments);
121
+ if (attachmentError) throw new SideChatError(attachmentError, "INVALID_REQUEST");
122
+ if (!content.trim() && !attachments?.length) throw new SideChatError("content or attachments are required", "INVALID_REQUEST");
123
+ const result = service.sideChatRuns.submit(c.req.param("sideChatId"), readClientInstanceId(c, body.clientInstanceId), {
124
+ content,
125
+ attachments
126
+ });
107
127
  return c.json({
108
128
  ok: true,
109
129
  payload: result
@@ -57,7 +57,7 @@ function requiredGatewayScope(method, path) {
57
57
  if (path.startsWith("/api/home") || path.startsWith("/api/inbox")) return methodScope(method, "tasks.read", "tasks.write");
58
58
  if (path.startsWith("/api/automations") || path.startsWith("/api/automation-runs")) return methodScope(method, "automations.read", "automations.write");
59
59
  if (path.startsWith("/api/workflows")) return methodScope(method, "automations.read", "automations.write");
60
- if (path.startsWith("/api/voice") || path.startsWith("/api/media") || path.startsWith("/api/clarify")) return "sessions.write";
60
+ if (path.startsWith("/api/voice") || path.startsWith("/api/media") || path.startsWith("/api/clarifications")) return "sessions.write";
61
61
  if (path.startsWith("/api/commands") || path.startsWith("/api/skills")) return methodScope(method, "agents.read", "gateway.admin");
62
62
  if (path.startsWith("/api/workspace") || path.startsWith("/api/files") || path.startsWith("/api/projects") || path.startsWith("/api/notes") || path.startsWith("/api/shares")) return methodScope(method, "workspace.read", "workspace.write");
63
63
  return "gateway.admin";
@@ -1,31 +1,12 @@
1
1
  import type { TurnOrigin } from '@xopcai/endpoint-tools-protocol';
2
- /**
3
- * GatewayAgentRunner — webchat agent invocation and the surrounding control
4
- * surface (abort, steer, clarify-bridge plumbing, scheduled Task continuations).
5
- *
6
- * Was 200 lines of `GatewayService` covering seven concerns that all hung off
7
- * the same handful of fields (`activeWebchatRunBySession`, `runAbortControllers`,
8
- * `clarifyBridge`, `runRelay`):
9
- *
10
- * - `runAgent(message, channel, chatId, ...)` — wraps {@link runGatewayAgent}
11
- * - `abortAgentRun(runId)` — POST /api/agent/abort + cleanup
12
- * - `submitClarifyResponse(requestId, answer)` — UI answers a `clarify` call
13
- * - `runScheduledWebchatTurn(sk, userTurn)` — background webchat user turn
14
- * - `drainScheduledWebchatContinuation(sk, msg)` — background Task continuation
15
- * - `clarifyForSession({ sessionKey, request })` — clarify-bridge dispatch
16
- * used by `gatewayClarify.requestClarification` in AgentService
17
- *
18
- * Owns the two state maps (`activeWebchatRunBySession`, `runAbortControllers`)
19
- * directly so peer coordinators (sessions-api, marketplace, config) cannot
20
- * accidentally mutate them.
21
- */
2
+ import type { ClarificationResponseAction } from '@xopcai/gateway-contract';
22
3
  import type { Config } from '../../config/schema.js';
23
4
  import type { MessageBus } from '../../infra/bus/index.js';
24
5
  import type { AgentService } from '../../agent/service.js';
25
6
  import type { ChannelManager } from '../../channels/manager.js';
26
7
  import type { SessionIndex } from '../../session/index.js';
27
- import type { ClarifyStreamEvent } from '../clarify-bridge.js';
28
- import { ClarifyBridge, type ClarifyBridgeRequest } from '../clarify-bridge.js';
8
+ import { type ClarificationStreamEvent } from '../ephemeral-clarification-waiter.js';
9
+ import type { ClarifyRequestPayload, ClarifyRequestResult } from '../../agent/tools/clarify-tool.js';
29
10
  import type { UserTurnAttachment, UserTurnInput } from '../user-turn-input.js';
30
11
  import type { AgentSourceContext, TurnContextRef } from '../../agent/source-context/types.js';
31
12
  import { SessionInputCoordinator, type ReplaceLatestTurnInput, type SubmitSessionInput } from './session-input-coordinator.js';
@@ -49,11 +30,10 @@ export declare class GatewayAgentRunner {
49
30
  private readonly runAbortControllers;
50
31
  private readonly runCompletions;
51
32
  private readonly resolveRunCompletions;
52
- private readonly clarifyBridge;
33
+ private readonly ephemeralClarifications;
53
34
  /** Maps webchat session key → active `runId` for `clarify` tool routing. */
54
35
  private readonly activeWebchatRunBySession;
55
36
  private readonly externalStreamBySession;
56
- private readonly externalClarificationTimeouts;
57
37
  private readonly externalClarificationResponses;
58
38
  readonly inputs: SessionInputCoordinator;
59
39
  private readonly unsubscribeConnectionWait;
@@ -65,11 +45,8 @@ export declare class GatewayAgentRunner {
65
45
  sessionKey: string;
66
46
  runId: string;
67
47
  }>;
68
- getClarifyBridge(): ClarifyBridge;
69
- /** Called from `GatewayService.stop()` so the bridge gets cleaned up. */
70
- disposeClarifyBridge(): void;
71
- registerExternalWebchatRun(sessionKey: string, runId: string, publish: (event: ClarifyStreamEvent) => void, options?: {
72
- clarificationTimeoutMs?: number | null;
48
+ disposeClarifications(): void;
49
+ registerExternalWebchatRun(sessionKey: string, runId: string, publish: (event: ClarificationStreamEvent) => void, options?: {
73
50
  beforeClarificationResponse?: () => boolean;
74
51
  }): void;
75
52
  unregisterExternalWebchatRun(sessionKey: string, runId: string): void;
@@ -126,16 +103,26 @@ export declare class GatewayAgentRunner {
126
103
  aborted: boolean;
127
104
  idle: boolean;
128
105
  }>;
129
- /** Deliver a user's answer to a pending `clarify` tool call. */
130
- submitClarifyResponse(requestId: string, answer: string): boolean;
106
+ answerEphemeralClarification(requestId: string, answer: string): boolean;
107
+ getClarificationState(sessionKey: string): import("@xopcai/gateway-contract").ClarificationWaitSnapshot;
108
+ resolveClarificationResponse(input: {
109
+ id: string;
110
+ expectedVersion: number;
111
+ idempotencyKey: string;
112
+ action: ClarificationResponseAction;
113
+ answer?: string;
114
+ }): import("../../storage/sqlite/clarification-wait-repository.js").ResolveClarificationResult;
115
+ getClarificationById(id: string): import("@xopcai/gateway-contract").ClarificationWait;
116
+ answerClarificationChoice(requestId: string, choiceIndex: number, idempotencyKey: string): boolean;
117
+ answerClarificationText(sessionKey: string, answer: string, idempotencyKey: string): boolean;
131
118
  /** Same execution path as scheduled continuation, but lets callers observe failures. */
132
119
  runScheduledWebchatTurn(sessionKey: string, userTurn: UserTurnInput): Promise<void>;
133
120
  runScheduledWebchatContinuation(sessionKey: string, message: string): Promise<void>;
134
121
  /** Background drain for extension-initiated webchat turns (`scheduleWebchatContinuation`). */
135
122
  drainScheduledWebchatContinuation(sessionKey: string, message: string): Promise<void>;
136
123
  /**
137
- * Resolve clarify-bridge config for `sessionKey`: who delivers the question
138
- * (webchat stream, Telegram message, or both), then start the bridge request.
124
+ * Persist normal clarification waits and use the lifecycle-bound waiter only
125
+ * for caller-owned ephemeral sessions.
139
126
  * Rejects when neither path is available (e.g. CLI without webchat or TG).
140
127
  *
141
128
  * `publishStreamFor(runId)` is the bridge into AgentService's
@@ -144,8 +131,10 @@ export declare class GatewayAgentRunner {
144
131
  */
145
132
  requestClarification(opts: {
146
133
  sessionKey: string;
147
- request: ClarifyBridgeRequest;
148
- publishStreamFor: (runId: string) => (event: ClarifyStreamEvent) => void;
149
- }): Promise<string>;
134
+ runId: string;
135
+ toolCallId: string;
136
+ request: ClarifyRequestPayload;
137
+ publishStreamFor: (runId: string) => (event: ClarificationStreamEvent) => void;
138
+ }): Promise<ClarifyRequestResult>;
150
139
  private deliverTelegramClarify;
151
140
  }
@@ -1,15 +1,20 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
3
  import { listActiveSessionInputRuns } from "../../storage/sqlite/session-input-repository.js";
4
+ import { createClarificationWait, getClarification, getClarificationSnapshot, resolveClarification, supersedeActiveClarification } from "../../storage/sqlite/clarification-wait-repository.js";
4
5
  import { onConnectionWaitChanged } from "../../storage/sqlite/connection-wait-repository.js";
5
6
  import "../../storage/sqlite/index.js";
6
- import { ClarifyBridge } from "../clarify-bridge.js";
7
+ import { EphemeralClarificationWaiter } from "../ephemeral-clarification-waiter.js";
7
8
  import { runGatewayAgent } from "./run-gateway-agent.js";
8
9
  import { fitSourceContextsToBudget } from "../../agent/source-context/budget.js";
9
10
  import { SessionInputCoordinator } from "./session-input-coordinator.js";
10
11
  import crypto from "node:crypto";
11
12
  //#region src/gateway/service/agent-runner.ts
12
13
  init_logger();
14
+ /**
15
+ * Owns gateway agent runs, durable clarification coordination, and the
16
+ * lifecycle-bound clarification waiter used by ephemeral side chats.
17
+ */
13
18
  const log = createLogger("Gateway:AgentRunner");
14
19
  const MAX_TURN_CONTEXTS = 5;
15
20
  var GatewayAgentRunner = class {
@@ -18,11 +23,10 @@ var GatewayAgentRunner = class {
18
23
  runAbortControllers = /* @__PURE__ */ new Map();
19
24
  runCompletions = /* @__PURE__ */ new Map();
20
25
  resolveRunCompletions = /* @__PURE__ */ new Map();
21
- clarifyBridge = new ClarifyBridge();
26
+ ephemeralClarifications = new EphemeralClarificationWaiter();
22
27
  /** Maps webchat session key → active `runId` for `clarify` tool routing. */
23
28
  activeWebchatRunBySession = /* @__PURE__ */ new Map();
24
29
  externalStreamBySession = /* @__PURE__ */ new Map();
25
- externalClarificationTimeouts = /* @__PURE__ */ new Map();
26
30
  externalClarificationResponses = /* @__PURE__ */ new Map();
27
31
  inputs;
28
32
  unsubscribeConnectionWait;
@@ -104,30 +108,24 @@ var GatewayAgentRunner = class {
104
108
  runId
105
109
  }));
106
110
  }
107
- getClarifyBridge() {
108
- return this.clarifyBridge;
109
- }
110
- /** Called from `GatewayService.stop()` so the bridge gets cleaned up. */
111
- disposeClarifyBridge() {
112
- this.clarifyBridge.dispose();
111
+ disposeClarifications() {
112
+ this.ephemeralClarifications.dispose();
113
113
  this.unsubscribeConnectionWait();
114
114
  }
115
115
  registerExternalWebchatRun(sessionKey, runId, publish, options) {
116
116
  this.activeWebchatRunBySession.set(sessionKey, runId);
117
117
  this.externalStreamBySession.set(sessionKey, publish);
118
- if (options?.clarificationTimeoutMs !== void 0) this.externalClarificationTimeouts.set(sessionKey, options.clarificationTimeoutMs);
119
118
  if (options?.beforeClarificationResponse) this.externalClarificationResponses.set(sessionKey, options.beforeClarificationResponse);
120
119
  }
121
120
  unregisterExternalWebchatRun(sessionKey, runId) {
122
121
  if (this.activeWebchatRunBySession.get(sessionKey) === runId) {
123
122
  this.activeWebchatRunBySession.delete(sessionKey);
124
123
  this.externalStreamBySession.delete(sessionKey);
125
- this.externalClarificationTimeouts.delete(sessionKey);
126
124
  this.externalClarificationResponses.delete(sessionKey);
127
125
  }
128
126
  }
129
127
  cancelClarificationForRun(runId) {
130
- this.clarifyBridge.cancelForRun(runId);
128
+ this.ephemeralClarifications.cancelForRun(runId);
131
129
  }
132
130
  async *runAgent(message, channel, chatId, origin, attachments, thinking, runOptions) {
133
131
  const trackedRunId = runOptions?.runId;
@@ -185,7 +183,7 @@ var GatewayAgentRunner = class {
185
183
  }
186
184
  /** Abort an in-flight webchat agent run. */
187
185
  async abortAgentRun(runId) {
188
- this.clarifyBridge.cancelForRun(runId);
186
+ this.ephemeralClarifications.cancelForRun(runId);
189
187
  const keysToMark = [];
190
188
  for (const [sk, id] of this.activeWebchatRunBySession) if (id === runId) keysToMark.push(sk);
191
189
  const c = this.runAbortControllers.get(runId);
@@ -194,10 +192,13 @@ var GatewayAgentRunner = class {
194
192
  idle: true
195
193
  };
196
194
  const completion = this.runCompletions.get(runId);
197
- for (const sk of keysToMark) this.opts.sessionIndex.appendTranscriptContextEntry(sk, {
198
- text: "Webchat agent run aborted",
199
- data: { runId }
200
- }).catch(() => {});
195
+ for (const sk of keysToMark) {
196
+ if ((getClarificationSnapshot(sk)?.clarification)?.originRunId === runId) supersedeActiveClarification(sk);
197
+ this.opts.sessionIndex.appendTranscriptContextEntry(sk, {
198
+ text: "Webchat agent run aborted",
199
+ data: { runId }
200
+ }).catch(() => {});
201
+ }
201
202
  c.abort();
202
203
  const { abortEmbeddedRun } = await import("../../agent/embedded/runs.js");
203
204
  await Promise.all(keysToMark.map((sessionKey) => abortEmbeddedRun(sessionKey).catch(() => false)));
@@ -207,9 +208,45 @@ var GatewayAgentRunner = class {
207
208
  idle: true
208
209
  };
209
210
  }
210
- /** Deliver a user's answer to a pending `clarify` tool call. */
211
- submitClarifyResponse(requestId, answer) {
212
- return this.clarifyBridge.handleResponse(requestId, answer);
211
+ answerEphemeralClarification(requestId, answer) {
212
+ return this.ephemeralClarifications.answer(requestId, answer);
213
+ }
214
+ getClarificationState(sessionKey) {
215
+ return getClarificationSnapshot(sessionKey);
216
+ }
217
+ resolveClarificationResponse(input) {
218
+ const result = resolveClarification(input);
219
+ if (result.ok) {
220
+ this.opts.emit("clarification.updated", result.clarification);
221
+ if (result.queued) this.inputs.drain(result.clarification.sessionKey);
222
+ }
223
+ return result;
224
+ }
225
+ getClarificationById(id) {
226
+ return getClarification(id);
227
+ }
228
+ answerClarificationChoice(requestId, choiceIndex, idempotencyKey) {
229
+ const wait = getClarification(requestId);
230
+ const answer = wait?.status === "open" ? wait.choices?.[choiceIndex] : void 0;
231
+ if (!answer) return false;
232
+ return this.resolveClarificationResponse({
233
+ id: wait.id,
234
+ expectedVersion: wait.version,
235
+ idempotencyKey,
236
+ action: "answer",
237
+ answer
238
+ }).ok;
239
+ }
240
+ answerClarificationText(sessionKey, answer, idempotencyKey) {
241
+ const wait = getClarificationSnapshot(sessionKey)?.clarification;
242
+ if (!wait || wait.status !== "open" || !answer.trim()) return false;
243
+ return this.resolveClarificationResponse({
244
+ id: wait.id,
245
+ expectedVersion: wait.version,
246
+ idempotencyKey,
247
+ action: "answer",
248
+ answer
249
+ }).ok;
213
250
  }
214
251
  /** Same execution path as scheduled continuation, but lets callers observe failures. */
215
252
  async runScheduledWebchatTurn(sessionKey, userTurn) {
@@ -243,8 +280,8 @@ var GatewayAgentRunner = class {
243
280
  }
244
281
  }
245
282
  /**
246
- * Resolve clarify-bridge config for `sessionKey`: who delivers the question
247
- * (webchat stream, Telegram message, or both), then start the bridge request.
283
+ * Persist normal clarification waits and use the lifecycle-bound waiter only
284
+ * for caller-owned ephemeral sessions.
248
285
  * Rejects when neither path is available (e.g. CLI without webchat or TG).
249
286
  *
250
287
  * `publishStreamFor(runId)` is the bridge into AgentService's
@@ -253,33 +290,67 @@ var GatewayAgentRunner = class {
253
290
  */
254
291
  async requestClarification(opts) {
255
292
  const { sessionKey, request, publishStreamFor } = opts;
256
- const runId = this.activeWebchatRunBySession.get(sessionKey);
293
+ const runId = this.activeWebchatRunBySession.get(sessionKey) ?? opts.runId;
257
294
  const publishStream = this.externalStreamBySession.get(sessionKey) ?? (runId ? publishStreamFor(runId) : void 0);
258
295
  const deliver = ((await this.opts.sessionIndex.getSessionMetadata(sessionKey).catch(() => null))?.routing)?.source === "telegram" ? async (ctx) => {
259
296
  await this.deliverTelegramClarify(ctx);
260
297
  } : void 0;
261
- if (!runId && !deliver) return Promise.reject(/* @__PURE__ */ new Error("Clarify is not available for this session (use webchat, Telegram, or CLI)"));
262
- return this.clarifyBridge.startRequest({
263
- timeoutMs: this.externalClarificationTimeouts.get(sessionKey),
298
+ const persistedSession = getClarificationSnapshot(sessionKey);
299
+ if (!persistedSession && this.externalStreamBySession.has(sessionKey)) return this.ephemeralClarifications.start({
264
300
  beforeResponse: this.externalClarificationResponses.get(sessionKey),
265
- sessionKey,
266
301
  runId,
267
- publishStream,
268
- request,
269
- deliver
302
+ publish: publishStream,
303
+ request
304
+ }).then((answer) => ({
305
+ status: "answered",
306
+ answer
307
+ }));
308
+ if (!persistedSession) return Promise.reject(/* @__PURE__ */ new Error("Clarify requires a persisted session."));
309
+ const wait = createClarificationWait({
310
+ sessionKey,
311
+ runId: opts.runId,
312
+ toolCallId: opts.toolCallId,
313
+ kind: request.kind === "approval" ? "approval" : "input",
314
+ question: request.question,
315
+ choices: request.choices,
316
+ suggestedAnswer: request.suggestedAnswer,
317
+ approvalKey: request.approvalKey
318
+ });
319
+ const event = {
320
+ type: "clarify_request",
321
+ requestId: wait.id,
322
+ kind: wait.kind,
323
+ question: wait.question,
324
+ choices: wait.choices,
325
+ suggestedAnswer: wait.suggestedAnswer,
326
+ expiresAt: wait.expiresAt,
327
+ createdAt: wait.createdAt,
328
+ version: wait.version
329
+ };
330
+ if (this.activeWebchatRunBySession.has(sessionKey)) publishStream?.(event);
331
+ if (deliver) await deliver({
332
+ sessionKey,
333
+ requestId: wait.id,
334
+ request
270
335
  });
336
+ return {
337
+ status: "waiting",
338
+ waitId: wait.id,
339
+ expiresAt: wait.expiresAt
340
+ };
271
341
  }
272
342
  async deliverTelegramClarify(ctx) {
273
343
  const routing = (await this.opts.sessionIndex.getSessionMetadata(ctx.sessionKey).catch(() => null))?.routing;
274
344
  if (!routing || routing.source !== "telegram") return;
275
345
  let body = ctx.request.question;
276
- if (ctx.request.default) body += `\n\nDefault if unsure: ${ctx.request.default}`;
346
+ if (ctx.request.suggestedAnswer) body += `\n\nSuggested answer (never selected automatically): ${ctx.request.suggestedAnswer}`;
347
+ body += ctx.request.kind === "approval" ? "\n\nFor safety, this approval expires after 10 minutes." : "\n\nThis question remains available until you answer or cancel the task.";
277
348
  const choices = ctx.request.choices;
278
349
  const buttonRows = choices && choices.length >= 2 ? choices.map((c, i) => [{
279
350
  text: c.length > 64 ? `${c.slice(0, 61)}…` : c,
280
351
  callback_data: `clarify:${ctx.requestId}:${i}`
281
352
  }]) : void 0;
282
- if (!buttonRows) body += "\n\nReply with your answer in this chat.";
353
+ body += buttonRows ? "\n\nReply with your answer, or tap an option below." : "\n\nReply with your answer.";
283
354
  await this.opts.getChannelManager().send({
284
355
  channel: "telegram",
285
356
  chat_id: routing.peerId,
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { getModelRegistry } from "../../providers/model-registry.js";
4
3
  import { loadConfig, saveConfig } from "../../config/loader.js";
4
+ import { getModelRegistry } from "../../providers/model-registry.js";
5
5
  import { init_providers } from "../../providers/index.js";
6
6
  import { disposeAllSessionMcpRuntimes } from "../../agent/mcp/bundle-mcp-runtime.js";
7
7
  import { reloadImageGenerationProviders } from "../../agent/image/generation/provider-registry.js";
@@ -1,6 +1,7 @@
1
1
  import { inboundCorrelationMetadataFromAsyncLogContext, updateAsyncLogContext } from "../../utils/logger/context.js";
2
2
  import { createLogger } from "../../utils/logger/index.js";
3
3
  import { init_logger } from "../../utils/logger.js";
4
+ import { isClarificationSuspended } from "../../storage/sqlite/clarification-wait-repository.js";
4
5
  import { updateInteractionStateFromMessage } from "../../storage/sqlite/interaction-state-repository.js";
5
6
  import { getConnectionResumeInput, isConnectionSuspended } from "../../storage/sqlite/connection-wait-repository.js";
6
7
  import "../../storage/sqlite/index.js";
@@ -144,9 +145,11 @@ async function* runGatewayAgent(deps, message, channel, chatId, origin, attachme
144
145
  for await (const event of eventStream) yield* mapper.map(event);
145
146
  })();
146
147
  for await (const event of coalesceThinkingDeltas(mappedEvents)) yield* emitAndYield([event]);
147
- const suspended = isConnectionSuspended(sessionKey, runId);
148
+ const connectionSuspended = isConnectionSuspended(sessionKey, runId);
149
+ const clarificationSuspended = isClarificationSuspended(sessionKey, runId);
150
+ const suspended = connectionSuspended || clarificationSuspended;
148
151
  const endStatus = mergedSignal.aborted ? "cancelled" : suspended ? "suspended" : "success";
149
- const endSummary = mergedSignal.aborted ? "Interrupted" : suspended ? "Waiting for connection" : "Message processed successfully";
152
+ const endSummary = mergedSignal.aborted ? "Interrupted" : connectionSuspended ? "Waiting for connection" : clarificationSuspended ? "Waiting for user input" : "Message processed successfully";
150
153
  taskRunStatus = mergedSignal.aborted ? "cancelled" : "succeeded";
151
154
  terminalStatus = endStatus;
152
155
  taskRunSummary = endSummary;
@@ -1,6 +1,7 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
3
  import { SessionInstanceChangedError, cancelQueuedSessionInput, claimNextSessionInput, findSessionInput, finishSessionInputRun, getSessionInputById, getSessionInputState, insertSessionInput, mutateQueuedSessionInput, recoverSessionInputState, setSessionInputStatus } from "../../storage/sqlite/session-input-repository.js";
4
+ import { consumeClarificationResume, supersedeActiveClarification } from "../../storage/sqlite/clarification-wait-repository.js";
4
5
  import { replaceLatestSessionTurnAndQueueInput, validateLatestSessionTurnTarget } from "../../storage/sqlite/session-turn-replace-repository.js";
5
6
  import { cancelConnectionObjective, consumeConnectionResume, invalidateConnectionResumeIntent, publishConnectionWait } from "../../storage/sqlite/connection-wait-repository.js";
6
7
  import "../../storage/sqlite/index.js";
@@ -113,6 +114,7 @@ var SessionInputCoordinator = class {
113
114
  if (result.ok === false) return result;
114
115
  if (!result.idempotent) {
115
116
  cancelConnectionObjective(sessionKey);
117
+ supersedeActiveClarification(sessionKey);
116
118
  const replacement = {
117
119
  role: "user",
118
120
  content,
@@ -187,6 +189,7 @@ var SessionInputCoordinator = class {
187
189
  targetRunId: canSteer ? runtime.activeRunId : void 0
188
190
  });
189
191
  invalidateConnectionResumeIntent(sessionKey);
192
+ supersedeActiveClarification(sessionKey);
190
193
  if (canSteer) {
191
194
  if (!await this.deps.steer(sessionKey, content)) {
192
195
  setSessionInputStatus(row.id, "queued", {
@@ -221,7 +224,7 @@ var SessionInputCoordinator = class {
221
224
  const runId = crypto.randomUUID();
222
225
  const input = claimNextSessionInput(sessionKey, runId);
223
226
  if (!input) return;
224
- if (this.deps.beforeExecute && !await this.deps.beforeExecute(input) || !consumeConnectionResume(input)) {
227
+ if (this.deps.beforeExecute && !await this.deps.beforeExecute(input) || !consumeConnectionResume(input) || !consumeClarificationResume(input)) {
225
228
  finishSessionInputRun(sessionKey, runId, "cancelled");
226
229
  this.publish(sessionKey);
227
230
  continue;
@@ -4,8 +4,8 @@ import { retireSessionMcpRuntimeForSessionKey } from "../../agent/mcp/bundle-mcp
4
4
  import "../../agent/mcp/bundle-mcp-tools.js";
5
5
  import { buildSessionTimeline } from "../../session/transcript-outline.js";
6
6
  import { transcriptRowsToClientHistory } from "../../session/client-history.js";
7
- import { withModelConfigLock } from "../../session/model-config-lock.js";
8
7
  import { collectMediaUrisFromValues, deleteMediaUris } from "../../media/session-references.js";
8
+ import { withModelConfigLock } from "../../session/model-config-lock.js";
9
9
  import { getDistinctSessionChatIds } from "./session-chat-ids.js";
10
10
  import { performSessionReset } from "../session-reset-service.js";
11
11
  import { randomUUID } from "node:crypto";
@@ -14,7 +14,7 @@ import { ModelCatalogSyncService } from '../providers/model-catalog-sync-service
14
14
  import { ProjectService } from '../projects/index.js';
15
15
  import { LocalAppService } from '../local-apps/index.js';
16
16
  import { TaskConversationRepository } from '../tasks/task-conversation-repository.js';
17
- import { type BrowserRecipeService } from '../browser/recipes/index.js';
17
+ import { type BrowserAutomationService } from '../browser/automations/index.js';
18
18
  import { listInsights, ProactiveEventService, ProactiveInboxService, ProactiveInboxWorker, ProactiveScenarioService, ProactiveTemporalWorker, ProactiveWorker } from '../proactive/index.js';
19
19
  import { GatewaySessionsApi } from './service/sessions-api.js';
20
20
  import { GatewayMarketplaceService } from './service/marketplace-service.js';
@@ -35,7 +35,7 @@ export declare class GatewayService {
35
35
  private _agentService;
36
36
  private channelManager;
37
37
  private automationService;
38
- private browserRecipeService;
38
+ private browserAutomationService;
39
39
  private notesService;
40
40
  private extensionLoader;
41
41
  private extensionMetadataSnapshot;
@@ -56,7 +56,7 @@ export declare class GatewayService {
56
56
  readonly voiceRealtime: VoiceRealtimeRuntime;
57
57
  getConfig(): Config;
58
58
  getModelCatalogSync(): ModelCatalogSyncService;
59
- get browserRecipes(): BrowserRecipeService;
59
+ get browserAutomations(): BrowserAutomationService;
60
60
  private stopGatewayUpdateCheck;
61
61
  /** When set (e.g. by `GatewayServer`), `triggerGatewayProcessRestart` can stop HTTP then exit. */
62
62
  private gatewayShutdownForRestart;
@@ -81,7 +81,7 @@ export declare class GatewayService {
81
81
  private stopRealtimeLogBridge;
82
82
  /**
83
83
  * Webchat agent invocation surface (`runAgent`, `abortAgentRun`, `steer*`,
84
- * `submitClarifyResponse`, clarify-bridge dispatch). Owns the
84
+ * clarification dispatch). Owns the
85
85
  * `activeWebchatRunBySession` + `runAbortControllers` maps.
86
86
  */
87
87
  readonly agentRunner: GatewayAgentRunner;
@@ -168,7 +168,9 @@ export declare class GatewayService {
168
168
  idle: boolean;
169
169
  }>;
170
170
  getActiveWebchatRunId(sessionKey: string): string | undefined;
171
- submitClarifyResponse(requestId: string, answer: string): boolean;
171
+ answerEphemeralClarification(requestId: string, answer: string): boolean;
172
+ getClarificationState(sessionKey: string): import("@xopcai/gateway-contract/src/clarifications.js").ClarificationWaitSnapshot;
173
+ resolveClarificationResponse(input: Parameters<GatewayAgentRunner['resolveClarificationResponse']>[0]): import("../storage/sqlite/clarification-wait-repository.js").ResolveClarificationResult;
172
174
  private initializeExtensionLoader;
173
175
  private registerExtensionChannelPlugins;
174
176
  /**
@@ -196,10 +198,8 @@ export declare class GatewayService {
196
198
  */
197
199
  onHttpListening(): Promise<void>;
198
200
  stop(): Promise<void>;
199
- /** Start the browser extension WS server when backend is 'extension'. */
201
+ /** Start the browser extension WebSocket server when its driver is active. */
200
202
  private startBrowserExtensionServerIfNeeded;
201
- /** Release the gateway's hold on the shared extension bridge (does not restart). */
202
- releaseBrowserExtensionBridge(): Promise<void>;
203
203
  /**
204
204
  * Start/stop/rebind the Chrome extension bridge.
205
205
  * PATCH saves update config in memory without re-running gateway startup, so this must run on save too.