@xopcai/xopc 0.0.115 → 0.0.117
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -10
- package/README.zh-CN.md +26 -10
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/demo-memory/src/index.d.ts +6 -0
- package/dist/extensions/demo-memory/src/index.js +132 -0
- package/dist/extensions/demo-memory/src/index.js.map +1 -0
- package/dist/extensions/demo-memory/xopc.extension.json +15 -0
- package/dist/extensions/feishu/src/schema/config-schema.d.ts +3 -3
- package/dist/extensions/telegram/src/command-handler.js +1 -2
- package/dist/extensions/telegram/src/command-handler.js.map +1 -1
- package/dist/extensions/telegram/src/config-schema.d.ts +8 -8
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-DVnBfANm.js → agent-avatar-dicebear-BBLhJ2C6.js} +1 -1
- package/dist/gateway/static/root/assets/agents-C6xgagZd.js +71 -0
- package/dist/gateway/static/root/assets/app-management-settings-panel-CBpLONvG.js +1 -0
- package/dist/gateway/static/root/assets/{appearance-settings-BQpPSTHD.js → appearance-settings-CGcc54yj.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-DdDx0V4z.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-CXu-Csep.js → archive-plugin-DZsVqMhU.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-BAjgOoGY.js → attachment-load-CIol6JWX.js} +1 -1
- package/dist/gateway/static/root/assets/{binary-plugins-BSBgB2hO.js → binary-plugins-B3UauMfp.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-BpXw9TTR.js → block-editor-2HJoFchH.js} +3 -3
- package/dist/gateway/static/root/assets/browser-settings-page-CUOO-PQk.js +8 -0
- package/dist/gateway/static/root/assets/capability-presets-api-XQoMTI0A.js +1 -0
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-CfqF-kGr.js +1 -0
- package/dist/gateway/static/root/assets/{channels-settings-BbPUpzWB.js → channels-settings-BYyRzsex.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-DIvEz4NX.js +2 -0
- package/dist/gateway/static/root/assets/cron-api-R41aQCX9.js +1 -0
- package/dist/gateway/static/root/assets/cron-page-D97nFqQD.js +3 -0
- package/dist/gateway/static/root/assets/dreaming-settings-Bceaw1PG.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-D9kgUHCc.js → extension-debug-page-DX5WRE_t.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-CGyhXqzR.js → extension-page-Buah7Bw-.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-DL8Xquqd.js → extension-settings-page-DuroLVnf.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-D0VXA932.js → fetch-B5zdl27C.js} +1 -1
- package/dist/gateway/static/root/assets/{format-interval-label-Be8SmgUw.js → format-interval-label-Dn_QKIqb.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-config-api-gT4ZhE7h.js +1 -0
- package/dist/gateway/static/root/assets/gateway-settings-iISWAZRm.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-DERUH61L.js → gateway-startup-retry-B3kL8KGY.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-DCUROLMQ.js +1 -0
- package/dist/gateway/static/root/assets/{goals-config-api-BPmqWk90.js → goals-config-api-AR-fVh0P.js} +1 -1
- package/dist/gateway/static/root/assets/goals-page-Cpb21ezg.js +2 -0
- package/dist/gateway/static/root/assets/goals-settings-CPAuFwoD.js +1 -0
- package/dist/gateway/static/root/assets/{heartbeat-config-api-Bfdzr8oV.js → heartbeat-config-api-D7bKFEeO.js} +1 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-CC69vNx0.js +1 -0
- package/dist/gateway/static/root/assets/index-CwhK8qCh.js +122 -0
- package/dist/gateway/static/root/assets/index-CyfhARL-.css +1 -0
- package/dist/gateway/static/root/assets/{interval-presets-utKbuCRY.js → interval-presets-0DtsnxE0.js} +1 -1
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CjqS6c6V.js → keyboard-shortcuts-settings-BPREtN8B.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-DefCgF4o.js +2 -0
- package/dist/gateway/static/root/assets/{markdown-split-DW8C47iB.js → markdown-split-ChbR9LGO.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-D6HwDhDT.js → media-plugins-B82oP80n.js} +1 -1
- package/dist/gateway/static/root/assets/messages-Cf1O9JB0.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-panel-DmKiIihT.js +2 -0
- package/dist/gateway/static/root/assets/note-detail-page-CxxfLRJZ.js +2 -0
- package/dist/gateway/static/root/assets/{note-image-lightbox-pJM35Pz5.js → note-image-lightbox-CDknITM3.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-X2slSx7V.js +1 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-CVwHuyN6.js → preview-open-alternatives-DV3xQsWB.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-BvmUWqgu.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-Ba-UEk7x.js → save-bar-controls-BODCXnvY.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-CNN9595U.js → schedule-field-CgJSCD3B.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-DnNMmtD5.js → schema-form-qtfEI6QM.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-B0yESuuL.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-q2M8RKOo.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-CmOz80i5.js → settings-collapsible-section-BHZKjVcS.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-BmK7JJOV.js → settings-form-section-5i35D-J1.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-CGozabLD.js +1 -0
- package/dist/gateway/static/root/assets/setup-status-panel-FoOSe6nU.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-Dp2qGrHC.js → share-preview-page-B0H63tDv.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-Cy5zWyYQ.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-DaZNFro9.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-CnwtUzvw.js +2 -0
- package/dist/gateway/static/root/assets/system-settings-panel-DXs2VmBt.js +1 -0
- package/dist/gateway/static/root/assets/typed-models-lib-4gPuydz_.js +1 -0
- package/dist/gateway/static/root/assets/{use-channel-catalog-CHlO8J9G.js → use-channel-catalog-BCjP_VHb.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DvKiOglO.js +1 -0
- package/dist/gateway/static/root/assets/{voice-player-store-DDDWYHvg.js → voice-player-store-BlF9V05n.js} +1 -1
- package/dist/gateway/static/root/assets/workflows-page-CAVZcONQ.js +18 -0
- package/dist/gateway/static/root/index.html +5 -5
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +1 -1
- package/dist/src/agent/agent-manager.js +7 -8
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/agent-scope.js +6 -8
- package/dist/src/agent/agent-scope.js.map +1 -1
- package/dist/src/agent/background-review/coordinator.js +0 -1
- package/dist/src/agent/background-review/coordinator.js.map +1 -1
- package/dist/src/agent/background-review/run-background-review.d.ts +0 -2
- package/dist/src/agent/background-review/run-background-review.js +2 -4
- package/dist/src/agent/background-review/run-background-review.js.map +1 -1
- package/dist/src/agent/background-review/settings.js +8 -7
- package/dist/src/agent/background-review/settings.js.map +1 -1
- package/dist/src/agent/bootstrap/bootstrap-context.d.ts +2 -2
- package/dist/src/agent/bootstrap/bootstrap-context.js +4 -4
- package/dist/src/agent/bootstrap/bootstrap-context.js.map +1 -1
- package/dist/src/agent/context/workspace-seed.js +1 -1
- package/dist/src/agent/embedded/run-for-session.js +1 -1
- package/dist/src/agent/embedded/run-for-session.js.map +1 -1
- package/dist/src/agent/fallback/candidates.js +6 -3
- package/dist/src/agent/fallback/candidates.js.map +1 -1
- package/dist/src/agent/goals/checklist-judge.d.ts +1 -0
- package/dist/src/agent/goals/checklist-judge.js +1 -1
- package/dist/src/agent/goals/checklist-judge.js.map +1 -1
- package/dist/src/agent/goals/evaluate-turn.d.ts +1 -0
- package/dist/src/agent/goals/evaluate-turn.js +1 -0
- package/dist/src/agent/goals/evaluate-turn.js.map +1 -1
- package/dist/src/agent/goals/post-turn.js +8 -1
- package/dist/src/agent/goals/post-turn.js.map +1 -1
- package/dist/src/agent/image/generation/runtime-types.d.ts +2 -0
- package/dist/src/agent/image/generation/runtime.js +1 -1
- package/dist/src/agent/image/generation/runtime.js.map +1 -1
- package/dist/src/agent/image/image-helpers.d.ts +1 -1
- package/dist/src/agent/image/image-helpers.js +4 -17
- package/dist/src/agent/image/image-helpers.js.map +1 -1
- package/dist/src/agent/image/image-model-fallback.js +1 -1
- package/dist/src/agent/image/image-model-fallback.js.map +1 -1
- package/dist/src/agent/image/inbound-image-handling.js +1 -1
- package/dist/src/agent/image/inbound-image-handling.js.map +1 -1
- package/dist/src/agent/image/tool-model-config.d.ts +1 -1
- package/dist/src/agent/image/tool-model-config.js +2 -2
- package/dist/src/agent/image/tool-model-config.js.map +1 -1
- package/dist/src/agent/image/understanding/pi-ai-provider.js +5 -2
- package/dist/src/agent/image/understanding/pi-ai-provider.js.map +1 -1
- package/dist/src/agent/image/understanding/provider-registry.d.ts +1 -0
- package/dist/src/agent/image/understanding/provider-registry.js +16 -2
- package/dist/src/agent/image/understanding/provider-registry.js.map +1 -1
- package/dist/src/agent/mcp/resolve-embedded-mcp-tools.js +1 -1
- package/dist/src/agent/mcp/resolve-embedded-mcp-tools.js.map +1 -1
- package/dist/src/agent/media-generation/runtime-shared.d.ts +5 -2
- package/dist/src/agent/media-generation/runtime-shared.js +1 -1
- package/dist/src/agent/media-generation/runtime-shared.js.map +1 -1
- package/dist/src/agent/memory/builtin-memory-store.d.ts +2 -0
- package/dist/src/agent/memory/builtin-memory-store.js +4 -0
- package/dist/src/agent/memory/builtin-memory-store.js.map +1 -1
- package/dist/src/agent/memory/builtin-provider.d.ts +31 -9
- package/dist/src/agent/memory/builtin-provider.js +261 -11
- package/dist/src/agent/memory/builtin-provider.js.map +1 -1
- package/dist/src/agent/memory/context-assembler.d.ts +10 -0
- package/dist/src/agent/memory/context-assembler.js +26 -0
- package/dist/src/agent/memory/context-assembler.js.map +1 -0
- package/dist/src/agent/memory/create-memory-manager.js +25 -7
- package/dist/src/agent/memory/create-memory-manager.js.map +1 -1
- package/dist/src/agent/memory/dreaming/config.d.ts +1 -6
- package/dist/src/agent/memory/dreaming/config.js +8 -8
- package/dist/src/agent/memory/dreaming/config.js.map +1 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.d.ts +2 -0
- package/dist/src/agent/memory/dreaming/deep-promotion.js +24 -0
- package/dist/src/agent/memory/dreaming/deep-promotion.js.map +1 -1
- package/dist/src/agent/memory/index.d.ts +1 -0
- package/dist/src/agent/memory/index.js +4 -3
- package/dist/src/agent/memory/inject-prefetch.js +6 -2
- package/dist/src/agent/memory/inject-prefetch.js.map +1 -1
- package/dist/src/agent/memory/manager.d.ts +37 -1
- package/dist/src/agent/memory/manager.js +332 -40
- package/dist/src/agent/memory/manager.js.map +1 -1
- package/dist/src/agent/memory/memory-config.js +12 -15
- package/dist/src/agent/memory/memory-config.js.map +1 -1
- package/dist/src/agent/memory/plugin-discovery.d.ts +19 -5
- package/dist/src/agent/memory/plugin-discovery.js +97 -31
- package/dist/src/agent/memory/plugin-discovery.js.map +1 -1
- package/dist/src/agent/memory/provider.d.ts +20 -15
- package/dist/src/agent/memory/stub-memory-provider.d.ts +17 -2
- package/dist/src/agent/memory/stub-memory-provider.js +20 -3
- package/dist/src/agent/memory/stub-memory-provider.js.map +1 -1
- package/dist/src/agent/memory/types.d.ts +136 -0
- package/dist/src/agent/models/manager.d.ts +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/models/manager.js.map +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.d.ts +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js +2 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +2 -2
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.d.ts +2 -6
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js +2 -8
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js.map +1 -1
- package/dist/src/agent/reply/post-compaction-context.js +11 -6
- package/dist/src/agent/reply/post-compaction-context.js.map +1 -1
- package/dist/src/agent/reply/startup-context.js +8 -9
- package/dist/src/agent/reply/startup-context.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.js +1 -4
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service/session-context-report.js +1 -1
- package/dist/src/agent/service/session-context-report.js.map +1 -1
- package/dist/src/agent/service.js +21 -25
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/service.types.d.ts +1 -2
- package/dist/src/agent/session/session-hydrator.js +1 -2
- package/dist/src/agent/session/session-hydrator.js.map +1 -1
- package/dist/src/agent/session/session-inspector.d.ts +1 -1
- package/dist/src/agent/session/session-inspector.js +9 -14
- package/dist/src/agent/session/session-inspector.js.map +1 -1
- package/dist/src/agent/skills/hub-pull.js +1 -1
- package/dist/src/agent/starter-agents.d.ts +1 -3
- package/dist/src/agent/starter-agents.js +13 -21
- package/dist/src/agent/starter-agents.js.map +1 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -2
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
- package/dist/src/agent/tools/composio-tool.d.ts +8 -0
- package/dist/src/agent/tools/composio-tool.js +46 -0
- package/dist/src/agent/tools/composio-tool.js.map +1 -0
- package/dist/src/agent/tools/curated-memory-tool.d.ts +2 -5
- package/dist/src/agent/tools/curated-memory-tool.js +20 -16
- package/dist/src/agent/tools/curated-memory-tool.js.map +1 -1
- package/dist/src/agent/tools/factory.d.ts +0 -4
- package/dist/src/agent/tools/factory.js +32 -66
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/image-generate-tool.d.ts +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +19 -14
- package/dist/src/agent/tools/image-generate-tool.js.map +1 -1
- package/dist/src/agent/tools/image-tool.js +1 -3
- package/dist/src/agent/tools/image-tool.js.map +1 -1
- package/dist/src/agent/tools/index.d.ts +1 -0
- package/dist/src/agent/tools/index.js +2 -1
- package/dist/src/agent/tools/memory-tool.d.ts +2 -2
- package/dist/src/agent/tools/memory-tool.js +39 -14
- package/dist/src/agent/tools/memory-tool.js.map +1 -1
- package/dist/src/agent/tools/session-search-tool.js +1 -3
- package/dist/src/agent/tools/session-search-tool.js.map +1 -1
- package/dist/src/agent/tools/web-extract.js +6 -5
- package/dist/src/agent/tools/web-extract.js.map +1 -1
- package/dist/src/agent/workflow/builtins/audit-repo.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/audit-repo.js +15 -2
- package/dist/src/agent/workflow/builtins/audit-repo.js.map +1 -1
- package/dist/src/agent/workflow/builtins/client-proposal.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/client-proposal.js +10 -1
- package/dist/src/agent/workflow/builtins/client-proposal.js.map +1 -1
- package/dist/src/agent/workflow/builtins/competitor-scan.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/competitor-scan.js +16 -2
- package/dist/src/agent/workflow/builtins/competitor-scan.js.map +1 -1
- package/dist/src/agent/workflow/builtins/content-draft.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/content-draft.js +15 -2
- package/dist/src/agent/workflow/builtins/content-draft.js.map +1 -1
- package/dist/src/agent/workflow/builtins/content-repurpose.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/content-repurpose.js +10 -1
- package/dist/src/agent/workflow/builtins/content-repurpose.js.map +1 -1
- package/dist/src/agent/workflow/builtins/debug-incident.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/debug-incident.js +9 -1
- package/dist/src/agent/workflow/builtins/debug-incident.js.map +1 -1
- package/dist/src/agent/workflow/builtins/decision-compare.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/decision-compare.js +16 -2
- package/dist/src/agent/workflow/builtins/decision-compare.js.map +1 -1
- package/dist/src/agent/workflow/builtins/implementation-plan.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/implementation-plan.js +11 -1
- package/dist/src/agent/workflow/builtins/implementation-plan.js.map +1 -1
- package/dist/src/agent/workflow/builtins/inbox-triage.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/inbox-triage.js +11 -1
- package/dist/src/agent/workflow/builtins/inbox-triage.js.map +1 -1
- package/dist/src/agent/workflow/builtins/meeting-prep.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/meeting-prep.js +9 -1
- package/dist/src/agent/workflow/builtins/meeting-prep.js.map +1 -1
- package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/multi-perspective-review.js +9 -1
- package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +1 -1
- package/dist/src/agent/workflow/builtins/offer-design.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/offer-design.js +10 -1
- package/dist/src/agent/workflow/builtins/offer-design.js.map +1 -1
- package/dist/src/agent/workflow/builtins/pr-review.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/pr-review.js +9 -1
- package/dist/src/agent/workflow/builtins/pr-review.js.map +1 -1
- package/dist/src/agent/workflow/builtins/release-check.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/release-check.js +10 -1
- package/dist/src/agent/workflow/builtins/release-check.js.map +1 -1
- package/dist/src/agent/workflow/builtins/research.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/research.js +16 -2
- package/dist/src/agent/workflow/builtins/research.js.map +1 -1
- package/dist/src/agent/workflow/builtins/weekly-review.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/weekly-review.js +9 -1
- package/dist/src/agent/workflow/builtins/weekly-review.js.map +1 -1
- package/dist/src/agent/workflow/subagent-runner.js +1 -3
- package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
- package/dist/src/agent-manifest/index.d.ts +4 -0
- package/dist/src/agent-manifest/index.js +10 -0
- package/dist/src/agent-manifest/index.js.map +1 -0
- package/dist/src/agent-manifest/prompt.d.ts +2 -0
- package/dist/src/agent-manifest/prompt.js +57 -0
- package/dist/src/agent-manifest/prompt.js.map +1 -0
- package/dist/src/agent-manifest/resolver.d.ts +11 -0
- package/dist/src/agent-manifest/resolver.js +93 -0
- package/dist/src/agent-manifest/resolver.js.map +1 -0
- package/dist/src/agent-manifest/schema.d.ts +778 -0
- package/dist/src/agent-manifest/schema.js +267 -0
- package/dist/src/agent-manifest/schema.js.map +1 -0
- package/dist/src/agent-manifest/validator.d.ts +24 -0
- package/dist/src/agent-manifest/validator.js +87 -0
- package/dist/src/agent-manifest/validator.js.map +1 -0
- package/dist/src/agent-runtime/boundary-guard.d.ts +12 -0
- package/dist/src/agent-runtime/boundary-guard.js +23 -0
- package/dist/src/agent-runtime/boundary-guard.js.map +1 -0
- package/dist/src/agent-runtime/index.d.ts +7 -0
- package/dist/src/agent-runtime/index.js +8 -0
- package/dist/src/agent-runtime/memory-runtime.d.ts +21 -0
- package/dist/src/agent-runtime/memory-runtime.js +50 -0
- package/dist/src/agent-runtime/memory-runtime.js.map +1 -0
- package/dist/src/agent-runtime/model-router.d.ts +11 -0
- package/dist/src/agent-runtime/model-router.js +16 -0
- package/dist/src/agent-runtime/model-router.js.map +1 -0
- package/dist/src/agent-runtime/run-trace.d.ts +27 -0
- package/dist/src/agent-runtime/run-trace.js +53 -0
- package/dist/src/agent-runtime/run-trace.js.map +1 -0
- package/dist/src/agent-runtime/runtime-profile.d.ts +24 -0
- package/dist/src/agent-runtime/runtime-profile.js +44 -0
- package/dist/src/agent-runtime/runtime-profile.js.map +1 -0
- package/dist/src/agent-runtime/tool-registry.d.ts +28 -0
- package/dist/src/agent-runtime/tool-registry.js +52 -0
- package/dist/src/agent-runtime/tool-registry.js.map +1 -0
- package/dist/src/agent-runtime/workflow-runtime.d.ts +31 -0
- package/dist/src/agent-runtime/workflow-runtime.js +34 -0
- package/dist/src/agent-runtime/workflow-runtime.js.map +1 -0
- package/dist/src/browser/actions/extension-registry-bridge.js +1 -1
- package/dist/src/browser/actions/extension-registry-bridge.js.map +1 -1
- package/dist/src/browser/actions/registry.js +5 -8
- package/dist/src/browser/actions/registry.js.map +1 -1
- package/dist/src/browser/backend-from-config.d.ts +1 -1
- package/dist/src/browser/backend-from-config.js +50 -71
- package/dist/src/browser/backend-from-config.js.map +1 -1
- package/dist/src/browser/browser-command-timeout.d.ts +0 -1
- package/dist/src/browser/browser-command-timeout.js +3 -7
- package/dist/src/browser/browser-command-timeout.js.map +1 -1
- package/dist/src/browser/providers/browser-ext-install.d.ts +2 -12
- package/dist/src/browser/providers/browser-ext-install.js +3 -8
- package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
- package/dist/src/browser/readiness.js +16 -16
- package/dist/src/browser/readiness.js.map +1 -1
- package/dist/src/browser/schemas.js +1 -1
- package/dist/src/browser/schemas.js.map +1 -1
- package/dist/src/chat-commands/builtins/config.js +4 -4
- package/dist/src/chat-commands/builtins/config.js.map +1 -1
- package/dist/src/chat-commands/builtins/thinking.js +16 -42
- package/dist/src/chat-commands/builtins/thinking.js.map +1 -1
- package/dist/src/chat-commands/config-paths.js +1 -1
- package/dist/src/chat-commands/config-paths.js.map +1 -1
- package/dist/src/chat-commands/context.js +3 -4
- package/dist/src/chat-commands/context.js.map +1 -1
- package/dist/src/cli/command-manifest.js +1 -1
- package/dist/src/cli/command-manifest.js.map +1 -1
- package/dist/src/cli/commands/agent.js +3 -1
- package/dist/src/cli/commands/agent.js.map +1 -1
- package/dist/src/cli/commands/agents.js +3 -6
- package/dist/src/cli/commands/agents.js.map +1 -1
- package/dist/src/cli/commands/browser-cli-helpers.js +9 -11
- package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
- package/dist/src/cli/commands/config.js +5 -5
- package/dist/src/cli/commands/config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -17
- package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
- package/dist/src/cli/commands/goal.js +1 -1
- package/dist/src/cli/commands/image.js +13 -372
- package/dist/src/cli/commands/image.js.map +1 -1
- package/dist/src/cli/commands/models.js +26 -10
- package/dist/src/cli/commands/models.js.map +1 -1
- package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
- package/dist/src/cli/commands/onboard/model.js +20 -22
- package/dist/src/cli/commands/onboard/model.js.map +1 -1
- package/dist/src/cli/commands/onboard.js +1 -1
- package/dist/src/cli/commands/onboard.js.map +1 -1
- package/dist/src/cli/utils/init-workspace-core.d.ts +1 -4
- package/dist/src/cli/utils/init-workspace-core.js +7 -6
- package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
- package/dist/src/commands/agents.config.d.ts +0 -1
- package/dist/src/commands/agents.config.js +66 -12
- package/dist/src/commands/agents.config.js.map +1 -1
- package/dist/src/config/agent-profile.d.ts +5 -17
- package/dist/src/config/agent-profile.js +31 -64
- package/dist/src/config/agent-profile.js.map +1 -1
- package/dist/src/config/agent-typed-models.d.ts +1 -1
- package/dist/src/config/agent-typed-models.js +0 -1
- package/dist/src/config/agent-typed-models.js.map +1 -1
- package/dist/src/config/index.js +3 -3
- package/dist/src/config/integration.d.ts +1 -1
- package/dist/src/config/reload.js +1 -1
- package/dist/src/config/reload.js.map +1 -1
- package/dist/src/config/rules.js +6 -56
- package/dist/src/config/rules.js.map +1 -1
- package/dist/src/config/schema.d.ts +925 -781
- package/dist/src/config/schema.js +157 -424
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/connectors/composio-triggers.d.ts +10 -0
- package/dist/src/connectors/composio-triggers.js +32 -0
- package/dist/src/connectors/composio-triggers.js.map +1 -0
- package/dist/src/connectors/composio.d.ts +54 -0
- package/dist/src/connectors/composio.js +334 -0
- package/dist/src/connectors/composio.js.map +1 -0
- package/dist/src/connectors/health.js +16 -1
- package/dist/src/connectors/health.js.map +1 -1
- package/dist/src/connectors/install.d.ts +2 -1
- package/dist/src/connectors/install.js +50 -13
- package/dist/src/connectors/install.js.map +1 -1
- package/dist/src/connectors/instances.js +57 -6
- package/dist/src/connectors/instances.js.map +1 -1
- package/dist/src/connectors/lifecycle.d.ts +3 -0
- package/dist/src/connectors/lifecycle.js +23 -0
- package/dist/src/connectors/lifecycle.js.map +1 -0
- package/dist/src/connectors/materialize.js +2 -1
- package/dist/src/connectors/materialize.js.map +1 -1
- package/dist/src/connectors/providers.d.ts +1 -0
- package/dist/src/connectors/providers.js +10 -2
- package/dist/src/connectors/providers.js.map +1 -1
- package/dist/src/connectors/registries/modelscope.d.ts +2 -0
- package/dist/src/connectors/registries/modelscope.js +205 -0
- package/dist/src/connectors/registries/modelscope.js.map +1 -0
- package/dist/src/connectors/registries/official-mcp.d.ts +2 -0
- package/dist/src/connectors/registries/official-mcp.js +142 -0
- package/dist/src/connectors/registries/official-mcp.js.map +1 -0
- package/dist/src/connectors/registries/search.d.ts +12 -0
- package/dist/src/connectors/registries/search.js +89 -0
- package/dist/src/connectors/registries/search.js.map +1 -0
- package/dist/src/connectors/registries/smithery.d.ts +2 -0
- package/dist/src/connectors/registries/smithery.js +98 -0
- package/dist/src/connectors/registries/smithery.js.map +1 -0
- package/dist/src/connectors/registries/types.d.ts +20 -0
- package/dist/src/connectors/registries/types.js +1 -0
- package/dist/src/connectors/secret-store.js +4 -2
- package/dist/src/connectors/secret-store.js.map +1 -1
- package/dist/src/connectors/setup-secrets.d.ts +15 -0
- package/dist/src/connectors/setup-secrets.js +64 -0
- package/dist/src/connectors/setup-secrets.js.map +1 -0
- package/dist/src/connectors/supervisor.d.ts +15 -0
- package/dist/src/connectors/supervisor.js +73 -0
- package/dist/src/connectors/supervisor.js.map +1 -0
- package/dist/src/connectors/types.d.ts +27 -3
- package/dist/src/connectors/usage.js +6 -1
- package/dist/src/connectors/usage.js.map +1 -1
- package/dist/src/cron/index.js +1 -1
- package/dist/src/cron/service.js +1 -1
- package/dist/src/cron/validation.d.ts +3 -3
- package/dist/src/extensions/activation-context.js +13 -7
- package/dist/src/extensions/activation-context.js.map +1 -1
- package/dist/src/gateway/agents-admin.d.ts +17 -18
- package/dist/src/gateway/agents-admin.js +123 -88
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/capability-presets-admin.d.ts +56 -0
- package/dist/src/gateway/capability-presets-admin.js +214 -0
- package/dist/src/gateway/capability-presets-admin.js.map +1 -0
- package/dist/src/gateway/hono/lib/agent-model.d.ts +1 -1
- package/dist/src/gateway/hono/lib/agent-model.js +1 -1
- package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +234 -127
- package/dist/src/gateway/hono/lib/config-payload.js +13 -37
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/routes/agents.js +56 -33
- package/dist/src/gateway/hono/routes/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/browser.js +8 -15
- package/dist/src/gateway/hono/routes/browser.js.map +1 -1
- package/dist/src/gateway/hono/routes/capability-presets.d.ts +3 -0
- package/dist/src/gateway/hono/routes/capability-presets.js +145 -0
- package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -0
- package/dist/src/gateway/hono/routes/config-patch/agents.d.ts +1 -17
- package/dist/src/gateway/hono/routes/config-patch/agents.js +2 -443
- package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +7 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
- package/dist/src/gateway/hono/routes/config.js +1 -1
- package/dist/src/gateway/hono/routes/config.js.map +1 -1
- package/dist/src/gateway/hono/routes/connectors.js +230 -3
- package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +7 -0
- package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
- package/dist/src/gateway/hono/routes/goals.js +52 -5
- package/dist/src/gateway/hono/routes/goals.js.map +1 -1
- package/dist/src/gateway/hono/routes/index.js +2 -0
- package/dist/src/gateway/hono/routes/index.js.map +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/memory.d.ts +3 -0
- package/dist/src/gateway/hono/routes/memory.js +290 -0
- package/dist/src/gateway/hono/routes/memory.js.map +1 -0
- package/dist/src/gateway/hono/routes/voice.js +14 -1
- package/dist/src/gateway/hono/routes/voice.js.map +1 -1
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/service/agent-runner.d.ts +5 -12
- package/dist/src/gateway/service/agent-runner.js +8 -8
- package/dist/src/gateway/service/agent-runner.js.map +1 -1
- package/dist/src/gateway/service/run-gateway-agent.d.ts +2 -10
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
- package/dist/src/gateway/service.d.ts +2 -2
- package/dist/src/gateway/service.js +20 -16
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/gateway/user-turn-input.d.ts +18 -0
- package/dist/src/gateway/user-turn-input.js +16 -0
- package/dist/src/gateway/user-turn-input.js.map +1 -0
- package/dist/src/goals/goal-queue-store.d.ts +2 -1
- package/dist/src/goals/goal-queue-store.js +2 -2
- package/dist/src/goals/goal-queue-store.js.map +1 -1
- package/dist/src/goals/goal-queue-types.d.ts +4 -3
- package/dist/src/goals/goal-runner.js +25 -3
- package/dist/src/goals/goal-runner.js.map +1 -1
- package/dist/src/goals/goal-service.d.ts +6 -1
- package/dist/src/goals/goal-service.js +9 -2
- package/dist/src/goals/goal-service.js.map +1 -1
- package/dist/src/goals/goal-store.d.ts +7 -1
- package/dist/src/goals/goal-store.js +42 -0
- package/dist/src/goals/goal-store.js.map +1 -1
- package/dist/src/goals/types.d.ts +10 -0
- package/dist/src/notes/agent-context.js +2 -2
- package/dist/src/providers/index.d.ts +2 -2
- package/dist/src/providers/index.js +10 -14
- package/dist/src/providers/index.js.map +1 -1
- package/dist/src/session/index.js +1 -1
- package/dist/src/session/session-workspace.js +7 -2
- package/dist/src/session/session-workspace.js.map +1 -1
- package/dist/src/session/store.js +5 -0
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/thinking-resolve.d.ts +1 -1
- package/dist/src/session/thinking-resolve.js +1 -1
- package/dist/src/session/thinking-resolve.js.map +1 -1
- package/dist/src/storage/sqlite/connection.js +1 -1
- package/dist/src/storage/sqlite/index.d.ts +1 -0
- package/dist/src/storage/sqlite/index.js +2 -1
- package/dist/src/storage/sqlite/memory-records-repository.d.ts +101 -0
- package/dist/src/storage/sqlite/memory-records-repository.js +309 -0
- package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -0
- package/dist/src/storage/sqlite/migrations/011_goal_context_messages.sql +8 -0
- package/dist/src/storage/sqlite/migrations/012_memory_records.sql +63 -0
- package/dist/src/storage/sqlite/migrations/013_memory_trace_events.sql +21 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +2 -2
- package/dist/src/storage/sqlite/migrations/runner.js +4 -4
- package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +2 -2
- package/dist/src/storage/sqlite/schema.js +3 -3
- package/dist/src/storage/sqlite/schema.sql +95 -0
- package/dist/src/tui/backends/embedded-backend.js +6 -4
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
- package/dist/src/voice/tts/openai-compatible-speech.d.ts +1 -1
- package/dist/src/voice/tts/openai-compatible-speech.js.map +1 -1
- package/dist/src/voice/tts/providers/edge-speech.js +14 -2
- package/dist/src/voice/tts/providers/edge-speech.js.map +1 -1
- package/dist/src/voice/tts/speak-core.js +3 -3
- package/dist/src/voice/tts/speak-core.js.map +1 -1
- package/dist/src/voice/tts/speech-provider-types.d.ts +2 -2
- package/dist/src/voice/tts/types.js +1 -1
- package/dist/src/voice/tts/types.js.map +1 -1
- package/dist/src/workflows/domain/result.d.ts +0 -1
- package/dist/src/workflows/engine/workflow-engine.js +7 -23
- package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
- package/dist/src/workflows/service/workflow-run-service.js +3 -4
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +1 -1
- package/package.json +4 -3
- package/dist/gateway/static/root/assets/agent-browser-settings-page-DPXc4hz8.js +0 -6
- package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-CTJ0YnRQ.js +0 -1
- package/dist/gateway/static/root/assets/agents-zJXQfJ_W.js +0 -71
- package/dist/gateway/static/root/assets/app-management-settings-panel-DzGbdr04.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-CPjfyzSD.js +0 -1
- package/dist/gateway/static/root/assets/config-api-NOoPiIYz.js +0 -3
- package/dist/gateway/static/root/assets/connectors-settings-CAXYMOdp.js +0 -2
- package/dist/gateway/static/root/assets/cron-api-C9BOqAXd.js +0 -1
- package/dist/gateway/static/root/assets/cron-page-DuUbBeKI.js +0 -3
- package/dist/gateway/static/root/assets/dreaming-settings-DQ4DtiK1.js +0 -1
- package/dist/gateway/static/root/assets/gateway-config-api-C-xjn__h.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-BMPwIjKI.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-BJsyjJnF.js +0 -1
- package/dist/gateway/static/root/assets/goals-page-BerDgIhw.js +0 -2
- package/dist/gateway/static/root/assets/goals-settings-ByTjeAto.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-TbHgcjTn.js +0 -1
- package/dist/gateway/static/root/assets/index-AkTrf6Pb.js +0 -122
- package/dist/gateway/static/root/assets/index-fh5sXTj9.css +0 -1
- package/dist/gateway/static/root/assets/logs-page-DGXuPf5B.js +0 -2
- package/dist/gateway/static/root/assets/messages-upgxw6Ub.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-Bot16nn7.js +0 -2
- package/dist/gateway/static/root/assets/note-detail-page-Brlyou8M.js +0 -2
- package/dist/gateway/static/root/assets/notes-page-DvZ4pwc-.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-BZEDmxbZ.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-DdGGlsfn.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-DlkEkPf9.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-DFPTrsPF.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-CYCCfgh4.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-Bff1pGd0.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-CJGKpBur.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-C6ocduTD.js +0 -2
- package/dist/gateway/static/root/assets/system-settings-panel-5jrIEr5b.js +0 -1
- package/dist/gateway/static/root/assets/use-agent-defaults-form-BuiXLIs5.js +0 -1
- package/dist/gateway/static/root/assets/use-settings-tab-guard-CW5JORnl.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DDoQyghO.js +0 -1
- package/dist/gateway/static/root/assets/workflow-page.utils-CKjeEGqx.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-B604ehHG.js +0 -18
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { createLogger } from "../../utils/logger/index.js";
|
|
2
|
+
import { init_logger } from "../../utils/logger.js";
|
|
3
|
+
import { modelscopeRegistryAdapter } from "./modelscope.js";
|
|
4
|
+
import { officialMcpRegistryAdapter } from "./official-mcp.js";
|
|
5
|
+
import { smitheryRegistryAdapter } from "./smithery.js";
|
|
6
|
+
//#region src/connectors/registries/search.ts
|
|
7
|
+
init_logger();
|
|
8
|
+
const log = createLogger("Connectors:Registry");
|
|
9
|
+
const registryAdapters = /* @__PURE__ */ new Map();
|
|
10
|
+
const REGISTRY_CACHE_TTL_MS = 600 * 1e3;
|
|
11
|
+
const registrySearchCache = /* @__PURE__ */ new Map();
|
|
12
|
+
function registerConnectorRegistryAdapter(registration) {
|
|
13
|
+
registryAdapters.set(registration.adapter.source, registration.adapter);
|
|
14
|
+
registrySearchCache.clear();
|
|
15
|
+
}
|
|
16
|
+
function unregisterConnectorRegistryAdapter(source) {
|
|
17
|
+
const removed = registryAdapters.delete(source);
|
|
18
|
+
if (removed) registrySearchCache.clear();
|
|
19
|
+
return removed;
|
|
20
|
+
}
|
|
21
|
+
registerConnectorRegistryAdapter({ adapter: officialMcpRegistryAdapter });
|
|
22
|
+
registerConnectorRegistryAdapter({ adapter: smitheryRegistryAdapter });
|
|
23
|
+
registerConnectorRegistryAdapter({ adapter: modelscopeRegistryAdapter });
|
|
24
|
+
function cacheKey(params) {
|
|
25
|
+
return JSON.stringify({
|
|
26
|
+
source: params.source ?? "all",
|
|
27
|
+
query: params.query?.trim() ?? "",
|
|
28
|
+
page: params.page ?? 1,
|
|
29
|
+
pageSize: params.pageSize ?? 24,
|
|
30
|
+
browse: params.browse ?? false
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function listConnectorRegistries() {
|
|
34
|
+
return [...registryAdapters.values()].map((registry) => ({
|
|
35
|
+
id: registry.source,
|
|
36
|
+
displayName: registry.displayName
|
|
37
|
+
}));
|
|
38
|
+
}
|
|
39
|
+
function isConnectorRegistrySource(source) {
|
|
40
|
+
return registryAdapters.has(source);
|
|
41
|
+
}
|
|
42
|
+
async function runRegistrySearch(params) {
|
|
43
|
+
const source = params.source ?? "all";
|
|
44
|
+
const registries = source === "all" ? [...registryAdapters.values()] : [...registryAdapters.values()].filter((registry) => registry.source === source);
|
|
45
|
+
return Promise.all(registries.map(async (registry) => {
|
|
46
|
+
try {
|
|
47
|
+
return await registry.search(params);
|
|
48
|
+
} catch (error) {
|
|
49
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
50
|
+
log.warn({
|
|
51
|
+
source: registry.source,
|
|
52
|
+
errorMessage
|
|
53
|
+
}, `Connector registry search failed: ${errorMessage}`);
|
|
54
|
+
return {
|
|
55
|
+
source: registry.source,
|
|
56
|
+
connectors: [],
|
|
57
|
+
error: errorMessage
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
async function searchConnectorRegistries(params) {
|
|
63
|
+
if (!params.query?.trim() && !params.browse) {
|
|
64
|
+
const source = params.source ?? "all";
|
|
65
|
+
return (source === "all" ? [...registryAdapters.values()] : [...registryAdapters.values()].filter((registry) => registry.source === source)).map((registry) => ({
|
|
66
|
+
source: registry.source,
|
|
67
|
+
connectors: []
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
const key = cacheKey(params);
|
|
71
|
+
const now = Date.now();
|
|
72
|
+
const cached = registrySearchCache.get(key);
|
|
73
|
+
if (cached && cached.expiresAt > now) return cached.promise;
|
|
74
|
+
const promise = runRegistrySearch(params);
|
|
75
|
+
registrySearchCache.set(key, {
|
|
76
|
+
expiresAt: now + REGISTRY_CACHE_TTL_MS,
|
|
77
|
+
promise
|
|
78
|
+
});
|
|
79
|
+
try {
|
|
80
|
+
return await promise;
|
|
81
|
+
} catch (error) {
|
|
82
|
+
registrySearchCache.delete(key);
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//#endregion
|
|
87
|
+
export { isConnectorRegistrySource, listConnectorRegistries, registerConnectorRegistryAdapter, searchConnectorRegistries, unregisterConnectorRegistryAdapter };
|
|
88
|
+
|
|
89
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","names":[],"sources":["../../../../src/connectors/registries/search.ts"],"sourcesContent":["import { createLogger } from '../../utils/logger.js';\nimport { modelscopeRegistryAdapter } from './modelscope.js';\nimport { officialMcpRegistryAdapter } from './official-mcp.js';\nimport { smitheryRegistryAdapter } from './smithery.js';\nimport type { ConnectorRegistryAdapter, ConnectorRegistrySearchParams, ConnectorRegistrySearchResult } from './types.js';\n\nconst log = createLogger('Connectors:Registry');\n\nconst registryAdapters = new Map<string, ConnectorRegistryAdapter>();\nconst REGISTRY_CACHE_TTL_MS = 10 * 60 * 1000;\nconst registrySearchCache = new Map<string, { expiresAt: number; promise: Promise<ConnectorRegistrySearchResult[]> }>();\n\nexport type ConnectorRegistryRegistration = {\n adapter: ConnectorRegistryAdapter;\n};\n\nexport function registerConnectorRegistryAdapter(registration: ConnectorRegistryRegistration): void {\n registryAdapters.set(registration.adapter.source, registration.adapter);\n registrySearchCache.clear();\n}\n\nexport function unregisterConnectorRegistryAdapter(source: string): boolean {\n const removed = registryAdapters.delete(source);\n if (removed) registrySearchCache.clear();\n return removed;\n}\n\nregisterConnectorRegistryAdapter({ adapter: officialMcpRegistryAdapter });\nregisterConnectorRegistryAdapter({ adapter: smitheryRegistryAdapter });\nregisterConnectorRegistryAdapter({ adapter: modelscopeRegistryAdapter });\n\nfunction cacheKey(params: ConnectorRegistrySearchParams): string {\n return JSON.stringify({\n source: params.source ?? 'all',\n query: params.query?.trim() ?? '',\n page: params.page ?? 1,\n pageSize: params.pageSize ?? 24,\n browse: params.browse ?? false,\n });\n}\n\nexport function listConnectorRegistries(): Array<{ id: string; displayName: string }> {\n return [...registryAdapters.values()].map((registry) => ({ id: registry.source, displayName: registry.displayName }));\n}\n\nexport function isConnectorRegistrySource(source: string): boolean {\n return registryAdapters.has(source);\n}\n\nasync function runRegistrySearch(params: ConnectorRegistrySearchParams): Promise<ConnectorRegistrySearchResult[]> {\n const source = params.source ?? 'all';\n const registries = source === 'all'\n ? [...registryAdapters.values()]\n : [...registryAdapters.values()].filter((registry) => registry.source === source);\n return Promise.all(registries.map(async (registry) => {\n try {\n return await registry.search(params);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ source: registry.source, errorMessage }, `Connector registry search failed: ${errorMessage}`);\n return { source: registry.source, connectors: [], error: errorMessage } satisfies ConnectorRegistrySearchResult;\n }\n }));\n}\n\nexport async function searchConnectorRegistries(params: ConnectorRegistrySearchParams): Promise<ConnectorRegistrySearchResult[]> {\n if (!params.query?.trim() && !params.browse) {\n const source = params.source ?? 'all';\n const registries = source === 'all'\n ? [...registryAdapters.values()]\n : [...registryAdapters.values()].filter((registry) => registry.source === source);\n return registries.map((registry) => ({ source: registry.source, connectors: [] }));\n }\n const key = cacheKey(params);\n const now = Date.now();\n const cached = registrySearchCache.get(key);\n if (cached && cached.expiresAt > now) {\n return cached.promise;\n }\n const promise = runRegistrySearch(params);\n registrySearchCache.set(key, { expiresAt: now + REGISTRY_CACHE_TTL_MS, promise });\n try {\n return await promise;\n } catch (error) {\n registrySearchCache.delete(key);\n throw error;\n }\n}\n"],"mappings":";;;;;;aAAqD;AAMrD,MAAM,MAAM,aAAa,sBAAsB;AAE/C,MAAM,mCAAmB,IAAI,KAAuC;AACpE,MAAM,wBAAwB,MAAU;AACxC,MAAM,sCAAsB,IAAI,KAAuF;AAMvH,SAAgB,iCAAiC,cAAmD;AAClG,kBAAiB,IAAI,aAAa,QAAQ,QAAQ,aAAa,QAAQ;AACvE,qBAAoB,OAAO;;AAG7B,SAAgB,mCAAmC,QAAyB;CAC1E,MAAM,UAAU,iBAAiB,OAAO,OAAO;AAC/C,KAAI,QAAS,qBAAoB,OAAO;AACxC,QAAO;;AAGT,iCAAiC,EAAE,SAAS,4BAA4B,CAAC;AACzE,iCAAiC,EAAE,SAAS,yBAAyB,CAAC;AACtE,iCAAiC,EAAE,SAAS,2BAA2B,CAAC;AAExE,SAAS,SAAS,QAA+C;AAC/D,QAAO,KAAK,UAAU;EACpB,QAAQ,OAAO,UAAU;EACzB,OAAO,OAAO,OAAO,MAAM,IAAI;EAC/B,MAAM,OAAO,QAAQ;EACrB,UAAU,OAAO,YAAY;EAC7B,QAAQ,OAAO,UAAU;EAC1B,CAAC;;AAGJ,SAAgB,0BAAsE;AACpF,QAAO,CAAC,GAAG,iBAAiB,QAAQ,CAAC,CAAC,KAAK,cAAc;EAAE,IAAI,SAAS;EAAQ,aAAa,SAAS;EAAa,EAAE;;AAGvH,SAAgB,0BAA0B,QAAyB;AACjE,QAAO,iBAAiB,IAAI,OAAO;;AAGrC,eAAe,kBAAkB,QAAiF;CAChH,MAAM,SAAS,OAAO,UAAU;CAChC,MAAM,aAAa,WAAW,QAC1B,CAAC,GAAG,iBAAiB,QAAQ,CAAC,GAC9B,CAAC,GAAG,iBAAiB,QAAQ,CAAC,CAAC,QAAQ,aAAa,SAAS,WAAW,OAAO;AACnF,QAAO,QAAQ,IAAI,WAAW,IAAI,OAAO,aAAa;AACpD,MAAI;AACF,UAAO,MAAM,SAAS,OAAO,OAAO;WAC7B,OAAO;GACd,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAC3E,OAAI,KAAK;IAAE,QAAQ,SAAS;IAAQ;IAAc,EAAE,qCAAqC,eAAe;AACxG,UAAO;IAAE,QAAQ,SAAS;IAAQ,YAAY,EAAE;IAAE,OAAO;IAAc;;GAEzE,CAAC;;AAGL,eAAsB,0BAA0B,QAAiF;AAC/H,KAAI,CAAC,OAAO,OAAO,MAAM,IAAI,CAAC,OAAO,QAAQ;EAC3C,MAAM,SAAS,OAAO,UAAU;AAIhC,UAHmB,WAAW,QAC1B,CAAC,GAAG,iBAAiB,QAAQ,CAAC,GAC9B,CAAC,GAAG,iBAAiB,QAAQ,CAAC,CAAC,QAAQ,aAAa,SAAS,WAAW,OAAO,EACjE,KAAK,cAAc;GAAE,QAAQ,SAAS;GAAQ,YAAY,EAAE;GAAE,EAAE;;CAEpF,MAAM,MAAM,SAAS,OAAO;CAC5B,MAAM,MAAM,KAAK,KAAK;CACtB,MAAM,SAAS,oBAAoB,IAAI,IAAI;AAC3C,KAAI,UAAU,OAAO,YAAY,IAC/B,QAAO,OAAO;CAEhB,MAAM,UAAU,kBAAkB,OAAO;AACzC,qBAAoB,IAAI,KAAK;EAAE,WAAW,MAAM;EAAuB;EAAS,CAAC;AACjF,KAAI;AACF,SAAO,MAAM;UACN,OAAO;AACd,sBAAoB,OAAO,IAAI;AAC/B,QAAM"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
//#region src/connectors/registries/smithery.ts
|
|
2
|
+
const DEFAULT_BASE_URL = "https://registry.smithery.ai";
|
|
3
|
+
function smitheryApiKey() {
|
|
4
|
+
return process.env.XOPC_SMITHERY_API_KEY?.trim() || process.env.SMITHERY_API_KEY?.trim() || void 0;
|
|
5
|
+
}
|
|
6
|
+
function smitheryBaseUrl() {
|
|
7
|
+
return process.env.XOPC_SMITHERY_REGISTRY_URL?.trim().replace(/\/+$/, "") || DEFAULT_BASE_URL;
|
|
8
|
+
}
|
|
9
|
+
function readString(value) {
|
|
10
|
+
return typeof value === "string" && value.trim() ? value.trim() : void 0;
|
|
11
|
+
}
|
|
12
|
+
function slugFrom(value) {
|
|
13
|
+
return value.trim().toLowerCase().replace(/^@/, "").replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 64) || "smithery-mcp";
|
|
14
|
+
}
|
|
15
|
+
function connectorFromSmitheryServer(server, apiKey) {
|
|
16
|
+
const qualifiedName = readString(server.qualifiedName ?? server.qualified_name ?? server.name ?? server.id);
|
|
17
|
+
const displayName = readString(server.displayName ?? server.display_name ?? server.name) ?? qualifiedName;
|
|
18
|
+
if (!qualifiedName || !displayName) return void 0;
|
|
19
|
+
const serverId = slugFrom(qualifiedName);
|
|
20
|
+
const url = `https://server.smithery.ai/${qualifiedName.split("/").map((part) => encodeURIComponent(part)).join("/")}/mcp`;
|
|
21
|
+
return {
|
|
22
|
+
id: `smithery-${serverId}`,
|
|
23
|
+
version: readString(server.version) ?? "registry",
|
|
24
|
+
displayName,
|
|
25
|
+
description: readString(server.description) ?? "MCP server hosted through Smithery.",
|
|
26
|
+
category: "custom",
|
|
27
|
+
kind: "mcp",
|
|
28
|
+
source: "registry",
|
|
29
|
+
capabilities: [
|
|
30
|
+
"tools",
|
|
31
|
+
"resources",
|
|
32
|
+
"prompts",
|
|
33
|
+
"auth.apiKey",
|
|
34
|
+
"runtime.mcp.streamableHttp"
|
|
35
|
+
],
|
|
36
|
+
tags: [
|
|
37
|
+
"smithery",
|
|
38
|
+
"registry",
|
|
39
|
+
"mcp"
|
|
40
|
+
],
|
|
41
|
+
auth: { mode: "apiKey" },
|
|
42
|
+
setup: apiKey ? {} : { secrets: [{
|
|
43
|
+
key: "SMITHERY_AUTHORIZATION_HEADER",
|
|
44
|
+
label: "Smithery Authorization header",
|
|
45
|
+
description: "Full Authorization header used when launching hosted Smithery MCP servers, for example \"Bearer ...\".",
|
|
46
|
+
required: true
|
|
47
|
+
}] },
|
|
48
|
+
runtime: {
|
|
49
|
+
type: "mcp",
|
|
50
|
+
serverId,
|
|
51
|
+
serverTemplate: {
|
|
52
|
+
url,
|
|
53
|
+
transport: "streamable-http",
|
|
54
|
+
headers: { Authorization: apiKey ? `Bearer ${apiKey}` : "{{secrets.SMITHERY_AUTHORIZATION_HEADER}}" }
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function extractServers(payload) {
|
|
60
|
+
if (Array.isArray(payload)) return payload.filter((item) => Boolean(item && typeof item === "object" && !Array.isArray(item)));
|
|
61
|
+
if (!payload || typeof payload !== "object" || Array.isArray(payload)) return [];
|
|
62
|
+
const data = payload;
|
|
63
|
+
for (const key of [
|
|
64
|
+
"servers",
|
|
65
|
+
"items",
|
|
66
|
+
"results",
|
|
67
|
+
"data"
|
|
68
|
+
]) {
|
|
69
|
+
const value = data[key];
|
|
70
|
+
if (Array.isArray(value)) return value.filter((item) => Boolean(item && typeof item === "object" && !Array.isArray(item)));
|
|
71
|
+
}
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
const smitheryRegistryAdapter = {
|
|
75
|
+
source: "smithery",
|
|
76
|
+
displayName: "Smithery",
|
|
77
|
+
async search(params) {
|
|
78
|
+
const apiKey = smitheryApiKey();
|
|
79
|
+
const url = new URL("/servers", smitheryBaseUrl());
|
|
80
|
+
const query = params.query?.trim();
|
|
81
|
+
if (query) url.searchParams.set("q", query);
|
|
82
|
+
url.searchParams.set("pageSize", String(Math.min(Math.max(params.pageSize ?? 24, 1), 100)));
|
|
83
|
+
if (params.page && params.page > 1) url.searchParams.set("page", String(params.page));
|
|
84
|
+
const response = await fetch(url, { headers: {
|
|
85
|
+
Accept: "application/json",
|
|
86
|
+
...apiKey ? { Authorization: `Bearer ${apiKey}` } : {}
|
|
87
|
+
} });
|
|
88
|
+
if (!response.ok) throw new Error(`Smithery registry returned ${response.status}`);
|
|
89
|
+
return {
|
|
90
|
+
source: "smithery",
|
|
91
|
+
connectors: extractServers(await response.json()).map((server) => connectorFromSmitheryServer(server, apiKey)).filter((item) => Boolean(item))
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
//#endregion
|
|
96
|
+
export { smitheryRegistryAdapter };
|
|
97
|
+
|
|
98
|
+
//# sourceMappingURL=smithery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smithery.js","names":[],"sources":["../../../../src/connectors/registries/smithery.ts"],"sourcesContent":["import type { ConnectorDefinition } from '../types.js';\nimport type { ConnectorRegistryAdapter, ConnectorRegistrySearchParams, ConnectorRegistrySearchResult } from './types.js';\n\nconst DEFAULT_BASE_URL = 'https://registry.smithery.ai';\n\nfunction smitheryApiKey(): string | undefined {\n return process.env.XOPC_SMITHERY_API_KEY?.trim() || process.env.SMITHERY_API_KEY?.trim() || undefined;\n}\n\nfunction smitheryBaseUrl(): string {\n return process.env.XOPC_SMITHERY_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 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) || 'smithery-mcp';\n}\n\nfunction connectorFromSmitheryServer(server: Record<string, unknown>, apiKey?: string): ConnectorDefinition | undefined {\n const qualifiedName = readString(server.qualifiedName ?? server.qualified_name ?? server.name ?? server.id);\n const displayName = readString(server.displayName ?? server.display_name ?? server.name) ?? qualifiedName;\n if (!qualifiedName || !displayName) return undefined;\n const serverId = slugFrom(qualifiedName);\n const encodedPath = qualifiedName.split('/').map((part) => encodeURIComponent(part)).join('/');\n const url = `https://server.smithery.ai/${encodedPath}/mcp`;\n return {\n id: `smithery-${serverId}`,\n version: readString(server.version) ?? 'registry',\n displayName,\n description: readString(server.description) ?? 'MCP server hosted through Smithery.',\n category: 'custom',\n kind: 'mcp',\n source: 'registry',\n capabilities: ['tools', 'resources', 'prompts', 'auth.apiKey', 'runtime.mcp.streamableHttp'],\n tags: ['smithery', 'registry', 'mcp'],\n auth: { mode: 'apiKey' },\n setup: apiKey\n ? {}\n : {\n secrets: [\n {\n key: 'SMITHERY_AUTHORIZATION_HEADER',\n label: 'Smithery Authorization header',\n description: 'Full Authorization header used when launching hosted Smithery MCP servers, for example \"Bearer ...\".',\n required: true,\n },\n ],\n },\n runtime: {\n type: 'mcp',\n serverId,\n serverTemplate: {\n url,\n transport: 'streamable-http',\n headers: {\n Authorization: apiKey ? `Bearer ${apiKey}` : '{{secrets.SMITHERY_AUTHORIZATION_HEADER}}',\n },\n },\n },\n };\n}\n\nfunction extractServers(payload: unknown): Record<string, unknown>[] {\n if (Array.isArray(payload)) return payload.filter((item): item is Record<string, unknown> => Boolean(item && typeof item === 'object' && !Array.isArray(item)));\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) return [];\n const data = payload as Record<string, unknown>;\n for (const key of ['servers', 'items', 'results', 'data']) {\n const value = data[key];\n if (Array.isArray(value)) {\n return value.filter((item): item is Record<string, unknown> => Boolean(item && typeof item === 'object' && !Array.isArray(item)));\n }\n }\n return [];\n}\n\nexport const smitheryRegistryAdapter: ConnectorRegistryAdapter = {\n source: 'smithery',\n displayName: 'Smithery',\n async search(params: ConnectorRegistrySearchParams): Promise<ConnectorRegistrySearchResult> {\n const apiKey = smitheryApiKey();\n const url = new URL('/servers', smitheryBaseUrl());\n const query = params.query?.trim();\n if (query) url.searchParams.set('q', query);\n url.searchParams.set('pageSize', String(Math.min(Math.max(params.pageSize ?? 24, 1), 100)));\n if (params.page && params.page > 1) url.searchParams.set('page', String(params.page));\n const response = await fetch(url, {\n headers: {\n Accept: 'application/json',\n ...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}),\n },\n });\n if (!response.ok) throw new Error(`Smithery registry returned ${response.status}`);\n const payload = await response.json();\n return {\n source: 'smithery',\n connectors: extractServers(payload).map((server) => connectorFromSmitheryServer(server, apiKey)).filter((item): item is ConnectorDefinition => Boolean(item)),\n };\n },\n};\n"],"mappings":";AAGA,MAAM,mBAAmB;AAEzB,SAAS,iBAAqC;AAC5C,QAAO,QAAQ,IAAI,uBAAuB,MAAM,IAAI,QAAQ,IAAI,kBAAkB,MAAM,IAAI,KAAA;;AAG9F,SAAS,kBAA0B;AACjC,QAAO,QAAQ,IAAI,4BAA4B,MAAM,CAAC,QAAQ,QAAQ,GAAG,IAAI;;AAG/E,SAAS,WAAW,OAAoC;AACtD,QAAO,OAAO,UAAU,YAAY,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,KAAA;;AAGpE,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,4BAA4B,QAAiC,QAAkD;CACtH,MAAM,gBAAgB,WAAW,OAAO,iBAAiB,OAAO,kBAAkB,OAAO,QAAQ,OAAO,GAAG;CAC3G,MAAM,cAAc,WAAW,OAAO,eAAe,OAAO,gBAAgB,OAAO,KAAK,IAAI;AAC5F,KAAI,CAAC,iBAAiB,CAAC,YAAa,QAAO,KAAA;CAC3C,MAAM,WAAW,SAAS,cAAc;CAExC,MAAM,MAAM,8BADQ,cAAc,MAAM,IAAI,CAAC,KAAK,SAAS,mBAAmB,KAAK,CAAC,CAAC,KAAK,IACrC,CAAC;AACtD,QAAO;EACL,IAAI,YAAY;EAChB,SAAS,WAAW,OAAO,QAAQ,IAAI;EACvC;EACA,aAAa,WAAW,OAAO,YAAY,IAAI;EAC/C,UAAU;EACV,MAAM;EACN,QAAQ;EACR,cAAc;GAAC;GAAS;GAAa;GAAW;GAAe;GAA6B;EAC5F,MAAM;GAAC;GAAY;GAAY;GAAM;EACrC,MAAM,EAAE,MAAM,UAAU;EACxB,OAAO,SACH,EAAE,GACF,EACE,SAAS,CACP;GACE,KAAK;GACL,OAAO;GACP,aAAa;GACb,UAAU;GACX,CACF,EACF;EACL,SAAS;GACP,MAAM;GACN;GACA,gBAAgB;IACd;IACA,WAAW;IACX,SAAS,EACP,eAAe,SAAS,UAAU,WAAW,6CAC9C;IACF;GACF;EACF;;AAGH,SAAS,eAAe,SAA6C;AACnE,KAAI,MAAM,QAAQ,QAAQ,CAAE,QAAO,QAAQ,QAAQ,SAA0C,QAAQ,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,KAAK,CAAC,CAAC;AAC/J,KAAI,CAAC,WAAW,OAAO,YAAY,YAAY,MAAM,QAAQ,QAAQ,CAAE,QAAO,EAAE;CAChF,MAAM,OAAO;AACb,MAAK,MAAM,OAAO;EAAC;EAAW;EAAS;EAAW;EAAO,EAAE;EACzD,MAAM,QAAQ,KAAK;AACnB,MAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,MAAM,QAAQ,SAA0C,QAAQ,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,KAAK,CAAC,CAAC;;AAGrI,QAAO,EAAE;;AAGX,MAAa,0BAAoD;CAC/D,QAAQ;CACR,aAAa;CACb,MAAM,OAAO,QAA+E;EAC1F,MAAM,SAAS,gBAAgB;EAC/B,MAAM,MAAM,IAAI,IAAI,YAAY,iBAAiB,CAAC;EAClD,MAAM,QAAQ,OAAO,OAAO,MAAM;AAClC,MAAI,MAAO,KAAI,aAAa,IAAI,KAAK,MAAM;AAC3C,MAAI,aAAa,IAAI,YAAY,OAAO,KAAK,IAAI,KAAK,IAAI,OAAO,YAAY,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;AAC3F,MAAI,OAAO,QAAQ,OAAO,OAAO,EAAG,KAAI,aAAa,IAAI,QAAQ,OAAO,OAAO,KAAK,CAAC;EACrF,MAAM,WAAW,MAAM,MAAM,KAAK,EAChC,SAAS;GACP,QAAQ;GACR,GAAI,SAAS,EAAE,eAAe,UAAU,UAAU,GAAG,EAAE;GACxD,EACF,CAAC;AACF,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,8BAA8B,SAAS,SAAS;AAElF,SAAO;GACL,QAAQ;GACR,YAAY,eAAe,MAHP,SAAS,MAAM,CAGA,CAAC,KAAK,WAAW,4BAA4B,QAAQ,OAAO,CAAC,CAAC,QAAQ,SAAsC,QAAQ,KAAK,CAAC;GAC9J;;CAEJ"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ConnectorDefinition } from '../types.js';
|
|
2
|
+
export type ConnectorRegistrySource = string;
|
|
3
|
+
export type ConnectorRegistrySearchParams = {
|
|
4
|
+
query?: string;
|
|
5
|
+
page?: number;
|
|
6
|
+
pageSize?: number;
|
|
7
|
+
source?: ConnectorRegistrySource | 'all';
|
|
8
|
+
browse?: boolean;
|
|
9
|
+
};
|
|
10
|
+
export type ConnectorRegistrySearchResult = {
|
|
11
|
+
source: ConnectorRegistrySource;
|
|
12
|
+
connectors: ConnectorDefinition[];
|
|
13
|
+
totalPages?: number;
|
|
14
|
+
error?: string;
|
|
15
|
+
};
|
|
16
|
+
export type ConnectorRegistryAdapter = {
|
|
17
|
+
source: ConnectorRegistrySource;
|
|
18
|
+
displayName: string;
|
|
19
|
+
search(params: ConnectorRegistrySearchParams): Promise<ConnectorRegistrySearchResult>;
|
|
20
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { CredentialResolver, init_credentials } from "../auth/credentials.js";
|
|
2
|
+
import { consumeConnectorSetupSecretRef } from "./setup-secrets.js";
|
|
2
3
|
//#region src/connectors/secret-store.ts
|
|
3
4
|
init_credentials();
|
|
4
5
|
function normalizeSecretSegment(value) {
|
|
@@ -21,8 +22,9 @@ function isConnectorSecretReference(value) {
|
|
|
21
22
|
async function saveConnectorSecrets(definition, input, resolver = new CredentialResolver()) {
|
|
22
23
|
for (const secret of definition.setup.secrets ?? []) {
|
|
23
24
|
const rawValue = input.secrets?.[secret.key];
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
const resolvedValue = typeof rawValue === "string" && rawValue.trim().startsWith("secret://") ? consumeConnectorSetupSecretRef(rawValue) : rawValue;
|
|
26
|
+
if (typeof resolvedValue !== "string" || resolvedValue.trim().length === 0) continue;
|
|
27
|
+
await resolver.saveApiKey(connectorSecretProviderId(definition.id, secret.key), resolvedValue.trim(), { profileName: "default" });
|
|
26
28
|
}
|
|
27
29
|
}
|
|
28
30
|
async function resolveSecretReference(reference, resolver) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secret-store.js","names":[],"sources":["../../../src/connectors/secret-store.ts"],"sourcesContent":["import { CredentialResolver } from '../auth/credentials.js';\nimport type { ConnectorDefinition, ConnectorInstallInput, ConnectorSecretReference } from './types.js';\n\nfunction normalizeSecretSegment(value: string): string {\n return value.trim().toLowerCase().replace(/[^a-z0-9_-]+/g, '-').replace(/^-+|-+$/g, '');\n}\n\nexport function connectorSecretProviderId(connectorId: string, fieldKey: string): string {\n const normalizedConnectorId = normalizeSecretSegment(connectorId);\n const normalizedFieldKey = normalizeSecretSegment(fieldKey);\n return `connector-${normalizedConnectorId}-${normalizedFieldKey}`;\n}\n\nexport function createConnectorSecretReference(connectorId: string, fieldKey: string): ConnectorSecretReference {\n return {\n xopcSecretRef: {\n provider: connectorSecretProviderId(connectorId, fieldKey),\n fieldKey,\n },\n };\n}\n\nexport function isConnectorSecretReference(value: unknown): value is ConnectorSecretReference {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n const ref = (value as Record<string, unknown>).xopcSecretRef;\n return Boolean(\n ref &&\n typeof ref === 'object' &&\n !Array.isArray(ref) &&\n typeof (ref as Record<string, unknown>).provider === 'string' &&\n typeof (ref as Record<string, unknown>).fieldKey === 'string',\n );\n}\n\nexport async function saveConnectorSecrets(\n definition: ConnectorDefinition,\n input: ConnectorInstallInput,\n resolver = new CredentialResolver(),\n): Promise<void> {\n for (const secret of definition.setup.secrets ?? []) {\n const rawValue = input.secrets?.[secret.key];\n if (typeof
|
|
1
|
+
{"version":3,"file":"secret-store.js","names":[],"sources":["../../../src/connectors/secret-store.ts"],"sourcesContent":["import { CredentialResolver } from '../auth/credentials.js';\nimport { consumeConnectorSetupSecretRef } from './setup-secrets.js';\nimport type { ConnectorDefinition, ConnectorInstallInput, ConnectorSecretReference } from './types.js';\n\nfunction normalizeSecretSegment(value: string): string {\n return value.trim().toLowerCase().replace(/[^a-z0-9_-]+/g, '-').replace(/^-+|-+$/g, '');\n}\n\nexport function connectorSecretProviderId(connectorId: string, fieldKey: string): string {\n const normalizedConnectorId = normalizeSecretSegment(connectorId);\n const normalizedFieldKey = normalizeSecretSegment(fieldKey);\n return `connector-${normalizedConnectorId}-${normalizedFieldKey}`;\n}\n\nexport function createConnectorSecretReference(connectorId: string, fieldKey: string): ConnectorSecretReference {\n return {\n xopcSecretRef: {\n provider: connectorSecretProviderId(connectorId, fieldKey),\n fieldKey,\n },\n };\n}\n\nexport function isConnectorSecretReference(value: unknown): value is ConnectorSecretReference {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n const ref = (value as Record<string, unknown>).xopcSecretRef;\n return Boolean(\n ref &&\n typeof ref === 'object' &&\n !Array.isArray(ref) &&\n typeof (ref as Record<string, unknown>).provider === 'string' &&\n typeof (ref as Record<string, unknown>).fieldKey === 'string',\n );\n}\n\nexport async function saveConnectorSecrets(\n definition: ConnectorDefinition,\n input: ConnectorInstallInput,\n resolver = new CredentialResolver(),\n): Promise<void> {\n for (const secret of definition.setup.secrets ?? []) {\n const rawValue = input.secrets?.[secret.key];\n const resolvedValue = typeof rawValue === 'string' && rawValue.trim().startsWith('secret://')\n ? consumeConnectorSetupSecretRef(rawValue)\n : rawValue;\n if (typeof resolvedValue !== 'string' || resolvedValue.trim().length === 0) {\n continue;\n }\n await resolver.saveApiKey(connectorSecretProviderId(definition.id, secret.key), resolvedValue.trim(), {\n profileName: 'default',\n });\n }\n}\n\nasync function resolveSecretReference(\n reference: ConnectorSecretReference,\n resolver: CredentialResolver,\n): Promise<string | undefined> {\n const value = await resolver.resolveApiKey(reference.xopcSecretRef.provider);\n return value ?? undefined;\n}\n\nexport async function resolveConnectorSecretReferences(\n value: unknown,\n resolver = new CredentialResolver(),\n): Promise<unknown> {\n if (isConnectorSecretReference(value)) {\n return resolveSecretReference(value, resolver);\n }\n if (Array.isArray(value)) {\n const items = await Promise.all(value.map((item) => resolveConnectorSecretReferences(item, resolver)));\n return items.filter((item) => item !== undefined);\n }\n if (value && typeof value === 'object') {\n const output: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(value as Record<string, unknown>)) {\n const resolved = await resolveConnectorSecretReferences(child, resolver);\n if (resolved !== undefined) {\n output[key] = resolved;\n }\n }\n return output;\n }\n return value;\n}\n"],"mappings":";;;kBAA4D;AAI5D,SAAS,uBAAuB,OAAuB;AACrD,QAAO,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,iBAAiB,IAAI,CAAC,QAAQ,YAAY,GAAG;;AAGzF,SAAgB,0BAA0B,aAAqB,UAA0B;AAGvF,QAAO,aAFuB,uBAAuB,YAEZ,CAAC,GADf,uBAAuB,SACa;;AAGjE,SAAgB,+BAA+B,aAAqB,UAA4C;AAC9G,QAAO,EACL,eAAe;EACb,UAAU,0BAA0B,aAAa,SAAS;EAC1D;EACD,EACF;;AAGH,SAAgB,2BAA2B,OAAmD;AAC5F,KAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,CAC7D,QAAO;CAET,MAAM,MAAO,MAAkC;AAC/C,QAAO,QACL,OACE,OAAO,QAAQ,YACf,CAAC,MAAM,QAAQ,IAAI,IACnB,OAAQ,IAAgC,aAAa,YACrD,OAAQ,IAAgC,aAAa,SACxD;;AAGH,eAAsB,qBACpB,YACA,OACA,WAAW,IAAI,oBAAoB,EACpB;AACf,MAAK,MAAM,UAAU,WAAW,MAAM,WAAW,EAAE,EAAE;EACnD,MAAM,WAAW,MAAM,UAAU,OAAO;EACxC,MAAM,gBAAgB,OAAO,aAAa,YAAY,SAAS,MAAM,CAAC,WAAW,YAAY,GACzF,+BAA+B,SAAS,GACxC;AACJ,MAAI,OAAO,kBAAkB,YAAY,cAAc,MAAM,CAAC,WAAW,EACvE;AAEF,QAAM,SAAS,WAAW,0BAA0B,WAAW,IAAI,OAAO,IAAI,EAAE,cAAc,MAAM,EAAE,EACpG,aAAa,WACd,CAAC;;;AAIN,eAAe,uBACb,WACA,UAC6B;AAE7B,QAAO,MADa,SAAS,cAAc,UAAU,cAAc,SAAS,IAC5D,KAAA;;AAGlB,eAAsB,iCACpB,OACA,WAAW,IAAI,oBAAoB,EACjB;AAClB,KAAI,2BAA2B,MAAM,CACnC,QAAO,uBAAuB,OAAO,SAAS;AAEhD,KAAI,MAAM,QAAQ,MAAM,CAEtB,SAAO,MADa,QAAQ,IAAI,MAAM,KAAK,SAAS,iCAAiC,MAAM,SAAS,CAAC,CAAC,EACzF,QAAQ,SAAS,SAAS,KAAA,EAAU;AAEnD,KAAI,SAAS,OAAO,UAAU,UAAU;EACtC,MAAM,SAAkC,EAAE;AAC1C,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAiC,EAAE;GAC3E,MAAM,WAAW,MAAM,iCAAiC,OAAO,SAAS;AACxE,OAAI,aAAa,KAAA,EACf,QAAO,OAAO;;AAGlB,SAAO;;AAET,QAAO"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type ConnectorSetupSecretRequest = {
|
|
2
|
+
ref: string;
|
|
3
|
+
key: string;
|
|
4
|
+
label?: string;
|
|
5
|
+
createdAt: number;
|
|
6
|
+
expiresAt: number;
|
|
7
|
+
};
|
|
8
|
+
export declare function createConnectorSetupSecretRequest(params: {
|
|
9
|
+
key: string;
|
|
10
|
+
label?: string;
|
|
11
|
+
}): ConnectorSetupSecretRequest;
|
|
12
|
+
export declare function submitConnectorSetupSecret(ref: string, value: string): boolean;
|
|
13
|
+
export declare function resolveConnectorSetupSecretRef(ref: string): string | undefined;
|
|
14
|
+
export declare function consumeConnectorSetupSecretRef(ref: string): string | undefined;
|
|
15
|
+
export declare function sweepExpiredConnectorSetupSecrets(): number;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
//#region src/connectors/setup-secrets.ts
|
|
3
|
+
const REQUEST_TIMEOUT_MS = 300 * 1e3;
|
|
4
|
+
const IDLE_TTL_MS = 900 * 1e3;
|
|
5
|
+
const pendingSecrets = /* @__PURE__ */ new Map();
|
|
6
|
+
function nowMs() {
|
|
7
|
+
return Date.now();
|
|
8
|
+
}
|
|
9
|
+
function createSecretRef() {
|
|
10
|
+
return `secret://${crypto.randomBytes(6).toString("hex")}`;
|
|
11
|
+
}
|
|
12
|
+
function createConnectorSetupSecretRequest(params) {
|
|
13
|
+
sweepExpiredConnectorSetupSecrets();
|
|
14
|
+
const createdAt = nowMs();
|
|
15
|
+
const request = {
|
|
16
|
+
ref: createSecretRef(),
|
|
17
|
+
key: params.key,
|
|
18
|
+
label: params.label,
|
|
19
|
+
createdAt,
|
|
20
|
+
expiresAt: createdAt + REQUEST_TIMEOUT_MS,
|
|
21
|
+
lastTouchedAt: createdAt
|
|
22
|
+
};
|
|
23
|
+
pendingSecrets.set(request.ref, request);
|
|
24
|
+
return {
|
|
25
|
+
ref: request.ref,
|
|
26
|
+
key: request.key,
|
|
27
|
+
label: request.label,
|
|
28
|
+
createdAt: request.createdAt,
|
|
29
|
+
expiresAt: request.expiresAt
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function submitConnectorSetupSecret(ref, value) {
|
|
33
|
+
sweepExpiredConnectorSetupSecrets();
|
|
34
|
+
const entry = pendingSecrets.get(ref.trim());
|
|
35
|
+
if (!entry || entry.expiresAt < nowMs() || typeof value !== "string" || value.length === 0) return false;
|
|
36
|
+
entry.value = value;
|
|
37
|
+
entry.lastTouchedAt = nowMs();
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
function resolveConnectorSetupSecretRef(ref) {
|
|
41
|
+
sweepExpiredConnectorSetupSecrets();
|
|
42
|
+
const entry = pendingSecrets.get(ref.trim());
|
|
43
|
+
if (!entry?.value) return void 0;
|
|
44
|
+
entry.lastTouchedAt = nowMs();
|
|
45
|
+
return entry.value;
|
|
46
|
+
}
|
|
47
|
+
function consumeConnectorSetupSecretRef(ref) {
|
|
48
|
+
const value = resolveConnectorSetupSecretRef(ref);
|
|
49
|
+
if (value !== void 0) pendingSecrets.delete(ref.trim());
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
function sweepExpiredConnectorSetupSecrets() {
|
|
53
|
+
const now = nowMs();
|
|
54
|
+
let removed = 0;
|
|
55
|
+
for (const [ref, entry] of pendingSecrets) if (entry.expiresAt < now || entry.lastTouchedAt + IDLE_TTL_MS < now) {
|
|
56
|
+
pendingSecrets.delete(ref);
|
|
57
|
+
removed += 1;
|
|
58
|
+
}
|
|
59
|
+
return removed;
|
|
60
|
+
}
|
|
61
|
+
//#endregion
|
|
62
|
+
export { consumeConnectorSetupSecretRef, createConnectorSetupSecretRequest, resolveConnectorSetupSecretRef, submitConnectorSetupSecret, sweepExpiredConnectorSetupSecrets };
|
|
63
|
+
|
|
64
|
+
//# sourceMappingURL=setup-secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-secrets.js","names":[],"sources":["../../../src/connectors/setup-secrets.ts"],"sourcesContent":["import crypto from 'node:crypto';\n\nconst REQUEST_TIMEOUT_MS = 5 * 60 * 1000;\nconst IDLE_TTL_MS = 15 * 60 * 1000;\n\nexport type ConnectorSetupSecretRequest = {\n ref: string;\n key: string;\n label?: string;\n createdAt: number;\n expiresAt: number;\n};\n\ntype PendingSecret = ConnectorSetupSecretRequest & {\n value?: string;\n lastTouchedAt: number;\n};\n\nconst pendingSecrets = new Map<string, PendingSecret>();\n\nfunction nowMs(): number {\n return Date.now();\n}\n\nfunction createSecretRef(): string {\n return `secret://${crypto.randomBytes(6).toString('hex')}`;\n}\n\nexport function createConnectorSetupSecretRequest(params: { key: string; label?: string }): ConnectorSetupSecretRequest {\n sweepExpiredConnectorSetupSecrets();\n const createdAt = nowMs();\n const request: PendingSecret = {\n ref: createSecretRef(),\n key: params.key,\n label: params.label,\n createdAt,\n expiresAt: createdAt + REQUEST_TIMEOUT_MS,\n lastTouchedAt: createdAt,\n };\n pendingSecrets.set(request.ref, request);\n return { ref: request.ref, key: request.key, label: request.label, createdAt: request.createdAt, expiresAt: request.expiresAt };\n}\n\nexport function submitConnectorSetupSecret(ref: string, value: string): boolean {\n sweepExpiredConnectorSetupSecrets();\n const entry = pendingSecrets.get(ref.trim());\n if (!entry || entry.expiresAt < nowMs() || typeof value !== 'string' || value.length === 0) {\n return false;\n }\n entry.value = value;\n entry.lastTouchedAt = nowMs();\n return true;\n}\n\nexport function resolveConnectorSetupSecretRef(ref: string): string | undefined {\n sweepExpiredConnectorSetupSecrets();\n const entry = pendingSecrets.get(ref.trim());\n if (!entry?.value) return undefined;\n entry.lastTouchedAt = nowMs();\n return entry.value;\n}\n\nexport function consumeConnectorSetupSecretRef(ref: string): string | undefined {\n const value = resolveConnectorSetupSecretRef(ref);\n if (value !== undefined) {\n pendingSecrets.delete(ref.trim());\n }\n return value;\n}\n\nexport function sweepExpiredConnectorSetupSecrets(): number {\n const now = nowMs();\n let removed = 0;\n for (const [ref, entry] of pendingSecrets) {\n if (entry.expiresAt < now || entry.lastTouchedAt + IDLE_TTL_MS < now) {\n pendingSecrets.delete(ref);\n removed += 1;\n }\n }\n return removed;\n}\n"],"mappings":";;AAEA,MAAM,qBAAqB,MAAS;AACpC,MAAM,cAAc,MAAU;AAe9B,MAAM,iCAAiB,IAAI,KAA4B;AAEvD,SAAS,QAAgB;AACvB,QAAO,KAAK,KAAK;;AAGnB,SAAS,kBAA0B;AACjC,QAAO,YAAY,OAAO,YAAY,EAAE,CAAC,SAAS,MAAM;;AAG1D,SAAgB,kCAAkC,QAAsE;AACtH,oCAAmC;CACnC,MAAM,YAAY,OAAO;CACzB,MAAM,UAAyB;EAC7B,KAAK,iBAAiB;EACtB,KAAK,OAAO;EACZ,OAAO,OAAO;EACd;EACA,WAAW,YAAY;EACvB,eAAe;EAChB;AACD,gBAAe,IAAI,QAAQ,KAAK,QAAQ;AACxC,QAAO;EAAE,KAAK,QAAQ;EAAK,KAAK,QAAQ;EAAK,OAAO,QAAQ;EAAO,WAAW,QAAQ;EAAW,WAAW,QAAQ;EAAW;;AAGjI,SAAgB,2BAA2B,KAAa,OAAwB;AAC9E,oCAAmC;CACnC,MAAM,QAAQ,eAAe,IAAI,IAAI,MAAM,CAAC;AAC5C,KAAI,CAAC,SAAS,MAAM,YAAY,OAAO,IAAI,OAAO,UAAU,YAAY,MAAM,WAAW,EACvF,QAAO;AAET,OAAM,QAAQ;AACd,OAAM,gBAAgB,OAAO;AAC7B,QAAO;;AAGT,SAAgB,+BAA+B,KAAiC;AAC9E,oCAAmC;CACnC,MAAM,QAAQ,eAAe,IAAI,IAAI,MAAM,CAAC;AAC5C,KAAI,CAAC,OAAO,MAAO,QAAO,KAAA;AAC1B,OAAM,gBAAgB,OAAO;AAC7B,QAAO,MAAM;;AAGf,SAAgB,+BAA+B,KAAiC;CAC9E,MAAM,QAAQ,+BAA+B,IAAI;AACjD,KAAI,UAAU,KAAA,EACZ,gBAAe,OAAO,IAAI,MAAM,CAAC;AAEnC,QAAO;;AAGT,SAAgB,oCAA4C;CAC1D,MAAM,MAAM,OAAO;CACnB,IAAI,UAAU;AACd,MAAK,MAAM,CAAC,KAAK,UAAU,eACzB,KAAI,MAAM,YAAY,OAAO,MAAM,gBAAgB,cAAc,KAAK;AACpE,iBAAe,OAAO,IAAI;AAC1B,aAAW;;AAGf,QAAO"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Config } from '../config/schema.js';
|
|
2
|
+
export type ConnectorSupervisorOptions = {
|
|
3
|
+
getConfig: () => Config;
|
|
4
|
+
saveConfig: (config: Config) => Promise<{
|
|
5
|
+
saved: boolean;
|
|
6
|
+
error?: string;
|
|
7
|
+
}>;
|
|
8
|
+
intervalMs?: number;
|
|
9
|
+
initialDelayMs?: number;
|
|
10
|
+
};
|
|
11
|
+
export type ConnectorSupervisor = {
|
|
12
|
+
runNow(): Promise<void>;
|
|
13
|
+
stop(): void;
|
|
14
|
+
};
|
|
15
|
+
export declare function startConnectorSupervisor(options: ConnectorSupervisorOptions): ConnectorSupervisor;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { createLogger } from "../utils/logger/index.js";
|
|
2
|
+
import { init_logger } from "../utils/logger.js";
|
|
3
|
+
import { recordConnectorHealthUsage } from "./usage.js";
|
|
4
|
+
import { listConnectorInstances } from "./instances.js";
|
|
5
|
+
import { testConnectorInstance } from "./health.js";
|
|
6
|
+
//#region src/connectors/supervisor.ts
|
|
7
|
+
init_logger();
|
|
8
|
+
const log = createLogger("Connectors:Supervisor");
|
|
9
|
+
function resolveIntervalMs(input) {
|
|
10
|
+
const env = Number(process.env.XOPC_CONNECTOR_SUPERVISOR_INTERVAL_MS ?? "");
|
|
11
|
+
return Math.max(1e4, Math.min(input ?? (Number.isFinite(env) && env > 0 ? env : 6e4), 30 * 6e4));
|
|
12
|
+
}
|
|
13
|
+
function startConnectorSupervisor(options) {
|
|
14
|
+
const intervalMs = resolveIntervalMs(options.intervalMs);
|
|
15
|
+
let timer = null;
|
|
16
|
+
let running = false;
|
|
17
|
+
let stopped = false;
|
|
18
|
+
async function runNow() {
|
|
19
|
+
if (running || stopped) return;
|
|
20
|
+
running = true;
|
|
21
|
+
const config = options.getConfig();
|
|
22
|
+
let changed = false;
|
|
23
|
+
try {
|
|
24
|
+
const instances = listConnectorInstances(config).filter((instance) => instance.enabled);
|
|
25
|
+
for (const instance of instances) {
|
|
26
|
+
if (instance.materialized.type !== "mcp") continue;
|
|
27
|
+
try {
|
|
28
|
+
const result = await testConnectorInstance(config, instance.materialized.serverId);
|
|
29
|
+
recordConnectorHealthUsage(config, instance.instanceId, result);
|
|
30
|
+
changed = true;
|
|
31
|
+
if (!result.ok) log.warn({
|
|
32
|
+
instanceId: instance.instanceId,
|
|
33
|
+
status: result.status,
|
|
34
|
+
errorMessage: result.error
|
|
35
|
+
}, `Connector health check failed: ${result.status}`);
|
|
36
|
+
} catch (error) {
|
|
37
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
38
|
+
log.warn({
|
|
39
|
+
instanceId: instance.instanceId,
|
|
40
|
+
errorMessage
|
|
41
|
+
}, `Connector supervisor check failed: ${errorMessage}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (changed) {
|
|
45
|
+
const saved = await options.saveConfig(config);
|
|
46
|
+
if (!saved.saved) log.warn({ errorMessage: saved.error }, `Connector supervisor could not save health state: ${saved.error}`);
|
|
47
|
+
}
|
|
48
|
+
} finally {
|
|
49
|
+
running = false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const initialDelayMs = options.initialDelayMs ?? 15e3;
|
|
53
|
+
timer = setTimeout(() => {
|
|
54
|
+
runNow();
|
|
55
|
+
timer = setInterval(() => void runNow(), intervalMs);
|
|
56
|
+
}, Math.max(0, initialDelayMs));
|
|
57
|
+
timer.unref?.();
|
|
58
|
+
return {
|
|
59
|
+
runNow,
|
|
60
|
+
stop() {
|
|
61
|
+
stopped = true;
|
|
62
|
+
if (timer) {
|
|
63
|
+
clearTimeout(timer);
|
|
64
|
+
clearInterval(timer);
|
|
65
|
+
timer = null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//#endregion
|
|
71
|
+
export { startConnectorSupervisor };
|
|
72
|
+
|
|
73
|
+
//# sourceMappingURL=supervisor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervisor.js","names":[],"sources":["../../../src/connectors/supervisor.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\nimport { createLogger } from '../utils/logger.js';\nimport { testConnectorInstance } from './health.js';\nimport { listConnectorInstances } from './instances.js';\nimport { recordConnectorHealthUsage } from './usage.js';\n\nconst log = createLogger('Connectors:Supervisor');\n\nexport type ConnectorSupervisorOptions = {\n getConfig: () => Config;\n saveConfig: (config: Config) => Promise<{ saved: boolean; error?: string }>;\n intervalMs?: number;\n initialDelayMs?: number;\n};\n\nexport type ConnectorSupervisor = {\n runNow(): Promise<void>;\n stop(): void;\n};\n\nfunction resolveIntervalMs(input?: number): number {\n const env = Number(process.env.XOPC_CONNECTOR_SUPERVISOR_INTERVAL_MS ?? '');\n const value = input ?? (Number.isFinite(env) && env > 0 ? env : 60_000);\n return Math.max(10_000, Math.min(value, 30 * 60_000));\n}\n\nexport function startConnectorSupervisor(options: ConnectorSupervisorOptions): ConnectorSupervisor {\n const intervalMs = resolveIntervalMs(options.intervalMs);\n let timer: NodeJS.Timeout | null = null;\n let running = false;\n let stopped = false;\n\n async function runNow(): Promise<void> {\n if (running || stopped) return;\n running = true;\n const config = options.getConfig();\n let changed = false;\n try {\n const instances = listConnectorInstances(config).filter((instance) => instance.enabled);\n for (const instance of instances) {\n if (instance.materialized.type !== 'mcp') continue;\n try {\n const result = await testConnectorInstance(config, instance.materialized.serverId);\n recordConnectorHealthUsage(config, instance.instanceId, result);\n changed = true;\n if (!result.ok) {\n log.warn(\n { instanceId: instance.instanceId, status: result.status, errorMessage: result.error },\n `Connector health check failed: ${result.status}`,\n );\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.warn({ instanceId: instance.instanceId, errorMessage }, `Connector supervisor check failed: ${errorMessage}`);\n }\n }\n if (changed) {\n const saved = await options.saveConfig(config);\n if (!saved.saved) {\n log.warn({ errorMessage: saved.error }, `Connector supervisor could not save health state: ${saved.error}`);\n }\n }\n } finally {\n running = false;\n }\n }\n\n const initialDelayMs = options.initialDelayMs ?? 15_000;\n timer = setTimeout(() => {\n void runNow();\n timer = setInterval(() => void runNow(), intervalMs);\n }, Math.max(0, initialDelayMs));\n timer.unref?.();\n\n return {\n runNow,\n stop() {\n stopped = true;\n if (timer) {\n clearTimeout(timer);\n clearInterval(timer);\n timer = null;\n }\n },\n };\n}\n"],"mappings":";;;;;;aACkD;AAKlD,MAAM,MAAM,aAAa,wBAAwB;AAcjD,SAAS,kBAAkB,OAAwB;CACjD,MAAM,MAAM,OAAO,QAAQ,IAAI,yCAAyC,GAAG;AAE3E,QAAO,KAAK,IAAI,KAAQ,KAAK,IADf,UAAU,OAAO,SAAS,IAAI,IAAI,MAAM,IAAI,MAAM,MACxB,KAAK,IAAO,CAAC;;AAGvD,SAAgB,yBAAyB,SAA0D;CACjG,MAAM,aAAa,kBAAkB,QAAQ,WAAW;CACxD,IAAI,QAA+B;CACnC,IAAI,UAAU;CACd,IAAI,UAAU;CAEd,eAAe,SAAwB;AACrC,MAAI,WAAW,QAAS;AACxB,YAAU;EACV,MAAM,SAAS,QAAQ,WAAW;EAClC,IAAI,UAAU;AACd,MAAI;GACF,MAAM,YAAY,uBAAuB,OAAO,CAAC,QAAQ,aAAa,SAAS,QAAQ;AACvF,QAAK,MAAM,YAAY,WAAW;AAChC,QAAI,SAAS,aAAa,SAAS,MAAO;AAC1C,QAAI;KACF,MAAM,SAAS,MAAM,sBAAsB,QAAQ,SAAS,aAAa,SAAS;AAClF,gCAA2B,QAAQ,SAAS,YAAY,OAAO;AAC/D,eAAU;AACV,SAAI,CAAC,OAAO,GACV,KAAI,KACF;MAAE,YAAY,SAAS;MAAY,QAAQ,OAAO;MAAQ,cAAc,OAAO;MAAO,EACtF,kCAAkC,OAAO,SAC1C;aAEI,OAAO;KACd,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAC3E,SAAI,KAAK;MAAE,YAAY,SAAS;MAAY;MAAc,EAAE,sCAAsC,eAAe;;;AAGrH,OAAI,SAAS;IACX,MAAM,QAAQ,MAAM,QAAQ,WAAW,OAAO;AAC9C,QAAI,CAAC,MAAM,MACT,KAAI,KAAK,EAAE,cAAc,MAAM,OAAO,EAAE,qDAAqD,MAAM,QAAQ;;YAGvG;AACR,aAAU;;;CAId,MAAM,iBAAiB,QAAQ,kBAAkB;AACjD,SAAQ,iBAAiB;AAClB,UAAQ;AACb,UAAQ,kBAAkB,KAAK,QAAQ,EAAE,WAAW;IACnD,KAAK,IAAI,GAAG,eAAe,CAAC;AAC/B,OAAM,SAAS;AAEf,QAAO;EACL;EACA,OAAO;AACL,aAAU;AACV,OAAI,OAAO;AACT,iBAAa,MAAM;AACnB,kBAAc,MAAM;AACpB,YAAQ;;;EAGb"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type ConnectorKind = 'mcp' | 'cli' | 'http' | 'channel' | 'browser' | 'extension' | 'builtin';
|
|
1
|
+
export type ConnectorKind = 'mcp' | 'cli' | 'http' | 'channel' | 'browser' | 'extension' | 'builtin' | 'composio' | 'nativeTool' | 'memorySource';
|
|
2
2
|
export type ConnectorCategory = 'code' | 'docs' | 'browser' | 'data' | 'automation' | 'custom';
|
|
3
3
|
export type ConnectorCapability = 'tools' | 'resources' | 'prompts' | 'context' | 'channel' | 'events' | 'ui' | 'memory_source' | 'workflows' | 'auth.apiKey' | 'auth.oauth' | 'runtime.mcp.stdio' | 'runtime.mcp.sse' | 'runtime.mcp.streamableHttp';
|
|
4
4
|
export type ConnectorAuthMode = 'none' | 'apiKey' | 'oauth';
|
|
@@ -27,6 +27,19 @@ export type ConnectorRuntimeDefinition = {
|
|
|
27
27
|
type: 'mcp';
|
|
28
28
|
serverId: string;
|
|
29
29
|
serverTemplate: Record<string, unknown>;
|
|
30
|
+
} | {
|
|
31
|
+
type: 'channel';
|
|
32
|
+
channelId: string;
|
|
33
|
+
pluginId: string;
|
|
34
|
+
} | {
|
|
35
|
+
type: 'composio';
|
|
36
|
+
toolkit: string;
|
|
37
|
+
} | {
|
|
38
|
+
type: 'nativeTool';
|
|
39
|
+
toolsetId: string;
|
|
40
|
+
} | {
|
|
41
|
+
type: 'memorySource';
|
|
42
|
+
sourceKind: string;
|
|
30
43
|
};
|
|
31
44
|
export type ConnectorDefinition = {
|
|
32
45
|
id: string;
|
|
@@ -72,16 +85,23 @@ export type ConnectorInstance = {
|
|
|
72
85
|
connectorId: string;
|
|
73
86
|
displayName: string;
|
|
74
87
|
enabled: boolean;
|
|
75
|
-
status: 'installed' | 'not_configured' | 'failed' | 'disabled';
|
|
88
|
+
status: 'installed' | 'not_configured' | 'failed' | 'disabled' | 'connecting' | 'connected' | 'unauthorized' | 'degraded';
|
|
89
|
+
connectionStatus?: 'unknown' | 'disconnected' | 'connecting' | 'connected' | 'unauthorized' | 'error' | 'disabled';
|
|
90
|
+
authStatus?: 'unknown' | 'none' | 'connected' | 'missing' | 'expired' | 'unauthorized';
|
|
91
|
+
lastConnectedAt?: string;
|
|
92
|
+
lastError?: string;
|
|
76
93
|
secretStatus: Record<string, boolean>;
|
|
77
94
|
materialized: {
|
|
78
95
|
type: 'mcp';
|
|
79
96
|
serverId: string;
|
|
97
|
+
} | {
|
|
98
|
+
type: 'channel' | 'composio' | 'nativeTool' | 'memorySource';
|
|
99
|
+
id: string;
|
|
80
100
|
};
|
|
81
101
|
usage: ConnectorUsageRecord;
|
|
82
102
|
audit: ConnectorAuditRecord[];
|
|
83
103
|
};
|
|
84
|
-
export type ConnectorHealthStatus = 'ok' | 'server_not_found' | 'missing_secret' | 'startup_failed' | 'tools_list_failed' | 'timeout' | 'network_failed' | 'unknown_error';
|
|
104
|
+
export type ConnectorHealthStatus = 'ok' | 'server_not_found' | 'missing_secret' | 'startup_failed' | 'tools_list_failed' | 'timeout' | 'network_failed' | 'unauthorized' | 'disabled' | 'unknown_error';
|
|
85
105
|
export type ConnectorHealthResult = {
|
|
86
106
|
serverId: string;
|
|
87
107
|
ok: boolean;
|
|
@@ -118,4 +138,8 @@ export type ManagedConnectorMarker = {
|
|
|
118
138
|
managed: true;
|
|
119
139
|
connectorId: string;
|
|
120
140
|
version: string;
|
|
141
|
+
enabled?: boolean;
|
|
142
|
+
lastConnectedAt?: string;
|
|
143
|
+
lastError?: string;
|
|
144
|
+
displayName?: string;
|
|
121
145
|
};
|
|
@@ -49,13 +49,18 @@ function appendConnectorAuditRecord(config, instanceId, record) {
|
|
|
49
49
|
function recordConnectorHealthUsage(config, instanceId, result) {
|
|
50
50
|
const marker = getManagedConnectorMarker(config, instanceId);
|
|
51
51
|
if (!marker) return;
|
|
52
|
+
const checkedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
52
53
|
marker.usage = {
|
|
53
|
-
lastHealthCheckAt:
|
|
54
|
+
lastHealthCheckAt: checkedAt,
|
|
54
55
|
lastHealthStatus: result.status,
|
|
55
56
|
lastToolCount: result.toolCount,
|
|
56
57
|
lastResourceCount: result.resourceCount,
|
|
57
58
|
lastPromptCount: result.promptCount
|
|
58
59
|
};
|
|
60
|
+
if (result.ok) {
|
|
61
|
+
marker.lastConnectedAt = checkedAt;
|
|
62
|
+
delete marker.lastError;
|
|
63
|
+
} else if (result.error) marker.lastError = result.error;
|
|
59
64
|
appendConnectorAuditRecord(config, instanceId, {
|
|
60
65
|
action: "health_check",
|
|
61
66
|
status: result.status,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.js","names":[],"sources":["../../../src/connectors/usage.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\nimport { isManagedConnectorServer } from './materialize.js';\nimport type { ConnectorAuditRecord, ConnectorHealthResult, ConnectorUsageRecord } from './types.js';\n\nconst MAX_AUDIT_RECORDS = 50;\n\nfunction getManagedConnectorMarker(config: Config, instanceId: string): Record<string, unknown> | undefined {\n const server = config.mcp?.servers?.[instanceId];\n if (!isManagedConnectorServer(server)) {\n return undefined;\n }\n return server.xopcConnector as Record<string, unknown>;\n}\n\nexport function getConnectorUsageFromMarker(marker: unknown): ConnectorUsageRecord {\n if (!marker || typeof marker !== 'object' || Array.isArray(marker)) {\n return {};\n }\n const usage = (marker as Record<string, unknown>).usage;\n if (!usage || typeof usage !== 'object' || Array.isArray(usage)) {\n return {};\n }\n const record = usage as Record<string, unknown>;\n return {\n lastHealthCheckAt: typeof record.lastHealthCheckAt === 'string' ? record.lastHealthCheckAt : undefined,\n lastHealthStatus: typeof record.lastHealthStatus === 'string' ? record.lastHealthStatus as ConnectorUsageRecord['lastHealthStatus'] : undefined,\n lastToolCount: typeof record.lastToolCount === 'number' ? record.lastToolCount : undefined,\n lastResourceCount: typeof record.lastResourceCount === 'number' ? record.lastResourceCount : undefined,\n lastPromptCount: typeof record.lastPromptCount === 'number' ? record.lastPromptCount : undefined,\n };\n}\n\nexport function getConnectorAuditFromMarker(marker: unknown): ConnectorAuditRecord[] {\n if (!marker || typeof marker !== 'object' || Array.isArray(marker)) {\n return [];\n }\n const audit = (marker as Record<string, unknown>).audit;\n if (!Array.isArray(audit)) {\n return [];\n }\n return audit.flatMap((entry) => {\n if (!entry || typeof entry !== 'object' || Array.isArray(entry)) {\n return [];\n }\n const record = entry as Record<string, unknown>;\n if (typeof record.at !== 'string' || typeof record.action !== 'string') {\n return [];\n }\n return [{\n at: record.at,\n action: record.action as ConnectorAuditRecord['action'],\n status: typeof record.status === 'string' ? record.status as ConnectorAuditRecord['status'] : undefined,\n ok: typeof record.ok === 'boolean' ? record.ok : undefined,\n toolCount: typeof record.toolCount === 'number' ? record.toolCount : undefined,\n resourceCount: typeof record.resourceCount === 'number' ? record.resourceCount : undefined,\n promptCount: typeof record.promptCount === 'number' ? record.promptCount : undefined,\n }];\n });\n}\n\nexport function appendConnectorAuditRecord(\n config: Config,\n instanceId: string,\n record: Omit<ConnectorAuditRecord, 'at'>,\n): void {\n const marker = getManagedConnectorMarker(config, instanceId);\n if (!marker) {\n return;\n }\n const existing = Array.isArray(marker.audit) ? marker.audit : [];\n marker.audit = [\n ...existing.slice(-MAX_AUDIT_RECORDS + 1),\n { ...record, at: new Date().toISOString() },\n ];\n}\n\nexport function recordConnectorHealthUsage(\n config: Config,\n instanceId: string,\n result: ConnectorHealthResult,\n): void {\n const marker = getManagedConnectorMarker(config, instanceId);\n if (!marker) {\n return;\n }\n marker.usage = {\n lastHealthCheckAt:
|
|
1
|
+
{"version":3,"file":"usage.js","names":[],"sources":["../../../src/connectors/usage.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\nimport { isManagedConnectorServer } from './materialize.js';\nimport type { ConnectorAuditRecord, ConnectorHealthResult, ConnectorUsageRecord } from './types.js';\n\nconst MAX_AUDIT_RECORDS = 50;\n\nfunction getManagedConnectorMarker(config: Config, instanceId: string): Record<string, unknown> | undefined {\n const server = config.mcp?.servers?.[instanceId];\n if (!isManagedConnectorServer(server)) {\n return undefined;\n }\n return server.xopcConnector as Record<string, unknown>;\n}\n\nexport function getConnectorUsageFromMarker(marker: unknown): ConnectorUsageRecord {\n if (!marker || typeof marker !== 'object' || Array.isArray(marker)) {\n return {};\n }\n const usage = (marker as Record<string, unknown>).usage;\n if (!usage || typeof usage !== 'object' || Array.isArray(usage)) {\n return {};\n }\n const record = usage as Record<string, unknown>;\n return {\n lastHealthCheckAt: typeof record.lastHealthCheckAt === 'string' ? record.lastHealthCheckAt : undefined,\n lastHealthStatus: typeof record.lastHealthStatus === 'string' ? record.lastHealthStatus as ConnectorUsageRecord['lastHealthStatus'] : undefined,\n lastToolCount: typeof record.lastToolCount === 'number' ? record.lastToolCount : undefined,\n lastResourceCount: typeof record.lastResourceCount === 'number' ? record.lastResourceCount : undefined,\n lastPromptCount: typeof record.lastPromptCount === 'number' ? record.lastPromptCount : undefined,\n };\n}\n\nexport function getConnectorAuditFromMarker(marker: unknown): ConnectorAuditRecord[] {\n if (!marker || typeof marker !== 'object' || Array.isArray(marker)) {\n return [];\n }\n const audit = (marker as Record<string, unknown>).audit;\n if (!Array.isArray(audit)) {\n return [];\n }\n return audit.flatMap((entry) => {\n if (!entry || typeof entry !== 'object' || Array.isArray(entry)) {\n return [];\n }\n const record = entry as Record<string, unknown>;\n if (typeof record.at !== 'string' || typeof record.action !== 'string') {\n return [];\n }\n return [{\n at: record.at,\n action: record.action as ConnectorAuditRecord['action'],\n status: typeof record.status === 'string' ? record.status as ConnectorAuditRecord['status'] : undefined,\n ok: typeof record.ok === 'boolean' ? record.ok : undefined,\n toolCount: typeof record.toolCount === 'number' ? record.toolCount : undefined,\n resourceCount: typeof record.resourceCount === 'number' ? record.resourceCount : undefined,\n promptCount: typeof record.promptCount === 'number' ? record.promptCount : undefined,\n }];\n });\n}\n\nexport function appendConnectorAuditRecord(\n config: Config,\n instanceId: string,\n record: Omit<ConnectorAuditRecord, 'at'>,\n): void {\n const marker = getManagedConnectorMarker(config, instanceId);\n if (!marker) {\n return;\n }\n const existing = Array.isArray(marker.audit) ? marker.audit : [];\n marker.audit = [\n ...existing.slice(-MAX_AUDIT_RECORDS + 1),\n { ...record, at: new Date().toISOString() },\n ];\n}\n\nexport function recordConnectorHealthUsage(\n config: Config,\n instanceId: string,\n result: ConnectorHealthResult,\n): void {\n const marker = getManagedConnectorMarker(config, instanceId);\n if (!marker) {\n return;\n }\n const checkedAt = new Date().toISOString();\n marker.usage = {\n lastHealthCheckAt: checkedAt,\n lastHealthStatus: result.status,\n lastToolCount: result.toolCount,\n lastResourceCount: result.resourceCount,\n lastPromptCount: result.promptCount,\n } satisfies ConnectorUsageRecord;\n if (result.ok) {\n marker.lastConnectedAt = checkedAt;\n delete marker.lastError;\n } else if (result.error) {\n marker.lastError = result.error;\n }\n appendConnectorAuditRecord(config, instanceId, {\n action: 'health_check',\n status: result.status,\n ok: result.ok,\n toolCount: result.toolCount,\n resourceCount: result.resourceCount,\n promptCount: result.promptCount,\n });\n}\n"],"mappings":";;AAIA,MAAM,oBAAoB;AAE1B,SAAS,0BAA0B,QAAgB,YAAyD;CAC1G,MAAM,SAAS,OAAO,KAAK,UAAU;AACrC,KAAI,CAAC,yBAAyB,OAAO,CACnC;AAEF,QAAO,OAAO;;AAGhB,SAAgB,4BAA4B,QAAuC;AACjF,KAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,OAAO,CAChE,QAAO,EAAE;CAEX,MAAM,QAAS,OAAmC;AAClD,KAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,CAC7D,QAAO,EAAE;CAEX,MAAM,SAAS;AACf,QAAO;EACL,mBAAmB,OAAO,OAAO,sBAAsB,WAAW,OAAO,oBAAoB,KAAA;EAC7F,kBAAkB,OAAO,OAAO,qBAAqB,WAAW,OAAO,mBAA+D,KAAA;EACtI,eAAe,OAAO,OAAO,kBAAkB,WAAW,OAAO,gBAAgB,KAAA;EACjF,mBAAmB,OAAO,OAAO,sBAAsB,WAAW,OAAO,oBAAoB,KAAA;EAC7F,iBAAiB,OAAO,OAAO,oBAAoB,WAAW,OAAO,kBAAkB,KAAA;EACxF;;AAGH,SAAgB,4BAA4B,QAAyC;AACnF,KAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,OAAO,CAChE,QAAO,EAAE;CAEX,MAAM,QAAS,OAAmC;AAClD,KAAI,CAAC,MAAM,QAAQ,MAAM,CACvB,QAAO,EAAE;AAEX,QAAO,MAAM,SAAS,UAAU;AAC9B,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,CAC7D,QAAO,EAAE;EAEX,MAAM,SAAS;AACf,MAAI,OAAO,OAAO,OAAO,YAAY,OAAO,OAAO,WAAW,SAC5D,QAAO,EAAE;AAEX,SAAO,CAAC;GACN,IAAI,OAAO;GACX,QAAQ,OAAO;GACf,QAAQ,OAAO,OAAO,WAAW,WAAW,OAAO,SAA2C,KAAA;GAC9F,IAAI,OAAO,OAAO,OAAO,YAAY,OAAO,KAAK,KAAA;GACjD,WAAW,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY,KAAA;GACrE,eAAe,OAAO,OAAO,kBAAkB,WAAW,OAAO,gBAAgB,KAAA;GACjF,aAAa,OAAO,OAAO,gBAAgB,WAAW,OAAO,cAAc,KAAA;GAC5E,CAAC;GACF;;AAGJ,SAAgB,2BACd,QACA,YACA,QACM;CACN,MAAM,SAAS,0BAA0B,QAAQ,WAAW;AAC5D,KAAI,CAAC,OACH;AAGF,QAAO,QAAQ,CACb,IAFe,MAAM,QAAQ,OAAO,MAAM,GAAG,OAAO,QAAQ,EAAE,EAElD,MAAM,CAAC,oBAAoB,EAAE,EACzC;EAAE,GAAG;EAAQ,qBAAI,IAAI,MAAM,EAAC,aAAa;EAAE,CAC5C;;AAGH,SAAgB,2BACd,QACA,YACA,QACM;CACN,MAAM,SAAS,0BAA0B,QAAQ,WAAW;AAC5D,KAAI,CAAC,OACH;CAEF,MAAM,6BAAY,IAAI,MAAM,EAAC,aAAa;AAC1C,QAAO,QAAQ;EACb,mBAAmB;EACnB,kBAAkB,OAAO;EACzB,eAAe,OAAO;EACtB,mBAAmB,OAAO;EAC1B,iBAAiB,OAAO;EACzB;AACD,KAAI,OAAO,IAAI;AACb,SAAO,kBAAkB;AACzB,SAAO,OAAO;YACL,OAAO,MAChB,QAAO,YAAY,OAAO;AAE5B,4BAA2B,QAAQ,YAAY;EAC7C,QAAQ;EACR,QAAQ,OAAO;EACf,IAAI,OAAO;EACX,WAAW,OAAO;EAClB,eAAe,OAAO;EACtB,aAAa,OAAO;EACrB,CAAC"}
|
package/dist/src/cron/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { AddJobRequestSchema, JobDataSchema, UpdateJobRequestSchema } from "./validation.js";
|
|
2
1
|
import { describeSchedule } from "./schedule.js";
|
|
3
2
|
import { getCronPayloadText } from "./job-content.js";
|
|
3
|
+
import { AddJobRequestSchema, JobDataSchema, UpdateJobRequestSchema } from "./validation.js";
|
|
4
4
|
import { DefaultJobExecutor } from "./executor.js";
|
|
5
5
|
import { CronRunLogStore } from "./run-log-store.js";
|
|
6
6
|
import { CronService } from "./service.js";
|
package/dist/src/cron/service.js
CHANGED
|
@@ -2,10 +2,10 @@ import { init_agent_scope, normalizeAgentId } from "../agent/agent-scope.js";
|
|
|
2
2
|
import { buildSessionKey, init_session_key } from "../routing/session-key.js";
|
|
3
3
|
import { createLogger } from "../utils/logger/index.js";
|
|
4
4
|
import { init_logger } from "../utils/logger.js";
|
|
5
|
+
import { computeNextRunAtMs, describeSchedule, timerDelayUntil } from "./schedule.js";
|
|
5
6
|
import { AddJobRequestSchema, JobDataSchema, UpdateJobRequestSchema } from "./validation.js";
|
|
6
7
|
import { deleteCronJob, getCronJob, listCronJobs, saveCronJob, saveCronJobs } from "../storage/sqlite/cron-job-repository.js";
|
|
7
8
|
import "../storage/sqlite/index.js";
|
|
8
|
-
import { computeNextRunAtMs, describeSchedule, timerDelayUntil } from "./schedule.js";
|
|
9
9
|
import { DefaultJobExecutor } from "./executor.js";
|
|
10
10
|
import { CronRunLogStore } from "./run-log-store.js";
|
|
11
11
|
import { randomUUID } from "node:crypto";
|