agor-live 0.23.1 → 0.23.2
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/dist/core/claude/index.cjs +51 -27
- package/dist/core/claude/index.js +51 -27
- package/dist/core/claude-cli/index.cjs +13 -0
- package/dist/core/claude-cli/index.js +13 -0
- package/dist/core/claude-cli/pricing.d.ts.map +1 -1
- package/dist/core/client/index.cjs +17 -0
- package/dist/core/client/index.js +16 -0
- package/dist/core/db/index.cjs +618 -421
- package/dist/core/db/index.js +550 -353
- package/dist/core/db/repositories/boards.d.ts +27 -0
- package/dist/core/db/repositories/boards.d.ts.map +1 -1
- package/dist/core/db/repositories/branches.d.ts +11 -1
- package/dist/core/db/repositories/branches.d.ts.map +1 -1
- package/dist/core/db/repositories/gateway-channels.d.ts +9 -0
- package/dist/core/db/repositories/gateway-channels.d.ts.map +1 -1
- package/dist/core/db/repositories/sessions.d.ts +7 -0
- package/dist/core/db/repositories/sessions.d.ts.map +1 -1
- package/dist/core/environment/render-snapshot.cjs +6 -2
- package/dist/core/environment/render-snapshot.d.ts +2 -0
- package/dist/core/environment/render-snapshot.d.ts.map +1 -1
- package/dist/core/environment/render-snapshot.js +6 -2
- package/dist/core/environment/variable-resolver.cjs +3 -1
- package/dist/core/environment/variable-resolver.js +3 -1
- package/dist/core/index.cjs +684 -486
- package/dist/core/index.js +684 -486
- package/dist/core/lib/feathers-validation.cjs +3 -0
- package/dist/core/lib/feathers-validation.d.ts +1 -0
- package/dist/core/lib/feathers-validation.d.ts.map +1 -1
- package/dist/core/lib/feathers-validation.js +3 -0
- package/dist/core/local-actions/index.cjs +123 -56
- package/dist/core/local-actions/index.js +121 -54
- package/dist/core/mcp/index.cjs +21 -3
- package/dist/core/mcp/index.d.ts +1 -1
- package/dist/core/mcp/index.d.ts.map +1 -1
- package/dist/core/mcp/index.js +18 -3
- package/dist/core/mcp/template-patterns.d.ts +15 -0
- package/dist/core/mcp/template-patterns.d.ts.map +1 -0
- package/dist/core/mcp/template-resolver.d.ts +13 -0
- package/dist/core/mcp/template-resolver.d.ts.map +1 -1
- package/dist/core/models/browser.cjs +6 -0
- package/dist/core/models/browser.js +6 -0
- package/dist/core/models/claude.d.ts.map +1 -1
- package/dist/core/models/index.cjs +6 -0
- package/dist/core/models/index.js +6 -0
- package/dist/core/seed/index.cjs +360 -216
- package/dist/core/seed/index.js +329 -185
- package/dist/core/templates/handlebars-helpers.cjs +3 -1
- package/dist/core/templates/handlebars-helpers.d.ts +5 -0
- package/dist/core/templates/handlebars-helpers.d.ts.map +1 -1
- package/dist/core/templates/handlebars-helpers.js +3 -1
- package/dist/core/tools/mcp/auth-secrets.cjs +3460 -3
- package/dist/core/tools/mcp/auth-secrets.d.ts.map +1 -1
- package/dist/core/tools/mcp/auth-secrets.js +3477 -3
- package/dist/core/tools/mcp/http-headers.cjs +17 -1
- package/dist/core/tools/mcp/http-headers.d.ts.map +1 -1
- package/dist/core/tools/mcp/http-headers.js +15 -1
- package/dist/core/tools/mcp/oauth-refresh.cjs +67 -43
- package/dist/core/tools/mcp/oauth-refresh.js +65 -41
- package/dist/core/types/board.d.ts +12 -0
- package/dist/core/types/board.d.ts.map +1 -1
- package/dist/core/types/gateway.d.ts +14 -0
- package/dist/core/types/gateway.d.ts.map +1 -1
- package/dist/core/types/index.cjs +17 -0
- package/dist/core/types/index.js +16 -0
- package/dist/core/unix/index.cjs +67 -0
- package/dist/core/unix/index.js +67 -0
- package/dist/daemon/auth/executor-runtime-scope.d.ts.map +1 -1
- package/dist/daemon/auth/executor-runtime-scope.js +19 -5
- package/dist/daemon/auth/executor-session-token.d.ts +15 -0
- package/dist/daemon/auth/executor-session-token.d.ts.map +1 -0
- package/dist/daemon/auth/executor-session-token.js +17 -0
- package/dist/daemon/auth/issue-browser-tokens-hook.d.ts +24 -0
- package/dist/daemon/auth/issue-browser-tokens-hook.d.ts.map +1 -0
- package/dist/daemon/auth/issue-browser-tokens-hook.js +95 -0
- package/dist/daemon/auth/service-jwt-strategy.d.ts.map +1 -1
- package/dist/daemon/auth/service-jwt-strategy.js +14 -2
- package/dist/daemon/declarations.d.ts +1 -0
- package/dist/daemon/declarations.d.ts.map +1 -1
- package/dist/daemon/index.js +1365 -418
- package/dist/daemon/main.js +1365 -418
- package/dist/daemon/mcp/server.js +294 -31
- package/dist/daemon/mcp/tools/analytics.js +73 -24
- package/dist/daemon/mcp/tools/artifacts.js +73 -24
- package/dist/daemon/mcp/tools/boards.js +73 -24
- package/dist/daemon/mcp/tools/branches.js +73 -24
- package/dist/daemon/mcp/tools/card-types.js +73 -24
- package/dist/daemon/mcp/tools/cards.js +73 -24
- package/dist/daemon/mcp/tools/environment.js +73 -24
- package/dist/daemon/mcp/tools/gateway-channels.d.ts.map +1 -1
- package/dist/daemon/mcp/tools/gateway-channels.js +190 -38
- package/dist/daemon/mcp/tools/knowledge.js +73 -24
- package/dist/daemon/mcp/tools/mcp-servers.js +73 -24
- package/dist/daemon/mcp/tools/messages.js +73 -24
- package/dist/daemon/mcp/tools/proxies.js +73 -24
- package/dist/daemon/mcp/tools/repos.js +73 -24
- package/dist/daemon/mcp/tools/schedules.js +73 -24
- package/dist/daemon/mcp/tools/search.js +73 -24
- package/dist/daemon/mcp/tools/sessions.js +73 -24
- package/dist/daemon/mcp/tools/tasks.js +73 -24
- package/dist/daemon/mcp/tools/users.js +76 -27
- package/dist/daemon/mcp/tools/widgets.d.ts.map +1 -1
- package/dist/daemon/mcp/tools/widgets.js +257 -99
- package/dist/daemon/oauth-auth-helpers.d.ts +35 -0
- package/dist/daemon/oauth-auth-helpers.d.ts.map +1 -0
- package/dist/daemon/oauth-auth-helpers.js +14 -0
- package/dist/daemon/register-hooks.d.ts +1 -0
- package/dist/daemon/register-hooks.d.ts.map +1 -1
- package/dist/daemon/register-hooks.js +304 -53
- package/dist/daemon/register-routes.d.ts.map +1 -1
- package/dist/daemon/register-routes.js +738 -288
- package/dist/daemon/register-services.d.ts.map +1 -1
- package/dist/daemon/register-services.js +386 -155
- package/dist/daemon/services/boards.d.ts +5 -0
- package/dist/daemon/services/boards.d.ts.map +1 -1
- package/dist/daemon/services/boards.js +7 -0
- package/dist/daemon/services/branches.d.ts.map +1 -1
- package/dist/daemon/services/branches.js +31 -2
- package/dist/daemon/services/claude-models.d.ts.map +1 -1
- package/dist/daemon/services/claude-models.js +4 -1
- package/dist/daemon/services/gateway.d.ts +15 -0
- package/dist/daemon/services/gateway.d.ts.map +1 -1
- package/dist/daemon/services/gateway.js +34 -0
- package/dist/daemon/services/health-monitor.d.ts.map +1 -1
- package/dist/daemon/services/health-monitor.js +10 -7
- package/dist/daemon/services/session-streams.d.ts +29 -0
- package/dist/daemon/services/session-streams.d.ts.map +1 -0
- package/dist/daemon/services/session-streams.js +84 -0
- package/dist/daemon/services/session-token-service.d.ts.map +1 -1
- package/dist/daemon/services/session-token-service.js +8 -4
- package/dist/daemon/setup/index.js +43 -11
- package/dist/daemon/setup/socketio.d.ts.map +1 -1
- package/dist/daemon/setup/socketio.js +43 -11
- package/dist/daemon/startup.d.ts.map +1 -1
- package/dist/daemon/startup.js +37 -16
- package/dist/daemon/utils/authorization.js +19 -5
- package/dist/daemon/utils/emit-service-event.d.ts +56 -0
- package/dist/daemon/utils/emit-service-event.d.ts.map +1 -0
- package/dist/daemon/utils/emit-service-event.js +23 -0
- package/dist/daemon/utils/mcp-header-secrets.d.ts +3 -5
- package/dist/daemon/utils/mcp-header-secrets.d.ts.map +1 -1
- package/dist/daemon/utils/mcp-header-secrets.js +31 -2
- package/dist/daemon/utils/realtime-access-cache.d.ts +9 -0
- package/dist/daemon/utils/realtime-access-cache.d.ts.map +1 -1
- package/dist/daemon/utils/realtime-access-cache.js +24 -0
- package/dist/daemon/utils/realtime-publish.d.ts +24 -0
- package/dist/daemon/utils/realtime-publish.d.ts.map +1 -1
- package/dist/daemon/utils/realtime-publish.js +120 -2
- package/dist/daemon/utils/session-queue-tenant-scope.d.ts +24 -0
- package/dist/daemon/utils/session-queue-tenant-scope.d.ts.map +1 -0
- package/dist/daemon/utils/session-queue-tenant-scope.js +133 -0
- package/dist/daemon/widgets/gateway-token/index.d.ts +114 -0
- package/dist/daemon/widgets/gateway-token/index.d.ts.map +1 -0
- package/dist/daemon/widgets/gateway-token/index.js +14711 -0
- package/dist/daemon/widgets/index.d.ts.map +1 -1
- package/dist/daemon/widgets/index.js +190 -16
- package/dist/daemon/widgets/registry.d.ts +7 -0
- package/dist/daemon/widgets/registry.d.ts.map +1 -1
- package/dist/daemon/widgets/submissions.js +12 -9
- package/dist/executor/commands/git.d.ts.map +1 -1
- package/dist/executor/commands/git.js +2 -0
- package/dist/executor/db/feathers-repositories.d.ts +19 -1
- package/dist/executor/db/feathers-repositories.d.ts.map +1 -1
- package/dist/executor/db/feathers-repositories.js +31 -1
- package/dist/executor/handlers/sdk/claude.d.ts.map +1 -1
- package/dist/executor/handlers/sdk/claude.js +1 -1
- package/dist/executor/handlers/sdk/codex.d.ts.map +1 -1
- package/dist/executor/handlers/sdk/codex.js +1 -1
- package/dist/executor/handlers/sdk/copilot.d.ts.map +1 -1
- package/dist/executor/handlers/sdk/copilot.js +1 -1
- package/dist/executor/handlers/sdk/cursor.d.ts.map +1 -1
- package/dist/executor/handlers/sdk/cursor.js +1 -0
- package/dist/executor/handlers/sdk/gemini.d.ts.map +1 -1
- package/dist/executor/handlers/sdk/gemini.js +1 -1
- package/dist/executor/handlers/sdk/opencode.d.ts.map +1 -1
- package/dist/executor/handlers/sdk/opencode.js +1 -1
- package/dist/executor/payload-types.d.ts +5 -5
- package/dist/executor/sdk-handlers/base/mcp-scoping.d.ts +8 -1
- package/dist/executor/sdk-handlers/base/mcp-scoping.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/base/mcp-scoping.js +58 -6
- package/dist/executor/sdk-handlers/claude/claude-tool.d.ts +2 -2
- package/dist/executor/sdk-handlers/claude/claude-tool.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/claude/claude-tool.js +2 -2
- package/dist/executor/sdk-handlers/claude/prompt-service.d.ts +13 -3
- package/dist/executor/sdk-handlers/claude/prompt-service.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/claude/prompt-service.js +16 -3
- package/dist/executor/sdk-handlers/claude/query-builder.d.ts +2 -1
- package/dist/executor/sdk-handlers/claude/query-builder.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/claude/query-builder.js +2 -1
- package/dist/executor/sdk-handlers/codex/codex-tool.d.ts +2 -2
- package/dist/executor/sdk-handlers/codex/codex-tool.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/codex/codex-tool.js +2 -2
- package/dist/executor/sdk-handlers/codex/prompt-service.d.ts +3 -2
- package/dist/executor/sdk-handlers/codex/prompt-service.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/codex/prompt-service.js +70 -6
- package/dist/executor/sdk-handlers/copilot/copilot-tool.d.ts +2 -2
- package/dist/executor/sdk-handlers/copilot/copilot-tool.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/copilot/copilot-tool.js +2 -2
- package/dist/executor/sdk-handlers/copilot/prompt-service.d.ts +3 -2
- package/dist/executor/sdk-handlers/copilot/prompt-service.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/copilot/prompt-service.js +4 -1
- package/dist/executor/sdk-handlers/gemini/gemini-tool.d.ts +2 -2
- package/dist/executor/sdk-handlers/gemini/gemini-tool.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/gemini/gemini-tool.js +2 -2
- package/dist/executor/sdk-handlers/gemini/prompt-service.d.ts +3 -2
- package/dist/executor/sdk-handlers/gemini/prompt-service.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/gemini/prompt-service.js +4 -1
- package/dist/executor/sdk-handlers/opencode/opencode-tool.d.ts +3 -2
- package/dist/executor/sdk-handlers/opencode/opencode-tool.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/opencode/opencode-tool.js +4 -1
- package/dist/executor/services/feathers-client.d.ts.map +1 -1
- package/dist/executor/services/feathers-client.js +119 -20
- package/dist/ui/assets/AgorEmojiPickerInner-leeNywMc.js +1 -0
- package/dist/ui/assets/App-Dpl4Cc0U.js +4 -0
- package/dist/ui/assets/App-Dpl4Cc0U.js.gz +0 -0
- package/dist/ui/assets/AppNode-wN3UZlFK.js +1 -0
- package/dist/ui/assets/AppNode-wN3UZlFK.js.gz +0 -0
- package/dist/ui/assets/{ArtifactConsentModal-oMMzRn8L.js → ArtifactConsentModal-DjzXcP_L.js} +1 -1
- package/dist/ui/assets/ArtifactConsentModal-DjzXcP_L.js.gz +0 -0
- package/dist/ui/assets/ArtifactFullscreenPage-B3b_EZ0F.js +9 -0
- package/dist/ui/assets/ArtifactFullscreenPage-B3b_EZ0F.js.gz +0 -0
- package/dist/ui/assets/ArtifactNode-DISy2T-6.js +9 -0
- package/dist/ui/assets/ArtifactNode-DISy2T-6.js.gz +0 -0
- package/dist/ui/assets/AutocompleteTextarea-DUpsoEGr.js +19 -0
- package/dist/ui/assets/AutocompleteTextarea-DUpsoEGr.js.gz +0 -0
- package/dist/ui/assets/BoardObjectNodes-BakeGpIX.js +34 -0
- package/dist/ui/assets/BoardObjectNodes-BakeGpIX.js.gz +0 -0
- package/dist/ui/assets/{CodeEditor.inner-Cuj6RuLL.js → CodeEditor.inner-HmSdTLW5.js} +1 -1
- package/dist/ui/assets/CodeEditor.inner-HmSdTLW5.js.gz +0 -0
- package/dist/ui/assets/ConversationView-mWaA-B1f.js +1 -0
- package/dist/ui/assets/ConversationView-mWaA-B1f.js.gz +0 -0
- package/dist/ui/assets/{EmbeddedTerminal-Lx5I9EOJ.js → EmbeddedTerminal-NNoyPA81.js} +1 -1
- package/dist/ui/assets/EmbeddedTerminal-NNoyPA81.js.gz +0 -0
- package/dist/ui/assets/KnowledgePage-CkxVnRvz.js +24 -0
- package/dist/ui/assets/KnowledgePage-CkxVnRvz.js.gz +0 -0
- package/dist/ui/assets/{MarketingScreenshotPage-CmDPBHOl.js → MarketingScreenshotPage-B86Gs8jx.js} +2 -2
- package/dist/ui/assets/MarketingScreenshotPage-B86Gs8jx.js.gz +0 -0
- package/dist/ui/assets/MobileApp-BPs-SXvz.js +1 -0
- package/dist/ui/assets/MobileApp-BPs-SXvz.js.gz +0 -0
- package/dist/ui/assets/SessionCanvas-xVfDoEtz.js +13 -0
- package/dist/ui/assets/SessionCanvas-xVfDoEtz.js.gz +0 -0
- package/dist/ui/assets/{StreamdownDemoPage-okKKR2QH.js → StreamdownDemoPage-CvWLzVsv.js} +2 -2
- package/dist/ui/assets/StreamdownDemoPage-CvWLzVsv.js.gz +0 -0
- package/dist/ui/assets/{TerminalModal-D9jMGZXv.js → TerminalModal-ExOgsuOP.js} +2 -2
- package/dist/ui/assets/TerminalModal-ExOgsuOP.js.gz +0 -0
- package/dist/ui/assets/ThemeSwitcher-Cgyp5ruu.js +1 -0
- package/dist/ui/assets/ThemeSwitcher-Cgyp5ruu.js.gz +0 -0
- package/dist/ui/assets/{ThemedSyntaxHighlighter.inner-C1FdIHn0.js → ThemedSyntaxHighlighter.inner-rpCN9S6K.js} +1 -1
- package/dist/ui/assets/{antd-DT5ackd0.js → antd-BCqimh1J.js} +5 -5
- package/dist/ui/assets/{antd-DT5ackd0.js.gz → antd-BCqimh1J.js.gz} +0 -0
- package/dist/ui/assets/architecture-U656AL7Q-BxSQIjrE.js +1 -0
- package/dist/ui/assets/{architectureDiagram-VXUJARFQ-DwTJGGoj.js → architectureDiagram-VXUJARFQ-pDpGHSqT.js} +1 -1
- package/dist/ui/assets/architectureDiagram-VXUJARFQ-pDpGHSqT.js.gz +0 -0
- package/dist/ui/assets/{blockDiagram-VD42YOAC-Dh1_TVW2.js → blockDiagram-VD42YOAC-uP8JTJpK.js} +1 -1
- package/dist/ui/assets/blockDiagram-VD42YOAC-uP8JTJpK.js.gz +0 -0
- package/dist/ui/assets/{c4Diagram-YG6GDRKO-B1e96AcB.js → c4Diagram-YG6GDRKO-qQe72Mm7.js} +1 -1
- package/dist/ui/assets/c4Diagram-YG6GDRKO-qQe72Mm7.js.gz +0 -0
- package/dist/ui/assets/channel-CoUBs6Zn.js +1 -0
- package/dist/ui/assets/{chunk-4BX2VUAB-BODpCjJx.js → chunk-4BX2VUAB-sz-YE8Nt.js} +1 -1
- package/dist/ui/assets/chunk-4ZMWKKQ3-3oKtfWXp.js +3 -0
- package/dist/ui/assets/chunk-4ZMWKKQ3-3oKtfWXp.js.gz +0 -0
- package/dist/ui/assets/chunk-55IACEB6-BS04dgKF.js +1 -0
- package/dist/ui/assets/{chunk-ABZYJK2D-DCTXWSzV.js → chunk-ABZYJK2D-t3Gkphds.js} +3 -3
- package/dist/ui/assets/chunk-ABZYJK2D-t3Gkphds.js.gz +0 -0
- package/dist/ui/assets/{chunk-AGHRB4JF-CbNphBjE.js → chunk-AGHRB4JF-D_QmWxbY.js} +1 -1
- package/dist/ui/assets/chunk-AGHRB4JF-D_QmWxbY.js.gz +0 -0
- package/dist/ui/assets/{chunk-ATLVNIR6-rWg3qxof.js → chunk-ATLVNIR6-Bmg7-Ufz.js} +1 -1
- package/dist/ui/assets/chunk-ATLVNIR6-Bmg7-Ufz.js.gz +0 -0
- package/dist/ui/assets/{chunk-B4BG7PRW-CgtLCbpE.js → chunk-B4BG7PRW-dnSEE1u-.js} +1 -1
- package/dist/ui/assets/chunk-B4BG7PRW-dnSEE1u-.js.gz +0 -0
- package/dist/ui/assets/{chunk-CVBHYZKI-DTL6Zgr0.js → chunk-CVBHYZKI-BStaYnF0.js} +1 -1
- package/dist/ui/assets/{chunk-DI55MBZ5-Dwvx2Kva.js → chunk-DI55MBZ5-28dvx6o3.js} +1 -1
- package/dist/ui/assets/chunk-DI55MBZ5-28dvx6o3.js.gz +0 -0
- package/dist/ui/assets/chunk-EXTU4WIE-X-FURkEh.js +1 -0
- package/dist/ui/assets/{chunk-FMBD7UC4-BogA_9CV.js → chunk-FMBD7UC4-C_63gC9S.js} +1 -1
- package/dist/ui/assets/{chunk-HN2XXSSU-2blQO3Gb.js → chunk-HN2XXSSU-UFD374KI.js} +1 -1
- package/dist/ui/assets/chunk-HN2XXSSU-UFD374KI.js.gz +0 -0
- package/dist/ui/assets/{chunk-JA3XYJ7Z-Cr1rmOui.js → chunk-JA3XYJ7Z-B60hLNeR.js} +1 -1
- package/dist/ui/assets/chunk-JA3XYJ7Z-B60hLNeR.js.gz +0 -0
- package/dist/ui/assets/{chunk-JZLCHNYA-BsgZ79Fa.js → chunk-JZLCHNYA-ButC6pwN.js} +1 -1
- package/dist/ui/assets/chunk-JZLCHNYA-ButC6pwN.js.gz +0 -0
- package/dist/ui/assets/{chunk-MI3HLSF2-dwYeUy5S.js → chunk-MI3HLSF2-BivYzoSV.js} +1 -1
- package/dist/ui/assets/chunk-MI3HLSF2-BivYzoSV.js.gz +0 -0
- package/dist/ui/assets/chunk-N4CR4FBY-mVWzo5wJ.js +2 -0
- package/dist/ui/assets/chunk-N4CR4FBY-mVWzo5wJ.js.gz +0 -0
- package/dist/ui/assets/{chunk-QN33PNHL-DxdIDCAa.js → chunk-QN33PNHL-tXtHZpaG.js} +1 -1
- package/dist/ui/assets/{chunk-QXUST7PY-BCK2V0i-.js → chunk-QXUST7PY-DATib_Vv.js} +1 -1
- package/dist/ui/assets/chunk-QXUST7PY-DATib_Vv.js.gz +0 -0
- package/dist/ui/assets/chunk-QZHKN3VN-y6l249e5.js +1 -0
- package/dist/ui/assets/{chunk-S3R3BYOJ-GP3zIxrB.js → chunk-S3R3BYOJ-BEtfmflI.js} +1 -1
- package/dist/ui/assets/chunk-S3R3BYOJ-BEtfmflI.js.gz +0 -0
- package/dist/ui/assets/{chunk-TZMSLE5B-dX5RaM6g.js → chunk-TZMSLE5B-BY1ZtogK.js} +1 -1
- package/dist/ui/assets/chunk-TZMSLE5B-BY1ZtogK.js.gz +0 -0
- package/dist/ui/assets/classDiagram-2ON5EDUG-BYvq-uPY.js +1 -0
- package/dist/ui/assets/classDiagram-v2-WZHVMYZB-BYvq-uPY.js +1 -0
- package/dist/ui/assets/constants-CYzQKfD1.js +1 -0
- package/dist/ui/assets/{cose-bilkent-S5V4N54A-Dx0BJVDl.js → cose-bilkent-S5V4N54A-DPvYrqGG.js} +1 -1
- package/dist/ui/assets/cose-bilkent-S5V4N54A-DPvYrqGG.js.gz +0 -0
- package/dist/ui/assets/{dagre-6UL2VRFP-DiQSUxqN.js → dagre-6UL2VRFP-D800J6qb.js} +1 -1
- package/dist/ui/assets/dagre-6UL2VRFP-D800J6qb.js.gz +0 -0
- package/dist/ui/assets/{dagre-Bekd9Vdj.js → dagre-TNc4wezg.js} +1 -1
- package/dist/ui/assets/dagre-TNc4wezg.js.gz +0 -0
- package/dist/ui/assets/{diagram-PSM6KHXK-DtJnDQjc.js → diagram-PSM6KHXK-CGdP9F-X.js} +1 -1
- package/dist/ui/assets/diagram-PSM6KHXK-CGdP9F-X.js.gz +0 -0
- package/dist/ui/assets/{diagram-QEK2KX5R-CobkCRdj.js → diagram-QEK2KX5R-BD5lOCe5.js} +1 -1
- package/dist/ui/assets/diagram-QEK2KX5R-BD5lOCe5.js.gz +0 -0
- package/dist/ui/assets/{diagram-S2PKOQOG-DHEZYivc.js → diagram-S2PKOQOG-cp3l22vN.js} +1 -1
- package/dist/ui/assets/diagram-S2PKOQOG-cp3l22vN.js.gz +0 -0
- package/dist/ui/assets/editor-Cr0W5BQI.js +39 -0
- package/dist/ui/assets/editor-Cr0W5BQI.js.gz +0 -0
- package/dist/ui/assets/{emoji-B0hLmSLZ.js → emoji-Bv3m24sO.js} +1 -1
- package/dist/ui/assets/emoji-Bv3m24sO.js.gz +0 -0
- package/dist/ui/assets/{erDiagram-Q2GNP2WA-BVNeTZPQ.js → erDiagram-Q2GNP2WA-CQSXRgqr.js} +1 -1
- package/dist/ui/assets/erDiagram-Q2GNP2WA-CQSXRgqr.js.gz +0 -0
- package/dist/ui/assets/{flowDiagram-NV44I4VS-C73VFdyk.js → flowDiagram-NV44I4VS-CKcKpkph.js} +1 -1
- package/dist/ui/assets/flowDiagram-NV44I4VS-CKcKpkph.js.gz +0 -0
- package/dist/ui/assets/{ganttDiagram-LVOFAZNH-B_RosuD1.js → ganttDiagram-LVOFAZNH-DlAHzXO5.js} +1 -1
- package/dist/ui/assets/ganttDiagram-LVOFAZNH-DlAHzXO5.js.gz +0 -0
- package/dist/ui/assets/{gitGraph-F6HP7TQM-DMFIqn4h.js → gitGraph-F6HP7TQM-DeuXy4B1.js} +1 -1
- package/dist/ui/assets/{gitGraphDiagram-NY62KEGX-hxbgwNA1.js → gitGraphDiagram-NY62KEGX-aB-AI4Vq.js} +1 -1
- package/dist/ui/assets/gitGraphDiagram-NY62KEGX-aB-AI4Vq.js.gz +0 -0
- package/dist/ui/assets/index-B-qHc0o5.js +63 -0
- package/dist/ui/assets/index-B-qHc0o5.js.gz +0 -0
- package/dist/ui/assets/{info-NVLQJR56-DZ3K-w48.js → info-NVLQJR56-B9PG7xsc.js} +1 -1
- package/dist/ui/assets/{infoDiagram-ER5ION4S-CxnBJQu6.js → infoDiagram-ER5ION4S-C5Wpoqim.js} +1 -1
- package/dist/ui/assets/{journeyDiagram-XKPGCS4Q-CHYNj-f8.js → journeyDiagram-XKPGCS4Q-CHLziqfS.js} +1 -1
- package/dist/ui/assets/journeyDiagram-XKPGCS4Q-CHLziqfS.js.gz +0 -0
- package/dist/ui/assets/{kanban-definition-3W4ZIXB7-DQPCCsj2.js → kanban-definition-3W4ZIXB7-Dq7GzQE_.js} +1 -1
- package/dist/ui/assets/kanban-definition-3W4ZIXB7-Dq7GzQE_.js.gz +0 -0
- package/dist/ui/assets/{line-DBRjKmfa.js → line-DHKNg83I.js} +1 -1
- package/dist/ui/assets/{linear-DFao5Wyp.js → linear-BvUfn0I8.js} +1 -1
- package/dist/ui/assets/linear-BvUfn0I8.js.gz +0 -0
- package/dist/ui/assets/{mermaid-parser.core-DYCfacHj.js → mermaid-parser.core-C6d9tKoo.js} +2 -2
- package/dist/ui/assets/mermaid-parser.core-C6d9tKoo.js.gz +0 -0
- package/dist/ui/assets/{mermaid.core-C6xGFSdE.js → mermaid.core-CxE5KezR.js} +3 -3
- package/dist/ui/assets/mermaid.core-CxE5KezR.js.gz +0 -0
- package/dist/ui/assets/{mindmap-definition-VGOIOE7T-L3Pw-YM7.js → mindmap-definition-VGOIOE7T-DmPoQ48w.js} +1 -1
- package/dist/ui/assets/mindmap-definition-VGOIOE7T-DmPoQ48w.js.gz +0 -0
- package/dist/ui/assets/{packet-BFZMPI3H-CpL6iNoa.js → packet-BFZMPI3H-JZEkVZxU.js} +1 -1
- package/dist/ui/assets/{particles-CT8hcJOA.js → particles-CxMmUw86.js} +1 -1
- package/dist/ui/assets/particles-CxMmUw86.js.gz +0 -0
- package/dist/ui/assets/{pie-7BOR55EZ-hTqChbTo.js → pie-7BOR55EZ-_1II5pYQ.js} +1 -1
- package/dist/ui/assets/{pieDiagram-ADFJNKIX-Bf4Nou75.js → pieDiagram-ADFJNKIX-DrNkH33i.js} +1 -1
- package/dist/ui/assets/pieDiagram-ADFJNKIX-DrNkH33i.js.gz +0 -0
- package/dist/ui/assets/{quadrantDiagram-AYHSOK5B-DpjUTLB1.js → quadrantDiagram-AYHSOK5B-DOpC-HEF.js} +1 -1
- package/dist/ui/assets/quadrantDiagram-AYHSOK5B-DOpC-HEF.js.gz +0 -0
- package/dist/ui/assets/{radar-NHE76QYJ-myy7OENC.js → radar-NHE76QYJ-DDmqhzEZ.js} +1 -1
- package/dist/ui/assets/{reactflow-Cubtnk8i.js → reactflow-D98uPOMq.js} +1 -1
- package/dist/ui/assets/reactflow-D98uPOMq.js.gz +0 -0
- package/dist/ui/assets/{requirementDiagram-UZGBJVZJ-Bfrfh-0-.js → requirementDiagram-UZGBJVZJ-Bzx0iEPP.js} +1 -1
- package/dist/ui/assets/requirementDiagram-UZGBJVZJ-Bzx0iEPP.js.gz +0 -0
- package/dist/ui/assets/{sandpack-C58bwfIS.js → sandpack-059Z4UWP.js} +1 -1
- package/dist/ui/assets/sandpack-059Z4UWP.js.gz +0 -0
- package/dist/ui/assets/sandpackDefaults-CPMNDsw7.js +1 -0
- package/dist/ui/assets/sandpackDefaults-CPMNDsw7.js.gz +0 -0
- package/dist/ui/assets/{sankeyDiagram-TZEHDZUN-ClZAZ6va.js → sankeyDiagram-TZEHDZUN-Do9pvfDv.js} +1 -1
- package/dist/ui/assets/sankeyDiagram-TZEHDZUN-Do9pvfDv.js.gz +0 -0
- package/dist/ui/assets/{sequenceDiagram-WL72ISMW-CNgly63p.js → sequenceDiagram-WL72ISMW-CN8neUTA.js} +1 -1
- package/dist/ui/assets/sequenceDiagram-WL72ISMW-CN8neUTA.js.gz +0 -0
- package/dist/ui/assets/{src-DAeyG22O.js → src-DEbsv3pp.js} +2 -2
- package/dist/ui/assets/src-DEbsv3pp.js.gz +0 -0
- package/dist/ui/assets/{stateDiagram-FKZM4ZOC-BrEAoDpE.js → stateDiagram-FKZM4ZOC-BluWJi8n.js} +1 -1
- package/dist/ui/assets/stateDiagram-FKZM4ZOC-BluWJi8n.js.gz +0 -0
- package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-DeyqBMDR.js +1 -0
- package/dist/ui/assets/{streamdown-BdAVfkeF.js → streamdown-BT1twtFc.js} +5 -5
- package/dist/ui/assets/streamdown-BT1twtFc.js.gz +0 -0
- package/dist/ui/assets/{syntax-BOfTnQiy.js → syntax-CBu6nLfm.js} +1 -1
- package/dist/ui/assets/syntax-CBu6nLfm.js.gz +0 -0
- package/dist/ui/assets/{timeline-definition-IT6M3QCI-CaRH3k4l.js → timeline-definition-IT6M3QCI-WdUNkiRj.js} +1 -1
- package/dist/ui/assets/timeline-definition-IT6M3QCI-WdUNkiRj.js.gz +0 -0
- package/dist/ui/assets/{treemap-KMMF4GRG-CUaLOV_B.js → treemap-KMMF4GRG-CoriU4Jl.js} +1 -1
- package/dist/ui/assets/{useUserLocalStorage-C8sgXgXR.js → useUserLocalStorage-GidNiOPC.js} +1 -1
- package/dist/ui/assets/useUserLocalStorage-GidNiOPC.js.gz +0 -0
- package/dist/ui/assets/{xychartDiagram-PRI3JC2R-BlhkI9T_.js → xychartDiagram-PRI3JC2R-CgBAKNt2.js} +1 -1
- package/dist/ui/assets/xychartDiagram-PRI3JC2R-CgBAKNt2.js.gz +0 -0
- package/dist/ui/index.html +9 -8
- package/dist/ui/index.html.gz +0 -0
- package/package.json +2 -2
- package/dist/ui/assets/AgorEmojiPickerInner-DQjr8M3_.js +0 -1
- package/dist/ui/assets/App-hJtcOxHv.js +0 -5
- package/dist/ui/assets/App-hJtcOxHv.js.gz +0 -0
- package/dist/ui/assets/AppNode-BhuMpn8O.js +0 -1
- package/dist/ui/assets/AppNode-BhuMpn8O.js.gz +0 -0
- package/dist/ui/assets/ArtifactConsentModal-oMMzRn8L.js.gz +0 -0
- package/dist/ui/assets/ArtifactFullscreenPage-B3wT8t8f.js +0 -9
- package/dist/ui/assets/ArtifactFullscreenPage-B3wT8t8f.js.gz +0 -0
- package/dist/ui/assets/ArtifactNode-BzQcrwFS.js +0 -9
- package/dist/ui/assets/ArtifactNode-BzQcrwFS.js.gz +0 -0
- package/dist/ui/assets/AutocompleteTextarea-Dau-V_30.js +0 -19
- package/dist/ui/assets/AutocompleteTextarea-Dau-V_30.js.gz +0 -0
- package/dist/ui/assets/BoardObjectNodes-DdKWv_ZT.js +0 -34
- package/dist/ui/assets/BoardObjectNodes-DdKWv_ZT.js.gz +0 -0
- package/dist/ui/assets/CodeEditor.inner-Cuj6RuLL.js.gz +0 -0
- package/dist/ui/assets/ConversationView-9-3ma1u-.js +0 -1
- package/dist/ui/assets/ConversationView-9-3ma1u-.js.gz +0 -0
- package/dist/ui/assets/EmbeddedTerminal-Lx5I9EOJ.js.gz +0 -0
- package/dist/ui/assets/KnowledgePage-Dz8YAMYC.js +0 -24
- package/dist/ui/assets/KnowledgePage-Dz8YAMYC.js.gz +0 -0
- package/dist/ui/assets/MarketingScreenshotPage-CmDPBHOl.js.gz +0 -0
- package/dist/ui/assets/MobileApp-BpgSG_gz.js +0 -1
- package/dist/ui/assets/MobileApp-BpgSG_gz.js.gz +0 -0
- package/dist/ui/assets/SessionCanvas-B6_mtlxK.js +0 -13
- package/dist/ui/assets/SessionCanvas-B6_mtlxK.js.gz +0 -0
- package/dist/ui/assets/StreamdownDemoPage-okKKR2QH.js.gz +0 -0
- package/dist/ui/assets/TerminalModal-D9jMGZXv.js.gz +0 -0
- package/dist/ui/assets/ThemeSwitcher-D9HgT37l.js +0 -1
- package/dist/ui/assets/ThemeSwitcher-D9HgT37l.js.gz +0 -0
- package/dist/ui/assets/architecture-U656AL7Q-DMnxkQRZ.js +0 -1
- package/dist/ui/assets/architectureDiagram-VXUJARFQ-DwTJGGoj.js.gz +0 -0
- package/dist/ui/assets/blockDiagram-VD42YOAC-Dh1_TVW2.js.gz +0 -0
- package/dist/ui/assets/c4Diagram-YG6GDRKO-B1e96AcB.js.gz +0 -0
- package/dist/ui/assets/channel-Jv4dT4S5.js +0 -1
- package/dist/ui/assets/chunk-55IACEB6-lJXvUquf.js +0 -1
- package/dist/ui/assets/chunk-ABZYJK2D-DCTXWSzV.js.gz +0 -0
- package/dist/ui/assets/chunk-AGHRB4JF-CbNphBjE.js.gz +0 -0
- package/dist/ui/assets/chunk-ATLVNIR6-rWg3qxof.js.gz +0 -0
- package/dist/ui/assets/chunk-B4BG7PRW-CgtLCbpE.js.gz +0 -0
- package/dist/ui/assets/chunk-DI55MBZ5-Dwvx2Kva.js.gz +0 -0
- package/dist/ui/assets/chunk-EXTU4WIE-DHyaqTsP.js +0 -1
- package/dist/ui/assets/chunk-HN2XXSSU-2blQO3Gb.js.gz +0 -0
- package/dist/ui/assets/chunk-JA3XYJ7Z-Cr1rmOui.js.gz +0 -0
- package/dist/ui/assets/chunk-JZLCHNYA-BsgZ79Fa.js.gz +0 -0
- package/dist/ui/assets/chunk-MI3HLSF2-dwYeUy5S.js.gz +0 -0
- package/dist/ui/assets/chunk-N4CR4FBY-DEMgSRVe.js +0 -2
- package/dist/ui/assets/chunk-N4CR4FBY-DEMgSRVe.js.gz +0 -0
- package/dist/ui/assets/chunk-QXUST7PY-BCK2V0i-.js.gz +0 -0
- package/dist/ui/assets/chunk-QZHKN3VN-CALjGrEE.js +0 -1
- package/dist/ui/assets/chunk-S3R3BYOJ-GP3zIxrB.js.gz +0 -0
- package/dist/ui/assets/chunk-TZMSLE5B-dX5RaM6g.js.gz +0 -0
- package/dist/ui/assets/classDiagram-2ON5EDUG-C3_RVP70.js +0 -1
- package/dist/ui/assets/classDiagram-v2-WZHVMYZB-C3_RVP70.js +0 -1
- package/dist/ui/assets/constants-GjIDNVyt.js +0 -1
- package/dist/ui/assets/cose-bilkent-S5V4N54A-Dx0BJVDl.js.gz +0 -0
- package/dist/ui/assets/dagre-6UL2VRFP-DiQSUxqN.js.gz +0 -0
- package/dist/ui/assets/dagre-Bekd9Vdj.js.gz +0 -0
- package/dist/ui/assets/diagram-PSM6KHXK-DtJnDQjc.js.gz +0 -0
- package/dist/ui/assets/diagram-QEK2KX5R-CobkCRdj.js.gz +0 -0
- package/dist/ui/assets/diagram-S2PKOQOG-DHEZYivc.js.gz +0 -0
- package/dist/ui/assets/editor-DQIG-JYZ.js +0 -43
- package/dist/ui/assets/editor-DQIG-JYZ.js.gz +0 -0
- package/dist/ui/assets/emoji-B0hLmSLZ.js.gz +0 -0
- package/dist/ui/assets/erDiagram-Q2GNP2WA-BVNeTZPQ.js.gz +0 -0
- package/dist/ui/assets/flowDiagram-NV44I4VS-C73VFdyk.js.gz +0 -0
- package/dist/ui/assets/ganttDiagram-LVOFAZNH-B_RosuD1.js.gz +0 -0
- package/dist/ui/assets/gitGraphDiagram-NY62KEGX-hxbgwNA1.js.gz +0 -0
- package/dist/ui/assets/index-DTz1Dif6.js +0 -64
- package/dist/ui/assets/index-DTz1Dif6.js.gz +0 -0
- package/dist/ui/assets/journeyDiagram-XKPGCS4Q-CHYNj-f8.js.gz +0 -0
- package/dist/ui/assets/kanban-definition-3W4ZIXB7-DQPCCsj2.js.gz +0 -0
- package/dist/ui/assets/linear-DFao5Wyp.js.gz +0 -0
- package/dist/ui/assets/mermaid-parser.core-DYCfacHj.js.gz +0 -0
- package/dist/ui/assets/mermaid.core-C6xGFSdE.js.gz +0 -0
- package/dist/ui/assets/mindmap-definition-VGOIOE7T-L3Pw-YM7.js.gz +0 -0
- package/dist/ui/assets/particles-CT8hcJOA.js.gz +0 -0
- package/dist/ui/assets/pieDiagram-ADFJNKIX-Bf4Nou75.js.gz +0 -0
- package/dist/ui/assets/quadrantDiagram-AYHSOK5B-DpjUTLB1.js.gz +0 -0
- package/dist/ui/assets/reactflow-Cubtnk8i.js.gz +0 -0
- package/dist/ui/assets/requirementDiagram-UZGBJVZJ-Bfrfh-0-.js.gz +0 -0
- package/dist/ui/assets/sandpack-C58bwfIS.js.gz +0 -0
- package/dist/ui/assets/sandpackDefaults-Bkga8XAE.js +0 -1
- package/dist/ui/assets/sankeyDiagram-TZEHDZUN-ClZAZ6va.js.gz +0 -0
- package/dist/ui/assets/sequenceDiagram-WL72ISMW-CNgly63p.js.gz +0 -0
- package/dist/ui/assets/src-DAeyG22O.js.gz +0 -0
- package/dist/ui/assets/stateDiagram-FKZM4ZOC-BrEAoDpE.js.gz +0 -0
- package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-BNL52_oN.js +0 -1
- package/dist/ui/assets/streamdown-BdAVfkeF.js.gz +0 -0
- package/dist/ui/assets/syntax-BOfTnQiy.js.gz +0 -0
- package/dist/ui/assets/timeline-definition-IT6M3QCI-CaRH3k4l.js.gz +0 -0
- package/dist/ui/assets/useUserLocalStorage-C8sgXgXR.js.gz +0 -0
- package/dist/ui/assets/xychartDiagram-PRI3JC2R-BlhkI9T_.js.gz +0 -0
|
@@ -72,13 +72,17 @@ import {
|
|
|
72
72
|
ThreadSessionMapRepository
|
|
73
73
|
} from "@agor/core/db";
|
|
74
74
|
import {
|
|
75
|
-
|
|
75
|
+
buildSlackManifest,
|
|
76
|
+
getConnector,
|
|
77
|
+
requiredBotEvents,
|
|
78
|
+
requiredBotScopes
|
|
76
79
|
} from "@agor/core/gateway";
|
|
77
80
|
import {
|
|
78
81
|
GATEWAY_REDACTED_SENTINEL,
|
|
79
|
-
GATEWAY_SENSITIVE_CONFIG_FIELDS,
|
|
80
|
-
|
|
81
|
-
|
|
82
|
+
GATEWAY_SENSITIVE_CONFIG_FIELDS as GATEWAY_SENSITIVE_CONFIG_FIELDS2,
|
|
83
|
+
getRequiredSecretFields as getRequiredSecretFields2,
|
|
84
|
+
hasMinimumRole as hasMinimumRole5,
|
|
85
|
+
ROLES as ROLES6
|
|
82
86
|
} from "@agor/core/types";
|
|
83
87
|
|
|
84
88
|
// ../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
|
|
@@ -15312,7 +15316,7 @@ var modelConfigInputSchema = external_exports.union([
|
|
|
15312
15316
|
import { ROLES as ROLES3 } from "@agor/core/types";
|
|
15313
15317
|
|
|
15314
15318
|
// src/mcp/tools/widgets.ts
|
|
15315
|
-
import { MessageRole as MessageRole2 } from "@agor/core/types";
|
|
15319
|
+
import { getRequiredSecretFields, hasMinimumRole as hasMinimumRole4, MessageRole as MessageRole2, ROLES as ROLES5 } from "@agor/core/types";
|
|
15316
15320
|
|
|
15317
15321
|
// src/utils/append-system-message.ts
|
|
15318
15322
|
import { generateId as generateId2, SessionRepository as SessionRepository2 } from "@agor/core/db";
|
|
@@ -15395,6 +15399,30 @@ var envVarsSubmitSchema = external_exports.object({
|
|
|
15395
15399
|
}
|
|
15396
15400
|
});
|
|
15397
15401
|
|
|
15402
|
+
// src/widgets/gateway-token/index.ts
|
|
15403
|
+
import { Forbidden as Forbidden2 } from "@agor/core/feathers";
|
|
15404
|
+
import {
|
|
15405
|
+
GATEWAY_SENSITIVE_CONFIG_FIELDS,
|
|
15406
|
+
hasMinimumRole as hasMinimumRole3,
|
|
15407
|
+
ROLES as ROLES4
|
|
15408
|
+
} from "@agor/core/types";
|
|
15409
|
+
var MAX_TOKEN_LENGTH = 8192;
|
|
15410
|
+
var gatewayTokenParamsSchema = external_exports.object({
|
|
15411
|
+
gatewayChannelId: external_exports.string().min(1).describe("Gateway channel whose credentials are being set."),
|
|
15412
|
+
channelType: external_exports.enum(["slack", "discord", "whatsapp", "telegram", "github", "teams"]).describe("Platform type of the channel; drives per-field placeholders."),
|
|
15413
|
+
channelName: external_exports.string().min(1).max(200).describe("Human-readable channel name for the form heading and prompts."),
|
|
15414
|
+
fields: external_exports.array(external_exports.enum(GATEWAY_SENSITIVE_CONFIG_FIELDS)).min(1).max(GATEWAY_SENSITIVE_CONFIG_FIELDS.length).refine((fields) => new Set(fields).size === fields.length, {
|
|
15415
|
+
message: "Token field names must be unique"
|
|
15416
|
+
}).describe("Secret config field names to collect (subset of the sensitive fields)."),
|
|
15417
|
+
reason: external_exports.string().min(1).max(200).describe("One sentence explaining why the tokens are needed. Renders as a muted line.")
|
|
15418
|
+
}).strict();
|
|
15419
|
+
var gatewayTokenSubmitSchema = external_exports.object({
|
|
15420
|
+
tokens: external_exports.partialRecord(
|
|
15421
|
+
external_exports.enum(GATEWAY_SENSITIVE_CONFIG_FIELDS),
|
|
15422
|
+
external_exports.string().min(1).max(MAX_TOKEN_LENGTH)
|
|
15423
|
+
).describe("Map of sensitive field name \u2192 credential value.")
|
|
15424
|
+
}).strict();
|
|
15425
|
+
|
|
15398
15426
|
// src/mcp/server.ts
|
|
15399
15427
|
var DEBUG_MCP_REQUESTS = process.env.AGOR_DEBUG_MCP_REQUESTS === "1" || process.env.DEBUG?.includes("mcp-requests");
|
|
15400
15428
|
function textResult(data) {
|
|
@@ -15431,12 +15459,25 @@ Discover tools: search domains/summaries \u2192 get details for one tool \u2192
|
|
|
15431
15459
|
|
|
15432
15460
|
// src/mcp/tools/gateway-channels.ts
|
|
15433
15461
|
function requireAdmin(ctx, action) {
|
|
15434
|
-
if (!
|
|
15462
|
+
if (!hasMinimumRole5(ctx.authenticatedUser?.role, ROLES6.ADMIN)) {
|
|
15435
15463
|
throw new Error(`Access denied: admin role required to ${action}`);
|
|
15436
15464
|
}
|
|
15437
15465
|
}
|
|
15466
|
+
async function resolveCallerSessionBranchId(ctx) {
|
|
15467
|
+
if (!ctx.sessionId) return null;
|
|
15468
|
+
const session = await new SessionRepository3(ctx.db).findById(ctx.sessionId);
|
|
15469
|
+
if (!session) {
|
|
15470
|
+
throw new Error("Gateway access denied: calling session not found");
|
|
15471
|
+
}
|
|
15472
|
+
return session.branch_id;
|
|
15473
|
+
}
|
|
15474
|
+
function sessionBranchReadDeniedError() {
|
|
15475
|
+
return new Error(
|
|
15476
|
+
"Gateway read denied: this Slack thread belongs to a gateway channel targeting a different branch than the calling session's. Sessions can read Slack thread history only through gateway channels whose target branch matches their own."
|
|
15477
|
+
);
|
|
15478
|
+
}
|
|
15438
15479
|
async function canUseGatewayOutbound(ctx, branchRepo, branch) {
|
|
15439
|
-
if (
|
|
15480
|
+
if (hasMinimumRole5(ctx.authenticatedUser?.role, ROLES6.ADMIN)) return true;
|
|
15440
15481
|
const userId = ctx.userId;
|
|
15441
15482
|
const isOwner = await branchRepo.isOwner(branch.branch_id, userId);
|
|
15442
15483
|
const effective = await branchRepo.resolveUserPermission(branch, userId);
|
|
@@ -15513,44 +15554,48 @@ var gatewayChannelCreateSchema = external_exports.strictObject({
|
|
|
15513
15554
|
agenticConfig: agenticConfigSchema.optional()
|
|
15514
15555
|
}).superRefine((value, issue2) => {
|
|
15515
15556
|
const config2 = value.config ?? {};
|
|
15516
|
-
if (value.
|
|
15517
|
-
|
|
15518
|
-
|
|
15519
|
-
|
|
15520
|
-
|
|
15521
|
-
|
|
15522
|
-
|
|
15523
|
-
|
|
15524
|
-
if (config2.connection_mode === "socket" && !config2.app_token) {
|
|
15525
|
-
issue2.addIssue({
|
|
15526
|
-
code: "custom",
|
|
15527
|
-
path: ["config", "app_token"],
|
|
15528
|
-
message: "config.app_token is required for Slack Socket Mode."
|
|
15529
|
-
});
|
|
15530
|
-
}
|
|
15531
|
-
}
|
|
15532
|
-
if (value.channelType === "github") {
|
|
15533
|
-
for (const field of ["app_id", "private_key", "installation_id", "watch_repos"]) {
|
|
15557
|
+
if (value.enabled !== false) {
|
|
15558
|
+
const requiredSecretMessages = {
|
|
15559
|
+
bot_token: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible.",
|
|
15560
|
+
app_token: "config.app_token is required for Slack Socket Mode.",
|
|
15561
|
+
private_key: "config.private_key is required for GitHub gateway channels.",
|
|
15562
|
+
app_password: "config.app_password is required for Teams gateway channels."
|
|
15563
|
+
};
|
|
15564
|
+
for (const field of getRequiredSecretFields2(value.channelType, config2)) {
|
|
15534
15565
|
if (!config2[field]) {
|
|
15535
15566
|
issue2.addIssue({
|
|
15536
15567
|
code: "custom",
|
|
15537
15568
|
path: ["config", field],
|
|
15538
|
-
message: `config.${field} is required for
|
|
15569
|
+
message: requiredSecretMessages[field] ?? `config.${field} is required for ${value.channelType} gateway channels.`
|
|
15539
15570
|
});
|
|
15540
15571
|
}
|
|
15541
15572
|
}
|
|
15542
15573
|
}
|
|
15543
|
-
if (value.channelType === "
|
|
15544
|
-
for (const field of ["app_id", "
|
|
15574
|
+
if (value.channelType === "github") {
|
|
15575
|
+
for (const field of ["app_id", "installation_id", "watch_repos"]) {
|
|
15545
15576
|
if (!config2[field]) {
|
|
15546
15577
|
issue2.addIssue({
|
|
15547
15578
|
code: "custom",
|
|
15548
15579
|
path: ["config", field],
|
|
15549
|
-
message: `config.${field} is required for
|
|
15580
|
+
message: `config.${field} is required for GitHub gateway channels.`
|
|
15550
15581
|
});
|
|
15551
15582
|
}
|
|
15552
15583
|
}
|
|
15553
15584
|
}
|
|
15585
|
+
if (value.channelType === "teams" && !config2.app_id) {
|
|
15586
|
+
issue2.addIssue({
|
|
15587
|
+
code: "custom",
|
|
15588
|
+
path: ["config", "app_id"],
|
|
15589
|
+
message: "config.app_id is required for Teams gateway channels."
|
|
15590
|
+
});
|
|
15591
|
+
}
|
|
15592
|
+
if (value.channelType === "slack" && config2.align_slack_users !== true && !value.agorUserId) {
|
|
15593
|
+
issue2.addIssue({
|
|
15594
|
+
code: "custom",
|
|
15595
|
+
path: ["agorUserId"],
|
|
15596
|
+
message: "Run-as-selected-user needs agorUserId \u2014 set config.align_slack_users:true to align by email, or pass agorUserId."
|
|
15597
|
+
});
|
|
15598
|
+
}
|
|
15554
15599
|
});
|
|
15555
15600
|
var slackThreadHistorySchema = external_exports.strictObject({
|
|
15556
15601
|
sessionId: mcpOptionalId(
|
|
@@ -15650,22 +15695,29 @@ async function requireBranchAllForGatewayHistory(ctx, branchRepo, branch) {
|
|
|
15650
15695
|
);
|
|
15651
15696
|
}
|
|
15652
15697
|
function isAdmin(ctx) {
|
|
15653
|
-
return
|
|
15698
|
+
return hasMinimumRole5(ctx.authenticatedUser?.role, ROLES6.ADMIN);
|
|
15654
15699
|
}
|
|
15655
15700
|
async function resolveSlackThreadHistoryTarget(ctx, args) {
|
|
15656
15701
|
const channelRepo = new GatewayChannelRepository(ctx.db);
|
|
15657
15702
|
const threadMapRepo = new ThreadSessionMapRepository(ctx.db);
|
|
15658
15703
|
const branchRepo = new BranchRepository6(ctx.db);
|
|
15704
|
+
const callerSessionBranchId = await resolveCallerSessionBranchId(ctx);
|
|
15659
15705
|
if (args.sessionId) {
|
|
15660
15706
|
const session = await ctx.app.service("sessions").get(args.sessionId, ctx.baseServiceParams);
|
|
15661
15707
|
const mapping2 = await threadMapRepo.findBySession(session.session_id);
|
|
15662
15708
|
if (!mapping2) {
|
|
15663
15709
|
throw new Error(`No gateway thread mapping found for session ${session.session_id}.`);
|
|
15664
15710
|
}
|
|
15711
|
+
if (callerSessionBranchId && mapping2.branch_id !== callerSessionBranchId) {
|
|
15712
|
+
throw sessionBranchReadDeniedError();
|
|
15713
|
+
}
|
|
15665
15714
|
const channel2 = await channelRepo.findById(mapping2.channel_id);
|
|
15666
15715
|
if (!channel2) {
|
|
15667
15716
|
throw new Error(`Gateway channel not found for session mapping ${mapping2.id}.`);
|
|
15668
15717
|
}
|
|
15718
|
+
if (callerSessionBranchId && channel2.target_branch_id !== callerSessionBranchId) {
|
|
15719
|
+
throw sessionBranchReadDeniedError();
|
|
15720
|
+
}
|
|
15669
15721
|
const branch2 = await branchRepo.findById(mapping2.branch_id);
|
|
15670
15722
|
return {
|
|
15671
15723
|
channel: channel2,
|
|
@@ -15680,6 +15732,9 @@ async function resolveSlackThreadHistoryTarget(ctx, args) {
|
|
|
15680
15732
|
if (!channel) {
|
|
15681
15733
|
throw new Error(`Gateway channel not found: ${args.gatewayChannelId}`);
|
|
15682
15734
|
}
|
|
15735
|
+
if (callerSessionBranchId && channel.target_branch_id !== callerSessionBranchId) {
|
|
15736
|
+
throw sessionBranchReadDeniedError();
|
|
15737
|
+
}
|
|
15683
15738
|
const mapping = await threadMapRepo.findByChannelAndThread(channel.id, args.threadId);
|
|
15684
15739
|
if (mapping) {
|
|
15685
15740
|
const branch2 = await branchRepo.findById(mapping.branch_id);
|
|
@@ -15731,7 +15786,7 @@ var gatewayChannelUpdateSchema = external_exports.strictObject({
|
|
|
15731
15786
|
});
|
|
15732
15787
|
function redactGatewayChannel(channel) {
|
|
15733
15788
|
const config2 = { ...channel.config ?? {} };
|
|
15734
|
-
for (const field of
|
|
15789
|
+
for (const field of GATEWAY_SENSITIVE_CONFIG_FIELDS2) {
|
|
15735
15790
|
if (config2[field]) config2[field] = GATEWAY_REDACTED_SENTINEL;
|
|
15736
15791
|
}
|
|
15737
15792
|
let agentic_config = channel.agentic_config;
|
|
@@ -15789,6 +15844,51 @@ function toServiceUpdateData(args) {
|
|
|
15789
15844
|
}
|
|
15790
15845
|
return updates;
|
|
15791
15846
|
}
|
|
15847
|
+
var slackManifestGenerateSchema = external_exports.strictObject({
|
|
15848
|
+
appName: mcpRequiredString("appName", 'Slack app display name, e.g. "Agor".'),
|
|
15849
|
+
botDisplayName: mcpOptionalNonEmptyString(
|
|
15850
|
+
"botDisplayName",
|
|
15851
|
+
"Bot user display name. Defaults to appName."
|
|
15852
|
+
),
|
|
15853
|
+
publicChannels: external_exports.boolean().default(false).describe("Listen in public channels (#channel) via @mention."),
|
|
15854
|
+
privateChannels: external_exports.boolean().default(false).describe("Listen in private channels (groups) via @mention."),
|
|
15855
|
+
groupDms: external_exports.boolean().default(false).describe("Listen in group DMs (multi-person IMs) via @mention."),
|
|
15856
|
+
alignUsers: external_exports.boolean().default(true).describe(
|
|
15857
|
+
"Resolve Slack user email \u2192 Agor user (adds the users:read.email scope). Defaults to true: each Slack user runs as their matched Agor account and unmatched users are rejected, so no fixed run-as user is needed. Set false to run every message as one fixed Agor user (then pass agorUserId to agor_gateway_channels_create)."
|
|
15858
|
+
),
|
|
15859
|
+
outbound: external_exports.boolean().default(false).describe("Proactive outbound: post to channels by name and DM users by email."),
|
|
15860
|
+
restrictToChannelIds: external_exports.array(external_exports.string().min(1)).optional().describe(
|
|
15861
|
+
"Slack channel ID whitelist. Maps to config.allowed_channel_ids when you call agor_gateway_channels_create; it does NOT change the manifest scopes or events."
|
|
15862
|
+
)
|
|
15863
|
+
});
|
|
15864
|
+
function toSlackWizardOptions(args) {
|
|
15865
|
+
return {
|
|
15866
|
+
appName: args.appName,
|
|
15867
|
+
...args.botDisplayName ? { botDisplayName: args.botDisplayName } : {},
|
|
15868
|
+
publicChannels: args.publicChannels,
|
|
15869
|
+
privateChannels: args.privateChannels,
|
|
15870
|
+
groupDms: args.groupDms,
|
|
15871
|
+
alignUsers: args.alignUsers,
|
|
15872
|
+
outbound: args.outbound
|
|
15873
|
+
};
|
|
15874
|
+
}
|
|
15875
|
+
function toCreateChannelConfigHint(args) {
|
|
15876
|
+
const config2 = {
|
|
15877
|
+
connection_mode: "socket",
|
|
15878
|
+
enable_channels: args.publicChannels,
|
|
15879
|
+
enable_groups: args.privateChannels,
|
|
15880
|
+
enable_mpim: args.groupDms,
|
|
15881
|
+
align_slack_users: args.alignUsers,
|
|
15882
|
+
outbound_enabled: args.outbound
|
|
15883
|
+
};
|
|
15884
|
+
if (args.restrictToChannelIds && args.restrictToChannelIds.length > 0) {
|
|
15885
|
+
config2.allowed_channel_ids = args.restrictToChannelIds;
|
|
15886
|
+
}
|
|
15887
|
+
return { channelType: "slack", config: config2 };
|
|
15888
|
+
}
|
|
15889
|
+
function identityModeSetupStep(alignUsers) {
|
|
15890
|
+
return alignUsers ? "Identity: the channel is set to align Slack users \u2014 each Slack user runs as their matched Agor account and unmatched users are rejected, so no run-as user is needed. Tell me if you would rather every message run as one fixed Agor user (that requires picking a user and passing agorUserId)." : "Identity: the channel is set to run every message as one fixed Agor user, which requires passing agorUserId to agor_gateway_channels_create. Tell me if you would rather align Slack users so each runs as their own matched Agor account instead.";
|
|
15891
|
+
}
|
|
15792
15892
|
function registerGatewayChannelTools(server, ctx) {
|
|
15793
15893
|
server.registerTool(
|
|
15794
15894
|
"agor_gateway_channels_list",
|
|
@@ -15834,7 +15934,7 @@ function registerGatewayChannelTools(server, ctx) {
|
|
|
15834
15934
|
server.registerTool(
|
|
15835
15935
|
"agor_gateway_channels_create",
|
|
15836
15936
|
{
|
|
15837
|
-
description: 'Create a gateway channel definition (admin-only) through the same gateway-channels service used by the UI. Current connectors: Slack, GitHub, Teams. Slack example config: { bot_token, app_token, connection_mode:"socket", enable_channels:true, require_mention:true, allowed_channel_ids:["C123"] }. Secrets are encrypted by the service and returned redacted
|
|
15937
|
+
description: 'Create a gateway channel definition (admin-only) through the same gateway-channels service used by the UI. Current connectors: Slack, GitHub, Teams. For interactive/agent-driven setup, create the channel disabled and without secrets (enabled:false, no tokens), then collect credentials with agor_widgets_request_gateway_token so the user enters them in a secure inline form \u2014 raw secrets passed in tool arguments leak into the MCP transcript. Passing secrets directly here is for programmatic/non-interactive use only. Non-interactive Slack example config: { bot_token, app_token, connection_mode:"socket", enable_channels:true, require_mention:true, allowed_channel_ids:["C123"] }. Secrets are encrypted by the service and returned redacted.',
|
|
15838
15938
|
annotations: { destructiveHint: false, idempotentHint: false },
|
|
15839
15939
|
inputSchema: gatewayChannelCreateSchema
|
|
15840
15940
|
},
|
|
@@ -15844,12 +15944,50 @@ function registerGatewayChannelTools(server, ctx) {
|
|
|
15844
15944
|
return textResult({
|
|
15845
15945
|
gateway_channel: redactGatewayChannel(created),
|
|
15846
15946
|
next_steps: [
|
|
15947
|
+
"If this channel was created disabled without tokens (the recommended interactive path), collect its credentials by calling agor_widgets_request_gateway_token for this channel so the user enters the tokens in the secure form that appears at the end of this message. Do NOT ask the user to paste xoxb-/xapp- tokens into the chat, and do NOT pass tokens as agor_gateway_channels_create arguments during interactive setup.",
|
|
15948
|
+
...created.channel_type === "slack" ? [
|
|
15949
|
+
identityModeSetupStep(
|
|
15950
|
+
created.config?.align_slack_users === true
|
|
15951
|
+
)
|
|
15952
|
+
] : [],
|
|
15847
15953
|
"Verify the channel in Settings > Gateway Channels or with agor_gateway_channels_list.",
|
|
15848
15954
|
"Channel credentials, env vars, and inbound channel keys are intentionally redacted from MCP responses."
|
|
15849
15955
|
]
|
|
15850
15956
|
});
|
|
15851
15957
|
}
|
|
15852
15958
|
);
|
|
15959
|
+
server.registerTool(
|
|
15960
|
+
"agor_gateway_slack_manifest_generate",
|
|
15961
|
+
{
|
|
15962
|
+
description: "Generate a ready-to-install Slack app manifest from desired gateway capabilities (admin-only). The agent-driven equivalent of the Slack setup wizard, backed by the same core generator. Returns the manifest JSON, the derived bot scopes/events, ordered setup steps, and the channel config to pass to agor_gateway_channels_create. This is pure: it creates no Slack app, no Agor channel, and validates no tokens.",
|
|
15963
|
+
annotations: { readOnlyHint: true },
|
|
15964
|
+
inputSchema: slackManifestGenerateSchema
|
|
15965
|
+
},
|
|
15966
|
+
async (args) => {
|
|
15967
|
+
requireAdmin(ctx, "generate Slack app manifests");
|
|
15968
|
+
const options = toSlackWizardOptions(args);
|
|
15969
|
+
return textResult({
|
|
15970
|
+
manifest: buildSlackManifest(options),
|
|
15971
|
+
bot_scopes: requiredBotScopes(options),
|
|
15972
|
+
bot_events: requiredBotEvents(options),
|
|
15973
|
+
setup_steps: [
|
|
15974
|
+
'Open https://api.slack.com/apps?new_app=1 and choose "Create New App".',
|
|
15975
|
+
'Select "From a manifest", pick the target workspace, paste the manifest JSON below, and click "Create".',
|
|
15976
|
+
'Install the app to the workspace, then open OAuth & Permissions and copy the Bot User OAuth Token (starts with "xoxb-").',
|
|
15977
|
+
'Open Basic Information \u2192 App-Level Tokens \u2192 Generate Token and Scopes, add the connections:write scope, generate it, and copy the App-Level Token (starts with "xapp-").',
|
|
15978
|
+
'Once the app is installed and you hold the xoxb-/xapp- tokens, call agor_gateway_channels_create with channelType "slack", enabled:false, no tokens, and create_channel_config_hint below to create the channel as a draft.',
|
|
15979
|
+
"Then call agor_widgets_request_gateway_token for that channel so the user enters the xoxb-/xapp- tokens in the secure form that appears at the end of this message, which enables the channel. Do NOT ask the user to paste xoxb-/xapp- tokens into the chat, and do NOT pass tokens as agor_gateway_channels_create arguments.",
|
|
15980
|
+
identityModeSetupStep(args.alignUsers)
|
|
15981
|
+
],
|
|
15982
|
+
create_channel_config_hint: toCreateChannelConfigHint(args),
|
|
15983
|
+
caveats: [
|
|
15984
|
+
"GENERATED ONLY \u2014 no Slack app created, no Agor channel created, no tokens validated, no event delivery verified.",
|
|
15985
|
+
"The app-level connections:write token is generated manually and is NOT part of the manifest bot scopes.",
|
|
15986
|
+
"restrictToChannelIds maps to config.allowed_channel_ids when you call create \u2014 it does NOT change the manifest scopes or events."
|
|
15987
|
+
]
|
|
15988
|
+
});
|
|
15989
|
+
}
|
|
15990
|
+
);
|
|
15853
15991
|
server.registerTool(
|
|
15854
15992
|
"agor_gateway_channels_update",
|
|
15855
15993
|
{
|
|
@@ -15873,7 +16011,7 @@ function registerGatewayChannelTools(server, ctx) {
|
|
|
15873
16011
|
server.registerTool(
|
|
15874
16012
|
"agor_gateway_outbound_targets_list",
|
|
15875
16013
|
{
|
|
15876
|
-
description: "List Slack gateway outbound targets the caller can use. Returns only outbound-enabled channels where the caller has branch all permission or admin access. Secrets and inbound channel keys are never returned.",
|
|
16014
|
+
description: "List Slack gateway outbound targets the caller can use. Returns only outbound-enabled channels where the caller has branch all permission or admin access; when called from a session, results are additionally scoped to channels targeting the session's branch. Secrets and inbound channel keys are never returned.",
|
|
15877
16015
|
annotations: { readOnlyHint: true },
|
|
15878
16016
|
inputSchema: external_exports.strictObject({
|
|
15879
16017
|
branchId: mcpOptionalId("branchId", "Branch", "Filter by target branch ID."),
|
|
@@ -15888,15 +16026,24 @@ function registerGatewayChannelTools(server, ctx) {
|
|
|
15888
16026
|
async (args) => {
|
|
15889
16027
|
const channelRepo = new GatewayChannelRepository(ctx.db);
|
|
15890
16028
|
const branchRepo = new BranchRepository6(ctx.db);
|
|
16029
|
+
const callerSessionBranchId = await resolveCallerSessionBranchId(ctx);
|
|
15891
16030
|
const branchFilter = args.branchId ? await branchRepo.findById(args.branchId) : null;
|
|
15892
|
-
const
|
|
16031
|
+
const requestedBranchId = branchFilter?.branch_id;
|
|
16032
|
+
if (callerSessionBranchId && args.branchId && requestedBranchId !== callerSessionBranchId) {
|
|
16033
|
+
return textResult({
|
|
16034
|
+
channels: [],
|
|
16035
|
+
binding: "Results are scoped to the calling session's branch; the requested branchId targets a different branch, so this session cannot use its channels."
|
|
16036
|
+
});
|
|
16037
|
+
}
|
|
16038
|
+
const branchFilterId = callerSessionBranchId ?? requestedBranchId;
|
|
15893
16039
|
const allChannels = args.gatewayChannelId ? [await channelRepo.findById(args.gatewayChannelId)] : await channelRepo.findAll();
|
|
15894
16040
|
const channels = [];
|
|
15895
16041
|
for (const channel of allChannels) {
|
|
15896
16042
|
if (!channel) continue;
|
|
15897
16043
|
if (args.channelType && channel.channel_type !== args.channelType) continue;
|
|
15898
16044
|
if (channel.channel_type !== "slack") continue;
|
|
15899
|
-
if (args.branchId && channel.target_branch_id !== branchFilterId)
|
|
16045
|
+
if ((callerSessionBranchId || args.branchId) && channel.target_branch_id !== branchFilterId)
|
|
16046
|
+
continue;
|
|
15900
16047
|
if (!channel.enabled) continue;
|
|
15901
16048
|
const outbound = getOutboundConfig(channel);
|
|
15902
16049
|
if (!outbound.outbound_enabled) continue;
|
|
@@ -15919,13 +16066,18 @@ function registerGatewayChannelTools(server, ctx) {
|
|
|
15919
16066
|
]
|
|
15920
16067
|
});
|
|
15921
16068
|
}
|
|
15922
|
-
return textResult({
|
|
16069
|
+
return textResult({
|
|
16070
|
+
channels,
|
|
16071
|
+
...callerSessionBranchId && channels.length === 0 ? {
|
|
16072
|
+
hint: "No outbound-enabled channel targets this session's branch \u2014 ask an operator to create/enable one."
|
|
16073
|
+
} : {}
|
|
16074
|
+
});
|
|
15923
16075
|
}
|
|
15924
16076
|
);
|
|
15925
16077
|
server.registerTool(
|
|
15926
16078
|
"agor_gateway_slack_thread_history_get",
|
|
15927
16079
|
{
|
|
15928
|
-
description: "Fetch Slack thread history for a gateway-mapped Slack thread without exposing Slack tokens. Prefer sessionId to resolve the gateway thread mapping from an accessible Agor session. Alternatively pass gatewayChannelId + threadId: mapped threads require admin or branch all permission on the mapped branch; unmapped arbitrary thread reads are admin-only. Slack message text is untrusted external content.",
|
|
16080
|
+
description: "Fetch Slack thread history for a gateway-mapped Slack thread without exposing Slack tokens. Prefer sessionId to resolve the gateway thread mapping from an accessible Agor session. Alternatively pass gatewayChannelId + threadId: mapped threads require admin or branch all permission on the mapped branch; unmapped arbitrary thread reads are admin-only. When called from a session, reads are restricted to threads whose target branch matches the calling session's branch. Slack message text is untrusted external content.",
|
|
15929
16081
|
annotations: { readOnlyHint: true },
|
|
15930
16082
|
inputSchema: slackThreadHistorySchema
|
|
15931
16083
|
},
|
|
@@ -15993,7 +16145,7 @@ function registerGatewayChannelTools(server, ctx) {
|
|
|
15993
16145
|
server.registerTool(
|
|
15994
16146
|
"agor_gateway_emit_message",
|
|
15995
16147
|
{
|
|
15996
|
-
description: "Send a proactive Slack message through an outbound-enabled gateway channel and persist a seed/audit record. Targets may be Slack channel IDs, channel names, or user emails; v0 intentionally starts a fresh Slack thread/DM message for each emit and does not create a thread-session mapping until a human replies.",
|
|
16148
|
+
description: "Send a proactive Slack message through an outbound-enabled gateway channel and persist a seed/audit record. Targets may be Slack channel IDs, channel names, or user emails; v0 intentionally starts a fresh Slack thread/DM message for each emit and does not create a thread-session mapping until a human replies. When called from a session, outbound is restricted to channels whose target branch matches the calling session's branch.",
|
|
15997
16149
|
annotations: { destructiveHint: false, idempotentHint: false },
|
|
15998
16150
|
inputSchema: external_exports.strictObject({
|
|
15999
16151
|
gatewayChannelId: mcpRequiredId(
|
|
@@ -14992,11 +14992,15 @@ import {
|
|
|
14992
14992
|
ThreadSessionMapRepository
|
|
14993
14993
|
} from "@agor/core/db";
|
|
14994
14994
|
import {
|
|
14995
|
-
|
|
14995
|
+
buildSlackManifest,
|
|
14996
|
+
getConnector,
|
|
14997
|
+
requiredBotEvents,
|
|
14998
|
+
requiredBotScopes
|
|
14996
14999
|
} from "@agor/core/gateway";
|
|
14997
15000
|
import {
|
|
14998
15001
|
GATEWAY_REDACTED_SENTINEL,
|
|
14999
15002
|
GATEWAY_SENSITIVE_CONFIG_FIELDS,
|
|
15003
|
+
getRequiredSecretFields,
|
|
15000
15004
|
hasMinimumRole as hasMinimumRole3,
|
|
15001
15005
|
ROLES as ROLES3
|
|
15002
15006
|
} from "@agor/core/types";
|
|
@@ -15056,44 +15060,48 @@ var gatewayChannelCreateSchema = external_exports.strictObject({
|
|
|
15056
15060
|
agenticConfig: agenticConfigSchema.optional()
|
|
15057
15061
|
}).superRefine((value, issue2) => {
|
|
15058
15062
|
const config2 = value.config ?? {};
|
|
15059
|
-
if (value.
|
|
15060
|
-
|
|
15061
|
-
|
|
15062
|
-
|
|
15063
|
-
|
|
15064
|
-
|
|
15065
|
-
|
|
15066
|
-
|
|
15067
|
-
if (config2.connection_mode === "socket" && !config2.app_token) {
|
|
15068
|
-
issue2.addIssue({
|
|
15069
|
-
code: "custom",
|
|
15070
|
-
path: ["config", "app_token"],
|
|
15071
|
-
message: "config.app_token is required for Slack Socket Mode."
|
|
15072
|
-
});
|
|
15073
|
-
}
|
|
15074
|
-
}
|
|
15075
|
-
if (value.channelType === "github") {
|
|
15076
|
-
for (const field of ["app_id", "private_key", "installation_id", "watch_repos"]) {
|
|
15063
|
+
if (value.enabled !== false) {
|
|
15064
|
+
const requiredSecretMessages = {
|
|
15065
|
+
bot_token: "config.bot_token is required for Slack. Prefer a bot token stored outside the transcript when possible.",
|
|
15066
|
+
app_token: "config.app_token is required for Slack Socket Mode.",
|
|
15067
|
+
private_key: "config.private_key is required for GitHub gateway channels.",
|
|
15068
|
+
app_password: "config.app_password is required for Teams gateway channels."
|
|
15069
|
+
};
|
|
15070
|
+
for (const field of getRequiredSecretFields(value.channelType, config2)) {
|
|
15077
15071
|
if (!config2[field]) {
|
|
15078
15072
|
issue2.addIssue({
|
|
15079
15073
|
code: "custom",
|
|
15080
15074
|
path: ["config", field],
|
|
15081
|
-
message: `config.${field} is required for
|
|
15075
|
+
message: requiredSecretMessages[field] ?? `config.${field} is required for ${value.channelType} gateway channels.`
|
|
15082
15076
|
});
|
|
15083
15077
|
}
|
|
15084
15078
|
}
|
|
15085
15079
|
}
|
|
15086
|
-
if (value.channelType === "
|
|
15087
|
-
for (const field of ["app_id", "
|
|
15080
|
+
if (value.channelType === "github") {
|
|
15081
|
+
for (const field of ["app_id", "installation_id", "watch_repos"]) {
|
|
15088
15082
|
if (!config2[field]) {
|
|
15089
15083
|
issue2.addIssue({
|
|
15090
15084
|
code: "custom",
|
|
15091
15085
|
path: ["config", field],
|
|
15092
|
-
message: `config.${field} is required for
|
|
15086
|
+
message: `config.${field} is required for GitHub gateway channels.`
|
|
15093
15087
|
});
|
|
15094
15088
|
}
|
|
15095
15089
|
}
|
|
15096
15090
|
}
|
|
15091
|
+
if (value.channelType === "teams" && !config2.app_id) {
|
|
15092
|
+
issue2.addIssue({
|
|
15093
|
+
code: "custom",
|
|
15094
|
+
path: ["config", "app_id"],
|
|
15095
|
+
message: "config.app_id is required for Teams gateway channels."
|
|
15096
|
+
});
|
|
15097
|
+
}
|
|
15098
|
+
if (value.channelType === "slack" && config2.align_slack_users !== true && !value.agorUserId) {
|
|
15099
|
+
issue2.addIssue({
|
|
15100
|
+
code: "custom",
|
|
15101
|
+
path: ["agorUserId"],
|
|
15102
|
+
message: "Run-as-selected-user needs agorUserId \u2014 set config.align_slack_users:true to align by email, or pass agorUserId."
|
|
15103
|
+
});
|
|
15104
|
+
}
|
|
15097
15105
|
});
|
|
15098
15106
|
var slackThreadHistorySchema = external_exports.strictObject({
|
|
15099
15107
|
sessionId: mcpOptionalId(
|
|
@@ -15157,6 +15165,23 @@ var gatewayChannelUpdateSchema = external_exports.strictObject({
|
|
|
15157
15165
|
),
|
|
15158
15166
|
agenticConfig: agenticConfigSchema.nullable().optional().describe("Replace agent/session defaults. null clears the gateway agentic config.")
|
|
15159
15167
|
});
|
|
15168
|
+
var slackManifestGenerateSchema = external_exports.strictObject({
|
|
15169
|
+
appName: mcpRequiredString("appName", 'Slack app display name, e.g. "Agor".'),
|
|
15170
|
+
botDisplayName: mcpOptionalNonEmptyString(
|
|
15171
|
+
"botDisplayName",
|
|
15172
|
+
"Bot user display name. Defaults to appName."
|
|
15173
|
+
),
|
|
15174
|
+
publicChannels: external_exports.boolean().default(false).describe("Listen in public channels (#channel) via @mention."),
|
|
15175
|
+
privateChannels: external_exports.boolean().default(false).describe("Listen in private channels (groups) via @mention."),
|
|
15176
|
+
groupDms: external_exports.boolean().default(false).describe("Listen in group DMs (multi-person IMs) via @mention."),
|
|
15177
|
+
alignUsers: external_exports.boolean().default(true).describe(
|
|
15178
|
+
"Resolve Slack user email \u2192 Agor user (adds the users:read.email scope). Defaults to true: each Slack user runs as their matched Agor account and unmatched users are rejected, so no fixed run-as user is needed. Set false to run every message as one fixed Agor user (then pass agorUserId to agor_gateway_channels_create)."
|
|
15179
|
+
),
|
|
15180
|
+
outbound: external_exports.boolean().default(false).describe("Proactive outbound: post to channels by name and DM users by email."),
|
|
15181
|
+
restrictToChannelIds: external_exports.array(external_exports.string().min(1)).optional().describe(
|
|
15182
|
+
"Slack channel ID whitelist. Maps to config.allowed_channel_ids when you call agor_gateway_channels_create; it does NOT change the manifest scopes or events."
|
|
15183
|
+
)
|
|
15184
|
+
});
|
|
15160
15185
|
|
|
15161
15186
|
// src/mcp/tools/mcp-servers.ts
|
|
15162
15187
|
import {
|
|
@@ -15515,7 +15540,7 @@ var modelConfigInputSchema = external_exports.union([
|
|
|
15515
15540
|
import { ROLES as ROLES4 } from "@agor/core/types";
|
|
15516
15541
|
|
|
15517
15542
|
// src/mcp/tools/widgets.ts
|
|
15518
|
-
import { MessageRole as MessageRole2 } from "@agor/core/types";
|
|
15543
|
+
import { getRequiredSecretFields as getRequiredSecretFields2, hasMinimumRole as hasMinimumRole5, MessageRole as MessageRole2, ROLES as ROLES6 } from "@agor/core/types";
|
|
15519
15544
|
|
|
15520
15545
|
// src/utils/append-system-message.ts
|
|
15521
15546
|
import { generateId as generateId2, SessionRepository as SessionRepository3 } from "@agor/core/db";
|
|
@@ -15598,6 +15623,30 @@ var envVarsSubmitSchema = external_exports.object({
|
|
|
15598
15623
|
}
|
|
15599
15624
|
});
|
|
15600
15625
|
|
|
15626
|
+
// src/widgets/gateway-token/index.ts
|
|
15627
|
+
import { Forbidden as Forbidden2 } from "@agor/core/feathers";
|
|
15628
|
+
import {
|
|
15629
|
+
GATEWAY_SENSITIVE_CONFIG_FIELDS as GATEWAY_SENSITIVE_CONFIG_FIELDS2,
|
|
15630
|
+
hasMinimumRole as hasMinimumRole4,
|
|
15631
|
+
ROLES as ROLES5
|
|
15632
|
+
} from "@agor/core/types";
|
|
15633
|
+
var MAX_TOKEN_LENGTH = 8192;
|
|
15634
|
+
var gatewayTokenParamsSchema = external_exports.object({
|
|
15635
|
+
gatewayChannelId: external_exports.string().min(1).describe("Gateway channel whose credentials are being set."),
|
|
15636
|
+
channelType: external_exports.enum(["slack", "discord", "whatsapp", "telegram", "github", "teams"]).describe("Platform type of the channel; drives per-field placeholders."),
|
|
15637
|
+
channelName: external_exports.string().min(1).max(200).describe("Human-readable channel name for the form heading and prompts."),
|
|
15638
|
+
fields: external_exports.array(external_exports.enum(GATEWAY_SENSITIVE_CONFIG_FIELDS2)).min(1).max(GATEWAY_SENSITIVE_CONFIG_FIELDS2.length).refine((fields) => new Set(fields).size === fields.length, {
|
|
15639
|
+
message: "Token field names must be unique"
|
|
15640
|
+
}).describe("Secret config field names to collect (subset of the sensitive fields)."),
|
|
15641
|
+
reason: external_exports.string().min(1).max(200).describe("One sentence explaining why the tokens are needed. Renders as a muted line.")
|
|
15642
|
+
}).strict();
|
|
15643
|
+
var gatewayTokenSubmitSchema = external_exports.object({
|
|
15644
|
+
tokens: external_exports.partialRecord(
|
|
15645
|
+
external_exports.enum(GATEWAY_SENSITIVE_CONFIG_FIELDS2),
|
|
15646
|
+
external_exports.string().min(1).max(MAX_TOKEN_LENGTH)
|
|
15647
|
+
).describe("Map of sensitive field name \u2192 credential value.")
|
|
15648
|
+
}).strict();
|
|
15649
|
+
|
|
15601
15650
|
// src/mcp/server.ts
|
|
15602
15651
|
var DEBUG_MCP_REQUESTS = process.env.AGOR_DEBUG_MCP_REQUESTS === "1" || process.env.DEBUG?.includes("mcp-requests");
|
|
15603
15652
|
function coerceString(value) {
|