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.js
CHANGED
|
@@ -1641,6 +1641,21 @@ var init_file = __esm({
|
|
|
1641
1641
|
});
|
|
1642
1642
|
|
|
1643
1643
|
// src/types/gateway.ts
|
|
1644
|
+
function getRequiredSecretFields(channelType, config) {
|
|
1645
|
+
switch (channelType) {
|
|
1646
|
+
case "slack": {
|
|
1647
|
+
const wantsInbound = config.connection_mode === "socket" || config.enable_channels === true || config.enable_groups === true || config.enable_mpim === true;
|
|
1648
|
+
const outboundOnly = config.outbound_enabled === true && !wantsInbound;
|
|
1649
|
+
return outboundOnly ? ["bot_token"] : ["bot_token", "app_token"];
|
|
1650
|
+
}
|
|
1651
|
+
case "github":
|
|
1652
|
+
return ["private_key"];
|
|
1653
|
+
case "teams":
|
|
1654
|
+
return ["app_password"];
|
|
1655
|
+
default:
|
|
1656
|
+
return [];
|
|
1657
|
+
}
|
|
1658
|
+
}
|
|
1644
1659
|
var GATEWAY_SENSITIVE_CONFIG_FIELDS, GATEWAY_REDACTED_SENTINEL;
|
|
1645
1660
|
var init_gateway = __esm({
|
|
1646
1661
|
"src/types/gateway.ts"() {
|
|
@@ -5998,6 +6013,7 @@ __export(src_exports, {
|
|
|
5998
6013
|
SudoCliExecutor: () => SudoCliExecutor,
|
|
5999
6014
|
SudoDirectExecutor: () => SudoDirectExecutor,
|
|
6000
6015
|
SymlinkCommands: () => SymlinkCommands,
|
|
6016
|
+
TEMPLATE_RESOLVABLE_MCP_AUTH_SECRET_FIELDS: () => TEMPLATE_RESOLVABLE_MCP_AUTH_SECRET_FIELDS,
|
|
6001
6017
|
TERMINAL_TASK_STATUSES: () => TERMINAL_TASK_STATUSES,
|
|
6002
6018
|
TOOL_API_KEY_NAMES: () => TOOL_API_KEY_NAMES,
|
|
6003
6019
|
TaskRepository: () => TaskRepository,
|
|
@@ -6059,6 +6075,7 @@ __export(src_exports, {
|
|
|
6059
6075
|
checkAsUser: () => checkAsUser,
|
|
6060
6076
|
checkMigrationStatus: () => checkMigrationStatus,
|
|
6061
6077
|
compare: () => compare,
|
|
6078
|
+
containsTemplate: () => containsTemplate,
|
|
6062
6079
|
count: () => count,
|
|
6063
6080
|
createAdminExecutor: () => createAdminExecutor,
|
|
6064
6081
|
createClient: () => createClient,
|
|
@@ -6148,6 +6165,7 @@ __export(src_exports, {
|
|
|
6148
6165
|
getRepoReferenceOptions: () => getRepoReferenceOptions,
|
|
6149
6166
|
getReposDir: () => getReposDir,
|
|
6150
6167
|
getReposDirAsync: () => getReposDirAsync,
|
|
6168
|
+
getRequiredSecretFields: () => getRequiredSecretFields,
|
|
6151
6169
|
getServiceTier: () => getServiceTier,
|
|
6152
6170
|
getSessionType: () => getSessionType,
|
|
6153
6171
|
getUidFromUsername: () => getUidFromUsername,
|
|
@@ -6200,6 +6218,7 @@ __export(src_exports, {
|
|
|
6200
6218
|
isThreadRoot: () => isThreadRoot,
|
|
6201
6219
|
isUnixGroupRefreshNeeded: () => isUnixGroupRefreshNeeded,
|
|
6202
6220
|
isUnixImpersonationEnabled: () => isUnixImpersonationEnabled,
|
|
6221
|
+
isUserEnvPlaceholder: () => isUserEnvPlaceholder,
|
|
6203
6222
|
isUserInGroup: () => isUserInGroup,
|
|
6204
6223
|
isValid: () => isValid,
|
|
6205
6224
|
isValidBranchGroupName: () => isValidBranchGroupName,
|
|
@@ -11517,6 +11536,63 @@ var BranchRepository = class {
|
|
|
11517
11536
|
}
|
|
11518
11537
|
return Array.from(userIds);
|
|
11519
11538
|
}
|
|
11539
|
+
/**
|
|
11540
|
+
* Find non-archived branches whose explicit filesystem access set can change
|
|
11541
|
+
* when membership in the given group changes.
|
|
11542
|
+
*
|
|
11543
|
+
* Keep this inverse lookup in lockstep with findExplicitFsAccessUserIds():
|
|
11544
|
+
* both encode which group grants materialize into branch-folder access.
|
|
11545
|
+
* App-only grants (`fs_access = 'none'`) are intentionally excluded because
|
|
11546
|
+
* membership changes for those grants do not require branch-folder mutation.
|
|
11547
|
+
*/
|
|
11548
|
+
async findExplicitFsAccessBranchIdsForGroup(groupId) {
|
|
11549
|
+
const directRows = await select(this.db, { branch_id: branchGroupGrants3.branch_id }).from(branchGroupGrants3).innerJoin(branches3, eq14(branches3.branch_id, branchGroupGrants3.branch_id)).innerJoin(
|
|
11550
|
+
groups3,
|
|
11551
|
+
and12(eq14(groups3.group_id, branchGroupGrants3.group_id), eq14(groups3.archived, false))
|
|
11552
|
+
).where(
|
|
11553
|
+
and12(
|
|
11554
|
+
eq14(branchGroupGrants3.group_id, groupId),
|
|
11555
|
+
eq14(branches3.archived, false),
|
|
11556
|
+
inArray4(
|
|
11557
|
+
sql9`coalesce(${branchGroupGrants3.fs_access}, 'read')`,
|
|
11558
|
+
FS_ACCESS_BRANCH_PERMISSIONS
|
|
11559
|
+
)
|
|
11560
|
+
)
|
|
11561
|
+
).all();
|
|
11562
|
+
const boardRows = await select(this.db, { branch_id: branches3.branch_id }).from(boardGroupGrants3).innerJoin(
|
|
11563
|
+
groups3,
|
|
11564
|
+
and12(eq14(groups3.group_id, boardGroupGrants3.group_id), eq14(groups3.archived, false))
|
|
11565
|
+
).innerJoin(
|
|
11566
|
+
boards3,
|
|
11567
|
+
and12(
|
|
11568
|
+
eq14(boards3.board_id, boardGroupGrants3.board_id),
|
|
11569
|
+
eq14(sql9`coalesce(${jsonExtract(this.db, boards3.data, "access_mode")}, 'shared')`, "shared")
|
|
11570
|
+
)
|
|
11571
|
+
).innerJoin(
|
|
11572
|
+
branches3,
|
|
11573
|
+
and12(
|
|
11574
|
+
eq14(branches3.board_id, boardGroupGrants3.board_id),
|
|
11575
|
+
eq14(branches3.permission_source, "board"),
|
|
11576
|
+
eq14(branches3.archived, false)
|
|
11577
|
+
)
|
|
11578
|
+
).where(
|
|
11579
|
+
and12(
|
|
11580
|
+
eq14(boardGroupGrants3.group_id, groupId),
|
|
11581
|
+
inArray4(
|
|
11582
|
+
sql9`coalesce(${boardGroupGrants3.fs_access}, 'read')`,
|
|
11583
|
+
FS_ACCESS_BRANCH_PERMISSIONS
|
|
11584
|
+
)
|
|
11585
|
+
)
|
|
11586
|
+
).all();
|
|
11587
|
+
const branchIds = /* @__PURE__ */ new Set();
|
|
11588
|
+
for (const row of directRows) {
|
|
11589
|
+
branchIds.add(row.branch_id);
|
|
11590
|
+
}
|
|
11591
|
+
for (const row of boardRows) {
|
|
11592
|
+
branchIds.add(row.branch_id);
|
|
11593
|
+
}
|
|
11594
|
+
return Array.from(branchIds);
|
|
11595
|
+
}
|
|
11520
11596
|
async findBoardAlignedBranches(boardId) {
|
|
11521
11597
|
const rows = await select(this.db).from(branches3).where(
|
|
11522
11598
|
and12(
|
|
@@ -12524,6 +12600,60 @@ var BoardRepository = class {
|
|
|
12524
12600
|
);
|
|
12525
12601
|
}
|
|
12526
12602
|
}
|
|
12603
|
+
/**
|
|
12604
|
+
* Shallow-merge field patches into existing board objects in a single
|
|
12605
|
+
* read-modify-write.
|
|
12606
|
+
*
|
|
12607
|
+
* Unlike upsertBoardObject (which fully replaces the object value, dropping
|
|
12608
|
+
* omitted fields), this overwrites ONLY the provided keys and leaves the rest
|
|
12609
|
+
* of each object intact — so a narrow change (e.g. a zIndex reorder) has a
|
|
12610
|
+
* smaller blast radius and won't clobber a field edited via a different patch
|
|
12611
|
+
* call. Multiple objects in one call are merged before a single write, so a
|
|
12612
|
+
* forward/backward swap touches both neighbors in one update.
|
|
12613
|
+
*
|
|
12614
|
+
* Objects that no longer exist are SKIPPED, never re-created — so a swap can't
|
|
12615
|
+
* resurrect a neighbor deleted between the client's read and this write.
|
|
12616
|
+
*
|
|
12617
|
+
* Only an explicit allowlist of fields can be merged (currently just `zIndex`,
|
|
12618
|
+
* which is also clamped into the board-object band [1, 499] so it can never be
|
|
12619
|
+
* pushed onto the card (500) / comment (1000) layers). Any other key in a
|
|
12620
|
+
* patch is ignored, so this narrow action cannot reshape an object (e.g. flip
|
|
12621
|
+
* its `type`) the way a full upsert could.
|
|
12622
|
+
*
|
|
12623
|
+
* NOTE: this is NOT atomic against concurrent writers. Like every other board
|
|
12624
|
+
* writer, the findById → update sequence has a lost-update window: a write
|
|
12625
|
+
* that lands between the read and the update can be overwritten (last-write-
|
|
12626
|
+
* wins). Merging only the patched keys narrows that window's blast radius
|
|
12627
|
+
* versus a full-object upsert, but does not close it.
|
|
12628
|
+
*/
|
|
12629
|
+
async mergeBoardObjectFields(boardId, patches) {
|
|
12630
|
+
const Z_MIN = 1;
|
|
12631
|
+
const Z_MAX = 499;
|
|
12632
|
+
try {
|
|
12633
|
+
const fullId = await this.resolveId(boardId);
|
|
12634
|
+
const current = await this.findById(fullId);
|
|
12635
|
+
if (!current) {
|
|
12636
|
+
throw new EntityNotFoundError("Board", boardId);
|
|
12637
|
+
}
|
|
12638
|
+
const updatedObjects = { ...current.objects || {} };
|
|
12639
|
+
for (const [objectId, fields] of Object.entries(patches)) {
|
|
12640
|
+
const existing = updatedObjects[objectId];
|
|
12641
|
+
if (!existing) continue;
|
|
12642
|
+
const { zIndex } = fields;
|
|
12643
|
+
if (typeof zIndex !== "number" || !Number.isFinite(zIndex)) continue;
|
|
12644
|
+
const safeZIndex = Math.min(Z_MAX, Math.max(Z_MIN, zIndex));
|
|
12645
|
+
updatedObjects[objectId] = { ...existing, zIndex: safeZIndex };
|
|
12646
|
+
}
|
|
12647
|
+
return this.update(fullId, { objects: updatedObjects });
|
|
12648
|
+
} catch (error) {
|
|
12649
|
+
if (error instanceof RepositoryError) throw error;
|
|
12650
|
+
if (error instanceof EntityNotFoundError) throw error;
|
|
12651
|
+
throw new RepositoryError(
|
|
12652
|
+
`Failed to merge board object fields: ${error instanceof Error ? error.message : String(error)}`,
|
|
12653
|
+
error
|
|
12654
|
+
);
|
|
12655
|
+
}
|
|
12656
|
+
}
|
|
12527
12657
|
/**
|
|
12528
12658
|
* DEPRECATED: Delete a zone and handle associated sessions
|
|
12529
12659
|
* TODO: Reimplement using board-objects table
|
|
@@ -13258,6 +13388,28 @@ var GatewayChannelRepository = class {
|
|
|
13258
13388
|
agentic_config: encryptedAgenticConfig
|
|
13259
13389
|
};
|
|
13260
13390
|
}
|
|
13391
|
+
/**
|
|
13392
|
+
* Enforce the "enabled requires secrets" invariant on every write path.
|
|
13393
|
+
*
|
|
13394
|
+
* An enabled channel can never exist without the secrets its type needs to
|
|
13395
|
+
* function. Runs on the post-merge, decrypted config so a patch that only
|
|
13396
|
+
* flips `enabled: true` on a channel with already-stored tokens passes.
|
|
13397
|
+
* Disabled ("draft") channels are exempt.
|
|
13398
|
+
*/
|
|
13399
|
+
assertRequiredSecretsWhenEnabled(channel) {
|
|
13400
|
+
if (channel.enabled === false) return;
|
|
13401
|
+
const channelType = channel.channel_type ?? "slack";
|
|
13402
|
+
const config = channel.config ?? {};
|
|
13403
|
+
const missing = getRequiredSecretFields(channelType, config).filter((field) => {
|
|
13404
|
+
const value = config[field];
|
|
13405
|
+
return typeof value !== "string" || value.trim() === "" || value === GATEWAY_REDACTED_SENTINEL;
|
|
13406
|
+
});
|
|
13407
|
+
if (missing.length > 0) {
|
|
13408
|
+
throw new RepositoryError(
|
|
13409
|
+
`Cannot enable ${channelType} gateway channel: missing required secret(s) ${missing.join(", ")}`
|
|
13410
|
+
);
|
|
13411
|
+
}
|
|
13412
|
+
}
|
|
13261
13413
|
/**
|
|
13262
13414
|
* Resolve short ID to full ID
|
|
13263
13415
|
*/
|
|
@@ -13289,6 +13441,7 @@ var GatewayChannelRepository = class {
|
|
|
13289
13441
|
id: data.id ?? generateId(),
|
|
13290
13442
|
channel_key: data.channel_key ?? generateId()
|
|
13291
13443
|
});
|
|
13444
|
+
this.assertRequiredSecretsWhenEnabled(data);
|
|
13292
13445
|
await insert(this.db, gatewayChannels3).values(insertData).run();
|
|
13293
13446
|
const row = await select(this.db).from(gatewayChannels3).where(eq18(gatewayChannels3.id, insertData.id)).one();
|
|
13294
13447
|
if (!row) {
|
|
@@ -13355,6 +13508,7 @@ var GatewayChannelRepository = class {
|
|
|
13355
13508
|
}
|
|
13356
13509
|
merged.config = mergedConfig;
|
|
13357
13510
|
}
|
|
13511
|
+
this.assertRequiredSecretsWhenEnabled(merged);
|
|
13358
13512
|
const insertData = this.channelToInsert(merged);
|
|
13359
13513
|
await update(this.db, gatewayChannels3).set({
|
|
13360
13514
|
name: insertData.name,
|
|
@@ -14869,90 +15023,439 @@ import { and as and17, eq as eq21, like as like10 } from "drizzle-orm";
|
|
|
14869
15023
|
// src/tools/mcp/auth-secrets.ts
|
|
14870
15024
|
init_esm_shims();
|
|
14871
15025
|
|
|
14872
|
-
// src/
|
|
15026
|
+
// src/mcp/template-resolver.ts
|
|
14873
15027
|
init_esm_shims();
|
|
14874
|
-
|
|
14875
|
-
|
|
14876
|
-
|
|
14877
|
-
|
|
14878
|
-
|
|
14879
|
-
|
|
14880
|
-
"
|
|
14881
|
-
|
|
14882
|
-
|
|
14883
|
-
|
|
14884
|
-
|
|
14885
|
-
|
|
14886
|
-
|
|
14887
|
-
|
|
14888
|
-
|
|
14889
|
-
|
|
14890
|
-
|
|
14891
|
-
|
|
14892
|
-
|
|
14893
|
-
}
|
|
14894
|
-
|
|
14895
|
-
|
|
15028
|
+
|
|
15029
|
+
// src/templates/handlebars-helpers.ts
|
|
15030
|
+
init_esm_shims();
|
|
15031
|
+
import Handlebars from "handlebars";
|
|
15032
|
+
var helpersRegistered = false;
|
|
15033
|
+
function registerHandlebarsHelpers() {
|
|
15034
|
+
Handlebars.registerHelper("add", (a, b) => {
|
|
15035
|
+
const numA = Number(a);
|
|
15036
|
+
const numB = Number(b);
|
|
15037
|
+
if (Number.isNaN(numA) || Number.isNaN(numB)) {
|
|
15038
|
+
console.warn(`\u26A0\uFE0F add helper received non-numeric values: ${a}, ${b}`);
|
|
15039
|
+
return 0;
|
|
15040
|
+
}
|
|
15041
|
+
return numA + numB;
|
|
15042
|
+
});
|
|
15043
|
+
Handlebars.registerHelper("sub", (a, b) => {
|
|
15044
|
+
const numA = Number(a);
|
|
15045
|
+
const numB = Number(b);
|
|
15046
|
+
if (Number.isNaN(numA) || Number.isNaN(numB)) {
|
|
15047
|
+
console.warn(`\u26A0\uFE0F sub helper received non-numeric values: ${a}, ${b}`);
|
|
15048
|
+
return 0;
|
|
15049
|
+
}
|
|
15050
|
+
return numA - numB;
|
|
15051
|
+
});
|
|
15052
|
+
Handlebars.registerHelper("mul", (a, b) => {
|
|
15053
|
+
const numA = Number(a);
|
|
15054
|
+
const numB = Number(b);
|
|
15055
|
+
if (Number.isNaN(numA) || Number.isNaN(numB)) {
|
|
15056
|
+
console.warn(`\u26A0\uFE0F mul helper received non-numeric values: ${a}, ${b}`);
|
|
15057
|
+
return 0;
|
|
15058
|
+
}
|
|
15059
|
+
return numA * numB;
|
|
15060
|
+
});
|
|
15061
|
+
Handlebars.registerHelper("div", (a, b) => {
|
|
15062
|
+
const numA = Number(a);
|
|
15063
|
+
const numB = Number(b);
|
|
15064
|
+
if (Number.isNaN(numA) || Number.isNaN(numB)) {
|
|
15065
|
+
console.warn(`\u26A0\uFE0F div helper received non-numeric values: ${a}, ${b}`);
|
|
15066
|
+
return 0;
|
|
15067
|
+
}
|
|
15068
|
+
if (numB === 0) {
|
|
15069
|
+
console.warn(`\u26A0\uFE0F div helper received zero divisor`);
|
|
15070
|
+
return 0;
|
|
15071
|
+
}
|
|
15072
|
+
return numA / numB;
|
|
15073
|
+
});
|
|
15074
|
+
Handlebars.registerHelper("mod", (a, b) => {
|
|
15075
|
+
const numA = Number(a);
|
|
15076
|
+
const numB = Number(b);
|
|
15077
|
+
if (Number.isNaN(numA) || Number.isNaN(numB)) {
|
|
15078
|
+
console.warn(`\u26A0\uFE0F mod helper received non-numeric values: ${a}, ${b}`);
|
|
15079
|
+
return 0;
|
|
15080
|
+
}
|
|
15081
|
+
if (numB === 0) {
|
|
15082
|
+
console.warn(`\u26A0\uFE0F mod helper received zero divisor`);
|
|
15083
|
+
return 0;
|
|
15084
|
+
}
|
|
15085
|
+
return numA % numB;
|
|
15086
|
+
});
|
|
15087
|
+
Handlebars.registerHelper("uppercase", (str) => {
|
|
15088
|
+
return String(str || "").toUpperCase();
|
|
15089
|
+
});
|
|
15090
|
+
Handlebars.registerHelper("lowercase", (str) => {
|
|
15091
|
+
return String(str || "").toLowerCase();
|
|
15092
|
+
});
|
|
15093
|
+
Handlebars.registerHelper("replace", (str, search, replace) => {
|
|
15094
|
+
return String(str || "").split(search).join(replace);
|
|
15095
|
+
});
|
|
15096
|
+
Handlebars.registerHelper("eq", (a, b) => {
|
|
15097
|
+
return a === b;
|
|
15098
|
+
});
|
|
15099
|
+
Handlebars.registerHelper("neq", (a, b) => {
|
|
15100
|
+
return a !== b;
|
|
15101
|
+
});
|
|
15102
|
+
Handlebars.registerHelper("gt", (a, b) => {
|
|
15103
|
+
return Number(a) > Number(b);
|
|
15104
|
+
});
|
|
15105
|
+
Handlebars.registerHelper("lt", (a, b) => {
|
|
15106
|
+
return Number(a) < Number(b);
|
|
15107
|
+
});
|
|
15108
|
+
Handlebars.registerHelper("gte", (a, b) => {
|
|
15109
|
+
return Number(a) >= Number(b);
|
|
15110
|
+
});
|
|
15111
|
+
Handlebars.registerHelper("lte", (a, b) => {
|
|
15112
|
+
return Number(a) <= Number(b);
|
|
15113
|
+
});
|
|
15114
|
+
Handlebars.registerHelper("default", (value, defaultValue) => {
|
|
15115
|
+
return value ?? defaultValue;
|
|
15116
|
+
});
|
|
15117
|
+
Handlebars.registerHelper("json", (obj) => {
|
|
15118
|
+
return JSON.stringify(obj, null, 2);
|
|
15119
|
+
});
|
|
15120
|
+
Handlebars.registerHelper("isDefined", (value) => value !== void 0);
|
|
15121
|
+
helpersRegistered = true;
|
|
14896
15122
|
}
|
|
14897
|
-
function
|
|
14898
|
-
if (!
|
|
14899
|
-
|
|
14900
|
-
for (const [rawName, rawValue] of Object.entries(headers)) {
|
|
14901
|
-
const name = rawName.trim();
|
|
14902
|
-
if (!name || !isValidMCPHeaderName(name)) continue;
|
|
14903
|
-
if (isReservedMCPCustomHeaderName(name)) continue;
|
|
14904
|
-
if (typeof rawValue !== "string") continue;
|
|
14905
|
-
normalized[name] = rawValue;
|
|
15123
|
+
function renderTemplate(templateString, context, options = {}) {
|
|
15124
|
+
if (!templateString || typeof templateString !== "string") {
|
|
15125
|
+
return "";
|
|
14906
15126
|
}
|
|
14907
|
-
|
|
14908
|
-
|
|
14909
|
-
function restoreRedactedMCPCustomHeaders(options) {
|
|
14910
|
-
if (!options.next) return void 0;
|
|
14911
|
-
const restored = {};
|
|
14912
|
-
for (const [key, value] of Object.entries(options.next)) {
|
|
14913
|
-
restored[key] = value === MCP_HEADER_REDACTED_SENTINEL && options.current?.[key] !== void 0 ? options.current[key] : value;
|
|
15127
|
+
if (!helpersRegistered) {
|
|
15128
|
+
registerHandlebarsHelpers();
|
|
14914
15129
|
}
|
|
14915
|
-
|
|
14916
|
-
|
|
14917
|
-
|
|
14918
|
-
|
|
14919
|
-
|
|
14920
|
-
|
|
14921
|
-
|
|
14922
|
-
|
|
14923
|
-
|
|
14924
|
-
"oauth_access_token",
|
|
14925
|
-
"oauth_refresh_token"
|
|
14926
|
-
];
|
|
14927
|
-
function restoreRedactedMCPAuthSecrets(options) {
|
|
14928
|
-
if (!options.next) return void 0;
|
|
14929
|
-
const restored = { ...options.next };
|
|
14930
|
-
const record = restored;
|
|
14931
|
-
for (const field of MCP_AUTH_SECRET_FIELDS) {
|
|
14932
|
-
if (restored[field] === MCP_HEADER_REDACTED_SENTINEL && options.current?.[field] !== void 0) {
|
|
14933
|
-
record[field] = options.current[field];
|
|
15130
|
+
try {
|
|
15131
|
+
const template = Handlebars.compile(templateString);
|
|
15132
|
+
return template(context);
|
|
15133
|
+
} catch (error) {
|
|
15134
|
+
console.error("\u274C Handlebars template error:", error);
|
|
15135
|
+
console.error("Template:", templateString);
|
|
15136
|
+
console.error("Context keys:", Object.keys(context));
|
|
15137
|
+
if (options.onError === "raw") {
|
|
15138
|
+
return templateString;
|
|
14934
15139
|
}
|
|
15140
|
+
return "";
|
|
14935
15141
|
}
|
|
14936
|
-
return restored;
|
|
14937
15142
|
}
|
|
14938
|
-
|
|
14939
|
-
|
|
14940
|
-
|
|
14941
|
-
|
|
14942
|
-
|
|
14943
|
-
|
|
14944
|
-
|
|
14945
|
-
|
|
14946
|
-
|
|
14947
|
-
|
|
14948
|
-
|
|
14949
|
-
|
|
14950
|
-
|
|
14951
|
-
|
|
14952
|
-
|
|
14953
|
-
|
|
14954
|
-
|
|
14955
|
-
|
|
15143
|
+
function buildBranchContext(branch) {
|
|
15144
|
+
const branchEntity = {
|
|
15145
|
+
unique_id: branch.branch_unique_id,
|
|
15146
|
+
name: branch.name,
|
|
15147
|
+
path: branch.path,
|
|
15148
|
+
gid: branch.unix_gid,
|
|
15149
|
+
base_ref: branch.base_ref || "",
|
|
15150
|
+
ref_type: branch.ref_type || "branch"
|
|
15151
|
+
};
|
|
15152
|
+
return {
|
|
15153
|
+
// Scoped entities (accessible as {{entity.property}})
|
|
15154
|
+
branch: branchEntity,
|
|
15155
|
+
// Legacy alias — preserved for existing env templates that reference
|
|
15156
|
+
// {{worktree.*}} keys. Points at the same object so updates stay in sync.
|
|
15157
|
+
worktree: branchEntity,
|
|
15158
|
+
repo: {
|
|
15159
|
+
slug: branch.repo_slug || ""
|
|
15160
|
+
},
|
|
15161
|
+
host: {
|
|
15162
|
+
ip_address: branch.host_ip_address || ""
|
|
15163
|
+
},
|
|
15164
|
+
// User-defined custom context (accessible as {{custom.key}})
|
|
15165
|
+
custom: branch.custom_context || {}
|
|
15166
|
+
};
|
|
15167
|
+
}
|
|
15168
|
+
|
|
15169
|
+
// src/mcp/template-patterns.ts
|
|
15170
|
+
init_esm_shims();
|
|
15171
|
+
function containsTemplate(value) {
|
|
15172
|
+
return value.includes("{{") && value.includes("}}");
|
|
15173
|
+
}
|
|
15174
|
+
var USER_ENV_PLACEHOLDER_RE = /^\{\{\s*user\.env\.[A-Za-z_][A-Za-z0-9_]*\s*\}\}$/;
|
|
15175
|
+
function isUserEnvPlaceholder(value) {
|
|
15176
|
+
return USER_ENV_PLACEHOLDER_RE.test(value.trim());
|
|
15177
|
+
}
|
|
15178
|
+
|
|
15179
|
+
// src/mcp/template-resolver.ts
|
|
15180
|
+
function buildMCPTemplateContextFromEnv(env) {
|
|
15181
|
+
const userEnvKeysStr = env[AGOR_USER_ENV_KEYS_VAR];
|
|
15182
|
+
const allowedKeys = userEnvKeysStr ? new Set(userEnvKeysStr.split(",")) : /* @__PURE__ */ new Set();
|
|
15183
|
+
const userEnv = {};
|
|
15184
|
+
for (const key of allowedKeys) {
|
|
15185
|
+
const value = env[key];
|
|
15186
|
+
if (value !== void 0) {
|
|
15187
|
+
userEnv[key] = value;
|
|
15188
|
+
}
|
|
15189
|
+
}
|
|
15190
|
+
return {
|
|
15191
|
+
user: {
|
|
15192
|
+
env: userEnv
|
|
15193
|
+
}
|
|
15194
|
+
};
|
|
15195
|
+
}
|
|
15196
|
+
function resolveStringValue(fieldName, templateValue, context) {
|
|
15197
|
+
if (!containsTemplate(templateValue)) {
|
|
15198
|
+
return templateValue;
|
|
15199
|
+
}
|
|
15200
|
+
try {
|
|
15201
|
+
const resolved = renderTemplate(templateValue, context);
|
|
15202
|
+
if (!resolved || resolved.trim() === "") {
|
|
15203
|
+
console.log(` \u2139\uFE0F MCP "${fieldName}" resolved to empty (user may need to set env var)`);
|
|
15204
|
+
return void 0;
|
|
15205
|
+
}
|
|
15206
|
+
return resolved;
|
|
15207
|
+
} catch (error) {
|
|
15208
|
+
console.warn(
|
|
15209
|
+
` \u26A0\uFE0F Failed to resolve MCP template "${fieldName}":`,
|
|
15210
|
+
error instanceof Error ? error.message : String(error)
|
|
15211
|
+
);
|
|
15212
|
+
return void 0;
|
|
15213
|
+
}
|
|
15214
|
+
}
|
|
15215
|
+
function resolveMcpServerEnv(envTemplate, context) {
|
|
15216
|
+
if (!envTemplate || Object.keys(envTemplate).length === 0) {
|
|
15217
|
+
return void 0;
|
|
15218
|
+
}
|
|
15219
|
+
const result = {};
|
|
15220
|
+
for (const [key, templateValue] of Object.entries(envTemplate)) {
|
|
15221
|
+
const resolved = resolveStringValue(`env.${key}`, templateValue, context);
|
|
15222
|
+
if (resolved !== void 0) {
|
|
15223
|
+
result[key] = resolved;
|
|
15224
|
+
}
|
|
15225
|
+
}
|
|
15226
|
+
return Object.keys(result).length > 0 ? result : void 0;
|
|
15227
|
+
}
|
|
15228
|
+
var TEMPLATE_RESOLVABLE_MCP_AUTH_SECRET_FIELDS = [
|
|
15229
|
+
"token",
|
|
15230
|
+
"api_token",
|
|
15231
|
+
"api_secret",
|
|
15232
|
+
"oauth_client_secret"
|
|
15233
|
+
];
|
|
15234
|
+
function resolveMcpServerTemplates(server, context) {
|
|
15235
|
+
const resolved = { ...server };
|
|
15236
|
+
const unresolvedFields = [];
|
|
15237
|
+
const hadUrlTemplate = server.url && containsTemplate(server.url);
|
|
15238
|
+
if (server.url) {
|
|
15239
|
+
resolved.url = resolveStringValue("url", server.url, context);
|
|
15240
|
+
if (hadUrlTemplate && !resolved.url) {
|
|
15241
|
+
unresolvedFields.push("url");
|
|
15242
|
+
}
|
|
15243
|
+
}
|
|
15244
|
+
if (server.env) {
|
|
15245
|
+
const resolvedEnv = {};
|
|
15246
|
+
for (const [key, templateValue] of Object.entries(server.env)) {
|
|
15247
|
+
const hadTemplate = containsTemplate(templateValue);
|
|
15248
|
+
const resolvedValue = resolveStringValue(`env.${key}`, templateValue, context);
|
|
15249
|
+
if (resolvedValue !== void 0) {
|
|
15250
|
+
resolvedEnv[key] = resolvedValue;
|
|
15251
|
+
} else if (hadTemplate) {
|
|
15252
|
+
unresolvedFields.push(`env.${key}`);
|
|
15253
|
+
}
|
|
15254
|
+
}
|
|
15255
|
+
resolved.env = Object.keys(resolvedEnv).length > 0 ? resolvedEnv : void 0;
|
|
15256
|
+
}
|
|
15257
|
+
if (server.headers) {
|
|
15258
|
+
const resolvedHeaders = {};
|
|
15259
|
+
for (const [key, templateValue] of Object.entries(server.headers)) {
|
|
15260
|
+
const hadTemplate = containsTemplate(templateValue);
|
|
15261
|
+
const resolvedValue = resolveStringValue(`headers.${key}`, templateValue, context);
|
|
15262
|
+
if (resolvedValue !== void 0) {
|
|
15263
|
+
resolvedHeaders[key] = resolvedValue;
|
|
15264
|
+
} else if (hadTemplate) {
|
|
15265
|
+
unresolvedFields.push(`headers.${key}`);
|
|
15266
|
+
}
|
|
15267
|
+
}
|
|
15268
|
+
resolved.headers = Object.keys(resolvedHeaders).length > 0 ? resolvedHeaders : void 0;
|
|
15269
|
+
}
|
|
15270
|
+
if (server.auth) {
|
|
15271
|
+
const resolvedAuth = { ...server.auth };
|
|
15272
|
+
if (server.auth.token) {
|
|
15273
|
+
const hadTemplate = containsTemplate(server.auth.token);
|
|
15274
|
+
resolvedAuth.token = resolveStringValue("auth.token", server.auth.token, context);
|
|
15275
|
+
if (hadTemplate && !resolvedAuth.token) {
|
|
15276
|
+
unresolvedFields.push("auth.token");
|
|
15277
|
+
}
|
|
15278
|
+
}
|
|
15279
|
+
if (server.auth.api_url) {
|
|
15280
|
+
const hadTemplate = containsTemplate(server.auth.api_url);
|
|
15281
|
+
resolvedAuth.api_url = resolveStringValue("auth.api_url", server.auth.api_url, context);
|
|
15282
|
+
if (hadTemplate && !resolvedAuth.api_url) {
|
|
15283
|
+
unresolvedFields.push("auth.api_url");
|
|
15284
|
+
}
|
|
15285
|
+
}
|
|
15286
|
+
if (server.auth.api_token) {
|
|
15287
|
+
const hadTemplate = containsTemplate(server.auth.api_token);
|
|
15288
|
+
resolvedAuth.api_token = resolveStringValue("auth.api_token", server.auth.api_token, context);
|
|
15289
|
+
if (hadTemplate && !resolvedAuth.api_token) {
|
|
15290
|
+
unresolvedFields.push("auth.api_token");
|
|
15291
|
+
}
|
|
15292
|
+
}
|
|
15293
|
+
if (server.auth.api_secret) {
|
|
15294
|
+
const hadTemplate = containsTemplate(server.auth.api_secret);
|
|
15295
|
+
resolvedAuth.api_secret = resolveStringValue(
|
|
15296
|
+
"auth.api_secret",
|
|
15297
|
+
server.auth.api_secret,
|
|
15298
|
+
context
|
|
15299
|
+
);
|
|
15300
|
+
if (hadTemplate && !resolvedAuth.api_secret) {
|
|
15301
|
+
unresolvedFields.push("auth.api_secret");
|
|
15302
|
+
}
|
|
15303
|
+
}
|
|
15304
|
+
if (server.auth.type === "oauth") {
|
|
15305
|
+
if (server.auth.oauth_token_url) {
|
|
15306
|
+
const _hadTemplate = containsTemplate(server.auth.oauth_token_url);
|
|
15307
|
+
resolvedAuth.oauth_token_url = resolveStringValue(
|
|
15308
|
+
"auth.oauth_token_url",
|
|
15309
|
+
server.auth.oauth_token_url,
|
|
15310
|
+
context
|
|
15311
|
+
);
|
|
15312
|
+
}
|
|
15313
|
+
if (server.auth.oauth_client_id) {
|
|
15314
|
+
const _hadTemplate = containsTemplate(server.auth.oauth_client_id);
|
|
15315
|
+
resolvedAuth.oauth_client_id = resolveStringValue(
|
|
15316
|
+
"auth.oauth_client_id",
|
|
15317
|
+
server.auth.oauth_client_id,
|
|
15318
|
+
context
|
|
15319
|
+
);
|
|
15320
|
+
}
|
|
15321
|
+
if (server.auth.oauth_client_secret) {
|
|
15322
|
+
const _hadTemplate = containsTemplate(server.auth.oauth_client_secret);
|
|
15323
|
+
resolvedAuth.oauth_client_secret = resolveStringValue(
|
|
15324
|
+
"auth.oauth_client_secret",
|
|
15325
|
+
server.auth.oauth_client_secret,
|
|
15326
|
+
context
|
|
15327
|
+
);
|
|
15328
|
+
}
|
|
15329
|
+
if (server.auth.oauth_scope) {
|
|
15330
|
+
const _hadTemplate = containsTemplate(server.auth.oauth_scope);
|
|
15331
|
+
resolvedAuth.oauth_scope = resolveStringValue(
|
|
15332
|
+
"auth.oauth_scope",
|
|
15333
|
+
server.auth.oauth_scope,
|
|
15334
|
+
context
|
|
15335
|
+
);
|
|
15336
|
+
}
|
|
15337
|
+
resolvedAuth.oauth_grant_type = server.auth.oauth_grant_type || "client_credentials";
|
|
15338
|
+
}
|
|
15339
|
+
resolved.auth = resolvedAuth;
|
|
15340
|
+
}
|
|
15341
|
+
const isHttpTransport = server.transport === "http" || server.transport === "sse";
|
|
15342
|
+
const urlRequired = isHttpTransport && hadUrlTemplate;
|
|
15343
|
+
const urlMissing = urlRequired && !resolved.url;
|
|
15344
|
+
const isValid2 = !urlMissing;
|
|
15345
|
+
let errorMessage;
|
|
15346
|
+
if (!isValid2) {
|
|
15347
|
+
const missingVars = unresolvedFields.map((f) => {
|
|
15348
|
+
let originalValue;
|
|
15349
|
+
if (f === "url") {
|
|
15350
|
+
originalValue = server.url;
|
|
15351
|
+
} else if (f.startsWith("env.")) {
|
|
15352
|
+
originalValue = server.env?.[f.slice(4)];
|
|
15353
|
+
} else if (f.startsWith("headers.")) {
|
|
15354
|
+
originalValue = server.headers?.[f.slice(8)];
|
|
15355
|
+
} else if (f.startsWith("auth.") && server.auth) {
|
|
15356
|
+
const authKey = f.slice(5);
|
|
15357
|
+
const authValue = server.auth[authKey];
|
|
15358
|
+
originalValue = typeof authValue === "string" ? authValue : void 0;
|
|
15359
|
+
}
|
|
15360
|
+
return originalValue || f;
|
|
15361
|
+
}).join(", ");
|
|
15362
|
+
errorMessage = `MCP server "${server.name}" has unresolved required templates: ${missingVars}. Set the corresponding environment variables in your user settings.`;
|
|
15363
|
+
}
|
|
15364
|
+
return {
|
|
15365
|
+
server: resolved,
|
|
15366
|
+
unresolvedFields,
|
|
15367
|
+
isValid: isValid2,
|
|
15368
|
+
errorMessage
|
|
15369
|
+
};
|
|
15370
|
+
}
|
|
15371
|
+
function resolveMcpServersTemplates(servers, context) {
|
|
15372
|
+
return servers.map((server) => resolveMcpServerTemplates(server, context));
|
|
15373
|
+
}
|
|
15374
|
+
|
|
15375
|
+
// src/tools/mcp/http-headers.ts
|
|
15376
|
+
init_esm_shims();
|
|
15377
|
+
var MCP_HEADER_REDACTED_SENTINEL = "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022";
|
|
15378
|
+
var RESERVED_MCP_CUSTOM_HEADER_NAMES = /* @__PURE__ */ new Set([
|
|
15379
|
+
"authorization",
|
|
15380
|
+
// Hop-by-hop / transport-controlled headers. These are managed by fetch,
|
|
15381
|
+
// the MCP SDK transport, or the auth configuration and should not be stored
|
|
15382
|
+
// as custom MCP service-account headers.
|
|
15383
|
+
"connection",
|
|
15384
|
+
"content-length",
|
|
15385
|
+
"cookie",
|
|
15386
|
+
"host",
|
|
15387
|
+
"mcp-session-id",
|
|
15388
|
+
"te",
|
|
15389
|
+
"trailer",
|
|
15390
|
+
"transfer-encoding",
|
|
15391
|
+
"upgrade"
|
|
15392
|
+
]);
|
|
15393
|
+
var HEADER_NAME_RE = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;
|
|
15394
|
+
function isValidMCPHeaderName(name) {
|
|
15395
|
+
return HEADER_NAME_RE.test(name);
|
|
15396
|
+
}
|
|
15397
|
+
function isReservedMCPCustomHeaderName(name) {
|
|
15398
|
+
return RESERVED_MCP_CUSTOM_HEADER_NAMES.has(name.toLowerCase());
|
|
15399
|
+
}
|
|
15400
|
+
function normalizeMCPCustomHeaders(headers) {
|
|
15401
|
+
if (!headers) return void 0;
|
|
15402
|
+
const normalized = {};
|
|
15403
|
+
for (const [rawName, rawValue] of Object.entries(headers)) {
|
|
15404
|
+
const name = rawName.trim();
|
|
15405
|
+
if (!name || !isValidMCPHeaderName(name)) continue;
|
|
15406
|
+
if (isReservedMCPCustomHeaderName(name)) continue;
|
|
15407
|
+
if (typeof rawValue !== "string") continue;
|
|
15408
|
+
normalized[name] = rawValue;
|
|
15409
|
+
}
|
|
15410
|
+
return Object.keys(normalized).length > 0 ? normalized : void 0;
|
|
15411
|
+
}
|
|
15412
|
+
function restoreRedactedMCPCustomHeaders(options) {
|
|
15413
|
+
if (!options.next) return void 0;
|
|
15414
|
+
const restored = {};
|
|
15415
|
+
for (const [key, value] of Object.entries(options.next)) {
|
|
15416
|
+
restored[key] = value === MCP_HEADER_REDACTED_SENTINEL && options.current?.[key] !== void 0 ? options.current[key] : value;
|
|
15417
|
+
}
|
|
15418
|
+
return normalizeMCPCustomHeaders(restored);
|
|
15419
|
+
}
|
|
15420
|
+
|
|
15421
|
+
// src/tools/mcp/auth-secrets.ts
|
|
15422
|
+
var MCP_AUTH_SECRET_FIELDS = [
|
|
15423
|
+
"token",
|
|
15424
|
+
"api_token",
|
|
15425
|
+
"api_secret",
|
|
15426
|
+
"oauth_client_secret",
|
|
15427
|
+
"oauth_access_token",
|
|
15428
|
+
"oauth_refresh_token"
|
|
15429
|
+
];
|
|
15430
|
+
function restoreRedactedMCPAuthSecrets(options) {
|
|
15431
|
+
if (!options.next) return void 0;
|
|
15432
|
+
const restored = { ...options.next };
|
|
15433
|
+
const record = restored;
|
|
15434
|
+
for (const field of MCP_AUTH_SECRET_FIELDS) {
|
|
15435
|
+
if (restored[field] === MCP_HEADER_REDACTED_SENTINEL && options.current?.[field] !== void 0) {
|
|
15436
|
+
record[field] = options.current[field];
|
|
15437
|
+
}
|
|
15438
|
+
}
|
|
15439
|
+
return restored;
|
|
15440
|
+
}
|
|
15441
|
+
|
|
15442
|
+
// src/db/repositories/mcp-servers.ts
|
|
15443
|
+
init_database_wrapper();
|
|
15444
|
+
init_schema();
|
|
15445
|
+
var MCPServerRepository = class {
|
|
15446
|
+
constructor(db) {
|
|
15447
|
+
this.db = db;
|
|
15448
|
+
}
|
|
15449
|
+
/**
|
|
15450
|
+
* Convert database row to MCPServer type
|
|
15451
|
+
*/
|
|
15452
|
+
rowToMCPServer(row) {
|
|
15453
|
+
return {
|
|
15454
|
+
mcp_server_id: row.mcp_server_id,
|
|
15455
|
+
name: row.name,
|
|
15456
|
+
transport: row.transport,
|
|
15457
|
+
scope: row.scope,
|
|
15458
|
+
enabled: Boolean(row.enabled),
|
|
14956
15459
|
source: row.source,
|
|
14957
15460
|
created_at: new Date(row.created_at),
|
|
14958
15461
|
updated_at: row.updated_at ? new Date(row.updated_at) : new Date(row.created_at),
|
|
@@ -16158,40 +16661,43 @@ var SessionRepository = class {
|
|
|
16158
16661
|
const sessionId = row.session_id;
|
|
16159
16662
|
const boardId = branchBoardId ?? null;
|
|
16160
16663
|
const url = baseUrl && boardId ? getSessionUrl(sessionId, baseUrl) : null;
|
|
16161
|
-
return
|
|
16162
|
-
|
|
16163
|
-
|
|
16164
|
-
|
|
16165
|
-
|
|
16166
|
-
|
|
16167
|
-
|
|
16168
|
-
|
|
16169
|
-
|
|
16170
|
-
|
|
16171
|
-
|
|
16172
|
-
|
|
16173
|
-
|
|
16174
|
-
|
|
16175
|
-
|
|
16176
|
-
|
|
16177
|
-
|
|
16178
|
-
|
|
16179
|
-
|
|
16180
|
-
|
|
16181
|
-
|
|
16664
|
+
return attachHiddenTenant(
|
|
16665
|
+
{
|
|
16666
|
+
session_id: sessionId,
|
|
16667
|
+
status: row.status,
|
|
16668
|
+
agentic_tool: row.agentic_tool,
|
|
16669
|
+
created_at: new Date(row.created_at).toISOString(),
|
|
16670
|
+
last_updated: row.updated_at ? new Date(row.updated_at).toISOString() : new Date(row.created_at).toISOString(),
|
|
16671
|
+
created_by: row.created_by,
|
|
16672
|
+
unix_username: row.unix_username || null,
|
|
16673
|
+
branch_id: row.branch_id,
|
|
16674
|
+
branch_board_id: boardId,
|
|
16675
|
+
url,
|
|
16676
|
+
...row.data,
|
|
16677
|
+
tasks: row.data.tasks.map((id) => id),
|
|
16678
|
+
genealogy: {
|
|
16679
|
+
parent_session_id: row.parent_session_id,
|
|
16680
|
+
forked_from_session_id: row.forked_from_session_id,
|
|
16681
|
+
fork_point_task_id: genealogyData.fork_point_task_id,
|
|
16682
|
+
fork_point_message_index: genealogyData.fork_point_message_index,
|
|
16683
|
+
spawn_point_task_id: genealogyData.spawn_point_task_id,
|
|
16684
|
+
spawn_point_message_index: genealogyData.spawn_point_message_index,
|
|
16685
|
+
children: genealogyData.children.map((id) => id)
|
|
16686
|
+
},
|
|
16687
|
+
permission_config: row.data.permission_config,
|
|
16688
|
+
scheduled_run_at: row.scheduled_run_at ?? void 0,
|
|
16689
|
+
scheduled_from_branch: row.scheduled_from_branch ?? false,
|
|
16690
|
+
schedule_id: row.schedule_id ?? void 0,
|
|
16691
|
+
ready_for_prompt: row.ready_for_prompt ?? false,
|
|
16692
|
+
archived: Boolean(row.archived),
|
|
16693
|
+
// Convert SQLite integer (0/1) to boolean
|
|
16694
|
+
archived_reason: row.archived_reason ?? void 0,
|
|
16695
|
+
current_context_usage: row.data.current_context_usage,
|
|
16696
|
+
context_window_limit: row.data.context_window_limit,
|
|
16697
|
+
last_context_update_at: row.data.last_context_update_at
|
|
16182
16698
|
},
|
|
16183
|
-
|
|
16184
|
-
|
|
16185
|
-
scheduled_from_branch: row.scheduled_from_branch ?? false,
|
|
16186
|
-
schedule_id: row.schedule_id ?? void 0,
|
|
16187
|
-
ready_for_prompt: row.ready_for_prompt ?? false,
|
|
16188
|
-
archived: Boolean(row.archived),
|
|
16189
|
-
// Convert SQLite integer (0/1) to boolean
|
|
16190
|
-
archived_reason: row.archived_reason ?? void 0,
|
|
16191
|
-
current_context_usage: row.data.current_context_usage,
|
|
16192
|
-
context_window_limit: row.data.context_window_limit,
|
|
16193
|
-
last_context_update_at: row.data.last_context_update_at
|
|
16194
|
-
};
|
|
16699
|
+
row
|
|
16700
|
+
);
|
|
16195
16701
|
}
|
|
16196
16702
|
/**
|
|
16197
16703
|
* Convert Session to database insert format
|
|
@@ -16338,6 +16844,26 @@ var SessionRepository = class {
|
|
|
16338
16844
|
);
|
|
16339
16845
|
}
|
|
16340
16846
|
}
|
|
16847
|
+
/**
|
|
16848
|
+
* Resolve the owning user id for a session without hydrating the full row.
|
|
16849
|
+
* Used by realtime delivery to offer streaming events to the session
|
|
16850
|
+
* creator's own connections as a fallback, so their open tabs keep updating
|
|
16851
|
+
* even before they subscribe to the per-session stream channel.
|
|
16852
|
+
*/
|
|
16853
|
+
async findCreatedByBySessionId(id) {
|
|
16854
|
+
try {
|
|
16855
|
+
const fullId = await this.resolveId(id);
|
|
16856
|
+
const row = await select(this.db, { created_by: sessions3.created_by }).from(sessions3).where(eq26(sessions3.session_id, fullId)).one();
|
|
16857
|
+
return row?.created_by ?? null;
|
|
16858
|
+
} catch (error) {
|
|
16859
|
+
if (error instanceof EntityNotFoundError) return null;
|
|
16860
|
+
if (error instanceof AmbiguousIdError) throw error;
|
|
16861
|
+
throw new RepositoryError(
|
|
16862
|
+
`Failed to find session owner: ${error instanceof Error ? error.message : String(error)}`,
|
|
16863
|
+
error
|
|
16864
|
+
);
|
|
16865
|
+
}
|
|
16866
|
+
}
|
|
16341
16867
|
/**
|
|
16342
16868
|
* Find all sessions
|
|
16343
16869
|
*
|
|
@@ -16604,7 +17130,7 @@ var SessionRepository = class {
|
|
|
16604
17130
|
throw new RepositoryError("Session update did not produce an updated_at timestamp");
|
|
16605
17131
|
}
|
|
16606
17132
|
merged.last_updated = insertData.updated_at.toISOString();
|
|
16607
|
-
return merged;
|
|
17133
|
+
return attachHiddenTenant(merged, currentRow);
|
|
16608
17134
|
});
|
|
16609
17135
|
return result;
|
|
16610
17136
|
} catch (error) {
|
|
@@ -18616,192 +19142,52 @@ var UsersRepository = class {
|
|
|
18616
19142
|
*/
|
|
18617
19143
|
async deleteToolConfigField(userId, tool, field) {
|
|
18618
19144
|
const fullId = await this.resolveId(userId);
|
|
18619
|
-
const row = await this.getRawRow(fullId);
|
|
18620
|
-
if (!row) {
|
|
18621
|
-
throw new EntityNotFoundError("User", userId);
|
|
18622
|
-
}
|
|
18623
|
-
const stored = row.data.agentic_tools ?? {};
|
|
18624
|
-
const toolFields = { ...stored[tool] ?? {} };
|
|
18625
|
-
delete toolFields[field];
|
|
18626
|
-
const next = { ...stored };
|
|
18627
|
-
if (Object.keys(toolFields).length > 0) {
|
|
18628
|
-
next[tool] = toolFields;
|
|
18629
|
-
} else {
|
|
18630
|
-
delete next[tool];
|
|
18631
|
-
}
|
|
18632
|
-
await update(this.db, users3).set({
|
|
18633
|
-
data: { ...row.data, agentic_tools: next },
|
|
18634
|
-
updated_at: /* @__PURE__ */ new Date()
|
|
18635
|
-
}).where(eq33(users3.user_id, fullId)).run();
|
|
18636
|
-
}
|
|
18637
|
-
};
|
|
18638
|
-
|
|
18639
|
-
// src/db/index.ts
|
|
18640
|
-
init_schema();
|
|
18641
|
-
|
|
18642
|
-
// src/db/session-guard.ts
|
|
18643
|
-
init_esm_shims();
|
|
18644
|
-
init_ids();
|
|
18645
|
-
async function withSessionGuard(sessionId, sessionsRepo, operation) {
|
|
18646
|
-
const sessionExists = await sessionsRepo?.findById(sessionId);
|
|
18647
|
-
if (!sessionExists) {
|
|
18648
|
-
console.warn(`\u26A0\uFE0F Session ${shortId(sessionId)} no longer exists, skipping guarded operation`);
|
|
18649
|
-
return null;
|
|
18650
|
-
}
|
|
18651
|
-
return operation();
|
|
18652
|
-
}
|
|
18653
|
-
function isForeignKeyConstraintError(error) {
|
|
18654
|
-
return error instanceof Error && (error.message.includes("FOREIGN KEY constraint failed") || error.message.includes("SQLITE_CONSTRAINT_FOREIGNKEY"));
|
|
18655
|
-
}
|
|
18656
|
-
|
|
18657
|
-
// src/db/index.ts
|
|
18658
|
-
init_tenant_scope();
|
|
18659
|
-
init_user_utils();
|
|
18660
|
-
var compare = bcryptjs.compare;
|
|
18661
|
-
var hash = bcryptjs.hash;
|
|
18662
|
-
|
|
18663
|
-
// src/environment/render-snapshot.ts
|
|
18664
|
-
init_esm_shims();
|
|
18665
|
-
|
|
18666
|
-
// src/templates/handlebars-helpers.ts
|
|
18667
|
-
init_esm_shims();
|
|
18668
|
-
import Handlebars from "handlebars";
|
|
18669
|
-
var helpersRegistered = false;
|
|
18670
|
-
function registerHandlebarsHelpers() {
|
|
18671
|
-
Handlebars.registerHelper("add", (a, b) => {
|
|
18672
|
-
const numA = Number(a);
|
|
18673
|
-
const numB = Number(b);
|
|
18674
|
-
if (Number.isNaN(numA) || Number.isNaN(numB)) {
|
|
18675
|
-
console.warn(`\u26A0\uFE0F add helper received non-numeric values: ${a}, ${b}`);
|
|
18676
|
-
return 0;
|
|
18677
|
-
}
|
|
18678
|
-
return numA + numB;
|
|
18679
|
-
});
|
|
18680
|
-
Handlebars.registerHelper("sub", (a, b) => {
|
|
18681
|
-
const numA = Number(a);
|
|
18682
|
-
const numB = Number(b);
|
|
18683
|
-
if (Number.isNaN(numA) || Number.isNaN(numB)) {
|
|
18684
|
-
console.warn(`\u26A0\uFE0F sub helper received non-numeric values: ${a}, ${b}`);
|
|
18685
|
-
return 0;
|
|
18686
|
-
}
|
|
18687
|
-
return numA - numB;
|
|
18688
|
-
});
|
|
18689
|
-
Handlebars.registerHelper("mul", (a, b) => {
|
|
18690
|
-
const numA = Number(a);
|
|
18691
|
-
const numB = Number(b);
|
|
18692
|
-
if (Number.isNaN(numA) || Number.isNaN(numB)) {
|
|
18693
|
-
console.warn(`\u26A0\uFE0F mul helper received non-numeric values: ${a}, ${b}`);
|
|
18694
|
-
return 0;
|
|
18695
|
-
}
|
|
18696
|
-
return numA * numB;
|
|
18697
|
-
});
|
|
18698
|
-
Handlebars.registerHelper("div", (a, b) => {
|
|
18699
|
-
const numA = Number(a);
|
|
18700
|
-
const numB = Number(b);
|
|
18701
|
-
if (Number.isNaN(numA) || Number.isNaN(numB)) {
|
|
18702
|
-
console.warn(`\u26A0\uFE0F div helper received non-numeric values: ${a}, ${b}`);
|
|
18703
|
-
return 0;
|
|
18704
|
-
}
|
|
18705
|
-
if (numB === 0) {
|
|
18706
|
-
console.warn(`\u26A0\uFE0F div helper received zero divisor`);
|
|
18707
|
-
return 0;
|
|
18708
|
-
}
|
|
18709
|
-
return numA / numB;
|
|
18710
|
-
});
|
|
18711
|
-
Handlebars.registerHelper("mod", (a, b) => {
|
|
18712
|
-
const numA = Number(a);
|
|
18713
|
-
const numB = Number(b);
|
|
18714
|
-
if (Number.isNaN(numA) || Number.isNaN(numB)) {
|
|
18715
|
-
console.warn(`\u26A0\uFE0F mod helper received non-numeric values: ${a}, ${b}`);
|
|
18716
|
-
return 0;
|
|
18717
|
-
}
|
|
18718
|
-
if (numB === 0) {
|
|
18719
|
-
console.warn(`\u26A0\uFE0F mod helper received zero divisor`);
|
|
18720
|
-
return 0;
|
|
18721
|
-
}
|
|
18722
|
-
return numA % numB;
|
|
18723
|
-
});
|
|
18724
|
-
Handlebars.registerHelper("uppercase", (str) => {
|
|
18725
|
-
return String(str || "").toUpperCase();
|
|
18726
|
-
});
|
|
18727
|
-
Handlebars.registerHelper("lowercase", (str) => {
|
|
18728
|
-
return String(str || "").toLowerCase();
|
|
18729
|
-
});
|
|
18730
|
-
Handlebars.registerHelper("replace", (str, search, replace) => {
|
|
18731
|
-
return String(str || "").split(search).join(replace);
|
|
18732
|
-
});
|
|
18733
|
-
Handlebars.registerHelper("eq", (a, b) => {
|
|
18734
|
-
return a === b;
|
|
18735
|
-
});
|
|
18736
|
-
Handlebars.registerHelper("neq", (a, b) => {
|
|
18737
|
-
return a !== b;
|
|
18738
|
-
});
|
|
18739
|
-
Handlebars.registerHelper("gt", (a, b) => {
|
|
18740
|
-
return Number(a) > Number(b);
|
|
18741
|
-
});
|
|
18742
|
-
Handlebars.registerHelper("lt", (a, b) => {
|
|
18743
|
-
return Number(a) < Number(b);
|
|
18744
|
-
});
|
|
18745
|
-
Handlebars.registerHelper("gte", (a, b) => {
|
|
18746
|
-
return Number(a) >= Number(b);
|
|
18747
|
-
});
|
|
18748
|
-
Handlebars.registerHelper("lte", (a, b) => {
|
|
18749
|
-
return Number(a) <= Number(b);
|
|
18750
|
-
});
|
|
18751
|
-
Handlebars.registerHelper("default", (value, defaultValue) => {
|
|
18752
|
-
return value ?? defaultValue;
|
|
18753
|
-
});
|
|
18754
|
-
Handlebars.registerHelper("json", (obj) => {
|
|
18755
|
-
return JSON.stringify(obj, null, 2);
|
|
18756
|
-
});
|
|
18757
|
-
Handlebars.registerHelper("isDefined", (value) => value !== void 0);
|
|
18758
|
-
helpersRegistered = true;
|
|
18759
|
-
}
|
|
18760
|
-
function renderTemplate(templateString, context, options = {}) {
|
|
18761
|
-
if (!templateString || typeof templateString !== "string") {
|
|
18762
|
-
return "";
|
|
18763
|
-
}
|
|
18764
|
-
if (!helpersRegistered) {
|
|
18765
|
-
registerHandlebarsHelpers();
|
|
18766
|
-
}
|
|
18767
|
-
try {
|
|
18768
|
-
const template = Handlebars.compile(templateString);
|
|
18769
|
-
return template(context);
|
|
18770
|
-
} catch (error) {
|
|
18771
|
-
console.error("\u274C Handlebars template error:", error);
|
|
18772
|
-
console.error("Template:", templateString);
|
|
18773
|
-
console.error("Context keys:", Object.keys(context));
|
|
18774
|
-
if (options.onError === "raw") {
|
|
18775
|
-
return templateString;
|
|
19145
|
+
const row = await this.getRawRow(fullId);
|
|
19146
|
+
if (!row) {
|
|
19147
|
+
throw new EntityNotFoundError("User", userId);
|
|
18776
19148
|
}
|
|
18777
|
-
|
|
19149
|
+
const stored = row.data.agentic_tools ?? {};
|
|
19150
|
+
const toolFields = { ...stored[tool] ?? {} };
|
|
19151
|
+
delete toolFields[field];
|
|
19152
|
+
const next = { ...stored };
|
|
19153
|
+
if (Object.keys(toolFields).length > 0) {
|
|
19154
|
+
next[tool] = toolFields;
|
|
19155
|
+
} else {
|
|
19156
|
+
delete next[tool];
|
|
19157
|
+
}
|
|
19158
|
+
await update(this.db, users3).set({
|
|
19159
|
+
data: { ...row.data, agentic_tools: next },
|
|
19160
|
+
updated_at: /* @__PURE__ */ new Date()
|
|
19161
|
+
}).where(eq33(users3.user_id, fullId)).run();
|
|
19162
|
+
}
|
|
19163
|
+
};
|
|
19164
|
+
|
|
19165
|
+
// src/db/index.ts
|
|
19166
|
+
init_schema();
|
|
19167
|
+
|
|
19168
|
+
// src/db/session-guard.ts
|
|
19169
|
+
init_esm_shims();
|
|
19170
|
+
init_ids();
|
|
19171
|
+
async function withSessionGuard(sessionId, sessionsRepo, operation) {
|
|
19172
|
+
const sessionExists = await sessionsRepo?.findById(sessionId);
|
|
19173
|
+
if (!sessionExists) {
|
|
19174
|
+
console.warn(`\u26A0\uFE0F Session ${shortId(sessionId)} no longer exists, skipping guarded operation`);
|
|
19175
|
+
return null;
|
|
18778
19176
|
}
|
|
19177
|
+
return operation();
|
|
18779
19178
|
}
|
|
18780
|
-
function
|
|
18781
|
-
|
|
18782
|
-
unique_id: branch.branch_unique_id,
|
|
18783
|
-
name: branch.name,
|
|
18784
|
-
path: branch.path,
|
|
18785
|
-
gid: branch.unix_gid
|
|
18786
|
-
};
|
|
18787
|
-
return {
|
|
18788
|
-
// Scoped entities (accessible as {{entity.property}})
|
|
18789
|
-
branch: branchEntity,
|
|
18790
|
-
// Legacy alias — preserved for existing env templates that reference
|
|
18791
|
-
// {{worktree.*}} keys. Points at the same object so updates stay in sync.
|
|
18792
|
-
worktree: branchEntity,
|
|
18793
|
-
repo: {
|
|
18794
|
-
slug: branch.repo_slug || ""
|
|
18795
|
-
},
|
|
18796
|
-
host: {
|
|
18797
|
-
ip_address: branch.host_ip_address || ""
|
|
18798
|
-
},
|
|
18799
|
-
// User-defined custom context (accessible as {{custom.key}})
|
|
18800
|
-
custom: branch.custom_context || {}
|
|
18801
|
-
};
|
|
19179
|
+
function isForeignKeyConstraintError(error) {
|
|
19180
|
+
return error instanceof Error && (error.message.includes("FOREIGN KEY constraint failed") || error.message.includes("SQLITE_CONSTRAINT_FOREIGNKEY"));
|
|
18802
19181
|
}
|
|
18803
19182
|
|
|
19183
|
+
// src/db/index.ts
|
|
19184
|
+
init_tenant_scope();
|
|
19185
|
+
init_user_utils();
|
|
19186
|
+
var compare = bcryptjs.compare;
|
|
19187
|
+
var hash = bcryptjs.hash;
|
|
19188
|
+
|
|
18804
19189
|
// src/environment/render-snapshot.ts
|
|
19190
|
+
init_esm_shims();
|
|
18805
19191
|
function deepMergeContext(base, overrides) {
|
|
18806
19192
|
if (!overrides) return base;
|
|
18807
19193
|
const out = { ...base };
|
|
@@ -18838,7 +19224,9 @@ function renderBranchSnapshot(repo, branch, variantName) {
|
|
|
18838
19224
|
repo_slug: repo.slug,
|
|
18839
19225
|
custom_context: branch.custom_context,
|
|
18840
19226
|
unix_gid: branch.unix_gid,
|
|
18841
|
-
host_ip_address: branch.host_ip_address
|
|
19227
|
+
host_ip_address: branch.host_ip_address,
|
|
19228
|
+
base_ref: branch.base_ref,
|
|
19229
|
+
ref_type: branch.ref_type
|
|
18842
19230
|
});
|
|
18843
19231
|
const { custom, ...nonCustomBase } = baseContext;
|
|
18844
19232
|
const overridden = deepMergeContext(
|
|
@@ -19053,200 +19441,6 @@ async function validateDirectory(path3, context = "Directory") {
|
|
|
19053
19441
|
// src/mcp/index.ts
|
|
19054
19442
|
init_esm_shims();
|
|
19055
19443
|
|
|
19056
|
-
// src/mcp/template-resolver.ts
|
|
19057
|
-
init_esm_shims();
|
|
19058
|
-
function buildMCPTemplateContextFromEnv(env) {
|
|
19059
|
-
const userEnvKeysStr = env[AGOR_USER_ENV_KEYS_VAR];
|
|
19060
|
-
const allowedKeys = userEnvKeysStr ? new Set(userEnvKeysStr.split(",")) : /* @__PURE__ */ new Set();
|
|
19061
|
-
const userEnv = {};
|
|
19062
|
-
for (const key of allowedKeys) {
|
|
19063
|
-
const value = env[key];
|
|
19064
|
-
if (value !== void 0) {
|
|
19065
|
-
userEnv[key] = value;
|
|
19066
|
-
}
|
|
19067
|
-
}
|
|
19068
|
-
return {
|
|
19069
|
-
user: {
|
|
19070
|
-
env: userEnv
|
|
19071
|
-
}
|
|
19072
|
-
};
|
|
19073
|
-
}
|
|
19074
|
-
function containsTemplate(value) {
|
|
19075
|
-
return value.includes("{{") && value.includes("}}");
|
|
19076
|
-
}
|
|
19077
|
-
function resolveStringValue(fieldName, templateValue, context) {
|
|
19078
|
-
if (!containsTemplate(templateValue)) {
|
|
19079
|
-
return templateValue;
|
|
19080
|
-
}
|
|
19081
|
-
try {
|
|
19082
|
-
const resolved = renderTemplate(templateValue, context);
|
|
19083
|
-
if (!resolved || resolved.trim() === "") {
|
|
19084
|
-
console.log(` \u2139\uFE0F MCP "${fieldName}" resolved to empty (user may need to set env var)`);
|
|
19085
|
-
return void 0;
|
|
19086
|
-
}
|
|
19087
|
-
return resolved;
|
|
19088
|
-
} catch (error) {
|
|
19089
|
-
console.warn(
|
|
19090
|
-
` \u26A0\uFE0F Failed to resolve MCP template "${fieldName}":`,
|
|
19091
|
-
error instanceof Error ? error.message : String(error)
|
|
19092
|
-
);
|
|
19093
|
-
return void 0;
|
|
19094
|
-
}
|
|
19095
|
-
}
|
|
19096
|
-
function resolveMcpServerEnv(envTemplate, context) {
|
|
19097
|
-
if (!envTemplate || Object.keys(envTemplate).length === 0) {
|
|
19098
|
-
return void 0;
|
|
19099
|
-
}
|
|
19100
|
-
const result = {};
|
|
19101
|
-
for (const [key, templateValue] of Object.entries(envTemplate)) {
|
|
19102
|
-
const resolved = resolveStringValue(`env.${key}`, templateValue, context);
|
|
19103
|
-
if (resolved !== void 0) {
|
|
19104
|
-
result[key] = resolved;
|
|
19105
|
-
}
|
|
19106
|
-
}
|
|
19107
|
-
return Object.keys(result).length > 0 ? result : void 0;
|
|
19108
|
-
}
|
|
19109
|
-
function resolveMcpServerTemplates(server, context) {
|
|
19110
|
-
const resolved = { ...server };
|
|
19111
|
-
const unresolvedFields = [];
|
|
19112
|
-
const hadUrlTemplate = server.url && containsTemplate(server.url);
|
|
19113
|
-
if (server.url) {
|
|
19114
|
-
resolved.url = resolveStringValue("url", server.url, context);
|
|
19115
|
-
if (hadUrlTemplate && !resolved.url) {
|
|
19116
|
-
unresolvedFields.push("url");
|
|
19117
|
-
}
|
|
19118
|
-
}
|
|
19119
|
-
if (server.env) {
|
|
19120
|
-
const resolvedEnv = {};
|
|
19121
|
-
for (const [key, templateValue] of Object.entries(server.env)) {
|
|
19122
|
-
const hadTemplate = containsTemplate(templateValue);
|
|
19123
|
-
const resolvedValue = resolveStringValue(`env.${key}`, templateValue, context);
|
|
19124
|
-
if (resolvedValue !== void 0) {
|
|
19125
|
-
resolvedEnv[key] = resolvedValue;
|
|
19126
|
-
} else if (hadTemplate) {
|
|
19127
|
-
unresolvedFields.push(`env.${key}`);
|
|
19128
|
-
}
|
|
19129
|
-
}
|
|
19130
|
-
resolved.env = Object.keys(resolvedEnv).length > 0 ? resolvedEnv : void 0;
|
|
19131
|
-
}
|
|
19132
|
-
if (server.headers) {
|
|
19133
|
-
const resolvedHeaders = {};
|
|
19134
|
-
for (const [key, templateValue] of Object.entries(server.headers)) {
|
|
19135
|
-
const hadTemplate = containsTemplate(templateValue);
|
|
19136
|
-
const resolvedValue = resolveStringValue(`headers.${key}`, templateValue, context);
|
|
19137
|
-
if (resolvedValue !== void 0) {
|
|
19138
|
-
resolvedHeaders[key] = resolvedValue;
|
|
19139
|
-
} else if (hadTemplate) {
|
|
19140
|
-
unresolvedFields.push(`headers.${key}`);
|
|
19141
|
-
}
|
|
19142
|
-
}
|
|
19143
|
-
resolved.headers = Object.keys(resolvedHeaders).length > 0 ? resolvedHeaders : void 0;
|
|
19144
|
-
}
|
|
19145
|
-
if (server.auth) {
|
|
19146
|
-
const resolvedAuth = { ...server.auth };
|
|
19147
|
-
if (server.auth.token) {
|
|
19148
|
-
const hadTemplate = containsTemplate(server.auth.token);
|
|
19149
|
-
resolvedAuth.token = resolveStringValue("auth.token", server.auth.token, context);
|
|
19150
|
-
if (hadTemplate && !resolvedAuth.token) {
|
|
19151
|
-
unresolvedFields.push("auth.token");
|
|
19152
|
-
}
|
|
19153
|
-
}
|
|
19154
|
-
if (server.auth.api_url) {
|
|
19155
|
-
const hadTemplate = containsTemplate(server.auth.api_url);
|
|
19156
|
-
resolvedAuth.api_url = resolveStringValue("auth.api_url", server.auth.api_url, context);
|
|
19157
|
-
if (hadTemplate && !resolvedAuth.api_url) {
|
|
19158
|
-
unresolvedFields.push("auth.api_url");
|
|
19159
|
-
}
|
|
19160
|
-
}
|
|
19161
|
-
if (server.auth.api_token) {
|
|
19162
|
-
const hadTemplate = containsTemplate(server.auth.api_token);
|
|
19163
|
-
resolvedAuth.api_token = resolveStringValue("auth.api_token", server.auth.api_token, context);
|
|
19164
|
-
if (hadTemplate && !resolvedAuth.api_token) {
|
|
19165
|
-
unresolvedFields.push("auth.api_token");
|
|
19166
|
-
}
|
|
19167
|
-
}
|
|
19168
|
-
if (server.auth.api_secret) {
|
|
19169
|
-
const hadTemplate = containsTemplate(server.auth.api_secret);
|
|
19170
|
-
resolvedAuth.api_secret = resolveStringValue(
|
|
19171
|
-
"auth.api_secret",
|
|
19172
|
-
server.auth.api_secret,
|
|
19173
|
-
context
|
|
19174
|
-
);
|
|
19175
|
-
if (hadTemplate && !resolvedAuth.api_secret) {
|
|
19176
|
-
unresolvedFields.push("auth.api_secret");
|
|
19177
|
-
}
|
|
19178
|
-
}
|
|
19179
|
-
if (server.auth.type === "oauth") {
|
|
19180
|
-
if (server.auth.oauth_token_url) {
|
|
19181
|
-
const _hadTemplate = containsTemplate(server.auth.oauth_token_url);
|
|
19182
|
-
resolvedAuth.oauth_token_url = resolveStringValue(
|
|
19183
|
-
"auth.oauth_token_url",
|
|
19184
|
-
server.auth.oauth_token_url,
|
|
19185
|
-
context
|
|
19186
|
-
);
|
|
19187
|
-
}
|
|
19188
|
-
if (server.auth.oauth_client_id) {
|
|
19189
|
-
const _hadTemplate = containsTemplate(server.auth.oauth_client_id);
|
|
19190
|
-
resolvedAuth.oauth_client_id = resolveStringValue(
|
|
19191
|
-
"auth.oauth_client_id",
|
|
19192
|
-
server.auth.oauth_client_id,
|
|
19193
|
-
context
|
|
19194
|
-
);
|
|
19195
|
-
}
|
|
19196
|
-
if (server.auth.oauth_client_secret) {
|
|
19197
|
-
const _hadTemplate = containsTemplate(server.auth.oauth_client_secret);
|
|
19198
|
-
resolvedAuth.oauth_client_secret = resolveStringValue(
|
|
19199
|
-
"auth.oauth_client_secret",
|
|
19200
|
-
server.auth.oauth_client_secret,
|
|
19201
|
-
context
|
|
19202
|
-
);
|
|
19203
|
-
}
|
|
19204
|
-
if (server.auth.oauth_scope) {
|
|
19205
|
-
const _hadTemplate = containsTemplate(server.auth.oauth_scope);
|
|
19206
|
-
resolvedAuth.oauth_scope = resolveStringValue(
|
|
19207
|
-
"auth.oauth_scope",
|
|
19208
|
-
server.auth.oauth_scope,
|
|
19209
|
-
context
|
|
19210
|
-
);
|
|
19211
|
-
}
|
|
19212
|
-
resolvedAuth.oauth_grant_type = server.auth.oauth_grant_type || "client_credentials";
|
|
19213
|
-
}
|
|
19214
|
-
resolved.auth = resolvedAuth;
|
|
19215
|
-
}
|
|
19216
|
-
const isHttpTransport = server.transport === "http" || server.transport === "sse";
|
|
19217
|
-
const urlRequired = isHttpTransport && hadUrlTemplate;
|
|
19218
|
-
const urlMissing = urlRequired && !resolved.url;
|
|
19219
|
-
const isValid2 = !urlMissing;
|
|
19220
|
-
let errorMessage;
|
|
19221
|
-
if (!isValid2) {
|
|
19222
|
-
const missingVars = unresolvedFields.map((f) => {
|
|
19223
|
-
let originalValue;
|
|
19224
|
-
if (f === "url") {
|
|
19225
|
-
originalValue = server.url;
|
|
19226
|
-
} else if (f.startsWith("env.")) {
|
|
19227
|
-
originalValue = server.env?.[f.slice(4)];
|
|
19228
|
-
} else if (f.startsWith("headers.")) {
|
|
19229
|
-
originalValue = server.headers?.[f.slice(8)];
|
|
19230
|
-
} else if (f.startsWith("auth.") && server.auth) {
|
|
19231
|
-
const authKey = f.slice(5);
|
|
19232
|
-
const authValue = server.auth[authKey];
|
|
19233
|
-
originalValue = typeof authValue === "string" ? authValue : void 0;
|
|
19234
|
-
}
|
|
19235
|
-
return originalValue || f;
|
|
19236
|
-
}).join(", ");
|
|
19237
|
-
errorMessage = `MCP server "${server.name}" has unresolved required templates: ${missingVars}. Set the corresponding environment variables in your user settings.`;
|
|
19238
|
-
}
|
|
19239
|
-
return {
|
|
19240
|
-
server: resolved,
|
|
19241
|
-
unresolvedFields,
|
|
19242
|
-
isValid: isValid2,
|
|
19243
|
-
errorMessage
|
|
19244
|
-
};
|
|
19245
|
-
}
|
|
19246
|
-
function resolveMcpServersTemplates(servers, context) {
|
|
19247
|
-
return servers.map((server) => resolveMcpServerTemplates(server, context));
|
|
19248
|
-
}
|
|
19249
|
-
|
|
19250
19444
|
// src/search/index.ts
|
|
19251
19445
|
init_esm_shims();
|
|
19252
19446
|
|
|
@@ -22563,6 +22757,7 @@ export {
|
|
|
22563
22757
|
SudoCliExecutor,
|
|
22564
22758
|
SudoDirectExecutor,
|
|
22565
22759
|
SymlinkCommands,
|
|
22760
|
+
TEMPLATE_RESOLVABLE_MCP_AUTH_SECRET_FIELDS,
|
|
22566
22761
|
TERMINAL_TASK_STATUSES,
|
|
22567
22762
|
TOOL_API_KEY_NAMES,
|
|
22568
22763
|
TaskRepository,
|
|
@@ -22624,6 +22819,7 @@ export {
|
|
|
22624
22819
|
checkAsUser,
|
|
22625
22820
|
checkMigrationStatus,
|
|
22626
22821
|
compare,
|
|
22822
|
+
containsTemplate,
|
|
22627
22823
|
count,
|
|
22628
22824
|
createAdminExecutor,
|
|
22629
22825
|
createClient,
|
|
@@ -22713,6 +22909,7 @@ export {
|
|
|
22713
22909
|
getRepoReferenceOptions,
|
|
22714
22910
|
getReposDir,
|
|
22715
22911
|
getReposDirAsync,
|
|
22912
|
+
getRequiredSecretFields,
|
|
22716
22913
|
getServiceTier,
|
|
22717
22914
|
getSessionType,
|
|
22718
22915
|
getUidFromUsername,
|
|
@@ -22765,6 +22962,7 @@ export {
|
|
|
22765
22962
|
isThreadRoot,
|
|
22766
22963
|
isUnixGroupRefreshNeeded,
|
|
22767
22964
|
isUnixImpersonationEnabled,
|
|
22965
|
+
isUserEnvPlaceholder,
|
|
22768
22966
|
isUserInGroup,
|
|
22769
22967
|
isValid,
|
|
22770
22968
|
isValidBranchGroupName,
|