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,327 +0,0 @@
|
|
|
1
|
-
# Manual Testing Guide: Presence & Cloud Features
|
|
2
|
-
|
|
3
|
-
This document provides step-by-step testing procedures for the presence indicators, typing indicators, and user profile features in cloud mode.
|
|
4
|
-
|
|
5
|
-
## Prerequisites
|
|
6
|
-
|
|
7
|
-
1. **Cloud Mode Setup**: You need access to the cloud-hosted dashboard with GitHub OAuth authentication.
|
|
8
|
-
2. **Multiple Test Accounts**: Ideally 2-3 different GitHub accounts to test multi-user features.
|
|
9
|
-
3. **Multiple Browser Windows**: Use different browsers or incognito windows for simultaneous sessions.
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
## Test 1: GitHub Avatar & Username Display
|
|
14
|
-
|
|
15
|
-
### Objective
|
|
16
|
-
Verify that logged-in users see their GitHub avatar and username in messages.
|
|
17
|
-
|
|
18
|
-
### Steps
|
|
19
|
-
|
|
20
|
-
1. Log in to the cloud dashboard using GitHub OAuth
|
|
21
|
-
2. Send a message to any agent (e.g., `@AgentName Hello`)
|
|
22
|
-
3. Observe the message in the chat
|
|
23
|
-
|
|
24
|
-
### Expected Results
|
|
25
|
-
|
|
26
|
-
- [ ] Your GitHub avatar appears next to your sent message
|
|
27
|
-
- [ ] Your GitHub username appears as the sender
|
|
28
|
-
- [ ] Messages display "You" or your username consistently
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## Test 2: Presence Indicator - Single User
|
|
33
|
-
|
|
34
|
-
### Objective
|
|
35
|
-
Verify presence tracking works for a single user.
|
|
36
|
-
|
|
37
|
-
### Steps
|
|
38
|
-
|
|
39
|
-
1. Log in to the cloud dashboard
|
|
40
|
-
2. Look at the header area below the main header
|
|
41
|
-
|
|
42
|
-
### Expected Results
|
|
43
|
-
|
|
44
|
-
- [ ] A green dot indicator appears showing online status
|
|
45
|
-
- [ ] Your avatar appears in the stacked avatar row
|
|
46
|
-
- [ ] "1 online" text displays next to the avatars
|
|
47
|
-
- [ ] Clicking the indicator shows a dropdown with your username
|
|
48
|
-
|
|
49
|
-
---
|
|
50
|
-
|
|
51
|
-
## Test 3: Presence Indicator - Multiple Users
|
|
52
|
-
|
|
53
|
-
### Objective
|
|
54
|
-
Verify multiple users can see each other's presence.
|
|
55
|
-
|
|
56
|
-
### Steps
|
|
57
|
-
|
|
58
|
-
1. **User A**: Log in with first GitHub account in Browser 1
|
|
59
|
-
2. **User B**: Log in with second GitHub account in Browser 2 (different browser or incognito)
|
|
60
|
-
3. Both users observe the presence indicator
|
|
61
|
-
|
|
62
|
-
### Expected Results
|
|
63
|
-
|
|
64
|
-
- [ ] Both users see "2 online" in the presence indicator
|
|
65
|
-
- [ ] Both avatars appear in the stacked row
|
|
66
|
-
- [ ] Clicking shows both usernames in the dropdown
|
|
67
|
-
- [ ] Each user can see the other's GitHub avatar
|
|
68
|
-
|
|
69
|
-
---
|
|
70
|
-
|
|
71
|
-
## Test 4: Presence Join/Leave Detection
|
|
72
|
-
|
|
73
|
-
### Objective
|
|
74
|
-
Verify real-time updates when users join and leave.
|
|
75
|
-
|
|
76
|
-
### Steps
|
|
77
|
-
|
|
78
|
-
1. **User A**: Already logged in
|
|
79
|
-
2. **User B**: Log in to dashboard
|
|
80
|
-
3. Observe User A's screen when User B joins
|
|
81
|
-
4. **User B**: Close the browser tab
|
|
82
|
-
5. Observe User A's screen after User B leaves
|
|
83
|
-
|
|
84
|
-
### Expected Results
|
|
85
|
-
|
|
86
|
-
- [ ] User A immediately sees count increase when User B joins
|
|
87
|
-
- [ ] User B's avatar appears in User A's presence list
|
|
88
|
-
- [ ] User A immediately sees count decrease when User B leaves
|
|
89
|
-
- [ ] User B's avatar disappears from User A's presence list
|
|
90
|
-
|
|
91
|
-
---
|
|
92
|
-
|
|
93
|
-
## Test 5: Multi-Tab Support
|
|
94
|
-
|
|
95
|
-
### Objective
|
|
96
|
-
Verify a user stays "online" when they have multiple tabs open.
|
|
97
|
-
|
|
98
|
-
### Steps
|
|
99
|
-
|
|
100
|
-
1. **User A**: Log in to dashboard in Tab 1
|
|
101
|
-
2. **User A**: Open a second tab to the same dashboard (Tab 2)
|
|
102
|
-
3. **User B**: Log in from a different browser
|
|
103
|
-
4. Observe presence count (should show 2 users, not 3)
|
|
104
|
-
5. **User A**: Close Tab 1
|
|
105
|
-
6. Observe presence (User A should still show as online)
|
|
106
|
-
7. **User A**: Close Tab 2
|
|
107
|
-
8. Observe presence (User A should now show as offline)
|
|
108
|
-
|
|
109
|
-
### Expected Results
|
|
110
|
-
|
|
111
|
-
- [ ] Multiple tabs from same user don't inflate online count
|
|
112
|
-
- [ ] Closing one tab doesn't disconnect the user
|
|
113
|
-
- [ ] User only shows as offline when ALL tabs are closed
|
|
114
|
-
|
|
115
|
-
---
|
|
116
|
-
|
|
117
|
-
## Test 6: Typing Indicator - Single User
|
|
118
|
-
|
|
119
|
-
### Objective
|
|
120
|
-
Verify typing indicators appear when another user is typing.
|
|
121
|
-
|
|
122
|
-
### Steps
|
|
123
|
-
|
|
124
|
-
1. **User A**: Log in in Browser 1
|
|
125
|
-
2. **User B**: Log in in Browser 2
|
|
126
|
-
3. **User B**: Start typing a message (don't send)
|
|
127
|
-
4. Observe User A's screen
|
|
128
|
-
|
|
129
|
-
### Expected Results
|
|
130
|
-
|
|
131
|
-
- [ ] User A sees "User B is typing..." indicator
|
|
132
|
-
- [ ] The indicator appears below the message list, above the composer
|
|
133
|
-
- [ ] User B's avatar appears in the typing indicator
|
|
134
|
-
- [ ] Animated dots appear next to the message
|
|
135
|
-
|
|
136
|
-
---
|
|
137
|
-
|
|
138
|
-
## Test 7: Typing Indicator - Stop Typing
|
|
139
|
-
|
|
140
|
-
### Objective
|
|
141
|
-
Verify typing indicator disappears when user stops typing.
|
|
142
|
-
|
|
143
|
-
### Steps
|
|
144
|
-
|
|
145
|
-
1. Continue from Test 6
|
|
146
|
-
2. **User B**: Delete all text from the input field
|
|
147
|
-
3. Observe User A's screen
|
|
148
|
-
|
|
149
|
-
### Expected Results
|
|
150
|
-
|
|
151
|
-
- [ ] Typing indicator disappears within 1 second
|
|
152
|
-
- [ ] No residual "typing" state shown
|
|
153
|
-
|
|
154
|
-
---
|
|
155
|
-
|
|
156
|
-
## Test 8: Typing Indicator - Auto-Clear
|
|
157
|
-
|
|
158
|
-
### Objective
|
|
159
|
-
Verify typing indicator auto-clears after 3 seconds of inactivity.
|
|
160
|
-
|
|
161
|
-
### Steps
|
|
162
|
-
|
|
163
|
-
1. **User A**: Log in in Browser 1
|
|
164
|
-
2. **User B**: Log in in Browser 2
|
|
165
|
-
3. **User B**: Type something and then stop (don't clear input)
|
|
166
|
-
4. Wait 3-4 seconds
|
|
167
|
-
|
|
168
|
-
### Expected Results
|
|
169
|
-
|
|
170
|
-
- [ ] Typing indicator disappears after ~3 seconds of no typing activity
|
|
171
|
-
- [ ] This prevents stale "typing" states
|
|
172
|
-
|
|
173
|
-
---
|
|
174
|
-
|
|
175
|
-
## Test 9: User Profile Panel - Open
|
|
176
|
-
|
|
177
|
-
### Objective
|
|
178
|
-
Verify the user profile panel opens when clicking on an online user.
|
|
179
|
-
|
|
180
|
-
### Steps
|
|
181
|
-
|
|
182
|
-
1. Have at least 2 users logged in
|
|
183
|
-
2. Click on the online users indicator
|
|
184
|
-
3. Click on another user's name/avatar in the dropdown
|
|
185
|
-
|
|
186
|
-
### Expected Results
|
|
187
|
-
|
|
188
|
-
- [ ] A slide-out panel appears from the right
|
|
189
|
-
- [ ] Panel shows the user's large avatar
|
|
190
|
-
- [ ] Panel shows the user's GitHub username
|
|
191
|
-
- [ ] Panel shows "Online" status with green indicator
|
|
192
|
-
- [ ] Panel shows "Online Since" timestamp
|
|
193
|
-
- [ ] Panel shows "Last Active" timestamp
|
|
194
|
-
- [ ] Panel shows GitHub link
|
|
195
|
-
|
|
196
|
-
---
|
|
197
|
-
|
|
198
|
-
## Test 10: User Profile Panel - Actions
|
|
199
|
-
|
|
200
|
-
### Objective
|
|
201
|
-
Verify profile panel action buttons work correctly.
|
|
202
|
-
|
|
203
|
-
### Steps
|
|
204
|
-
|
|
205
|
-
1. Open a user's profile panel (from Test 9)
|
|
206
|
-
2. Click the "Mention @username" button
|
|
207
|
-
3. Close the panel and open it again
|
|
208
|
-
4. Click the "View on GitHub" button
|
|
209
|
-
|
|
210
|
-
### Expected Results
|
|
211
|
-
|
|
212
|
-
- [ ] "Mention" button closes panel (TODO: should insert @username in composer)
|
|
213
|
-
- [ ] "View on GitHub" opens new tab to user's GitHub profile
|
|
214
|
-
- [ ] GitHub profile URL is correctly formatted
|
|
215
|
-
|
|
216
|
-
---
|
|
217
|
-
|
|
218
|
-
## Test 11: User Profile Panel - Close Methods
|
|
219
|
-
|
|
220
|
-
### Objective
|
|
221
|
-
Verify all methods of closing the profile panel work.
|
|
222
|
-
|
|
223
|
-
### Steps
|
|
224
|
-
|
|
225
|
-
1. Open a user's profile panel
|
|
226
|
-
2. Click the X button in the panel header
|
|
227
|
-
3. Open the panel again
|
|
228
|
-
4. Press the Escape key
|
|
229
|
-
5. Open the panel again
|
|
230
|
-
6. Click outside the panel (on the backdrop)
|
|
231
|
-
|
|
232
|
-
### Expected Results
|
|
233
|
-
|
|
234
|
-
- [ ] X button closes the panel
|
|
235
|
-
- [ ] Escape key closes the panel
|
|
236
|
-
- [ ] Clicking backdrop closes the panel
|
|
237
|
-
|
|
238
|
-
---
|
|
239
|
-
|
|
240
|
-
## Test 12: Human User Autocomplete
|
|
241
|
-
|
|
242
|
-
### Objective
|
|
243
|
-
Verify human users appear in @ mention autocomplete.
|
|
244
|
-
|
|
245
|
-
### Steps
|
|
246
|
-
|
|
247
|
-
1. Have User A and User B both logged in
|
|
248
|
-
2. Have User A send at least one message
|
|
249
|
-
3. **User B**: Start typing `@` in the message input
|
|
250
|
-
4. Observe the autocomplete dropdown
|
|
251
|
-
|
|
252
|
-
### Expected Results
|
|
253
|
-
|
|
254
|
-
- [ ] User A appears in the autocomplete list
|
|
255
|
-
- [ ] Human users show with purple color and person icon
|
|
256
|
-
- [ ] Human users are labeled as "Human user"
|
|
257
|
-
- [ ] Selecting a human user inserts @username in message
|
|
258
|
-
|
|
259
|
-
---
|
|
260
|
-
|
|
261
|
-
## Test 13: Input Validation - Invalid Username
|
|
262
|
-
|
|
263
|
-
### Objective
|
|
264
|
-
Verify the server rejects invalid usernames (security feature).
|
|
265
|
-
|
|
266
|
-
### Steps
|
|
267
|
-
|
|
268
|
-
This test requires developer tools or a custom client:
|
|
269
|
-
|
|
270
|
-
1. Open browser developer tools
|
|
271
|
-
2. Find the presence WebSocket connection
|
|
272
|
-
3. Try to send a join message with an invalid username (e.g., containing special characters)
|
|
273
|
-
|
|
274
|
-
### Expected Results
|
|
275
|
-
|
|
276
|
-
- [ ] Server rejects the invalid username
|
|
277
|
-
- [ ] No error is displayed to the user (silent rejection)
|
|
278
|
-
- [ ] Console logs show "Invalid username rejected"
|
|
279
|
-
|
|
280
|
-
---
|
|
281
|
-
|
|
282
|
-
## Test 14: Security - Cannot Remove Other Users
|
|
283
|
-
|
|
284
|
-
### Objective
|
|
285
|
-
Verify users cannot forcibly remove others from online list.
|
|
286
|
-
|
|
287
|
-
### Steps
|
|
288
|
-
|
|
289
|
-
This test requires developer tools:
|
|
290
|
-
|
|
291
|
-
1. User A and User B both logged in
|
|
292
|
-
2. Using developer tools, try to send a leave message with User B's username from User A's connection
|
|
293
|
-
|
|
294
|
-
### Expected Results
|
|
295
|
-
|
|
296
|
-
- [ ] Server rejects the leave attempt
|
|
297
|
-
- [ ] User B remains in the online list
|
|
298
|
-
- [ ] Console logs show security warning
|
|
299
|
-
|
|
300
|
-
---
|
|
301
|
-
|
|
302
|
-
## Troubleshooting
|
|
303
|
-
|
|
304
|
-
### Presence Not Updating
|
|
305
|
-
|
|
306
|
-
1. Check browser console for WebSocket errors
|
|
307
|
-
2. Verify `/ws/presence` WebSocket is connected
|
|
308
|
-
3. Refresh the page to reconnect
|
|
309
|
-
|
|
310
|
-
### Typing Indicator Stuck
|
|
311
|
-
|
|
312
|
-
1. This may indicate a WebSocket issue
|
|
313
|
-
2. Typing indicators auto-clear after 3 seconds
|
|
314
|
-
3. Refresh to reset
|
|
315
|
-
|
|
316
|
-
### Profile Panel Not Opening
|
|
317
|
-
|
|
318
|
-
1. Ensure you're clicking on a user, not just the indicator
|
|
319
|
-
2. Check for JavaScript errors in console
|
|
320
|
-
|
|
321
|
-
---
|
|
322
|
-
|
|
323
|
-
## Notes
|
|
324
|
-
|
|
325
|
-
- All presence features require cloud mode (GitHub OAuth login)
|
|
326
|
-
- Local mode does not support multi-user presence
|
|
327
|
-
- WebSocket connections may take a moment to establish on page load
|
|
@@ -1,364 +0,0 @@
|
|
|
1
|
-
# tmux Implementation Notes
|
|
2
|
-
|
|
3
|
-
## Previous Failure Analysis
|
|
4
|
-
|
|
5
|
-
### What Failed: "Game never even started"
|
|
6
|
-
|
|
7
|
-
The previous tmux implementation had these issues:
|
|
8
|
-
|
|
9
|
-
1. **Nested PTY Attachment**: Created tmux session, then attached via node-pty
|
|
10
|
-
```typescript
|
|
11
|
-
// Created tmux session
|
|
12
|
-
execSync(`tmux new-session -d -s ${session} '${command}'`);
|
|
13
|
-
// Then attached via PTY
|
|
14
|
-
this.ptyProcess = pty.spawn('tmux', ['attach-session', '-t', session]);
|
|
15
|
-
```
|
|
16
|
-
This creates: Agent CLI → tmux → tmux attach → node-pty
|
|
17
|
-
Double terminal layer causes escape sequence issues.
|
|
18
|
-
|
|
19
|
-
2. **Command Quoting Problem**: Single quotes break complex commands
|
|
20
|
-
```bash
|
|
21
|
-
tmux new-session -d -s session 'claude -p "You're playing..."'
|
|
22
|
-
# The apostrophe in "You're" breaks the quoting
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
3. **Environment Variables Not Passed**: ENV vars set on attach, not on session
|
|
26
|
-
- The agent process inside tmux doesn't see AGENT_RELAY_NAME
|
|
27
|
-
|
|
28
|
-
4. **No Session Ready Wait**: Attached immediately after creating session
|
|
29
|
-
- Session might not be ready, causing race conditions
|
|
30
|
-
|
|
31
|
-
## New Architecture: No Attachment
|
|
32
|
-
|
|
33
|
-
```
|
|
34
|
-
┌──────────────────────────────────┐
|
|
35
|
-
│ tmux session "relay-AgentX" │
|
|
36
|
-
│ (detached, running in background)│
|
|
37
|
-
│ ┌────────────────────────────┐ │
|
|
38
|
-
│ │ agent CLI process │ │
|
|
39
|
-
│ │ (claude, codex, etc) │ │
|
|
40
|
-
│ └────────────────────────────┘ │
|
|
41
|
-
└──────────────────────────────────┘
|
|
42
|
-
↑ ↓
|
|
43
|
-
send-keys capture-pane
|
|
44
|
-
(inject input) (read output)
|
|
45
|
-
│ │
|
|
46
|
-
┌──────────────────────────────────┐
|
|
47
|
-
│ TmuxWrapper (this process) │
|
|
48
|
-
│ - Polls capture-pane @ 100ms │
|
|
49
|
-
│ - Detects new output (diff) │
|
|
50
|
-
│ - Parses ->relay: commands │
|
|
51
|
-
│ - Writes to stdout for user │
|
|
52
|
-
│ - Injects messages via send-keys│
|
|
53
|
-
│ - Forwards user stdin to tmux │
|
|
54
|
-
└──────────────────────────────────┘
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
## Key Differences from Previous Implementation
|
|
58
|
-
|
|
59
|
-
1. **No PTY attachment** - Eliminates double-terminal problem
|
|
60
|
-
2. **capture-pane polling** - Direct access to terminal content
|
|
61
|
-
3. **Proper command escaping** - Use shell escaping, not simple quotes
|
|
62
|
-
4. **Environment via tmux** - Set ENV in tmux session directly
|
|
63
|
-
5. **Session ready wait** - Wait for session to be active before proceeding
|
|
64
|
-
|
|
65
|
-
## Implementation Details
|
|
66
|
-
|
|
67
|
-
### Starting a Session
|
|
68
|
-
|
|
69
|
-
```bash
|
|
70
|
-
# Set environment variables IN the tmux session
|
|
71
|
-
tmux new-session -d -s relay-AgentX \
|
|
72
|
-
-x 120 -y 40 \
|
|
73
|
-
"export AGENT_RELAY_NAME=AgentX; exec claude"
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
### Capturing Output
|
|
77
|
-
|
|
78
|
-
```bash
|
|
79
|
-
# Capture entire scrollback (not just visible pane)
|
|
80
|
-
tmux capture-pane -t relay-AgentX -p -S -
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
### Sending Input
|
|
84
|
-
|
|
85
|
-
```bash
|
|
86
|
-
# Use -l for literal string (no escaping needed)
|
|
87
|
-
tmux send-keys -t relay-AgentX -l "Your message here"
|
|
88
|
-
tmux send-keys -t relay-AgentX Enter
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
### Handling User Input
|
|
92
|
-
|
|
93
|
-
Forward process stdin to tmux session:
|
|
94
|
-
```typescript
|
|
95
|
-
process.stdin.on('data', (data) => {
|
|
96
|
-
execSync(`tmux send-keys -t ${session} -l "${escape(data)}"`);
|
|
97
|
-
});
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
## Edge Cases to Handle
|
|
101
|
-
|
|
102
|
-
1. **Fast output**: capture-pane might miss fast scrolling
|
|
103
|
-
- Solution: Use -S - to get full scrollback, diff against last capture
|
|
104
|
-
|
|
105
|
-
2. **Binary/escape sequences**: Output might contain control characters
|
|
106
|
-
- Solution: Strip ANSI codes before parsing ->relay:
|
|
107
|
-
|
|
108
|
-
3. **Session death**: tmux session might exit
|
|
109
|
-
- Solution: Monitor with `tmux has-session -t session`
|
|
110
|
-
|
|
111
|
-
4. **Multiple messages**: Several ->relay: in one capture
|
|
112
|
-
- Solution: Track last processed line/position
|
|
113
|
-
|
|
114
|
-
5. **Stdin race conditions**: User types while we inject
|
|
115
|
-
- Solution: Queue injections, use mutex/lock
|
|
116
|
-
|
|
117
|
-
## Testing Plan
|
|
118
|
-
|
|
119
|
-
1. **Basic session start**: Does claude actually launch in tmux?
|
|
120
|
-
2. **Output capture**: Can we see claude's output?
|
|
121
|
-
3. **Input injection**: Can we send text and get response?
|
|
122
|
-
4. **->relay detection**: Does parser find ->relay: commands?
|
|
123
|
-
5. **Full game**: Two agents playing tic-tac-toe
|
|
124
|
-
|
|
125
|
-
## Rollback Plan
|
|
126
|
-
|
|
127
|
-
If this doesn't work, fall back to:
|
|
128
|
-
1. File-based inbox (already implemented)
|
|
129
|
-
2. Hook-based polling (Claude only)
|
|
130
|
-
3. Spawn-per-message (loses context)
|
|
131
|
-
|
|
132
|
-
---
|
|
133
|
-
|
|
134
|
-
## Implementation Complete - Testing Instructions
|
|
135
|
-
|
|
136
|
-
### Build Status: SUCCESS
|
|
137
|
-
|
|
138
|
-
The new TmuxWrapper has been implemented at:
|
|
139
|
-
- `src/wrapper/tmux-wrapper.ts`
|
|
140
|
-
|
|
141
|
-
CLI updated to support `--tmux2` flag.
|
|
142
|
-
|
|
143
|
-
### Quick Test: Basic Session Start
|
|
144
|
-
|
|
145
|
-
```bash
|
|
146
|
-
# Test 1: Does bash work in tmux?
|
|
147
|
-
node dist/cli/index.js wrap --tmux2 -n TestAgent -- bash
|
|
148
|
-
|
|
149
|
-
# You should see:
|
|
150
|
-
# - "Mode: tmux2 (new simplified tmux wrapper)"
|
|
151
|
-
# - Bash prompt in your terminal
|
|
152
|
-
# - Type commands, they should work
|
|
153
|
-
# - Ctrl+C to exit
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
### Test 2: Simple Echo Command
|
|
157
|
-
|
|
158
|
-
```bash
|
|
159
|
-
# Start with echo (should immediately show output and exit)
|
|
160
|
-
node dist/cli/index.js wrap --tmux2 -n TestAgent -- echo "Hello World"
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
### Test 3: Claude CLI (No Relay)
|
|
164
|
-
|
|
165
|
-
```bash
|
|
166
|
-
# Test Claude starts correctly
|
|
167
|
-
node dist/cli/index.js wrap --tmux2 -n PlayerX -- claude
|
|
168
|
-
|
|
169
|
-
# Expected: Claude CLI starts, you can interact with it
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
### Test 4: With Relay Daemon
|
|
173
|
-
|
|
174
|
-
```bash
|
|
175
|
-
# Terminal 1: Start daemon
|
|
176
|
-
node dist/cli/index.js start -f
|
|
177
|
-
|
|
178
|
-
# Terminal 2: Start PlayerX
|
|
179
|
-
node dist/cli/index.js wrap --tmux2 -n PlayerX -- claude
|
|
180
|
-
|
|
181
|
-
# Terminal 3: Start PlayerO
|
|
182
|
-
node dist/cli/index.js wrap --tmux2 -n PlayerO -- claude
|
|
183
|
-
|
|
184
|
-
# Terminal 4: Send a test message
|
|
185
|
-
node dist/cli/index.js send -f Coordinator -t PlayerX -m "Hello from Coordinator"
|
|
186
|
-
|
|
187
|
-
# Expected: PlayerX terminal should show the message and inject it
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
### Test 5: Tic-Tac-Toe
|
|
191
|
-
|
|
192
|
-
```bash
|
|
193
|
-
# Terminal 1: Daemon
|
|
194
|
-
node dist/cli/index.js start -f
|
|
195
|
-
|
|
196
|
-
# Terminal 2: PlayerX
|
|
197
|
-
node dist/cli/index.js wrap --tmux2 -n PlayerX -- claude -p "You are PlayerX playing tic-tac-toe. Use ->relay:PlayerO to send moves. Start with your first move."
|
|
198
|
-
|
|
199
|
-
# Terminal 3: PlayerO
|
|
200
|
-
node dist/cli/index.js wrap --tmux2 -n PlayerO -- claude -p "You are PlayerO playing tic-tac-toe. Use ->relay:PlayerX to send moves. Wait for PlayerX to start."
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
### Debugging
|
|
204
|
-
|
|
205
|
-
```bash
|
|
206
|
-
# Check if tmux session exists
|
|
207
|
-
tmux list-sessions
|
|
208
|
-
|
|
209
|
-
# Attach to session manually to see what's happening
|
|
210
|
-
tmux attach -t relay-PlayerX-<pid>
|
|
211
|
-
|
|
212
|
-
# Kill stuck sessions
|
|
213
|
-
tmux kill-server
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
### Key Differences from Old tmux Implementation
|
|
217
|
-
|
|
218
|
-
1. **No PTY attachment** - We don't `tmux attach` via node-pty
|
|
219
|
-
2. **capture-pane polling** - Read output by polling, not events
|
|
220
|
-
3. **send-keys -l** - Use literal mode for text injection
|
|
221
|
-
4. **Environment via tmux setenv** - Set ENV vars in tmux session directly
|
|
222
|
-
5. **Simpler architecture** - Less layers = fewer failure points
|
|
223
|
-
|
|
224
|
-
---
|
|
225
|
-
|
|
226
|
-
## Test Results - December 19, 2025
|
|
227
|
-
|
|
228
|
-
### Basic Test: PASSED
|
|
229
|
-
|
|
230
|
-
Message injection into bash session works:
|
|
231
|
-
|
|
232
|
-
```
|
|
233
|
-
[daemon] Agent registered: TestAgent
|
|
234
|
-
[router] Coordinator -> TestAgent: Hello TestAgent!...
|
|
235
|
-
[router] Delivered to TestAgent: success
|
|
236
|
-
[tmux:TestAgent] ← Coordinator: Hello TestAgent!...
|
|
237
|
-
[tmux:TestAgent] Injecting message from Coordinator
|
|
238
|
-
[tmux:TestAgent] Message injected successfully
|
|
239
|
-
bash-3.2$ Relay message from Coordinator: Hello TestAgent!
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
The message was successfully typed into the bash terminal via tmux send-keys.
|
|
243
|
-
|
|
244
|
-
### What Works
|
|
245
|
-
|
|
246
|
-
1. **Session creation** - tmux session starts correctly
|
|
247
|
-
2. **Output capture** - capture-pane polling detects new output
|
|
248
|
-
3. **Relay connection** - Agent connects to daemon
|
|
249
|
-
4. **Message routing** - Messages route between agents
|
|
250
|
-
5. **Message injection** - Text is typed into the terminal via send-keys
|
|
251
|
-
|
|
252
|
-
### Next Steps
|
|
253
|
-
|
|
254
|
-
1. Test with Claude CLI (replace bash with claude)
|
|
255
|
-
2. Test full tic-tac-toe game between two agents
|
|
256
|
-
3. Verify ->relay: command parsing works in both directions
|
|
257
|
-
4. Check if multi-round injection remains stable (previous implementations failed after 2-3 rounds)
|
|
258
|
-
|
|
259
|
-
### Critical Question
|
|
260
|
-
|
|
261
|
-
Does this implementation avoid the "fails after a few rounds" problem? The key difference:
|
|
262
|
-
|
|
263
|
-
- **Old approach**: PTY stdin write (`ptyProcess.write()`) - corrupts over time
|
|
264
|
-
- **New approach**: tmux send-keys (`tmux send-keys -l "..."`) - should be more stable
|
|
265
|
-
|
|
266
|
-
---
|
|
267
|
-
|
|
268
|
-
## December 19, 2025 - Attach-Based Implementation: SUCCESS
|
|
269
|
-
|
|
270
|
-
### Problem with First tmux Attempt
|
|
271
|
-
|
|
272
|
-
The first tmux wrapper tried to:
|
|
273
|
-
1. Poll `capture-pane` for output
|
|
274
|
-
2. Write output to stdout
|
|
275
|
-
3. This caused display corruption after message injection
|
|
276
|
-
|
|
277
|
-
### Solution: Direct Attach
|
|
278
|
-
|
|
279
|
-
New architecture:
|
|
280
|
-
1. Start agent in detached tmux session
|
|
281
|
-
2. **Attach user directly** via `spawn('tmux', ['attach'], { stdio: 'inherit' })`
|
|
282
|
-
3. Background polling is **completely silent** (no stdout writes)
|
|
283
|
-
4. Injection via `send-keys` works on attached session
|
|
284
|
-
5. Logs only to stderr
|
|
285
|
-
|
|
286
|
-
### Test Result: PASSED
|
|
287
|
-
|
|
288
|
-
Message injection works without display corruption:
|
|
289
|
-
```bash
|
|
290
|
-
# Terminal 1: Daemon
|
|
291
|
-
node dist/cli/index.js start -f
|
|
292
|
-
|
|
293
|
-
# Terminal 2: Agent
|
|
294
|
-
node dist/cli/index.js wrap --tmux2 -n PlayerX -- claude
|
|
295
|
-
|
|
296
|
-
# Terminal 3: Send message
|
|
297
|
-
node dist/cli/index.js send -f Test -t PlayerX -m "Hello!"
|
|
298
|
-
# → Message injected successfully, display intact
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
### Next: Multi-Round Tic-Tac-Toe Test
|
|
302
|
-
|
|
303
|
-
The critical test is whether injection remains stable over multiple rounds:
|
|
304
|
-
```bash
|
|
305
|
-
# Terminal 1: Daemon
|
|
306
|
-
node dist/cli/index.js start -f
|
|
307
|
-
|
|
308
|
-
# Terminal 2: PlayerX
|
|
309
|
-
node dist/cli/index.js wrap --tmux2 -n PlayerX -- claude -p "Play tic-tac-toe. Use ->relay:PlayerO to send moves."
|
|
310
|
-
|
|
311
|
-
# Terminal 3: PlayerO
|
|
312
|
-
node dist/cli/index.js wrap --tmux2 -n PlayerO -- claude -p "Play tic-tac-toe. Use ->relay:PlayerX to send moves."
|
|
313
|
-
```
|
|
314
|
-
|
|
315
|
-
If this works for a full game (5-9 moves), we've solved the problem.
|
|
316
|
-
|
|
317
|
-
---
|
|
318
|
-
|
|
319
|
-
## December 19, 2025 - Command Quoting Fix
|
|
320
|
-
|
|
321
|
-
### Problem
|
|
322
|
-
|
|
323
|
-
Running with `-p` flag failed:
|
|
324
|
-
```bash
|
|
325
|
-
node dist/cli/index.js wrap --tmux2 -n PlayerX -- claude -p "You are PlayerX..."
|
|
326
|
-
# Result: Claude terminal didn't open
|
|
327
|
-
```
|
|
328
|
-
|
|
329
|
-
### Root Cause
|
|
330
|
-
|
|
331
|
-
The CLI was joining all command parts into a single string at line 229:
|
|
332
|
-
```typescript
|
|
333
|
-
const command = commandParts.join(' ');
|
|
334
|
-
```
|
|
335
|
-
|
|
336
|
-
And passing only this joined string to TmuxWrapper. But by the time args reach Node.js,
|
|
337
|
-
the shell has already stripped the outer quotes, so `commandParts` = `['claude', '-p', 'You are PlayerX...']`.
|
|
338
|
-
|
|
339
|
-
When joined back together without re-quoting: `claude -p You are PlayerX...` - the prompt is split.
|
|
340
|
-
|
|
341
|
-
### Fix
|
|
342
|
-
|
|
343
|
-
1. **CLI (index.ts)**: Split command and args separately:
|
|
344
|
-
```typescript
|
|
345
|
-
const [mainCommand, ...commandArgs] = commandParts;
|
|
346
|
-
// Pass to TmuxWrapper as:
|
|
347
|
-
// command: mainCommand ('claude')
|
|
348
|
-
// args: commandArgs (['-p', 'You are PlayerX...'])
|
|
349
|
-
```
|
|
350
|
-
|
|
351
|
-
2. **TmuxWrapper**: `buildCommand()` re-quotes args containing spaces:
|
|
352
|
-
```typescript
|
|
353
|
-
private buildCommand(): string {
|
|
354
|
-
const quotedArgs = this.config.args.map(arg => {
|
|
355
|
-
if (arg.includes(' ') || arg.includes('"') || arg.includes("'")) {
|
|
356
|
-
return `"${arg.replace(/"/g, '\\"')}"`;
|
|
357
|
-
}
|
|
358
|
-
return arg;
|
|
359
|
-
});
|
|
360
|
-
return `${this.config.command} ${quotedArgs.join(' ')}`;
|
|
361
|
-
}
|
|
362
|
-
```
|
|
363
|
-
|
|
364
|
-
Result: `claude -p "You are PlayerX..."` is correctly sent to tmux.
|