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,366 @@
|
|
|
1
|
+
# Resiliency Features Test Plan
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-01-01
|
|
4
|
+
**Features:** P0-P5 Leader Coordination and Failover
|
|
5
|
+
**Branch:** `claude/add-continuous-claude-logic-kba3r`
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Prerequisites
|
|
10
|
+
|
|
11
|
+
1. Build the project: `npm run build`
|
|
12
|
+
2. Have at least 2-3 terminal windows ready
|
|
13
|
+
3. Ensure `.beads/` directory exists with `issues.jsonl`
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## P0: Stateless Lead Pattern
|
|
18
|
+
|
|
19
|
+
### Test 1: Lead reads tasks from Beads
|
|
20
|
+
|
|
21
|
+
**Setup:**
|
|
22
|
+
```bash
|
|
23
|
+
# Add a test task to Beads
|
|
24
|
+
echo '{"id":"test-001","title":"Test task for P0","status":"open","priority":1,"created_at":"2026-01-01T00:00:00Z","updated_at":"2026-01-01T00:00:00Z"}' >> .beads/issues.jsonl
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Test:**
|
|
28
|
+
```typescript
|
|
29
|
+
import { createStatelessLead } from './src/resiliency';
|
|
30
|
+
|
|
31
|
+
const lead = createStatelessLead('.beads', 'TestLead', 'lead-001', {
|
|
32
|
+
sendRelay: async (to, msg) => console.log(`[RELAY] To ${to}: ${msg}`),
|
|
33
|
+
getAvailableWorkers: async () => ['Worker1', 'Worker2'],
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
await lead.start();
|
|
37
|
+
// Wait 5 seconds for poll
|
|
38
|
+
// Expected: Console shows "Assigned test-001 to Worker1"
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Verify:**
|
|
42
|
+
```bash
|
|
43
|
+
# Check task was assigned in Beads
|
|
44
|
+
grep "test-001" .beads/issues.jsonl
|
|
45
|
+
# Should show: "status":"in_progress","assignee":"Worker1"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**Pass criteria:**
|
|
49
|
+
- [ ] Task status changed to `in_progress`
|
|
50
|
+
- [ ] Task has `assignee` field set
|
|
51
|
+
- [ ] Task has `leaseExpires` timestamp
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## P1: Task Lease Timeouts
|
|
56
|
+
|
|
57
|
+
### Test 2: Lease expiration returns task to queue
|
|
58
|
+
|
|
59
|
+
**Setup:**
|
|
60
|
+
```typescript
|
|
61
|
+
// Create lead with short lease (10 seconds for testing)
|
|
62
|
+
const lead = new StatelessLeadCoordinator({
|
|
63
|
+
beadsDir: '.beads',
|
|
64
|
+
agentName: 'TestLead',
|
|
65
|
+
agentId: 'lead-001',
|
|
66
|
+
pollIntervalMs: 2000,
|
|
67
|
+
heartbeatIntervalMs: 5000,
|
|
68
|
+
leaseDurationMs: 10000, // 10 second lease
|
|
69
|
+
sendRelay: async (to, msg) => console.log(`[RELAY] To ${to}: ${msg}`),
|
|
70
|
+
getAvailableWorkers: async () => ['Worker1'],
|
|
71
|
+
});
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Test:**
|
|
75
|
+
1. Start lead - task gets assigned
|
|
76
|
+
2. Wait 15 seconds (lease expires)
|
|
77
|
+
3. Add new worker to available list
|
|
78
|
+
4. Wait for next poll
|
|
79
|
+
|
|
80
|
+
**Verify:**
|
|
81
|
+
```bash
|
|
82
|
+
# Task should be reassigned after lease expires
|
|
83
|
+
grep "test-001" .beads/issues.jsonl
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**Pass criteria:**
|
|
87
|
+
- [ ] Task returned to queue after lease expired
|
|
88
|
+
- [ ] Task reassigned to new worker on next poll
|
|
89
|
+
|
|
90
|
+
### Test 3: Lease renewal
|
|
91
|
+
|
|
92
|
+
**Test:**
|
|
93
|
+
```typescript
|
|
94
|
+
// Worker renews lease before expiration
|
|
95
|
+
await lead.renewLease('test-001', 'Worker1');
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**Pass criteria:**
|
|
99
|
+
- [ ] `leaseExpires` timestamp updated
|
|
100
|
+
- [ ] Console shows "Renewed lease for test-001"
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## P2: Leader Heartbeat File
|
|
105
|
+
|
|
106
|
+
### Test 4: Heartbeat file created and updated
|
|
107
|
+
|
|
108
|
+
**Test:**
|
|
109
|
+
```typescript
|
|
110
|
+
const lead = createStatelessLead('.beads', 'TestLead', 'lead-001', {
|
|
111
|
+
sendRelay: async () => {},
|
|
112
|
+
getAvailableWorkers: async () => [],
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
await lead.start();
|
|
116
|
+
// Wait 15 seconds
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**Verify:**
|
|
120
|
+
```bash
|
|
121
|
+
cat .beads/leader-heartbeat.json
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**Expected output:**
|
|
125
|
+
```json
|
|
126
|
+
{
|
|
127
|
+
"leadName": "TestLead",
|
|
128
|
+
"leadId": "lead-001",
|
|
129
|
+
"timestamp": 1735689600000,
|
|
130
|
+
"activeTaskCount": 0,
|
|
131
|
+
"assignedAgents": []
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**Pass criteria:**
|
|
136
|
+
- [ ] File exists at `.beads/leader-heartbeat.json`
|
|
137
|
+
- [ ] `timestamp` updates every 10 seconds
|
|
138
|
+
- [ ] `activeTaskCount` reflects assigned tasks
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## P3: Watchdog in AgentSupervisor
|
|
143
|
+
|
|
144
|
+
### Test 5: Watchdog detects stale leader
|
|
145
|
+
|
|
146
|
+
**Terminal 1 - Start leader:**
|
|
147
|
+
```typescript
|
|
148
|
+
import { createStatelessLead } from './src/resiliency';
|
|
149
|
+
|
|
150
|
+
const lead = createStatelessLead('.beads', 'Leader1', 'lead-001', {
|
|
151
|
+
sendRelay: async () => {},
|
|
152
|
+
getAvailableWorkers: async () => [],
|
|
153
|
+
});
|
|
154
|
+
await lead.start();
|
|
155
|
+
console.log('Leader1 started');
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Terminal 2 - Start watchdog:**
|
|
159
|
+
```typescript
|
|
160
|
+
import { createLeaderWatchdog } from './src/resiliency';
|
|
161
|
+
|
|
162
|
+
const watchdog = createLeaderWatchdog('.beads', 'Watchdog1', 'watch-001', {
|
|
163
|
+
onBecomeLeader: async () => console.log('I AM NOW LEADER!'),
|
|
164
|
+
getHealthyAgents: async () => [
|
|
165
|
+
{ name: 'Watchdog1', id: 'watch-001', spawnedAt: new Date() }
|
|
166
|
+
],
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
watchdog.on('leaderDetected', (h) => console.log('Leader detected:', h.leadName));
|
|
170
|
+
watchdog.on('leaderStale', (d) => console.log('Leader stale!', d));
|
|
171
|
+
watchdog.on('becameLeader', () => console.log('Became leader'));
|
|
172
|
+
|
|
173
|
+
watchdog.start();
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
**Test:**
|
|
177
|
+
1. Both running - watchdog should detect Leader1
|
|
178
|
+
2. Kill Terminal 1 (Ctrl+C)
|
|
179
|
+
3. Wait 35 seconds (stale threshold + check interval)
|
|
180
|
+
|
|
181
|
+
**Pass criteria:**
|
|
182
|
+
- [ ] Watchdog logs "Leader detected: Leader1"
|
|
183
|
+
- [ ] After leader killed, watchdog logs "Leader stale!"
|
|
184
|
+
- [ ] Watchdog logs "I AM NOW LEADER!"
|
|
185
|
+
- [ ] New heartbeat file shows Watchdog1 as leader
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## P4: Gossip-Based Health Broadcast
|
|
190
|
+
|
|
191
|
+
### Test 6: Peer discovery via heartbeats
|
|
192
|
+
|
|
193
|
+
**Terminal 1 - Agent A:**
|
|
194
|
+
```typescript
|
|
195
|
+
import { createGossipHealth } from './src/resiliency';
|
|
196
|
+
|
|
197
|
+
const messages: string[] = [];
|
|
198
|
+
const gossipA = createGossipHealth('AgentA', 'a-001', async (msg) => {
|
|
199
|
+
messages.push(msg);
|
|
200
|
+
console.log('[A broadcast]', msg);
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
gossipA.on('peerDiscovered', (p) => console.log('Discovered peer:', p.name));
|
|
204
|
+
gossipA.start();
|
|
205
|
+
|
|
206
|
+
// Simulate receiving B's heartbeat
|
|
207
|
+
setTimeout(() => {
|
|
208
|
+
const heartbeat = {
|
|
209
|
+
type: 'HEARTBEAT',
|
|
210
|
+
agent: 'AgentB',
|
|
211
|
+
agentId: 'b-001',
|
|
212
|
+
timestamp: Date.now(),
|
|
213
|
+
load: 0.5,
|
|
214
|
+
healthy: true,
|
|
215
|
+
isLeader: false,
|
|
216
|
+
taskCount: 2,
|
|
217
|
+
};
|
|
218
|
+
gossipA.processHeartbeat(heartbeat);
|
|
219
|
+
}, 5000);
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
**Pass criteria:**
|
|
223
|
+
- [ ] AgentA broadcasts HEARTBEAT messages
|
|
224
|
+
- [ ] "Discovered peer: AgentB" logged
|
|
225
|
+
- [ ] `gossipA.getPeers()` returns AgentB
|
|
226
|
+
|
|
227
|
+
### Test 7: Stale peer detection
|
|
228
|
+
|
|
229
|
+
**Test:**
|
|
230
|
+
```typescript
|
|
231
|
+
// Process old heartbeat
|
|
232
|
+
const staleHeartbeat = {
|
|
233
|
+
type: 'HEARTBEAT',
|
|
234
|
+
agent: 'AgentC',
|
|
235
|
+
agentId: 'c-001',
|
|
236
|
+
timestamp: Date.now() - 60000, // 1 minute old
|
|
237
|
+
load: 0,
|
|
238
|
+
healthy: true,
|
|
239
|
+
isLeader: false,
|
|
240
|
+
taskCount: 0,
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
gossipA.on('peerStale', (d) => console.log('Peer stale:', d.peer.name));
|
|
244
|
+
gossipA.processHeartbeat(staleHeartbeat);
|
|
245
|
+
|
|
246
|
+
// Wait for check interval (5 seconds)
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
**Pass criteria:**
|
|
250
|
+
- [ ] "Peer stale: AgentC" logged within 10 seconds
|
|
251
|
+
- [ ] `gossipA.getPeer('AgentC').healthy` is `false`
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## P5: Full Leader Election
|
|
256
|
+
|
|
257
|
+
### Test 8: Oldest agent wins election
|
|
258
|
+
|
|
259
|
+
**Setup:** Start 3 agents at different times
|
|
260
|
+
|
|
261
|
+
**Terminal 1 (start first):**
|
|
262
|
+
```typescript
|
|
263
|
+
import { getSupervisor } from './src/resiliency';
|
|
264
|
+
|
|
265
|
+
const supervisor = getSupervisor();
|
|
266
|
+
supervisor.start();
|
|
267
|
+
|
|
268
|
+
supervisor.on('electionStarted', (d) => console.log('Election started:', d));
|
|
269
|
+
supervisor.on('electionComplete', (d) => console.log('Election result:', d));
|
|
270
|
+
supervisor.on('becameLeader', () => console.log('*** I AM LEADER ***'));
|
|
271
|
+
|
|
272
|
+
supervisor.enableLeaderCoordination('.beads', async (to, msg) => {
|
|
273
|
+
console.log(`Send to ${to}: ${msg}`);
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
console.log('Supervisor started at', new Date().toISOString());
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
**Verify:**
|
|
280
|
+
```bash
|
|
281
|
+
cat .beads/leader-heartbeat.json
|
|
282
|
+
# Should show first supervisor as leader
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
**Pass criteria:**
|
|
286
|
+
- [ ] First started supervisor becomes leader
|
|
287
|
+
- [ ] `leader-heartbeat.json` shows correct leader
|
|
288
|
+
- [ ] Election uses "oldest" method
|
|
289
|
+
|
|
290
|
+
### Test 9: Failover on leader death
|
|
291
|
+
|
|
292
|
+
**Test:**
|
|
293
|
+
1. Start Supervisor A (becomes leader)
|
|
294
|
+
2. Start Supervisor B (detects A as leader)
|
|
295
|
+
3. Kill Supervisor A
|
|
296
|
+
4. Wait 35 seconds
|
|
297
|
+
|
|
298
|
+
**Pass criteria:**
|
|
299
|
+
- [ ] Supervisor B logs "Leader stale"
|
|
300
|
+
- [ ] Supervisor B logs "*** I AM LEADER ***"
|
|
301
|
+
- [ ] Heartbeat file updates to show B as leader
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
## Integration Test: Full Workflow
|
|
306
|
+
|
|
307
|
+
### Test 10: End-to-end task assignment and failover
|
|
308
|
+
|
|
309
|
+
**Setup:**
|
|
310
|
+
```bash
|
|
311
|
+
# Clear test data
|
|
312
|
+
rm -f .beads/leader-heartbeat.json
|
|
313
|
+
# Add test tasks
|
|
314
|
+
cat >> .beads/issues.jsonl << 'EOF'
|
|
315
|
+
{"id":"e2e-001","title":"E2E Test Task 1","status":"open","priority":1,"created_at":"2026-01-01T00:00:00Z","updated_at":"2026-01-01T00:00:00Z"}
|
|
316
|
+
{"id":"e2e-002","title":"E2E Test Task 2","status":"open","priority":2,"created_at":"2026-01-01T00:00:00Z","updated_at":"2026-01-01T00:00:00Z"}
|
|
317
|
+
EOF
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
**Workflow:**
|
|
321
|
+
1. Start Lead agent
|
|
322
|
+
2. Start 2 Worker agents
|
|
323
|
+
3. Verify tasks assigned
|
|
324
|
+
4. Kill Lead agent
|
|
325
|
+
5. Verify new leader elected
|
|
326
|
+
6. Verify tasks continue processing
|
|
327
|
+
|
|
328
|
+
**Pass criteria:**
|
|
329
|
+
- [ ] Tasks assigned to workers
|
|
330
|
+
- [ ] Leader failover completes in <35 seconds
|
|
331
|
+
- [ ] No task duplication
|
|
332
|
+
- [ ] Orphaned tasks return to queue
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
## Cleanup
|
|
337
|
+
|
|
338
|
+
```bash
|
|
339
|
+
# Remove test data
|
|
340
|
+
grep -v "test-001\|e2e-00" .beads/issues.jsonl > .beads/issues.jsonl.tmp
|
|
341
|
+
mv .beads/issues.jsonl.tmp .beads/issues.jsonl
|
|
342
|
+
rm -f .beads/leader-heartbeat.json
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
## Summary Checklist
|
|
348
|
+
|
|
349
|
+
| Feature | Test | Status |
|
|
350
|
+
|---------|------|--------|
|
|
351
|
+
| P0: Stateless Lead | Test 1: Lead reads from Beads | โ |
|
|
352
|
+
| P1: Lease Timeouts | Test 2: Lease expiration | โ |
|
|
353
|
+
| P1: Lease Timeouts | Test 3: Lease renewal | โ |
|
|
354
|
+
| P2: Heartbeat File | Test 4: File created/updated | โ |
|
|
355
|
+
| P3: Watchdog | Test 5: Stale leader detection | โ |
|
|
356
|
+
| P4: Gossip Health | Test 6: Peer discovery | โ |
|
|
357
|
+
| P4: Gossip Health | Test 7: Stale peer detection | โ |
|
|
358
|
+
| P5: Leader Election | Test 8: Oldest wins | โ |
|
|
359
|
+
| P5: Leader Election | Test 9: Failover | โ |
|
|
360
|
+
| Integration | Test 10: Full workflow | โ |
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
**Tester:** ____________________
|
|
365
|
+
**Date Completed:** ____________________
|
|
366
|
+
**Notes:**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-relay",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Real-time agent-to-agent communication system",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -25,7 +25,12 @@
|
|
|
25
25
|
"build": "npm run clean && tsc && npm run build:dashboard",
|
|
26
26
|
"build:dashboard": "cd src/dashboard && npm run build",
|
|
27
27
|
"postbuild": "chmod +x dist/cli/index.js && mkdir -p dist/dashboard && cp -r src/dashboard/out dist/dashboard/",
|
|
28
|
-
"dev": "tsc -w",
|
|
28
|
+
"dev:watch": "tsc -w",
|
|
29
|
+
"predev": "npm run clean && tsc && chmod +x dist/cli/index.js",
|
|
30
|
+
"dev": "concurrently -n daemon,next -c blue,magenta \"npm run dev:daemon\" \"npm run dev:next\"",
|
|
31
|
+
"dev:daemon": "node dist/cli/index.js up --port 3889",
|
|
32
|
+
"dev:next": "cd src/dashboard && npm run dev",
|
|
33
|
+
"dev:simple": "node dist/cli/index.js up --port 3888",
|
|
29
34
|
"dev:local": "npm run build && npm link && echo 'โ agent-relay linked globally'",
|
|
30
35
|
"dev:unlink": "npm unlink -g agent-relay && echo 'โ agent-relay unlinked'",
|
|
31
36
|
"dev:rebuild": "npm run build && echo 'โ Rebuilt (linked version updated)'",
|
|
@@ -34,11 +39,26 @@
|
|
|
34
39
|
"dashboard": "node dist/dashboard-server/start.js",
|
|
35
40
|
"pretest": "npm run build",
|
|
36
41
|
"test": "vitest run",
|
|
42
|
+
"test:integration": "vitest run test/cloud/*.integration.test.ts",
|
|
43
|
+
"test:qa": "./scripts/run-cloud-qa.sh",
|
|
44
|
+
"qa": "./scripts/manual-qa.sh",
|
|
45
|
+
"qa:stop": "./scripts/manual-qa.sh --stop",
|
|
37
46
|
"pretest:coverage": "npm run build",
|
|
38
47
|
"test:coverage": "vitest run --coverage",
|
|
39
48
|
"test:watch": "vitest",
|
|
40
49
|
"lint": "eslint src --ext .ts",
|
|
41
|
-
"clean": "rm -rf dist"
|
|
50
|
+
"clean": "rm -rf dist",
|
|
51
|
+
"db:generate": "drizzle-kit generate",
|
|
52
|
+
"db:migrate": "drizzle-kit migrate",
|
|
53
|
+
"db:push": "drizzle-kit push",
|
|
54
|
+
"db:studio": "drizzle-kit studio",
|
|
55
|
+
"services:up": "docker compose -f docker-compose.dev.yml up -d postgres redis && echo 'โ Postgres and Redis running'",
|
|
56
|
+
"services:down": "docker compose -f docker-compose.dev.yml down",
|
|
57
|
+
"services:logs": "docker compose -f docker-compose.dev.yml logs -f postgres redis",
|
|
58
|
+
"cloud:setup": "./scripts/cloud-setup.sh",
|
|
59
|
+
"cloud:api": "WORKSPACE_IMAGE=relay-workspace:local WORKSPACE_DEV_MOUNT=true node -r dotenv/config dist/cloud/index.js",
|
|
60
|
+
"precloud": "./scripts/cloud-setup.sh --skip-data",
|
|
61
|
+
"cloud": "concurrently -n api,daemon,dashboard -c cyan,blue,magenta \"npm run cloud:api\" \"npm run dev:daemon\" \"npm run dev:next\""
|
|
42
62
|
},
|
|
43
63
|
"keywords": [
|
|
44
64
|
"agent",
|
|
@@ -54,33 +74,51 @@
|
|
|
54
74
|
"license": "MIT",
|
|
55
75
|
"repository": {
|
|
56
76
|
"type": "git",
|
|
57
|
-
"url": "git+https://github.com/
|
|
77
|
+
"url": "git+https://github.com/AgentWorkforce/relay.git"
|
|
58
78
|
},
|
|
59
79
|
"bugs": {
|
|
60
|
-
"url": "https://github.com/
|
|
80
|
+
"url": "https://github.com/AgentWorkforce/relay/issues"
|
|
61
81
|
},
|
|
62
|
-
"homepage": "https://github.com/
|
|
82
|
+
"homepage": "https://github.com/AgentWorkforce/relay#readme",
|
|
63
83
|
"dependencies": {
|
|
84
|
+
"@nangohq/node": "^0.69.20",
|
|
85
|
+
"@types/jsonwebtoken": "^9.0.10",
|
|
86
|
+
"agent-trajectories": "^0.1.1",
|
|
64
87
|
"better-sqlite3": "^9.4.3",
|
|
65
88
|
"chokidar": "^5.0.0",
|
|
66
89
|
"commander": "^12.1.0",
|
|
67
90
|
"compare-versions": "^6.1.1",
|
|
91
|
+
"connect-redis": "^9.0.0",
|
|
92
|
+
"cors": "^2.8.5",
|
|
68
93
|
"dotenv": "^17.2.3",
|
|
94
|
+
"drizzle-orm": "^0.45.1",
|
|
69
95
|
"express": "^5.2.1",
|
|
96
|
+
"express-session": "^1.18.2",
|
|
97
|
+
"helmet": "^8.1.0",
|
|
70
98
|
"http-proxy-middleware": "^3.0.5",
|
|
99
|
+
"jsonwebtoken": "^9.0.3",
|
|
71
100
|
"node-pty": "1.0.0",
|
|
101
|
+
"pg": "^8.16.3",
|
|
102
|
+
"redis": "^5.10.0",
|
|
103
|
+
"stripe": "^20.1.0",
|
|
72
104
|
"uuid": "^10.0.0",
|
|
73
105
|
"ws": "^8.18.3"
|
|
74
106
|
},
|
|
75
107
|
"devDependencies": {
|
|
76
108
|
"@types/better-sqlite3": "^7.6.13",
|
|
109
|
+
"@types/cors": "^2.8.19",
|
|
77
110
|
"@types/express": "^5.0.6",
|
|
78
|
-
"@types/
|
|
111
|
+
"@types/express-session": "^1.18.2",
|
|
112
|
+
"@types/helmet": "^0.0.48",
|
|
113
|
+
"@types/node": "^22.19.3",
|
|
114
|
+
"@types/pg": "^8.16.0",
|
|
79
115
|
"@types/uuid": "^10.0.0",
|
|
80
116
|
"@types/ws": "^8.18.1",
|
|
81
117
|
"@typescript-eslint/eslint-plugin": "^8.18.2",
|
|
82
118
|
"@typescript-eslint/parser": "^8.18.2",
|
|
83
119
|
"@vitest/coverage-v8": "^2.1.8",
|
|
120
|
+
"concurrently": "^9.2.1",
|
|
121
|
+
"drizzle-kit": "^0.31.8",
|
|
84
122
|
"esbuild": "^0.24.0",
|
|
85
123
|
"eslint": "^8.57.1",
|
|
86
124
|
"jsdom": "^25.0.1",
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Cloud local development setup script
|
|
3
|
+
# Usage: ./scripts/cloud-setup.sh [--skip-docker] [--skip-migrate] [--skip-data]
|
|
4
|
+
|
|
5
|
+
set -e
|
|
6
|
+
|
|
7
|
+
SKIP_DOCKER=false
|
|
8
|
+
SKIP_MIGRATE=false
|
|
9
|
+
SKIP_DATA=false
|
|
10
|
+
|
|
11
|
+
# Parse arguments
|
|
12
|
+
for arg in "$@"; do
|
|
13
|
+
case $arg in
|
|
14
|
+
--skip-docker) SKIP_DOCKER=true ;;
|
|
15
|
+
--skip-migrate) SKIP_MIGRATE=true ;;
|
|
16
|
+
--skip-data) SKIP_DATA=true ;;
|
|
17
|
+
esac
|
|
18
|
+
done
|
|
19
|
+
|
|
20
|
+
echo "๐ Setting up Agent Relay Cloud (local dev)"
|
|
21
|
+
echo ""
|
|
22
|
+
|
|
23
|
+
# Step 1: Start Docker services
|
|
24
|
+
if [ "$SKIP_DOCKER" = false ]; then
|
|
25
|
+
echo "๐ฆ Starting Docker services (Postgres + Redis)..."
|
|
26
|
+
docker compose -f docker-compose.dev.yml up -d postgres redis
|
|
27
|
+
|
|
28
|
+
# Wait for Postgres to be ready
|
|
29
|
+
echo "โณ Waiting for Postgres to be ready..."
|
|
30
|
+
until docker compose -f docker-compose.dev.yml exec -T postgres pg_isready -U postgres > /dev/null 2>&1; do
|
|
31
|
+
sleep 1
|
|
32
|
+
done
|
|
33
|
+
echo "โ Postgres is ready"
|
|
34
|
+
else
|
|
35
|
+
echo "โญ๏ธ Skipping Docker setup"
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
# Step 2: Build TypeScript
|
|
39
|
+
echo ""
|
|
40
|
+
echo "๐จ Building TypeScript..."
|
|
41
|
+
npm run build > /dev/null 2>&1
|
|
42
|
+
echo "โ Build complete"
|
|
43
|
+
|
|
44
|
+
# Step 3: Run migrations
|
|
45
|
+
if [ "$SKIP_MIGRATE" = false ]; then
|
|
46
|
+
echo ""
|
|
47
|
+
echo "๐ Running database migrations..."
|
|
48
|
+
npm run db:migrate 2>&1 | grep -E "(Applied|already applied|Error)" || true
|
|
49
|
+
echo "โ Migrations complete"
|
|
50
|
+
else
|
|
51
|
+
echo "โญ๏ธ Skipping migrations"
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
# Step 4: Set up test data (only if server is running)
|
|
55
|
+
if [ "$SKIP_DATA" = false ]; then
|
|
56
|
+
echo ""
|
|
57
|
+
echo "๐งช Setting up test data..."
|
|
58
|
+
|
|
59
|
+
# Check if cloud server is running, if not start it temporarily
|
|
60
|
+
if ! curl -s http://localhost:4567/api/health > /dev/null 2>&1; then
|
|
61
|
+
echo " Starting cloud server temporarily for setup..."
|
|
62
|
+
node dist/cloud/index.js &
|
|
63
|
+
SERVER_PID=$!
|
|
64
|
+
sleep 3
|
|
65
|
+
STARTED_SERVER=true
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
# Create test data
|
|
69
|
+
RESPONSE=$(curl -s -X POST http://localhost:4567/api/test/setup-local-cloud \
|
|
70
|
+
-H "Content-Type: application/json" \
|
|
71
|
+
-c /tmp/relay-cookies.txt \
|
|
72
|
+
-d '{"repoName": "test-org/test-repo", "workspaceName": "Local Dev"}' 2>&1 || echo '{"error": "Failed to connect"}')
|
|
73
|
+
|
|
74
|
+
if echo "$RESPONSE" | grep -q '"success":true'; then
|
|
75
|
+
echo "โ Test data created"
|
|
76
|
+
echo " Cookie saved to /tmp/relay-cookies.txt"
|
|
77
|
+
else
|
|
78
|
+
echo "โ ๏ธ Could not create test data (server may need to be running)"
|
|
79
|
+
fi
|
|
80
|
+
|
|
81
|
+
# Stop temp server if we started it
|
|
82
|
+
if [ "$STARTED_SERVER" = true ]; then
|
|
83
|
+
kill $SERVER_PID 2>/dev/null || true
|
|
84
|
+
fi
|
|
85
|
+
else
|
|
86
|
+
echo "โญ๏ธ Skipping test data setup"
|
|
87
|
+
fi
|
|
88
|
+
|
|
89
|
+
echo ""
|
|
90
|
+
echo "โ
Setup complete!"
|
|
91
|
+
echo ""
|
|
92
|
+
echo "To start the cloud server:"
|
|
93
|
+
echo " npm run cloud"
|
|
94
|
+
echo ""
|
|
95
|
+
echo "Then open: http://localhost:4567/app"
|
|
96
|
+
echo ""
|