@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.
- package/README.md +8 -5
- package/README.zh-CN.md +8 -5
- package/dist/browser-ext/dist/background.js +358 -768
- package/dist/browser-ext/manifest.json +1 -2
- package/dist/extensions/telegram/src/inbound-processor.js +2 -2
- package/dist/extensions/telegram/src/plugin.js +3 -2
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{activity-store-DfBjTSo9.js → activity-store-CeS1bgXP.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-Bo_dmLv8.js → agent-avatar-dicebear-BdF3HhCW.js} +1 -1
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-Bs34Kp0K.js +1 -0
- package/dist/gateway/static/root/assets/{agents-yuUn8n-f.js → agents-DARlgjTm.js} +1 -1
- package/dist/gateway/static/root/assets/{api-zxpcJfgj.js → api-zMPeC0yU.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-Cz56nrVF.js → app-management-settings-panel-BaAFln8W.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-DxSws5U4.js → appearance-settings-CXvsoBlw.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-BhgvfBJT.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-7k15-hqo.js → archive-plugin-C0o_mVQI.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-B-SFpjd9.js → attachment-load-B5Ry3tGL.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-Qy36j19q.js → automations-page-DY5QAEQd.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-BzX4lILP.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-CPOZQt8F.js → binary-plugins-BydpEgBA.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-DhvVlIp9.js → block-editor-D0CpUOMo.js} +3 -3
- package/dist/gateway/static/root/assets/browser-automation-inputs-DzbTsGI6.js +1 -0
- package/dist/gateway/static/root/assets/browser-automations-page-D7fZYjni.js +3 -0
- package/dist/gateway/static/root/assets/browser-settings-page-BBdMqxl0.js +3 -0
- package/dist/gateway/static/root/assets/capabilities-settings-panel-D_WfftDW.js +7 -0
- package/dist/gateway/static/root/assets/channels-settings-bdRLT9KA.js +1 -0
- package/dist/gateway/static/root/assets/{channels-status-swr-CX-yWwLD.js → channels-status-swr-BGGRTkn6.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-terminal-dock-1PJoxRuV.js → chat-terminal-dock-_CP4nvlg.js} +2 -2
- package/dist/gateway/static/root/assets/connectors-page-CPDjU5wU.js +2 -0
- package/dist/gateway/static/root/assets/{cron-expression-CBCc6zFA.js → cron-expression-g2U8Rllf.js} +1 -1
- package/dist/gateway/static/root/assets/{date-picker-u8K5Kt_N.js → date-picker-SmVlhtj_.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-y_i_cnpz.js → dependency-picker-D-0gcbbM.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-DyL0JxLm.js → desktop-pet-Cl3JRIu6.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-d2d_IsyP.js → desktop-pet-settings-D7kvWQ9H.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-DqIBKJwl.js → extension-debug-page-DtP2tJHY.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-DUW1xxj2.js → extension-page-CphZDdoT.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-BHY9qaNw.js → extension-settings-page-CsxVLV4-.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-CMNbl0FZ.js → gateway-config-swr-BW3Bx-aV.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-DxBZ05dX.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-CR7Xg8As.js → gateway-startup-retry-DAq74TZe.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-7CD9iPR7.js → heartbeat-settings-DWcKsIoZ.js} +1 -1
- package/dist/gateway/static/root/assets/home-page-BdvLZKQZ.js +1 -0
- package/dist/gateway/static/root/assets/{image-generation-api-C5mn73ca.js → image-generation-api-MPuaXDRs.js} +1 -1
- package/dist/gateway/static/root/assets/index-C7RDs6S-.js +74 -0
- package/dist/gateway/static/root/assets/index-Cu8xqZQ9.css +2 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BtlqMleF.js → keyboard-shortcuts-settings-CfhaTqgE.js} +1 -1
- package/dist/gateway/static/root/assets/{local-app-workbench-page-BjxfkjxE.js → local-app-workbench-page-CR6asX7L.js} +2 -2
- package/dist/gateway/static/root/assets/{local-apps-page-B7xqQe2s.js → local-apps-page-g01W3kEK.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-CF4erhjB.js → locale-store-BkeaPZpn.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-kACaPZKL.js → logs-page-ZP4QTWoC.js} +2 -2
- package/dist/gateway/static/root/assets/{management-settings-A432siER.js → management-settings-DeGxJF_Z.js} +1 -1
- package/dist/gateway/static/root/assets/markdown-view-Ca7BRBLL.js +201 -0
- package/dist/gateway/static/root/assets/{media-plugins-CpvYiauZ.js → media-plugins-FmOhmzlD.js} +1 -1
- package/dist/gateway/static/root/assets/messages-C72stReU.js +3 -0
- package/dist/gateway/static/root/assets/{mobile-pairing-wizard-DyjVGngO.js → mobile-pairing-wizard-BXNbn05L.js} +1 -1
- package/dist/gateway/static/root/assets/note-detail-panel-EeVeF4II.js +5 -0
- package/dist/gateway/static/root/assets/notes-page-D7bMff96.js +8 -0
- package/dist/gateway/static/root/assets/{page-tabs-B3FKzjR6.js → page-tabs-pyukZ1PJ.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-DnjrwAHD.js → preview-open-alternatives-slFHoMUe.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-COcr_NUJ.js → product-open-page-CXa3FNNk.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-BDF88VdN.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-DeTD6pu1.js +1 -0
- package/dist/gateway/static/root/assets/{registry-api-BsRBlji7.js → registry-api-CviQoUBf.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CxKrdQ6a.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-LO4wZ_dO.js → runtime-tools-settings-panel-O9D9o7-O.js} +2 -2
- package/dist/gateway/static/root/assets/{schema-form-crcj4-Pm.js → schema-form-8FesicnL.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-DUFJN-2t.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-CcSYDjaH.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-Bl4MvTmq.js → settings-form-section-CBic9TFH.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-DplrjZ6x.js → settings-page-Xz66_Mjg.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-C6DuwrP5.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-CJP1kURj.js → share-preview-page--JpjwB58.js} +1 -1
- package/dist/gateway/static/root/assets/{shares-settings-CemgzEi4.js → shares-settings-CovcdHSC.js} +1 -1
- package/dist/gateway/static/root/assets/skill-reload-api-CrHagTsE.js +1 -0
- package/dist/gateway/static/root/assets/{skills-page-DsjcKg9Q.js → skills-page-fVKExKv5.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page.utils-D6gWBbvy.js → skills-page.utils-Yv9u3uJp.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-_eCXfqCo.js → system-settings-panel-CCWjVdc2.js} +1 -1
- package/dist/gateway/static/root/assets/{task-detail-page-D0Z_K5JT.js → task-detail-page-I8hueJnG.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-BOgkc_9D.js → theme-store-BtkaVpMm.js} +1 -1
- package/dist/gateway/static/root/assets/{tunnel-api-W5mktxl1.js → tunnel-api-C__W9BaN.js} +1 -1
- package/dist/gateway/static/root/assets/{use-autosave-Na2DYzT3.js → use-autosave-Dow9RRcq.js} +1 -1
- package/dist/gateway/static/root/assets/user-model-page-CU6nxmoM.js +2 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-OXweUxS_.js → voice-api-key-field-CvF3lEyx.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-config-api-C-ryeIxj.js → voice-config-api-BEUVAyM6.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-BqOsO47I.js → work-discovery-overlay-B9PDfReq.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-B9S_lfT1.js → workflow-run-setup-panel-kWGFkhjz.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-B4Is5E42.js +5 -0
- package/dist/gateway/static/root/index.html +10 -10
- package/dist/package.js +1 -1
- package/dist/packages/gateway-contract/src/new-session.js +9 -0
- package/dist/packages/realtime-protocol/src/voice.js +6 -1
- package/dist/src/agent/agent-manager.d.ts +2 -1
- package/dist/src/agent/agent-manager.js +26 -8
- package/dist/src/agent/background-review/run-background-review.js +1 -1
- package/dist/src/agent/coding/repository-instructions.js +2 -2
- package/dist/src/agent/coding/workspace-revision.js +2 -2
- package/dist/src/agent/commands/command-isolation.js +2 -2
- package/dist/src/agent/embedded/execution-context.d.ts +2 -1
- package/dist/src/agent/embedded/execution-context.js +10 -4
- package/dist/src/agent/embedded/index.d.ts +1 -1
- package/dist/src/agent/embedded/index.js +2 -2
- package/dist/src/agent/embedded/model-runtime.js +1 -1
- package/dist/src/agent/embedded/run-for-session.js +5 -4
- package/dist/src/agent/embedded/run-turn.js +22 -3
- package/dist/src/agent/embedded/types.d.ts +1 -1
- package/dist/src/agent/external-tools/composio-provider.d.ts +1 -0
- package/dist/src/agent/external-tools/composio-provider.js +64 -34
- package/dist/src/agent/external-tools/search-error.js +5 -3
- package/dist/src/agent/image/tool-model-config.js +1 -1
- package/dist/src/agent/mcp/oauth/mcp-oauth-store.js +1 -1
- package/dist/src/agent/service/direct-turn-helpers.js +6 -3
- package/dist/src/agent/service/process-direct-streaming.js +6 -3
- package/dist/src/agent/service.d.ts +2 -0
- package/dist/src/agent/service.js +25 -10
- package/dist/src/agent/service.types.d.ts +2 -1
- package/dist/src/agent/session/session-inspector.js +1 -1
- package/dist/src/agent/skills/hub-lock.js +1 -1
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js +4 -0
- package/dist/src/agent/tasks/task-judge-service.js +3 -3
- package/dist/src/agent/tool-manuals/browser.d.ts +1 -1
- package/dist/src/agent/tool-manuals/browser.js +15 -226
- package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +4 -21
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +48 -165
- package/dist/src/agent/tools/browser/tool/schemas.d.ts +203 -16
- package/dist/src/agent/tools/browser/tool/schemas.js +146 -16
- package/dist/src/agent/tools/browser-automation-tool.d.ts +121 -0
- package/dist/src/agent/tools/browser-automation-tool.js +197 -0
- package/dist/src/agent/tools/clarify-tool.d.ts +17 -3
- package/dist/src/agent/tools/clarify-tool.js +27 -32
- package/dist/src/agent/tools/cli-clarify.js +23 -8
- package/dist/src/agent/tools/factory.d.ts +6 -9
- package/dist/src/agent/tools/factory.js +42 -59
- package/dist/src/agent/tools/index.d.ts +2 -2
- package/dist/src/agent/tools/index.js +3 -3
- package/dist/src/agent/tools/review-workspace.js +2 -2
- package/dist/src/ai-assist/text-assist.js +1 -1
- package/dist/src/auth/credentials.js +2 -2
- package/dist/src/auth/oauth/xopc-cloud.js +3 -1
- package/dist/src/auth/profiles/store.js +1 -1
- package/dist/src/auth/sync-provider-auth.js +2 -2
- package/dist/src/automations/domain/defaults.js +1 -1
- package/dist/src/automations/domain/types.d.ts +5 -5
- package/dist/src/automations/domain/validation.d.ts +16 -16
- package/dist/src/automations/domain/validation.js +3 -3
- package/dist/src/automations/draft/automation-draft-validator.d.ts +4 -4
- package/dist/src/automations/draft/automation-draft-validator.js +1 -1
- package/dist/src/automations/service/action-executor.d.ts +1 -1
- package/dist/src/automations/service/action-executor.js +7 -7
- package/dist/src/browser/{recipes → automations}/index.d.ts +1 -0
- package/dist/src/browser/automations/index.js +4 -0
- package/dist/src/browser/automations/repository.d.ts +13 -0
- package/dist/src/browser/automations/repository.js +60 -0
- package/dist/src/browser/automations/runner.d.ts +17 -0
- package/dist/src/browser/automations/runner.js +173 -0
- package/dist/src/browser/automations/runtime-service.d.ts +6 -0
- package/dist/src/browser/automations/runtime-service.js +37 -0
- package/dist/src/browser/automations/schema.d.ts +144 -0
- package/dist/src/browser/automations/schema.js +135 -0
- package/dist/src/browser/automations/service.d.ts +146 -0
- package/dist/src/browser/automations/service.js +168 -0
- package/dist/src/browser/automations/types.d.ts +90 -0
- package/dist/src/browser/cache-dir-policy.d.ts +1 -1
- package/dist/src/browser/cache-dir-policy.js +1 -4
- package/dist/src/browser/drivers/browser-driver.d.ts +17 -0
- package/dist/src/browser/drivers/create-driver.d.ts +3 -0
- package/dist/src/browser/drivers/create-driver.js +84 -0
- package/dist/src/browser/drivers/extension-driver.d.ts +20 -0
- package/dist/src/browser/drivers/extension-driver.js +47 -0
- package/dist/src/browser/drivers/playwright-driver.d.ts +38 -0
- package/dist/src/browser/drivers/playwright-driver.js +406 -0
- package/dist/src/browser/index.d.ts +10 -15
- package/dist/src/browser/index.js +10 -15
- package/dist/src/browser/install-lock.d.ts +1 -2
- package/dist/src/browser/install-lock.js +3 -9
- package/dist/src/browser/install-progress.d.ts +1 -1
- package/dist/src/browser/observation/format.d.ts +2 -0
- package/dist/src/browser/observation/format.js +26 -0
- package/dist/src/browser/policy/approval-store.d.ts +17 -0
- package/dist/src/browser/policy/approval-store.js +62 -0
- package/dist/src/browser/policy/browser-policy.d.ts +3 -0
- package/dist/src/browser/policy/browser-policy.js +27 -0
- package/dist/src/browser/providers/browser-ext-install.d.ts +1 -1
- package/dist/src/browser/providers/browser-ext-install.js +4 -6
- package/dist/src/browser/providers/browser-use.js +1 -1
- package/dist/src/browser/providers/browserbase.js +1 -1
- package/dist/src/browser/providers/extension-ws-acquire.d.ts +1 -4
- package/dist/src/browser/providers/extension-ws-acquire.js +1 -13
- package/dist/src/browser/providers/extension.d.ts +3 -22
- package/dist/src/browser/providers/extension.js +7 -15
- package/dist/src/browser/providers/index.d.ts +2 -2
- package/dist/src/browser/providers/index.js +3 -3
- package/dist/src/browser/providers/types.d.ts +0 -94
- package/dist/src/browser/readiness.d.ts +4 -22
- package/dist/src/browser/readiness.js +55 -118
- package/dist/src/browser/runtime/browser-runtime.d.ts +30 -0
- package/dist/src/browser/runtime/browser-runtime.js +362 -0
- package/dist/src/browser/url-policy.d.ts +3 -3
- package/dist/src/browser/url-policy.js +7 -6
- package/dist/src/browser/verification/expectation.d.ts +2 -0
- package/dist/src/browser/verification/expectation.js +17 -0
- package/dist/src/cli/command-loaders.js +1 -0
- package/dist/src/cli/command-manifest.js +5 -1
- package/dist/src/cli/commands/browser-cli-helpers.d.ts +0 -6
- package/dist/src/cli/commands/browser-cli-helpers.js +11 -144
- package/dist/src/cli/commands/browser.d.ts +0 -5
- package/dist/src/cli/commands/browser.js +11 -152
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/doctor/checks/node-version.js +25 -9
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
- package/dist/src/cli/commands/models.js +1 -1
- package/dist/src/cli/commands/platform.d.ts +1 -0
- package/dist/src/cli/commands/platform.js +111 -0
- package/dist/src/config/index.js +4 -4
- package/dist/src/config/loader.js +10 -4
- package/dist/src/config/models-json.js +1 -1
- package/dist/src/config/schema.d.ts +131 -84
- package/dist/src/config/schema.js +112 -59
- package/dist/src/connectors/composio-sessions.js +1 -3
- package/dist/src/extensions/lockfile.js +1 -1
- package/dist/src/extensions/marketplace.js +4 -0
- package/dist/src/gateway/agents-admin.js +1 -1
- package/dist/src/gateway/chat-stream/mapper.js +5 -1
- package/dist/src/gateway/chat-stream/protocol.d.ts +5 -1
- package/dist/src/gateway/clarify-runtime.d.ts +7 -5
- package/dist/src/gateway/clarify-runtime.js +8 -11
- package/dist/src/gateway/ephemeral-clarification-waiter.d.ts +17 -0
- package/dist/src/gateway/ephemeral-clarification-waiter.js +46 -0
- package/dist/src/gateway/file-path-classifier.js +1 -1
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +12 -26
- package/dist/src/gateway/hono/lib/config-payload.js +11 -40
- package/dist/src/gateway/hono/routes/agent-stream.js +44 -18
- package/dist/src/gateway/hono/routes/browser-automations.d.ts +3 -0
- package/dist/src/gateway/hono/routes/browser-automations.js +77 -0
- package/dist/src/gateway/hono/routes/browser-install.js +0 -32
- package/dist/src/gateway/hono/routes/browser.d.ts +0 -17
- package/dist/src/gateway/hono/routes/browser.js +46 -568
- package/dist/src/gateway/hono/routes/config-patch/misc.js +8 -1
- package/dist/src/gateway/hono/routes/config.js +0 -11
- package/dist/src/gateway/hono/routes/lazy-bundles.js +5 -5
- package/dist/src/gateway/hono/routes/models.js +1 -1
- package/dist/src/gateway/hono/routes/session-input-handler.d.ts +10 -2
- package/dist/src/gateway/hono/routes/side-chats.js +24 -4
- package/dist/src/gateway/security/gateway-scopes.js +1 -1
- package/dist/src/gateway/service/agent-runner.d.ts +25 -36
- package/dist/src/gateway/service/agent-runner.js +103 -32
- package/dist/src/gateway/service/config-coordinator.js +1 -1
- package/dist/src/gateway/service/run-gateway-agent.js +5 -2
- package/dist/src/gateway/service/session-input-coordinator.js +4 -1
- package/dist/src/gateway/service/sessions-api.js +1 -1
- package/dist/src/gateway/service.d.ts +8 -8
- package/dist/src/gateway/service.js +50 -37
- package/dist/src/gateway/side-chat/manager.d.ts +2 -1
- package/dist/src/gateway/side-chat/manager.js +5 -4
- package/dist/src/gateway/side-chat/run-service.d.ts +5 -1
- package/dist/src/gateway/side-chat/run-service.js +24 -23
- package/dist/src/gateway/side-chat/types.d.ts +3 -1
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/platform/client.d.ts +121 -0
- package/dist/src/platform/client.js +108 -0
- package/dist/src/platform/contracts.d.ts +194 -0
- package/dist/src/platform/contracts.js +150 -0
- package/dist/src/platform/index.d.ts +4 -0
- package/dist/src/platform/index.js +9 -0
- package/dist/src/platform/resolution.d.ts +4 -0
- package/dist/src/platform/resolution.js +16 -0
- package/dist/src/platform/worker.d.ts +6 -0
- package/dist/src/platform/worker.js +75 -0
- package/dist/src/providers/auth-runtime/resolve-auth.js +1 -1
- package/dist/src/providers/index.js +2 -2
- package/dist/src/providers/model-registry.js +1 -1
- package/dist/src/providers/register-runtime-providers.js +1 -1
- package/dist/src/providers/xopc-cloud-config.js +3 -1
- package/dist/src/session/session-context-for-llm.js +41 -1
- package/dist/src/share/hosted-session-share.js +3 -1
- package/dist/src/share/share-thumbnail.js +1 -1
- package/dist/src/storage/sqlite/clarification-wait-repository.d.ts +41 -0
- package/dist/src/storage/sqlite/clarification-wait-repository.js +418 -0
- package/dist/src/storage/sqlite/index.d.ts +2 -1
- package/dist/src/storage/sqlite/index.js +2 -1
- package/dist/src/storage/sqlite/migrations/153_browser_control_v2.sql +45 -0
- package/dist/src/storage/sqlite/migrations/154_session_clarification_waits.sql +60 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/schema.sql +16 -20
- package/dist/src/storage/sqlite/session-input-repository.d.ts +11 -6
- package/dist/src/tasks/home-query-service.js +1 -1
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/tui/tui.js +1 -1
- package/dist/src/tunnel/env.js +3 -1
- package/dist/src/voice/realtime/agentEngine.js +7 -2
- package/dist/src/voice/realtime/runtime.types.d.ts +5 -0
- package/dist/src/work-discovery/service.js +1 -1
- package/dist/src/workflows/service/workflow-run-service.js +1 -1
- package/package.json +7 -7
- package/skills/creative/hatch-pet/SKILL.md +1 -1
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-kILWelNb.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-BnizTdgs.js +0 -1
- package/dist/gateway/static/root/assets/automations-workspace-CZRKqSqY.js +0 -6
- package/dist/gateway/static/root/assets/browser-settings-page-pN5LbChY.js +0 -8
- package/dist/gateway/static/root/assets/browser-workflow-inputs-BX1-uM9L.js +0 -1
- package/dist/gateway/static/root/assets/browser-workflows-page-C65MI57t.js +0 -3
- package/dist/gateway/static/root/assets/capabilities-settings-panel-CJw2e16J.js +0 -7
- package/dist/gateway/static/root/assets/channels-settings-CRgjb4Ck.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-Dcpdy06y.js +0 -2
- package/dist/gateway/static/root/assets/gateway-config-api-e3BRcgDx.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-Cheo0Rkc.js +0 -1
- package/dist/gateway/static/root/assets/home-page-DVrTRqNc.js +0 -1
- package/dist/gateway/static/root/assets/index-B7CX4Qob.css +0 -2
- package/dist/gateway/static/root/assets/index-BHrpyJ4t.js +0 -72
- package/dist/gateway/static/root/assets/markdown-view-CQvzsE24.js +0 -201
- package/dist/gateway/static/root/assets/messages-Cf5hpZE6.js +0 -3
- package/dist/gateway/static/root/assets/note-detail-panel-CUd8O4K7.js +0 -5
- package/dist/gateway/static/root/assets/notes-page-BLQwd39W.js +0 -8
- package/dist/gateway/static/root/assets/project-detail-page-NttW338u.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-BzH8pjEz.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-BxpjSDnL.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BLMaibOb.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-BRvvKhoH.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-DTOsxQC1.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-BWYanBlQ.js +0 -1
- package/dist/gateway/static/root/assets/user-model-page-B_-SNat-.js +0 -2
- package/dist/gateway/static/root/assets/workflows-page-CNOT2Coo.js +0 -5
- package/dist/src/agent/tools/browser-recipe-tool.d.ts +0 -12
- package/dist/src/agent/tools/browser-recipe-tool.js +0 -113
- package/dist/src/browser/actions/extension-registry-bridge.d.ts +0 -5
- package/dist/src/browser/actions/extension-registry-bridge.js +0 -312
- package/dist/src/browser/actions/registry.d.ts +0 -5
- package/dist/src/browser/actions/registry.js +0 -741
- package/dist/src/browser/actions/types.d.ts +0 -65
- package/dist/src/browser/backend-from-config.d.ts +0 -22
- package/dist/src/browser/backend-from-config.js +0 -99
- package/dist/src/browser/browser-command-timeout.d.ts +0 -2
- package/dist/src/browser/browser-command-timeout.js +0 -11
- package/dist/src/browser/cdp-local-launcher.d.ts +0 -35
- package/dist/src/browser/cdp-local-launcher.js +0 -154
- package/dist/src/browser/cdp-supervisor.d.ts +0 -58
- package/dist/src/browser/cdp-supervisor.js +0 -133
- package/dist/src/browser/humanize.d.ts +0 -80
- package/dist/src/browser/humanize.js +0 -363
- package/dist/src/browser/manager.d.ts +0 -50
- package/dist/src/browser/manager.js +0 -251
- package/dist/src/browser/pipeline/output.d.ts +0 -35
- package/dist/src/browser/pipeline/output.js +0 -74
- package/dist/src/browser/pipeline/runner.d.ts +0 -27
- package/dist/src/browser/pipeline/runner.js +0 -453
- package/dist/src/browser/pipeline/schema.d.ts +0 -42
- package/dist/src/browser/pipeline/schema.js +0 -116
- package/dist/src/browser/pipeline/template.d.ts +0 -30
- package/dist/src/browser/pipeline/template.js +0 -112
- package/dist/src/browser/providers/cloakbrowser.d.ts +0 -83
- package/dist/src/browser/providers/cloakbrowser.js +0 -612
- package/dist/src/browser/recipes/index.js +0 -3
- package/dist/src/browser/recipes/repository.d.ts +0 -13
- package/dist/src/browser/recipes/repository.js +0 -81
- package/dist/src/browser/recipes/runtime-service.d.ts +0 -6
- package/dist/src/browser/recipes/runtime-service.js +0 -30
- package/dist/src/browser/recipes/service.d.ts +0 -36
- package/dist/src/browser/recipes/service.js +0 -186
- package/dist/src/browser/recipes/types.d.ts +0 -36
- package/dist/src/browser/schemas.d.ts +0 -53
- package/dist/src/browser/schemas.js +0 -68
- package/dist/src/browser/session-lifecycle.d.ts +0 -40
- package/dist/src/browser/session-lifecycle.js +0 -136
- package/dist/src/browser/snapshot-helpers.d.ts +0 -24
- package/dist/src/browser/snapshot-helpers.js +0 -70
- package/dist/src/browser/stealth.d.ts +0 -46
- package/dist/src/browser/stealth.js +0 -163
- package/dist/src/gateway/clarify-bridge.d.ts +0 -46
- package/dist/src/gateway/clarify-bridge.js +0 -111
- package/dist/src/gateway/hono/routes/browser-workflows.d.ts +0 -3
- package/dist/src/gateway/hono/routes/browser-workflows.js +0 -78
- /package/dist/src/browser/{actions → automations}/types.js +0 -0
- /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"
|
|
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-
|
|
64
|
-
match: (path) => startsWithAny(path, ["/api/browser/
|
|
63
|
+
id: "browser-automations",
|
|
64
|
+
match: (path) => startsWithAny(path, ["/api/browser/automations", "/api/browser/automation-runs"]),
|
|
65
65
|
load: async () => {
|
|
66
|
-
const {
|
|
67
|
-
return { register:
|
|
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 {
|
|
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:
|
|
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
|
|
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/
|
|
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
|
|
28
|
-
import {
|
|
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
|
|
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
|
-
|
|
69
|
-
|
|
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
|
-
|
|
130
|
-
|
|
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
|
-
*
|
|
138
|
-
*
|
|
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
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
108
|
-
|
|
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.
|
|
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.
|
|
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)
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
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
|
-
|
|
211
|
-
|
|
212
|
-
|
|
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
|
-
*
|
|
247
|
-
*
|
|
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
|
-
|
|
262
|
-
return this.
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
|
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" :
|
|
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
|
|
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
|
|
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
|
|
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
|
-
*
|
|
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
|
-
|
|
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
|
|
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.
|