@xopcai/xopc 0.0.142 → 0.0.144
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/feishu/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
- package/dist/extensions/telegram/src/inbound-processor.js +1 -1
- package/dist/extensions/telegram/src/plugin.js +1 -1
- package/dist/extensions/telegram/src/routing-integration.js +2 -2
- package/dist/extensions/telegram/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/api/api.js +1 -1
- package/dist/extensions/weixin/src/plugin.js +1 -1
- package/dist/extensions/weixin/src/workflow-progress.js +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-EAVnrCAs.js} +1 -1
- package/dist/gateway/static/root/assets/agents-5rTuJOtT.js +2 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-81xd1p9R.js → app-management-settings-panel-Bu568NpC.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-DYeQsYU8.js → appearance-settings-DSkm9bp_.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-DWetalKp.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-D_oa7oti.js → archive-plugin-C99N0vV6.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-Cd-bwI2N.js → attachment-load-CHTDqME5.js} +1 -1
- package/dist/gateway/static/root/assets/automation-suggestion-card-CBt6U3-S.js +1 -0
- package/dist/gateway/static/root/assets/automations-page-ICUfxeOz.js +4 -0
- package/dist/gateway/static/root/assets/{binary-plugins-O8svLKWw.js → binary-plugins-BRtxOLlM.js} +1 -1
- package/dist/gateway/static/root/assets/block-editor-CUlXfgXd.js +184 -0
- package/dist/gateway/static/root/assets/browser-settings-page-D7Bj4MKi.js +8 -0
- package/dist/gateway/static/root/assets/{capability-presets-api-dJy1Eqgx.js → capability-presets-api-Bg1ntFSD.js} +1 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-C-8I-Ktn.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-Dm5EqQyK.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-BOzjh-OK.js +2 -0
- package/dist/gateway/static/root/assets/{desktop-pet-DFMfIb5F.js → desktop-pet-C-Drhqyk.js} +1 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-CRGiolqF.js +1 -0
- package/dist/gateway/static/root/assets/{directory-picker-path-field-BrYt1gAr.js → directory-picker-path-field-Dw1L3M84.js} +1 -1
- package/dist/gateway/static/root/assets/dist-SwiI0Xu3.js +1 -0
- package/dist/gateway/static/root/assets/dreaming-settings-CF21cbjo.js +3 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-Bh630pLD.js → extension-debug-page-Dcl8LJG_.js} +1 -1
- package/dist/gateway/static/root/assets/extension-page-i_BXmO_x.js +1 -0
- package/dist/gateway/static/root/assets/extension-settings-page-CWIi7xsn.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-2sLP2kkA.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-DMHiZc-2.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-CAODVDiA.js +1 -0
- package/dist/gateway/static/root/assets/goal-detail-page-_d4DjmeX.js +4 -0
- package/dist/gateway/static/root/assets/{goals-config-api-DUy3eEse.js → goals-config-api-B4qeLKQS.js} +1 -1
- package/dist/gateway/static/root/assets/goals-page-lgsop664.js +2 -0
- package/dist/gateway/static/root/assets/goals-settings-Dx_1ZNgb.js +1 -0
- package/dist/gateway/static/root/assets/heartbeat-settings-DeTseEk_.js +1 -0
- package/dist/gateway/static/root/assets/index-CphxClbs.css +1 -0
- package/dist/gateway/static/root/assets/index-VWvztcst.js +257 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CVIwwM15.js → keyboard-shortcuts-settings-BpwpMmlk.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-9_hbTg3j.js +7 -0
- package/dist/gateway/static/root/assets/{markdown-split-B_6us9j7.js → markdown-split-BTRFTK0w.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-D_fryIyj.js → media-plugins-BABfIZPU.js} +1 -1
- package/dist/gateway/static/root/assets/messages-CzKxM6I4.js +5 -0
- package/dist/gateway/static/root/assets/models-hub-panel-B1CUvZxh.js +2 -0
- package/dist/gateway/static/root/assets/notes-page-88QBHW9a.js +1 -0
- package/dist/gateway/static/root/assets/notes-workbench-CerZOeLW.js +2 -0
- package/dist/gateway/static/root/assets/{page-tabs-D_8jGlqx.js → page-tabs-je95DZOf.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-BBLMK8Mp.js → preview-open-alternatives-BJbwi7Rc.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-BmrApldl.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-tTn-k76N.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-DeA2-pOi.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-DVS3FR5r.js → save-bar-controls-qWMQ9mod.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-D6vKd6-T.js → schedule-field-kxd270Gs.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-BPy4lbIh.js → schema-form-DLnD-MuD.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-D4kvvcL1.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-CI1OG4gq.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-WzdikxPt.js → settings-collapsible-section-DQprvu5J.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-CvfzhBV-.js → settings-form-section-Cqq7Y98y.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-BxR-Ulhi.js → settings-loading-skeleton-b6rXULL5.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-BtBVz3cX.js +1 -0
- package/dist/gateway/static/root/assets/{settings-page-layout-CKefvbYi.js → settings-page-layout-BNJbtklV.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-cmclUJzS.js +1 -0
- package/dist/gateway/static/root/assets/share-preview-page--zO-A1W1.js +2 -0
- package/dist/gateway/static/root/assets/shares-settings-DNJvqA67.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-DWr_0Xgn.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-DEGsTbJx.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-BokgAgf7.js → system-settings-panel-Cq9J7i7v.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-BwHlNL3L.js → typed-models-lib-CdSwi1gT.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-C-V73ZaJ.js +1 -0
- package/dist/gateway/static/root/assets/user-profile-fields-editor-B1cxoGkh.js +1 -0
- package/dist/gateway/static/root/assets/user-profile-settings-panel-B8hlamVB.js +1 -0
- package/dist/gateway/static/root/assets/{utils-BKUWB-TT.js → utils-Dx01V8qF.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DGpIUelZ.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-fzWTxF26.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CL_rnAUB.js → workflow-run-setup-panel-Dt_x8LGg.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-Bg02zEUh.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 +10 -7
- package/dist/package.js +1 -1
- package/dist/src/activity/emitter.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +2 -0
- package/dist/src/agent/agent-manager.js +12 -4
- 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/code-intelligence/binary.js +1 -1
- package/dist/src/agent/context/project-context.js +2 -2
- package/dist/src/agent/context/workspace-seed.js +2 -2
- package/dist/src/agent/embedded/run-for-session.js +1 -1
- package/dist/src/agent/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 +7 -6
- package/dist/src/agent/goals/post-turn.js.map +1 -1
- package/dist/src/agent/ipc/bus.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
- package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
- package/dist/src/agent/mcp/mcp-transport.js +5 -2
- 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/plugin-discovery.js +1 -1
- 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/models/manager.js +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js +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 +12 -6
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/session/session-inspector.js +2 -2
- package/dist/src/agent/skills/hub-pull.js +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/goal-tool.js +2 -2
- 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 +4 -17
- package/dist/src/agent/tools/workflow-tool.js.map +1 -1
- package/dist/src/agent/tools/xopc-use-tool.js +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/workspace-runtime/registry.js +2 -2
- 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 +14 -2
- 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/automations/service/action-executor.js +2 -2
- package/dist/src/browser/cdp-local-launcher.js +1 -1
- package/dist/src/browser/providers/browser-ext-install.d.ts +11 -1
- package/dist/src/browser/providers/browser-ext-install.js +42 -17
- package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
- package/dist/src/browser/providers/cloakbrowser.js +2 -2
- package/dist/src/browser/providers/playwright-doctor.js +1 -1
- package/dist/src/browser/stealth.js +1 -1
- package/dist/src/capabilities/store-connector.d.ts +0 -1
- package/dist/src/capabilities/store-connector.js +4 -6
- package/dist/src/capabilities/store-connector.js.map +1 -1
- package/dist/src/chat-commands/agent-edit.js +1 -1
- package/dist/src/chat-commands/builtins/config.js +1 -1
- package/dist/src/chat-commands/builtins/goal.js +2 -2
- package/dist/src/chat-commands/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/chat-commands/context.js +1 -1
- package/dist/src/cli/commands/agent.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +2 -2
- package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
- package/dist/src/cli/commands/extension-create.js +2 -2
- package/dist/src/cli/commands/extension-create.js.map +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +43 -37
- 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 +4 -3
- package/dist/src/cli/commands/extension-pack.js.map +1 -1
- package/dist/src/cli/commands/goal.js +2 -2
- package/dist/src/cli/commands/init.js +1 -1
- package/dist/src/cli/commands/project.js +3 -3
- 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/gateway-bind.js +1 -1
- package/dist/src/config/index.js +1 -1
- package/dist/src/config/loader.js +1 -1
- package/dist/src/config/models-json.js +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/daemon/launchd.js +1 -1
- package/dist/src/daemon/systemd.js +1 -1
- package/dist/src/extensions/discover-extensions.js +1 -1
- package/dist/src/extensions/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/extensions/loader.js +2 -2
- 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/lib/static-ui.js +1 -1
- 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 +17 -4
- package/dist/src/gateway/hono/routes/memory.js.map +1 -1
- package/dist/src/gateway/hono/routes/projects.js +106 -5
- 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/lock.js +1 -1
- package/dist/src/gateway/ports.js +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 +13 -7
- 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/goal-workflow-judge.js +1 -1
- package/dist/src/goals/types.d.ts +24 -0
- package/dist/src/infra/ports.js +1 -1
- package/dist/src/infra/ssh-tunnel.js +1 -1
- package/dist/src/infra/update-check.js +1 -1
- package/dist/src/migrations/runner.js +1 -1
- package/dist/src/notes/service.js +3 -3
- package/dist/src/notes/store.js +1 -1
- package/dist/src/projects/project-service.js +1 -1
- package/dist/src/projects/workspace.js +1 -1
- package/dist/src/routing/agent-session-key.js +1 -1
- package/dist/src/routing/resolve-route.js +1 -1
- package/dist/src/routing/resolve-tui-session-key.js +1 -1
- package/dist/src/session/init-session-turn.js +1 -1
- package/dist/src/session/resolve-session.js +1 -1
- package/dist/src/session/session-title.js +2 -2
- package/dist/src/session/store.js +1 -1
- package/dist/src/storage/sqlite/connection.js +1 -1
- 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/row-mappers.js +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/backends/embedded-backend.js +4 -4
- package/dist/src/tui/clipboard-image.js +1 -1
- 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 +9 -9
- package/dist/src/tui/tui-command-formatters.js.map +1 -1
- package/dist/src/tui/tui-commands.js +4 -4
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/tui/tui.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/utils/index.js +1 -1
- package/dist/src/utils/logger/index.js +1 -1
- package/dist/src/utils/logger.js +1 -1
- package/dist/src/work-items/work-item-service.js +1 -1
- 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 +5 -9
- 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/dist/src/workflows/service/workflow-session-bridge.js +3 -3
- package/package.json +5 -4
- 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/dist-Mys7eFJ5.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,51 @@
|
|
|
1
|
+
//#region src/connectors/composio-logo.ts
|
|
2
|
+
const COMPOSIO_LOGO_SLUG = /^[a-z0-9_]{1,80}$/;
|
|
3
|
+
const COMPOSIO_LOGO_MAX_BYTES = 512 * 1024;
|
|
4
|
+
const COMPOSIO_LOGO_CONTENT_TYPES = new Set([
|
|
5
|
+
"image/png",
|
|
6
|
+
"image/jpeg",
|
|
7
|
+
"image/webp",
|
|
8
|
+
"image/gif",
|
|
9
|
+
"image/svg+xml"
|
|
10
|
+
]);
|
|
11
|
+
async function composioLogoResponse(toolkit) {
|
|
12
|
+
const slug = toolkit.trim().toLowerCase();
|
|
13
|
+
if (!COMPOSIO_LOGO_SLUG.test(slug)) return Response.json({
|
|
14
|
+
ok: false,
|
|
15
|
+
error: "Invalid toolkit slug."
|
|
16
|
+
}, { status: 400 });
|
|
17
|
+
const upstream = await fetch(`https://logos.composio.dev/api/${encodeURIComponent(slug)}`, {
|
|
18
|
+
headers: { Accept: "image/png,image/webp,image/svg+xml,image/*;q=0.8" },
|
|
19
|
+
redirect: "error",
|
|
20
|
+
signal: AbortSignal.timeout(8e3)
|
|
21
|
+
});
|
|
22
|
+
if (!upstream.ok) return Response.json({
|
|
23
|
+
ok: false,
|
|
24
|
+
error: "Connector logo is unavailable."
|
|
25
|
+
}, { status: 404 });
|
|
26
|
+
const contentType = upstream.headers.get("content-type")?.split(";")[0]?.trim().toLowerCase() ?? "";
|
|
27
|
+
if (!COMPOSIO_LOGO_CONTENT_TYPES.has(contentType)) return Response.json({
|
|
28
|
+
ok: false,
|
|
29
|
+
error: "Connector logo has an unsupported format."
|
|
30
|
+
}, { status: 415 });
|
|
31
|
+
if (Number(upstream.headers.get("content-length") ?? "0") > COMPOSIO_LOGO_MAX_BYTES) return Response.json({
|
|
32
|
+
ok: false,
|
|
33
|
+
error: "Connector logo is too large."
|
|
34
|
+
}, { status: 413 });
|
|
35
|
+
const data = await upstream.arrayBuffer();
|
|
36
|
+
if (data.byteLength > COMPOSIO_LOGO_MAX_BYTES) return Response.json({
|
|
37
|
+
ok: false,
|
|
38
|
+
error: "Connector logo is too large."
|
|
39
|
+
}, { status: 413 });
|
|
40
|
+
return new Response(data, { headers: {
|
|
41
|
+
"Cache-Control": "public, max-age=86400, stale-while-revalidate=604800",
|
|
42
|
+
"Content-Length": String(data.byteLength),
|
|
43
|
+
"Content-Security-Policy": "default-src 'none'; style-src 'unsafe-inline'",
|
|
44
|
+
"Content-Type": contentType,
|
|
45
|
+
"X-Content-Type-Options": "nosniff"
|
|
46
|
+
} });
|
|
47
|
+
}
|
|
48
|
+
//#endregion
|
|
49
|
+
export { composioLogoResponse };
|
|
50
|
+
|
|
51
|
+
//# sourceMappingURL=composio-logo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composio-logo.js","names":[],"sources":["../../../src/connectors/composio-logo.ts"],"sourcesContent":["const COMPOSIO_LOGO_SLUG = /^[a-z0-9_]{1,80}$/;\nconst COMPOSIO_LOGO_MAX_BYTES = 512 * 1024;\nconst COMPOSIO_LOGO_CONTENT_TYPES = new Set([\n 'image/png',\n 'image/jpeg',\n 'image/webp',\n 'image/gif',\n 'image/svg+xml',\n]);\n\nexport async function composioLogoResponse(toolkit: string): Promise<Response> {\n const slug = toolkit.trim().toLowerCase();\n if (!COMPOSIO_LOGO_SLUG.test(slug)) {\n return Response.json({ ok: false, error: 'Invalid toolkit slug.' }, { status: 400 });\n }\n const upstream = await fetch(`https://logos.composio.dev/api/${encodeURIComponent(slug)}`, {\n headers: { Accept: 'image/png,image/webp,image/svg+xml,image/*;q=0.8' },\n redirect: 'error',\n signal: AbortSignal.timeout(8_000),\n });\n if (!upstream.ok) {\n return Response.json({ ok: false, error: 'Connector logo is unavailable.' }, { status: 404 });\n }\n const contentType = upstream.headers.get('content-type')?.split(';')[0]?.trim().toLowerCase() ?? '';\n if (!COMPOSIO_LOGO_CONTENT_TYPES.has(contentType)) {\n return Response.json({ ok: false, error: 'Connector logo has an unsupported format.' }, { status: 415 });\n }\n const declaredLength = Number(upstream.headers.get('content-length') ?? '0');\n if (declaredLength > COMPOSIO_LOGO_MAX_BYTES) {\n return Response.json({ ok: false, error: 'Connector logo is too large.' }, { status: 413 });\n }\n const data = await upstream.arrayBuffer();\n if (data.byteLength > COMPOSIO_LOGO_MAX_BYTES) {\n return Response.json({ ok: false, error: 'Connector logo is too large.' }, { status: 413 });\n }\n return new Response(data, {\n headers: {\n 'Cache-Control': 'public, max-age=86400, stale-while-revalidate=604800',\n 'Content-Length': String(data.byteLength),\n 'Content-Security-Policy': \"default-src 'none'; style-src 'unsafe-inline'\",\n 'Content-Type': contentType,\n 'X-Content-Type-Options': 'nosniff',\n },\n });\n}\n"],"mappings":";AAAA,MAAM,qBAAqB;AAC3B,MAAM,0BAA0B,MAAM;AACtC,MAAM,8BAA8B,IAAI,IAAI;CAC1C;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,eAAsB,qBAAqB,SAAoC;CAC7E,MAAM,OAAO,QAAQ,MAAM,CAAC,aAAa;AACzC,KAAI,CAAC,mBAAmB,KAAK,KAAK,CAChC,QAAO,SAAS,KAAK;EAAE,IAAI;EAAO,OAAO;EAAyB,EAAE,EAAE,QAAQ,KAAK,CAAC;CAEtF,MAAM,WAAW,MAAM,MAAM,kCAAkC,mBAAmB,KAAK,IAAI;EACzF,SAAS,EAAE,QAAQ,oDAAoD;EACvE,UAAU;EACV,QAAQ,YAAY,QAAQ,IAAM;EACnC,CAAC;AACF,KAAI,CAAC,SAAS,GACZ,QAAO,SAAS,KAAK;EAAE,IAAI;EAAO,OAAO;EAAkC,EAAE,EAAE,QAAQ,KAAK,CAAC;CAE/F,MAAM,cAAc,SAAS,QAAQ,IAAI,eAAe,EAAE,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,aAAa,IAAI;AACjG,KAAI,CAAC,4BAA4B,IAAI,YAAY,CAC/C,QAAO,SAAS,KAAK;EAAE,IAAI;EAAO,OAAO;EAA6C,EAAE,EAAE,QAAQ,KAAK,CAAC;AAG1G,KADuB,OAAO,SAAS,QAAQ,IAAI,iBAAiB,IAAI,IACtD,GAAG,wBACnB,QAAO,SAAS,KAAK;EAAE,IAAI;EAAO,OAAO;EAAgC,EAAE,EAAE,QAAQ,KAAK,CAAC;CAE7F,MAAM,OAAO,MAAM,SAAS,aAAa;AACzC,KAAI,KAAK,aAAa,wBACpB,QAAO,SAAS,KAAK;EAAE,IAAI;EAAO,OAAO;EAAgC,EAAE,EAAE,QAAQ,KAAK,CAAC;AAE7F,QAAO,IAAI,SAAS,MAAM,EACxB,SAAS;EACP,iBAAiB;EACjB,kBAAkB,OAAO,KAAK,WAAW;EACzC,2BAA2B;EAC3B,gBAAgB;EAChB,0BAA0B;EAC3B,EACF,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import type { ToolRouterCreateSessionConfig } from '@composio/core';
|
|
2
|
+
import { CredentialResolver } from '../auth/credentials.js';
|
|
3
|
+
import type { ConnectorActionMetadata, ConnectorConnection, ConnectorInstallationPolicy } from './types.js';
|
|
4
|
+
export declare function resolveComposioApiKey(resolver?: CredentialResolver): Promise<string | null>;
|
|
5
|
+
export declare function assertComposioApiKeyConfigured(resolver?: CredentialResolver): Promise<string>;
|
|
6
|
+
export type ComposioToolkitCatalogItem = {
|
|
7
|
+
slug: string;
|
|
8
|
+
name: string;
|
|
9
|
+
logoUrl?: string;
|
|
10
|
+
isNoAuth: boolean;
|
|
11
|
+
connected: boolean;
|
|
12
|
+
providerConnectionId?: string;
|
|
13
|
+
};
|
|
14
|
+
export type ComposioAuthorizeResult = {
|
|
15
|
+
toolkit: string;
|
|
16
|
+
connectionId: string;
|
|
17
|
+
connectUrl?: string;
|
|
18
|
+
status: string;
|
|
19
|
+
};
|
|
20
|
+
type SessionToolkitResponse = {
|
|
21
|
+
items: Array<{
|
|
22
|
+
slug: string;
|
|
23
|
+
name: string;
|
|
24
|
+
logo?: string;
|
|
25
|
+
isNoAuth: boolean;
|
|
26
|
+
connection?: {
|
|
27
|
+
isActive: boolean;
|
|
28
|
+
connectedAccount?: {
|
|
29
|
+
status: string;
|
|
30
|
+
id: string;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
}>;
|
|
34
|
+
cursor?: string;
|
|
35
|
+
};
|
|
36
|
+
export type ComposioSessionLike = {
|
|
37
|
+
sessionId: string;
|
|
38
|
+
toolkits(options?: {
|
|
39
|
+
toolkits?: string[];
|
|
40
|
+
isConnected?: boolean;
|
|
41
|
+
limit?: number;
|
|
42
|
+
cursor?: string;
|
|
43
|
+
}): Promise<SessionToolkitResponse>;
|
|
44
|
+
authorize(toolkit: string, options?: {
|
|
45
|
+
callbackUrl?: string;
|
|
46
|
+
alias?: string;
|
|
47
|
+
}): Promise<{
|
|
48
|
+
id: string;
|
|
49
|
+
status: string;
|
|
50
|
+
redirectUrl?: string | null;
|
|
51
|
+
}>;
|
|
52
|
+
search(params: {
|
|
53
|
+
query: string;
|
|
54
|
+
toolkits?: string[];
|
|
55
|
+
}): Promise<unknown>;
|
|
56
|
+
execute(toolSlug: string, args?: Record<string, unknown>, options?: {
|
|
57
|
+
account?: string;
|
|
58
|
+
}): Promise<unknown>;
|
|
59
|
+
};
|
|
60
|
+
export type ComposioSessionsClient = {
|
|
61
|
+
sessions: {
|
|
62
|
+
create(userId: string, config?: ToolRouterCreateSessionConfig): Promise<ComposioSessionLike>;
|
|
63
|
+
};
|
|
64
|
+
connectedAccounts: {
|
|
65
|
+
list(query?: {
|
|
66
|
+
userIds?: string[];
|
|
67
|
+
toolkitSlugs?: string[];
|
|
68
|
+
}): Promise<unknown>;
|
|
69
|
+
delete(id: string): Promise<unknown>;
|
|
70
|
+
refresh(id: string): Promise<unknown>;
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
export type ComposioSessionContext = {
|
|
74
|
+
principalId: string;
|
|
75
|
+
installationScope?: string;
|
|
76
|
+
toolkits?: string[];
|
|
77
|
+
connectedAccounts?: Record<string, string[]>;
|
|
78
|
+
callbackUrl?: string;
|
|
79
|
+
};
|
|
80
|
+
type ClientFactory = () => Promise<ComposioSessionsClient>;
|
|
81
|
+
/** Convert local identities to stable opaque Composio user IDs without disclosing user data. */
|
|
82
|
+
export declare function createComposioPrincipalId(principalId: string, installationScope?: string): string;
|
|
83
|
+
export declare class ComposioSessionsAdapter {
|
|
84
|
+
private readonly createClient;
|
|
85
|
+
constructor(options?: {
|
|
86
|
+
resolver?: CredentialResolver;
|
|
87
|
+
clientFactory?: ClientFactory;
|
|
88
|
+
});
|
|
89
|
+
createSession(context: ComposioSessionContext): Promise<ComposioSessionLike>;
|
|
90
|
+
listToolkitCatalog(context: Omit<ComposioSessionContext, 'toolkits'>): Promise<ComposioToolkitCatalogItem[]>;
|
|
91
|
+
authorize(context: ComposioSessionContext & {
|
|
92
|
+
toolkit: string;
|
|
93
|
+
installationId?: string;
|
|
94
|
+
alias?: string;
|
|
95
|
+
}): Promise<ComposioAuthorizeResult>;
|
|
96
|
+
syncConnections(context: Pick<ComposioSessionContext, 'principalId' | 'installationScope'>): Promise<ConnectorConnection[]>;
|
|
97
|
+
revokeConnection(connection: ConnectorConnection): Promise<void>;
|
|
98
|
+
refreshConnection(connection: ConnectorConnection): Promise<ConnectorConnection>;
|
|
99
|
+
executeWithPolicy(input: {
|
|
100
|
+
context: ComposioSessionContext;
|
|
101
|
+
installation: ConnectorInstallationPolicy;
|
|
102
|
+
connection?: ConnectorConnection;
|
|
103
|
+
action: ConnectorActionMetadata;
|
|
104
|
+
args?: Record<string, unknown>;
|
|
105
|
+
agentId?: string;
|
|
106
|
+
sessionKey?: string;
|
|
107
|
+
confirmed?: boolean;
|
|
108
|
+
}): Promise<{
|
|
109
|
+
decision: 'allowed';
|
|
110
|
+
result: unknown;
|
|
111
|
+
} | {
|
|
112
|
+
decision: 'denied' | 'confirmation_required';
|
|
113
|
+
reason: string;
|
|
114
|
+
}>;
|
|
115
|
+
}
|
|
116
|
+
export {};
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import { createLogger } from "../utils/logger/index.js";
|
|
2
|
+
import { init_logger } from "../utils/logger.js";
|
|
3
|
+
import { CredentialResolver, init_credentials } from "../auth/credentials.js";
|
|
4
|
+
import { appendConnectorExecutionAudit, getConnectorInstallation, listConnectorConnections, upsertConnectorConnection } from "../storage/sqlite/connector-repository.js";
|
|
5
|
+
import { evaluateConnectorExecutionPolicy } from "./policy.js";
|
|
6
|
+
import { resolve } from "node:path";
|
|
7
|
+
import { createHash } from "node:crypto";
|
|
8
|
+
import { Composio } from "@composio/core";
|
|
9
|
+
import { PiProvider } from "@composio/experimental";
|
|
10
|
+
//#region src/connectors/composio-sessions.ts
|
|
11
|
+
init_credentials();
|
|
12
|
+
init_logger();
|
|
13
|
+
const log = createLogger("Connectors:ComposioSessions");
|
|
14
|
+
const COMPOSIO_API_KEY_PROVIDER = "connector-composio-api-key";
|
|
15
|
+
async function resolveComposioApiKey(resolver = new CredentialResolver()) {
|
|
16
|
+
return (await resolver.resolveApiKey(COMPOSIO_API_KEY_PROVIDER).catch(() => void 0))?.trim() || process.env.XOPC_COMPOSIO_API_KEY?.trim() || process.env.COMPOSIO_API_KEY?.trim() || null;
|
|
17
|
+
}
|
|
18
|
+
async function assertComposioApiKeyConfigured(resolver = new CredentialResolver()) {
|
|
19
|
+
const apiKey = await resolveComposioApiKey(resolver);
|
|
20
|
+
if (!apiKey) throw new Error("Composio API key is not configured. Install the \"Composio API Key\" connector first.");
|
|
21
|
+
return apiKey;
|
|
22
|
+
}
|
|
23
|
+
function stableHash(value) {
|
|
24
|
+
return createHash("sha256").update(value).digest("hex").slice(0, 24);
|
|
25
|
+
}
|
|
26
|
+
function defaultInstallationScope() {
|
|
27
|
+
const configured = process.env.XOPC_STATE_DIR?.trim() || process.env.XOPC_CONFIG_PATH?.trim();
|
|
28
|
+
return configured ? resolve(configured) : resolve(process.cwd());
|
|
29
|
+
}
|
|
30
|
+
/** Convert local identities to stable opaque Composio user IDs without disclosing user data. */
|
|
31
|
+
function createComposioPrincipalId(principalId, installationScope = defaultInstallationScope()) {
|
|
32
|
+
const normalized = principalId.trim();
|
|
33
|
+
if (!normalized) throw new Error("Connector principalId is required.");
|
|
34
|
+
return `xopc_${stableHash(installationScope)}_${stableHash(normalized)}`;
|
|
35
|
+
}
|
|
36
|
+
function readArray(payload) {
|
|
37
|
+
if (!payload || typeof payload !== "object" || Array.isArray(payload)) return [];
|
|
38
|
+
const record = payload;
|
|
39
|
+
for (const key of [
|
|
40
|
+
"items",
|
|
41
|
+
"data",
|
|
42
|
+
"connected_accounts"
|
|
43
|
+
]) if (Array.isArray(record[key])) return record[key];
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
function readString(record, keys) {
|
|
47
|
+
for (const key of keys) {
|
|
48
|
+
const value = record[key];
|
|
49
|
+
if (typeof value === "string" && value.trim()) return value.trim();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function connectionStatus(value) {
|
|
53
|
+
switch (value?.toUpperCase()) {
|
|
54
|
+
case "ACTIVE": return "active";
|
|
55
|
+
case "INITIATED":
|
|
56
|
+
case "INITIALIZING": return "pending";
|
|
57
|
+
case "EXPIRED": return "expired";
|
|
58
|
+
case "FAILED": return "failed";
|
|
59
|
+
case "REVOKED":
|
|
60
|
+
case "DELETED": return "revoked";
|
|
61
|
+
case "INACTIVE": return "disabled";
|
|
62
|
+
default: return "unknown";
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
var ComposioSessionsAdapter = class {
|
|
66
|
+
createClient;
|
|
67
|
+
constructor(options = {}) {
|
|
68
|
+
if (options.clientFactory) {
|
|
69
|
+
this.createClient = options.clientFactory;
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const resolver = options.resolver ?? new CredentialResolver();
|
|
73
|
+
this.createClient = async () => {
|
|
74
|
+
return new Composio({
|
|
75
|
+
apiKey: await assertComposioApiKeyConfigured(resolver),
|
|
76
|
+
baseURL: process.env.XOPC_COMPOSIO_BASE_URL?.trim() || void 0,
|
|
77
|
+
allowTracking: false,
|
|
78
|
+
dangerouslyAllowAutoUploadDownloadFiles: false,
|
|
79
|
+
fileUploadDirs: false,
|
|
80
|
+
provider: new PiProvider(),
|
|
81
|
+
host: "xopc"
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
async createSession(context) {
|
|
86
|
+
const client = await this.createClient();
|
|
87
|
+
const config = {
|
|
88
|
+
manageConnections: {
|
|
89
|
+
enable: true,
|
|
90
|
+
callbackUrl: context.callbackUrl,
|
|
91
|
+
waitForConnections: false
|
|
92
|
+
},
|
|
93
|
+
sandbox: { enable: false },
|
|
94
|
+
multiAccount: {
|
|
95
|
+
enable: true,
|
|
96
|
+
maxAccountsPerToolkit: 5,
|
|
97
|
+
requireExplicitSelection: true
|
|
98
|
+
},
|
|
99
|
+
...context.toolkits?.length ? { toolkits: { enable: context.toolkits } } : {},
|
|
100
|
+
...context.connectedAccounts && Object.keys(context.connectedAccounts).length > 0 ? { connectedAccounts: context.connectedAccounts } : {}
|
|
101
|
+
};
|
|
102
|
+
return client.sessions.create(createComposioPrincipalId(context.principalId, context.installationScope), config);
|
|
103
|
+
}
|
|
104
|
+
async listToolkitCatalog(context) {
|
|
105
|
+
const session = await this.createSession(context);
|
|
106
|
+
const items = [];
|
|
107
|
+
let cursor;
|
|
108
|
+
for (let page = 0; page < 20; page++) {
|
|
109
|
+
const response = await session.toolkits({
|
|
110
|
+
limit: 100,
|
|
111
|
+
cursor
|
|
112
|
+
});
|
|
113
|
+
for (const item of response.items) items.push({
|
|
114
|
+
slug: item.slug,
|
|
115
|
+
name: item.name,
|
|
116
|
+
logoUrl: item.logo,
|
|
117
|
+
isNoAuth: item.isNoAuth,
|
|
118
|
+
connected: item.connection?.isActive === true,
|
|
119
|
+
providerConnectionId: item.connection?.connectedAccount?.id
|
|
120
|
+
});
|
|
121
|
+
if (!response.cursor || response.cursor === cursor) break;
|
|
122
|
+
cursor = response.cursor;
|
|
123
|
+
}
|
|
124
|
+
return items;
|
|
125
|
+
}
|
|
126
|
+
async authorize(context) {
|
|
127
|
+
const request = await (await this.createSession({
|
|
128
|
+
...context,
|
|
129
|
+
toolkits: [context.toolkit]
|
|
130
|
+
})).authorize(context.toolkit, {
|
|
131
|
+
callbackUrl: context.callbackUrl,
|
|
132
|
+
alias: context.alias
|
|
133
|
+
});
|
|
134
|
+
const connectorId = `composio-${context.toolkit}`;
|
|
135
|
+
upsertConnectorConnection({
|
|
136
|
+
id: `composio-${request.id}`,
|
|
137
|
+
installationId: context.installationId && getConnectorInstallation(context.installationId) ? context.installationId : void 0,
|
|
138
|
+
connectorId,
|
|
139
|
+
provider: "composio",
|
|
140
|
+
principalId: context.principalId,
|
|
141
|
+
providerConnectionId: request.id,
|
|
142
|
+
alias: context.alias,
|
|
143
|
+
identity: {},
|
|
144
|
+
status: connectionStatus(request.status),
|
|
145
|
+
isDefault: listConnectorConnections({
|
|
146
|
+
principalId: context.principalId,
|
|
147
|
+
connectorId
|
|
148
|
+
}).length === 0,
|
|
149
|
+
metadata: { toolkit: context.toolkit }
|
|
150
|
+
});
|
|
151
|
+
return {
|
|
152
|
+
toolkit: context.toolkit,
|
|
153
|
+
connectionId: request.id,
|
|
154
|
+
connectUrl: request.redirectUrl ?? void 0,
|
|
155
|
+
status: request.status
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
async syncConnections(context) {
|
|
159
|
+
const client = await this.createClient();
|
|
160
|
+
const providerPrincipalId = createComposioPrincipalId(context.principalId, context.installationScope);
|
|
161
|
+
const payload = await client.connectedAccounts.list({ userIds: [providerPrincipalId] });
|
|
162
|
+
const synced = [];
|
|
163
|
+
for (const item of readArray(payload)) {
|
|
164
|
+
if (!item || typeof item !== "object" || Array.isArray(item)) continue;
|
|
165
|
+
const row = item;
|
|
166
|
+
const toolkitRecord = row.toolkit && typeof row.toolkit === "object" && !Array.isArray(row.toolkit) ? row.toolkit : {};
|
|
167
|
+
const providerConnectionId = readString(row, [
|
|
168
|
+
"id",
|
|
169
|
+
"nanoid",
|
|
170
|
+
"connectedAccountId",
|
|
171
|
+
"connected_account_id"
|
|
172
|
+
]);
|
|
173
|
+
const toolkit = readString(toolkitRecord, ["slug"]) ?? readString(row, ["toolkitSlug", "toolkit_slug"]);
|
|
174
|
+
if (!providerConnectionId || !toolkit) continue;
|
|
175
|
+
const connectorId = `composio-${toolkit}`;
|
|
176
|
+
const existing = listConnectorConnections({
|
|
177
|
+
principalId: context.principalId,
|
|
178
|
+
connectorId
|
|
179
|
+
}).find((connection) => connection.providerConnectionId === providerConnectionId);
|
|
180
|
+
const identity = row.connectionData && typeof row.connectionData === "object" && !Array.isArray(row.connectionData) ? row.connectionData : {};
|
|
181
|
+
synced.push(upsertConnectorConnection({
|
|
182
|
+
id: existing?.id ?? `composio-${providerConnectionId}`,
|
|
183
|
+
installationId: existing?.installationId,
|
|
184
|
+
connectorId,
|
|
185
|
+
provider: "composio",
|
|
186
|
+
principalId: context.principalId,
|
|
187
|
+
providerConnectionId,
|
|
188
|
+
alias: existing?.alias,
|
|
189
|
+
identity,
|
|
190
|
+
status: connectionStatus(readString(row, ["status"])),
|
|
191
|
+
isDefault: existing?.isDefault ?? false,
|
|
192
|
+
connectedAt: readString(row, ["createdAt", "created_at"]),
|
|
193
|
+
lastError: readString(row, ["lastError", "last_error"]),
|
|
194
|
+
metadata: {
|
|
195
|
+
toolkit,
|
|
196
|
+
providerPrincipalId
|
|
197
|
+
}
|
|
198
|
+
}));
|
|
199
|
+
}
|
|
200
|
+
return synced;
|
|
201
|
+
}
|
|
202
|
+
async revokeConnection(connection) {
|
|
203
|
+
await (await this.createClient()).connectedAccounts.delete(connection.providerConnectionId);
|
|
204
|
+
upsertConnectorConnection({
|
|
205
|
+
...connection,
|
|
206
|
+
status: "revoked",
|
|
207
|
+
isDefault: false,
|
|
208
|
+
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
async refreshConnection(connection) {
|
|
212
|
+
await (await this.createClient()).connectedAccounts.refresh(connection.providerConnectionId);
|
|
213
|
+
const synced = await this.syncConnections({ principalId: connection.principalId });
|
|
214
|
+
return synced.find((candidate) => candidate.id === connection.id) ?? synced.find((candidate) => candidate.providerConnectionId === connection.providerConnectionId) ?? connection;
|
|
215
|
+
}
|
|
216
|
+
async executeWithPolicy(input) {
|
|
217
|
+
const evaluation = evaluateConnectorExecutionPolicy({
|
|
218
|
+
installation: input.installation,
|
|
219
|
+
action: input.action,
|
|
220
|
+
agentId: input.agentId,
|
|
221
|
+
connectionId: input.connection?.id,
|
|
222
|
+
confirmed: input.confirmed
|
|
223
|
+
});
|
|
224
|
+
if (evaluation.decision !== "allowed") {
|
|
225
|
+
appendConnectorExecutionAudit({
|
|
226
|
+
installationId: input.installation.id,
|
|
227
|
+
connectionId: input.connection?.id,
|
|
228
|
+
connectorId: input.installation.connectorId,
|
|
229
|
+
principalId: input.context.principalId,
|
|
230
|
+
agentId: input.agentId,
|
|
231
|
+
sessionKey: input.sessionKey,
|
|
232
|
+
actionId: input.action.actionId,
|
|
233
|
+
scope: input.action.scope,
|
|
234
|
+
decision: evaluation.decision,
|
|
235
|
+
resultStatus: "not_executed"
|
|
236
|
+
});
|
|
237
|
+
return {
|
|
238
|
+
decision: evaluation.decision,
|
|
239
|
+
reason: evaluation.reason
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
const startedAt = Date.now();
|
|
243
|
+
try {
|
|
244
|
+
const toolkit = input.action.toolkit;
|
|
245
|
+
const connectedAccounts = toolkit && input.connection ? { [toolkit]: [input.connection.providerConnectionId] } : input.context.connectedAccounts;
|
|
246
|
+
const result = await (await this.createSession({
|
|
247
|
+
...input.context,
|
|
248
|
+
connectedAccounts
|
|
249
|
+
})).execute(input.action.actionId, input.args ?? {}, input.connection ? { account: input.connection.providerConnectionId } : void 0);
|
|
250
|
+
appendConnectorExecutionAudit({
|
|
251
|
+
installationId: input.installation.id,
|
|
252
|
+
connectionId: input.connection?.id,
|
|
253
|
+
connectorId: input.installation.connectorId,
|
|
254
|
+
principalId: input.context.principalId,
|
|
255
|
+
agentId: input.agentId,
|
|
256
|
+
sessionKey: input.sessionKey,
|
|
257
|
+
actionId: input.action.actionId,
|
|
258
|
+
scope: input.action.scope,
|
|
259
|
+
decision: "allowed",
|
|
260
|
+
resultStatus: "success",
|
|
261
|
+
durationMs: Date.now() - startedAt
|
|
262
|
+
});
|
|
263
|
+
return {
|
|
264
|
+
decision: "allowed",
|
|
265
|
+
result
|
|
266
|
+
};
|
|
267
|
+
} catch (err) {
|
|
268
|
+
const errorCode = err && typeof err === "object" && "code" in err ? String(err.code) : void 0;
|
|
269
|
+
appendConnectorExecutionAudit({
|
|
270
|
+
installationId: input.installation.id,
|
|
271
|
+
connectionId: input.connection?.id,
|
|
272
|
+
connectorId: input.installation.connectorId,
|
|
273
|
+
principalId: input.context.principalId,
|
|
274
|
+
agentId: input.agentId,
|
|
275
|
+
sessionKey: input.sessionKey,
|
|
276
|
+
actionId: input.action.actionId,
|
|
277
|
+
scope: input.action.scope,
|
|
278
|
+
decision: "allowed",
|
|
279
|
+
resultStatus: "error",
|
|
280
|
+
durationMs: Date.now() - startedAt,
|
|
281
|
+
errorCode
|
|
282
|
+
});
|
|
283
|
+
log.warn({
|
|
284
|
+
err,
|
|
285
|
+
connectorId: input.installation.connectorId,
|
|
286
|
+
actionId: input.action.actionId,
|
|
287
|
+
phase: "execute"
|
|
288
|
+
}, "Composio connector action failed");
|
|
289
|
+
throw err;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
//#endregion
|
|
294
|
+
export { ComposioSessionsAdapter, assertComposioApiKeyConfigured, createComposioPrincipalId, resolveComposioApiKey };
|
|
295
|
+
|
|
296
|
+
//# sourceMappingURL=composio-sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composio-sessions.js","names":["listStoredConnectorConnections"],"sources":["../../../src/connectors/composio-sessions.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport { resolve } from 'node:path';\n\nimport { Composio } from '@composio/core';\nimport type { ToolRouterCreateSessionConfig } from '@composio/core';\nimport { PiProvider } from '@composio/experimental';\n\nimport { CredentialResolver } from '../auth/credentials.js';\nimport {\n appendConnectorExecutionAudit,\n getConnectorInstallation,\n listConnectorConnections as listStoredConnectorConnections,\n upsertConnectorConnection,\n} from '../storage/sqlite/connector-repository.js';\nimport { createLogger } from '../utils/logger.js';\nimport { evaluateConnectorExecutionPolicy } from './policy.js';\nimport type {\n ConnectorActionMetadata,\n ConnectorConnection,\n ConnectorInstallationPolicy,\n} from './types.js';\n\nconst log = createLogger('Connectors:ComposioSessions');\nconst COMPOSIO_API_KEY_PROVIDER = 'connector-composio-api-key';\n\nexport async function resolveComposioApiKey(resolver = new CredentialResolver()): Promise<string | null> {\n const stored = await resolver.resolveApiKey(COMPOSIO_API_KEY_PROVIDER).catch(() => undefined);\n return stored?.trim() || process.env.XOPC_COMPOSIO_API_KEY?.trim() || process.env.COMPOSIO_API_KEY?.trim() || null;\n}\n\nexport async function assertComposioApiKeyConfigured(resolver = new CredentialResolver()): Promise<string> {\n const apiKey = await resolveComposioApiKey(resolver);\n if (!apiKey) {\n throw new Error('Composio API key is not configured. Install the \"Composio API Key\" connector first.');\n }\n return apiKey;\n}\n\nexport type ComposioToolkitCatalogItem = {\n slug: string;\n name: string;\n logoUrl?: string;\n isNoAuth: boolean;\n connected: boolean;\n providerConnectionId?: string;\n};\n\nexport type ComposioAuthorizeResult = {\n toolkit: string;\n connectionId: string;\n connectUrl?: string;\n status: string;\n};\n\ntype SessionToolkitResponse = {\n items: Array<{\n slug: string;\n name: string;\n logo?: string;\n isNoAuth: boolean;\n connection?: {\n isActive: boolean;\n connectedAccount?: { status: string; id: string };\n };\n }>;\n cursor?: string;\n};\n\nexport type ComposioSessionLike = {\n sessionId: string;\n toolkits(options?: { toolkits?: string[]; isConnected?: boolean; limit?: number; cursor?: string }): Promise<SessionToolkitResponse>;\n authorize(toolkit: string, options?: { callbackUrl?: string; alias?: string }): Promise<{\n id: string;\n status: string;\n redirectUrl?: string | null;\n }>;\n search(params: { query: string; toolkits?: string[] }): Promise<unknown>;\n execute(toolSlug: string, args?: Record<string, unknown>, options?: { account?: string }): Promise<unknown>;\n};\n\nexport type ComposioSessionsClient = {\n sessions: {\n create(userId: string, config?: ToolRouterCreateSessionConfig): Promise<ComposioSessionLike>;\n };\n connectedAccounts: {\n list(query?: { userIds?: string[]; toolkitSlugs?: string[] }): Promise<unknown>;\n delete(id: string): Promise<unknown>;\n refresh(id: string): Promise<unknown>;\n };\n};\n\nexport type ComposioSessionContext = {\n principalId: string;\n installationScope?: string;\n toolkits?: string[];\n connectedAccounts?: Record<string, string[]>;\n callbackUrl?: string;\n};\n\ntype ClientFactory = () => Promise<ComposioSessionsClient>;\n\nfunction stableHash(value: string): string {\n return createHash('sha256').update(value).digest('hex').slice(0, 24);\n}\n\nfunction defaultInstallationScope(): string {\n const configured = process.env.XOPC_STATE_DIR?.trim() || process.env.XOPC_CONFIG_PATH?.trim();\n return configured ? resolve(configured) : resolve(process.cwd());\n}\n\n/** Convert local identities to stable opaque Composio user IDs without disclosing user data. */\nexport function createComposioPrincipalId(principalId: string, installationScope = defaultInstallationScope()): string {\n const normalized = principalId.trim();\n if (!normalized) throw new Error('Connector principalId is required.');\n return `xopc_${stableHash(installationScope)}_${stableHash(normalized)}`;\n}\n\nfunction readArray(payload: unknown): unknown[] {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) return [];\n const record = payload as Record<string, unknown>;\n for (const key of ['items', 'data', 'connected_accounts']) {\n if (Array.isArray(record[key])) return record[key] as unknown[];\n }\n return [];\n}\n\nfunction readString(record: Record<string, unknown>, keys: string[]): string | undefined {\n for (const key of keys) {\n const value = record[key];\n if (typeof value === 'string' && value.trim()) return value.trim();\n }\n return undefined;\n}\n\nfunction connectionStatus(value: string | undefined): ConnectorConnection['status'] {\n switch (value?.toUpperCase()) {\n case 'ACTIVE': return 'active';\n case 'INITIATED':\n case 'INITIALIZING': return 'pending';\n case 'EXPIRED': return 'expired';\n case 'FAILED': return 'failed';\n case 'REVOKED':\n case 'DELETED': return 'revoked';\n case 'INACTIVE': return 'disabled';\n default: return 'unknown';\n }\n}\n\nexport class ComposioSessionsAdapter {\n private readonly createClient: ClientFactory;\n\n constructor(options: { resolver?: CredentialResolver; clientFactory?: ClientFactory } = {}) {\n if (options.clientFactory) {\n this.createClient = options.clientFactory;\n return;\n }\n const resolver = options.resolver ?? new CredentialResolver();\n this.createClient = async () => {\n const apiKey = await assertComposioApiKeyConfigured(resolver);\n return new Composio({\n apiKey,\n baseURL: process.env.XOPC_COMPOSIO_BASE_URL?.trim() || undefined,\n allowTracking: false,\n dangerouslyAllowAutoUploadDownloadFiles: false,\n fileUploadDirs: false,\n provider: new PiProvider(),\n host: 'xopc',\n }) as unknown as ComposioSessionsClient;\n };\n }\n\n async createSession(context: ComposioSessionContext): Promise<ComposioSessionLike> {\n const client = await this.createClient();\n const config: ToolRouterCreateSessionConfig = {\n manageConnections: {\n enable: true,\n callbackUrl: context.callbackUrl,\n waitForConnections: false,\n },\n sandbox: { enable: false },\n multiAccount: {\n enable: true,\n maxAccountsPerToolkit: 5,\n requireExplicitSelection: true,\n },\n ...(context.toolkits?.length ? { toolkits: { enable: context.toolkits } } : {}),\n ...(context.connectedAccounts && Object.keys(context.connectedAccounts).length > 0\n ? { connectedAccounts: context.connectedAccounts }\n : {}),\n };\n return client.sessions.create(\n createComposioPrincipalId(context.principalId, context.installationScope),\n config,\n );\n }\n\n async listToolkitCatalog(context: Omit<ComposioSessionContext, 'toolkits'>): Promise<ComposioToolkitCatalogItem[]> {\n const session = await this.createSession(context);\n const items: ComposioToolkitCatalogItem[] = [];\n let cursor: string | undefined;\n for (let page = 0; page < 20; page++) {\n const response = await session.toolkits({ limit: 100, cursor });\n for (const item of response.items) {\n items.push({\n slug: item.slug,\n name: item.name,\n logoUrl: item.logo,\n isNoAuth: item.isNoAuth,\n connected: item.connection?.isActive === true,\n providerConnectionId: item.connection?.connectedAccount?.id,\n });\n }\n if (!response.cursor || response.cursor === cursor) break;\n cursor = response.cursor;\n }\n return items;\n }\n\n async authorize(\n context: ComposioSessionContext & { toolkit: string; installationId?: string; alias?: string },\n ): Promise<ComposioAuthorizeResult> {\n const session = await this.createSession({ ...context, toolkits: [context.toolkit] });\n const request = await session.authorize(context.toolkit, {\n callbackUrl: context.callbackUrl,\n alias: context.alias,\n });\n const connectorId = `composio-${context.toolkit}`;\n upsertConnectorConnection({\n id: `composio-${request.id}`,\n installationId: context.installationId && getConnectorInstallation(context.installationId)\n ? context.installationId\n : undefined,\n connectorId,\n provider: 'composio',\n principalId: context.principalId,\n providerConnectionId: request.id,\n alias: context.alias,\n identity: {},\n status: connectionStatus(request.status),\n isDefault: listStoredConnectorConnections({ principalId: context.principalId, connectorId }).length === 0,\n metadata: { toolkit: context.toolkit },\n });\n return {\n toolkit: context.toolkit,\n connectionId: request.id,\n connectUrl: request.redirectUrl ?? undefined,\n status: request.status,\n };\n }\n\n async syncConnections(context: Pick<ComposioSessionContext, 'principalId' | 'installationScope'>): Promise<ConnectorConnection[]> {\n const client = await this.createClient();\n const providerPrincipalId = createComposioPrincipalId(context.principalId, context.installationScope);\n const payload = await client.connectedAccounts.list({ userIds: [providerPrincipalId] });\n const synced: ConnectorConnection[] = [];\n for (const item of readArray(payload)) {\n if (!item || typeof item !== 'object' || Array.isArray(item)) continue;\n const row = item as Record<string, unknown>;\n const toolkitRecord = row.toolkit && typeof row.toolkit === 'object' && !Array.isArray(row.toolkit)\n ? row.toolkit as Record<string, unknown>\n : {};\n const providerConnectionId = readString(row, ['id', 'nanoid', 'connectedAccountId', 'connected_account_id']);\n const toolkit = readString(toolkitRecord, ['slug']) ?? readString(row, ['toolkitSlug', 'toolkit_slug']);\n if (!providerConnectionId || !toolkit) continue;\n const connectorId = `composio-${toolkit}`;\n const existing = listStoredConnectorConnections({ principalId: context.principalId, connectorId })\n .find((connection) => connection.providerConnectionId === providerConnectionId);\n const identity = row.connectionData && typeof row.connectionData === 'object' && !Array.isArray(row.connectionData)\n ? row.connectionData as Record<string, unknown>\n : {};\n synced.push(upsertConnectorConnection({\n id: existing?.id ?? `composio-${providerConnectionId}`,\n installationId: existing?.installationId,\n connectorId,\n provider: 'composio',\n principalId: context.principalId,\n providerConnectionId,\n alias: existing?.alias,\n identity,\n status: connectionStatus(readString(row, ['status'])),\n isDefault: existing?.isDefault ?? false,\n connectedAt: readString(row, ['createdAt', 'created_at']),\n lastError: readString(row, ['lastError', 'last_error']),\n metadata: { toolkit, providerPrincipalId },\n }));\n }\n return synced;\n }\n\n async revokeConnection(connection: ConnectorConnection): Promise<void> {\n const client = await this.createClient();\n await client.connectedAccounts.delete(connection.providerConnectionId);\n upsertConnectorConnection({\n ...connection,\n status: 'revoked',\n isDefault: false,\n updatedAt: new Date().toISOString(),\n });\n }\n\n async refreshConnection(connection: ConnectorConnection): Promise<ConnectorConnection> {\n const client = await this.createClient();\n await client.connectedAccounts.refresh(connection.providerConnectionId);\n const synced = await this.syncConnections({ principalId: connection.principalId });\n return synced.find((candidate) => candidate.id === connection.id)\n ?? synced.find((candidate) => candidate.providerConnectionId === connection.providerConnectionId)\n ?? connection;\n }\n\n async executeWithPolicy(input: {\n context: ComposioSessionContext;\n installation: ConnectorInstallationPolicy;\n connection?: ConnectorConnection;\n action: ConnectorActionMetadata;\n args?: Record<string, unknown>;\n agentId?: string;\n sessionKey?: string;\n confirmed?: boolean;\n }): Promise<{ decision: 'allowed'; result: unknown } | { decision: 'denied' | 'confirmation_required'; reason: string }> {\n const evaluation = evaluateConnectorExecutionPolicy({\n installation: input.installation,\n action: input.action,\n agentId: input.agentId,\n connectionId: input.connection?.id,\n confirmed: input.confirmed,\n });\n if (evaluation.decision !== 'allowed') {\n appendConnectorExecutionAudit({\n installationId: input.installation.id,\n connectionId: input.connection?.id,\n connectorId: input.installation.connectorId,\n principalId: input.context.principalId,\n agentId: input.agentId,\n sessionKey: input.sessionKey,\n actionId: input.action.actionId,\n scope: input.action.scope,\n decision: evaluation.decision,\n resultStatus: 'not_executed',\n });\n return { decision: evaluation.decision, reason: evaluation.reason };\n }\n\n const startedAt = Date.now();\n try {\n const toolkit = input.action.toolkit;\n const connectedAccounts = toolkit && input.connection\n ? { [toolkit]: [input.connection.providerConnectionId] }\n : input.context.connectedAccounts;\n const session = await this.createSession({ ...input.context, connectedAccounts });\n const result = await session.execute(\n input.action.actionId,\n input.args ?? {},\n input.connection ? { account: input.connection.providerConnectionId } : undefined,\n );\n appendConnectorExecutionAudit({\n installationId: input.installation.id,\n connectionId: input.connection?.id,\n connectorId: input.installation.connectorId,\n principalId: input.context.principalId,\n agentId: input.agentId,\n sessionKey: input.sessionKey,\n actionId: input.action.actionId,\n scope: input.action.scope,\n decision: 'allowed',\n resultStatus: 'success',\n durationMs: Date.now() - startedAt,\n });\n return { decision: 'allowed', result };\n } catch (err) {\n const errorCode = err && typeof err === 'object' && 'code' in err ? String((err as { code?: unknown }).code) : undefined;\n appendConnectorExecutionAudit({\n installationId: input.installation.id,\n connectionId: input.connection?.id,\n connectorId: input.installation.connectorId,\n principalId: input.context.principalId,\n agentId: input.agentId,\n sessionKey: input.sessionKey,\n actionId: input.action.actionId,\n scope: input.action.scope,\n decision: 'allowed',\n resultStatus: 'error',\n durationMs: Date.now() - startedAt,\n errorCode,\n });\n log.warn(\n { err, connectorId: input.installation.connectorId, actionId: input.action.actionId, phase: 'execute' },\n 'Composio connector action failed',\n );\n throw err;\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -6,5 +6,22 @@ export type ComposioTriggerArchiveEntry = {
|
|
|
6
6
|
trigger?: string;
|
|
7
7
|
payload: unknown;
|
|
8
8
|
};
|
|
9
|
+
export declare function verifyComposioWebhook(input: {
|
|
10
|
+
body: string;
|
|
11
|
+
webhookId: string;
|
|
12
|
+
webhookTimestamp: string;
|
|
13
|
+
signature: string;
|
|
14
|
+
secret: string;
|
|
15
|
+
nowMs?: number;
|
|
16
|
+
toleranceSeconds?: number;
|
|
17
|
+
}): unknown;
|
|
18
|
+
export declare function normalizeComposioTriggerPayload(payload: unknown, webhookId?: string): {
|
|
19
|
+
id: string;
|
|
20
|
+
type: string;
|
|
21
|
+
toolkit?: string;
|
|
22
|
+
trigger?: string;
|
|
23
|
+
data: Record<string, unknown>;
|
|
24
|
+
};
|
|
25
|
+
export declare function applyComposioConnectionLifecycleEvent(payload: unknown): void;
|
|
9
26
|
export declare function appendComposioTriggerEvent(config: Config, payload: unknown): Promise<ComposioTriggerArchiveEntry>;
|
|
10
27
|
export declare function listComposioTriggerEvents(config: Config, limit?: number): Promise<ComposioTriggerArchiveEntry[]>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { listConnectorConnections, upsertConnectorConnection } from "../storage/sqlite/connector-repository.js";
|
|
1
2
|
import { getWorkspacePath } from "../config/workspace-path-helpers.js";
|
|
2
3
|
import { dirname, join } from "node:path";
|
|
3
|
-
import crypto from "node:crypto";
|
|
4
|
+
import crypto, { createHmac, timingSafeEqual } from "node:crypto";
|
|
4
5
|
import { appendFile, mkdir, readFile } from "node:fs/promises";
|
|
5
6
|
//#region src/connectors/composio-triggers.ts
|
|
6
7
|
function archivePath(config) {
|
|
@@ -9,17 +10,59 @@ function archivePath(config) {
|
|
|
9
10
|
function readString(value) {
|
|
10
11
|
return typeof value === "string" && value.trim() ? value.trim() : void 0;
|
|
11
12
|
}
|
|
13
|
+
function verifyComposioWebhook(input) {
|
|
14
|
+
if (!input.secret || !input.webhookId || !input.webhookTimestamp || !input.signature) throw new Error("Missing Composio webhook signature fields.");
|
|
15
|
+
const timestampMs = Number(input.webhookTimestamp) * 1e3;
|
|
16
|
+
const toleranceMs = (input.toleranceSeconds ?? 300) * 1e3;
|
|
17
|
+
if (!Number.isFinite(timestampMs) || Math.abs((input.nowMs ?? Date.now()) - timestampMs) > toleranceMs) throw new Error("Composio webhook timestamp is outside the allowed window.");
|
|
18
|
+
const expected = createHmac("sha256", input.secret).update(`${input.webhookId}.${input.webhookTimestamp}.${input.body}`).digest("base64");
|
|
19
|
+
const received = input.signature.split(",").at(-1)?.trim() ?? "";
|
|
20
|
+
const expectedBuffer = Buffer.from(expected);
|
|
21
|
+
const receivedBuffer = Buffer.from(received);
|
|
22
|
+
if (expectedBuffer.length !== receivedBuffer.length || !timingSafeEqual(expectedBuffer, receivedBuffer)) throw new Error("Invalid Composio webhook signature.");
|
|
23
|
+
return JSON.parse(input.body);
|
|
24
|
+
}
|
|
25
|
+
function normalizeComposioTriggerPayload(payload, webhookId) {
|
|
26
|
+
const row = payload && typeof payload === "object" && !Array.isArray(payload) ? payload : {};
|
|
27
|
+
const metadata = row.metadata && typeof row.metadata === "object" && !Array.isArray(row.metadata) ? row.metadata : {};
|
|
28
|
+
const data = row.data && typeof row.data === "object" && !Array.isArray(row.data) ? row.data : {};
|
|
29
|
+
const toolkitRecord = metadata.toolkit && typeof metadata.toolkit === "object" && !Array.isArray(metadata.toolkit) ? metadata.toolkit : {};
|
|
30
|
+
return {
|
|
31
|
+
id: webhookId ?? readString(row.id ?? row.eventId ?? row.event_id) ?? crypto.randomUUID(),
|
|
32
|
+
type: readString(row.type) ?? "composio.trigger.message",
|
|
33
|
+
toolkit: readString(metadata.toolkit_slug ?? toolkitRecord.slug ?? row.toolkit ?? row.toolkit_slug),
|
|
34
|
+
trigger: readString(metadata.trigger_slug ?? row.trigger ?? row.triggerName ?? row.trigger_name),
|
|
35
|
+
data
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function applyComposioConnectionLifecycleEvent(payload) {
|
|
39
|
+
const normalized = normalizeComposioTriggerPayload(payload);
|
|
40
|
+
if (normalized.type !== "composio.connected_account.expired" && normalized.type !== "composio.connected_account.deleted") return;
|
|
41
|
+
const providerConnectionId = readString(normalized.data.id ?? normalized.data.nanoid ?? normalized.data.connected_account_id);
|
|
42
|
+
if (!providerConnectionId) return;
|
|
43
|
+
const connection = listConnectorConnections().find((candidate) => candidate.provider === "composio" && candidate.providerConnectionId === providerConnectionId);
|
|
44
|
+
if (!connection) return;
|
|
45
|
+
upsertConnectorConnection({
|
|
46
|
+
...connection,
|
|
47
|
+
status: normalized.type.endsWith(".deleted") ? "revoked" : "expired",
|
|
48
|
+
isDefault: false,
|
|
49
|
+
lastError: normalized.type.endsWith(".deleted") ? "Connection was removed in Composio." : "Connection expired and requires authorization."
|
|
50
|
+
});
|
|
51
|
+
}
|
|
12
52
|
async function appendComposioTriggerEvent(config, payload) {
|
|
13
53
|
const record = payload && typeof payload === "object" && !Array.isArray(payload) ? payload : {};
|
|
54
|
+
const normalized = normalizeComposioTriggerPayload(payload);
|
|
14
55
|
const entry = {
|
|
15
56
|
at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
16
|
-
id:
|
|
17
|
-
toolkit:
|
|
18
|
-
trigger:
|
|
57
|
+
id: normalized.id,
|
|
58
|
+
toolkit: normalized.toolkit ?? readString(record.appName ?? record.app_name),
|
|
59
|
+
trigger: normalized.trigger ?? normalized.type,
|
|
19
60
|
payload
|
|
20
61
|
};
|
|
21
62
|
const path = archivePath(config);
|
|
22
63
|
await mkdir(dirname(path), { recursive: true });
|
|
64
|
+
const existing = (await listComposioTriggerEvents(config, 500)).find((candidate) => candidate.id === entry.id);
|
|
65
|
+
if (existing) return existing;
|
|
23
66
|
await appendFile(path, `${JSON.stringify(entry)}\n`, "utf8");
|
|
24
67
|
return entry;
|
|
25
68
|
}
|
|
@@ -27,6 +70,6 @@ async function listComposioTriggerEvents(config, limit = 50) {
|
|
|
27
70
|
return (await readFile(archivePath(config), "utf8").catch(() => "")).split("\n").filter(Boolean).slice(-Math.max(1, Math.min(limit, 500))).map((line) => JSON.parse(line)).reverse();
|
|
28
71
|
}
|
|
29
72
|
//#endregion
|
|
30
|
-
export { appendComposioTriggerEvent, listComposioTriggerEvents };
|
|
73
|
+
export { appendComposioTriggerEvent, applyComposioConnectionLifecycleEvent, listComposioTriggerEvents, normalizeComposioTriggerPayload, verifyComposioWebhook };
|
|
31
74
|
|
|
32
75
|
//# sourceMappingURL=composio-triggers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composio-triggers.js","names":[],"sources":["../../../src/connectors/composio-triggers.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport { mkdir, appendFile, readFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\n\nimport type { Config } from '../config/schema.js';\nimport { getWorkspacePath } from '../config/workspace-path-helpers.js';\n\nexport type ComposioTriggerArchiveEntry = {\n at: string;\n id: string;\n toolkit?: string;\n trigger?: string;\n payload: unknown;\n};\n\nfunction archivePath(config: Config): string {\n const workspace = getWorkspacePath(config) || './workspace';\n return join(workspace, 'state', 'connectors', 'composio-triggers.jsonl');\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nexport
|
|
1
|
+
{"version":3,"file":"composio-triggers.js","names":[],"sources":["../../../src/connectors/composio-triggers.ts"],"sourcesContent":["import crypto, { createHmac, timingSafeEqual } from 'node:crypto';\nimport { mkdir, appendFile, readFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\n\nimport type { Config } from '../config/schema.js';\nimport { getWorkspacePath } from '../config/workspace-path-helpers.js';\nimport { listConnectorConnections, upsertConnectorConnection } from '../storage/sqlite/connector-repository.js';\n\nexport type ComposioTriggerArchiveEntry = {\n at: string;\n id: string;\n toolkit?: string;\n trigger?: string;\n payload: unknown;\n};\n\nfunction archivePath(config: Config): string {\n const workspace = getWorkspacePath(config) || './workspace';\n return join(workspace, 'state', 'connectors', 'composio-triggers.jsonl');\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nexport function verifyComposioWebhook(input: {\n body: string;\n webhookId: string;\n webhookTimestamp: string;\n signature: string;\n secret: string;\n nowMs?: number;\n toleranceSeconds?: number;\n}): unknown {\n if (!input.secret || !input.webhookId || !input.webhookTimestamp || !input.signature) {\n throw new Error('Missing Composio webhook signature fields.');\n }\n const timestampMs = Number(input.webhookTimestamp) * 1000;\n const toleranceMs = (input.toleranceSeconds ?? 300) * 1000;\n if (!Number.isFinite(timestampMs) || Math.abs((input.nowMs ?? Date.now()) - timestampMs) > toleranceMs) {\n throw new Error('Composio webhook timestamp is outside the allowed window.');\n }\n const expected = createHmac('sha256', input.secret)\n .update(`${input.webhookId}.${input.webhookTimestamp}.${input.body}`)\n .digest('base64');\n const received = input.signature.split(',').at(-1)?.trim() ?? '';\n const expectedBuffer = Buffer.from(expected);\n const receivedBuffer = Buffer.from(received);\n if (expectedBuffer.length !== receivedBuffer.length || !timingSafeEqual(expectedBuffer, receivedBuffer)) {\n throw new Error('Invalid Composio webhook signature.');\n }\n return JSON.parse(input.body) as unknown;\n}\n\nexport function normalizeComposioTriggerPayload(payload: unknown, webhookId?: string): {\n id: string;\n type: string;\n toolkit?: string;\n trigger?: string;\n data: Record<string, unknown>;\n} {\n const row = payload && typeof payload === 'object' && !Array.isArray(payload) ? payload as Record<string, unknown> : {};\n const metadata = row.metadata && typeof row.metadata === 'object' && !Array.isArray(row.metadata)\n ? row.metadata as Record<string, unknown>\n : {};\n const data = row.data && typeof row.data === 'object' && !Array.isArray(row.data)\n ? row.data as Record<string, unknown>\n : {};\n const toolkitRecord = metadata.toolkit && typeof metadata.toolkit === 'object' && !Array.isArray(metadata.toolkit)\n ? metadata.toolkit as Record<string, unknown>\n : {};\n return {\n id: webhookId ?? readString(row.id ?? row.eventId ?? row.event_id) ?? crypto.randomUUID(),\n type: readString(row.type) ?? 'composio.trigger.message',\n toolkit: readString(metadata.toolkit_slug ?? toolkitRecord.slug ?? row.toolkit ?? row.toolkit_slug),\n trigger: readString(metadata.trigger_slug ?? row.trigger ?? row.triggerName ?? row.trigger_name),\n data,\n };\n}\n\nexport function applyComposioConnectionLifecycleEvent(payload: unknown): void {\n const normalized = normalizeComposioTriggerPayload(payload);\n if (normalized.type !== 'composio.connected_account.expired' && normalized.type !== 'composio.connected_account.deleted') return;\n const providerConnectionId = readString(normalized.data.id ?? normalized.data.nanoid ?? normalized.data.connected_account_id);\n if (!providerConnectionId) return;\n const connection = listConnectorConnections().find((candidate) => (\n candidate.provider === 'composio' && candidate.providerConnectionId === providerConnectionId\n ));\n if (!connection) return;\n upsertConnectorConnection({\n ...connection,\n status: normalized.type.endsWith('.deleted') ? 'revoked' : 'expired',\n isDefault: false,\n lastError: normalized.type.endsWith('.deleted') ? 'Connection was removed in Composio.' : 'Connection expired and requires authorization.',\n });\n}\n\nexport async function appendComposioTriggerEvent(config: Config, payload: unknown): Promise<ComposioTriggerArchiveEntry> {\n const record = payload && typeof payload === 'object' && !Array.isArray(payload) ? payload as Record<string, unknown> : {};\n const normalized = normalizeComposioTriggerPayload(payload);\n const entry: ComposioTriggerArchiveEntry = {\n at: new Date().toISOString(),\n id: normalized.id,\n toolkit: normalized.toolkit ?? readString(record.appName ?? record.app_name),\n trigger: normalized.trigger ?? normalized.type,\n payload,\n };\n const path = archivePath(config);\n await mkdir(dirname(path), { recursive: true });\n const recent = await listComposioTriggerEvents(config, 500);\n const existing = recent.find((candidate) => candidate.id === entry.id);\n if (existing) return existing;\n await appendFile(path, `${JSON.stringify(entry)}\\n`, 'utf8');\n return entry;\n}\n\nexport async function listComposioTriggerEvents(config: Config, limit = 50): Promise<ComposioTriggerArchiveEntry[]> {\n const path = archivePath(config);\n const text = await readFile(path, 'utf8').catch(() => '');\n return text\n .split('\\n')\n .filter(Boolean)\n .slice(-Math.max(1, Math.min(limit, 500)))\n .map((line) => JSON.parse(line) as ComposioTriggerArchiveEntry)\n .reverse();\n}\n"],"mappings":"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"}
|