@xopcai/xopc 0.0.124 → 0.0.126
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 +56 -102
- package/README.zh-CN.md +51 -98
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/feishu/src/schema/config-schema.d.ts +6 -6
- package/dist/extensions/feishu/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
- package/dist/extensions/telegram/src/config-schema.d.ts +8 -8
- package/dist/extensions/telegram/src/inbound-processor.js +1 -1
- package/dist/extensions/telegram/src/plugin.js +1 -1
- package/dist/extensions/telegram/src/routing-integration.js +2 -2
- package/dist/extensions/telegram/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/api/api.js +1 -1
- package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
- package/dist/extensions/weixin/src/plugin.js +1 -1
- package/dist/extensions/weixin/src/workflow-progress.js +1 -1
- package/dist/gateway/static/root/assets/Combination-BzaXOLd9.js +41 -0
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-B5uSVAyJ.js → agent-avatar-dicebear-C70vgt60.js} +1 -1
- package/dist/gateway/static/root/assets/agents-DRYVahI-.js +2 -0
- package/dist/gateway/static/root/assets/app-management-settings-panel-D9-HW6cy.js +1 -0
- package/dist/gateway/static/root/assets/appearance-settings-BHlahIDL.js +1 -0
- package/dist/gateway/static/root/assets/apps-page-BdJ1eQg3.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-CXUGRp2i.js → archive-plugin-B-aoIt0w.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-Cmiub3Wg.js → attachment-load-BD0G0FD5.js} +1 -1
- package/dist/gateway/static/root/assets/automation-suggestion-card-iJRVI7aZ.js +1 -0
- package/dist/gateway/static/root/assets/automations-page-D8hYQbkl.js +4 -0
- package/dist/gateway/static/root/assets/{binary-plugins-0Izz-N3p.js → binary-plugins-B0mNlVSz.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-C1Kv0IkJ.js → block-editor-CJY9Lu5G.js} +3 -3
- package/dist/gateway/static/root/assets/browser-settings-page-CiWEO-Iy.js +8 -0
- package/dist/gateway/static/root/assets/capability-presets-api-Bgc8ag55.js +1 -0
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-B1nIi0TC.js +1 -0
- package/dist/gateway/static/root/assets/{channel-recipient-api-BeA2aVor.js → channel-recipient-api-0sauApoC.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-BddPdqVo.js +1 -0
- package/dist/gateway/static/root/assets/code-editor-gbRgS14t.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-Ba2GDhSE.js +2 -0
- package/dist/gateway/static/root/assets/{directory-picker-path-field-2rjzUu57.js → directory-picker-path-field-CiEc4KmY.js} +1 -1
- package/dist/gateway/static/root/assets/dist-By6Rh2ee.js +1 -0
- package/dist/gateway/static/root/assets/dist-CkobR7mk.js +1 -0
- package/dist/gateway/static/root/assets/dist-DokQNVMQ.js +1 -0
- package/dist/gateway/static/root/assets/dreaming-settings-4bvpk5wr.js +3 -0
- package/dist/gateway/static/root/assets/extension-debug-page-BbyczVZ3.js +1 -0
- package/dist/gateway/static/root/assets/extension-page-DLN1I3DR.js +1 -0
- package/dist/gateway/static/root/assets/extension-settings-page-D9VGHmYJ.js +1 -0
- package/dist/gateway/static/root/assets/{fetch-BU5S0Sn7.js → fetch-5V96dUz3.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-BIPGwrl1.js → gateway-config-api-BtIzObwp.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-KFsGGDhg.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-Cd0Zz30N.js → gateway-startup-retry-DEMad2wt.js} +1 -1
- package/dist/gateway/static/root/assets/goal-create-dialog-4PcF6Sh6.js +1 -0
- package/dist/gateway/static/root/assets/goal-detail-page-B482PSaG.js +1 -0
- package/dist/gateway/static/root/assets/{goals-config-api-B95KdGMj.js → goals-config-api-CVN7-pdM.js} +1 -1
- package/dist/gateway/static/root/assets/goals-page-CUdgJuDn.js +2 -0
- package/dist/gateway/static/root/assets/goals-settings-IYCH3-Pi.js +1 -0
- package/dist/gateway/static/root/assets/heartbeat-settings-Cf_a2Bmz.js +1 -0
- package/dist/gateway/static/root/assets/{html-workspace-editor-CQLWDiwE.js → html-workspace-editor-DV90ddkE.js} +1 -1
- package/dist/gateway/static/root/assets/index-CA2tR2vm.js +256 -0
- package/dist/gateway/static/root/assets/index-Ds3u0LOk.css +1 -0
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-lKTg6St7.js +1 -0
- package/dist/gateway/static/root/assets/logs-page-BCporcNH.js +2 -0
- package/dist/gateway/static/root/assets/{markdown-editor-AssmZFx4.js → markdown-editor-BFOjBBla.js} +2 -2
- package/dist/gateway/static/root/assets/markdown-split-Bv4k6iGJ.js +1 -0
- package/dist/gateway/static/root/assets/{media-plugins-BhIQU5yS.js → media-plugins-Bbi8g3N8.js} +1 -1
- package/dist/gateway/static/root/assets/messages-C22hxE1N.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-panel-D68Pyow7.js +2 -0
- package/dist/gateway/static/root/assets/notes-page-CuUMOiyv.js +1 -0
- package/dist/gateway/static/root/assets/notes-workbench-Dx2N5zTk.js +2 -0
- package/dist/gateway/static/root/assets/page-tabs-Cp395RYD.js +1 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-DGzet1d7.js → preview-open-alternatives-DqV5OM4m.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-sB8AzZi3.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-LBnJqWK2.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-Dbj0o6SC.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-Cqgb-jqa.js → save-bar-controls-BItmzAzI.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-DVZcI8Yt.js → schedule-field-BQ8IjjCn.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-Bj7sOxC8.js → schema-form-BRpD6x3d.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-DhDZKspB.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-BvXLMNL6.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-BmXn-8N6.js → settings-collapsible-section-BKSPQM4R.js} +1 -1
- package/dist/gateway/static/root/assets/settings-form-section-BmyfthNQ.js +1 -0
- package/dist/gateway/static/root/assets/settings-page-Cfm9UxAr.js +1 -0
- package/dist/gateway/static/root/assets/settings-page-layout-Bls5tfbH.js +1 -0
- package/dist/gateway/static/root/assets/setup-status-panel-kQEsTGAs.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-IB1v8i86.js → share-preview-page-DbYZNAPb.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-BtR4B0kn.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-CJNVOWoK.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-DcWDHrt3.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-BxQ384RC.js → system-settings-panel-DKDAojWM.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-BkcpvFYO.js → typed-models-lib-BCCV4Kkp.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-Cd0FaEQ4.js → use-channel-catalog-NBqg3iFY.js} +1 -1
- package/dist/gateway/static/root/assets/{user-profile-settings-panel-DQ7NnRSY.js → user-profile-settings-panel-suQ2x-LB.js} +1 -1
- package/dist/gateway/static/root/assets/{utils-YKhVf7Ka.js → utils-DPGVr3tS.js} +1 -1
- package/dist/gateway/static/root/assets/{vendor-codemirror-CNP1wPe7.js → vendor-codemirror-BvNgyE1Q.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DaJASKFP.js +1 -0
- package/dist/gateway/static/root/assets/work-item-detail-page-BrCZpAWh.js +1 -0
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-BTkRVNAh.js +3 -0
- package/dist/gateway/static/root/assets/{workflow-start-dialog-BNJVCWoS.js → workflow-start-dialog-DAImVtdO.js} +1 -1
- package/dist/gateway/static/root/assets/workflows-page-vyJ8wSXm.js +18 -0
- package/dist/gateway/static/root/index.html +8 -7
- package/dist/package.js +1 -1
- package/dist/src/activity/context.d.ts +11 -0
- package/dist/src/activity/context.js +36 -0
- package/dist/src/activity/context.js.map +1 -0
- package/dist/src/activity/emitter.d.ts +6 -0
- package/dist/src/activity/emitter.js +43 -0
- package/dist/src/activity/emitter.js.map +1 -0
- package/dist/src/activity/index.d.ts +3 -0
- package/dist/src/activity/index.js +3 -0
- package/dist/src/activity/service.d.ts +12 -0
- package/dist/src/activity/service.js +59 -0
- package/dist/src/activity/service.js.map +1 -0
- package/dist/src/activity/types.d.ts +109 -0
- package/dist/src/activity/types.js +1 -0
- package/dist/src/agent/agent-manager.d.ts +7 -0
- package/dist/src/agent/agent-manager.js +12 -5
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/child-agent-factory.d.ts +2 -0
- package/dist/src/agent/child-agent-factory.js +2 -0
- package/dist/src/agent/child-agent-factory.js.map +1 -1
- package/dist/src/agent/coding/index.d.ts +1 -0
- package/dist/src/agent/coding/index.js +2 -0
- package/dist/src/agent/coding/turn-diff-tracker.d.ts +67 -0
- package/dist/src/agent/coding/turn-diff-tracker.js +233 -0
- package/dist/src/agent/coding/turn-diff-tracker.js.map +1 -0
- package/dist/src/agent/context/project-context.js +2 -2
- package/dist/src/agent/context/workspace-seed.js +2 -2
- package/dist/src/agent/embedded/run-for-session.js +1 -1
- package/dist/src/agent/goals/post-turn.js +2 -2
- package/dist/src/agent/ipc/bus.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
- package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
- package/dist/src/agent/mcp/mcp-transport.js +1 -1
- package/dist/src/agent/memory/dreaming/config.d.ts +2 -2
- package/dist/src/agent/memory/dreaming/config.js +3 -3
- package/dist/src/agent/memory/dreaming/config.js.map +1 -1
- package/dist/src/agent/memory/dreaming/constants.d.ts +1 -1
- package/dist/src/agent/memory/dreaming/constants.js +1 -1
- package/dist/src/agent/memory/dreaming/constants.js.map +1 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.d.ts +1 -0
- package/dist/src/agent/memory/dreaming/deep-promotion.js +11 -20
- package/dist/src/agent/memory/dreaming/deep-promotion.js.map +1 -1
- package/dist/src/agent/memory/dreaming/events.d.ts +3 -3
- package/dist/src/agent/memory/dreaming/events.js +6 -6
- package/dist/src/agent/memory/dreaming/events.js.map +1 -1
- package/dist/src/agent/memory/dreaming/last-run.d.ts +2 -2
- package/dist/src/agent/memory/dreaming/last-run.js +1 -1
- package/dist/src/agent/memory/dreaming/last-run.js.map +1 -1
- package/dist/src/agent/memory/dreaming/light-sweep.d.ts +1 -1
- package/dist/src/agent/memory/dreaming/light-sweep.js +3 -3
- package/dist/src/agent/memory/dreaming/light-sweep.js.map +1 -1
- package/dist/src/agent/memory/dreaming/preview.d.ts +1 -0
- package/dist/src/agent/memory/dreaming/preview.js +2 -2
- package/dist/src/agent/memory/dreaming/preview.js.map +1 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.d.ts +1 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.js +13 -13
- package/dist/src/agent/memory/dreaming/rem-patterns.js.map +1 -1
- package/dist/src/agent/memory/dreaming/scope.d.ts +14 -0
- package/dist/src/agent/memory/dreaming/scope.js +27 -0
- package/dist/src/agent/memory/dreaming/scope.js.map +1 -0
- package/dist/src/agent/memory/dreaming/short-term-store.d.ts +4 -4
- package/dist/src/agent/memory/dreaming/short-term-store.js +17 -17
- package/dist/src/agent/memory/dreaming/short-term-store.js.map +1 -1
- package/dist/src/agent/memory/plugin-discovery.js +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/orchestration/agent-event-handler.d.ts +2 -0
- package/dist/src/agent/orchestration/agent-event-handler.js +13 -0
- package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js +22 -12
- package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
- package/dist/src/agent/sandbox/command-validator.js +12 -0
- package/dist/src/agent/sandbox/command-validator.js.map +1 -1
- package/dist/src/agent/service.d.ts +2 -1
- package/dist/src/agent/service.js +24 -9
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/service.types.d.ts +7 -0
- package/dist/src/agent/session/session-inspector.d.ts +5 -3
- package/dist/src/agent/session/session-inspector.js +17 -8
- 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/source-context/types.d.ts +1 -1
- package/dist/src/agent/source-context/types.js +1 -1
- package/dist/src/agent/source-context/types.js.map +1 -1
- package/dist/src/agent/tool-manuals/index.js +15 -6
- package/dist/src/agent/tool-manuals/index.js.map +1 -1
- package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -0
- package/dist/src/agent/tool-manuals/xopc-use.js +204 -0
- package/dist/src/agent/tool-manuals/xopc-use.js.map +1 -0
- package/dist/src/agent/tools/apply-patch.js +116 -62
- package/dist/src/agent/tools/apply-patch.js.map +1 -1
- package/dist/src/agent/tools/concurrency.d.ts +8 -0
- package/dist/src/agent/tools/concurrency.js +31 -0
- package/dist/src/agent/tools/concurrency.js.map +1 -0
- package/dist/src/agent/tools/dreaming-tool.d.ts +2 -0
- package/dist/src/agent/tools/dreaming-tool.js +13 -10
- package/dist/src/agent/tools/dreaming-tool.js.map +1 -1
- package/dist/src/agent/tools/exec-command.js +4 -0
- package/dist/src/agent/tools/exec-command.js.map +1 -1
- package/dist/src/agent/tools/executor.d.ts +6 -4
- package/dist/src/agent/tools/executor.js +7 -4
- package/dist/src/agent/tools/executor.js.map +1 -1
- package/dist/src/agent/tools/factory.d.ts +10 -0
- package/dist/src/agent/tools/factory.js +16 -1
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/find.js +2 -0
- package/dist/src/agent/tools/find.js.map +1 -1
- package/dist/src/agent/tools/goal-tool.js +2 -2
- package/dist/src/agent/tools/grep.js +2 -0
- package/dist/src/agent/tools/grep.js.map +1 -1
- package/dist/src/agent/tools/index.d.ts +3 -0
- package/dist/src/agent/tools/index.js +4 -1
- package/dist/src/agent/tools/list-dir.js +2 -0
- package/dist/src/agent/tools/list-dir.js.map +1 -1
- package/dist/src/agent/tools/memory-tool.d.ts +1 -0
- package/dist/src/agent/tools/memory-tool.js +2 -2
- package/dist/src/agent/tools/memory-tool.js.map +1 -1
- package/dist/src/agent/tools/metadata.d.ts +15 -0
- package/dist/src/agent/tools/metadata.js +26 -0
- package/dist/src/agent/tools/metadata.js.map +1 -0
- package/dist/src/agent/tools/read.js +2 -0
- package/dist/src/agent/tools/read.js.map +1 -1
- package/dist/src/agent/tools/workflow-tool.js +1 -1
- package/dist/src/agent/tools/write.js +6 -0
- package/dist/src/agent/tools/write.js.map +1 -1
- package/dist/src/agent/tools/xopc-use-tool.d.ts +34 -0
- package/dist/src/agent/tools/xopc-use-tool.js +636 -0
- package/dist/src/agent/tools/xopc-use-tool.js.map +1 -0
- package/dist/src/agent/workflow/subagent-runner.d.ts +1 -0
- package/dist/src/agent/workflow/subagent-runner.js +5 -1
- package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
- package/dist/src/agent/workflow/workflow-child-tools.js +5 -0
- package/dist/src/agent/workflow/workflow-child-tools.js.map +1 -1
- package/dist/src/agent-manifest/schema.d.ts +27 -27
- package/dist/src/automations/api/routes.js +1 -1
- package/dist/src/automations/domain/validation.d.ts +55 -55
- package/dist/src/automations/draft/automation-draft-validator.d.ts +25 -25
- package/dist/src/automations/service/action-executor.js +2 -2
- package/dist/src/browser/cdp-local-launcher.js +1 -1
- package/dist/src/browser/providers/browser-ext-install.js +3 -3
- package/dist/src/browser/providers/cloakbrowser.js +2 -2
- package/dist/src/browser/providers/playwright-doctor.js +1 -1
- package/dist/src/browser/stealth.js +1 -1
- package/dist/src/chat-commands/agent-edit.js +1 -1
- package/dist/src/chat-commands/builtins/config.js +1 -1
- package/dist/src/chat-commands/builtins/goal.js +2 -2
- package/dist/src/chat-commands/context.js +1 -1
- package/dist/src/cli/commands/agent.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +2 -2
- package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +1 -1
- package/dist/src/cli/commands/extension-pack.js +1 -1
- package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
- package/dist/src/cli/commands/goal.js +3 -3
- package/dist/src/cli/commands/init.js +1 -1
- package/dist/src/cli/commands/project.js +4 -4
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/config/gateway-bind.js +1 -1
- package/dist/src/config/index.js +1 -1
- package/dist/src/config/loader.js +1 -1
- package/dist/src/config/models-json.d.ts +14 -14
- package/dist/src/config/models-json.js +1 -1
- package/dist/src/config/schema.d.ts +60 -60
- package/dist/src/connectors/health.d.ts +2 -1
- package/dist/src/connectors/health.js +59 -1
- package/dist/src/connectors/health.js.map +1 -1
- package/dist/src/connectors/install.d.ts +1 -0
- package/dist/src/connectors/install.js +28 -1
- package/dist/src/connectors/install.js.map +1 -1
- package/dist/src/connectors/instances.js +7 -0
- package/dist/src/connectors/instances.js.map +1 -1
- package/dist/src/connectors/materialize.js +2 -1
- package/dist/src/connectors/materialize.js.map +1 -1
- package/dist/src/connectors/registries/modelscope.js +38 -13
- package/dist/src/connectors/registries/modelscope.js.map +1 -1
- package/dist/src/connectors/types.d.ts +2 -0
- package/dist/src/daemon/launchd.js +1 -1
- package/dist/src/daemon/systemd.js +1 -1
- package/dist/src/extensions/discover-extensions.js +1 -1
- package/dist/src/extensions/loader.js +2 -2
- package/dist/src/gateway/agents-admin.js +1 -1
- package/dist/src/gateway/dreaming-automation-reconciler.d.ts +1 -0
- package/dist/src/gateway/dreaming-automation-reconciler.js +62 -42
- package/dist/src/gateway/dreaming-automation-reconciler.js.map +1 -1
- package/dist/src/gateway/hono/app.js +7 -1
- package/dist/src/gateway/hono/app.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +14 -14
- package/dist/src/gateway/hono/lib/static-ui.js +1 -1
- package/dist/src/gateway/hono/middleware/log-context.js +8 -1
- package/dist/src/gateway/hono/middleware/log-context.js.map +1 -1
- package/dist/src/gateway/hono/routes/activity.d.ts +14 -0
- package/dist/src/gateway/hono/routes/activity.js +72 -0
- package/dist/src/gateway/hono/routes/activity.js.map +1 -0
- package/dist/src/gateway/hono/routes/connectors.js +46 -2
- package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +111 -66
- package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
- package/dist/src/gateway/hono/routes/goals.js +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/memory.js +2 -2
- package/dist/src/gateway/hono/routes/projects.js +903 -50
- package/dist/src/gateway/hono/routes/projects.js.map +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +102 -2
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/routes/workflows.js +2 -2
- package/dist/src/gateway/lock.js +1 -1
- package/dist/src/gateway/ports.js +1 -1
- package/dist/src/gateway/service/sessions-api.d.ts +10 -0
- package/dist/src/gateway/service/sessions-api.js +31 -0
- package/dist/src/gateway/service/sessions-api.js.map +1 -1
- package/dist/src/gateway/service.js +28 -16
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/goals/goal-store.js +1 -1
- package/dist/src/goals/goal-store.js.map +1 -1
- package/dist/src/goals/goal-workflow-judge.js +1 -1
- package/dist/src/infra/ports.js +1 -1
- package/dist/src/infra/ssh-tunnel.js +1 -1
- package/dist/src/infra/update-check.js +1 -1
- package/dist/src/infra/update-restart.js +1 -1
- package/dist/src/mcp/channel-bridge.js +1 -1
- package/dist/src/media/store.js +1 -1
- package/dist/src/media/store.js.map +1 -1
- package/dist/src/media/types.d.ts +1 -1
- package/dist/src/media/uri.js +2 -1
- package/dist/src/media/uri.js.map +1 -1
- package/dist/src/migrations/runner.js +1 -1
- package/dist/src/notes/service.js +65 -6
- package/dist/src/notes/service.js.map +1 -1
- package/dist/src/notes/store.js +1 -1
- package/dist/src/projects/project-service.d.ts +2 -1
- package/dist/src/projects/project-service.js +59 -2
- package/dist/src/projects/project-service.js.map +1 -1
- package/dist/src/projects/project-store.d.ts +2 -1
- package/dist/src/projects/project-store.js +43 -0
- package/dist/src/projects/project-store.js.map +1 -1
- package/dist/src/projects/types.d.ts +10 -0
- package/dist/src/projects/workspace.js +1 -1
- package/dist/src/routing/agent-session-key.js +1 -1
- package/dist/src/routing/resolve-route.js +1 -1
- package/dist/src/routing/resolve-tui-session-key.js +1 -1
- package/dist/src/session/client-history.d.ts +3 -0
- package/dist/src/session/client-history.js +24 -9
- package/dist/src/session/client-history.js.map +1 -1
- package/dist/src/session/init-session-turn.js +1 -1
- package/dist/src/session/resolve-session.js +1 -1
- package/dist/src/session/session-context-for-llm.d.ts +2 -0
- package/dist/src/session/session-context-for-llm.js +14 -1
- package/dist/src/session/session-context-for-llm.js.map +1 -1
- package/dist/src/session/session-title.js +2 -2
- package/dist/src/session/store.js +3 -3
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/types.d.ts +4 -0
- package/dist/src/session/types.js.map +1 -1
- package/dist/src/storage/sqlite/activity-repository.d.ts +8 -0
- package/dist/src/storage/sqlite/activity-repository.js +208 -0
- package/dist/src/storage/sqlite/activity-repository.js.map +1 -0
- 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/migrations/022_work_items.sql +61 -0
- package/dist/src/storage/sqlite/migrations/023_work_item_attachments.sql +15 -0
- package/dist/src/storage/sqlite/migrations/024_activity_events.sql +62 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/row-mappers.js +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/schema.sql +141 -0
- package/dist/src/storage/sqlite/session-repository.js +11 -0
- package/dist/src/storage/sqlite/session-repository.js.map +1 -1
- package/dist/src/tui/backends/embedded-backend.d.ts +13 -0
- package/dist/src/tui/backends/embedded-backend.js +76 -7
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.d.ts +13 -0
- package/dist/src/tui/backends/gateway-sse-backend.js +53 -0
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
- package/dist/src/tui/chat-history.js +16 -3
- package/dist/src/tui/chat-history.js.map +1 -1
- package/dist/src/tui/clipboard-image.js +1 -1
- package/dist/src/tui/components/assistant-message.js +12 -2
- package/dist/src/tui/components/assistant-message.js.map +1 -1
- package/dist/src/tui/components/chat-log.d.ts +23 -3
- package/dist/src/tui/components/chat-log.js +68 -9
- package/dist/src/tui/components/chat-log.js.map +1 -1
- package/dist/src/tui/components/tool-execution.d.ts +8 -0
- package/dist/src/tui/components/tool-execution.js +87 -77
- package/dist/src/tui/components/tool-execution.js.map +1 -1
- package/dist/src/tui/components/tui-bottom-bar.js +9 -5
- package/dist/src/tui/components/tui-bottom-bar.js.map +1 -1
- package/dist/src/tui/components/visual-truncate.d.ts +1 -0
- package/dist/src/tui/components/visual-truncate.js +28 -1
- package/dist/src/tui/components/visual-truncate.js.map +1 -1
- package/dist/src/tui/tool-summary.d.ts +22 -0
- package/dist/src/tui/tool-summary.js +212 -0
- package/dist/src/tui/tool-summary.js.map +1 -0
- package/dist/src/tui/tui-backend.d.ts +16 -0
- package/dist/src/tui/tui-command-formatters.js +2 -2
- package/dist/src/tui/tui-commands.d.ts +9 -0
- package/dist/src/tui/tui-commands.js +95 -6
- package/dist/src/tui/tui-commands.js.map +1 -1
- package/dist/src/tui/tui-picker-overlay.d.ts +1 -0
- package/dist/src/tui/tui-picker-overlay.js +36 -1
- package/dist/src/tui/tui-picker-overlay.js.map +1 -1
- package/dist/src/tui/tui-picker-services.d.ts +13 -0
- package/dist/src/tui/tui-run-state.js +11 -0
- package/dist/src/tui/tui-run-state.js.map +1 -1
- package/dist/src/tui/tui-run-status-format.d.ts +3 -0
- package/dist/src/tui/tui-run-status-format.js +33 -0
- package/dist/src/tui/tui-run-status-format.js.map +1 -0
- package/dist/src/tui/tui-session-actions.d.ts +5 -0
- package/dist/src/tui/tui-session-actions.js +24 -0
- package/dist/src/tui/tui-session-actions.js.map +1 -1
- package/dist/src/tui/tui-timeline-picker.d.ts +19 -0
- package/dist/src/tui/tui-timeline-picker.js +81 -0
- package/dist/src/tui/tui-timeline-picker.js.map +1 -0
- package/dist/src/tui/tui-timeline.d.ts +15 -0
- package/dist/src/tui/tui-timeline.js +65 -0
- package/dist/src/tui/tui-timeline.js.map +1 -0
- package/dist/src/tui/tui-tool-diff.d.ts +15 -0
- package/dist/src/tui/tui-tool-diff.js +178 -7
- package/dist/src/tui/tui-tool-diff.js.map +1 -1
- package/dist/src/tui/tui-types.d.ts +1 -0
- package/dist/src/tui/tui-types.js +1 -0
- package/dist/src/tui/tui-types.js.map +1 -1
- package/dist/src/tui/tui.js +31 -25
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/utils/index.js +1 -1
- package/dist/src/utils/logger/index.js +1 -1
- package/dist/src/utils/logger/stats.d.ts +3 -3
- package/dist/src/utils/logger.js +1 -1
- package/dist/src/work-items/agent-context.d.ts +7 -0
- package/dist/src/work-items/agent-context.js +75 -0
- package/dist/src/work-items/agent-context.js.map +1 -0
- package/dist/src/work-items/index.d.ts +4 -0
- package/dist/src/work-items/index.js +4 -0
- package/dist/src/work-items/types.d.ts +112 -0
- package/dist/src/work-items/types.js +1 -0
- package/dist/src/work-items/work-item-service.d.ts +35 -0
- package/dist/src/work-items/work-item-service.js +277 -0
- package/dist/src/work-items/work-item-service.js.map +1 -0
- package/dist/src/work-items/work-item-store.d.ts +21 -0
- package/dist/src/work-items/work-item-store.js +302 -0
- package/dist/src/work-items/work-item-store.js.map +1 -0
- package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
- package/dist/src/workflows/service/workflow-run-service.js +4 -3
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +4 -1
- package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
- package/package.json +5 -5
- package/dist/gateway/static/root/assets/Combination-HAlzriaz.js +0 -41
- package/dist/gateway/static/root/assets/agents-BjIxt67Z.js +0 -2
- package/dist/gateway/static/root/assets/app-management-settings-panel-CYCONLIL.js +0 -1
- package/dist/gateway/static/root/assets/appearance-settings-Clw3ryKg.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-QICTeGjX.js +0 -1
- package/dist/gateway/static/root/assets/automation-suggestion-card-CU0-4nQ-.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-Car-jtiz.js +0 -1
- package/dist/gateway/static/root/assets/browser-settings-page-CMeBJzlS.js +0 -8
- package/dist/gateway/static/root/assets/capability-presets-api-BmQTM9Il.js +0 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-DZEJEoCF.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-kkW-xFau.js +0 -1
- package/dist/gateway/static/root/assets/code-editor-dZTY2dRW.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-BvaQvO5F.js +0 -2
- package/dist/gateway/static/root/assets/dist-Mys7eFJ5.js +0 -1
- package/dist/gateway/static/root/assets/dist-wO9a2_ID.js +0 -1
- package/dist/gateway/static/root/assets/dreaming-settings-DnHO686d.js +0 -1
- package/dist/gateway/static/root/assets/extension-debug-page-BGLRuWVN.js +0 -1
- package/dist/gateway/static/root/assets/extension-page-D978ePp9.js +0 -1
- package/dist/gateway/static/root/assets/extension-settings-page-B6Ih4Swx.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-CMEA3r5u.js +0 -1
- package/dist/gateway/static/root/assets/goal-create-dialog-B-KHKeXN.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-BxrSoWdj.js +0 -1
- package/dist/gateway/static/root/assets/goals-page-BTJzIl28.js +0 -2
- package/dist/gateway/static/root/assets/goals-settings-BJyEuLLm.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-wkOjYNQT.js +0 -1
- package/dist/gateway/static/root/assets/index-BLaXr6Ev.css +0 -1
- package/dist/gateway/static/root/assets/index-c_9TVr_C.js +0 -191
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-BT8T4DyC.js +0 -1
- package/dist/gateway/static/root/assets/logs-page-CrxBJUgI.js +0 -2
- package/dist/gateway/static/root/assets/markdown-split-Dv66bO2b.js +0 -1
- package/dist/gateway/static/root/assets/messages-O6TAtdFC.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-DOOpz6y1.js +0 -2
- package/dist/gateway/static/root/assets/notes-page-Br16pK9v.js +0 -1
- package/dist/gateway/static/root/assets/notes-workbench-PSJAi0ZC.js +0 -2
- package/dist/gateway/static/root/assets/project-detail-page-CIGGgKuw.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-B2grhsBt.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CXMORxBD.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-Bi2wkBzU.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-B1L3G4IA.js +0 -1
- package/dist/gateway/static/root/assets/settings-form-section-BnqYMWHR.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-BfRSHJmO.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-layout-CdWZU1hd.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-CWtPM7RK.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-ngbsBgij.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-BIe442Gv.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-BfchZRVa.js +0 -2
- package/dist/gateway/static/root/assets/voice-api-key-field-C5Ov8Uk_.js +0 -1
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-BYD9BtOq.js +0 -3
- package/dist/gateway/static/root/assets/workflows-page-BYF29ANm.js +0 -18
|
@@ -3,4 +3,5 @@ import type { Config } from '../config/schema.js';
|
|
|
3
3
|
import type { ConnectorDefinition, ConnectorInstallInput, ConnectorInstance } from './types.js';
|
|
4
4
|
export declare function installConnectorDefinition(config: Config, definition: ConnectorDefinition, input: ConnectorInstallInput, resolver?: CredentialResolver): Promise<ConnectorInstance>;
|
|
5
5
|
export declare function installConnector(config: Config, connectorId: string, input: ConnectorInstallInput, resolver?: CredentialResolver): Promise<ConnectorInstance>;
|
|
6
|
+
export declare function updateConnectorConfig(config: Config, instanceId: string, input: ConnectorInstallInput): ConnectorInstance;
|
|
6
7
|
export declare function uninstallConnector(config: Config, instanceId: string): ConnectorInstance;
|
|
@@ -51,6 +51,33 @@ async function installConnector(config, connectorId, input, resolver = new Crede
|
|
|
51
51
|
if (!definition) throw new Error(`Unknown connector: ${connectorId}`);
|
|
52
52
|
return installConnectorDefinition(config, definition, input, resolver);
|
|
53
53
|
}
|
|
54
|
+
function updateConnectorConfig(config, instanceId, input) {
|
|
55
|
+
const existingServer = config.mcp?.servers?.[instanceId];
|
|
56
|
+
if (!existingServer || !isManagedConnectorServer(existingServer)) throw new Error(`MCP server "${instanceId}" is not managed by Connectors.`);
|
|
57
|
+
const definition = getConnectorDefinition(existingServer.xopcConnector.connectorId);
|
|
58
|
+
if (!definition) throw new Error(`Unknown connector: ${existingServer.xopcConnector.connectorId}`);
|
|
59
|
+
if (definition.runtime.type !== "mcp") throw new Error(`Connector type "${definition.runtime.type}" does not support config updates.`);
|
|
60
|
+
if ((definition.setup.secrets ?? []).length > 0) throw new Error("Connectors with secrets must be reinstalled to change configuration.");
|
|
61
|
+
const { serverId, server } = materializeConnectorMcpServer(definition, input);
|
|
62
|
+
if (serverId !== instanceId) throw new Error(`Connector config update cannot change server id from "${instanceId}" to "${serverId}".`);
|
|
63
|
+
config.mcp = config.mcp ?? {};
|
|
64
|
+
config.mcp.servers = {
|
|
65
|
+
...config.mcp.servers ?? {},
|
|
66
|
+
[serverId]: {
|
|
67
|
+
...server,
|
|
68
|
+
xopcConnector: {
|
|
69
|
+
...existingServer.xopcConnector,
|
|
70
|
+
...server.xopcConnector,
|
|
71
|
+
enabled: existingServer.xopcConnector.enabled,
|
|
72
|
+
lastConnectedAt: existingServer.xopcConnector.lastConnectedAt,
|
|
73
|
+
lastError: existingServer.xopcConnector.lastError
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
const instance = listConnectorInstances(config).find((candidate) => candidate.instanceId === serverId);
|
|
78
|
+
if (!instance) throw new Error(`Connector "${definition.id}" was updated but could not be resolved.`);
|
|
79
|
+
return instance;
|
|
80
|
+
}
|
|
54
81
|
function uninstallConnector(config, instanceId) {
|
|
55
82
|
const server = config.mcp?.servers?.[instanceId];
|
|
56
83
|
const connectorRecord = config.connectors?.instances?.[instanceId];
|
|
@@ -78,6 +105,6 @@ function uninstallConnector(config, instanceId) {
|
|
|
78
105
|
return instance;
|
|
79
106
|
}
|
|
80
107
|
//#endregion
|
|
81
|
-
export { installConnector, installConnectorDefinition, uninstallConnector };
|
|
108
|
+
export { installConnector, installConnectorDefinition, uninstallConnector, updateConnectorConfig };
|
|
82
109
|
|
|
83
110
|
//# 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 { 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"}
|
|
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 updateConnectorConfig(\n config: Config,\n instanceId: string,\n input: ConnectorInstallInput,\n): ConnectorInstance {\n const existingServer = config.mcp?.servers?.[instanceId];\n if (!existingServer || !isManagedConnectorServer(existingServer)) {\n throw new Error(`MCP server \"${instanceId}\" is not managed by Connectors.`);\n }\n const definition = getConnectorDefinition(existingServer.xopcConnector.connectorId);\n if (!definition) {\n throw new Error(`Unknown connector: ${existingServer.xopcConnector.connectorId}`);\n }\n if (definition.runtime.type !== 'mcp') {\n throw new Error(`Connector type \"${definition.runtime.type}\" does not support config updates.`);\n }\n if ((definition.setup.secrets ?? []).length > 0) {\n throw new Error('Connectors with secrets must be reinstalled to change configuration.');\n }\n\n const { serverId, server } = materializeConnectorMcpServer(definition, input);\n if (serverId !== instanceId) {\n throw new Error(`Connector config update cannot change server id from \"${instanceId}\" to \"${serverId}\".`);\n }\n\n config.mcp = config.mcp ?? {};\n config.mcp.servers = {\n ...(config.mcp.servers ?? {}),\n [serverId]: {\n ...server,\n xopcConnector: {\n ...existingServer.xopcConnector,\n ...(server.xopcConnector as Record<string, unknown>),\n enabled: existingServer.xopcConnector.enabled,\n lastConnectedAt: existingServer.xopcConnector.lastConnectedAt,\n lastError: existingServer.xopcConnector.lastError,\n },\n },\n };\n\n const instance = listConnectorInstances(config).find((candidate) => candidate.instanceId === serverId);\n if (!instance) {\n throw new Error(`Connector \"${definition.id}\" was updated but could not be resolved.`);\n }\n return instance;\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":"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"}
|
|
@@ -2,6 +2,11 @@ import { getConnectorDefinition } from "./catalog.js";
|
|
|
2
2
|
import { isManagedConnectorServer } from "./materialize.js";
|
|
3
3
|
import { getConnectorAuditFromMarker, getConnectorUsageFromMarker } from "./usage.js";
|
|
4
4
|
//#region src/connectors/instances.ts
|
|
5
|
+
function readMarkerConfig(marker) {
|
|
6
|
+
if (!marker || typeof marker !== "object" || Array.isArray(marker)) return void 0;
|
|
7
|
+
const config = marker.config;
|
|
8
|
+
return config && typeof config === "object" && !Array.isArray(config) ? config : void 0;
|
|
9
|
+
}
|
|
5
10
|
function secretStatusForServer(server) {
|
|
6
11
|
const marker = server.xopcConnector;
|
|
7
12
|
const definition = marker?.connectorId ? getConnectorDefinition(marker.connectorId) : void 0;
|
|
@@ -34,6 +39,7 @@ function connectorInstanceFromRecord(instanceId, record) {
|
|
|
34
39
|
lastConnectedAt: typeof markerRecord.lastConnectedAt === "string" ? markerRecord.lastConnectedAt : void 0,
|
|
35
40
|
lastError: typeof markerRecord.lastError === "string" ? markerRecord.lastError : void 0,
|
|
36
41
|
secretStatus: {},
|
|
42
|
+
config: readMarkerConfig(markerRecord),
|
|
37
43
|
materialized: runtimeType === "composio" ? {
|
|
38
44
|
type: "composio",
|
|
39
45
|
id: instanceId
|
|
@@ -74,6 +80,7 @@ function listConnectorInstances(config) {
|
|
|
74
80
|
lastConnectedAt: server.xopcConnector.lastConnectedAt,
|
|
75
81
|
lastError: server.xopcConnector.lastError,
|
|
76
82
|
secretStatus: secretStatusForServer(server),
|
|
83
|
+
config: readMarkerConfig(server.xopcConnector),
|
|
77
84
|
materialized: {
|
|
78
85
|
type: "mcp",
|
|
79
86
|
serverId
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instances.js","names":[],"sources":["../../../src/connectors/instances.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\nimport { getConnectorDefinition } from './catalog.js';\nimport { isManagedConnectorServer } from './materialize.js';\nimport { getConnectorAuditFromMarker, getConnectorUsageFromMarker } from './usage.js';\nimport type { ConnectorInstance } from './types.js';\n\nfunction secretStatusForServer(server: Record<string, unknown>): Record<string, boolean> {\n const marker = server.xopcConnector as { connectorId?: string } | undefined;\n const definition = marker?.connectorId ? getConnectorDefinition(marker.connectorId) : undefined;\n const env = server.env && typeof server.env === 'object' && !Array.isArray(server.env)\n ? (server.env as Record<string, unknown>)\n : {};\n const status: Record<string, boolean> = {};\n for (const secret of definition?.setup.secrets ?? []) {\n const value = env[secret.key];\n status[secret.key] = Boolean(\n value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n 'xopcSecretRef' in value,\n );\n }\n return status;\n}\n\nfunction connectorInstanceFromRecord(instanceId: string, record: Record<string, unknown>): ConnectorInstance[] {\n const marker = record.xopcConnector;\n if (!marker || typeof marker !== 'object' || Array.isArray(marker)) return [];\n const markerRecord = marker as Record<string, unknown>;\n if (markerRecord.managed !== true || typeof markerRecord.connectorId !== 'string') return [];\n const connectorId = markerRecord.connectorId;\n const definition = getConnectorDefinition(connectorId);\n const runtime = record.runtime && typeof record.runtime === 'object' && !Array.isArray(record.runtime)\n ? record.runtime as Record<string, unknown>\n : {};\n const runtimeType = typeof runtime.type === 'string' ? runtime.type : 'composio';\n const enabled = markerRecord.enabled !== false;\n return [{\n instanceId,\n connectorId,\n displayName: definition?.displayName ?? (typeof markerRecord.displayName === 'string' ? markerRecord.displayName : connectorId),\n enabled,\n status: enabled ? 'installed' : 'disabled',\n connectionStatus: enabled ? 'unknown' : 'disabled',\n authStatus: definition?.auth.mode === 'none' ? 'none' : 'unknown',\n lastConnectedAt: typeof markerRecord.lastConnectedAt === 'string' ? markerRecord.lastConnectedAt : undefined,\n lastError: typeof markerRecord.lastError === 'string' ? markerRecord.lastError : undefined,\n secretStatus: {},\n materialized: runtimeType === 'composio'\n ? { type: 'composio', id: instanceId }\n : runtimeType === 'channel'\n ? { type: 'channel', id: instanceId }\n : runtimeType === 'nativeTool'\n ? { type: 'nativeTool', id: instanceId }\n : { type: 'memorySource', id: instanceId },\n usage: getConnectorUsageFromMarker(marker),\n audit: getConnectorAuditFromMarker(marker),\n }];\n}\n\nexport function listConnectorInstances(config: Config): ConnectorInstance[] {\n const servers = config.mcp?.servers ?? {};\n const mcpInstances = Object.entries(servers)\n .flatMap(([serverId, server]) => {\n if (!isManagedConnectorServer(server)) {\n return [];\n }\n const connectorId = server.xopcConnector.connectorId;\n const definition = getConnectorDefinition(connectorId);\n const enabled = server.xopcConnector.enabled !== false;\n const usage = getConnectorUsageFromMarker(server.xopcConnector);\n const lastHealthStatus = usage.lastHealthStatus;\n const connectionStatus: ConnectorInstance['connectionStatus'] = !enabled\n ? 'disabled'\n : lastHealthStatus === 'ok'\n ? 'connected'\n : lastHealthStatus === 'unauthorized'\n ? 'unauthorized'\n : lastHealthStatus\n ? 'error'\n : 'unknown';\n const authStatus: ConnectorInstance['authStatus'] = definition?.auth.mode === 'none'\n ? 'none'\n : lastHealthStatus === 'missing_secret'\n ? 'missing'\n : lastHealthStatus === 'unauthorized'\n ? 'unauthorized'\n : 'unknown';\n const status: ConnectorInstance['status'] = enabled ? (lastHealthStatus === 'ok' ? 'connected' : 'installed') : 'disabled';\n return [\n {\n instanceId: serverId,\n connectorId,\n displayName: definition?.displayName ?? server.xopcConnector.displayName ?? connectorId,\n enabled,\n status,\n connectionStatus,\n authStatus,\n lastConnectedAt: server.xopcConnector.lastConnectedAt,\n lastError: server.xopcConnector.lastError,\n secretStatus: secretStatusForServer(server),\n materialized: {\n type: 'mcp' as const,\n serverId,\n },\n usage,\n audit: getConnectorAuditFromMarker(server.xopcConnector),\n },\n ];\n });\n const genericInstances = Object.entries(config.connectors?.instances ?? {})\n .flatMap(([instanceId, record]) => (\n record && typeof record === 'object' && !Array.isArray(record)\n ? connectorInstanceFromRecord(instanceId, record as Record<string, unknown>)\n : []\n ));\n return [...mcpInstances, ...genericInstances]\n .sort((left, right) => left.displayName.localeCompare(right.displayName));\n}\n\nexport function getConnectorInstance(config: Config, instanceId: string): ConnectorInstance | undefined {\n return listConnectorInstances(config).find((instance) => instance.instanceId === instanceId);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"instances.js","names":[],"sources":["../../../src/connectors/instances.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\nimport { getConnectorDefinition } from './catalog.js';\nimport { isManagedConnectorServer } from './materialize.js';\nimport { getConnectorAuditFromMarker, getConnectorUsageFromMarker } from './usage.js';\nimport type { ConnectorInstance } from './types.js';\n\nfunction readMarkerConfig(marker: unknown): Record<string, unknown> | undefined {\n if (!marker || typeof marker !== 'object' || Array.isArray(marker)) return undefined;\n const config = (marker as Record<string, unknown>).config;\n return config && typeof config === 'object' && !Array.isArray(config)\n ? config as Record<string, unknown>\n : undefined;\n}\n\nfunction secretStatusForServer(server: Record<string, unknown>): Record<string, boolean> {\n const marker = server.xopcConnector as { connectorId?: string } | undefined;\n const definition = marker?.connectorId ? getConnectorDefinition(marker.connectorId) : undefined;\n const env = server.env && typeof server.env === 'object' && !Array.isArray(server.env)\n ? (server.env as Record<string, unknown>)\n : {};\n const status: Record<string, boolean> = {};\n for (const secret of definition?.setup.secrets ?? []) {\n const value = env[secret.key];\n status[secret.key] = Boolean(\n value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n 'xopcSecretRef' in value,\n );\n }\n return status;\n}\n\nfunction connectorInstanceFromRecord(instanceId: string, record: Record<string, unknown>): ConnectorInstance[] {\n const marker = record.xopcConnector;\n if (!marker || typeof marker !== 'object' || Array.isArray(marker)) return [];\n const markerRecord = marker as Record<string, unknown>;\n if (markerRecord.managed !== true || typeof markerRecord.connectorId !== 'string') return [];\n const connectorId = markerRecord.connectorId;\n const definition = getConnectorDefinition(connectorId);\n const runtime = record.runtime && typeof record.runtime === 'object' && !Array.isArray(record.runtime)\n ? record.runtime as Record<string, unknown>\n : {};\n const runtimeType = typeof runtime.type === 'string' ? runtime.type : 'composio';\n const enabled = markerRecord.enabled !== false;\n return [{\n instanceId,\n connectorId,\n displayName: definition?.displayName ?? (typeof markerRecord.displayName === 'string' ? markerRecord.displayName : connectorId),\n enabled,\n status: enabled ? 'installed' : 'disabled',\n connectionStatus: enabled ? 'unknown' : 'disabled',\n authStatus: definition?.auth.mode === 'none' ? 'none' : 'unknown',\n lastConnectedAt: typeof markerRecord.lastConnectedAt === 'string' ? markerRecord.lastConnectedAt : undefined,\n lastError: typeof markerRecord.lastError === 'string' ? markerRecord.lastError : undefined,\n secretStatus: {},\n config: readMarkerConfig(markerRecord),\n materialized: runtimeType === 'composio'\n ? { type: 'composio', id: instanceId }\n : runtimeType === 'channel'\n ? { type: 'channel', id: instanceId }\n : runtimeType === 'nativeTool'\n ? { type: 'nativeTool', id: instanceId }\n : { type: 'memorySource', id: instanceId },\n usage: getConnectorUsageFromMarker(marker),\n audit: getConnectorAuditFromMarker(marker),\n }];\n}\n\nexport function listConnectorInstances(config: Config): ConnectorInstance[] {\n const servers = config.mcp?.servers ?? {};\n const mcpInstances = Object.entries(servers)\n .flatMap(([serverId, server]) => {\n if (!isManagedConnectorServer(server)) {\n return [];\n }\n const connectorId = server.xopcConnector.connectorId;\n const definition = getConnectorDefinition(connectorId);\n const enabled = server.xopcConnector.enabled !== false;\n const usage = getConnectorUsageFromMarker(server.xopcConnector);\n const lastHealthStatus = usage.lastHealthStatus;\n const connectionStatus: ConnectorInstance['connectionStatus'] = !enabled\n ? 'disabled'\n : lastHealthStatus === 'ok'\n ? 'connected'\n : lastHealthStatus === 'unauthorized'\n ? 'unauthorized'\n : lastHealthStatus\n ? 'error'\n : 'unknown';\n const authStatus: ConnectorInstance['authStatus'] = definition?.auth.mode === 'none'\n ? 'none'\n : lastHealthStatus === 'missing_secret'\n ? 'missing'\n : lastHealthStatus === 'unauthorized'\n ? 'unauthorized'\n : 'unknown';\n const status: ConnectorInstance['status'] = enabled ? (lastHealthStatus === 'ok' ? 'connected' : 'installed') : 'disabled';\n return [\n {\n instanceId: serverId,\n connectorId,\n displayName: definition?.displayName ?? server.xopcConnector.displayName ?? connectorId,\n enabled,\n status,\n connectionStatus,\n authStatus,\n lastConnectedAt: server.xopcConnector.lastConnectedAt,\n lastError: server.xopcConnector.lastError,\n secretStatus: secretStatusForServer(server),\n config: readMarkerConfig(server.xopcConnector),\n materialized: {\n type: 'mcp' as const,\n serverId,\n },\n usage,\n audit: getConnectorAuditFromMarker(server.xopcConnector),\n },\n ];\n });\n const genericInstances = Object.entries(config.connectors?.instances ?? {})\n .flatMap(([instanceId, record]) => (\n record && typeof record === 'object' && !Array.isArray(record)\n ? connectorInstanceFromRecord(instanceId, record as Record<string, unknown>)\n : []\n ));\n return [...mcpInstances, ...genericInstances]\n .sort((left, right) => left.displayName.localeCompare(right.displayName));\n}\n\nexport function getConnectorInstance(config: Config, instanceId: string): ConnectorInstance | undefined {\n return listConnectorInstances(config).find((instance) => instance.instanceId === instanceId);\n}\n"],"mappings":";;;;AAMA,SAAS,iBAAiB,QAAsD;AAC9E,KAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,OAAO,CAAE,QAAO,KAAA;CAC3E,MAAM,SAAU,OAAmC;AACnD,QAAO,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,OAAO,GACjE,SACA,KAAA;;AAGN,SAAS,sBAAsB,QAA0D;CACvF,MAAM,SAAS,OAAO;CACtB,MAAM,aAAa,QAAQ,cAAc,uBAAuB,OAAO,YAAY,GAAG,KAAA;CACtF,MAAM,MAAM,OAAO,OAAO,OAAO,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,OAAO,IAAI,GACjF,OAAO,MACR,EAAE;CACN,MAAM,SAAkC,EAAE;AAC1C,MAAK,MAAM,UAAU,YAAY,MAAM,WAAW,EAAE,EAAE;EACpD,MAAM,QAAQ,IAAI,OAAO;AACzB,SAAO,OAAO,OAAO,QACnB,SACE,OAAO,UAAU,YACjB,CAAC,MAAM,QAAQ,MAAM,IACrB,mBAAmB,MACtB;;AAEH,QAAO;;AAGT,SAAS,4BAA4B,YAAoB,QAAsD;CAC7G,MAAM,SAAS,OAAO;AACtB,KAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,OAAO,CAAE,QAAO,EAAE;CAC7E,MAAM,eAAe;AACrB,KAAI,aAAa,YAAY,QAAQ,OAAO,aAAa,gBAAgB,SAAU,QAAO,EAAE;CAC5F,MAAM,cAAc,aAAa;CACjC,MAAM,aAAa,uBAAuB,YAAY;CACtD,MAAM,UAAU,OAAO,WAAW,OAAO,OAAO,YAAY,YAAY,CAAC,MAAM,QAAQ,OAAO,QAAQ,GAClG,OAAO,UACP,EAAE;CACN,MAAM,cAAc,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO;CACtE,MAAM,UAAU,aAAa,YAAY;AACzC,QAAO,CAAC;EACN;EACA;EACA,aAAa,YAAY,gBAAgB,OAAO,aAAa,gBAAgB,WAAW,aAAa,cAAc;EACnH;EACA,QAAQ,UAAU,cAAc;EAChC,kBAAkB,UAAU,YAAY;EACxC,YAAY,YAAY,KAAK,SAAS,SAAS,SAAS;EACxD,iBAAiB,OAAO,aAAa,oBAAoB,WAAW,aAAa,kBAAkB,KAAA;EACnG,WAAW,OAAO,aAAa,cAAc,WAAW,aAAa,YAAY,KAAA;EACjF,cAAc,EAAE;EAChB,QAAQ,iBAAiB,aAAa;EACtC,cAAc,gBAAgB,aAC1B;GAAE,MAAM;GAAY,IAAI;GAAY,GACpC,gBAAgB,YACd;GAAE,MAAM;GAAW,IAAI;GAAY,GACnC,gBAAgB,eACd;GAAE,MAAM;GAAc,IAAI;GAAY,GACtC;GAAE,MAAM;GAAgB,IAAI;GAAY;EAChD,OAAO,4BAA4B,OAAO;EAC1C,OAAO,4BAA4B,OAAO;EAC3C,CAAC;;AAGJ,SAAgB,uBAAuB,QAAqC;CAC1E,MAAM,UAAU,OAAO,KAAK,WAAW,EAAE;CACzC,MAAM,eAAe,OAAO,QAAQ,QAAQ,CACzC,SAAS,CAAC,UAAU,YAAY;AAC/B,MAAI,CAAC,yBAAyB,OAAO,CACnC,QAAO,EAAE;EAEX,MAAM,cAAc,OAAO,cAAc;EACzC,MAAM,aAAa,uBAAuB,YAAY;EACtD,MAAM,UAAU,OAAO,cAAc,YAAY;EACjD,MAAM,QAAQ,4BAA4B,OAAO,cAAc;EAC/D,MAAM,mBAAmB,MAAM;EAC/B,MAAM,mBAA0D,CAAC,UAC7D,aACA,qBAAqB,OACnB,cACA,qBAAqB,iBACnB,iBACA,mBACE,UACA;EACV,MAAM,aAA8C,YAAY,KAAK,SAAS,SAC1E,SACA,qBAAqB,mBACnB,YACA,qBAAqB,iBACnB,iBACA;EACR,MAAM,SAAsC,UAAW,qBAAqB,OAAO,cAAc,cAAe;AAChH,SAAO,CACL;GACE,YAAY;GACZ;GACA,aAAa,YAAY,eAAe,OAAO,cAAc,eAAe;GAC5E;GACA;GACA;GACA;GACA,iBAAiB,OAAO,cAAc;GACtC,WAAW,OAAO,cAAc;GAChC,cAAc,sBAAsB,OAAO;GAC3C,QAAQ,iBAAiB,OAAO,cAAc;GAC9C,cAAc;IACZ,MAAM;IACN;IACD;GACD;GACA,OAAO,4BAA4B,OAAO,cAAc;GACzD,CACF;GACD;CACJ,MAAM,mBAAmB,OAAO,QAAQ,OAAO,YAAY,aAAa,EAAE,CAAC,CACxE,SAAS,CAAC,YAAY,YACrB,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,OAAO,GAC1D,4BAA4B,YAAY,OAAkC,GAC1E,EAAE,CACN;AACJ,QAAO,CAAC,GAAG,cAAc,GAAG,iBAAiB,CAC1C,MAAM,MAAM,UAAU,KAAK,YAAY,cAAc,MAAM,YAAY,CAAC;;AAG7E,SAAgB,qBAAqB,QAAgB,YAAmD;AACtG,QAAO,uBAAuB,OAAO,CAAC,MAAM,aAAa,SAAS,eAAe,WAAW"}
|
|
@@ -53,7 +53,8 @@ function materializeConnectorMcpServer(definition, input) {
|
|
|
53
53
|
managed: true,
|
|
54
54
|
connectorId: definition.id,
|
|
55
55
|
version: definition.version,
|
|
56
|
-
displayName: definition.displayName
|
|
56
|
+
displayName: definition.displayName,
|
|
57
|
+
...input.config && Object.keys(input.config).length > 0 ? { config: input.config } : {}
|
|
57
58
|
};
|
|
58
59
|
const server = {
|
|
59
60
|
...rawServer,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"materialize.js","names":[],"sources":["../../../src/connectors/materialize.ts"],"sourcesContent":["import { McpServerSchema } from '../config/schema.js';\nimport { createConnectorSecretReference } from './secret-store.js';\nimport type { ConnectorDefinition, ConnectorInstallInput, ManagedConnectorMarker } from './types.js';\n\nconst SERVER_ID_PATTERN = /^[a-z][a-z0-9_-]{0,63}$/;\nconst TEMPLATE_PATTERN = /^\\{\\{(secrets|config)\\.([A-Za-z0-9_.-]+)\\}\\}$/;\n\nexport function assertValidConnectorServerId(serverId: string): void {\n if (!SERVER_ID_PATTERN.test(serverId)) {\n throw new Error('Connector server name must start with a lowercase letter and only contain lowercase letters, numbers, dashes, and underscores.');\n }\n}\n\nfunction readInputValue(\n definition: ConnectorDefinition,\n input: ConnectorInstallInput,\n scope: 'secrets' | 'config',\n key: string,\n): unknown {\n if (scope === 'secrets') {\n return createConnectorSecretReference(definition.id, key);\n }\n return input.config?.[key];\n}\n\nfunction resolveTemplateValue(value: unknown, definition: ConnectorDefinition, input: ConnectorInstallInput): unknown {\n if (typeof value !== 'string') {\n return value;\n }\n const match = TEMPLATE_PATTERN.exec(value.trim());\n if (!match) {\n return value;\n }\n return readInputValue(definition, input, match[1] as 'secrets' | 'config', match[2]);\n}\n\nfunction materializeTemplate(value: unknown, definition: ConnectorDefinition, input: ConnectorInstallInput): unknown {\n const resolved = resolveTemplateValue(value, definition, input);\n if (Array.isArray(resolved)) {\n return resolved.map((item) => materializeTemplate(item, definition, input));\n }\n if (resolved && typeof resolved === 'object') {\n const output: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(resolved as Record<string, unknown>)) {\n const materializedChild = materializeTemplate(child, definition, input);\n if (materializedChild !== undefined) {\n output[key] = materializedChild;\n }\n }\n return output;\n }\n return resolved;\n}\n\nfunction assertRequiredInputs(definition: ConnectorDefinition, input: ConnectorInstallInput): void {\n for (const secret of definition.setup.secrets ?? []) {\n const value = input.secrets?.[secret.key];\n if (secret.required && (typeof value !== 'string' || value.trim().length === 0)) {\n throw new Error(`Missing required secret: ${secret.key}`);\n }\n }\n for (const field of definition.setup.config ?? []) {\n const value = input.config?.[field.key];\n if (field.required && (value === undefined || value === null || value === '')) {\n throw new Error(`Missing required config: ${field.key}`);\n }\n }\n}\n\nexport function materializeConnectorMcpServer(\n definition: ConnectorDefinition,\n input: ConnectorInstallInput,\n): { serverId: string; server: Record<string, unknown> } {\n assertRequiredInputs(definition, input);\n if (definition.runtime.type !== 'mcp') {\n throw new Error(`Unsupported connector runtime: ${definition.runtime.type}`);\n }\n\n const rawServerId = materializeTemplate(definition.runtime.serverId, definition, input);\n if (typeof rawServerId !== 'string') {\n throw new Error('Connector server name must be a string.');\n }\n const serverId = rawServerId.trim();\n assertValidConnectorServerId(serverId);\n\n const rawServer = materializeTemplate(definition.runtime.serverTemplate, definition, input);\n if (!rawServer || typeof rawServer !== 'object' || Array.isArray(rawServer)) {\n throw new Error('Connector MCP server template must resolve to a JSON object.');\n }\n\n const marker: ManagedConnectorMarker = {\n managed: true,\n connectorId: definition.id,\n version: definition.version,\n displayName: definition.displayName,\n };\n const server = {\n ...(rawServer as Record<string, unknown>),\n xopcConnector: marker,\n };\n const parsed = McpServerSchema.safeParse(server);\n if (!parsed.success) {\n throw new Error(parsed.error.issues[0]?.message ?? 'Invalid MCP server config.');\n }\n return { serverId, server };\n}\n\nexport function isManagedConnectorServer(server: unknown): server is Record<string, unknown> & { xopcConnector: ManagedConnectorMarker } {\n if (!server || typeof server !== 'object' || Array.isArray(server)) {\n return false;\n }\n const marker = (server as Record<string, unknown>).xopcConnector;\n return Boolean(\n marker &&\n typeof marker === 'object' &&\n !Array.isArray(marker) &&\n (marker as Record<string, unknown>).managed === true &&\n typeof (marker as Record<string, unknown>).connectorId === 'string',\n );\n}\n"],"mappings":";;;aAAsD;AAItD,MAAM,oBAAoB;AAC1B,MAAM,mBAAmB;AAEzB,SAAgB,6BAA6B,UAAwB;AACnE,KAAI,CAAC,kBAAkB,KAAK,SAAS,CACnC,OAAM,IAAI,MAAM,iIAAiI;;AAIrJ,SAAS,eACP,YACA,OACA,OACA,KACS;AACT,KAAI,UAAU,UACZ,QAAO,+BAA+B,WAAW,IAAI,IAAI;AAE3D,QAAO,MAAM,SAAS;;AAGxB,SAAS,qBAAqB,OAAgB,YAAiC,OAAuC;AACpH,KAAI,OAAO,UAAU,SACnB,QAAO;CAET,MAAM,QAAQ,iBAAiB,KAAK,MAAM,MAAM,CAAC;AACjD,KAAI,CAAC,MACH,QAAO;AAET,QAAO,eAAe,YAAY,OAAO,MAAM,IAA4B,MAAM,GAAG;;AAGtF,SAAS,oBAAoB,OAAgB,YAAiC,OAAuC;CACnH,MAAM,WAAW,qBAAqB,OAAO,YAAY,MAAM;AAC/D,KAAI,MAAM,QAAQ,SAAS,CACzB,QAAO,SAAS,KAAK,SAAS,oBAAoB,MAAM,YAAY,MAAM,CAAC;AAE7E,KAAI,YAAY,OAAO,aAAa,UAAU;EAC5C,MAAM,SAAkC,EAAE;AAC1C,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,SAAoC,EAAE;GAC9E,MAAM,oBAAoB,oBAAoB,OAAO,YAAY,MAAM;AACvE,OAAI,sBAAsB,KAAA,EACxB,QAAO,OAAO;;AAGlB,SAAO;;AAET,QAAO;;AAGT,SAAS,qBAAqB,YAAiC,OAAoC;AACjG,MAAK,MAAM,UAAU,WAAW,MAAM,WAAW,EAAE,EAAE;EACnD,MAAM,QAAQ,MAAM,UAAU,OAAO;AACrC,MAAI,OAAO,aAAa,OAAO,UAAU,YAAY,MAAM,MAAM,CAAC,WAAW,GAC3E,OAAM,IAAI,MAAM,4BAA4B,OAAO,MAAM;;AAG7D,MAAK,MAAM,SAAS,WAAW,MAAM,UAAU,EAAE,EAAE;EACjD,MAAM,QAAQ,MAAM,SAAS,MAAM;AACnC,MAAI,MAAM,aAAa,UAAU,KAAA,KAAa,UAAU,QAAQ,UAAU,IACxE,OAAM,IAAI,MAAM,4BAA4B,MAAM,MAAM;;;AAK9D,SAAgB,8BACd,YACA,OACuD;AACvD,sBAAqB,YAAY,MAAM;AACvC,KAAI,WAAW,QAAQ,SAAS,MAC9B,OAAM,IAAI,MAAM,kCAAkC,WAAW,QAAQ,OAAO;CAG9E,MAAM,cAAc,oBAAoB,WAAW,QAAQ,UAAU,YAAY,MAAM;AACvF,KAAI,OAAO,gBAAgB,SACzB,OAAM,IAAI,MAAM,0CAA0C;CAE5D,MAAM,WAAW,YAAY,MAAM;AACnC,8BAA6B,SAAS;CAEtC,MAAM,YAAY,oBAAoB,WAAW,QAAQ,gBAAgB,YAAY,MAAM;AAC3F,KAAI,CAAC,aAAa,OAAO,cAAc,YAAY,MAAM,QAAQ,UAAU,CACzE,OAAM,IAAI,MAAM,+DAA+D;CAGjF,MAAM,SAAiC;EACrC,SAAS;EACT,aAAa,WAAW;EACxB,SAAS,WAAW;EACpB,aAAa,WAAW;
|
|
1
|
+
{"version":3,"file":"materialize.js","names":[],"sources":["../../../src/connectors/materialize.ts"],"sourcesContent":["import { McpServerSchema } from '../config/schema.js';\nimport { createConnectorSecretReference } from './secret-store.js';\nimport type { ConnectorDefinition, ConnectorInstallInput, ManagedConnectorMarker } from './types.js';\n\nconst SERVER_ID_PATTERN = /^[a-z][a-z0-9_-]{0,63}$/;\nconst TEMPLATE_PATTERN = /^\\{\\{(secrets|config)\\.([A-Za-z0-9_.-]+)\\}\\}$/;\n\nexport function assertValidConnectorServerId(serverId: string): void {\n if (!SERVER_ID_PATTERN.test(serverId)) {\n throw new Error('Connector server name must start with a lowercase letter and only contain lowercase letters, numbers, dashes, and underscores.');\n }\n}\n\nfunction readInputValue(\n definition: ConnectorDefinition,\n input: ConnectorInstallInput,\n scope: 'secrets' | 'config',\n key: string,\n): unknown {\n if (scope === 'secrets') {\n return createConnectorSecretReference(definition.id, key);\n }\n return input.config?.[key];\n}\n\nfunction resolveTemplateValue(value: unknown, definition: ConnectorDefinition, input: ConnectorInstallInput): unknown {\n if (typeof value !== 'string') {\n return value;\n }\n const match = TEMPLATE_PATTERN.exec(value.trim());\n if (!match) {\n return value;\n }\n return readInputValue(definition, input, match[1] as 'secrets' | 'config', match[2]);\n}\n\nfunction materializeTemplate(value: unknown, definition: ConnectorDefinition, input: ConnectorInstallInput): unknown {\n const resolved = resolveTemplateValue(value, definition, input);\n if (Array.isArray(resolved)) {\n return resolved.map((item) => materializeTemplate(item, definition, input));\n }\n if (resolved && typeof resolved === 'object') {\n const output: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(resolved as Record<string, unknown>)) {\n const materializedChild = materializeTemplate(child, definition, input);\n if (materializedChild !== undefined) {\n output[key] = materializedChild;\n }\n }\n return output;\n }\n return resolved;\n}\n\nfunction assertRequiredInputs(definition: ConnectorDefinition, input: ConnectorInstallInput): void {\n for (const secret of definition.setup.secrets ?? []) {\n const value = input.secrets?.[secret.key];\n if (secret.required && (typeof value !== 'string' || value.trim().length === 0)) {\n throw new Error(`Missing required secret: ${secret.key}`);\n }\n }\n for (const field of definition.setup.config ?? []) {\n const value = input.config?.[field.key];\n if (field.required && (value === undefined || value === null || value === '')) {\n throw new Error(`Missing required config: ${field.key}`);\n }\n }\n}\n\nexport function materializeConnectorMcpServer(\n definition: ConnectorDefinition,\n input: ConnectorInstallInput,\n): { serverId: string; server: Record<string, unknown> } {\n assertRequiredInputs(definition, input);\n if (definition.runtime.type !== 'mcp') {\n throw new Error(`Unsupported connector runtime: ${definition.runtime.type}`);\n }\n\n const rawServerId = materializeTemplate(definition.runtime.serverId, definition, input);\n if (typeof rawServerId !== 'string') {\n throw new Error('Connector server name must be a string.');\n }\n const serverId = rawServerId.trim();\n assertValidConnectorServerId(serverId);\n\n const rawServer = materializeTemplate(definition.runtime.serverTemplate, definition, input);\n if (!rawServer || typeof rawServer !== 'object' || Array.isArray(rawServer)) {\n throw new Error('Connector MCP server template must resolve to a JSON object.');\n }\n\n const marker: ManagedConnectorMarker = {\n managed: true,\n connectorId: definition.id,\n version: definition.version,\n displayName: definition.displayName,\n ...(input.config && Object.keys(input.config).length > 0 ? { config: input.config } : {}),\n };\n const server = {\n ...(rawServer as Record<string, unknown>),\n xopcConnector: marker,\n };\n const parsed = McpServerSchema.safeParse(server);\n if (!parsed.success) {\n throw new Error(parsed.error.issues[0]?.message ?? 'Invalid MCP server config.');\n }\n return { serverId, server };\n}\n\nexport function isManagedConnectorServer(server: unknown): server is Record<string, unknown> & { xopcConnector: ManagedConnectorMarker } {\n if (!server || typeof server !== 'object' || Array.isArray(server)) {\n return false;\n }\n const marker = (server as Record<string, unknown>).xopcConnector;\n return Boolean(\n marker &&\n typeof marker === 'object' &&\n !Array.isArray(marker) &&\n (marker as Record<string, unknown>).managed === true &&\n typeof (marker as Record<string, unknown>).connectorId === 'string',\n );\n}\n"],"mappings":"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"}
|
|
@@ -12,6 +12,9 @@ function readArray(value) {
|
|
|
12
12
|
function readRecord(value) {
|
|
13
13
|
return value && typeof value === "object" && !Array.isArray(value) ? value : void 0;
|
|
14
14
|
}
|
|
15
|
+
function isHttpUrl(value) {
|
|
16
|
+
return value?.startsWith("http://") || value?.startsWith("https://") || false;
|
|
17
|
+
}
|
|
15
18
|
function slugFrom(value) {
|
|
16
19
|
return value.trim().toLowerCase().replace(/^@/, "").replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 64) || "modelscope-mcp";
|
|
17
20
|
}
|
|
@@ -38,18 +41,29 @@ function secretFieldsFromEnvSchema(schema) {
|
|
|
38
41
|
};
|
|
39
42
|
});
|
|
40
43
|
}
|
|
41
|
-
function
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
44
|
+
function readMcpServerConfigs(value) {
|
|
45
|
+
const configItems = Array.isArray(value) ? value : [value];
|
|
46
|
+
const configs = [];
|
|
47
|
+
for (const config of configItems) {
|
|
48
|
+
const configRecord = readRecord(config);
|
|
49
|
+
if (!configRecord) continue;
|
|
50
|
+
const mcpServers = readRecord(configRecord?.mcpServers);
|
|
51
|
+
if (!mcpServers) {
|
|
52
|
+
configs.push(configRecord);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
45
55
|
for (const value of Object.values(mcpServers)) {
|
|
46
56
|
const serverConfig = readRecord(value);
|
|
47
|
-
if (serverConfig
|
|
57
|
+
if (serverConfig) configs.push(serverConfig);
|
|
48
58
|
}
|
|
49
59
|
}
|
|
60
|
+
return configs;
|
|
61
|
+
}
|
|
62
|
+
function firstMcpServerConfig(server, predicate = (config) => Boolean(readString(config.command))) {
|
|
63
|
+
for (const config of readMcpServerConfigs(server.ServerConfig ?? server.serverConfig)) if (predicate(config)) return config;
|
|
50
64
|
}
|
|
51
65
|
function secretFieldsFromServerConfig(server) {
|
|
52
|
-
const env = readRecord(firstMcpServerConfig(server)?.env);
|
|
66
|
+
const env = readRecord((firstMcpServerConfig(server, (candidate) => Boolean(readRecord(candidate.env))) ?? firstMcpServerConfig(server))?.env);
|
|
53
67
|
if (!env) return [];
|
|
54
68
|
return Object.keys(env).map((key) => ({
|
|
55
69
|
key,
|
|
@@ -77,9 +91,12 @@ function normalizeEnv(env, secrets) {
|
|
|
77
91
|
for (const field of secrets) if (output[field.key] === void 0) output[field.key] = `{{secrets.${field.key}}}`;
|
|
78
92
|
return Object.keys(output).length ? output : void 0;
|
|
79
93
|
}
|
|
94
|
+
function transportFromConfig(config, fallback) {
|
|
95
|
+
return (readString(config.transport ?? config.type)?.toLowerCase())?.includes("sse") ? "sse" : fallback;
|
|
96
|
+
}
|
|
80
97
|
function normalizeServerTemplate(server, secrets) {
|
|
81
98
|
const deployedUrl = readString(server.DeployedUrl ?? server.deployedUrl);
|
|
82
|
-
if (
|
|
99
|
+
if (isHttpUrl(deployedUrl)) return {
|
|
83
100
|
url: deployedUrl,
|
|
84
101
|
transport: readString(server.DeployedUrlTransportType ?? server.deployedUrlTransportType)?.toLowerCase() === "sse" ? "sse" : "streamable-http"
|
|
85
102
|
};
|
|
@@ -89,13 +106,21 @@ function normalizeServerTemplate(server, secrets) {
|
|
|
89
106
|
"SSEServerConfig",
|
|
90
107
|
"sseServerConfig"
|
|
91
108
|
]) {
|
|
92
|
-
const
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
url
|
|
96
|
-
|
|
97
|
-
|
|
109
|
+
const fallbackTransport = key.toLowerCase().includes("sse") ? "sse" : "streamable-http";
|
|
110
|
+
for (const config of readMcpServerConfigs(server[key])) {
|
|
111
|
+
const url = readString(config.url ?? config.endpoint);
|
|
112
|
+
if (isHttpUrl(url)) return {
|
|
113
|
+
url,
|
|
114
|
+
transport: transportFromConfig(config, fallbackTransport)
|
|
115
|
+
};
|
|
116
|
+
}
|
|
98
117
|
}
|
|
118
|
+
const remoteConfig = firstMcpServerConfig(server, (candidate) => isHttpUrl(readString(candidate.url ?? candidate.endpoint)));
|
|
119
|
+
const remoteUrl = readString(remoteConfig?.url ?? remoteConfig?.endpoint);
|
|
120
|
+
if (isHttpUrl(remoteUrl) && remoteConfig) return {
|
|
121
|
+
url: remoteUrl,
|
|
122
|
+
transport: transportFromConfig(remoteConfig, "streamable-http")
|
|
123
|
+
};
|
|
99
124
|
const config = firstMcpServerConfig(server);
|
|
100
125
|
const command = readString(config?.command);
|
|
101
126
|
if (!command) return void 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelscope.js","names":[],"sources":["../../../../src/connectors/registries/modelscope.ts"],"sourcesContent":["import type { ConnectorDefinition, ConnectorSecretField } from '../types.js';\nimport type { ConnectorRegistryAdapter, ConnectorRegistrySearchParams, ConnectorRegistrySearchResult } from './types.js';\n\nconst DEFAULT_BASE_URL = 'https://www.modelscope.cn';\n\nfunction modelscopeBaseUrl(): string {\n return process.env.XOPC_MODELSCOPE_REGISTRY_URL?.trim().replace(/\\/+$/, '') || DEFAULT_BASE_URL;\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction readArray(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\nfunction readRecord(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\n}\n\nfunction slugFrom(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/^@/, '')\n .replace(/[^a-z0-9_-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 64) || 'modelscope-mcp';\n}\n\nfunction categoryFromModelScope(categories: unknown): ConnectorDefinition['category'] {\n const text = readArray(categories).map((item) => readString(item)).filter(Boolean).join(' ').toLowerCase();\n if (text.includes('browser')) return 'browser';\n if (text.includes('automation')) return 'automation';\n if (text.includes('database') || text.includes('data')) return 'data';\n if (text.includes('code') || text.includes('developer')) return 'code';\n if (text.includes('docs') || text.includes('knowledge')) return 'docs';\n return 'custom';\n}\n\nfunction secretFieldsFromEnvSchema(schema: unknown): ConnectorSecretField[] {\n const record = readRecord(schema);\n const properties = readRecord(record?.properties);\n if (!properties) return [];\n const required = new Set(readArray(record?.required).map((item) => readString(item)).filter((item): item is string => Boolean(item)));\n return Object.entries(properties).map(([key, value]) => {\n const field = readRecord(value);\n return {\n key,\n label: key,\n description: readString(field?.description),\n required: required.size === 0 ? true : required.has(key),\n } satisfies ConnectorSecretField;\n });\n}\n\nfunction firstMcpServerConfig(server: Record<string, unknown>): Record<string, unknown> | undefined {\n for (const config of readArray(server.ServerConfig ?? server.serverConfig)) {\n const configRecord = readRecord(config);\n const mcpServers = readRecord(configRecord?.mcpServers);\n if (!mcpServers) continue;\n for (const value of Object.values(mcpServers)) {\n const serverConfig = readRecord(value);\n if (serverConfig && readString(serverConfig.command)) return serverConfig;\n }\n }\n return undefined;\n}\n\nfunction secretFieldsFromServerConfig(server: Record<string, unknown>): ConnectorSecretField[] {\n const config = firstMcpServerConfig(server);\n const env = readRecord(config?.env);\n if (!env) return [];\n return Object.keys(env).map((key) => ({\n key,\n label: key,\n description: `Environment variable required by the ModelScope MCP server config.`,\n required: true,\n } satisfies ConnectorSecretField));\n}\n\nfunction mergeSecretFields(...groups: ConnectorSecretField[][]): ConnectorSecretField[] {\n const merged = new Map<string, ConnectorSecretField>();\n for (const group of groups) {\n for (const field of group) {\n const previous = merged.get(field.key);\n merged.set(field.key, {\n ...field,\n description: previous?.description ?? field.description,\n required: previous?.required ?? field.required,\n });\n }\n }\n return [...merged.values()];\n}\n\nfunction normalizeEnv(env: unknown, secrets: ConnectorSecretField[]): Record<string, unknown> | undefined {\n const envRecord = readRecord(env);\n const output: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(envRecord ?? {})) {\n output[key] = secrets.some((field) => field.key === key) ? `{{secrets.${key}}}` : value;\n }\n for (const field of secrets) {\n if (output[field.key] === undefined) output[field.key] = `{{secrets.${field.key}}}`;\n }\n return Object.keys(output).length ? output : undefined;\n}\n\nfunction normalizeServerTemplate(server: Record<string, unknown>, secrets: ConnectorSecretField[]): Record<string, unknown> | undefined {\n const deployedUrl = readString(server.DeployedUrl ?? server.deployedUrl);\n if (deployedUrl?.startsWith('http://') || deployedUrl?.startsWith('https://')) {\n const transport = readString(server.DeployedUrlTransportType ?? server.deployedUrlTransportType)?.toLowerCase();\n return { url: deployedUrl, transport: transport === 'sse' ? 'sse' : 'streamable-http' };\n }\n\n for (const key of ['StreamableHTTPServerConfig', 'streamableHTTPServerConfig', 'SSEServerConfig', 'sseServerConfig']) {\n const config = readRecord(server[key]);\n const url = readString(config?.url ?? config?.endpoint);\n if (url?.startsWith('http://') || url?.startsWith('https://')) {\n return { url, transport: key.toLowerCase().includes('sse') ? 'sse' : 'streamable-http' };\n }\n }\n\n const config = firstMcpServerConfig(server);\n const command = readString(config?.command);\n if (!command) return undefined;\n const args = readArray(config?.args).map((arg) => String(arg));\n const env = normalizeEnv(config.env, secrets);\n return {\n command,\n ...(args.length ? { args } : {}),\n ...(env ? { env } : {}),\n ...(readString(config.cwd) ? { cwd: readString(config.cwd) } : {}),\n };\n}\n\nfunction connectorFromModelScopeServer(server: Record<string, unknown>): ConnectorDefinition | undefined {\n const name = readString(server.Name ?? server.name);\n const path = readString(server.Path ?? server.path ?? server.FromSitePath ?? server.fromSitePath);\n const displayName = readString(server.ChineseName ?? server.DisplayName ?? server.displayName) || name;\n if (!name || !displayName) return undefined;\n\n const qualifiedName = path ? `${path}/${name}` : name;\n const serverId = slugFrom(qualifiedName);\n const secrets = mergeSecretFields(\n secretFieldsFromEnvSchema(server.EnvSchema ?? server.envSchema),\n secretFieldsFromServerConfig(server),\n );\n const serverTemplate = normalizeServerTemplate(server, secrets);\n if (!serverTemplate) return undefined;\n\n const isRemote = typeof serverTemplate.url === 'string';\n const tags = [\n ...readArray(server.Category ?? server.category).map((tag) => readString(tag)).filter((tag): tag is string => Boolean(tag)),\n ...readArray(server.Tags ?? server.tags).map((tag) => readString(tag)).filter((tag): tag is string => Boolean(tag)),\n 'modelscope',\n 'registry',\n 'mcp',\n ];\n\n return {\n id: `modelscope-${serverId}`,\n version: readString(server.Version ?? server.version) ?? 'registry',\n displayName,\n description: readString(server.Abstract ?? server.AbstractCN ?? server.description) ?? 'MCP server from ModelScope MCP registry.',\n category: categoryFromModelScope(server.Category ?? server.category),\n kind: 'mcp',\n source: 'registry',\n capabilities: isRemote\n ? ['tools', 'resources', 'prompts', 'runtime.mcp.streamableHttp']\n : ['tools', 'resources', 'prompts', 'runtime.mcp.stdio'],\n tags: Array.from(new Set(tags)).slice(0, 8),\n auth: { mode: secrets.length ? 'apiKey' : 'none' },\n setup: { secrets: secrets.length ? secrets : undefined },\n runtime: {\n type: 'mcp',\n serverId,\n serverTemplate,\n },\n };\n}\n\nfunction readNumber(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\nfunction extractMcpServers(payload: unknown): { servers: Record<string, unknown>[]; total?: number } {\n const root = readRecord(payload);\n const data = readRecord(root?.Data);\n const nestedData = readRecord(data?.Data) ?? data;\n const mcp = readRecord(nestedData?.Mcp ?? nestedData?.McpServer ?? nestedData?.mcp);\n const servers = readArray(mcp?.McpServers ?? mcp?.servers ?? mcp?.items)\n .map((item) => readRecord(item))\n .filter((item): item is Record<string, unknown> => Boolean(item));\n const total = typeof mcp?.TotalCount === 'number' ? mcp.TotalCount : undefined;\n return { servers, total };\n}\n\nasync function fetchModelScopeMcp(params: ConnectorRegistrySearchParams): Promise<unknown> {\n const url = new URL('/api/v1/dolphin/agg', modelscopeBaseUrl());\n const body = {\n PageSize: Math.min(Math.max(params.pageSize ?? 24, 1), 100),\n PageNumber: Math.max(params.page ?? 1, 1),\n Query: params.query?.trim() ?? '',\n Criterion: [],\n };\n const response = await fetch(url, {\n method: 'PUT',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n 'x-modelscope-accept-language': 'zh_CN',\n },\n body: JSON.stringify(body),\n });\n if (!response.ok) throw new Error(`ModelScope registry returned ${response.status}`);\n return response.json();\n}\n\nexport const modelscopeRegistryAdapter: ConnectorRegistryAdapter = {\n source: 'modelscope',\n displayName: 'ModelScope',\n async search(params: ConnectorRegistrySearchParams): Promise<ConnectorRegistrySearchResult> {\n const payload = await fetchModelScopeMcp(params);\n const { servers, total } = extractMcpServers(payload);\n const pageSize = Math.min(Math.max(params.pageSize ?? 24, 1), 100);\n return {\n source: 'modelscope',\n connectors: servers\n .toSorted((a, b) => readNumber(b.CallVolume ?? b.callVolume) - readNumber(a.CallVolume ?? a.callVolume))\n .map(connectorFromModelScopeServer)\n .filter((item): item is ConnectorDefinition => Boolean(item)),\n totalPages: total === undefined ? undefined : Math.ceil(total / pageSize),\n };\n },\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"modelscope.js","names":[],"sources":["../../../../src/connectors/registries/modelscope.ts"],"sourcesContent":["import type { ConnectorDefinition, ConnectorSecretField } from '../types.js';\nimport type { ConnectorRegistryAdapter, ConnectorRegistrySearchParams, ConnectorRegistrySearchResult } from './types.js';\n\nconst DEFAULT_BASE_URL = 'https://www.modelscope.cn';\n\nfunction modelscopeBaseUrl(): string {\n return process.env.XOPC_MODELSCOPE_REGISTRY_URL?.trim().replace(/\\/+$/, '') || DEFAULT_BASE_URL;\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction readArray(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\nfunction readRecord(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\n}\n\nfunction isHttpUrl(value: string | undefined): value is string {\n return value?.startsWith('http://') || value?.startsWith('https://') || false;\n}\n\nfunction slugFrom(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/^@/, '')\n .replace(/[^a-z0-9_-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 64) || 'modelscope-mcp';\n}\n\nfunction categoryFromModelScope(categories: unknown): ConnectorDefinition['category'] {\n const text = readArray(categories).map((item) => readString(item)).filter(Boolean).join(' ').toLowerCase();\n if (text.includes('browser')) return 'browser';\n if (text.includes('automation')) return 'automation';\n if (text.includes('database') || text.includes('data')) return 'data';\n if (text.includes('code') || text.includes('developer')) return 'code';\n if (text.includes('docs') || text.includes('knowledge')) return 'docs';\n return 'custom';\n}\n\nfunction secretFieldsFromEnvSchema(schema: unknown): ConnectorSecretField[] {\n const record = readRecord(schema);\n const properties = readRecord(record?.properties);\n if (!properties) return [];\n const required = new Set(readArray(record?.required).map((item) => readString(item)).filter((item): item is string => Boolean(item)));\n return Object.entries(properties).map(([key, value]) => {\n const field = readRecord(value);\n return {\n key,\n label: key,\n description: readString(field?.description),\n required: required.size === 0 ? true : required.has(key),\n } satisfies ConnectorSecretField;\n });\n}\n\nfunction readMcpServerConfigs(value: unknown): Record<string, unknown>[] {\n const configItems = Array.isArray(value) ? value : [value];\n const configs: Record<string, unknown>[] = [];\n for (const config of configItems) {\n const configRecord = readRecord(config);\n if (!configRecord) continue;\n const mcpServers = readRecord(configRecord?.mcpServers);\n if (!mcpServers) {\n configs.push(configRecord);\n continue;\n }\n for (const value of Object.values(mcpServers)) {\n const serverConfig = readRecord(value);\n if (serverConfig) configs.push(serverConfig);\n }\n }\n return configs;\n}\n\nfunction firstMcpServerConfig(\n server: Record<string, unknown>,\n predicate: (config: Record<string, unknown>) => boolean = (config) => Boolean(readString(config.command)),\n): Record<string, unknown> | undefined {\n for (const config of readMcpServerConfigs(server.ServerConfig ?? server.serverConfig)) {\n if (predicate(config)) return config;\n }\n return undefined;\n}\n\nfunction secretFieldsFromServerConfig(server: Record<string, unknown>): ConnectorSecretField[] {\n const config = firstMcpServerConfig(server, (candidate) => Boolean(readRecord(candidate.env)))\n ?? firstMcpServerConfig(server);\n const env = readRecord(config?.env);\n if (!env) return [];\n return Object.keys(env).map((key) => ({\n key,\n label: key,\n description: `Environment variable required by the ModelScope MCP server config.`,\n required: true,\n } satisfies ConnectorSecretField));\n}\n\nfunction mergeSecretFields(...groups: ConnectorSecretField[][]): ConnectorSecretField[] {\n const merged = new Map<string, ConnectorSecretField>();\n for (const group of groups) {\n for (const field of group) {\n const previous = merged.get(field.key);\n merged.set(field.key, {\n ...field,\n description: previous?.description ?? field.description,\n required: previous?.required ?? field.required,\n });\n }\n }\n return [...merged.values()];\n}\n\nfunction normalizeEnv(env: unknown, secrets: ConnectorSecretField[]): Record<string, unknown> | undefined {\n const envRecord = readRecord(env);\n const output: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(envRecord ?? {})) {\n output[key] = secrets.some((field) => field.key === key) ? `{{secrets.${key}}}` : value;\n }\n for (const field of secrets) {\n if (output[field.key] === undefined) output[field.key] = `{{secrets.${field.key}}}`;\n }\n return Object.keys(output).length ? output : undefined;\n}\n\nfunction transportFromConfig(config: Record<string, unknown>, fallback: 'sse' | 'streamable-http'): 'sse' | 'streamable-http' {\n const raw = readString(config.transport ?? config.type)?.toLowerCase();\n return raw?.includes('sse') ? 'sse' : fallback;\n}\n\nfunction normalizeServerTemplate(server: Record<string, unknown>, secrets: ConnectorSecretField[]): Record<string, unknown> | undefined {\n const deployedUrl = readString(server.DeployedUrl ?? server.deployedUrl);\n if (isHttpUrl(deployedUrl)) {\n const transport = readString(server.DeployedUrlTransportType ?? server.deployedUrlTransportType)?.toLowerCase();\n return { url: deployedUrl, transport: transport === 'sse' ? 'sse' : 'streamable-http' };\n }\n\n for (const key of ['StreamableHTTPServerConfig', 'streamableHTTPServerConfig', 'SSEServerConfig', 'sseServerConfig']) {\n const fallbackTransport = key.toLowerCase().includes('sse') ? 'sse' : 'streamable-http';\n for (const config of readMcpServerConfigs(server[key])) {\n const url = readString(config.url ?? config.endpoint);\n if (isHttpUrl(url)) {\n return { url, transport: transportFromConfig(config, fallbackTransport) };\n }\n }\n }\n\n const remoteConfig = firstMcpServerConfig(server, (candidate) => isHttpUrl(readString(candidate.url ?? candidate.endpoint)));\n const remoteUrl = readString(remoteConfig?.url ?? remoteConfig?.endpoint);\n if (isHttpUrl(remoteUrl) && remoteConfig) {\n return { url: remoteUrl, transport: transportFromConfig(remoteConfig, 'streamable-http') };\n }\n\n const config = firstMcpServerConfig(server);\n const command = readString(config?.command);\n if (!command) return undefined;\n const args = readArray(config?.args).map((arg) => String(arg));\n const env = normalizeEnv(config.env, secrets);\n return {\n command,\n ...(args.length ? { args } : {}),\n ...(env ? { env } : {}),\n ...(readString(config.cwd) ? { cwd: readString(config.cwd) } : {}),\n };\n}\n\nfunction connectorFromModelScopeServer(server: Record<string, unknown>): ConnectorDefinition | undefined {\n const name = readString(server.Name ?? server.name);\n const path = readString(server.Path ?? server.path ?? server.FromSitePath ?? server.fromSitePath);\n const displayName = readString(server.ChineseName ?? server.DisplayName ?? server.displayName) || name;\n if (!name || !displayName) return undefined;\n\n const qualifiedName = path ? `${path}/${name}` : name;\n const serverId = slugFrom(qualifiedName);\n const secrets = mergeSecretFields(\n secretFieldsFromEnvSchema(server.EnvSchema ?? server.envSchema),\n secretFieldsFromServerConfig(server),\n );\n const serverTemplate = normalizeServerTemplate(server, secrets);\n if (!serverTemplate) return undefined;\n\n const isRemote = typeof serverTemplate.url === 'string';\n const tags = [\n ...readArray(server.Category ?? server.category).map((tag) => readString(tag)).filter((tag): tag is string => Boolean(tag)),\n ...readArray(server.Tags ?? server.tags).map((tag) => readString(tag)).filter((tag): tag is string => Boolean(tag)),\n 'modelscope',\n 'registry',\n 'mcp',\n ];\n\n return {\n id: `modelscope-${serverId}`,\n version: readString(server.Version ?? server.version) ?? 'registry',\n displayName,\n description: readString(server.Abstract ?? server.AbstractCN ?? server.description) ?? 'MCP server from ModelScope MCP registry.',\n category: categoryFromModelScope(server.Category ?? server.category),\n kind: 'mcp',\n source: 'registry',\n capabilities: isRemote\n ? ['tools', 'resources', 'prompts', 'runtime.mcp.streamableHttp']\n : ['tools', 'resources', 'prompts', 'runtime.mcp.stdio'],\n tags: Array.from(new Set(tags)).slice(0, 8),\n auth: { mode: secrets.length ? 'apiKey' : 'none' },\n setup: { secrets: secrets.length ? secrets : undefined },\n runtime: {\n type: 'mcp',\n serverId,\n serverTemplate,\n },\n };\n}\n\nfunction readNumber(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\nfunction extractMcpServers(payload: unknown): { servers: Record<string, unknown>[]; total?: number } {\n const root = readRecord(payload);\n const data = readRecord(root?.Data);\n const nestedData = readRecord(data?.Data) ?? data;\n const mcp = readRecord(nestedData?.Mcp ?? nestedData?.McpServer ?? nestedData?.mcp);\n const servers = readArray(mcp?.McpServers ?? mcp?.servers ?? mcp?.items)\n .map((item) => readRecord(item))\n .filter((item): item is Record<string, unknown> => Boolean(item));\n const total = typeof mcp?.TotalCount === 'number' ? mcp.TotalCount : undefined;\n return { servers, total };\n}\n\nasync function fetchModelScopeMcp(params: ConnectorRegistrySearchParams): Promise<unknown> {\n const url = new URL('/api/v1/dolphin/agg', modelscopeBaseUrl());\n const body = {\n PageSize: Math.min(Math.max(params.pageSize ?? 24, 1), 100),\n PageNumber: Math.max(params.page ?? 1, 1),\n Query: params.query?.trim() ?? '',\n Criterion: [],\n };\n const response = await fetch(url, {\n method: 'PUT',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n 'x-modelscope-accept-language': 'zh_CN',\n },\n body: JSON.stringify(body),\n });\n if (!response.ok) throw new Error(`ModelScope registry returned ${response.status}`);\n return response.json();\n}\n\nexport const modelscopeRegistryAdapter: ConnectorRegistryAdapter = {\n source: 'modelscope',\n displayName: 'ModelScope',\n async search(params: ConnectorRegistrySearchParams): Promise<ConnectorRegistrySearchResult> {\n const payload = await fetchModelScopeMcp(params);\n const { servers, total } = extractMcpServers(payload);\n const pageSize = Math.min(Math.max(params.pageSize ?? 24, 1), 100);\n return {\n source: 'modelscope',\n connectors: servers\n .toSorted((a, b) => readNumber(b.CallVolume ?? b.callVolume) - readNumber(a.CallVolume ?? a.callVolume))\n .map(connectorFromModelScopeServer)\n .filter((item): item is ConnectorDefinition => Boolean(item)),\n totalPages: total === undefined ? undefined : Math.ceil(total / pageSize),\n };\n },\n};\n"],"mappings":";AAGA,MAAM,mBAAmB;AAEzB,SAAS,oBAA4B;AACnC,QAAO,QAAQ,IAAI,8BAA8B,MAAM,CAAC,QAAQ,QAAQ,GAAG,IAAI;;AAGjF,SAAS,WAAW,OAAoC;AACtD,QAAO,OAAO,UAAU,YAAY,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,KAAA;;AAGpE,SAAS,UAAU,OAA2B;AAC5C,QAAO,MAAM,QAAQ,MAAM,GAAG,QAAQ,EAAE;;AAG1C,SAAS,WAAW,OAAqD;AACvE,QAAO,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG,QAAmC,KAAA;;AAG1G,SAAS,UAAU,OAA4C;AAC7D,QAAO,OAAO,WAAW,UAAU,IAAI,OAAO,WAAW,WAAW,IAAI;;AAG1E,SAAS,SAAS,OAAuB;AACvC,QAAO,MACJ,MAAM,CACN,aAAa,CACb,QAAQ,MAAM,GAAG,CACjB,QAAQ,iBAAiB,IAAI,CAC7B,QAAQ,YAAY,GAAG,CACvB,MAAM,GAAG,GAAG,IAAI;;AAGrB,SAAS,uBAAuB,YAAsD;CACpF,MAAM,OAAO,UAAU,WAAW,CAAC,KAAK,SAAS,WAAW,KAAK,CAAC,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI,CAAC,aAAa;AAC1G,KAAI,KAAK,SAAS,UAAU,CAAE,QAAO;AACrC,KAAI,KAAK,SAAS,aAAa,CAAE,QAAO;AACxC,KAAI,KAAK,SAAS,WAAW,IAAI,KAAK,SAAS,OAAO,CAAE,QAAO;AAC/D,KAAI,KAAK,SAAS,OAAO,IAAI,KAAK,SAAS,YAAY,CAAE,QAAO;AAChE,KAAI,KAAK,SAAS,OAAO,IAAI,KAAK,SAAS,YAAY,CAAE,QAAO;AAChE,QAAO;;AAGT,SAAS,0BAA0B,QAAyC;CAC1E,MAAM,SAAS,WAAW,OAAO;CACjC,MAAM,aAAa,WAAW,QAAQ,WAAW;AACjD,KAAI,CAAC,WAAY,QAAO,EAAE;CAC1B,MAAM,WAAW,IAAI,IAAI,UAAU,QAAQ,SAAS,CAAC,KAAK,SAAS,WAAW,KAAK,CAAC,CAAC,QAAQ,SAAyB,QAAQ,KAAK,CAAC,CAAC;AACrI,QAAO,OAAO,QAAQ,WAAW,CAAC,KAAK,CAAC,KAAK,WAAW;AAEtD,SAAO;GACL;GACA,OAAO;GACP,aAAa,WAJD,WAAW,MAIM,EAAE,YAAY;GAC3C,UAAU,SAAS,SAAS,IAAI,OAAO,SAAS,IAAI,IAAI;GACzD;GACD;;AAGJ,SAAS,qBAAqB,OAA2C;CACvE,MAAM,cAAc,MAAM,QAAQ,MAAM,GAAG,QAAQ,CAAC,MAAM;CAC1D,MAAM,UAAqC,EAAE;AAC7C,MAAK,MAAM,UAAU,aAAa;EAChC,MAAM,eAAe,WAAW,OAAO;AACvC,MAAI,CAAC,aAAc;EACnB,MAAM,aAAa,WAAW,cAAc,WAAW;AACvD,MAAI,CAAC,YAAY;AACf,WAAQ,KAAK,aAAa;AAC1B;;AAEF,OAAK,MAAM,SAAS,OAAO,OAAO,WAAW,EAAE;GAC7C,MAAM,eAAe,WAAW,MAAM;AACtC,OAAI,aAAc,SAAQ,KAAK,aAAa;;;AAGhD,QAAO;;AAGT,SAAS,qBACP,QACA,aAA2D,WAAW,QAAQ,WAAW,OAAO,QAAQ,CAAC,EACpE;AACrC,MAAK,MAAM,UAAU,qBAAqB,OAAO,gBAAgB,OAAO,aAAa,CACnF,KAAI,UAAU,OAAO,CAAE,QAAO;;AAKlC,SAAS,6BAA6B,QAAyD;CAG7F,MAAM,MAAM,YAFG,qBAAqB,SAAS,cAAc,QAAQ,WAAW,UAAU,IAAI,CAAC,CAAC,IACzF,qBAAqB,OAAO,GACF,IAAI;AACnC,KAAI,CAAC,IAAK,QAAO,EAAE;AACnB,QAAO,OAAO,KAAK,IAAI,CAAC,KAAK,SAAS;EACpC;EACA,OAAO;EACP,aAAa;EACb,UAAU;EACX,EAAiC;;AAGpC,SAAS,kBAAkB,GAAG,QAA0D;CACtF,MAAM,yBAAS,IAAI,KAAmC;AACtD,MAAK,MAAM,SAAS,OAClB,MAAK,MAAM,SAAS,OAAO;EACzB,MAAM,WAAW,OAAO,IAAI,MAAM,IAAI;AACtC,SAAO,IAAI,MAAM,KAAK;GACpB,GAAG;GACH,aAAa,UAAU,eAAe,MAAM;GAC5C,UAAU,UAAU,YAAY,MAAM;GACvC,CAAC;;AAGN,QAAO,CAAC,GAAG,OAAO,QAAQ,CAAC;;AAG7B,SAAS,aAAa,KAAc,SAAsE;CACxG,MAAM,YAAY,WAAW,IAAI;CACjC,MAAM,SAAkC,EAAE;AAC1C,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,aAAa,EAAE,CAAC,CACxD,QAAO,OAAO,QAAQ,MAAM,UAAU,MAAM,QAAQ,IAAI,GAAG,aAAa,IAAI,MAAM;AAEpF,MAAK,MAAM,SAAS,QAClB,KAAI,OAAO,MAAM,SAAS,KAAA,EAAW,QAAO,MAAM,OAAO,aAAa,MAAM,IAAI;AAElF,QAAO,OAAO,KAAK,OAAO,CAAC,SAAS,SAAS,KAAA;;AAG/C,SAAS,oBAAoB,QAAiC,UAAgE;AAE5H,SADY,WAAW,OAAO,aAAa,OAAO,KAAK,EAAE,aAAa,GAC1D,SAAS,MAAM,GAAG,QAAQ;;AAGxC,SAAS,wBAAwB,QAAiC,SAAsE;CACtI,MAAM,cAAc,WAAW,OAAO,eAAe,OAAO,YAAY;AACxE,KAAI,UAAU,YAAY,CAExB,QAAO;EAAE,KAAK;EAAa,WADT,WAAW,OAAO,4BAA4B,OAAO,yBAAyB,EAAE,aAAa,KAC3D,QAAQ,QAAQ;EAAmB;AAGzF,MAAK,MAAM,OAAO;EAAC;EAA8B;EAA8B;EAAmB;EAAkB,EAAE;EACpH,MAAM,oBAAoB,IAAI,aAAa,CAAC,SAAS,MAAM,GAAG,QAAQ;AACtE,OAAK,MAAM,UAAU,qBAAqB,OAAO,KAAK,EAAE;GACtD,MAAM,MAAM,WAAW,OAAO,OAAO,OAAO,SAAS;AACrD,OAAI,UAAU,IAAI,CAChB,QAAO;IAAE;IAAK,WAAW,oBAAoB,QAAQ,kBAAkB;IAAE;;;CAK/E,MAAM,eAAe,qBAAqB,SAAS,cAAc,UAAU,WAAW,UAAU,OAAO,UAAU,SAAS,CAAC,CAAC;CAC5H,MAAM,YAAY,WAAW,cAAc,OAAO,cAAc,SAAS;AACzE,KAAI,UAAU,UAAU,IAAI,aAC1B,QAAO;EAAE,KAAK;EAAW,WAAW,oBAAoB,cAAc,kBAAkB;EAAE;CAG5F,MAAM,SAAS,qBAAqB,OAAO;CAC3C,MAAM,UAAU,WAAW,QAAQ,QAAQ;AAC3C,KAAI,CAAC,QAAS,QAAO,KAAA;CACrB,MAAM,OAAO,UAAU,QAAQ,KAAK,CAAC,KAAK,QAAQ,OAAO,IAAI,CAAC;CAC9D,MAAM,MAAM,aAAa,OAAO,KAAK,QAAQ;AAC7C,QAAO;EACL;EACA,GAAI,KAAK,SAAS,EAAE,MAAM,GAAG,EAAE;EAC/B,GAAI,MAAM,EAAE,KAAK,GAAG,EAAE;EACtB,GAAI,WAAW,OAAO,IAAI,GAAG,EAAE,KAAK,WAAW,OAAO,IAAI,EAAE,GAAG,EAAE;EAClE;;AAGH,SAAS,8BAA8B,QAAkE;CACvG,MAAM,OAAO,WAAW,OAAO,QAAQ,OAAO,KAAK;CACnD,MAAM,OAAO,WAAW,OAAO,QAAQ,OAAO,QAAQ,OAAO,gBAAgB,OAAO,aAAa;CACjG,MAAM,cAAc,WAAW,OAAO,eAAe,OAAO,eAAe,OAAO,YAAY,IAAI;AAClG,KAAI,CAAC,QAAQ,CAAC,YAAa,QAAO,KAAA;CAGlC,MAAM,WAAW,SADK,OAAO,GAAG,KAAK,GAAG,SAAS,KACT;CACxC,MAAM,UAAU,kBACd,0BAA0B,OAAO,aAAa,OAAO,UAAU,EAC/D,6BAA6B,OAAO,CACrC;CACD,MAAM,iBAAiB,wBAAwB,QAAQ,QAAQ;AAC/D,KAAI,CAAC,eAAgB,QAAO,KAAA;CAE5B,MAAM,WAAW,OAAO,eAAe,QAAQ;CAC/C,MAAM,OAAO;EACX,GAAG,UAAU,OAAO,YAAY,OAAO,SAAS,CAAC,KAAK,QAAQ,WAAW,IAAI,CAAC,CAAC,QAAQ,QAAuB,QAAQ,IAAI,CAAC;EAC3H,GAAG,UAAU,OAAO,QAAQ,OAAO,KAAK,CAAC,KAAK,QAAQ,WAAW,IAAI,CAAC,CAAC,QAAQ,QAAuB,QAAQ,IAAI,CAAC;EACnH;EACA;EACA;EACD;AAED,QAAO;EACL,IAAI,cAAc;EAClB,SAAS,WAAW,OAAO,WAAW,OAAO,QAAQ,IAAI;EACzD;EACA,aAAa,WAAW,OAAO,YAAY,OAAO,cAAc,OAAO,YAAY,IAAI;EACvF,UAAU,uBAAuB,OAAO,YAAY,OAAO,SAAS;EACpE,MAAM;EACN,QAAQ;EACR,cAAc,WACV;GAAC;GAAS;GAAa;GAAW;GAA6B,GAC/D;GAAC;GAAS;GAAa;GAAW;GAAoB;EAC1D,MAAM,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC,MAAM,GAAG,EAAE;EAC3C,MAAM,EAAE,MAAM,QAAQ,SAAS,WAAW,QAAQ;EAClD,OAAO,EAAE,SAAS,QAAQ,SAAS,UAAU,KAAA,GAAW;EACxD,SAAS;GACP,MAAM;GACN;GACA;GACD;EACF;;AAGH,SAAS,WAAW,OAAwB;AAC1C,QAAO,OAAO,UAAU,YAAY,OAAO,SAAS,MAAM,GAAG,QAAQ;;AAGvE,SAAS,kBAAkB,SAA0E;CAEnG,MAAM,OAAO,WADA,WAAW,QACI,EAAE,KAAK;CACnC,MAAM,aAAa,WAAW,MAAM,KAAK,IAAI;CAC7C,MAAM,MAAM,WAAW,YAAY,OAAO,YAAY,aAAa,YAAY,IAAI;AAKnF,QAAO;EAAE,SAJO,UAAU,KAAK,cAAc,KAAK,WAAW,KAAK,MAAM,CACrE,KAAK,SAAS,WAAW,KAAK,CAAC,CAC/B,QAAQ,SAA0C,QAAQ,KAAK,CAElD;EAAE,OADJ,OAAO,KAAK,eAAe,WAAW,IAAI,aAAa,KAAA;EAC5C;;AAG3B,eAAe,mBAAmB,QAAyD;CACzF,MAAM,MAAM,IAAI,IAAI,uBAAuB,mBAAmB,CAAC;CAC/D,MAAM,OAAO;EACX,UAAU,KAAK,IAAI,KAAK,IAAI,OAAO,YAAY,IAAI,EAAE,EAAE,IAAI;EAC3D,YAAY,KAAK,IAAI,OAAO,QAAQ,GAAG,EAAE;EACzC,OAAO,OAAO,OAAO,MAAM,IAAI;EAC/B,WAAW,EAAE;EACd;CACD,MAAM,WAAW,MAAM,MAAM,KAAK;EAChC,QAAQ;EACR,SAAS;GACP,QAAQ;GACR,gBAAgB;GAChB,gCAAgC;GACjC;EACD,MAAM,KAAK,UAAU,KAAK;EAC3B,CAAC;AACF,KAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,gCAAgC,SAAS,SAAS;AACpF,QAAO,SAAS,MAAM;;AAGxB,MAAa,4BAAsD;CACjE,QAAQ;CACR,aAAa;CACb,MAAM,OAAO,QAA+E;EAE1F,MAAM,EAAE,SAAS,UAAU,kBAAkB,MADvB,mBAAmB,OAAO,CACK;EACrD,MAAM,WAAW,KAAK,IAAI,KAAK,IAAI,OAAO,YAAY,IAAI,EAAE,EAAE,IAAI;AAClE,SAAO;GACL,QAAQ;GACR,YAAY,QACT,UAAU,GAAG,MAAM,WAAW,EAAE,cAAc,EAAE,WAAW,GAAG,WAAW,EAAE,cAAc,EAAE,WAAW,CAAC,CACvG,IAAI,8BAA8B,CAClC,QAAQ,SAAsC,QAAQ,KAAK,CAAC;GAC/D,YAAY,UAAU,KAAA,IAAY,KAAA,IAAY,KAAK,KAAK,QAAQ,SAAS;GAC1E;;CAEJ"}
|
|
@@ -91,6 +91,7 @@ export type ConnectorInstance = {
|
|
|
91
91
|
lastConnectedAt?: string;
|
|
92
92
|
lastError?: string;
|
|
93
93
|
secretStatus: Record<string, boolean>;
|
|
94
|
+
config?: Record<string, unknown>;
|
|
94
95
|
materialized: {
|
|
95
96
|
type: 'mcp';
|
|
96
97
|
serverId: string;
|
|
@@ -142,4 +143,5 @@ export type ManagedConnectorMarker = {
|
|
|
142
143
|
lastConnectedAt?: string;
|
|
143
144
|
lastError?: string;
|
|
144
145
|
displayName?: string;
|
|
146
|
+
config?: Record<string, unknown>;
|
|
145
147
|
};
|
|
@@ -4,8 +4,8 @@ import { resolveGatewayLaunchAgentLabel, resolveLaunchAgentPlistPath as resolveL
|
|
|
4
4
|
import os from "node:os";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { existsSync } from "node:fs";
|
|
7
|
-
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
8
7
|
import { spawn, spawnSync } from "node:child_process";
|
|
8
|
+
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
9
9
|
//#region src/daemon/launchd.ts
|
|
10
10
|
/**
|
|
11
11
|
* LaunchAgent Service - macOS user service management
|
|
@@ -4,8 +4,8 @@ import { resolveGatewaySystemdServiceName, resolveSystemdUnitPath } from "./cons
|
|
|
4
4
|
import os from "node:os";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { existsSync } from "node:fs";
|
|
7
|
-
import { access, constants as constants$1, mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
8
7
|
import { spawn, spawnSync } from "node:child_process";
|
|
8
|
+
import { access, constants as constants$1, mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
9
9
|
//#region src/daemon/systemd.ts
|
|
10
10
|
/**
|
|
11
11
|
* Systemd Service - Linux user service management
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
-
import { init_agent_scope, resolveDefaultAgentId } from "../agent/agent-scope.js";
|
|
3
2
|
import { createLogger } from "../utils/logger/index.js";
|
|
4
3
|
import { init_logger } from "../utils/logger.js";
|
|
4
|
+
import { init_agent_scope, resolveDefaultAgentId } from "../agent/agent-scope.js";
|
|
5
5
|
import { init_paths, resolveBundledExtensionsDir, resolveExtensionsDir, resolveWorkspaceExtensionsDir } from "../config/paths.js";
|
|
6
6
|
import { init_normalize_manifest, normalizeExtensionManifest } from "./normalize-manifest.js";
|
|
7
7
|
import { join } from "path";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { PACKAGE_VERSION, init_package_version } from "../package-version.js";
|
|
2
|
-
import { init_agent_scope, resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agent/agent-scope.js";
|
|
3
2
|
import { createLogger, createServiceLogger } from "../utils/logger/index.js";
|
|
4
3
|
import { init_logger } from "../utils/logger.js";
|
|
4
|
+
import { init_agent_scope, resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agent/agent-scope.js";
|
|
5
5
|
import { init_paths, resolveBundledExtensionsDir, resolveExtensionSdkPath, resolveExtensionsDir, resolveWorkspaceExtensionsDir } from "../config/paths.js";
|
|
6
6
|
import { init_normalize_manifest, normalizeExtensionManifest } from "./normalize-manifest.js";
|
|
7
7
|
import { areExtensionsGloballyDisabled, discoverExtensionsFromDisk, init_discover_extensions } from "./discover-extensions.js";
|
|
@@ -18,9 +18,9 @@ import { validateMediaUnderstandingProviderContracts } from "./media-provider-co
|
|
|
18
18
|
import { DEFAULT_SECURITY_CONFIG, checkExtensionPathSafety, isExtensionAllowed, logSecurityIssue, provenanceTracker } from "./security.js";
|
|
19
19
|
import { getSlotRegistry } from "./slots.js";
|
|
20
20
|
import { getExtensionCache, getExtensionDiagnostics } from "./diagnostics.js";
|
|
21
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
21
22
|
import { dirname, isAbsolute, join } from "path";
|
|
22
23
|
import { existsSync, readFileSync } from "fs";
|
|
23
|
-
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
24
24
|
import { createJiti } from "jiti";
|
|
25
25
|
//#region src/extensions/loader.ts
|
|
26
26
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveAgentDir, resolveAgentProfileDir, resolveAgentWorkspaceDir, resolveDefaultAgentId, resolveUserPath, validateAgentIdForNewAgent } from "../agent/agent-scope.js";
|
|
2
1
|
import { resolveEffectiveAgentManifest } from "../agent-manifest/resolver.js";
|
|
2
|
+
import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveAgentDir, resolveAgentProfileDir, resolveAgentWorkspaceDir, resolveDefaultAgentId, resolveUserPath, validateAgentIdForNewAgent } from "../agent/agent-scope.js";
|
|
3
3
|
import { resolveEffectiveAgentProfile } from "../config/agent-profile.js";
|
|
4
4
|
import { WORKSPACE_FILES, init_paths, resolveUserProfilePath } from "../config/paths.js";
|
|
5
5
|
import { AGENT_PROFILE_MARKDOWN_SYSTEM_FILES, REQUIRED_AGENT_PROFILE_MARKDOWN_FILE_SET } from "../agent/context/workspace.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { init_agent_scope,
|
|
1
|
+
import { init_agent_scope, normalizeAgentId } from "../agent/agent-scope.js";
|
|
2
2
|
import { DREAMING_CRON_NAME, DREAMING_CRON_TAG, DREAMING_LIGHT_CRON_NAME, DREAMING_LIGHT_SWEEP_TOKEN, DREAMING_REM_CRON_NAME, DREAMING_REM_SWEEP_TOKEN, DREAMING_SWEEP_TOKEN } from "../agent/memory/dreaming/constants.js";
|
|
3
3
|
import { resolveDreamingConfig } from "../agent/memory/dreaming/config.js";
|
|
4
|
-
import {
|
|
4
|
+
import { resolveDreamingAgentScope } from "../agent/memory/dreaming/scope.js";
|
|
5
5
|
//#region src/gateway/dreaming-automation-reconciler.ts
|
|
6
6
|
init_agent_scope();
|
|
7
7
|
const DREAMING_AUTOMATIONS = [
|
|
@@ -37,13 +37,16 @@ function buildTrigger(config, phase) {
|
|
|
37
37
|
}
|
|
38
38
|
};
|
|
39
39
|
}
|
|
40
|
+
function dreamingAutomationId(agentId, phase) {
|
|
41
|
+
return `system-dreaming:${normalizeAgentId(agentId)}:${phase}`;
|
|
42
|
+
}
|
|
40
43
|
function buildAction(config, agentId, token) {
|
|
41
|
-
const
|
|
44
|
+
const scope = resolveDreamingAgentScope(config, agentId);
|
|
42
45
|
return {
|
|
43
46
|
kind: "agent",
|
|
44
|
-
agentId,
|
|
47
|
+
agentId: scope.agentId,
|
|
45
48
|
instruction: token,
|
|
46
|
-
|
|
49
|
+
workingDirectory: scope.workspaceDir,
|
|
47
50
|
timeoutSeconds: 3600
|
|
48
51
|
};
|
|
49
52
|
}
|
|
@@ -52,49 +55,66 @@ function automationNeedsUpdate(current, next) {
|
|
|
52
55
|
}
|
|
53
56
|
async function reconcileDreamingAutomations(params) {
|
|
54
57
|
const { config, automationService } = params;
|
|
55
|
-
const resolved = resolveDreamingConfig(config);
|
|
56
|
-
const agentId = resolveDefaultAgentId(config);
|
|
57
58
|
const result = {
|
|
58
59
|
created: [],
|
|
59
60
|
updated: [],
|
|
60
|
-
disabled: []
|
|
61
|
+
disabled: [],
|
|
62
|
+
removed: []
|
|
61
63
|
};
|
|
62
|
-
for (const spec of DREAMING_AUTOMATIONS)
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
64
|
+
for (const spec of DREAMING_AUTOMATIONS) if (await automationService.remove(spec.id)) result.removed.push(spec.id);
|
|
65
|
+
const expectedIds = /* @__PURE__ */ new Set();
|
|
66
|
+
const agents = config.agents.list.filter((agent) => agent.enabled !== false);
|
|
67
|
+
for (const agent of agents) {
|
|
68
|
+
const agentId = normalizeAgentId(agent.id);
|
|
69
|
+
const resolved = resolveDreamingConfig(config, agentId);
|
|
70
|
+
for (const spec of DREAMING_AUTOMATIONS) {
|
|
71
|
+
const id = dreamingAutomationId(agentId, spec.phase);
|
|
72
|
+
expectedIds.add(id);
|
|
73
|
+
const current = await automationService.get(id);
|
|
74
|
+
const enabled = resolved.enabled && resolved.phases[spec.phase].enabled;
|
|
75
|
+
if (!resolved.enabled) {
|
|
76
|
+
if (current?.enabled) {
|
|
77
|
+
await automationService.update(id, { enabled: false });
|
|
78
|
+
result.disabled.push(id);
|
|
79
|
+
}
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const next = {
|
|
83
|
+
name: `${spec.name} (${agentId})`,
|
|
84
|
+
description: phaseDescription(spec.phase),
|
|
85
|
+
enabled,
|
|
86
|
+
trigger: buildTrigger(resolved, spec.phase),
|
|
87
|
+
action: buildAction(config, agentId, spec.token)
|
|
88
|
+
};
|
|
89
|
+
if (!current) {
|
|
90
|
+
await automationService.create({
|
|
91
|
+
id,
|
|
92
|
+
...next,
|
|
93
|
+
safety: { mode: "auto_apply" },
|
|
94
|
+
afterRun: { kind: "none" },
|
|
95
|
+
reliability: { disableAfterConsecutiveFailures: 3 }
|
|
96
|
+
});
|
|
97
|
+
result.created.push(id);
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (automationNeedsUpdate(current, next)) {
|
|
101
|
+
await automationService.update(id, {
|
|
102
|
+
...next,
|
|
103
|
+
safety: { mode: "auto_apply" },
|
|
104
|
+
afterRun: { kind: "none" },
|
|
105
|
+
reliability: { disableAfterConsecutiveFailures: 3 }
|
|
106
|
+
});
|
|
107
|
+
result.updated.push(id);
|
|
69
108
|
}
|
|
70
|
-
continue;
|
|
71
|
-
}
|
|
72
|
-
const next = {
|
|
73
|
-
name: spec.name,
|
|
74
|
-
description: phaseDescription(spec.phase),
|
|
75
|
-
enabled,
|
|
76
|
-
trigger: buildTrigger(resolved, spec.phase),
|
|
77
|
-
action: buildAction(config, agentId, spec.token)
|
|
78
|
-
};
|
|
79
|
-
if (!current) {
|
|
80
|
-
await automationService.create({
|
|
81
|
-
id: spec.id,
|
|
82
|
-
...next,
|
|
83
|
-
safety: { mode: "auto_apply" },
|
|
84
|
-
afterRun: { kind: "none" },
|
|
85
|
-
reliability: { disableAfterConsecutiveFailures: 3 }
|
|
86
|
-
});
|
|
87
|
-
result.created.push(spec.id);
|
|
88
|
-
continue;
|
|
89
109
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
});
|
|
97
|
-
result.
|
|
110
|
+
}
|
|
111
|
+
const allAutomations = await automationService.list();
|
|
112
|
+
for (const automation of allAutomations) {
|
|
113
|
+
if (!automation.id.startsWith("system-dreaming:")) continue;
|
|
114
|
+
if (expectedIds.has(automation.id)) continue;
|
|
115
|
+
if (automation.enabled) {
|
|
116
|
+
await automationService.update(automation.id, { enabled: false });
|
|
117
|
+
result.disabled.push(automation.id);
|
|
98
118
|
}
|
|
99
119
|
}
|
|
100
120
|
return result;
|