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/db/index.js
CHANGED
|
@@ -768,6 +768,21 @@ var init_file = __esm({
|
|
|
768
768
|
});
|
|
769
769
|
|
|
770
770
|
// src/types/gateway.ts
|
|
771
|
+
function getRequiredSecretFields(channelType, config) {
|
|
772
|
+
switch (channelType) {
|
|
773
|
+
case "slack": {
|
|
774
|
+
const wantsInbound = config.connection_mode === "socket" || config.enable_channels === true || config.enable_groups === true || config.enable_mpim === true;
|
|
775
|
+
const outboundOnly = config.outbound_enabled === true && !wantsInbound;
|
|
776
|
+
return outboundOnly ? ["bot_token"] : ["bot_token", "app_token"];
|
|
777
|
+
}
|
|
778
|
+
case "github":
|
|
779
|
+
return ["private_key"];
|
|
780
|
+
case "teams":
|
|
781
|
+
return ["app_password"];
|
|
782
|
+
default:
|
|
783
|
+
return [];
|
|
784
|
+
}
|
|
785
|
+
}
|
|
771
786
|
var GATEWAY_SENSITIVE_CONFIG_FIELDS, GATEWAY_REDACTED_SENTINEL;
|
|
772
787
|
var init_gateway = __esm({
|
|
773
788
|
"src/types/gateway.ts"() {
|
|
@@ -4879,7 +4894,7 @@ import {
|
|
|
4879
4894
|
asc as asc3,
|
|
4880
4895
|
count,
|
|
4881
4896
|
desc as desc6,
|
|
4882
|
-
eq as
|
|
4897
|
+
eq as eq33,
|
|
4883
4898
|
gt,
|
|
4884
4899
|
gte,
|
|
4885
4900
|
inArray as inArray11,
|
|
@@ -8038,6 +8053,63 @@ var BranchRepository = class {
|
|
|
8038
8053
|
}
|
|
8039
8054
|
return Array.from(userIds);
|
|
8040
8055
|
}
|
|
8056
|
+
/**
|
|
8057
|
+
* Find non-archived branches whose explicit filesystem access set can change
|
|
8058
|
+
* when membership in the given group changes.
|
|
8059
|
+
*
|
|
8060
|
+
* Keep this inverse lookup in lockstep with findExplicitFsAccessUserIds():
|
|
8061
|
+
* both encode which group grants materialize into branch-folder access.
|
|
8062
|
+
* App-only grants (`fs_access = 'none'`) are intentionally excluded because
|
|
8063
|
+
* membership changes for those grants do not require branch-folder mutation.
|
|
8064
|
+
*/
|
|
8065
|
+
async findExplicitFsAccessBranchIdsForGroup(groupId) {
|
|
8066
|
+
const directRows = await select(this.db, { branch_id: branchGroupGrants3.branch_id }).from(branchGroupGrants3).innerJoin(branches3, eq11(branches3.branch_id, branchGroupGrants3.branch_id)).innerJoin(
|
|
8067
|
+
groups3,
|
|
8068
|
+
and11(eq11(groups3.group_id, branchGroupGrants3.group_id), eq11(groups3.archived, false))
|
|
8069
|
+
).where(
|
|
8070
|
+
and11(
|
|
8071
|
+
eq11(branchGroupGrants3.group_id, groupId),
|
|
8072
|
+
eq11(branches3.archived, false),
|
|
8073
|
+
inArray4(
|
|
8074
|
+
sql9`coalesce(${branchGroupGrants3.fs_access}, 'read')`,
|
|
8075
|
+
FS_ACCESS_BRANCH_PERMISSIONS
|
|
8076
|
+
)
|
|
8077
|
+
)
|
|
8078
|
+
).all();
|
|
8079
|
+
const boardRows = await select(this.db, { branch_id: branches3.branch_id }).from(boardGroupGrants3).innerJoin(
|
|
8080
|
+
groups3,
|
|
8081
|
+
and11(eq11(groups3.group_id, boardGroupGrants3.group_id), eq11(groups3.archived, false))
|
|
8082
|
+
).innerJoin(
|
|
8083
|
+
boards3,
|
|
8084
|
+
and11(
|
|
8085
|
+
eq11(boards3.board_id, boardGroupGrants3.board_id),
|
|
8086
|
+
eq11(sql9`coalesce(${jsonExtract(this.db, boards3.data, "access_mode")}, 'shared')`, "shared")
|
|
8087
|
+
)
|
|
8088
|
+
).innerJoin(
|
|
8089
|
+
branches3,
|
|
8090
|
+
and11(
|
|
8091
|
+
eq11(branches3.board_id, boardGroupGrants3.board_id),
|
|
8092
|
+
eq11(branches3.permission_source, "board"),
|
|
8093
|
+
eq11(branches3.archived, false)
|
|
8094
|
+
)
|
|
8095
|
+
).where(
|
|
8096
|
+
and11(
|
|
8097
|
+
eq11(boardGroupGrants3.group_id, groupId),
|
|
8098
|
+
inArray4(
|
|
8099
|
+
sql9`coalesce(${boardGroupGrants3.fs_access}, 'read')`,
|
|
8100
|
+
FS_ACCESS_BRANCH_PERMISSIONS
|
|
8101
|
+
)
|
|
8102
|
+
)
|
|
8103
|
+
).all();
|
|
8104
|
+
const branchIds = /* @__PURE__ */ new Set();
|
|
8105
|
+
for (const row of directRows) {
|
|
8106
|
+
branchIds.add(row.branch_id);
|
|
8107
|
+
}
|
|
8108
|
+
for (const row of boardRows) {
|
|
8109
|
+
branchIds.add(row.branch_id);
|
|
8110
|
+
}
|
|
8111
|
+
return Array.from(branchIds);
|
|
8112
|
+
}
|
|
8041
8113
|
async findBoardAlignedBranches(boardId) {
|
|
8042
8114
|
const rows = await select(this.db).from(branches3).where(
|
|
8043
8115
|
and11(
|
|
@@ -9045,6 +9117,60 @@ var BoardRepository = class {
|
|
|
9045
9117
|
);
|
|
9046
9118
|
}
|
|
9047
9119
|
}
|
|
9120
|
+
/**
|
|
9121
|
+
* Shallow-merge field patches into existing board objects in a single
|
|
9122
|
+
* read-modify-write.
|
|
9123
|
+
*
|
|
9124
|
+
* Unlike upsertBoardObject (which fully replaces the object value, dropping
|
|
9125
|
+
* omitted fields), this overwrites ONLY the provided keys and leaves the rest
|
|
9126
|
+
* of each object intact — so a narrow change (e.g. a zIndex reorder) has a
|
|
9127
|
+
* smaller blast radius and won't clobber a field edited via a different patch
|
|
9128
|
+
* call. Multiple objects in one call are merged before a single write, so a
|
|
9129
|
+
* forward/backward swap touches both neighbors in one update.
|
|
9130
|
+
*
|
|
9131
|
+
* Objects that no longer exist are SKIPPED, never re-created — so a swap can't
|
|
9132
|
+
* resurrect a neighbor deleted between the client's read and this write.
|
|
9133
|
+
*
|
|
9134
|
+
* Only an explicit allowlist of fields can be merged (currently just `zIndex`,
|
|
9135
|
+
* which is also clamped into the board-object band [1, 499] so it can never be
|
|
9136
|
+
* pushed onto the card (500) / comment (1000) layers). Any other key in a
|
|
9137
|
+
* patch is ignored, so this narrow action cannot reshape an object (e.g. flip
|
|
9138
|
+
* its `type`) the way a full upsert could.
|
|
9139
|
+
*
|
|
9140
|
+
* NOTE: this is NOT atomic against concurrent writers. Like every other board
|
|
9141
|
+
* writer, the findById → update sequence has a lost-update window: a write
|
|
9142
|
+
* that lands between the read and the update can be overwritten (last-write-
|
|
9143
|
+
* wins). Merging only the patched keys narrows that window's blast radius
|
|
9144
|
+
* versus a full-object upsert, but does not close it.
|
|
9145
|
+
*/
|
|
9146
|
+
async mergeBoardObjectFields(boardId, patches) {
|
|
9147
|
+
const Z_MIN = 1;
|
|
9148
|
+
const Z_MAX = 499;
|
|
9149
|
+
try {
|
|
9150
|
+
const fullId = await this.resolveId(boardId);
|
|
9151
|
+
const current = await this.findById(fullId);
|
|
9152
|
+
if (!current) {
|
|
9153
|
+
throw new EntityNotFoundError("Board", boardId);
|
|
9154
|
+
}
|
|
9155
|
+
const updatedObjects = { ...current.objects || {} };
|
|
9156
|
+
for (const [objectId, fields] of Object.entries(patches)) {
|
|
9157
|
+
const existing = updatedObjects[objectId];
|
|
9158
|
+
if (!existing) continue;
|
|
9159
|
+
const { zIndex } = fields;
|
|
9160
|
+
if (typeof zIndex !== "number" || !Number.isFinite(zIndex)) continue;
|
|
9161
|
+
const safeZIndex = Math.min(Z_MAX, Math.max(Z_MIN, zIndex));
|
|
9162
|
+
updatedObjects[objectId] = { ...existing, zIndex: safeZIndex };
|
|
9163
|
+
}
|
|
9164
|
+
return this.update(fullId, { objects: updatedObjects });
|
|
9165
|
+
} catch (error) {
|
|
9166
|
+
if (error instanceof RepositoryError) throw error;
|
|
9167
|
+
if (error instanceof EntityNotFoundError) throw error;
|
|
9168
|
+
throw new RepositoryError(
|
|
9169
|
+
`Failed to merge board object fields: ${error instanceof Error ? error.message : String(error)}`,
|
|
9170
|
+
error
|
|
9171
|
+
);
|
|
9172
|
+
}
|
|
9173
|
+
}
|
|
9048
9174
|
/**
|
|
9049
9175
|
* DEPRECATED: Delete a zone and handle associated sessions
|
|
9050
9176
|
* TODO: Reimplement using board-objects table
|
|
@@ -9779,6 +9905,28 @@ var GatewayChannelRepository = class {
|
|
|
9779
9905
|
agentic_config: encryptedAgenticConfig
|
|
9780
9906
|
};
|
|
9781
9907
|
}
|
|
9908
|
+
/**
|
|
9909
|
+
* Enforce the "enabled requires secrets" invariant on every write path.
|
|
9910
|
+
*
|
|
9911
|
+
* An enabled channel can never exist without the secrets its type needs to
|
|
9912
|
+
* function. Runs on the post-merge, decrypted config so a patch that only
|
|
9913
|
+
* flips `enabled: true` on a channel with already-stored tokens passes.
|
|
9914
|
+
* Disabled ("draft") channels are exempt.
|
|
9915
|
+
*/
|
|
9916
|
+
assertRequiredSecretsWhenEnabled(channel) {
|
|
9917
|
+
if (channel.enabled === false) return;
|
|
9918
|
+
const channelType = channel.channel_type ?? "slack";
|
|
9919
|
+
const config = channel.config ?? {};
|
|
9920
|
+
const missing = getRequiredSecretFields(channelType, config).filter((field) => {
|
|
9921
|
+
const value = config[field];
|
|
9922
|
+
return typeof value !== "string" || value.trim() === "" || value === GATEWAY_REDACTED_SENTINEL;
|
|
9923
|
+
});
|
|
9924
|
+
if (missing.length > 0) {
|
|
9925
|
+
throw new RepositoryError(
|
|
9926
|
+
`Cannot enable ${channelType} gateway channel: missing required secret(s) ${missing.join(", ")}`
|
|
9927
|
+
);
|
|
9928
|
+
}
|
|
9929
|
+
}
|
|
9782
9930
|
/**
|
|
9783
9931
|
* Resolve short ID to full ID
|
|
9784
9932
|
*/
|
|
@@ -9810,6 +9958,7 @@ var GatewayChannelRepository = class {
|
|
|
9810
9958
|
id: data.id ?? generateId(),
|
|
9811
9959
|
channel_key: data.channel_key ?? generateId()
|
|
9812
9960
|
});
|
|
9961
|
+
this.assertRequiredSecretsWhenEnabled(data);
|
|
9813
9962
|
await insert(this.db, gatewayChannels3).values(insertData).run();
|
|
9814
9963
|
const row = await select(this.db).from(gatewayChannels3).where(eq15(gatewayChannels3.id, insertData.id)).one();
|
|
9815
9964
|
if (!row) {
|
|
@@ -9876,6 +10025,7 @@ var GatewayChannelRepository = class {
|
|
|
9876
10025
|
}
|
|
9877
10026
|
merged.config = mergedConfig;
|
|
9878
10027
|
}
|
|
10028
|
+
this.assertRequiredSecretsWhenEnabled(merged);
|
|
9879
10029
|
const insertData = this.channelToInsert(merged);
|
|
9880
10030
|
await update(this.db, gatewayChannels3).set({
|
|
9881
10031
|
name: insertData.name,
|
|
@@ -11385,11 +11535,164 @@ var KnowledgeGraphRepository = class {
|
|
|
11385
11535
|
// src/db/repositories/mcp-servers.ts
|
|
11386
11536
|
init_esm_shims();
|
|
11387
11537
|
init_ids();
|
|
11388
|
-
import { and as
|
|
11538
|
+
import { and as and17, eq as eq20, like as like10 } from "drizzle-orm";
|
|
11389
11539
|
|
|
11390
11540
|
// src/tools/mcp/auth-secrets.ts
|
|
11391
11541
|
init_esm_shims();
|
|
11392
11542
|
|
|
11543
|
+
// src/mcp/template-resolver.ts
|
|
11544
|
+
init_esm_shims();
|
|
11545
|
+
|
|
11546
|
+
// src/config/env-resolver.ts
|
|
11547
|
+
init_esm_shims();
|
|
11548
|
+
init_database_wrapper();
|
|
11549
|
+
import { eq as eq19 } from "drizzle-orm";
|
|
11550
|
+
|
|
11551
|
+
// src/db/repositories/session-env-selections.ts
|
|
11552
|
+
init_esm_shims();
|
|
11553
|
+
init_database_wrapper();
|
|
11554
|
+
init_schema();
|
|
11555
|
+
import { and as and16, eq as eq18 } from "drizzle-orm";
|
|
11556
|
+
var SessionEnvSelectionRepository = class {
|
|
11557
|
+
constructor(db) {
|
|
11558
|
+
this.db = db;
|
|
11559
|
+
}
|
|
11560
|
+
/** Shared SELECT for a session's rows — single source of truth for reads. */
|
|
11561
|
+
async fetchRows(sessionId) {
|
|
11562
|
+
try {
|
|
11563
|
+
return await select(this.db).from(sessionEnvSelections3).where(eq18(sessionEnvSelections3.session_id, sessionId)).all();
|
|
11564
|
+
} catch (error) {
|
|
11565
|
+
throw new RepositoryError(
|
|
11566
|
+
`Failed to list session env selections: ${error instanceof Error ? error.message : String(error)}`,
|
|
11567
|
+
error
|
|
11568
|
+
);
|
|
11569
|
+
}
|
|
11570
|
+
}
|
|
11571
|
+
/** List selected env var names for a session (not hydrated). */
|
|
11572
|
+
async listNames(sessionId) {
|
|
11573
|
+
const rows = await this.fetchRows(sessionId);
|
|
11574
|
+
return rows.map((r) => r.env_var_name);
|
|
11575
|
+
}
|
|
11576
|
+
/** Return a Set for fast membership checks in the env resolver. */
|
|
11577
|
+
async asSet(sessionId) {
|
|
11578
|
+
const names = await this.listNames(sessionId);
|
|
11579
|
+
return new Set(names);
|
|
11580
|
+
}
|
|
11581
|
+
/** Full rows with timestamps — for the REST API response. */
|
|
11582
|
+
async list(sessionId) {
|
|
11583
|
+
const rows = await this.fetchRows(sessionId);
|
|
11584
|
+
return rows.map((r) => ({
|
|
11585
|
+
session_id: r.session_id,
|
|
11586
|
+
env_var_name: r.env_var_name,
|
|
11587
|
+
created_at: new Date(r.created_at)
|
|
11588
|
+
}));
|
|
11589
|
+
}
|
|
11590
|
+
/** Add a selection. No-op if it already exists. */
|
|
11591
|
+
async add(sessionId, envVarName) {
|
|
11592
|
+
try {
|
|
11593
|
+
const existing = await select(this.db).from(sessionEnvSelections3).where(
|
|
11594
|
+
and16(
|
|
11595
|
+
eq18(sessionEnvSelections3.session_id, sessionId),
|
|
11596
|
+
eq18(sessionEnvSelections3.env_var_name, envVarName)
|
|
11597
|
+
)
|
|
11598
|
+
).one();
|
|
11599
|
+
if (existing) return;
|
|
11600
|
+
await insert(this.db, sessionEnvSelections3).values({
|
|
11601
|
+
session_id: sessionId,
|
|
11602
|
+
env_var_name: envVarName,
|
|
11603
|
+
created_at: /* @__PURE__ */ new Date()
|
|
11604
|
+
}).run();
|
|
11605
|
+
} catch (error) {
|
|
11606
|
+
throw new RepositoryError(
|
|
11607
|
+
`Failed to add session env selection: ${error instanceof Error ? error.message : String(error)}`,
|
|
11608
|
+
error
|
|
11609
|
+
);
|
|
11610
|
+
}
|
|
11611
|
+
}
|
|
11612
|
+
/** Remove a selection. No-op if it doesn't exist. */
|
|
11613
|
+
async remove(sessionId, envVarName) {
|
|
11614
|
+
try {
|
|
11615
|
+
await deleteFrom(this.db, sessionEnvSelections3).where(
|
|
11616
|
+
and16(
|
|
11617
|
+
eq18(sessionEnvSelections3.session_id, sessionId),
|
|
11618
|
+
eq18(sessionEnvSelections3.env_var_name, envVarName)
|
|
11619
|
+
)
|
|
11620
|
+
).run();
|
|
11621
|
+
} catch (error) {
|
|
11622
|
+
throw new RepositoryError(
|
|
11623
|
+
`Failed to remove session env selection: ${error instanceof Error ? error.message : String(error)}`,
|
|
11624
|
+
error
|
|
11625
|
+
);
|
|
11626
|
+
}
|
|
11627
|
+
}
|
|
11628
|
+
/** Bulk replace — deletes all existing rows, inserts the new set. */
|
|
11629
|
+
async setAll(sessionId, envVarNames) {
|
|
11630
|
+
try {
|
|
11631
|
+
await deleteFrom(this.db, sessionEnvSelections3).where(eq18(sessionEnvSelections3.session_id, sessionId)).run();
|
|
11632
|
+
if (envVarNames.length === 0) return;
|
|
11633
|
+
const now = /* @__PURE__ */ new Date();
|
|
11634
|
+
await insert(this.db, sessionEnvSelections3).values(
|
|
11635
|
+
envVarNames.map((name) => ({
|
|
11636
|
+
session_id: sessionId,
|
|
11637
|
+
env_var_name: name,
|
|
11638
|
+
created_at: now
|
|
11639
|
+
}))
|
|
11640
|
+
).run();
|
|
11641
|
+
} catch (error) {
|
|
11642
|
+
throw new RepositoryError(
|
|
11643
|
+
`Failed to set session env selections: ${error instanceof Error ? error.message : String(error)}`,
|
|
11644
|
+
error
|
|
11645
|
+
);
|
|
11646
|
+
}
|
|
11647
|
+
}
|
|
11648
|
+
};
|
|
11649
|
+
|
|
11650
|
+
// src/config/env-resolver.ts
|
|
11651
|
+
init_schema();
|
|
11652
|
+
|
|
11653
|
+
// src/config/env-blocklist.ts
|
|
11654
|
+
init_esm_shims();
|
|
11655
|
+
var BLOCKED_ENV_PATTERNS = Object.freeze([
|
|
11656
|
+
/^LD_/i,
|
|
11657
|
+
/^DYLD_/i,
|
|
11658
|
+
/^PYTHON(?!_AGOR_)/i
|
|
11659
|
+
]);
|
|
11660
|
+
|
|
11661
|
+
// src/config/env-vars.ts
|
|
11662
|
+
init_esm_shims();
|
|
11663
|
+
var V05_SCOPES = ["global", "session"];
|
|
11664
|
+
var V05_SCOPE_SET = new Set(V05_SCOPES);
|
|
11665
|
+
function normalizeStoredEnvVar(raw) {
|
|
11666
|
+
if (typeof raw === "string") {
|
|
11667
|
+
return { value_encrypted: raw, scope: "global" };
|
|
11668
|
+
}
|
|
11669
|
+
return {
|
|
11670
|
+
value_encrypted: raw.value_encrypted,
|
|
11671
|
+
scope: raw.scope,
|
|
11672
|
+
resource_id: raw.resource_id ?? null,
|
|
11673
|
+
extra_config: raw.extra_config ?? null
|
|
11674
|
+
};
|
|
11675
|
+
}
|
|
11676
|
+
function normalizeStoredEnvMap(raw) {
|
|
11677
|
+
const out = {};
|
|
11678
|
+
if (!raw) return out;
|
|
11679
|
+
for (const [key, value] of Object.entries(raw)) {
|
|
11680
|
+
try {
|
|
11681
|
+
out[key] = normalizeStoredEnvVar(value);
|
|
11682
|
+
} catch (err) {
|
|
11683
|
+
console.warn(`[env-vars] Skipping malformed env var entry ${key}:`, err);
|
|
11684
|
+
}
|
|
11685
|
+
}
|
|
11686
|
+
return out;
|
|
11687
|
+
}
|
|
11688
|
+
|
|
11689
|
+
// src/templates/handlebars-helpers.ts
|
|
11690
|
+
init_esm_shims();
|
|
11691
|
+
import Handlebars from "handlebars";
|
|
11692
|
+
|
|
11693
|
+
// src/mcp/template-patterns.ts
|
|
11694
|
+
init_esm_shims();
|
|
11695
|
+
|
|
11393
11696
|
// src/tools/mcp/http-headers.ts
|
|
11394
11697
|
init_esm_shims();
|
|
11395
11698
|
var MCP_HEADER_REDACTED_SENTINEL = "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022";
|
|
@@ -11551,7 +11854,7 @@ var MCPServerRepository = class {
|
|
|
11551
11854
|
try {
|
|
11552
11855
|
const insertData = this.mcpServerToInsert(data);
|
|
11553
11856
|
await insert(this.db, mcpServers3).values(insertData).run();
|
|
11554
|
-
const row = await select(this.db).from(mcpServers3).where(
|
|
11857
|
+
const row = await select(this.db).from(mcpServers3).where(eq20(mcpServers3.mcp_server_id, insertData.mcp_server_id)).one();
|
|
11555
11858
|
if (!row) {
|
|
11556
11859
|
throw new RepositoryError("Failed to retrieve created MCP server");
|
|
11557
11860
|
}
|
|
@@ -11570,7 +11873,7 @@ var MCPServerRepository = class {
|
|
|
11570
11873
|
async findById(id) {
|
|
11571
11874
|
try {
|
|
11572
11875
|
const fullId = await this.resolveId(id);
|
|
11573
|
-
const row = await select(this.db).from(mcpServers3).where(
|
|
11876
|
+
const row = await select(this.db).from(mcpServers3).where(eq20(mcpServers3.mcp_server_id, fullId)).one();
|
|
11574
11877
|
return row ? this.rowToMCPServer(row) : null;
|
|
11575
11878
|
} catch (error) {
|
|
11576
11879
|
if (error instanceof EntityNotFoundError) return null;
|
|
@@ -11589,24 +11892,24 @@ var MCPServerRepository = class {
|
|
|
11589
11892
|
let query = select(this.db).from(mcpServers3);
|
|
11590
11893
|
const conditions = [];
|
|
11591
11894
|
if (filters?.scope) {
|
|
11592
|
-
conditions.push(
|
|
11895
|
+
conditions.push(eq20(mcpServers3.scope, filters.scope));
|
|
11593
11896
|
}
|
|
11594
11897
|
if (filters?.scopeId) {
|
|
11595
11898
|
if (filters.scope === "global") {
|
|
11596
|
-
conditions.push(
|
|
11899
|
+
conditions.push(eq20(mcpServers3.owner_user_id, filters.scopeId));
|
|
11597
11900
|
}
|
|
11598
11901
|
}
|
|
11599
11902
|
if (filters?.transport) {
|
|
11600
|
-
conditions.push(
|
|
11903
|
+
conditions.push(eq20(mcpServers3.transport, filters.transport));
|
|
11601
11904
|
}
|
|
11602
11905
|
if (filters?.enabled !== void 0) {
|
|
11603
|
-
conditions.push(
|
|
11906
|
+
conditions.push(eq20(mcpServers3.enabled, filters.enabled));
|
|
11604
11907
|
}
|
|
11605
11908
|
if (filters?.source) {
|
|
11606
|
-
conditions.push(
|
|
11909
|
+
conditions.push(eq20(mcpServers3.source, filters.source));
|
|
11607
11910
|
}
|
|
11608
11911
|
if (conditions.length > 0) {
|
|
11609
|
-
query = query.where(
|
|
11912
|
+
query = query.where(and17(...conditions));
|
|
11610
11913
|
}
|
|
11611
11914
|
const rows = await query.all();
|
|
11612
11915
|
return rows.map((row) => this.rowToMCPServer(row));
|
|
@@ -11653,7 +11956,7 @@ var MCPServerRepository = class {
|
|
|
11653
11956
|
transport: insertData.transport,
|
|
11654
11957
|
updated_at: /* @__PURE__ */ new Date(),
|
|
11655
11958
|
data: insertData.data
|
|
11656
|
-
}).where(
|
|
11959
|
+
}).where(eq20(mcpServers3.mcp_server_id, fullId)).run();
|
|
11657
11960
|
const updated = await this.findById(fullId);
|
|
11658
11961
|
if (!updated) {
|
|
11659
11962
|
throw new RepositoryError("Failed to retrieve updated MCP server");
|
|
@@ -11674,7 +11977,7 @@ var MCPServerRepository = class {
|
|
|
11674
11977
|
async delete(id) {
|
|
11675
11978
|
try {
|
|
11676
11979
|
const fullId = await this.resolveId(id);
|
|
11677
|
-
const result = await deleteFrom(this.db, mcpServers3).where(
|
|
11980
|
+
const result = await deleteFrom(this.db, mcpServers3).where(eq20(mcpServers3.mcp_server_id, fullId)).run();
|
|
11678
11981
|
if (result.rowsAffected === 0) {
|
|
11679
11982
|
throw new EntityNotFoundError("MCPServer", id);
|
|
11680
11983
|
}
|
|
@@ -11706,7 +12009,7 @@ var MCPServerRepository = class {
|
|
|
11706
12009
|
init_esm_shims();
|
|
11707
12010
|
init_database_wrapper();
|
|
11708
12011
|
init_schema();
|
|
11709
|
-
import { and as
|
|
12012
|
+
import { and as and18, eq as eq21, inArray as inArray7 } from "drizzle-orm";
|
|
11710
12013
|
var MessagesRepository = class {
|
|
11711
12014
|
constructor(db) {
|
|
11712
12015
|
this.db = db;
|
|
@@ -11772,7 +12075,7 @@ var MessagesRepository = class {
|
|
|
11772
12075
|
* Get message by ID
|
|
11773
12076
|
*/
|
|
11774
12077
|
async findById(messageId) {
|
|
11775
|
-
const row = await select(this.db).from(messages3).where(
|
|
12078
|
+
const row = await select(this.db).from(messages3).where(eq21(messages3.message_id, messageId)).one();
|
|
11776
12079
|
return row ? this.rowToMessage(row) : null;
|
|
11777
12080
|
}
|
|
11778
12081
|
/**
|
|
@@ -11781,19 +12084,19 @@ var MessagesRepository = class {
|
|
|
11781
12084
|
async findAll(filter) {
|
|
11782
12085
|
if (filter?.sessionIds !== void 0 && filter.sessionIds.length === 0) return [];
|
|
11783
12086
|
const conditions = [];
|
|
11784
|
-
if (filter?.sessionId) conditions.push(
|
|
12087
|
+
if (filter?.sessionId) conditions.push(eq21(messages3.session_id, filter.sessionId));
|
|
11785
12088
|
if (filter?.sessionIds !== void 0)
|
|
11786
12089
|
conditions.push(inArray7(messages3.session_id, filter.sessionIds));
|
|
11787
|
-
if (filter?.taskId) conditions.push(
|
|
11788
|
-
if (filter?.type) conditions.push(
|
|
11789
|
-
if (filter?.role) conditions.push(
|
|
12090
|
+
if (filter?.taskId) conditions.push(eq21(messages3.task_id, filter.taskId));
|
|
12091
|
+
if (filter?.type) conditions.push(eq21(messages3.type, filter.type));
|
|
12092
|
+
if (filter?.role) conditions.push(eq21(messages3.role, filter.role));
|
|
11790
12093
|
if (filter?.visibleToUserId) {
|
|
11791
12094
|
conditions.push(
|
|
11792
12095
|
visibleSessionReferenceAccessExists(this.db, filter.visibleToUserId, messages3.session_id)
|
|
11793
12096
|
);
|
|
11794
12097
|
}
|
|
11795
12098
|
let query = select(this.db).from(messages3);
|
|
11796
|
-
if (conditions.length > 0) query = query.where(
|
|
12099
|
+
if (conditions.length > 0) query = query.where(and18(...conditions));
|
|
11797
12100
|
const rows = await query.orderBy(messages3.index).all();
|
|
11798
12101
|
return rows.map((r) => this.rowToMessage(r));
|
|
11799
12102
|
}
|
|
@@ -11801,21 +12104,21 @@ var MessagesRepository = class {
|
|
|
11801
12104
|
* Get all messages for a session (ordered by index)
|
|
11802
12105
|
*/
|
|
11803
12106
|
async findBySessionId(sessionId) {
|
|
11804
|
-
const rows = await select(this.db).from(messages3).where(
|
|
12107
|
+
const rows = await select(this.db).from(messages3).where(eq21(messages3.session_id, sessionId)).orderBy(messages3.index).all();
|
|
11805
12108
|
return rows.map((r) => this.rowToMessage(r));
|
|
11806
12109
|
}
|
|
11807
12110
|
/**
|
|
11808
12111
|
* Get all messages for a session filtered by type (ordered by index)
|
|
11809
12112
|
*/
|
|
11810
12113
|
async findBySessionIdAndType(sessionId, type) {
|
|
11811
|
-
const rows = await select(this.db).from(messages3).where(
|
|
12114
|
+
const rows = await select(this.db).from(messages3).where(and18(eq21(messages3.session_id, sessionId), eq21(messages3.type, type))).orderBy(messages3.index).all();
|
|
11812
12115
|
return rows.map((r) => this.rowToMessage(r));
|
|
11813
12116
|
}
|
|
11814
12117
|
/**
|
|
11815
12118
|
* Get all messages for a task (ordered by index)
|
|
11816
12119
|
*/
|
|
11817
12120
|
async findByTaskId(taskId) {
|
|
11818
|
-
const rows = await select(this.db).from(messages3).where(
|
|
12121
|
+
const rows = await select(this.db).from(messages3).where(eq21(messages3.task_id, taskId)).orderBy(messages3.index).all();
|
|
11819
12122
|
return rows.map((r) => this.rowToMessage(r));
|
|
11820
12123
|
}
|
|
11821
12124
|
/**
|
|
@@ -11823,7 +12126,7 @@ var MessagesRepository = class {
|
|
|
11823
12126
|
* Used for task message_range queries
|
|
11824
12127
|
*/
|
|
11825
12128
|
async findByRange(sessionId, startIndex, endIndex) {
|
|
11826
|
-
const rows = await select(this.db).from(messages3).where(
|
|
12129
|
+
const rows = await select(this.db).from(messages3).where(eq21(messages3.session_id, sessionId)).orderBy(messages3.index).all();
|
|
11827
12130
|
return rows.filter((r) => r.index >= startIndex && r.index <= endIndex).map((r) => this.rowToMessage(r));
|
|
11828
12131
|
}
|
|
11829
12132
|
/**
|
|
@@ -11836,33 +12139,33 @@ var MessagesRepository = class {
|
|
|
11836
12139
|
}
|
|
11837
12140
|
const updated = { ...existing, ...updates };
|
|
11838
12141
|
const row = this.messageToRow(updated);
|
|
11839
|
-
const result = await update(this.db, messages3).set(row).where(
|
|
12142
|
+
const result = await update(this.db, messages3).set(row).where(eq21(messages3.message_id, messageId)).returning().one();
|
|
11840
12143
|
return this.rowToMessage(result);
|
|
11841
12144
|
}
|
|
11842
12145
|
/**
|
|
11843
12146
|
* Update message task assignment
|
|
11844
12147
|
*/
|
|
11845
12148
|
async assignToTask(messageId, taskId) {
|
|
11846
|
-
const updated = await update(this.db, messages3).set({ task_id: taskId }).where(
|
|
12149
|
+
const updated = await update(this.db, messages3).set({ task_id: taskId }).where(eq21(messages3.message_id, messageId)).returning().one();
|
|
11847
12150
|
return this.rowToMessage(updated);
|
|
11848
12151
|
}
|
|
11849
12152
|
/**
|
|
11850
12153
|
* Delete all messages for a session (cascades automatically via FK)
|
|
11851
12154
|
*/
|
|
11852
12155
|
async deleteBySessionId(sessionId) {
|
|
11853
|
-
await deleteFrom(this.db, messages3).where(
|
|
12156
|
+
await deleteFrom(this.db, messages3).where(eq21(messages3.session_id, sessionId)).run();
|
|
11854
12157
|
}
|
|
11855
12158
|
/**
|
|
11856
12159
|
* Delete a single message
|
|
11857
12160
|
*/
|
|
11858
12161
|
async delete(messageId) {
|
|
11859
|
-
await deleteFrom(this.db, messages3).where(
|
|
12162
|
+
await deleteFrom(this.db, messages3).where(eq21(messages3.message_id, messageId)).run();
|
|
11860
12163
|
}
|
|
11861
12164
|
};
|
|
11862
12165
|
|
|
11863
12166
|
// src/db/repositories/repos.ts
|
|
11864
12167
|
init_esm_shims();
|
|
11865
|
-
import { eq as
|
|
12168
|
+
import { eq as eq22, like as like11, sql as sql11 } from "drizzle-orm";
|
|
11866
12169
|
|
|
11867
12170
|
// src/config/variant-resolver.ts
|
|
11868
12171
|
init_esm_shims();
|
|
@@ -12023,7 +12326,7 @@ var RepoRepository = class {
|
|
|
12023
12326
|
try {
|
|
12024
12327
|
const insertData = this.repoToInsert(data);
|
|
12025
12328
|
await insert(this.db, repos3).values(insertData).run();
|
|
12026
|
-
const row = await select(this.db).from(repos3).where(
|
|
12329
|
+
const row = await select(this.db).from(repos3).where(eq22(repos3.repo_id, insertData.repo_id)).one();
|
|
12027
12330
|
if (!row) {
|
|
12028
12331
|
throw new RepositoryError("Failed to retrieve created repo");
|
|
12029
12332
|
}
|
|
@@ -12042,7 +12345,7 @@ var RepoRepository = class {
|
|
|
12042
12345
|
async findById(id) {
|
|
12043
12346
|
try {
|
|
12044
12347
|
const fullId = await this.resolveId(id);
|
|
12045
|
-
const row = await select(this.db).from(repos3).where(
|
|
12348
|
+
const row = await select(this.db).from(repos3).where(eq22(repos3.repo_id, fullId)).one();
|
|
12046
12349
|
return row ? this.rowToRepo(row) : null;
|
|
12047
12350
|
} catch (error) {
|
|
12048
12351
|
if (error instanceof EntityNotFoundError) return null;
|
|
@@ -12058,7 +12361,7 @@ var RepoRepository = class {
|
|
|
12058
12361
|
*/
|
|
12059
12362
|
async findBySlug(slug) {
|
|
12060
12363
|
try {
|
|
12061
|
-
const row = await select(this.db).from(repos3).where(
|
|
12364
|
+
const row = await select(this.db).from(repos3).where(eq22(repos3.slug, slug)).one();
|
|
12062
12365
|
return row ? this.rowToRepo(row) : null;
|
|
12063
12366
|
} catch (error) {
|
|
12064
12367
|
throw new RepositoryError(
|
|
@@ -12126,8 +12429,8 @@ var RepoRepository = class {
|
|
|
12126
12429
|
let changed = 0;
|
|
12127
12430
|
for (const finding of scan.findings) {
|
|
12128
12431
|
await this.db.transaction(async (tx) => {
|
|
12129
|
-
await lockRowForUpdate(txAsDb(tx), this.db, repos3,
|
|
12130
|
-
const currentRow = await select(txAsDb(tx)).from(repos3).where(
|
|
12432
|
+
await lockRowForUpdate(txAsDb(tx), this.db, repos3, eq22(repos3.repo_id, finding.repo_id));
|
|
12433
|
+
const currentRow = await select(txAsDb(tx)).from(repos3).where(eq22(repos3.repo_id, finding.repo_id)).one();
|
|
12131
12434
|
if (!currentRow) return;
|
|
12132
12435
|
const data = currentRow.data;
|
|
12133
12436
|
if (typeof data.remote_url !== "string" || !httpUrlHasUserinfo(data.remote_url)) {
|
|
@@ -12139,7 +12442,7 @@ var RepoRepository = class {
|
|
|
12139
12442
|
...data,
|
|
12140
12443
|
remote_url: stripHttpUrlUserinfo(data.remote_url)
|
|
12141
12444
|
}
|
|
12142
|
-
}).where(
|
|
12445
|
+
}).where(eq22(repos3.repo_id, finding.repo_id)).run();
|
|
12143
12446
|
changed += 1;
|
|
12144
12447
|
});
|
|
12145
12448
|
}
|
|
@@ -12161,8 +12464,8 @@ var RepoRepository = class {
|
|
|
12161
12464
|
try {
|
|
12162
12465
|
const fullId = await this.resolveId(id);
|
|
12163
12466
|
return await this.db.transaction(async (tx) => {
|
|
12164
|
-
await lockRowForUpdate(txAsDb(tx), this.db, repos3,
|
|
12165
|
-
const currentRow = await select(txAsDb(tx)).from(repos3).where(
|
|
12467
|
+
await lockRowForUpdate(txAsDb(tx), this.db, repos3, eq22(repos3.repo_id, fullId));
|
|
12468
|
+
const currentRow = await select(txAsDb(tx)).from(repos3).where(eq22(repos3.repo_id, fullId)).one();
|
|
12166
12469
|
if (!currentRow) {
|
|
12167
12470
|
throw new EntityNotFoundError("Repo", id);
|
|
12168
12471
|
}
|
|
@@ -12176,7 +12479,7 @@ var RepoRepository = class {
|
|
|
12176
12479
|
repo_type: insertData.repo_type,
|
|
12177
12480
|
unix_group: merged.unix_group ?? null,
|
|
12178
12481
|
data: insertData.data
|
|
12179
|
-
}).where(
|
|
12482
|
+
}).where(eq22(repos3.repo_id, fullId)).run();
|
|
12180
12483
|
merged.clone_error = insertData.data.clone_error;
|
|
12181
12484
|
merged.remote_url = insertData.data.remote_url;
|
|
12182
12485
|
merged.last_updated = newUpdatedAt.toISOString();
|
|
@@ -12210,8 +12513,8 @@ var RepoRepository = class {
|
|
|
12210
12513
|
try {
|
|
12211
12514
|
const fullId = await this.resolveId(id);
|
|
12212
12515
|
return await this.db.transaction(async (tx) => {
|
|
12213
|
-
await lockRowForUpdate(txAsDb(tx), this.db, repos3,
|
|
12214
|
-
const currentRow = await select(txAsDb(tx)).from(repos3).where(
|
|
12516
|
+
await lockRowForUpdate(txAsDb(tx), this.db, repos3, eq22(repos3.repo_id, fullId));
|
|
12517
|
+
const currentRow = await select(txAsDb(tx)).from(repos3).where(eq22(repos3.repo_id, fullId)).one();
|
|
12215
12518
|
if (!currentRow) {
|
|
12216
12519
|
throw new EntityNotFoundError("Repo", id);
|
|
12217
12520
|
}
|
|
@@ -12225,7 +12528,7 @@ var RepoRepository = class {
|
|
|
12225
12528
|
repo_type: insertData.repo_type,
|
|
12226
12529
|
unix_group: next.unix_group ?? null,
|
|
12227
12530
|
data: insertData.data
|
|
12228
|
-
}).where(
|
|
12531
|
+
}).where(eq22(repos3.repo_id, fullId)).run();
|
|
12229
12532
|
next.environment = insertData.data.environment;
|
|
12230
12533
|
next.environment_config = insertData.data.environment_config;
|
|
12231
12534
|
next.remote_url = insertData.data.remote_url;
|
|
@@ -12265,7 +12568,7 @@ var RepoRepository = class {
|
|
|
12265
12568
|
async delete(id) {
|
|
12266
12569
|
try {
|
|
12267
12570
|
const fullId = await this.resolveId(id);
|
|
12268
|
-
const result = await deleteFrom(this.db, repos3).where(
|
|
12571
|
+
const result = await deleteFrom(this.db, repos3).where(eq22(repos3.repo_id, fullId)).run();
|
|
12269
12572
|
if (result.rowsAffected === 0) {
|
|
12270
12573
|
throw new EntityNotFoundError("Repo", id);
|
|
12271
12574
|
}
|
|
@@ -12312,7 +12615,7 @@ init_esm_shims();
|
|
|
12312
12615
|
init_ids();
|
|
12313
12616
|
init_database_wrapper();
|
|
12314
12617
|
init_schema();
|
|
12315
|
-
import { and as
|
|
12618
|
+
import { and as and19, asc as asc2, desc as desc3, eq as eq23, isNull as isNull6, like as like12, lte, or as or7, sql as sql12 } from "drizzle-orm";
|
|
12316
12619
|
var ScheduleRepository = class {
|
|
12317
12620
|
constructor(db) {
|
|
12318
12621
|
this.db = db;
|
|
@@ -12411,7 +12714,7 @@ var ScheduleRepository = class {
|
|
|
12411
12714
|
async findById(id) {
|
|
12412
12715
|
try {
|
|
12413
12716
|
const fullId = await this.resolveId(id);
|
|
12414
|
-
const row = await select(this.db).from(schedules3).where(
|
|
12717
|
+
const row = await select(this.db).from(schedules3).where(eq23(schedules3.schedule_id, fullId)).one();
|
|
12415
12718
|
if (!row) return null;
|
|
12416
12719
|
return this.rowToSchedule(row);
|
|
12417
12720
|
} catch (error) {
|
|
@@ -12428,18 +12731,18 @@ var ScheduleRepository = class {
|
|
|
12428
12731
|
*/
|
|
12429
12732
|
async findAll(filter) {
|
|
12430
12733
|
const conditions = [];
|
|
12431
|
-
if (filter?.branch_id) conditions.push(
|
|
12432
|
-
if (filter?.enabled !== void 0) conditions.push(
|
|
12433
|
-
if (filter?.created_by) conditions.push(
|
|
12734
|
+
if (filter?.branch_id) conditions.push(eq23(schedules3.branch_id, filter.branch_id));
|
|
12735
|
+
if (filter?.enabled !== void 0) conditions.push(eq23(schedules3.enabled, filter.enabled));
|
|
12736
|
+
if (filter?.created_by) conditions.push(eq23(schedules3.created_by, filter.created_by));
|
|
12434
12737
|
const query = select(this.db).from(schedules3);
|
|
12435
|
-
const rows = conditions.length > 0 ? await query.where(
|
|
12738
|
+
const rows = conditions.length > 0 ? await query.where(and19(...conditions)).all() : await query.all();
|
|
12436
12739
|
return rows.map((row) => this.rowToSchedule(row));
|
|
12437
12740
|
}
|
|
12438
12741
|
/**
|
|
12439
12742
|
* All schedules on a branch (newest first by created_at).
|
|
12440
12743
|
*/
|
|
12441
12744
|
async findByBranchId(branchId) {
|
|
12442
|
-
const rows = await select(this.db).from(schedules3).where(
|
|
12745
|
+
const rows = await select(this.db).from(schedules3).where(eq23(schedules3.branch_id, branchId)).orderBy(desc3(schedules3.created_at)).all();
|
|
12443
12746
|
return rows.map((row) => this.rowToSchedule(row));
|
|
12444
12747
|
}
|
|
12445
12748
|
/**
|
|
@@ -12455,8 +12758,8 @@ var ScheduleRepository = class {
|
|
|
12455
12758
|
* Uses the `schedules_enabled_next_run_idx` covering index.
|
|
12456
12759
|
*/
|
|
12457
12760
|
dueCondition(now) {
|
|
12458
|
-
return
|
|
12459
|
-
|
|
12761
|
+
return and19(
|
|
12762
|
+
eq23(schedules3.enabled, true),
|
|
12460
12763
|
or7(isNull6(schedules3.next_run_at), lte(schedules3.next_run_at, now))
|
|
12461
12764
|
);
|
|
12462
12765
|
}
|
|
@@ -12490,13 +12793,13 @@ var ScheduleRepository = class {
|
|
|
12490
12793
|
*/
|
|
12491
12794
|
async findAccessibleSchedules(userId, filter) {
|
|
12492
12795
|
const conditions = [visibleBranchAccessCondition(this.db, userId)];
|
|
12493
|
-
if (filter?.branch_id) conditions.push(
|
|
12494
|
-
if (filter?.enabled !== void 0) conditions.push(
|
|
12495
|
-
if (filter?.created_by) conditions.push(
|
|
12496
|
-
const results = await select(this.db).from(schedules3).innerJoin(branches3,
|
|
12796
|
+
if (filter?.branch_id) conditions.push(eq23(schedules3.branch_id, filter.branch_id));
|
|
12797
|
+
if (filter?.enabled !== void 0) conditions.push(eq23(schedules3.enabled, filter.enabled));
|
|
12798
|
+
if (filter?.created_by) conditions.push(eq23(schedules3.created_by, filter.created_by));
|
|
12799
|
+
const results = await select(this.db).from(schedules3).innerJoin(branches3, eq23(schedules3.branch_id, branches3.branch_id)).leftJoin(
|
|
12497
12800
|
branchOwners3,
|
|
12498
|
-
|
|
12499
|
-
).where(
|
|
12801
|
+
and19(eq23(branchOwners3.branch_id, branches3.branch_id), eq23(branchOwners3.user_id, userId))
|
|
12802
|
+
).where(and19(...conditions)).all();
|
|
12500
12803
|
const seen = /* @__PURE__ */ new Set();
|
|
12501
12804
|
const out = [];
|
|
12502
12805
|
for (const r of results) {
|
|
@@ -12517,8 +12820,8 @@ var ScheduleRepository = class {
|
|
|
12517
12820
|
async update(id, updates) {
|
|
12518
12821
|
const fullId = await this.resolveId(id);
|
|
12519
12822
|
return await this.db.transaction(async (tx) => {
|
|
12520
|
-
await lockRowForUpdate(txAsDb(tx), this.db, schedules3,
|
|
12521
|
-
const currentRow = await select(txAsDb(tx)).from(schedules3).where(
|
|
12823
|
+
await lockRowForUpdate(txAsDb(tx), this.db, schedules3, eq23(schedules3.schedule_id, fullId));
|
|
12824
|
+
const currentRow = await select(txAsDb(tx)).from(schedules3).where(eq23(schedules3.schedule_id, fullId)).one();
|
|
12522
12825
|
if (!currentRow) throw new EntityNotFoundError("Schedule", id);
|
|
12523
12826
|
const current = this.rowToSchedule(currentRow);
|
|
12524
12827
|
const merged = deepMerge(current, {
|
|
@@ -12532,13 +12835,13 @@ var ScheduleRepository = class {
|
|
|
12532
12835
|
});
|
|
12533
12836
|
const insertData = this.scheduleToInsert(merged);
|
|
12534
12837
|
insertData.updated_at = /* @__PURE__ */ new Date();
|
|
12535
|
-
const row = await update(txAsDb(tx), schedules3).set(insertData).where(
|
|
12838
|
+
const row = await update(txAsDb(tx), schedules3).set(insertData).where(eq23(schedules3.schedule_id, fullId)).returning().one();
|
|
12536
12839
|
return this.rowToSchedule(row);
|
|
12537
12840
|
});
|
|
12538
12841
|
}
|
|
12539
12842
|
async delete(id) {
|
|
12540
12843
|
const fullId = await this.resolveId(id);
|
|
12541
|
-
const result = await deleteFrom(this.db, schedules3).where(
|
|
12844
|
+
const result = await deleteFrom(this.db, schedules3).where(eq23(schedules3.schedule_id, fullId)).run();
|
|
12542
12845
|
if (result.rowsAffected === 0) throw new EntityNotFoundError("Schedule", id);
|
|
12543
12846
|
}
|
|
12544
12847
|
/**
|
|
@@ -12546,10 +12849,10 @@ var ScheduleRepository = class {
|
|
|
12546
12849
|
*/
|
|
12547
12850
|
async count(filter) {
|
|
12548
12851
|
const conditions = [];
|
|
12549
|
-
if (filter?.branch_id) conditions.push(
|
|
12550
|
-
if (filter?.enabled !== void 0) conditions.push(
|
|
12852
|
+
if (filter?.branch_id) conditions.push(eq23(schedules3.branch_id, filter.branch_id));
|
|
12853
|
+
if (filter?.enabled !== void 0) conditions.push(eq23(schedules3.enabled, filter.enabled));
|
|
12551
12854
|
const query = select(this.db, { count: sql12`count(*)` }).from(schedules3);
|
|
12552
|
-
const row = conditions.length > 0 ? await query.where(
|
|
12855
|
+
const row = conditions.length > 0 ? await query.where(and19(...conditions)).one() : await query.one();
|
|
12553
12856
|
return Number(row?.count ?? 0);
|
|
12554
12857
|
}
|
|
12555
12858
|
};
|
|
@@ -12559,7 +12862,7 @@ init_esm_shims();
|
|
|
12559
12862
|
init_ids();
|
|
12560
12863
|
init_database_wrapper();
|
|
12561
12864
|
init_schema();
|
|
12562
|
-
import { and as
|
|
12865
|
+
import { and as and20, desc as desc4, eq as eq24, lt } from "drizzle-orm";
|
|
12563
12866
|
function rowToSerializedSession(row) {
|
|
12564
12867
|
return {
|
|
12565
12868
|
id: row.id,
|
|
@@ -12583,7 +12886,7 @@ var SerializedSessionRepository = class {
|
|
|
12583
12886
|
async findLatestDone(sessionId) {
|
|
12584
12887
|
try {
|
|
12585
12888
|
const row = await select(this.db).from(serializedSessions3).where(
|
|
12586
|
-
|
|
12889
|
+
and20(eq24(serializedSessions3.session_id, sessionId), eq24(serializedSessions3.status, "done"))
|
|
12587
12890
|
).orderBy(desc4(serializedSessions3.turn_index), desc4(serializedSessions3.created_at)).limit(1).one();
|
|
12588
12891
|
return row ? rowToSerializedSession(row) : null;
|
|
12589
12892
|
} catch (error) {
|
|
@@ -12598,7 +12901,7 @@ var SerializedSessionRepository = class {
|
|
|
12598
12901
|
*/
|
|
12599
12902
|
async findLatest(sessionId) {
|
|
12600
12903
|
try {
|
|
12601
|
-
const row = await select(this.db).from(serializedSessions3).where(
|
|
12904
|
+
const row = await select(this.db).from(serializedSessions3).where(eq24(serializedSessions3.session_id, sessionId)).orderBy(desc4(serializedSessions3.turn_index), desc4(serializedSessions3.created_at)).limit(1).one();
|
|
12602
12905
|
return row ? rowToSerializedSession(row) : null;
|
|
12603
12906
|
} catch (error) {
|
|
12604
12907
|
throw new RepositoryError(
|
|
@@ -12649,7 +12952,7 @@ var SerializedSessionRepository = class {
|
|
|
12649
12952
|
*/
|
|
12650
12953
|
async markDone(id, payload) {
|
|
12651
12954
|
try {
|
|
12652
|
-
await update(this.db, serializedSessions3).set({ status: "done", payload }).where(
|
|
12955
|
+
await update(this.db, serializedSessions3).set({ status: "done", payload }).where(eq24(serializedSessions3.id, id)).run();
|
|
12653
12956
|
} catch (error) {
|
|
12654
12957
|
throw new RepositoryError(
|
|
12655
12958
|
`Failed to mark serialized session as done: ${error instanceof Error ? error.message : String(error)}`,
|
|
@@ -12662,7 +12965,7 @@ var SerializedSessionRepository = class {
|
|
|
12662
12965
|
*/
|
|
12663
12966
|
async deleteById(id) {
|
|
12664
12967
|
try {
|
|
12665
|
-
await deleteFrom(this.db, serializedSessions3).where(
|
|
12968
|
+
await deleteFrom(this.db, serializedSessions3).where(eq24(serializedSessions3.id, id)).run();
|
|
12666
12969
|
} catch (error) {
|
|
12667
12970
|
throw new RepositoryError(
|
|
12668
12971
|
`Failed to delete serialized session: ${error instanceof Error ? error.message : String(error)}`,
|
|
@@ -12677,8 +12980,8 @@ var SerializedSessionRepository = class {
|
|
|
12677
12980
|
async deletePreviousTurns(sessionId, beforeTurnIndex) {
|
|
12678
12981
|
try {
|
|
12679
12982
|
await deleteFrom(this.db, serializedSessions3).where(
|
|
12680
|
-
|
|
12681
|
-
|
|
12983
|
+
and20(
|
|
12984
|
+
eq24(serializedSessions3.session_id, sessionId),
|
|
12682
12985
|
lt(serializedSessions3.turn_index, beforeTurnIndex)
|
|
12683
12986
|
)
|
|
12684
12987
|
).run();
|
|
@@ -12691,117 +12994,18 @@ var SerializedSessionRepository = class {
|
|
|
12691
12994
|
}
|
|
12692
12995
|
};
|
|
12693
12996
|
|
|
12694
|
-
// src/db/repositories/session-env-selections.ts
|
|
12695
|
-
init_esm_shims();
|
|
12696
|
-
init_database_wrapper();
|
|
12697
|
-
init_schema();
|
|
12698
|
-
import { and as and20, eq as eq23 } from "drizzle-orm";
|
|
12699
|
-
var SessionEnvSelectionRepository = class {
|
|
12700
|
-
constructor(db) {
|
|
12701
|
-
this.db = db;
|
|
12702
|
-
}
|
|
12703
|
-
/** Shared SELECT for a session's rows — single source of truth for reads. */
|
|
12704
|
-
async fetchRows(sessionId) {
|
|
12705
|
-
try {
|
|
12706
|
-
return await select(this.db).from(sessionEnvSelections3).where(eq23(sessionEnvSelections3.session_id, sessionId)).all();
|
|
12707
|
-
} catch (error) {
|
|
12708
|
-
throw new RepositoryError(
|
|
12709
|
-
`Failed to list session env selections: ${error instanceof Error ? error.message : String(error)}`,
|
|
12710
|
-
error
|
|
12711
|
-
);
|
|
12712
|
-
}
|
|
12713
|
-
}
|
|
12714
|
-
/** List selected env var names for a session (not hydrated). */
|
|
12715
|
-
async listNames(sessionId) {
|
|
12716
|
-
const rows = await this.fetchRows(sessionId);
|
|
12717
|
-
return rows.map((r) => r.env_var_name);
|
|
12718
|
-
}
|
|
12719
|
-
/** Return a Set for fast membership checks in the env resolver. */
|
|
12720
|
-
async asSet(sessionId) {
|
|
12721
|
-
const names = await this.listNames(sessionId);
|
|
12722
|
-
return new Set(names);
|
|
12723
|
-
}
|
|
12724
|
-
/** Full rows with timestamps — for the REST API response. */
|
|
12725
|
-
async list(sessionId) {
|
|
12726
|
-
const rows = await this.fetchRows(sessionId);
|
|
12727
|
-
return rows.map((r) => ({
|
|
12728
|
-
session_id: r.session_id,
|
|
12729
|
-
env_var_name: r.env_var_name,
|
|
12730
|
-
created_at: new Date(r.created_at)
|
|
12731
|
-
}));
|
|
12732
|
-
}
|
|
12733
|
-
/** Add a selection. No-op if it already exists. */
|
|
12734
|
-
async add(sessionId, envVarName) {
|
|
12735
|
-
try {
|
|
12736
|
-
const existing = await select(this.db).from(sessionEnvSelections3).where(
|
|
12737
|
-
and20(
|
|
12738
|
-
eq23(sessionEnvSelections3.session_id, sessionId),
|
|
12739
|
-
eq23(sessionEnvSelections3.env_var_name, envVarName)
|
|
12740
|
-
)
|
|
12741
|
-
).one();
|
|
12742
|
-
if (existing) return;
|
|
12743
|
-
await insert(this.db, sessionEnvSelections3).values({
|
|
12744
|
-
session_id: sessionId,
|
|
12745
|
-
env_var_name: envVarName,
|
|
12746
|
-
created_at: /* @__PURE__ */ new Date()
|
|
12747
|
-
}).run();
|
|
12748
|
-
} catch (error) {
|
|
12749
|
-
throw new RepositoryError(
|
|
12750
|
-
`Failed to add session env selection: ${error instanceof Error ? error.message : String(error)}`,
|
|
12751
|
-
error
|
|
12752
|
-
);
|
|
12753
|
-
}
|
|
12754
|
-
}
|
|
12755
|
-
/** Remove a selection. No-op if it doesn't exist. */
|
|
12756
|
-
async remove(sessionId, envVarName) {
|
|
12757
|
-
try {
|
|
12758
|
-
await deleteFrom(this.db, sessionEnvSelections3).where(
|
|
12759
|
-
and20(
|
|
12760
|
-
eq23(sessionEnvSelections3.session_id, sessionId),
|
|
12761
|
-
eq23(sessionEnvSelections3.env_var_name, envVarName)
|
|
12762
|
-
)
|
|
12763
|
-
).run();
|
|
12764
|
-
} catch (error) {
|
|
12765
|
-
throw new RepositoryError(
|
|
12766
|
-
`Failed to remove session env selection: ${error instanceof Error ? error.message : String(error)}`,
|
|
12767
|
-
error
|
|
12768
|
-
);
|
|
12769
|
-
}
|
|
12770
|
-
}
|
|
12771
|
-
/** Bulk replace — deletes all existing rows, inserts the new set. */
|
|
12772
|
-
async setAll(sessionId, envVarNames) {
|
|
12773
|
-
try {
|
|
12774
|
-
await deleteFrom(this.db, sessionEnvSelections3).where(eq23(sessionEnvSelections3.session_id, sessionId)).run();
|
|
12775
|
-
if (envVarNames.length === 0) return;
|
|
12776
|
-
const now = /* @__PURE__ */ new Date();
|
|
12777
|
-
await insert(this.db, sessionEnvSelections3).values(
|
|
12778
|
-
envVarNames.map((name) => ({
|
|
12779
|
-
session_id: sessionId,
|
|
12780
|
-
env_var_name: name,
|
|
12781
|
-
created_at: now
|
|
12782
|
-
}))
|
|
12783
|
-
).run();
|
|
12784
|
-
} catch (error) {
|
|
12785
|
-
throw new RepositoryError(
|
|
12786
|
-
`Failed to set session env selections: ${error instanceof Error ? error.message : String(error)}`,
|
|
12787
|
-
error
|
|
12788
|
-
);
|
|
12789
|
-
}
|
|
12790
|
-
}
|
|
12791
|
-
};
|
|
12792
|
-
|
|
12793
12997
|
// src/db/repositories/session-mcp-servers.ts
|
|
12794
12998
|
init_esm_shims();
|
|
12795
12999
|
init_database_wrapper();
|
|
12796
13000
|
init_schema();
|
|
12797
|
-
import { and as and22, eq as
|
|
13001
|
+
import { and as and22, eq as eq26 } from "drizzle-orm";
|
|
12798
13002
|
|
|
12799
13003
|
// src/db/repositories/sessions.ts
|
|
12800
13004
|
init_esm_shims();
|
|
12801
13005
|
init_types2();
|
|
12802
13006
|
init_config_manager();
|
|
12803
13007
|
init_ids();
|
|
12804
|
-
import { and as and21, desc as desc5, eq as
|
|
13008
|
+
import { and as and21, desc as desc5, eq as eq25, inArray as inArray8, like as like13, or as or8, sql as sql13 } from "drizzle-orm";
|
|
12805
13009
|
init_database_wrapper();
|
|
12806
13010
|
init_schema();
|
|
12807
13011
|
function isSessionTimestampNeutralPatch(updates) {
|
|
@@ -12826,40 +13030,43 @@ var SessionRepository = class {
|
|
|
12826
13030
|
const sessionId = row.session_id;
|
|
12827
13031
|
const boardId = branchBoardId ?? null;
|
|
12828
13032
|
const url = baseUrl && boardId ? getSessionUrl(sessionId, baseUrl) : null;
|
|
12829
|
-
return
|
|
12830
|
-
|
|
12831
|
-
|
|
12832
|
-
|
|
12833
|
-
|
|
12834
|
-
|
|
12835
|
-
|
|
12836
|
-
|
|
12837
|
-
|
|
12838
|
-
|
|
12839
|
-
|
|
12840
|
-
|
|
12841
|
-
|
|
12842
|
-
|
|
12843
|
-
|
|
12844
|
-
|
|
12845
|
-
|
|
12846
|
-
|
|
12847
|
-
|
|
12848
|
-
|
|
12849
|
-
|
|
13033
|
+
return attachHiddenTenant(
|
|
13034
|
+
{
|
|
13035
|
+
session_id: sessionId,
|
|
13036
|
+
status: row.status,
|
|
13037
|
+
agentic_tool: row.agentic_tool,
|
|
13038
|
+
created_at: new Date(row.created_at).toISOString(),
|
|
13039
|
+
last_updated: row.updated_at ? new Date(row.updated_at).toISOString() : new Date(row.created_at).toISOString(),
|
|
13040
|
+
created_by: row.created_by,
|
|
13041
|
+
unix_username: row.unix_username || null,
|
|
13042
|
+
branch_id: row.branch_id,
|
|
13043
|
+
branch_board_id: boardId,
|
|
13044
|
+
url,
|
|
13045
|
+
...row.data,
|
|
13046
|
+
tasks: row.data.tasks.map((id) => id),
|
|
13047
|
+
genealogy: {
|
|
13048
|
+
parent_session_id: row.parent_session_id,
|
|
13049
|
+
forked_from_session_id: row.forked_from_session_id,
|
|
13050
|
+
fork_point_task_id: genealogyData.fork_point_task_id,
|
|
13051
|
+
fork_point_message_index: genealogyData.fork_point_message_index,
|
|
13052
|
+
spawn_point_task_id: genealogyData.spawn_point_task_id,
|
|
13053
|
+
spawn_point_message_index: genealogyData.spawn_point_message_index,
|
|
13054
|
+
children: genealogyData.children.map((id) => id)
|
|
13055
|
+
},
|
|
13056
|
+
permission_config: row.data.permission_config,
|
|
13057
|
+
scheduled_run_at: row.scheduled_run_at ?? void 0,
|
|
13058
|
+
scheduled_from_branch: row.scheduled_from_branch ?? false,
|
|
13059
|
+
schedule_id: row.schedule_id ?? void 0,
|
|
13060
|
+
ready_for_prompt: row.ready_for_prompt ?? false,
|
|
13061
|
+
archived: Boolean(row.archived),
|
|
13062
|
+
// Convert SQLite integer (0/1) to boolean
|
|
13063
|
+
archived_reason: row.archived_reason ?? void 0,
|
|
13064
|
+
current_context_usage: row.data.current_context_usage,
|
|
13065
|
+
context_window_limit: row.data.context_window_limit,
|
|
13066
|
+
last_context_update_at: row.data.last_context_update_at
|
|
12850
13067
|
},
|
|
12851
|
-
|
|
12852
|
-
|
|
12853
|
-
scheduled_from_branch: row.scheduled_from_branch ?? false,
|
|
12854
|
-
schedule_id: row.schedule_id ?? void 0,
|
|
12855
|
-
ready_for_prompt: row.ready_for_prompt ?? false,
|
|
12856
|
-
archived: Boolean(row.archived),
|
|
12857
|
-
// Convert SQLite integer (0/1) to boolean
|
|
12858
|
-
archived_reason: row.archived_reason ?? void 0,
|
|
12859
|
-
current_context_usage: row.data.current_context_usage,
|
|
12860
|
-
context_window_limit: row.data.context_window_limit,
|
|
12861
|
-
last_context_update_at: row.data.last_context_update_at
|
|
12862
|
-
};
|
|
13068
|
+
row
|
|
13069
|
+
);
|
|
12863
13070
|
}
|
|
12864
13071
|
/**
|
|
12865
13072
|
* Convert Session to database insert format
|
|
@@ -12947,7 +13154,7 @@ var SessionRepository = class {
|
|
|
12947
13154
|
const insertData = this.sessionToInsert(data);
|
|
12948
13155
|
await insert(this.db, sessions3).values(insertData).run();
|
|
12949
13156
|
const baseUrl = await getBaseUrl();
|
|
12950
|
-
const result = await select(this.db).from(sessions3).leftJoin(branches3,
|
|
13157
|
+
const result = await select(this.db).from(sessions3).leftJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id)).where(eq25(sessions3.session_id, insertData.session_id)).one();
|
|
12951
13158
|
if (!result) {
|
|
12952
13159
|
throw new RepositoryError("Failed to retrieve created session");
|
|
12953
13160
|
}
|
|
@@ -12972,7 +13179,7 @@ var SessionRepository = class {
|
|
|
12972
13179
|
try {
|
|
12973
13180
|
const fullId = await this.resolveId(id);
|
|
12974
13181
|
const baseUrl = await getBaseUrl();
|
|
12975
|
-
const result = await select(this.db).from(sessions3).leftJoin(branches3,
|
|
13182
|
+
const result = await select(this.db).from(sessions3).leftJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id)).where(eq25(sessions3.session_id, fullId)).one();
|
|
12976
13183
|
if (!result) {
|
|
12977
13184
|
return null;
|
|
12978
13185
|
}
|
|
@@ -12995,7 +13202,7 @@ var SessionRepository = class {
|
|
|
12995
13202
|
async findBranchIdBySessionId(id) {
|
|
12996
13203
|
try {
|
|
12997
13204
|
const fullId = await this.resolveId(id);
|
|
12998
|
-
const row = await select(this.db, { branch_id: sessions3.branch_id }).from(sessions3).where(
|
|
13205
|
+
const row = await select(this.db, { branch_id: sessions3.branch_id }).from(sessions3).where(eq25(sessions3.session_id, fullId)).one();
|
|
12999
13206
|
return row?.branch_id ?? null;
|
|
13000
13207
|
} catch (error) {
|
|
13001
13208
|
if (error instanceof EntityNotFoundError) return null;
|
|
@@ -13006,6 +13213,26 @@ var SessionRepository = class {
|
|
|
13006
13213
|
);
|
|
13007
13214
|
}
|
|
13008
13215
|
}
|
|
13216
|
+
/**
|
|
13217
|
+
* Resolve the owning user id for a session without hydrating the full row.
|
|
13218
|
+
* Used by realtime delivery to offer streaming events to the session
|
|
13219
|
+
* creator's own connections as a fallback, so their open tabs keep updating
|
|
13220
|
+
* even before they subscribe to the per-session stream channel.
|
|
13221
|
+
*/
|
|
13222
|
+
async findCreatedByBySessionId(id) {
|
|
13223
|
+
try {
|
|
13224
|
+
const fullId = await this.resolveId(id);
|
|
13225
|
+
const row = await select(this.db, { created_by: sessions3.created_by }).from(sessions3).where(eq25(sessions3.session_id, fullId)).one();
|
|
13226
|
+
return row?.created_by ?? null;
|
|
13227
|
+
} catch (error) {
|
|
13228
|
+
if (error instanceof EntityNotFoundError) return null;
|
|
13229
|
+
if (error instanceof AmbiguousIdError) throw error;
|
|
13230
|
+
throw new RepositoryError(
|
|
13231
|
+
`Failed to find session owner: ${error instanceof Error ? error.message : String(error)}`,
|
|
13232
|
+
error
|
|
13233
|
+
);
|
|
13234
|
+
}
|
|
13235
|
+
}
|
|
13009
13236
|
/**
|
|
13010
13237
|
* Find all sessions
|
|
13011
13238
|
*
|
|
@@ -13018,13 +13245,13 @@ var SessionRepository = class {
|
|
|
13018
13245
|
if (filter?.visibleToUserId) {
|
|
13019
13246
|
conditions.push(visibleBranchAccessCondition(this.db, filter.visibleToUserId));
|
|
13020
13247
|
}
|
|
13021
|
-
const query = filter?.visibleToUserId ? select(this.db).from(sessions3).leftJoin(branches3,
|
|
13248
|
+
const query = filter?.visibleToUserId ? select(this.db).from(sessions3).leftJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id)).leftJoin(
|
|
13022
13249
|
branchOwners3,
|
|
13023
13250
|
and21(
|
|
13024
|
-
|
|
13025
|
-
|
|
13251
|
+
eq25(branchOwners3.branch_id, branches3.branch_id),
|
|
13252
|
+
eq25(branchOwners3.user_id, filter.visibleToUserId)
|
|
13026
13253
|
)
|
|
13027
|
-
) : select(this.db).from(sessions3).leftJoin(branches3,
|
|
13254
|
+
) : select(this.db).from(sessions3).leftJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id));
|
|
13028
13255
|
const results = conditions.length > 0 ? await query.where(and21(...conditions)).all() : await query.all();
|
|
13029
13256
|
return results.map(
|
|
13030
13257
|
(result) => {
|
|
@@ -13048,7 +13275,7 @@ var SessionRepository = class {
|
|
|
13048
13275
|
async findByStatus(status) {
|
|
13049
13276
|
try {
|
|
13050
13277
|
const baseUrl = await getBaseUrl();
|
|
13051
|
-
const results = await select(this.db).from(sessions3).leftJoin(branches3,
|
|
13278
|
+
const results = await select(this.db).from(sessions3).leftJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id)).where(eq25(sessions3.status, status)).all();
|
|
13052
13279
|
return results.map(
|
|
13053
13280
|
(result) => {
|
|
13054
13281
|
const sessionRow = result.sessions;
|
|
@@ -13076,17 +13303,17 @@ var SessionRepository = class {
|
|
|
13076
13303
|
async findByBoard(boardId, filter) {
|
|
13077
13304
|
try {
|
|
13078
13305
|
const baseUrl = await getBaseUrl();
|
|
13079
|
-
const conditions = [
|
|
13306
|
+
const conditions = [eq25(branches3.board_id, boardId)];
|
|
13080
13307
|
if (filter?.visibleToUserId) {
|
|
13081
13308
|
conditions.push(visibleBranchAccessCondition(this.db, filter.visibleToUserId));
|
|
13082
13309
|
}
|
|
13083
|
-
const query = filter?.visibleToUserId ? select(this.db).from(sessions3).innerJoin(branches3,
|
|
13310
|
+
const query = filter?.visibleToUserId ? select(this.db).from(sessions3).innerJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id)).leftJoin(
|
|
13084
13311
|
branchOwners3,
|
|
13085
13312
|
and21(
|
|
13086
|
-
|
|
13087
|
-
|
|
13313
|
+
eq25(branchOwners3.branch_id, branches3.branch_id),
|
|
13314
|
+
eq25(branchOwners3.user_id, filter.visibleToUserId)
|
|
13088
13315
|
)
|
|
13089
|
-
) : select(this.db).from(sessions3).innerJoin(branches3,
|
|
13316
|
+
) : select(this.db).from(sessions3).innerJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id));
|
|
13090
13317
|
const results = await query.where(and21(...conditions)).all();
|
|
13091
13318
|
return results.map(
|
|
13092
13319
|
(result) => {
|
|
@@ -13123,31 +13350,31 @@ var SessionRepository = class {
|
|
|
13123
13350
|
try {
|
|
13124
13351
|
const baseUrl = await getBaseUrl();
|
|
13125
13352
|
const conditions = [];
|
|
13126
|
-
if (opts.boardId !== void 0) conditions.push(
|
|
13127
|
-
if (opts.archived !== void 0) conditions.push(
|
|
13353
|
+
if (opts.boardId !== void 0) conditions.push(eq25(branches3.board_id, opts.boardId));
|
|
13354
|
+
if (opts.archived !== void 0) conditions.push(eq25(sessions3.archived, opts.archived));
|
|
13128
13355
|
if (opts.visibleToUserId) {
|
|
13129
13356
|
conditions.push(visibleBranchAccessCondition(this.db, opts.visibleToUserId));
|
|
13130
13357
|
}
|
|
13131
13358
|
const whereClause = conditions.length > 0 ? and21(...conditions) : void 0;
|
|
13132
|
-
let countQuery = select(this.db, { count: sql13`count(*)` }).from(sessions3).leftJoin(branches3,
|
|
13359
|
+
let countQuery = select(this.db, { count: sql13`count(*)` }).from(sessions3).leftJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id));
|
|
13133
13360
|
if (opts.visibleToUserId) {
|
|
13134
13361
|
countQuery = countQuery.leftJoin(
|
|
13135
13362
|
branchOwners3,
|
|
13136
13363
|
and21(
|
|
13137
|
-
|
|
13138
|
-
|
|
13364
|
+
eq25(branchOwners3.branch_id, branches3.branch_id),
|
|
13365
|
+
eq25(branchOwners3.user_id, opts.visibleToUserId)
|
|
13139
13366
|
)
|
|
13140
13367
|
);
|
|
13141
13368
|
}
|
|
13142
13369
|
const countRow = await (whereClause ? countQuery.where(whereClause) : countQuery).one();
|
|
13143
13370
|
const total = Number(countRow?.count ?? 0);
|
|
13144
|
-
let dataQuery = select(this.db).from(sessions3).leftJoin(branches3,
|
|
13371
|
+
let dataQuery = select(this.db).from(sessions3).leftJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id));
|
|
13145
13372
|
if (opts.visibleToUserId) {
|
|
13146
13373
|
dataQuery = dataQuery.leftJoin(
|
|
13147
13374
|
branchOwners3,
|
|
13148
13375
|
and21(
|
|
13149
|
-
|
|
13150
|
-
|
|
13376
|
+
eq25(branchOwners3.branch_id, branches3.branch_id),
|
|
13377
|
+
eq25(branchOwners3.user_id, opts.visibleToUserId)
|
|
13151
13378
|
)
|
|
13152
13379
|
);
|
|
13153
13380
|
}
|
|
@@ -13184,7 +13411,7 @@ var SessionRepository = class {
|
|
|
13184
13411
|
const fullId = await this.resolveId(sessionId);
|
|
13185
13412
|
const baseUrl = await getBaseUrl();
|
|
13186
13413
|
const { jsonExtract: jsonExtract2 } = await Promise.resolve().then(() => (init_database_wrapper(), database_wrapper_exports));
|
|
13187
|
-
const results = await select(this.db).from(sessions3).leftJoin(branches3,
|
|
13414
|
+
const results = await select(this.db).from(sessions3).leftJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id)).where(
|
|
13188
13415
|
or8(
|
|
13189
13416
|
sql13`${jsonExtract2(this.db, sessions3.data, "genealogy.parent_session_id")} = ${fullId}`,
|
|
13190
13417
|
sql13`${jsonExtract2(this.db, sessions3.data, "genealogy.forked_from_session_id")} = ${fullId}`
|
|
@@ -13253,8 +13480,8 @@ var SessionRepository = class {
|
|
|
13253
13480
|
const statusInfo = updates.status ? ` (status: ${updates.status}, ready_for_prompt: ${updates.ready_for_prompt})` : "";
|
|
13254
13481
|
console.debug(`\u{1F504} [SessionRepo] Updating session ${shortId(fullId)}${statusInfo}`);
|
|
13255
13482
|
const result = await this.db.transaction(async (tx) => {
|
|
13256
|
-
await lockRowForUpdate(txAsDb(tx), this.db, sessions3,
|
|
13257
|
-
const currentResult = await select(txAsDb(tx)).from(sessions3).leftJoin(branches3,
|
|
13483
|
+
await lockRowForUpdate(txAsDb(tx), this.db, sessions3, eq25(sessions3.session_id, fullId));
|
|
13484
|
+
const currentResult = await select(txAsDb(tx)).from(sessions3).leftJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id)).where(eq25(sessions3.session_id, fullId)).one();
|
|
13258
13485
|
if (!currentResult) {
|
|
13259
13486
|
throw new EntityNotFoundError("Session", id);
|
|
13260
13487
|
}
|
|
@@ -13267,12 +13494,12 @@ var SessionRepository = class {
|
|
|
13267
13494
|
if (shouldRefreshLastUpdated) {
|
|
13268
13495
|
insertData.updated_at = /* @__PURE__ */ new Date();
|
|
13269
13496
|
}
|
|
13270
|
-
await update(txAsDb(tx), sessions3).set(insertData).where(
|
|
13497
|
+
await update(txAsDb(tx), sessions3).set(insertData).where(eq25(sessions3.session_id, fullId)).run();
|
|
13271
13498
|
if (!insertData.updated_at) {
|
|
13272
13499
|
throw new RepositoryError("Session update did not produce an updated_at timestamp");
|
|
13273
13500
|
}
|
|
13274
13501
|
merged.last_updated = insertData.updated_at.toISOString();
|
|
13275
|
-
return merged;
|
|
13502
|
+
return attachHiddenTenant(merged, currentRow);
|
|
13276
13503
|
});
|
|
13277
13504
|
return result;
|
|
13278
13505
|
} catch (error) {
|
|
@@ -13291,7 +13518,7 @@ var SessionRepository = class {
|
|
|
13291
13518
|
const fullId = await this.resolveId(sessionId);
|
|
13292
13519
|
const result = await select(this.db, {
|
|
13293
13520
|
count: sql13`count(*)`
|
|
13294
|
-
}).from(messages3).where(
|
|
13521
|
+
}).from(messages3).where(eq25(messages3.session_id, fullId)).one();
|
|
13295
13522
|
return Number(result?.count ?? 0);
|
|
13296
13523
|
}
|
|
13297
13524
|
/**
|
|
@@ -13300,7 +13527,7 @@ var SessionRepository = class {
|
|
|
13300
13527
|
async delete(id) {
|
|
13301
13528
|
try {
|
|
13302
13529
|
const fullId = await this.resolveId(id);
|
|
13303
|
-
const result = await deleteFrom(this.db, sessions3).where(
|
|
13530
|
+
const result = await deleteFrom(this.db, sessions3).where(eq25(sessions3.session_id, fullId)).run();
|
|
13304
13531
|
if (result.rowsAffected === 0) {
|
|
13305
13532
|
throw new EntityNotFoundError("Session", id);
|
|
13306
13533
|
}
|
|
@@ -13347,8 +13574,8 @@ var SessionRepository = class {
|
|
|
13347
13574
|
async findScheduleRun(scheduleId, scheduledRunAt) {
|
|
13348
13575
|
try {
|
|
13349
13576
|
const baseUrl = await getBaseUrl();
|
|
13350
|
-
const result = await select(this.db).from(sessions3).leftJoin(branches3,
|
|
13351
|
-
and21(
|
|
13577
|
+
const result = await select(this.db).from(sessions3).leftJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id)).where(
|
|
13578
|
+
and21(eq25(sessions3.schedule_id, scheduleId), eq25(sessions3.scheduled_run_at, scheduledRunAt))
|
|
13352
13579
|
).one();
|
|
13353
13580
|
if (!result) return null;
|
|
13354
13581
|
const r = result;
|
|
@@ -13371,7 +13598,7 @@ var SessionRepository = class {
|
|
|
13371
13598
|
async findByScheduleId(scheduleId, opts = {}) {
|
|
13372
13599
|
try {
|
|
13373
13600
|
const baseUrl = await getBaseUrl();
|
|
13374
|
-
let query = select(this.db).from(sessions3).leftJoin(branches3,
|
|
13601
|
+
let query = select(this.db).from(sessions3).leftJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id)).where(eq25(sessions3.schedule_id, scheduleId));
|
|
13375
13602
|
if (opts.orderByScheduledRunAt === "desc") {
|
|
13376
13603
|
query = query.orderBy(desc5(sessions3.scheduled_run_at));
|
|
13377
13604
|
} else if (opts.orderByScheduledRunAt === "asc") {
|
|
@@ -13398,7 +13625,7 @@ var SessionRepository = class {
|
|
|
13398
13625
|
*/
|
|
13399
13626
|
async countByScheduleId(scheduleId) {
|
|
13400
13627
|
try {
|
|
13401
|
-
const result = await select(this.db, { count: sql13`count(*)` }).from(sessions3).where(
|
|
13628
|
+
const result = await select(this.db, { count: sql13`count(*)` }).from(sessions3).where(eq25(sessions3.schedule_id, scheduleId)).one();
|
|
13402
13629
|
return Number(result?.count ?? 0);
|
|
13403
13630
|
} catch (error) {
|
|
13404
13631
|
throw new RepositoryError(
|
|
@@ -13420,7 +13647,7 @@ var SessionRepository = class {
|
|
|
13420
13647
|
async existsInBranchWithStatuses(branchId, statuses) {
|
|
13421
13648
|
if (statuses.length === 0) return false;
|
|
13422
13649
|
try {
|
|
13423
|
-
const row = await select(this.db, { one: sql13`1` }).from(sessions3).where(and21(
|
|
13650
|
+
const row = await select(this.db, { one: sql13`1` }).from(sessions3).where(and21(eq25(sessions3.branch_id, branchId), inArray8(sessions3.status, [...statuses]))).limit(1).one();
|
|
13424
13651
|
return row != null;
|
|
13425
13652
|
} catch (error) {
|
|
13426
13653
|
throw new RepositoryError(
|
|
@@ -13436,7 +13663,7 @@ var SessionRepository = class {
|
|
|
13436
13663
|
async existsInScheduleWithStatuses(scheduleId, statuses) {
|
|
13437
13664
|
if (statuses.length === 0) return false;
|
|
13438
13665
|
try {
|
|
13439
|
-
const row = await select(this.db, { one: sql13`1` }).from(sessions3).where(and21(
|
|
13666
|
+
const row = await select(this.db, { one: sql13`1` }).from(sessions3).where(and21(eq25(sessions3.schedule_id, scheduleId), inArray8(sessions3.status, [...statuses]))).limit(1).one();
|
|
13440
13667
|
return row != null;
|
|
13441
13668
|
} catch (error) {
|
|
13442
13669
|
throw new RepositoryError(
|
|
@@ -13467,10 +13694,10 @@ var SessionRepository = class {
|
|
|
13467
13694
|
async findAccessibleSessions(userId, boardId) {
|
|
13468
13695
|
const baseUrl = await getBaseUrl();
|
|
13469
13696
|
const accessCondition = visibleBranchAccessCondition(this.db, userId);
|
|
13470
|
-
const whereCondition = boardId ? and21(accessCondition,
|
|
13471
|
-
const results = await select(this.db).from(sessions3).innerJoin(branches3,
|
|
13697
|
+
const whereCondition = boardId ? and21(accessCondition, eq25(branches3.board_id, boardId)) : accessCondition;
|
|
13698
|
+
const results = await select(this.db).from(sessions3).innerJoin(branches3, eq25(sessions3.branch_id, branches3.branch_id)).leftJoin(
|
|
13472
13699
|
branchOwners3,
|
|
13473
|
-
and21(
|
|
13700
|
+
and21(eq25(branchOwners3.branch_id, branches3.branch_id), eq25(branchOwners3.user_id, userId))
|
|
13474
13701
|
).where(whereCondition).all();
|
|
13475
13702
|
const seen = /* @__PURE__ */ new Set();
|
|
13476
13703
|
const sessionsOut = [];
|
|
@@ -13513,7 +13740,7 @@ var SessionRepository = class {
|
|
|
13513
13740
|
for (const sessionId of sessionIds) {
|
|
13514
13741
|
const query = select(this.db, {
|
|
13515
13742
|
data: messagesTable.data
|
|
13516
|
-
}).from(messagesTable).where(and21(
|
|
13743
|
+
}).from(messagesTable).where(and21(eq25(messagesTable.session_id, sessionId), eq25(messagesTable.role, "assistant")));
|
|
13517
13744
|
const lastMessage = await query.orderBy(desc5(messagesTable.index)).limit(1).one();
|
|
13518
13745
|
if (lastMessage) {
|
|
13519
13746
|
const messageData = lastMessage.data;
|
|
@@ -13548,7 +13775,7 @@ var SessionRepository = class {
|
|
|
13548
13775
|
*/
|
|
13549
13776
|
async exists(sessionId) {
|
|
13550
13777
|
try {
|
|
13551
|
-
const row = await select(this.db).from(sessions3).where(
|
|
13778
|
+
const row = await select(this.db).from(sessions3).where(eq25(sessions3.session_id, sessionId)).one();
|
|
13552
13779
|
return row != null;
|
|
13553
13780
|
} catch (error) {
|
|
13554
13781
|
throw new RepositoryError(
|
|
@@ -13583,15 +13810,15 @@ var SessionMCPServerRepository = class {
|
|
|
13583
13810
|
}
|
|
13584
13811
|
const existing = await select(this.db).from(sessionMcpServers3).where(
|
|
13585
13812
|
and22(
|
|
13586
|
-
|
|
13587
|
-
|
|
13813
|
+
eq26(sessionMcpServers3.session_id, sessionId),
|
|
13814
|
+
eq26(sessionMcpServers3.mcp_server_id, serverId)
|
|
13588
13815
|
)
|
|
13589
13816
|
).one();
|
|
13590
13817
|
if (existing) {
|
|
13591
13818
|
await update(this.db, sessionMcpServers3).set({ enabled: true }).where(
|
|
13592
13819
|
and22(
|
|
13593
|
-
|
|
13594
|
-
|
|
13820
|
+
eq26(sessionMcpServers3.session_id, sessionId),
|
|
13821
|
+
eq26(sessionMcpServers3.mcp_server_id, serverId)
|
|
13595
13822
|
)
|
|
13596
13823
|
).run();
|
|
13597
13824
|
return;
|
|
@@ -13618,8 +13845,8 @@ var SessionMCPServerRepository = class {
|
|
|
13618
13845
|
try {
|
|
13619
13846
|
const result = await deleteFrom(this.db, sessionMcpServers3).where(
|
|
13620
13847
|
and22(
|
|
13621
|
-
|
|
13622
|
-
|
|
13848
|
+
eq26(sessionMcpServers3.session_id, sessionId),
|
|
13849
|
+
eq26(sessionMcpServers3.mcp_server_id, serverId)
|
|
13623
13850
|
)
|
|
13624
13851
|
).run();
|
|
13625
13852
|
if (result.rowsAffected === 0) {
|
|
@@ -13640,8 +13867,8 @@ var SessionMCPServerRepository = class {
|
|
|
13640
13867
|
try {
|
|
13641
13868
|
const result = await update(this.db, sessionMcpServers3).set({ enabled }).where(
|
|
13642
13869
|
and22(
|
|
13643
|
-
|
|
13644
|
-
|
|
13870
|
+
eq26(sessionMcpServers3.session_id, sessionId),
|
|
13871
|
+
eq26(sessionMcpServers3.mcp_server_id, serverId)
|
|
13645
13872
|
)
|
|
13646
13873
|
).run();
|
|
13647
13874
|
if (result.rowsAffected === 0) {
|
|
@@ -13660,9 +13887,9 @@ var SessionMCPServerRepository = class {
|
|
|
13660
13887
|
*/
|
|
13661
13888
|
async listServers(sessionId, enabledOnly = false) {
|
|
13662
13889
|
try {
|
|
13663
|
-
const conditions = [
|
|
13890
|
+
const conditions = [eq26(sessionMcpServers3.session_id, sessionId)];
|
|
13664
13891
|
if (enabledOnly) {
|
|
13665
|
-
conditions.push(
|
|
13892
|
+
conditions.push(eq26(sessionMcpServers3.enabled, true));
|
|
13666
13893
|
}
|
|
13667
13894
|
const relationships = await select(this.db).from(sessionMcpServers3).where(and22(...conditions)).all();
|
|
13668
13895
|
const servers = [];
|
|
@@ -13686,9 +13913,9 @@ var SessionMCPServerRepository = class {
|
|
|
13686
13913
|
*/
|
|
13687
13914
|
async listServersWithMetadata(sessionId, enabledOnly = false) {
|
|
13688
13915
|
try {
|
|
13689
|
-
const conditions = [
|
|
13916
|
+
const conditions = [eq26(sessionMcpServers3.session_id, sessionId)];
|
|
13690
13917
|
if (enabledOnly) {
|
|
13691
|
-
conditions.push(
|
|
13918
|
+
conditions.push(eq26(sessionMcpServers3.enabled, true));
|
|
13692
13919
|
}
|
|
13693
13920
|
const relationships = await select(this.db).from(sessionMcpServers3).where(and22(...conditions)).all();
|
|
13694
13921
|
const results = [];
|
|
@@ -13721,7 +13948,7 @@ var SessionMCPServerRepository = class {
|
|
|
13721
13948
|
if (!session) {
|
|
13722
13949
|
throw new EntityNotFoundError("Session", sessionId);
|
|
13723
13950
|
}
|
|
13724
|
-
await deleteFrom(this.db, sessionMcpServers3).where(
|
|
13951
|
+
await deleteFrom(this.db, sessionMcpServers3).where(eq26(sessionMcpServers3.session_id, sessionId)).run();
|
|
13725
13952
|
if (serverIds.length > 0) {
|
|
13726
13953
|
const inserts = serverIds.map((serverId) => ({
|
|
13727
13954
|
session_id: sessionId,
|
|
@@ -13746,8 +13973,8 @@ var SessionMCPServerRepository = class {
|
|
|
13746
13973
|
try {
|
|
13747
13974
|
const row = await select(this.db).from(sessionMcpServers3).where(
|
|
13748
13975
|
and22(
|
|
13749
|
-
|
|
13750
|
-
|
|
13976
|
+
eq26(sessionMcpServers3.session_id, sessionId),
|
|
13977
|
+
eq26(sessionMcpServers3.mcp_server_id, serverId)
|
|
13751
13978
|
)
|
|
13752
13979
|
).one();
|
|
13753
13980
|
if (!row) {
|
|
@@ -13787,7 +14014,7 @@ init_esm_shims();
|
|
|
13787
14014
|
init_ids();
|
|
13788
14015
|
init_database_wrapper();
|
|
13789
14016
|
init_schema();
|
|
13790
|
-
import { and as and23, eq as
|
|
14017
|
+
import { and as and23, eq as eq27, inArray as inArray9, or as or9 } from "drizzle-orm";
|
|
13791
14018
|
var SessionRelationshipRepository = class {
|
|
13792
14019
|
constructor(db) {
|
|
13793
14020
|
this.db = db;
|
|
@@ -13832,7 +14059,7 @@ var SessionRelationshipRepository = class {
|
|
|
13832
14059
|
}
|
|
13833
14060
|
async get(relationshipId) {
|
|
13834
14061
|
try {
|
|
13835
|
-
const row = await select(this.db).from(sessionRelationships3).where(
|
|
14062
|
+
const row = await select(this.db).from(sessionRelationships3).where(eq27(sessionRelationships3.relationship_id, relationshipId)).one();
|
|
13836
14063
|
if (!row) throw new EntityNotFoundError("SessionRelationship", relationshipId);
|
|
13837
14064
|
return this.rowToRelationship(row);
|
|
13838
14065
|
} catch (error) {
|
|
@@ -13847,8 +14074,8 @@ var SessionRelationshipRepository = class {
|
|
|
13847
14074
|
try {
|
|
13848
14075
|
const rows = await select(this.db).from(sessionRelationships3).where(
|
|
13849
14076
|
or9(
|
|
13850
|
-
|
|
13851
|
-
|
|
14077
|
+
eq27(sessionRelationships3.source_session_id, sessionId),
|
|
14078
|
+
eq27(sessionRelationships3.target_session_id, sessionId)
|
|
13852
14079
|
)
|
|
13853
14080
|
).all();
|
|
13854
14081
|
return rows.map((row) => this.rowToRelationship(row));
|
|
@@ -13880,8 +14107,8 @@ var SessionRelationshipRepository = class {
|
|
|
13880
14107
|
try {
|
|
13881
14108
|
const rows = await select(this.db).from(sessionRelationships3).where(
|
|
13882
14109
|
and23(
|
|
13883
|
-
|
|
13884
|
-
|
|
14110
|
+
eq27(sessionRelationships3.source_session_id, sourceSessionId),
|
|
14111
|
+
eq27(sessionRelationships3.relationship_type, "remote_create")
|
|
13885
14112
|
)
|
|
13886
14113
|
).all();
|
|
13887
14114
|
return rows.map((row) => this.rowToRelationship(row));
|
|
@@ -13896,8 +14123,8 @@ var SessionRelationshipRepository = class {
|
|
|
13896
14123
|
try {
|
|
13897
14124
|
const rows = await select(this.db).from(sessionRelationships3).where(
|
|
13898
14125
|
and23(
|
|
13899
|
-
|
|
13900
|
-
|
|
14126
|
+
eq27(sessionRelationships3.target_session_id, targetSessionId),
|
|
14127
|
+
eq27(sessionRelationships3.relationship_type, "remote_create")
|
|
13901
14128
|
)
|
|
13902
14129
|
).all();
|
|
13903
14130
|
return rows.map((row) => this.rowToRelationship(row));
|
|
@@ -13910,11 +14137,11 @@ var SessionRelationshipRepository = class {
|
|
|
13910
14137
|
}
|
|
13911
14138
|
async setCallbackEnabled(relationshipId, callbackEnabled) {
|
|
13912
14139
|
try {
|
|
13913
|
-
const result = await update(this.db, sessionRelationships3).set({ callback_enabled: callbackEnabled, updated_at: /* @__PURE__ */ new Date() }).where(
|
|
14140
|
+
const result = await update(this.db, sessionRelationships3).set({ callback_enabled: callbackEnabled, updated_at: /* @__PURE__ */ new Date() }).where(eq27(sessionRelationships3.relationship_id, relationshipId)).run();
|
|
13914
14141
|
if (result.rowsAffected === 0) {
|
|
13915
14142
|
throw new EntityNotFoundError("SessionRelationship", relationshipId);
|
|
13916
14143
|
}
|
|
13917
|
-
const row = await select(this.db).from(sessionRelationships3).where(
|
|
14144
|
+
const row = await select(this.db).from(sessionRelationships3).where(eq27(sessionRelationships3.relationship_id, relationshipId)).one();
|
|
13918
14145
|
if (!row) throw new EntityNotFoundError("SessionRelationship", relationshipId);
|
|
13919
14146
|
return this.rowToRelationship(row);
|
|
13920
14147
|
} catch (error) {
|
|
@@ -13929,8 +14156,8 @@ var SessionRelationshipRepository = class {
|
|
|
13929
14156
|
try {
|
|
13930
14157
|
await update(this.db, sessionRelationships3).set({ callback_enabled: callbackEnabled, updated_at: /* @__PURE__ */ new Date() }).where(
|
|
13931
14158
|
and23(
|
|
13932
|
-
|
|
13933
|
-
|
|
14159
|
+
eq27(sessionRelationships3.target_session_id, targetSessionId),
|
|
14160
|
+
eq27(sessionRelationships3.relationship_type, "remote_create")
|
|
13934
14161
|
)
|
|
13935
14162
|
).run();
|
|
13936
14163
|
} catch (error) {
|
|
@@ -13948,7 +14175,7 @@ init_types2();
|
|
|
13948
14175
|
init_ids();
|
|
13949
14176
|
init_database_wrapper();
|
|
13950
14177
|
init_schema();
|
|
13951
|
-
import { and as and24, eq as
|
|
14178
|
+
import { and as and24, eq as eq28, inArray as inArray10, like as like14, sql as sql14 } from "drizzle-orm";
|
|
13952
14179
|
var TaskRepository = class {
|
|
13953
14180
|
constructor(db) {
|
|
13954
14181
|
this.db = db;
|
|
@@ -14044,7 +14271,7 @@ var TaskRepository = class {
|
|
|
14044
14271
|
try {
|
|
14045
14272
|
const insertData = this.taskToInsert(data);
|
|
14046
14273
|
await insert(this.db, tasks3).values(insertData).run();
|
|
14047
|
-
const row = await select(this.db).from(tasks3).where(
|
|
14274
|
+
const row = await select(this.db).from(tasks3).where(eq28(tasks3.task_id, insertData.task_id)).one();
|
|
14048
14275
|
if (!row) {
|
|
14049
14276
|
throw new RepositoryError("Failed to retrieve created task");
|
|
14050
14277
|
}
|
|
@@ -14084,7 +14311,7 @@ var TaskRepository = class {
|
|
|
14084
14311
|
async findById(id) {
|
|
14085
14312
|
try {
|
|
14086
14313
|
const fullId = await this.resolveId(id);
|
|
14087
|
-
const row = await select(this.db).from(tasks3).where(
|
|
14314
|
+
const row = await select(this.db).from(tasks3).where(eq28(tasks3.task_id, fullId)).one();
|
|
14088
14315
|
return row ? this.rowToTask(row) : null;
|
|
14089
14316
|
} catch (error) {
|
|
14090
14317
|
if (error instanceof EntityNotFoundError) return null;
|
|
@@ -14102,10 +14329,10 @@ var TaskRepository = class {
|
|
|
14102
14329
|
try {
|
|
14103
14330
|
if (filter?.sessionIds !== void 0 && filter.sessionIds.length === 0) return [];
|
|
14104
14331
|
const conditions = [];
|
|
14105
|
-
if (filter?.sessionId) conditions.push(
|
|
14332
|
+
if (filter?.sessionId) conditions.push(eq28(tasks3.session_id, filter.sessionId));
|
|
14106
14333
|
if (filter?.sessionIds !== void 0)
|
|
14107
14334
|
conditions.push(inArray10(tasks3.session_id, filter.sessionIds));
|
|
14108
|
-
if (filter?.status) conditions.push(
|
|
14335
|
+
if (filter?.status) conditions.push(eq28(tasks3.status, filter.status));
|
|
14109
14336
|
if (filter?.visibleToUserId) {
|
|
14110
14337
|
conditions.push(
|
|
14111
14338
|
visibleSessionReferenceAccessExists(this.db, filter.visibleToUserId, tasks3.session_id)
|
|
@@ -14126,7 +14353,7 @@ var TaskRepository = class {
|
|
|
14126
14353
|
*/
|
|
14127
14354
|
async findBySession(sessionId) {
|
|
14128
14355
|
try {
|
|
14129
|
-
const rows = await select(this.db).from(tasks3).where(
|
|
14356
|
+
const rows = await select(this.db).from(tasks3).where(eq28(tasks3.session_id, sessionId)).orderBy(tasks3.created_at).all();
|
|
14130
14357
|
return rows.map((row) => this.rowToTask(row));
|
|
14131
14358
|
} catch (error) {
|
|
14132
14359
|
throw new RepositoryError(
|
|
@@ -14140,7 +14367,7 @@ var TaskRepository = class {
|
|
|
14140
14367
|
*/
|
|
14141
14368
|
async findRunning() {
|
|
14142
14369
|
try {
|
|
14143
|
-
const rows = await select(this.db).from(tasks3).where(
|
|
14370
|
+
const rows = await select(this.db).from(tasks3).where(eq28(tasks3.status, TaskStatus.RUNNING)).all();
|
|
14144
14371
|
return rows.map((row) => this.rowToTask(row));
|
|
14145
14372
|
} catch (error) {
|
|
14146
14373
|
throw new RepositoryError(
|
|
@@ -14196,7 +14423,7 @@ var TaskRepository = class {
|
|
|
14196
14423
|
*/
|
|
14197
14424
|
async findByStatus(status) {
|
|
14198
14425
|
try {
|
|
14199
|
-
const rows = await select(this.db).from(tasks3).where(
|
|
14426
|
+
const rows = await select(this.db).from(tasks3).where(eq28(tasks3.status, status)).all();
|
|
14200
14427
|
return rows.map((row) => this.rowToTask(row));
|
|
14201
14428
|
} catch (error) {
|
|
14202
14429
|
throw new RepositoryError(
|
|
@@ -14218,8 +14445,8 @@ var TaskRepository = class {
|
|
|
14218
14445
|
`\u{1F504} [TaskRepo] Updating task ${shortId(fullId)}${updates.status ? ` (status: ${updates.status})` : ""}`
|
|
14219
14446
|
);
|
|
14220
14447
|
const result = await this.db.transaction(async (tx) => {
|
|
14221
|
-
await lockRowForUpdate(txAsDb(tx), this.db, tasks3,
|
|
14222
|
-
const currentRow = await select(txAsDb(tx)).from(tasks3).where(
|
|
14448
|
+
await lockRowForUpdate(txAsDb(tx), this.db, tasks3, eq28(tasks3.task_id, fullId));
|
|
14449
|
+
const currentRow = await select(txAsDb(tx)).from(tasks3).where(eq28(tasks3.task_id, fullId)).one();
|
|
14223
14450
|
if (!currentRow) {
|
|
14224
14451
|
throw new EntityNotFoundError("Task", id);
|
|
14225
14452
|
}
|
|
@@ -14233,7 +14460,7 @@ var TaskRepository = class {
|
|
|
14233
14460
|
last_executor_heartbeat_at: insertData.last_executor_heartbeat_at,
|
|
14234
14461
|
session_md5: insertData.session_md5,
|
|
14235
14462
|
data: insertData.data
|
|
14236
|
-
}).where(
|
|
14463
|
+
}).where(eq28(tasks3.task_id, fullId)).run();
|
|
14237
14464
|
return merged;
|
|
14238
14465
|
});
|
|
14239
14466
|
return result;
|
|
@@ -14252,7 +14479,7 @@ var TaskRepository = class {
|
|
|
14252
14479
|
async delete(id) {
|
|
14253
14480
|
try {
|
|
14254
14481
|
const fullId = await this.resolveId(id);
|
|
14255
|
-
const result = await deleteFrom(this.db, tasks3).where(
|
|
14482
|
+
const result = await deleteFrom(this.db, tasks3).where(eq28(tasks3.task_id, fullId)).run();
|
|
14256
14483
|
if (result.rowsAffected === 0) {
|
|
14257
14484
|
throw new EntityNotFoundError("Task", id);
|
|
14258
14485
|
}
|
|
@@ -14314,7 +14541,7 @@ var TaskRepository = class {
|
|
|
14314
14541
|
queue_position: nextPosition
|
|
14315
14542
|
});
|
|
14316
14543
|
await insert(txAsDb(tx), tasks3).values(insertData).run();
|
|
14317
|
-
const row = await select(txAsDb(tx)).from(tasks3).where(
|
|
14544
|
+
const row = await select(txAsDb(tx)).from(tasks3).where(eq28(tasks3.task_id, insertData.task_id)).one();
|
|
14318
14545
|
if (!row) {
|
|
14319
14546
|
throw new RepositoryError("Failed to retrieve created queued task");
|
|
14320
14547
|
}
|
|
@@ -14355,7 +14582,7 @@ var TaskRepository = class {
|
|
|
14355
14582
|
*/
|
|
14356
14583
|
async countBySession(sessionId) {
|
|
14357
14584
|
try {
|
|
14358
|
-
const result = await select(this.db, { count: sql14`count(*)` }).from(tasks3).where(
|
|
14585
|
+
const result = await select(this.db, { count: sql14`count(*)` }).from(tasks3).where(eq28(tasks3.session_id, sessionId)).one();
|
|
14359
14586
|
return result?.count ?? 0;
|
|
14360
14587
|
} catch (error) {
|
|
14361
14588
|
throw new RepositoryError(
|
|
@@ -14372,7 +14599,7 @@ init_types2();
|
|
|
14372
14599
|
init_ids();
|
|
14373
14600
|
init_database_wrapper();
|
|
14374
14601
|
init_schema();
|
|
14375
|
-
import { and as and25, eq as
|
|
14602
|
+
import { and as and25, eq as eq29, like as like15, lt as lt2 } from "drizzle-orm";
|
|
14376
14603
|
var ThreadSessionMapRepository = class {
|
|
14377
14604
|
constructor(db) {
|
|
14378
14605
|
this.db = db;
|
|
@@ -14442,7 +14669,7 @@ var ThreadSessionMapRepository = class {
|
|
|
14442
14669
|
id: data.id ?? generateId()
|
|
14443
14670
|
});
|
|
14444
14671
|
await insert(this.db, threadSessionMap3).values(insertData).run();
|
|
14445
|
-
const row = await select(this.db).from(threadSessionMap3).where(
|
|
14672
|
+
const row = await select(this.db).from(threadSessionMap3).where(eq29(threadSessionMap3.id, insertData.id)).one();
|
|
14446
14673
|
if (!row) {
|
|
14447
14674
|
throw new RepositoryError("Failed to retrieve created thread-session mapping");
|
|
14448
14675
|
}
|
|
@@ -14461,7 +14688,7 @@ var ThreadSessionMapRepository = class {
|
|
|
14461
14688
|
async findById(id) {
|
|
14462
14689
|
try {
|
|
14463
14690
|
const fullId = await this.resolveId(id);
|
|
14464
|
-
const row = await select(this.db).from(threadSessionMap3).where(
|
|
14691
|
+
const row = await select(this.db).from(threadSessionMap3).where(eq29(threadSessionMap3.id, fullId)).one();
|
|
14465
14692
|
return row ? this.rowToMapping(row) : null;
|
|
14466
14693
|
} catch (error) {
|
|
14467
14694
|
if (error instanceof EntityNotFoundError) return null;
|
|
@@ -14502,7 +14729,7 @@ var ThreadSessionMapRepository = class {
|
|
|
14502
14729
|
status: insertData.status,
|
|
14503
14730
|
last_message_at: insertData.last_message_at,
|
|
14504
14731
|
metadata: insertData.metadata
|
|
14505
|
-
}).where(
|
|
14732
|
+
}).where(eq29(threadSessionMap3.id, fullId)).run();
|
|
14506
14733
|
const updated = await this.findById(fullId);
|
|
14507
14734
|
if (!updated) {
|
|
14508
14735
|
throw new RepositoryError("Failed to retrieve updated thread-session mapping");
|
|
@@ -14523,7 +14750,7 @@ var ThreadSessionMapRepository = class {
|
|
|
14523
14750
|
async delete(id) {
|
|
14524
14751
|
try {
|
|
14525
14752
|
const fullId = await this.resolveId(id);
|
|
14526
|
-
const result = await deleteFrom(this.db, threadSessionMap3).where(
|
|
14753
|
+
const result = await deleteFrom(this.db, threadSessionMap3).where(eq29(threadSessionMap3.id, fullId)).run();
|
|
14527
14754
|
if (result.rowsAffected === 0) {
|
|
14528
14755
|
throw new EntityNotFoundError("ThreadSessionMap", id);
|
|
14529
14756
|
}
|
|
@@ -14541,7 +14768,7 @@ var ThreadSessionMapRepository = class {
|
|
|
14541
14768
|
async findByChannelAndThread(channelId, threadId) {
|
|
14542
14769
|
try {
|
|
14543
14770
|
const row = await select(this.db).from(threadSessionMap3).where(
|
|
14544
|
-
and25(
|
|
14771
|
+
and25(eq29(threadSessionMap3.channel_id, channelId), eq29(threadSessionMap3.thread_id, threadId))
|
|
14545
14772
|
).one();
|
|
14546
14773
|
return row ? this.rowToMapping(row) : null;
|
|
14547
14774
|
} catch (error) {
|
|
@@ -14558,7 +14785,7 @@ var ThreadSessionMapRepository = class {
|
|
|
14558
14785
|
*/
|
|
14559
14786
|
async findByThread(threadId) {
|
|
14560
14787
|
try {
|
|
14561
|
-
const row = await select(this.db).from(threadSessionMap3).where(
|
|
14788
|
+
const row = await select(this.db).from(threadSessionMap3).where(eq29(threadSessionMap3.thread_id, threadId)).one();
|
|
14562
14789
|
return row ? this.rowToMapping(row) : null;
|
|
14563
14790
|
} catch (error) {
|
|
14564
14791
|
throw new RepositoryError(
|
|
@@ -14572,7 +14799,7 @@ var ThreadSessionMapRepository = class {
|
|
|
14572
14799
|
*/
|
|
14573
14800
|
async findBySession(sessionId) {
|
|
14574
14801
|
try {
|
|
14575
|
-
const row = await select(this.db).from(threadSessionMap3).where(
|
|
14802
|
+
const row = await select(this.db).from(threadSessionMap3).where(eq29(threadSessionMap3.session_id, sessionId)).one();
|
|
14576
14803
|
return row ? this.rowToMapping(row) : null;
|
|
14577
14804
|
} catch (error) {
|
|
14578
14805
|
throw new RepositoryError(
|
|
@@ -14586,9 +14813,9 @@ var ThreadSessionMapRepository = class {
|
|
|
14586
14813
|
*/
|
|
14587
14814
|
async findByChannel(channelId, status) {
|
|
14588
14815
|
try {
|
|
14589
|
-
const conditions = [
|
|
14816
|
+
const conditions = [eq29(threadSessionMap3.channel_id, channelId)];
|
|
14590
14817
|
if (status) {
|
|
14591
|
-
conditions.push(
|
|
14818
|
+
conditions.push(eq29(threadSessionMap3.status, status));
|
|
14592
14819
|
}
|
|
14593
14820
|
const rows = await select(this.db).from(threadSessionMap3).where(and25(...conditions)).all();
|
|
14594
14821
|
return rows.map((row) => this.rowToMapping(row));
|
|
@@ -14606,7 +14833,7 @@ var ThreadSessionMapRepository = class {
|
|
|
14606
14833
|
try {
|
|
14607
14834
|
await update(this.db, threadSessionMap3).set({
|
|
14608
14835
|
last_message_at: /* @__PURE__ */ new Date()
|
|
14609
|
-
}).where(
|
|
14836
|
+
}).where(eq29(threadSessionMap3.id, id)).run();
|
|
14610
14837
|
} catch (error) {
|
|
14611
14838
|
throw new RepositoryError(
|
|
14612
14839
|
`Failed to update last message timestamp: ${error instanceof Error ? error.message : String(error)}`,
|
|
@@ -14619,7 +14846,7 @@ var ThreadSessionMapRepository = class {
|
|
|
14619
14846
|
*/
|
|
14620
14847
|
async updateMetadata(id, metadata) {
|
|
14621
14848
|
try {
|
|
14622
|
-
await update(this.db, threadSessionMap3).set({ metadata }).where(
|
|
14849
|
+
await update(this.db, threadSessionMap3).set({ metadata }).where(eq29(threadSessionMap3.id, id)).run();
|
|
14623
14850
|
} catch (error) {
|
|
14624
14851
|
throw new RepositoryError(
|
|
14625
14852
|
`Failed to update metadata: ${error instanceof Error ? error.message : String(error)}`,
|
|
@@ -14634,7 +14861,7 @@ var ThreadSessionMapRepository = class {
|
|
|
14634
14861
|
try {
|
|
14635
14862
|
const cutoff = new Date(Date.now() - daysInactive * 24 * 60 * 60 * 1e3);
|
|
14636
14863
|
const rows = await select(this.db).from(threadSessionMap3).where(
|
|
14637
|
-
and25(
|
|
14864
|
+
and25(eq29(threadSessionMap3.status, "active"), lt2(threadSessionMap3.last_message_at, cutoff))
|
|
14638
14865
|
).all();
|
|
14639
14866
|
return rows.map((row) => this.rowToMapping(row));
|
|
14640
14867
|
} catch (error) {
|
|
@@ -14649,7 +14876,7 @@ var ThreadSessionMapRepository = class {
|
|
|
14649
14876
|
*/
|
|
14650
14877
|
async findByBranch(branchId) {
|
|
14651
14878
|
try {
|
|
14652
|
-
const rows = await select(this.db).from(threadSessionMap3).where(
|
|
14879
|
+
const rows = await select(this.db).from(threadSessionMap3).where(eq29(threadSessionMap3.branch_id, branchId)).all();
|
|
14653
14880
|
return rows.map((row) => this.rowToMapping(row));
|
|
14654
14881
|
} catch (error) {
|
|
14655
14882
|
throw new RepositoryError(
|
|
@@ -14668,7 +14895,7 @@ init_schema();
|
|
|
14668
14895
|
init_tenant_context();
|
|
14669
14896
|
import { randomBytes as randomBytes3 } from "crypto";
|
|
14670
14897
|
import bcrypt2 from "bcryptjs";
|
|
14671
|
-
import { and as and26, eq as
|
|
14898
|
+
import { and as and26, eq as eq30 } from "drizzle-orm";
|
|
14672
14899
|
var KEY_PREFIX = "agor_sk_";
|
|
14673
14900
|
var KEY_PREFIX_LENGTH = 12;
|
|
14674
14901
|
var KEY_RANDOM_BYTES = 32;
|
|
@@ -14705,7 +14932,7 @@ var UserApiKeysRepository = class {
|
|
|
14705
14932
|
}
|
|
14706
14933
|
/** List all API keys for a user (never returns hashes) */
|
|
14707
14934
|
async listByUser(userId) {
|
|
14708
|
-
const rows = await select(this.db).from(userApiKeys3).where(
|
|
14935
|
+
const rows = await select(this.db).from(userApiKeys3).where(eq30(userApiKeys3.user_id, userId)).all();
|
|
14709
14936
|
return rows.map((r) => ({
|
|
14710
14937
|
id: r.id,
|
|
14711
14938
|
name: r.name,
|
|
@@ -14716,7 +14943,7 @@ var UserApiKeysRepository = class {
|
|
|
14716
14943
|
}
|
|
14717
14944
|
/** Find a key by prefix (for auth lookup). Returns rows with hash for verification. */
|
|
14718
14945
|
async findByPrefix(prefix) {
|
|
14719
|
-
return select(this.db).from(userApiKeys3).where(
|
|
14946
|
+
return select(this.db).from(userApiKeys3).where(eq30(userApiKeys3.prefix, prefix)).all();
|
|
14720
14947
|
}
|
|
14721
14948
|
/** Verify a raw API key against stored hashes. Returns the matching row or null. */
|
|
14722
14949
|
async verifyKey(rawKey) {
|
|
@@ -14745,19 +14972,19 @@ var UserApiKeysRepository = class {
|
|
|
14745
14972
|
await this.updateLastUsedNow(id);
|
|
14746
14973
|
}
|
|
14747
14974
|
async updateLastUsedNow(id) {
|
|
14748
|
-
await update(this.db, userApiKeys3).set({ last_used_at: /* @__PURE__ */ new Date() }).where(
|
|
14975
|
+
await update(this.db, userApiKeys3).set({ last_used_at: /* @__PURE__ */ new Date() }).where(eq30(userApiKeys3.id, id)).run();
|
|
14749
14976
|
}
|
|
14750
14977
|
/** Update key name */
|
|
14751
14978
|
async updateName(id, userId, name) {
|
|
14752
|
-
await update(this.db, userApiKeys3).set({ name }).where(and26(
|
|
14979
|
+
await update(this.db, userApiKeys3).set({ name }).where(and26(eq30(userApiKeys3.id, id), eq30(userApiKeys3.user_id, userId))).run();
|
|
14753
14980
|
}
|
|
14754
14981
|
/** Delete a key */
|
|
14755
14982
|
async delete(id, userId) {
|
|
14756
|
-
await deleteFrom(this.db, userApiKeys3).where(and26(
|
|
14983
|
+
await deleteFrom(this.db, userApiKeys3).where(and26(eq30(userApiKeys3.id, id), eq30(userApiKeys3.user_id, userId))).run();
|
|
14757
14984
|
}
|
|
14758
14985
|
/** Delete all keys for a user */
|
|
14759
14986
|
async deleteAllForUser(userId) {
|
|
14760
|
-
await deleteFrom(this.db, userApiKeys3).where(
|
|
14987
|
+
await deleteFrom(this.db, userApiKeys3).where(eq30(userApiKeys3.user_id, userId)).run();
|
|
14761
14988
|
}
|
|
14762
14989
|
};
|
|
14763
14990
|
|
|
@@ -14765,7 +14992,7 @@ var UserApiKeysRepository = class {
|
|
|
14765
14992
|
init_esm_shims();
|
|
14766
14993
|
init_database_wrapper();
|
|
14767
14994
|
init_schema();
|
|
14768
|
-
import { and as and27, eq as
|
|
14995
|
+
import { and as and27, eq as eq31, isNull as isNull7 } from "drizzle-orm";
|
|
14769
14996
|
function rowToToken(row) {
|
|
14770
14997
|
return {
|
|
14771
14998
|
user_id: row.user_id ?? null,
|
|
@@ -14781,8 +15008,8 @@ function rowToToken(row) {
|
|
|
14781
15008
|
}
|
|
14782
15009
|
function matchKey(userId, serverId) {
|
|
14783
15010
|
return and27(
|
|
14784
|
-
userId === null ? isNull7(userMcpOauthTokens3.user_id) :
|
|
14785
|
-
|
|
15011
|
+
userId === null ? isNull7(userMcpOauthTokens3.user_id) : eq31(userMcpOauthTokens3.user_id, userId),
|
|
15012
|
+
eq31(userMcpOauthTokens3.mcp_server_id, serverId)
|
|
14786
15013
|
);
|
|
14787
15014
|
}
|
|
14788
15015
|
var UserMCPOAuthTokenRepository = class {
|
|
@@ -14899,7 +15126,7 @@ var UserMCPOAuthTokenRepository = class {
|
|
|
14899
15126
|
}
|
|
14900
15127
|
async deleteAllForUser(userId) {
|
|
14901
15128
|
try {
|
|
14902
|
-
const result = await deleteFrom(this.db, userMcpOauthTokens3).where(
|
|
15129
|
+
const result = await deleteFrom(this.db, userMcpOauthTokens3).where(eq31(userMcpOauthTokens3.user_id, userId)).run();
|
|
14903
15130
|
return result.rowsAffected;
|
|
14904
15131
|
} catch (error) {
|
|
14905
15132
|
throw new RepositoryError(
|
|
@@ -14910,7 +15137,7 @@ var UserMCPOAuthTokenRepository = class {
|
|
|
14910
15137
|
}
|
|
14911
15138
|
async deleteAllForServer(serverId) {
|
|
14912
15139
|
try {
|
|
14913
|
-
const result = await deleteFrom(this.db, userMcpOauthTokens3).where(
|
|
15140
|
+
const result = await deleteFrom(this.db, userMcpOauthTokens3).where(eq31(userMcpOauthTokens3.mcp_server_id, serverId)).run();
|
|
14914
15141
|
return result.rowsAffected;
|
|
14915
15142
|
} catch (error) {
|
|
14916
15143
|
throw new RepositoryError(
|
|
@@ -14921,7 +15148,7 @@ var UserMCPOAuthTokenRepository = class {
|
|
|
14921
15148
|
}
|
|
14922
15149
|
async listForUser(userId) {
|
|
14923
15150
|
try {
|
|
14924
|
-
const rows = await select(this.db).from(userMcpOauthTokens3).where(
|
|
15151
|
+
const rows = await select(this.db).from(userMcpOauthTokens3).where(eq31(userMcpOauthTokens3.user_id, userId)).all();
|
|
14925
15152
|
return rows.map(rowToToken);
|
|
14926
15153
|
} catch (error) {
|
|
14927
15154
|
throw new RepositoryError(
|
|
@@ -14939,37 +15166,7 @@ var UserMCPOAuthTokenRepository = class {
|
|
|
14939
15166
|
// src/db/repositories/users.ts
|
|
14940
15167
|
init_esm_shims();
|
|
14941
15168
|
init_types2();
|
|
14942
|
-
import { eq as
|
|
14943
|
-
|
|
14944
|
-
// src/config/env-vars.ts
|
|
14945
|
-
init_esm_shims();
|
|
14946
|
-
var V05_SCOPES = ["global", "session"];
|
|
14947
|
-
var V05_SCOPE_SET = new Set(V05_SCOPES);
|
|
14948
|
-
function normalizeStoredEnvVar(raw) {
|
|
14949
|
-
if (typeof raw === "string") {
|
|
14950
|
-
return { value_encrypted: raw, scope: "global" };
|
|
14951
|
-
}
|
|
14952
|
-
return {
|
|
14953
|
-
value_encrypted: raw.value_encrypted,
|
|
14954
|
-
scope: raw.scope,
|
|
14955
|
-
resource_id: raw.resource_id ?? null,
|
|
14956
|
-
extra_config: raw.extra_config ?? null
|
|
14957
|
-
};
|
|
14958
|
-
}
|
|
14959
|
-
function normalizeStoredEnvMap(raw) {
|
|
14960
|
-
const out = {};
|
|
14961
|
-
if (!raw) return out;
|
|
14962
|
-
for (const [key, value] of Object.entries(raw)) {
|
|
14963
|
-
try {
|
|
14964
|
-
out[key] = normalizeStoredEnvVar(value);
|
|
14965
|
-
} catch (err) {
|
|
14966
|
-
console.warn(`[env-vars] Skipping malformed env var entry ${key}:`, err);
|
|
14967
|
-
}
|
|
14968
|
-
}
|
|
14969
|
-
return out;
|
|
14970
|
-
}
|
|
14971
|
-
|
|
14972
|
-
// src/db/repositories/users.ts
|
|
15169
|
+
import { eq as eq32, like as like16, sql as sql15 } from "drizzle-orm";
|
|
14973
15170
|
init_ids();
|
|
14974
15171
|
init_database_wrapper();
|
|
14975
15172
|
init_schema();
|
|
@@ -15080,7 +15277,7 @@ var UsersRepository = class {
|
|
|
15080
15277
|
* Check if unix_username is already taken by another user
|
|
15081
15278
|
*/
|
|
15082
15279
|
async isUnixUsernameTaken(unixUsername, excludeUserId) {
|
|
15083
|
-
const result = await select(this.db).from(users3).where(
|
|
15280
|
+
const result = await select(this.db).from(users3).where(eq32(users3.unix_username, unixUsername)).one();
|
|
15084
15281
|
if (!result) {
|
|
15085
15282
|
return false;
|
|
15086
15283
|
}
|
|
@@ -15103,7 +15300,7 @@ var UsersRepository = class {
|
|
|
15103
15300
|
}
|
|
15104
15301
|
const insertData = this.userToInsert(data);
|
|
15105
15302
|
await insert(this.db, users3).values(insertData).run();
|
|
15106
|
-
const row = await select(this.db).from(users3).where(
|
|
15303
|
+
const row = await select(this.db).from(users3).where(eq32(users3.user_id, insertData.user_id)).one();
|
|
15107
15304
|
if (!row) {
|
|
15108
15305
|
throw new RepositoryError("Failed to retrieve created user");
|
|
15109
15306
|
}
|
|
@@ -15115,7 +15312,7 @@ var UsersRepository = class {
|
|
|
15115
15312
|
async findById(id) {
|
|
15116
15313
|
try {
|
|
15117
15314
|
const fullId = await this.resolveId(id);
|
|
15118
|
-
const result = await select(this.db).from(users3).where(
|
|
15315
|
+
const result = await select(this.db).from(users3).where(eq32(users3.user_id, fullId)).one();
|
|
15119
15316
|
if (!result) {
|
|
15120
15317
|
return null;
|
|
15121
15318
|
}
|
|
@@ -15131,7 +15328,7 @@ var UsersRepository = class {
|
|
|
15131
15328
|
* Find user by email
|
|
15132
15329
|
*/
|
|
15133
15330
|
async findByEmail(email) {
|
|
15134
|
-
const result = await select(this.db).from(users3).where(
|
|
15331
|
+
const result = await select(this.db).from(users3).where(eq32(users3.email, email)).one();
|
|
15135
15332
|
if (!result) {
|
|
15136
15333
|
return null;
|
|
15137
15334
|
}
|
|
@@ -15202,8 +15399,8 @@ var UsersRepository = class {
|
|
|
15202
15399
|
await update(this.db, users3).set({
|
|
15203
15400
|
...insertData,
|
|
15204
15401
|
updated_at: /* @__PURE__ */ new Date()
|
|
15205
|
-
}).where(
|
|
15206
|
-
const row = await select(this.db).from(users3).where(
|
|
15402
|
+
}).where(eq32(users3.user_id, fullId)).run();
|
|
15403
|
+
const row = await select(this.db).from(users3).where(eq32(users3.user_id, fullId)).one();
|
|
15207
15404
|
if (!row) {
|
|
15208
15405
|
throw new RepositoryError("Failed to retrieve updated user");
|
|
15209
15406
|
}
|
|
@@ -15214,7 +15411,7 @@ var UsersRepository = class {
|
|
|
15214
15411
|
*/
|
|
15215
15412
|
async delete(id) {
|
|
15216
15413
|
const fullId = await this.resolveId(id);
|
|
15217
|
-
await deleteFrom(this.db, users3).where(
|
|
15414
|
+
await deleteFrom(this.db, users3).where(eq32(users3.user_id, fullId)).run();
|
|
15218
15415
|
}
|
|
15219
15416
|
/**
|
|
15220
15417
|
* Get raw database row (internal use only - includes encrypted keys)
|
|
@@ -15222,7 +15419,7 @@ var UsersRepository = class {
|
|
|
15222
15419
|
async getRawRow(id) {
|
|
15223
15420
|
try {
|
|
15224
15421
|
const fullId = await this.resolveId(id);
|
|
15225
|
-
const result = await select(this.db).from(users3).where(
|
|
15422
|
+
const result = await select(this.db).from(users3).where(eq32(users3.user_id, fullId)).one();
|
|
15226
15423
|
return result;
|
|
15227
15424
|
} catch (error) {
|
|
15228
15425
|
if (error instanceof EntityNotFoundError) {
|
|
@@ -15304,7 +15501,7 @@ var UsersRepository = class {
|
|
|
15304
15501
|
await update(this.db, users3).set({
|
|
15305
15502
|
data: { ...row.data, agentic_tools: next },
|
|
15306
15503
|
updated_at: /* @__PURE__ */ new Date()
|
|
15307
|
-
}).where(
|
|
15504
|
+
}).where(eq32(users3.user_id, fullId)).run();
|
|
15308
15505
|
}
|
|
15309
15506
|
/**
|
|
15310
15507
|
* Delete a single credential field for a tool.
|
|
@@ -15330,7 +15527,7 @@ var UsersRepository = class {
|
|
|
15330
15527
|
await update(this.db, users3).set({
|
|
15331
15528
|
data: { ...row.data, agentic_tools: next },
|
|
15332
15529
|
updated_at: /* @__PURE__ */ new Date()
|
|
15333
|
-
}).where(
|
|
15530
|
+
}).where(eq32(users3.user_id, fullId)).run();
|
|
15334
15531
|
}
|
|
15335
15532
|
};
|
|
15336
15533
|
|
|
@@ -15442,7 +15639,7 @@ export {
|
|
|
15442
15639
|
desc6 as desc,
|
|
15443
15640
|
encryptApiKey,
|
|
15444
15641
|
enqueueTenantDatabasePostCommitCallback,
|
|
15445
|
-
|
|
15642
|
+
eq33 as eq,
|
|
15446
15643
|
executeAll,
|
|
15447
15644
|
executeGet,
|
|
15448
15645
|
executeRaw,
|