agent-relay 1.1.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/README.md +1 -1
- 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/bridge/spawner.d.ts +53 -0
- package/dist/bridge/spawner.js +203 -19
- package/dist/bridge/types.d.ts +12 -0
- package/dist/cli/index.js +618 -5
- package/dist/cloud/api/auth.d.ts +3 -2
- package/dist/cloud/api/auth.js +10 -98
- package/dist/cloud/api/billing.js +30 -9
- package/dist/cloud/api/cli-pty-runner.d.ts +54 -0
- package/dist/cloud/api/cli-pty-runner.js +119 -0
- 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/generic-webhooks.d.ts +8 -0
- package/dist/cloud/api/generic-webhooks.js +129 -0
- package/dist/cloud/api/git.d.ts +8 -0
- package/dist/cloud/api/git.js +152 -0
- package/dist/cloud/api/github-app.d.ts +11 -0
- package/dist/cloud/api/github-app.js +189 -0
- package/dist/cloud/api/middleware/planLimits.d.ts +7 -0
- package/dist/cloud/api/middleware/planLimits.js +39 -1
- package/dist/cloud/api/monitoring.d.ts +11 -0
- package/dist/cloud/api/monitoring.js +578 -0
- package/dist/cloud/api/nango-auth.d.ts +9 -0
- package/dist/cloud/api/nango-auth.js +377 -0
- package/dist/cloud/api/onboarding.d.ts +8 -1
- package/dist/cloud/api/onboarding.js +313 -119
- package/dist/cloud/api/policy.d.ts +8 -0
- package/dist/cloud/api/policy.js +229 -0
- package/dist/cloud/api/providers.js +114 -42
- package/dist/cloud/api/repos.d.ts +1 -0
- package/dist/cloud/api/repos.js +186 -0
- package/dist/cloud/api/test-helpers.d.ts +10 -0
- package/dist/cloud/api/test-helpers.js +575 -0
- package/dist/cloud/api/webhooks.d.ts +8 -0
- package/dist/cloud/api/webhooks.js +645 -0
- package/dist/cloud/api/workspaces.js +320 -12
- package/dist/cloud/billing/plans.js +32 -19
- package/dist/cloud/billing/types.d.ts +9 -3
- package/dist/cloud/config.d.ts +9 -2
- package/dist/cloud/config.js +13 -4
- package/dist/cloud/db/drizzle.d.ts +84 -1
- package/dist/cloud/db/drizzle.js +470 -0
- package/dist/cloud/db/index.d.ts +9 -4
- package/dist/cloud/db/index.js +11 -3
- package/dist/cloud/db/schema.d.ts +3283 -556
- package/dist/cloud/db/schema.js +314 -1
- package/dist/cloud/index.d.ts +1 -0
- package/dist/cloud/index.js +2 -0
- package/dist/cloud/provisioner/index.d.ts +56 -0
- package/dist/cloud/provisioner/index.js +676 -34
- package/dist/cloud/server.d.ts +1 -0
- package/dist/cloud/server.js +362 -13
- package/dist/cloud/services/auto-scaler.d.ts +152 -0
- package/dist/cloud/services/auto-scaler.js +439 -0
- package/dist/cloud/services/capacity-manager.d.ts +148 -0
- package/dist/cloud/services/capacity-manager.js +449 -0
- package/dist/cloud/services/ci-agent-spawner.d.ts +49 -0
- package/dist/cloud/services/ci-agent-spawner.js +373 -0
- package/dist/cloud/services/index.d.ts +12 -0
- package/dist/cloud/services/index.js +15 -0
- package/dist/cloud/services/mention-handler.d.ts +65 -0
- package/dist/cloud/services/mention-handler.js +405 -0
- package/dist/cloud/services/nango.d.ts +186 -0
- package/dist/cloud/services/nango.js +344 -0
- package/dist/cloud/services/persistence.d.ts +131 -0
- package/dist/cloud/services/persistence.js +200 -0
- package/dist/cloud/services/planLimits.d.ts +37 -0
- package/dist/cloud/services/planLimits.js +86 -5
- package/dist/cloud/services/scaling-orchestrator.d.ts +159 -0
- package/dist/cloud/services/scaling-orchestrator.js +502 -0
- package/dist/cloud/services/scaling-policy.d.ts +121 -0
- package/dist/cloud/services/scaling-policy.js +415 -0
- package/dist/cloud/vault/index.js +1 -1
- package/dist/cloud/webhooks/index.d.ts +24 -0
- package/dist/cloud/webhooks/index.js +29 -0
- package/dist/cloud/webhooks/parsers/github.d.ts +8 -0
- package/dist/cloud/webhooks/parsers/github.js +234 -0
- package/dist/cloud/webhooks/parsers/index.d.ts +23 -0
- package/dist/cloud/webhooks/parsers/index.js +30 -0
- package/dist/cloud/webhooks/parsers/linear.d.ts +9 -0
- package/dist/cloud/webhooks/parsers/linear.js +258 -0
- package/dist/cloud/webhooks/parsers/slack.d.ts +9 -0
- package/dist/cloud/webhooks/parsers/slack.js +214 -0
- package/dist/cloud/webhooks/responders/github.d.ts +8 -0
- package/dist/cloud/webhooks/responders/github.js +73 -0
- package/dist/cloud/webhooks/responders/index.d.ts +23 -0
- package/dist/cloud/webhooks/responders/index.js +30 -0
- package/dist/cloud/webhooks/responders/linear.d.ts +9 -0
- package/dist/cloud/webhooks/responders/linear.js +149 -0
- package/dist/cloud/webhooks/responders/slack.d.ts +20 -0
- package/dist/cloud/webhooks/responders/slack.js +178 -0
- package/dist/cloud/webhooks/router.d.ts +25 -0
- package/dist/cloud/webhooks/router.js +504 -0
- package/dist/cloud/webhooks/rules-engine.d.ts +24 -0
- package/dist/cloud/webhooks/rules-engine.js +287 -0
- package/dist/cloud/webhooks/types.d.ts +186 -0
- package/dist/cloud/webhooks/types.js +8 -0
- package/dist/continuity/formatter.d.ts +51 -0
- package/dist/continuity/formatter.js +313 -0
- package/dist/continuity/handoff-store.d.ts +67 -0
- package/dist/continuity/handoff-store.js +472 -0
- package/dist/continuity/index.d.ts +45 -0
- package/dist/continuity/index.js +48 -0
- package/dist/continuity/ledger-store.d.ts +110 -0
- package/dist/continuity/ledger-store.js +500 -0
- package/dist/continuity/manager.d.ts +178 -0
- package/dist/continuity/manager.js +562 -0
- package/dist/continuity/parser.d.ts +76 -0
- package/dist/continuity/parser.js +579 -0
- package/dist/continuity/types.d.ts +180 -0
- package/dist/continuity/types.js +9 -0
- package/dist/daemon/agent-manager.d.ts +27 -0
- package/dist/daemon/agent-manager.js +107 -6
- package/dist/daemon/agent-registry.d.ts +32 -0
- package/dist/daemon/agent-registry.js +42 -2
- package/dist/daemon/api.d.ts +12 -0
- package/dist/daemon/api.js +131 -2
- package/dist/daemon/cli-auth.d.ts +67 -0
- package/dist/daemon/cli-auth.js +537 -0
- package/dist/daemon/cloud-sync.js +9 -7
- package/dist/daemon/orchestrator.js +30 -0
- package/dist/daemon/router.d.ts +5 -0
- package/dist/daemon/router.js +78 -26
- package/dist/daemon/server.d.ts +5 -0
- package/dist/daemon/server.js +9 -1
- package/dist/daemon/services/browser-testing.d.ts +88 -0
- package/dist/daemon/services/browser-testing.js +244 -0
- package/dist/daemon/services/container-spawner.d.ts +135 -0
- package/dist/daemon/services/container-spawner.js +313 -0
- package/dist/daemon/types.d.ts +5 -1
- package/dist/dashboard/out/404.html +1 -1
- package/dist/dashboard/out/_next/static/chunks/116-2502180def231162.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/282-980c2eb8fff20123.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/699-3b1cd6618a45d259.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/724-2dae7627550ab88f.js +9 -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-b6edd4dde8d08194.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-c22d080201cbd9fb.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/metrics/page-67a3e98d9a43a6ed.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/page-77e9c65420a06cfb.js +1 -0
- 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-68d34f50baa8ab6b.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/e868780c-48e5f147c90a3a41.js +18 -0
- 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-c2f423b9c9f4591b.js → main-ed4e1fb6f29c34cf.js} +1 -1
- package/dist/dashboard/out/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +1 -0
- package/dist/dashboard/out/_next/static/css/29852f26181969a0.css +1 -0
- package/dist/dashboard/out/_next/static/css/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 -14
- package/dist/dashboard/out/app.txt +2 -2
- package/dist/dashboard/out/connect-repos.html +1 -0
- package/dist/dashboard/out/connect-repos.txt +7 -0
- package/dist/dashboard/out/history.html +1 -1
- package/dist/dashboard/out/history.txt +2 -2
- package/dist/dashboard/out/index.html +1 -1
- package/dist/dashboard/out/index.txt +2 -2
- package/dist/dashboard/out/login.html +6 -0
- package/dist/dashboard/out/login.txt +7 -0
- package/dist/dashboard/out/metrics.html +1 -1
- package/dist/dashboard/out/metrics.txt +2 -2
- package/dist/dashboard/out/pricing.html +3 -3
- package/dist/dashboard/out/pricing.txt +2 -2
- package/dist/dashboard/out/providers.html +1 -0
- package/dist/dashboard/out/providers.txt +7 -0
- package/dist/dashboard/out/signup.html +6 -0
- package/dist/dashboard/out/signup.txt +7 -0
- package/dist/dashboard-server/server.js +1308 -8
- package/dist/hooks/emitter.d.ts +40 -0
- package/dist/hooks/emitter.js +63 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.js +3 -0
- package/dist/hooks/registry.d.ts +173 -0
- package/dist/hooks/registry.js +476 -0
- package/dist/hooks/trajectory-hooks.d.ts +52 -0
- package/dist/hooks/trajectory-hooks.js +183 -0
- package/dist/hooks/types.d.ts +141 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -0
- package/dist/memory/adapters/index.d.ts +8 -0
- package/dist/memory/adapters/index.js +8 -0
- package/dist/memory/adapters/inmemory.d.ts +59 -0
- package/dist/memory/adapters/inmemory.js +195 -0
- package/dist/memory/adapters/supermemory.d.ts +71 -0
- package/dist/memory/adapters/supermemory.js +338 -0
- package/dist/memory/factory.d.ts +48 -0
- package/dist/memory/factory.js +143 -0
- package/dist/memory/index.d.ts +32 -0
- package/dist/memory/index.js +32 -0
- package/dist/memory/memory-hooks.d.ts +60 -0
- package/dist/memory/memory-hooks.js +313 -0
- package/dist/memory/service.d.ts +49 -0
- package/dist/memory/service.js +146 -0
- package/dist/memory/types.d.ts +195 -0
- package/dist/memory/types.js +8 -0
- package/dist/policy/agent-policy.d.ts +225 -0
- package/dist/policy/agent-policy.js +665 -0
- package/dist/policy/cloud-policy-fetcher.d.ts +12 -0
- package/dist/policy/cloud-policy-fetcher.js +64 -0
- package/dist/resiliency/crash-insights.d.ts +156 -0
- package/dist/resiliency/crash-insights.js +492 -0
- package/dist/resiliency/gossip-health.d.ts +137 -0
- package/dist/resiliency/gossip-health.js +241 -0
- package/dist/resiliency/index.d.ts +5 -0
- package/dist/resiliency/index.js +5 -0
- package/dist/resiliency/leader-watchdog.d.ts +109 -0
- package/dist/resiliency/leader-watchdog.js +189 -0
- package/dist/resiliency/memory-monitor.d.ts +172 -0
- package/dist/resiliency/memory-monitor.js +593 -0
- package/dist/resiliency/stateless-lead.d.ts +149 -0
- package/dist/resiliency/stateless-lead.js +308 -0
- package/dist/resiliency/supervisor.d.ts +38 -0
- package/dist/resiliency/supervisor.js +122 -0
- package/dist/shared/cli-auth-config.d.ts +91 -0
- package/dist/shared/cli-auth-config.js +264 -0
- package/dist/storage/adapter.d.ts +1 -1
- package/dist/trajectory/config.d.ts +84 -0
- package/dist/trajectory/config.js +163 -0
- package/dist/trajectory/index.d.ts +8 -0
- package/dist/trajectory/index.js +8 -0
- package/dist/trajectory/integration.d.ts +292 -0
- package/dist/trajectory/integration.js +834 -0
- package/dist/utils/logger.js +1 -1
- package/dist/utils/project-namespace.d.ts +24 -0
- package/dist/utils/project-namespace.js +84 -0
- package/dist/wrapper/parser.d.ts +10 -0
- package/dist/wrapper/parser.js +100 -33
- package/dist/wrapper/pty-wrapper.d.ts +197 -16
- package/dist/wrapper/pty-wrapper.js +943 -106
- package/dist/wrapper/shared.d.ts +165 -0
- package/dist/wrapper/shared.js +270 -0
- package/dist/wrapper/tmux-wrapper.d.ts +73 -11
- package/dist/wrapper/tmux-wrapper.js +541 -120
- package/package.json +16 -16
- package/scripts/postinstall.js +60 -0
- 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/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/middleware/planLimits.d.ts.map +0 -1
- package/dist/cloud/api/middleware/planLimits.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/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/usage.d.ts.map +0 -1
- package/dist/cloud/api/usage.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/coordinator.d.ts.map +0 -1
- package/dist/cloud/services/coordinator.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/vault/index.d.ts.map +0 -1
- package/dist/cloud/vault/index.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/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/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/693-7b3301d8f6bc5014.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/713-f78477eb185f1f4d.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/766-e53e1cfe39b0b5b5.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/900-037c64bfd797fb2a.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/app/page-e3d9e1f4466b9bae.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/layout-2433bb48965f4333.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/metrics/page-e68825a81db67ba1.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/page-cc108bf68c8a657f.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/pricing/page-d80e03a5297f95b6.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/webpack-a5acc2831d094776.js +0 -1
- package/dist/dashboard/out/_next/static/css/79b80143647a07d7.css +0 -1
- package/dist/dashboard/out/_next/static/css/8cf277370ad48cfe.css +0 -1
- package/dist/dashboard-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/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/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/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/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/logger.d.ts.map +0 -1
- package/dist/resiliency/logger.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/supervisor.d.ts.map +0 -1
- package/dist/resiliency/supervisor.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/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/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/CHANGELOG.md +0 -11
- package/docs/CLI-SIMPLIFICATION-COMPLETE.md +0 -48
- package/docs/CLOUD-ARCHITECTURE.md +0 -652
- package/docs/CLOUD-ONBOARDING-DESIGN.md +0 -1983
- package/docs/COMPETITIVE_ANALYSIS.md +0 -897
- package/docs/CONTRIBUTING.md +0 -151
- package/docs/DESIGN_BRIDGE_STAFFING.md +0 -878
- package/docs/DESIGN_V2.md +0 -1079
- package/docs/INTEGRATION-GUIDE.md +0 -926
- package/docs/MONETIZATION.md +0 -1679
- package/docs/PROPOSAL-trajectories.md +0 -1582
- package/docs/PROTOCOL.md +0 -325
- package/docs/SCALING_ANALYSIS.md +0 -280
- package/docs/TESTING_PRESENCE_FEATURES.md +0 -327
- package/docs/TMUX_IMPLEMENTATION_NOTES.md +0 -364
- package/docs/TMUX_IMPROVEMENTS.md +0 -968
- package/docs/agent-relay-snippet.md +0 -168
- package/docs/competitive-analysis-mcp-agent-mail.md +0 -389
- package/docs/dashboard-v2-plan.md +0 -179
- package/docs/guides/CLOUD.md +0 -236
- package/docs/guides/LOCAL.md +0 -535
- package/docs/guides/SELF-HOSTED.md +0 -494
- package/docs/proposals/shadow-as-subagent.md +0 -765
- package/docs/proposals/slack-bot-integration.md +0 -1457
- package/docs/removable-code-analysis.md +0 -24
- 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/tictactoe-setup.sh +0 -181
- /package/dist/dashboard/out/_next/static/chunks/{117-b2cd8d6485aacf2b.js → 117-f7b8ab0809342e77.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/{648-8f3f26864ce515e5.js → 648-5cc6e1921389a58a.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/app/_not-found/{page-0b990dbb71d72a98.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/{6HHWb2ZmnJ4OSm0zUP7h4 → wPgKJtcOmTFLpUncDg16A}/_buildManifest.js +0 -0
- /package/dist/dashboard/out/_next/static/{6HHWb2ZmnJ4OSm0zUP7h4 → wPgKJtcOmTFLpUncDg16A}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nango Auth API Routes
|
|
3
|
+
*
|
|
4
|
+
* Handles GitHub OAuth via Nango with two-connection pattern:
|
|
5
|
+
* - github: User login (identity)
|
|
6
|
+
* - github-app-oauth: Repository access
|
|
7
|
+
*/
|
|
8
|
+
import { Router } from 'express';
|
|
9
|
+
import { randomUUID } from 'crypto';
|
|
10
|
+
import { requireAuth } from './auth.js';
|
|
11
|
+
import { db } from '../db/index.js';
|
|
12
|
+
import { nangoService, NANGO_INTEGRATIONS } from '../services/nango.js';
|
|
13
|
+
export const nangoAuthRouter = Router();
|
|
14
|
+
/**
|
|
15
|
+
* GET /api/auth/nango/status
|
|
16
|
+
* Check if Nango is configured
|
|
17
|
+
*/
|
|
18
|
+
nangoAuthRouter.get('/status', (req, res) => {
|
|
19
|
+
try {
|
|
20
|
+
res.json({
|
|
21
|
+
configured: true,
|
|
22
|
+
integrations: NANGO_INTEGRATIONS,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
catch (_error) {
|
|
26
|
+
res.json({
|
|
27
|
+
configured: false,
|
|
28
|
+
message: 'Nango not configured',
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
/**
|
|
33
|
+
* GET /api/auth/nango/login-session
|
|
34
|
+
* Create a Nango connect session for GitHub login
|
|
35
|
+
*/
|
|
36
|
+
nangoAuthRouter.get('/login-session', async (req, res) => {
|
|
37
|
+
try {
|
|
38
|
+
const tempUserId = randomUUID();
|
|
39
|
+
const session = await nangoService.createConnectSession([NANGO_INTEGRATIONS.GITHUB_USER], { id: tempUserId });
|
|
40
|
+
res.json({ sessionToken: session.token, tempUserId });
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
console.error('Error creating login session:', error);
|
|
44
|
+
res.status(500).json({ error: 'Failed to create login session' });
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
/**
|
|
48
|
+
* GET /api/auth/nango/login-status/:connectionId
|
|
49
|
+
* Poll for login completion after Nango connect UI
|
|
50
|
+
*/
|
|
51
|
+
nangoAuthRouter.get('/login-status/:connectionId', async (req, res) => {
|
|
52
|
+
const { connectionId } = req.params;
|
|
53
|
+
try {
|
|
54
|
+
// Check if a user exists with this incoming connection
|
|
55
|
+
const user = await db.users.findByIncomingConnectionId(connectionId);
|
|
56
|
+
if (!user) {
|
|
57
|
+
return res.json({ ready: false });
|
|
58
|
+
}
|
|
59
|
+
// Issue session
|
|
60
|
+
req.session.userId = user.id;
|
|
61
|
+
// Clear incoming connection ID
|
|
62
|
+
await db.users.clearIncomingConnectionId(user.id);
|
|
63
|
+
// Check if user has any repos connected
|
|
64
|
+
const repos = await db.repositories.findByUserId(user.id);
|
|
65
|
+
const hasRepos = repos.length > 0;
|
|
66
|
+
res.json({
|
|
67
|
+
ready: true,
|
|
68
|
+
hasRepos,
|
|
69
|
+
user: {
|
|
70
|
+
id: user.id,
|
|
71
|
+
githubUsername: user.githubUsername,
|
|
72
|
+
email: user.email,
|
|
73
|
+
avatarUrl: user.avatarUrl,
|
|
74
|
+
plan: user.plan,
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
console.error('Error checking login status:', error);
|
|
80
|
+
res.status(500).json({ error: 'Failed to check login status' });
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
/**
|
|
84
|
+
* GET /api/auth/nango/repo-session
|
|
85
|
+
* Create a Nango connect session for GitHub App OAuth (repo access)
|
|
86
|
+
* Requires authentication
|
|
87
|
+
*/
|
|
88
|
+
nangoAuthRouter.get('/repo-session', requireAuth, async (req, res) => {
|
|
89
|
+
const userId = req.session.userId;
|
|
90
|
+
try {
|
|
91
|
+
const user = await db.users.findById(userId);
|
|
92
|
+
if (!user) {
|
|
93
|
+
return res.status(404).json({ error: 'User not found' });
|
|
94
|
+
}
|
|
95
|
+
const session = await nangoService.createConnectSession([NANGO_INTEGRATIONS.GITHUB_APP], { id: user.id, email: user.email || undefined });
|
|
96
|
+
res.json({ sessionToken: session.token });
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
console.error('Error creating repo session:', error);
|
|
100
|
+
res.status(500).json({ error: 'Failed to create repo session' });
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
/**
|
|
104
|
+
* GET /api/auth/nango/repo-status/:connectionId
|
|
105
|
+
* Poll for repo sync completion after GitHub App OAuth
|
|
106
|
+
* Requires authentication
|
|
107
|
+
*/
|
|
108
|
+
nangoAuthRouter.get('/repo-status/:connectionId', requireAuth, async (req, res) => {
|
|
109
|
+
const userId = req.session.userId;
|
|
110
|
+
const { connectionId: _connectionId } = req.params;
|
|
111
|
+
try {
|
|
112
|
+
const user = await db.users.findById(userId);
|
|
113
|
+
if (!user) {
|
|
114
|
+
return res.status(404).json({ error: 'User not found' });
|
|
115
|
+
}
|
|
116
|
+
// Check for pending org approval
|
|
117
|
+
if (user.pendingInstallationRequest) {
|
|
118
|
+
return res.json({
|
|
119
|
+
ready: false,
|
|
120
|
+
pendingApproval: true,
|
|
121
|
+
message: 'Waiting for organization admin approval',
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
// Check if repos have been synced
|
|
125
|
+
const repos = await db.repositories.findByUserId(userId);
|
|
126
|
+
const reposFromConnection = repos.filter(r => r.syncStatus === 'synced' && r.nangoConnectionId);
|
|
127
|
+
if (reposFromConnection.length === 0) {
|
|
128
|
+
return res.json({ ready: false });
|
|
129
|
+
}
|
|
130
|
+
// Check workspace status for frontend visibility
|
|
131
|
+
const workspaces = await db.workspaces.findByUserId(userId);
|
|
132
|
+
const primaryWorkspace = workspaces[0];
|
|
133
|
+
res.json({
|
|
134
|
+
ready: true,
|
|
135
|
+
repos: reposFromConnection.map(r => ({
|
|
136
|
+
id: r.id,
|
|
137
|
+
fullName: r.githubFullName,
|
|
138
|
+
isPrivate: r.isPrivate,
|
|
139
|
+
defaultBranch: r.defaultBranch,
|
|
140
|
+
})),
|
|
141
|
+
workspace: primaryWorkspace ? {
|
|
142
|
+
id: primaryWorkspace.id,
|
|
143
|
+
name: primaryWorkspace.name,
|
|
144
|
+
status: primaryWorkspace.status,
|
|
145
|
+
publicUrl: primaryWorkspace.publicUrl,
|
|
146
|
+
} : null,
|
|
147
|
+
workspaceProvisioning: primaryWorkspace?.status === 'provisioning',
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
console.error('Error checking repo status:', error);
|
|
152
|
+
res.status(500).json({ error: 'Failed to check repo status' });
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
// ============================================================================
|
|
156
|
+
// Nango Webhook Handler
|
|
157
|
+
// ============================================================================
|
|
158
|
+
/**
|
|
159
|
+
* POST /api/auth/nango/webhook
|
|
160
|
+
* Handle Nango webhooks for auth and sync events
|
|
161
|
+
*/
|
|
162
|
+
nangoAuthRouter.post('/webhook', async (req, res) => {
|
|
163
|
+
// Use the preserved raw body from express.json verify callback
|
|
164
|
+
const rawBody = req.rawBody || JSON.stringify(req.body);
|
|
165
|
+
// Verify signature using the new verifyIncomingWebhookRequest method
|
|
166
|
+
const hasSignature = req.headers['x-nango-signature'] || req.headers['x-nango-hmac-sha256'];
|
|
167
|
+
const isDev = process.env.NODE_ENV !== 'production';
|
|
168
|
+
if (hasSignature) {
|
|
169
|
+
if (!nangoService.verifyWebhookSignature(rawBody, req.headers)) {
|
|
170
|
+
console.error('[nango-webhook] Invalid signature');
|
|
171
|
+
return res.status(401).json({ error: 'Invalid signature' });
|
|
172
|
+
}
|
|
173
|
+
console.log('[nango-webhook] Signature verified');
|
|
174
|
+
}
|
|
175
|
+
else if (!isDev) {
|
|
176
|
+
console.error('[nango-webhook] Missing signature in production');
|
|
177
|
+
return res.status(401).json({ error: 'Missing signature' });
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
console.warn('[nango-webhook] Skipping signature verification in development (no signature)');
|
|
181
|
+
}
|
|
182
|
+
const payload = req.body;
|
|
183
|
+
console.log(`[nango-webhook] Received ${payload.type} event`, JSON.stringify(payload, null, 2));
|
|
184
|
+
try {
|
|
185
|
+
switch (payload.type) {
|
|
186
|
+
case 'auth':
|
|
187
|
+
await handleAuthWebhook(payload);
|
|
188
|
+
break;
|
|
189
|
+
case 'sync':
|
|
190
|
+
console.log('[nango-webhook] Sync event received');
|
|
191
|
+
break;
|
|
192
|
+
case 'forward':
|
|
193
|
+
// Nango forwards events from providers - typically not needed for our flow
|
|
194
|
+
console.log('[nango-webhook] Forward event from provider (ignored)');
|
|
195
|
+
break;
|
|
196
|
+
default:
|
|
197
|
+
console.log(`[nango-webhook] Unhandled event type: ${payload.type}`);
|
|
198
|
+
}
|
|
199
|
+
res.json({ success: true });
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
console.error('[nango-webhook] Error processing webhook:', error);
|
|
203
|
+
res.status(500).json({ error: 'Failed to process webhook' });
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
/**
|
|
207
|
+
* Handle Nango auth webhook
|
|
208
|
+
*/
|
|
209
|
+
async function handleAuthWebhook(payload) {
|
|
210
|
+
const { connectionId, providerConfigKey, endUser } = payload;
|
|
211
|
+
console.log(`[nango-webhook] Auth event for ${providerConfigKey} (${connectionId})`);
|
|
212
|
+
if (providerConfigKey === NANGO_INTEGRATIONS.GITHUB_USER) {
|
|
213
|
+
await handleLoginWebhook(connectionId, endUser);
|
|
214
|
+
}
|
|
215
|
+
else if (providerConfigKey === NANGO_INTEGRATIONS.GITHUB_APP) {
|
|
216
|
+
await handleRepoAuthWebhook(connectionId, endUser);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Handle GitHub login webhook
|
|
221
|
+
*
|
|
222
|
+
* Three scenarios:
|
|
223
|
+
* 1. New user - Create user record, keep connection as permanent
|
|
224
|
+
* 2. Returning user with existing connection - Store incoming ID for polling, delete temp connection
|
|
225
|
+
* 3. Existing user, first connection - Set connection ID as permanent
|
|
226
|
+
*/
|
|
227
|
+
async function handleLoginWebhook(connectionId, _endUser) {
|
|
228
|
+
// Get GitHub user info via Nango proxy
|
|
229
|
+
const githubUser = await nangoService.getGithubUser(connectionId);
|
|
230
|
+
const githubId = String(githubUser.id);
|
|
231
|
+
// Check if user already exists
|
|
232
|
+
const existingUser = await db.users.findByGithubId(githubId);
|
|
233
|
+
// SCENARIO 1: New user
|
|
234
|
+
if (!existingUser) {
|
|
235
|
+
const newUser = await db.users.upsert({
|
|
236
|
+
githubId,
|
|
237
|
+
githubUsername: githubUser.login,
|
|
238
|
+
email: githubUser.email || null,
|
|
239
|
+
avatarUrl: githubUser.avatar_url || null,
|
|
240
|
+
nangoConnectionId: connectionId,
|
|
241
|
+
incomingConnectionId: connectionId,
|
|
242
|
+
});
|
|
243
|
+
// Update connection with real user ID
|
|
244
|
+
await nangoService.updateEndUser(connectionId, NANGO_INTEGRATIONS.GITHUB_USER, {
|
|
245
|
+
id: newUser.id,
|
|
246
|
+
email: newUser.email || undefined,
|
|
247
|
+
});
|
|
248
|
+
console.log(`[nango-webhook] New user created: ${githubUser.login}`);
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
// SCENARIO 2: Returning user with existing connection - delete temp connection
|
|
252
|
+
if (existingUser.nangoConnectionId && existingUser.nangoConnectionId !== connectionId) {
|
|
253
|
+
console.log(`[nango-webhook] Returning user: ${githubUser.login}`, {
|
|
254
|
+
permanentConnectionId: existingUser.nangoConnectionId,
|
|
255
|
+
incomingConnectionId: connectionId,
|
|
256
|
+
});
|
|
257
|
+
// Store incoming connection ID for polling
|
|
258
|
+
await db.users.update(existingUser.id, {
|
|
259
|
+
incomingConnectionId: connectionId,
|
|
260
|
+
githubUsername: githubUser.login,
|
|
261
|
+
avatarUrl: githubUser.avatar_url || null,
|
|
262
|
+
});
|
|
263
|
+
// Delete the temporary connection from Nango to prevent duplicates
|
|
264
|
+
try {
|
|
265
|
+
await nangoService.deleteConnection(connectionId, NANGO_INTEGRATIONS.GITHUB_USER);
|
|
266
|
+
console.log(`[nango-webhook] Deleted temp connection for returning user`);
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
console.error(`[nango-webhook] Failed to delete temp connection:`, error);
|
|
270
|
+
// Non-fatal - continue anyway
|
|
271
|
+
}
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
// SCENARIO 3: Existing user, first connection (or same connection)
|
|
275
|
+
console.log(`[nango-webhook] First/same connection for existing user: ${githubUser.login}`);
|
|
276
|
+
await db.users.update(existingUser.id, {
|
|
277
|
+
nangoConnectionId: connectionId,
|
|
278
|
+
incomingConnectionId: connectionId,
|
|
279
|
+
githubUsername: githubUser.login,
|
|
280
|
+
avatarUrl: githubUser.avatar_url || null,
|
|
281
|
+
});
|
|
282
|
+
// Update connection with user ID
|
|
283
|
+
await nangoService.updateEndUser(connectionId, NANGO_INTEGRATIONS.GITHUB_USER, {
|
|
284
|
+
id: existingUser.id,
|
|
285
|
+
email: existingUser.email || undefined,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Handle GitHub App OAuth webhook (repo access)
|
|
290
|
+
*/
|
|
291
|
+
async function handleRepoAuthWebhook(connectionId, endUser) {
|
|
292
|
+
let userId = endUser?.id;
|
|
293
|
+
// Fallback: If endUser.id not in webhook, fetch connection metadata from Nango
|
|
294
|
+
if (!userId) {
|
|
295
|
+
console.log('[nango-webhook] No user ID in webhook payload, fetching from connection metadata...');
|
|
296
|
+
try {
|
|
297
|
+
const connection = await nangoService.getConnection(connectionId, NANGO_INTEGRATIONS.GITHUB_APP);
|
|
298
|
+
userId = connection.end_user?.id;
|
|
299
|
+
console.log(`[nango-webhook] Got user ID from connection: ${userId || 'not found'}`);
|
|
300
|
+
}
|
|
301
|
+
catch (err) {
|
|
302
|
+
console.error('[nango-webhook] Failed to fetch connection metadata:', err);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
if (!userId) {
|
|
306
|
+
console.error('[nango-webhook] No user ID found - cannot sync repos');
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
const user = await db.users.findById(userId);
|
|
310
|
+
if (!user) {
|
|
311
|
+
console.error(`[nango-webhook] User ${userId} not found`);
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
try {
|
|
315
|
+
// Get the GitHub App installation ID
|
|
316
|
+
const githubInstallationId = await nangoService.getGithubAppInstallationId(connectionId);
|
|
317
|
+
let installationUuid = null;
|
|
318
|
+
if (githubInstallationId) {
|
|
319
|
+
// Find or create the github_installations record
|
|
320
|
+
let installation = await db.githubInstallations.findByInstallationId(String(githubInstallationId));
|
|
321
|
+
if (!installation) {
|
|
322
|
+
// Create a new installation record
|
|
323
|
+
// We need to get more info about the installation - for now use user info
|
|
324
|
+
installation = await db.githubInstallations.upsert({
|
|
325
|
+
installationId: String(githubInstallationId),
|
|
326
|
+
accountType: 'user', // Could be 'organization' - we'd need to detect this
|
|
327
|
+
accountLogin: user.githubUsername || 'unknown',
|
|
328
|
+
accountId: user.githubId || 'unknown',
|
|
329
|
+
installedById: user.id,
|
|
330
|
+
permissions: {},
|
|
331
|
+
events: [],
|
|
332
|
+
});
|
|
333
|
+
console.log(`[nango-webhook] Created installation record for ${githubInstallationId}`);
|
|
334
|
+
}
|
|
335
|
+
installationUuid = installation.id;
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
console.warn('[nango-webhook] Could not get installation ID from Nango connection');
|
|
339
|
+
}
|
|
340
|
+
// Fetch repos the user has access to
|
|
341
|
+
const { repositories: repos } = await nangoService.listGithubAppRepos(connectionId);
|
|
342
|
+
// Sync repos to database
|
|
343
|
+
for (const repo of repos) {
|
|
344
|
+
await db.repositories.upsert({
|
|
345
|
+
userId: user.id,
|
|
346
|
+
githubFullName: repo.full_name,
|
|
347
|
+
githubId: repo.id,
|
|
348
|
+
isPrivate: repo.private,
|
|
349
|
+
defaultBranch: repo.default_branch,
|
|
350
|
+
nangoConnectionId: connectionId,
|
|
351
|
+
installationId: installationUuid,
|
|
352
|
+
syncStatus: 'synced',
|
|
353
|
+
lastSyncedAt: new Date(),
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
// Clear any pending installation request
|
|
357
|
+
await db.users.clearPendingInstallationRequest(user.id);
|
|
358
|
+
console.log(`[nango-webhook] Synced ${repos.length} repos for ${user.githubUsername} (installation: ${githubInstallationId || 'unknown'})`);
|
|
359
|
+
// Note: We intentionally do NOT auto-provision workspaces here.
|
|
360
|
+
// Users should go through the onboarding flow at /app to:
|
|
361
|
+
// 1. Name their workspace
|
|
362
|
+
// 2. Choose which repos to include
|
|
363
|
+
// 3. Understand what they're creating
|
|
364
|
+
}
|
|
365
|
+
catch (error) {
|
|
366
|
+
const err = error;
|
|
367
|
+
if (err.message?.includes('403')) {
|
|
368
|
+
// Org approval pending
|
|
369
|
+
await db.users.setPendingInstallationRequest(user.id);
|
|
370
|
+
console.log(`[nango-webhook] Org approval pending for ${user.githubUsername}`);
|
|
371
|
+
}
|
|
372
|
+
else {
|
|
373
|
+
throw error;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
//# sourceMappingURL=nango-auth.js.map
|
|
@@ -2,7 +2,14 @@
|
|
|
2
2
|
* Onboarding API Routes
|
|
3
3
|
*
|
|
4
4
|
* Handles CLI proxy authentication for Claude Code and other providers.
|
|
5
|
-
* Spawns CLI tools to get auth URLs, captures tokens.
|
|
5
|
+
* Spawns CLI tools via PTY to get auth URLs, captures tokens.
|
|
6
|
+
*
|
|
7
|
+
* We use node-pty instead of child_process.spawn because:
|
|
8
|
+
* 1. Many CLIs detect if they're in a TTY and behave differently
|
|
9
|
+
* 2. Interactive OAuth flows often require TTY for proper output
|
|
10
|
+
* 3. PTY ensures the CLI outputs auth URLs correctly
|
|
6
11
|
*/
|
|
12
|
+
import { CLI_AUTH_CONFIG, runCLIAuthViaPTY, stripAnsiCodes, matchesSuccessPattern, findMatchingPrompt, validateProviderConfig, validateAllProviderConfigs, getSupportedProviders, type CLIAuthConfig, type PTYAuthResult, type PTYAuthOptions, type PromptHandler } from './cli-pty-runner.js';
|
|
13
|
+
export { CLI_AUTH_CONFIG, runCLIAuthViaPTY, stripAnsiCodes, matchesSuccessPattern, findMatchingPrompt, validateProviderConfig, validateAllProviderConfigs, getSupportedProviders, type CLIAuthConfig, type PTYAuthResult, type PTYAuthOptions, type PromptHandler, };
|
|
7
14
|
export declare const onboardingRouter: import("express-serve-static-core").Router;
|
|
8
15
|
//# sourceMappingURL=onboarding.d.ts.map
|