@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
|
@@ -2,6 +2,7 @@ import { createLogger } from "../utils/logger/index.js";
|
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
3
|
import { getConnectorInstallation, listConnectorConnections } from "../storage/sqlite/connector-repository.js";
|
|
4
4
|
import "../storage/sqlite/index.js";
|
|
5
|
+
import { canAccessConnectorAccount, currentAccountConnections } from "./account-access.js";
|
|
5
6
|
import { ComposioSessionsAdapter } from "./composio-sessions.js";
|
|
6
7
|
import { decodeConnectedSourceCursor, encodeConnectedSourceCursor } from "./connected-source-cursor.js";
|
|
7
8
|
import { scopeForComposioAction } from "./composio.js";
|
|
@@ -288,11 +289,11 @@ async function ingestComposioConnectedSource(input) {
|
|
|
288
289
|
const installation = getConnectorInstallation(`${connectorId}-local-owner`);
|
|
289
290
|
if (!installation?.enabled) throw new Error("Connector installation is not enabled.");
|
|
290
291
|
if (installation.allowedAgentIds.length && !installation.allowedAgentIds.includes(input.agentId)) throw new Error("This agent is not allowed to sync from the connector.");
|
|
291
|
-
const activeConnections = listConnectorConnections({
|
|
292
|
+
const activeConnections = currentAccountConnections(listConnectorConnections({
|
|
292
293
|
principalId: "local-owner",
|
|
293
294
|
connectorId
|
|
294
|
-
}).filter((connection) => connection
|
|
295
|
-
const connection = input.connectionId ? activeConnections.find((candidate) => candidate.id === input.connectionId) : activeConnections.
|
|
295
|
+
}).filter((connection) => canAccessConnectorAccount(connection, installation, input.agentId)));
|
|
296
|
+
const connection = input.connectionId ? activeConnections.find((candidate) => candidate.id === input.connectionId) : activeConnections.length === 1 ? activeConnections[0] : void 0;
|
|
296
297
|
if (!connection) throw new Error("No active connector account is available for connected source ingestion.");
|
|
297
298
|
if (!connection.accountId) throw new Error("The connector authorization is not assigned to an account.");
|
|
298
299
|
const adapter = input.adapter ?? new ComposioSessionsAdapter();
|
|
@@ -10,6 +10,7 @@ export declare function deriveConnectedSourceUnderstanding(input: {
|
|
|
10
10
|
sourceRunId: string;
|
|
11
11
|
processingPolicy: 'local_only' | 'remote_allowed';
|
|
12
12
|
analyze?: typeof analyzeUnderstandingSources;
|
|
13
|
+
assertAuthorized?: () => void;
|
|
13
14
|
}): Promise<{
|
|
14
15
|
created: number;
|
|
15
16
|
knowledgeCount: number;
|
|
@@ -95,6 +95,7 @@ async function deriveConnectedSourceUnderstanding(input) {
|
|
|
95
95
|
config: input.config,
|
|
96
96
|
items
|
|
97
97
|
});
|
|
98
|
+
input.assertAuthorized?.();
|
|
98
99
|
const byRef = new Map(items.map((item) => [item.evidenceRef, item]));
|
|
99
100
|
let created = 0;
|
|
100
101
|
for (const candidate of analysis.profileCandidates.filter(isPortraitCandidate)) {
|
|
@@ -3,17 +3,18 @@ import { init_logger } from "../utils/logger.js";
|
|
|
3
3
|
import { getSqliteDatabase, init_transaction } from "../storage/sqlite/transaction.js";
|
|
4
4
|
import { readCurrentTranscriptId } from "../storage/sqlite/session-instance-repository.js";
|
|
5
5
|
import { getSessionInputState, init_session_input_repository } from "../storage/sqlite/session-input-repository.js";
|
|
6
|
+
import { getConnectorAccount, init_connector_account_repository } from "../storage/sqlite/connector-account-repository.js";
|
|
7
|
+
import { getConnectorConnection, getConnectorInstallation, init_connector_repository, listConnectorConnections, upsertConnectorInstallation } from "../storage/sqlite/connector-repository.js";
|
|
6
8
|
import { cancelConnectionObjective, getActiveConnectionWait, getConnectionWait, init_connection_wait_repository, listConnectionWaitsToCheck, publishConnectionWait, queueConnectionResolution, updateConnectionWait } from "../storage/sqlite/connection-wait-repository.js";
|
|
7
9
|
import { init_session_repository } from "../storage/sqlite/session-repository.js";
|
|
8
|
-
import {
|
|
9
|
-
import { getConnectorAccount } from "../storage/sqlite/connector-account-repository.js";
|
|
10
|
+
import { canAccessConnectorAccount, currentAccountConnections } from "./account-access.js";
|
|
10
11
|
import { ComposioSessionsAdapter } from "./composio-sessions.js";
|
|
11
12
|
import { getConfiguredComposioAuthConfigs, isComposioActionAllowedByCatalog, scopeForComposioAction } from "./composio.js";
|
|
12
13
|
import { getConnectorDefinition } from "./catalog.js";
|
|
14
|
+
import { listConnectorInstances } from "./instances.js";
|
|
13
15
|
import { capabilityActions, isToolInputSchema, missingConnectionCapabilities } from "./connection-capabilities.js";
|
|
14
16
|
import { connectorPrincipalForSession } from "./principal.js";
|
|
15
17
|
import { resolveConnectionCandidate } from "./connection-candidates.js";
|
|
16
|
-
import { listConnectorInstances } from "./instances.js";
|
|
17
18
|
import { installConnector } from "./install.js";
|
|
18
19
|
import { persistConfigMutation } from "../config/config-mutation.js";
|
|
19
20
|
import { randomUUID } from "node:crypto";
|
|
@@ -22,6 +23,8 @@ init_transaction();
|
|
|
22
23
|
init_session_repository();
|
|
23
24
|
init_session_input_repository();
|
|
24
25
|
init_connection_wait_repository();
|
|
26
|
+
init_connector_repository();
|
|
27
|
+
init_connector_account_repository();
|
|
25
28
|
init_logger();
|
|
26
29
|
const log = createLogger("Connectors:Recovery");
|
|
27
30
|
const SCOPE_ORDER = {
|
|
@@ -88,12 +91,13 @@ var ConnectionRecoveryService = class {
|
|
|
88
91
|
const instance = listConnectorInstances(this.deps.getConfig()).find((instance) => instance.connectorId === need.connectorId);
|
|
89
92
|
const installation = getConnectorInstallation(`${need.connectorId}-${wait.principalId}`);
|
|
90
93
|
const scopeBlocked = Math.max(1, ...need.capabilities.filter((capability) => /^[A-Z]+_/.test(capability)).map((capability) => SCOPE_ORDER[scopeForComposioAction(capability).scope])) > SCOPE_ORDER[installation?.maxScope ?? "read"];
|
|
91
|
-
const blocked = scopeBlocked || instance?.enabled === false || installation?.enabled === false || Boolean(installation?.allowedAgentIds.length && !installation.allowedAgentIds.includes(wait.agentId));
|
|
92
94
|
const all = listConnectorConnections({
|
|
93
95
|
principalId: wait.principalId,
|
|
94
96
|
connectorId: need.connectorId
|
|
95
97
|
});
|
|
96
|
-
const
|
|
98
|
+
const requested = need.accountId ? all.find((connection) => connection.accountId === need.accountId) : void 0;
|
|
99
|
+
const blocked = scopeBlocked || instance?.enabled === false || installation?.enabled === false || installation?.selectedAccountIds?.length === 0 || Boolean(installation && requested && !canAccessConnectorAccount(requested, installation, wait.agentId)) || Boolean(installation?.allowedAgentIds.length && !installation.allowedAgentIds.includes(wait.agentId));
|
|
100
|
+
const eligible = all.filter((connection) => connection.status === "active" && (!installation || canAccessConnectorAccount(connection, installation, wait.agentId)) && (!verifiedIds || verifiedIds.has(connection.id)) && (!need.accountId || connection.accountId === need.accountId) && (installation?.selectedAccountIds == null || Boolean(connection.accountId && installation.selectedAccountIds.includes(connection.accountId))));
|
|
97
101
|
const byAccount = /* @__PURE__ */ new Map();
|
|
98
102
|
for (const connection of eligible) {
|
|
99
103
|
const key = connection.accountId ?? connection.id;
|
|
@@ -102,7 +106,7 @@ var ConnectionRecoveryService = class {
|
|
|
102
106
|
if (!previous || connection.id === preferredId || previous.id !== preferredId && connection.updatedAt > previous.updatedAt) byAccount.set(key, connection);
|
|
103
107
|
}
|
|
104
108
|
const active = [...byAccount.values()];
|
|
105
|
-
const selected = !verifiedIds && need.unavailable ? void 0 : need.attempt ? active.find((connection) => connection.providerConnectionId === need.attempt?.connectionId) : need.connectionId ? active.find((connection) => connection.id === need.connectionId) : active.length === 1 && !need.accountSelector ? active[0] : void 0;
|
|
109
|
+
const selected = !verifiedIds && need.unavailable ? void 0 : need.attempt ? active.find((connection) => connection.providerConnectionId === need.attempt?.connectionId) : need.accountId ? active.find((connection) => connection.accountId === need.accountId) : need.connectionId ? active.find((connection) => connection.id === need.connectionId) : active.length === 1 && !need.accountSelector ? active[0] : void 0;
|
|
106
110
|
const phase = blocked || selected && need.capabilityError ? "blocked" : selected ? "ready" : active.length > 1 || need.accountSelector && active.length > 0 && !need.connectionId ? "choose_account" : need.attempt && need.attempt.expiresAt > Date.now() ? "authorizing" : need.unavailable || all.some((connection) => [
|
|
107
111
|
"expired",
|
|
108
112
|
"revoked",
|
|
@@ -115,11 +119,12 @@ var ConnectionRecoveryService = class {
|
|
|
115
119
|
return {
|
|
116
120
|
...need,
|
|
117
121
|
alternatives,
|
|
122
|
+
accountId: selected?.accountId ?? need.accountId,
|
|
118
123
|
connectionId: selected?.id ?? need.connectionId,
|
|
119
124
|
phase,
|
|
120
125
|
accounts: active.map((connection) => ({
|
|
121
|
-
id: connection.
|
|
122
|
-
label: connection.
|
|
126
|
+
id: connection.accountId,
|
|
127
|
+
label: [getConnectorAccount(connection.accountId)?.label, connection.identity.email ?? connection.identity.name ?? connection.accountId].filter(Boolean).join(" · ")
|
|
123
128
|
})),
|
|
124
129
|
...need.capabilityError && selected ? { reason: need.capabilityError } : {},
|
|
125
130
|
...blocked ? { reason: scopeBlocked ? "This action needs broader permissions. Review connector permissions in settings." : "This app is disabled or unavailable to the current agent. Review connector settings." } : {}
|
|
@@ -154,7 +159,7 @@ var ConnectionRecoveryService = class {
|
|
|
154
159
|
allowedAgentIds: [],
|
|
155
160
|
maxScope: "read",
|
|
156
161
|
confirmationPolicy: "writes",
|
|
157
|
-
|
|
162
|
+
selectedAccountIds: null
|
|
158
163
|
});
|
|
159
164
|
}
|
|
160
165
|
async checkCapabilities(wait, verified) {
|
|
@@ -175,10 +180,15 @@ var ConnectionRecoveryService = class {
|
|
|
175
180
|
const definition = getConnectorDefinition(need.connectorId);
|
|
176
181
|
if (definition?.runtime.type !== "composio" || definition.runtime.role !== "toolkit") throw new Error("Unsupported connector");
|
|
177
182
|
const toolkit = definition.runtime.toolkit;
|
|
183
|
+
const selected = views.find((view) => view.key === need.key);
|
|
184
|
+
const connection = selected?.connectionId ? getConnectorConnection(selected.connectionId) : void 0;
|
|
178
185
|
const result = await (await this.adapter.createSession({
|
|
179
186
|
principalId: wait.principalId,
|
|
180
187
|
toolkits: [toolkit],
|
|
181
|
-
|
|
188
|
+
backendId: selected?.accountId ? getConnectorAccount(selected.accountId)?.backendId : void 0,
|
|
189
|
+
...typeof connection?.metadata.providerPrincipalId === "string" ? { providerPrincipalId: connection.metadata.providerPrincipalId } : {},
|
|
190
|
+
...connection ? { connectedAccounts: { [toolkit]: [connection.providerConnectionId] } } : {},
|
|
191
|
+
authConfigs: typeof connection?.metadata.authConfigId === "string" ? { [toolkit]: connection.metadata.authConfigId } : void 0
|
|
182
192
|
})).search({
|
|
183
193
|
query: `${toolkit} ${need.capabilities.join(" ")} ${capabilityActions(need).flat().join(" ")}`,
|
|
184
194
|
toolkits: [toolkit]
|
|
@@ -303,6 +313,8 @@ var ConnectionRecoveryService = class {
|
|
|
303
313
|
const auth = await this.adapter.authorize({
|
|
304
314
|
principalId: wait.principalId,
|
|
305
315
|
toolkit: definition.runtime.toolkit,
|
|
316
|
+
expectedAccountId: need.accountId,
|
|
317
|
+
backendId: need.accountId ? getConnectorAccount(need.accountId)?.backendId : void 0,
|
|
306
318
|
installationId,
|
|
307
319
|
authConfigId: getConfiguredComposioAuthConfigs(config, [definition.runtime.toolkit])?.[definition.runtime.toolkit]
|
|
308
320
|
});
|
|
@@ -336,7 +348,7 @@ var ConnectionRecoveryService = class {
|
|
|
336
348
|
const latest = getConnectionWait(wait.id);
|
|
337
349
|
if (!latest || latest.version !== wait.version || latest.status !== "open") throw new Error("WAIT_CHANGED");
|
|
338
350
|
let needs = wait.needs.map((need) => {
|
|
339
|
-
const authorized = fresh.find((item) => item.providerConnectionId === need.attempt?.connectionId && item.status === "active");
|
|
351
|
+
const authorized = fresh.find((item) => item.providerConnectionId === need.attempt?.connectionId && item.status === "active" && item.connectorId === need.connectorId && (!need.accountId || item.accountId === need.accountId));
|
|
340
352
|
return authorized ? {
|
|
341
353
|
...need,
|
|
342
354
|
unavailable: false,
|
|
@@ -352,8 +364,8 @@ var ConnectionRecoveryService = class {
|
|
|
352
364
|
});
|
|
353
365
|
if (action.action === "select_account") {
|
|
354
366
|
const need = needs.find((item) => item.key === action.needKey);
|
|
355
|
-
const connection = fresh.find((item) => item.
|
|
356
|
-
if (!need || !connection || !this.view(wait, verified).needs.find((item) => item.key === need.key)?.accounts.some((item) => item.id === connection.
|
|
367
|
+
const connection = currentAccountConnections(fresh).find((item) => item.accountId === action.accountId && item.connectorId === need?.connectorId);
|
|
368
|
+
if (!need || !connection || !this.view(wait, verified).needs.find((item) => item.key === need.key)?.accounts.some((item) => item.id === connection.accountId)) throw new Error("Account is unavailable.");
|
|
357
369
|
needs = needs.map((item) => item.key === need.key ? {
|
|
358
370
|
...item,
|
|
359
371
|
connectionId: connection.id,
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { ConnectorConnection } from './types.js';
|
|
2
|
+
/** Only verified display fields may enter model context or account summaries. */
|
|
3
|
+
export declare function connectorIdentitySummary(identity: Record<string, unknown>): Record<string, string>;
|
|
2
4
|
export declare function normalizeConnectorIdentity(toolkit: string, result: unknown): ConnectorConnection['identity'];
|
|
3
5
|
export declare function connectorIdentityKey(toolkit: string, identity: Record<string, unknown>): string | undefined;
|
|
4
6
|
export declare function mergeConnectorIdentity(toolkit: string, current: Record<string, unknown>, incoming: Record<string, unknown>): Record<string, unknown>;
|
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
//#region src/connectors/connector-identity.ts
|
|
2
|
+
/** Only verified display fields may enter model context or account summaries. */
|
|
3
|
+
function connectorIdentitySummary(identity) {
|
|
4
|
+
return Object.fromEntries([
|
|
5
|
+
"email",
|
|
6
|
+
"username",
|
|
7
|
+
"displayName",
|
|
8
|
+
"workspace",
|
|
9
|
+
"workspaceId",
|
|
10
|
+
"userId",
|
|
11
|
+
"enterpriseId",
|
|
12
|
+
"botUserId"
|
|
13
|
+
].flatMap((key) => typeof identity[key] === "string" && identity[key].trim() ? [[key, identity[key].slice(0, 320)]] : []));
|
|
14
|
+
}
|
|
2
15
|
function object(value) {
|
|
3
16
|
if (!value || typeof value !== "object" || Array.isArray(value)) return {};
|
|
4
17
|
return value;
|
|
@@ -85,16 +98,16 @@ function mergeConnectorIdentity(toolkit, current, incoming) {
|
|
|
85
98
|
"googledrive",
|
|
86
99
|
"github",
|
|
87
100
|
"slack"
|
|
88
|
-
].includes(normalizedToolkit)) return {
|
|
101
|
+
].includes(normalizedToolkit)) return connectorIdentitySummary({
|
|
89
102
|
...current,
|
|
90
103
|
...incoming
|
|
91
|
-
};
|
|
104
|
+
});
|
|
92
105
|
const normalized = Object.fromEntries(Object.entries(normalizeConnectorIdentity(normalizedToolkit, incoming)).filter(([, value]) => value !== void 0 && value !== null && value !== ""));
|
|
93
|
-
return {
|
|
106
|
+
return connectorIdentitySummary({
|
|
94
107
|
...current,
|
|
95
108
|
...incoming,
|
|
96
109
|
...normalized
|
|
97
|
-
};
|
|
110
|
+
});
|
|
98
111
|
}
|
|
99
112
|
//#endregion
|
|
100
|
-
export { connectorIdentityKey, mergeConnectorIdentity, normalizeConnectorIdentity };
|
|
113
|
+
export { connectorIdentityKey, connectorIdentitySummary, mergeConnectorIdentity, normalizeConnectorIdentity };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { getKnowledgeSourceItem, listKnowledgeSourceItems, upsertKnowledgeSourceItems } from "../storage/sqlite/knowledge-repository.js";
|
|
2
1
|
import { getConnectorConnection, getConnectorInstallation } from "../storage/sqlite/connector-repository.js";
|
|
2
|
+
import { getKnowledgeSourceItem, listKnowledgeSourceItems, upsertKnowledgeSourceItems } from "../storage/sqlite/knowledge-repository.js";
|
|
3
3
|
import "../storage/sqlite/index.js";
|
|
4
4
|
import { ComposioSessionsAdapter } from "./composio-sessions.js";
|
|
5
5
|
import { ConnectedKnowledgePipeline } from "../knowledge/connected-knowledge-pipeline.js";
|
|
@@ -27,7 +27,7 @@ function connectorInstanceFromRecord(instanceId, record) {
|
|
|
27
27
|
const definition = connectorDefinitionFromManagedMarker(markerRecord) ?? getConnectorDefinition(connectorId);
|
|
28
28
|
const runtime = record.runtime && typeof record.runtime === "object" && !Array.isArray(record.runtime) ? record.runtime : {};
|
|
29
29
|
const runtimeType = runtime.type;
|
|
30
|
-
if (runtimeType !== "composio" && runtimeType !== "
|
|
30
|
+
if (runtimeType !== "composio" && runtimeType !== "memorySource") return [];
|
|
31
31
|
if (runtimeType === "composio" && (typeof runtime.toolkit !== "string" || runtime.role !== "credential" && runtime.role !== "toolkit")) return [];
|
|
32
32
|
const enabled = markerRecord.enabled !== false;
|
|
33
33
|
return [{
|
|
@@ -47,12 +47,6 @@ function connectorInstanceFromRecord(instanceId, record) {
|
|
|
47
47
|
id: instanceId,
|
|
48
48
|
toolkit: runtime.toolkit,
|
|
49
49
|
role: runtime.role
|
|
50
|
-
} : runtimeType === "channel" ? {
|
|
51
|
-
type: "channel",
|
|
52
|
-
id: instanceId
|
|
53
|
-
} : runtimeType === "nativeTool" ? {
|
|
54
|
-
type: "nativeTool",
|
|
55
|
-
id: instanceId
|
|
56
50
|
} : {
|
|
57
51
|
type: "memorySource",
|
|
58
52
|
id: instanceId
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
3
|
import { claimNextConnectorLearningJob, enqueueConnectorLearningJob, listConnectorLearningJobs, recoverStaleConnectorLearningJobs, setConnectorLearningPaused, updateConnectorLearningJob } from "../storage/sqlite/connector-learning-repository.js";
|
|
4
|
-
import { getConnectorInstallation, listConnectorConnections, upsertConnectorConnection } from "../storage/sqlite/connector-repository.js";
|
|
5
4
|
import { getConnectorAccount, reconcileConnectorAccount } from "../storage/sqlite/connector-account-repository.js";
|
|
5
|
+
import { getConnectorInstallation, listConnectorConnections, upsertConnectorConnection } from "../storage/sqlite/connector-repository.js";
|
|
6
6
|
import { getConnectorSyncPolicyForConnection } from "../storage/sqlite/connector-sync-policy-repository.js";
|
|
7
7
|
import "../storage/sqlite/index.js";
|
|
8
8
|
import { connectorIdentityKey, normalizeConnectorIdentity } from "./connector-identity.js";
|
|
@@ -15,7 +15,7 @@ import "../knowledge/index.js";
|
|
|
15
15
|
import { ingestComposioConnectedSource } from "./connected-source-ingestion.js";
|
|
16
16
|
import { deriveConnectedSourceUnderstanding } from "./connected-source-understanding.js";
|
|
17
17
|
import { listConnectedContentCandidates, readConnectedContent } from "./content-enrichment.js";
|
|
18
|
-
import { createUnderstandingSourceRun, getUnderstandingSourceGrant, listUnderstandingSourceRuns, updateUnderstandingSourceGrantCheckpoint, updateUnderstandingSourceRun, upsertUnderstandingSourceGrant } from "../user-context/sources/repository.js";
|
|
18
|
+
import { createUnderstandingSourceRun, getUnderstandingSourceGrant, listUnderstandingSourceGrants, listUnderstandingSourceRuns, updateUnderstandingSourceGrantCheckpoint, updateUnderstandingSourceRun, upsertUnderstandingSourceGrant } from "../user-context/sources/repository.js";
|
|
19
19
|
//#region src/connectors/learning-coordinator.ts
|
|
20
20
|
init_logger();
|
|
21
21
|
const log = createLogger("ConnectorLearning");
|
|
@@ -33,7 +33,9 @@ function connectorSourceCategory(toolkit) {
|
|
|
33
33
|
return "files";
|
|
34
34
|
}
|
|
35
35
|
function ensureUnderstandingSourceRun(job, toolkit, displayName) {
|
|
36
|
-
const
|
|
36
|
+
const existing = listUnderstandingSourceGrants({ includeRevoked: true }).find((grant) => grant.sourceKey === `connector-account:${job.accountId}`);
|
|
37
|
+
if (existing?.status === "revoked") throw new Error("Source authorization was revoked.");
|
|
38
|
+
const grant = existing ?? upsertUnderstandingSourceGrant({
|
|
37
39
|
sourceKey: `connector-account:${job.accountId}`,
|
|
38
40
|
adapterId: `connector:${job.connectorId}`,
|
|
39
41
|
category: connectorSourceCategory(toolkit),
|
|
@@ -74,8 +76,17 @@ function startConnectorLearningCoordinator(options) {
|
|
|
74
76
|
const connection = listConnectorConnections().find((item) => item.id === connectionId && item.status === "active");
|
|
75
77
|
if (!connection) return null;
|
|
76
78
|
if (!connection.accountId) throw new Error(`Connector account is missing for connection ${connection.id}.`);
|
|
79
|
+
if (!getConnectorAccount(connection.accountId)?.enabled) return null;
|
|
80
|
+
if (listUnderstandingSourceGrants({ includeRevoked: true }).some((grant) => grant.sourceKey === `connector-account:${connection.accountId}` && grant.status === "revoked")) return null;
|
|
81
|
+
if (request.reason === "manual") {
|
|
82
|
+
const active = listConnectorLearningJobs({
|
|
83
|
+
accountId: connection.accountId,
|
|
84
|
+
limit: 100
|
|
85
|
+
}).find((job) => job.status === "running" || job.status === "queued" && (!job.nextRunAt || Date.parse(job.nextRunAt) <= Date.now()));
|
|
86
|
+
if (active) return active;
|
|
87
|
+
}
|
|
77
88
|
const syncPolicy = getConnectorSyncPolicyForConnection(connection.id);
|
|
78
|
-
if (request.reason !== "manual" && syncPolicy?.scanEnabled
|
|
89
|
+
if (request.reason !== "manual" && syncPolicy?.scanEnabled !== true) return null;
|
|
79
90
|
const definition = getConnectorDefinition(connection.connectorId);
|
|
80
91
|
if (definition?.runtime.type !== "composio" || definition.runtime.role !== "toolkit") return null;
|
|
81
92
|
if (!getConnectorLearningPlan(definition.runtime.toolkit)) return null;
|
|
@@ -212,13 +223,21 @@ function startConnectorLearningCoordinator(options) {
|
|
|
212
223
|
knowledgeCount: 0,
|
|
213
224
|
status: "completed"
|
|
214
225
|
};
|
|
226
|
+
const sourceGrantPolicy = getUnderstandingSourceGrant(sourceRun.grantId)?.processingPolicy;
|
|
215
227
|
try {
|
|
216
228
|
semantic = await deriveConnectedSourceUnderstanding({
|
|
217
229
|
config: options.getConfig(),
|
|
218
230
|
agentId: job.agentId,
|
|
219
231
|
sourceInstanceId: job.sourceInstanceId,
|
|
220
232
|
sourceRunId: sourceRun.id,
|
|
221
|
-
processingPolicy: getUnderstandingSourceGrant(sourceRun.grantId)?.processingPolicy ?? "local_only"
|
|
233
|
+
processingPolicy: getUnderstandingSourceGrant(sourceRun.grantId)?.processingPolicy ?? "local_only",
|
|
234
|
+
assertAuthorized: () => {
|
|
235
|
+
const grant = getUnderstandingSourceGrant(sourceRun.grantId);
|
|
236
|
+
if (grant?.status !== "active" || !getConnectorAccount(job.accountId)?.enabled || grant.processingPolicy !== sourceGrantPolicy || !learningEnabled(options.getConfig()) || listConnectorLearningJobs({
|
|
237
|
+
accountId: job.accountId,
|
|
238
|
+
limit: 100
|
|
239
|
+
}).find((item) => item.id === job.id)?.status !== "running") throw new Error("Source authorization changed during analysis.");
|
|
240
|
+
}
|
|
222
241
|
});
|
|
223
242
|
} catch (error) {
|
|
224
243
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
@@ -275,7 +294,7 @@ function startConnectorLearningCoordinator(options) {
|
|
|
275
294
|
...retention
|
|
276
295
|
}, "Connected source retention pruned");
|
|
277
296
|
const syncPolicy = getConnectorSyncPolicyForConnection(job.connectionId);
|
|
278
|
-
if (syncPolicy?.scanEnabled
|
|
297
|
+
if (syncPolicy?.scanEnabled !== true) return;
|
|
279
298
|
const intervalMinutes = syncPolicy?.intervalMinutes ?? plan.intervalMinutes;
|
|
280
299
|
const nextRunAt = Date.now() + intervalMinutes * 6e4;
|
|
281
300
|
enqueueConnection(getConnectorAccount(job.accountId)?.currentConnectionId ?? job.connectionId, {
|
|
@@ -296,7 +315,7 @@ function startConnectorLearningCoordinator(options) {
|
|
|
296
315
|
await execute(job);
|
|
297
316
|
} catch (err) {
|
|
298
317
|
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
299
|
-
const exhausted = job.attemptCount >= 5;
|
|
318
|
+
const exhausted = job.attemptCount >= 5 || job.idempotencyKey.startsWith("understanding-refresh:");
|
|
300
319
|
publish(updateConnectorLearningJob(job.id, {
|
|
301
320
|
status: exhausted ? "paused" : "failed",
|
|
302
321
|
error: learningFailureCode(err),
|
|
@@ -304,11 +323,15 @@ function startConnectorLearningCoordinator(options) {
|
|
|
304
323
|
finished: true
|
|
305
324
|
}));
|
|
306
325
|
const definition = getConnectorDefinition(job.connectorId);
|
|
307
|
-
if (definition?.runtime.type === "composio" && definition.runtime.role === "toolkit")
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
326
|
+
if (definition?.runtime.type === "composio" && definition.runtime.role === "toolkit") {
|
|
327
|
+
const grant = listUnderstandingSourceGrants({ includeRevoked: true }).find((item) => item.sourceKey === `connector-account:${job.accountId}`);
|
|
328
|
+
const sourceRun = grant && listUnderstandingSourceRuns(grant.id, 100).find((item) => item.metadata.connectorLearningJobId === job.id);
|
|
329
|
+
if (sourceRun) updateUnderstandingSourceRun(sourceRun.id, {
|
|
330
|
+
status: "failed",
|
|
331
|
+
errorMessage: learningFailureCode(err),
|
|
332
|
+
completed: true
|
|
333
|
+
});
|
|
334
|
+
}
|
|
312
335
|
log.warn({
|
|
313
336
|
err,
|
|
314
337
|
jobId: job.id,
|
|
@@ -4,6 +4,7 @@ import { createConnectorSecretReference } from "./secret-store.js";
|
|
|
4
4
|
init_schema();
|
|
5
5
|
const SERVER_ID_PATTERN = /^[a-z][a-z0-9_-]{0,63}$/;
|
|
6
6
|
const TEMPLATE_PATTERN = /^\{\{(secrets|config)\.([A-Za-z0-9_.-]+)\}\}$/;
|
|
7
|
+
const EMBEDDED_SECRET_PATTERN = /\{\{secrets\.([A-Za-z0-9_.-]+)\}\}/g;
|
|
7
8
|
function assertValidConnectorServerId(serverId) {
|
|
8
9
|
if (!SERVER_ID_PATTERN.test(serverId)) throw new Error("Connector server name must start with a lowercase letter and only contain lowercase letters, numbers, dashes, and underscores.");
|
|
9
10
|
}
|
|
@@ -14,7 +15,19 @@ function readInputValue(definition, input, scope, key) {
|
|
|
14
15
|
function resolveTemplateValue(value, definition, input) {
|
|
15
16
|
if (typeof value !== "string") return value;
|
|
16
17
|
const match = TEMPLATE_PATTERN.exec(value.trim());
|
|
17
|
-
if (!match)
|
|
18
|
+
if (!match) {
|
|
19
|
+
const matches = [...value.matchAll(EMBEDDED_SECRET_PATTERN)];
|
|
20
|
+
if (matches.length === 0) return value;
|
|
21
|
+
if (matches.length > 1) throw new Error("Connector template values may contain at most one embedded secret.");
|
|
22
|
+
const embedded = matches[0];
|
|
23
|
+
const token = embedded[0];
|
|
24
|
+
const fieldKey = embedded[1];
|
|
25
|
+
const offset = embedded.index ?? 0;
|
|
26
|
+
return createConnectorSecretReference(definition.id, fieldKey, {
|
|
27
|
+
prefix: value.slice(0, offset),
|
|
28
|
+
suffix: value.slice(offset + token.length)
|
|
29
|
+
});
|
|
30
|
+
}
|
|
18
31
|
return readInputValue(definition, input, match[1], match[2]);
|
|
19
32
|
}
|
|
20
33
|
function materializeTemplate(value, definition, input) {
|
|
@@ -8,6 +8,6 @@ export declare function evaluateConnectorExecutionPolicy(input: {
|
|
|
8
8
|
installation: ConnectorInstallationPolicy;
|
|
9
9
|
action: Pick<ConnectorActionMetadata, 'scope' | 'curated'>;
|
|
10
10
|
agentId?: string;
|
|
11
|
-
|
|
11
|
+
accountId?: string;
|
|
12
12
|
confirmed?: boolean;
|
|
13
13
|
}): ConnectorPolicyEvaluation;
|
|
@@ -21,7 +21,7 @@ function evaluateConnectorExecutionPolicy(input) {
|
|
|
21
21
|
decision: "denied",
|
|
22
22
|
reason: "Agent is not allowed to use this connector."
|
|
23
23
|
};
|
|
24
|
-
if (installation.
|
|
24
|
+
if (installation.selectedAccountIds !== null && (!input.accountId || !installation.selectedAccountIds.includes(input.accountId))) return {
|
|
25
25
|
decision: "denied",
|
|
26
26
|
reason: "Connection is not allowed by this connector policy."
|
|
27
27
|
};
|
|
@@ -1,17 +1,38 @@
|
|
|
1
|
+
import { getSessionMetadata, init_session_repository } from "../storage/sqlite/session-repository.js";
|
|
1
2
|
import { getConversationRouting } from "../storage/sqlite/conversation-repository.js";
|
|
2
3
|
import { init_session_key } from "../routing/session-key.js";
|
|
3
4
|
//#region src/connectors/principal.ts
|
|
4
5
|
init_session_key();
|
|
6
|
+
init_session_repository();
|
|
5
7
|
function connectorPrincipalForSession(conversationId) {
|
|
6
|
-
|
|
8
|
+
let parsed = getConversationRouting(conversationId);
|
|
9
|
+
const agentId = parsed?.agentId;
|
|
10
|
+
const visited = /* @__PURE__ */ new Set();
|
|
11
|
+
while (conversationId && parsed?.source === "workflow" && !visited.has(conversationId) && visited.size < 8) {
|
|
12
|
+
visited.add(conversationId);
|
|
13
|
+
const metadata = getSessionMetadata(conversationId);
|
|
14
|
+
const parent = metadata?.parentConversationId ?? metadata?.customData?.parentConversationId;
|
|
15
|
+
if (typeof parent !== "string") {
|
|
16
|
+
if (metadata?.sessionType === "workflow-run") return {
|
|
17
|
+
principalId: "local-owner",
|
|
18
|
+
agentId,
|
|
19
|
+
isLocalOwner: true
|
|
20
|
+
};
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
const parentRouting = getConversationRouting(parent);
|
|
24
|
+
if (!parentRouting) break;
|
|
25
|
+
conversationId = parent;
|
|
26
|
+
parsed = parentRouting;
|
|
27
|
+
}
|
|
7
28
|
if (!parsed || parsed.source === "cli" || parsed.source === "webchat") return {
|
|
8
29
|
principalId: "local-owner",
|
|
9
|
-
agentId
|
|
30
|
+
agentId,
|
|
10
31
|
isLocalOwner: true
|
|
11
32
|
};
|
|
12
33
|
return {
|
|
13
34
|
principalId: `channel:${parsed.source}:${parsed.accountId}:${parsed.peerKind}:${parsed.peerId}`,
|
|
14
|
-
agentId
|
|
35
|
+
agentId,
|
|
15
36
|
isLocalOwner: false
|
|
16
37
|
};
|
|
17
38
|
}
|
|
@@ -6,5 +6,6 @@ export type ConnectorProvider = {
|
|
|
6
6
|
};
|
|
7
7
|
export declare const builtinConnectorProvider: ConnectorProvider;
|
|
8
8
|
export declare const composioConnectorProvider: ConnectorProvider;
|
|
9
|
+
export declare const chinaConnectorProvider: ConnectorProvider;
|
|
9
10
|
export declare function listConnectorProviders(): ConnectorProvider[];
|
|
10
11
|
export declare function listConnectorProviderDefinitions(): ConnectorDefinition[];
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { BUILTIN_CONNECTORS } from "./builtin-catalog.js";
|
|
2
|
+
import { CHINA_CONNECTORS } from "./china-catalog.js";
|
|
2
3
|
import { COMPOSIO_CONNECTORS } from "./composio.js";
|
|
3
4
|
//#region src/connectors/providers.ts
|
|
4
5
|
const builtinConnectorProvider = {
|
|
@@ -15,7 +16,18 @@ const composioConnectorProvider = {
|
|
|
15
16
|
return COMPOSIO_CONNECTORS;
|
|
16
17
|
}
|
|
17
18
|
};
|
|
18
|
-
const
|
|
19
|
+
const chinaConnectorProvider = {
|
|
20
|
+
id: "china",
|
|
21
|
+
displayName: "China connectors",
|
|
22
|
+
listConnectors() {
|
|
23
|
+
return CHINA_CONNECTORS;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
const CONNECTOR_PROVIDERS = [
|
|
27
|
+
builtinConnectorProvider,
|
|
28
|
+
chinaConnectorProvider,
|
|
29
|
+
composioConnectorProvider
|
|
30
|
+
];
|
|
19
31
|
function listConnectorProviders() {
|
|
20
32
|
return [...CONNECTOR_PROVIDERS];
|
|
21
33
|
}
|
|
@@ -23,4 +35,4 @@ function listConnectorProviderDefinitions() {
|
|
|
23
35
|
return CONNECTOR_PROVIDERS.flatMap((provider) => provider.listConnectors());
|
|
24
36
|
}
|
|
25
37
|
//#endregion
|
|
26
|
-
export { builtinConnectorProvider, composioConnectorProvider, listConnectorProviderDefinitions, listConnectorProviders };
|
|
38
|
+
export { builtinConnectorProvider, chinaConnectorProvider, composioConnectorProvider, listConnectorProviderDefinitions, listConnectorProviders };
|
|
@@ -2,7 +2,6 @@ import { isXopcDatabaseOpen } from "../storage/sqlite/connection.js";
|
|
|
2
2
|
import { deleteConnectorInstallation, getConnectorInstallation, upsertConnectorInstallation } from "../storage/sqlite/connector-repository.js";
|
|
3
3
|
import "../storage/sqlite/index.js";
|
|
4
4
|
import { assertComposioAccessConfigured } from "./composio-sessions.js";
|
|
5
|
-
import { saveComposioApiKey } from "./composio.js";
|
|
6
5
|
import { saveConnectorSecrets } from "./secret-store.js";
|
|
7
6
|
import { isManagedConnectorServer, materializeConnectorMcpServer } from "./materialize.js";
|
|
8
7
|
import { appendConnectorAuditRecord } from "./usage.js";
|
|
@@ -106,7 +105,7 @@ registerConnectorRuntimeAdapter({
|
|
|
106
105
|
type: "composio",
|
|
107
106
|
async install({ config, definition, input, resolver }) {
|
|
108
107
|
if (definition.runtime.type !== "composio") throw new Error(`Invalid Composio connector definition: ${definition.id}`);
|
|
109
|
-
if (definition.runtime.role
|
|
108
|
+
if (definition.runtime.role !== "toolkit") throw new Error("Configure Composio in connection service settings.");
|
|
110
109
|
if (definition.runtime.role === "toolkit") await assertComposioAccessConfigured(resolver);
|
|
111
110
|
const instance = installRecord(config, definition, definition.runtime.role === "toolkit" ? { scope: "read" } : {}, definition.runtime.role === "toolkit" ? { config: input.config ?? {} } : {});
|
|
112
111
|
if (definition.runtime.role === "toolkit" && isXopcDatabaseOpen()) {
|
|
@@ -120,7 +119,7 @@ registerConnectorRuntimeAdapter({
|
|
|
120
119
|
allowedAgentIds: existing?.allowedAgentIds ?? [],
|
|
121
120
|
maxScope: "read",
|
|
122
121
|
confirmationPolicy: existing?.confirmationPolicy ?? "writes",
|
|
123
|
-
|
|
122
|
+
selectedAccountIds: existing?.selectedAccountIds ?? null,
|
|
124
123
|
createdAt: existing?.createdAt
|
|
125
124
|
});
|
|
126
125
|
}
|
|
@@ -145,12 +144,8 @@ registerConnectorRuntimeAdapter({
|
|
|
145
144
|
return installedInstance(config, instanceId, definition.id);
|
|
146
145
|
}
|
|
147
146
|
});
|
|
148
|
-
|
|
149
|
-
"
|
|
150
|
-
"nativeTool",
|
|
151
|
-
"memorySource"
|
|
152
|
-
]) registerConnectorRuntimeAdapter({
|
|
153
|
-
type,
|
|
147
|
+
registerConnectorRuntimeAdapter({
|
|
148
|
+
type: "memorySource",
|
|
154
149
|
async install({ config, definition, input }) {
|
|
155
150
|
return installRecord(config, definition, {}, { config: input.config ?? {} });
|
|
156
151
|
},
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { CredentialResolver } from '../auth/credentials.js';
|
|
2
2
|
import type { ConnectorDefinition, ConnectorInstallInput, ConnectorSecretReference } from './types.js';
|
|
3
3
|
export declare function connectorSecretProviderId(connectorId: string, fieldKey: string): string;
|
|
4
|
-
export declare function createConnectorSecretReference(connectorId: string, fieldKey: string
|
|
4
|
+
export declare function createConnectorSecretReference(connectorId: string, fieldKey: string, affixes?: {
|
|
5
|
+
prefix?: string;
|
|
6
|
+
suffix?: string;
|
|
7
|
+
}): ConnectorSecretReference;
|
|
5
8
|
export declare function isConnectorSecretReference(value: unknown): value is ConnectorSecretReference;
|
|
6
9
|
export declare function saveConnectorSecrets(definition: ConnectorDefinition, input: ConnectorInstallInput, resolver?: CredentialResolver): Promise<void>;
|
|
7
10
|
export declare function resolveConnectorSecretReferences(value: unknown, resolver?: CredentialResolver): Promise<unknown>;
|
|
@@ -8,10 +8,12 @@ function normalizeSecretSegment(value) {
|
|
|
8
8
|
function connectorSecretProviderId(connectorId, fieldKey) {
|
|
9
9
|
return `connector-${normalizeSecretSegment(connectorId)}-${normalizeSecretSegment(fieldKey)}`;
|
|
10
10
|
}
|
|
11
|
-
function createConnectorSecretReference(connectorId, fieldKey) {
|
|
11
|
+
function createConnectorSecretReference(connectorId, fieldKey, affixes = {}) {
|
|
12
12
|
return { xopcSecretRef: {
|
|
13
13
|
provider: connectorSecretProviderId(connectorId, fieldKey),
|
|
14
|
-
fieldKey
|
|
14
|
+
fieldKey,
|
|
15
|
+
...affixes.prefix ? { prefix: affixes.prefix } : {},
|
|
16
|
+
...affixes.suffix ? { suffix: affixes.suffix } : {}
|
|
15
17
|
} };
|
|
16
18
|
}
|
|
17
19
|
function isConnectorSecretReference(value) {
|
|
@@ -28,7 +30,9 @@ async function saveConnectorSecrets(definition, input, resolver = new Credential
|
|
|
28
30
|
}
|
|
29
31
|
}
|
|
30
32
|
async function resolveSecretReference(reference, resolver) {
|
|
31
|
-
|
|
33
|
+
const value = await resolver.resolveApiKey(reference.xopcSecretRef.provider);
|
|
34
|
+
if (!value) return void 0;
|
|
35
|
+
return `${reference.xopcSecretRef.prefix ?? ""}${value}${reference.xopcSecretRef.suffix ?? ""}`;
|
|
32
36
|
}
|
|
33
37
|
async function resolveConnectorSecretReferences(value, resolver = new CredentialResolver()) {
|
|
34
38
|
if (isConnectorSecretReference(value)) return resolveSecretReference(value, resolver);
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
+
import { getConnectorAccount, init_connector_account_repository } from "../storage/sqlite/connector-account-repository.js";
|
|
4
|
+
import { init_connector_repository, listConnectorConnections } from "../storage/sqlite/connector-repository.js";
|
|
3
5
|
import { getKnowledgeConsumerWatermark, getKnowledgeSourceItem, listKnowledgeSourceChanges, setKnowledgeConsumerWatermark } from "../storage/sqlite/knowledge-repository.js";
|
|
4
|
-
import { listConnectorConnections } from "../storage/sqlite/connector-repository.js";
|
|
5
|
-
import { getConnectorAccount } from "../storage/sqlite/connector-account-repository.js";
|
|
6
6
|
import { getConnectorSyncPolicyForConnection } from "../storage/sqlite/connector-sync-policy-repository.js";
|
|
7
7
|
//#region src/connectors/source-change-publisher.ts
|
|
8
|
+
init_connector_account_repository();
|
|
9
|
+
init_connector_repository();
|
|
8
10
|
init_logger();
|
|
9
11
|
const log = createLogger("Connector:SourceChanges");
|
|
10
12
|
const CONSUMER_ID = "proactive-connected-source-v1";
|