agent-relay 1.0.22 → 1.2.0
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/README.md +1 -1
- package/dist/bridge/shadow-cli.d.ts +17 -0
- package/dist/bridge/shadow-cli.d.ts.map +1 -0
- package/dist/bridge/shadow-cli.js +75 -0
- package/dist/bridge/shadow-cli.js.map +1 -0
- package/dist/bridge/shadow-config.d.ts +87 -0
- package/dist/bridge/shadow-config.d.ts.map +1 -0
- package/dist/bridge/shadow-config.js +134 -0
- package/dist/bridge/shadow-config.js.map +1 -0
- package/dist/bridge/spawner.d.ts +68 -1
- package/dist/bridge/spawner.d.ts.map +1 -1
- package/dist/bridge/spawner.js +360 -16
- package/dist/bridge/spawner.js.map +1 -1
- package/dist/bridge/types.d.ts +67 -0
- package/dist/bridge/types.d.ts.map +1 -1
- package/dist/cli/index.js +1196 -15
- package/dist/cli/index.js.map +1 -1
- package/dist/cloud/api/auth.d.ts +20 -0
- package/dist/cloud/api/auth.d.ts.map +1 -0
- package/dist/cloud/api/auth.js +128 -0
- package/dist/cloud/api/auth.js.map +1 -0
- package/dist/cloud/api/billing.d.ts +17 -0
- package/dist/cloud/api/billing.d.ts.map +1 -0
- package/dist/cloud/api/billing.js +353 -0
- package/dist/cloud/api/billing.js.map +1 -0
- package/dist/cloud/api/cli-pty-runner.d.ts +54 -0
- package/dist/cloud/api/cli-pty-runner.d.ts.map +1 -0
- package/dist/cloud/api/cli-pty-runner.js +119 -0
- package/dist/cloud/api/cli-pty-runner.js.map +1 -0
- package/dist/cloud/api/coordinators.d.ts +8 -0
- package/dist/cloud/api/coordinators.d.ts.map +1 -0
- package/dist/cloud/api/coordinators.js +347 -0
- package/dist/cloud/api/coordinators.js.map +1 -0
- package/dist/cloud/api/daemons.d.ts +12 -0
- package/dist/cloud/api/daemons.d.ts.map +1 -0
- package/dist/cloud/api/daemons.js +320 -0
- package/dist/cloud/api/daemons.js.map +1 -0
- package/dist/cloud/api/generic-webhooks.d.ts +8 -0
- package/dist/cloud/api/generic-webhooks.d.ts.map +1 -0
- package/dist/cloud/api/generic-webhooks.js +129 -0
- package/dist/cloud/api/generic-webhooks.js.map +1 -0
- package/dist/cloud/api/git.d.ts +8 -0
- package/dist/cloud/api/git.d.ts.map +1 -0
- package/dist/cloud/api/git.js +131 -0
- package/dist/cloud/api/git.js.map +1 -0
- package/dist/cloud/api/github-app.d.ts +11 -0
- package/dist/cloud/api/github-app.d.ts.map +1 -0
- package/dist/cloud/api/github-app.js +189 -0
- package/dist/cloud/api/github-app.js.map +1 -0
- package/dist/cloud/api/middleware/planLimits.d.ts +43 -0
- package/dist/cloud/api/middleware/planLimits.d.ts.map +1 -0
- package/dist/cloud/api/middleware/planLimits.js +202 -0
- package/dist/cloud/api/middleware/planLimits.js.map +1 -0
- package/dist/cloud/api/monitoring.d.ts +11 -0
- package/dist/cloud/api/monitoring.d.ts.map +1 -0
- package/dist/cloud/api/monitoring.js +578 -0
- package/dist/cloud/api/monitoring.js.map +1 -0
- package/dist/cloud/api/nango-auth.d.ts +9 -0
- package/dist/cloud/api/nango-auth.d.ts.map +1 -0
- package/dist/cloud/api/nango-auth.js +377 -0
- package/dist/cloud/api/nango-auth.js.map +1 -0
- package/dist/cloud/api/onboarding.d.ts +15 -0
- package/dist/cloud/api/onboarding.d.ts.map +1 -0
- package/dist/cloud/api/onboarding.js +588 -0
- package/dist/cloud/api/onboarding.js.map +1 -0
- package/dist/cloud/api/policy.d.ts +8 -0
- package/dist/cloud/api/policy.d.ts.map +1 -0
- package/dist/cloud/api/policy.js +229 -0
- package/dist/cloud/api/policy.js.map +1 -0
- package/dist/cloud/api/providers.d.ts +7 -0
- package/dist/cloud/api/providers.d.ts.map +1 -0
- package/dist/cloud/api/providers.js +507 -0
- package/dist/cloud/api/providers.js.map +1 -0
- package/dist/cloud/api/repos.d.ts +7 -0
- package/dist/cloud/api/repos.d.ts.map +1 -0
- package/dist/cloud/api/repos.js +314 -0
- package/dist/cloud/api/repos.js.map +1 -0
- package/dist/cloud/api/teams.d.ts +7 -0
- package/dist/cloud/api/teams.d.ts.map +1 -0
- package/dist/cloud/api/teams.js +279 -0
- package/dist/cloud/api/teams.js.map +1 -0
- package/dist/cloud/api/test-helpers.d.ts +10 -0
- package/dist/cloud/api/test-helpers.d.ts.map +1 -0
- package/dist/cloud/api/test-helpers.js +575 -0
- package/dist/cloud/api/test-helpers.js.map +1 -0
- package/dist/cloud/api/usage.d.ts +7 -0
- package/dist/cloud/api/usage.d.ts.map +1 -0
- package/dist/cloud/api/usage.js +98 -0
- package/dist/cloud/api/usage.js.map +1 -0
- package/dist/cloud/api/webhooks.d.ts +7 -0
- package/dist/cloud/api/webhooks.d.ts.map +1 -0
- package/dist/cloud/api/webhooks.js +496 -0
- package/dist/cloud/api/webhooks.js.map +1 -0
- package/dist/cloud/api/workspaces.d.ts +7 -0
- package/dist/cloud/api/workspaces.d.ts.map +1 -0
- package/dist/cloud/api/workspaces.js +727 -0
- package/dist/cloud/api/workspaces.js.map +1 -0
- package/dist/cloud/billing/index.d.ts +9 -0
- package/dist/cloud/billing/index.d.ts.map +1 -0
- package/dist/cloud/billing/index.js +9 -0
- package/dist/cloud/billing/index.js.map +1 -0
- package/dist/cloud/billing/plans.d.ts +39 -0
- package/dist/cloud/billing/plans.d.ts.map +1 -0
- package/dist/cloud/billing/plans.js +245 -0
- package/dist/cloud/billing/plans.js.map +1 -0
- package/dist/cloud/billing/service.d.ts +80 -0
- package/dist/cloud/billing/service.d.ts.map +1 -0
- package/dist/cloud/billing/service.js +388 -0
- package/dist/cloud/billing/service.js.map +1 -0
- package/dist/cloud/billing/types.d.ts +141 -0
- package/dist/cloud/billing/types.d.ts.map +1 -0
- package/dist/cloud/billing/types.js +7 -0
- package/dist/cloud/billing/types.js.map +1 -0
- package/dist/cloud/config.d.ts +66 -0
- package/dist/cloud/config.d.ts.map +1 -0
- package/dist/cloud/config.js +92 -0
- package/dist/cloud/config.js.map +1 -0
- package/dist/cloud/db/drizzle.d.ts +215 -0
- package/dist/cloud/db/drizzle.d.ts.map +1 -0
- package/dist/cloud/db/drizzle.js +1083 -0
- package/dist/cloud/db/drizzle.js.map +1 -0
- package/dist/cloud/db/index.d.ts +35 -0
- package/dist/cloud/db/index.d.ts.map +1 -0
- package/dist/cloud/db/index.js +52 -0
- package/dist/cloud/db/index.js.map +1 -0
- package/dist/cloud/db/schema.d.ts +4519 -0
- package/dist/cloud/db/schema.d.ts.map +1 -0
- package/dist/cloud/db/schema.js +547 -0
- package/dist/cloud/db/schema.js.map +1 -0
- package/dist/cloud/index.d.ts +12 -0
- package/dist/cloud/index.d.ts.map +1 -0
- package/dist/cloud/index.js +39 -0
- package/dist/cloud/index.js.map +1 -0
- package/dist/cloud/provisioner/index.d.ts +75 -0
- package/dist/cloud/provisioner/index.d.ts.map +1 -0
- package/dist/cloud/provisioner/index.js +977 -0
- package/dist/cloud/provisioner/index.js.map +1 -0
- package/dist/cloud/server.d.ts +17 -0
- package/dist/cloud/server.d.ts.map +1 -0
- package/dist/cloud/server.js +534 -0
- package/dist/cloud/server.js.map +1 -0
- package/dist/cloud/services/auto-scaler.d.ts +152 -0
- package/dist/cloud/services/auto-scaler.d.ts.map +1 -0
- package/dist/cloud/services/auto-scaler.js +439 -0
- package/dist/cloud/services/auto-scaler.js.map +1 -0
- package/dist/cloud/services/capacity-manager.d.ts +148 -0
- package/dist/cloud/services/capacity-manager.d.ts.map +1 -0
- package/dist/cloud/services/capacity-manager.js +449 -0
- package/dist/cloud/services/capacity-manager.js.map +1 -0
- package/dist/cloud/services/ci-agent-spawner.d.ts +49 -0
- package/dist/cloud/services/ci-agent-spawner.d.ts.map +1 -0
- package/dist/cloud/services/ci-agent-spawner.js +373 -0
- package/dist/cloud/services/ci-agent-spawner.js.map +1 -0
- package/dist/cloud/services/coordinator.d.ts +62 -0
- package/dist/cloud/services/coordinator.d.ts.map +1 -0
- package/dist/cloud/services/coordinator.js +389 -0
- package/dist/cloud/services/coordinator.js.map +1 -0
- package/dist/cloud/services/index.d.ts +12 -0
- package/dist/cloud/services/index.d.ts.map +1 -0
- package/dist/cloud/services/index.js +15 -0
- package/dist/cloud/services/index.js.map +1 -0
- package/dist/cloud/services/mention-handler.d.ts +65 -0
- package/dist/cloud/services/mention-handler.d.ts.map +1 -0
- package/dist/cloud/services/mention-handler.js +405 -0
- package/dist/cloud/services/mention-handler.js.map +1 -0
- package/dist/cloud/services/nango.d.ts +126 -0
- package/dist/cloud/services/nango.d.ts.map +1 -0
- package/dist/cloud/services/nango.js +191 -0
- package/dist/cloud/services/nango.js.map +1 -0
- package/dist/cloud/services/persistence.d.ts +131 -0
- package/dist/cloud/services/persistence.d.ts.map +1 -0
- package/dist/cloud/services/persistence.js +200 -0
- package/dist/cloud/services/persistence.js.map +1 -0
- package/dist/cloud/services/planLimits.d.ts +125 -0
- package/dist/cloud/services/planLimits.d.ts.map +1 -0
- package/dist/cloud/services/planLimits.js +282 -0
- package/dist/cloud/services/planLimits.js.map +1 -0
- package/dist/cloud/services/scaling-orchestrator.d.ts +159 -0
- package/dist/cloud/services/scaling-orchestrator.d.ts.map +1 -0
- package/dist/cloud/services/scaling-orchestrator.js +502 -0
- package/dist/cloud/services/scaling-orchestrator.js.map +1 -0
- package/dist/cloud/services/scaling-policy.d.ts +121 -0
- package/dist/cloud/services/scaling-policy.d.ts.map +1 -0
- package/dist/cloud/services/scaling-policy.js +415 -0
- package/dist/cloud/services/scaling-policy.js.map +1 -0
- package/dist/cloud/vault/index.d.ts +76 -0
- package/dist/cloud/vault/index.d.ts.map +1 -0
- package/dist/cloud/vault/index.js +219 -0
- package/dist/cloud/vault/index.js.map +1 -0
- package/dist/cloud/webhooks/index.d.ts +24 -0
- package/dist/cloud/webhooks/index.d.ts.map +1 -0
- package/dist/cloud/webhooks/index.js +29 -0
- package/dist/cloud/webhooks/index.js.map +1 -0
- package/dist/cloud/webhooks/parsers/github.d.ts +8 -0
- package/dist/cloud/webhooks/parsers/github.d.ts.map +1 -0
- package/dist/cloud/webhooks/parsers/github.js +234 -0
- package/dist/cloud/webhooks/parsers/github.js.map +1 -0
- package/dist/cloud/webhooks/parsers/index.d.ts +23 -0
- package/dist/cloud/webhooks/parsers/index.d.ts.map +1 -0
- package/dist/cloud/webhooks/parsers/index.js +30 -0
- package/dist/cloud/webhooks/parsers/index.js.map +1 -0
- package/dist/cloud/webhooks/parsers/linear.d.ts +9 -0
- package/dist/cloud/webhooks/parsers/linear.d.ts.map +1 -0
- package/dist/cloud/webhooks/parsers/linear.js +258 -0
- package/dist/cloud/webhooks/parsers/linear.js.map +1 -0
- package/dist/cloud/webhooks/parsers/slack.d.ts +9 -0
- package/dist/cloud/webhooks/parsers/slack.d.ts.map +1 -0
- package/dist/cloud/webhooks/parsers/slack.js +214 -0
- package/dist/cloud/webhooks/parsers/slack.js.map +1 -0
- package/dist/cloud/webhooks/responders/github.d.ts +8 -0
- package/dist/cloud/webhooks/responders/github.d.ts.map +1 -0
- package/dist/cloud/webhooks/responders/github.js +73 -0
- package/dist/cloud/webhooks/responders/github.js.map +1 -0
- package/dist/cloud/webhooks/responders/index.d.ts +23 -0
- package/dist/cloud/webhooks/responders/index.d.ts.map +1 -0
- package/dist/cloud/webhooks/responders/index.js +30 -0
- package/dist/cloud/webhooks/responders/index.js.map +1 -0
- package/dist/cloud/webhooks/responders/linear.d.ts +9 -0
- package/dist/cloud/webhooks/responders/linear.d.ts.map +1 -0
- package/dist/cloud/webhooks/responders/linear.js +149 -0
- package/dist/cloud/webhooks/responders/linear.js.map +1 -0
- package/dist/cloud/webhooks/responders/slack.d.ts +20 -0
- package/dist/cloud/webhooks/responders/slack.d.ts.map +1 -0
- package/dist/cloud/webhooks/responders/slack.js +178 -0
- package/dist/cloud/webhooks/responders/slack.js.map +1 -0
- package/dist/cloud/webhooks/router.d.ts +25 -0
- package/dist/cloud/webhooks/router.d.ts.map +1 -0
- package/dist/cloud/webhooks/router.js +504 -0
- package/dist/cloud/webhooks/router.js.map +1 -0
- package/dist/cloud/webhooks/rules-engine.d.ts +24 -0
- package/dist/cloud/webhooks/rules-engine.d.ts.map +1 -0
- package/dist/cloud/webhooks/rules-engine.js +287 -0
- package/dist/cloud/webhooks/rules-engine.js.map +1 -0
- package/dist/cloud/webhooks/types.d.ts +186 -0
- package/dist/cloud/webhooks/types.d.ts.map +1 -0
- package/dist/cloud/webhooks/types.js +8 -0
- package/dist/cloud/webhooks/types.js.map +1 -0
- package/dist/continuity/formatter.d.ts +51 -0
- package/dist/continuity/formatter.d.ts.map +1 -0
- package/dist/continuity/formatter.js +313 -0
- package/dist/continuity/formatter.js.map +1 -0
- package/dist/continuity/handoff-store.d.ts +67 -0
- package/dist/continuity/handoff-store.d.ts.map +1 -0
- package/dist/continuity/handoff-store.js +472 -0
- package/dist/continuity/handoff-store.js.map +1 -0
- package/dist/continuity/index.d.ts +45 -0
- package/dist/continuity/index.d.ts.map +1 -0
- package/dist/continuity/index.js +48 -0
- package/dist/continuity/index.js.map +1 -0
- package/dist/continuity/ledger-store.d.ts +110 -0
- package/dist/continuity/ledger-store.d.ts.map +1 -0
- package/dist/continuity/ledger-store.js +500 -0
- package/dist/continuity/ledger-store.js.map +1 -0
- package/dist/continuity/manager.d.ts +178 -0
- package/dist/continuity/manager.d.ts.map +1 -0
- package/dist/continuity/manager.js +562 -0
- package/dist/continuity/manager.js.map +1 -0
- package/dist/continuity/parser.d.ts +76 -0
- package/dist/continuity/parser.d.ts.map +1 -0
- package/dist/continuity/parser.js +579 -0
- package/dist/continuity/parser.js.map +1 -0
- package/dist/continuity/types.d.ts +180 -0
- package/dist/continuity/types.d.ts.map +1 -0
- package/dist/continuity/types.js +9 -0
- package/dist/continuity/types.js.map +1 -0
- package/dist/daemon/agent-manager.d.ts +114 -0
- package/dist/daemon/agent-manager.d.ts.map +1 -0
- package/dist/daemon/agent-manager.js +513 -0
- package/dist/daemon/agent-manager.js.map +1 -0
- package/dist/daemon/agent-registry.d.ts +34 -0
- package/dist/daemon/agent-registry.d.ts.map +1 -1
- package/dist/daemon/agent-registry.js +45 -2
- package/dist/daemon/agent-registry.js.map +1 -1
- package/dist/daemon/api.d.ts +81 -0
- package/dist/daemon/api.d.ts.map +1 -0
- package/dist/daemon/api.js +554 -0
- package/dist/daemon/api.js.map +1 -0
- package/dist/daemon/cli-auth.d.ts +67 -0
- package/dist/daemon/cli-auth.d.ts.map +1 -0
- package/dist/daemon/cli-auth.js +537 -0
- package/dist/daemon/cli-auth.js.map +1 -0
- package/dist/daemon/cloud-sync.d.ts +101 -0
- package/dist/daemon/cloud-sync.d.ts.map +1 -0
- package/dist/daemon/cloud-sync.js +263 -0
- package/dist/daemon/cloud-sync.js.map +1 -0
- package/dist/daemon/index.d.ts +4 -0
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +6 -0
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/orchestrator.d.ts +155 -0
- package/dist/daemon/orchestrator.d.ts.map +1 -0
- package/dist/daemon/orchestrator.js +766 -0
- package/dist/daemon/orchestrator.js.map +1 -0
- package/dist/daemon/router.d.ts +29 -0
- package/dist/daemon/router.d.ts.map +1 -1
- package/dist/daemon/router.js +143 -21
- package/dist/daemon/router.js.map +1 -1
- package/dist/daemon/server.d.ts +42 -0
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +199 -16
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/services/browser-testing.d.ts +88 -0
- package/dist/daemon/services/browser-testing.d.ts.map +1 -0
- package/dist/daemon/services/browser-testing.js +244 -0
- package/dist/daemon/services/browser-testing.js.map +1 -0
- package/dist/daemon/services/container-spawner.d.ts +135 -0
- package/dist/daemon/services/container-spawner.d.ts.map +1 -0
- package/dist/daemon/services/container-spawner.js +313 -0
- package/dist/daemon/services/container-spawner.js.map +1 -0
- package/dist/daemon/types.d.ts +131 -0
- package/dist/daemon/types.d.ts.map +1 -0
- package/dist/daemon/types.js +6 -0
- package/dist/daemon/types.js.map +1 -0
- package/dist/daemon/workspace-manager.d.ts +75 -0
- package/dist/daemon/workspace-manager.d.ts.map +1 -0
- package/dist/daemon/workspace-manager.js +289 -0
- package/dist/daemon/workspace-manager.js.map +1 -0
- package/dist/dashboard/out/404.html +1 -1
- package/dist/dashboard/out/_next/static/chunks/116-2502180def231162.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/282-980c2eb8fff20123.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/480-2d4111711d4e473c.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/724-73c1ee5f60abe860.js +9 -0
- package/dist/dashboard/out/_next/static/chunks/766-c3a14283c88d815b.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/app/page-7120be68bea622f3.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/connect-repos/page-dc2e3a1a22478efc.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/history/page-56a8b4616a90dc43.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/layout-2433bb48965f4333.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/login/page-3eac37ea6f5dd153.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/metrics/page-1081dd190a331a91.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/page-daf87e86f783f980.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/pricing/page-4d72d5a5d8a9b618.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/providers/page-b68a681526eb145e.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/signup/page-fee4ed1709070bcd.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/e868780c-48e5f147c90a3a41.js +18 -0
- package/dist/dashboard/out/_next/static/chunks/{main-e0a1f53fe0617a63.js → main-97850e03d723ea8c.js} +1 -1
- package/dist/dashboard/out/_next/static/chunks/main-app-5d692157a8eb1fd9.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +1 -0
- package/dist/dashboard/out/_next/static/css/29852f26181969a0.css +1 -0
- package/dist/dashboard/out/_next/static/css/411ce23ffeae9f76.css +1 -0
- 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 +45 -0
- package/dist/dashboard/out/alt-logos/logo.svg +38 -0
- 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 +38 -0
- package/dist/dashboard/out/app.html +1 -0
- package/dist/dashboard/out/app.txt +7 -0
- package/dist/dashboard/out/connect-repos.html +1 -0
- package/dist/dashboard/out/connect-repos.txt +7 -0
- package/dist/dashboard/out/history.html +1 -0
- package/dist/dashboard/out/history.txt +7 -0
- package/dist/dashboard/out/index.html +1 -1
- package/dist/dashboard/out/index.txt +2 -2
- package/dist/dashboard/out/login.html +6 -0
- package/dist/dashboard/out/login.txt +7 -0
- package/dist/dashboard/out/metrics.html +1 -515
- package/dist/dashboard/out/metrics.txt +2 -2
- package/dist/dashboard/out/pricing.html +13 -0
- package/dist/dashboard/out/pricing.txt +7 -0
- package/dist/dashboard/out/providers.html +1 -0
- package/dist/dashboard/out/providers.txt +7 -0
- package/dist/dashboard/out/signup.html +6 -0
- package/dist/dashboard/out/signup.txt +7 -0
- package/dist/dashboard-server/metrics.d.ts.map +1 -1
- package/dist/dashboard-server/metrics.js +3 -2
- package/dist/dashboard-server/metrics.js.map +1 -1
- package/dist/dashboard-server/server.d.ts.map +1 -1
- package/dist/dashboard-server/server.js +2653 -130
- package/dist/dashboard-server/server.js.map +1 -1
- package/dist/hooks/emitter.d.ts +40 -0
- package/dist/hooks/emitter.d.ts.map +1 -0
- package/dist/hooks/emitter.js +63 -0
- package/dist/hooks/emitter.js.map +1 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +3 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/registry.d.ts +173 -0
- package/dist/hooks/registry.d.ts.map +1 -0
- package/dist/hooks/registry.js +476 -0
- package/dist/hooks/registry.js.map +1 -0
- package/dist/hooks/trajectory-hooks.d.ts +52 -0
- package/dist/hooks/trajectory-hooks.d.ts.map +1 -0
- package/dist/hooks/trajectory-hooks.js +183 -0
- package/dist/hooks/trajectory-hooks.js.map +1 -0
- package/dist/hooks/types.d.ts +141 -0
- package/dist/hooks/types.d.ts.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/memory/adapters/index.d.ts +8 -0
- package/dist/memory/adapters/index.d.ts.map +1 -0
- package/dist/memory/adapters/index.js +8 -0
- package/dist/memory/adapters/index.js.map +1 -0
- package/dist/memory/adapters/inmemory.d.ts +59 -0
- package/dist/memory/adapters/inmemory.d.ts.map +1 -0
- package/dist/memory/adapters/inmemory.js +195 -0
- package/dist/memory/adapters/inmemory.js.map +1 -0
- package/dist/memory/adapters/supermemory.d.ts +71 -0
- package/dist/memory/adapters/supermemory.d.ts.map +1 -0
- package/dist/memory/adapters/supermemory.js +338 -0
- package/dist/memory/adapters/supermemory.js.map +1 -0
- package/dist/memory/factory.d.ts +48 -0
- package/dist/memory/factory.d.ts.map +1 -0
- package/dist/memory/factory.js +143 -0
- package/dist/memory/factory.js.map +1 -0
- package/dist/memory/index.d.ts +32 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +32 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/memory-hooks.d.ts +60 -0
- package/dist/memory/memory-hooks.d.ts.map +1 -0
- package/dist/memory/memory-hooks.js +313 -0
- package/dist/memory/memory-hooks.js.map +1 -0
- package/dist/memory/service.d.ts +49 -0
- package/dist/memory/service.d.ts.map +1 -0
- package/dist/memory/service.js +146 -0
- package/dist/memory/service.js.map +1 -0
- package/dist/memory/types.d.ts +195 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +8 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/policy/agent-policy.d.ts +225 -0
- package/dist/policy/agent-policy.d.ts.map +1 -0
- package/dist/policy/agent-policy.js +665 -0
- package/dist/policy/agent-policy.js.map +1 -0
- package/dist/policy/cloud-policy-fetcher.d.ts +12 -0
- package/dist/policy/cloud-policy-fetcher.d.ts.map +1 -0
- package/dist/policy/cloud-policy-fetcher.js +64 -0
- package/dist/policy/cloud-policy-fetcher.js.map +1 -0
- package/dist/protocol/types.d.ts +10 -1
- package/dist/protocol/types.d.ts.map +1 -1
- package/dist/resiliency/context-persistence.d.ts +140 -0
- package/dist/resiliency/context-persistence.d.ts.map +1 -0
- package/dist/resiliency/context-persistence.js +397 -0
- package/dist/resiliency/context-persistence.js.map +1 -0
- package/dist/resiliency/crash-insights.d.ts +156 -0
- package/dist/resiliency/crash-insights.d.ts.map +1 -0
- package/dist/resiliency/crash-insights.js +492 -0
- package/dist/resiliency/crash-insights.js.map +1 -0
- package/dist/resiliency/gossip-health.d.ts +137 -0
- package/dist/resiliency/gossip-health.d.ts.map +1 -0
- package/dist/resiliency/gossip-health.js +241 -0
- package/dist/resiliency/gossip-health.js.map +1 -0
- package/dist/resiliency/health-monitor.d.ts +97 -0
- package/dist/resiliency/health-monitor.d.ts.map +1 -0
- package/dist/resiliency/health-monitor.js +291 -0
- package/dist/resiliency/health-monitor.js.map +1 -0
- package/dist/resiliency/index.d.ts +68 -0
- package/dist/resiliency/index.d.ts.map +1 -0
- package/dist/resiliency/index.js +68 -0
- package/dist/resiliency/index.js.map +1 -0
- package/dist/resiliency/leader-watchdog.d.ts +109 -0
- package/dist/resiliency/leader-watchdog.d.ts.map +1 -0
- package/dist/resiliency/leader-watchdog.js +189 -0
- package/dist/resiliency/leader-watchdog.js.map +1 -0
- package/dist/resiliency/logger.d.ts +114 -0
- package/dist/resiliency/logger.d.ts.map +1 -0
- package/dist/resiliency/logger.js +250 -0
- package/dist/resiliency/logger.js.map +1 -0
- package/dist/resiliency/memory-monitor.d.ts +172 -0
- package/dist/resiliency/memory-monitor.d.ts.map +1 -0
- package/dist/resiliency/memory-monitor.js +593 -0
- package/dist/resiliency/memory-monitor.js.map +1 -0
- package/dist/resiliency/metrics.d.ts +115 -0
- package/dist/resiliency/metrics.d.ts.map +1 -0
- package/dist/resiliency/metrics.js +239 -0
- package/dist/resiliency/metrics.js.map +1 -0
- package/dist/resiliency/provider-context.d.ts +100 -0
- package/dist/resiliency/provider-context.d.ts.map +1 -0
- package/dist/resiliency/provider-context.js +360 -0
- package/dist/resiliency/provider-context.js.map +1 -0
- package/dist/resiliency/stateless-lead.d.ts +149 -0
- package/dist/resiliency/stateless-lead.d.ts.map +1 -0
- package/dist/resiliency/stateless-lead.js +308 -0
- package/dist/resiliency/stateless-lead.js.map +1 -0
- package/dist/resiliency/supervisor.d.ts +147 -0
- package/dist/resiliency/supervisor.d.ts.map +1 -0
- package/dist/resiliency/supervisor.js +459 -0
- package/dist/resiliency/supervisor.js.map +1 -0
- package/dist/shared/cli-auth-config.d.ts +91 -0
- package/dist/shared/cli-auth-config.d.ts.map +1 -0
- package/dist/shared/cli-auth-config.js +264 -0
- package/dist/shared/cli-auth-config.js.map +1 -0
- package/dist/storage/adapter.d.ts +3 -1
- package/dist/storage/adapter.d.ts.map +1 -1
- package/dist/storage/adapter.js +12 -2
- package/dist/storage/adapter.js.map +1 -1
- package/dist/storage/sqlite-adapter.d.ts.map +1 -1
- package/dist/storage/sqlite-adapter.js +18 -14
- package/dist/storage/sqlite-adapter.js.map +1 -1
- package/dist/trajectory/config.d.ts +84 -0
- package/dist/trajectory/config.d.ts.map +1 -0
- package/dist/trajectory/config.js +163 -0
- package/dist/trajectory/config.js.map +1 -0
- package/dist/trajectory/index.d.ts +8 -0
- package/dist/trajectory/index.d.ts.map +1 -0
- package/dist/trajectory/index.js +8 -0
- package/dist/trajectory/index.js.map +1 -0
- package/dist/trajectory/integration.d.ts +292 -0
- package/dist/trajectory/integration.d.ts.map +1 -0
- package/dist/trajectory/integration.js +834 -0
- package/dist/trajectory/integration.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/logger.d.ts +40 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +84 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/project-namespace.d.ts +24 -0
- package/dist/utils/project-namespace.d.ts.map +1 -1
- package/dist/utils/project-namespace.js +84 -0
- package/dist/utils/project-namespace.js.map +1 -1
- package/dist/wrapper/client.d.ts +16 -1
- package/dist/wrapper/client.d.ts.map +1 -1
- package/dist/wrapper/client.js +32 -1
- package/dist/wrapper/client.js.map +1 -1
- package/dist/wrapper/parser.d.ts +13 -0
- package/dist/wrapper/parser.d.ts.map +1 -1
- package/dist/wrapper/parser.js +217 -47
- package/dist/wrapper/parser.js.map +1 -1
- package/dist/wrapper/pty-wrapper.d.ts +219 -17
- package/dist/wrapper/pty-wrapper.d.ts.map +1 -1
- package/dist/wrapper/pty-wrapper.js +1050 -104
- package/dist/wrapper/pty-wrapper.js.map +1 -1
- package/dist/wrapper/shared.d.ts +165 -0
- package/dist/wrapper/shared.d.ts.map +1 -0
- package/dist/wrapper/shared.js +270 -0
- package/dist/wrapper/shared.js.map +1 -0
- package/dist/wrapper/tmux-wrapper.d.ts +78 -11
- package/dist/wrapper/tmux-wrapper.d.ts.map +1 -1
- package/dist/wrapper/tmux-wrapper.js +567 -106
- package/dist/wrapper/tmux-wrapper.js.map +1 -1
- package/docs/CLOUD-ARCHITECTURE.md +804 -0
- package/docs/CLOUD-ONBOARDING-DESIGN.md +1983 -0
- package/docs/HOOKS_API.md +394 -0
- package/docs/WRAPPER_EVENTS.md +358 -0
- package/docs/agent-policy-snippet.md +40 -0
- package/docs/agent-relay-protocol.md +238 -0
- package/docs/agent-relay-snippet.md +115 -6
- package/docs/archive/EXECUTIVE_SUMMARY.md +358 -0
- package/docs/archive/ROADMAP.md +329 -0
- package/docs/archive/TESTING_PRESENCE_FEATURES.md +327 -0
- package/docs/competitive/GASTOWN.md +451 -0
- package/docs/{COMPETITIVE_ANALYSIS.md → competitive/OVERVIEW.md} +1 -0
- package/docs/competitive/README.md +34 -0
- package/docs/competitive/TMUX_ORCHESTRATOR.md +605 -0
- package/docs/dashboard.png +0 -0
- package/docs/design/ci-failure-webhooks.md +812 -0
- package/docs/design/comprehensive-integrations.md +238 -0
- package/docs/design/e2b-sandbox-integration.md +504 -0
- package/docs/design/github-app-permissions.md +264 -0
- package/docs/guides/CLOUD.md +236 -0
- package/docs/guides/LOCAL.md +535 -0
- package/docs/guides/SELF-HOSTED.md +494 -0
- package/docs/local-testing.md +428 -0
- package/docs/proposals/continuous-claude-integration.md +622 -0
- package/docs/proposals/custom-commands.md +368 -0
- package/docs/proposals/shadow-as-subagent.md +765 -0
- package/docs/proposals/slack-bot-integration.md +1457 -0
- package/docs/tasks/global-skills-system.tasks.md +230 -0
- package/docs/tasks/webhook-integrations.tasks.md +184 -0
- package/docs/tasks/workspace-capabilities.tasks.md +121 -0
- package/docs/testing/RESILIENCY-TEST-PLAN-2026-01-01.md +366 -0
- package/package.json +45 -7
- package/scripts/cloud-setup.sh +96 -0
- package/scripts/manual-qa.sh +293 -0
- package/scripts/postinstall.js +60 -0
- package/scripts/run-cloud-qa.sh +220 -0
- package/scripts/test-cli-auth/Dockerfile +44 -0
- package/scripts/test-cli-auth/Dockerfile.real +79 -0
- package/scripts/test-cli-auth/README.md +286 -0
- package/scripts/test-cli-auth/ci-test-real-clis.ts +251 -0
- package/scripts/test-cli-auth/ci-test-runner.ts +263 -0
- package/scripts/test-cli-auth/mock-cli.sh +147 -0
- package/scripts/test-cli-auth/package.json +14 -0
- package/scripts/test-cli-auth/test-oauth-flow.ts +220 -0
- package/scripts/test-pty-input-auto.js +222 -0
- package/scripts/test-pty-input.js +150 -0
- package/dist/dashboard/out/_next/static/chunks/app/layout-c9d8c5d95e48c6bf.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/metrics/page-8aa9936bc6c771ab.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/page-4498be09a5157759.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/main-app-bae2e535de00de50.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/webpack-c81f7fd28659d64f.js +0 -1
- package/dist/dashboard/out/_next/static/css/50ed6996e3df7bdd.css +0 -1
- /package/dist/dashboard/out/_next/static/{DXFA-jj8wb3PcY5DX2xcU → H5aWG0udPB4iOUIl_gytz}/_buildManifest.js +0 -0
- /package/dist/dashboard/out/_next/static/{DXFA-jj8wb3PcY5DX2xcU → H5aWG0udPB4iOUIl_gytz}/_ssgManifest.js +0 -0
- /package/dist/dashboard/out/_next/static/chunks/{117-3bef7b19f3e60751.js → 117-b100311aff8d5c61.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/{648-6cf686106c891ad3.js → 648-a13d3c2b1be45466.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/app/_not-found/{page-8ff6572bc7c9bc61.js → page-a4973f3e3c82fb67.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/{fd9d1056-26bd8d656b496dba.js → fd9d1056-bf46c09eb57e019c.js} +0 -0
- /package/docs/{CHANGELOG.md → archive/CHANGELOG.md} +0 -0
- /package/docs/{CLI-SIMPLIFICATION-COMPLETE.md → archive/CLI-SIMPLIFICATION-COMPLETE.md} +0 -0
- /package/docs/{DESIGN_BRIDGE_STAFFING.md → archive/DESIGN_BRIDGE_STAFFING.md} +0 -0
- /package/docs/{DESIGN_V2.md → archive/DESIGN_V2.md} +0 -0
- /package/docs/{MONETIZATION.md → archive/MONETIZATION.md} +0 -0
- /package/docs/{PROPOSAL-trajectories.md → archive/PROPOSAL-trajectories.md} +0 -0
- /package/docs/{SCALING_ANALYSIS.md → archive/SCALING_ANALYSIS.md} +0 -0
- /package/docs/{TMUX_IMPLEMENTATION_NOTES.md → archive/TMUX_IMPLEMENTATION_NOTES.md} +0 -0
- /package/docs/{TMUX_IMPROVEMENTS.md → archive/TMUX_IMPROVEMENTS.md} +0 -0
- /package/docs/{dashboard-v2-plan.md → archive/dashboard-v2-plan.md} +0 -0
- /package/docs/{removable-code-analysis.md → archive/removable-code-analysis.md} +0 -0
- /package/docs/{competitive-analysis-mcp-agent-mail.md → competitive/MCP_AGENT_MAIL.md} +0 -0
|
@@ -0,0 +1,804 @@
|
|
|
1
|
+
# Agent Relay Cloud - Architecture
|
|
2
|
+
|
|
3
|
+
## System Overview
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
┌─────────────────────────────────────────────────────────────────────────────────┐
|
|
7
|
+
│ AGENT RELAY CLOUD │
|
|
8
|
+
│ │
|
|
9
|
+
│ ┌─────────────────────────────────────────────────────────────────────────┐ │
|
|
10
|
+
│ │ CONTROL PLANE │ │
|
|
11
|
+
│ │ │ │
|
|
12
|
+
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
|
|
13
|
+
│ │ │ API │ │ Auth │ │Credential│ │Workspace │ │ Dashboard│ │ │
|
|
14
|
+
│ │ │ Server │ │ Service │ │ Vault │ │Provisioner│ │ (React) │ │ │
|
|
15
|
+
│ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │
|
|
16
|
+
│ │ │ │ │ │ │ │ │
|
|
17
|
+
│ │ └─────────────┴─────────────┴─────────────┴─────────────┘ │ │
|
|
18
|
+
│ │ │ │ │
|
|
19
|
+
│ │ ┌──────┴──────┐ │ │
|
|
20
|
+
│ │ │ PostgreSQL │ │ │
|
|
21
|
+
│ │ │ + Redis │ │ │
|
|
22
|
+
│ │ └─────────────┘ │ │
|
|
23
|
+
│ └─────────────────────────────────────────────────────────────────────────┘ │
|
|
24
|
+
│ │ │
|
|
25
|
+
│ │ Provision & Manage │
|
|
26
|
+
│ ▼ │
|
|
27
|
+
│ ┌─────────────────────────────────────────────────────────────────────────┐ │
|
|
28
|
+
│ │ COMPUTE PLANE │ │
|
|
29
|
+
│ │ │ │
|
|
30
|
+
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │
|
|
31
|
+
│ │ │ Workspace A │ │ Workspace B │ │ Workspace C │ ... │ │
|
|
32
|
+
│ │ │ (user-123) │ │ (user-456) │ │ (team-789) │ │ │
|
|
33
|
+
│ │ │ │ │ │ │ │ │ │
|
|
34
|
+
│ │ │ ┌───────────┐ │ │ ┌───────────┐ │ │ ┌───────────┐ │ │ │
|
|
35
|
+
│ │ │ │agent-relay│ │ │ │agent-relay│ │ │ │agent-relay│ │ │ │
|
|
36
|
+
│ │ │ │ daemon │ │ │ │ daemon │ │ │ │ daemon │ │ │ │
|
|
37
|
+
│ │ │ └─────┬─────┘ │ │ └─────┬─────┘ │ │ └─────┬─────┘ │ │ │
|
|
38
|
+
│ │ │ │ │ │ │ │ │ │ │ │ │
|
|
39
|
+
│ │ │ ┌─────┴─────┐ │ │ ┌─────┴─────┐ │ │ ┌─────┴─────┐ │ │ │
|
|
40
|
+
│ │ │ │ Agents │ │ │ │ Agents │ │ │ │ Agents │ │ │ │
|
|
41
|
+
│ │ │ │(claude, │ │ │ │(codex) │ │ │ │(claude, │ │ │ │
|
|
42
|
+
│ │ │ │ codex) │ │ │ │ │ │ │ │ gemini) │ │ │ │
|
|
43
|
+
│ │ │ └───────────┘ │ │ └───────────┘ │ │ └───────────┘ │ │ │
|
|
44
|
+
│ │ │ │ │ │ │ │ │ │
|
|
45
|
+
│ │ │ /repos/ │ │ /repos/ │ │ /repos/ │ │ │
|
|
46
|
+
│ │ │ ├─ project-a │ │ └─ my-app │ │ ├─ backend │ │ │
|
|
47
|
+
│ │ │ └─ project-b │ │ │ │ └─ frontend │ │ │
|
|
48
|
+
│ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │
|
|
49
|
+
│ │ │ │
|
|
50
|
+
│ │ Compute Options: Fly.io | Railway | AWS ECS | GCP Cloud Run │ │
|
|
51
|
+
│ └─────────────────────────────────────────────────────────────────────────┘ │
|
|
52
|
+
│ │
|
|
53
|
+
└─────────────────────────────────────────────────────────────────────────────────┘
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## One-Click Provisioning Flow
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
User signs up
|
|
60
|
+
│
|
|
61
|
+
▼
|
|
62
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
63
|
+
│ 1. AUTHENTICATE │
|
|
64
|
+
│ • GitHub OAuth login │
|
|
65
|
+
│ • Create user record │
|
|
66
|
+
│ • Store GitHub token │
|
|
67
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
68
|
+
│
|
|
69
|
+
▼
|
|
70
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
71
|
+
│ 2. CONNECT PROVIDERS │
|
|
72
|
+
│ • Device flow for Claude/Codex │
|
|
73
|
+
│ • Store tokens in credential vault │
|
|
74
|
+
│ • (Can be done during or after onboarding) │
|
|
75
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
76
|
+
│
|
|
77
|
+
▼
|
|
78
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
79
|
+
│ 3. SELECT REPOSITORIES │
|
|
80
|
+
│ • List repos from GitHub │
|
|
81
|
+
│ • User selects which to connect │
|
|
82
|
+
│ • Install GitHub App on selected repos │
|
|
83
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
84
|
+
│
|
|
85
|
+
▼
|
|
86
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
87
|
+
│ 4. PROVISION WORKSPACE (automatic, ~30 seconds) │
|
|
88
|
+
│ • Allocate compute resources │
|
|
89
|
+
│ • Deploy agent-relay container │
|
|
90
|
+
│ • Clone selected repositories │
|
|
91
|
+
│ • Inject credentials from vault │
|
|
92
|
+
│ • Start daemon with supervisor │
|
|
93
|
+
│ • Configure webhooks │
|
|
94
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
95
|
+
│
|
|
96
|
+
▼
|
|
97
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
98
|
+
│ 5. READY │
|
|
99
|
+
│ • Dashboard URL live │
|
|
100
|
+
│ • Agents ready to spawn │
|
|
101
|
+
│ • GitHub webhooks configured │
|
|
102
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Components
|
|
106
|
+
|
|
107
|
+
### 1. Control Plane Services
|
|
108
|
+
|
|
109
|
+
#### API Server (`/src/cloud/api/`)
|
|
110
|
+
- Express.js REST API
|
|
111
|
+
- Handles all cloud operations
|
|
112
|
+
- Routes:
|
|
113
|
+
- `/auth/*` - GitHub OAuth, session management
|
|
114
|
+
- `/providers/*` - Device flow auth for AI providers
|
|
115
|
+
- `/workspaces/*` - Workspace CRUD, provisioning
|
|
116
|
+
- `/repos/*` - Repository management
|
|
117
|
+
- `/teams/*` - Team management
|
|
118
|
+
|
|
119
|
+
#### Auth Service (`/src/cloud/auth/`)
|
|
120
|
+
- GitHub OAuth for user login
|
|
121
|
+
- Device flow for AI providers
|
|
122
|
+
- Session management (Redis)
|
|
123
|
+
- JWT tokens for API auth
|
|
124
|
+
|
|
125
|
+
#### Credential Vault (`/src/cloud/vault/`)
|
|
126
|
+
- Encrypted storage for OAuth tokens
|
|
127
|
+
- Per-user encryption keys
|
|
128
|
+
- Automatic token refresh
|
|
129
|
+
- Sync to workspaces
|
|
130
|
+
|
|
131
|
+
#### Workspace Provisioner (`/src/cloud/provisioner/`)
|
|
132
|
+
- Provisions compute resources
|
|
133
|
+
- Deploys agent-relay containers
|
|
134
|
+
- Manages workspace lifecycle
|
|
135
|
+
- Supports multiple backends:
|
|
136
|
+
- Fly.io (default)
|
|
137
|
+
- Railway
|
|
138
|
+
- AWS ECS
|
|
139
|
+
- Docker (local dev)
|
|
140
|
+
|
|
141
|
+
### 2. Compute Plane
|
|
142
|
+
|
|
143
|
+
#### Workspace Container
|
|
144
|
+
```dockerfile
|
|
145
|
+
FROM node:20-slim
|
|
146
|
+
|
|
147
|
+
# Install agent CLIs
|
|
148
|
+
RUN npm install -g agent-relay
|
|
149
|
+
RUN npm install -g @anthropic/claude-code
|
|
150
|
+
# Codex installed via their installer
|
|
151
|
+
|
|
152
|
+
# Workspace directory
|
|
153
|
+
WORKDIR /workspace
|
|
154
|
+
|
|
155
|
+
# Entry point
|
|
156
|
+
COPY entrypoint.sh /entrypoint.sh
|
|
157
|
+
CMD ["/entrypoint.sh"]
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
#### Entrypoint Script
|
|
161
|
+
```bash
|
|
162
|
+
#!/bin/bash
|
|
163
|
+
|
|
164
|
+
# Fetch credentials from vault
|
|
165
|
+
agent-relay cloud sync-credentials
|
|
166
|
+
|
|
167
|
+
# Clone repositories
|
|
168
|
+
for repo in $REPOS; do
|
|
169
|
+
git clone "https://x-access-token:${GITHUB_TOKEN}@github.com/${repo}.git"
|
|
170
|
+
done
|
|
171
|
+
|
|
172
|
+
# Start agent-relay daemon with supervisor
|
|
173
|
+
agent-relay up --watch
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
## Database Schema
|
|
177
|
+
|
|
178
|
+
```sql
|
|
179
|
+
-- Users
|
|
180
|
+
CREATE TABLE users (
|
|
181
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
182
|
+
github_id TEXT UNIQUE NOT NULL,
|
|
183
|
+
github_username TEXT NOT NULL,
|
|
184
|
+
email TEXT,
|
|
185
|
+
created_at TIMESTAMP DEFAULT NOW(),
|
|
186
|
+
onboarding_completed_at TIMESTAMP
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
-- Provider Credentials (encrypted)
|
|
190
|
+
CREATE TABLE credentials (
|
|
191
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
192
|
+
user_id UUID REFERENCES users(id),
|
|
193
|
+
provider TEXT NOT NULL, -- 'anthropic', 'openai', 'google', etc.
|
|
194
|
+
encrypted_access_token TEXT NOT NULL,
|
|
195
|
+
encrypted_refresh_token TEXT,
|
|
196
|
+
token_expires_at TIMESTAMP,
|
|
197
|
+
scopes TEXT[],
|
|
198
|
+
provider_account_id TEXT,
|
|
199
|
+
provider_account_email TEXT,
|
|
200
|
+
created_at TIMESTAMP DEFAULT NOW(),
|
|
201
|
+
last_refreshed_at TIMESTAMP,
|
|
202
|
+
UNIQUE(user_id, provider)
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
-- Workspaces
|
|
206
|
+
CREATE TABLE workspaces (
|
|
207
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
208
|
+
user_id UUID REFERENCES users(id),
|
|
209
|
+
name TEXT NOT NULL,
|
|
210
|
+
status TEXT DEFAULT 'provisioning', -- provisioning, running, stopped, failed
|
|
211
|
+
compute_provider TEXT NOT NULL, -- 'fly', 'railway', 'ecs'
|
|
212
|
+
compute_id TEXT, -- Provider-specific instance ID
|
|
213
|
+
public_url TEXT, -- Dashboard URL
|
|
214
|
+
internal_url TEXT, -- For API calls
|
|
215
|
+
created_at TIMESTAMP DEFAULT NOW(),
|
|
216
|
+
started_at TIMESTAMP,
|
|
217
|
+
stopped_at TIMESTAMP
|
|
218
|
+
);
|
|
219
|
+
|
|
220
|
+
-- Connected Repositories
|
|
221
|
+
CREATE TABLE repositories (
|
|
222
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
223
|
+
workspace_id UUID REFERENCES workspaces(id),
|
|
224
|
+
github_repo_id TEXT NOT NULL,
|
|
225
|
+
github_full_name TEXT NOT NULL, -- 'owner/repo'
|
|
226
|
+
default_branch TEXT DEFAULT 'main',
|
|
227
|
+
webhook_id TEXT,
|
|
228
|
+
last_synced_at TIMESTAMP,
|
|
229
|
+
created_at TIMESTAMP DEFAULT NOW()
|
|
230
|
+
);
|
|
231
|
+
|
|
232
|
+
-- Teams (for collaboration)
|
|
233
|
+
CREATE TABLE teams (
|
|
234
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
235
|
+
name TEXT NOT NULL,
|
|
236
|
+
owner_id UUID REFERENCES users(id),
|
|
237
|
+
created_at TIMESTAMP DEFAULT NOW()
|
|
238
|
+
);
|
|
239
|
+
|
|
240
|
+
CREATE TABLE team_members (
|
|
241
|
+
team_id UUID REFERENCES teams(id),
|
|
242
|
+
user_id UUID REFERENCES users(id),
|
|
243
|
+
role TEXT DEFAULT 'member', -- 'owner', 'admin', 'member'
|
|
244
|
+
PRIMARY KEY (team_id, user_id)
|
|
245
|
+
);
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
## API Endpoints
|
|
249
|
+
|
|
250
|
+
### Auth
|
|
251
|
+
```
|
|
252
|
+
POST /api/auth/github # Start GitHub OAuth
|
|
253
|
+
GET /api/auth/github/callback # OAuth callback
|
|
254
|
+
POST /api/auth/logout # Logout
|
|
255
|
+
GET /api/auth/me # Get current user
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### Providers
|
|
259
|
+
```
|
|
260
|
+
GET /api/providers # List providers + connection status
|
|
261
|
+
POST /api/providers/:provider/connect # Start device flow
|
|
262
|
+
GET /api/providers/:provider/status # Check device flow status
|
|
263
|
+
DELETE /api/providers/:provider # Disconnect provider
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### Workspaces
|
|
267
|
+
```
|
|
268
|
+
GET /api/workspaces # List user's workspaces
|
|
269
|
+
POST /api/workspaces # Create (provisions automatically)
|
|
270
|
+
GET /api/workspaces/:id # Get workspace details
|
|
271
|
+
DELETE /api/workspaces/:id # Delete workspace
|
|
272
|
+
POST /api/workspaces/:id/start # Start stopped workspace
|
|
273
|
+
POST /api/workspaces/:id/stop # Stop workspace
|
|
274
|
+
POST /api/workspaces/:id/restart # Restart workspace
|
|
275
|
+
GET /api/workspaces/:id/logs # Get logs (SSE stream)
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### Repositories
|
|
279
|
+
```
|
|
280
|
+
GET /api/repos/available # List GitHub repos user can add
|
|
281
|
+
POST /api/workspaces/:id/repos # Add repo to workspace
|
|
282
|
+
DELETE /api/workspaces/:id/repos/:repoId # Remove repo
|
|
283
|
+
POST /api/workspaces/:id/repos/:repoId/sync # Force sync
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### Agents
|
|
287
|
+
```
|
|
288
|
+
GET /api/workspaces/:id/agents # List agents in workspace
|
|
289
|
+
POST /api/workspaces/:id/agents # Spawn new agent
|
|
290
|
+
DELETE /api/workspaces/:id/agents/:name # Kill agent
|
|
291
|
+
POST /api/workspaces/:id/agents/:name/message # Send message to agent
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
## Workspace Provisioner Implementation
|
|
295
|
+
|
|
296
|
+
### Interface
|
|
297
|
+
```typescript
|
|
298
|
+
interface WorkspaceProvisioner {
|
|
299
|
+
provision(config: ProvisionConfig): Promise<Workspace>;
|
|
300
|
+
start(workspaceId: string): Promise<void>;
|
|
301
|
+
stop(workspaceId: string): Promise<void>;
|
|
302
|
+
destroy(workspaceId: string): Promise<void>;
|
|
303
|
+
getLogs(workspaceId: string): AsyncIterable<string>;
|
|
304
|
+
getStatus(workspaceId: string): Promise<WorkspaceStatus>;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
interface ProvisionConfig {
|
|
308
|
+
userId: string;
|
|
309
|
+
name: string;
|
|
310
|
+
repos: string[]; // ['owner/repo', ...]
|
|
311
|
+
providers: string[]; // ['anthropic', 'openai', ...]
|
|
312
|
+
resources?: {
|
|
313
|
+
cpu?: string; // '1' = 1 core
|
|
314
|
+
memory?: string; // '512Mi', '1Gi'
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### Fly.io Implementation
|
|
320
|
+
```typescript
|
|
321
|
+
class FlyProvisioner implements WorkspaceProvisioner {
|
|
322
|
+
async provision(config: ProvisionConfig): Promise<Workspace> {
|
|
323
|
+
// 1. Create Fly app
|
|
324
|
+
const app = await this.fly.createApp({
|
|
325
|
+
name: `relay-${config.userId.slice(0, 8)}`,
|
|
326
|
+
org: 'agent-relay-cloud'
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
// 2. Set secrets (credentials)
|
|
330
|
+
const credentials = await vault.getCredentials(config.userId, config.providers);
|
|
331
|
+
await this.fly.setSecrets(app.name, {
|
|
332
|
+
ANTHROPIC_AUTH_TOKEN: credentials.anthropic?.accessToken,
|
|
333
|
+
OPENAI_AUTH_TOKEN: credentials.openai?.accessToken,
|
|
334
|
+
GITHUB_TOKEN: await this.getGitHubToken(config.userId),
|
|
335
|
+
REPOS: config.repos.join(','),
|
|
336
|
+
CLOUD_API_URL: process.env.CLOUD_API_URL,
|
|
337
|
+
WORKSPACE_ID: app.name
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
// 3. Deploy container
|
|
341
|
+
await this.fly.deploy(app.name, {
|
|
342
|
+
image: 'ghcr.io/agent-relay/workspace:latest',
|
|
343
|
+
region: 'iad', // or user's preferred region
|
|
344
|
+
vm: {
|
|
345
|
+
cpus: 1,
|
|
346
|
+
memory: 512
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
// 4. Wait for healthy
|
|
351
|
+
await this.waitForHealthy(app.name);
|
|
352
|
+
|
|
353
|
+
return {
|
|
354
|
+
id: app.name,
|
|
355
|
+
publicUrl: `https://${app.name}.fly.dev`,
|
|
356
|
+
status: 'running'
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
## Directory Structure
|
|
363
|
+
|
|
364
|
+
```
|
|
365
|
+
src/cloud/
|
|
366
|
+
├── index.ts # Cloud service entry point
|
|
367
|
+
├── server.ts # Express server setup
|
|
368
|
+
├── config.ts # Configuration
|
|
369
|
+
│
|
|
370
|
+
├── api/ # API routes
|
|
371
|
+
│ ├── index.ts
|
|
372
|
+
│ ├── auth.ts # Auth routes
|
|
373
|
+
│ ├── providers.ts # Provider connection routes
|
|
374
|
+
│ ├── workspaces.ts # Workspace management
|
|
375
|
+
│ ├── repos.ts # Repository management
|
|
376
|
+
│ └── agents.ts # Agent management
|
|
377
|
+
│
|
|
378
|
+
├── auth/ # Auth services
|
|
379
|
+
│ ├── github.ts # GitHub OAuth
|
|
380
|
+
│ ├── device-flow.ts # Device flow for providers
|
|
381
|
+
│ └── session.ts # Session management
|
|
382
|
+
│
|
|
383
|
+
├── vault/ # Credential vault
|
|
384
|
+
│ ├── index.ts
|
|
385
|
+
│ ├── encryption.ts # AES-256-GCM encryption
|
|
386
|
+
│ └── refresh.ts # Token refresh service
|
|
387
|
+
│
|
|
388
|
+
├── provisioner/ # Workspace provisioning
|
|
389
|
+
│ ├── index.ts # Provisioner interface
|
|
390
|
+
│ ├── fly.ts # Fly.io implementation
|
|
391
|
+
│ ├── railway.ts # Railway implementation
|
|
392
|
+
│ ├── docker.ts # Local Docker (dev)
|
|
393
|
+
│ └── workspace-image/ # Container image
|
|
394
|
+
│ ├── Dockerfile
|
|
395
|
+
│ └── entrypoint.sh
|
|
396
|
+
│
|
|
397
|
+
├── db/ # Database
|
|
398
|
+
│ ├── index.ts # Connection
|
|
399
|
+
│ ├── schema.sql # Schema
|
|
400
|
+
│ └── migrations/ # Migrations
|
|
401
|
+
│
|
|
402
|
+
└── services/ # Business logic
|
|
403
|
+
├── users.ts
|
|
404
|
+
├── workspaces.ts
|
|
405
|
+
├── credentials.ts
|
|
406
|
+
└── github.ts
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
## Environment Variables
|
|
410
|
+
|
|
411
|
+
```bash
|
|
412
|
+
# Database
|
|
413
|
+
DATABASE_URL=postgres://user:pass@host:5432/agent_relay_cloud
|
|
414
|
+
REDIS_URL=redis://host:6379
|
|
415
|
+
|
|
416
|
+
# GitHub OAuth
|
|
417
|
+
GITHUB_CLIENT_ID=xxx
|
|
418
|
+
GITHUB_CLIENT_SECRET=xxx
|
|
419
|
+
GITHUB_APP_ID=xxx
|
|
420
|
+
GITHUB_APP_PRIVATE_KEY=xxx
|
|
421
|
+
|
|
422
|
+
# Provider OAuth (for device flow)
|
|
423
|
+
ANTHROPIC_CLIENT_ID=xxx
|
|
424
|
+
OPENAI_CLIENT_ID=xxx
|
|
425
|
+
GOOGLE_CLIENT_ID=xxx
|
|
426
|
+
|
|
427
|
+
# Encryption
|
|
428
|
+
VAULT_MASTER_KEY=xxx # 32 bytes, base64
|
|
429
|
+
|
|
430
|
+
# Compute provider
|
|
431
|
+
COMPUTE_PROVIDER=fly # fly, railway, docker
|
|
432
|
+
FLY_API_TOKEN=xxx
|
|
433
|
+
FLY_ORG=agent-relay-cloud
|
|
434
|
+
|
|
435
|
+
# Server
|
|
436
|
+
PORT=3000
|
|
437
|
+
PUBLIC_URL=https://relay.cloud
|
|
438
|
+
SESSION_SECRET=xxx
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
## Security
|
|
442
|
+
|
|
443
|
+
### Credential Vault Encryption
|
|
444
|
+
- AES-256-GCM for token encryption
|
|
445
|
+
- Per-user keys derived from master key + user ID
|
|
446
|
+
- Tokens never stored in plaintext
|
|
447
|
+
- Encryption keys never leave control plane
|
|
448
|
+
|
|
449
|
+
### Workspace Isolation
|
|
450
|
+
- Each workspace runs in isolated container
|
|
451
|
+
- No shared filesystem between workspaces
|
|
452
|
+
- Network isolation (workspaces can't talk to each other)
|
|
453
|
+
- Credentials injected as environment variables (encrypted in transit)
|
|
454
|
+
|
|
455
|
+
### API Security
|
|
456
|
+
- All API calls require authentication
|
|
457
|
+
- CSRF protection on mutations
|
|
458
|
+
- Rate limiting per user
|
|
459
|
+
- Audit logging for sensitive operations
|
|
460
|
+
|
|
461
|
+
## Scaling
|
|
462
|
+
|
|
463
|
+
### Control Plane
|
|
464
|
+
- Stateless API servers behind load balancer
|
|
465
|
+
- PostgreSQL with read replicas
|
|
466
|
+
- Redis cluster for sessions/caching
|
|
467
|
+
|
|
468
|
+
### Compute Plane
|
|
469
|
+
- Workspaces scale independently
|
|
470
|
+
- Auto-sleep inactive workspaces (cost optimization)
|
|
471
|
+
- Wake on webhook or API call
|
|
472
|
+
- Regional deployment for latency
|
|
473
|
+
|
|
474
|
+
## Auto-Scaling Infrastructure
|
|
475
|
+
|
|
476
|
+
The auto-scaling system automatically adjusts workspace resources based on agent activity and resource utilization.
|
|
477
|
+
|
|
478
|
+
### Architecture
|
|
479
|
+
|
|
480
|
+
```
|
|
481
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
482
|
+
│ AUTO-SCALING SYSTEM │
|
|
483
|
+
│ │
|
|
484
|
+
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
|
485
|
+
│ │ Memory │───▶│ Scaling │───▶│ Auto │ │
|
|
486
|
+
│ │ Monitor │ │ Policy │ │ Scaler │ │
|
|
487
|
+
│ │ (per agent) │ │ Service │ │ (leader) │ │
|
|
488
|
+
│ └──────────────┘ └──────────────┘ └──────┬───────┘ │
|
|
489
|
+
│ │ │
|
|
490
|
+
│ Redis Pub/Sub │
|
|
491
|
+
│ │ │
|
|
492
|
+
│ ┌──────────────┐ ┌──────────────┐ ┌──────┴───────┐ │
|
|
493
|
+
│ │ Capacity │◀───│ Scaling │◀───│ Workspace │ │
|
|
494
|
+
│ │ Manager │ │ Orchestrator │ │ Provisioner │ │
|
|
495
|
+
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
|
496
|
+
│ │
|
|
497
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
### Components
|
|
501
|
+
|
|
502
|
+
#### 1. Scaling Policy Service (`/src/cloud/services/scaling-policy.ts`)
|
|
503
|
+
Defines when to scale based on metrics:
|
|
504
|
+
|
|
505
|
+
| Policy | Priority | Trigger | Action |
|
|
506
|
+
|--------|----------|---------|--------|
|
|
507
|
+
| agent-limit-increase | 150 | 85% agent capacity (single workspace) | Increase max agents |
|
|
508
|
+
| workspace-resize-up | 140 | 75% memory for 2min (single workspace) | Resize to next tier |
|
|
509
|
+
| cpu-pressure-resize | 135 | 85% CPU for 3min | Resize workspace |
|
|
510
|
+
| memory-pressure-scale-up | 100 | 80% memory for 1min | Add workspace |
|
|
511
|
+
| agent-count-scale-up | 80 | 90% agent capacity | Add workspace |
|
|
512
|
+
| low-usage-scale-down | 50 | Under 20% for 10min | Remove workspace |
|
|
513
|
+
| workspace-resize-down | 45 | Under 15% memory/CPU for 15min | Reduce tier |
|
|
514
|
+
|
|
515
|
+
**Scaling Priority**: In-workspace (vertical) scaling is preferred over adding workspaces (horizontal) since it's more efficient.
|
|
516
|
+
|
|
517
|
+
#### 2. Auto-Scaler (`/src/cloud/services/auto-scaler.ts`)
|
|
518
|
+
Coordinates scaling decisions across multiple servers:
|
|
519
|
+
- Leader election via Redis (only one server evaluates)
|
|
520
|
+
- Distributed locking prevents concurrent scaling
|
|
521
|
+
- Cooldown periods prevent thrashing
|
|
522
|
+
- Publishes decisions via Redis pub/sub
|
|
523
|
+
|
|
524
|
+
#### 3. Capacity Manager (`/src/cloud/services/capacity-manager.ts`)
|
|
525
|
+
Tracks workspace utilization:
|
|
526
|
+
- Per-workspace memory, CPU, agent counts
|
|
527
|
+
- Trend analysis (15min/60min forecasts)
|
|
528
|
+
- Placement recommendations for new agents
|
|
529
|
+
- Stale workspace detection
|
|
530
|
+
|
|
531
|
+
#### 4. Scaling Orchestrator (`/src/cloud/services/scaling-orchestrator.ts`)
|
|
532
|
+
Executes scaling decisions:
|
|
533
|
+
- Handles both vertical and horizontal scaling
|
|
534
|
+
- Coordinates with provisioner for resizing
|
|
535
|
+
- Records scaling events for auditing
|
|
536
|
+
- Emits events for monitoring
|
|
537
|
+
|
|
538
|
+
### Resource Tiers
|
|
539
|
+
|
|
540
|
+
Vertical scaling uses predefined resource tiers:
|
|
541
|
+
|
|
542
|
+
| Tier | CPU Cores | Memory | Max Agents |
|
|
543
|
+
|------|-----------|--------|------------|
|
|
544
|
+
| small | 1 (shared) | 512MB | 5 |
|
|
545
|
+
| medium | 2 (shared) | 1GB | 10 |
|
|
546
|
+
| large | 4 (performance) | 2GB | 20 |
|
|
547
|
+
| xlarge | 8 (performance) | 4GB | 50 |
|
|
548
|
+
|
|
549
|
+
### Scaling Actions
|
|
550
|
+
|
|
551
|
+
| Action | Type | Description |
|
|
552
|
+
|--------|------|-------------|
|
|
553
|
+
| scale_up | Horizontal | Provision new workspace |
|
|
554
|
+
| scale_down | Horizontal | Deprovision idle workspace |
|
|
555
|
+
| resize_up | Vertical | Increase workspace resources |
|
|
556
|
+
| resize_down | Vertical | Decrease workspace resources |
|
|
557
|
+
| increase_agent_limit | Vertical | Raise max agents limit |
|
|
558
|
+
| migrate_agents | Horizontal | Move agents between workspaces |
|
|
559
|
+
| rebalance | Horizontal | Redistribute agents evenly |
|
|
560
|
+
|
|
561
|
+
### Plan-Based Thresholds
|
|
562
|
+
|
|
563
|
+
Each plan has different scaling limits:
|
|
564
|
+
|
|
565
|
+
| Plan | Max Workspaces | Max Agents/Workspace | Memory Threshold |
|
|
566
|
+
|------|----------------|---------------------|------------------|
|
|
567
|
+
| free | 1 | 5 | 80% |
|
|
568
|
+
| pro | 3 | 15 | 85% |
|
|
569
|
+
| team | 10 | 25 | 85% |
|
|
570
|
+
| enterprise | 50 | 50 | 90% |
|
|
571
|
+
|
|
572
|
+
### Configuration
|
|
573
|
+
|
|
574
|
+
```typescript
|
|
575
|
+
// Enable auto-scaling with custom config
|
|
576
|
+
const orchestrator = createScalingOrchestrator({
|
|
577
|
+
enabled: true,
|
|
578
|
+
autoProvision: true, // Auto-provision new workspaces
|
|
579
|
+
autoDeprovision: false, // Require manual deprovision (safety)
|
|
580
|
+
idleTimeoutMs: 1800000, // 30 min idle timeout
|
|
581
|
+
minUserWorkspaces: 1, // Never scale below 1
|
|
582
|
+
});
|
|
583
|
+
|
|
584
|
+
await orchestrator.initialize(process.env.REDIS_URL);
|
|
585
|
+
```
|
|
586
|
+
|
|
587
|
+
### Monitoring
|
|
588
|
+
|
|
589
|
+
The orchestrator emits events for monitoring:
|
|
590
|
+
|
|
591
|
+
```typescript
|
|
592
|
+
orchestrator.on('workspace_resized', ({ userId, workspaceId, previousTier, newTier }) => {
|
|
593
|
+
console.log(`Resized ${workspaceId} from ${previousTier} to ${newTier}`);
|
|
594
|
+
});
|
|
595
|
+
|
|
596
|
+
orchestrator.on('scaling_blocked', ({ reason, operation }) => {
|
|
597
|
+
console.log(`Scaling blocked: ${reason}`);
|
|
598
|
+
});
|
|
599
|
+
|
|
600
|
+
orchestrator.on('agent_limit_updated', ({ workspaceId, previousLimit, newLimit }) => {
|
|
601
|
+
console.log(`Agent limit: ${previousLimit} → ${newLimit}`);
|
|
602
|
+
});
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
### Cross-Server Coordination
|
|
606
|
+
|
|
607
|
+
Multiple cloud servers coordinate via Redis:
|
|
608
|
+
- Leader election ensures single decision maker
|
|
609
|
+
- Pub/sub broadcasts metrics and decisions
|
|
610
|
+
- Distributed locks prevent race conditions
|
|
611
|
+
|
|
612
|
+
```
|
|
613
|
+
Server A (leader) Server B Server C
|
|
614
|
+
│ │ │
|
|
615
|
+
│◀── metrics ────────│ │
|
|
616
|
+
│◀── metrics ────────┼────────────────────│
|
|
617
|
+
│ │ │
|
|
618
|
+
├── evaluate ────────┼────────────────────┤
|
|
619
|
+
│ │ │
|
|
620
|
+
│── scale request ──▶│ │
|
|
621
|
+
│ ▶│◀── execute ────────│
|
|
622
|
+
│ │ │
|
|
623
|
+
│◀── complete ───────│ │
|
|
624
|
+
```
|
|
625
|
+
|
|
626
|
+
---
|
|
627
|
+
|
|
628
|
+
## Cloud Coordinators (Project Groups)
|
|
629
|
+
|
|
630
|
+
Coordinators are high-level AI agents that oversee multiple projects (repositories). They enable cross-workspace communication and coordination at scale.
|
|
631
|
+
|
|
632
|
+
### Workspace vs Project Group
|
|
633
|
+
|
|
634
|
+
**Workspace** = A single compute instance (Fly.io VM) that can hold multiple repos:
|
|
635
|
+
```
|
|
636
|
+
┌─────────────────────────────────────────────┐
|
|
637
|
+
│ Workspace (1 Fly.io VM) │
|
|
638
|
+
│ /repos/ │
|
|
639
|
+
│ ├── frontend-app/ ← Repo 1 │
|
|
640
|
+
│ ├── backend-api/ ← Repo 2 │
|
|
641
|
+
│ └── shared-libs/ ← Repo 3 │
|
|
642
|
+
│ │
|
|
643
|
+
│ agent-relay daemon (1 per workspace) │
|
|
644
|
+
│ Agents communicate via local Unix socket │
|
|
645
|
+
└─────────────────────────────────────────────┘
|
|
646
|
+
```
|
|
647
|
+
|
|
648
|
+
**Project Group** = A logical grouping of repos that may span multiple workspaces:
|
|
649
|
+
- Repos in the **same workspace** → agents talk via local daemon (fast)
|
|
650
|
+
- Repos in **different workspaces** → need Redis pub/sub (cross-VM messaging)
|
|
651
|
+
- The **Coordinator** oversees all repos regardless of which workspace they're in
|
|
652
|
+
|
|
653
|
+
### Architecture Overview
|
|
654
|
+
|
|
655
|
+
```
|
|
656
|
+
┌─────────────────────────────────────────────────┐
|
|
657
|
+
│ Cloud Dashboard │
|
|
658
|
+
│ (User creates Project Group, selects repos) │
|
|
659
|
+
└──────────────────┬──────────────────────────────┘
|
|
660
|
+
│ Creates Project Group
|
|
661
|
+
▼
|
|
662
|
+
┌─────────────────────────────────────────────────┐
|
|
663
|
+
│ Project Group │
|
|
664
|
+
│ ├─ Repo 1 (connected via Cloud Worker) │
|
|
665
|
+
│ ├─ Repo 2 (connected via Cloud Worker) │
|
|
666
|
+
│ └─ Coordinator Agent (cloud-hosted) │
|
|
667
|
+
└──────────────────┬──────────────────────────────┘
|
|
668
|
+
│ Redis Pub/Sub
|
|
669
|
+
▼
|
|
670
|
+
┌─────────────────────────────────────────────────┐
|
|
671
|
+
│ Per-Workspace Workers (Fly.io Machines) │
|
|
672
|
+
│ Each maintains connection to local project │
|
|
673
|
+
│ daemon and relays messages to/from cloud │
|
|
674
|
+
└─────────────────────────────────────────────────┘
|
|
675
|
+
```
|
|
676
|
+
|
|
677
|
+
### Local vs Cloud Comparison
|
|
678
|
+
|
|
679
|
+
| Feature | Local Bridge (`relay bridge`) | Cloud Coordinator |
|
|
680
|
+
|---------|-------------------------------|-------------------|
|
|
681
|
+
| Spawning | tmux sessions on local machine | Cloud-hosted process (Fly.io) |
|
|
682
|
+
| Messaging | Direct Unix socket connections | Redis pub/sub across workspaces |
|
|
683
|
+
| State | `bridge-state.json` file | PostgreSQL (project_groups table) |
|
|
684
|
+
| Scaling | Single machine | Multi-tenant, horizontal scaling |
|
|
685
|
+
| Dashboard | Local dashboard server | Cloud dashboard with auth |
|
|
686
|
+
|
|
687
|
+
### Database Schema
|
|
688
|
+
|
|
689
|
+
```sql
|
|
690
|
+
-- Project Groups (collection of repos with optional coordinator)
|
|
691
|
+
CREATE TABLE project_groups (
|
|
692
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
693
|
+
user_id UUID REFERENCES users(id),
|
|
694
|
+
name TEXT NOT NULL,
|
|
695
|
+
created_at TIMESTAMP DEFAULT NOW()
|
|
696
|
+
);
|
|
697
|
+
|
|
698
|
+
-- Repos in a Project Group
|
|
699
|
+
CREATE TABLE project_group_repos (
|
|
700
|
+
project_group_id UUID REFERENCES project_groups(id),
|
|
701
|
+
repository_id UUID REFERENCES repositories(id),
|
|
702
|
+
PRIMARY KEY (project_group_id, repository_id)
|
|
703
|
+
);
|
|
704
|
+
|
|
705
|
+
-- Coordinator Agents (one per project group)
|
|
706
|
+
CREATE TABLE coordinators (
|
|
707
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
708
|
+
project_group_id UUID REFERENCES project_groups(id) UNIQUE,
|
|
709
|
+
name TEXT DEFAULT 'Architect',
|
|
710
|
+
model TEXT DEFAULT 'claude-sonnet',
|
|
711
|
+
status TEXT DEFAULT 'stopped', -- stopped, starting, running, error
|
|
712
|
+
compute_id TEXT, -- Fly.io machine ID
|
|
713
|
+
started_at TIMESTAMP,
|
|
714
|
+
stopped_at TIMESTAMP
|
|
715
|
+
);
|
|
716
|
+
```
|
|
717
|
+
|
|
718
|
+
### API Endpoints
|
|
719
|
+
|
|
720
|
+
```
|
|
721
|
+
# Project Groups
|
|
722
|
+
GET /api/project-groups # List user's project groups
|
|
723
|
+
POST /api/project-groups # Create project group
|
|
724
|
+
GET /api/project-groups/:id # Get project group details
|
|
725
|
+
DELETE /api/project-groups/:id # Delete project group
|
|
726
|
+
|
|
727
|
+
# Coordinators
|
|
728
|
+
POST /api/project-groups/:id/coordinator/enable # Start coordinator
|
|
729
|
+
POST /api/project-groups/:id/coordinator/disable # Stop coordinator
|
|
730
|
+
GET /api/project-groups/:id/coordinator/status # Get coordinator status
|
|
731
|
+
POST /api/project-groups/:id/coordinator/message # Send message to coordinator
|
|
732
|
+
```
|
|
733
|
+
|
|
734
|
+
### Cross-Workspace Messaging
|
|
735
|
+
|
|
736
|
+
Coordinators use Redis pub/sub for cross-workspace communication:
|
|
737
|
+
|
|
738
|
+
```typescript
|
|
739
|
+
// Publish to a workspace
|
|
740
|
+
redis.publish(`workspace:${workspaceId}:messages`, JSON.stringify({
|
|
741
|
+
from: 'Architect',
|
|
742
|
+
to: 'Lead',
|
|
743
|
+
content: 'Please prioritize the auth module',
|
|
744
|
+
timestamp: Date.now()
|
|
745
|
+
}));
|
|
746
|
+
|
|
747
|
+
// Subscribe to messages for a workspace
|
|
748
|
+
redis.subscribe(`workspace:${workspaceId}:messages`, (message) => {
|
|
749
|
+
// Route to local agent via daemon
|
|
750
|
+
});
|
|
751
|
+
```
|
|
752
|
+
|
|
753
|
+
### Message Routing
|
|
754
|
+
|
|
755
|
+
```
|
|
756
|
+
Coordinator → Redis → Workspace Worker → Local Daemon → Agent
|
|
757
|
+
↑ │
|
|
758
|
+
└────────────────────────────────────────────────────┘
|
|
759
|
+
(response path)
|
|
760
|
+
```
|
|
761
|
+
|
|
762
|
+
### Coordinator Prompt Template
|
|
763
|
+
|
|
764
|
+
When a coordinator is started, it receives context about its project group:
|
|
765
|
+
|
|
766
|
+
```
|
|
767
|
+
You are the Architect, a cross-project coordinator overseeing multiple codebases.
|
|
768
|
+
|
|
769
|
+
## Connected Projects
|
|
770
|
+
- project-1: /repos/frontend (Lead: FrontendLead)
|
|
771
|
+
- project-2: /repos/backend (Lead: BackendLead)
|
|
772
|
+
|
|
773
|
+
## Your Role
|
|
774
|
+
- Coordinate high-level work across all projects
|
|
775
|
+
- Assign tasks to project leads
|
|
776
|
+
- Ensure consistency and resolve cross-project dependencies
|
|
777
|
+
- Review overall architecture decisions
|
|
778
|
+
|
|
779
|
+
## Cross-Project Messaging
|
|
780
|
+
|
|
781
|
+
Use this syntax to message agents in specific projects:
|
|
782
|
+
->relay:project-id:AgentName <<<
|
|
783
|
+
Your message>>>
|
|
784
|
+
|
|
785
|
+
->relay:project-id:* <<<
|
|
786
|
+
Broadcast to all agents in a project>>>
|
|
787
|
+
|
|
788
|
+
->relay:*:* <<<
|
|
789
|
+
Broadcast to ALL agents in ALL projects>>>
|
|
790
|
+
```
|
|
791
|
+
|
|
792
|
+
### Dashboard UI (CoordinatorPanel)
|
|
793
|
+
|
|
794
|
+
The dashboard provides a UI for managing coordinators:
|
|
795
|
+
|
|
796
|
+
1. **Create Project Group** - Select repositories to group together
|
|
797
|
+
2. **Enable Coordinator** - Start the coordinator agent
|
|
798
|
+
3. **Disable Coordinator** - Stop the coordinator agent
|
|
799
|
+
4. **Delete Project Group** - Remove the group and stop coordinator
|
|
800
|
+
|
|
801
|
+
For local bridge mode, the panel shows:
|
|
802
|
+
- "Spawn Architect" button (when in bridge mode with multiple projects)
|
|
803
|
+
- CLI selector (Claude, Claude Opus, Sonnet, Codex)
|
|
804
|
+
- Instructions for using `relay bridge --architect` flag
|