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
package/dist/cli/index.js
CHANGED
|
@@ -1688,6 +1688,7 @@ program
|
|
|
1688
1688
|
.action(async (args) => {
|
|
1689
1689
|
const { spawn } = await import('node:child_process');
|
|
1690
1690
|
const { getProjectPaths } = await import('../utils/project-namespace.js');
|
|
1691
|
+
const { getPrimaryTrajectoriesDir, ensureTrajectoriesDir } = await import('../trajectory/config.js');
|
|
1691
1692
|
const paths = getProjectPaths();
|
|
1692
1693
|
// Check if trail is available
|
|
1693
1694
|
const trailCheck = spawn('which', ['trail'], { stdio: 'pipe' });
|
|
@@ -1709,6 +1710,10 @@ program
|
|
|
1709
1710
|
console.log('PDERO phases: plan, design, execute, review, observe');
|
|
1710
1711
|
process.exit(1);
|
|
1711
1712
|
}
|
|
1713
|
+
// Get trajectory storage path based on config (respects opt-in/opt-out)
|
|
1714
|
+
// Uses TRAJECTORIES_DATA_DIR env var which trail CLI reads
|
|
1715
|
+
const trajectoriesDir = getPrimaryTrajectoriesDir(paths.projectRoot);
|
|
1716
|
+
ensureTrajectoriesDir(paths.projectRoot);
|
|
1712
1717
|
// Spawn trail with the provided arguments
|
|
1713
1718
|
const trailProc = spawn('trail', args, {
|
|
1714
1719
|
cwd: paths.projectRoot,
|
|
@@ -1716,7 +1721,7 @@ program
|
|
|
1716
1721
|
env: {
|
|
1717
1722
|
...process.env,
|
|
1718
1723
|
TRAJECTORIES_PROJECT: paths.projectId,
|
|
1719
|
-
TRAJECTORIES_DATA_DIR:
|
|
1724
|
+
TRAJECTORIES_DATA_DIR: trajectoriesDir,
|
|
1720
1725
|
},
|
|
1721
1726
|
});
|
|
1722
1727
|
trailProc.on('close', (code) => {
|
|
@@ -2220,5 +2225,217 @@ program
|
|
|
2220
2225
|
await wrapper.start();
|
|
2221
2226
|
console.log(`Profiling ${agentName}... Press Ctrl+C to stop.`);
|
|
2222
2227
|
});
|
|
2228
|
+
// ============================================================================
|
|
2229
|
+
// codex-auth - Local OAuth callback helper for Codex/OpenAI authentication
|
|
2230
|
+
// ============================================================================
|
|
2231
|
+
program
|
|
2232
|
+
.command('codex-auth')
|
|
2233
|
+
.description('Capture Codex OAuth callback locally (run this when connecting Codex in Agent Relay)')
|
|
2234
|
+
.option('--token <token>', 'Auth session token from Agent Relay dashboard')
|
|
2235
|
+
.option('--cloud-url <url>', 'Cloud API URL', process.env.AGENT_RELAY_CLOUD_URL || 'https://agent-relay.com')
|
|
2236
|
+
.option('--port <port>', 'Callback port (default: 1455)', '1455')
|
|
2237
|
+
.option('--timeout <seconds>', 'Timeout in seconds (default: 300)', '300')
|
|
2238
|
+
.action(async (options) => {
|
|
2239
|
+
const http = await import('node:http');
|
|
2240
|
+
const { URL } = await import('node:url');
|
|
2241
|
+
const CALLBACK_PORT = parseInt(options.port, 10);
|
|
2242
|
+
const TIMEOUT_MS = parseInt(options.timeout, 10) * 1000;
|
|
2243
|
+
const CLOUD_URL = options.cloudUrl.replace(/\/$/, '');
|
|
2244
|
+
// Colors for terminal output
|
|
2245
|
+
const cyan = (s) => `\x1b[36m${s}\x1b[0m`;
|
|
2246
|
+
const green = (s) => `\x1b[32m${s}\x1b[0m`;
|
|
2247
|
+
const yellow = (s) => `\x1b[33m${s}\x1b[0m`;
|
|
2248
|
+
const red = (s) => `\x1b[31m${s}\x1b[0m`;
|
|
2249
|
+
console.log('');
|
|
2250
|
+
console.log(cyan('═══════════════════════════════════════════════════'));
|
|
2251
|
+
console.log(cyan(' Codex Authentication Helper'));
|
|
2252
|
+
console.log(cyan('═══════════════════════════════════════════════════'));
|
|
2253
|
+
console.log('');
|
|
2254
|
+
// Get or create auth session
|
|
2255
|
+
let authSessionId = options.token;
|
|
2256
|
+
if (!authSessionId) {
|
|
2257
|
+
// No token provided - create a session via the API
|
|
2258
|
+
console.log('Creating auth session...');
|
|
2259
|
+
try {
|
|
2260
|
+
const response = await fetch(`${CLOUD_URL}/api/auth/codex-helper/cli-session`, {
|
|
2261
|
+
method: 'POST',
|
|
2262
|
+
headers: { 'Content-Type': 'application/json' },
|
|
2263
|
+
});
|
|
2264
|
+
if (!response.ok) {
|
|
2265
|
+
const error = await response.json().catch(() => ({}));
|
|
2266
|
+
console.log('');
|
|
2267
|
+
console.log(red('Failed to create auth session.'));
|
|
2268
|
+
console.log('');
|
|
2269
|
+
if (response.status === 401) {
|
|
2270
|
+
console.log('To use this command, run it with a token from the Agent Relay dashboard:');
|
|
2271
|
+
console.log('');
|
|
2272
|
+
console.log(cyan(' npx agent-relay codex-auth --token=<TOKEN>'));
|
|
2273
|
+
console.log('');
|
|
2274
|
+
console.log('Get the token from: Settings → Connect Codex → "Use CLI helper"');
|
|
2275
|
+
}
|
|
2276
|
+
else {
|
|
2277
|
+
console.log(`Error: ${error.error || response.statusText}`);
|
|
2278
|
+
}
|
|
2279
|
+
process.exit(1);
|
|
2280
|
+
}
|
|
2281
|
+
const data = await response.json();
|
|
2282
|
+
authSessionId = data.authSessionId;
|
|
2283
|
+
}
|
|
2284
|
+
catch (err) {
|
|
2285
|
+
console.log(red('Failed to connect to Agent Relay Cloud.'));
|
|
2286
|
+
console.log(`URL: ${CLOUD_URL}`);
|
|
2287
|
+
console.log(`Error: ${err instanceof Error ? err.message : String(err)}`);
|
|
2288
|
+
process.exit(1);
|
|
2289
|
+
}
|
|
2290
|
+
}
|
|
2291
|
+
console.log(`Session: ${authSessionId?.slice(0, 8)}...`);
|
|
2292
|
+
console.log(`Listening on port: ${cyan(String(CALLBACK_PORT))}`);
|
|
2293
|
+
console.log('');
|
|
2294
|
+
// Success HTML page
|
|
2295
|
+
const successHtml = `<!DOCTYPE html>
|
|
2296
|
+
<html>
|
|
2297
|
+
<head>
|
|
2298
|
+
<title>Authentication Successful</title>
|
|
2299
|
+
<style>
|
|
2300
|
+
body { font-family: -apple-system, sans-serif; background: #0a0f1a; color: #e2e8f0;
|
|
2301
|
+
display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; }
|
|
2302
|
+
.card { background: #1a1f2e; padding: 2rem; border-radius: 12px; text-align: center;
|
|
2303
|
+
border: 1px solid rgba(0, 212, 255, 0.3); max-width: 400px; }
|
|
2304
|
+
h1 { color: #00d4ff; margin-bottom: 1rem; }
|
|
2305
|
+
p { color: #94a3b8; margin: 0.5rem 0; }
|
|
2306
|
+
</style>
|
|
2307
|
+
</head>
|
|
2308
|
+
<body>
|
|
2309
|
+
<div class="card">
|
|
2310
|
+
<h1>✓ Authentication Successful!</h1>
|
|
2311
|
+
<p>Your Codex account is now connected.</p>
|
|
2312
|
+
<p style="margin-top: 1rem;">You can close this window.</p>
|
|
2313
|
+
</div>
|
|
2314
|
+
</body>
|
|
2315
|
+
</html>`;
|
|
2316
|
+
// Create HTTP server to capture callback
|
|
2317
|
+
let authCode = null;
|
|
2318
|
+
let serverClosed = false;
|
|
2319
|
+
const server = http.createServer(async (req, res) => {
|
|
2320
|
+
const url = new URL(req.url || '/', `http://localhost:${CALLBACK_PORT}`);
|
|
2321
|
+
if (url.pathname === '/auth/callback') {
|
|
2322
|
+
const code = url.searchParams.get('code');
|
|
2323
|
+
const error = url.searchParams.get('error');
|
|
2324
|
+
if (error) {
|
|
2325
|
+
res.writeHead(400, { 'Content-Type': 'text/plain' });
|
|
2326
|
+
res.end(`OAuth Error: ${error}`);
|
|
2327
|
+
console.log(red(`OAuth error: ${error}`));
|
|
2328
|
+
return;
|
|
2329
|
+
}
|
|
2330
|
+
if (code) {
|
|
2331
|
+
authCode = code;
|
|
2332
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
2333
|
+
res.end(successHtml);
|
|
2334
|
+
console.log('');
|
|
2335
|
+
console.log(green('✓ Received OAuth callback!'));
|
|
2336
|
+
}
|
|
2337
|
+
else {
|
|
2338
|
+
res.writeHead(400, { 'Content-Type': 'text/plain' });
|
|
2339
|
+
res.end('Missing authorization code');
|
|
2340
|
+
}
|
|
2341
|
+
}
|
|
2342
|
+
else if (url.pathname === '/favicon.ico') {
|
|
2343
|
+
res.writeHead(404);
|
|
2344
|
+
res.end();
|
|
2345
|
+
}
|
|
2346
|
+
else {
|
|
2347
|
+
res.writeHead(200, { 'Content-Type': 'text/plain' });
|
|
2348
|
+
res.end('Waiting for OAuth callback on /auth/callback...');
|
|
2349
|
+
}
|
|
2350
|
+
});
|
|
2351
|
+
// Handle server errors
|
|
2352
|
+
server.on('error', (err) => {
|
|
2353
|
+
if (err.code === 'EADDRINUSE') {
|
|
2354
|
+
console.log(red(`Port ${CALLBACK_PORT} is already in use.`));
|
|
2355
|
+
console.log('');
|
|
2356
|
+
console.log('Another process may be using this port.');
|
|
2357
|
+
console.log('Close it and try again, or specify a different port with --port');
|
|
2358
|
+
process.exit(1);
|
|
2359
|
+
}
|
|
2360
|
+
throw err;
|
|
2361
|
+
});
|
|
2362
|
+
// Start listening
|
|
2363
|
+
await new Promise((resolve) => {
|
|
2364
|
+
server.listen(CALLBACK_PORT, () => {
|
|
2365
|
+
resolve();
|
|
2366
|
+
});
|
|
2367
|
+
});
|
|
2368
|
+
console.log(green('Server ready!'));
|
|
2369
|
+
console.log('');
|
|
2370
|
+
console.log(yellow('Next steps:'));
|
|
2371
|
+
console.log(' 1. Go to the Agent Relay dashboard');
|
|
2372
|
+
console.log(' 2. Click "Open Codex Login Page" to start OAuth');
|
|
2373
|
+
console.log(' 3. Sign in with your OpenAI account');
|
|
2374
|
+
console.log(' 4. The callback will be captured automatically');
|
|
2375
|
+
console.log('');
|
|
2376
|
+
console.log(cyan(`Waiting for callback... (timeout: ${options.timeout}s)`));
|
|
2377
|
+
// Wait for callback or timeout
|
|
2378
|
+
const startTime = Date.now();
|
|
2379
|
+
while (!authCode && !serverClosed && (Date.now() - startTime) < TIMEOUT_MS) {
|
|
2380
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
2381
|
+
const elapsed = Math.floor((Date.now() - startTime) / 1000);
|
|
2382
|
+
if (elapsed > 0 && elapsed % 30 === 0) {
|
|
2383
|
+
console.log(` Still waiting... (${elapsed}s)`);
|
|
2384
|
+
}
|
|
2385
|
+
}
|
|
2386
|
+
// Close server
|
|
2387
|
+
server.close();
|
|
2388
|
+
serverClosed = true;
|
|
2389
|
+
if (!authCode) {
|
|
2390
|
+
console.log('');
|
|
2391
|
+
console.log(red('Timeout waiting for OAuth callback.'));
|
|
2392
|
+
console.log('');
|
|
2393
|
+
console.log('If you completed sign-in, the callback may have failed.');
|
|
2394
|
+
console.log('Try copying the localhost URL from your browser and pasting');
|
|
2395
|
+
console.log('it into the Agent Relay dashboard manually.');
|
|
2396
|
+
process.exit(1);
|
|
2397
|
+
}
|
|
2398
|
+
// Send code to cloud API
|
|
2399
|
+
console.log('Sending auth code to Agent Relay...');
|
|
2400
|
+
try {
|
|
2401
|
+
const response = await fetch(`${CLOUD_URL}/api/auth/codex-helper/callback`, {
|
|
2402
|
+
method: 'POST',
|
|
2403
|
+
headers: { 'Content-Type': 'application/json' },
|
|
2404
|
+
body: JSON.stringify({
|
|
2405
|
+
authSessionId,
|
|
2406
|
+
code: authCode,
|
|
2407
|
+
}),
|
|
2408
|
+
});
|
|
2409
|
+
const data = await response.json();
|
|
2410
|
+
if (response.ok && data.success) {
|
|
2411
|
+
console.log('');
|
|
2412
|
+
console.log(green('═══════════════════════════════════════════════════'));
|
|
2413
|
+
console.log(green(' Authentication Complete!'));
|
|
2414
|
+
console.log(green('═══════════════════════════════════════════════════'));
|
|
2415
|
+
console.log('');
|
|
2416
|
+
console.log('Your Codex account is now connected to Agent Relay.');
|
|
2417
|
+
console.log('You can close this terminal and return to the dashboard.');
|
|
2418
|
+
console.log('');
|
|
2419
|
+
}
|
|
2420
|
+
else {
|
|
2421
|
+
console.log('');
|
|
2422
|
+
console.log(red('Failed to send auth code to Agent Relay.'));
|
|
2423
|
+
console.log(`Error: ${data.error || 'Unknown error'}`);
|
|
2424
|
+
console.log('');
|
|
2425
|
+
console.log('You can try pasting this code manually in the dashboard:');
|
|
2426
|
+
console.log(cyan(authCode));
|
|
2427
|
+
process.exit(1);
|
|
2428
|
+
}
|
|
2429
|
+
}
|
|
2430
|
+
catch (err) {
|
|
2431
|
+
console.log('');
|
|
2432
|
+
console.log(red('Failed to connect to Agent Relay Cloud.'));
|
|
2433
|
+
console.log(`Error: ${err instanceof Error ? err.message : String(err)}`);
|
|
2434
|
+
console.log('');
|
|
2435
|
+
console.log('You can try pasting this code manually in the dashboard:');
|
|
2436
|
+
console.log(cyan(authCode));
|
|
2437
|
+
process.exit(1);
|
|
2438
|
+
}
|
|
2439
|
+
});
|
|
2223
2440
|
program.parse();
|
|
2224
2441
|
//# sourceMappingURL=index.js.map
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import { Router } from 'express';
|
|
7
7
|
import { getBillingService, getAllPlans, getPlan, comparePlans } from '../billing/index.js';
|
|
8
8
|
import { getConfig } from '../config.js';
|
|
9
|
+
import { db } from '../db/index.js';
|
|
9
10
|
export const billingRouter = Router();
|
|
10
11
|
/**
|
|
11
12
|
* Middleware to require authentication
|
|
@@ -315,8 +316,14 @@ billingRouter.post('/webhook',
|
|
|
315
316
|
}
|
|
316
317
|
const billing = getBillingService();
|
|
317
318
|
try {
|
|
318
|
-
//
|
|
319
|
-
|
|
319
|
+
// Use the preserved raw body from express.json verify callback
|
|
320
|
+
// This is critical for Stripe signature verification - JSON.stringify(req.body) won't work
|
|
321
|
+
const rawBody = req.rawBody;
|
|
322
|
+
if (!rawBody) {
|
|
323
|
+
console.error('Raw body not available for Stripe webhook verification');
|
|
324
|
+
res.status(400).json({ error: 'Raw body not available' });
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
320
327
|
// Verify and parse event
|
|
321
328
|
const event = billing.verifyWebhookSignature(rawBody, sig);
|
|
322
329
|
// Process the event
|
|
@@ -330,16 +337,30 @@ billingRouter.post('/webhook',
|
|
|
330
337
|
// Handle specific events
|
|
331
338
|
switch (billingEvent.type) {
|
|
332
339
|
case 'subscription.created':
|
|
333
|
-
case 'subscription.updated':
|
|
334
|
-
//
|
|
335
|
-
|
|
336
|
-
|
|
340
|
+
case 'subscription.updated': {
|
|
341
|
+
// Extract subscription tier and update user's plan
|
|
342
|
+
if (billingEvent.userId) {
|
|
343
|
+
const subscription = billingEvent.data;
|
|
344
|
+
const tier = billing.getTierFromSubscription(subscription);
|
|
345
|
+
// Update user's plan in database
|
|
346
|
+
await db.users.update(billingEvent.userId, { plan: tier });
|
|
347
|
+
console.log(`Updated user ${billingEvent.userId} plan to: ${tier}`);
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
console.warn('Subscription event received without userId:', billingEvent.id);
|
|
351
|
+
}
|
|
337
352
|
break;
|
|
338
|
-
|
|
339
|
-
|
|
353
|
+
}
|
|
354
|
+
case 'subscription.canceled': {
|
|
355
|
+
// Reset user to free plan
|
|
356
|
+
if (billingEvent.userId) {
|
|
357
|
+
await db.users.update(billingEvent.userId, { plan: 'free' });
|
|
358
|
+
console.log(`User ${billingEvent.userId} subscription canceled, reset to free plan`);
|
|
359
|
+
}
|
|
340
360
|
break;
|
|
361
|
+
}
|
|
341
362
|
case 'invoice.payment_failed':
|
|
342
|
-
//
|
|
363
|
+
// Log payment failure (don't immediately downgrade - Stripe retries)
|
|
343
364
|
console.log('Payment failed for user:', billingEvent.userId);
|
|
344
365
|
break;
|
|
345
366
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex Auth Helper API
|
|
3
|
+
*
|
|
4
|
+
* Provides endpoints for the `npx agent-relay codex-auth` CLI command
|
|
5
|
+
* to capture OAuth callbacks locally and send them to the cloud.
|
|
6
|
+
*
|
|
7
|
+
* This solves the "This site can't be reached" problem where Codex redirects
|
|
8
|
+
* to localhost:1455 after auth but nothing is listening.
|
|
9
|
+
*/
|
|
10
|
+
export declare const codexAuthHelperRouter: import("express-serve-static-core").Router;
|
|
11
|
+
/**
|
|
12
|
+
* Stop the cleanup interval. Call this on server shutdown.
|
|
13
|
+
*/
|
|
14
|
+
export declare function stopCodexAuthCleanup(): void;
|
|
15
|
+
//# sourceMappingURL=codex-auth-helper.d.ts.map
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex Auth Helper API
|
|
3
|
+
*
|
|
4
|
+
* Provides endpoints for the `npx agent-relay codex-auth` CLI command
|
|
5
|
+
* to capture OAuth callbacks locally and send them to the cloud.
|
|
6
|
+
*
|
|
7
|
+
* This solves the "This site can't be reached" problem where Codex redirects
|
|
8
|
+
* to localhost:1455 after auth but nothing is listening.
|
|
9
|
+
*/
|
|
10
|
+
import { Router } from 'express';
|
|
11
|
+
import crypto from 'crypto';
|
|
12
|
+
import { requireAuth } from './auth.js';
|
|
13
|
+
export const codexAuthHelperRouter = Router();
|
|
14
|
+
const pendingAuthSessions = new Map();
|
|
15
|
+
// Clean up old sessions every minute
|
|
16
|
+
const cleanupInterval = setInterval(() => {
|
|
17
|
+
const now = Date.now();
|
|
18
|
+
for (const [id, session] of pendingAuthSessions) {
|
|
19
|
+
// Remove sessions older than 10 minutes
|
|
20
|
+
if (now - session.createdAt.getTime() > 10 * 60 * 1000) {
|
|
21
|
+
pendingAuthSessions.delete(id);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}, 60000);
|
|
25
|
+
/**
|
|
26
|
+
* Stop the cleanup interval. Call this on server shutdown.
|
|
27
|
+
*/
|
|
28
|
+
export function stopCodexAuthCleanup() {
|
|
29
|
+
clearInterval(cleanupInterval);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* POST /api/auth/codex-helper/cli-session
|
|
33
|
+
* Create a new auth session for the CLI command.
|
|
34
|
+
* Returns an authSessionId that the CLI uses to send the auth code.
|
|
35
|
+
*/
|
|
36
|
+
codexAuthHelperRouter.post('/cli-session', requireAuth, async (req, res) => {
|
|
37
|
+
const userId = req.session.userId;
|
|
38
|
+
const authSessionId = crypto.randomUUID();
|
|
39
|
+
pendingAuthSessions.set(authSessionId, {
|
|
40
|
+
userId,
|
|
41
|
+
createdAt: new Date(),
|
|
42
|
+
});
|
|
43
|
+
console.log(`[codex-helper] Created CLI session ${authSessionId} for user ${userId}`);
|
|
44
|
+
res.json({
|
|
45
|
+
authSessionId,
|
|
46
|
+
expiresIn: 600, // 10 minutes
|
|
47
|
+
command: `npx agent-relay codex-auth --token=${authSessionId}`,
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
/**
|
|
51
|
+
* POST /api/auth/codex-helper/callback
|
|
52
|
+
* Receives the auth code from the CLI.
|
|
53
|
+
* No auth required - validated by authSessionId.
|
|
54
|
+
*/
|
|
55
|
+
codexAuthHelperRouter.post('/callback', async (req, res) => {
|
|
56
|
+
const { authSessionId, code, error } = req.body;
|
|
57
|
+
if (!authSessionId) {
|
|
58
|
+
return res.status(400).json({ error: 'Missing authSessionId' });
|
|
59
|
+
}
|
|
60
|
+
const session = pendingAuthSessions.get(authSessionId);
|
|
61
|
+
if (!session) {
|
|
62
|
+
return res.status(404).json({ error: 'Session not found or expired' });
|
|
63
|
+
}
|
|
64
|
+
if (error) {
|
|
65
|
+
console.log(`[codex-helper] Auth error for session ${authSessionId}:`, error);
|
|
66
|
+
pendingAuthSessions.delete(authSessionId);
|
|
67
|
+
return res.json({ success: false, error });
|
|
68
|
+
}
|
|
69
|
+
if (!code) {
|
|
70
|
+
return res.status(400).json({ error: 'Missing auth code' });
|
|
71
|
+
}
|
|
72
|
+
// Store the code so the polling endpoint can retrieve it
|
|
73
|
+
session.code = code;
|
|
74
|
+
pendingAuthSessions.set(authSessionId, session);
|
|
75
|
+
console.log(`[codex-helper] Auth code received for session ${authSessionId}`);
|
|
76
|
+
res.json({ success: true, message: 'Auth code received. You can close this terminal.' });
|
|
77
|
+
});
|
|
78
|
+
/**
|
|
79
|
+
* GET /api/auth/codex-helper/status/:authSessionId
|
|
80
|
+
* Check if auth code has been received.
|
|
81
|
+
* The dashboard polls this to know when the CLI has captured the callback.
|
|
82
|
+
*/
|
|
83
|
+
codexAuthHelperRouter.get('/status/:authSessionId', requireAuth, async (req, res) => {
|
|
84
|
+
const { authSessionId } = req.params;
|
|
85
|
+
const session = pendingAuthSessions.get(authSessionId);
|
|
86
|
+
if (!session || session.userId !== req.session.userId) {
|
|
87
|
+
return res.status(404).json({ error: 'Session not found or expired' });
|
|
88
|
+
}
|
|
89
|
+
if (session.code) {
|
|
90
|
+
// Clean up session after successful retrieval (code is single-use)
|
|
91
|
+
const code = session.code;
|
|
92
|
+
pendingAuthSessions.delete(authSessionId);
|
|
93
|
+
return res.json({
|
|
94
|
+
ready: true,
|
|
95
|
+
code,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
res.json({ ready: false });
|
|
99
|
+
});
|
|
100
|
+
//# sourceMappingURL=codex-auth-helper.js.map
|
package/dist/cloud/api/git.js
CHANGED
|
@@ -76,12 +76,33 @@ gitRouter.get('/token', async (req, res) => {
|
|
|
76
76
|
hint: 'Connect a repository via the GitHub App to enable git operations',
|
|
77
77
|
});
|
|
78
78
|
}
|
|
79
|
-
// Get fresh
|
|
80
|
-
|
|
79
|
+
// Get fresh tokens from Nango (auto-refreshes if needed)
|
|
80
|
+
// - installationToken: for git operations (clone, push, pull)
|
|
81
|
+
// - userToken: for gh CLI operations (requires user context)
|
|
82
|
+
const installationToken = await nangoService.getGithubAppToken(repoWithConnection.nangoConnectionId);
|
|
83
|
+
// Try to get user OAuth token from github-app-oauth connection_config first
|
|
84
|
+
// Fall back to separate 'github' user connection if available
|
|
85
|
+
let userToken = null;
|
|
86
|
+
try {
|
|
87
|
+
userToken = await nangoService.getGithubUserOAuthToken(repoWithConnection.nangoConnectionId);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// Try the separate github user connection if available
|
|
91
|
+
const userRepo = repos.find(r => r.nangoConnectionId && r.nangoConnectionId !== repoWithConnection.nangoConnectionId);
|
|
92
|
+
if (userRepo?.nangoConnectionId) {
|
|
93
|
+
try {
|
|
94
|
+
userToken = await nangoService.getGithubUserToken(userRepo.nangoConnectionId);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
console.log('[git] No github user token available');
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
81
101
|
// GitHub App installation tokens expire after 1 hour
|
|
82
102
|
const expiresAt = new Date(Date.now() + 55 * 60 * 1000).toISOString(); // 55 min buffer
|
|
83
103
|
res.json({
|
|
84
|
-
token,
|
|
104
|
+
token: installationToken,
|
|
105
|
+
userToken, // For gh CLI - may be null if not available
|
|
85
106
|
expiresAt,
|
|
86
107
|
username: 'x-access-token', // GitHub App tokens use this as username
|
|
87
108
|
});
|
|
@@ -95,12 +95,25 @@ onboardingRouter.post('/cli/:provider/start', async (req, res) => {
|
|
|
95
95
|
// Forward auth request to workspace daemon
|
|
96
96
|
// When running in Docker, localhost refers to the container, not the host
|
|
97
97
|
// Use host.docker.internal on Mac/Windows to reach the host machine
|
|
98
|
+
// When running on Fly.io, use internal networking (.internal) instead of public DNS
|
|
98
99
|
let workspaceUrl = workspace.publicUrl.replace(/\/$/, '');
|
|
100
|
+
// Detect Fly.io by checking FLY_APP_NAME env var
|
|
101
|
+
const isOnFly = !!process.env.FLY_APP_NAME;
|
|
99
102
|
// Detect Docker by checking for /.dockerenv file or RUNNING_IN_DOCKER env var
|
|
100
103
|
const isInDocker = process.env.RUNNING_IN_DOCKER === 'true' ||
|
|
101
104
|
await import('fs').then(fs => fs.existsSync('/.dockerenv')).catch(() => false);
|
|
102
|
-
console.log('[onboarding]
|
|
103
|
-
if (
|
|
105
|
+
console.log('[onboarding] isOnFly:', isOnFly, 'isInDocker:', isInDocker);
|
|
106
|
+
if (isOnFly && workspaceUrl.includes('.fly.dev')) {
|
|
107
|
+
// Use Fly.io internal networking for server-to-server communication
|
|
108
|
+
// ar-583f273b.fly.dev -> http://ar-583f273b.internal:3888
|
|
109
|
+
// .internal uses IPv6 and works by default for apps in the same org
|
|
110
|
+
const appName = workspaceUrl.match(/https?:\/\/([^.]+)\.fly\.dev/)?.[1];
|
|
111
|
+
if (appName) {
|
|
112
|
+
workspaceUrl = `http://${appName}.internal:3888`;
|
|
113
|
+
console.log('[onboarding] Using Fly internal network:', workspaceUrl);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
else if (isInDocker && workspaceUrl.includes('localhost')) {
|
|
104
117
|
workspaceUrl = workspaceUrl.replace('localhost', 'host.docker.internal');
|
|
105
118
|
console.log('[onboarding] Translated localhost to host.docker.internal');
|
|
106
119
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Repos API Routes
|
|
3
3
|
*
|
|
4
4
|
* GitHub repository management - list, import, sync.
|
|
5
|
+
* Includes Nango-based GitHub permission checking for dashboard access control.
|
|
5
6
|
*/
|
|
6
7
|
export declare const reposRouter: import("express-serve-static-core").Router;
|
|
7
8
|
//# sourceMappingURL=repos.d.ts.map
|