agent-relay 1.1.0 → 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/spawner.d.ts +53 -0
- package/dist/bridge/spawner.d.ts.map +1 -1
- package/dist/bridge/spawner.js +203 -19
- package/dist/bridge/spawner.js.map +1 -1
- package/dist/bridge/types.d.ts +12 -0
- package/dist/bridge/types.d.ts.map +1 -1
- package/dist/cli/index.js +401 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/cloud/api/auth.d.ts +3 -2
- package/dist/cloud/api/auth.d.ts.map +1 -1
- package/dist/cloud/api/auth.js +10 -98
- package/dist/cloud/api/auth.js.map +1 -1
- 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/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 +7 -0
- package/dist/cloud/api/middleware/planLimits.d.ts.map +1 -1
- package/dist/cloud/api/middleware/planLimits.js +39 -1
- package/dist/cloud/api/middleware/planLimits.js.map +1 -1
- 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 +8 -1
- package/dist/cloud/api/onboarding.d.ts.map +1 -1
- package/dist/cloud/api/onboarding.js +300 -119
- package/dist/cloud/api/onboarding.js.map +1 -1
- 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.js +114 -42
- package/dist/cloud/api/providers.js.map +1 -1
- 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/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.js +225 -8
- package/dist/cloud/api/workspaces.js.map +1 -1
- package/dist/cloud/billing/plans.d.ts.map +1 -1
- package/dist/cloud/billing/plans.js +13 -0
- package/dist/cloud/billing/plans.js.map +1 -1
- package/dist/cloud/billing/types.d.ts +9 -3
- package/dist/cloud/billing/types.d.ts.map +1 -1
- package/dist/cloud/config.d.ts +9 -2
- package/dist/cloud/config.d.ts.map +1 -1
- package/dist/cloud/config.js +13 -4
- package/dist/cloud/config.js.map +1 -1
- package/dist/cloud/db/drizzle.d.ts +84 -1
- package/dist/cloud/db/drizzle.d.ts.map +1 -1
- package/dist/cloud/db/drizzle.js +470 -0
- package/dist/cloud/db/drizzle.js.map +1 -1
- package/dist/cloud/db/index.d.ts +9 -4
- package/dist/cloud/db/index.d.ts.map +1 -1
- package/dist/cloud/db/index.js +11 -3
- package/dist/cloud/db/index.js.map +1 -1
- package/dist/cloud/db/schema.d.ts +3283 -556
- package/dist/cloud/db/schema.d.ts.map +1 -1
- package/dist/cloud/db/schema.js +314 -1
- package/dist/cloud/db/schema.js.map +1 -1
- package/dist/cloud/index.d.ts +1 -0
- package/dist/cloud/index.d.ts.map +1 -1
- package/dist/cloud/index.js +2 -0
- package/dist/cloud/index.js.map +1 -1
- package/dist/cloud/provisioner/index.d.ts +24 -0
- package/dist/cloud/provisioner/index.d.ts.map +1 -1
- package/dist/cloud/provisioner/index.js +319 -18
- package/dist/cloud/provisioner/index.js.map +1 -1
- package/dist/cloud/server.d.ts +1 -0
- package/dist/cloud/server.d.ts.map +1 -1
- package/dist/cloud/server.js +357 -13
- package/dist/cloud/server.js.map +1 -1
- 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/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 +15 -0
- package/dist/cloud/services/planLimits.d.ts.map +1 -1
- package/dist/cloud/services/planLimits.js +28 -0
- package/dist/cloud/services/planLimits.js.map +1 -1
- 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.js +1 -1
- package/dist/cloud/vault/index.js.map +1 -1
- 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 +27 -0
- package/dist/daemon/agent-manager.d.ts.map +1 -1
- package/dist/daemon/agent-manager.js +107 -6
- package/dist/daemon/agent-manager.js.map +1 -1
- package/dist/daemon/agent-registry.d.ts +32 -0
- package/dist/daemon/agent-registry.d.ts.map +1 -1
- package/dist/daemon/agent-registry.js +42 -2
- package/dist/daemon/agent-registry.js.map +1 -1
- package/dist/daemon/api.d.ts +12 -0
- package/dist/daemon/api.d.ts.map +1 -1
- package/dist/daemon/api.js +131 -2
- package/dist/daemon/api.js.map +1 -1
- 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.map +1 -1
- package/dist/daemon/cloud-sync.js +9 -7
- package/dist/daemon/cloud-sync.js.map +1 -1
- package/dist/daemon/orchestrator.d.ts.map +1 -1
- package/dist/daemon/orchestrator.js +30 -0
- package/dist/daemon/orchestrator.js.map +1 -1
- package/dist/daemon/router.d.ts +5 -0
- package/dist/daemon/router.d.ts.map +1 -1
- package/dist/daemon/router.js +78 -26
- package/dist/daemon/router.js.map +1 -1
- package/dist/daemon/server.d.ts +5 -0
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +9 -1
- 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 +5 -1
- package/dist/daemon/types.d.ts.map +1 -1
- 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-b6edd4dde8d08194.js → page-56a8b4616a90dc43.js} +1 -1
- 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/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-c2f423b9c9f4591b.js → main-97850e03d723ea8c.js} +1 -1
- 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/app.html +1 -14
- package/dist/dashboard/out/app.txt +2 -2
- 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 -1
- package/dist/dashboard/out/history.txt +2 -2
- 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 -1
- package/dist/dashboard/out/metrics.txt +2 -2
- package/dist/dashboard/out/pricing.html +2 -2
- package/dist/dashboard/out/pricing.txt +2 -2
- 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/server.d.ts.map +1 -1
- package/dist/dashboard-server/server.js +1308 -8
- 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/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/index.d.ts +5 -0
- package/dist/resiliency/index.d.ts.map +1 -1
- package/dist/resiliency/index.js +5 -0
- package/dist/resiliency/index.js.map +1 -1
- 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/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/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 +38 -0
- package/dist/resiliency/supervisor.d.ts.map +1 -1
- package/dist/resiliency/supervisor.js +122 -0
- package/dist/resiliency/supervisor.js.map +1 -1
- 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 +1 -1
- package/dist/storage/adapter.d.ts.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/logger.js +1 -1
- package/dist/utils/logger.js.map +1 -1
- 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/parser.d.ts +10 -0
- package/dist/wrapper/parser.d.ts.map +1 -1
- package/dist/wrapper/parser.js +100 -33
- package/dist/wrapper/parser.js.map +1 -1
- package/dist/wrapper/pty-wrapper.d.ts +197 -16
- package/dist/wrapper/pty-wrapper.d.ts.map +1 -1
- package/dist/wrapper/pty-wrapper.js +943 -106
- 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 +73 -11
- package/dist/wrapper/tmux-wrapper.d.ts.map +1 -1
- package/dist/wrapper/tmux-wrapper.js +541 -120
- package/dist/wrapper/tmux-wrapper.js.map +1 -1
- package/docs/CLOUD-ARCHITECTURE.md +152 -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 +53 -47
- package/docs/archive/EXECUTIVE_SUMMARY.md +358 -0
- package/docs/archive/ROADMAP.md +329 -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/local-testing.md +428 -0
- package/docs/proposals/continuous-claude-integration.md +622 -0
- package/docs/proposals/custom-commands.md +368 -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 +16 -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/693-7b3301d8f6bc5014.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/713-f78477eb185f1f4d.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/766-e53e1cfe39b0b5b5.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/900-037c64bfd797fb2a.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/app/page-e3d9e1f4466b9bae.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/metrics/page-e68825a81db67ba1.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/page-cc108bf68c8a657f.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/webpack-a5acc2831d094776.js +0 -1
- package/dist/dashboard/out/_next/static/css/79b80143647a07d7.css +0 -1
- package/dist/dashboard/out/_next/static/css/8cf277370ad48cfe.css +0 -1
- /package/dist/dashboard/out/_next/static/{6HHWb2ZmnJ4OSm0zUP7h4 → H5aWG0udPB4iOUIl_gytz}/_buildManifest.js +0 -0
- /package/dist/dashboard/out/_next/static/{6HHWb2ZmnJ4OSm0zUP7h4 → H5aWG0udPB4iOUIl_gytz}/_ssgManifest.js +0 -0
- /package/dist/dashboard/out/_next/static/chunks/{117-b2cd8d6485aacf2b.js → 117-b100311aff8d5c61.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/{648-8f3f26864ce515e5.js → 648-a13d3c2b1be45466.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/app/_not-found/{page-0b990dbb71d72a98.js → page-a4973f3e3c82fb67.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/app/pricing/{page-d80e03a5297f95b6.js → page-4d72d5a5d8a9b618.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/{TESTING_PRESENCE_FEATURES.md → archive/TESTING_PRESENCE_FEATURES.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,184 @@
|
|
|
1
|
+
# Webhook Integrations - Task Breakdown
|
|
2
|
+
|
|
3
|
+
Tasks for future iterations of the webhook and integrations system.
|
|
4
|
+
Convert to beads tasks with: `bd import docs/tasks/webhook-integrations.tasks.md`
|
|
5
|
+
|
|
6
|
+
## Phase 1: Linear Full Integration [priority: high]
|
|
7
|
+
|
|
8
|
+
### linear-outbound-comments
|
|
9
|
+
- [ ] Create LinearIntegration service class
|
|
10
|
+
- [ ] Implement createComment() with Linear GraphQL API
|
|
11
|
+
- [ ] Add Linear API key management to workspace settings
|
|
12
|
+
- [ ] Add encryption for stored API keys
|
|
13
|
+
|
|
14
|
+
Dependencies: none
|
|
15
|
+
Estimate: 2 story points
|
|
16
|
+
|
|
17
|
+
### linear-outbound-state
|
|
18
|
+
- [ ] Implement setIssueState() for state transitions
|
|
19
|
+
- [ ] Implement getAvailableStates() to fetch team states
|
|
20
|
+
- [ ] Add state ID caching with TTL
|
|
21
|
+
|
|
22
|
+
Dependencies: linear-outbound-comments
|
|
23
|
+
Estimate: 1 story point
|
|
24
|
+
|
|
25
|
+
### linear-outbound-issues
|
|
26
|
+
- [ ] Implement createIssue() with full CreateIssueInput
|
|
27
|
+
- [ ] Implement updateIssue() for editing
|
|
28
|
+
- [ ] Implement assignIssue() for assignment changes
|
|
29
|
+
- [ ] Add label operations (add/remove)
|
|
30
|
+
|
|
31
|
+
Dependencies: linear-outbound-state
|
|
32
|
+
Estimate: 3 story points
|
|
33
|
+
|
|
34
|
+
### linear-webhook-state-change
|
|
35
|
+
- [ ] Parse issue state change webhooks
|
|
36
|
+
- [ ] Add `issue_state_changed` event type
|
|
37
|
+
- [ ] Create rule for auto-responding to state changes
|
|
38
|
+
|
|
39
|
+
Dependencies: none
|
|
40
|
+
Estimate: 1 story point
|
|
41
|
+
|
|
42
|
+
### linear-webhook-due-dates
|
|
43
|
+
- [ ] Parse due date approaching events
|
|
44
|
+
- [ ] Add `issue_due_soon` event type with configurable threshold
|
|
45
|
+
- [ ] Create reminder rule for approaching due dates
|
|
46
|
+
|
|
47
|
+
Dependencies: linear-webhook-state-change
|
|
48
|
+
Estimate: 1 story point
|
|
49
|
+
|
|
50
|
+
## Phase 2: Slack Enhanced [priority: high]
|
|
51
|
+
|
|
52
|
+
### slack-slash-commands
|
|
53
|
+
- [ ] Create slash command handler endpoint
|
|
54
|
+
- [ ] Parse slash command payloads
|
|
55
|
+
- [ ] Add slash_command event type
|
|
56
|
+
- [ ] Create agent spawning from slash commands
|
|
57
|
+
|
|
58
|
+
Dependencies: none
|
|
59
|
+
Estimate: 2 story points
|
|
60
|
+
|
|
61
|
+
### slack-interactive-components
|
|
62
|
+
- [ ] Handle button click callbacks
|
|
63
|
+
- [ ] Handle modal submission callbacks
|
|
64
|
+
- [ ] Add interactive_message event type
|
|
65
|
+
- [ ] Implement openModal() and updateModal()
|
|
66
|
+
|
|
67
|
+
Dependencies: slack-slash-commands
|
|
68
|
+
Estimate: 3 story points
|
|
69
|
+
|
|
70
|
+
### slack-rich-messages
|
|
71
|
+
- [ ] Implement postBlocks() with Block Kit
|
|
72
|
+
- [ ] Add common block templates (code, error, success)
|
|
73
|
+
- [ ] Add file upload support
|
|
74
|
+
- [ ] Add scheduled message support
|
|
75
|
+
|
|
76
|
+
Dependencies: none
|
|
77
|
+
Estimate: 2 story points
|
|
78
|
+
|
|
79
|
+
## Phase 3: GitHub Enhanced [priority: high]
|
|
80
|
+
|
|
81
|
+
### github-pr-management
|
|
82
|
+
- [ ] Parse PR opened/updated webhooks
|
|
83
|
+
- [ ] Add pr_opened, pr_updated event types
|
|
84
|
+
- [ ] Implement PR review request parsing
|
|
85
|
+
- [ ] Add createPR() outbound action
|
|
86
|
+
|
|
87
|
+
Dependencies: none
|
|
88
|
+
Estimate: 3 story points
|
|
89
|
+
|
|
90
|
+
### github-check-runs
|
|
91
|
+
- [ ] Implement createCheckRun() for CI status
|
|
92
|
+
- [ ] Implement updateCheckRun() for progress
|
|
93
|
+
- [ ] Add annotations support for inline errors
|
|
94
|
+
- [ ] Parse deployment status webhooks
|
|
95
|
+
|
|
96
|
+
Dependencies: github-pr-management
|
|
97
|
+
Estimate: 2 story points
|
|
98
|
+
|
|
99
|
+
### github-issue-management
|
|
100
|
+
- [ ] Implement createIssue()
|
|
101
|
+
- [ ] Implement addLabels() and removeLabels()
|
|
102
|
+
- [ ] Implement assignUsers()
|
|
103
|
+
- [ ] Add issue linking support
|
|
104
|
+
|
|
105
|
+
Dependencies: none
|
|
106
|
+
Estimate: 2 story points
|
|
107
|
+
|
|
108
|
+
## Phase 4: Agent Tools [priority: medium]
|
|
109
|
+
|
|
110
|
+
### agent-integration-tools
|
|
111
|
+
- [ ] Create integration tools accessible to agents
|
|
112
|
+
- [ ] Add LinearTool for agent actions
|
|
113
|
+
- [ ] Add SlackTool for agent messages
|
|
114
|
+
- [ ] Add GitHubTool for agent operations
|
|
115
|
+
|
|
116
|
+
Dependencies: linear-outbound-issues, slack-rich-messages, github-issue-management
|
|
117
|
+
Estimate: 4 story points
|
|
118
|
+
|
|
119
|
+
### agent-permissions
|
|
120
|
+
- [ ] Implement AgentIntegrationPermissions type
|
|
121
|
+
- [ ] Add permission checking before actions
|
|
122
|
+
- [ ] Create permission UI in spawn modal
|
|
123
|
+
- [ ] Add audit logging for all external calls
|
|
124
|
+
|
|
125
|
+
Dependencies: agent-integration-tools
|
|
126
|
+
Estimate: 2 story points
|
|
127
|
+
|
|
128
|
+
## Phase 5: Additional Integrations [priority: low]
|
|
129
|
+
|
|
130
|
+
### jira-integration
|
|
131
|
+
- [ ] Create Jira webhook parser
|
|
132
|
+
- [ ] Implement JiraIntegration service
|
|
133
|
+
- [ ] Add Jira responder
|
|
134
|
+
- [ ] Add workspace settings for Jira
|
|
135
|
+
|
|
136
|
+
Dependencies: agent-integration-tools
|
|
137
|
+
Estimate: 4 story points
|
|
138
|
+
|
|
139
|
+
### gitlab-integration
|
|
140
|
+
- [ ] Create GitLab webhook parser
|
|
141
|
+
- [ ] Implement GitLabIntegration service
|
|
142
|
+
- [ ] Add GitLab responder
|
|
143
|
+
- [ ] Map GitLab events to normalized format
|
|
144
|
+
|
|
145
|
+
Dependencies: agent-integration-tools
|
|
146
|
+
Estimate: 3 story points
|
|
147
|
+
|
|
148
|
+
### discord-integration
|
|
149
|
+
- [ ] Create Discord webhook parser
|
|
150
|
+
- [ ] Implement DiscordIntegration service
|
|
151
|
+
- [ ] Add Discord responder
|
|
152
|
+
- [ ] Handle Discord-specific message formatting
|
|
153
|
+
|
|
154
|
+
Dependencies: agent-integration-tools
|
|
155
|
+
Estimate: 3 story points
|
|
156
|
+
|
|
157
|
+
## Testing & Infrastructure
|
|
158
|
+
|
|
159
|
+
### webhook-load-testing
|
|
160
|
+
- [ ] Create load test suite for webhook endpoint
|
|
161
|
+
- [ ] Measure p50/p95/p99 latencies
|
|
162
|
+
- [ ] Test concurrent webhook handling
|
|
163
|
+
- [ ] Add rate limiting if needed
|
|
164
|
+
|
|
165
|
+
Dependencies: none
|
|
166
|
+
Estimate: 2 story points
|
|
167
|
+
|
|
168
|
+
### integration-mocks
|
|
169
|
+
- [ ] Create mock Linear API server for tests
|
|
170
|
+
- [ ] Create mock Slack API server for tests
|
|
171
|
+
- [ ] Create mock GitHub API server for tests
|
|
172
|
+
- [ ] Add E2E test suite with mocks
|
|
173
|
+
|
|
174
|
+
Dependencies: none
|
|
175
|
+
Estimate: 3 story points
|
|
176
|
+
|
|
177
|
+
### sandbox-testing
|
|
178
|
+
- [ ] Set up Linear sandbox workspace
|
|
179
|
+
- [ ] Set up Slack test workspace
|
|
180
|
+
- [ ] Set up GitHub test repository
|
|
181
|
+
- [ ] Create E2E test suite with real APIs
|
|
182
|
+
|
|
183
|
+
Dependencies: integration-mocks
|
|
184
|
+
Estimate: 2 story points
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Workspace Capabilities - Agent Discovery
|
|
2
|
+
|
|
3
|
+
How should agents discover and use workspace capabilities (browser testing, container spawning, etc.)?
|
|
4
|
+
|
|
5
|
+
## Problem Statement
|
|
6
|
+
|
|
7
|
+
We have workspace capabilities:
|
|
8
|
+
- Browser testing (Playwright, Xvfb, VNC)
|
|
9
|
+
- Container spawning (Docker socket)
|
|
10
|
+
- Potentially more in the future (E2B, Browserbase)
|
|
11
|
+
|
|
12
|
+
**Challenge:** How do agents know these exist without bloating context for every agent?
|
|
13
|
+
|
|
14
|
+
Current implementations exist but are not wired up:
|
|
15
|
+
- `src/daemon/services/browser-testing.ts`
|
|
16
|
+
- `src/daemon/services/container-spawner.ts`
|
|
17
|
+
- `deploy/workspace/Dockerfile.browser`
|
|
18
|
+
|
|
19
|
+
## Key Questions
|
|
20
|
+
|
|
21
|
+
### 1. Static vs Dynamic Discovery
|
|
22
|
+
- [ ] Should capabilities be in rules/skills (static, always injected)?
|
|
23
|
+
- [ ] Should capabilities be discovered via MCP at runtime (dynamic)?
|
|
24
|
+
- [ ] Hybrid: minimal hint in rules, full discovery via MCP?
|
|
25
|
+
|
|
26
|
+
### 2. Cloud vs Local
|
|
27
|
+
- [ ] Cloud workspaces: How are capabilities configured per workspace?
|
|
28
|
+
- [ ] Local daemons: How does the daemon know what's available?
|
|
29
|
+
- [ ] Should there be a "capability manifest" per workspace?
|
|
30
|
+
|
|
31
|
+
### 3. Context Budget
|
|
32
|
+
- [ ] How much context is acceptable for capability hints?
|
|
33
|
+
- [ ] Should agents ask for capabilities only when needed?
|
|
34
|
+
- [ ] Can we use tool descriptions instead of injected prompts?
|
|
35
|
+
|
|
36
|
+
### 4. Opt-in vs Opt-out
|
|
37
|
+
- [ ] Should capabilities be enabled by default?
|
|
38
|
+
- [ ] Per-workspace configuration?
|
|
39
|
+
- [ ] Per-agent configuration?
|
|
40
|
+
|
|
41
|
+
## Design Options
|
|
42
|
+
|
|
43
|
+
### Option A: MCP-Only Discovery
|
|
44
|
+
Agents call `workspace_capabilities` tool to discover what's available.
|
|
45
|
+
No static context injection.
|
|
46
|
+
|
|
47
|
+
**Pros:** Zero context overhead, dynamic
|
|
48
|
+
**Cons:** Agents might not know to call it
|
|
49
|
+
|
|
50
|
+
### Option B: Minimal Hint + MCP
|
|
51
|
+
One line in system prompt: "Call workspace_capabilities to check for browser/container tools"
|
|
52
|
+
|
|
53
|
+
**Pros:** Tiny context, agents know to look
|
|
54
|
+
**Cons:** Still some static injection
|
|
55
|
+
|
|
56
|
+
### Option C: Workspace Manifest
|
|
57
|
+
Each workspace has a capabilities.json that configures what's available.
|
|
58
|
+
Cloud provisions this, agents read at startup.
|
|
59
|
+
|
|
60
|
+
**Pros:** Explicit configuration
|
|
61
|
+
**Cons:** More infrastructure
|
|
62
|
+
|
|
63
|
+
### Option D: Auto-Detection
|
|
64
|
+
MCP server auto-detects capabilities (checks DISPLAY, docker.sock) and only exposes available tools.
|
|
65
|
+
|
|
66
|
+
**Pros:** Zero configuration, just works
|
|
67
|
+
**Cons:** Magic behavior
|
|
68
|
+
|
|
69
|
+
## Tasks
|
|
70
|
+
|
|
71
|
+
### capability-discovery-design
|
|
72
|
+
- [ ] Decide on discovery mechanism
|
|
73
|
+
- [ ] Document decision rationale
|
|
74
|
+
- [ ] Create ADR (Architecture Decision Record)
|
|
75
|
+
|
|
76
|
+
Dependencies: none
|
|
77
|
+
Priority: high
|
|
78
|
+
|
|
79
|
+
### capability-manifest-schema
|
|
80
|
+
- [ ] Define WorkspaceCapabilities schema
|
|
81
|
+
- [ ] Define how cloud provisions capabilities
|
|
82
|
+
- [ ] Define how daemon reads capabilities
|
|
83
|
+
|
|
84
|
+
Dependencies: capability-discovery-design
|
|
85
|
+
Priority: medium
|
|
86
|
+
|
|
87
|
+
### mcp-capability-tools
|
|
88
|
+
- [ ] Create MCP server for workspace tools
|
|
89
|
+
- [ ] Only expose tools for available capabilities
|
|
90
|
+
- [ ] Add workspace_capabilities discovery tool
|
|
91
|
+
|
|
92
|
+
Dependencies: capability-manifest-schema
|
|
93
|
+
Priority: medium
|
|
94
|
+
|
|
95
|
+
### agent-prompting-strategy
|
|
96
|
+
- [ ] Determine minimal context for capability awareness
|
|
97
|
+
- [ ] Test with real agents
|
|
98
|
+
- [ ] Measure context overhead
|
|
99
|
+
|
|
100
|
+
Dependencies: capability-discovery-design
|
|
101
|
+
Priority: medium
|
|
102
|
+
|
|
103
|
+
### cloud-workspace-config
|
|
104
|
+
- [ ] Add capabilities to workspace provisioning
|
|
105
|
+
- [ ] UI for enabling/disabling capabilities
|
|
106
|
+
- [ ] Per-workspace capability billing (if applicable)
|
|
107
|
+
|
|
108
|
+
Dependencies: capability-manifest-schema
|
|
109
|
+
Priority: low
|
|
110
|
+
|
|
111
|
+
## Notes
|
|
112
|
+
|
|
113
|
+
The core services are already implemented:
|
|
114
|
+
- Browser testing: `src/daemon/services/browser-testing.ts`
|
|
115
|
+
- Container spawning: `src/daemon/services/container-spawner.ts`
|
|
116
|
+
- Browser Dockerfile: `deploy/workspace/Dockerfile.browser`
|
|
117
|
+
|
|
118
|
+
What's missing is the discovery/awareness layer that doesn't bloat context.
|
|
119
|
+
|
|
120
|
+
See also:
|
|
121
|
+
- `docs/design/e2b-sandbox-integration.md` - E2B as alternative backend
|
|
@@ -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:**
|