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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// src/setup/socketio.ts
|
|
2
|
-
import { resolveTenantContext } from "@agor/core/config";
|
|
3
|
-
import { shortId } from "@agor/core/db";
|
|
2
|
+
import { resolveTenantContext as resolveTenantContext2 } from "@agor/core/config";
|
|
3
|
+
import { shortId as shortId3 } from "@agor/core/db";
|
|
4
4
|
import jwt2 from "jsonwebtoken";
|
|
5
5
|
|
|
6
6
|
// src/auth/runtime-tokens.ts
|
|
@@ -8,6 +8,37 @@ import jwt from "jsonwebtoken";
|
|
|
8
8
|
var RUNTIME_JWT_ISSUER = "agor";
|
|
9
9
|
var RUNTIME_JWT_AUDIENCE = "https://agor.dev";
|
|
10
10
|
|
|
11
|
+
// src/utils/realtime-publish.ts
|
|
12
|
+
import {
|
|
13
|
+
resolveTenantContext,
|
|
14
|
+
TenantResolutionError
|
|
15
|
+
} from "@agor/core/config";
|
|
16
|
+
import { getCurrentTenantId, shortId as shortId2 } from "@agor/core/db";
|
|
17
|
+
import { hasMinimumRole as hasMinimumRole2, ROLES as ROLES2 } from "@agor/core/types";
|
|
18
|
+
|
|
19
|
+
// src/utils/branch-authorization.ts
|
|
20
|
+
import { shortId } from "@agor/core/db";
|
|
21
|
+
import { Forbidden, NotAuthenticated, NotFound } from "@agor/core/feathers";
|
|
22
|
+
import { BRANCH_PERMISSION_LEVELS, hasMinimumRole, ROLES } from "@agor/core/types";
|
|
23
|
+
var PERMISSION_RANK = Object.fromEntries(
|
|
24
|
+
BRANCH_PERMISSION_LEVELS.map((level, i) => [level, i - 1])
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
// src/utils/realtime-access-cache.ts
|
|
28
|
+
var DEFAULT_BRANCH_VISIBILITY_TTL_MS = 5 * 6e4;
|
|
29
|
+
var DEFAULT_SESSION_BRANCH_TTL_MS = 60 * 6e4;
|
|
30
|
+
|
|
31
|
+
// src/utils/realtime-publish.ts
|
|
32
|
+
var SESSION_STREAM_CHANNEL_PREFIX = "session-stream:";
|
|
33
|
+
function leaveAllSessionStreamChannels(app, connection) {
|
|
34
|
+
for (const name of app.channels ?? []) {
|
|
35
|
+
if (name.startsWith(SESSION_STREAM_CHANNEL_PREFIX)) {
|
|
36
|
+
app.channel(name).leave(connection);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
var DEBUG_REALTIME_PUBLISH = process.env.AGOR_DEBUG_REALTIME_PUBLISH === "1" || process.env.DEBUG?.includes("realtime-publish");
|
|
41
|
+
|
|
11
42
|
// src/setup/socketio.ts
|
|
12
43
|
function socketAuthState(userId, isService, tenant) {
|
|
13
44
|
return tenant ? { userId, isService, tenant } : { userId, isService };
|
|
@@ -107,7 +138,7 @@ function createSocketIOConfig(app, options) {
|
|
|
107
138
|
if (tokenType !== void 0 && tokenType !== "access" && tokenType !== "service") {
|
|
108
139
|
return next(new Error("Invalid token type"));
|
|
109
140
|
}
|
|
110
|
-
const tenant = multiTenancy ?
|
|
141
|
+
const tenant = multiTenancy ? resolveTenantContext2(multiTenancy, {
|
|
111
142
|
authPayload: decoded,
|
|
112
143
|
headers: socket.handshake.headers
|
|
113
144
|
}) : void 0;
|
|
@@ -144,7 +175,7 @@ function createSocketIOConfig(app, options) {
|
|
|
144
175
|
fs.tenant = tenant;
|
|
145
176
|
if (fs.data) fs.data.tenant = tenant;
|
|
146
177
|
}
|
|
147
|
-
console.log(`\u{1F510} WebSocket authenticated: ${socket.id} (user: ${
|
|
178
|
+
console.log(`\u{1F510} WebSocket authenticated: ${socket.id} (user: ${shortId3(user.user_id)})`);
|
|
148
179
|
next();
|
|
149
180
|
} catch (error) {
|
|
150
181
|
console.error(`\u274C WebSocket authentication failed for ${socket.id}:`, error);
|
|
@@ -155,7 +186,7 @@ function createSocketIOConfig(app, options) {
|
|
|
155
186
|
activeConnections++;
|
|
156
187
|
const user = socket.feathers?.user;
|
|
157
188
|
console.log(
|
|
158
|
-
`\u{1F50C} Socket.io connection established: ${socket.id} (user: ${user ?
|
|
189
|
+
`\u{1F50C} Socket.io connection established: ${socket.id} (user: ${user ? shortId3(user.user_id) : "unknown"}, total: ${activeConnections})`
|
|
159
190
|
);
|
|
160
191
|
if (buildInfo) {
|
|
161
192
|
socket.emit("server-info", {
|
|
@@ -166,7 +197,7 @@ function createSocketIOConfig(app, options) {
|
|
|
166
197
|
if (user?.user_id) {
|
|
167
198
|
socket.join(userRoomName(user.user_id));
|
|
168
199
|
console.log(
|
|
169
|
-
`\u{1F3E0} Socket ${socket.id} joined user room at connection: user:${
|
|
200
|
+
`\u{1F3E0} Socket ${socket.id} joined user room at connection: user:${shortId3(user.user_id)}`
|
|
170
201
|
);
|
|
171
202
|
}
|
|
172
203
|
setTimeout(() => {
|
|
@@ -251,7 +282,7 @@ function createSocketIOConfig(app, options) {
|
|
|
251
282
|
if (typeof payloadUserId !== "string" || payloadUserId !== auth.userId) {
|
|
252
283
|
rejectTerminal(
|
|
253
284
|
event,
|
|
254
|
-
`payload userId (${
|
|
285
|
+
`payload userId (${shortId3(String(payloadUserId))}\u2026) does not match authed userId (${shortId3(auth.userId)}\u2026)`
|
|
255
286
|
);
|
|
256
287
|
return null;
|
|
257
288
|
}
|
|
@@ -275,7 +306,7 @@ function createSocketIOConfig(app, options) {
|
|
|
275
306
|
if (!auth.isService && auth.userId !== target) {
|
|
276
307
|
rejectTerminal(
|
|
277
308
|
"join",
|
|
278
|
-
`user ${auth.userId ?
|
|
309
|
+
`user ${auth.userId ? shortId3(auth.userId) : "unknown"}\u2026 tried to join ${shortId3(target)}\u2026's channel`
|
|
279
310
|
);
|
|
280
311
|
return;
|
|
281
312
|
}
|
|
@@ -293,7 +324,7 @@ function createSocketIOConfig(app, options) {
|
|
|
293
324
|
if (!auth.isService && auth.userId !== target) {
|
|
294
325
|
rejectTerminal(
|
|
295
326
|
"leave",
|
|
296
|
-
`user ${auth.userId ?
|
|
327
|
+
`user ${auth.userId ? shortId3(auth.userId) : "unknown"}\u2026 tried to leave ${shortId3(target)}\u2026's channel`
|
|
297
328
|
);
|
|
298
329
|
return;
|
|
299
330
|
}
|
|
@@ -394,7 +425,7 @@ function createSocketIOConfig(app, options) {
|
|
|
394
425
|
if (socket.feathers === context.connection) {
|
|
395
426
|
socket.join(userRoomName(userId));
|
|
396
427
|
console.debug(
|
|
397
|
-
`\u{1F3E0} Socket ${socket.id} joined user room after login: user:${
|
|
428
|
+
`\u{1F3E0} Socket ${socket.id} joined user room after login: user:${shortId3(userId)}`
|
|
398
429
|
);
|
|
399
430
|
break;
|
|
400
431
|
}
|
|
@@ -422,7 +453,7 @@ function configureChannels(app, options = {}) {
|
|
|
422
453
|
const result = authResult;
|
|
423
454
|
console.debug("\u2705 Login event fired:", result.user?.user_id, result.user?.email);
|
|
424
455
|
const connection = context.connection;
|
|
425
|
-
const tenant = options.multiTenancy ?
|
|
456
|
+
const tenant = options.multiTenancy ? resolveTenantContext2(options.multiTenancy, {
|
|
426
457
|
params: {
|
|
427
458
|
user: result.user,
|
|
428
459
|
authentication: { payload: result.authentication?.payload }
|
|
@@ -454,6 +485,7 @@ function configureChannels(app, options = {}) {
|
|
|
454
485
|
app.channel(tenantUserChannelName(tenant.tenant_id, userId)).leave(context.connection);
|
|
455
486
|
}
|
|
456
487
|
}
|
|
488
|
+
leaveAllSessionStreamChannels(app, context.connection);
|
|
457
489
|
}
|
|
458
490
|
});
|
|
459
491
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startup.d.ts","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMpD,OAAO,EAKL,KAAK,wBAAwB,EAC9B,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAiB,OAAO,EAAa,IAAI,EAAiB,MAAM,kBAAkB,CAAC;AAE/F,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAoB,MAAM,mBAAmB,CAAC;AAM5F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAiBhE,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,WAAW,CAAC;IACjB,EAAE,EAAE,wBAAwB,CAAC;IAC7B,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,2EAA2E;IAE3E,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,CAAC;IACnC,+DAA+D;IAC/D,eAAe,EAAE,MAAM,OAAO,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACzD,gDAAgD;IAChD,eAAe,EAAE,mBAAmB,CAAC;IACrC,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC3C;AA0ED,UAAU,mBAAmB;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,IAAI,EAAE,CAAC;IACtB,gBAAgB,EAAE,OAAO,EAAE,CAAC;IAC5B,2BAA2B,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,WAAW,EAAE,IAAI,EAAE,CAAC;IACpB,8BAA8B,EAAE,MAAM,CAAC;CACxC;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAE7F;
|
|
1
|
+
{"version":3,"file":"startup.d.ts","sourceRoot":"","sources":["../src/startup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMpD,OAAO,EAKL,KAAK,wBAAwB,EAC9B,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAiB,OAAO,EAAa,IAAI,EAAiB,MAAM,kBAAkB,CAAC;AAE/F,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAoB,MAAM,mBAAmB,CAAC;AAM5F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAiBhE,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,WAAW,CAAC;IACjB,EAAE,EAAE,wBAAwB,CAAC;IAC7B,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,2EAA2E;IAE3E,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,CAAC;IACnC,+DAA+D;IAC/D,eAAe,EAAE,MAAM,OAAO,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACzD,gDAAgD;IAChD,eAAe,EAAE,mBAAmB,CAAC;IACrC,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC3C;AA0ED,UAAU,mBAAmB;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,IAAI,EAAE,CAAC;IACtB,gBAAgB,EAAE,OAAO,EAAE,CAAC;IAC5B,2BAA2B,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,WAAW,EAAE,IAAI,EAAE,CAAC;IACpB,8BAA8B,EAAE,MAAM,CAAC;CACxC;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAE7F;AAyUD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CASnF;AA0CD,wBAAsB,OAAO,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA8NhE"}
|
package/dist/daemon/startup.js
CHANGED
|
@@ -60,7 +60,7 @@ import {
|
|
|
60
60
|
SessionRepository as SessionRepository3,
|
|
61
61
|
shortId as shortId6
|
|
62
62
|
} from "@agor/core/db";
|
|
63
|
-
import { SessionStatus as SessionStatus2, TaskStatus } from "@agor/core/types";
|
|
63
|
+
import { isTerminalTaskStatus, SessionStatus as SessionStatus2, TaskStatus } from "@agor/core/types";
|
|
64
64
|
|
|
65
65
|
// src/services/executor-heartbeat-supervisor.ts
|
|
66
66
|
import { shortId } from "@agor/core/db";
|
|
@@ -134,6 +134,7 @@ import { ENVIRONMENT } from "@agor/core/config";
|
|
|
134
134
|
import {
|
|
135
135
|
BranchRepository,
|
|
136
136
|
getHiddenTenantId,
|
|
137
|
+
runWithoutTenantDatabaseScope,
|
|
137
138
|
runWithSystemDatabaseScope,
|
|
138
139
|
runWithTenantDatabaseScope,
|
|
139
140
|
shortId as shortId2
|
|
@@ -223,15 +224,17 @@ var HealthMonitor = class {
|
|
|
223
224
|
startMonitoring(branchId, params = this.branchParams.get(branchId)) {
|
|
224
225
|
this.stopMonitoring(branchId);
|
|
225
226
|
if (params) this.branchParams.set(branchId, params);
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
this.checkHealth(branchId);
|
|
229
|
-
const interval = setInterval(() => {
|
|
227
|
+
runWithoutTenantDatabaseScope(() => {
|
|
228
|
+
setTimeout(() => {
|
|
230
229
|
if (this.isShuttingDown) return;
|
|
231
230
|
this.checkHealth(branchId);
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
231
|
+
const interval = setInterval(() => {
|
|
232
|
+
if (this.isShuttingDown) return;
|
|
233
|
+
this.checkHealth(branchId);
|
|
234
|
+
}, ENVIRONMENT.HEALTH_CHECK_INTERVAL_MS);
|
|
235
|
+
this.intervals.set(branchId, interval);
|
|
236
|
+
}, ENVIRONMENT.STARTUP_GRACE_PERIOD_MS);
|
|
237
|
+
});
|
|
235
238
|
}
|
|
236
239
|
/**
|
|
237
240
|
* Stop monitoring a branch's health
|
|
@@ -1895,18 +1898,36 @@ async function cleanupOrphanStatusesInTenantScope(ctx) {
|
|
|
1895
1898
|
}
|
|
1896
1899
|
}
|
|
1897
1900
|
}
|
|
1898
|
-
const
|
|
1901
|
+
const bootInterruptedTaskIds = /* @__PURE__ */ new Set([
|
|
1902
|
+
...orphanedTasks.map((t) => t.task_id),
|
|
1903
|
+
...queuedTasks.map((t) => t.task_id)
|
|
1904
|
+
]);
|
|
1905
|
+
const idleNotReadyResult = await sessionsService.find({
|
|
1899
1906
|
query: { status: SessionStatus2.IDLE, ready_for_prompt: false, $limit: 1e3 },
|
|
1900
1907
|
...startupParams
|
|
1901
1908
|
});
|
|
1902
|
-
const stuckIdleSessions =
|
|
1903
|
-
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
` \u2713 Unblocked stuck-idle session ${shortId6(session.session_id)} (ready_for_prompt was false)`
|
|
1908
|
-
);
|
|
1909
|
+
const stuckIdleSessions = [];
|
|
1910
|
+
for (const session of idleNotReadyResult.data) {
|
|
1911
|
+
const latestTaskId = session.tasks?.at(-1);
|
|
1912
|
+
if (!latestTaskId) {
|
|
1913
|
+
continue;
|
|
1909
1914
|
}
|
|
1915
|
+
let wasInterrupted = bootInterruptedTaskIds.has(latestTaskId);
|
|
1916
|
+
if (!wasInterrupted) {
|
|
1917
|
+
try {
|
|
1918
|
+
const latestTask = await tasksService.get(latestTaskId, startupParams);
|
|
1919
|
+
wasInterrupted = !isTerminalTaskStatus(latestTask.status);
|
|
1920
|
+
} catch {
|
|
1921
|
+
}
|
|
1922
|
+
}
|
|
1923
|
+
if (!wasInterrupted) {
|
|
1924
|
+
continue;
|
|
1925
|
+
}
|
|
1926
|
+
stuckIdleSessions.push(session);
|
|
1927
|
+
await app.service("sessions").patch(session.session_id, { ready_for_prompt: true }, startupParams);
|
|
1928
|
+
startupDebug(
|
|
1929
|
+
` \u2713 Unblocked stuck-idle session ${shortId6(session.session_id)} (ready_for_prompt was false, latest task interrupted)`
|
|
1930
|
+
);
|
|
1910
1931
|
}
|
|
1911
1932
|
const cleanupParts = [
|
|
1912
1933
|
`${orphanedTasks.length} orphaned task(s) stopped`,
|
|
@@ -4,19 +4,33 @@ import { hasMinimumRole, ROLES } from "@agor/core/types";
|
|
|
4
4
|
|
|
5
5
|
// src/auth/executor-runtime-scope.ts
|
|
6
6
|
import { Forbidden } from "@agor/core/feathers";
|
|
7
|
+
|
|
8
|
+
// src/auth/executor-session-token.ts
|
|
9
|
+
var EXECUTOR_SESSION_TOKEN_TYPE = "executor-session";
|
|
10
|
+
var EXECUTOR_SESSION_TOKEN_PURPOSE = "executor-task";
|
|
11
|
+
function isExecutorSessionTokenPayload(payload) {
|
|
12
|
+
if (!payload || typeof payload !== "object" || Array.isArray(payload)) return false;
|
|
13
|
+
const record = payload;
|
|
14
|
+
return record.type === EXECUTOR_SESSION_TOKEN_TYPE && record.purpose === EXECUTOR_SESSION_TOKEN_PURPOSE;
|
|
15
|
+
}
|
|
16
|
+
function getExecutorSessionTokenSessionId(payload) {
|
|
17
|
+
return payload.session_id ?? payload.sessionId;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// src/auth/executor-runtime-scope.ts
|
|
7
21
|
function scopedPayload(context) {
|
|
8
22
|
const params = context.params;
|
|
9
23
|
const payload = params.authentication?.payload;
|
|
10
|
-
if (payload?.type ===
|
|
11
|
-
if (payload
|
|
24
|
+
if (payload?.type === EXECUTOR_SESSION_TOKEN_TYPE) {
|
|
25
|
+
if (!isExecutorSessionTokenPayload(payload)) {
|
|
12
26
|
throw new Forbidden("Executor token is not valid for this request");
|
|
13
27
|
}
|
|
14
28
|
return payload;
|
|
15
29
|
}
|
|
16
30
|
if (params.authentication?.strategy === "jwt" && params.task_id) {
|
|
17
31
|
return {
|
|
18
|
-
type:
|
|
19
|
-
purpose:
|
|
32
|
+
type: EXECUTOR_SESSION_TOKEN_TYPE,
|
|
33
|
+
purpose: EXECUTOR_SESSION_TOKEN_PURPOSE,
|
|
20
34
|
task_id: params.task_id,
|
|
21
35
|
session_id: params.session_id,
|
|
22
36
|
sessionId: params.sessionId,
|
|
@@ -126,7 +140,7 @@ function executorRuntimeScopeGuard() {
|
|
|
126
140
|
const payload = scopedPayload(context);
|
|
127
141
|
if (!payload) return context;
|
|
128
142
|
const scope = {
|
|
129
|
-
sessionId: payload
|
|
143
|
+
sessionId: getExecutorSessionTokenSessionId(payload),
|
|
130
144
|
taskId: payload.task_id,
|
|
131
145
|
branchId: payload.branch_id
|
|
132
146
|
};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { Application } from '@agor/core/feathers';
|
|
2
|
+
import type { HookContext } from '@agor/core/types';
|
|
3
|
+
export type ManualServiceEvent = {
|
|
4
|
+
/**
|
|
5
|
+
* Service path the event belongs to (e.g. `'branches'`). Load-bearing: the
|
|
6
|
+
* realtime publish handler keys tenant + branch/session RBAC scoping off
|
|
7
|
+
* `context.path`.
|
|
8
|
+
*/
|
|
9
|
+
path: string;
|
|
10
|
+
/**
|
|
11
|
+
* Service event name. Typically one of `created` | `updated` | `patched` |
|
|
12
|
+
* `removed` (the method is inferred from these), but any custom event string
|
|
13
|
+
* is supported — pass `method` to set the inferred CRUD method for those.
|
|
14
|
+
*/
|
|
15
|
+
event: string;
|
|
16
|
+
/** Record to broadcast (becomes both the event payload and `hook.result`). */
|
|
17
|
+
data: unknown;
|
|
18
|
+
/**
|
|
19
|
+
* Request params carrying tenant/connection context. Load-bearing: without a
|
|
20
|
+
* resolvable tenant here (or an ambient tenant DB scope), multi-tenant
|
|
21
|
+
* publishing suppresses the event to service-only sockets.
|
|
22
|
+
*/
|
|
23
|
+
params?: HookContext['params'];
|
|
24
|
+
/** Optional record id (publisher uses it as a branch-id fallback and for logging). */
|
|
25
|
+
id?: HookContext['id'];
|
|
26
|
+
/** Overrides the CRUD method inferred from `event`. */
|
|
27
|
+
method?: string;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Manually emit a Feathers service event with a correctly-shaped publish
|
|
31
|
+
* context.
|
|
32
|
+
*
|
|
33
|
+
* Some services persist through a raw adapter path (e.g. an overridden
|
|
34
|
+
* `patch()` that calls `super.patch()`), which bypasses Feathers' automatic
|
|
35
|
+
* event dispatch — so those call sites must emit the service event by hand.
|
|
36
|
+
*
|
|
37
|
+
* The shape of the emit matters. Feathers' transport-commons publish listener
|
|
38
|
+
* passes the THIRD `emit` argument through UNCHANGED as the publish `hook`, and
|
|
39
|
+
* only synthesizes a fake `{ path, service, app, result }` when that argument
|
|
40
|
+
* is absent (`@feathersjs/transport-commons` `channels/index.ts`). Automatic
|
|
41
|
+
* events, by contrast, emit the full HookContext (`@feathersjs/feathers`
|
|
42
|
+
* `events.ts`). So both malformed shapes lose something the global publish
|
|
43
|
+
* handler (`configureRealtimePublish`) needs:
|
|
44
|
+
* - passing NO third arg gets a synthesized `path`, but no `context.params`
|
|
45
|
+
* (no tenant/connection context), and
|
|
46
|
+
* - passing raw params as the third arg carries `context.params`-looking data
|
|
47
|
+
* at the wrong nesting AND loses `path` (Feathers won't synthesize it once a
|
|
48
|
+
* third arg is present).
|
|
49
|
+
* Either way the handler can't resolve the tenant channel (multi-tenancy)
|
|
50
|
+
* and/or the branch/session RBAC scope, so it degrades to global-scope
|
|
51
|
+
* broadcast or service-only suppression.
|
|
52
|
+
*
|
|
53
|
+
* Build the hook shape once, here, so call sites can't drift on it.
|
|
54
|
+
*/
|
|
55
|
+
export declare function emitServiceEvent(app: Application, event: ManualServiceEvent): void;
|
|
56
|
+
//# sourceMappingURL=emit-service-event.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit-service-event.d.ts","sourceRoot":"","sources":["../../src/utils/emit-service-event.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AASpD,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,IAAI,EAAE,OAAO,CAAC;IACd;;;;OAIG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/B,sFAAsF;IACtF,EAAE,CAAC,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;IACvB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAclF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// src/utils/emit-service-event.ts
|
|
2
|
+
var DEFAULT_EVENT_METHOD = {
|
|
3
|
+
created: "create",
|
|
4
|
+
updated: "update",
|
|
5
|
+
patched: "patch",
|
|
6
|
+
removed: "remove"
|
|
7
|
+
};
|
|
8
|
+
function emitServiceEvent(app, event) {
|
|
9
|
+
const service = app.service(event.path);
|
|
10
|
+
service.emit?.(event.event, event.data, {
|
|
11
|
+
app,
|
|
12
|
+
service,
|
|
13
|
+
path: event.path,
|
|
14
|
+
method: event.method ?? DEFAULT_EVENT_METHOD[event.event] ?? "patch",
|
|
15
|
+
event: event.event,
|
|
16
|
+
id: event.id,
|
|
17
|
+
result: event.data,
|
|
18
|
+
params: event.params ?? {}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export {
|
|
22
|
+
emitServiceEvent
|
|
23
|
+
};
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import type { MCPServer, Params } from '@agor/core/types';
|
|
2
|
+
import { type ExecutorSessionTokenPayload } from '../auth/executor-session-token.js';
|
|
2
3
|
export type MCPSecretParams = Params & {
|
|
3
4
|
authentication?: {
|
|
4
5
|
strategy?: string;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
session_id?: string;
|
|
8
|
-
sessionId?: string;
|
|
9
|
-
};
|
|
6
|
+
accessToken?: string;
|
|
7
|
+
payload?: ExecutorSessionTokenPayload;
|
|
10
8
|
};
|
|
11
9
|
user?: {
|
|
12
10
|
role?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-header-secrets.d.ts","sourceRoot":"","sources":["../../src/utils/mcp-header-secrets.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG;IACrC,cAAc,CAAC,EAAE;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,
|
|
1
|
+
{"version":3,"file":"mcp-header-secrets.d.ts","sourceRoot":"","sources":["../../src/utils/mcp-header-secrets.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,EACL,KAAK,2BAA2B,EAGjC,MAAM,mCAAmC,CAAC;AAE3C,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG;IACrC,cAAc,CAAC,EAAE;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,2BAA2B,CAAC;KACvC,CAAC;IACF,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,2CAA2C,CACzD,MAAM,CAAC,EAAE,eAAe,EACxB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACnC,OAAO,CAST;AAuBD,wBAAgB,4BAA4B,CAC1C,MAAM,CAAC,EAAE,eAAe,EACxB,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAaT;AAGD,eAAO,MAAM,4BAA4B,qCAA+B,CAAC;AAEzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAWnE;AAGD,eAAO,MAAM,4BAA4B,+BAAyB,CAAC"}
|
|
@@ -1,11 +1,40 @@
|
|
|
1
1
|
// src/utils/mcp-header-secrets.ts
|
|
2
2
|
import { redactMCPAuthSecrets } from "@agor/core/tools/mcp/auth-secrets";
|
|
3
3
|
import { redactMCPCustomHeaders } from "@agor/core/tools/mcp/http-headers";
|
|
4
|
+
import jwt from "jsonwebtoken";
|
|
5
|
+
|
|
6
|
+
// src/auth/executor-session-token.ts
|
|
7
|
+
var EXECUTOR_SESSION_TOKEN_TYPE = "executor-session";
|
|
8
|
+
var EXECUTOR_SESSION_TOKEN_PURPOSE = "executor-task";
|
|
9
|
+
function isExecutorSessionTokenPayload(payload) {
|
|
10
|
+
if (!payload || typeof payload !== "object" || Array.isArray(payload)) return false;
|
|
11
|
+
const record = payload;
|
|
12
|
+
return record.type === EXECUTOR_SESSION_TOKEN_TYPE && record.purpose === EXECUTOR_SESSION_TOKEN_PURPOSE;
|
|
13
|
+
}
|
|
14
|
+
function getExecutorSessionTokenSessionId(payload) {
|
|
15
|
+
return payload.session_id ?? payload.sessionId;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// src/utils/mcp-header-secrets.ts
|
|
4
19
|
function shouldExposeMCPServerSecretsForSessionToken(params, options = {}) {
|
|
5
|
-
const payload = params?.authentication?.payload;
|
|
6
|
-
const sessionId = params?.session_id ?? payload
|
|
20
|
+
const payload = params?.authentication?.payload ?? decodeExecutorSessionPayload(params);
|
|
21
|
+
const sessionId = params?.session_id ?? getPayloadSessionId(payload);
|
|
7
22
|
return !!params?.provider && (params.authentication?.strategy === "session-token" || payload?.type === "executor-session") && !!sessionId && (!options.sessionId || sessionId === options.sessionId);
|
|
8
23
|
}
|
|
24
|
+
function decodeExecutorSessionPayload(params) {
|
|
25
|
+
if (params?.authentication?.strategy !== "jwt" || !params.authentication.accessToken) {
|
|
26
|
+
return void 0;
|
|
27
|
+
}
|
|
28
|
+
const decoded = jwt.decode(params.authentication.accessToken);
|
|
29
|
+
if (!decoded || typeof decoded !== "object" || Array.isArray(decoded)) {
|
|
30
|
+
return void 0;
|
|
31
|
+
}
|
|
32
|
+
if (!isExecutorSessionTokenPayload(decoded)) return void 0;
|
|
33
|
+
return decoded;
|
|
34
|
+
}
|
|
35
|
+
function getPayloadSessionId(payload) {
|
|
36
|
+
return payload ? getExecutorSessionTokenSessionId(payload) : void 0;
|
|
37
|
+
}
|
|
9
38
|
function shouldExposeMCPServerSecrets(params, options = {}) {
|
|
10
39
|
if (!params?.provider) return true;
|
|
11
40
|
if (params.user?._isServiceAccount || params.user?.role === "service") return true;
|
|
@@ -11,6 +11,7 @@ export type RealtimeAccessBranchRepository = {
|
|
|
11
11
|
};
|
|
12
12
|
export type RealtimeAccessSessionRepository = {
|
|
13
13
|
findBranchIdBySessionId(sessionId: string): Promise<BranchID | null>;
|
|
14
|
+
findCreatedByBySessionId(sessionId: string): Promise<UUID | null>;
|
|
14
15
|
};
|
|
15
16
|
export interface RealtimeAccessCacheOptions {
|
|
16
17
|
branchRepository: RealtimeAccessBranchRepository;
|
|
@@ -29,11 +30,19 @@ export declare class RealtimeAccessCache {
|
|
|
29
30
|
private readonly options;
|
|
30
31
|
private readonly branchVisibility;
|
|
31
32
|
private readonly sessionBranches;
|
|
33
|
+
private readonly sessionOwners;
|
|
32
34
|
private readonly branchVisibilityTtlMs;
|
|
33
35
|
private readonly sessionBranchTtlMs;
|
|
34
36
|
private readonly now;
|
|
35
37
|
constructor(options: RealtimeAccessCacheOptions);
|
|
36
38
|
getBranchIdForSession(sessionId: string): Promise<BranchID | null>;
|
|
39
|
+
/**
|
|
40
|
+
* Owning user id for a session, cached on the same cadence as the
|
|
41
|
+
* session→branch map. Used only to offer streaming events to the session
|
|
42
|
+
* creator's own connections as a fallback when they haven't subscribed to
|
|
43
|
+
* the per-session stream channel yet.
|
|
44
|
+
*/
|
|
45
|
+
getSessionOwnerId(sessionId: string): Promise<UserID | null>;
|
|
37
46
|
getBranchVisibility(branchId: BranchID): Promise<BranchRealtimeVisibility | null>;
|
|
38
47
|
invalidateBranch(branchId: string): void;
|
|
39
48
|
invalidateSession(sessionId: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"realtime-access-cache.d.ts","sourceRoot":"","sources":["../../src/utils/realtime-access-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGvE,MAAM,MAAM,wBAAwB,GAChC;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC;AAEpD,MAAM,MAAM,8BAA8B,GAAG;IAC3C,4BAA4B,CAC1B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5D,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;CAC9D,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"realtime-access-cache.d.ts","sourceRoot":"","sources":["../../src/utils/realtime-access-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGvE,MAAM,MAAM,wBAAwB,GAChC;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC;AAEpD,MAAM,MAAM,8BAA8B,GAAG;IAC3C,4BAA4B,CAC1B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5D,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;CAC9D,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IACrE,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;CACnE,CAAC;AAgBF,MAAM,WAAW,0BAA0B;IACzC,gBAAgB,EAAE,8BAA8B,CAAC;IACjD,kBAAkB,EAAE,+BAA+B,CAAC;IACpD,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAUD;;;;GAIG;AACH,qBAAa,mBAAmB;IAQlB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAPpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmD;IACpF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA8C;IAC9E,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6C;IAC3E,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEN,OAAO,EAAE,0BAA0B;IAQ1D,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAexE;;;;;OAKG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAkB5D,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC;IA+BvF,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IASxC,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAK1C,eAAe,IAAI,IAAI;IAIvB,QAAQ,IAAI,IAAI;IAMhB,OAAO,CAAC,mBAAmB;CAK5B"}
|
|
@@ -22,6 +22,7 @@ var RealtimeAccessCache = class {
|
|
|
22
22
|
}
|
|
23
23
|
branchVisibility = /* @__PURE__ */ new Map();
|
|
24
24
|
sessionBranches = /* @__PURE__ */ new Map();
|
|
25
|
+
sessionOwners = /* @__PURE__ */ new Map();
|
|
25
26
|
branchVisibilityTtlMs;
|
|
26
27
|
sessionBranchTtlMs;
|
|
27
28
|
now;
|
|
@@ -38,6 +39,27 @@ var RealtimeAccessCache = class {
|
|
|
38
39
|
});
|
|
39
40
|
return branchId;
|
|
40
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* Owning user id for a session, cached on the same cadence as the
|
|
44
|
+
* session→branch map. Used only to offer streaming events to the session
|
|
45
|
+
* creator's own connections as a fallback when they haven't subscribed to
|
|
46
|
+
* the per-session stream channel yet.
|
|
47
|
+
*/
|
|
48
|
+
async getSessionOwnerId(sessionId) {
|
|
49
|
+
const cached = this.sessionOwners.get(sessionId);
|
|
50
|
+
const now = this.now();
|
|
51
|
+
if (cached && cached.expiresAt > now) {
|
|
52
|
+
return cached.ownerId;
|
|
53
|
+
}
|
|
54
|
+
const ownerId = await this.options.sessionsRepository.findCreatedByBySessionId(
|
|
55
|
+
sessionId
|
|
56
|
+
) ?? null;
|
|
57
|
+
this.sessionOwners.set(sessionId, {
|
|
58
|
+
ownerId,
|
|
59
|
+
expiresAt: now + this.sessionBranchTtlMs
|
|
60
|
+
});
|
|
61
|
+
return ownerId;
|
|
62
|
+
}
|
|
41
63
|
async getBranchVisibility(branchId) {
|
|
42
64
|
const cached = this.branchVisibility.get(branchId);
|
|
43
65
|
const now = this.now();
|
|
@@ -73,6 +95,7 @@ var RealtimeAccessCache = class {
|
|
|
73
95
|
}
|
|
74
96
|
invalidateSession(sessionId) {
|
|
75
97
|
this.sessionBranches.delete(sessionId);
|
|
98
|
+
this.sessionOwners.delete(sessionId);
|
|
76
99
|
}
|
|
77
100
|
clearVisibility() {
|
|
78
101
|
this.branchVisibility.clear();
|
|
@@ -80,6 +103,7 @@ var RealtimeAccessCache = class {
|
|
|
80
103
|
clearAll() {
|
|
81
104
|
this.branchVisibility.clear();
|
|
82
105
|
this.sessionBranches.clear();
|
|
106
|
+
this.sessionOwners.clear();
|
|
83
107
|
}
|
|
84
108
|
visibilityFromEntry(entry) {
|
|
85
109
|
return entry.mode === "allAuthenticated" ? { mode: "allAuthenticated" } : { mode: "explicitUsers", userIds: entry.userIds };
|
|
@@ -2,6 +2,30 @@ import { type ResolvedMultiTenancyConfig } from '@agor/core/config';
|
|
|
2
2
|
import type { BranchRepository, SessionRepository } from '@agor/core/db';
|
|
3
3
|
import type { Application } from '@agor/core/feathers';
|
|
4
4
|
import { RealtimeAccessCache } from './realtime-access-cache.js';
|
|
5
|
+
export declare function sessionStreamChannelName(sessionId: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Remove a connection from every session-stream room it has joined. Called on
|
|
8
|
+
* logout so a still-connected-but-deauthenticated socket stops receiving live
|
|
9
|
+
* session text — Feathers only auto-drops channel membership on socket
|
|
10
|
+
* disconnect, and streaming delivery would otherwise keep reaching a logged-out
|
|
11
|
+
* connection (which is no longer in the authenticated/tenant channels but may
|
|
12
|
+
* still sit in a session-stream room).
|
|
13
|
+
*/
|
|
14
|
+
export declare function leaveAllSessionStreamChannels(app: Application, connection: unknown): void;
|
|
15
|
+
/**
|
|
16
|
+
* Join a connection to a session's streaming room. Centralized here (the
|
|
17
|
+
* tenant-aware realtime facade) so subscribe/publish share one channel name
|
|
18
|
+
* and the raw `app.channel` surface stays in a single audited file.
|
|
19
|
+
*/
|
|
20
|
+
export declare function joinSessionStreamChannel(app: Application, sessionId: string, connection: unknown): void;
|
|
21
|
+
/**
|
|
22
|
+
* Remove a connection from a session's streaming room, but only if the room
|
|
23
|
+
* already exists. A `remove` for a never-joined room (any authenticated caller
|
|
24
|
+
* can send one) or a dispose after logout/disconnect already pruned the room
|
|
25
|
+
* would otherwise re-materialize an empty, never-cleaned channel — the same
|
|
26
|
+
* leak class as the publish path. `.leave` on an absent room is a no-op anyway.
|
|
27
|
+
*/
|
|
28
|
+
export declare function leaveSessionStreamChannel(app: Application, sessionId: string, connection: unknown): void;
|
|
5
29
|
type RealtimePublishOptions = {
|
|
6
30
|
app: Application;
|
|
7
31
|
branchRbacEnabled: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"realtime-publish.d.ts","sourceRoot":"","sources":["../../src/utils/realtime-publish.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,0BAA0B,EAGhC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIvD,OAAO,EAEL,mBAAmB,EAEpB,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"realtime-publish.d.ts","sourceRoot":"","sources":["../../src/utils/realtime-publish.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,0BAA0B,EAGhC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIvD,OAAO,EAEL,mBAAmB,EAEpB,MAAM,4BAA4B,CAAC;AAkBpC,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAElE;AAED;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI,CAMzF;AAcD;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,OAAO,GAClB,IAAI,CAEN;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,OAAO,GAClB,IAAI,CAEN;AAmBD,KAAK,sBAAsB,GAAG;IAC5B,GAAG,EAAE,WAAW,CAAC;IACjB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,kBAAkB,EAAE,iBAAiB,CAAC;IACtC,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,0BAA0B,CAAC;CAC3C,CAAC;AAyZF;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,CA2F9E"}
|