@xopcai/xopc 0.0.142 → 0.0.143
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 +1 -1
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/activity-center-store-jITiX2vJ.js +1 -0
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BawPxiu5.js → agent-avatar-dicebear-DiME9u_P.js} +1 -1
- package/dist/gateway/static/root/assets/agents-DzBXhZXO.js +2 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-81xd1p9R.js → app-management-settings-panel-Cuo7SbUP.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-DYeQsYU8.js → appearance-settings-DUfdNQqk.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-CKuKK5AU.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-D_oa7oti.js → archive-plugin-B-Qk6cGr.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-Cd-bwI2N.js → attachment-load-Di6EEbQX.js} +1 -1
- package/dist/gateway/static/root/assets/automation-suggestion-card-DGxvRxtO.js +1 -0
- package/dist/gateway/static/root/assets/automations-page-D-FF_WKV.js +4 -0
- package/dist/gateway/static/root/assets/{binary-plugins-O8svLKWw.js → binary-plugins-ZaOZDH2I.js} +1 -1
- package/dist/gateway/static/root/assets/block-editor-BTFhjWfg.js +184 -0
- package/dist/gateway/static/root/assets/browser-settings-page-BvKLdEQt.js +8 -0
- package/dist/gateway/static/root/assets/{capability-presets-api-dJy1Eqgx.js → capability-presets-api-BU-pVZiZ.js} +1 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-DgyeEwzh.js +2 -0
- package/dist/gateway/static/root/assets/{channel-recipient-api-Bfuhp2ty.js → channel-recipient-api-DuulnhIj.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-BbVsdD_I.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-B5lVrUsN.js +1 -0
- package/dist/gateway/static/root/assets/check-BODqo66o.js +1 -0
- package/dist/gateway/static/root/assets/chunk-QUQL4437-DXsxWP7r.js +4 -0
- package/dist/gateway/static/root/assets/circle-alert-RzVebuX2.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-B8QqVy3I.js +2 -0
- package/dist/gateway/static/root/assets/{desktop-pet-DFMfIb5F.js → desktop-pet---yzVxVR.js} +1 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-Dc3gqBJE.js +1 -0
- package/dist/gateway/static/root/assets/{directory-picker-path-field-BrYt1gAr.js → directory-picker-path-field-DCmOGLtK.js} +1 -1
- package/dist/gateway/static/root/assets/dreaming-settings-BgT5KZVe.js +3 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-Bh630pLD.js → extension-debug-page-ByaKTTq4.js} +1 -1
- package/dist/gateway/static/root/assets/extension-page-BmRzHAZr.js +1 -0
- package/dist/gateway/static/root/assets/extension-settings-page-JUtwIhbF.js +1 -0
- package/dist/gateway/static/root/assets/{fetch-B1WtuprY.js → fetch-8QNN25Sh.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-De2N821l.js → gateway-config-api-CxicF50_.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-Bz2I_EO5.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-nEujFSDj.js → gateway-startup-retry-5YBnS9Fj.js} +1 -1
- package/dist/gateway/static/root/assets/goal-create-dialog-VcoyuZGN.js +1 -0
- package/dist/gateway/static/root/assets/goal-detail-page-Cilkap2G.js +4 -0
- package/dist/gateway/static/root/assets/{goals-config-api-DUy3eEse.js → goals-config-api-CwcHRdC0.js} +1 -1
- package/dist/gateway/static/root/assets/goals-page-C6eoni4z.js +2 -0
- package/dist/gateway/static/root/assets/goals-settings-o4i-qAOS.js +1 -0
- package/dist/gateway/static/root/assets/heartbeat-settings-DQQkETX8.js +1 -0
- package/dist/gateway/static/root/assets/index-BKRqeRHm.js +257 -0
- package/dist/gateway/static/root/assets/index-CphxClbs.css +1 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CVIwwM15.js → keyboard-shortcuts-settings-LT6qB-ua.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-Dli2e3fS.js +7 -0
- package/dist/gateway/static/root/assets/{markdown-split-B_6us9j7.js → markdown-split-Dw-yE2-y.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-D_fryIyj.js → media-plugins-D9NNNUgE.js} +1 -1
- package/dist/gateway/static/root/assets/messages-CzKxM6I4.js +5 -0
- package/dist/gateway/static/root/assets/models-hub-panel-DVn2Q1Ik.js +2 -0
- package/dist/gateway/static/root/assets/notes-page-CRgbJGgk.js +1 -0
- package/dist/gateway/static/root/assets/notes-workbench-BxZRHLWx.js +2 -0
- package/dist/gateway/static/root/assets/{page-tabs-D_8jGlqx.js → page-tabs-D4hkWVt_.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-BBLMK8Mp.js → preview-open-alternatives-CIckv0uy.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-Doz53xLn.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-DoMtcRLg.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-BeHVEgrm.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-DVS3FR5r.js → save-bar-controls-B0b42kB2.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-D6vKd6-T.js → schedule-field-BtjEkczK.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-BPy4lbIh.js → schema-form-Bf0bk3i6.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-Bk4bQsBe.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-DdFyaRMm.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-WzdikxPt.js → settings-collapsible-section-BTKTdTNX.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-CvfzhBV-.js → settings-form-section-DL4P0sAj.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-BxR-Ulhi.js → settings-loading-skeleton-BV6KFNj4.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-B_4DsX5W.js +1 -0
- package/dist/gateway/static/root/assets/{settings-page-layout-CKefvbYi.js → settings-page-layout-CyGlrInB.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-DJ1_MLgX.js +1 -0
- package/dist/gateway/static/root/assets/share-preview-page-BQBV7YrV.js +2 -0
- package/dist/gateway/static/root/assets/shares-settings-0VuFLBeU.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-DO87Ckeo.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-D3VdtxAn.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-BokgAgf7.js → system-settings-panel-D85fBBuI.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-BwHlNL3L.js → typed-models-lib-CwEuYrHX.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-DR11ap3A.js → use-channel-catalog-COXIfXcl.js} +1 -1
- package/dist/gateway/static/root/assets/user-context-page-m9JVQ73F.js +1 -0
- package/dist/gateway/static/root/assets/user-profile-fields-editor-DtQiuY7E.js +1 -0
- package/dist/gateway/static/root/assets/user-profile-settings-panel-CWM0fEpb.js +1 -0
- package/dist/gateway/static/root/assets/{utils-BKUWB-TT.js → utils--BO6xT3u.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-LoT3wgZ9.js +1 -0
- package/dist/gateway/static/root/assets/with-selector-aYPsXwdl.js +1 -0
- package/dist/gateway/static/root/assets/work-item-detail-page-DSTMz_mO.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CL_rnAUB.js → workflow-run-setup-panel-B35lJzvm.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-BfSm9oR8.js +11 -0
- package/dist/gateway/static/root/assets/workflows-page-DLioOiRN.css +1 -0
- package/dist/gateway/static/root/connector-icons/README.md +11 -0
- package/dist/gateway/static/root/connector-icons/airtable.svg +13 -0
- package/dist/gateway/static/root/connector-icons/asana.svg +15 -0
- package/dist/gateway/static/root/connector-icons/brave-search.svg +1 -0
- package/dist/gateway/static/root/connector-icons/clickup.svg +19 -0
- package/dist/gateway/static/root/connector-icons/composio.svg +266 -0
- package/dist/gateway/static/root/connector-icons/discord.svg +15 -0
- package/dist/gateway/static/root/connector-icons/dropbox.svg +152 -0
- package/dist/gateway/static/root/connector-icons/excel.svg +56 -0
- package/dist/gateway/static/root/connector-icons/fetch.svg +6 -0
- package/dist/gateway/static/root/connector-icons/figma.svg +178 -0
- package/dist/gateway/static/root/connector-icons/filesystem.svg +6 -0
- package/dist/gateway/static/root/connector-icons/github.svg +10 -0
- package/dist/gateway/static/root/connector-icons/gmail.svg +3 -0
- package/dist/gateway/static/root/connector-icons/google-calendar.svg +3 -0
- package/dist/gateway/static/root/connector-icons/google-docs.svg +25 -0
- package/dist/gateway/static/root/connector-icons/google-drive.svg +25 -0
- package/dist/gateway/static/root/connector-icons/google-sheets.svg +1 -0
- package/dist/gateway/static/root/connector-icons/hubspot.svg +142 -0
- package/dist/gateway/static/root/connector-icons/jira.svg +15 -0
- package/dist/gateway/static/root/connector-icons/linear.svg +5 -0
- package/dist/gateway/static/root/connector-icons/memory.svg +5 -0
- package/dist/gateway/static/root/connector-icons/microsoft-teams.svg +33 -0
- package/dist/gateway/static/root/connector-icons/notion.svg +5 -0
- package/dist/gateway/static/root/connector-icons/one-drive.svg +13 -0
- package/dist/gateway/static/root/connector-icons/outlook.svg +76 -0
- package/dist/gateway/static/root/connector-icons/playwright.svg +9 -0
- package/dist/gateway/static/root/connector-icons/salesforce.svg +17 -0
- package/dist/gateway/static/root/connector-icons/sequential-thinking.svg +8 -0
- package/dist/gateway/static/root/connector-icons/shopify.svg +5 -0
- package/dist/gateway/static/root/connector-icons/slack.svg +9 -0
- package/dist/gateway/static/root/connector-icons/spotify.svg +43 -0
- package/dist/gateway/static/root/connector-icons/stripe.svg +11 -0
- package/dist/gateway/static/root/connector-icons/telegram.svg +130 -0
- package/dist/gateway/static/root/connector-icons/time.svg +6 -0
- package/dist/gateway/static/root/connector-icons/todoist.svg +277 -0
- package/dist/gateway/static/root/connector-icons/trello.svg +19 -0
- package/dist/gateway/static/root/connector-icons/twitter.svg +128 -0
- package/dist/gateway/static/root/connector-icons/whatsapp.svg +61 -0
- package/dist/gateway/static/root/connector-icons/youtube.svg +11 -0
- package/dist/gateway/static/root/index.html +9 -6
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +2 -0
- package/dist/src/agent/agent-manager.js +8 -0
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/background-review/prompts.d.ts +1 -1
- package/dist/src/agent/background-review/prompts.js +3 -2
- package/dist/src/agent/background-review/prompts.js.map +1 -1
- package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
- package/dist/src/agent/embedded/xopc-tools-bridge.d.ts +9 -0
- package/dist/src/agent/embedded/xopc-tools-bridge.js +71 -3
- package/dist/src/agent/embedded/xopc-tools-bridge.js.map +1 -1
- package/dist/src/agent/goals/post-turn.js +5 -4
- package/dist/src/agent/goals/post-turn.js.map +1 -1
- package/dist/src/agent/mcp/mcp-transport.js +4 -1
- package/dist/src/agent/mcp/mcp-transport.js.map +1 -1
- package/dist/src/agent/memory/context/planner.d.ts +1 -0
- package/dist/src/agent/memory/context/planner.js +60 -14
- package/dist/src/agent/memory/context/planner.js.map +1 -1
- package/dist/src/agent/memory/context/types.d.ts +3 -1
- package/dist/src/agent/memory/lifecycle.d.ts +11 -0
- package/dist/src/agent/memory/lifecycle.js +50 -0
- package/dist/src/agent/memory/lifecycle.js.map +1 -0
- package/dist/src/agent/memory/source-origin.d.ts +3 -0
- package/dist/src/agent/memory/source-origin.js +19 -0
- package/dist/src/agent/memory/source-origin.js.map +1 -0
- package/dist/src/agent/memory/understanding/service.js +5 -0
- package/dist/src/agent/memory/understanding/service.js.map +1 -1
- package/dist/src/agent/memory/user-context-coordinator.js +7 -2
- package/dist/src/agent/memory/user-context-coordinator.js.map +1 -1
- package/dist/src/agent/prompt/sections/behavior.d.ts +2 -0
- package/dist/src/agent/prompt/sections/behavior.js +30 -1
- package/dist/src/agent/prompt/sections/behavior.js.map +1 -1
- package/dist/src/agent/prompt/sections/tooling.js +1 -1
- package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
- package/dist/src/agent/prompt/service-prompt-builder.js +8 -1
- package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
- package/dist/src/agent/prompt/system-prompt.d.ts +2 -0
- package/dist/src/agent/prompt/system-prompt.js +6 -3
- package/dist/src/agent/prompt/system-prompt.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.js +22 -0
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service.d.ts +2 -0
- package/dist/src/agent/service.js +9 -3
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/starter-agents.js +1 -1
- package/dist/src/agent/starter-agents.js.map +1 -1
- package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -1
- package/dist/src/agent/tool-manuals/xopc-use.js +1 -1
- package/dist/src/agent/tool-manuals/xopc-use.js.map +1 -1
- package/dist/src/agent/tools/composio-tool.d.ts +18 -5
- package/dist/src/agent/tools/composio-tool.js +252 -35
- package/dist/src/agent/tools/composio-tool.js.map +1 -1
- package/dist/src/agent/tools/factory.js +7 -3
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/index.d.ts +1 -1
- package/dist/src/agent/tools/index.js +2 -2
- package/dist/src/agent/tools/workflow-tool.d.ts +0 -1
- package/dist/src/agent/tools/workflow-tool.js +3 -16
- package/dist/src/agent/tools/workflow-tool.js.map +1 -1
- package/dist/src/agent/workflow/builtins/index.d.ts +2 -28
- package/dist/src/agent/workflow/builtins/index.js +226 -41
- package/dist/src/agent/workflow/builtins/index.js.map +1 -1
- package/dist/src/agent/workflow/catalog.d.ts +32 -34
- package/dist/src/agent/workflow/catalog.js +158 -154
- package/dist/src/agent/workflow/catalog.js.map +1 -1
- package/dist/src/agent/workflow/index.d.ts +4 -6
- package/dist/src/agent/workflow/index.js +2 -5
- package/dist/src/agent/workflow/snapshot.d.ts +2 -2
- package/dist/src/agent/workflow/snapshot.js +2 -2
- package/dist/src/agent/workflow/snapshot.js.map +1 -1
- package/dist/src/agent/workflow/structured-output-tool.d.ts +2 -2
- package/dist/src/agent/workflow/structured-output-tool.js +2 -2
- package/dist/src/agent/workflow/structured-output-tool.js.map +1 -1
- package/dist/src/agent/workflow/subagent-runner.js +1 -1
- package/dist/src/agent/workflow/types.d.ts +31 -26
- package/dist/src/agent-manifest/index.d.ts +1 -0
- package/dist/src/agent-manifest/index.js +3 -1
- package/dist/src/agent-manifest/index.js.map +1 -1
- package/dist/src/agent-manifest/preset-chain.d.ts +10 -0
- package/dist/src/agent-manifest/preset-chain.js +32 -0
- package/dist/src/agent-manifest/preset-chain.js.map +1 -0
- package/dist/src/agent-manifest/resolver.js +3 -10
- package/dist/src/agent-manifest/resolver.js.map +1 -1
- package/dist/src/agent-manifest/schema.d.ts +4 -4
- package/dist/src/automations/api/routes.js +13 -1
- package/dist/src/automations/api/routes.js.map +1 -1
- package/dist/src/automations/domain/validation.d.ts +14 -14
- package/dist/src/automations/draft/automation-draft-validator.d.ts +3 -3
- package/dist/src/browser/providers/browser-ext-install.d.ts +11 -1
- package/dist/src/browser/providers/browser-ext-install.js +39 -14
- package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
- package/dist/src/capabilities/store-connector.d.ts +0 -1
- package/dist/src/capabilities/store-connector.js +3 -5
- package/dist/src/capabilities/store-connector.js.map +1 -1
- package/dist/src/chat-commands/builtins/review.js +72 -73
- package/dist/src/chat-commands/builtins/review.js.map +1 -1
- package/dist/src/chat-commands/builtins/workflow.js +9 -54
- package/dist/src/chat-commands/builtins/workflow.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/extension-create.js +2 -2
- package/dist/src/cli/commands/extension-create.js.map +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +42 -36
- package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
- package/dist/src/cli/commands/extension-pack.d.ts +6 -0
- package/dist/src/cli/commands/extension-pack.js +3 -2
- package/dist/src/cli/commands/extension-pack.js.map +1 -1
- package/dist/src/commands/agents.config.d.ts +1 -0
- package/dist/src/commands/agents.config.js +1 -0
- package/dist/src/commands/agents.config.js.map +1 -1
- package/dist/src/config/schema.d.ts +6 -6
- package/dist/src/config/schema.js +6 -22
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/web-patch.d.ts +1 -1
- package/dist/src/connectors/approval.d.ts +2 -0
- package/dist/src/connectors/approval.js +33 -0
- package/dist/src/connectors/approval.js.map +1 -0
- package/dist/src/connectors/auth-provider-registry.d.ts +9 -0
- package/dist/src/connectors/auth-provider-registry.js +17 -0
- package/dist/src/connectors/auth-provider-registry.js.map +1 -0
- package/dist/src/connectors/builtin-catalog.js +55 -116
- package/dist/src/connectors/builtin-catalog.js.map +1 -1
- package/dist/src/connectors/catalog.js +7 -2
- package/dist/src/connectors/catalog.js.map +1 -1
- package/dist/src/connectors/composio-catalog.d.ts +19 -0
- package/dist/src/connectors/composio-catalog.js +237 -0
- package/dist/src/connectors/composio-catalog.js.map +1 -0
- package/dist/src/connectors/composio-logo.d.ts +1 -0
- package/dist/src/connectors/composio-logo.js +51 -0
- package/dist/src/connectors/composio-logo.js.map +1 -0
- package/dist/src/connectors/composio-sessions.d.ts +116 -0
- package/dist/src/connectors/composio-sessions.js +296 -0
- package/dist/src/connectors/composio-sessions.js.map +1 -0
- package/dist/src/connectors/composio-triggers.d.ts +17 -0
- package/dist/src/connectors/composio-triggers.js +48 -5
- package/dist/src/connectors/composio-triggers.js.map +1 -1
- package/dist/src/connectors/composio.d.ts +31 -2
- package/dist/src/connectors/composio.js +374 -151
- package/dist/src/connectors/composio.js.map +1 -1
- package/dist/src/connectors/connector-memory-sync.d.ts +15 -0
- package/dist/src/connectors/connector-memory-sync.js +90 -0
- package/dist/src/connectors/connector-memory-sync.js.map +1 -0
- package/dist/src/connectors/install.js +35 -92
- package/dist/src/connectors/install.js.map +1 -1
- package/dist/src/connectors/instances.js +6 -2
- package/dist/src/connectors/instances.js.map +1 -1
- package/dist/src/connectors/integration-strategy.d.ts +3 -0
- package/dist/src/connectors/integration-strategy.js +29 -0
- package/dist/src/connectors/integration-strategy.js.map +1 -0
- package/dist/src/connectors/policy.d.ts +13 -0
- package/dist/src/connectors/policy.js +48 -0
- package/dist/src/connectors/policy.js.map +1 -0
- package/dist/src/connectors/providers.js +1 -1
- package/dist/src/connectors/runtime-adapter-registry.d.ts +25 -0
- package/dist/src/connectors/runtime-adapter-registry.js +154 -0
- package/dist/src/connectors/runtime-adapter-registry.js.map +1 -0
- package/dist/src/connectors/types.d.ts +113 -4
- package/dist/src/connectors/workflow-preflight.d.ts +20 -0
- package/dist/src/connectors/workflow-preflight.js +70 -0
- package/dist/src/connectors/workflow-preflight.js.map +1 -0
- package/dist/src/extensions/install-transaction.d.ts +16 -0
- package/dist/src/extensions/install-transaction.js +76 -0
- package/dist/src/extensions/install-transaction.js.map +1 -0
- package/dist/src/extensions/install.d.ts +2 -0
- package/dist/src/extensions/install.js +23 -1
- package/dist/src/extensions/install.js.map +1 -1
- package/dist/src/gateway/agents-admin.d.ts +2 -0
- package/dist/src/gateway/agents-admin.js +7 -0
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/capability-presets-admin.d.ts +11 -0
- package/dist/src/gateway/capability-presets-admin.js +11 -4
- package/dist/src/gateway/capability-presets-admin.js.map +1 -1
- package/dist/src/gateway/chat-stream/mapper.js +17 -0
- package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
- package/dist/src/gateway/chat-stream/protocol.d.ts +18 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -3
- package/dist/src/gateway/hono/routes/agents.js +3 -0
- package/dist/src/gateway/hono/routes/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/capability-presets.js +19 -1
- package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -1
- package/dist/src/gateway/hono/routes/connectors.js +188 -25
- package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
- package/dist/src/gateway/hono/routes/goals.js +22 -3
- package/dist/src/gateway/hono/routes/goals.js.map +1 -1
- package/dist/src/gateway/hono/routes/home.d.ts +60 -1
- package/dist/src/gateway/hono/routes/home.js +244 -18
- package/dist/src/gateway/hono/routes/home.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.js +14 -1
- package/dist/src/gateway/hono/routes/memory.js.map +1 -1
- package/dist/src/gateway/hono/routes/projects.js +103 -2
- package/dist/src/gateway/hono/routes/projects.js.map +1 -1
- package/dist/src/gateway/hono/routes/public-gateway.js +93 -0
- package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
- package/dist/src/gateway/hono/routes/workflows.js +137 -22
- package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
- package/dist/src/gateway/hono/routes/you.d.ts +23 -0
- package/dist/src/gateway/hono/routes/you.js +538 -0
- package/dist/src/gateway/hono/routes/you.js.map +1 -0
- package/dist/src/gateway/hono/sse.d.ts +2 -1
- package/dist/src/gateway/hono/sse.js +2 -1
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/service/marketplace-service.d.ts +13 -1
- package/dist/src/gateway/service/marketplace-service.js +96 -40
- package/dist/src/gateway/service/marketplace-service.js.map +1 -1
- package/dist/src/gateway/service.d.ts +2 -0
- package/dist/src/gateway/service.js +7 -1
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/goals/goal-service.d.ts +7 -5
- package/dist/src/goals/goal-service.js +25 -13
- package/dist/src/goals/goal-service.js.map +1 -1
- package/dist/src/goals/goal-store.js +46 -7
- package/dist/src/goals/goal-store.js.map +1 -1
- package/dist/src/goals/types.d.ts +24 -0
- package/dist/src/storage/sqlite/connector-repository.d.ts +49 -0
- package/dist/src/storage/sqlite/connector-repository.js +385 -0
- package/dist/src/storage/sqlite/connector-repository.js.map +1 -0
- package/dist/src/storage/sqlite/index.d.ts +3 -0
- package/dist/src/storage/sqlite/index.js +4 -1
- package/dist/src/storage/sqlite/migrations/030_connectors.sql +94 -0
- package/dist/src/storage/sqlite/migrations/031_connector_approvals.sql +24 -0
- package/dist/src/storage/sqlite/migrations/032_connector_webhook_deliveries.sql +15 -0
- package/dist/src/storage/sqlite/migrations/033_user_trust_policies.sql +6 -0
- package/dist/src/storage/sqlite/migrations/034_allow_global_auto_trust.sql +14 -0
- package/dist/src/storage/sqlite/migrations/035_user_profile_prompt_state.sql +7 -0
- package/dist/src/storage/sqlite/migrations/036_goal_outcome_metric.sql +12 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/user-profile-setup-repository.d.ts +3 -0
- package/dist/src/storage/sqlite/user-profile-setup-repository.js +34 -0
- package/dist/src/storage/sqlite/user-profile-setup-repository.js.map +1 -0
- package/dist/src/storage/sqlite/user-trust-repository.d.ts +3 -0
- package/dist/src/storage/sqlite/user-trust-repository.js +34 -0
- package/dist/src/storage/sqlite/user-trust-repository.js.map +1 -0
- package/dist/src/tui/components/assistant-message.js +15 -0
- package/dist/src/tui/components/assistant-message.js.map +1 -1
- package/dist/src/tui/tui-agent-events.js +85 -1
- package/dist/src/tui/tui-agent-events.js.map +1 -1
- package/dist/src/tui/tui-command-formatters.js +7 -7
- package/dist/src/tui/tui-command-formatters.js.map +1 -1
- package/dist/src/tui/tui-commands.js +1 -1
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/user-context/import.d.ts +12 -0
- package/dist/src/user-context/import.js +48 -0
- package/dist/src/user-context/import.js.map +1 -0
- package/dist/src/user-context/profile.d.ts +37 -0
- package/dist/src/user-context/profile.js +165 -0
- package/dist/src/user-context/profile.js.map +1 -0
- package/dist/src/user-context/projection.d.ts +54 -0
- package/dist/src/user-context/projection.js +121 -0
- package/dist/src/user-context/projection.js.map +1 -0
- package/dist/src/user-context/source-recommendations.d.ts +13 -0
- package/dist/src/user-context/source-recommendations.js +86 -0
- package/dist/src/user-context/source-recommendations.js.map +1 -0
- package/dist/src/user-context/trust-policy.d.ts +11 -0
- package/dist/src/user-context/trust-policy.js +31 -0
- package/dist/src/user-context/trust-policy.js.map +1 -0
- package/dist/src/workflows/authoring/index.d.ts +1 -0
- package/dist/src/workflows/authoring/index.js +2 -0
- package/dist/src/workflows/authoring/workflow-draft-store.d.ts +33 -0
- package/dist/src/workflows/authoring/workflow-draft-store.js +74 -0
- package/dist/src/workflows/authoring/workflow-draft-store.js.map +1 -0
- package/dist/src/workflows/domain/definition-utils.d.ts +6 -4
- package/dist/src/workflows/domain/definition-utils.js +28 -26
- package/dist/src/workflows/domain/definition-utils.js.map +1 -1
- package/dist/src/workflows/domain/definition.d.ts +79 -6
- package/dist/src/workflows/domain/event.d.ts +18 -2
- package/dist/src/workflows/domain/index.js +3 -3
- package/dist/src/workflows/domain/run.d.ts +16 -2
- package/dist/src/workflows/domain/run.js.map +1 -1
- package/dist/src/workflows/domain/validation.d.ts +9 -5
- package/dist/src/workflows/domain/validation.js +183 -40
- package/dist/src/workflows/domain/validation.js.map +1 -1
- package/dist/src/workflows/draft/workflow-draft-prompt.d.ts +2 -3
- package/dist/src/workflows/draft/workflow-draft-prompt.js +31 -73
- package/dist/src/workflows/draft/workflow-draft-prompt.js.map +1 -1
- package/dist/src/workflows/draft/workflow-draft-service.js +4 -8
- package/dist/src/workflows/draft/workflow-draft-service.js.map +1 -1
- package/dist/src/workflows/draft/workflow-draft-validator.js +29 -37
- package/dist/src/workflows/draft/workflow-draft-validator.js.map +1 -1
- package/dist/src/workflows/draft/workflow-draft.types.d.ts +4 -4
- package/dist/src/workflows/engine/projector.js +43 -1
- package/dist/src/workflows/engine/projector.js.map +1 -1
- package/dist/src/workflows/engine/workflow-engine.d.ts +2 -3
- package/dist/src/workflows/engine/workflow-engine.js +24 -4
- package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
- package/dist/src/workflows/index.js +4 -7
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +1 -9
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -1
- package/dist/src/workflows/runtime/graph-workflow-runtime.d.ts +10 -0
- package/dist/src/workflows/runtime/graph-workflow-runtime.js +295 -0
- package/dist/src/workflows/runtime/graph-workflow-runtime.js.map +1 -0
- package/dist/src/workflows/runtime/index.d.ts +1 -2
- package/dist/src/workflows/runtime/index.js +2 -5
- package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +5 -8
- package/dist/src/workflows/service/workflow-run-service.js +15 -1
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/dist/src/workflows/service/workflow-run-service.types.d.ts +2 -1
- package/package.json +4 -3
- package/dist/gateway/static/root/assets/agents-CyvCIHnB.js +0 -2
- package/dist/gateway/static/root/assets/apps-page-DK_Vx6nl.js +0 -1
- package/dist/gateway/static/root/assets/automation-suggestion-card-B1LV3YYv.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-fzrovqhv.js +0 -4
- package/dist/gateway/static/root/assets/block-editor-Dhj5f4Bx.js +0 -184
- package/dist/gateway/static/root/assets/browser-settings-page-BDn-n-UB.js +0 -8
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-Co5ipo_Q.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-BWlpaxg9.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-D_jkIZLV.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-BcekbW4q.js +0 -2
- package/dist/gateway/static/root/assets/desktop-pet-settings-BJCUuL8Y.js +0 -1
- package/dist/gateway/static/root/assets/dreaming-settings-BN1Z2mIo.js +0 -3
- package/dist/gateway/static/root/assets/extension-page-B-1KxvVy.js +0 -1
- package/dist/gateway/static/root/assets/extension-settings-page-BF9NACI3.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-DN9sNREz.js +0 -1
- package/dist/gateway/static/root/assets/goal-create-dialog-BpoQW8cD.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-CBRSPd0b.js +0 -4
- package/dist/gateway/static/root/assets/goals-page-BCcBi407.js +0 -2
- package/dist/gateway/static/root/assets/goals-settings-pkTXzXkh.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-ezsufgLQ.js +0 -1
- package/dist/gateway/static/root/assets/index-B8s8Pq5U.css +0 -1
- package/dist/gateway/static/root/assets/index-DcUaXYeb.js +0 -262
- package/dist/gateway/static/root/assets/logs-page-DQtTRXtj.js +0 -7
- package/dist/gateway/static/root/assets/messages-BXNELNBa.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-BP2M9n6Q.js +0 -2
- package/dist/gateway/static/root/assets/notes-page-CspveYaO.js +0 -1
- package/dist/gateway/static/root/assets/notes-workbench-BHwzJ0OC.js +0 -2
- package/dist/gateway/static/root/assets/project-detail-page-Dy3rsobs.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-CWKpPE0L.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CqNRyXEo.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-MEME7ivF.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-JVd0qaSF.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-DYEbB1EV.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-dWN8BJ3z.js +0 -1
- package/dist/gateway/static/root/assets/share-preview-page-D8foINzP.js +0 -2
- package/dist/gateway/static/root/assets/shares-settings-Tgbv1s7G.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-D_YK0b_Z.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-DGytfoZK.js +0 -2
- package/dist/gateway/static/root/assets/toast-z0toXu32.js +0 -1
- package/dist/gateway/static/root/assets/user-profile-settings-panel-8YtygcJp.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-BVH71EFf.js +0 -1
- package/dist/gateway/static/root/assets/work-item-detail-page-JeTE7XNM.js +0 -1
- package/dist/gateway/static/root/assets/workflow-start-dialog-_u8Uc1ze.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-ixgk_y1l.js +0 -18
- package/dist/src/agent/workflow/builtins/audit-repo.d.ts +0 -13
- package/dist/src/agent/workflow/builtins/audit-repo.js +0 -183
- package/dist/src/agent/workflow/builtins/audit-repo.js.map +0 -1
- package/dist/src/agent/workflow/builtins/client-proposal.d.ts +0 -12
- package/dist/src/agent/workflow/builtins/client-proposal.js +0 -164
- package/dist/src/agent/workflow/builtins/client-proposal.js.map +0 -1
- package/dist/src/agent/workflow/builtins/competitor-scan.d.ts +0 -12
- package/dist/src/agent/workflow/builtins/competitor-scan.js +0 -164
- package/dist/src/agent/workflow/builtins/competitor-scan.js.map +0 -1
- package/dist/src/agent/workflow/builtins/content-draft.d.ts +0 -13
- package/dist/src/agent/workflow/builtins/content-draft.js +0 -159
- package/dist/src/agent/workflow/builtins/content-draft.js.map +0 -1
- package/dist/src/agent/workflow/builtins/content-repurpose.d.ts +0 -11
- package/dist/src/agent/workflow/builtins/content-repurpose.js +0 -146
- package/dist/src/agent/workflow/builtins/content-repurpose.js.map +0 -1
- package/dist/src/agent/workflow/builtins/debug-incident.d.ts +0 -13
- package/dist/src/agent/workflow/builtins/debug-incident.js +0 -177
- package/dist/src/agent/workflow/builtins/debug-incident.js.map +0 -1
- package/dist/src/agent/workflow/builtins/decision-compare.d.ts +0 -13
- package/dist/src/agent/workflow/builtins/decision-compare.js +0 -187
- package/dist/src/agent/workflow/builtins/decision-compare.js.map +0 -1
- package/dist/src/agent/workflow/builtins/implementation-plan.d.ts +0 -12
- package/dist/src/agent/workflow/builtins/implementation-plan.js +0 -185
- package/dist/src/agent/workflow/builtins/implementation-plan.js.map +0 -1
- package/dist/src/agent/workflow/builtins/inbox-triage.d.ts +0 -11
- package/dist/src/agent/workflow/builtins/inbox-triage.js +0 -158
- package/dist/src/agent/workflow/builtins/inbox-triage.js.map +0 -1
- package/dist/src/agent/workflow/builtins/meeting-prep.d.ts +0 -12
- package/dist/src/agent/workflow/builtins/meeting-prep.js +0 -152
- package/dist/src/agent/workflow/builtins/meeting-prep.js.map +0 -1
- package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +0 -14
- package/dist/src/agent/workflow/builtins/multi-perspective-review.js +0 -171
- package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +0 -1
- package/dist/src/agent/workflow/builtins/offer-design.d.ts +0 -12
- package/dist/src/agent/workflow/builtins/offer-design.js +0 -170
- package/dist/src/agent/workflow/builtins/offer-design.js.map +0 -1
- package/dist/src/agent/workflow/builtins/pr-review.d.ts +0 -12
- package/dist/src/agent/workflow/builtins/pr-review.js +0 -178
- package/dist/src/agent/workflow/builtins/pr-review.js.map +0 -1
- package/dist/src/agent/workflow/builtins/release-check.d.ts +0 -11
- package/dist/src/agent/workflow/builtins/release-check.js +0 -174
- package/dist/src/agent/workflow/builtins/release-check.js.map +0 -1
- package/dist/src/agent/workflow/builtins/research.d.ts +0 -13
- package/dist/src/agent/workflow/builtins/research.js +0 -188
- package/dist/src/agent/workflow/builtins/research.js.map +0 -1
- package/dist/src/agent/workflow/builtins/weekly-review.d.ts +0 -12
- package/dist/src/agent/workflow/builtins/weekly-review.js +0 -139
- package/dist/src/agent/workflow/builtins/weekly-review.js.map +0 -1
- package/dist/src/agent/workflow/last-run-memory.d.ts +0 -42
- package/dist/src/agent/workflow/last-run-memory.js +0 -60
- package/dist/src/agent/workflow/last-run-memory.js.map +0 -1
- package/dist/src/agent/workflow/lint.d.ts +0 -38
- package/dist/src/agent/workflow/lint.js +0 -74
- package/dist/src/agent/workflow/lint.js.map +0 -1
- package/dist/src/agent/workflow/meta-locale.d.ts +0 -12
- package/dist/src/agent/workflow/meta-locale.js +0 -62
- package/dist/src/agent/workflow/meta-locale.js.map +0 -1
- package/dist/src/agent/workflow/parser.d.ts +0 -20
- package/dist/src/agent/workflow/parser.js +0 -152
- package/dist/src/agent/workflow/parser.js.map +0 -1
- package/dist/src/agent/workflow/runtime.d.ts +0 -34
- package/dist/src/agent/workflow/runtime.js +0 -402
- package/dist/src/agent/workflow/runtime.js.map +0 -1
- package/dist/src/connectors/oauth.d.ts +0 -22
- package/dist/src/connectors/oauth.js +0 -99
- package/dist/src/connectors/oauth.js.map +0 -1
- package/dist/src/workflows/runtime/script-runtime.d.ts +0 -3
- package/dist/src/workflows/runtime/script-runtime.js +0 -3
- package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +0 -5
- package/dist/src/workflows/runtime/script-workflow-runtime.js +0 -15
- package/dist/src/workflows/runtime/script-workflow-runtime.js.map +0 -1
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
//#region src/connectors/policy.ts
|
|
2
|
+
const SCOPE_ORDER = {
|
|
3
|
+
read: 1,
|
|
4
|
+
write: 2,
|
|
5
|
+
admin: 3
|
|
6
|
+
};
|
|
7
|
+
function requiresConfirmation(policy, scope) {
|
|
8
|
+
if (policy === "always") return true;
|
|
9
|
+
if (policy === "writes") return scope === "write" || scope === "admin";
|
|
10
|
+
if (policy === "admin") return scope === "admin";
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
/** Evaluate every local policy layer before an external connector action is called. */
|
|
14
|
+
function evaluateConnectorExecutionPolicy(input) {
|
|
15
|
+
const { installation, action } = input;
|
|
16
|
+
if (!installation.enabled) return {
|
|
17
|
+
decision: "denied",
|
|
18
|
+
reason: "Connector is disabled."
|
|
19
|
+
};
|
|
20
|
+
if (installation.allowedAgentIds.length > 0 && (!input.agentId || !installation.allowedAgentIds.includes(input.agentId))) return {
|
|
21
|
+
decision: "denied",
|
|
22
|
+
reason: "Agent is not allowed to use this connector."
|
|
23
|
+
};
|
|
24
|
+
if (installation.selectedConnectionIds.length > 0 && (!input.connectionId || !installation.selectedConnectionIds.includes(input.connectionId))) return {
|
|
25
|
+
decision: "denied",
|
|
26
|
+
reason: "Connection is not allowed by this connector policy."
|
|
27
|
+
};
|
|
28
|
+
if (SCOPE_ORDER[installation.maxScope] < SCOPE_ORDER[action.scope]) return {
|
|
29
|
+
decision: "denied",
|
|
30
|
+
reason: `Action requires ${action.scope} scope; connector allows ${installation.maxScope}.`
|
|
31
|
+
};
|
|
32
|
+
if (!action.curated && installation.maxScope !== "admin") return {
|
|
33
|
+
decision: "denied",
|
|
34
|
+
reason: "Unverified connector actions require admin scope."
|
|
35
|
+
};
|
|
36
|
+
if (!input.confirmed && requiresConfirmation(installation.confirmationPolicy, action.scope)) return {
|
|
37
|
+
decision: "confirmation_required",
|
|
38
|
+
reason: `Action requires ${action.scope} confirmation.`
|
|
39
|
+
};
|
|
40
|
+
return {
|
|
41
|
+
decision: "allowed",
|
|
42
|
+
reason: "Connector policy allows this action."
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//#endregion
|
|
46
|
+
export { evaluateConnectorExecutionPolicy };
|
|
47
|
+
|
|
48
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","names":[],"sources":["../../../src/connectors/policy.ts"],"sourcesContent":["import type {\n ConnectorActionMetadata,\n ConnectorExecutionDecision,\n ConnectorInstallationPolicy,\n ConnectorScope,\n} from './types.js';\n\nconst SCOPE_ORDER: Record<ConnectorScope, number> = {\n read: 1,\n write: 2,\n admin: 3,\n};\n\nexport type ConnectorPolicyEvaluation = {\n decision: ConnectorExecutionDecision;\n reason: string;\n};\n\nfunction requiresConfirmation(\n policy: ConnectorInstallationPolicy['confirmationPolicy'],\n scope: ConnectorScope,\n): boolean {\n if (policy === 'always') return true;\n if (policy === 'writes') return scope === 'write' || scope === 'admin';\n if (policy === 'admin') return scope === 'admin';\n return false;\n}\n\n/** Evaluate every local policy layer before an external connector action is called. */\nexport function evaluateConnectorExecutionPolicy(input: {\n installation: ConnectorInstallationPolicy;\n action: Pick<ConnectorActionMetadata, 'scope' | 'curated'>;\n agentId?: string;\n connectionId?: string;\n confirmed?: boolean;\n}): ConnectorPolicyEvaluation {\n const { installation, action } = input;\n if (!installation.enabled) {\n return { decision: 'denied', reason: 'Connector is disabled.' };\n }\n if (\n installation.allowedAgentIds.length > 0 &&\n (!input.agentId || !installation.allowedAgentIds.includes(input.agentId))\n ) {\n return { decision: 'denied', reason: 'Agent is not allowed to use this connector.' };\n }\n if (\n installation.selectedConnectionIds.length > 0 &&\n (!input.connectionId || !installation.selectedConnectionIds.includes(input.connectionId))\n ) {\n return { decision: 'denied', reason: 'Connection is not allowed by this connector policy.' };\n }\n if (SCOPE_ORDER[installation.maxScope] < SCOPE_ORDER[action.scope]) {\n return {\n decision: 'denied',\n reason: `Action requires ${action.scope} scope; connector allows ${installation.maxScope}.`,\n };\n }\n if (!action.curated && installation.maxScope !== 'admin') {\n return {\n decision: 'denied',\n reason: 'Unverified connector actions require admin scope.',\n };\n }\n if (!input.confirmed && requiresConfirmation(installation.confirmationPolicy, action.scope)) {\n return {\n decision: 'confirmation_required',\n reason: `Action requires ${action.scope} confirmation.`,\n };\n }\n return { decision: 'allowed', reason: 'Connector policy allows this action.' };\n}\n"],"mappings":";AAOA,MAAM,cAA8C;CAClD,MAAM;CACN,OAAO;CACP,OAAO;CACR;AAOD,SAAS,qBACP,QACA,OACS;AACT,KAAI,WAAW,SAAU,QAAO;AAChC,KAAI,WAAW,SAAU,QAAO,UAAU,WAAW,UAAU;AAC/D,KAAI,WAAW,QAAS,QAAO,UAAU;AACzC,QAAO;;;AAIT,SAAgB,iCAAiC,OAMnB;CAC5B,MAAM,EAAE,cAAc,WAAW;AACjC,KAAI,CAAC,aAAa,QAChB,QAAO;EAAE,UAAU;EAAU,QAAQ;EAA0B;AAEjE,KACE,aAAa,gBAAgB,SAAS,MACrC,CAAC,MAAM,WAAW,CAAC,aAAa,gBAAgB,SAAS,MAAM,QAAQ,EAExE,QAAO;EAAE,UAAU;EAAU,QAAQ;EAA+C;AAEtF,KACE,aAAa,sBAAsB,SAAS,MAC3C,CAAC,MAAM,gBAAgB,CAAC,aAAa,sBAAsB,SAAS,MAAM,aAAa,EAExF,QAAO;EAAE,UAAU;EAAU,QAAQ;EAAuD;AAE9F,KAAI,YAAY,aAAa,YAAY,YAAY,OAAO,OAC1D,QAAO;EACL,UAAU;EACV,QAAQ,mBAAmB,OAAO,MAAM,2BAA2B,aAAa,SAAS;EAC1F;AAEH,KAAI,CAAC,OAAO,WAAW,aAAa,aAAa,QAC/C,QAAO;EACL,UAAU;EACV,QAAQ;EACT;AAEH,KAAI,CAAC,MAAM,aAAa,qBAAqB,aAAa,oBAAoB,OAAO,MAAM,CACzF,QAAO;EACL,UAAU;EACV,QAAQ,mBAAmB,OAAO,MAAM;EACzC;AAEH,QAAO;EAAE,UAAU;EAAW,QAAQ;EAAwC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { CredentialResolver } from '../auth/credentials.js';
|
|
2
|
+
import type { Config } from '../config/schema.js';
|
|
3
|
+
import type { ConnectorDefinition, ConnectorInstallInput, ConnectorInstance, ConnectorRuntimeDefinition } from './types.js';
|
|
4
|
+
export type ConnectorRuntimeInstallContext = {
|
|
5
|
+
config: Config;
|
|
6
|
+
definition: ConnectorDefinition;
|
|
7
|
+
input: ConnectorInstallInput;
|
|
8
|
+
resolver: CredentialResolver;
|
|
9
|
+
};
|
|
10
|
+
export type ConnectorRuntimeUninstallContext = {
|
|
11
|
+
config: Config;
|
|
12
|
+
definition: ConnectorDefinition;
|
|
13
|
+
instance: ConnectorInstance;
|
|
14
|
+
};
|
|
15
|
+
export type ConnectorRuntimeUpdateContext = ConnectorRuntimeInstallContext & {
|
|
16
|
+
instanceId: string;
|
|
17
|
+
};
|
|
18
|
+
export type ConnectorRuntimeAdapter = {
|
|
19
|
+
type: ConnectorRuntimeDefinition['type'];
|
|
20
|
+
install(context: ConnectorRuntimeInstallContext): Promise<ConnectorInstance>;
|
|
21
|
+
uninstall(context: ConnectorRuntimeUninstallContext): void;
|
|
22
|
+
update?(context: ConnectorRuntimeUpdateContext): ConnectorInstance;
|
|
23
|
+
};
|
|
24
|
+
export declare function registerConnectorRuntimeAdapter(adapter: ConnectorRuntimeAdapter): void;
|
|
25
|
+
export declare function getConnectorRuntimeAdapter(type: ConnectorRuntimeDefinition['type']): ConnectorRuntimeAdapter;
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { isXopcDatabaseOpen } from "../storage/sqlite/connection.js";
|
|
2
|
+
import { deleteConnectorInstallation, getConnectorInstallation, upsertConnectorInstallation } from "../storage/sqlite/connector-repository.js";
|
|
3
|
+
import "../storage/sqlite/index.js";
|
|
4
|
+
import { assertComposioApiKeyConfigured } from "./composio-sessions.js";
|
|
5
|
+
import { saveComposioApiKey } from "./composio.js";
|
|
6
|
+
import { saveConnectorSecrets } from "./secret-store.js";
|
|
7
|
+
import { isManagedConnectorServer, materializeConnectorMcpServer } from "./materialize.js";
|
|
8
|
+
import { appendConnectorAuditRecord } from "./usage.js";
|
|
9
|
+
import { listConnectorInstances } from "./instances.js";
|
|
10
|
+
//#region src/connectors/runtime-adapter-registry.ts
|
|
11
|
+
const adapters = /* @__PURE__ */ new Map();
|
|
12
|
+
function registerConnectorRuntimeAdapter(adapter) {
|
|
13
|
+
if (adapters.has(adapter.type)) throw new Error(`Connector runtime adapter is already registered: ${adapter.type}`);
|
|
14
|
+
adapters.set(adapter.type, adapter);
|
|
15
|
+
}
|
|
16
|
+
function installedInstance(config, instanceId, connectorId) {
|
|
17
|
+
const instance = listConnectorInstances(config).find((candidate) => candidate.instanceId === instanceId);
|
|
18
|
+
if (!instance) throw new Error(`Connector "${connectorId}" was installed but could not be resolved.`);
|
|
19
|
+
return instance;
|
|
20
|
+
}
|
|
21
|
+
function installRecord(config, definition, extra = {}) {
|
|
22
|
+
const instanceId = definition.id;
|
|
23
|
+
config.connectors = config.connectors ?? {};
|
|
24
|
+
config.connectors.instances = {
|
|
25
|
+
...config.connectors.instances ?? {},
|
|
26
|
+
[instanceId]: {
|
|
27
|
+
xopcConnector: {
|
|
28
|
+
managed: true,
|
|
29
|
+
connectorId: definition.id,
|
|
30
|
+
version: definition.version,
|
|
31
|
+
enabled: true,
|
|
32
|
+
displayName: definition.displayName,
|
|
33
|
+
source: definition.source,
|
|
34
|
+
artifactSha256: definition.provenance?.sha256
|
|
35
|
+
},
|
|
36
|
+
runtime: definition.runtime,
|
|
37
|
+
...extra
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
return installedInstance(config, instanceId, definition.id);
|
|
41
|
+
}
|
|
42
|
+
function uninstallRecord(config, instanceId) {
|
|
43
|
+
if (!config.connectors?.instances?.[instanceId]) throw new Error(`Connector instance not found: ${instanceId}`);
|
|
44
|
+
const nextInstances = { ...config.connectors?.instances ?? {} };
|
|
45
|
+
delete nextInstances[instanceId];
|
|
46
|
+
config.connectors = {
|
|
47
|
+
...config.connectors ?? {},
|
|
48
|
+
instances: nextInstances
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
registerConnectorRuntimeAdapter({
|
|
52
|
+
type: "mcp",
|
|
53
|
+
async install({ config, definition, input, resolver }) {
|
|
54
|
+
if (definition.runtime.type !== "mcp") throw new Error(`Invalid MCP connector definition: ${definition.id}`);
|
|
55
|
+
const { serverId, server } = materializeConnectorMcpServer(definition, input);
|
|
56
|
+
const existingServer = config.mcp?.servers?.[serverId];
|
|
57
|
+
if (existingServer && !isManagedConnectorServer(existingServer)) throw new Error(`MCP server "${serverId}" already exists and is not managed by Connectors.`);
|
|
58
|
+
await saveConnectorSecrets(definition, input, resolver);
|
|
59
|
+
config.mcp = config.mcp ?? {};
|
|
60
|
+
config.mcp.servers = {
|
|
61
|
+
...config.mcp.servers ?? {},
|
|
62
|
+
[serverId]: server
|
|
63
|
+
};
|
|
64
|
+
const instance = installedInstance(config, serverId, definition.id);
|
|
65
|
+
appendConnectorAuditRecord(config, serverId, { action: "installed" });
|
|
66
|
+
return instance;
|
|
67
|
+
},
|
|
68
|
+
uninstall({ config, instance }) {
|
|
69
|
+
const server = config.mcp?.servers?.[instance.instanceId];
|
|
70
|
+
if (!server || !isManagedConnectorServer(server)) throw new Error(`MCP server "${instance.instanceId}" is not managed by Connectors.`);
|
|
71
|
+
appendConnectorAuditRecord(config, instance.instanceId, { action: "removed" });
|
|
72
|
+
const nextServers = { ...config.mcp?.servers ?? {} };
|
|
73
|
+
delete nextServers[instance.instanceId];
|
|
74
|
+
config.mcp = {
|
|
75
|
+
...config.mcp ?? {},
|
|
76
|
+
servers: nextServers
|
|
77
|
+
};
|
|
78
|
+
},
|
|
79
|
+
update({ config, definition, input, instanceId }) {
|
|
80
|
+
if (definition.runtime.type !== "mcp") throw new Error(`Invalid MCP connector definition: ${definition.id}`);
|
|
81
|
+
const existingServer = config.mcp?.servers?.[instanceId];
|
|
82
|
+
if (!existingServer || !isManagedConnectorServer(existingServer)) throw new Error(`MCP server "${instanceId}" is not managed by Connectors.`);
|
|
83
|
+
if ((definition.setup.secrets ?? []).length > 0) throw new Error("Connectors with secrets must be reinstalled to change configuration.");
|
|
84
|
+
const { serverId, server } = materializeConnectorMcpServer(definition, input);
|
|
85
|
+
if (serverId !== instanceId) throw new Error(`Connector config update cannot change server id from "${instanceId}" to "${serverId}".`);
|
|
86
|
+
config.mcp = config.mcp ?? {};
|
|
87
|
+
config.mcp.servers = {
|
|
88
|
+
...config.mcp.servers ?? {},
|
|
89
|
+
[serverId]: {
|
|
90
|
+
...server,
|
|
91
|
+
xopcConnector: {
|
|
92
|
+
...existingServer.xopcConnector,
|
|
93
|
+
...server.xopcConnector,
|
|
94
|
+
enabled: existingServer.xopcConnector.enabled,
|
|
95
|
+
lastConnectedAt: existingServer.xopcConnector.lastConnectedAt,
|
|
96
|
+
lastError: existingServer.xopcConnector.lastError
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
return installedInstance(config, serverId, definition.id);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
registerConnectorRuntimeAdapter({
|
|
104
|
+
type: "composio",
|
|
105
|
+
async install({ config, definition, input, resolver }) {
|
|
106
|
+
if (definition.runtime.type !== "composio") throw new Error(`Invalid Composio connector definition: ${definition.id}`);
|
|
107
|
+
if (definition.runtime.role === "credential") await saveComposioApiKey(input, resolver);
|
|
108
|
+
if (definition.runtime.role === "toolkit") await assertComposioApiKeyConfigured(resolver);
|
|
109
|
+
const instance = installRecord(config, definition, definition.runtime.role === "toolkit" ? { scope: "read" } : {});
|
|
110
|
+
if (definition.runtime.role === "toolkit" && isXopcDatabaseOpen()) {
|
|
111
|
+
const installationId = `${definition.id}-local-owner`;
|
|
112
|
+
const existing = getConnectorInstallation(installationId);
|
|
113
|
+
upsertConnectorInstallation({
|
|
114
|
+
id: installationId,
|
|
115
|
+
connectorId: definition.id,
|
|
116
|
+
principalId: "local-owner",
|
|
117
|
+
enabled: true,
|
|
118
|
+
allowedAgentIds: existing?.allowedAgentIds ?? [],
|
|
119
|
+
maxScope: "read",
|
|
120
|
+
confirmationPolicy: existing?.confirmationPolicy ?? "writes",
|
|
121
|
+
selectedConnectionIds: existing?.selectedConnectionIds ?? [],
|
|
122
|
+
createdAt: existing?.createdAt
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
return instance;
|
|
126
|
+
},
|
|
127
|
+
uninstall({ config, definition, instance }) {
|
|
128
|
+
if (definition.runtime.type !== "composio") throw new Error(`Invalid Composio connector definition: ${definition.id}`);
|
|
129
|
+
uninstallRecord(config, instance.instanceId);
|
|
130
|
+
if (definition.runtime.role === "toolkit" && isXopcDatabaseOpen()) deleteConnectorInstallation(`${definition.id}-local-owner`);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
for (const type of [
|
|
134
|
+
"channel",
|
|
135
|
+
"nativeTool",
|
|
136
|
+
"memorySource"
|
|
137
|
+
]) registerConnectorRuntimeAdapter({
|
|
138
|
+
type,
|
|
139
|
+
async install({ config, definition }) {
|
|
140
|
+
return installRecord(config, definition);
|
|
141
|
+
},
|
|
142
|
+
uninstall({ config, instance }) {
|
|
143
|
+
uninstallRecord(config, instance.instanceId);
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
function getConnectorRuntimeAdapter(type) {
|
|
147
|
+
const adapter = adapters.get(type);
|
|
148
|
+
if (!adapter) throw new Error(`Unknown connector runtime adapter: ${type}`);
|
|
149
|
+
return adapter;
|
|
150
|
+
}
|
|
151
|
+
//#endregion
|
|
152
|
+
export { getConnectorRuntimeAdapter, registerConnectorRuntimeAdapter };
|
|
153
|
+
|
|
154
|
+
//# sourceMappingURL=runtime-adapter-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-adapter-registry.js","names":[],"sources":["../../../src/connectors/runtime-adapter-registry.ts"],"sourcesContent":["import type { CredentialResolver } from '../auth/credentials.js';\nimport type { Config } from '../config/schema.js';\nimport {\n deleteConnectorInstallation,\n getConnectorInstallation,\n isXopcDatabaseOpen,\n upsertConnectorInstallation,\n} from '../storage/sqlite/index.js';\nimport { saveComposioApiKey } from './composio.js';\nimport { assertComposioApiKeyConfigured } from './composio-sessions.js';\nimport { listConnectorInstances } from './instances.js';\nimport { isManagedConnectorServer, materializeConnectorMcpServer } from './materialize.js';\nimport { saveConnectorSecrets } from './secret-store.js';\nimport { appendConnectorAuditRecord } from './usage.js';\nimport type {\n ConnectorDefinition,\n ConnectorInstallInput,\n ConnectorInstance,\n ConnectorRuntimeDefinition,\n} from './types.js';\n\nexport type ConnectorRuntimeInstallContext = {\n config: Config;\n definition: ConnectorDefinition;\n input: ConnectorInstallInput;\n resolver: CredentialResolver;\n};\n\nexport type ConnectorRuntimeUninstallContext = {\n config: Config;\n definition: ConnectorDefinition;\n instance: ConnectorInstance;\n};\n\nexport type ConnectorRuntimeUpdateContext = ConnectorRuntimeInstallContext & { instanceId: string };\n\nexport type ConnectorRuntimeAdapter = {\n type: ConnectorRuntimeDefinition['type'];\n install(context: ConnectorRuntimeInstallContext): Promise<ConnectorInstance>;\n uninstall(context: ConnectorRuntimeUninstallContext): void;\n update?(context: ConnectorRuntimeUpdateContext): ConnectorInstance;\n};\n\nconst adapters = new Map<ConnectorRuntimeDefinition['type'], ConnectorRuntimeAdapter>();\n\nexport function registerConnectorRuntimeAdapter(adapter: ConnectorRuntimeAdapter): void {\n if (adapters.has(adapter.type)) throw new Error(`Connector runtime adapter is already registered: ${adapter.type}`);\n adapters.set(adapter.type, adapter);\n}\n\nfunction installedInstance(config: Config, instanceId: string, connectorId: string): ConnectorInstance {\n const instance = listConnectorInstances(config).find((candidate) => candidate.instanceId === instanceId);\n if (!instance) throw new Error(`Connector \"${connectorId}\" was installed but could not be resolved.`);\n return instance;\n}\n\nfunction installRecord(config: Config, definition: ConnectorDefinition, extra: Record<string, unknown> = {}): ConnectorInstance {\n const instanceId = definition.id;\n config.connectors = config.connectors ?? {};\n config.connectors.instances = {\n ...(config.connectors.instances ?? {}),\n [instanceId]: {\n xopcConnector: {\n managed: true,\n connectorId: definition.id,\n version: definition.version,\n enabled: true,\n displayName: definition.displayName,\n source: definition.source,\n artifactSha256: definition.provenance?.sha256,\n },\n runtime: definition.runtime,\n ...extra,\n },\n };\n return installedInstance(config, instanceId, definition.id);\n}\n\nfunction uninstallRecord(config: Config, instanceId: string): void {\n const record = config.connectors?.instances?.[instanceId];\n if (!record) throw new Error(`Connector instance not found: ${instanceId}`);\n const nextInstances = { ...(config.connectors?.instances ?? {}) };\n delete nextInstances[instanceId];\n config.connectors = { ...(config.connectors ?? {}), instances: nextInstances };\n}\n\nregisterConnectorRuntimeAdapter({\n type: 'mcp',\n async install({ config, definition, input, resolver }) {\n if (definition.runtime.type !== 'mcp') throw new Error(`Invalid MCP connector definition: ${definition.id}`);\n const { serverId, server } = materializeConnectorMcpServer(definition, input);\n const existingServer = config.mcp?.servers?.[serverId];\n if (existingServer && !isManagedConnectorServer(existingServer)) {\n throw new Error(`MCP server \"${serverId}\" already exists and is not managed by Connectors.`);\n }\n await saveConnectorSecrets(definition, input, resolver);\n config.mcp = config.mcp ?? {};\n config.mcp.servers = { ...(config.mcp.servers ?? {}), [serverId]: server };\n const instance = installedInstance(config, serverId, definition.id);\n appendConnectorAuditRecord(config, serverId, { action: 'installed' });\n return instance;\n },\n uninstall({ config, instance }) {\n const server = config.mcp?.servers?.[instance.instanceId];\n if (!server || !isManagedConnectorServer(server)) {\n throw new Error(`MCP server \"${instance.instanceId}\" is not managed by Connectors.`);\n }\n appendConnectorAuditRecord(config, instance.instanceId, { action: 'removed' });\n const nextServers = { ...(config.mcp?.servers ?? {}) };\n delete nextServers[instance.instanceId];\n config.mcp = { ...(config.mcp ?? {}), servers: nextServers };\n },\n update({ config, definition, input, instanceId }) {\n if (definition.runtime.type !== 'mcp') throw new Error(`Invalid MCP connector definition: ${definition.id}`);\n const existingServer = config.mcp?.servers?.[instanceId];\n if (!existingServer || !isManagedConnectorServer(existingServer)) {\n throw new Error(`MCP server \"${instanceId}\" is not managed by Connectors.`);\n }\n if ((definition.setup.secrets ?? []).length > 0) {\n throw new Error('Connectors with secrets must be reinstalled to change configuration.');\n }\n const { serverId, server } = materializeConnectorMcpServer(definition, input);\n if (serverId !== instanceId) {\n throw new Error(`Connector config update cannot change server id from \"${instanceId}\" to \"${serverId}\".`);\n }\n config.mcp = config.mcp ?? {};\n config.mcp.servers = {\n ...(config.mcp.servers ?? {}),\n [serverId]: {\n ...server,\n xopcConnector: {\n ...existingServer.xopcConnector,\n ...(server.xopcConnector as Record<string, unknown>),\n enabled: existingServer.xopcConnector.enabled,\n lastConnectedAt: existingServer.xopcConnector.lastConnectedAt,\n lastError: existingServer.xopcConnector.lastError,\n },\n },\n };\n return installedInstance(config, serverId, definition.id);\n },\n});\n\nregisterConnectorRuntimeAdapter({\n type: 'composio',\n async install({ config, definition, input, resolver }) {\n if (definition.runtime.type !== 'composio') throw new Error(`Invalid Composio connector definition: ${definition.id}`);\n if (definition.runtime.role === 'credential') await saveComposioApiKey(input, resolver);\n if (definition.runtime.role === 'toolkit') await assertComposioApiKeyConfigured(resolver);\n const instance = installRecord(\n config,\n definition,\n definition.runtime.role === 'toolkit' ? { scope: 'read' } : {},\n );\n if (definition.runtime.role === 'toolkit' && isXopcDatabaseOpen()) {\n const installationId = `${definition.id}-local-owner`;\n const existing = getConnectorInstallation(installationId);\n upsertConnectorInstallation({\n id: installationId,\n connectorId: definition.id,\n principalId: 'local-owner',\n enabled: true,\n allowedAgentIds: existing?.allowedAgentIds ?? [],\n maxScope: 'read',\n confirmationPolicy: existing?.confirmationPolicy ?? 'writes',\n selectedConnectionIds: existing?.selectedConnectionIds ?? [],\n createdAt: existing?.createdAt,\n });\n }\n return instance;\n },\n uninstall({ config, definition, instance }) {\n if (definition.runtime.type !== 'composio') throw new Error(`Invalid Composio connector definition: ${definition.id}`);\n uninstallRecord(config, instance.instanceId);\n if (definition.runtime.role === 'toolkit' && isXopcDatabaseOpen()) {\n deleteConnectorInstallation(`${definition.id}-local-owner`);\n }\n },\n});\n\nfor (const type of ['channel', 'nativeTool', 'memorySource'] as const) {\n registerConnectorRuntimeAdapter({\n type,\n async install({ config, definition }) {\n return installRecord(config, definition);\n },\n uninstall({ config, instance }) {\n uninstallRecord(config, instance.instanceId);\n },\n });\n}\n\nexport function getConnectorRuntimeAdapter(type: ConnectorRuntimeDefinition['type']): ConnectorRuntimeAdapter {\n const adapter = adapters.get(type);\n if (!adapter) throw new Error(`Unknown connector runtime adapter: ${type}`);\n return adapter;\n}\n"],"mappings":";;;;;;;;;;AA2CA,MAAM,2BAAW,IAAI,KAAkE;AAEvF,SAAgB,gCAAgC,SAAwC;AACtF,KAAI,SAAS,IAAI,QAAQ,KAAK,CAAE,OAAM,IAAI,MAAM,oDAAoD,QAAQ,OAAO;AACnH,UAAS,IAAI,QAAQ,MAAM,QAAQ;;AAGrC,SAAS,kBAAkB,QAAgB,YAAoB,aAAwC;CACrG,MAAM,WAAW,uBAAuB,OAAO,CAAC,MAAM,cAAc,UAAU,eAAe,WAAW;AACxG,KAAI,CAAC,SAAU,OAAM,IAAI,MAAM,cAAc,YAAY,4CAA4C;AACrG,QAAO;;AAGT,SAAS,cAAc,QAAgB,YAAiC,QAAiC,EAAE,EAAqB;CAC9H,MAAM,aAAa,WAAW;AAC9B,QAAO,aAAa,OAAO,cAAc,EAAE;AAC3C,QAAO,WAAW,YAAY;EAC5B,GAAI,OAAO,WAAW,aAAa,EAAE;GACpC,aAAa;GACZ,eAAe;IACb,SAAS;IACT,aAAa,WAAW;IACxB,SAAS,WAAW;IACpB,SAAS;IACT,aAAa,WAAW;IACxB,QAAQ,WAAW;IACnB,gBAAgB,WAAW,YAAY;IACxC;GACD,SAAS,WAAW;GACpB,GAAG;GACJ;EACF;AACD,QAAO,kBAAkB,QAAQ,YAAY,WAAW,GAAG;;AAG7D,SAAS,gBAAgB,QAAgB,YAA0B;AAEjE,KAAI,CADW,OAAO,YAAY,YAAY,YACjC,OAAM,IAAI,MAAM,iCAAiC,aAAa;CAC3E,MAAM,gBAAgB,EAAE,GAAI,OAAO,YAAY,aAAa,EAAE,EAAG;AACjE,QAAO,cAAc;AACrB,QAAO,aAAa;EAAE,GAAI,OAAO,cAAc,EAAE;EAAG,WAAW;EAAe;;AAGhF,gCAAgC;CAC9B,MAAM;CACN,MAAM,QAAQ,EAAE,QAAQ,YAAY,OAAO,YAAY;AACrD,MAAI,WAAW,QAAQ,SAAS,MAAO,OAAM,IAAI,MAAM,qCAAqC,WAAW,KAAK;EAC5G,MAAM,EAAE,UAAU,WAAW,8BAA8B,YAAY,MAAM;EAC7E,MAAM,iBAAiB,OAAO,KAAK,UAAU;AAC7C,MAAI,kBAAkB,CAAC,yBAAyB,eAAe,CAC7D,OAAM,IAAI,MAAM,eAAe,SAAS,oDAAoD;AAE9F,QAAM,qBAAqB,YAAY,OAAO,SAAS;AACvD,SAAO,MAAM,OAAO,OAAO,EAAE;AAC7B,SAAO,IAAI,UAAU;GAAE,GAAI,OAAO,IAAI,WAAW,EAAE;IAAI,WAAW;GAAQ;EAC1E,MAAM,WAAW,kBAAkB,QAAQ,UAAU,WAAW,GAAG;AACnE,6BAA2B,QAAQ,UAAU,EAAE,QAAQ,aAAa,CAAC;AACrE,SAAO;;CAET,UAAU,EAAE,QAAQ,YAAY;EAC9B,MAAM,SAAS,OAAO,KAAK,UAAU,SAAS;AAC9C,MAAI,CAAC,UAAU,CAAC,yBAAyB,OAAO,CAC9C,OAAM,IAAI,MAAM,eAAe,SAAS,WAAW,iCAAiC;AAEtF,6BAA2B,QAAQ,SAAS,YAAY,EAAE,QAAQ,WAAW,CAAC;EAC9E,MAAM,cAAc,EAAE,GAAI,OAAO,KAAK,WAAW,EAAE,EAAG;AACtD,SAAO,YAAY,SAAS;AAC5B,SAAO,MAAM;GAAE,GAAI,OAAO,OAAO,EAAE;GAAG,SAAS;GAAa;;CAE9D,OAAO,EAAE,QAAQ,YAAY,OAAO,cAAc;AAChD,MAAI,WAAW,QAAQ,SAAS,MAAO,OAAM,IAAI,MAAM,qCAAqC,WAAW,KAAK;EAC5G,MAAM,iBAAiB,OAAO,KAAK,UAAU;AAC7C,MAAI,CAAC,kBAAkB,CAAC,yBAAyB,eAAe,CAC9D,OAAM,IAAI,MAAM,eAAe,WAAW,iCAAiC;AAE7E,OAAK,WAAW,MAAM,WAAW,EAAE,EAAE,SAAS,EAC5C,OAAM,IAAI,MAAM,uEAAuE;EAEzF,MAAM,EAAE,UAAU,WAAW,8BAA8B,YAAY,MAAM;AAC7E,MAAI,aAAa,WACf,OAAM,IAAI,MAAM,yDAAyD,WAAW,QAAQ,SAAS,IAAI;AAE3G,SAAO,MAAM,OAAO,OAAO,EAAE;AAC7B,SAAO,IAAI,UAAU;GACnB,GAAI,OAAO,IAAI,WAAW,EAAE;IAC3B,WAAW;IACV,GAAG;IACH,eAAe;KACb,GAAG,eAAe;KAClB,GAAI,OAAO;KACX,SAAS,eAAe,cAAc;KACtC,iBAAiB,eAAe,cAAc;KAC9C,WAAW,eAAe,cAAc;KACzC;IACF;GACF;AACD,SAAO,kBAAkB,QAAQ,UAAU,WAAW,GAAG;;CAE5D,CAAC;AAEF,gCAAgC;CAC9B,MAAM;CACN,MAAM,QAAQ,EAAE,QAAQ,YAAY,OAAO,YAAY;AACrD,MAAI,WAAW,QAAQ,SAAS,WAAY,OAAM,IAAI,MAAM,0CAA0C,WAAW,KAAK;AACtH,MAAI,WAAW,QAAQ,SAAS,aAAc,OAAM,mBAAmB,OAAO,SAAS;AACvF,MAAI,WAAW,QAAQ,SAAS,UAAW,OAAM,+BAA+B,SAAS;EACzF,MAAM,WAAW,cACf,QACA,YACA,WAAW,QAAQ,SAAS,YAAY,EAAE,OAAO,QAAQ,GAAG,EAAE,CAC/D;AACD,MAAI,WAAW,QAAQ,SAAS,aAAa,oBAAoB,EAAE;GACjE,MAAM,iBAAiB,GAAG,WAAW,GAAG;GACxC,MAAM,WAAW,yBAAyB,eAAe;AACzD,+BAA4B;IAC1B,IAAI;IACJ,aAAa,WAAW;IACxB,aAAa;IACb,SAAS;IACT,iBAAiB,UAAU,mBAAmB,EAAE;IAChD,UAAU;IACV,oBAAoB,UAAU,sBAAsB;IACpD,uBAAuB,UAAU,yBAAyB,EAAE;IAC5D,WAAW,UAAU;IACtB,CAAC;;AAEJ,SAAO;;CAET,UAAU,EAAE,QAAQ,YAAY,YAAY;AAC1C,MAAI,WAAW,QAAQ,SAAS,WAAY,OAAM,IAAI,MAAM,0CAA0C,WAAW,KAAK;AACtH,kBAAgB,QAAQ,SAAS,WAAW;AAC5C,MAAI,WAAW,QAAQ,SAAS,aAAa,oBAAoB,CAC/D,6BAA4B,GAAG,WAAW,GAAG,cAAc;;CAGhE,CAAC;AAEF,KAAK,MAAM,QAAQ;CAAC;CAAW;CAAc;CAAe,CAC1D,iCAAgC;CAC9B;CACA,MAAM,QAAQ,EAAE,QAAQ,cAAc;AACpC,SAAO,cAAc,QAAQ,WAAW;;CAE1C,UAAU,EAAE,QAAQ,YAAY;AAC9B,kBAAgB,QAAQ,SAAS,WAAW;;CAE/C,CAAC;AAGJ,SAAgB,2BAA2B,MAAmE;CAC5G,MAAM,UAAU,SAAS,IAAI,KAAK;AAClC,KAAI,CAAC,QAAS,OAAM,IAAI,MAAM,sCAAsC,OAAO;AAC3E,QAAO"}
|
|
@@ -2,12 +2,38 @@ export type ConnectorKind = 'mcp' | 'cli' | 'http' | 'channel' | 'browser' | 'ex
|
|
|
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';
|
|
5
|
+
export type ConnectorAuthDefinition = {
|
|
6
|
+
mode: 'none';
|
|
7
|
+
} | {
|
|
8
|
+
mode: 'apiKey';
|
|
9
|
+
} | {
|
|
10
|
+
mode: 'oauth';
|
|
11
|
+
provider: string;
|
|
12
|
+
};
|
|
13
|
+
export type ConnectorScope = 'read' | 'write' | 'admin';
|
|
14
|
+
export type ConnectorVerificationLevel = 'verified' | 'beta' | 'experimental';
|
|
15
|
+
export type ConnectorBranding = {
|
|
16
|
+
logoUrl?: string;
|
|
17
|
+
source?: 'builtin' | 'composio-catalog' | 'registry' | 'extension' | 'custom';
|
|
18
|
+
backgroundColor?: string;
|
|
19
|
+
fetchedAt?: string;
|
|
20
|
+
};
|
|
21
|
+
export type ConnectorConfirmationPolicy = 'always' | 'writes' | 'admin' | 'never';
|
|
5
22
|
export type ConnectorPermissions = {
|
|
6
23
|
data?: string[];
|
|
7
24
|
networkDomains?: string[];
|
|
8
25
|
localExec?: boolean;
|
|
9
26
|
filesystem?: string[];
|
|
10
27
|
};
|
|
28
|
+
export type ConnectorIntegrationStrategy = {
|
|
29
|
+
lane: 'native' | 'mcp' | 'composio';
|
|
30
|
+
workload: 'core' | 'high_frequency' | 'long_tail';
|
|
31
|
+
preferred: boolean;
|
|
32
|
+
alternative?: {
|
|
33
|
+
kind: 'channel' | 'connector';
|
|
34
|
+
id: string;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
11
37
|
export type ConnectorSecretReference = {
|
|
12
38
|
xopcSecretRef: {
|
|
13
39
|
provider: string;
|
|
@@ -45,6 +71,7 @@ export type ConnectorRuntimeDefinition = {
|
|
|
45
71
|
} | {
|
|
46
72
|
type: 'composio';
|
|
47
73
|
toolkit: string;
|
|
74
|
+
role: 'credential' | 'toolkit';
|
|
48
75
|
} | {
|
|
49
76
|
type: 'nativeTool';
|
|
50
77
|
toolsetId: string;
|
|
@@ -62,20 +89,97 @@ export type ConnectorDefinition = {
|
|
|
62
89
|
source: 'builtin' | 'extension' | 'custom' | 'registry' | 'store';
|
|
63
90
|
capabilities: ConnectorCapability[];
|
|
64
91
|
tags?: string[];
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
92
|
+
branding?: ConnectorBranding;
|
|
93
|
+
verificationLevel?: ConnectorVerificationLevel;
|
|
94
|
+
auth: ConnectorAuthDefinition;
|
|
68
95
|
setup: {
|
|
69
96
|
secrets?: ConnectorSecretField[];
|
|
70
97
|
config?: ConnectorConfigField[];
|
|
71
98
|
};
|
|
72
99
|
runtime: ConnectorRuntimeDefinition;
|
|
73
100
|
permissions?: ConnectorPermissions;
|
|
101
|
+
integrationStrategy?: ConnectorIntegrationStrategy;
|
|
74
102
|
provenance?: {
|
|
75
103
|
packageName: string;
|
|
76
104
|
sha256: string;
|
|
77
105
|
};
|
|
78
106
|
};
|
|
107
|
+
export type ConnectorInstallationPolicy = {
|
|
108
|
+
id: string;
|
|
109
|
+
connectorId: string;
|
|
110
|
+
principalId: string;
|
|
111
|
+
enabled: boolean;
|
|
112
|
+
allowedAgentIds: string[];
|
|
113
|
+
maxScope: ConnectorScope;
|
|
114
|
+
confirmationPolicy: ConnectorConfirmationPolicy;
|
|
115
|
+
selectedConnectionIds: string[];
|
|
116
|
+
createdAt: string;
|
|
117
|
+
updatedAt: string;
|
|
118
|
+
};
|
|
119
|
+
export type ConnectorConnectionStatus = 'pending' | 'active' | 'expired' | 'failed' | 'revoked' | 'disabled' | 'unknown';
|
|
120
|
+
export type ConnectorConnection = {
|
|
121
|
+
id: string;
|
|
122
|
+
installationId?: string;
|
|
123
|
+
connectorId: string;
|
|
124
|
+
provider: string;
|
|
125
|
+
principalId: string;
|
|
126
|
+
providerConnectionId: string;
|
|
127
|
+
alias?: string;
|
|
128
|
+
identity: Record<string, unknown>;
|
|
129
|
+
status: ConnectorConnectionStatus;
|
|
130
|
+
isDefault: boolean;
|
|
131
|
+
connectedAt?: string;
|
|
132
|
+
expiresAt?: string;
|
|
133
|
+
lastError?: string;
|
|
134
|
+
metadata: Record<string, unknown>;
|
|
135
|
+
createdAt: string;
|
|
136
|
+
updatedAt: string;
|
|
137
|
+
};
|
|
138
|
+
export type ConnectorActionMetadata = {
|
|
139
|
+
connectorId: string;
|
|
140
|
+
actionId: string;
|
|
141
|
+
toolkit?: string;
|
|
142
|
+
scope: ConnectorScope;
|
|
143
|
+
curated: boolean;
|
|
144
|
+
inputSchema?: unknown;
|
|
145
|
+
schemaVersion?: string;
|
|
146
|
+
cachedAt: string;
|
|
147
|
+
};
|
|
148
|
+
export type ConnectorExecutionDecision = 'allowed' | 'denied' | 'confirmation_required';
|
|
149
|
+
export type ConnectorExecutionAuditRecord = {
|
|
150
|
+
id: string;
|
|
151
|
+
installationId?: string;
|
|
152
|
+
connectionId?: string;
|
|
153
|
+
connectorId: string;
|
|
154
|
+
principalId: string;
|
|
155
|
+
agentId?: string;
|
|
156
|
+
sessionKey?: string;
|
|
157
|
+
actionId: string;
|
|
158
|
+
scope: ConnectorScope;
|
|
159
|
+
decision: ConnectorExecutionDecision;
|
|
160
|
+
resultStatus: 'success' | 'error' | 'not_executed';
|
|
161
|
+
durationMs?: number;
|
|
162
|
+
errorCode?: string;
|
|
163
|
+
createdAt: string;
|
|
164
|
+
};
|
|
165
|
+
export type ConnectorApprovalStatus = 'pending' | 'approved' | 'denied' | 'expired' | 'consumed';
|
|
166
|
+
export type ConnectorApprovalRecord = {
|
|
167
|
+
id: string;
|
|
168
|
+
principalId: string;
|
|
169
|
+
connectorId: string;
|
|
170
|
+
connectionId?: string;
|
|
171
|
+
agentId?: string;
|
|
172
|
+
sessionKey?: string;
|
|
173
|
+
actionId: string;
|
|
174
|
+
scope: ConnectorScope;
|
|
175
|
+
argumentsHash: string;
|
|
176
|
+
argumentsPreview: Record<string, unknown>;
|
|
177
|
+
status: ConnectorApprovalStatus;
|
|
178
|
+
expiresAt: string;
|
|
179
|
+
createdAt: string;
|
|
180
|
+
decidedAt?: string;
|
|
181
|
+
consumedAt?: string;
|
|
182
|
+
};
|
|
79
183
|
export type ConnectorInstallInput = {
|
|
80
184
|
secrets?: Record<string, unknown>;
|
|
81
185
|
config?: Record<string, unknown>;
|
|
@@ -112,7 +216,12 @@ export type ConnectorInstance = {
|
|
|
112
216
|
type: 'mcp';
|
|
113
217
|
serverId: string;
|
|
114
218
|
} | {
|
|
115
|
-
type: '
|
|
219
|
+
type: 'composio';
|
|
220
|
+
id: string;
|
|
221
|
+
toolkit: string;
|
|
222
|
+
role: 'credential' | 'toolkit';
|
|
223
|
+
} | {
|
|
224
|
+
type: 'channel' | 'nativeTool' | 'memorySource';
|
|
116
225
|
id: string;
|
|
117
226
|
};
|
|
118
227
|
usage: ConnectorUsageRecord;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Config } from '../config/schema.js';
|
|
2
|
+
import type { WorkflowDefinition } from '../workflows/domain/definition.js';
|
|
3
|
+
export type ConnectorPreflightIssueCode = 'not_installed' | 'disabled' | 'agent_not_allowed' | 'scope_too_narrow' | 'connection_missing' | 'reauthorization_required';
|
|
4
|
+
export type ConnectorPreflightIssue = {
|
|
5
|
+
connectorId: string;
|
|
6
|
+
code: ConnectorPreflightIssueCode;
|
|
7
|
+
message: string;
|
|
8
|
+
recoveryPath: string;
|
|
9
|
+
};
|
|
10
|
+
export type ConnectorPreflightResult = {
|
|
11
|
+
ok: boolean;
|
|
12
|
+
issues: ConnectorPreflightIssue[];
|
|
13
|
+
optionalIssues: ConnectorPreflightIssue[];
|
|
14
|
+
};
|
|
15
|
+
export declare function preflightWorkflowConnectors(input: {
|
|
16
|
+
definition: WorkflowDefinition;
|
|
17
|
+
config: Config;
|
|
18
|
+
agentId: string;
|
|
19
|
+
principalId?: string;
|
|
20
|
+
}): ConnectorPreflightResult;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { getConnectorInstallation, listConnectorConnections } from "../storage/sqlite/connector-repository.js";
|
|
2
|
+
import { getComposioToolkitScope } from "./composio.js";
|
|
3
|
+
import { getConnectorDefinition } from "./catalog.js";
|
|
4
|
+
import { listConnectorInstances } from "./instances.js";
|
|
5
|
+
//#region src/connectors/workflow-preflight.ts
|
|
6
|
+
const SCOPE_ORDER = {
|
|
7
|
+
read: 1,
|
|
8
|
+
write: 2,
|
|
9
|
+
admin: 3
|
|
10
|
+
};
|
|
11
|
+
function issue(requirement, code, message) {
|
|
12
|
+
return {
|
|
13
|
+
connectorId: requirement.connectorId,
|
|
14
|
+
code,
|
|
15
|
+
message,
|
|
16
|
+
recoveryPath: `/connectors?connector=${encodeURIComponent(requirement.connectorId)}`
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function preflightWorkflowConnectors(input) {
|
|
20
|
+
const principalId = input.principalId ?? "local-owner";
|
|
21
|
+
const instances = listConnectorInstances(input.config);
|
|
22
|
+
const issues = [];
|
|
23
|
+
const optionalIssues = [];
|
|
24
|
+
const add = (requirement, value) => {
|
|
25
|
+
(requirement.optional ? optionalIssues : issues).push(value);
|
|
26
|
+
};
|
|
27
|
+
for (const requirement of input.definition.connectors ?? []) {
|
|
28
|
+
const instance = instances.find((candidate) => candidate.connectorId === requirement.connectorId);
|
|
29
|
+
if (!instance) {
|
|
30
|
+
add(requirement, issue(requirement, "not_installed", `${requirement.connectorId} is not installed.`));
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
if (!instance.enabled) {
|
|
34
|
+
add(requirement, issue(requirement, "disabled", `${requirement.connectorId} is disabled.`));
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
const definition = getConnectorDefinition(requirement.connectorId);
|
|
38
|
+
if (definition?.runtime.type !== "composio" || definition.runtime.role !== "toolkit") continue;
|
|
39
|
+
const toolkit = definition.runtime.toolkit;
|
|
40
|
+
const installation = getConnectorInstallation(`${requirement.connectorId}-${principalId}`);
|
|
41
|
+
if (installation?.allowedAgentIds.length && !installation.allowedAgentIds.includes(input.agentId)) {
|
|
42
|
+
add(requirement, issue(requirement, "agent_not_allowed", `${input.agentId} is not allowed to use ${requirement.connectorId}.`));
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const allowedScope = installation?.maxScope ?? getComposioToolkitScope(input.config, toolkit);
|
|
46
|
+
const requiredScope = requirement.scope ?? "read";
|
|
47
|
+
if (SCOPE_ORDER[allowedScope] < SCOPE_ORDER[requiredScope]) {
|
|
48
|
+
add(requirement, issue(requirement, "scope_too_narrow", `${requirement.connectorId} requires ${requiredScope} scope but allows ${allowedScope}.`));
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (requirement.connectionRequired === false) continue;
|
|
52
|
+
const connections = listConnectorConnections({
|
|
53
|
+
principalId,
|
|
54
|
+
connectorId: requirement.connectorId
|
|
55
|
+
});
|
|
56
|
+
const selected = installation?.selectedConnectionIds.length ? connections.filter((connection) => installation.selectedConnectionIds.includes(connection.id)) : connections;
|
|
57
|
+
if (selected.some((connection) => connection.status === "active")) continue;
|
|
58
|
+
const needsAuthorization = selected.some((connection) => connection.status === "expired" || connection.status === "failed");
|
|
59
|
+
add(requirement, issue(requirement, needsAuthorization ? "reauthorization_required" : "connection_missing", needsAuthorization ? `${requirement.connectorId} needs to be reconnected.` : `${requirement.connectorId} has no active account connection.`));
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
ok: issues.length === 0,
|
|
63
|
+
issues,
|
|
64
|
+
optionalIssues
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//#endregion
|
|
68
|
+
export { preflightWorkflowConnectors };
|
|
69
|
+
|
|
70
|
+
//# sourceMappingURL=workflow-preflight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-preflight.js","names":[],"sources":["../../../src/connectors/workflow-preflight.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\nimport { listConnectorConnections, getConnectorInstallation } from '../storage/sqlite/connector-repository.js';\nimport type { WorkflowConnectorRequirement, WorkflowDefinition } from '../workflows/domain/definition.js';\nimport { getComposioToolkitScope } from './composio.js';\nimport { getConnectorDefinition } from './catalog.js';\nimport { listConnectorInstances } from './instances.js';\nimport type { ConnectorScope } from './types.js';\n\nexport type ConnectorPreflightIssueCode =\n | 'not_installed'\n | 'disabled'\n | 'agent_not_allowed'\n | 'scope_too_narrow'\n | 'connection_missing'\n | 'reauthorization_required';\n\nexport type ConnectorPreflightIssue = {\n connectorId: string;\n code: ConnectorPreflightIssueCode;\n message: string;\n recoveryPath: string;\n};\n\nexport type ConnectorPreflightResult = {\n ok: boolean;\n issues: ConnectorPreflightIssue[];\n optionalIssues: ConnectorPreflightIssue[];\n};\n\nconst SCOPE_ORDER: Record<ConnectorScope, number> = { read: 1, write: 2, admin: 3 };\n\nfunction issue(requirement: WorkflowConnectorRequirement, code: ConnectorPreflightIssueCode, message: string): ConnectorPreflightIssue {\n return {\n connectorId: requirement.connectorId,\n code,\n message,\n recoveryPath: `/connectors?connector=${encodeURIComponent(requirement.connectorId)}`,\n };\n}\n\nexport function preflightWorkflowConnectors(input: {\n definition: WorkflowDefinition;\n config: Config;\n agentId: string;\n principalId?: string;\n}): ConnectorPreflightResult {\n const principalId = input.principalId ?? 'local-owner';\n const instances = listConnectorInstances(input.config);\n const issues: ConnectorPreflightIssue[] = [];\n const optionalIssues: ConnectorPreflightIssue[] = [];\n const add = (requirement: WorkflowConnectorRequirement, value: ConnectorPreflightIssue): void => {\n (requirement.optional ? optionalIssues : issues).push(value);\n };\n\n for (const requirement of input.definition.connectors ?? []) {\n const instance = instances.find((candidate) => candidate.connectorId === requirement.connectorId);\n if (!instance) {\n add(requirement, issue(requirement, 'not_installed', `${requirement.connectorId} is not installed.`));\n continue;\n }\n if (!instance.enabled) {\n add(requirement, issue(requirement, 'disabled', `${requirement.connectorId} is disabled.`));\n continue;\n }\n const definition = getConnectorDefinition(requirement.connectorId);\n if (definition?.runtime.type !== 'composio' || definition.runtime.role !== 'toolkit') continue;\n\n const toolkit = definition.runtime.toolkit;\n const installation = getConnectorInstallation(`${requirement.connectorId}-${principalId}`);\n if (installation?.allowedAgentIds.length && !installation.allowedAgentIds.includes(input.agentId)) {\n add(requirement, issue(requirement, 'agent_not_allowed', `${input.agentId} is not allowed to use ${requirement.connectorId}.`));\n continue;\n }\n const allowedScope = installation?.maxScope ?? getComposioToolkitScope(input.config, toolkit);\n const requiredScope = requirement.scope ?? 'read';\n if (SCOPE_ORDER[allowedScope] < SCOPE_ORDER[requiredScope]) {\n add(requirement, issue(requirement, 'scope_too_narrow', `${requirement.connectorId} requires ${requiredScope} scope but allows ${allowedScope}.`));\n continue;\n }\n if (requirement.connectionRequired === false) continue;\n const connections = listConnectorConnections({ principalId, connectorId: requirement.connectorId });\n const selected = installation?.selectedConnectionIds.length\n ? connections.filter((connection) => installation.selectedConnectionIds.includes(connection.id))\n : connections;\n if (selected.some((connection) => connection.status === 'active')) continue;\n const needsAuthorization = selected.some((connection) => connection.status === 'expired' || connection.status === 'failed');\n add(requirement, issue(\n requirement,\n needsAuthorization ? 'reauthorization_required' : 'connection_missing',\n needsAuthorization\n ? `${requirement.connectorId} needs to be reconnected.`\n : `${requirement.connectorId} has no active account connection.`,\n ));\n }\n return { ok: issues.length === 0, issues, optionalIssues };\n}\n"],"mappings":";;;;;AA6BA,MAAM,cAA8C;CAAE,MAAM;CAAG,OAAO;CAAG,OAAO;CAAG;AAEnF,SAAS,MAAM,aAA2C,MAAmC,SAA0C;AACrI,QAAO;EACL,aAAa,YAAY;EACzB;EACA;EACA,cAAc,yBAAyB,mBAAmB,YAAY,YAAY;EACnF;;AAGH,SAAgB,4BAA4B,OAKf;CAC3B,MAAM,cAAc,MAAM,eAAe;CACzC,MAAM,YAAY,uBAAuB,MAAM,OAAO;CACtD,MAAM,SAAoC,EAAE;CAC5C,MAAM,iBAA4C,EAAE;CACpD,MAAM,OAAO,aAA2C,UAAyC;AAC/F,GAAC,YAAY,WAAW,iBAAiB,QAAQ,KAAK,MAAM;;AAG9D,MAAK,MAAM,eAAe,MAAM,WAAW,cAAc,EAAE,EAAE;EAC3D,MAAM,WAAW,UAAU,MAAM,cAAc,UAAU,gBAAgB,YAAY,YAAY;AACjG,MAAI,CAAC,UAAU;AACb,OAAI,aAAa,MAAM,aAAa,iBAAiB,GAAG,YAAY,YAAY,oBAAoB,CAAC;AACrG;;AAEF,MAAI,CAAC,SAAS,SAAS;AACrB,OAAI,aAAa,MAAM,aAAa,YAAY,GAAG,YAAY,YAAY,eAAe,CAAC;AAC3F;;EAEF,MAAM,aAAa,uBAAuB,YAAY,YAAY;AAClE,MAAI,YAAY,QAAQ,SAAS,cAAc,WAAW,QAAQ,SAAS,UAAW;EAEtF,MAAM,UAAU,WAAW,QAAQ;EACnC,MAAM,eAAe,yBAAyB,GAAG,YAAY,YAAY,GAAG,cAAc;AAC1F,MAAI,cAAc,gBAAgB,UAAU,CAAC,aAAa,gBAAgB,SAAS,MAAM,QAAQ,EAAE;AACjG,OAAI,aAAa,MAAM,aAAa,qBAAqB,GAAG,MAAM,QAAQ,yBAAyB,YAAY,YAAY,GAAG,CAAC;AAC/H;;EAEF,MAAM,eAAe,cAAc,YAAY,wBAAwB,MAAM,QAAQ,QAAQ;EAC7F,MAAM,gBAAgB,YAAY,SAAS;AAC3C,MAAI,YAAY,gBAAgB,YAAY,gBAAgB;AAC1D,OAAI,aAAa,MAAM,aAAa,oBAAoB,GAAG,YAAY,YAAY,YAAY,cAAc,oBAAoB,aAAa,GAAG,CAAC;AAClJ;;AAEF,MAAI,YAAY,uBAAuB,MAAO;EAC9C,MAAM,cAAc,yBAAyB;GAAE;GAAa,aAAa,YAAY;GAAa,CAAC;EACnG,MAAM,WAAW,cAAc,sBAAsB,SACjD,YAAY,QAAQ,eAAe,aAAa,sBAAsB,SAAS,WAAW,GAAG,CAAC,GAC9F;AACJ,MAAI,SAAS,MAAM,eAAe,WAAW,WAAW,SAAS,CAAE;EACnE,MAAM,qBAAqB,SAAS,MAAM,eAAe,WAAW,WAAW,aAAa,WAAW,WAAW,SAAS;AAC3H,MAAI,aAAa,MACf,aACA,qBAAqB,6BAA6B,sBAClD,qBACI,GAAG,YAAY,YAAY,6BAC3B,GAAG,YAAY,YAAY,oCAChC,CAAC;;AAEJ,QAAO;EAAE,IAAI,OAAO,WAAW;EAAG;EAAQ;EAAgB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface StagedExtensionInstall {
|
|
2
|
+
extensionId: string;
|
|
3
|
+
stagingRoot: string;
|
|
4
|
+
stagedExtensionDir: string;
|
|
5
|
+
targetDir: string;
|
|
6
|
+
backupDir?: string;
|
|
7
|
+
committed: boolean;
|
|
8
|
+
}
|
|
9
|
+
/** Extract, validate, install dependencies, and import-check an extension away from its live path. */
|
|
10
|
+
export declare function stageExtensionStoreZip(buffer: Buffer, extensionsDir: string): Promise<StagedExtensionInstall>;
|
|
11
|
+
/** Move a staged extension into its live path, preserving the previous version for rollback. */
|
|
12
|
+
export declare function commitStagedExtensionInstall(state: StagedExtensionInstall, overwrite: boolean): void;
|
|
13
|
+
/** Restore the previous live extension, or remove a newly committed install. */
|
|
14
|
+
export declare function rollbackStagedExtensionInstall(state: StagedExtensionInstall): void;
|
|
15
|
+
/** Delete the preserved previous version after every durable metadata write succeeds. */
|
|
16
|
+
export declare function finalizeStagedExtensionInstall(state: StagedExtensionInstall): void;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { installExtensionFromStoreZip } from "./install.js";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { existsSync, mkdirSync, mkdtempSync, readFileSync, renameSync, rmSync } from "node:fs";
|
|
4
|
+
import { pathToFileURL } from "node:url";
|
|
5
|
+
//#region src/extensions/install-transaction.ts
|
|
6
|
+
/** Extract, validate, install dependencies, and import-check an extension away from its live path. */
|
|
7
|
+
async function stageExtensionStoreZip(buffer, extensionsDir) {
|
|
8
|
+
mkdirSync(extensionsDir, { recursive: true });
|
|
9
|
+
const stagingRoot = mkdtempSync(join(extensionsDir, ".xopc-install-"));
|
|
10
|
+
try {
|
|
11
|
+
const result = await installExtensionFromStoreZip(buffer, stagingRoot);
|
|
12
|
+
if (!result.ok || !result.extensionId || !result.targetDir) throw new Error(result.error ?? "Extension staging failed");
|
|
13
|
+
const manifestPath = join(result.targetDir, "xopc.extension.json");
|
|
14
|
+
const manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
|
|
15
|
+
if (!manifest.main) throw new Error("Extension manifest must declare main");
|
|
16
|
+
const mainUrl = pathToFileURL(join(result.targetDir, manifest.main));
|
|
17
|
+
mainUrl.searchParams.set("xopcInstallCheck", `${Date.now()}-${Math.random()}`);
|
|
18
|
+
await import(mainUrl.href);
|
|
19
|
+
return {
|
|
20
|
+
extensionId: result.extensionId,
|
|
21
|
+
stagingRoot,
|
|
22
|
+
stagedExtensionDir: result.targetDir,
|
|
23
|
+
targetDir: join(extensionsDir, result.extensionId),
|
|
24
|
+
committed: false
|
|
25
|
+
};
|
|
26
|
+
} catch (err) {
|
|
27
|
+
rmSync(stagingRoot, {
|
|
28
|
+
recursive: true,
|
|
29
|
+
force: true
|
|
30
|
+
});
|
|
31
|
+
throw err;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Move a staged extension into its live path, preserving the previous version for rollback. */
|
|
35
|
+
function commitStagedExtensionInstall(state, overwrite) {
|
|
36
|
+
if (existsSync(state.targetDir)) {
|
|
37
|
+
if (!overwrite) throw new Error(`Extension already exists at ${state.targetDir}. Use overwrite to replace it.`);
|
|
38
|
+
state.backupDir = join(state.stagingRoot, "previous");
|
|
39
|
+
renameSync(state.targetDir, state.backupDir);
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
renameSync(state.stagedExtensionDir, state.targetDir);
|
|
43
|
+
state.committed = true;
|
|
44
|
+
} catch (err) {
|
|
45
|
+
if (state.backupDir && existsSync(state.backupDir) && !existsSync(state.targetDir)) {
|
|
46
|
+
renameSync(state.backupDir, state.targetDir);
|
|
47
|
+
state.backupDir = void 0;
|
|
48
|
+
}
|
|
49
|
+
throw err;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** Restore the previous live extension, or remove a newly committed install. */
|
|
53
|
+
function rollbackStagedExtensionInstall(state) {
|
|
54
|
+
if (state.committed && existsSync(state.targetDir)) rmSync(state.targetDir, {
|
|
55
|
+
recursive: true,
|
|
56
|
+
force: true
|
|
57
|
+
});
|
|
58
|
+
if (state.backupDir && existsSync(state.backupDir)) renameSync(state.backupDir, state.targetDir);
|
|
59
|
+
state.committed = false;
|
|
60
|
+
rmSync(state.stagingRoot, {
|
|
61
|
+
recursive: true,
|
|
62
|
+
force: true
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/** Delete the preserved previous version after every durable metadata write succeeds. */
|
|
66
|
+
function finalizeStagedExtensionInstall(state) {
|
|
67
|
+
rmSync(state.stagingRoot, {
|
|
68
|
+
recursive: true,
|
|
69
|
+
force: true
|
|
70
|
+
});
|
|
71
|
+
state.backupDir = void 0;
|
|
72
|
+
}
|
|
73
|
+
//#endregion
|
|
74
|
+
export { commitStagedExtensionInstall, finalizeStagedExtensionInstall, rollbackStagedExtensionInstall, stageExtensionStoreZip };
|
|
75
|
+
|
|
76
|
+
//# sourceMappingURL=install-transaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-transaction.js","names":[],"sources":["../../../src/extensions/install-transaction.ts"],"sourcesContent":["import {\n existsSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n renameSync,\n rmSync,\n} from 'node:fs';\nimport { join } from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport { installExtensionFromStoreZip } from './install.js';\n\ninterface ExtensionManifestEntry {\n id?: string;\n main?: string;\n}\n\nexport interface StagedExtensionInstall {\n extensionId: string;\n stagingRoot: string;\n stagedExtensionDir: string;\n targetDir: string;\n backupDir?: string;\n committed: boolean;\n}\n\n/** Extract, validate, install dependencies, and import-check an extension away from its live path. */\nexport async function stageExtensionStoreZip(\n buffer: Buffer,\n extensionsDir: string,\n): Promise<StagedExtensionInstall> {\n mkdirSync(extensionsDir, { recursive: true });\n const stagingRoot = mkdtempSync(join(extensionsDir, '.xopc-install-'));\n\n try {\n const result = await installExtensionFromStoreZip(buffer, stagingRoot);\n if (!result.ok || !result.extensionId || !result.targetDir) {\n throw new Error(result.error ?? 'Extension staging failed');\n }\n\n const manifestPath = join(result.targetDir, 'xopc.extension.json');\n const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as ExtensionManifestEntry;\n if (!manifest.main) {\n throw new Error('Extension manifest must declare main');\n }\n\n const mainUrl = pathToFileURL(join(result.targetDir, manifest.main));\n mainUrl.searchParams.set('xopcInstallCheck', `${Date.now()}-${Math.random()}`);\n await import(mainUrl.href);\n\n return {\n extensionId: result.extensionId,\n stagingRoot,\n stagedExtensionDir: result.targetDir,\n targetDir: join(extensionsDir, result.extensionId),\n committed: false,\n };\n } catch (err) {\n rmSync(stagingRoot, { recursive: true, force: true });\n throw err;\n }\n}\n\n/** Move a staged extension into its live path, preserving the previous version for rollback. */\nexport function commitStagedExtensionInstall(\n state: StagedExtensionInstall,\n overwrite: boolean,\n): void {\n if (existsSync(state.targetDir)) {\n if (!overwrite) {\n throw new Error(`Extension already exists at ${state.targetDir}. Use overwrite to replace it.`);\n }\n state.backupDir = join(state.stagingRoot, 'previous');\n renameSync(state.targetDir, state.backupDir);\n }\n\n try {\n renameSync(state.stagedExtensionDir, state.targetDir);\n state.committed = true;\n } catch (err) {\n if (state.backupDir && existsSync(state.backupDir) && !existsSync(state.targetDir)) {\n renameSync(state.backupDir, state.targetDir);\n state.backupDir = undefined;\n }\n throw err;\n }\n}\n\n/** Restore the previous live extension, or remove a newly committed install. */\nexport function rollbackStagedExtensionInstall(state: StagedExtensionInstall): void {\n if (state.committed && existsSync(state.targetDir)) {\n rmSync(state.targetDir, { recursive: true, force: true });\n }\n if (state.backupDir && existsSync(state.backupDir)) {\n renameSync(state.backupDir, state.targetDir);\n }\n state.committed = false;\n rmSync(state.stagingRoot, { recursive: true, force: true });\n}\n\n/** Delete the preserved previous version after every durable metadata write succeeds. */\nexport function finalizeStagedExtensionInstall(state: StagedExtensionInstall): void {\n rmSync(state.stagingRoot, { recursive: true, force: true });\n state.backupDir = undefined;\n}\n"],"mappings":";;;;;;AA4BA,eAAsB,uBACpB,QACA,eACiC;AACjC,WAAU,eAAe,EAAE,WAAW,MAAM,CAAC;CAC7C,MAAM,cAAc,YAAY,KAAK,eAAe,iBAAiB,CAAC;AAEtE,KAAI;EACF,MAAM,SAAS,MAAM,6BAA6B,QAAQ,YAAY;AACtE,MAAI,CAAC,OAAO,MAAM,CAAC,OAAO,eAAe,CAAC,OAAO,UAC/C,OAAM,IAAI,MAAM,OAAO,SAAS,2BAA2B;EAG7D,MAAM,eAAe,KAAK,OAAO,WAAW,sBAAsB;EAClE,MAAM,WAAW,KAAK,MAAM,aAAa,cAAc,OAAO,CAAC;AAC/D,MAAI,CAAC,SAAS,KACZ,OAAM,IAAI,MAAM,uCAAuC;EAGzD,MAAM,UAAU,cAAc,KAAK,OAAO,WAAW,SAAS,KAAK,CAAC;AACpE,UAAQ,aAAa,IAAI,oBAAoB,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,GAAG;AAC9E,QAAM,OAAO,QAAQ;AAErB,SAAO;GACL,aAAa,OAAO;GACpB;GACA,oBAAoB,OAAO;GAC3B,WAAW,KAAK,eAAe,OAAO,YAAY;GAClD,WAAW;GACZ;UACM,KAAK;AACZ,SAAO,aAAa;GAAE,WAAW;GAAM,OAAO;GAAM,CAAC;AACrD,QAAM;;;;AAKV,SAAgB,6BACd,OACA,WACM;AACN,KAAI,WAAW,MAAM,UAAU,EAAE;AAC/B,MAAI,CAAC,UACH,OAAM,IAAI,MAAM,+BAA+B,MAAM,UAAU,gCAAgC;AAEjG,QAAM,YAAY,KAAK,MAAM,aAAa,WAAW;AACrD,aAAW,MAAM,WAAW,MAAM,UAAU;;AAG9C,KAAI;AACF,aAAW,MAAM,oBAAoB,MAAM,UAAU;AACrD,QAAM,YAAY;UACX,KAAK;AACZ,MAAI,MAAM,aAAa,WAAW,MAAM,UAAU,IAAI,CAAC,WAAW,MAAM,UAAU,EAAE;AAClF,cAAW,MAAM,WAAW,MAAM,UAAU;AAC5C,SAAM,YAAY,KAAA;;AAEpB,QAAM;;;;AAKV,SAAgB,+BAA+B,OAAqC;AAClF,KAAI,MAAM,aAAa,WAAW,MAAM,UAAU,CAChD,QAAO,MAAM,WAAW;EAAE,WAAW;EAAM,OAAO;EAAM,CAAC;AAE3D,KAAI,MAAM,aAAa,WAAW,MAAM,UAAU,CAChD,YAAW,MAAM,WAAW,MAAM,UAAU;AAE9C,OAAM,YAAY;AAClB,QAAO,MAAM,aAAa;EAAE,WAAW;EAAM,OAAO;EAAM,CAAC;;;AAI7D,SAAgB,+BAA+B,OAAqC;AAClF,QAAO,MAAM,aAAa;EAAE,WAAW;EAAM,OAAO;EAAM,CAAC;AAC3D,OAAM,YAAY,KAAA"}
|