@xopcai/xopc 0.0.115 → 0.0.117
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -10
- package/README.zh-CN.md +26 -10
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/demo-memory/src/index.d.ts +6 -0
- package/dist/extensions/demo-memory/src/index.js +132 -0
- package/dist/extensions/demo-memory/src/index.js.map +1 -0
- package/dist/extensions/demo-memory/xopc.extension.json +15 -0
- package/dist/extensions/feishu/src/schema/config-schema.d.ts +3 -3
- package/dist/extensions/telegram/src/command-handler.js +1 -2
- package/dist/extensions/telegram/src/command-handler.js.map +1 -1
- package/dist/extensions/telegram/src/config-schema.d.ts +8 -8
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-DVnBfANm.js → agent-avatar-dicebear-BBLhJ2C6.js} +1 -1
- package/dist/gateway/static/root/assets/agents-C6xgagZd.js +71 -0
- package/dist/gateway/static/root/assets/app-management-settings-panel-CBpLONvG.js +1 -0
- package/dist/gateway/static/root/assets/{appearance-settings-BQpPSTHD.js → appearance-settings-CGcc54yj.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-DdDx0V4z.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-CXu-Csep.js → archive-plugin-DZsVqMhU.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-BAjgOoGY.js → attachment-load-CIol6JWX.js} +1 -1
- package/dist/gateway/static/root/assets/{binary-plugins-BSBgB2hO.js → binary-plugins-B3UauMfp.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-BpXw9TTR.js → block-editor-2HJoFchH.js} +3 -3
- package/dist/gateway/static/root/assets/browser-settings-page-CUOO-PQk.js +8 -0
- package/dist/gateway/static/root/assets/capability-presets-api-XQoMTI0A.js +1 -0
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-CfqF-kGr.js +1 -0
- package/dist/gateway/static/root/assets/{channels-settings-BbPUpzWB.js → channels-settings-BYyRzsex.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-DIvEz4NX.js +2 -0
- package/dist/gateway/static/root/assets/cron-api-R41aQCX9.js +1 -0
- package/dist/gateway/static/root/assets/cron-page-D97nFqQD.js +3 -0
- package/dist/gateway/static/root/assets/dreaming-settings-Bceaw1PG.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-D9kgUHCc.js → extension-debug-page-DX5WRE_t.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-CGyhXqzR.js → extension-page-Buah7Bw-.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-DL8Xquqd.js → extension-settings-page-DuroLVnf.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-D0VXA932.js → fetch-B5zdl27C.js} +1 -1
- package/dist/gateway/static/root/assets/{format-interval-label-Be8SmgUw.js → format-interval-label-Dn_QKIqb.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-config-api-gT4ZhE7h.js +1 -0
- package/dist/gateway/static/root/assets/gateway-settings-iISWAZRm.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-DERUH61L.js → gateway-startup-retry-B3kL8KGY.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-DCUROLMQ.js +1 -0
- package/dist/gateway/static/root/assets/{goals-config-api-BPmqWk90.js → goals-config-api-AR-fVh0P.js} +1 -1
- package/dist/gateway/static/root/assets/goals-page-Cpb21ezg.js +2 -0
- package/dist/gateway/static/root/assets/goals-settings-CPAuFwoD.js +1 -0
- package/dist/gateway/static/root/assets/{heartbeat-config-api-Bfdzr8oV.js → heartbeat-config-api-D7bKFEeO.js} +1 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-CC69vNx0.js +1 -0
- package/dist/gateway/static/root/assets/index-CwhK8qCh.js +122 -0
- package/dist/gateway/static/root/assets/index-CyfhARL-.css +1 -0
- package/dist/gateway/static/root/assets/{interval-presets-utKbuCRY.js → interval-presets-0DtsnxE0.js} +1 -1
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CjqS6c6V.js → keyboard-shortcuts-settings-BPREtN8B.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-DefCgF4o.js +2 -0
- package/dist/gateway/static/root/assets/{markdown-split-DW8C47iB.js → markdown-split-ChbR9LGO.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-D6HwDhDT.js → media-plugins-B82oP80n.js} +1 -1
- package/dist/gateway/static/root/assets/messages-Cf1O9JB0.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-panel-DmKiIihT.js +2 -0
- package/dist/gateway/static/root/assets/note-detail-page-CxxfLRJZ.js +2 -0
- package/dist/gateway/static/root/assets/{note-image-lightbox-pJM35Pz5.js → note-image-lightbox-CDknITM3.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-X2slSx7V.js +1 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-CVwHuyN6.js → preview-open-alternatives-DV3xQsWB.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-BvmUWqgu.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-Ba-UEk7x.js → save-bar-controls-BODCXnvY.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-CNN9595U.js → schedule-field-CgJSCD3B.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-DnNMmtD5.js → schema-form-qtfEI6QM.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-B0yESuuL.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-q2M8RKOo.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-CmOz80i5.js → settings-collapsible-section-BHZKjVcS.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-BmK7JJOV.js → settings-form-section-5i35D-J1.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-CGozabLD.js +1 -0
- package/dist/gateway/static/root/assets/setup-status-panel-FoOSe6nU.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-Dp2qGrHC.js → share-preview-page-B0H63tDv.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-Cy5zWyYQ.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-DaZNFro9.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-CnwtUzvw.js +2 -0
- package/dist/gateway/static/root/assets/system-settings-panel-DXs2VmBt.js +1 -0
- package/dist/gateway/static/root/assets/typed-models-lib-4gPuydz_.js +1 -0
- package/dist/gateway/static/root/assets/{use-channel-catalog-CHlO8J9G.js → use-channel-catalog-BCjP_VHb.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DvKiOglO.js +1 -0
- package/dist/gateway/static/root/assets/{voice-player-store-DDDWYHvg.js → voice-player-store-BlF9V05n.js} +1 -1
- package/dist/gateway/static/root/assets/workflows-page-CAVZcONQ.js +18 -0
- package/dist/gateway/static/root/index.html +5 -5
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +1 -1
- package/dist/src/agent/agent-manager.js +7 -8
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/agent-scope.js +6 -8
- package/dist/src/agent/agent-scope.js.map +1 -1
- package/dist/src/agent/background-review/coordinator.js +0 -1
- package/dist/src/agent/background-review/coordinator.js.map +1 -1
- package/dist/src/agent/background-review/run-background-review.d.ts +0 -2
- package/dist/src/agent/background-review/run-background-review.js +2 -4
- package/dist/src/agent/background-review/run-background-review.js.map +1 -1
- package/dist/src/agent/background-review/settings.js +8 -7
- package/dist/src/agent/background-review/settings.js.map +1 -1
- package/dist/src/agent/bootstrap/bootstrap-context.d.ts +2 -2
- package/dist/src/agent/bootstrap/bootstrap-context.js +4 -4
- package/dist/src/agent/bootstrap/bootstrap-context.js.map +1 -1
- package/dist/src/agent/context/workspace-seed.js +1 -1
- package/dist/src/agent/embedded/run-for-session.js +1 -1
- package/dist/src/agent/embedded/run-for-session.js.map +1 -1
- package/dist/src/agent/fallback/candidates.js +6 -3
- package/dist/src/agent/fallback/candidates.js.map +1 -1
- package/dist/src/agent/goals/checklist-judge.d.ts +1 -0
- package/dist/src/agent/goals/checklist-judge.js +1 -1
- package/dist/src/agent/goals/checklist-judge.js.map +1 -1
- package/dist/src/agent/goals/evaluate-turn.d.ts +1 -0
- package/dist/src/agent/goals/evaluate-turn.js +1 -0
- package/dist/src/agent/goals/evaluate-turn.js.map +1 -1
- package/dist/src/agent/goals/post-turn.js +8 -1
- package/dist/src/agent/goals/post-turn.js.map +1 -1
- package/dist/src/agent/image/generation/runtime-types.d.ts +2 -0
- package/dist/src/agent/image/generation/runtime.js +1 -1
- package/dist/src/agent/image/generation/runtime.js.map +1 -1
- package/dist/src/agent/image/image-helpers.d.ts +1 -1
- package/dist/src/agent/image/image-helpers.js +4 -17
- package/dist/src/agent/image/image-helpers.js.map +1 -1
- package/dist/src/agent/image/image-model-fallback.js +1 -1
- package/dist/src/agent/image/image-model-fallback.js.map +1 -1
- package/dist/src/agent/image/inbound-image-handling.js +1 -1
- package/dist/src/agent/image/inbound-image-handling.js.map +1 -1
- package/dist/src/agent/image/tool-model-config.d.ts +1 -1
- package/dist/src/agent/image/tool-model-config.js +2 -2
- package/dist/src/agent/image/tool-model-config.js.map +1 -1
- package/dist/src/agent/image/understanding/pi-ai-provider.js +5 -2
- package/dist/src/agent/image/understanding/pi-ai-provider.js.map +1 -1
- package/dist/src/agent/image/understanding/provider-registry.d.ts +1 -0
- package/dist/src/agent/image/understanding/provider-registry.js +16 -2
- package/dist/src/agent/image/understanding/provider-registry.js.map +1 -1
- package/dist/src/agent/mcp/resolve-embedded-mcp-tools.js +1 -1
- package/dist/src/agent/mcp/resolve-embedded-mcp-tools.js.map +1 -1
- package/dist/src/agent/media-generation/runtime-shared.d.ts +5 -2
- package/dist/src/agent/media-generation/runtime-shared.js +1 -1
- package/dist/src/agent/media-generation/runtime-shared.js.map +1 -1
- package/dist/src/agent/memory/builtin-memory-store.d.ts +2 -0
- package/dist/src/agent/memory/builtin-memory-store.js +4 -0
- package/dist/src/agent/memory/builtin-memory-store.js.map +1 -1
- package/dist/src/agent/memory/builtin-provider.d.ts +31 -9
- package/dist/src/agent/memory/builtin-provider.js +261 -11
- package/dist/src/agent/memory/builtin-provider.js.map +1 -1
- package/dist/src/agent/memory/context-assembler.d.ts +10 -0
- package/dist/src/agent/memory/context-assembler.js +26 -0
- package/dist/src/agent/memory/context-assembler.js.map +1 -0
- package/dist/src/agent/memory/create-memory-manager.js +25 -7
- package/dist/src/agent/memory/create-memory-manager.js.map +1 -1
- package/dist/src/agent/memory/dreaming/config.d.ts +1 -6
- package/dist/src/agent/memory/dreaming/config.js +8 -8
- package/dist/src/agent/memory/dreaming/config.js.map +1 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.d.ts +2 -0
- package/dist/src/agent/memory/dreaming/deep-promotion.js +24 -0
- package/dist/src/agent/memory/dreaming/deep-promotion.js.map +1 -1
- package/dist/src/agent/memory/index.d.ts +1 -0
- package/dist/src/agent/memory/index.js +4 -3
- package/dist/src/agent/memory/inject-prefetch.js +6 -2
- package/dist/src/agent/memory/inject-prefetch.js.map +1 -1
- package/dist/src/agent/memory/manager.d.ts +37 -1
- package/dist/src/agent/memory/manager.js +332 -40
- package/dist/src/agent/memory/manager.js.map +1 -1
- package/dist/src/agent/memory/memory-config.js +12 -15
- package/dist/src/agent/memory/memory-config.js.map +1 -1
- package/dist/src/agent/memory/plugin-discovery.d.ts +19 -5
- package/dist/src/agent/memory/plugin-discovery.js +97 -31
- package/dist/src/agent/memory/plugin-discovery.js.map +1 -1
- package/dist/src/agent/memory/provider.d.ts +20 -15
- package/dist/src/agent/memory/stub-memory-provider.d.ts +17 -2
- package/dist/src/agent/memory/stub-memory-provider.js +20 -3
- package/dist/src/agent/memory/stub-memory-provider.js.map +1 -1
- package/dist/src/agent/memory/types.d.ts +136 -0
- package/dist/src/agent/models/manager.d.ts +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/models/manager.js.map +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.d.ts +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js +2 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +2 -2
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.d.ts +2 -6
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js +2 -8
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js.map +1 -1
- package/dist/src/agent/reply/post-compaction-context.js +11 -6
- package/dist/src/agent/reply/post-compaction-context.js.map +1 -1
- package/dist/src/agent/reply/startup-context.js +8 -9
- package/dist/src/agent/reply/startup-context.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.js +1 -4
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service/session-context-report.js +1 -1
- package/dist/src/agent/service/session-context-report.js.map +1 -1
- package/dist/src/agent/service.js +21 -25
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/service.types.d.ts +1 -2
- package/dist/src/agent/session/session-hydrator.js +1 -2
- package/dist/src/agent/session/session-hydrator.js.map +1 -1
- package/dist/src/agent/session/session-inspector.d.ts +1 -1
- package/dist/src/agent/session/session-inspector.js +9 -14
- package/dist/src/agent/session/session-inspector.js.map +1 -1
- package/dist/src/agent/skills/hub-pull.js +1 -1
- package/dist/src/agent/starter-agents.d.ts +1 -3
- package/dist/src/agent/starter-agents.js +13 -21
- package/dist/src/agent/starter-agents.js.map +1 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -2
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
- package/dist/src/agent/tools/composio-tool.d.ts +8 -0
- package/dist/src/agent/tools/composio-tool.js +46 -0
- package/dist/src/agent/tools/composio-tool.js.map +1 -0
- package/dist/src/agent/tools/curated-memory-tool.d.ts +2 -5
- package/dist/src/agent/tools/curated-memory-tool.js +20 -16
- package/dist/src/agent/tools/curated-memory-tool.js.map +1 -1
- package/dist/src/agent/tools/factory.d.ts +0 -4
- package/dist/src/agent/tools/factory.js +32 -66
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/image-generate-tool.d.ts +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +19 -14
- package/dist/src/agent/tools/image-generate-tool.js.map +1 -1
- package/dist/src/agent/tools/image-tool.js +1 -3
- package/dist/src/agent/tools/image-tool.js.map +1 -1
- package/dist/src/agent/tools/index.d.ts +1 -0
- package/dist/src/agent/tools/index.js +2 -1
- package/dist/src/agent/tools/memory-tool.d.ts +2 -2
- package/dist/src/agent/tools/memory-tool.js +39 -14
- package/dist/src/agent/tools/memory-tool.js.map +1 -1
- package/dist/src/agent/tools/session-search-tool.js +1 -3
- package/dist/src/agent/tools/session-search-tool.js.map +1 -1
- package/dist/src/agent/tools/web-extract.js +6 -5
- package/dist/src/agent/tools/web-extract.js.map +1 -1
- package/dist/src/agent/workflow/builtins/audit-repo.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/audit-repo.js +15 -2
- package/dist/src/agent/workflow/builtins/audit-repo.js.map +1 -1
- package/dist/src/agent/workflow/builtins/client-proposal.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/client-proposal.js +10 -1
- package/dist/src/agent/workflow/builtins/client-proposal.js.map +1 -1
- package/dist/src/agent/workflow/builtins/competitor-scan.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/competitor-scan.js +16 -2
- package/dist/src/agent/workflow/builtins/competitor-scan.js.map +1 -1
- package/dist/src/agent/workflow/builtins/content-draft.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/content-draft.js +15 -2
- package/dist/src/agent/workflow/builtins/content-draft.js.map +1 -1
- package/dist/src/agent/workflow/builtins/content-repurpose.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/content-repurpose.js +10 -1
- package/dist/src/agent/workflow/builtins/content-repurpose.js.map +1 -1
- package/dist/src/agent/workflow/builtins/debug-incident.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/debug-incident.js +9 -1
- package/dist/src/agent/workflow/builtins/debug-incident.js.map +1 -1
- package/dist/src/agent/workflow/builtins/decision-compare.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/decision-compare.js +16 -2
- package/dist/src/agent/workflow/builtins/decision-compare.js.map +1 -1
- package/dist/src/agent/workflow/builtins/implementation-plan.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/implementation-plan.js +11 -1
- package/dist/src/agent/workflow/builtins/implementation-plan.js.map +1 -1
- package/dist/src/agent/workflow/builtins/inbox-triage.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/inbox-triage.js +11 -1
- package/dist/src/agent/workflow/builtins/inbox-triage.js.map +1 -1
- package/dist/src/agent/workflow/builtins/meeting-prep.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/meeting-prep.js +9 -1
- package/dist/src/agent/workflow/builtins/meeting-prep.js.map +1 -1
- package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/multi-perspective-review.js +9 -1
- package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +1 -1
- package/dist/src/agent/workflow/builtins/offer-design.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/offer-design.js +10 -1
- package/dist/src/agent/workflow/builtins/offer-design.js.map +1 -1
- package/dist/src/agent/workflow/builtins/pr-review.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/pr-review.js +9 -1
- package/dist/src/agent/workflow/builtins/pr-review.js.map +1 -1
- package/dist/src/agent/workflow/builtins/release-check.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/release-check.js +10 -1
- package/dist/src/agent/workflow/builtins/release-check.js.map +1 -1
- package/dist/src/agent/workflow/builtins/research.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/research.js +16 -2
- package/dist/src/agent/workflow/builtins/research.js.map +1 -1
- package/dist/src/agent/workflow/builtins/weekly-review.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/weekly-review.js +9 -1
- package/dist/src/agent/workflow/builtins/weekly-review.js.map +1 -1
- package/dist/src/agent/workflow/subagent-runner.js +1 -3
- package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
- package/dist/src/agent-manifest/index.d.ts +4 -0
- package/dist/src/agent-manifest/index.js +10 -0
- package/dist/src/agent-manifest/index.js.map +1 -0
- package/dist/src/agent-manifest/prompt.d.ts +2 -0
- package/dist/src/agent-manifest/prompt.js +57 -0
- package/dist/src/agent-manifest/prompt.js.map +1 -0
- package/dist/src/agent-manifest/resolver.d.ts +11 -0
- package/dist/src/agent-manifest/resolver.js +93 -0
- package/dist/src/agent-manifest/resolver.js.map +1 -0
- package/dist/src/agent-manifest/schema.d.ts +778 -0
- package/dist/src/agent-manifest/schema.js +267 -0
- package/dist/src/agent-manifest/schema.js.map +1 -0
- package/dist/src/agent-manifest/validator.d.ts +24 -0
- package/dist/src/agent-manifest/validator.js +87 -0
- package/dist/src/agent-manifest/validator.js.map +1 -0
- package/dist/src/agent-runtime/boundary-guard.d.ts +12 -0
- package/dist/src/agent-runtime/boundary-guard.js +23 -0
- package/dist/src/agent-runtime/boundary-guard.js.map +1 -0
- package/dist/src/agent-runtime/index.d.ts +7 -0
- package/dist/src/agent-runtime/index.js +8 -0
- package/dist/src/agent-runtime/memory-runtime.d.ts +21 -0
- package/dist/src/agent-runtime/memory-runtime.js +50 -0
- package/dist/src/agent-runtime/memory-runtime.js.map +1 -0
- package/dist/src/agent-runtime/model-router.d.ts +11 -0
- package/dist/src/agent-runtime/model-router.js +16 -0
- package/dist/src/agent-runtime/model-router.js.map +1 -0
- package/dist/src/agent-runtime/run-trace.d.ts +27 -0
- package/dist/src/agent-runtime/run-trace.js +53 -0
- package/dist/src/agent-runtime/run-trace.js.map +1 -0
- package/dist/src/agent-runtime/runtime-profile.d.ts +24 -0
- package/dist/src/agent-runtime/runtime-profile.js +44 -0
- package/dist/src/agent-runtime/runtime-profile.js.map +1 -0
- package/dist/src/agent-runtime/tool-registry.d.ts +28 -0
- package/dist/src/agent-runtime/tool-registry.js +52 -0
- package/dist/src/agent-runtime/tool-registry.js.map +1 -0
- package/dist/src/agent-runtime/workflow-runtime.d.ts +31 -0
- package/dist/src/agent-runtime/workflow-runtime.js +34 -0
- package/dist/src/agent-runtime/workflow-runtime.js.map +1 -0
- package/dist/src/browser/actions/extension-registry-bridge.js +1 -1
- package/dist/src/browser/actions/extension-registry-bridge.js.map +1 -1
- package/dist/src/browser/actions/registry.js +5 -8
- package/dist/src/browser/actions/registry.js.map +1 -1
- package/dist/src/browser/backend-from-config.d.ts +1 -1
- package/dist/src/browser/backend-from-config.js +50 -71
- package/dist/src/browser/backend-from-config.js.map +1 -1
- package/dist/src/browser/browser-command-timeout.d.ts +0 -1
- package/dist/src/browser/browser-command-timeout.js +3 -7
- package/dist/src/browser/browser-command-timeout.js.map +1 -1
- package/dist/src/browser/providers/browser-ext-install.d.ts +2 -12
- package/dist/src/browser/providers/browser-ext-install.js +3 -8
- package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
- package/dist/src/browser/readiness.js +16 -16
- package/dist/src/browser/readiness.js.map +1 -1
- package/dist/src/browser/schemas.js +1 -1
- package/dist/src/browser/schemas.js.map +1 -1
- package/dist/src/chat-commands/builtins/config.js +4 -4
- package/dist/src/chat-commands/builtins/config.js.map +1 -1
- package/dist/src/chat-commands/builtins/thinking.js +16 -42
- package/dist/src/chat-commands/builtins/thinking.js.map +1 -1
- package/dist/src/chat-commands/config-paths.js +1 -1
- package/dist/src/chat-commands/config-paths.js.map +1 -1
- package/dist/src/chat-commands/context.js +3 -4
- package/dist/src/chat-commands/context.js.map +1 -1
- package/dist/src/cli/command-manifest.js +1 -1
- package/dist/src/cli/command-manifest.js.map +1 -1
- package/dist/src/cli/commands/agent.js +3 -1
- package/dist/src/cli/commands/agent.js.map +1 -1
- package/dist/src/cli/commands/agents.js +3 -6
- package/dist/src/cli/commands/agents.js.map +1 -1
- package/dist/src/cli/commands/browser-cli-helpers.js +9 -11
- package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
- package/dist/src/cli/commands/config.js +5 -5
- package/dist/src/cli/commands/config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -17
- package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
- package/dist/src/cli/commands/goal.js +1 -1
- package/dist/src/cli/commands/image.js +13 -372
- package/dist/src/cli/commands/image.js.map +1 -1
- package/dist/src/cli/commands/models.js +26 -10
- package/dist/src/cli/commands/models.js.map +1 -1
- package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
- package/dist/src/cli/commands/onboard/model.js +20 -22
- package/dist/src/cli/commands/onboard/model.js.map +1 -1
- package/dist/src/cli/commands/onboard.js +1 -1
- package/dist/src/cli/commands/onboard.js.map +1 -1
- package/dist/src/cli/utils/init-workspace-core.d.ts +1 -4
- package/dist/src/cli/utils/init-workspace-core.js +7 -6
- package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
- package/dist/src/commands/agents.config.d.ts +0 -1
- package/dist/src/commands/agents.config.js +66 -12
- package/dist/src/commands/agents.config.js.map +1 -1
- package/dist/src/config/agent-profile.d.ts +5 -17
- package/dist/src/config/agent-profile.js +31 -64
- package/dist/src/config/agent-profile.js.map +1 -1
- package/dist/src/config/agent-typed-models.d.ts +1 -1
- package/dist/src/config/agent-typed-models.js +0 -1
- package/dist/src/config/agent-typed-models.js.map +1 -1
- package/dist/src/config/index.js +3 -3
- package/dist/src/config/integration.d.ts +1 -1
- package/dist/src/config/reload.js +1 -1
- package/dist/src/config/reload.js.map +1 -1
- package/dist/src/config/rules.js +6 -56
- package/dist/src/config/rules.js.map +1 -1
- package/dist/src/config/schema.d.ts +925 -781
- package/dist/src/config/schema.js +157 -424
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/connectors/composio-triggers.d.ts +10 -0
- package/dist/src/connectors/composio-triggers.js +32 -0
- package/dist/src/connectors/composio-triggers.js.map +1 -0
- package/dist/src/connectors/composio.d.ts +54 -0
- package/dist/src/connectors/composio.js +334 -0
- package/dist/src/connectors/composio.js.map +1 -0
- package/dist/src/connectors/health.js +16 -1
- package/dist/src/connectors/health.js.map +1 -1
- package/dist/src/connectors/install.d.ts +2 -1
- package/dist/src/connectors/install.js +50 -13
- package/dist/src/connectors/install.js.map +1 -1
- package/dist/src/connectors/instances.js +57 -6
- package/dist/src/connectors/instances.js.map +1 -1
- package/dist/src/connectors/lifecycle.d.ts +3 -0
- package/dist/src/connectors/lifecycle.js +23 -0
- package/dist/src/connectors/lifecycle.js.map +1 -0
- package/dist/src/connectors/materialize.js +2 -1
- package/dist/src/connectors/materialize.js.map +1 -1
- package/dist/src/connectors/providers.d.ts +1 -0
- package/dist/src/connectors/providers.js +10 -2
- package/dist/src/connectors/providers.js.map +1 -1
- package/dist/src/connectors/registries/modelscope.d.ts +2 -0
- package/dist/src/connectors/registries/modelscope.js +205 -0
- package/dist/src/connectors/registries/modelscope.js.map +1 -0
- package/dist/src/connectors/registries/official-mcp.d.ts +2 -0
- package/dist/src/connectors/registries/official-mcp.js +142 -0
- package/dist/src/connectors/registries/official-mcp.js.map +1 -0
- package/dist/src/connectors/registries/search.d.ts +12 -0
- package/dist/src/connectors/registries/search.js +89 -0
- package/dist/src/connectors/registries/search.js.map +1 -0
- package/dist/src/connectors/registries/smithery.d.ts +2 -0
- package/dist/src/connectors/registries/smithery.js +98 -0
- package/dist/src/connectors/registries/smithery.js.map +1 -0
- package/dist/src/connectors/registries/types.d.ts +20 -0
- package/dist/src/connectors/registries/types.js +1 -0
- package/dist/src/connectors/secret-store.js +4 -2
- package/dist/src/connectors/secret-store.js.map +1 -1
- package/dist/src/connectors/setup-secrets.d.ts +15 -0
- package/dist/src/connectors/setup-secrets.js +64 -0
- package/dist/src/connectors/setup-secrets.js.map +1 -0
- package/dist/src/connectors/supervisor.d.ts +15 -0
- package/dist/src/connectors/supervisor.js +73 -0
- package/dist/src/connectors/supervisor.js.map +1 -0
- package/dist/src/connectors/types.d.ts +27 -3
- package/dist/src/connectors/usage.js +6 -1
- package/dist/src/connectors/usage.js.map +1 -1
- package/dist/src/cron/index.js +1 -1
- package/dist/src/cron/service.js +1 -1
- package/dist/src/cron/validation.d.ts +3 -3
- package/dist/src/extensions/activation-context.js +13 -7
- package/dist/src/extensions/activation-context.js.map +1 -1
- package/dist/src/gateway/agents-admin.d.ts +17 -18
- package/dist/src/gateway/agents-admin.js +123 -88
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/capability-presets-admin.d.ts +56 -0
- package/dist/src/gateway/capability-presets-admin.js +214 -0
- package/dist/src/gateway/capability-presets-admin.js.map +1 -0
- package/dist/src/gateway/hono/lib/agent-model.d.ts +1 -1
- package/dist/src/gateway/hono/lib/agent-model.js +1 -1
- package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +234 -127
- package/dist/src/gateway/hono/lib/config-payload.js +13 -37
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/routes/agents.js +56 -33
- package/dist/src/gateway/hono/routes/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/browser.js +8 -15
- package/dist/src/gateway/hono/routes/browser.js.map +1 -1
- package/dist/src/gateway/hono/routes/capability-presets.d.ts +3 -0
- package/dist/src/gateway/hono/routes/capability-presets.js +145 -0
- package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -0
- package/dist/src/gateway/hono/routes/config-patch/agents.d.ts +1 -17
- package/dist/src/gateway/hono/routes/config-patch/agents.js +2 -443
- package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +7 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
- package/dist/src/gateway/hono/routes/config.js +1 -1
- package/dist/src/gateway/hono/routes/config.js.map +1 -1
- package/dist/src/gateway/hono/routes/connectors.js +230 -3
- package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +7 -0
- package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
- package/dist/src/gateway/hono/routes/goals.js +52 -5
- package/dist/src/gateway/hono/routes/goals.js.map +1 -1
- package/dist/src/gateway/hono/routes/index.js +2 -0
- package/dist/src/gateway/hono/routes/index.js.map +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/memory.d.ts +3 -0
- package/dist/src/gateway/hono/routes/memory.js +290 -0
- package/dist/src/gateway/hono/routes/memory.js.map +1 -0
- package/dist/src/gateway/hono/routes/voice.js +14 -1
- package/dist/src/gateway/hono/routes/voice.js.map +1 -1
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/service/agent-runner.d.ts +5 -12
- package/dist/src/gateway/service/agent-runner.js +8 -8
- package/dist/src/gateway/service/agent-runner.js.map +1 -1
- package/dist/src/gateway/service/run-gateway-agent.d.ts +2 -10
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
- package/dist/src/gateway/service.d.ts +2 -2
- package/dist/src/gateway/service.js +20 -16
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/gateway/user-turn-input.d.ts +18 -0
- package/dist/src/gateway/user-turn-input.js +16 -0
- package/dist/src/gateway/user-turn-input.js.map +1 -0
- package/dist/src/goals/goal-queue-store.d.ts +2 -1
- package/dist/src/goals/goal-queue-store.js +2 -2
- package/dist/src/goals/goal-queue-store.js.map +1 -1
- package/dist/src/goals/goal-queue-types.d.ts +4 -3
- package/dist/src/goals/goal-runner.js +25 -3
- package/dist/src/goals/goal-runner.js.map +1 -1
- package/dist/src/goals/goal-service.d.ts +6 -1
- package/dist/src/goals/goal-service.js +9 -2
- package/dist/src/goals/goal-service.js.map +1 -1
- package/dist/src/goals/goal-store.d.ts +7 -1
- package/dist/src/goals/goal-store.js +42 -0
- package/dist/src/goals/goal-store.js.map +1 -1
- package/dist/src/goals/types.d.ts +10 -0
- package/dist/src/notes/agent-context.js +2 -2
- package/dist/src/providers/index.d.ts +2 -2
- package/dist/src/providers/index.js +10 -14
- package/dist/src/providers/index.js.map +1 -1
- package/dist/src/session/index.js +1 -1
- package/dist/src/session/session-workspace.js +7 -2
- package/dist/src/session/session-workspace.js.map +1 -1
- package/dist/src/session/store.js +5 -0
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/thinking-resolve.d.ts +1 -1
- package/dist/src/session/thinking-resolve.js +1 -1
- package/dist/src/session/thinking-resolve.js.map +1 -1
- package/dist/src/storage/sqlite/connection.js +1 -1
- package/dist/src/storage/sqlite/index.d.ts +1 -0
- package/dist/src/storage/sqlite/index.js +2 -1
- package/dist/src/storage/sqlite/memory-records-repository.d.ts +101 -0
- package/dist/src/storage/sqlite/memory-records-repository.js +309 -0
- package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -0
- package/dist/src/storage/sqlite/migrations/011_goal_context_messages.sql +8 -0
- package/dist/src/storage/sqlite/migrations/012_memory_records.sql +63 -0
- package/dist/src/storage/sqlite/migrations/013_memory_trace_events.sql +21 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +2 -2
- package/dist/src/storage/sqlite/migrations/runner.js +4 -4
- package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +2 -2
- package/dist/src/storage/sqlite/schema.js +3 -3
- package/dist/src/storage/sqlite/schema.sql +95 -0
- package/dist/src/tui/backends/embedded-backend.js +6 -4
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
- package/dist/src/voice/tts/openai-compatible-speech.d.ts +1 -1
- package/dist/src/voice/tts/openai-compatible-speech.js.map +1 -1
- package/dist/src/voice/tts/providers/edge-speech.js +14 -2
- package/dist/src/voice/tts/providers/edge-speech.js.map +1 -1
- package/dist/src/voice/tts/speak-core.js +3 -3
- package/dist/src/voice/tts/speak-core.js.map +1 -1
- package/dist/src/voice/tts/speech-provider-types.d.ts +2 -2
- package/dist/src/voice/tts/types.js +1 -1
- package/dist/src/voice/tts/types.js.map +1 -1
- package/dist/src/workflows/domain/result.d.ts +0 -1
- package/dist/src/workflows/engine/workflow-engine.js +7 -23
- package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
- package/dist/src/workflows/service/workflow-run-service.js +3 -4
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +1 -1
- package/package.json +4 -3
- package/dist/gateway/static/root/assets/agent-browser-settings-page-DPXc4hz8.js +0 -6
- package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-CTJ0YnRQ.js +0 -1
- package/dist/gateway/static/root/assets/agents-zJXQfJ_W.js +0 -71
- package/dist/gateway/static/root/assets/app-management-settings-panel-DzGbdr04.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-CPjfyzSD.js +0 -1
- package/dist/gateway/static/root/assets/config-api-NOoPiIYz.js +0 -3
- package/dist/gateway/static/root/assets/connectors-settings-CAXYMOdp.js +0 -2
- package/dist/gateway/static/root/assets/cron-api-C9BOqAXd.js +0 -1
- package/dist/gateway/static/root/assets/cron-page-DuUbBeKI.js +0 -3
- package/dist/gateway/static/root/assets/dreaming-settings-DQ4DtiK1.js +0 -1
- package/dist/gateway/static/root/assets/gateway-config-api-C-xjn__h.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-BMPwIjKI.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-BJsyjJnF.js +0 -1
- package/dist/gateway/static/root/assets/goals-page-BerDgIhw.js +0 -2
- package/dist/gateway/static/root/assets/goals-settings-ByTjeAto.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-TbHgcjTn.js +0 -1
- package/dist/gateway/static/root/assets/index-AkTrf6Pb.js +0 -122
- package/dist/gateway/static/root/assets/index-fh5sXTj9.css +0 -1
- package/dist/gateway/static/root/assets/logs-page-DGXuPf5B.js +0 -2
- package/dist/gateway/static/root/assets/messages-upgxw6Ub.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-Bot16nn7.js +0 -2
- package/dist/gateway/static/root/assets/note-detail-page-Brlyou8M.js +0 -2
- package/dist/gateway/static/root/assets/notes-page-DvZ4pwc-.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-BZEDmxbZ.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-DdGGlsfn.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-DlkEkPf9.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-DFPTrsPF.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-CYCCfgh4.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-Bff1pGd0.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-CJGKpBur.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-C6ocduTD.js +0 -2
- package/dist/gateway/static/root/assets/system-settings-panel-5jrIEr5b.js +0 -1
- package/dist/gateway/static/root/assets/use-agent-defaults-form-BuiXLIs5.js +0 -1
- package/dist/gateway/static/root/assets/use-settings-tab-guard-CW5JORnl.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DDoQyghO.js +0 -1
- package/dist/gateway/static/root/assets/workflow-page.utils-CKjeEGqx.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-B604ehHG.js +0 -18
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
import { CredentialResolver, init_credentials } from "../auth/credentials.js";
|
|
2
|
+
import { consumeConnectorSetupSecretRef } from "./setup-secrets.js";
|
|
3
|
+
//#region src/connectors/composio.ts
|
|
4
|
+
init_credentials();
|
|
5
|
+
const COMPOSIO_TOOLKITS = [
|
|
6
|
+
[
|
|
7
|
+
"gmail",
|
|
8
|
+
"Gmail",
|
|
9
|
+
"Read and send Gmail messages through Composio."
|
|
10
|
+
],
|
|
11
|
+
[
|
|
12
|
+
"googlecalendar",
|
|
13
|
+
"Google Calendar",
|
|
14
|
+
"Read and manage Google Calendar events through Composio."
|
|
15
|
+
],
|
|
16
|
+
[
|
|
17
|
+
"googledrive",
|
|
18
|
+
"Google Drive",
|
|
19
|
+
"Search and manage Google Drive files through Composio."
|
|
20
|
+
],
|
|
21
|
+
[
|
|
22
|
+
"notion",
|
|
23
|
+
"Notion",
|
|
24
|
+
"Search and update Notion pages and databases through Composio."
|
|
25
|
+
],
|
|
26
|
+
[
|
|
27
|
+
"slack",
|
|
28
|
+
"Slack",
|
|
29
|
+
"Read and send Slack workspace messages through Composio."
|
|
30
|
+
],
|
|
31
|
+
[
|
|
32
|
+
"github",
|
|
33
|
+
"GitHub via Composio",
|
|
34
|
+
"Work with GitHub repositories, issues, and pull requests through Composio."
|
|
35
|
+
],
|
|
36
|
+
[
|
|
37
|
+
"linear",
|
|
38
|
+
"Linear via Composio",
|
|
39
|
+
"Manage Linear issues and projects through Composio."
|
|
40
|
+
]
|
|
41
|
+
];
|
|
42
|
+
const COMPOSIO_API_KEY_PROVIDER = "connector-composio-api-key";
|
|
43
|
+
const COMPOSIO_SCOPE_ORDER = {
|
|
44
|
+
read: 1,
|
|
45
|
+
write: 2,
|
|
46
|
+
admin: 3
|
|
47
|
+
};
|
|
48
|
+
const COMPOSIO_CURATED_ACTIONS = {
|
|
49
|
+
gmail: {
|
|
50
|
+
GMAIL_FETCH_EMAILS: "read",
|
|
51
|
+
GMAIL_GET_EMAIL: "read",
|
|
52
|
+
GMAIL_LIST_LABELS: "read",
|
|
53
|
+
GMAIL_SEND_EMAIL: "write",
|
|
54
|
+
GMAIL_CREATE_EMAIL_DRAFT: "write",
|
|
55
|
+
GMAIL_REPLY_TO_THREAD: "write",
|
|
56
|
+
GMAIL_TRASH_EMAIL: "admin"
|
|
57
|
+
},
|
|
58
|
+
googlecalendar: {
|
|
59
|
+
GOOGLECALENDAR_FIND_EVENT: "read",
|
|
60
|
+
GOOGLECALENDAR_LIST_EVENTS: "read",
|
|
61
|
+
GOOGLECALENDAR_CREATE_EVENT: "write",
|
|
62
|
+
GOOGLECALENDAR_UPDATE_EVENT: "write",
|
|
63
|
+
GOOGLECALENDAR_DELETE_EVENT: "admin"
|
|
64
|
+
},
|
|
65
|
+
googledrive: {
|
|
66
|
+
GOOGLEDRIVE_SEARCH_FILES: "read",
|
|
67
|
+
GOOGLEDRIVE_GET_FILE: "read",
|
|
68
|
+
GOOGLEDRIVE_CREATE_FILE: "write",
|
|
69
|
+
GOOGLEDRIVE_UPDATE_FILE: "write",
|
|
70
|
+
GOOGLEDRIVE_DELETE_FILE: "admin"
|
|
71
|
+
},
|
|
72
|
+
notion: {
|
|
73
|
+
NOTION_SEARCH: "read",
|
|
74
|
+
NOTION_FETCH_PAGE: "read",
|
|
75
|
+
NOTION_CREATE_PAGE: "write",
|
|
76
|
+
NOTION_UPDATE_PAGE: "write"
|
|
77
|
+
},
|
|
78
|
+
slack: {
|
|
79
|
+
SLACK_LIST_CHANNELS: "read",
|
|
80
|
+
SLACK_FETCH_CONVERSATION_HISTORY: "read",
|
|
81
|
+
SLACK_SENDS_A_MESSAGE_TO_A_SLACK_CHANNEL: "write",
|
|
82
|
+
SLACK_SEND_DIRECT_MESSAGE: "write"
|
|
83
|
+
},
|
|
84
|
+
github: {
|
|
85
|
+
GITHUB_GET_REPOSITORY: "read",
|
|
86
|
+
GITHUB_LIST_REPOSITORY_ISSUES: "read",
|
|
87
|
+
GITHUB_CREATE_AN_ISSUE: "write",
|
|
88
|
+
GITHUB_CREATE_PULL_REQUEST: "write"
|
|
89
|
+
},
|
|
90
|
+
linear: {
|
|
91
|
+
LINEAR_LIST_ISSUES: "read",
|
|
92
|
+
LINEAR_GET_ISSUE: "read",
|
|
93
|
+
LINEAR_CREATE_ISSUE: "write",
|
|
94
|
+
LINEAR_UPDATE_ISSUE: "write"
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
function composioBaseUrl() {
|
|
98
|
+
return process.env.XOPC_COMPOSIO_BASE_URL?.trim().replace(/\/+$/, "") || "https://backend.composio.dev/api/v3";
|
|
99
|
+
}
|
|
100
|
+
async function composioApiKey(resolver = new CredentialResolver()) {
|
|
101
|
+
const key = (await resolver.resolveApiKey(COMPOSIO_API_KEY_PROVIDER).catch(() => void 0))?.trim() || process.env.XOPC_COMPOSIO_API_KEY?.trim() || process.env.COMPOSIO_API_KEY?.trim();
|
|
102
|
+
if (!key) throw new Error("Composio API key is not configured. Set XOPC_COMPOSIO_API_KEY or connect the Composio API Key connector.");
|
|
103
|
+
return key;
|
|
104
|
+
}
|
|
105
|
+
async function composioFetch(path, init = {}, resolver = new CredentialResolver()) {
|
|
106
|
+
const apiKey = await composioApiKey(resolver);
|
|
107
|
+
const response = await fetch(`${composioBaseUrl()}${path}`, {
|
|
108
|
+
...init,
|
|
109
|
+
headers: {
|
|
110
|
+
Accept: "application/json",
|
|
111
|
+
"Content-Type": "application/json",
|
|
112
|
+
"x-api-key": apiKey,
|
|
113
|
+
Authorization: `Bearer ${apiKey}`,
|
|
114
|
+
...init.headers ?? {}
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
const data = await response.json().catch(async () => ({ error: await response.text().catch(() => response.statusText) }));
|
|
118
|
+
if (!response.ok) {
|
|
119
|
+
const record = data && typeof data === "object" && !Array.isArray(data) ? data : {};
|
|
120
|
+
throw new Error(String(record.error ?? record.message ?? response.statusText));
|
|
121
|
+
}
|
|
122
|
+
return data;
|
|
123
|
+
}
|
|
124
|
+
function arrayAt(payload, keys) {
|
|
125
|
+
if (Array.isArray(payload)) return payload;
|
|
126
|
+
if (!payload || typeof payload !== "object" || Array.isArray(payload)) return [];
|
|
127
|
+
const record = payload;
|
|
128
|
+
for (const key of keys) if (Array.isArray(record[key])) return record[key];
|
|
129
|
+
return [];
|
|
130
|
+
}
|
|
131
|
+
function readString(value) {
|
|
132
|
+
return typeof value === "string" && value.trim() ? value.trim() : void 0;
|
|
133
|
+
}
|
|
134
|
+
function normalizeToolkit(toolkit) {
|
|
135
|
+
return toolkit.trim().toLowerCase().replace(/[^a-z0-9_]+/g, "");
|
|
136
|
+
}
|
|
137
|
+
function toolkitFromComposioSlug(slug) {
|
|
138
|
+
const upper = slug.trim().toUpperCase();
|
|
139
|
+
if (!upper) return void 0;
|
|
140
|
+
if (upper.startsWith("GOOGLECALENDAR_")) return "googlecalendar";
|
|
141
|
+
if (upper.startsWith("GOOGLEDRIVE_")) return "googledrive";
|
|
142
|
+
return upper.split("_")[0]?.toLowerCase() || void 0;
|
|
143
|
+
}
|
|
144
|
+
function scopeForComposioAction(slug) {
|
|
145
|
+
const toolkit = toolkitFromComposioSlug(slug);
|
|
146
|
+
if (!toolkit) return {
|
|
147
|
+
scope: "write",
|
|
148
|
+
curated: false
|
|
149
|
+
};
|
|
150
|
+
const scope = COMPOSIO_CURATED_ACTIONS[toolkit]?.[slug.trim().toUpperCase()];
|
|
151
|
+
if (scope) return {
|
|
152
|
+
toolkit,
|
|
153
|
+
scope,
|
|
154
|
+
curated: true
|
|
155
|
+
};
|
|
156
|
+
return {
|
|
157
|
+
toolkit,
|
|
158
|
+
scope: "write",
|
|
159
|
+
curated: false
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
function getComposioToolkitScope(config, toolkit) {
|
|
163
|
+
const record = config?.connectors?.instances?.[`composio-${normalizeToolkit(toolkit)}`];
|
|
164
|
+
const raw = record && typeof record === "object" && !Array.isArray(record) ? record.scope : void 0;
|
|
165
|
+
return raw === "admin" || raw === "write" || raw === "read" ? raw : "read";
|
|
166
|
+
}
|
|
167
|
+
function setComposioToolkitScope(config, toolkit, scope) {
|
|
168
|
+
const instanceId = `composio-${normalizeToolkit(toolkit)}`;
|
|
169
|
+
const record = config.connectors?.instances?.[instanceId];
|
|
170
|
+
if (!record || typeof record !== "object" || Array.isArray(record)) throw new Error(`Composio connector is not installed: ${toolkit}`);
|
|
171
|
+
record.scope = scope;
|
|
172
|
+
}
|
|
173
|
+
function canUseComposioAction(config, slug) {
|
|
174
|
+
const action = scopeForComposioAction(slug);
|
|
175
|
+
if (!action.toolkit) return {
|
|
176
|
+
ok: false,
|
|
177
|
+
reason: `Unknown Composio toolkit for action: ${slug}`,
|
|
178
|
+
scope: action.scope
|
|
179
|
+
};
|
|
180
|
+
if (!config?.connectors?.instances?.[`composio-${action.toolkit}`]) return {
|
|
181
|
+
ok: false,
|
|
182
|
+
reason: `Composio connector is not installed: ${action.toolkit}`,
|
|
183
|
+
toolkit: action.toolkit,
|
|
184
|
+
scope: action.scope
|
|
185
|
+
};
|
|
186
|
+
const allowedScope = getComposioToolkitScope(config, action.toolkit);
|
|
187
|
+
if (COMPOSIO_SCOPE_ORDER[allowedScope] < COMPOSIO_SCOPE_ORDER[action.scope]) return {
|
|
188
|
+
ok: false,
|
|
189
|
+
reason: `Composio action ${slug} requires ${action.scope} scope; connector allows ${allowedScope}.`,
|
|
190
|
+
toolkit: action.toolkit,
|
|
191
|
+
scope: action.scope
|
|
192
|
+
};
|
|
193
|
+
if (!action.curated && allowedScope !== "admin") return {
|
|
194
|
+
ok: false,
|
|
195
|
+
reason: `Composio action ${slug} is not in the curated allowlist. Set connector scope to admin to allow uncurated actions.`,
|
|
196
|
+
toolkit: action.toolkit,
|
|
197
|
+
scope: action.scope
|
|
198
|
+
};
|
|
199
|
+
return {
|
|
200
|
+
ok: true,
|
|
201
|
+
toolkit: action.toolkit,
|
|
202
|
+
scope: action.scope
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
const COMPOSIO_CONNECTORS = [{
|
|
206
|
+
id: "composio-api-key",
|
|
207
|
+
version: "1.0.0",
|
|
208
|
+
displayName: "Composio API Key",
|
|
209
|
+
description: "Store a Composio API key for direct-mode toolkit connectors.",
|
|
210
|
+
category: "automation",
|
|
211
|
+
kind: "composio",
|
|
212
|
+
source: "builtin",
|
|
213
|
+
capabilities: [
|
|
214
|
+
"auth.apiKey",
|
|
215
|
+
"tools",
|
|
216
|
+
"events",
|
|
217
|
+
"workflows"
|
|
218
|
+
],
|
|
219
|
+
tags: [
|
|
220
|
+
"composio",
|
|
221
|
+
"oauth",
|
|
222
|
+
"integrations"
|
|
223
|
+
],
|
|
224
|
+
auth: { mode: "apiKey" },
|
|
225
|
+
setup: { secrets: [{
|
|
226
|
+
key: "COMPOSIO_API_KEY",
|
|
227
|
+
label: "Composio API key",
|
|
228
|
+
required: true
|
|
229
|
+
}] },
|
|
230
|
+
runtime: {
|
|
231
|
+
type: "composio",
|
|
232
|
+
toolkit: "composio"
|
|
233
|
+
}
|
|
234
|
+
}, ...COMPOSIO_TOOLKITS.map(([toolkit, displayName, description]) => ({
|
|
235
|
+
id: `composio-${toolkit}`,
|
|
236
|
+
version: "1.0.0",
|
|
237
|
+
displayName,
|
|
238
|
+
description,
|
|
239
|
+
category: "automation",
|
|
240
|
+
kind: "composio",
|
|
241
|
+
source: "builtin",
|
|
242
|
+
capabilities: [
|
|
243
|
+
"tools",
|
|
244
|
+
"auth.oauth",
|
|
245
|
+
"events",
|
|
246
|
+
"workflows"
|
|
247
|
+
],
|
|
248
|
+
tags: ["composio", toolkit],
|
|
249
|
+
auth: { mode: "none" },
|
|
250
|
+
setup: {},
|
|
251
|
+
runtime: {
|
|
252
|
+
type: "composio",
|
|
253
|
+
toolkit
|
|
254
|
+
}
|
|
255
|
+
}))];
|
|
256
|
+
async function saveComposioApiKey(input, resolver = new CredentialResolver()) {
|
|
257
|
+
const raw = input.secrets?.COMPOSIO_API_KEY;
|
|
258
|
+
const resolved = typeof raw === "string" && raw.trim().startsWith("secret://") ? consumeConnectorSetupSecretRef(raw) : raw;
|
|
259
|
+
if (typeof resolved === "string" && resolved.trim()) await resolver.saveApiKey(COMPOSIO_API_KEY_PROVIDER, resolved.trim(), { profileName: "default" });
|
|
260
|
+
}
|
|
261
|
+
async function listComposioConnections(resolver = new CredentialResolver()) {
|
|
262
|
+
return arrayAt(await composioFetch("/connected_accounts", {}, resolver), [
|
|
263
|
+
"items",
|
|
264
|
+
"connected_accounts",
|
|
265
|
+
"connections",
|
|
266
|
+
"data"
|
|
267
|
+
]).flatMap((item) => {
|
|
268
|
+
if (!item || typeof item !== "object" || Array.isArray(item)) return [];
|
|
269
|
+
const row = item;
|
|
270
|
+
const toolkit = readString(row.toolkit_slug ?? row.toolkit ?? row.appName ?? row.app_name);
|
|
271
|
+
const id = readString(row.id ?? row.uuid ?? row.connectedAccountId ?? row.connected_account_id);
|
|
272
|
+
if (!toolkit || !id) return [];
|
|
273
|
+
return [{
|
|
274
|
+
id,
|
|
275
|
+
toolkit,
|
|
276
|
+
status: readString(row.status) ?? "unknown",
|
|
277
|
+
accountEmail: readString(row.accountEmail ?? row.account_email ?? row.email),
|
|
278
|
+
workspace: readString(row.workspace ?? row.teamName ?? row.team_name),
|
|
279
|
+
username: readString(row.username ?? row.name)
|
|
280
|
+
}];
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
async function startComposioAuthorize(toolkit, resolver = new CredentialResolver()) {
|
|
284
|
+
const payload = await composioFetch("/connected_accounts", {
|
|
285
|
+
method: "POST",
|
|
286
|
+
body: JSON.stringify({
|
|
287
|
+
toolkit_slug: toolkit,
|
|
288
|
+
toolkit,
|
|
289
|
+
auth_config: {}
|
|
290
|
+
})
|
|
291
|
+
}, resolver);
|
|
292
|
+
const record = payload && typeof payload === "object" && !Array.isArray(payload) ? payload : {};
|
|
293
|
+
const connectUrl = readString(record.redirect_url ?? record.redirectUrl ?? record.connect_url ?? record.connectUrl);
|
|
294
|
+
if (!connectUrl) throw new Error("Composio authorize did not return a connect URL.");
|
|
295
|
+
return {
|
|
296
|
+
toolkit,
|
|
297
|
+
connectUrl,
|
|
298
|
+
connectionId: readString(record.id ?? record.connectionId ?? record.connected_account_id)
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
async function listComposioTools(toolkit, config, resolver = new CredentialResolver()) {
|
|
302
|
+
return arrayAt(await composioFetch(`/tools?toolkit_slug=${encodeURIComponent(toolkit)}`, {}, resolver), [
|
|
303
|
+
"items",
|
|
304
|
+
"tools",
|
|
305
|
+
"data"
|
|
306
|
+
]).flatMap((item) => {
|
|
307
|
+
if (!item || typeof item !== "object" || Array.isArray(item)) return [];
|
|
308
|
+
const row = item;
|
|
309
|
+
const slug = readString(row.slug ?? row.name);
|
|
310
|
+
if (!slug) return [];
|
|
311
|
+
const action = scopeForComposioAction(slug);
|
|
312
|
+
if (!(config ? canUseComposioAction(config, slug).ok : true)) return [];
|
|
313
|
+
return [{
|
|
314
|
+
slug,
|
|
315
|
+
name: readString(row.name),
|
|
316
|
+
description: readString(row.description),
|
|
317
|
+
inputSchema: row.inputSchema ?? row.input_schema ?? row.parameters,
|
|
318
|
+
scope: action.scope,
|
|
319
|
+
curated: action.curated
|
|
320
|
+
}];
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
async function executeComposioTool(params, resolver = new CredentialResolver()) {
|
|
324
|
+
const allowed = canUseComposioAction(params.config, params.slug);
|
|
325
|
+
if (allowed.ok === false) throw new Error(allowed.reason);
|
|
326
|
+
return composioFetch(`/tools/${encodeURIComponent(params.slug)}/execute`, {
|
|
327
|
+
method: "POST",
|
|
328
|
+
body: JSON.stringify({ arguments: params.arguments ?? {} })
|
|
329
|
+
}, resolver);
|
|
330
|
+
}
|
|
331
|
+
//#endregion
|
|
332
|
+
export { COMPOSIO_CONNECTORS, canUseComposioAction, executeComposioTool, getComposioToolkitScope, listComposioConnections, listComposioTools, saveComposioApiKey, scopeForComposioAction, setComposioToolkitScope, startComposioAuthorize, toolkitFromComposioSlug };
|
|
333
|
+
|
|
334
|
+
//# sourceMappingURL=composio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composio.js","names":[],"sources":["../../../src/connectors/composio.ts"],"sourcesContent":["import { CredentialResolver } from '../auth/credentials.js';\nimport type { Config } from '../config/schema.js';\nimport { consumeConnectorSetupSecretRef } from './setup-secrets.js';\nimport type { ConnectorDefinition } from './types.js';\n\nexport type ComposioConnection = {\n id: string;\n toolkit: string;\n status: string;\n accountEmail?: string;\n workspace?: string;\n username?: string;\n};\n\nexport type ComposioScope = 'read' | 'write' | 'admin';\n\nexport type ComposioTool = {\n slug: string;\n name?: string;\n description?: string;\n inputSchema?: unknown;\n scope: ComposioScope;\n curated: boolean;\n};\n\nconst COMPOSIO_TOOLKITS = [\n ['gmail', 'Gmail', 'Read and send Gmail messages through Composio.'],\n ['googlecalendar', 'Google Calendar', 'Read and manage Google Calendar events through Composio.'],\n ['googledrive', 'Google Drive', 'Search and manage Google Drive files through Composio.'],\n ['notion', 'Notion', 'Search and update Notion pages and databases through Composio.'],\n ['slack', 'Slack', 'Read and send Slack workspace messages through Composio.'],\n ['github', 'GitHub via Composio', 'Work with GitHub repositories, issues, and pull requests through Composio.'],\n ['linear', 'Linear via Composio', 'Manage Linear issues and projects through Composio.'],\n] as const;\n\nconst COMPOSIO_API_KEY_PROVIDER = 'connector-composio-api-key';\nconst COMPOSIO_SCOPE_ORDER: Record<ComposioScope, number> = { read: 1, write: 2, admin: 3 };\n\nconst COMPOSIO_CURATED_ACTIONS: Record<string, Record<string, ComposioScope>> = {\n gmail: {\n GMAIL_FETCH_EMAILS: 'read',\n GMAIL_GET_EMAIL: 'read',\n GMAIL_LIST_LABELS: 'read',\n GMAIL_SEND_EMAIL: 'write',\n GMAIL_CREATE_EMAIL_DRAFT: 'write',\n GMAIL_REPLY_TO_THREAD: 'write',\n GMAIL_TRASH_EMAIL: 'admin',\n },\n googlecalendar: {\n GOOGLECALENDAR_FIND_EVENT: 'read',\n GOOGLECALENDAR_LIST_EVENTS: 'read',\n GOOGLECALENDAR_CREATE_EVENT: 'write',\n GOOGLECALENDAR_UPDATE_EVENT: 'write',\n GOOGLECALENDAR_DELETE_EVENT: 'admin',\n },\n googledrive: {\n GOOGLEDRIVE_SEARCH_FILES: 'read',\n GOOGLEDRIVE_GET_FILE: 'read',\n GOOGLEDRIVE_CREATE_FILE: 'write',\n GOOGLEDRIVE_UPDATE_FILE: 'write',\n GOOGLEDRIVE_DELETE_FILE: 'admin',\n },\n notion: {\n NOTION_SEARCH: 'read',\n NOTION_FETCH_PAGE: 'read',\n NOTION_CREATE_PAGE: 'write',\n NOTION_UPDATE_PAGE: 'write',\n },\n slack: {\n SLACK_LIST_CHANNELS: 'read',\n SLACK_FETCH_CONVERSATION_HISTORY: 'read',\n SLACK_SENDS_A_MESSAGE_TO_A_SLACK_CHANNEL: 'write',\n SLACK_SEND_DIRECT_MESSAGE: 'write',\n },\n github: {\n GITHUB_GET_REPOSITORY: 'read',\n GITHUB_LIST_REPOSITORY_ISSUES: 'read',\n GITHUB_CREATE_AN_ISSUE: 'write',\n GITHUB_CREATE_PULL_REQUEST: 'write',\n },\n linear: {\n LINEAR_LIST_ISSUES: 'read',\n LINEAR_GET_ISSUE: 'read',\n LINEAR_CREATE_ISSUE: 'write',\n LINEAR_UPDATE_ISSUE: 'write',\n },\n};\n\nfunction composioBaseUrl(): string {\n return process.env.XOPC_COMPOSIO_BASE_URL?.trim().replace(/\\/+$/, '') || 'https://backend.composio.dev/api/v3';\n}\n\nasync function composioApiKey(resolver = new CredentialResolver()): Promise<string> {\n const stored = await resolver.resolveApiKey(COMPOSIO_API_KEY_PROVIDER).catch(() => undefined);\n const key = stored?.trim() || process.env.XOPC_COMPOSIO_API_KEY?.trim() || process.env.COMPOSIO_API_KEY?.trim();\n if (!key) {\n throw new Error('Composio API key is not configured. Set XOPC_COMPOSIO_API_KEY or connect the Composio API Key connector.');\n }\n return key;\n}\n\nasync function composioFetch(path: string, init: RequestInit = {}, resolver = new CredentialResolver()): Promise<unknown> {\n const apiKey = await composioApiKey(resolver);\n const response = await fetch(`${composioBaseUrl()}${path}`, {\n ...init,\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n Authorization: `Bearer ${apiKey}`,\n ...(init.headers ?? {}),\n },\n });\n const data = await response.json().catch(async () => ({ error: await response.text().catch(() => response.statusText) }));\n if (!response.ok) {\n const record = data && typeof data === 'object' && !Array.isArray(data) ? data as Record<string, unknown> : {};\n throw new Error(String(record.error ?? record.message ?? response.statusText));\n }\n return data;\n}\n\nfunction arrayAt(payload: unknown, keys: string[]): unknown[] {\n if (Array.isArray(payload)) return payload;\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) return [];\n const record = payload as Record<string, unknown>;\n for (const key of keys) {\n if (Array.isArray(record[key])) return record[key] as unknown[];\n }\n return [];\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction normalizeToolkit(toolkit: string): string {\n return toolkit.trim().toLowerCase().replace(/[^a-z0-9_]+/g, '');\n}\n\nexport function toolkitFromComposioSlug(slug: string): string | undefined {\n const upper = slug.trim().toUpperCase();\n if (!upper) return undefined;\n if (upper.startsWith('GOOGLECALENDAR_')) return 'googlecalendar';\n if (upper.startsWith('GOOGLEDRIVE_')) return 'googledrive';\n const prefix = upper.split('_')[0]?.toLowerCase();\n return prefix || undefined;\n}\n\nexport function scopeForComposioAction(slug: string): { toolkit?: string; scope: ComposioScope; curated: boolean } {\n const toolkit = toolkitFromComposioSlug(slug);\n if (!toolkit) return { scope: 'write', curated: false };\n const scope = COMPOSIO_CURATED_ACTIONS[toolkit]?.[slug.trim().toUpperCase()];\n if (scope) return { toolkit, scope, curated: true };\n return { toolkit, scope: 'write', curated: false };\n}\n\nexport function getComposioToolkitScope(config: Config | undefined, toolkit: string): ComposioScope {\n const record = config?.connectors?.instances?.[`composio-${normalizeToolkit(toolkit)}`];\n const raw = record && typeof record === 'object' && !Array.isArray(record)\n ? (record as Record<string, unknown>).scope\n : undefined;\n return raw === 'admin' || raw === 'write' || raw === 'read' ? raw : 'read';\n}\n\nexport function setComposioToolkitScope(config: Config, toolkit: string, scope: ComposioScope): void {\n const instanceId = `composio-${normalizeToolkit(toolkit)}`;\n const record = config.connectors?.instances?.[instanceId];\n if (!record || typeof record !== 'object' || Array.isArray(record)) {\n throw new Error(`Composio connector is not installed: ${toolkit}`);\n }\n (record as Record<string, unknown>).scope = scope;\n}\n\nexport function canUseComposioAction(config: Config | undefined, slug: string): { ok: true; toolkit?: string; scope: ComposioScope } | { ok: false; reason: string; toolkit?: string; scope: ComposioScope } {\n const action = scopeForComposioAction(slug);\n if (!action.toolkit) return { ok: false, reason: `Unknown Composio toolkit for action: ${slug}`, scope: action.scope };\n const installed = config?.connectors?.instances?.[`composio-${action.toolkit}`];\n if (!installed) return { ok: false, reason: `Composio connector is not installed: ${action.toolkit}`, toolkit: action.toolkit, scope: action.scope };\n const allowedScope = getComposioToolkitScope(config, action.toolkit);\n if (COMPOSIO_SCOPE_ORDER[allowedScope] < COMPOSIO_SCOPE_ORDER[action.scope]) {\n return { ok: false, reason: `Composio action ${slug} requires ${action.scope} scope; connector allows ${allowedScope}.`, toolkit: action.toolkit, scope: action.scope };\n }\n if (!action.curated && allowedScope !== 'admin') {\n return { ok: false, reason: `Composio action ${slug} is not in the curated allowlist. Set connector scope to admin to allow uncurated actions.`, toolkit: action.toolkit, scope: action.scope };\n }\n return { ok: true, toolkit: action.toolkit, scope: action.scope };\n}\n\nexport const COMPOSIO_CONNECTORS: readonly ConnectorDefinition[] = [\n {\n id: 'composio-api-key',\n version: '1.0.0',\n displayName: 'Composio API Key',\n description: 'Store a Composio API key for direct-mode toolkit connectors.',\n category: 'automation',\n kind: 'composio',\n source: 'builtin',\n capabilities: ['auth.apiKey', 'tools', 'events', 'workflows'],\n tags: ['composio', 'oauth', 'integrations'],\n auth: { mode: 'apiKey' },\n setup: {\n secrets: [{ key: 'COMPOSIO_API_KEY', label: 'Composio API key', required: true }],\n },\n runtime: { type: 'composio', toolkit: 'composio' },\n },\n ...COMPOSIO_TOOLKITS.map(([toolkit, displayName, description]) => ({\n id: `composio-${toolkit}`,\n version: '1.0.0',\n displayName,\n description,\n category: 'automation' as const,\n kind: 'composio' as const,\n source: 'builtin' as const,\n capabilities: ['tools', 'auth.oauth', 'events', 'workflows'] as ConnectorDefinition['capabilities'],\n tags: ['composio', toolkit],\n auth: { mode: 'none' as const },\n setup: {},\n runtime: { type: 'composio' as const, toolkit },\n })),\n];\n\nexport async function saveComposioApiKey(input: { secrets?: Record<string, unknown> }, resolver = new CredentialResolver()): Promise<void> {\n const raw = input.secrets?.COMPOSIO_API_KEY;\n const resolved = typeof raw === 'string' && raw.trim().startsWith('secret://')\n ? consumeConnectorSetupSecretRef(raw)\n : raw;\n if (typeof resolved === 'string' && resolved.trim()) {\n await resolver.saveApiKey(COMPOSIO_API_KEY_PROVIDER, resolved.trim(), { profileName: 'default' });\n }\n}\n\nexport async function listComposioConnections(resolver = new CredentialResolver()): Promise<ComposioConnection[]> {\n const payload = await composioFetch('/connected_accounts', {}, resolver);\n return arrayAt(payload, ['items', 'connected_accounts', 'connections', 'data']).flatMap((item) => {\n if (!item || typeof item !== 'object' || Array.isArray(item)) return [];\n const row = item as Record<string, unknown>;\n const toolkit = readString(row.toolkit_slug ?? row.toolkit ?? row.appName ?? row.app_name);\n const id = readString(row.id ?? row.uuid ?? row.connectedAccountId ?? row.connected_account_id);\n if (!toolkit || !id) return [];\n return [{\n id,\n toolkit,\n status: readString(row.status) ?? 'unknown',\n accountEmail: readString(row.accountEmail ?? row.account_email ?? row.email),\n workspace: readString(row.workspace ?? row.teamName ?? row.team_name),\n username: readString(row.username ?? row.name),\n }];\n });\n}\n\nexport async function startComposioAuthorize(toolkit: string, resolver = new CredentialResolver()): Promise<{ toolkit: string; connectUrl: string; connectionId?: string }> {\n const payload = await composioFetch('/connected_accounts', {\n method: 'POST',\n body: JSON.stringify({ toolkit_slug: toolkit, toolkit, auth_config: {} }),\n }, resolver);\n const record = payload && typeof payload === 'object' && !Array.isArray(payload) ? payload as Record<string, unknown> : {};\n const connectUrl = readString(record.redirect_url ?? record.redirectUrl ?? record.connect_url ?? record.connectUrl);\n if (!connectUrl) {\n throw new Error('Composio authorize did not return a connect URL.');\n }\n return { toolkit, connectUrl, connectionId: readString(record.id ?? record.connectionId ?? record.connected_account_id) };\n}\n\nexport async function listComposioTools(toolkit: string, config?: Config, resolver = new CredentialResolver()): Promise<ComposioTool[]> {\n const path = `/tools?toolkit_slug=${encodeURIComponent(toolkit)}`;\n const payload = await composioFetch(path, {}, resolver);\n return arrayAt(payload, ['items', 'tools', 'data']).flatMap((item) => {\n if (!item || typeof item !== 'object' || Array.isArray(item)) return [];\n const row = item as Record<string, unknown>;\n const slug = readString(row.slug ?? row.name);\n if (!slug) return [];\n const action = scopeForComposioAction(slug);\n const allowed = config ? canUseComposioAction(config, slug).ok : true;\n if (!allowed) return [];\n return [{\n slug,\n name: readString(row.name),\n description: readString(row.description),\n inputSchema: row.inputSchema ?? row.input_schema ?? row.parameters,\n scope: action.scope,\n curated: action.curated,\n }];\n });\n}\n\nexport async function executeComposioTool(params: { slug: string; arguments?: unknown; config?: Config }, resolver = new CredentialResolver()): Promise<unknown> {\n const allowed = canUseComposioAction(params.config, params.slug);\n if (allowed.ok === false) {\n throw new Error(allowed.reason);\n }\n return composioFetch(`/tools/${encodeURIComponent(params.slug)}/execute`, {\n method: 'POST',\n body: JSON.stringify({ arguments: params.arguments ?? {} }),\n }, resolver);\n}\n"],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ function classifyConnectorHealthError(error) {
|
|
|
6
6
|
const message = error instanceof Error ? error.message : String(error);
|
|
7
7
|
if (/timed out|timeout/i.test(message)) return "timeout";
|
|
8
8
|
if (/ECONN|ENOTFOUND|network|fetch failed/i.test(message)) return "network_failed";
|
|
9
|
+
if (/401|unauthorized|forbidden|permission denied/i.test(message)) return "unauthorized";
|
|
9
10
|
if (/missing|required|credential|api key|token/i.test(message)) return "missing_secret";
|
|
10
11
|
if (/tools|listTools/i.test(message)) return "tools_list_failed";
|
|
11
12
|
if (/spawn|command|start|connect/i.test(message)) return "startup_failed";
|
|
@@ -15,9 +16,11 @@ function healthActionForStatus(status) {
|
|
|
15
16
|
if (status === "missing_secret") return "Reconnect the connector and provide the required secret.";
|
|
16
17
|
if (status === "timeout" || status === "network_failed") return "Check network access and retry the connector health check.";
|
|
17
18
|
if (status === "startup_failed") return "Verify the connector runtime dependency is installed and reachable.";
|
|
19
|
+
if (status === "unauthorized") return "Reconnect the connector or refresh its credentials.";
|
|
18
20
|
}
|
|
19
21
|
async function testConnectorInstance(config, serverId) {
|
|
20
|
-
|
|
22
|
+
const instance = getConnectorInstance(config, serverId);
|
|
23
|
+
if (!instance) return {
|
|
21
24
|
serverId,
|
|
22
25
|
ok: false,
|
|
23
26
|
status: "server_not_found",
|
|
@@ -29,6 +32,18 @@ async function testConnectorInstance(config, serverId) {
|
|
|
29
32
|
prompts: [],
|
|
30
33
|
error: `Connector instance not found: ${serverId}`
|
|
31
34
|
};
|
|
35
|
+
if (!instance.enabled) return {
|
|
36
|
+
serverId,
|
|
37
|
+
ok: false,
|
|
38
|
+
status: "disabled",
|
|
39
|
+
toolCount: 0,
|
|
40
|
+
resourceCount: 0,
|
|
41
|
+
promptCount: 0,
|
|
42
|
+
tools: [],
|
|
43
|
+
resources: [],
|
|
44
|
+
prompts: [],
|
|
45
|
+
action: "Enable the connector before running a health check."
|
|
46
|
+
};
|
|
32
47
|
const workspaceDir = getWorkspacePath(config) || "./workspace";
|
|
33
48
|
try {
|
|
34
49
|
const capabilities = await listBundleMcpServerCapabilitiesForGateway({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.js","names":[],"sources":["../../../src/connectors/health.ts"],"sourcesContent":["import { getWorkspacePath } from '../config/workspace-path-helpers.js';\nimport {\n listBundleMcpServerCapabilitiesForGateway,\n} from '../agent/mcp/bundle-mcp-materialize.js';\nimport type { Config } from '../config/schema.js';\nimport { getConnectorInstance } from './instances.js';\nimport type { ConnectorHealthResult, ConnectorHealthStatus } from './types.js';\n\nfunction classifyConnectorHealthError(error: unknown): ConnectorHealthStatus {\n const message = error instanceof Error ? error.message : String(error);\n if (/timed out|timeout/i.test(message)) {\n return 'timeout';\n }\n if (/ECONN|ENOTFOUND|network|fetch failed/i.test(message)) {\n return 'network_failed';\n }\n if (/missing|required|credential|api key|token/i.test(message)) {\n return 'missing_secret';\n }\n if (/tools|listTools/i.test(message)) {\n return 'tools_list_failed';\n }\n if (/spawn|command|start|connect/i.test(message)) {\n return 'startup_failed';\n }\n return 'unknown_error';\n}\n\nfunction healthActionForStatus(status: ConnectorHealthStatus): string | undefined {\n if (status === 'missing_secret') {\n return 'Reconnect the connector and provide the required secret.';\n }\n if (status === 'timeout' || status === 'network_failed') {\n return 'Check network access and retry the connector health check.';\n }\n if (status === 'startup_failed') {\n return 'Verify the connector runtime dependency is installed and reachable.';\n }\n return undefined;\n}\n\nexport async function testConnectorInstance(config: Config, serverId: string): Promise<ConnectorHealthResult> {\n const instance = getConnectorInstance(config, serverId);\n if (!instance) {\n return {\n serverId,\n ok: false,\n status: 'server_not_found',\n toolCount: 0,\n resourceCount: 0,\n promptCount: 0,\n tools: [],\n resources: [],\n prompts: [],\n error: `Connector instance not found: ${serverId}`,\n };\n }\n\n const workspaceDir = getWorkspacePath(config) || './workspace';\n try {\n const capabilities = await listBundleMcpServerCapabilitiesForGateway({\n workspaceDir,\n cfg: config,\n serverId,\n });\n return {\n serverId,\n ok: true,\n status: 'ok',\n toolCount: capabilities.toolCount,\n resourceCount: capabilities.resourceCount,\n promptCount: capabilities.promptCount,\n tools: capabilities.tools,\n resources: capabilities.resources,\n prompts: capabilities.prompts,\n };\n } catch (error) {\n const status = classifyConnectorHealthError(error);\n return {\n serverId,\n ok: false,\n status,\n toolCount: 0,\n resourceCount: 0,\n promptCount: 0,\n tools: [],\n resources: [],\n prompts: [],\n error: error instanceof Error ? error.message : String(error),\n action: healthActionForStatus(status),\n };\n }\n}\n"],"mappings":";;;;AAQA,SAAS,6BAA6B,OAAuC;CAC3E,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACtE,KAAI,qBAAqB,KAAK,QAAQ,CACpC,QAAO;AAET,KAAI,wCAAwC,KAAK,QAAQ,CACvD,QAAO;AAET,KAAI,6CAA6C,KAAK,QAAQ,CAC5D,QAAO;AAET,KAAI,mBAAmB,KAAK,QAAQ,CAClC,QAAO;AAET,KAAI,+BAA+B,KAAK,QAAQ,CAC9C,QAAO;AAET,QAAO;;AAGT,SAAS,sBAAsB,QAAmD;AAChF,KAAI,WAAW,iBACb,QAAO;AAET,KAAI,WAAW,aAAa,WAAW,iBACrC,QAAO;AAET,KAAI,WAAW,iBACb,QAAO;;AAKX,eAAsB,sBAAsB,QAAgB,UAAkD;
|
|
1
|
+
{"version":3,"file":"health.js","names":[],"sources":["../../../src/connectors/health.ts"],"sourcesContent":["import { getWorkspacePath } from '../config/workspace-path-helpers.js';\nimport {\n listBundleMcpServerCapabilitiesForGateway,\n} from '../agent/mcp/bundle-mcp-materialize.js';\nimport type { Config } from '../config/schema.js';\nimport { getConnectorInstance } from './instances.js';\nimport type { ConnectorHealthResult, ConnectorHealthStatus } from './types.js';\n\nfunction classifyConnectorHealthError(error: unknown): ConnectorHealthStatus {\n const message = error instanceof Error ? error.message : String(error);\n if (/timed out|timeout/i.test(message)) {\n return 'timeout';\n }\n if (/ECONN|ENOTFOUND|network|fetch failed/i.test(message)) {\n return 'network_failed';\n }\n if (/401|unauthorized|forbidden|permission denied/i.test(message)) {\n return 'unauthorized';\n }\n if (/missing|required|credential|api key|token/i.test(message)) {\n return 'missing_secret';\n }\n if (/tools|listTools/i.test(message)) {\n return 'tools_list_failed';\n }\n if (/spawn|command|start|connect/i.test(message)) {\n return 'startup_failed';\n }\n return 'unknown_error';\n}\n\nfunction healthActionForStatus(status: ConnectorHealthStatus): string | undefined {\n if (status === 'missing_secret') {\n return 'Reconnect the connector and provide the required secret.';\n }\n if (status === 'timeout' || status === 'network_failed') {\n return 'Check network access and retry the connector health check.';\n }\n if (status === 'startup_failed') {\n return 'Verify the connector runtime dependency is installed and reachable.';\n }\n if (status === 'unauthorized') {\n return 'Reconnect the connector or refresh its credentials.';\n }\n return undefined;\n}\n\nexport async function testConnectorInstance(config: Config, serverId: string): Promise<ConnectorHealthResult> {\n const instance = getConnectorInstance(config, serverId);\n if (!instance) {\n return {\n serverId,\n ok: false,\n status: 'server_not_found',\n toolCount: 0,\n resourceCount: 0,\n promptCount: 0,\n tools: [],\n resources: [],\n prompts: [],\n error: `Connector instance not found: ${serverId}`,\n };\n }\n\n if (!instance.enabled) {\n return {\n serverId,\n ok: false,\n status: 'disabled',\n toolCount: 0,\n resourceCount: 0,\n promptCount: 0,\n tools: [],\n resources: [],\n prompts: [],\n action: 'Enable the connector before running a health check.',\n };\n }\n\n const workspaceDir = getWorkspacePath(config) || './workspace';\n try {\n const capabilities = await listBundleMcpServerCapabilitiesForGateway({\n workspaceDir,\n cfg: config,\n serverId,\n });\n return {\n serverId,\n ok: true,\n status: 'ok',\n toolCount: capabilities.toolCount,\n resourceCount: capabilities.resourceCount,\n promptCount: capabilities.promptCount,\n tools: capabilities.tools,\n resources: capabilities.resources,\n prompts: capabilities.prompts,\n };\n } catch (error) {\n const status = classifyConnectorHealthError(error);\n return {\n serverId,\n ok: false,\n status,\n toolCount: 0,\n resourceCount: 0,\n promptCount: 0,\n tools: [],\n resources: [],\n prompts: [],\n error: error instanceof Error ? error.message : String(error),\n action: healthActionForStatus(status),\n };\n }\n}\n"],"mappings":";;;;AAQA,SAAS,6BAA6B,OAAuC;CAC3E,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACtE,KAAI,qBAAqB,KAAK,QAAQ,CACpC,QAAO;AAET,KAAI,wCAAwC,KAAK,QAAQ,CACvD,QAAO;AAET,KAAI,gDAAgD,KAAK,QAAQ,CAC/D,QAAO;AAET,KAAI,6CAA6C,KAAK,QAAQ,CAC5D,QAAO;AAET,KAAI,mBAAmB,KAAK,QAAQ,CAClC,QAAO;AAET,KAAI,+BAA+B,KAAK,QAAQ,CAC9C,QAAO;AAET,QAAO;;AAGT,SAAS,sBAAsB,QAAmD;AAChF,KAAI,WAAW,iBACb,QAAO;AAET,KAAI,WAAW,aAAa,WAAW,iBACrC,QAAO;AAET,KAAI,WAAW,iBACb,QAAO;AAET,KAAI,WAAW,eACb,QAAO;;AAKX,eAAsB,sBAAsB,QAAgB,UAAkD;CAC5G,MAAM,WAAW,qBAAqB,QAAQ,SAAS;AACvD,KAAI,CAAC,SACH,QAAO;EACL;EACA,IAAI;EACJ,QAAQ;EACR,WAAW;EACX,eAAe;EACf,aAAa;EACb,OAAO,EAAE;EACT,WAAW,EAAE;EACb,SAAS,EAAE;EACX,OAAO,iCAAiC;EACzC;AAGH,KAAI,CAAC,SAAS,QACZ,QAAO;EACL;EACA,IAAI;EACJ,QAAQ;EACR,WAAW;EACX,eAAe;EACf,aAAa;EACb,OAAO,EAAE;EACT,WAAW,EAAE;EACb,SAAS,EAAE;EACX,QAAQ;EACT;CAGH,MAAM,eAAe,iBAAiB,OAAO,IAAI;AACjD,KAAI;EACF,MAAM,eAAe,MAAM,0CAA0C;GACnE;GACA,KAAK;GACL;GACD,CAAC;AACF,SAAO;GACL;GACA,IAAI;GACJ,QAAQ;GACR,WAAW,aAAa;GACxB,eAAe,aAAa;GAC5B,aAAa,aAAa;GAC1B,OAAO,aAAa;GACpB,WAAW,aAAa;GACxB,SAAS,aAAa;GACvB;UACM,OAAO;EACd,MAAM,SAAS,6BAA6B,MAAM;AAClD,SAAO;GACL;GACA,IAAI;GACJ;GACA,WAAW;GACX,eAAe;GACf,aAAa;GACb,OAAO,EAAE;GACT,WAAW,EAAE;GACb,SAAS,EAAE;GACX,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;GAC7D,QAAQ,sBAAsB,OAAO;GACtC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { CredentialResolver } from '../auth/credentials.js';
|
|
2
2
|
import type { Config } from '../config/schema.js';
|
|
3
|
-
import type { ConnectorInstallInput, ConnectorInstance } from './types.js';
|
|
3
|
+
import type { ConnectorDefinition, ConnectorInstallInput, ConnectorInstance } from './types.js';
|
|
4
|
+
export declare function installConnectorDefinition(config: Config, definition: ConnectorDefinition, input: ConnectorInstallInput, resolver?: CredentialResolver): Promise<ConnectorInstance>;
|
|
4
5
|
export declare function installConnector(config: Config, connectorId: string, input: ConnectorInstallInput, resolver?: CredentialResolver): Promise<ConnectorInstance>;
|
|
5
6
|
export declare function uninstallConnector(config: Config, instanceId: string): ConnectorInstance;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { CredentialResolver, init_credentials } from "../auth/credentials.js";
|
|
2
|
+
import { saveComposioApiKey } from "./composio.js";
|
|
2
3
|
import { saveConnectorSecrets } from "./secret-store.js";
|
|
3
4
|
import { getConnectorDefinition } from "./catalog.js";
|
|
4
5
|
import { isManagedConnectorServer, materializeConnectorMcpServer } from "./materialize.js";
|
|
@@ -7,9 +8,29 @@ import { listConnectorInstances } from "./instances.js";
|
|
|
7
8
|
import { assertConnectorOAuthReady } from "./oauth.js";
|
|
8
9
|
//#region src/connectors/install.ts
|
|
9
10
|
init_credentials();
|
|
10
|
-
async function
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
async function installConnectorDefinition(config, definition, input, resolver = new CredentialResolver()) {
|
|
12
|
+
if (definition.runtime.type !== "mcp") {
|
|
13
|
+
const instanceId = definition.id;
|
|
14
|
+
if (definition.runtime.type === "composio" && definition.id === "composio-api-key") await saveComposioApiKey(input, resolver);
|
|
15
|
+
config.connectors = config.connectors ?? {};
|
|
16
|
+
config.connectors.instances = {
|
|
17
|
+
...config.connectors.instances ?? {},
|
|
18
|
+
[instanceId]: {
|
|
19
|
+
xopcConnector: {
|
|
20
|
+
managed: true,
|
|
21
|
+
connectorId: definition.id,
|
|
22
|
+
version: definition.version,
|
|
23
|
+
enabled: true,
|
|
24
|
+
displayName: definition.displayName
|
|
25
|
+
},
|
|
26
|
+
runtime: definition.runtime,
|
|
27
|
+
...definition.runtime.type === "composio" && definition.runtime.toolkit !== "composio" ? { scope: "read" } : {}
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
const instance = listConnectorInstances(config).find((candidate) => candidate.instanceId === instanceId);
|
|
31
|
+
if (!instance) throw new Error(`Connector "${definition.id}" was installed but could not be resolved.`);
|
|
32
|
+
return instance;
|
|
33
|
+
}
|
|
13
34
|
const { serverId, server } = materializeConnectorMcpServer(definition, input);
|
|
14
35
|
const existingServer = config.mcp?.servers?.[serverId];
|
|
15
36
|
if (existingServer && !isManagedConnectorServer(existingServer)) throw new Error(`MCP server "${serverId}" already exists and is not managed by Connectors.`);
|
|
@@ -21,26 +42,42 @@ async function installConnector(config, connectorId, input, resolver = new Crede
|
|
|
21
42
|
[serverId]: server
|
|
22
43
|
};
|
|
23
44
|
const instance = listConnectorInstances(config).find((candidate) => candidate.instanceId === serverId);
|
|
24
|
-
if (!instance) throw new Error(`Connector "${
|
|
45
|
+
if (!instance) throw new Error(`Connector "${definition.id}" was installed but could not be resolved.`);
|
|
25
46
|
appendConnectorAuditRecord(config, serverId, { action: "installed" });
|
|
26
47
|
return instance;
|
|
27
48
|
}
|
|
49
|
+
async function installConnector(config, connectorId, input, resolver = new CredentialResolver()) {
|
|
50
|
+
const definition = getConnectorDefinition(connectorId);
|
|
51
|
+
if (!definition) throw new Error(`Unknown connector: ${connectorId}`);
|
|
52
|
+
return installConnectorDefinition(config, definition, input, resolver);
|
|
53
|
+
}
|
|
28
54
|
function uninstallConnector(config, instanceId) {
|
|
29
55
|
const server = config.mcp?.servers?.[instanceId];
|
|
30
|
-
|
|
31
|
-
if (!
|
|
56
|
+
const connectorRecord = config.connectors?.instances?.[instanceId];
|
|
57
|
+
if (!server && !connectorRecord) throw new Error(`Connector instance not found: ${instanceId}`);
|
|
58
|
+
if (server && !isManagedConnectorServer(server)) throw new Error(`MCP server "${instanceId}" is not managed by Connectors.`);
|
|
32
59
|
const instance = listConnectorInstances(config).find((candidate) => candidate.instanceId === instanceId);
|
|
33
60
|
if (!instance) throw new Error(`Connector instance not found: ${instanceId}`);
|
|
34
61
|
appendConnectorAuditRecord(config, instanceId, { action: "removed" });
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
62
|
+
if (server) {
|
|
63
|
+
const nextServers = { ...config.mcp?.servers ?? {} };
|
|
64
|
+
delete nextServers[instanceId];
|
|
65
|
+
config.mcp = {
|
|
66
|
+
...config.mcp ?? {},
|
|
67
|
+
servers: nextServers
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
if (connectorRecord) {
|
|
71
|
+
const nextInstances = { ...config.connectors?.instances ?? {} };
|
|
72
|
+
delete nextInstances[instanceId];
|
|
73
|
+
config.connectors = {
|
|
74
|
+
...config.connectors ?? {},
|
|
75
|
+
instances: nextInstances
|
|
76
|
+
};
|
|
77
|
+
}
|
|
41
78
|
return instance;
|
|
42
79
|
}
|
|
43
80
|
//#endregion
|
|
44
|
-
export { installConnector, uninstallConnector };
|
|
81
|
+
export { installConnector, installConnectorDefinition, uninstallConnector };
|
|
45
82
|
|
|
46
83
|
//# sourceMappingURL=install.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","names":[],"sources":["../../../src/connectors/install.ts"],"sourcesContent":["import { CredentialResolver } from '../auth/credentials.js';\nimport type { Config } from '../config/schema.js';\nimport { getConnectorDefinition } from './catalog.js';\nimport { listConnectorInstances } from './instances.js';\nimport { isManagedConnectorServer, materializeConnectorMcpServer } from './materialize.js';\nimport { assertConnectorOAuthReady } from './oauth.js';\nimport { saveConnectorSecrets } from './secret-store.js';\nimport { appendConnectorAuditRecord } from './usage.js';\nimport type { ConnectorInstallInput, ConnectorInstance } from './types.js';\n\nexport async function
|
|
1
|
+
{"version":3,"file":"install.js","names":[],"sources":["../../../src/connectors/install.ts"],"sourcesContent":["import { CredentialResolver } from '../auth/credentials.js';\nimport type { Config } from '../config/schema.js';\nimport { getConnectorDefinition } from './catalog.js';\nimport { listConnectorInstances } from './instances.js';\nimport { isManagedConnectorServer, materializeConnectorMcpServer } from './materialize.js';\nimport { saveComposioApiKey } from './composio.js';\nimport { assertConnectorOAuthReady } from './oauth.js';\nimport { saveConnectorSecrets } from './secret-store.js';\nimport { appendConnectorAuditRecord } from './usage.js';\nimport type { ConnectorDefinition, ConnectorInstallInput, ConnectorInstance } from './types.js';\n\nexport async function installConnectorDefinition(\n config: Config,\n definition: ConnectorDefinition,\n input: ConnectorInstallInput,\n resolver = new CredentialResolver(),\n): Promise<ConnectorInstance> {\n if (definition.runtime.type !== 'mcp') {\n const instanceId = definition.id;\n if (definition.runtime.type === 'composio' && definition.id === 'composio-api-key') {\n await saveComposioApiKey(input, resolver);\n }\n config.connectors = config.connectors ?? {};\n config.connectors.instances = {\n ...(config.connectors.instances ?? {}),\n [instanceId]: {\n xopcConnector: {\n managed: true,\n connectorId: definition.id,\n version: definition.version,\n enabled: true,\n displayName: definition.displayName,\n },\n runtime: definition.runtime,\n ...(definition.runtime.type === 'composio' && definition.runtime.toolkit !== 'composio' ? { scope: 'read' } : {}),\n },\n };\n const instance = listConnectorInstances(config).find((candidate) => candidate.instanceId === instanceId);\n if (!instance) {\n throw new Error(`Connector \"${definition.id}\" was installed but could not be resolved.`);\n }\n return instance;\n }\n\n const { serverId, server } = materializeConnectorMcpServer(definition, input);\n const existingServer = config.mcp?.servers?.[serverId];\n if (existingServer && !isManagedConnectorServer(existingServer)) {\n throw new Error(`MCP server \"${serverId}\" already exists and is not managed by Connectors.`);\n }\n\n await assertConnectorOAuthReady(definition, resolver);\n await saveConnectorSecrets(definition, input, resolver);\n\n config.mcp = config.mcp ?? {};\n config.mcp.servers = {\n ...(config.mcp.servers ?? {}),\n [serverId]: server,\n };\n\n const instance = listConnectorInstances(config).find((candidate) => candidate.instanceId === serverId);\n if (!instance) {\n throw new Error(`Connector \"${definition.id}\" was installed but could not be resolved.`);\n }\n appendConnectorAuditRecord(config, serverId, { action: 'installed' });\n return instance;\n}\n\nexport async function installConnector(\n config: Config,\n connectorId: string,\n input: ConnectorInstallInput,\n resolver = new CredentialResolver(),\n): Promise<ConnectorInstance> {\n const definition = getConnectorDefinition(connectorId);\n if (!definition) {\n throw new Error(`Unknown connector: ${connectorId}`);\n }\n return installConnectorDefinition(config, definition, input, resolver);\n}\n\nexport function uninstallConnector(config: Config, instanceId: string): ConnectorInstance {\n const server = config.mcp?.servers?.[instanceId];\n const connectorRecord = config.connectors?.instances?.[instanceId];\n if (!server && !connectorRecord) {\n throw new Error(`Connector instance not found: ${instanceId}`);\n }\n if (server && !isManagedConnectorServer(server)) {\n throw new Error(`MCP server \"${instanceId}\" is not managed by Connectors.`);\n }\n\n const instance = listConnectorInstances(config).find((candidate) => candidate.instanceId === instanceId);\n if (!instance) {\n throw new Error(`Connector instance not found: ${instanceId}`);\n }\n appendConnectorAuditRecord(config, instanceId, { action: 'removed' });\n\n if (server) {\n const nextServers = { ...(config.mcp?.servers ?? {}) };\n delete nextServers[instanceId];\n config.mcp = {\n ...(config.mcp ?? {}),\n servers: nextServers,\n };\n }\n if (connectorRecord) {\n const nextInstances = { ...(config.connectors?.instances ?? {}) };\n delete nextInstances[instanceId];\n config.connectors = { ...(config.connectors ?? {}), instances: nextInstances };\n }\n return instance;\n}\n"],"mappings":";;;;;;;;;kBAA4D;AAW5D,eAAsB,2BACpB,QACA,YACA,OACA,WAAW,IAAI,oBAAoB,EACP;AAC5B,KAAI,WAAW,QAAQ,SAAS,OAAO;EACrC,MAAM,aAAa,WAAW;AAC9B,MAAI,WAAW,QAAQ,SAAS,cAAc,WAAW,OAAO,mBAC9D,OAAM,mBAAmB,OAAO,SAAS;AAE3C,SAAO,aAAa,OAAO,cAAc,EAAE;AAC3C,SAAO,WAAW,YAAY;GAC5B,GAAI,OAAO,WAAW,aAAa,EAAE;IACpC,aAAa;IACZ,eAAe;KACb,SAAS;KACT,aAAa,WAAW;KACxB,SAAS,WAAW;KACpB,SAAS;KACT,aAAa,WAAW;KACzB;IACD,SAAS,WAAW;IACpB,GAAI,WAAW,QAAQ,SAAS,cAAc,WAAW,QAAQ,YAAY,aAAa,EAAE,OAAO,QAAQ,GAAG,EAAE;IACjH;GACF;EACD,MAAM,WAAW,uBAAuB,OAAO,CAAC,MAAM,cAAc,UAAU,eAAe,WAAW;AACxG,MAAI,CAAC,SACH,OAAM,IAAI,MAAM,cAAc,WAAW,GAAG,4CAA4C;AAE1F,SAAO;;CAGT,MAAM,EAAE,UAAU,WAAW,8BAA8B,YAAY,MAAM;CAC7E,MAAM,iBAAiB,OAAO,KAAK,UAAU;AAC7C,KAAI,kBAAkB,CAAC,yBAAyB,eAAe,CAC7D,OAAM,IAAI,MAAM,eAAe,SAAS,oDAAoD;AAG9F,OAAM,0BAA0B,YAAY,SAAS;AACrD,OAAM,qBAAqB,YAAY,OAAO,SAAS;AAEvD,QAAO,MAAM,OAAO,OAAO,EAAE;AAC7B,QAAO,IAAI,UAAU;EACnB,GAAI,OAAO,IAAI,WAAW,EAAE;GAC3B,WAAW;EACb;CAED,MAAM,WAAW,uBAAuB,OAAO,CAAC,MAAM,cAAc,UAAU,eAAe,SAAS;AACtG,KAAI,CAAC,SACH,OAAM,IAAI,MAAM,cAAc,WAAW,GAAG,4CAA4C;AAE1F,4BAA2B,QAAQ,UAAU,EAAE,QAAQ,aAAa,CAAC;AACrE,QAAO;;AAGT,eAAsB,iBACpB,QACA,aACA,OACA,WAAW,IAAI,oBAAoB,EACP;CAC5B,MAAM,aAAa,uBAAuB,YAAY;AACtD,KAAI,CAAC,WACH,OAAM,IAAI,MAAM,sBAAsB,cAAc;AAEtD,QAAO,2BAA2B,QAAQ,YAAY,OAAO,SAAS;;AAGxE,SAAgB,mBAAmB,QAAgB,YAAuC;CACxF,MAAM,SAAS,OAAO,KAAK,UAAU;CACrC,MAAM,kBAAkB,OAAO,YAAY,YAAY;AACvD,KAAI,CAAC,UAAU,CAAC,gBACd,OAAM,IAAI,MAAM,iCAAiC,aAAa;AAEhE,KAAI,UAAU,CAAC,yBAAyB,OAAO,CAC7C,OAAM,IAAI,MAAM,eAAe,WAAW,iCAAiC;CAG7E,MAAM,WAAW,uBAAuB,OAAO,CAAC,MAAM,cAAc,UAAU,eAAe,WAAW;AACxG,KAAI,CAAC,SACH,OAAM,IAAI,MAAM,iCAAiC,aAAa;AAEhE,4BAA2B,QAAQ,YAAY,EAAE,QAAQ,WAAW,CAAC;AAErE,KAAI,QAAQ;EACV,MAAM,cAAc,EAAE,GAAI,OAAO,KAAK,WAAW,EAAE,EAAG;AACtD,SAAO,YAAY;AACnB,SAAO,MAAM;GACX,GAAI,OAAO,OAAO,EAAE;GACpB,SAAS;GACV;;AAEH,KAAI,iBAAiB;EACnB,MAAM,gBAAgB,EAAE,GAAI,OAAO,YAAY,aAAa,EAAE,EAAG;AACjE,SAAO,cAAc;AACrB,SAAO,aAAa;GAAE,GAAI,OAAO,cAAc,EAAE;GAAG,WAAW;GAAe;;AAEhF,QAAO"}
|
|
@@ -13,26 +13,77 @@ function secretStatusForServer(server) {
|
|
|
13
13
|
}
|
|
14
14
|
return status;
|
|
15
15
|
}
|
|
16
|
+
function connectorInstanceFromRecord(instanceId, record) {
|
|
17
|
+
const marker = record.xopcConnector;
|
|
18
|
+
if (!marker || typeof marker !== "object" || Array.isArray(marker)) return [];
|
|
19
|
+
const markerRecord = marker;
|
|
20
|
+
if (markerRecord.managed !== true || typeof markerRecord.connectorId !== "string") return [];
|
|
21
|
+
const connectorId = markerRecord.connectorId;
|
|
22
|
+
const definition = getConnectorDefinition(connectorId);
|
|
23
|
+
const runtime = record.runtime && typeof record.runtime === "object" && !Array.isArray(record.runtime) ? record.runtime : {};
|
|
24
|
+
const runtimeType = typeof runtime.type === "string" ? runtime.type : "composio";
|
|
25
|
+
const enabled = markerRecord.enabled !== false;
|
|
26
|
+
return [{
|
|
27
|
+
instanceId,
|
|
28
|
+
connectorId,
|
|
29
|
+
displayName: definition?.displayName ?? (typeof markerRecord.displayName === "string" ? markerRecord.displayName : connectorId),
|
|
30
|
+
enabled,
|
|
31
|
+
status: enabled ? "installed" : "disabled",
|
|
32
|
+
connectionStatus: enabled ? "unknown" : "disabled",
|
|
33
|
+
authStatus: definition?.auth.mode === "none" ? "none" : "unknown",
|
|
34
|
+
lastConnectedAt: typeof markerRecord.lastConnectedAt === "string" ? markerRecord.lastConnectedAt : void 0,
|
|
35
|
+
lastError: typeof markerRecord.lastError === "string" ? markerRecord.lastError : void 0,
|
|
36
|
+
secretStatus: {},
|
|
37
|
+
materialized: runtimeType === "composio" ? {
|
|
38
|
+
type: "composio",
|
|
39
|
+
id: instanceId
|
|
40
|
+
} : runtimeType === "channel" ? {
|
|
41
|
+
type: "channel",
|
|
42
|
+
id: instanceId
|
|
43
|
+
} : runtimeType === "nativeTool" ? {
|
|
44
|
+
type: "nativeTool",
|
|
45
|
+
id: instanceId
|
|
46
|
+
} : {
|
|
47
|
+
type: "memorySource",
|
|
48
|
+
id: instanceId
|
|
49
|
+
},
|
|
50
|
+
usage: getConnectorUsageFromMarker(marker),
|
|
51
|
+
audit: getConnectorAuditFromMarker(marker)
|
|
52
|
+
}];
|
|
53
|
+
}
|
|
16
54
|
function listConnectorInstances(config) {
|
|
17
55
|
const servers = config.mcp?.servers ?? {};
|
|
18
|
-
|
|
56
|
+
const mcpInstances = Object.entries(servers).flatMap(([serverId, server]) => {
|
|
19
57
|
if (!isManagedConnectorServer(server)) return [];
|
|
20
58
|
const connectorId = server.xopcConnector.connectorId;
|
|
59
|
+
const definition = getConnectorDefinition(connectorId);
|
|
60
|
+
const enabled = server.xopcConnector.enabled !== false;
|
|
61
|
+
const usage = getConnectorUsageFromMarker(server.xopcConnector);
|
|
62
|
+
const lastHealthStatus = usage.lastHealthStatus;
|
|
63
|
+
const connectionStatus = !enabled ? "disabled" : lastHealthStatus === "ok" ? "connected" : lastHealthStatus === "unauthorized" ? "unauthorized" : lastHealthStatus ? "error" : "unknown";
|
|
64
|
+
const authStatus = definition?.auth.mode === "none" ? "none" : lastHealthStatus === "missing_secret" ? "missing" : lastHealthStatus === "unauthorized" ? "unauthorized" : "unknown";
|
|
65
|
+
const status = enabled ? lastHealthStatus === "ok" ? "connected" : "installed" : "disabled";
|
|
21
66
|
return [{
|
|
22
67
|
instanceId: serverId,
|
|
23
68
|
connectorId,
|
|
24
|
-
displayName:
|
|
25
|
-
enabled
|
|
26
|
-
status
|
|
69
|
+
displayName: definition?.displayName ?? server.xopcConnector.displayName ?? connectorId,
|
|
70
|
+
enabled,
|
|
71
|
+
status,
|
|
72
|
+
connectionStatus,
|
|
73
|
+
authStatus,
|
|
74
|
+
lastConnectedAt: server.xopcConnector.lastConnectedAt,
|
|
75
|
+
lastError: server.xopcConnector.lastError,
|
|
27
76
|
secretStatus: secretStatusForServer(server),
|
|
28
77
|
materialized: {
|
|
29
78
|
type: "mcp",
|
|
30
79
|
serverId
|
|
31
80
|
},
|
|
32
|
-
usage
|
|
81
|
+
usage,
|
|
33
82
|
audit: getConnectorAuditFromMarker(server.xopcConnector)
|
|
34
83
|
}];
|
|
35
|
-
})
|
|
84
|
+
});
|
|
85
|
+
const genericInstances = Object.entries(config.connectors?.instances ?? {}).flatMap(([instanceId, record]) => record && typeof record === "object" && !Array.isArray(record) ? connectorInstanceFromRecord(instanceId, record) : []);
|
|
86
|
+
return [...mcpInstances, ...genericInstances].sort((left, right) => left.displayName.localeCompare(right.displayName));
|
|
36
87
|
}
|
|
37
88
|
function getConnectorInstance(config, instanceId) {
|
|
38
89
|
return listConnectorInstances(config).find((instance) => instance.instanceId === instanceId);
|