agent-relay 1.2.0 โ 1.2.3
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/.gitattributes +3 -0
- package/.nvmrc +1 -0
- package/.trajectories/completed/2026-01/traj_1dviorhnkcb5.json +65 -0
- package/.trajectories/completed/2026-01/traj_1dviorhnkcb5.md +37 -0
- package/.trajectories/completed/2026-01/traj_1k5if5snst2e.json +65 -0
- package/.trajectories/completed/2026-01/traj_1k5if5snst2e.md +37 -0
- package/.trajectories/completed/2026-01/traj_1rp3rges5811.json +49 -0
- package/.trajectories/completed/2026-01/traj_1rp3rges5811.md +31 -0
- package/.trajectories/completed/2026-01/traj_22bhyulruouw.json +113 -0
- package/.trajectories/completed/2026-01/traj_22bhyulruouw.md +57 -0
- package/.trajectories/completed/2026-01/traj_2dao7ddgnta0.json +53 -0
- package/.trajectories/completed/2026-01/traj_2dao7ddgnta0.md +32 -0
- package/.trajectories/completed/2026-01/traj_3t0440mjeunc.json +26 -0
- package/.trajectories/completed/2026-01/traj_3t0440mjeunc.md +6 -0
- package/.trajectories/completed/2026-01/traj_45x9494d9xnr.json +47 -0
- package/.trajectories/completed/2026-01/traj_45x9494d9xnr.md +32 -0
- package/.trajectories/completed/2026-01/traj_4aa0bb77s4nh.json +53 -0
- package/.trajectories/completed/2026-01/traj_4aa0bb77s4nh.md +32 -0
- package/.trajectories/completed/2026-01/traj_5lhmzq8rxpqv.json +59 -0
- package/.trajectories/completed/2026-01/traj_5lhmzq8rxpqv.md +33 -0
- package/.trajectories/completed/2026-01/traj_5vr4e9erb1fs.json +53 -0
- package/.trajectories/completed/2026-01/traj_5vr4e9erb1fs.md +32 -0
- package/.trajectories/completed/2026-01/traj_6fgiwdoklvym.json +48 -0
- package/.trajectories/completed/2026-01/traj_6fgiwdoklvym.md +24 -0
- package/.trajectories/completed/2026-01/traj_7ludwvz45veh.json +209 -0
- package/.trajectories/completed/2026-01/traj_7ludwvz45veh.md +97 -0
- package/.trajectories/completed/2026-01/traj_9921cuhel0pj.json +48 -0
- package/.trajectories/completed/2026-01/traj_9921cuhel0pj.md +24 -0
- package/.trajectories/completed/2026-01/traj_ajs7zqfux4wc.json +49 -0
- package/.trajectories/completed/2026-01/traj_ajs7zqfux4wc.md +23 -0
- package/.trajectories/completed/2026-01/traj_cvtqhlwcq9s0.json +53 -0
- package/.trajectories/completed/2026-01/traj_cvtqhlwcq9s0.md +32 -0
- package/.trajectories/completed/2026-01/traj_cxofprm2m2en.json +49 -0
- package/.trajectories/completed/2026-01/traj_cxofprm2m2en.md +31 -0
- package/.trajectories/completed/2026-01/traj_d2hhz3k0vrhn.json +26 -0
- package/.trajectories/completed/2026-01/traj_d2hhz3k0vrhn.md +6 -0
- package/.trajectories/completed/2026-01/traj_dfuvww9pege5.json +59 -0
- package/.trajectories/completed/2026-01/traj_dfuvww9pege5.md +37 -0
- package/.trajectories/completed/2026-01/traj_g0fisy9h51mf.json +77 -0
- package/.trajectories/completed/2026-01/traj_g0fisy9h51mf.md +42 -0
- package/.trajectories/completed/2026-01/traj_gjdre5voouod.json +53 -0
- package/.trajectories/completed/2026-01/traj_gjdre5voouod.md +32 -0
- package/.trajectories/completed/2026-01/traj_gtlyqtta3x8l.json +25 -0
- package/.trajectories/completed/2026-01/traj_gtlyqtta3x8l.md +15 -0
- package/.trajectories/completed/2026-01/traj_h4xijiuip3w4.json +101 -0
- package/.trajectories/completed/2026-01/traj_h4xijiuip3w4.md +44 -0
- package/.trajectories/completed/2026-01/traj_hhxte7w4gjjx.json +22 -0
- package/.trajectories/completed/2026-01/traj_hhxte7w4gjjx.md +5 -0
- package/.trajectories/completed/2026-01/traj_hpungyhoj6v5.json +53 -0
- package/.trajectories/completed/2026-01/traj_hpungyhoj6v5.md +32 -0
- package/.trajectories/completed/2026-01/traj_m2xkjv0w2sq7.json +25 -0
- package/.trajectories/completed/2026-01/traj_m2xkjv0w2sq7.md +15 -0
- package/.trajectories/completed/2026-01/traj_noq5zbvnrdvz.json +53 -0
- package/.trajectories/completed/2026-01/traj_noq5zbvnrdvz.md +32 -0
- package/.trajectories/completed/2026-01/traj_ntbs6ppopf46.json +53 -0
- package/.trajectories/completed/2026-01/traj_ntbs6ppopf46.md +32 -0
- package/.trajectories/completed/2026-01/traj_ozd98si6a7ns.json +48 -0
- package/.trajectories/completed/2026-01/traj_ozd98si6a7ns.md +24 -0
- package/.trajectories/completed/2026-01/traj_prdza7a5cxp5.json +53 -0
- package/.trajectories/completed/2026-01/traj_prdza7a5cxp5.md +32 -0
- package/.trajectories/completed/2026-01/traj_qb3twvvywfwi.json +77 -0
- package/.trajectories/completed/2026-01/traj_qb3twvvywfwi.md +42 -0
- package/.trajectories/completed/2026-01/traj_qft54mi7nfor.json +53 -0
- package/.trajectories/completed/2026-01/traj_qft54mi7nfor.md +32 -0
- package/.trajectories/completed/2026-01/traj_qx9uhf8whhxo.json +83 -0
- package/.trajectories/completed/2026-01/traj_qx9uhf8whhxo.md +47 -0
- package/.trajectories/completed/2026-01/traj_rd9toccj18a0.json +59 -0
- package/.trajectories/completed/2026-01/traj_rd9toccj18a0.md +37 -0
- package/.trajectories/completed/2026-01/traj_rt4fiw3ecp50.json +48 -0
- package/.trajectories/completed/2026-01/traj_rt4fiw3ecp50.md +16 -0
- package/.trajectories/completed/2026-01/traj_st8j35b0hrlc.json +59 -0
- package/.trajectories/completed/2026-01/traj_st8j35b0hrlc.md +37 -0
- package/.trajectories/completed/2026-01/traj_t1yy8m7hbuxp.json +53 -0
- package/.trajectories/completed/2026-01/traj_t1yy8m7hbuxp.md +32 -0
- package/.trajectories/completed/2026-01/traj_tmux_orchestrator_analysis.json +84 -0
- package/.trajectories/completed/2026-01/traj_tmux_orchestrator_analysis.md +109 -0
- package/.trajectories/completed/2026-01/traj_u9n9eqasw16k.json +53 -0
- package/.trajectories/completed/2026-01/traj_u9n9eqasw16k.md +32 -0
- package/.trajectories/completed/2026-01/traj_v87hypnongqx.json +71 -0
- package/.trajectories/completed/2026-01/traj_v87hypnongqx.md +42 -0
- package/.trajectories/completed/2026-01/traj_wkp2fgzdyinb.json +53 -0
- package/.trajectories/completed/2026-01/traj_wkp2fgzdyinb.md +32 -0
- package/.trajectories/completed/2026-01/traj_x14t8w8rn7xg.json +20 -0
- package/.trajectories/completed/2026-01/traj_x14t8w8rn7xg.md +6 -0
- package/.trajectories/completed/2026-01/traj_xnwbznkvv8ua.json +175 -0
- package/.trajectories/completed/2026-01/traj_xnwbznkvv8ua.md +82 -0
- package/.trajectories/completed/2026-01/traj_ysjc8zaeqtd3.json +47 -0
- package/.trajectories/completed/2026-01/traj_ysjc8zaeqtd3.md +32 -0
- package/.trajectories/completed/2026-01/traj_yvdadtvdgnz3.json +59 -0
- package/.trajectories/completed/2026-01/traj_yvdadtvdgnz3.md +37 -0
- package/.trajectories/completed/2026-01/traj_z0vcw1wrzide.json +53 -0
- package/.trajectories/completed/2026-01/traj_z0vcw1wrzide.md +32 -0
- package/.trajectories/index.json +314 -0
- package/ARCHITECTURE.md +1245 -0
- package/TESTING.md +278 -0
- package/deploy/init-db.sql +5 -0
- package/deploy/scripts/setup-fly-workspaces.sh +69 -0
- package/deploy/scripts/setup-railway.sh +75 -0
- package/deploy/workspace/entrypoint-browser.sh +118 -0
- package/deploy/workspace/entrypoint.sh +348 -0
- package/deploy/workspace/git-credential-relay +111 -0
- package/dist/cli/index.js +218 -1
- package/dist/cloud/api/billing.js +30 -9
- package/dist/cloud/api/codex-auth-helper.d.ts +15 -0
- package/dist/cloud/api/codex-auth-helper.js +100 -0
- package/dist/cloud/api/git.js +24 -3
- package/dist/cloud/api/onboarding.js +15 -2
- package/dist/cloud/api/repos.d.ts +1 -0
- package/dist/cloud/api/repos.js +186 -0
- package/dist/cloud/api/webhooks.d.ts +1 -0
- package/dist/cloud/api/webhooks.js +149 -0
- package/dist/cloud/api/workspaces.js +97 -6
- package/dist/cloud/billing/plans.js +19 -19
- package/dist/cloud/provisioner/index.d.ts +32 -0
- package/dist/cloud/provisioner/index.js +362 -21
- package/dist/cloud/server.js +6 -1
- package/dist/cloud/services/nango.d.ts +60 -0
- package/dist/cloud/services/nango.js +153 -0
- package/dist/cloud/services/planLimits.d.ts +22 -0
- package/dist/cloud/services/planLimits.js +58 -5
- package/dist/dashboard/out/404.html +1 -1
- package/dist/dashboard/out/_next/static/chunks/699-3b1cd6618a45d259.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/766-1f2dd8cb7f766b0b.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/app/onboarding/page-3fdfa60e53f2810d.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/app/page-e6381e5a6e1fbcfd.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/connect-repos/page-3538dfe0ffe984b8.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/history/{page-56a8b4616a90dc43.js โ page-abb9ab2d329f56e9.js} +1 -1
- package/dist/dashboard/out/_next/static/chunks/app/layout-c0d118c0f92d969c.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/login/{page-3eac37ea6f5dd153.js โ page-c22d080201cbd9fb.js} +1 -1
- package/dist/dashboard/out/_next/static/chunks/app/metrics/{page-1081dd190a331a91.js โ page-67a3e98d9a43a6ed.js} +1 -1
- package/dist/dashboard/out/_next/static/chunks/app/{page-daf87e86f783f980.js โ page-77e9c65420a06cfb.js} +1 -1
- package/dist/dashboard/out/_next/static/chunks/app/pricing/page-b08ed1c34d14434a.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/providers/page-e88bc117ef7671c3.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/signup/{page-fee4ed1709070bcd.js โ page-68d34f50baa8ab6b.js} +1 -1
- package/dist/dashboard/out/_next/static/chunks/{main-app-5d692157a8eb1fd9.js โ main-app-6e8e8d3ef4e0192a.js} +1 -1
- package/dist/dashboard/out/_next/static/chunks/{main-97850e03d723ea8c.js โ main-ed4e1fb6f29c34cf.js} +1 -1
- package/dist/dashboard/out/_next/static/css/7c3ae9e8617d42a5.css +1 -0
- package/dist/dashboard/out/app/onboarding.html +1 -0
- package/dist/dashboard/out/app/onboarding.txt +7 -0
- package/dist/dashboard/out/app.html +1 -1
- package/dist/dashboard/out/app.txt +2 -2
- package/dist/dashboard/out/connect-repos.html +1 -1
- package/dist/dashboard/out/connect-repos.txt +2 -2
- 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 +2 -2
- package/dist/dashboard/out/login.txt +2 -2
- package/dist/dashboard/out/metrics.html +1 -1
- package/dist/dashboard/out/metrics.txt +2 -2
- package/dist/dashboard/out/pricing.html +3 -3
- package/dist/dashboard/out/pricing.txt +2 -2
- package/dist/dashboard/out/providers.html +1 -1
- package/dist/dashboard/out/providers.txt +2 -2
- package/dist/dashboard/out/signup.html +2 -2
- package/dist/dashboard/out/signup.txt +2 -2
- package/package.json +2 -11
- package/test-push.txt +1 -0
- package/bin/tmux +0 -0
- package/dist/bridge/config.d.ts.map +0 -1
- package/dist/bridge/config.js.map +0 -1
- package/dist/bridge/index.d.ts.map +0 -1
- package/dist/bridge/index.js.map +0 -1
- package/dist/bridge/multi-project-client.d.ts.map +0 -1
- package/dist/bridge/multi-project-client.js.map +0 -1
- package/dist/bridge/shadow-cli.d.ts.map +0 -1
- package/dist/bridge/shadow-cli.js.map +0 -1
- package/dist/bridge/shadow-config.d.ts.map +0 -1
- package/dist/bridge/shadow-config.js.map +0 -1
- package/dist/bridge/spawner.d.ts.map +0 -1
- package/dist/bridge/spawner.js.map +0 -1
- package/dist/bridge/teams-config.d.ts.map +0 -1
- package/dist/bridge/teams-config.js.map +0 -1
- package/dist/bridge/types.d.ts.map +0 -1
- package/dist/bridge/types.js.map +0 -1
- package/dist/bridge/utils.d.ts.map +0 -1
- package/dist/bridge/utils.js.map +0 -1
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js.map +0 -1
- package/dist/cloud/api/auth.d.ts.map +0 -1
- package/dist/cloud/api/auth.js.map +0 -1
- package/dist/cloud/api/billing.d.ts.map +0 -1
- package/dist/cloud/api/billing.js.map +0 -1
- package/dist/cloud/api/cli-pty-runner.d.ts.map +0 -1
- package/dist/cloud/api/cli-pty-runner.js.map +0 -1
- package/dist/cloud/api/coordinators.d.ts.map +0 -1
- package/dist/cloud/api/coordinators.js.map +0 -1
- package/dist/cloud/api/daemons.d.ts.map +0 -1
- package/dist/cloud/api/daemons.js.map +0 -1
- package/dist/cloud/api/generic-webhooks.d.ts.map +0 -1
- package/dist/cloud/api/generic-webhooks.js.map +0 -1
- package/dist/cloud/api/git.d.ts.map +0 -1
- package/dist/cloud/api/git.js.map +0 -1
- package/dist/cloud/api/github-app.d.ts.map +0 -1
- package/dist/cloud/api/github-app.js.map +0 -1
- package/dist/cloud/api/middleware/planLimits.d.ts.map +0 -1
- package/dist/cloud/api/middleware/planLimits.js.map +0 -1
- package/dist/cloud/api/monitoring.d.ts.map +0 -1
- package/dist/cloud/api/monitoring.js.map +0 -1
- package/dist/cloud/api/nango-auth.d.ts.map +0 -1
- package/dist/cloud/api/nango-auth.js.map +0 -1
- package/dist/cloud/api/onboarding.d.ts.map +0 -1
- package/dist/cloud/api/onboarding.js.map +0 -1
- package/dist/cloud/api/policy.d.ts.map +0 -1
- package/dist/cloud/api/policy.js.map +0 -1
- package/dist/cloud/api/providers.d.ts.map +0 -1
- package/dist/cloud/api/providers.js.map +0 -1
- package/dist/cloud/api/repos.d.ts.map +0 -1
- package/dist/cloud/api/repos.js.map +0 -1
- package/dist/cloud/api/teams.d.ts.map +0 -1
- package/dist/cloud/api/teams.js.map +0 -1
- package/dist/cloud/api/test-helpers.d.ts.map +0 -1
- package/dist/cloud/api/test-helpers.js.map +0 -1
- package/dist/cloud/api/usage.d.ts.map +0 -1
- package/dist/cloud/api/usage.js.map +0 -1
- package/dist/cloud/api/webhooks.d.ts.map +0 -1
- package/dist/cloud/api/webhooks.js.map +0 -1
- package/dist/cloud/api/workspaces.d.ts.map +0 -1
- package/dist/cloud/api/workspaces.js.map +0 -1
- package/dist/cloud/billing/index.d.ts.map +0 -1
- package/dist/cloud/billing/index.js.map +0 -1
- package/dist/cloud/billing/plans.d.ts.map +0 -1
- package/dist/cloud/billing/plans.js.map +0 -1
- package/dist/cloud/billing/service.d.ts.map +0 -1
- package/dist/cloud/billing/service.js.map +0 -1
- package/dist/cloud/billing/types.d.ts.map +0 -1
- package/dist/cloud/billing/types.js.map +0 -1
- package/dist/cloud/config.d.ts.map +0 -1
- package/dist/cloud/config.js.map +0 -1
- package/dist/cloud/db/drizzle.d.ts.map +0 -1
- package/dist/cloud/db/drizzle.js.map +0 -1
- package/dist/cloud/db/index.d.ts.map +0 -1
- package/dist/cloud/db/index.js.map +0 -1
- package/dist/cloud/db/schema.d.ts.map +0 -1
- package/dist/cloud/db/schema.js.map +0 -1
- package/dist/cloud/index.d.ts.map +0 -1
- package/dist/cloud/index.js.map +0 -1
- package/dist/cloud/provisioner/index.d.ts.map +0 -1
- package/dist/cloud/provisioner/index.js.map +0 -1
- package/dist/cloud/server.d.ts.map +0 -1
- package/dist/cloud/server.js.map +0 -1
- package/dist/cloud/services/auto-scaler.d.ts.map +0 -1
- package/dist/cloud/services/auto-scaler.js.map +0 -1
- package/dist/cloud/services/capacity-manager.d.ts.map +0 -1
- package/dist/cloud/services/capacity-manager.js.map +0 -1
- package/dist/cloud/services/ci-agent-spawner.d.ts.map +0 -1
- package/dist/cloud/services/ci-agent-spawner.js.map +0 -1
- package/dist/cloud/services/coordinator.d.ts.map +0 -1
- package/dist/cloud/services/coordinator.js.map +0 -1
- package/dist/cloud/services/index.d.ts.map +0 -1
- package/dist/cloud/services/index.js.map +0 -1
- package/dist/cloud/services/mention-handler.d.ts.map +0 -1
- package/dist/cloud/services/mention-handler.js.map +0 -1
- package/dist/cloud/services/nango.d.ts.map +0 -1
- package/dist/cloud/services/nango.js.map +0 -1
- package/dist/cloud/services/persistence.d.ts.map +0 -1
- package/dist/cloud/services/persistence.js.map +0 -1
- package/dist/cloud/services/planLimits.d.ts.map +0 -1
- package/dist/cloud/services/planLimits.js.map +0 -1
- package/dist/cloud/services/scaling-orchestrator.d.ts.map +0 -1
- package/dist/cloud/services/scaling-orchestrator.js.map +0 -1
- package/dist/cloud/services/scaling-policy.d.ts.map +0 -1
- package/dist/cloud/services/scaling-policy.js.map +0 -1
- package/dist/cloud/vault/index.d.ts.map +0 -1
- package/dist/cloud/vault/index.js.map +0 -1
- package/dist/cloud/webhooks/index.d.ts.map +0 -1
- package/dist/cloud/webhooks/index.js.map +0 -1
- package/dist/cloud/webhooks/parsers/github.d.ts.map +0 -1
- package/dist/cloud/webhooks/parsers/github.js.map +0 -1
- package/dist/cloud/webhooks/parsers/index.d.ts.map +0 -1
- package/dist/cloud/webhooks/parsers/index.js.map +0 -1
- package/dist/cloud/webhooks/parsers/linear.d.ts.map +0 -1
- package/dist/cloud/webhooks/parsers/linear.js.map +0 -1
- package/dist/cloud/webhooks/parsers/slack.d.ts.map +0 -1
- package/dist/cloud/webhooks/parsers/slack.js.map +0 -1
- package/dist/cloud/webhooks/responders/github.d.ts.map +0 -1
- package/dist/cloud/webhooks/responders/github.js.map +0 -1
- package/dist/cloud/webhooks/responders/index.d.ts.map +0 -1
- package/dist/cloud/webhooks/responders/index.js.map +0 -1
- package/dist/cloud/webhooks/responders/linear.d.ts.map +0 -1
- package/dist/cloud/webhooks/responders/linear.js.map +0 -1
- package/dist/cloud/webhooks/responders/slack.d.ts.map +0 -1
- package/dist/cloud/webhooks/responders/slack.js.map +0 -1
- package/dist/cloud/webhooks/router.d.ts.map +0 -1
- package/dist/cloud/webhooks/router.js.map +0 -1
- package/dist/cloud/webhooks/rules-engine.d.ts.map +0 -1
- package/dist/cloud/webhooks/rules-engine.js.map +0 -1
- package/dist/cloud/webhooks/types.d.ts.map +0 -1
- package/dist/cloud/webhooks/types.js.map +0 -1
- package/dist/continuity/formatter.d.ts.map +0 -1
- package/dist/continuity/formatter.js.map +0 -1
- package/dist/continuity/handoff-store.d.ts.map +0 -1
- package/dist/continuity/handoff-store.js.map +0 -1
- package/dist/continuity/index.d.ts.map +0 -1
- package/dist/continuity/index.js.map +0 -1
- package/dist/continuity/ledger-store.d.ts.map +0 -1
- package/dist/continuity/ledger-store.js.map +0 -1
- package/dist/continuity/manager.d.ts.map +0 -1
- package/dist/continuity/manager.js.map +0 -1
- package/dist/continuity/parser.d.ts.map +0 -1
- package/dist/continuity/parser.js.map +0 -1
- package/dist/continuity/types.d.ts.map +0 -1
- package/dist/continuity/types.js.map +0 -1
- package/dist/daemon/agent-manager.d.ts.map +0 -1
- package/dist/daemon/agent-manager.js.map +0 -1
- package/dist/daemon/agent-registry.d.ts.map +0 -1
- package/dist/daemon/agent-registry.js.map +0 -1
- package/dist/daemon/api.d.ts.map +0 -1
- package/dist/daemon/api.js.map +0 -1
- package/dist/daemon/auth.d.ts.map +0 -1
- package/dist/daemon/auth.js.map +0 -1
- package/dist/daemon/cli-auth.d.ts.map +0 -1
- package/dist/daemon/cli-auth.js.map +0 -1
- package/dist/daemon/cloud-sync.d.ts.map +0 -1
- package/dist/daemon/cloud-sync.js.map +0 -1
- package/dist/daemon/connection.d.ts.map +0 -1
- package/dist/daemon/connection.js.map +0 -1
- package/dist/daemon/index.d.ts.map +0 -1
- package/dist/daemon/index.js.map +0 -1
- package/dist/daemon/orchestrator.d.ts.map +0 -1
- package/dist/daemon/orchestrator.js.map +0 -1
- package/dist/daemon/registry.d.ts.map +0 -1
- package/dist/daemon/registry.js.map +0 -1
- package/dist/daemon/router.d.ts.map +0 -1
- package/dist/daemon/router.js.map +0 -1
- package/dist/daemon/server.d.ts.map +0 -1
- package/dist/daemon/server.js.map +0 -1
- package/dist/daemon/services/browser-testing.d.ts.map +0 -1
- package/dist/daemon/services/browser-testing.js.map +0 -1
- package/dist/daemon/services/container-spawner.d.ts.map +0 -1
- package/dist/daemon/services/container-spawner.js.map +0 -1
- package/dist/daemon/types.d.ts.map +0 -1
- package/dist/daemon/types.js.map +0 -1
- package/dist/daemon/workspace-manager.d.ts.map +0 -1
- package/dist/daemon/workspace-manager.js.map +0 -1
- package/dist/dashboard/out/_next/static/chunks/480-2d4111711d4e473c.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/766-c3a14283c88d815b.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/app/page-7120be68bea622f3.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/connect-repos/page-dc2e3a1a22478efc.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/layout-2433bb48965f4333.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/pricing/page-4d72d5a5d8a9b618.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/providers/page-b68a681526eb145e.js +0 -1
- package/dist/dashboard/out/_next/static/css/411ce23ffeae9f76.css +0 -1
- package/dist/dashboard-server/metrics.d.ts.map +0 -1
- package/dist/dashboard-server/metrics.js.map +0 -1
- package/dist/dashboard-server/needs-attention.d.ts.map +0 -1
- package/dist/dashboard-server/needs-attention.js.map +0 -1
- package/dist/dashboard-server/server.d.ts.map +0 -1
- package/dist/dashboard-server/server.js.map +0 -1
- package/dist/dashboard-server/start.d.ts.map +0 -1
- package/dist/dashboard-server/start.js.map +0 -1
- package/dist/hooks/emitter.d.ts.map +0 -1
- package/dist/hooks/emitter.js.map +0 -1
- package/dist/hooks/inbox-check/hook.d.ts.map +0 -1
- package/dist/hooks/inbox-check/hook.js.map +0 -1
- package/dist/hooks/inbox-check/index.d.ts.map +0 -1
- package/dist/hooks/inbox-check/index.js.map +0 -1
- package/dist/hooks/inbox-check/types.d.ts.map +0 -1
- package/dist/hooks/inbox-check/types.js.map +0 -1
- package/dist/hooks/inbox-check/utils.d.ts.map +0 -1
- package/dist/hooks/inbox-check/utils.js.map +0 -1
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/index.js.map +0 -1
- package/dist/hooks/registry.d.ts.map +0 -1
- package/dist/hooks/registry.js.map +0 -1
- package/dist/hooks/trajectory-hooks.d.ts.map +0 -1
- package/dist/hooks/trajectory-hooks.js.map +0 -1
- package/dist/hooks/types.d.ts.map +0 -1
- package/dist/hooks/types.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/memory/adapters/index.d.ts.map +0 -1
- package/dist/memory/adapters/index.js.map +0 -1
- package/dist/memory/adapters/inmemory.d.ts.map +0 -1
- package/dist/memory/adapters/inmemory.js.map +0 -1
- package/dist/memory/adapters/supermemory.d.ts.map +0 -1
- package/dist/memory/adapters/supermemory.js.map +0 -1
- package/dist/memory/factory.d.ts.map +0 -1
- package/dist/memory/factory.js.map +0 -1
- package/dist/memory/index.d.ts.map +0 -1
- package/dist/memory/index.js.map +0 -1
- package/dist/memory/memory-hooks.d.ts.map +0 -1
- package/dist/memory/memory-hooks.js.map +0 -1
- package/dist/memory/service.d.ts.map +0 -1
- package/dist/memory/service.js.map +0 -1
- package/dist/memory/types.d.ts.map +0 -1
- package/dist/memory/types.js.map +0 -1
- package/dist/policy/agent-policy.d.ts.map +0 -1
- package/dist/policy/agent-policy.js.map +0 -1
- package/dist/policy/cloud-policy-fetcher.d.ts.map +0 -1
- package/dist/policy/cloud-policy-fetcher.js.map +0 -1
- package/dist/protocol/framing.d.ts.map +0 -1
- package/dist/protocol/framing.js.map +0 -1
- package/dist/protocol/index.d.ts.map +0 -1
- package/dist/protocol/index.js.map +0 -1
- package/dist/protocol/types.d.ts.map +0 -1
- package/dist/protocol/types.js.map +0 -1
- package/dist/resiliency/context-persistence.d.ts.map +0 -1
- package/dist/resiliency/context-persistence.js.map +0 -1
- package/dist/resiliency/crash-insights.d.ts.map +0 -1
- package/dist/resiliency/crash-insights.js.map +0 -1
- package/dist/resiliency/gossip-health.d.ts.map +0 -1
- package/dist/resiliency/gossip-health.js.map +0 -1
- package/dist/resiliency/health-monitor.d.ts.map +0 -1
- package/dist/resiliency/health-monitor.js.map +0 -1
- package/dist/resiliency/index.d.ts.map +0 -1
- package/dist/resiliency/index.js.map +0 -1
- package/dist/resiliency/leader-watchdog.d.ts.map +0 -1
- package/dist/resiliency/leader-watchdog.js.map +0 -1
- package/dist/resiliency/logger.d.ts.map +0 -1
- package/dist/resiliency/logger.js.map +0 -1
- package/dist/resiliency/memory-monitor.d.ts.map +0 -1
- package/dist/resiliency/memory-monitor.js.map +0 -1
- package/dist/resiliency/metrics.d.ts.map +0 -1
- package/dist/resiliency/metrics.js.map +0 -1
- package/dist/resiliency/provider-context.d.ts.map +0 -1
- package/dist/resiliency/provider-context.js.map +0 -1
- package/dist/resiliency/stateless-lead.d.ts.map +0 -1
- package/dist/resiliency/stateless-lead.js.map +0 -1
- package/dist/resiliency/supervisor.d.ts.map +0 -1
- package/dist/resiliency/supervisor.js.map +0 -1
- package/dist/shared/cli-auth-config.d.ts.map +0 -1
- package/dist/shared/cli-auth-config.js.map +0 -1
- package/dist/state/agent-state.d.ts.map +0 -1
- package/dist/state/agent-state.js.map +0 -1
- package/dist/storage/adapter.d.ts.map +0 -1
- package/dist/storage/adapter.js.map +0 -1
- package/dist/storage/sqlite-adapter.d.ts.map +0 -1
- package/dist/storage/sqlite-adapter.js.map +0 -1
- package/dist/trajectory/config.d.ts.map +0 -1
- package/dist/trajectory/config.js.map +0 -1
- package/dist/trajectory/index.d.ts.map +0 -1
- package/dist/trajectory/index.js.map +0 -1
- package/dist/trajectory/integration.d.ts.map +0 -1
- package/dist/trajectory/integration.js.map +0 -1
- package/dist/utils/agent-config.d.ts.map +0 -1
- package/dist/utils/agent-config.js.map +0 -1
- package/dist/utils/command-resolver.d.ts.map +0 -1
- package/dist/utils/command-resolver.js.map +0 -1
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/name-generator.d.ts.map +0 -1
- package/dist/utils/name-generator.js.map +0 -1
- package/dist/utils/project-namespace.d.ts.map +0 -1
- package/dist/utils/project-namespace.js.map +0 -1
- package/dist/utils/tmux-resolver.d.ts.map +0 -1
- package/dist/utils/tmux-resolver.js.map +0 -1
- package/dist/utils/update-checker.d.ts.map +0 -1
- package/dist/utils/update-checker.js.map +0 -1
- package/dist/wrapper/client.d.ts.map +0 -1
- package/dist/wrapper/client.js.map +0 -1
- package/dist/wrapper/inbox.d.ts.map +0 -1
- package/dist/wrapper/inbox.js.map +0 -1
- package/dist/wrapper/index.d.ts.map +0 -1
- package/dist/wrapper/index.js.map +0 -1
- package/dist/wrapper/parser.d.ts.map +0 -1
- package/dist/wrapper/parser.js.map +0 -1
- package/dist/wrapper/pty-wrapper.d.ts.map +0 -1
- package/dist/wrapper/pty-wrapper.js.map +0 -1
- package/dist/wrapper/shared.d.ts.map +0 -1
- package/dist/wrapper/shared.js.map +0 -1
- package/dist/wrapper/tmux-wrapper.d.ts.map +0 -1
- package/dist/wrapper/tmux-wrapper.js.map +0 -1
- package/docs/AGENTS.md +0 -513
- package/docs/ARCHITECTURE_DECISIONS.md +0 -175
- package/docs/CLOUD-ARCHITECTURE.md +0 -804
- package/docs/CLOUD-ONBOARDING-DESIGN.md +0 -1983
- package/docs/CONTRIBUTING.md +0 -151
- package/docs/HOOKS_API.md +0 -394
- package/docs/INTEGRATION-GUIDE.md +0 -926
- package/docs/PROTOCOL.md +0 -325
- package/docs/WRAPPER_EVENTS.md +0 -358
- package/docs/agent-policy-snippet.md +0 -40
- package/docs/agent-relay-protocol.md +0 -238
- package/docs/agent-relay-snippet.md +0 -174
- package/docs/archive/CHANGELOG.md +0 -11
- package/docs/archive/CLI-SIMPLIFICATION-COMPLETE.md +0 -48
- package/docs/archive/DESIGN_BRIDGE_STAFFING.md +0 -878
- package/docs/archive/DESIGN_V2.md +0 -1079
- package/docs/archive/EXECUTIVE_SUMMARY.md +0 -358
- package/docs/archive/MONETIZATION.md +0 -1679
- package/docs/archive/PROPOSAL-trajectories.md +0 -1582
- package/docs/archive/ROADMAP.md +0 -329
- package/docs/archive/SCALING_ANALYSIS.md +0 -280
- package/docs/archive/TESTING_PRESENCE_FEATURES.md +0 -327
- package/docs/archive/TMUX_IMPLEMENTATION_NOTES.md +0 -364
- package/docs/archive/TMUX_IMPROVEMENTS.md +0 -968
- package/docs/archive/dashboard-v2-plan.md +0 -179
- package/docs/archive/removable-code-analysis.md +0 -24
- package/docs/competitive/GASTOWN.md +0 -451
- package/docs/competitive/MCP_AGENT_MAIL.md +0 -389
- package/docs/competitive/OVERVIEW.md +0 -898
- package/docs/competitive/README.md +0 -34
- package/docs/competitive/TMUX_ORCHESTRATOR.md +0 -605
- package/docs/dashboard.png +0 -0
- package/docs/design/ci-failure-webhooks.md +0 -812
- package/docs/design/comprehensive-integrations.md +0 -238
- package/docs/design/e2b-sandbox-integration.md +0 -504
- package/docs/design/github-app-permissions.md +0 -264
- package/docs/guides/CLOUD.md +0 -236
- package/docs/guides/LOCAL.md +0 -535
- package/docs/guides/SELF-HOSTED.md +0 -494
- package/docs/local-testing.md +0 -428
- package/docs/proposals/continuous-claude-integration.md +0 -622
- package/docs/proposals/custom-commands.md +0 -368
- package/docs/proposals/shadow-as-subagent.md +0 -765
- package/docs/proposals/slack-bot-integration.md +0 -1457
- package/docs/tasks/global-skills-system.tasks.md +0 -230
- package/docs/tasks/webhook-integrations.tasks.md +0 -184
- package/docs/tasks/workspace-capabilities.tasks.md +0 -121
- package/docs/testing/RESILIENCY-TEST-PLAN-2026-01-01.md +0 -366
- package/scripts/cloud-setup.sh +0 -96
- package/scripts/dev/PUBLIC_RELEASE_PLAN.md +0 -88
- package/scripts/dev/dev-team-setup.sh +0 -431
- package/scripts/e2e-test.sh +0 -119
- package/scripts/games/game-protocol.md +0 -79
- package/scripts/games/hearts-setup.sh +0 -264
- package/scripts/manual-qa.sh +0 -293
- package/scripts/run-cloud-qa.sh +0 -220
- package/scripts/test-cli-auth/Dockerfile +0 -44
- package/scripts/test-cli-auth/Dockerfile.real +0 -79
- package/scripts/test-cli-auth/README.md +0 -286
- package/scripts/test-cli-auth/ci-test-real-clis.ts +0 -251
- package/scripts/test-cli-auth/ci-test-runner.ts +0 -263
- package/scripts/test-cli-auth/mock-cli.sh +0 -147
- package/scripts/test-cli-auth/package.json +0 -14
- package/scripts/test-cli-auth/test-oauth-flow.ts +0 -220
- package/scripts/test-pty-input-auto.js +0 -222
- package/scripts/test-pty-input.js +0 -150
- package/scripts/tictactoe-setup.sh +0 -181
- /package/dist/dashboard/out/_next/static/chunks/{117-b100311aff8d5c61.js โ 117-f7b8ab0809342e77.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/{648-a13d3c2b1be45466.js โ 648-5cc6e1921389a58a.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/{724-73c1ee5f60abe860.js โ 724-2dae7627550ab88f.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/app/_not-found/{page-a4973f3e3c82fb67.js โ page-53b8a69f76db17d0.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/{fd9d1056-bf46c09eb57e019c.js โ fd9d1056-609918ca7b6280bb.js} +0 -0
- /package/dist/dashboard/out/_next/static/{H5aWG0udPB4iOUIl_gytz โ wPgKJtcOmTFLpUncDg16A}/_buildManifest.js +0 -0
- /package/dist/dashboard/out/_next/static/{H5aWG0udPB4iOUIl_gytz โ wPgKJtcOmTFLpUncDg16A}/_ssgManifest.js +0 -0
|
@@ -1,366 +0,0 @@
|
|
|
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/scripts/cloud-setup.sh
DELETED
|
@@ -1,96 +0,0 @@
|
|
|
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 ""
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
# Agent-Relay Public Release Plan
|
|
2
|
-
|
|
3
|
-
## Goal
|
|
4
|
-
Prepare agent-relay for public release on npm and GitHub with comprehensive documentation, examples, and polish.
|
|
5
|
-
|
|
6
|
-
## Team Structure
|
|
7
|
-
|
|
8
|
-
### Agent 1: DocWriter (Claude) - Documentation & Examples
|
|
9
|
-
**Focus:** User-facing content, tutorials, examples
|
|
10
|
-
**Workdir:** `/Users/khaliqgant/Projects/prpm/agent-relay`
|
|
11
|
-
|
|
12
|
-
Tasks:
|
|
13
|
-
- [ ] Review and improve README.md
|
|
14
|
-
- Add GIF/video demo of quick start usage
|
|
15
|
-
- Improve quick start section
|
|
16
|
-
- Add "Common Use Cases" section
|
|
17
|
-
- [ ] Create docs/CONTRIBUTING.md
|
|
18
|
-
- [ ] Create examples/ directory with:
|
|
19
|
-
- [ ] examples/basic-chat/ - Two agents chatting
|
|
20
|
-
- [ ] examples/tic-tac-toe/ - Simple game
|
|
21
|
-
- [ ] examples/collaborative-coding/ - Agents working together
|
|
22
|
-
- [ ] Update CLI --help text for all commands
|
|
23
|
-
- [ ] Document the new inbox-* commands
|
|
24
|
-
- [ ] Create API.md documenting the protocol
|
|
25
|
-
|
|
26
|
-
### Agent 2: CodePolish (Claude) - Code Quality & Tests
|
|
27
|
-
**Focus:** Test coverage, error handling, code cleanup
|
|
28
|
-
**Workdir:** `/Users/khaliqgant/Projects/prpm/agent-relay`
|
|
29
|
-
|
|
30
|
-
Tasks:
|
|
31
|
-
- [ ] Audit test coverage - identify gaps
|
|
32
|
-
- [ ] Add tests for new inbox-poll/write/agents commands
|
|
33
|
-
- [ ] Improve error messages (user-friendly)
|
|
34
|
-
- [ ] Add input validation to CLI commands
|
|
35
|
-
- [ ] Clean up console.log statements (use proper logging)
|
|
36
|
-
- [ ] Remove dead code and unused files
|
|
37
|
-
- [ ] Review and fix any TypeScript strict mode issues
|
|
38
|
-
- [ ] Add JSDoc comments to public APIs
|
|
39
|
-
|
|
40
|
-
### Agent 3: DevOps (Codex) - CI/CD & Publishing
|
|
41
|
-
**Focus:** Build, publish, installation
|
|
42
|
-
**Workdir:** `/Users/khaliqgant/Projects/prpm/agent-relay`
|
|
43
|
-
|
|
44
|
-
Tasks:
|
|
45
|
-
- [ ] Review and improve package.json
|
|
46
|
-
- Verify all fields for npm publish
|
|
47
|
-
- Add repository, bugs, homepage URLs
|
|
48
|
-
- Review dependencies (prune unused)
|
|
49
|
-
- [ ] Enhance GitHub Actions workflow
|
|
50
|
-
- Add npm publish on release
|
|
51
|
-
- Add test coverage reporting
|
|
52
|
-
- Add build badge to README
|
|
53
|
-
- [ ] Review install.sh script
|
|
54
|
-
- Test on clean systems
|
|
55
|
-
- Improve error handling
|
|
56
|
-
- [ ] Add LICENSE file (MIT)
|
|
57
|
-
- [ ] Create docs/CHANGELOG.md
|
|
58
|
-
- [ ] Test npm pack / npm publish --dry-run
|
|
59
|
-
- [ ] Set up GitHub release automation
|
|
60
|
-
|
|
61
|
-
## Coordination Protocol
|
|
62
|
-
|
|
63
|
-
Agents communicate via `/tmp/agent-relay-dev/`:
|
|
64
|
-
- DocWriter, CodePolish, DevOps each have inbox directories
|
|
65
|
-
- Use `agent-relay inbox-*` commands
|
|
66
|
-
|
|
67
|
-
### Message Types
|
|
68
|
-
- `STATUS: <doing what>` - Progress update
|
|
69
|
-
- `QUESTION: <question>` - Need input from another agent
|
|
70
|
-
- `DONE: <task>` - Task completed
|
|
71
|
-
- `BLOCKER: <issue>` - Blocked on something
|
|
72
|
-
- `HANDOFF: <what>` - Passing work to another agent
|
|
73
|
-
|
|
74
|
-
### Coordination Rules
|
|
75
|
-
1. Before editing a file, announce: `STATUS: Editing <filename>`
|
|
76
|
-
2. After completing a task, broadcast: `DONE: <task description>`
|
|
77
|
-
3. If blocked, ask: `QUESTION: @AgentName <question>`
|
|
78
|
-
4. Check inbox after each major task
|
|
79
|
-
|
|
80
|
-
## Success Criteria
|
|
81
|
-
- [ ] npm install agent-relay works
|
|
82
|
-
- [ ] All CLI commands have --help
|
|
83
|
-
- [ ] README has working quick start
|
|
84
|
-
- [ ] 3+ working examples
|
|
85
|
-
- [ ] Test coverage > 80%
|
|
86
|
-
- [ ] No TypeScript errors in strict mode
|
|
87
|
-
- [ ] GitHub Actions green
|
|
88
|
-
- [ ] Clean npm audit
|