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
package/dist/core/index.cjs
CHANGED
|
@@ -1655,6 +1655,21 @@ var init_file = __esm({
|
|
|
1655
1655
|
});
|
|
1656
1656
|
|
|
1657
1657
|
// src/types/gateway.ts
|
|
1658
|
+
function getRequiredSecretFields(channelType, config) {
|
|
1659
|
+
switch (channelType) {
|
|
1660
|
+
case "slack": {
|
|
1661
|
+
const wantsInbound = config.connection_mode === "socket" || config.enable_channels === true || config.enable_groups === true || config.enable_mpim === true;
|
|
1662
|
+
const outboundOnly = config.outbound_enabled === true && !wantsInbound;
|
|
1663
|
+
return outboundOnly ? ["bot_token"] : ["bot_token", "app_token"];
|
|
1664
|
+
}
|
|
1665
|
+
case "github":
|
|
1666
|
+
return ["private_key"];
|
|
1667
|
+
case "teams":
|
|
1668
|
+
return ["app_password"];
|
|
1669
|
+
default:
|
|
1670
|
+
return [];
|
|
1671
|
+
}
|
|
1672
|
+
}
|
|
1658
1673
|
var GATEWAY_SENSITIVE_CONFIG_FIELDS, GATEWAY_REDACTED_SENTINEL;
|
|
1659
1674
|
var init_gateway = __esm({
|
|
1660
1675
|
"src/types/gateway.ts"() {
|
|
@@ -5991,6 +6006,7 @@ __export(src_exports, {
|
|
|
5991
6006
|
SudoCliExecutor: () => SudoCliExecutor,
|
|
5992
6007
|
SudoDirectExecutor: () => SudoDirectExecutor,
|
|
5993
6008
|
SymlinkCommands: () => SymlinkCommands,
|
|
6009
|
+
TEMPLATE_RESOLVABLE_MCP_AUTH_SECRET_FIELDS: () => TEMPLATE_RESOLVABLE_MCP_AUTH_SECRET_FIELDS,
|
|
5994
6010
|
TERMINAL_TASK_STATUSES: () => TERMINAL_TASK_STATUSES,
|
|
5995
6011
|
TOOL_API_KEY_NAMES: () => TOOL_API_KEY_NAMES,
|
|
5996
6012
|
TaskRepository: () => TaskRepository,
|
|
@@ -6052,6 +6068,7 @@ __export(src_exports, {
|
|
|
6052
6068
|
checkAsUser: () => checkAsUser,
|
|
6053
6069
|
checkMigrationStatus: () => checkMigrationStatus,
|
|
6054
6070
|
compare: () => compare,
|
|
6071
|
+
containsTemplate: () => containsTemplate,
|
|
6055
6072
|
count: () => import_drizzle_orm38.count,
|
|
6056
6073
|
createAdminExecutor: () => createAdminExecutor,
|
|
6057
6074
|
createClient: () => createClient,
|
|
@@ -6141,6 +6158,7 @@ __export(src_exports, {
|
|
|
6141
6158
|
getRepoReferenceOptions: () => getRepoReferenceOptions,
|
|
6142
6159
|
getReposDir: () => getReposDir,
|
|
6143
6160
|
getReposDirAsync: () => getReposDirAsync,
|
|
6161
|
+
getRequiredSecretFields: () => getRequiredSecretFields,
|
|
6144
6162
|
getServiceTier: () => getServiceTier,
|
|
6145
6163
|
getSessionType: () => getSessionType,
|
|
6146
6164
|
getUidFromUsername: () => getUidFromUsername,
|
|
@@ -6193,6 +6211,7 @@ __export(src_exports, {
|
|
|
6193
6211
|
isThreadRoot: () => isThreadRoot,
|
|
6194
6212
|
isUnixGroupRefreshNeeded: () => isUnixGroupRefreshNeeded,
|
|
6195
6213
|
isUnixImpersonationEnabled: () => isUnixImpersonationEnabled,
|
|
6214
|
+
isUserEnvPlaceholder: () => isUserEnvPlaceholder,
|
|
6196
6215
|
isUserInGroup: () => isUserInGroup,
|
|
6197
6216
|
isValid: () => isValid,
|
|
6198
6217
|
isValidBranchGroupName: () => isValidBranchGroupName,
|
|
@@ -11497,6 +11516,63 @@ var BranchRepository = class {
|
|
|
11497
11516
|
}
|
|
11498
11517
|
return Array.from(userIds);
|
|
11499
11518
|
}
|
|
11519
|
+
/**
|
|
11520
|
+
* Find non-archived branches whose explicit filesystem access set can change
|
|
11521
|
+
* when membership in the given group changes.
|
|
11522
|
+
*
|
|
11523
|
+
* Keep this inverse lookup in lockstep with findExplicitFsAccessUserIds():
|
|
11524
|
+
* both encode which group grants materialize into branch-folder access.
|
|
11525
|
+
* App-only grants (`fs_access = 'none'`) are intentionally excluded because
|
|
11526
|
+
* membership changes for those grants do not require branch-folder mutation.
|
|
11527
|
+
*/
|
|
11528
|
+
async findExplicitFsAccessBranchIdsForGroup(groupId) {
|
|
11529
|
+
const directRows = await select(this.db, { branch_id: branchGroupGrants3.branch_id }).from(branchGroupGrants3).innerJoin(branches3, (0, import_drizzle_orm18.eq)(branches3.branch_id, branchGroupGrants3.branch_id)).innerJoin(
|
|
11530
|
+
groups3,
|
|
11531
|
+
(0, import_drizzle_orm18.and)((0, import_drizzle_orm18.eq)(groups3.group_id, branchGroupGrants3.group_id), (0, import_drizzle_orm18.eq)(groups3.archived, false))
|
|
11532
|
+
).where(
|
|
11533
|
+
(0, import_drizzle_orm18.and)(
|
|
11534
|
+
(0, import_drizzle_orm18.eq)(branchGroupGrants3.group_id, groupId),
|
|
11535
|
+
(0, import_drizzle_orm18.eq)(branches3.archived, false),
|
|
11536
|
+
(0, import_drizzle_orm18.inArray)(
|
|
11537
|
+
import_drizzle_orm18.sql`coalesce(${branchGroupGrants3.fs_access}, 'read')`,
|
|
11538
|
+
FS_ACCESS_BRANCH_PERMISSIONS
|
|
11539
|
+
)
|
|
11540
|
+
)
|
|
11541
|
+
).all();
|
|
11542
|
+
const boardRows = await select(this.db, { branch_id: branches3.branch_id }).from(boardGroupGrants3).innerJoin(
|
|
11543
|
+
groups3,
|
|
11544
|
+
(0, import_drizzle_orm18.and)((0, import_drizzle_orm18.eq)(groups3.group_id, boardGroupGrants3.group_id), (0, import_drizzle_orm18.eq)(groups3.archived, false))
|
|
11545
|
+
).innerJoin(
|
|
11546
|
+
boards3,
|
|
11547
|
+
(0, import_drizzle_orm18.and)(
|
|
11548
|
+
(0, import_drizzle_orm18.eq)(boards3.board_id, boardGroupGrants3.board_id),
|
|
11549
|
+
(0, import_drizzle_orm18.eq)(import_drizzle_orm18.sql`coalesce(${jsonExtract(this.db, boards3.data, "access_mode")}, 'shared')`, "shared")
|
|
11550
|
+
)
|
|
11551
|
+
).innerJoin(
|
|
11552
|
+
branches3,
|
|
11553
|
+
(0, import_drizzle_orm18.and)(
|
|
11554
|
+
(0, import_drizzle_orm18.eq)(branches3.board_id, boardGroupGrants3.board_id),
|
|
11555
|
+
(0, import_drizzle_orm18.eq)(branches3.permission_source, "board"),
|
|
11556
|
+
(0, import_drizzle_orm18.eq)(branches3.archived, false)
|
|
11557
|
+
)
|
|
11558
|
+
).where(
|
|
11559
|
+
(0, import_drizzle_orm18.and)(
|
|
11560
|
+
(0, import_drizzle_orm18.eq)(boardGroupGrants3.group_id, groupId),
|
|
11561
|
+
(0, import_drizzle_orm18.inArray)(
|
|
11562
|
+
import_drizzle_orm18.sql`coalesce(${boardGroupGrants3.fs_access}, 'read')`,
|
|
11563
|
+
FS_ACCESS_BRANCH_PERMISSIONS
|
|
11564
|
+
)
|
|
11565
|
+
)
|
|
11566
|
+
).all();
|
|
11567
|
+
const branchIds = /* @__PURE__ */ new Set();
|
|
11568
|
+
for (const row of directRows) {
|
|
11569
|
+
branchIds.add(row.branch_id);
|
|
11570
|
+
}
|
|
11571
|
+
for (const row of boardRows) {
|
|
11572
|
+
branchIds.add(row.branch_id);
|
|
11573
|
+
}
|
|
11574
|
+
return Array.from(branchIds);
|
|
11575
|
+
}
|
|
11500
11576
|
async findBoardAlignedBranches(boardId) {
|
|
11501
11577
|
const rows = await select(this.db).from(branches3).where(
|
|
11502
11578
|
(0, import_drizzle_orm18.and)(
|
|
@@ -12504,6 +12580,60 @@ var BoardRepository = class {
|
|
|
12504
12580
|
);
|
|
12505
12581
|
}
|
|
12506
12582
|
}
|
|
12583
|
+
/**
|
|
12584
|
+
* Shallow-merge field patches into existing board objects in a single
|
|
12585
|
+
* read-modify-write.
|
|
12586
|
+
*
|
|
12587
|
+
* Unlike upsertBoardObject (which fully replaces the object value, dropping
|
|
12588
|
+
* omitted fields), this overwrites ONLY the provided keys and leaves the rest
|
|
12589
|
+
* of each object intact — so a narrow change (e.g. a zIndex reorder) has a
|
|
12590
|
+
* smaller blast radius and won't clobber a field edited via a different patch
|
|
12591
|
+
* call. Multiple objects in one call are merged before a single write, so a
|
|
12592
|
+
* forward/backward swap touches both neighbors in one update.
|
|
12593
|
+
*
|
|
12594
|
+
* Objects that no longer exist are SKIPPED, never re-created — so a swap can't
|
|
12595
|
+
* resurrect a neighbor deleted between the client's read and this write.
|
|
12596
|
+
*
|
|
12597
|
+
* Only an explicit allowlist of fields can be merged (currently just `zIndex`,
|
|
12598
|
+
* which is also clamped into the board-object band [1, 499] so it can never be
|
|
12599
|
+
* pushed onto the card (500) / comment (1000) layers). Any other key in a
|
|
12600
|
+
* patch is ignored, so this narrow action cannot reshape an object (e.g. flip
|
|
12601
|
+
* its `type`) the way a full upsert could.
|
|
12602
|
+
*
|
|
12603
|
+
* NOTE: this is NOT atomic against concurrent writers. Like every other board
|
|
12604
|
+
* writer, the findById → update sequence has a lost-update window: a write
|
|
12605
|
+
* that lands between the read and the update can be overwritten (last-write-
|
|
12606
|
+
* wins). Merging only the patched keys narrows that window's blast radius
|
|
12607
|
+
* versus a full-object upsert, but does not close it.
|
|
12608
|
+
*/
|
|
12609
|
+
async mergeBoardObjectFields(boardId, patches) {
|
|
12610
|
+
const Z_MIN = 1;
|
|
12611
|
+
const Z_MAX = 499;
|
|
12612
|
+
try {
|
|
12613
|
+
const fullId = await this.resolveId(boardId);
|
|
12614
|
+
const current = await this.findById(fullId);
|
|
12615
|
+
if (!current) {
|
|
12616
|
+
throw new EntityNotFoundError("Board", boardId);
|
|
12617
|
+
}
|
|
12618
|
+
const updatedObjects = { ...current.objects || {} };
|
|
12619
|
+
for (const [objectId, fields] of Object.entries(patches)) {
|
|
12620
|
+
const existing = updatedObjects[objectId];
|
|
12621
|
+
if (!existing) continue;
|
|
12622
|
+
const { zIndex } = fields;
|
|
12623
|
+
if (typeof zIndex !== "number" || !Number.isFinite(zIndex)) continue;
|
|
12624
|
+
const safeZIndex = Math.min(Z_MAX, Math.max(Z_MIN, zIndex));
|
|
12625
|
+
updatedObjects[objectId] = { ...existing, zIndex: safeZIndex };
|
|
12626
|
+
}
|
|
12627
|
+
return this.update(fullId, { objects: updatedObjects });
|
|
12628
|
+
} catch (error) {
|
|
12629
|
+
if (error instanceof RepositoryError) throw error;
|
|
12630
|
+
if (error instanceof EntityNotFoundError) throw error;
|
|
12631
|
+
throw new RepositoryError(
|
|
12632
|
+
`Failed to merge board object fields: ${error instanceof Error ? error.message : String(error)}`,
|
|
12633
|
+
error
|
|
12634
|
+
);
|
|
12635
|
+
}
|
|
12636
|
+
}
|
|
12507
12637
|
/**
|
|
12508
12638
|
* DEPRECATED: Delete a zone and handle associated sessions
|
|
12509
12639
|
* TODO: Reimplement using board-objects table
|
|
@@ -13238,6 +13368,28 @@ var GatewayChannelRepository = class {
|
|
|
13238
13368
|
agentic_config: encryptedAgenticConfig
|
|
13239
13369
|
};
|
|
13240
13370
|
}
|
|
13371
|
+
/**
|
|
13372
|
+
* Enforce the "enabled requires secrets" invariant on every write path.
|
|
13373
|
+
*
|
|
13374
|
+
* An enabled channel can never exist without the secrets its type needs to
|
|
13375
|
+
* function. Runs on the post-merge, decrypted config so a patch that only
|
|
13376
|
+
* flips `enabled: true` on a channel with already-stored tokens passes.
|
|
13377
|
+
* Disabled ("draft") channels are exempt.
|
|
13378
|
+
*/
|
|
13379
|
+
assertRequiredSecretsWhenEnabled(channel) {
|
|
13380
|
+
if (channel.enabled === false) return;
|
|
13381
|
+
const channelType = channel.channel_type ?? "slack";
|
|
13382
|
+
const config = channel.config ?? {};
|
|
13383
|
+
const missing = getRequiredSecretFields(channelType, config).filter((field) => {
|
|
13384
|
+
const value = config[field];
|
|
13385
|
+
return typeof value !== "string" || value.trim() === "" || value === GATEWAY_REDACTED_SENTINEL;
|
|
13386
|
+
});
|
|
13387
|
+
if (missing.length > 0) {
|
|
13388
|
+
throw new RepositoryError(
|
|
13389
|
+
`Cannot enable ${channelType} gateway channel: missing required secret(s) ${missing.join(", ")}`
|
|
13390
|
+
);
|
|
13391
|
+
}
|
|
13392
|
+
}
|
|
13241
13393
|
/**
|
|
13242
13394
|
* Resolve short ID to full ID
|
|
13243
13395
|
*/
|
|
@@ -13269,6 +13421,7 @@ var GatewayChannelRepository = class {
|
|
|
13269
13421
|
id: data.id ?? generateId(),
|
|
13270
13422
|
channel_key: data.channel_key ?? generateId()
|
|
13271
13423
|
});
|
|
13424
|
+
this.assertRequiredSecretsWhenEnabled(data);
|
|
13272
13425
|
await insert(this.db, gatewayChannels3).values(insertData).run();
|
|
13273
13426
|
const row = await select(this.db).from(gatewayChannels3).where((0, import_drizzle_orm22.eq)(gatewayChannels3.id, insertData.id)).one();
|
|
13274
13427
|
if (!row) {
|
|
@@ -13335,6 +13488,7 @@ var GatewayChannelRepository = class {
|
|
|
13335
13488
|
}
|
|
13336
13489
|
merged.config = mergedConfig;
|
|
13337
13490
|
}
|
|
13491
|
+
this.assertRequiredSecretsWhenEnabled(merged);
|
|
13338
13492
|
const insertData = this.channelToInsert(merged);
|
|
13339
13493
|
await update(this.db, gatewayChannels3).set({
|
|
13340
13494
|
name: insertData.name,
|
|
@@ -14849,90 +15003,439 @@ init_ids();
|
|
|
14849
15003
|
// src/tools/mcp/auth-secrets.ts
|
|
14850
15004
|
init_cjs_shims();
|
|
14851
15005
|
|
|
14852
|
-
// src/
|
|
15006
|
+
// src/mcp/template-resolver.ts
|
|
14853
15007
|
init_cjs_shims();
|
|
14854
|
-
|
|
14855
|
-
|
|
14856
|
-
|
|
14857
|
-
|
|
14858
|
-
|
|
14859
|
-
|
|
14860
|
-
"
|
|
14861
|
-
|
|
14862
|
-
|
|
14863
|
-
|
|
14864
|
-
|
|
14865
|
-
|
|
14866
|
-
|
|
14867
|
-
|
|
14868
|
-
|
|
14869
|
-
|
|
14870
|
-
|
|
14871
|
-
|
|
14872
|
-
|
|
14873
|
-
}
|
|
14874
|
-
|
|
14875
|
-
|
|
15008
|
+
|
|
15009
|
+
// src/templates/handlebars-helpers.ts
|
|
15010
|
+
init_cjs_shims();
|
|
15011
|
+
var import_handlebars = __toESM(require("handlebars"), 1);
|
|
15012
|
+
var helpersRegistered = false;
|
|
15013
|
+
function registerHandlebarsHelpers() {
|
|
15014
|
+
import_handlebars.default.registerHelper("add", (a, b) => {
|
|
15015
|
+
const numA = Number(a);
|
|
15016
|
+
const numB = Number(b);
|
|
15017
|
+
if (Number.isNaN(numA) || Number.isNaN(numB)) {
|
|
15018
|
+
console.warn(`\u26A0\uFE0F add helper received non-numeric values: ${a}, ${b}`);
|
|
15019
|
+
return 0;
|
|
15020
|
+
}
|
|
15021
|
+
return numA + numB;
|
|
15022
|
+
});
|
|
15023
|
+
import_handlebars.default.registerHelper("sub", (a, b) => {
|
|
15024
|
+
const numA = Number(a);
|
|
15025
|
+
const numB = Number(b);
|
|
15026
|
+
if (Number.isNaN(numA) || Number.isNaN(numB)) {
|
|
15027
|
+
console.warn(`\u26A0\uFE0F sub helper received non-numeric values: ${a}, ${b}`);
|
|
15028
|
+
return 0;
|
|
15029
|
+
}
|
|
15030
|
+
return numA - numB;
|
|
15031
|
+
});
|
|
15032
|
+
import_handlebars.default.registerHelper("mul", (a, b) => {
|
|
15033
|
+
const numA = Number(a);
|
|
15034
|
+
const numB = Number(b);
|
|
15035
|
+
if (Number.isNaN(numA) || Number.isNaN(numB)) {
|
|
15036
|
+
console.warn(`\u26A0\uFE0F mul helper received non-numeric values: ${a}, ${b}`);
|
|
15037
|
+
return 0;
|
|
15038
|
+
}
|
|
15039
|
+
return numA * numB;
|
|
15040
|
+
});
|
|
15041
|
+
import_handlebars.default.registerHelper("div", (a, b) => {
|
|
15042
|
+
const numA = Number(a);
|
|
15043
|
+
const numB = Number(b);
|
|
15044
|
+
if (Number.isNaN(numA) || Number.isNaN(numB)) {
|
|
15045
|
+
console.warn(`\u26A0\uFE0F div helper received non-numeric values: ${a}, ${b}`);
|
|
15046
|
+
return 0;
|
|
15047
|
+
}
|
|
15048
|
+
if (numB === 0) {
|
|
15049
|
+
console.warn(`\u26A0\uFE0F div helper received zero divisor`);
|
|
15050
|
+
return 0;
|
|
15051
|
+
}
|
|
15052
|
+
return numA / numB;
|
|
15053
|
+
});
|
|
15054
|
+
import_handlebars.default.registerHelper("mod", (a, b) => {
|
|
15055
|
+
const numA = Number(a);
|
|
15056
|
+
const numB = Number(b);
|
|
15057
|
+
if (Number.isNaN(numA) || Number.isNaN(numB)) {
|
|
15058
|
+
console.warn(`\u26A0\uFE0F mod helper received non-numeric values: ${a}, ${b}`);
|
|
15059
|
+
return 0;
|
|
15060
|
+
}
|
|
15061
|
+
if (numB === 0) {
|
|
15062
|
+
console.warn(`\u26A0\uFE0F mod helper received zero divisor`);
|
|
15063
|
+
return 0;
|
|
15064
|
+
}
|
|
15065
|
+
return numA % numB;
|
|
15066
|
+
});
|
|
15067
|
+
import_handlebars.default.registerHelper("uppercase", (str) => {
|
|
15068
|
+
return String(str || "").toUpperCase();
|
|
15069
|
+
});
|
|
15070
|
+
import_handlebars.default.registerHelper("lowercase", (str) => {
|
|
15071
|
+
return String(str || "").toLowerCase();
|
|
15072
|
+
});
|
|
15073
|
+
import_handlebars.default.registerHelper("replace", (str, search, replace) => {
|
|
15074
|
+
return String(str || "").split(search).join(replace);
|
|
15075
|
+
});
|
|
15076
|
+
import_handlebars.default.registerHelper("eq", (a, b) => {
|
|
15077
|
+
return a === b;
|
|
15078
|
+
});
|
|
15079
|
+
import_handlebars.default.registerHelper("neq", (a, b) => {
|
|
15080
|
+
return a !== b;
|
|
15081
|
+
});
|
|
15082
|
+
import_handlebars.default.registerHelper("gt", (a, b) => {
|
|
15083
|
+
return Number(a) > Number(b);
|
|
15084
|
+
});
|
|
15085
|
+
import_handlebars.default.registerHelper("lt", (a, b) => {
|
|
15086
|
+
return Number(a) < Number(b);
|
|
15087
|
+
});
|
|
15088
|
+
import_handlebars.default.registerHelper("gte", (a, b) => {
|
|
15089
|
+
return Number(a) >= Number(b);
|
|
15090
|
+
});
|
|
15091
|
+
import_handlebars.default.registerHelper("lte", (a, b) => {
|
|
15092
|
+
return Number(a) <= Number(b);
|
|
15093
|
+
});
|
|
15094
|
+
import_handlebars.default.registerHelper("default", (value, defaultValue) => {
|
|
15095
|
+
return value ?? defaultValue;
|
|
15096
|
+
});
|
|
15097
|
+
import_handlebars.default.registerHelper("json", (obj) => {
|
|
15098
|
+
return JSON.stringify(obj, null, 2);
|
|
15099
|
+
});
|
|
15100
|
+
import_handlebars.default.registerHelper("isDefined", (value) => value !== void 0);
|
|
15101
|
+
helpersRegistered = true;
|
|
14876
15102
|
}
|
|
14877
|
-
function
|
|
14878
|
-
if (!
|
|
14879
|
-
|
|
14880
|
-
for (const [rawName, rawValue] of Object.entries(headers)) {
|
|
14881
|
-
const name = rawName.trim();
|
|
14882
|
-
if (!name || !isValidMCPHeaderName(name)) continue;
|
|
14883
|
-
if (isReservedMCPCustomHeaderName(name)) continue;
|
|
14884
|
-
if (typeof rawValue !== "string") continue;
|
|
14885
|
-
normalized[name] = rawValue;
|
|
15103
|
+
function renderTemplate(templateString, context, options = {}) {
|
|
15104
|
+
if (!templateString || typeof templateString !== "string") {
|
|
15105
|
+
return "";
|
|
14886
15106
|
}
|
|
14887
|
-
|
|
14888
|
-
|
|
14889
|
-
function restoreRedactedMCPCustomHeaders(options) {
|
|
14890
|
-
if (!options.next) return void 0;
|
|
14891
|
-
const restored = {};
|
|
14892
|
-
for (const [key, value] of Object.entries(options.next)) {
|
|
14893
|
-
restored[key] = value === MCP_HEADER_REDACTED_SENTINEL && options.current?.[key] !== void 0 ? options.current[key] : value;
|
|
15107
|
+
if (!helpersRegistered) {
|
|
15108
|
+
registerHandlebarsHelpers();
|
|
14894
15109
|
}
|
|
14895
|
-
|
|
14896
|
-
|
|
14897
|
-
|
|
14898
|
-
|
|
14899
|
-
|
|
14900
|
-
|
|
14901
|
-
|
|
14902
|
-
|
|
14903
|
-
|
|
14904
|
-
"oauth_access_token",
|
|
14905
|
-
"oauth_refresh_token"
|
|
14906
|
-
];
|
|
14907
|
-
function restoreRedactedMCPAuthSecrets(options) {
|
|
14908
|
-
if (!options.next) return void 0;
|
|
14909
|
-
const restored = { ...options.next };
|
|
14910
|
-
const record = restored;
|
|
14911
|
-
for (const field of MCP_AUTH_SECRET_FIELDS) {
|
|
14912
|
-
if (restored[field] === MCP_HEADER_REDACTED_SENTINEL && options.current?.[field] !== void 0) {
|
|
14913
|
-
record[field] = options.current[field];
|
|
15110
|
+
try {
|
|
15111
|
+
const template = import_handlebars.default.compile(templateString);
|
|
15112
|
+
return template(context);
|
|
15113
|
+
} catch (error) {
|
|
15114
|
+
console.error("\u274C Handlebars template error:", error);
|
|
15115
|
+
console.error("Template:", templateString);
|
|
15116
|
+
console.error("Context keys:", Object.keys(context));
|
|
15117
|
+
if (options.onError === "raw") {
|
|
15118
|
+
return templateString;
|
|
14914
15119
|
}
|
|
15120
|
+
return "";
|
|
14915
15121
|
}
|
|
14916
|
-
return restored;
|
|
14917
15122
|
}
|
|
14918
|
-
|
|
14919
|
-
|
|
14920
|
-
|
|
14921
|
-
|
|
14922
|
-
|
|
14923
|
-
|
|
14924
|
-
|
|
14925
|
-
|
|
14926
|
-
|
|
14927
|
-
|
|
14928
|
-
|
|
14929
|
-
|
|
14930
|
-
|
|
14931
|
-
|
|
14932
|
-
|
|
14933
|
-
|
|
14934
|
-
|
|
14935
|
-
|
|
15123
|
+
function buildBranchContext(branch) {
|
|
15124
|
+
const branchEntity = {
|
|
15125
|
+
unique_id: branch.branch_unique_id,
|
|
15126
|
+
name: branch.name,
|
|
15127
|
+
path: branch.path,
|
|
15128
|
+
gid: branch.unix_gid,
|
|
15129
|
+
base_ref: branch.base_ref || "",
|
|
15130
|
+
ref_type: branch.ref_type || "branch"
|
|
15131
|
+
};
|
|
15132
|
+
return {
|
|
15133
|
+
// Scoped entities (accessible as {{entity.property}})
|
|
15134
|
+
branch: branchEntity,
|
|
15135
|
+
// Legacy alias — preserved for existing env templates that reference
|
|
15136
|
+
// {{worktree.*}} keys. Points at the same object so updates stay in sync.
|
|
15137
|
+
worktree: branchEntity,
|
|
15138
|
+
repo: {
|
|
15139
|
+
slug: branch.repo_slug || ""
|
|
15140
|
+
},
|
|
15141
|
+
host: {
|
|
15142
|
+
ip_address: branch.host_ip_address || ""
|
|
15143
|
+
},
|
|
15144
|
+
// User-defined custom context (accessible as {{custom.key}})
|
|
15145
|
+
custom: branch.custom_context || {}
|
|
15146
|
+
};
|
|
15147
|
+
}
|
|
15148
|
+
|
|
15149
|
+
// src/mcp/template-patterns.ts
|
|
15150
|
+
init_cjs_shims();
|
|
15151
|
+
function containsTemplate(value) {
|
|
15152
|
+
return value.includes("{{") && value.includes("}}");
|
|
15153
|
+
}
|
|
15154
|
+
var USER_ENV_PLACEHOLDER_RE = /^\{\{\s*user\.env\.[A-Za-z_][A-Za-z0-9_]*\s*\}\}$/;
|
|
15155
|
+
function isUserEnvPlaceholder(value) {
|
|
15156
|
+
return USER_ENV_PLACEHOLDER_RE.test(value.trim());
|
|
15157
|
+
}
|
|
15158
|
+
|
|
15159
|
+
// src/mcp/template-resolver.ts
|
|
15160
|
+
function buildMCPTemplateContextFromEnv(env) {
|
|
15161
|
+
const userEnvKeysStr = env[AGOR_USER_ENV_KEYS_VAR];
|
|
15162
|
+
const allowedKeys = userEnvKeysStr ? new Set(userEnvKeysStr.split(",")) : /* @__PURE__ */ new Set();
|
|
15163
|
+
const userEnv = {};
|
|
15164
|
+
for (const key of allowedKeys) {
|
|
15165
|
+
const value = env[key];
|
|
15166
|
+
if (value !== void 0) {
|
|
15167
|
+
userEnv[key] = value;
|
|
15168
|
+
}
|
|
15169
|
+
}
|
|
15170
|
+
return {
|
|
15171
|
+
user: {
|
|
15172
|
+
env: userEnv
|
|
15173
|
+
}
|
|
15174
|
+
};
|
|
15175
|
+
}
|
|
15176
|
+
function resolveStringValue(fieldName, templateValue, context) {
|
|
15177
|
+
if (!containsTemplate(templateValue)) {
|
|
15178
|
+
return templateValue;
|
|
15179
|
+
}
|
|
15180
|
+
try {
|
|
15181
|
+
const resolved = renderTemplate(templateValue, context);
|
|
15182
|
+
if (!resolved || resolved.trim() === "") {
|
|
15183
|
+
console.log(` \u2139\uFE0F MCP "${fieldName}" resolved to empty (user may need to set env var)`);
|
|
15184
|
+
return void 0;
|
|
15185
|
+
}
|
|
15186
|
+
return resolved;
|
|
15187
|
+
} catch (error) {
|
|
15188
|
+
console.warn(
|
|
15189
|
+
` \u26A0\uFE0F Failed to resolve MCP template "${fieldName}":`,
|
|
15190
|
+
error instanceof Error ? error.message : String(error)
|
|
15191
|
+
);
|
|
15192
|
+
return void 0;
|
|
15193
|
+
}
|
|
15194
|
+
}
|
|
15195
|
+
function resolveMcpServerEnv(envTemplate, context) {
|
|
15196
|
+
if (!envTemplate || Object.keys(envTemplate).length === 0) {
|
|
15197
|
+
return void 0;
|
|
15198
|
+
}
|
|
15199
|
+
const result = {};
|
|
15200
|
+
for (const [key, templateValue] of Object.entries(envTemplate)) {
|
|
15201
|
+
const resolved = resolveStringValue(`env.${key}`, templateValue, context);
|
|
15202
|
+
if (resolved !== void 0) {
|
|
15203
|
+
result[key] = resolved;
|
|
15204
|
+
}
|
|
15205
|
+
}
|
|
15206
|
+
return Object.keys(result).length > 0 ? result : void 0;
|
|
15207
|
+
}
|
|
15208
|
+
var TEMPLATE_RESOLVABLE_MCP_AUTH_SECRET_FIELDS = [
|
|
15209
|
+
"token",
|
|
15210
|
+
"api_token",
|
|
15211
|
+
"api_secret",
|
|
15212
|
+
"oauth_client_secret"
|
|
15213
|
+
];
|
|
15214
|
+
function resolveMcpServerTemplates(server, context) {
|
|
15215
|
+
const resolved = { ...server };
|
|
15216
|
+
const unresolvedFields = [];
|
|
15217
|
+
const hadUrlTemplate = server.url && containsTemplate(server.url);
|
|
15218
|
+
if (server.url) {
|
|
15219
|
+
resolved.url = resolveStringValue("url", server.url, context);
|
|
15220
|
+
if (hadUrlTemplate && !resolved.url) {
|
|
15221
|
+
unresolvedFields.push("url");
|
|
15222
|
+
}
|
|
15223
|
+
}
|
|
15224
|
+
if (server.env) {
|
|
15225
|
+
const resolvedEnv = {};
|
|
15226
|
+
for (const [key, templateValue] of Object.entries(server.env)) {
|
|
15227
|
+
const hadTemplate = containsTemplate(templateValue);
|
|
15228
|
+
const resolvedValue = resolveStringValue(`env.${key}`, templateValue, context);
|
|
15229
|
+
if (resolvedValue !== void 0) {
|
|
15230
|
+
resolvedEnv[key] = resolvedValue;
|
|
15231
|
+
} else if (hadTemplate) {
|
|
15232
|
+
unresolvedFields.push(`env.${key}`);
|
|
15233
|
+
}
|
|
15234
|
+
}
|
|
15235
|
+
resolved.env = Object.keys(resolvedEnv).length > 0 ? resolvedEnv : void 0;
|
|
15236
|
+
}
|
|
15237
|
+
if (server.headers) {
|
|
15238
|
+
const resolvedHeaders = {};
|
|
15239
|
+
for (const [key, templateValue] of Object.entries(server.headers)) {
|
|
15240
|
+
const hadTemplate = containsTemplate(templateValue);
|
|
15241
|
+
const resolvedValue = resolveStringValue(`headers.${key}`, templateValue, context);
|
|
15242
|
+
if (resolvedValue !== void 0) {
|
|
15243
|
+
resolvedHeaders[key] = resolvedValue;
|
|
15244
|
+
} else if (hadTemplate) {
|
|
15245
|
+
unresolvedFields.push(`headers.${key}`);
|
|
15246
|
+
}
|
|
15247
|
+
}
|
|
15248
|
+
resolved.headers = Object.keys(resolvedHeaders).length > 0 ? resolvedHeaders : void 0;
|
|
15249
|
+
}
|
|
15250
|
+
if (server.auth) {
|
|
15251
|
+
const resolvedAuth = { ...server.auth };
|
|
15252
|
+
if (server.auth.token) {
|
|
15253
|
+
const hadTemplate = containsTemplate(server.auth.token);
|
|
15254
|
+
resolvedAuth.token = resolveStringValue("auth.token", server.auth.token, context);
|
|
15255
|
+
if (hadTemplate && !resolvedAuth.token) {
|
|
15256
|
+
unresolvedFields.push("auth.token");
|
|
15257
|
+
}
|
|
15258
|
+
}
|
|
15259
|
+
if (server.auth.api_url) {
|
|
15260
|
+
const hadTemplate = containsTemplate(server.auth.api_url);
|
|
15261
|
+
resolvedAuth.api_url = resolveStringValue("auth.api_url", server.auth.api_url, context);
|
|
15262
|
+
if (hadTemplate && !resolvedAuth.api_url) {
|
|
15263
|
+
unresolvedFields.push("auth.api_url");
|
|
15264
|
+
}
|
|
15265
|
+
}
|
|
15266
|
+
if (server.auth.api_token) {
|
|
15267
|
+
const hadTemplate = containsTemplate(server.auth.api_token);
|
|
15268
|
+
resolvedAuth.api_token = resolveStringValue("auth.api_token", server.auth.api_token, context);
|
|
15269
|
+
if (hadTemplate && !resolvedAuth.api_token) {
|
|
15270
|
+
unresolvedFields.push("auth.api_token");
|
|
15271
|
+
}
|
|
15272
|
+
}
|
|
15273
|
+
if (server.auth.api_secret) {
|
|
15274
|
+
const hadTemplate = containsTemplate(server.auth.api_secret);
|
|
15275
|
+
resolvedAuth.api_secret = resolveStringValue(
|
|
15276
|
+
"auth.api_secret",
|
|
15277
|
+
server.auth.api_secret,
|
|
15278
|
+
context
|
|
15279
|
+
);
|
|
15280
|
+
if (hadTemplate && !resolvedAuth.api_secret) {
|
|
15281
|
+
unresolvedFields.push("auth.api_secret");
|
|
15282
|
+
}
|
|
15283
|
+
}
|
|
15284
|
+
if (server.auth.type === "oauth") {
|
|
15285
|
+
if (server.auth.oauth_token_url) {
|
|
15286
|
+
const _hadTemplate = containsTemplate(server.auth.oauth_token_url);
|
|
15287
|
+
resolvedAuth.oauth_token_url = resolveStringValue(
|
|
15288
|
+
"auth.oauth_token_url",
|
|
15289
|
+
server.auth.oauth_token_url,
|
|
15290
|
+
context
|
|
15291
|
+
);
|
|
15292
|
+
}
|
|
15293
|
+
if (server.auth.oauth_client_id) {
|
|
15294
|
+
const _hadTemplate = containsTemplate(server.auth.oauth_client_id);
|
|
15295
|
+
resolvedAuth.oauth_client_id = resolveStringValue(
|
|
15296
|
+
"auth.oauth_client_id",
|
|
15297
|
+
server.auth.oauth_client_id,
|
|
15298
|
+
context
|
|
15299
|
+
);
|
|
15300
|
+
}
|
|
15301
|
+
if (server.auth.oauth_client_secret) {
|
|
15302
|
+
const _hadTemplate = containsTemplate(server.auth.oauth_client_secret);
|
|
15303
|
+
resolvedAuth.oauth_client_secret = resolveStringValue(
|
|
15304
|
+
"auth.oauth_client_secret",
|
|
15305
|
+
server.auth.oauth_client_secret,
|
|
15306
|
+
context
|
|
15307
|
+
);
|
|
15308
|
+
}
|
|
15309
|
+
if (server.auth.oauth_scope) {
|
|
15310
|
+
const _hadTemplate = containsTemplate(server.auth.oauth_scope);
|
|
15311
|
+
resolvedAuth.oauth_scope = resolveStringValue(
|
|
15312
|
+
"auth.oauth_scope",
|
|
15313
|
+
server.auth.oauth_scope,
|
|
15314
|
+
context
|
|
15315
|
+
);
|
|
15316
|
+
}
|
|
15317
|
+
resolvedAuth.oauth_grant_type = server.auth.oauth_grant_type || "client_credentials";
|
|
15318
|
+
}
|
|
15319
|
+
resolved.auth = resolvedAuth;
|
|
15320
|
+
}
|
|
15321
|
+
const isHttpTransport = server.transport === "http" || server.transport === "sse";
|
|
15322
|
+
const urlRequired = isHttpTransport && hadUrlTemplate;
|
|
15323
|
+
const urlMissing = urlRequired && !resolved.url;
|
|
15324
|
+
const isValid2 = !urlMissing;
|
|
15325
|
+
let errorMessage;
|
|
15326
|
+
if (!isValid2) {
|
|
15327
|
+
const missingVars = unresolvedFields.map((f) => {
|
|
15328
|
+
let originalValue;
|
|
15329
|
+
if (f === "url") {
|
|
15330
|
+
originalValue = server.url;
|
|
15331
|
+
} else if (f.startsWith("env.")) {
|
|
15332
|
+
originalValue = server.env?.[f.slice(4)];
|
|
15333
|
+
} else if (f.startsWith("headers.")) {
|
|
15334
|
+
originalValue = server.headers?.[f.slice(8)];
|
|
15335
|
+
} else if (f.startsWith("auth.") && server.auth) {
|
|
15336
|
+
const authKey = f.slice(5);
|
|
15337
|
+
const authValue = server.auth[authKey];
|
|
15338
|
+
originalValue = typeof authValue === "string" ? authValue : void 0;
|
|
15339
|
+
}
|
|
15340
|
+
return originalValue || f;
|
|
15341
|
+
}).join(", ");
|
|
15342
|
+
errorMessage = `MCP server "${server.name}" has unresolved required templates: ${missingVars}. Set the corresponding environment variables in your user settings.`;
|
|
15343
|
+
}
|
|
15344
|
+
return {
|
|
15345
|
+
server: resolved,
|
|
15346
|
+
unresolvedFields,
|
|
15347
|
+
isValid: isValid2,
|
|
15348
|
+
errorMessage
|
|
15349
|
+
};
|
|
15350
|
+
}
|
|
15351
|
+
function resolveMcpServersTemplates(servers, context) {
|
|
15352
|
+
return servers.map((server) => resolveMcpServerTemplates(server, context));
|
|
15353
|
+
}
|
|
15354
|
+
|
|
15355
|
+
// src/tools/mcp/http-headers.ts
|
|
15356
|
+
init_cjs_shims();
|
|
15357
|
+
var MCP_HEADER_REDACTED_SENTINEL = "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022";
|
|
15358
|
+
var RESERVED_MCP_CUSTOM_HEADER_NAMES = /* @__PURE__ */ new Set([
|
|
15359
|
+
"authorization",
|
|
15360
|
+
// Hop-by-hop / transport-controlled headers. These are managed by fetch,
|
|
15361
|
+
// the MCP SDK transport, or the auth configuration and should not be stored
|
|
15362
|
+
// as custom MCP service-account headers.
|
|
15363
|
+
"connection",
|
|
15364
|
+
"content-length",
|
|
15365
|
+
"cookie",
|
|
15366
|
+
"host",
|
|
15367
|
+
"mcp-session-id",
|
|
15368
|
+
"te",
|
|
15369
|
+
"trailer",
|
|
15370
|
+
"transfer-encoding",
|
|
15371
|
+
"upgrade"
|
|
15372
|
+
]);
|
|
15373
|
+
var HEADER_NAME_RE = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;
|
|
15374
|
+
function isValidMCPHeaderName(name) {
|
|
15375
|
+
return HEADER_NAME_RE.test(name);
|
|
15376
|
+
}
|
|
15377
|
+
function isReservedMCPCustomHeaderName(name) {
|
|
15378
|
+
return RESERVED_MCP_CUSTOM_HEADER_NAMES.has(name.toLowerCase());
|
|
15379
|
+
}
|
|
15380
|
+
function normalizeMCPCustomHeaders(headers) {
|
|
15381
|
+
if (!headers) return void 0;
|
|
15382
|
+
const normalized = {};
|
|
15383
|
+
for (const [rawName, rawValue] of Object.entries(headers)) {
|
|
15384
|
+
const name = rawName.trim();
|
|
15385
|
+
if (!name || !isValidMCPHeaderName(name)) continue;
|
|
15386
|
+
if (isReservedMCPCustomHeaderName(name)) continue;
|
|
15387
|
+
if (typeof rawValue !== "string") continue;
|
|
15388
|
+
normalized[name] = rawValue;
|
|
15389
|
+
}
|
|
15390
|
+
return Object.keys(normalized).length > 0 ? normalized : void 0;
|
|
15391
|
+
}
|
|
15392
|
+
function restoreRedactedMCPCustomHeaders(options) {
|
|
15393
|
+
if (!options.next) return void 0;
|
|
15394
|
+
const restored = {};
|
|
15395
|
+
for (const [key, value] of Object.entries(options.next)) {
|
|
15396
|
+
restored[key] = value === MCP_HEADER_REDACTED_SENTINEL && options.current?.[key] !== void 0 ? options.current[key] : value;
|
|
15397
|
+
}
|
|
15398
|
+
return normalizeMCPCustomHeaders(restored);
|
|
15399
|
+
}
|
|
15400
|
+
|
|
15401
|
+
// src/tools/mcp/auth-secrets.ts
|
|
15402
|
+
var MCP_AUTH_SECRET_FIELDS = [
|
|
15403
|
+
"token",
|
|
15404
|
+
"api_token",
|
|
15405
|
+
"api_secret",
|
|
15406
|
+
"oauth_client_secret",
|
|
15407
|
+
"oauth_access_token",
|
|
15408
|
+
"oauth_refresh_token"
|
|
15409
|
+
];
|
|
15410
|
+
function restoreRedactedMCPAuthSecrets(options) {
|
|
15411
|
+
if (!options.next) return void 0;
|
|
15412
|
+
const restored = { ...options.next };
|
|
15413
|
+
const record = restored;
|
|
15414
|
+
for (const field of MCP_AUTH_SECRET_FIELDS) {
|
|
15415
|
+
if (restored[field] === MCP_HEADER_REDACTED_SENTINEL && options.current?.[field] !== void 0) {
|
|
15416
|
+
record[field] = options.current[field];
|
|
15417
|
+
}
|
|
15418
|
+
}
|
|
15419
|
+
return restored;
|
|
15420
|
+
}
|
|
15421
|
+
|
|
15422
|
+
// src/db/repositories/mcp-servers.ts
|
|
15423
|
+
init_database_wrapper();
|
|
15424
|
+
init_schema();
|
|
15425
|
+
var MCPServerRepository = class {
|
|
15426
|
+
constructor(db) {
|
|
15427
|
+
this.db = db;
|
|
15428
|
+
}
|
|
15429
|
+
/**
|
|
15430
|
+
* Convert database row to MCPServer type
|
|
15431
|
+
*/
|
|
15432
|
+
rowToMCPServer(row) {
|
|
15433
|
+
return {
|
|
15434
|
+
mcp_server_id: row.mcp_server_id,
|
|
15435
|
+
name: row.name,
|
|
15436
|
+
transport: row.transport,
|
|
15437
|
+
scope: row.scope,
|
|
15438
|
+
enabled: Boolean(row.enabled),
|
|
14936
15439
|
source: row.source,
|
|
14937
15440
|
created_at: new Date(row.created_at),
|
|
14938
15441
|
updated_at: row.updated_at ? new Date(row.updated_at) : new Date(row.created_at),
|
|
@@ -16138,40 +16641,43 @@ var SessionRepository = class {
|
|
|
16138
16641
|
const sessionId = row.session_id;
|
|
16139
16642
|
const boardId = branchBoardId ?? null;
|
|
16140
16643
|
const url = baseUrl && boardId ? getSessionUrl(sessionId, baseUrl) : null;
|
|
16141
|
-
return
|
|
16142
|
-
|
|
16143
|
-
|
|
16144
|
-
|
|
16145
|
-
|
|
16146
|
-
|
|
16147
|
-
|
|
16148
|
-
|
|
16149
|
-
|
|
16150
|
-
|
|
16151
|
-
|
|
16152
|
-
|
|
16153
|
-
|
|
16154
|
-
|
|
16155
|
-
|
|
16156
|
-
|
|
16157
|
-
|
|
16158
|
-
|
|
16159
|
-
|
|
16160
|
-
|
|
16161
|
-
|
|
16644
|
+
return attachHiddenTenant(
|
|
16645
|
+
{
|
|
16646
|
+
session_id: sessionId,
|
|
16647
|
+
status: row.status,
|
|
16648
|
+
agentic_tool: row.agentic_tool,
|
|
16649
|
+
created_at: new Date(row.created_at).toISOString(),
|
|
16650
|
+
last_updated: row.updated_at ? new Date(row.updated_at).toISOString() : new Date(row.created_at).toISOString(),
|
|
16651
|
+
created_by: row.created_by,
|
|
16652
|
+
unix_username: row.unix_username || null,
|
|
16653
|
+
branch_id: row.branch_id,
|
|
16654
|
+
branch_board_id: boardId,
|
|
16655
|
+
url,
|
|
16656
|
+
...row.data,
|
|
16657
|
+
tasks: row.data.tasks.map((id) => id),
|
|
16658
|
+
genealogy: {
|
|
16659
|
+
parent_session_id: row.parent_session_id,
|
|
16660
|
+
forked_from_session_id: row.forked_from_session_id,
|
|
16661
|
+
fork_point_task_id: genealogyData.fork_point_task_id,
|
|
16662
|
+
fork_point_message_index: genealogyData.fork_point_message_index,
|
|
16663
|
+
spawn_point_task_id: genealogyData.spawn_point_task_id,
|
|
16664
|
+
spawn_point_message_index: genealogyData.spawn_point_message_index,
|
|
16665
|
+
children: genealogyData.children.map((id) => id)
|
|
16666
|
+
},
|
|
16667
|
+
permission_config: row.data.permission_config,
|
|
16668
|
+
scheduled_run_at: row.scheduled_run_at ?? void 0,
|
|
16669
|
+
scheduled_from_branch: row.scheduled_from_branch ?? false,
|
|
16670
|
+
schedule_id: row.schedule_id ?? void 0,
|
|
16671
|
+
ready_for_prompt: row.ready_for_prompt ?? false,
|
|
16672
|
+
archived: Boolean(row.archived),
|
|
16673
|
+
// Convert SQLite integer (0/1) to boolean
|
|
16674
|
+
archived_reason: row.archived_reason ?? void 0,
|
|
16675
|
+
current_context_usage: row.data.current_context_usage,
|
|
16676
|
+
context_window_limit: row.data.context_window_limit,
|
|
16677
|
+
last_context_update_at: row.data.last_context_update_at
|
|
16162
16678
|
},
|
|
16163
|
-
|
|
16164
|
-
|
|
16165
|
-
scheduled_from_branch: row.scheduled_from_branch ?? false,
|
|
16166
|
-
schedule_id: row.schedule_id ?? void 0,
|
|
16167
|
-
ready_for_prompt: row.ready_for_prompt ?? false,
|
|
16168
|
-
archived: Boolean(row.archived),
|
|
16169
|
-
// Convert SQLite integer (0/1) to boolean
|
|
16170
|
-
archived_reason: row.archived_reason ?? void 0,
|
|
16171
|
-
current_context_usage: row.data.current_context_usage,
|
|
16172
|
-
context_window_limit: row.data.context_window_limit,
|
|
16173
|
-
last_context_update_at: row.data.last_context_update_at
|
|
16174
|
-
};
|
|
16679
|
+
row
|
|
16680
|
+
);
|
|
16175
16681
|
}
|
|
16176
16682
|
/**
|
|
16177
16683
|
* Convert Session to database insert format
|
|
@@ -16318,6 +16824,26 @@ var SessionRepository = class {
|
|
|
16318
16824
|
);
|
|
16319
16825
|
}
|
|
16320
16826
|
}
|
|
16827
|
+
/**
|
|
16828
|
+
* Resolve the owning user id for a session without hydrating the full row.
|
|
16829
|
+
* Used by realtime delivery to offer streaming events to the session
|
|
16830
|
+
* creator's own connections as a fallback, so their open tabs keep updating
|
|
16831
|
+
* even before they subscribe to the per-session stream channel.
|
|
16832
|
+
*/
|
|
16833
|
+
async findCreatedByBySessionId(id) {
|
|
16834
|
+
try {
|
|
16835
|
+
const fullId = await this.resolveId(id);
|
|
16836
|
+
const row = await select(this.db, { created_by: sessions3.created_by }).from(sessions3).where((0, import_drizzle_orm30.eq)(sessions3.session_id, fullId)).one();
|
|
16837
|
+
return row?.created_by ?? null;
|
|
16838
|
+
} catch (error) {
|
|
16839
|
+
if (error instanceof EntityNotFoundError) return null;
|
|
16840
|
+
if (error instanceof AmbiguousIdError) throw error;
|
|
16841
|
+
throw new RepositoryError(
|
|
16842
|
+
`Failed to find session owner: ${error instanceof Error ? error.message : String(error)}`,
|
|
16843
|
+
error
|
|
16844
|
+
);
|
|
16845
|
+
}
|
|
16846
|
+
}
|
|
16321
16847
|
/**
|
|
16322
16848
|
* Find all sessions
|
|
16323
16849
|
*
|
|
@@ -16584,7 +17110,7 @@ var SessionRepository = class {
|
|
|
16584
17110
|
throw new RepositoryError("Session update did not produce an updated_at timestamp");
|
|
16585
17111
|
}
|
|
16586
17112
|
merged.last_updated = insertData.updated_at.toISOString();
|
|
16587
|
-
return merged;
|
|
17113
|
+
return attachHiddenTenant(merged, currentRow);
|
|
16588
17114
|
});
|
|
16589
17115
|
return result;
|
|
16590
17116
|
} catch (error) {
|
|
@@ -18596,192 +19122,52 @@ var UsersRepository = class {
|
|
|
18596
19122
|
*/
|
|
18597
19123
|
async deleteToolConfigField(userId, tool, field) {
|
|
18598
19124
|
const fullId = await this.resolveId(userId);
|
|
18599
|
-
const row = await this.getRawRow(fullId);
|
|
18600
|
-
if (!row) {
|
|
18601
|
-
throw new EntityNotFoundError("User", userId);
|
|
18602
|
-
}
|
|
18603
|
-
const stored = row.data.agentic_tools ?? {};
|
|
18604
|
-
const toolFields = { ...stored[tool] ?? {} };
|
|
18605
|
-
delete toolFields[field];
|
|
18606
|
-
const next = { ...stored };
|
|
18607
|
-
if (Object.keys(toolFields).length > 0) {
|
|
18608
|
-
next[tool] = toolFields;
|
|
18609
|
-
} else {
|
|
18610
|
-
delete next[tool];
|
|
18611
|
-
}
|
|
18612
|
-
await update(this.db, users3).set({
|
|
18613
|
-
data: { ...row.data, agentic_tools: next },
|
|
18614
|
-
updated_at: /* @__PURE__ */ new Date()
|
|
18615
|
-
}).where((0, import_drizzle_orm37.eq)(users3.user_id, fullId)).run();
|
|
18616
|
-
}
|
|
18617
|
-
};
|
|
18618
|
-
|
|
18619
|
-
// src/db/index.ts
|
|
18620
|
-
init_schema();
|
|
18621
|
-
|
|
18622
|
-
// src/db/session-guard.ts
|
|
18623
|
-
init_cjs_shims();
|
|
18624
|
-
init_ids();
|
|
18625
|
-
async function withSessionGuard(sessionId, sessionsRepo, operation) {
|
|
18626
|
-
const sessionExists = await sessionsRepo?.findById(sessionId);
|
|
18627
|
-
if (!sessionExists) {
|
|
18628
|
-
console.warn(`\u26A0\uFE0F Session ${shortId(sessionId)} no longer exists, skipping guarded operation`);
|
|
18629
|
-
return null;
|
|
18630
|
-
}
|
|
18631
|
-
return operation();
|
|
18632
|
-
}
|
|
18633
|
-
function isForeignKeyConstraintError(error) {
|
|
18634
|
-
return error instanceof Error && (error.message.includes("FOREIGN KEY constraint failed") || error.message.includes("SQLITE_CONSTRAINT_FOREIGNKEY"));
|
|
18635
|
-
}
|
|
18636
|
-
|
|
18637
|
-
// src/db/index.ts
|
|
18638
|
-
init_tenant_scope();
|
|
18639
|
-
init_user_utils();
|
|
18640
|
-
var compare = import_bcryptjs3.default.compare;
|
|
18641
|
-
var hash = import_bcryptjs3.default.hash;
|
|
18642
|
-
|
|
18643
|
-
// src/environment/render-snapshot.ts
|
|
18644
|
-
init_cjs_shims();
|
|
18645
|
-
|
|
18646
|
-
// src/templates/handlebars-helpers.ts
|
|
18647
|
-
init_cjs_shims();
|
|
18648
|
-
var import_handlebars = __toESM(require("handlebars"), 1);
|
|
18649
|
-
var helpersRegistered = false;
|
|
18650
|
-
function registerHandlebarsHelpers() {
|
|
18651
|
-
import_handlebars.default.registerHelper("add", (a, b) => {
|
|
18652
|
-
const numA = Number(a);
|
|
18653
|
-
const numB = Number(b);
|
|
18654
|
-
if (Number.isNaN(numA) || Number.isNaN(numB)) {
|
|
18655
|
-
console.warn(`\u26A0\uFE0F add helper received non-numeric values: ${a}, ${b}`);
|
|
18656
|
-
return 0;
|
|
18657
|
-
}
|
|
18658
|
-
return numA + numB;
|
|
18659
|
-
});
|
|
18660
|
-
import_handlebars.default.registerHelper("sub", (a, b) => {
|
|
18661
|
-
const numA = Number(a);
|
|
18662
|
-
const numB = Number(b);
|
|
18663
|
-
if (Number.isNaN(numA) || Number.isNaN(numB)) {
|
|
18664
|
-
console.warn(`\u26A0\uFE0F sub helper received non-numeric values: ${a}, ${b}`);
|
|
18665
|
-
return 0;
|
|
18666
|
-
}
|
|
18667
|
-
return numA - numB;
|
|
18668
|
-
});
|
|
18669
|
-
import_handlebars.default.registerHelper("mul", (a, b) => {
|
|
18670
|
-
const numA = Number(a);
|
|
18671
|
-
const numB = Number(b);
|
|
18672
|
-
if (Number.isNaN(numA) || Number.isNaN(numB)) {
|
|
18673
|
-
console.warn(`\u26A0\uFE0F mul helper received non-numeric values: ${a}, ${b}`);
|
|
18674
|
-
return 0;
|
|
18675
|
-
}
|
|
18676
|
-
return numA * numB;
|
|
18677
|
-
});
|
|
18678
|
-
import_handlebars.default.registerHelper("div", (a, b) => {
|
|
18679
|
-
const numA = Number(a);
|
|
18680
|
-
const numB = Number(b);
|
|
18681
|
-
if (Number.isNaN(numA) || Number.isNaN(numB)) {
|
|
18682
|
-
console.warn(`\u26A0\uFE0F div helper received non-numeric values: ${a}, ${b}`);
|
|
18683
|
-
return 0;
|
|
18684
|
-
}
|
|
18685
|
-
if (numB === 0) {
|
|
18686
|
-
console.warn(`\u26A0\uFE0F div helper received zero divisor`);
|
|
18687
|
-
return 0;
|
|
18688
|
-
}
|
|
18689
|
-
return numA / numB;
|
|
18690
|
-
});
|
|
18691
|
-
import_handlebars.default.registerHelper("mod", (a, b) => {
|
|
18692
|
-
const numA = Number(a);
|
|
18693
|
-
const numB = Number(b);
|
|
18694
|
-
if (Number.isNaN(numA) || Number.isNaN(numB)) {
|
|
18695
|
-
console.warn(`\u26A0\uFE0F mod helper received non-numeric values: ${a}, ${b}`);
|
|
18696
|
-
return 0;
|
|
18697
|
-
}
|
|
18698
|
-
if (numB === 0) {
|
|
18699
|
-
console.warn(`\u26A0\uFE0F mod helper received zero divisor`);
|
|
18700
|
-
return 0;
|
|
18701
|
-
}
|
|
18702
|
-
return numA % numB;
|
|
18703
|
-
});
|
|
18704
|
-
import_handlebars.default.registerHelper("uppercase", (str) => {
|
|
18705
|
-
return String(str || "").toUpperCase();
|
|
18706
|
-
});
|
|
18707
|
-
import_handlebars.default.registerHelper("lowercase", (str) => {
|
|
18708
|
-
return String(str || "").toLowerCase();
|
|
18709
|
-
});
|
|
18710
|
-
import_handlebars.default.registerHelper("replace", (str, search, replace) => {
|
|
18711
|
-
return String(str || "").split(search).join(replace);
|
|
18712
|
-
});
|
|
18713
|
-
import_handlebars.default.registerHelper("eq", (a, b) => {
|
|
18714
|
-
return a === b;
|
|
18715
|
-
});
|
|
18716
|
-
import_handlebars.default.registerHelper("neq", (a, b) => {
|
|
18717
|
-
return a !== b;
|
|
18718
|
-
});
|
|
18719
|
-
import_handlebars.default.registerHelper("gt", (a, b) => {
|
|
18720
|
-
return Number(a) > Number(b);
|
|
18721
|
-
});
|
|
18722
|
-
import_handlebars.default.registerHelper("lt", (a, b) => {
|
|
18723
|
-
return Number(a) < Number(b);
|
|
18724
|
-
});
|
|
18725
|
-
import_handlebars.default.registerHelper("gte", (a, b) => {
|
|
18726
|
-
return Number(a) >= Number(b);
|
|
18727
|
-
});
|
|
18728
|
-
import_handlebars.default.registerHelper("lte", (a, b) => {
|
|
18729
|
-
return Number(a) <= Number(b);
|
|
18730
|
-
});
|
|
18731
|
-
import_handlebars.default.registerHelper("default", (value, defaultValue) => {
|
|
18732
|
-
return value ?? defaultValue;
|
|
18733
|
-
});
|
|
18734
|
-
import_handlebars.default.registerHelper("json", (obj) => {
|
|
18735
|
-
return JSON.stringify(obj, null, 2);
|
|
18736
|
-
});
|
|
18737
|
-
import_handlebars.default.registerHelper("isDefined", (value) => value !== void 0);
|
|
18738
|
-
helpersRegistered = true;
|
|
18739
|
-
}
|
|
18740
|
-
function renderTemplate(templateString, context, options = {}) {
|
|
18741
|
-
if (!templateString || typeof templateString !== "string") {
|
|
18742
|
-
return "";
|
|
18743
|
-
}
|
|
18744
|
-
if (!helpersRegistered) {
|
|
18745
|
-
registerHandlebarsHelpers();
|
|
18746
|
-
}
|
|
18747
|
-
try {
|
|
18748
|
-
const template = import_handlebars.default.compile(templateString);
|
|
18749
|
-
return template(context);
|
|
18750
|
-
} catch (error) {
|
|
18751
|
-
console.error("\u274C Handlebars template error:", error);
|
|
18752
|
-
console.error("Template:", templateString);
|
|
18753
|
-
console.error("Context keys:", Object.keys(context));
|
|
18754
|
-
if (options.onError === "raw") {
|
|
18755
|
-
return templateString;
|
|
19125
|
+
const row = await this.getRawRow(fullId);
|
|
19126
|
+
if (!row) {
|
|
19127
|
+
throw new EntityNotFoundError("User", userId);
|
|
18756
19128
|
}
|
|
18757
|
-
|
|
19129
|
+
const stored = row.data.agentic_tools ?? {};
|
|
19130
|
+
const toolFields = { ...stored[tool] ?? {} };
|
|
19131
|
+
delete toolFields[field];
|
|
19132
|
+
const next = { ...stored };
|
|
19133
|
+
if (Object.keys(toolFields).length > 0) {
|
|
19134
|
+
next[tool] = toolFields;
|
|
19135
|
+
} else {
|
|
19136
|
+
delete next[tool];
|
|
19137
|
+
}
|
|
19138
|
+
await update(this.db, users3).set({
|
|
19139
|
+
data: { ...row.data, agentic_tools: next },
|
|
19140
|
+
updated_at: /* @__PURE__ */ new Date()
|
|
19141
|
+
}).where((0, import_drizzle_orm37.eq)(users3.user_id, fullId)).run();
|
|
19142
|
+
}
|
|
19143
|
+
};
|
|
19144
|
+
|
|
19145
|
+
// src/db/index.ts
|
|
19146
|
+
init_schema();
|
|
19147
|
+
|
|
19148
|
+
// src/db/session-guard.ts
|
|
19149
|
+
init_cjs_shims();
|
|
19150
|
+
init_ids();
|
|
19151
|
+
async function withSessionGuard(sessionId, sessionsRepo, operation) {
|
|
19152
|
+
const sessionExists = await sessionsRepo?.findById(sessionId);
|
|
19153
|
+
if (!sessionExists) {
|
|
19154
|
+
console.warn(`\u26A0\uFE0F Session ${shortId(sessionId)} no longer exists, skipping guarded operation`);
|
|
19155
|
+
return null;
|
|
18758
19156
|
}
|
|
19157
|
+
return operation();
|
|
18759
19158
|
}
|
|
18760
|
-
function
|
|
18761
|
-
|
|
18762
|
-
unique_id: branch.branch_unique_id,
|
|
18763
|
-
name: branch.name,
|
|
18764
|
-
path: branch.path,
|
|
18765
|
-
gid: branch.unix_gid
|
|
18766
|
-
};
|
|
18767
|
-
return {
|
|
18768
|
-
// Scoped entities (accessible as {{entity.property}})
|
|
18769
|
-
branch: branchEntity,
|
|
18770
|
-
// Legacy alias — preserved for existing env templates that reference
|
|
18771
|
-
// {{worktree.*}} keys. Points at the same object so updates stay in sync.
|
|
18772
|
-
worktree: branchEntity,
|
|
18773
|
-
repo: {
|
|
18774
|
-
slug: branch.repo_slug || ""
|
|
18775
|
-
},
|
|
18776
|
-
host: {
|
|
18777
|
-
ip_address: branch.host_ip_address || ""
|
|
18778
|
-
},
|
|
18779
|
-
// User-defined custom context (accessible as {{custom.key}})
|
|
18780
|
-
custom: branch.custom_context || {}
|
|
18781
|
-
};
|
|
19159
|
+
function isForeignKeyConstraintError(error) {
|
|
19160
|
+
return error instanceof Error && (error.message.includes("FOREIGN KEY constraint failed") || error.message.includes("SQLITE_CONSTRAINT_FOREIGNKEY"));
|
|
18782
19161
|
}
|
|
18783
19162
|
|
|
19163
|
+
// src/db/index.ts
|
|
19164
|
+
init_tenant_scope();
|
|
19165
|
+
init_user_utils();
|
|
19166
|
+
var compare = import_bcryptjs3.default.compare;
|
|
19167
|
+
var hash = import_bcryptjs3.default.hash;
|
|
19168
|
+
|
|
18784
19169
|
// src/environment/render-snapshot.ts
|
|
19170
|
+
init_cjs_shims();
|
|
18785
19171
|
function deepMergeContext(base, overrides) {
|
|
18786
19172
|
if (!overrides) return base;
|
|
18787
19173
|
const out = { ...base };
|
|
@@ -18818,7 +19204,9 @@ function renderBranchSnapshot(repo, branch, variantName) {
|
|
|
18818
19204
|
repo_slug: repo.slug,
|
|
18819
19205
|
custom_context: branch.custom_context,
|
|
18820
19206
|
unix_gid: branch.unix_gid,
|
|
18821
|
-
host_ip_address: branch.host_ip_address
|
|
19207
|
+
host_ip_address: branch.host_ip_address,
|
|
19208
|
+
base_ref: branch.base_ref,
|
|
19209
|
+
ref_type: branch.ref_type
|
|
18822
19210
|
});
|
|
18823
19211
|
const { custom, ...nonCustomBase } = baseContext;
|
|
18824
19212
|
const overridden = deepMergeContext(
|
|
@@ -19032,200 +19420,6 @@ async function validateDirectory(path2, context = "Directory") {
|
|
|
19032
19420
|
// src/mcp/index.ts
|
|
19033
19421
|
init_cjs_shims();
|
|
19034
19422
|
|
|
19035
|
-
// src/mcp/template-resolver.ts
|
|
19036
|
-
init_cjs_shims();
|
|
19037
|
-
function buildMCPTemplateContextFromEnv(env) {
|
|
19038
|
-
const userEnvKeysStr = env[AGOR_USER_ENV_KEYS_VAR];
|
|
19039
|
-
const allowedKeys = userEnvKeysStr ? new Set(userEnvKeysStr.split(",")) : /* @__PURE__ */ new Set();
|
|
19040
|
-
const userEnv = {};
|
|
19041
|
-
for (const key of allowedKeys) {
|
|
19042
|
-
const value = env[key];
|
|
19043
|
-
if (value !== void 0) {
|
|
19044
|
-
userEnv[key] = value;
|
|
19045
|
-
}
|
|
19046
|
-
}
|
|
19047
|
-
return {
|
|
19048
|
-
user: {
|
|
19049
|
-
env: userEnv
|
|
19050
|
-
}
|
|
19051
|
-
};
|
|
19052
|
-
}
|
|
19053
|
-
function containsTemplate(value) {
|
|
19054
|
-
return value.includes("{{") && value.includes("}}");
|
|
19055
|
-
}
|
|
19056
|
-
function resolveStringValue(fieldName, templateValue, context) {
|
|
19057
|
-
if (!containsTemplate(templateValue)) {
|
|
19058
|
-
return templateValue;
|
|
19059
|
-
}
|
|
19060
|
-
try {
|
|
19061
|
-
const resolved = renderTemplate(templateValue, context);
|
|
19062
|
-
if (!resolved || resolved.trim() === "") {
|
|
19063
|
-
console.log(` \u2139\uFE0F MCP "${fieldName}" resolved to empty (user may need to set env var)`);
|
|
19064
|
-
return void 0;
|
|
19065
|
-
}
|
|
19066
|
-
return resolved;
|
|
19067
|
-
} catch (error) {
|
|
19068
|
-
console.warn(
|
|
19069
|
-
` \u26A0\uFE0F Failed to resolve MCP template "${fieldName}":`,
|
|
19070
|
-
error instanceof Error ? error.message : String(error)
|
|
19071
|
-
);
|
|
19072
|
-
return void 0;
|
|
19073
|
-
}
|
|
19074
|
-
}
|
|
19075
|
-
function resolveMcpServerEnv(envTemplate, context) {
|
|
19076
|
-
if (!envTemplate || Object.keys(envTemplate).length === 0) {
|
|
19077
|
-
return void 0;
|
|
19078
|
-
}
|
|
19079
|
-
const result = {};
|
|
19080
|
-
for (const [key, templateValue] of Object.entries(envTemplate)) {
|
|
19081
|
-
const resolved = resolveStringValue(`env.${key}`, templateValue, context);
|
|
19082
|
-
if (resolved !== void 0) {
|
|
19083
|
-
result[key] = resolved;
|
|
19084
|
-
}
|
|
19085
|
-
}
|
|
19086
|
-
return Object.keys(result).length > 0 ? result : void 0;
|
|
19087
|
-
}
|
|
19088
|
-
function resolveMcpServerTemplates(server, context) {
|
|
19089
|
-
const resolved = { ...server };
|
|
19090
|
-
const unresolvedFields = [];
|
|
19091
|
-
const hadUrlTemplate = server.url && containsTemplate(server.url);
|
|
19092
|
-
if (server.url) {
|
|
19093
|
-
resolved.url = resolveStringValue("url", server.url, context);
|
|
19094
|
-
if (hadUrlTemplate && !resolved.url) {
|
|
19095
|
-
unresolvedFields.push("url");
|
|
19096
|
-
}
|
|
19097
|
-
}
|
|
19098
|
-
if (server.env) {
|
|
19099
|
-
const resolvedEnv = {};
|
|
19100
|
-
for (const [key, templateValue] of Object.entries(server.env)) {
|
|
19101
|
-
const hadTemplate = containsTemplate(templateValue);
|
|
19102
|
-
const resolvedValue = resolveStringValue(`env.${key}`, templateValue, context);
|
|
19103
|
-
if (resolvedValue !== void 0) {
|
|
19104
|
-
resolvedEnv[key] = resolvedValue;
|
|
19105
|
-
} else if (hadTemplate) {
|
|
19106
|
-
unresolvedFields.push(`env.${key}`);
|
|
19107
|
-
}
|
|
19108
|
-
}
|
|
19109
|
-
resolved.env = Object.keys(resolvedEnv).length > 0 ? resolvedEnv : void 0;
|
|
19110
|
-
}
|
|
19111
|
-
if (server.headers) {
|
|
19112
|
-
const resolvedHeaders = {};
|
|
19113
|
-
for (const [key, templateValue] of Object.entries(server.headers)) {
|
|
19114
|
-
const hadTemplate = containsTemplate(templateValue);
|
|
19115
|
-
const resolvedValue = resolveStringValue(`headers.${key}`, templateValue, context);
|
|
19116
|
-
if (resolvedValue !== void 0) {
|
|
19117
|
-
resolvedHeaders[key] = resolvedValue;
|
|
19118
|
-
} else if (hadTemplate) {
|
|
19119
|
-
unresolvedFields.push(`headers.${key}`);
|
|
19120
|
-
}
|
|
19121
|
-
}
|
|
19122
|
-
resolved.headers = Object.keys(resolvedHeaders).length > 0 ? resolvedHeaders : void 0;
|
|
19123
|
-
}
|
|
19124
|
-
if (server.auth) {
|
|
19125
|
-
const resolvedAuth = { ...server.auth };
|
|
19126
|
-
if (server.auth.token) {
|
|
19127
|
-
const hadTemplate = containsTemplate(server.auth.token);
|
|
19128
|
-
resolvedAuth.token = resolveStringValue("auth.token", server.auth.token, context);
|
|
19129
|
-
if (hadTemplate && !resolvedAuth.token) {
|
|
19130
|
-
unresolvedFields.push("auth.token");
|
|
19131
|
-
}
|
|
19132
|
-
}
|
|
19133
|
-
if (server.auth.api_url) {
|
|
19134
|
-
const hadTemplate = containsTemplate(server.auth.api_url);
|
|
19135
|
-
resolvedAuth.api_url = resolveStringValue("auth.api_url", server.auth.api_url, context);
|
|
19136
|
-
if (hadTemplate && !resolvedAuth.api_url) {
|
|
19137
|
-
unresolvedFields.push("auth.api_url");
|
|
19138
|
-
}
|
|
19139
|
-
}
|
|
19140
|
-
if (server.auth.api_token) {
|
|
19141
|
-
const hadTemplate = containsTemplate(server.auth.api_token);
|
|
19142
|
-
resolvedAuth.api_token = resolveStringValue("auth.api_token", server.auth.api_token, context);
|
|
19143
|
-
if (hadTemplate && !resolvedAuth.api_token) {
|
|
19144
|
-
unresolvedFields.push("auth.api_token");
|
|
19145
|
-
}
|
|
19146
|
-
}
|
|
19147
|
-
if (server.auth.api_secret) {
|
|
19148
|
-
const hadTemplate = containsTemplate(server.auth.api_secret);
|
|
19149
|
-
resolvedAuth.api_secret = resolveStringValue(
|
|
19150
|
-
"auth.api_secret",
|
|
19151
|
-
server.auth.api_secret,
|
|
19152
|
-
context
|
|
19153
|
-
);
|
|
19154
|
-
if (hadTemplate && !resolvedAuth.api_secret) {
|
|
19155
|
-
unresolvedFields.push("auth.api_secret");
|
|
19156
|
-
}
|
|
19157
|
-
}
|
|
19158
|
-
if (server.auth.type === "oauth") {
|
|
19159
|
-
if (server.auth.oauth_token_url) {
|
|
19160
|
-
const _hadTemplate = containsTemplate(server.auth.oauth_token_url);
|
|
19161
|
-
resolvedAuth.oauth_token_url = resolveStringValue(
|
|
19162
|
-
"auth.oauth_token_url",
|
|
19163
|
-
server.auth.oauth_token_url,
|
|
19164
|
-
context
|
|
19165
|
-
);
|
|
19166
|
-
}
|
|
19167
|
-
if (server.auth.oauth_client_id) {
|
|
19168
|
-
const _hadTemplate = containsTemplate(server.auth.oauth_client_id);
|
|
19169
|
-
resolvedAuth.oauth_client_id = resolveStringValue(
|
|
19170
|
-
"auth.oauth_client_id",
|
|
19171
|
-
server.auth.oauth_client_id,
|
|
19172
|
-
context
|
|
19173
|
-
);
|
|
19174
|
-
}
|
|
19175
|
-
if (server.auth.oauth_client_secret) {
|
|
19176
|
-
const _hadTemplate = containsTemplate(server.auth.oauth_client_secret);
|
|
19177
|
-
resolvedAuth.oauth_client_secret = resolveStringValue(
|
|
19178
|
-
"auth.oauth_client_secret",
|
|
19179
|
-
server.auth.oauth_client_secret,
|
|
19180
|
-
context
|
|
19181
|
-
);
|
|
19182
|
-
}
|
|
19183
|
-
if (server.auth.oauth_scope) {
|
|
19184
|
-
const _hadTemplate = containsTemplate(server.auth.oauth_scope);
|
|
19185
|
-
resolvedAuth.oauth_scope = resolveStringValue(
|
|
19186
|
-
"auth.oauth_scope",
|
|
19187
|
-
server.auth.oauth_scope,
|
|
19188
|
-
context
|
|
19189
|
-
);
|
|
19190
|
-
}
|
|
19191
|
-
resolvedAuth.oauth_grant_type = server.auth.oauth_grant_type || "client_credentials";
|
|
19192
|
-
}
|
|
19193
|
-
resolved.auth = resolvedAuth;
|
|
19194
|
-
}
|
|
19195
|
-
const isHttpTransport = server.transport === "http" || server.transport === "sse";
|
|
19196
|
-
const urlRequired = isHttpTransport && hadUrlTemplate;
|
|
19197
|
-
const urlMissing = urlRequired && !resolved.url;
|
|
19198
|
-
const isValid2 = !urlMissing;
|
|
19199
|
-
let errorMessage;
|
|
19200
|
-
if (!isValid2) {
|
|
19201
|
-
const missingVars = unresolvedFields.map((f) => {
|
|
19202
|
-
let originalValue;
|
|
19203
|
-
if (f === "url") {
|
|
19204
|
-
originalValue = server.url;
|
|
19205
|
-
} else if (f.startsWith("env.")) {
|
|
19206
|
-
originalValue = server.env?.[f.slice(4)];
|
|
19207
|
-
} else if (f.startsWith("headers.")) {
|
|
19208
|
-
originalValue = server.headers?.[f.slice(8)];
|
|
19209
|
-
} else if (f.startsWith("auth.") && server.auth) {
|
|
19210
|
-
const authKey = f.slice(5);
|
|
19211
|
-
const authValue = server.auth[authKey];
|
|
19212
|
-
originalValue = typeof authValue === "string" ? authValue : void 0;
|
|
19213
|
-
}
|
|
19214
|
-
return originalValue || f;
|
|
19215
|
-
}).join(", ");
|
|
19216
|
-
errorMessage = `MCP server "${server.name}" has unresolved required templates: ${missingVars}. Set the corresponding environment variables in your user settings.`;
|
|
19217
|
-
}
|
|
19218
|
-
return {
|
|
19219
|
-
server: resolved,
|
|
19220
|
-
unresolvedFields,
|
|
19221
|
-
isValid: isValid2,
|
|
19222
|
-
errorMessage
|
|
19223
|
-
};
|
|
19224
|
-
}
|
|
19225
|
-
function resolveMcpServersTemplates(servers, context) {
|
|
19226
|
-
return servers.map((server) => resolveMcpServerTemplates(server, context));
|
|
19227
|
-
}
|
|
19228
|
-
|
|
19229
19423
|
// src/search/index.ts
|
|
19230
19424
|
init_cjs_shims();
|
|
19231
19425
|
|
|
@@ -22543,6 +22737,7 @@ function unpatchConsole() {
|
|
|
22543
22737
|
SudoCliExecutor,
|
|
22544
22738
|
SudoDirectExecutor,
|
|
22545
22739
|
SymlinkCommands,
|
|
22740
|
+
TEMPLATE_RESOLVABLE_MCP_AUTH_SECRET_FIELDS,
|
|
22546
22741
|
TERMINAL_TASK_STATUSES,
|
|
22547
22742
|
TOOL_API_KEY_NAMES,
|
|
22548
22743
|
TaskRepository,
|
|
@@ -22604,6 +22799,7 @@ function unpatchConsole() {
|
|
|
22604
22799
|
checkAsUser,
|
|
22605
22800
|
checkMigrationStatus,
|
|
22606
22801
|
compare,
|
|
22802
|
+
containsTemplate,
|
|
22607
22803
|
count,
|
|
22608
22804
|
createAdminExecutor,
|
|
22609
22805
|
createClient,
|
|
@@ -22693,6 +22889,7 @@ function unpatchConsole() {
|
|
|
22693
22889
|
getRepoReferenceOptions,
|
|
22694
22890
|
getReposDir,
|
|
22695
22891
|
getReposDirAsync,
|
|
22892
|
+
getRequiredSecretFields,
|
|
22696
22893
|
getServiceTier,
|
|
22697
22894
|
getSessionType,
|
|
22698
22895
|
getUidFromUsername,
|
|
@@ -22745,6 +22942,7 @@ function unpatchConsole() {
|
|
|
22745
22942
|
isThreadRoot,
|
|
22746
22943
|
isUnixGroupRefreshNeeded,
|
|
22747
22944
|
isUnixImpersonationEnabled,
|
|
22945
|
+
isUserEnvPlaceholder,
|
|
22748
22946
|
isUserInGroup,
|
|
22749
22947
|
isValid,
|
|
22750
22948
|
isValidBranchGroupName,
|