agent-relay 2.0.22 → 2.0.24
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/bin/relay-pty-linux-arm64 +0 -0
- package/dist/src/cli/index.d.ts +3 -3
- package/dist/src/cli/index.js +58 -74
- package/package.json +21 -62
- package/packages/api-types/package.json +1 -1
- package/packages/bridge/package.json +8 -8
- package/packages/cli-tester/package.json +1 -1
- package/packages/config/package.json +2 -2
- package/packages/continuity/package.json +1 -1
- package/packages/daemon/dist/orchestrator.js +19 -1
- package/packages/daemon/package.json +12 -12
- package/packages/hooks/package.json +4 -4
- package/packages/mcp/package.json +2 -2
- package/packages/memory/package.json +2 -2
- package/packages/policy/package.json +2 -2
- package/packages/protocol/package.json +1 -1
- package/packages/resiliency/package.json +1 -1
- package/packages/sdk/package.json +2 -2
- package/packages/spawner/package.json +1 -1
- package/packages/state/package.json +1 -1
- package/packages/storage/package.json +2 -2
- package/packages/telemetry/package.json +1 -1
- package/packages/trajectory/package.json +2 -2
- package/packages/user-directory/package.json +2 -2
- package/packages/utils/dist/update-checker.js +4 -0
- package/packages/utils/package.json +1 -1
- package/packages/wrapper/package.json +6 -6
- package/deploy/init-db.sql +0 -5
- package/deploy/scripts/setup-fly-workspaces.sh +0 -69
- package/deploy/scripts/setup-railway.sh +0 -75
- package/deploy/workspace/codex.config.toml +0 -20
- package/deploy/workspace/entrypoint-browser.sh +0 -118
- package/deploy/workspace/entrypoint.sh +0 -612
- package/deploy/workspace/gh-credential-relay +0 -90
- package/deploy/workspace/gh-relay +0 -156
- package/deploy/workspace/git-credential-relay +0 -330
- package/deploy/workspace/git-credential-relay.test.sh +0 -230
- package/dist/dashboard/out/404.html +0 -1
- package/dist/dashboard/out/_next/static/91mkGYq3qbG8WHE6VytQ8/_buildManifest.js +0 -1
- package/dist/dashboard/out/_next/static/91mkGYq3qbG8WHE6VytQ8/_ssgManifest.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/116-a883fca163f3a5bc.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/117-c8afed19e821a35d.js +0 -2
- package/dist/dashboard/out/_next/static/chunks/282-980c2eb8fff20123.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/320-a6304232cd0ee2ce.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/532-bace199897eeab37.js +0 -9
- package/dist/dashboard/out/_next/static/chunks/631-16b905e5920f9b59.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/648-acb2ff9f77cbfbd3.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/766-2aea80818f7eb0d8.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/83-26d2bde54616ee90.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/847-f1f467060f32afff.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/891-5cb1513eeb97a891.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/_not-found/page-60501fddbafba9dc.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/app/onboarding/page-9914652442f7e4fb.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/app/page-366fb7c078d4e9e0.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/cloud/link/page-fa1d5842aa90e8a6.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/complete-profile/page-dd64bbdf66b639cd.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/connect-repos/page-113060009ef35bc2.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/history/page-9965d2483011b846.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/layout-6b91e33784c20610.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/login/page-435eceb0073be027.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/metrics/page-1e37ef8e73940b40.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/page-8119d4246743574e.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/pricing/page-9db3ebdfa567a7c9.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/providers/page-ecb16ffd3b36262b.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/providers/setup/[provider]/page-4dbe33f0f7691b7c.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/signup/page-c7a0a28341365ae0.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/e868780c-48e5f147c90a3a41.js +0 -18
- package/dist/dashboard/out/_next/static/chunks/fd9d1056-609918ca7b6280bb.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/framework-f66176bb897dc684.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/main-311c3db74dcfadb7.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/main-app-fdbeb09028f57c9f.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/pages/_app-72b849fbd24ac258.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/pages/_error-7ba65e1336b92748.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +0 -1
- package/dist/dashboard/out/_next/static/css/4034f236dd1a3178.css +0 -1
- package/dist/dashboard/out/_next/static/css/6892f8422896ef7a.css +0 -1
- package/dist/dashboard/out/alt-logos/agent-relay-logo-128.png +0 -0
- package/dist/dashboard/out/alt-logos/agent-relay-logo-256.png +0 -0
- package/dist/dashboard/out/alt-logos/agent-relay-logo-32.png +0 -0
- package/dist/dashboard/out/alt-logos/agent-relay-logo-512.png +0 -0
- package/dist/dashboard/out/alt-logos/agent-relay-logo-64.png +0 -0
- package/dist/dashboard/out/alt-logos/agent-relay-logo.svg +0 -45
- package/dist/dashboard/out/alt-logos/logo.svg +0 -38
- package/dist/dashboard/out/alt-logos/monogram-logo-128.png +0 -0
- package/dist/dashboard/out/alt-logos/monogram-logo-256.png +0 -0
- package/dist/dashboard/out/alt-logos/monogram-logo-32.png +0 -0
- package/dist/dashboard/out/alt-logos/monogram-logo-512.png +0 -0
- package/dist/dashboard/out/alt-logos/monogram-logo-64.png +0 -0
- package/dist/dashboard/out/alt-logos/monogram-logo.svg +0 -38
- package/dist/dashboard/out/app/onboarding.html +0 -1
- package/dist/dashboard/out/app/onboarding.txt +0 -7
- package/dist/dashboard/out/app.html +0 -1
- package/dist/dashboard/out/app.txt +0 -7
- package/dist/dashboard/out/apple-icon.png +0 -0
- package/dist/dashboard/out/cloud/link.html +0 -1
- package/dist/dashboard/out/cloud/link.txt +0 -7
- package/dist/dashboard/out/complete-profile.html +0 -5
- package/dist/dashboard/out/complete-profile.txt +0 -7
- package/dist/dashboard/out/connect-repos.html +0 -1
- package/dist/dashboard/out/connect-repos.txt +0 -7
- package/dist/dashboard/out/history.html +0 -1
- package/dist/dashboard/out/history.txt +0 -7
- package/dist/dashboard/out/index.html +0 -1
- package/dist/dashboard/out/index.txt +0 -7
- package/dist/dashboard/out/login.html +0 -5
- package/dist/dashboard/out/login.txt +0 -7
- package/dist/dashboard/out/metrics.html +0 -1
- package/dist/dashboard/out/metrics.txt +0 -7
- package/dist/dashboard/out/pricing.html +0 -13
- package/dist/dashboard/out/pricing.txt +0 -7
- package/dist/dashboard/out/providers/setup/claude.html +0 -1
- package/dist/dashboard/out/providers/setup/claude.txt +0 -8
- package/dist/dashboard/out/providers/setup/codex.html +0 -1
- package/dist/dashboard/out/providers/setup/codex.txt +0 -8
- package/dist/dashboard/out/providers/setup/cursor.html +0 -1
- package/dist/dashboard/out/providers/setup/cursor.txt +0 -8
- package/dist/dashboard/out/providers.html +0 -1
- package/dist/dashboard/out/providers.txt +0 -7
- package/dist/dashboard/out/signup.html +0 -6
- package/dist/dashboard/out/signup.txt +0 -7
- package/dist/src/cloud/index.d.ts +0 -8
- package/dist/src/cloud/index.js +0 -8
- package/dist/src/dashboard-server/index.d.ts +0 -8
- package/dist/src/dashboard-server/index.js +0 -8
- package/packages/cloud/dist/api/admin.d.ts +0 -8
- package/packages/cloud/dist/api/admin.js +0 -225
- package/packages/cloud/dist/api/auth.d.ts +0 -20
- package/packages/cloud/dist/api/auth.js +0 -138
- package/packages/cloud/dist/api/billing.d.ts +0 -7
- package/packages/cloud/dist/api/billing.js +0 -564
- package/packages/cloud/dist/api/cli-pty-runner.d.ts +0 -53
- package/packages/cloud/dist/api/cli-pty-runner.js +0 -175
- package/packages/cloud/dist/api/codex-auth-helper.d.ts +0 -21
- package/packages/cloud/dist/api/codex-auth-helper.js +0 -327
- package/packages/cloud/dist/api/consensus.d.ts +0 -13
- package/packages/cloud/dist/api/consensus.js +0 -261
- package/packages/cloud/dist/api/coordinators.d.ts +0 -8
- package/packages/cloud/dist/api/coordinators.js +0 -750
- package/packages/cloud/dist/api/daemons.d.ts +0 -12
- package/packages/cloud/dist/api/daemons.js +0 -535
- package/packages/cloud/dist/api/email-auth.d.ts +0 -11
- package/packages/cloud/dist/api/email-auth.js +0 -347
- package/packages/cloud/dist/api/generic-webhooks.d.ts +0 -8
- package/packages/cloud/dist/api/generic-webhooks.js +0 -129
- package/packages/cloud/dist/api/git.d.ts +0 -8
- package/packages/cloud/dist/api/git.js +0 -269
- package/packages/cloud/dist/api/github-app.d.ts +0 -11
- package/packages/cloud/dist/api/github-app.js +0 -223
- package/packages/cloud/dist/api/middleware/planLimits.d.ts +0 -43
- package/packages/cloud/dist/api/middleware/planLimits.js +0 -202
- package/packages/cloud/dist/api/monitoring.d.ts +0 -11
- package/packages/cloud/dist/api/monitoring.js +0 -578
- package/packages/cloud/dist/api/nango-auth.d.ts +0 -9
- package/packages/cloud/dist/api/nango-auth.js +0 -741
- package/packages/cloud/dist/api/onboarding.d.ts +0 -15
- package/packages/cloud/dist/api/onboarding.js +0 -679
- package/packages/cloud/dist/api/policy.d.ts +0 -8
- package/packages/cloud/dist/api/policy.js +0 -229
- package/packages/cloud/dist/api/provider-env.d.ts +0 -26
- package/packages/cloud/dist/api/provider-env.js +0 -141
- package/packages/cloud/dist/api/providers.d.ts +0 -7
- package/packages/cloud/dist/api/providers.js +0 -574
- package/packages/cloud/dist/api/repos.d.ts +0 -8
- package/packages/cloud/dist/api/repos.js +0 -577
- package/packages/cloud/dist/api/sessions.d.ts +0 -11
- package/packages/cloud/dist/api/sessions.js +0 -302
- package/packages/cloud/dist/api/teams.d.ts +0 -7
- package/packages/cloud/dist/api/teams.js +0 -281
- package/packages/cloud/dist/api/test-helpers.d.ts +0 -10
- package/packages/cloud/dist/api/test-helpers.js +0 -745
- package/packages/cloud/dist/api/usage.d.ts +0 -7
- package/packages/cloud/dist/api/usage.js +0 -111
- package/packages/cloud/dist/api/webhooks.d.ts +0 -8
- package/packages/cloud/dist/api/webhooks.js +0 -645
- package/packages/cloud/dist/api/workspaces.d.ts +0 -25
- package/packages/cloud/dist/api/workspaces.js +0 -1799
- package/packages/cloud/dist/billing/index.d.ts +0 -9
- package/packages/cloud/dist/billing/index.js +0 -9
- package/packages/cloud/dist/billing/plans.d.ts +0 -39
- package/packages/cloud/dist/billing/plans.js +0 -245
- package/packages/cloud/dist/billing/service.d.ts +0 -80
- package/packages/cloud/dist/billing/service.js +0 -388
- package/packages/cloud/dist/billing/types.d.ts +0 -141
- package/packages/cloud/dist/billing/types.js +0 -7
- package/packages/cloud/dist/config.d.ts +0 -5
- package/packages/cloud/dist/config.js +0 -5
- package/packages/cloud/dist/db/bulk-ingest.d.ts +0 -89
- package/packages/cloud/dist/db/bulk-ingest.js +0 -268
- package/packages/cloud/dist/db/drizzle.d.ts +0 -290
- package/packages/cloud/dist/db/drizzle.js +0 -1422
- package/packages/cloud/dist/db/index.d.ts +0 -56
- package/packages/cloud/dist/db/index.js +0 -70
- package/packages/cloud/dist/db/schema.d.ts +0 -5117
- package/packages/cloud/dist/db/schema.js +0 -656
- package/packages/cloud/dist/index.d.ts +0 -11
- package/packages/cloud/dist/index.js +0 -38
- package/packages/cloud/dist/provisioner/index.d.ts +0 -207
- package/packages/cloud/dist/provisioner/index.js +0 -2118
- package/packages/cloud/dist/server.d.ts +0 -17
- package/packages/cloud/dist/server.js +0 -2034
- package/packages/cloud/dist/services/auto-scaler.d.ts +0 -152
- package/packages/cloud/dist/services/auto-scaler.js +0 -439
- package/packages/cloud/dist/services/capacity-manager.d.ts +0 -148
- package/packages/cloud/dist/services/capacity-manager.js +0 -449
- package/packages/cloud/dist/services/ci-agent-spawner.d.ts +0 -49
- package/packages/cloud/dist/services/ci-agent-spawner.js +0 -373
- package/packages/cloud/dist/services/cloud-message-bus.d.ts +0 -28
- package/packages/cloud/dist/services/cloud-message-bus.js +0 -19
- package/packages/cloud/dist/services/compute-enforcement.d.ts +0 -57
- package/packages/cloud/dist/services/compute-enforcement.js +0 -175
- package/packages/cloud/dist/services/coordinator.d.ts +0 -62
- package/packages/cloud/dist/services/coordinator.js +0 -389
- package/packages/cloud/dist/services/index.d.ts +0 -17
- package/packages/cloud/dist/services/index.js +0 -25
- package/packages/cloud/dist/services/intro-expiration.d.ts +0 -60
- package/packages/cloud/dist/services/intro-expiration.js +0 -252
- package/packages/cloud/dist/services/mention-handler.d.ts +0 -65
- package/packages/cloud/dist/services/mention-handler.js +0 -405
- package/packages/cloud/dist/services/nango.d.ts +0 -219
- package/packages/cloud/dist/services/nango.js +0 -424
- package/packages/cloud/dist/services/persistence.d.ts +0 -131
- package/packages/cloud/dist/services/persistence.js +0 -200
- package/packages/cloud/dist/services/planLimits.d.ts +0 -147
- package/packages/cloud/dist/services/planLimits.js +0 -335
- package/packages/cloud/dist/services/presence-registry.d.ts +0 -56
- package/packages/cloud/dist/services/presence-registry.js +0 -91
- package/packages/cloud/dist/services/scaling-orchestrator.d.ts +0 -159
- package/packages/cloud/dist/services/scaling-orchestrator.js +0 -502
- package/packages/cloud/dist/services/scaling-policy.d.ts +0 -121
- package/packages/cloud/dist/services/scaling-policy.js +0 -415
- package/packages/cloud/dist/services/ssh-security.d.ts +0 -31
- package/packages/cloud/dist/services/ssh-security.js +0 -63
- package/packages/cloud/dist/services/workspace-keepalive.d.ts +0 -76
- package/packages/cloud/dist/services/workspace-keepalive.js +0 -234
- package/packages/cloud/dist/shims/consensus.d.ts +0 -23
- package/packages/cloud/dist/shims/consensus.js +0 -5
- package/packages/cloud/dist/webhooks/index.d.ts +0 -24
- package/packages/cloud/dist/webhooks/index.js +0 -29
- package/packages/cloud/dist/webhooks/parsers/github.d.ts +0 -8
- package/packages/cloud/dist/webhooks/parsers/github.js +0 -234
- package/packages/cloud/dist/webhooks/parsers/index.d.ts +0 -23
- package/packages/cloud/dist/webhooks/parsers/index.js +0 -30
- package/packages/cloud/dist/webhooks/parsers/linear.d.ts +0 -9
- package/packages/cloud/dist/webhooks/parsers/linear.js +0 -258
- package/packages/cloud/dist/webhooks/parsers/slack.d.ts +0 -9
- package/packages/cloud/dist/webhooks/parsers/slack.js +0 -214
- package/packages/cloud/dist/webhooks/responders/github.d.ts +0 -8
- package/packages/cloud/dist/webhooks/responders/github.js +0 -73
- package/packages/cloud/dist/webhooks/responders/index.d.ts +0 -23
- package/packages/cloud/dist/webhooks/responders/index.js +0 -30
- package/packages/cloud/dist/webhooks/responders/linear.d.ts +0 -9
- package/packages/cloud/dist/webhooks/responders/linear.js +0 -149
- package/packages/cloud/dist/webhooks/responders/slack.d.ts +0 -20
- package/packages/cloud/dist/webhooks/responders/slack.js +0 -178
- package/packages/cloud/dist/webhooks/router.d.ts +0 -25
- package/packages/cloud/dist/webhooks/router.js +0 -504
- package/packages/cloud/dist/webhooks/rules-engine.d.ts +0 -24
- package/packages/cloud/dist/webhooks/rules-engine.js +0 -287
- package/packages/cloud/dist/webhooks/types.d.ts +0 -186
- package/packages/cloud/dist/webhooks/types.js +0 -8
- package/packages/cloud/package.json +0 -60
- package/packages/dashboard/README.md +0 -48
- package/packages/dashboard/dist/health-worker-manager.d.ts +0 -62
- package/packages/dashboard/dist/health-worker-manager.js +0 -144
- package/packages/dashboard/dist/health-worker.d.ts +0 -9
- package/packages/dashboard/dist/health-worker.js +0 -79
- package/packages/dashboard/dist/index.d.ts +0 -20
- package/packages/dashboard/dist/index.js +0 -19
- package/packages/dashboard/dist/metrics.d.ts +0 -105
- package/packages/dashboard/dist/metrics.js +0 -193
- package/packages/dashboard/dist/needs-attention.d.ts +0 -24
- package/packages/dashboard/dist/needs-attention.js +0 -78
- package/packages/dashboard/dist/server.d.ts +0 -25
- package/packages/dashboard/dist/server.js +0 -5270
- package/packages/dashboard/dist/start.d.ts +0 -6
- package/packages/dashboard/dist/start.js +0 -13
- package/packages/dashboard/dist/types/threading.d.ts +0 -8
- package/packages/dashboard/dist/types/threading.js +0 -2
- package/packages/dashboard/dist/user-bridge.d.ts +0 -154
- package/packages/dashboard/dist/user-bridge.js +0 -372
- package/packages/dashboard/package.json +0 -65
- package/packages/dashboard/ui/app/app/onboarding/page.tsx +0 -394
- package/packages/dashboard/ui/app/app/page.tsx +0 -667
- package/packages/dashboard/ui/app/apple-icon.png +0 -0
- package/packages/dashboard/ui/app/cloud/link/page.tsx +0 -464
- package/packages/dashboard/ui/app/complete-profile/page.tsx +0 -204
- package/packages/dashboard/ui/app/connect-repos/page.tsx +0 -410
- package/packages/dashboard/ui/app/favicon.png +0 -0
- package/packages/dashboard/ui/app/globals.css +0 -59
- package/packages/dashboard/ui/app/history/page.tsx +0 -658
- package/packages/dashboard/ui/app/layout.tsx +0 -25
- package/packages/dashboard/ui/app/login/page.tsx +0 -424
- package/packages/dashboard/ui/app/metrics/page.tsx +0 -751
- package/packages/dashboard/ui/app/page.tsx +0 -59
- package/packages/dashboard/ui/app/pricing/page.tsx +0 -7
- package/packages/dashboard/ui/app/providers/page.tsx +0 -193
- package/packages/dashboard/ui/app/providers/setup/[provider]/ProviderSetupClient.tsx +0 -148
- package/packages/dashboard/ui/app/providers/setup/[provider]/constants.ts +0 -35
- package/packages/dashboard/ui/app/providers/setup/[provider]/page.tsx +0 -42
- package/packages/dashboard/ui/app/signup/page.tsx +0 -533
- package/packages/dashboard/ui/index.ts +0 -49
- package/packages/dashboard/ui/landing/LandingPage.tsx +0 -713
- package/packages/dashboard/ui/landing/PricingPage.tsx +0 -559
- package/packages/dashboard/ui/landing/index.ts +0 -6
- package/packages/dashboard/ui/landing/styles.css +0 -2850
- package/packages/dashboard/ui/lib/agent-merge.ts +0 -35
- package/packages/dashboard/ui/lib/api.ts +0 -1155
- package/packages/dashboard/ui/lib/cloudApi.ts +0 -877
- package/packages/dashboard/ui/lib/colors.ts +0 -218
- package/packages/dashboard/ui/lib/hierarchy.ts +0 -242
- package/packages/dashboard/ui/lib/stuckDetection.ts +0 -142
- package/packages/dashboard/ui/next-env.d.ts +0 -5
- package/packages/dashboard/ui/next.config.js +0 -41
- package/packages/dashboard/ui/package-lock.json +0 -2882
- package/packages/dashboard/ui/package.json +0 -33
- package/packages/dashboard/ui/postcss.config.js +0 -5
- package/packages/dashboard/ui/react-components/ActivityFeed.tsx +0 -216
- package/packages/dashboard/ui/react-components/AddWorkspaceModal.tsx +0 -170
- package/packages/dashboard/ui/react-components/AgentCard.tsx +0 -587
- package/packages/dashboard/ui/react-components/AgentList.tsx +0 -411
- package/packages/dashboard/ui/react-components/AgentProfilePanel.tsx +0 -564
- package/packages/dashboard/ui/react-components/App.tsx +0 -3033
- package/packages/dashboard/ui/react-components/BillingPanel.tsx +0 -922
- package/packages/dashboard/ui/react-components/BillingResult.tsx +0 -447
- package/packages/dashboard/ui/react-components/BroadcastComposer.tsx +0 -690
- package/packages/dashboard/ui/react-components/ChannelAdminPanel.tsx +0 -773
- package/packages/dashboard/ui/react-components/ChannelBrowser.tsx +0 -385
- package/packages/dashboard/ui/react-components/ChannelChat.tsx +0 -261
- package/packages/dashboard/ui/react-components/ChannelSidebar.tsx +0 -399
- package/packages/dashboard/ui/react-components/CloudSessionProvider.tsx +0 -130
- package/packages/dashboard/ui/react-components/CommandPalette.tsx +0 -815
- package/packages/dashboard/ui/react-components/ConfirmationDialog.tsx +0 -133
- package/packages/dashboard/ui/react-components/ConversationHistory.tsx +0 -518
- package/packages/dashboard/ui/react-components/CoordinatorPanel.tsx +0 -944
- package/packages/dashboard/ui/react-components/DecisionQueue.tsx +0 -717
- package/packages/dashboard/ui/react-components/DirectMessageView.tsx +0 -164
- package/packages/dashboard/ui/react-components/FileAutocomplete.tsx +0 -368
- package/packages/dashboard/ui/react-components/FleetOverview.tsx +0 -278
- package/packages/dashboard/ui/react-components/LogViewer.tsx +0 -310
- package/packages/dashboard/ui/react-components/LogViewerPanel.tsx +0 -482
- package/packages/dashboard/ui/react-components/Logo.tsx +0 -284
- package/packages/dashboard/ui/react-components/MentionAutocomplete.tsx +0 -384
- package/packages/dashboard/ui/react-components/MessageComposer.tsx +0 -457
- package/packages/dashboard/ui/react-components/MessageList.tsx +0 -649
- package/packages/dashboard/ui/react-components/MessageSenderName.tsx +0 -91
- package/packages/dashboard/ui/react-components/MessageStatusIndicator.tsx +0 -142
- package/packages/dashboard/ui/react-components/NewConversationModal.tsx +0 -400
- package/packages/dashboard/ui/react-components/NotificationToast.tsx +0 -488
- package/packages/dashboard/ui/react-components/OnlineUsersIndicator.tsx +0 -164
- package/packages/dashboard/ui/react-components/Pagination.tsx +0 -124
- package/packages/dashboard/ui/react-components/PricingPlans.tsx +0 -386
- package/packages/dashboard/ui/react-components/ProjectList.tsx +0 -625
- package/packages/dashboard/ui/react-components/ProviderAuthFlow.tsx +0 -853
- package/packages/dashboard/ui/react-components/ProviderConnectionList.tsx +0 -378
- package/packages/dashboard/ui/react-components/ProvisioningProgress.tsx +0 -730
- package/packages/dashboard/ui/react-components/RepoAccessPanel.tsx +0 -549
- package/packages/dashboard/ui/react-components/ServerCard.tsx +0 -202
- package/packages/dashboard/ui/react-components/SessionExpiredModal.tsx +0 -128
- package/packages/dashboard/ui/react-components/SpawnModal.tsx +0 -804
- package/packages/dashboard/ui/react-components/TaskAssignmentUI.tsx +0 -375
- package/packages/dashboard/ui/react-components/TerminalProviderSetup.tsx +0 -608
- package/packages/dashboard/ui/react-components/ThemeProvider.tsx +0 -325
- package/packages/dashboard/ui/react-components/ThinkingIndicator.tsx +0 -231
- package/packages/dashboard/ui/react-components/ThreadList.tsx +0 -198
- package/packages/dashboard/ui/react-components/ThreadPanel.tsx +0 -346
- package/packages/dashboard/ui/react-components/TrajectoryViewer.tsx +0 -698
- package/packages/dashboard/ui/react-components/TypingIndicator.tsx +0 -69
- package/packages/dashboard/ui/react-components/UsageBanner.tsx +0 -231
- package/packages/dashboard/ui/react-components/UserProfilePanel.tsx +0 -233
- package/packages/dashboard/ui/react-components/WorkspaceContext.tsx +0 -107
- package/packages/dashboard/ui/react-components/WorkspaceSelector.tsx +0 -234
- package/packages/dashboard/ui/react-components/WorkspaceStatusIndicator.tsx +0 -370
- package/packages/dashboard/ui/react-components/XTermInteractive.tsx +0 -510
- package/packages/dashboard/ui/react-components/XTermLogViewer.tsx +0 -719
- package/packages/dashboard/ui/react-components/channels/ChannelDialogs.tsx +0 -1411
- package/packages/dashboard/ui/react-components/channels/ChannelHeader.tsx +0 -317
- package/packages/dashboard/ui/react-components/channels/ChannelMessageList.tsx +0 -463
- package/packages/dashboard/ui/react-components/channels/ChannelViewV1.tsx +0 -146
- package/packages/dashboard/ui/react-components/channels/MessageInput.tsx +0 -288
- package/packages/dashboard/ui/react-components/channels/SearchInput.tsx +0 -172
- package/packages/dashboard/ui/react-components/channels/SearchResults.tsx +0 -336
- package/packages/dashboard/ui/react-components/channels/api.ts +0 -697
- package/packages/dashboard/ui/react-components/channels/index.ts +0 -76
- package/packages/dashboard/ui/react-components/channels/mockApi.ts +0 -344
- package/packages/dashboard/ui/react-components/channels/types.ts +0 -566
- package/packages/dashboard/ui/react-components/hooks/index.ts +0 -57
- package/packages/dashboard/ui/react-components/hooks/useAgentLogs.ts +0 -394
- package/packages/dashboard/ui/react-components/hooks/useAgents.ts +0 -127
- package/packages/dashboard/ui/react-components/hooks/useBroadcastDedup.ts +0 -86
- package/packages/dashboard/ui/react-components/hooks/useChannelAdmin.ts +0 -329
- package/packages/dashboard/ui/react-components/hooks/useChannelBrowser.ts +0 -239
- package/packages/dashboard/ui/react-components/hooks/useChannelCommands.ts +0 -138
- package/packages/dashboard/ui/react-components/hooks/useChannels.ts +0 -328
- package/packages/dashboard/ui/react-components/hooks/useDebounce.ts +0 -29
- package/packages/dashboard/ui/react-components/hooks/useDirectMessage.ts +0 -141
- package/packages/dashboard/ui/react-components/hooks/useMessages.ts +0 -309
- package/packages/dashboard/ui/react-components/hooks/useOrchestrator.ts +0 -364
- package/packages/dashboard/ui/react-components/hooks/usePinnedAgents.ts +0 -140
- package/packages/dashboard/ui/react-components/hooks/usePresence.ts +0 -340
- package/packages/dashboard/ui/react-components/hooks/useRecentRepos.ts +0 -130
- package/packages/dashboard/ui/react-components/hooks/useSession.ts +0 -209
- package/packages/dashboard/ui/react-components/hooks/useTrajectory.ts +0 -265
- package/packages/dashboard/ui/react-components/hooks/useWebSocket.ts +0 -169
- package/packages/dashboard/ui/react-components/hooks/useWorkspaceMembers.ts +0 -120
- package/packages/dashboard/ui/react-components/hooks/useWorkspaceRepos.ts +0 -73
- package/packages/dashboard/ui/react-components/hooks/useWorkspaceStatus.ts +0 -237
- package/packages/dashboard/ui/react-components/index.ts +0 -81
- package/packages/dashboard/ui/react-components/layout/Header.tsx +0 -355
- package/packages/dashboard/ui/react-components/layout/RepoContextHeader.tsx +0 -361
- package/packages/dashboard/ui/react-components/layout/Sidebar.archive.test.tsx +0 -126
- package/packages/dashboard/ui/react-components/layout/Sidebar.test.tsx +0 -691
- package/packages/dashboard/ui/react-components/layout/Sidebar.tsx +0 -930
- package/packages/dashboard/ui/react-components/layout/index.ts +0 -7
- package/packages/dashboard/ui/react-components/settings/BillingSettingsPanel.tsx +0 -564
- package/packages/dashboard/ui/react-components/settings/SettingsPage.tsx +0 -544
- package/packages/dashboard/ui/react-components/settings/TeamSettingsPanel.tsx +0 -560
- package/packages/dashboard/ui/react-components/settings/WorkspaceSettingsPanel.tsx +0 -1386
- package/packages/dashboard/ui/react-components/settings/index.ts +0 -11
- package/packages/dashboard/ui/react-components/settings/types.ts +0 -53
- package/packages/dashboard/ui/react-components/utils/messageFormatting.tsx +0 -370
- package/packages/dashboard/ui/tailwind.config.js +0 -148
- package/packages/dashboard/ui/types/index.ts +0 -304
- package/packages/dashboard/ui/types/threading.ts +0 -7
- package/packages/dashboard/ui-dist/404.html +0 -1
- package/packages/dashboard/ui-dist/_next/static/91mkGYq3qbG8WHE6VytQ8/_buildManifest.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/91mkGYq3qbG8WHE6VytQ8/_ssgManifest.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/T2rV14eEU5OweDeV29SvG/_buildManifest.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/T2rV14eEU5OweDeV29SvG/_ssgManifest.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/116-a883fca163f3a5bc.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/117-c8afed19e821a35d.js +0 -2
- package/packages/dashboard/ui-dist/_next/static/chunks/282-980c2eb8fff20123.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/320-a6304232cd0ee2ce.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/532-bace199897eeab37.js +0 -9
- package/packages/dashboard/ui-dist/_next/static/chunks/631-16b905e5920f9b59.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/648-acb2ff9f77cbfbd3.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/766-2aea80818f7eb0d8.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/83-26d2bde54616ee90.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/847-f1f467060f32afff.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/891-5cb1513eeb97a891.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/_not-found/page-60501fddbafba9dc.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/app/onboarding/page-9914652442f7e4fb.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/app/page-366fb7c078d4e9e0.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/cloud/link/page-fa1d5842aa90e8a6.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/complete-profile/page-dd64bbdf66b639cd.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/connect-repos/page-113060009ef35bc2.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/history/page-9965d2483011b846.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/layout-6b91e33784c20610.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/login/page-435eceb0073be027.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/metrics/page-1e37ef8e73940b40.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/page-8119d4246743574e.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/pricing/page-9db3ebdfa567a7c9.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/providers/page-ecb16ffd3b36262b.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/providers/setup/[provider]/page-4dbe33f0f7691b7c.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/signup/page-c7a0a28341365ae0.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/e868780c-48e5f147c90a3a41.js +0 -18
- package/packages/dashboard/ui-dist/_next/static/chunks/fd9d1056-609918ca7b6280bb.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/framework-f66176bb897dc684.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/main-311c3db74dcfadb7.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/main-app-fdbeb09028f57c9f.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/pages/_app-72b849fbd24ac258.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/pages/_error-7ba65e1336b92748.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/css/4034f236dd1a3178.css +0 -1
- package/packages/dashboard/ui-dist/_next/static/css/6892f8422896ef7a.css +0 -1
- package/packages/dashboard/ui-dist/_next/static/l8L2OscDSR2vsMIlWcC48/_buildManifest.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/l8L2OscDSR2vsMIlWcC48/_ssgManifest.js +0 -1
- package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-128.png +0 -0
- package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-256.png +0 -0
- package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-32.png +0 -0
- package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-512.png +0 -0
- package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-64.png +0 -0
- package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo.svg +0 -45
- package/packages/dashboard/ui-dist/alt-logos/logo.svg +0 -38
- package/packages/dashboard/ui-dist/alt-logos/monogram-logo-128.png +0 -0
- package/packages/dashboard/ui-dist/alt-logos/monogram-logo-256.png +0 -0
- package/packages/dashboard/ui-dist/alt-logos/monogram-logo-32.png +0 -0
- package/packages/dashboard/ui-dist/alt-logos/monogram-logo-512.png +0 -0
- package/packages/dashboard/ui-dist/alt-logos/monogram-logo-64.png +0 -0
- package/packages/dashboard/ui-dist/alt-logos/monogram-logo.svg +0 -38
- package/packages/dashboard/ui-dist/app/onboarding.html +0 -1
- package/packages/dashboard/ui-dist/app/onboarding.txt +0 -7
- package/packages/dashboard/ui-dist/app.html +0 -1
- package/packages/dashboard/ui-dist/app.txt +0 -7
- package/packages/dashboard/ui-dist/apple-icon.png +0 -0
- package/packages/dashboard/ui-dist/cloud/link.html +0 -1
- package/packages/dashboard/ui-dist/cloud/link.txt +0 -7
- package/packages/dashboard/ui-dist/complete-profile.html +0 -5
- package/packages/dashboard/ui-dist/complete-profile.txt +0 -7
- package/packages/dashboard/ui-dist/connect-repos.html +0 -1
- package/packages/dashboard/ui-dist/connect-repos.txt +0 -7
- package/packages/dashboard/ui-dist/history.html +0 -1
- package/packages/dashboard/ui-dist/history.txt +0 -7
- package/packages/dashboard/ui-dist/index.html +0 -1
- package/packages/dashboard/ui-dist/index.txt +0 -7
- package/packages/dashboard/ui-dist/login.html +0 -5
- package/packages/dashboard/ui-dist/login.txt +0 -7
- package/packages/dashboard/ui-dist/metrics.html +0 -1
- package/packages/dashboard/ui-dist/metrics.txt +0 -7
- package/packages/dashboard/ui-dist/pricing.html +0 -13
- package/packages/dashboard/ui-dist/pricing.txt +0 -7
- package/packages/dashboard/ui-dist/providers/setup/claude.html +0 -1
- package/packages/dashboard/ui-dist/providers/setup/claude.txt +0 -8
- package/packages/dashboard/ui-dist/providers/setup/codex.html +0 -1
- package/packages/dashboard/ui-dist/providers/setup/codex.txt +0 -8
- package/packages/dashboard/ui-dist/providers/setup/cursor.html +0 -1
- package/packages/dashboard/ui-dist/providers/setup/cursor.txt +0 -8
- package/packages/dashboard/ui-dist/providers.html +0 -1
- package/packages/dashboard/ui-dist/providers.txt +0 -7
- package/packages/dashboard/ui-dist/signup.html +0 -6
- package/packages/dashboard/ui-dist/signup.txt +0 -7
- package/packages/dashboard-server/dist/health-worker-manager.d.ts +0 -62
- package/packages/dashboard-server/dist/health-worker-manager.js +0 -144
- package/packages/dashboard-server/dist/health-worker.d.ts +0 -9
- package/packages/dashboard-server/dist/health-worker.js +0 -79
- package/packages/dashboard-server/dist/index.d.ts +0 -18
- package/packages/dashboard-server/dist/index.js +0 -17
- package/packages/dashboard-server/dist/metrics.d.ts +0 -105
- package/packages/dashboard-server/dist/metrics.js +0 -193
- package/packages/dashboard-server/dist/needs-attention.d.ts +0 -24
- package/packages/dashboard-server/dist/needs-attention.js +0 -78
- package/packages/dashboard-server/dist/server.d.ts +0 -25
- package/packages/dashboard-server/dist/server.js +0 -5158
- package/packages/dashboard-server/dist/start.d.ts +0 -6
- package/packages/dashboard-server/dist/start.js +0 -13
- package/packages/dashboard-server/dist/types/threading.d.ts +0 -8
- package/packages/dashboard-server/dist/types/threading.js +0 -2
- package/packages/dashboard-server/dist/user-bridge.d.ts +0 -158
- package/packages/dashboard-server/dist/user-bridge.js +0 -390
- package/packages/dashboard-server/package.json +0 -55
- package/scripts/run-migrations.js +0 -43
- package/scripts/setup-stripe-products.ts +0 -312
- package/scripts/verify-schema.js +0 -134
|
@@ -1,269 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Git Gateway API Routes
|
|
3
|
-
*
|
|
4
|
-
* Provides fresh GitHub tokens to workspace containers for git operations.
|
|
5
|
-
* This gateway pattern ensures tokens are always valid (Nango handles refresh).
|
|
6
|
-
*/
|
|
7
|
-
import crypto from 'crypto';
|
|
8
|
-
import { Router } from 'express';
|
|
9
|
-
import { db } from '../db/index.js';
|
|
10
|
-
import { nangoService } from '../services/nango.js';
|
|
11
|
-
import { getConfig } from '../config.js';
|
|
12
|
-
export const gitRouter = Router();
|
|
13
|
-
/**
|
|
14
|
-
* Generate expected workspace token using HMAC
|
|
15
|
-
*/
|
|
16
|
-
function generateExpectedToken(workspaceId) {
|
|
17
|
-
const config = getConfig();
|
|
18
|
-
return crypto
|
|
19
|
-
.createHmac('sha256', config.sessionSecret)
|
|
20
|
-
.update(`workspace:${workspaceId}`)
|
|
21
|
-
.digest('hex');
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Verify workspace access token
|
|
25
|
-
* Workspaces authenticate with a secret passed at provisioning time
|
|
26
|
-
*
|
|
27
|
-
* Returns:
|
|
28
|
-
* - { valid: true } if token matches
|
|
29
|
-
* - { valid: false, reason: string } if token is invalid or missing
|
|
30
|
-
*/
|
|
31
|
-
function verifyWorkspaceToken(req, workspaceId) {
|
|
32
|
-
const authHeader = req.get('authorization');
|
|
33
|
-
if (!authHeader) {
|
|
34
|
-
return { valid: false, reason: 'No Authorization header. WORKSPACE_TOKEN may not be set in the container.' };
|
|
35
|
-
}
|
|
36
|
-
if (!authHeader.startsWith('Bearer ')) {
|
|
37
|
-
return { valid: false, reason: 'Invalid Authorization header format. Expected: Bearer <token>' };
|
|
38
|
-
}
|
|
39
|
-
const providedToken = authHeader.slice(7);
|
|
40
|
-
if (!providedToken) {
|
|
41
|
-
return { valid: false, reason: 'Empty bearer token provided.' };
|
|
42
|
-
}
|
|
43
|
-
const expectedToken = generateExpectedToken(workspaceId);
|
|
44
|
-
// Use timing-safe comparison to prevent timing attacks
|
|
45
|
-
try {
|
|
46
|
-
const isValid = crypto.timingSafeEqual(Buffer.from(providedToken), Buffer.from(expectedToken));
|
|
47
|
-
if (!isValid) {
|
|
48
|
-
return { valid: false, reason: 'Token mismatch. Workspace may need reprovisioning or SESSION_SECRET changed.' };
|
|
49
|
-
}
|
|
50
|
-
return { valid: true };
|
|
51
|
-
}
|
|
52
|
-
catch {
|
|
53
|
-
return { valid: false, reason: 'Token comparison failed (length mismatch). Workspace may need reprovisioning.' };
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* GET /api/git/token
|
|
58
|
-
* Get a fresh GitHub token for git operations
|
|
59
|
-
*
|
|
60
|
-
* Query params:
|
|
61
|
-
* - workspaceId: The workspace requesting the token
|
|
62
|
-
*
|
|
63
|
-
* Returns: { token: string, expiresAt?: string }
|
|
64
|
-
*
|
|
65
|
-
* This endpoint is called by the git credential helper in workspace containers.
|
|
66
|
-
* It fetches a fresh GitHub App installation token via Nango.
|
|
67
|
-
*/
|
|
68
|
-
gitRouter.get('/token', async (req, res) => {
|
|
69
|
-
const { workspaceId } = req.query;
|
|
70
|
-
if (!workspaceId || typeof workspaceId !== 'string') {
|
|
71
|
-
return res.status(400).json({ error: 'workspaceId is required' });
|
|
72
|
-
}
|
|
73
|
-
// Verify the request is from a valid workspace
|
|
74
|
-
const tokenVerification = verifyWorkspaceToken(req, workspaceId);
|
|
75
|
-
if (!tokenVerification.valid) {
|
|
76
|
-
console.warn(`[git] Token verification failed for workspace ${workspaceId.substring(0, 8)}: ${tokenVerification.reason}`);
|
|
77
|
-
return res.status(401).json({
|
|
78
|
-
error: 'Invalid workspace token',
|
|
79
|
-
code: 'INVALID_WORKSPACE_TOKEN',
|
|
80
|
-
hint: tokenVerification.reason,
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
try {
|
|
84
|
-
// Get workspace to find the user
|
|
85
|
-
const workspace = await db.workspaces.findById(workspaceId);
|
|
86
|
-
if (!workspace) {
|
|
87
|
-
console.warn(`[git] Workspace not found: ${workspaceId}`);
|
|
88
|
-
return res.status(404).json({
|
|
89
|
-
error: 'Workspace not found',
|
|
90
|
-
code: 'WORKSPACE_NOT_FOUND',
|
|
91
|
-
hint: 'The workspace may have been deleted. Try reprovisioning.',
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
const userId = workspace.userId;
|
|
95
|
-
console.log(`[git] Token request for workspace ${workspaceId.substring(0, 8)}, user ${userId.substring(0, 8)}`);
|
|
96
|
-
// Find a repository with a Nango connection for this user
|
|
97
|
-
const repos = await db.repositories.findByUserId(userId);
|
|
98
|
-
const repoWithConnection = repos.find(r => r.nangoConnectionId);
|
|
99
|
-
if (!repoWithConnection?.nangoConnectionId) {
|
|
100
|
-
console.warn(`[git] No Nango connection found for user ${userId.substring(0, 8)}. Repos: ${repos.length}, with connections: ${repos.filter(r => r.nangoConnectionId).length}`);
|
|
101
|
-
return res.status(404).json({
|
|
102
|
-
error: 'No GitHub App connection found',
|
|
103
|
-
code: 'NO_GITHUB_APP_CONNECTION',
|
|
104
|
-
hint: 'Install the GitHub App on your repositories at https://github.com/apps/agent-relay',
|
|
105
|
-
repoCount: repos.length,
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
console.log(`[git] Fetching token from Nango for connection ${repoWithConnection.nangoConnectionId.substring(0, 8)}...`);
|
|
109
|
-
// Get fresh tokens from Nango (auto-refreshes if needed)
|
|
110
|
-
// - installationToken: for git operations (clone, push, pull)
|
|
111
|
-
// - userToken: for gh CLI operations (requires user context)
|
|
112
|
-
let installationToken;
|
|
113
|
-
try {
|
|
114
|
-
installationToken = await nangoService.getGithubAppToken(repoWithConnection.nangoConnectionId);
|
|
115
|
-
}
|
|
116
|
-
catch (nangoError) {
|
|
117
|
-
const errorMessage = nangoError instanceof Error ? nangoError.message : 'Unknown error';
|
|
118
|
-
console.error(`[git] Nango token fetch failed for connection ${repoWithConnection.nangoConnectionId}:`, errorMessage);
|
|
119
|
-
// Provide specific hints based on error type
|
|
120
|
-
if (errorMessage.includes('not found') || errorMessage.includes('404')) {
|
|
121
|
-
return res.status(500).json({
|
|
122
|
-
error: 'GitHub App connection expired or revoked',
|
|
123
|
-
code: 'NANGO_CONNECTION_EXPIRED',
|
|
124
|
-
hint: 'Reconnect your GitHub App at https://github.com/apps/agent-relay',
|
|
125
|
-
details: errorMessage,
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
return res.status(500).json({
|
|
129
|
-
error: 'Failed to fetch GitHub token from Nango',
|
|
130
|
-
code: 'NANGO_TOKEN_FETCH_FAILED',
|
|
131
|
-
hint: 'This may be a temporary issue. Try again in a few seconds.',
|
|
132
|
-
details: errorMessage,
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
// Try to get user OAuth token from github-app-oauth connection_config first
|
|
136
|
-
// Fall back to separate 'github' user connection if available
|
|
137
|
-
let userToken = null;
|
|
138
|
-
try {
|
|
139
|
-
userToken = await nangoService.getGithubUserOAuthToken(repoWithConnection.nangoConnectionId);
|
|
140
|
-
}
|
|
141
|
-
catch {
|
|
142
|
-
// Try the separate github user connection if available
|
|
143
|
-
const userRepo = repos.find(r => r.nangoConnectionId && r.nangoConnectionId !== repoWithConnection.nangoConnectionId);
|
|
144
|
-
if (userRepo?.nangoConnectionId) {
|
|
145
|
-
try {
|
|
146
|
-
userToken = await nangoService.getGithubUserToken(userRepo.nangoConnectionId);
|
|
147
|
-
}
|
|
148
|
-
catch {
|
|
149
|
-
console.log('[git] No github user token available');
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
// GitHub App installation tokens expire after 1 hour
|
|
154
|
-
const expiresAt = new Date(Date.now() + 55 * 60 * 1000).toISOString(); // 55 min buffer
|
|
155
|
-
// Prefer userToken for git operations - installation tokens (ghs_*) are API-only
|
|
156
|
-
// and don't work with git credential helpers. User OAuth tokens work for both
|
|
157
|
-
// git operations (clone, push, pull) AND gh CLI commands.
|
|
158
|
-
const primaryToken = userToken || installationToken;
|
|
159
|
-
const tokenType = userToken ? 'user' : 'installation';
|
|
160
|
-
console.log(`[git] Token fetched successfully for workspace ${workspaceId.substring(0, 8)} (type: ${tokenType})`);
|
|
161
|
-
res.json({
|
|
162
|
-
token: primaryToken, // Primary token for git/gh operations (prefer user token)
|
|
163
|
-
userToken, // Explicit user token field (may be null)
|
|
164
|
-
installationToken, // GitHub App installation token for API operations
|
|
165
|
-
expiresAt,
|
|
166
|
-
username: 'x-access-token', // Works with both token types
|
|
167
|
-
tokenType, // 'user' or 'installation' - helps clients know what they got
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
catch (error) {
|
|
171
|
-
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
172
|
-
console.error('[git] Unexpected error getting token:', error);
|
|
173
|
-
res.status(500).json({
|
|
174
|
-
error: 'Failed to get GitHub token',
|
|
175
|
-
code: 'UNEXPECTED_ERROR',
|
|
176
|
-
details: errorMessage,
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
});
|
|
180
|
-
/**
|
|
181
|
-
* POST /api/git/token
|
|
182
|
-
* Same as GET but accepts body params (for compatibility with some git credential helpers)
|
|
183
|
-
*/
|
|
184
|
-
gitRouter.post('/token', async (req, res) => {
|
|
185
|
-
const workspaceId = req.body.workspaceId || req.query.workspaceId;
|
|
186
|
-
if (!workspaceId || typeof workspaceId !== 'string') {
|
|
187
|
-
return res.status(400).json({ error: 'workspaceId is required' });
|
|
188
|
-
}
|
|
189
|
-
const tokenVerification = verifyWorkspaceToken(req, workspaceId);
|
|
190
|
-
if (!tokenVerification.valid) {
|
|
191
|
-
console.warn(`[git] POST: Token verification failed for workspace ${workspaceId.substring(0, 8)}: ${tokenVerification.reason}`);
|
|
192
|
-
return res.status(401).json({
|
|
193
|
-
error: 'Invalid workspace token',
|
|
194
|
-
code: 'INVALID_WORKSPACE_TOKEN',
|
|
195
|
-
hint: tokenVerification.reason,
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
try {
|
|
199
|
-
const workspace = await db.workspaces.findById(workspaceId);
|
|
200
|
-
if (!workspace) {
|
|
201
|
-
console.warn(`[git] POST: Workspace not found: ${workspaceId}`);
|
|
202
|
-
return res.status(404).json({
|
|
203
|
-
error: 'Workspace not found',
|
|
204
|
-
code: 'WORKSPACE_NOT_FOUND',
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
const repos = await db.repositories.findByUserId(workspace.userId);
|
|
208
|
-
const repoWithConnection = repos.find(r => r.nangoConnectionId);
|
|
209
|
-
if (!repoWithConnection?.nangoConnectionId) {
|
|
210
|
-
console.warn(`[git] POST: No Nango connection for user ${workspace.userId.substring(0, 8)}`);
|
|
211
|
-
return res.status(404).json({
|
|
212
|
-
error: 'No GitHub App connection found',
|
|
213
|
-
code: 'NO_GITHUB_APP_CONNECTION',
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
let installationToken;
|
|
217
|
-
try {
|
|
218
|
-
installationToken = await nangoService.getGithubAppToken(repoWithConnection.nangoConnectionId);
|
|
219
|
-
}
|
|
220
|
-
catch (nangoError) {
|
|
221
|
-
const errorMessage = nangoError instanceof Error ? nangoError.message : 'Unknown error';
|
|
222
|
-
console.error(`[git] POST: Nango token fetch failed:`, errorMessage);
|
|
223
|
-
return res.status(500).json({
|
|
224
|
-
error: 'Failed to fetch GitHub token',
|
|
225
|
-
code: 'NANGO_TOKEN_FETCH_FAILED',
|
|
226
|
-
details: errorMessage,
|
|
227
|
-
});
|
|
228
|
-
}
|
|
229
|
-
// Try to get user OAuth token (preferred for git operations)
|
|
230
|
-
let userToken = null;
|
|
231
|
-
try {
|
|
232
|
-
userToken = await nangoService.getGithubUserOAuthToken(repoWithConnection.nangoConnectionId);
|
|
233
|
-
}
|
|
234
|
-
catch {
|
|
235
|
-
// Try the separate github user connection if available
|
|
236
|
-
const userRepo = repos.find(r => r.nangoConnectionId && r.nangoConnectionId !== repoWithConnection.nangoConnectionId);
|
|
237
|
-
if (userRepo?.nangoConnectionId) {
|
|
238
|
-
try {
|
|
239
|
-
userToken = await nangoService.getGithubUserToken(userRepo.nangoConnectionId);
|
|
240
|
-
}
|
|
241
|
-
catch {
|
|
242
|
-
console.log('[git] POST: No github user token available');
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
const expiresAt = new Date(Date.now() + 55 * 60 * 1000).toISOString();
|
|
247
|
-
// Prefer userToken for git operations
|
|
248
|
-
const primaryToken = userToken || installationToken;
|
|
249
|
-
const tokenType = userToken ? 'user' : 'installation';
|
|
250
|
-
res.json({
|
|
251
|
-
token: primaryToken,
|
|
252
|
-
userToken,
|
|
253
|
-
installationToken,
|
|
254
|
-
expiresAt,
|
|
255
|
-
username: 'x-access-token',
|
|
256
|
-
tokenType,
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
catch (error) {
|
|
260
|
-
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
261
|
-
console.error('[git] POST: Unexpected error:', error);
|
|
262
|
-
res.status(500).json({
|
|
263
|
-
error: 'Failed to get GitHub token',
|
|
264
|
-
code: 'UNEXPECTED_ERROR',
|
|
265
|
-
details: errorMessage,
|
|
266
|
-
});
|
|
267
|
-
}
|
|
268
|
-
});
|
|
269
|
-
//# sourceMappingURL=git.js.map
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GitHub App API Routes
|
|
3
|
-
*
|
|
4
|
-
* Repo operations via Nango's github-app-oauth connection:
|
|
5
|
-
* - Get clone token for repositories
|
|
6
|
-
* - Create issues, PRs, and comments
|
|
7
|
-
*
|
|
8
|
-
* Auth flow is handled by nango-auth.ts
|
|
9
|
-
*/
|
|
10
|
-
export declare const githubAppRouter: import("express-serve-static-core").Router;
|
|
11
|
-
//# sourceMappingURL=github-app.d.ts.map
|
|
@@ -1,223 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GitHub App API Routes
|
|
3
|
-
*
|
|
4
|
-
* Repo operations via Nango's github-app-oauth connection:
|
|
5
|
-
* - Get clone token for repositories
|
|
6
|
-
* - Create issues, PRs, and comments
|
|
7
|
-
*
|
|
8
|
-
* Auth flow is handled by nango-auth.ts
|
|
9
|
-
*/
|
|
10
|
-
import { Router } from 'express';
|
|
11
|
-
import { requireAuth } from './auth.js';
|
|
12
|
-
import { db } from '../db/index.js';
|
|
13
|
-
import { nangoService, NANGO_INTEGRATIONS } from '../services/nango.js';
|
|
14
|
-
export const githubAppRouter = Router();
|
|
15
|
-
// All routes require authentication
|
|
16
|
-
githubAppRouter.use(requireAuth);
|
|
17
|
-
/**
|
|
18
|
-
* GET /api/github-app/status
|
|
19
|
-
* Check if Nango GitHub App OAuth is configured
|
|
20
|
-
*/
|
|
21
|
-
githubAppRouter.get('/status', (_req, res) => {
|
|
22
|
-
res.json({
|
|
23
|
-
configured: true,
|
|
24
|
-
integrations: NANGO_INTEGRATIONS,
|
|
25
|
-
connectUrl: '/connect-repos',
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
/**
|
|
29
|
-
* GET /api/github-app/repos
|
|
30
|
-
* List repositories the user has access to
|
|
31
|
-
*
|
|
32
|
-
* First tries database (populated by GitHub App OAuth).
|
|
33
|
-
* If empty, queries GitHub directly via user OAuth connection.
|
|
34
|
-
*/
|
|
35
|
-
githubAppRouter.get('/repos', async (req, res) => {
|
|
36
|
-
const userId = req.session.userId;
|
|
37
|
-
try {
|
|
38
|
-
// Try database first (from GitHub App OAuth flow)
|
|
39
|
-
const dbRepos = await db.repositories.findByUserId(userId);
|
|
40
|
-
if (dbRepos.length > 0) {
|
|
41
|
-
// Return repos from database
|
|
42
|
-
return res.json({
|
|
43
|
-
repositories: dbRepos.map((r) => ({
|
|
44
|
-
id: r.id,
|
|
45
|
-
fullName: r.githubFullName,
|
|
46
|
-
isPrivate: r.isPrivate,
|
|
47
|
-
defaultBranch: r.defaultBranch,
|
|
48
|
-
syncStatus: r.syncStatus,
|
|
49
|
-
hasNangoConnection: !!r.nangoConnectionId,
|
|
50
|
-
lastSyncedAt: r.lastSyncedAt,
|
|
51
|
-
})),
|
|
52
|
-
source: 'database',
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
// Database empty - query GitHub directly via user OAuth
|
|
56
|
-
const user = await db.users.findById(userId);
|
|
57
|
-
if (!user?.nangoConnectionId) {
|
|
58
|
-
return res.json({
|
|
59
|
-
repositories: [],
|
|
60
|
-
source: 'none',
|
|
61
|
-
hint: 'User not connected to GitHub',
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
console.log(`[github-app/repos] Database empty, querying GitHub for user ${user.githubUsername}`);
|
|
65
|
-
const { repositories } = await nangoService.listUserAccessibleRepos(user.nangoConnectionId, {
|
|
66
|
-
perPage: 100,
|
|
67
|
-
type: 'all',
|
|
68
|
-
});
|
|
69
|
-
res.json({
|
|
70
|
-
repositories: repositories.map((r) => ({
|
|
71
|
-
id: null, // No database ID yet
|
|
72
|
-
fullName: r.fullName,
|
|
73
|
-
isPrivate: r.isPrivate,
|
|
74
|
-
defaultBranch: r.defaultBranch,
|
|
75
|
-
syncStatus: 'live', // Queried from GitHub, not cached
|
|
76
|
-
hasNangoConnection: true,
|
|
77
|
-
lastSyncedAt: null,
|
|
78
|
-
})),
|
|
79
|
-
source: 'github-api',
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
catch (error) {
|
|
83
|
-
console.error('Error listing repos:', error);
|
|
84
|
-
res.status(500).json({ error: 'Failed to list repositories' });
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
/**
|
|
88
|
-
* GET /api/github-app/clone-token
|
|
89
|
-
* Get a clone token for a repository
|
|
90
|
-
* Used by workspace provisioner to clone private repos
|
|
91
|
-
*/
|
|
92
|
-
githubAppRouter.get('/clone-token', async (req, res) => {
|
|
93
|
-
const userId = req.session.userId;
|
|
94
|
-
const { repo } = req.query;
|
|
95
|
-
if (!repo || typeof repo !== 'string') {
|
|
96
|
-
return res.status(400).json({ error: 'Repository name is required (owner/repo)' });
|
|
97
|
-
}
|
|
98
|
-
try {
|
|
99
|
-
// Find the repository in our database
|
|
100
|
-
const userRepos = await db.repositories.findByUserId(userId);
|
|
101
|
-
const repository = userRepos.find((r) => r.githubFullName === repo);
|
|
102
|
-
if (!repository) {
|
|
103
|
-
return res.status(404).json({ error: 'Repository not found' });
|
|
104
|
-
}
|
|
105
|
-
if (!repository.nangoConnectionId) {
|
|
106
|
-
return res.status(400).json({
|
|
107
|
-
error: 'Repository not connected via Nango',
|
|
108
|
-
hint: 'Connect your GitHub repos through the Nango flow first',
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
// Get token from Nango connection
|
|
112
|
-
const token = await nangoService.getGithubAppToken(repository.nangoConnectionId);
|
|
113
|
-
const cloneUrl = `https://x-access-token:${token}@github.com/${repo}.git`;
|
|
114
|
-
res.json({
|
|
115
|
-
token,
|
|
116
|
-
cloneUrl,
|
|
117
|
-
expiresIn: '1 hour',
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
catch (error) {
|
|
121
|
-
console.error('Error getting clone token:', error);
|
|
122
|
-
res.status(500).json({ error: 'Failed to get clone token' });
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
/**
|
|
126
|
-
* POST /api/github-app/repos/:id/issues
|
|
127
|
-
* Create an issue on a repository
|
|
128
|
-
*/
|
|
129
|
-
githubAppRouter.post('/repos/:id/issues', async (req, res) => {
|
|
130
|
-
const userId = req.session.userId;
|
|
131
|
-
const id = req.params.id;
|
|
132
|
-
const { title, body, labels } = req.body;
|
|
133
|
-
if (!title || typeof title !== 'string') {
|
|
134
|
-
return res.status(400).json({ error: 'Issue title is required' });
|
|
135
|
-
}
|
|
136
|
-
try {
|
|
137
|
-
// Find the repository
|
|
138
|
-
const repository = await db.repositories.findById(id);
|
|
139
|
-
if (!repository || repository.userId !== userId) {
|
|
140
|
-
return res.status(404).json({ error: 'Repository not found' });
|
|
141
|
-
}
|
|
142
|
-
if (!repository.nangoConnectionId) {
|
|
143
|
-
return res.status(400).json({ error: 'Repository not connected via Nango' });
|
|
144
|
-
}
|
|
145
|
-
// Create issue via Nango Proxy (handles token injection automatically)
|
|
146
|
-
const [owner, repo] = repository.githubFullName.split('/');
|
|
147
|
-
const issue = await nangoService.createGithubIssue(repository.nangoConnectionId, owner, repo, { title, body: body || '', labels });
|
|
148
|
-
res.json({
|
|
149
|
-
number: issue.number,
|
|
150
|
-
url: issue.html_url,
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
catch (error) {
|
|
154
|
-
console.error('Error creating issue:', error);
|
|
155
|
-
res.status(500).json({ error: 'Failed to create issue' });
|
|
156
|
-
}
|
|
157
|
-
});
|
|
158
|
-
/**
|
|
159
|
-
* POST /api/github-app/repos/:id/pulls
|
|
160
|
-
* Create a pull request on a repository
|
|
161
|
-
*/
|
|
162
|
-
githubAppRouter.post('/repos/:id/pulls', async (req, res) => {
|
|
163
|
-
const userId = req.session.userId;
|
|
164
|
-
const id = req.params.id;
|
|
165
|
-
const { title, body, head, base } = req.body;
|
|
166
|
-
if (!title || !head || !base) {
|
|
167
|
-
return res.status(400).json({ error: 'title, head, and base are required' });
|
|
168
|
-
}
|
|
169
|
-
try {
|
|
170
|
-
// Find the repository
|
|
171
|
-
const repository = await db.repositories.findById(id);
|
|
172
|
-
if (!repository || repository.userId !== userId) {
|
|
173
|
-
return res.status(404).json({ error: 'Repository not found' });
|
|
174
|
-
}
|
|
175
|
-
if (!repository.nangoConnectionId) {
|
|
176
|
-
return res.status(400).json({ error: 'Repository not connected via Nango' });
|
|
177
|
-
}
|
|
178
|
-
// Create PR via Nango Proxy (handles token injection automatically)
|
|
179
|
-
const [owner, repo] = repository.githubFullName.split('/');
|
|
180
|
-
const pr = await nangoService.createGithubPullRequest(repository.nangoConnectionId, owner, repo, { title, body: body || '', head, base });
|
|
181
|
-
res.json({
|
|
182
|
-
number: pr.number,
|
|
183
|
-
url: pr.html_url,
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
catch (error) {
|
|
187
|
-
console.error('Error creating PR:', error);
|
|
188
|
-
res.status(500).json({ error: 'Failed to create pull request' });
|
|
189
|
-
}
|
|
190
|
-
});
|
|
191
|
-
/**
|
|
192
|
-
* POST /api/github-app/repos/:id/comments
|
|
193
|
-
* Add a comment to an issue or PR
|
|
194
|
-
*/
|
|
195
|
-
githubAppRouter.post('/repos/:id/comments', async (req, res) => {
|
|
196
|
-
const userId = req.session.userId;
|
|
197
|
-
const id = req.params.id;
|
|
198
|
-
const { issueNumber, body } = req.body;
|
|
199
|
-
if (!issueNumber || !body) {
|
|
200
|
-
return res.status(400).json({ error: 'issueNumber and body are required' });
|
|
201
|
-
}
|
|
202
|
-
try {
|
|
203
|
-
const repository = await db.repositories.findById(id);
|
|
204
|
-
if (!repository || repository.userId !== userId) {
|
|
205
|
-
return res.status(404).json({ error: 'Repository not found' });
|
|
206
|
-
}
|
|
207
|
-
if (!repository.nangoConnectionId) {
|
|
208
|
-
return res.status(400).json({ error: 'Repository not connected via Nango' });
|
|
209
|
-
}
|
|
210
|
-
// Add comment via Nango Proxy (handles token injection automatically)
|
|
211
|
-
const [owner, repo] = repository.githubFullName.split('/');
|
|
212
|
-
const comment = await nangoService.addGithubIssueComment(repository.nangoConnectionId, owner, repo, issueNumber, body);
|
|
213
|
-
res.json({
|
|
214
|
-
id: comment.id,
|
|
215
|
-
url: comment.html_url,
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
catch (error) {
|
|
219
|
-
console.error('Error adding comment:', error);
|
|
220
|
-
res.status(500).json({ error: 'Failed to add comment' });
|
|
221
|
-
}
|
|
222
|
-
});
|
|
223
|
-
//# sourceMappingURL=github-app.js.map
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Plan Limits Middleware
|
|
3
|
-
*
|
|
4
|
-
* Express middleware to enforce plan-based resource limits.
|
|
5
|
-
*/
|
|
6
|
-
import { Request, Response, NextFunction } from 'express';
|
|
7
|
-
/**
|
|
8
|
-
* Middleware to check workspace creation limit
|
|
9
|
-
*
|
|
10
|
-
* Use this middleware on workspace creation endpoints.
|
|
11
|
-
* Requires userId in session (use after requireAuth).
|
|
12
|
-
*/
|
|
13
|
-
export declare function checkWorkspaceLimit(req: Request, res: Response, next: NextFunction): Promise<void>;
|
|
14
|
-
/**
|
|
15
|
-
* Middleware to check repository limit
|
|
16
|
-
*
|
|
17
|
-
* Use this middleware on repo connection endpoints.
|
|
18
|
-
* Requires userId in session (use after requireAuth).
|
|
19
|
-
*/
|
|
20
|
-
export declare function checkRepoLimit(req: Request, res: Response, next: NextFunction): Promise<void>;
|
|
21
|
-
/**
|
|
22
|
-
* Middleware to check concurrent agent limit
|
|
23
|
-
*
|
|
24
|
-
* Use this middleware on agent spawn endpoints.
|
|
25
|
-
* Requires userId in session (use after requireAuth).
|
|
26
|
-
* Optionally pass currentRunningAgents in request body for accurate count.
|
|
27
|
-
*/
|
|
28
|
-
export declare function checkAgentLimit(req: Request, res: Response, next: NextFunction): Promise<void>;
|
|
29
|
-
/**
|
|
30
|
-
* Middleware to check coordinator access
|
|
31
|
-
*
|
|
32
|
-
* Use this middleware on coordinator-related endpoints.
|
|
33
|
-
* Coordinators are only available on Pro plan and above.
|
|
34
|
-
*/
|
|
35
|
-
export declare function checkCoordinatorAccess(req: Request, res: Response, next: NextFunction): Promise<void>;
|
|
36
|
-
/**
|
|
37
|
-
* Middleware to check session persistence access
|
|
38
|
-
*
|
|
39
|
-
* Use this middleware on endpoints that enable cloud session persistence.
|
|
40
|
-
* Session persistence is only available on Pro plan and above.
|
|
41
|
-
*/
|
|
42
|
-
export declare function checkSessionPersistenceAccess(req: Request, res: Response, next: NextFunction): Promise<void>;
|
|
43
|
-
//# sourceMappingURL=planLimits.d.ts.map
|