@xopcai/xopc 0.0.306 → 0.0.308
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/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{activity-store-DLtim-_I.js → activity-store-wgSB2HYK.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-iQXtiilH.js → agent-avatar-dicebear-dUotwUO6.js} +1 -1
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-C6LflMXr.js +1 -0
- package/dist/gateway/static/root/assets/agents-VPDIGRSS.js +1 -0
- package/dist/gateway/static/root/assets/{api-DfSU0-lD.js → api-BKHmTb0w.js} +1 -1
- package/dist/gateway/static/root/assets/api-DFOlahZv.js +1 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-BpYFKz7B.js → app-management-settings-panel-zPz0rOND.js} +1 -1
- package/dist/gateway/static/root/assets/appearance-settings-DhvhR43G.js +1 -0
- package/dist/gateway/static/root/assets/apps-page-Pmslbzzr.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-BxOvZ-ZX.js → archive-plugin-BQVZMreT.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-B0FzTMAJ.js → attachment-load-CPE-TMPf.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-BpXuPaPg.js → automations-page-C4IAy_zF.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-Fx5VUJRu.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-BP7wfpqy.js → binary-plugins-DgTl7diZ.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-oMLvdnOQ.js → block-editor-CcOVA-Gw.js} +3 -3
- package/dist/gateway/static/root/assets/{browser-automation-inputs-DTxSZ00u.js → browser-automation-inputs-BzkJog8e.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-automations-page-IbJnwEY4.js → browser-automations-page--zKAgj1k.js} +2 -2
- package/dist/gateway/static/root/assets/browser-settings-page-DBms6d35.js +3 -0
- package/dist/gateway/static/root/assets/capabilities-settings-panel-epdDWIZy.js +8 -0
- package/dist/gateway/static/root/assets/channels-settings-B0bsDtmP.js +1 -0
- package/dist/gateway/static/root/assets/{channels-status-swr-D2AmAoty.js → channels-status-swr-B2JwuTjG.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-terminal-dock-B-yI3Mi1.js → chat-terminal-dock-BfLd2rIJ.js} +1 -1
- package/dist/gateway/static/root/assets/{computer-settings-page-CWx_jnng.js → computer-settings-page-Ckgc0Py-.js} +1 -1
- package/dist/gateway/static/root/assets/connector-service-page-BlC1OXX4.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-By33-bF1.js +2 -0
- package/dist/gateway/static/root/assets/{cron-expression-DMRRL4Zg.js → cron-expression-CqNE-nf6.js} +1 -1
- package/dist/gateway/static/root/assets/{date-picker-BSwL0e6E.js → date-picker-BS9ZjzYJ.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-BQTspLzC.js → dependency-picker-CF_zYzxX.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-C3lFxDF6.js → desktop-pet-CDwtLR7Z.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-Y8pjpXFE.js → desktop-pet-settings-C0djIc1J.js} +1 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard-CDKj9LQj.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-CVGiGVcR.js → extension-debug-page-CX5OXxEU.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-g3JtCP_y.js → extension-page-BytR1PaY.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-CjpoKV1f.js → extension-settings-page-CkaMJA5F.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-BSvXXpKM.js → gateway-config-swr-B6wHa6ZI.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-realtime-BDCpS7U1.js → gateway-realtime-B53R0CA4.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-BLDgrJ30.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-settings-CYG9WCZn.js → gateway-settings-_YU-1p0z.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-Caf8g3sC.js → gateway-startup-retry-DRzGnEV-.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-Cl834-SS.js → heartbeat-settings-CVIvvm4x.js} +1 -1
- package/dist/gateway/static/root/assets/home-page-COCHelcL.js +1 -0
- package/dist/gateway/static/root/assets/{image-generation-api-BwEWBUVC.js → image-generation-api-Ck_pyDom.js} +1 -1
- package/dist/gateway/static/root/assets/{imports-page-CoMlgSIA.js → imports-page-DrtbjL8O.js} +1 -1
- package/dist/gateway/static/root/assets/index-CDfcPiPb.js +79 -0
- package/dist/gateway/static/root/assets/index-CRu1p38D.css +1 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CNq5D4pe.js → keyboard-shortcuts-settings-BlZh41Xq.js} +1 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-D7_Raxjw.js +2 -0
- package/dist/gateway/static/root/assets/{local-apps-page-DQnRA598.js → local-apps-page-DbP7wWuh.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-D16nmbaN.js → locale-store-msTfRK8P.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-C0n66FiO.js +2 -0
- package/dist/gateway/static/root/assets/{management-settings-DKcO5fQ-.js → management-settings-i6GhxpGV.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-view-DCp4BlZP.js → markdown-view-BInabSKf.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-Cy64sn_C.js → media-plugins-CnWChQ3Y.js} +1 -1
- package/dist/gateway/static/root/assets/{messages-C-9oo69N.js → messages-F74LVAiU.js} +3 -3
- package/dist/gateway/static/root/assets/note-detail-panel-C59d8vDW.js +5 -0
- package/dist/gateway/static/root/assets/notes-page-C1GBPrVI.js +8 -0
- package/dist/gateway/static/root/assets/{page-tabs-CgEoHSVT.js → page-tabs-BWitjb3e.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-Ck2uKTbf.js → preview-open-alternatives-UaCWCxZv.js} +1 -1
- package/dist/gateway/static/root/assets/{proactive-page-Dr1mCJhZ.js → proactive-page-CtSFJxoM.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-DbZvJ5GE.js → product-open-page-gmi5LLwM.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-ILTmQ1YN.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-snl4rOQZ.js +1 -0
- package/dist/gateway/static/root/assets/{registry-api-DcQdwpPu.js → registry-api-BSWtko7U.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-BbaAcEN3.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-CPwdgWKo.js → runtime-tools-settings-panel-CtOjKGWg.js} +2 -2
- package/dist/gateway/static/root/assets/{schema-form-8psK4cFO.js → schema-form-DkyyDcl2.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-DrWL71O8.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-BG0kl4HT.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-D_Gsz5rl.js → settings-form-section-C0JDGN_V.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-C_Tj_mkZ.js → settings-page-DiIyMQ52.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-EPazhoZO.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-B_M_oPsT.js → share-preview-page-Bt1K657Y.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-g2MdRXSZ.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-B1DPzu98.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-Wd0uYSPG.js +2 -0
- package/dist/gateway/static/root/assets/{skills-page.utils-Cuh6s2HM.js → skills-page.utils-vq5Ujm03.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-aassGyNb.js → system-settings-panel-Cz1P-HDH.js} +1 -1
- package/dist/gateway/static/root/assets/task-detail-page-BG3A5gPZ.js +1 -0
- package/dist/gateway/static/root/assets/theme-store-1SZ-HFHX.js +1 -0
- package/dist/gateway/static/root/assets/{tunnel-api-DJYcPWIV.js → tunnel-api-DQGoFuZO.js} +1 -1
- package/dist/gateway/static/root/assets/{use-autosave-QGYG7oMZ.js → use-autosave-DVDlBb95.js} +1 -1
- package/dist/gateway/static/root/assets/user-model-page-qM5UiTGx.js +2 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-D1s0gIRW.js → voice-api-key-field-B2pZCcxY.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-config-api-D2goEn5e.js → voice-config-api-DgJML_uM.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-DkFW9aJ6.js → work-discovery-overlay-Bptv7bEY.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-BYToUPUY.js → workflow-run-setup-panel-BijCrNc4.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-DRy1RAYH.js +6 -0
- package/dist/gateway/static/root/channel-icons/feishu.svg +6 -12
- package/dist/gateway/static/root/connector-icons/SOURCES.md +12 -0
- package/dist/gateway/static/root/connector-icons/dingtalk-mark.svg +1 -0
- package/dist/gateway/static/root/connector-icons/tencent-meeting-mark.svg +37 -0
- package/dist/gateway/static/root/connector-icons/wps-calendar.svg +14 -0
- package/dist/gateway/static/root/connector-icons/wps-docs.svg +14 -0
- package/dist/gateway/static/root/connector-icons/wps-mail.svg +7 -0
- package/dist/gateway/static/root/index.html +12 -12
- package/dist/package.js +1 -1
- package/dist/packages/gateway-contract/src/notifications.js +1 -1
- package/dist/src/agent/background-review/prompts.js +3 -1
- package/dist/src/agent/context/execution-context.js +4 -4
- package/dist/src/agent/external-tools/composio-provider.js +83 -20
- package/dist/src/agent/external-tools/gateway-tools.js +2 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
- package/dist/src/agent/mcp/oauth/mcp-oauth-manager.js +1 -1
- package/dist/src/agent/memory/compaction-promotion.d.ts +1 -1
- package/dist/src/agent/memory/compaction-promotion.js +4 -3
- package/dist/src/agent/tools/knowledge-memory-tool.d.ts +1 -1
- package/dist/src/agent/tools/knowledge-memory-tool.js +3 -3
- package/dist/src/agent/tools/user-context-tool.js +17 -7
- package/dist/src/chat-commands/builtins/understanding.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
- package/dist/src/cli/commands/update.js +1 -1
- package/dist/src/config/schema.d.ts +14 -4
- package/dist/src/config/schema.js +6 -4
- package/dist/src/connectors/account-access.d.ts +4 -0
- package/dist/src/connectors/account-access.js +23 -0
- package/dist/src/connectors/approval-resume.d.ts +4 -0
- package/dist/src/connectors/approval-resume.js +23 -0
- package/dist/src/connectors/auth-provider-registry.d.ts +1 -0
- package/dist/src/connectors/auth-provider-registry.js +2 -1
- package/dist/src/connectors/authorization-attempts.d.ts +21 -0
- package/dist/src/connectors/authorization-attempts.js +33 -0
- package/dist/src/connectors/builtin-catalog.js +1 -3
- package/dist/src/connectors/catalog.js +2 -1
- package/dist/src/connectors/china-catalog.d.ts +2 -0
- package/dist/src/connectors/china-catalog.js +430 -0
- package/dist/src/connectors/composio-backends.d.ts +26 -0
- package/dist/src/connectors/composio-backends.js +65 -0
- package/dist/src/connectors/composio-catalog.js +2 -1
- package/dist/src/connectors/composio-managed-client.js +3 -1
- package/dist/src/connectors/composio-managed-events.js +5 -2
- package/dist/src/connectors/composio-session-types.d.ts +2 -0
- package/dist/src/connectors/composio-sessions.d.ts +11 -2
- package/dist/src/connectors/composio-sessions.js +137 -35
- package/dist/src/connectors/composio-triggers.js +4 -2
- package/dist/src/connectors/composio.d.ts +11 -8
- package/dist/src/connectors/composio.js +68 -84
- package/dist/src/connectors/connected-source-ingestion.js +4 -3
- package/dist/src/connectors/connected-source-understanding.d.ts +1 -0
- package/dist/src/connectors/connected-source-understanding.js +1 -0
- package/dist/src/connectors/connection-recovery-service.js +25 -13
- package/dist/src/connectors/connector-identity.d.ts +2 -0
- package/dist/src/connectors/connector-identity.js +18 -5
- package/dist/src/connectors/content-enrichment.js +1 -1
- package/dist/src/connectors/instances.js +1 -7
- package/dist/src/connectors/learning-coordinator.js +35 -12
- package/dist/src/connectors/materialize.js +14 -1
- package/dist/src/connectors/policy.d.ts +1 -1
- package/dist/src/connectors/policy.js +1 -1
- package/dist/src/connectors/principal.js +24 -3
- package/dist/src/connectors/providers.d.ts +1 -0
- package/dist/src/connectors/providers.js +14 -2
- package/dist/src/connectors/runtime-adapter-registry.js +4 -9
- package/dist/src/connectors/secret-store.d.ts +4 -1
- package/dist/src/connectors/secret-store.js +7 -3
- package/dist/src/connectors/source-change-publisher.js +4 -2
- package/dist/src/connectors/types.d.ts +16 -11
- package/dist/src/connectors/workflow-preflight.d.ts +2 -1
- package/dist/src/connectors/workflow-preflight.js +20 -3
- package/dist/src/gateway/hono/lib/config-payload.d.ts +2 -2
- package/dist/src/gateway/hono/routes/connectors.js +207 -16
- package/dist/src/gateway/hono/routes/context-sources.js +1 -24
- package/dist/src/gateway/hono/routes/home.js +4 -1
- package/dist/src/gateway/hono/routes/imports.js +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
- package/dist/src/gateway/hono/routes/local-apps.js +1 -1
- package/dist/src/gateway/hono/routes/mcp.js +1 -1
- package/dist/src/gateway/hono/routes/projects.js +8 -0
- package/dist/src/gateway/hono/routes/update.js +2 -2
- package/dist/src/gateway/hono/routes/user-model-refresh.d.ts +5 -0
- package/dist/src/gateway/hono/routes/user-model-refresh.js +128 -0
- package/dist/src/gateway/hono/routes/user-model.js +12 -5
- package/dist/src/gateway/hono/routes/work-discovery.js +0 -30
- package/dist/src/gateway/index.js +1 -1
- package/dist/src/gateway/run-loop.js +1 -1
- package/dist/src/gateway/service.js +6 -6
- package/dist/src/infra/gateway-processes.js +1 -1
- package/dist/src/infra/update-restart.js +1 -1
- package/dist/src/infra/update-runner.js +2 -2
- package/dist/src/infra/update-startup.js +1 -1
- package/dist/src/knowledge/connected-knowledge-pipeline.js +1 -1
- package/dist/src/knowledge-memory/index.js +2 -2
- package/dist/src/knowledge-memory/repository.d.ts +7 -0
- package/dist/src/knowledge-memory/repository.js +58 -8
- package/dist/src/memory-maintenance/service.js +61 -31
- package/dist/src/migrations/memory-config.d.ts +2 -0
- package/dist/src/migrations/memory-config.js +77 -0
- package/dist/src/migrations/runner.js +2 -2
- package/dist/src/notifications/planner.js +5 -5
- package/dist/src/notifications/service.d.ts +2 -2
- package/dist/src/notifications/service.js +1 -1
- package/dist/src/proactive/follow-ups.js +2 -1
- package/dist/src/storage/sqlite/connection-wait-repository.d.ts +3 -0
- package/dist/src/storage/sqlite/connection-wait-repository.js +63 -2
- package/dist/src/storage/sqlite/connector-account-repository.d.ts +6 -0
- package/dist/src/storage/sqlite/connector-account-repository.js +35 -7
- package/dist/src/storage/sqlite/connector-repository.js +15 -10
- package/dist/src/storage/sqlite/connector-sync-policy-repository.js +1 -1
- package/dist/src/storage/sqlite/index.js +4 -2
- package/dist/src/storage/sqlite/migrations/182_connector_account_policies.sql +92 -0
- package/dist/src/storage/sqlite/migrations/183_connector_backend_consistency.sql +20 -0
- package/dist/src/storage/sqlite/migrations/184_memory_suppressions.sql +12 -0
- package/dist/src/storage/sqlite/migrations/185_understanding_refresh_batches.sql +6 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +7 -7
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/tasks/home-query-service.js +3 -3
- package/dist/src/tui/backends/gateway-realtime-backend.js +1 -1
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/user-context/config.d.ts +4 -9
- package/dist/src/user-context/config.js +7 -27
- package/dist/src/user-context/memory-suppression.d.ts +7 -0
- package/dist/src/user-context/memory-suppression.js +23 -0
- package/dist/src/user-context/relationship-continuity.js +1 -1
- package/dist/src/user-context/sources/refresh-service.d.ts +48 -0
- package/dist/src/user-context/sources/refresh-service.js +221 -0
- package/dist/src/user-context/sources/repository.js +1 -1
- package/dist/src/user-model/bootstrap.js +27 -24
- package/dist/src/user-model/capture/executor.d.ts +1 -1
- package/dist/src/user-model/capture/executor.js +17 -11
- package/dist/src/user-model/capture/semantic.js +1 -1
- package/dist/src/user-model/domain.d.ts +6 -2
- package/dist/src/user-model/index.js +3 -3
- package/dist/src/user-model/profile.js +1 -1
- package/dist/src/user-model/repository.d.ts +4 -1
- package/dist/src/user-model/repository.js +96 -6
- package/dist/src/user-model/usage-policy.d.ts +2 -0
- package/dist/src/user-model/usage-policy.js +6 -2
- package/dist/src/work-discovery/project-understanding.js +2 -1
- package/dist/src/work-discovery/service.d.ts +8 -24
- package/dist/src/work-discovery/service.js +138 -180
- package/dist/src/workflows/domain/definition.d.ts +1 -0
- package/dist/src/workflows/domain/validation.js +1 -1
- package/dist/src/workflows/service/workflow-run-service.js +14 -0
- package/dist/src/workflows/service/workflow-session-bridge.d.ts +1 -0
- package/dist/src/workflows/service/workflow-session-bridge.js +1 -0
- package/package.json +5 -5
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-CxOv4ivK.js +0 -1
- package/dist/gateway/static/root/assets/agents-DzKx7z3k.js +0 -1
- package/dist/gateway/static/root/assets/api-gpHh07OL.js +0 -1
- package/dist/gateway/static/root/assets/appearance-settings-BQfR5vrq.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-BceB7JHZ.js +0 -1
- package/dist/gateway/static/root/assets/automations-workspace-Cn_p8zY_.js +0 -6
- package/dist/gateway/static/root/assets/browser-settings-page-CCUO3G23.js +0 -3
- package/dist/gateway/static/root/assets/capabilities-settings-panel-BjMb5H2_.js +0 -8
- package/dist/gateway/static/root/assets/channels-settings-P22-_i13.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-BLgPORmH.js +0 -2
- package/dist/gateway/static/root/assets/device-pairing-wizard-DM4_GMzo.js +0 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-BGmP1obI.js +0 -1
- package/dist/gateway/static/root/assets/home-page-CB_XVtIM.js +0 -1
- package/dist/gateway/static/root/assets/index-CI37dTAn.css +0 -1
- package/dist/gateway/static/root/assets/index-Do9MltC4.js +0 -79
- package/dist/gateway/static/root/assets/local-app-workbench-page-BxQlEje6.js +0 -2
- package/dist/gateway/static/root/assets/logs-page-CT5GrcMs.js +0 -2
- package/dist/gateway/static/root/assets/note-detail-panel-5dc3LKTL.js +0 -5
- package/dist/gateway/static/root/assets/notes-page-AbwxgXuG.js +0 -8
- package/dist/gateway/static/root/assets/project-detail-page-DnE1zI1c.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-BD0nLYxk.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-TYuE6A3S.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BcWDQQFX.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-DzGQX6Hq.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-CE2X89qN.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-BL4H9Iym.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-WMKIgUOp.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-DYgwzl5B.js +0 -2
- package/dist/gateway/static/root/assets/task-detail-page-BjeRslap.js +0 -1
- package/dist/gateway/static/root/assets/theme-store-RUBQBsFP.js +0 -1
- package/dist/gateway/static/root/assets/user-model-page-PrRsd4go.js +0 -2
- package/dist/gateway/static/root/assets/workflows-page-Z8iZe9YP.js +0 -6
- package/dist/src/migrations/knowledge-memory-read-policy-config.d.ts +0 -2
- package/dist/src/migrations/knowledge-memory-read-policy-config.js +0 -48
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type ConnectorKind = 'mcp' | 'cli' | 'http' | '
|
|
1
|
+
export type ConnectorKind = 'mcp' | 'cli' | 'http' | 'browser' | 'extension' | 'builtin' | 'composio' | 'memorySource';
|
|
2
2
|
export type ConnectorCategory = 'code' | 'docs' | 'browser' | 'data' | 'automation' | 'custom';
|
|
3
3
|
export type ConnectorCapability = 'tools' | 'resources' | 'prompts' | 'context' | 'channel' | 'events' | 'ui' | 'memory_source' | 'workflows' | 'auth.apiKey' | 'auth.oauth' | 'runtime.mcp.stdio' | 'runtime.mcp.sse' | 'runtime.mcp.streamableHttp';
|
|
4
4
|
export type ConnectorAuthMode = 'none' | 'apiKey' | 'oauth';
|
|
@@ -17,7 +17,6 @@ export type ConnectorBenefit = 'understand' | 'act' | 'reach';
|
|
|
17
17
|
export type ConnectorBranding = {
|
|
18
18
|
logoUrl?: string;
|
|
19
19
|
source?: 'builtin' | 'composio-catalog' | 'registry' | 'extension' | 'custom';
|
|
20
|
-
backgroundColor?: string;
|
|
21
20
|
fetchedAt?: string;
|
|
22
21
|
};
|
|
23
22
|
export type ConnectorConfirmationPolicy = 'always' | 'writes' | 'admin' | 'never';
|
|
@@ -40,6 +39,8 @@ export type ConnectorSecretReference = {
|
|
|
40
39
|
xopcSecretRef: {
|
|
41
40
|
provider: string;
|
|
42
41
|
fieldKey: string;
|
|
42
|
+
prefix?: string;
|
|
43
|
+
suffix?: string;
|
|
43
44
|
};
|
|
44
45
|
};
|
|
45
46
|
export type ConnectorSecretField = {
|
|
@@ -48,6 +49,11 @@ export type ConnectorSecretField = {
|
|
|
48
49
|
description?: string;
|
|
49
50
|
required: boolean;
|
|
50
51
|
};
|
|
52
|
+
export type ConnectorSetupLink = {
|
|
53
|
+
label: string;
|
|
54
|
+
href: string;
|
|
55
|
+
external?: boolean;
|
|
56
|
+
};
|
|
51
57
|
export type ConnectorConfigField = {
|
|
52
58
|
key: string;
|
|
53
59
|
label: string;
|
|
@@ -66,17 +72,10 @@ export type ConnectorRuntimeDefinition = {
|
|
|
66
72
|
name: string;
|
|
67
73
|
version: string;
|
|
68
74
|
};
|
|
69
|
-
} | {
|
|
70
|
-
type: 'channel';
|
|
71
|
-
channelId: string;
|
|
72
|
-
pluginId: string;
|
|
73
75
|
} | {
|
|
74
76
|
type: 'composio';
|
|
75
77
|
toolkit: string;
|
|
76
78
|
role: 'credential' | 'toolkit';
|
|
77
|
-
} | {
|
|
78
|
-
type: 'nativeTool';
|
|
79
|
-
toolsetId: string;
|
|
80
79
|
} | {
|
|
81
80
|
type: 'memorySource';
|
|
82
81
|
sourceKind: string;
|
|
@@ -103,6 +102,7 @@ export type ConnectorDefinition = {
|
|
|
103
102
|
setup: {
|
|
104
103
|
secrets?: ConnectorSecretField[];
|
|
105
104
|
config?: ConnectorConfigField[];
|
|
105
|
+
links?: ConnectorSetupLink[];
|
|
106
106
|
};
|
|
107
107
|
runtime: ConnectorRuntimeDefinition;
|
|
108
108
|
permissions?: ConnectorPermissions;
|
|
@@ -120,7 +120,7 @@ export type ConnectorInstallationPolicy = {
|
|
|
120
120
|
allowedAgentIds: string[];
|
|
121
121
|
maxScope: ConnectorScope;
|
|
122
122
|
confirmationPolicy: ConnectorConfirmationPolicy;
|
|
123
|
-
|
|
123
|
+
selectedAccountIds: string[] | null;
|
|
124
124
|
createdAt: string;
|
|
125
125
|
updatedAt: string;
|
|
126
126
|
};
|
|
@@ -149,8 +149,12 @@ export type ConnectorAccount = {
|
|
|
149
149
|
connectorId: string;
|
|
150
150
|
principalId: string;
|
|
151
151
|
identityKey?: string;
|
|
152
|
+
backendId?: string;
|
|
152
153
|
identity: Record<string, unknown>;
|
|
153
154
|
currentConnectionId?: string;
|
|
155
|
+
label?: string;
|
|
156
|
+
enabled: boolean;
|
|
157
|
+
allowedAgentIds: string[] | null;
|
|
154
158
|
createdAt: string;
|
|
155
159
|
updatedAt: string;
|
|
156
160
|
};
|
|
@@ -184,6 +188,7 @@ export type ConnectorExecutionAuditRecord = {
|
|
|
184
188
|
export type ConnectorApprovalStatus = 'pending' | 'approved' | 'denied' | 'expired' | 'consumed';
|
|
185
189
|
export type ConnectorApprovalRecord = {
|
|
186
190
|
id: string;
|
|
191
|
+
waitId?: string;
|
|
187
192
|
principalId: string;
|
|
188
193
|
connectorId: string;
|
|
189
194
|
connectionId?: string;
|
|
@@ -240,7 +245,7 @@ export type ConnectorInstance = {
|
|
|
240
245
|
toolkit: string;
|
|
241
246
|
role: 'credential' | 'toolkit';
|
|
242
247
|
} | {
|
|
243
|
-
type: '
|
|
248
|
+
type: 'memorySource';
|
|
244
249
|
id: string;
|
|
245
250
|
};
|
|
246
251
|
usage: ConnectorUsageRecord;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Config } from '../config/schema.js';
|
|
2
2
|
import type { WorkflowDefinition } from '../workflows/domain/definition.js';
|
|
3
|
-
export type ConnectorPreflightIssueCode = 'not_installed' | 'disabled' | 'agent_not_allowed' | 'scope_too_narrow' | 'connection_missing' | 'reauthorization_required';
|
|
3
|
+
export type ConnectorPreflightIssueCode = 'not_installed' | 'disabled' | 'agent_not_allowed' | 'scope_too_narrow' | 'connection_missing' | 'account_selection_required' | 'reauthorization_required';
|
|
4
4
|
export type ConnectorPreflightIssue = {
|
|
5
5
|
connectorId: string;
|
|
6
6
|
code: ConnectorPreflightIssueCode;
|
|
@@ -9,6 +9,7 @@ export type ConnectorPreflightIssue = {
|
|
|
9
9
|
};
|
|
10
10
|
export type ConnectorPreflightResult = {
|
|
11
11
|
ok: boolean;
|
|
12
|
+
accounts: Record<string, string[]>;
|
|
12
13
|
issues: ConnectorPreflightIssue[];
|
|
13
14
|
optionalIssues: ConnectorPreflightIssue[];
|
|
14
15
|
};
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { getConnectorInstallation, listConnectorConnections } from "../storage/sqlite/connector-repository.js";
|
|
1
|
+
import { getConnectorInstallation, init_connector_repository, listConnectorConnections } from "../storage/sqlite/connector-repository.js";
|
|
2
|
+
import { canAccessConnectorAccount, currentAccountConnections } from "./account-access.js";
|
|
2
3
|
import { getComposioToolkitScope } from "./composio.js";
|
|
3
4
|
import { getConnectorDefinition } from "./catalog.js";
|
|
4
5
|
import { listConnectorInstances } from "./instances.js";
|
|
5
6
|
//#region src/connectors/workflow-preflight.ts
|
|
7
|
+
init_connector_repository();
|
|
6
8
|
const SCOPE_ORDER = {
|
|
7
9
|
read: 1,
|
|
8
10
|
write: 2,
|
|
@@ -20,6 +22,7 @@ function preflightWorkflowConnectors(input) {
|
|
|
20
22
|
const principalId = input.principalId ?? "local-owner";
|
|
21
23
|
const instances = listConnectorInstances(input.config);
|
|
22
24
|
const issues = [];
|
|
25
|
+
const accounts = {};
|
|
23
26
|
const optionalIssues = [];
|
|
24
27
|
const add = (requirement, value) => {
|
|
25
28
|
(requirement.optional ? optionalIssues : issues).push(value);
|
|
@@ -53,13 +56,27 @@ function preflightWorkflowConnectors(input) {
|
|
|
53
56
|
principalId,
|
|
54
57
|
connectorId: requirement.connectorId
|
|
55
58
|
});
|
|
56
|
-
const selected = installation
|
|
57
|
-
|
|
59
|
+
const selected = installation && installation.selectedAccountIds !== null ? connections.filter((connection) => connection.accountId && installation.selectedAccountIds.includes(connection.accountId)) : connections;
|
|
60
|
+
const active = currentAccountConnections(selected.filter((connection) => installation && canAccessConnectorAccount(connection, installation, input.agentId)));
|
|
61
|
+
if (requirement.accountIds) {
|
|
62
|
+
if (!requirement.accountIds.length || requirement.accountIds.some((id) => !active.some((connection) => connection.accountId === id))) add(requirement, issue(requirement, "connection_missing", `${requirement.connectorId} has an unavailable selected account. Reconnect or update its permissions; no other account will be substituted.`));
|
|
63
|
+
else accounts[requirement.connectorId] = [...requirement.accountIds];
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (active.length > 1) {
|
|
67
|
+
add(requirement, issue(requirement, "account_selection_required", `${requirement.connectorId} has multiple available accounts. Select the intended account before unattended execution.`));
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (active.length === 1) {
|
|
71
|
+
accounts[requirement.connectorId] = [active[0].accountId];
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
58
74
|
const needsAuthorization = selected.some((connection) => connection.status === "expired" || connection.status === "failed");
|
|
59
75
|
add(requirement, issue(requirement, needsAuthorization ? "reauthorization_required" : "connection_missing", needsAuthorization ? `${requirement.connectorId} needs to be reconnected.` : `${requirement.connectorId} has no active account connection.`));
|
|
60
76
|
}
|
|
61
77
|
return {
|
|
62
78
|
ok: issues.length === 0,
|
|
79
|
+
accounts,
|
|
63
80
|
issues,
|
|
64
81
|
optionalIssues
|
|
65
82
|
};
|
|
@@ -222,7 +222,7 @@ export declare function buildSafeWebConfigPayload(service: GatewayService, optio
|
|
|
222
222
|
};
|
|
223
223
|
userModel: {
|
|
224
224
|
enabled: boolean;
|
|
225
|
-
writePolicy: "allow" | "
|
|
225
|
+
writePolicy: "allow" | "deny";
|
|
226
226
|
sensitiveWritePolicy: "allow" | "confirm" | "deny";
|
|
227
227
|
processingPolicy: "local_only" | "remote_allowed";
|
|
228
228
|
extraction: {
|
|
@@ -244,7 +244,7 @@ export declare function buildSafeWebConfigPayload(service: GatewayService, optio
|
|
|
244
244
|
};
|
|
245
245
|
knowledgeMemory: {
|
|
246
246
|
enabled: boolean;
|
|
247
|
-
writePolicy: "allow" | "
|
|
247
|
+
writePolicy: "allow" | "deny";
|
|
248
248
|
readScopes: ("project" | "session" | "agent" | "workspace" | "global")[];
|
|
249
249
|
contentSources: ("memory" | "connector" | "local_import")[];
|
|
250
250
|
searchStrategy: "local-first" | "external-first" | "fanout" | "local-only" | "external-only";
|
|
@@ -1,21 +1,26 @@
|
|
|
1
|
+
import { createLogger } from "../../../utils/logger/index.js";
|
|
2
|
+
import { init_logger } from "../../../utils/logger.js";
|
|
1
3
|
import { hasGatewayScope } from "../../security/gateway-scopes.js";
|
|
2
4
|
import { listConnectorLearningJobs } from "../../../storage/sqlite/connector-learning-repository.js";
|
|
5
|
+
import { getConnectorAccount, init_connector_account_repository, updateConnectorAccount } from "../../../storage/sqlite/connector-account-repository.js";
|
|
3
6
|
import { decideConnectorApproval, getConnectorApproval, listConnectorApprovals, listConnectorConnections } from "../../../storage/sqlite/connector-repository.js";
|
|
4
|
-
import { getConnectorAccount } from "../../../storage/sqlite/connector-account-repository.js";
|
|
5
7
|
import { getConnectorSyncPolicy, upsertConnectorSyncPolicy } from "../../../storage/sqlite/connector-sync-policy-repository.js";
|
|
6
8
|
import "../../../storage/sqlite/index.js";
|
|
7
9
|
import { init_agent_scope, resolveDefaultAgentId } from "../../../agent/agent-scope.js";
|
|
8
|
-
import {
|
|
10
|
+
import { activateComposioBackend, addComposioBackend, ensureComposioBackend, getComposioBackend, listComposioBackends, removeComposioBackend } from "../../../connectors/composio-backends.js";
|
|
11
|
+
import { getAuthorizationAttempt } from "../../../connectors/authorization-attempts.js";
|
|
12
|
+
import { ComposioSessionsAdapter, resolveComposioApiKey } from "../../../connectors/composio-sessions.js";
|
|
9
13
|
import { getConnectorLearningPlan } from "../../../connectors/learning-recipes.js";
|
|
10
14
|
import { listComposioConnectorCatalog } from "../../../connectors/composio-catalog.js";
|
|
11
|
-
import { createConnectorSetupSecretRequest, submitConnectorSetupSecret } from "../../../connectors/setup-secrets.js";
|
|
12
15
|
import { configureComposioApiKey, executeComposioTool, getComposioInstallationPolicy, getComposioToolkitAuthState, getComposioToolkitScope, inspectComposioConnectorHealth, listComposioConnections, listComposioTools, refreshComposioConnection, revokeComposioConnection, setComposioToolkitScope, updateComposioConnection, updateComposioInstallationPolicy } from "../../../connectors/composio.js";
|
|
13
16
|
import { listConnectorProviders } from "../../../connectors/providers.js";
|
|
14
17
|
import { getConnectorDefinition, listConnectorCatalog } from "../../../connectors/catalog.js";
|
|
18
|
+
import { createConnectorSetupSecretRequest, submitConnectorSetupSecret } from "../../../connectors/setup-secrets.js";
|
|
15
19
|
import { recordConnectorHealthUsage } from "../../../connectors/usage.js";
|
|
16
20
|
import { getConnectorInstance, getInstalledConnectorDefinition, listConnectorInstances } from "../../../connectors/instances.js";
|
|
17
21
|
import { installConnector, installConnectorDefinition, uninstallConnector, updateConnectorConfig } from "../../../connectors/install.js";
|
|
18
22
|
import { ConfigPersistenceError, persistConfigMutation } from "../../../config/config-mutation.js";
|
|
23
|
+
import { resumeApprovedConnectorAction } from "../../../connectors/approval-resume.js";
|
|
19
24
|
import { getMcpOAuthManager } from "../../../agent/mcp/oauth/mcp-oauth-manager.js";
|
|
20
25
|
import { startConnectorAuthorization } from "../../../connectors/auth-provider-registry.js";
|
|
21
26
|
import { composioLogoResponse } from "../../../connectors/composio-logo.js";
|
|
@@ -29,7 +34,9 @@ import { projectComposioConnectionStatus } from "../../../connectors/runtime-sta
|
|
|
29
34
|
import { getGatewayPrincipal } from "../../security/gateway-principal.js";
|
|
30
35
|
import { markContextSourceAssertionsForReview } from "./context-sources.js";
|
|
31
36
|
//#region src/gateway/hono/routes/connectors.ts
|
|
37
|
+
init_logger();
|
|
32
38
|
init_agent_scope();
|
|
39
|
+
init_connector_account_repository();
|
|
33
40
|
function errorMessage(error) {
|
|
34
41
|
return error instanceof Error ? error.message : String(error);
|
|
35
42
|
}
|
|
@@ -38,6 +45,7 @@ function defaultConnectorSyncInterval(connectorId) {
|
|
|
38
45
|
return definition?.runtime.type === "composio" && definition.runtime.role === "toolkit" ? getConnectorLearningPlan(definition.runtime.toolkit)?.intervalMinutes ?? 30 : 30;
|
|
39
46
|
}
|
|
40
47
|
function registerConnectorRoutes(authenticated, deps) {
|
|
48
|
+
const log = createLogger("Connectors:Routes");
|
|
41
49
|
const { service, strictRateLimitMiddleware } = deps;
|
|
42
50
|
authenticated.get("/api/connectors/catalog", (c) => {
|
|
43
51
|
return c.json({
|
|
@@ -128,12 +136,93 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
128
136
|
}, 400);
|
|
129
137
|
}
|
|
130
138
|
});
|
|
139
|
+
authenticated.patch("/api/connectors/composio/accounts/:id", strictRateLimitMiddleware, async (c) => {
|
|
140
|
+
const account = getConnectorAccount(c.req.param("id"));
|
|
141
|
+
if (!account || account.principalId !== "local-owner") return c.json({
|
|
142
|
+
ok: false,
|
|
143
|
+
error: "Account not found."
|
|
144
|
+
}, 404);
|
|
145
|
+
const body = await c.req.json().catch(() => null);
|
|
146
|
+
if (!body || typeof body !== "object" || Array.isArray(body) || body.label !== void 0 && (typeof body.label !== "string" || body.label.length > 120) || body.enabled !== void 0 && typeof body.enabled !== "boolean" || body.allowedAgentIds !== void 0 && body.allowedAgentIds !== null && (!Array.isArray(body.allowedAgentIds) || body.allowedAgentIds.some((id) => typeof id !== "string"))) return c.json({
|
|
147
|
+
ok: false,
|
|
148
|
+
error: "Invalid account settings."
|
|
149
|
+
}, 400);
|
|
150
|
+
return c.json({
|
|
151
|
+
ok: true,
|
|
152
|
+
payload: { account: updateConnectorAccount(account.id, body) }
|
|
153
|
+
});
|
|
154
|
+
});
|
|
131
155
|
authenticated.get("/api/connectors/learning", (c) => {
|
|
132
156
|
return c.json({
|
|
133
157
|
ok: true,
|
|
134
158
|
payload: { jobs: listConnectorLearningJobs({ limit: 100 }) }
|
|
135
159
|
});
|
|
136
160
|
});
|
|
161
|
+
authenticated.get("/api/connectors/composio/authorizations/:id", async (c) => {
|
|
162
|
+
let attempt = getAuthorizationAttempt(c.req.param("id"), "local-owner");
|
|
163
|
+
if (!attempt) return c.json({
|
|
164
|
+
ok: false,
|
|
165
|
+
error: "Authorization attempt not found."
|
|
166
|
+
}, 404);
|
|
167
|
+
try {
|
|
168
|
+
if (attempt.status === "awaiting_user") {
|
|
169
|
+
await new ComposioSessionsAdapter().syncConnections({
|
|
170
|
+
principalId: "local-owner",
|
|
171
|
+
backendId: attempt.backend_id ?? void 0
|
|
172
|
+
});
|
|
173
|
+
attempt = getAuthorizationAttempt(attempt.id, "local-owner");
|
|
174
|
+
}
|
|
175
|
+
const connection = listConnectorConnections({
|
|
176
|
+
principalId: "local-owner",
|
|
177
|
+
connectorId: attempt.connector_id
|
|
178
|
+
}).find((item) => item.id === attempt.connection_id);
|
|
179
|
+
return c.json({
|
|
180
|
+
ok: true,
|
|
181
|
+
payload: { attempt: {
|
|
182
|
+
id: attempt.id,
|
|
183
|
+
status: attempt.status,
|
|
184
|
+
authorizationUrl: attempt.authorization_url,
|
|
185
|
+
expiresAt: attempt.expires_at,
|
|
186
|
+
accountId: connection?.accountId
|
|
187
|
+
} }
|
|
188
|
+
});
|
|
189
|
+
} catch (err) {
|
|
190
|
+
log.warn({
|
|
191
|
+
err,
|
|
192
|
+
phase: "authorization_status",
|
|
193
|
+
backendId: attempt.backend_id,
|
|
194
|
+
connectorId: attempt.connector_id
|
|
195
|
+
}, "Could not synchronize authorization status");
|
|
196
|
+
const localConflict = /constraint failed/i.test(errorMessage(err));
|
|
197
|
+
return c.json({
|
|
198
|
+
ok: false,
|
|
199
|
+
error: localConflict ? "Local connection records could not be synchronized. Update and restart the gateway; do not delete or reauthorize your accounts." : "The connection service is temporarily unavailable. Retry checking this authorization."
|
|
200
|
+
}, localConflict ? 500 : 503);
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
authenticated.delete("/api/connectors/composio/accounts/:id", strictRateLimitMiddleware, async (c) => {
|
|
204
|
+
const account = getConnectorAccount(c.req.param("id"));
|
|
205
|
+
if (!account || account.principalId !== "local-owner") return c.json({
|
|
206
|
+
ok: false,
|
|
207
|
+
error: "Account not found."
|
|
208
|
+
}, 404);
|
|
209
|
+
updateConnectorAccount(account.id, { enabled: false });
|
|
210
|
+
try {
|
|
211
|
+
for (const connection of listConnectorConnections({
|
|
212
|
+
principalId: account.principalId,
|
|
213
|
+
connectorId: account.connectorId
|
|
214
|
+
})) if (connection.accountId === account.id && connection.status !== "revoked") await revokeComposioConnection(connection.id);
|
|
215
|
+
return c.json({
|
|
216
|
+
ok: true,
|
|
217
|
+
payload: { disconnected: true }
|
|
218
|
+
});
|
|
219
|
+
} catch (error) {
|
|
220
|
+
return c.json({
|
|
221
|
+
ok: false,
|
|
222
|
+
error: `Account paused; some authorizations could not be revoked. Retry disconnecting. ${errorMessage(error)}`
|
|
223
|
+
}, 400);
|
|
224
|
+
}
|
|
225
|
+
});
|
|
137
226
|
authenticated.get("/api/connectors/composio/accounts/:id/sync-policy", (c) => {
|
|
138
227
|
const account = getConnectorAccount(c.req.param("id"));
|
|
139
228
|
if (!account || account.principalId !== "local-owner") return c.json({
|
|
@@ -142,7 +231,7 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
142
231
|
}, 404);
|
|
143
232
|
const policy = getConnectorSyncPolicy(account.id) ?? {
|
|
144
233
|
accountId: account.id,
|
|
145
|
-
scanEnabled:
|
|
234
|
+
scanEnabled: false,
|
|
146
235
|
proactiveEnabled: false,
|
|
147
236
|
intervalMinutes: defaultConnectorSyncInterval(account.connectorId),
|
|
148
237
|
allowedScenarioKeys: [],
|
|
@@ -256,10 +345,7 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
256
345
|
const body = await c.req.json().catch(() => ({}));
|
|
257
346
|
const row = body && typeof body === "object" && !Array.isArray(body) ? body : {};
|
|
258
347
|
try {
|
|
259
|
-
const connection = updateComposioConnection(c.req.param("id"), {
|
|
260
|
-
alias: typeof row.alias === "string" ? row.alias : void 0,
|
|
261
|
-
isDefault: typeof row.isDefault === "boolean" ? row.isDefault : void 0
|
|
262
|
-
});
|
|
348
|
+
const connection = updateComposioConnection(c.req.param("id"), { alias: typeof row.alias === "string" ? row.alias : void 0 });
|
|
263
349
|
return c.json({
|
|
264
350
|
ok: true,
|
|
265
351
|
payload: { connection }
|
|
@@ -416,6 +502,7 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
416
502
|
payload: { result: await executeComposioTool({
|
|
417
503
|
slug,
|
|
418
504
|
arguments: args,
|
|
505
|
+
accountId: typeof body?.accountId === "string" ? body.accountId : void 0,
|
|
419
506
|
config: service.currentConfig
|
|
420
507
|
}) }
|
|
421
508
|
});
|
|
@@ -563,11 +650,22 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
563
650
|
}, 400);
|
|
564
651
|
const confirmationPolicy = rawConfirmationPolicy === "never" || rawConfirmationPolicy === "writes" || rawConfirmationPolicy === "always" ? rawConfirmationPolicy : void 0;
|
|
565
652
|
const allowedAgentIds = Array.isArray(row.allowedAgentIds) ? [...new Set(row.allowedAgentIds.filter((value) => typeof value === "string").map((value) => value.trim()).filter(Boolean))] : void 0;
|
|
566
|
-
|
|
653
|
+
if (row.selectedAccountIds !== void 0 && row.selectedAccountIds !== null && !Array.isArray(row.selectedAccountIds)) return c.json({
|
|
654
|
+
ok: false,
|
|
655
|
+
error: "selectedAccountIds must be null or an array of account IDs."
|
|
656
|
+
}, 400);
|
|
657
|
+
const selectedAccountIds = row.selectedAccountIds === null ? null : Array.isArray(row.selectedAccountIds) ? [...new Set(row.selectedAccountIds.filter((value) => typeof value === "string").map((value) => value.trim()).filter(Boolean))] : void 0;
|
|
658
|
+
if (Array.isArray(row.selectedAccountIds) && (selectedAccountIds?.length !== row.selectedAccountIds.length || selectedAccountIds.some((id) => {
|
|
659
|
+
const account = getConnectorAccount(id);
|
|
660
|
+
return !account || account.principalId !== "local-owner" || account.connectorId !== `composio-${c.req.param("toolkit")}`;
|
|
661
|
+
}))) return c.json({
|
|
662
|
+
ok: false,
|
|
663
|
+
error: "Select accounts belonging to this application."
|
|
664
|
+
}, 400);
|
|
567
665
|
try {
|
|
568
666
|
const policy = updateComposioInstallationPolicy(service.currentConfig, c.req.param("toolkit"), {
|
|
569
667
|
allowedAgentIds,
|
|
570
|
-
|
|
668
|
+
selectedAccountIds,
|
|
571
669
|
confirmationPolicy
|
|
572
670
|
});
|
|
573
671
|
return c.json({
|
|
@@ -606,9 +704,13 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
606
704
|
error: `Connector approval is ${approval?.status ?? "unavailable"}.`,
|
|
607
705
|
payload: { approval }
|
|
608
706
|
}, 409);
|
|
707
|
+
const resumed = await resumeApprovedConnectorAction(approval, service.connectionRecovery);
|
|
609
708
|
return c.json({
|
|
610
709
|
ok: true,
|
|
611
|
-
payload: {
|
|
710
|
+
payload: {
|
|
711
|
+
approval,
|
|
712
|
+
resumed
|
|
713
|
+
}
|
|
612
714
|
});
|
|
613
715
|
});
|
|
614
716
|
authenticated.post("/api/connectors/:id/auth/start", strictRateLimitMiddleware, async (c) => {
|
|
@@ -621,7 +723,34 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
621
723
|
error: `Unknown connector: ${connectorOrInstanceId}`
|
|
622
724
|
}, 404);
|
|
623
725
|
try {
|
|
624
|
-
const
|
|
726
|
+
const body = await c.req.json().catch(() => ({}));
|
|
727
|
+
let authorization;
|
|
728
|
+
if (typeof body?.accountId === "string") {
|
|
729
|
+
const account = getConnectorAccount(body.accountId);
|
|
730
|
+
if (!account || account.principalId !== "local-owner" || account.connectorId !== connector.id || !account.backendId || connector.runtime.type !== "composio") return c.json({
|
|
731
|
+
ok: false,
|
|
732
|
+
error: "Account connection service is unavailable. Refresh accounts first."
|
|
733
|
+
}, 400);
|
|
734
|
+
const current = listConnectorConnections({
|
|
735
|
+
principalId: "local-owner",
|
|
736
|
+
connectorId: connector.id
|
|
737
|
+
}).find((connection) => connection.id === account.currentConnectionId);
|
|
738
|
+
const result = await new ComposioSessionsAdapter().authorize({
|
|
739
|
+
principalId: "local-owner",
|
|
740
|
+
expectedAccountId: account.id,
|
|
741
|
+
toolkit: connector.runtime.toolkit,
|
|
742
|
+
backendId: account.backendId,
|
|
743
|
+
authConfigId: typeof current?.metadata.authConfigId === "string" ? current.metadata.authConfigId : void 0
|
|
744
|
+
});
|
|
745
|
+
authorization = {
|
|
746
|
+
connectorId: connector.id,
|
|
747
|
+
provider: "composio",
|
|
748
|
+
status: "pending",
|
|
749
|
+
authorizationUrl: result.connectUrl,
|
|
750
|
+
connectionId: result.connectionId,
|
|
751
|
+
attemptId: result.attemptId
|
|
752
|
+
};
|
|
753
|
+
} else authorization = await startConnectorAuthorization(connector, config, instance?.instanceId);
|
|
625
754
|
return c.json({
|
|
626
755
|
ok: true,
|
|
627
756
|
payload: { authorization }
|
|
@@ -634,20 +763,82 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
634
763
|
}
|
|
635
764
|
});
|
|
636
765
|
authenticated.get("/api/connectors/composio/setup-status", async (c) => {
|
|
637
|
-
const
|
|
638
|
-
|
|
766
|
+
const backend = await ensureComposioBackend();
|
|
767
|
+
const status = backend.mode === "byok" ? {
|
|
768
|
+
configured: Boolean(await resolveComposioApiKey()),
|
|
639
769
|
mode: "byok"
|
|
640
770
|
} : await inspectManagedComposioStatus();
|
|
641
771
|
return c.json({
|
|
642
772
|
ok: true,
|
|
643
|
-
payload:
|
|
773
|
+
payload: {
|
|
774
|
+
...status,
|
|
775
|
+
backendId: backend.id,
|
|
776
|
+
backends: listComposioBackends().map(({ id, label, mode, credential_source, verified_at }) => ({
|
|
777
|
+
id,
|
|
778
|
+
label,
|
|
779
|
+
mode,
|
|
780
|
+
credentialSource: credential_source,
|
|
781
|
+
verifiedAt: verified_at
|
|
782
|
+
}))
|
|
783
|
+
}
|
|
644
784
|
});
|
|
645
785
|
});
|
|
786
|
+
authenticated.delete("/api/connectors/composio/backends/:id", strictRateLimitMiddleware, async (c) => {
|
|
787
|
+
try {
|
|
788
|
+
await removeComposioBackend(c.req.param("id"));
|
|
789
|
+
return c.json({
|
|
790
|
+
ok: true,
|
|
791
|
+
payload: { removed: true }
|
|
792
|
+
});
|
|
793
|
+
} catch (error) {
|
|
794
|
+
return c.json({
|
|
795
|
+
ok: false,
|
|
796
|
+
error: errorMessage(error)
|
|
797
|
+
}, 400);
|
|
798
|
+
}
|
|
799
|
+
});
|
|
646
800
|
authenticated.post("/api/connectors/composio/setup", strictRateLimitMiddleware, async (c) => {
|
|
647
801
|
const body = await c.req.json().catch(() => ({}));
|
|
648
802
|
const apiKey = body && typeof body === "object" && !Array.isArray(body) ? String(body.apiKey ?? "") : "";
|
|
649
803
|
try {
|
|
650
|
-
|
|
804
|
+
if (!body || typeof body !== "object" || Array.isArray(body)) return c.json({
|
|
805
|
+
ok: false,
|
|
806
|
+
error: "Invalid setup request."
|
|
807
|
+
}, 400);
|
|
808
|
+
if (body.mode === "managed") {
|
|
809
|
+
const status = await inspectManagedComposioStatus();
|
|
810
|
+
if (!status.configured) return c.json({
|
|
811
|
+
ok: false,
|
|
812
|
+
error: status.reason ?? "Cloud unavailable."
|
|
813
|
+
}, 400);
|
|
814
|
+
activateComposioBackend((listComposioBackends().find((item) => item.mode === "managed") ?? addComposioBackend({
|
|
815
|
+
mode: "managed",
|
|
816
|
+
label: "XOPC Cloud"
|
|
817
|
+
})).id);
|
|
818
|
+
return c.json({
|
|
819
|
+
ok: true,
|
|
820
|
+
payload: {
|
|
821
|
+
configured: true,
|
|
822
|
+
mode: "managed"
|
|
823
|
+
}
|
|
824
|
+
});
|
|
825
|
+
}
|
|
826
|
+
if (typeof body.backendId === "string") {
|
|
827
|
+
if (!getComposioBackend(body.backendId)) return c.json({
|
|
828
|
+
ok: false,
|
|
829
|
+
error: "Unknown connection service."
|
|
830
|
+
}, 404);
|
|
831
|
+
await new ComposioSessionsAdapter().listToolkitCatalog({
|
|
832
|
+
principalId: "local-owner",
|
|
833
|
+
backendId: body.backendId
|
|
834
|
+
});
|
|
835
|
+
activateComposioBackend(body.backendId);
|
|
836
|
+
return c.json({
|
|
837
|
+
ok: true,
|
|
838
|
+
payload: { configured: true }
|
|
839
|
+
});
|
|
840
|
+
}
|
|
841
|
+
await configureComposioApiKey(apiKey, void 0, typeof body.replaceBackendId === "string" ? body.replaceBackendId : void 0);
|
|
651
842
|
return c.json({
|
|
652
843
|
ok: true,
|
|
653
844
|
payload: {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getSqliteDatabase, init_transaction } from "../../../storage/sqlite/transaction.js";
|
|
2
|
-
import { countKnowledgeSourceItems, deleteKnowledgeSourceItems } from "../../../storage/sqlite/knowledge-repository.js";
|
|
3
2
|
import { getConnectorAccount } from "../../../storage/sqlite/connector-account-repository.js";
|
|
3
|
+
import { countKnowledgeSourceItems, deleteKnowledgeSourceItems } from "../../../storage/sqlite/knowledge-repository.js";
|
|
4
4
|
import "../../../storage/sqlite/index.js";
|
|
5
5
|
import { init_agent_scope, resolveDefaultAgentId } from "../../../agent/agent-scope.js";
|
|
6
6
|
import { setAssertionStatus } from "../../../user-model/repository.js";
|
|
@@ -8,7 +8,6 @@ import "../../../user-model/index.js";
|
|
|
8
8
|
import { listConnectedContentCandidates, readConnectedContent } from "../../../connectors/content-enrichment.js";
|
|
9
9
|
import { getUnderstandingSourceGrant, listUnderstandingSourceGrants, listUnderstandingSourceRuns, revokeUnderstandingSourceGrant, updateUnderstandingSourceGrantPolicies } from "../../../user-context/sources/repository.js";
|
|
10
10
|
import { listUnderstandingSourceDefinitions } from "../../../user-context/sources/catalog.js";
|
|
11
|
-
import { randomUUID } from "node:crypto";
|
|
12
11
|
//#region src/gateway/hono/routes/context-sources.ts
|
|
13
12
|
init_agent_scope();
|
|
14
13
|
init_transaction();
|
|
@@ -103,28 +102,6 @@ function registerContextSourceRoutes(authenticated, deps) {
|
|
|
103
102
|
return c.json({ error: error instanceof Error ? error.message : String(error) }, 400);
|
|
104
103
|
}
|
|
105
104
|
});
|
|
106
|
-
authenticated.post("/api/context-sources/grants/:grantId/refresh", limited, async (c) => {
|
|
107
|
-
const grant = getUnderstandingSourceGrant(c.req.param("grantId"));
|
|
108
|
-
if (!grant || grant.status !== "active") return c.json({ error: "Active context source not found" }, 404);
|
|
109
|
-
try {
|
|
110
|
-
if (grant.adapterId === "local-work-folders") {
|
|
111
|
-
const result = await service.refreshDirectorySourceIfChanged({
|
|
112
|
-
id: grant.id,
|
|
113
|
-
idempotencyKey: randomUUID()
|
|
114
|
-
});
|
|
115
|
-
return c.json({ result }, result.changed ? 202 : 200);
|
|
116
|
-
}
|
|
117
|
-
const accountId = typeof grant.config.accountId === "string" ? grant.config.accountId : "";
|
|
118
|
-
const connectionId = accountId ? getConnectorAccount(accountId)?.currentConnectionId : void 0;
|
|
119
|
-
const job = connectionId ? deps.service.requestConnectorLearning(connectionId, {
|
|
120
|
-
mode: "incremental",
|
|
121
|
-
reason: "manual"
|
|
122
|
-
}) : null;
|
|
123
|
-
return job ? c.json({ job }, 202) : c.json({ error: "Context source cannot be refreshed here" }, 409);
|
|
124
|
-
} catch (error) {
|
|
125
|
-
return c.json({ error: error instanceof Error ? error.message : String(error) }, 400);
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
105
|
authenticated.get("/api/context-sources/work-folders", (c) => c.json({ sources: service.listDirectorySources() }));
|
|
129
106
|
authenticated.post("/api/context-sources/work-folders", limited, async (c) => {
|
|
130
107
|
const input = await c.req.json().catch(() => null);
|
|
@@ -3,6 +3,7 @@ import { decideConnectorApproval } from "../../../storage/sqlite/connector-repos
|
|
|
3
3
|
import "../../../storage/sqlite/index.js";
|
|
4
4
|
import { listGatewayAgents } from "../../agents-admin.js";
|
|
5
5
|
import { HomeQueryService, buildHomeWorkbench, decisionFromTask } from "../../../tasks/home-query-service.js";
|
|
6
|
+
import { resumeApprovedConnectorAction } from "../../../connectors/approval-resume.js";
|
|
6
7
|
//#region src/gateway/hono/routes/home.ts
|
|
7
8
|
/** Register the unified work-home read model and its decision actions. */
|
|
8
9
|
function registerHomeRoutes(authenticated, deps) {
|
|
@@ -26,9 +27,11 @@ function registerHomeRoutes(authenticated, deps) {
|
|
|
26
27
|
ok: false,
|
|
27
28
|
error: `Approval is ${approval.status}`
|
|
28
29
|
}, 409);
|
|
30
|
+
const resumed = await resumeApprovedConnectorAction(approval, service.connectionRecovery);
|
|
29
31
|
return c.json({
|
|
30
32
|
ok: true,
|
|
31
|
-
status: approval.status
|
|
33
|
+
status: approval.status,
|
|
34
|
+
resumed
|
|
32
35
|
});
|
|
33
36
|
}
|
|
34
37
|
return c.json({
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
import { getGatewayPrincipal } from "../../security/gateway-principal.js";
|
|
1
2
|
import { ImportError } from "../../../imports/types.js";
|
|
2
3
|
import { isImportSource } from "../../../imports/sources.js";
|
|
3
4
|
import { ImportSelectionRepository } from "../../../storage/sqlite/import-selection-repository.js";
|
|
4
5
|
import { getLiveInventory, previewInventoryItem, publicInventory, scanProduct } from "../../../imports/inventory.js";
|
|
5
6
|
import { importSelection, listImportSources } from "../../../imports/productImport.js";
|
|
6
7
|
import { createRuntimeImportService } from "../../../imports/runtime.js";
|
|
7
|
-
import { getGatewayPrincipal } from "../../security/gateway-principal.js";
|
|
8
8
|
import { z } from "zod";
|
|
9
9
|
//#region src/gateway/hono/routes/imports.ts
|
|
10
10
|
const selectionSchema = z.object({
|
|
@@ -329,6 +329,14 @@ const AUTHENTICATED_LAZY_ROUTE_BUNDLES = [
|
|
|
329
329
|
return { register: registerVoiceRoutes };
|
|
330
330
|
}
|
|
331
331
|
},
|
|
332
|
+
{
|
|
333
|
+
id: "user-model-refresh",
|
|
334
|
+
match: (pathname) => pathname === "/api/user-model/refresh" || pathname.startsWith("/api/user-model/refresh/"),
|
|
335
|
+
load: async () => {
|
|
336
|
+
const { registerUserModelRefreshRoutes } = await import("./user-model-refresh.js");
|
|
337
|
+
return { register: registerUserModelRefreshRoutes };
|
|
338
|
+
}
|
|
339
|
+
},
|
|
332
340
|
{
|
|
333
341
|
id: "user-model",
|
|
334
342
|
match: (path) => startsWithAny(path, [
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { readLocalAppAcceptanceConfig } from "../../../local-apps/acceptance.js";
|
|
2
|
-
import { LOCAL_APP_RUNTIME_BRIDGE_HASH, injectLocalAppRuntimeBridge } from "../../../local-apps/preview-runtime-bridge.js";
|
|
3
2
|
import { extensionAssetMimeType } from "../lib/extension-assets.js";
|
|
3
|
+
import { LOCAL_APP_RUNTIME_BRIDGE_HASH, injectLocalAppRuntimeBridge } from "../../../local-apps/preview-runtime-bridge.js";
|
|
4
4
|
import { relative, resolve } from "node:path";
|
|
5
5
|
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
6
6
|
//#region src/gateway/hono/routes/local-apps.ts
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { isManagedConnectorServer } from "../../../connectors/materialize.js";
|
|
1
2
|
import { canonicalizeConfiguredMcpServer, normalizeConfiguredMcpServers } from "../../../config/mcp-config-normalize.js";
|
|
2
3
|
import { loadMergedBundleMcpConfig } from "../../../agent/mcp/bundle-mcp-config.js";
|
|
3
|
-
import { isManagedConnectorServer } from "../../../connectors/materialize.js";
|
|
4
4
|
import { getWorkspacePath } from "../../../config/workspace-path-helpers.js";
|
|
5
5
|
import { getMcpOAuthManager } from "../../../agent/mcp/oauth/mcp-oauth-manager.js";
|
|
6
6
|
import { listBundleMcpServerCapabilitiesForGateway, listBundleMcpServerToolsForGateway } from "../../../agent/mcp/bundle-mcp-gateway.js";
|
|
@@ -405,6 +405,10 @@ function registerProjectsRoutes(authenticated, deps) {
|
|
|
405
405
|
originClass: "system",
|
|
406
406
|
replaceExisting: true
|
|
407
407
|
});
|
|
408
|
+
if (!record.item) return c.json({
|
|
409
|
+
ok: false,
|
|
410
|
+
error: "This memory was deleted and automatic recreation is disabled."
|
|
411
|
+
}, 409);
|
|
408
412
|
return c.json({
|
|
409
413
|
ok: true,
|
|
410
414
|
knowledge: record.item
|
|
@@ -804,6 +808,10 @@ function registerProjectsRoutes(authenticated, deps) {
|
|
|
804
808
|
originClass: "agent",
|
|
805
809
|
replaceExisting: true
|
|
806
810
|
});
|
|
811
|
+
if (!record.item) return c.json({
|
|
812
|
+
ok: false,
|
|
813
|
+
error: "This memory was deleted and automatic recreation is disabled."
|
|
814
|
+
}, 409);
|
|
807
815
|
return c.json({
|
|
808
816
|
ok: true,
|
|
809
817
|
knowledge: record.item
|