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
package/dist/cli/index.js
CHANGED
|
@@ -55,6 +55,7 @@ program
|
|
|
55
55
|
.option('-n, --name <name>', 'Agent name (auto-generated if not set)')
|
|
56
56
|
.option('-q, --quiet', 'Disable debug output', false)
|
|
57
57
|
.option('--prefix <pattern>', 'Relay prefix pattern (default: ->relay:)')
|
|
58
|
+
.option('--dashboard-port <port>', 'Dashboard port for spawn/release API (auto-detected if not set)')
|
|
58
59
|
.option('--shadow <name>', 'Spawn a shadow agent with this name that monitors the primary')
|
|
59
60
|
.option('--shadow-role <role>', 'Shadow role: reviewer, auditor, or triggers (comma-separated: SESSION_END,CODE_WRITTEN,REVIEW_REQUEST,EXPLICIT_ASK,ALL_MESSAGES)')
|
|
60
61
|
.argument('[command...]', 'Command to wrap (e.g., claude)')
|
|
@@ -85,8 +86,31 @@ program
|
|
|
85
86
|
}
|
|
86
87
|
const { TmuxWrapper } = await import('../wrapper/tmux-wrapper.js');
|
|
87
88
|
const { AgentSpawner } = await import('../bridge/spawner.js');
|
|
88
|
-
//
|
|
89
|
-
|
|
89
|
+
// Determine dashboard port for spawn/release API
|
|
90
|
+
// Priority: CLI flag > env var > auto-detect default port
|
|
91
|
+
let dashboardPort;
|
|
92
|
+
if (options.dashboardPort) {
|
|
93
|
+
dashboardPort = parseInt(options.dashboardPort, 10);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
// Try to detect if dashboard is running at default port
|
|
97
|
+
const defaultPort = parseInt(DEFAULT_DASHBOARD_PORT, 10);
|
|
98
|
+
try {
|
|
99
|
+
const response = await fetch(`http://localhost:${defaultPort}/api/status`, {
|
|
100
|
+
method: 'GET',
|
|
101
|
+
signal: AbortSignal.timeout(500), // Quick timeout for detection
|
|
102
|
+
});
|
|
103
|
+
if (response.ok) {
|
|
104
|
+
dashboardPort = defaultPort;
|
|
105
|
+
console.error(`Dashboard detected: http://localhost:${dashboardPort}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// Dashboard not running - spawn/release will use fallback callbacks
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Create spawner as fallback for direct spawn (if dashboard API not available)
|
|
113
|
+
const spawner = new AgentSpawner(paths.projectRoot, undefined, dashboardPort);
|
|
90
114
|
const wrapper = new TmuxWrapper({
|
|
91
115
|
name: agentName,
|
|
92
116
|
command: mainCommand,
|
|
@@ -96,7 +120,9 @@ program
|
|
|
96
120
|
relayPrefix: options.prefix,
|
|
97
121
|
useInbox: true,
|
|
98
122
|
inboxDir: paths.dataDir, // Use the project-specific data directory for the inbox
|
|
99
|
-
//
|
|
123
|
+
// Use dashboard API for spawn/release when available (preferred - works from any context)
|
|
124
|
+
dashboardPort,
|
|
125
|
+
// Wire up spawn/release callbacks as fallback (if no dashboardPort)
|
|
100
126
|
onSpawn: async (workerName, workerCli, task) => {
|
|
101
127
|
console.error(`[${agentName}] Spawning ${workerName} (${workerCli})...`);
|
|
102
128
|
const result = await spawner.spawn({
|
|
@@ -125,7 +151,7 @@ program
|
|
|
125
151
|
});
|
|
126
152
|
process.on('SIGINT', async () => {
|
|
127
153
|
await spawner.releaseAll();
|
|
128
|
-
wrapper.stop();
|
|
154
|
+
await wrapper.stop();
|
|
129
155
|
process.exit(0);
|
|
130
156
|
});
|
|
131
157
|
await wrapper.start();
|
|
@@ -1650,6 +1676,62 @@ cloudCommand
|
|
|
1650
1676
|
process.exit(1);
|
|
1651
1677
|
}
|
|
1652
1678
|
});
|
|
1679
|
+
// ============================================================================
|
|
1680
|
+
// TRAJECTORY COMMANDS (trail proxy)
|
|
1681
|
+
// ============================================================================
|
|
1682
|
+
// trail - Proxy to trail CLI for trajectory tracking
|
|
1683
|
+
program
|
|
1684
|
+
.command('trail')
|
|
1685
|
+
.description('Trajectory tracking commands (proxies to trail CLI)')
|
|
1686
|
+
.argument('[args...]', 'Arguments to pass to trail CLI')
|
|
1687
|
+
.allowUnknownOption()
|
|
1688
|
+
.action(async (args) => {
|
|
1689
|
+
const { spawn } = await import('node:child_process');
|
|
1690
|
+
const { getProjectPaths } = await import('../utils/project-namespace.js');
|
|
1691
|
+
const { getPrimaryTrajectoriesDir, ensureTrajectoriesDir } = await import('../trajectory/config.js');
|
|
1692
|
+
const paths = getProjectPaths();
|
|
1693
|
+
// Check if trail is available
|
|
1694
|
+
const trailCheck = spawn('which', ['trail'], { stdio: 'pipe' });
|
|
1695
|
+
const trailExists = await new Promise((resolve) => {
|
|
1696
|
+
trailCheck.on('close', (code) => resolve(code === 0));
|
|
1697
|
+
trailCheck.on('error', () => resolve(false));
|
|
1698
|
+
});
|
|
1699
|
+
if (!trailExists) {
|
|
1700
|
+
console.error('trail CLI not found. Install with: npm install -g agent-trajectories');
|
|
1701
|
+
console.log('');
|
|
1702
|
+
console.log('The trail CLI provides trajectory tracking for agent work:');
|
|
1703
|
+
console.log(' trail start "<task>" Start tracking a new trajectory');
|
|
1704
|
+
console.log(' trail status Show current trajectory status');
|
|
1705
|
+
console.log(' trail phase <phase> Transition to PDERO phase');
|
|
1706
|
+
console.log(' trail decision "<choice>" Record a decision');
|
|
1707
|
+
console.log(' trail complete Complete the trajectory');
|
|
1708
|
+
console.log(' trail list List all trajectories');
|
|
1709
|
+
console.log('');
|
|
1710
|
+
console.log('PDERO phases: plan, design, execute, review, observe');
|
|
1711
|
+
process.exit(1);
|
|
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);
|
|
1717
|
+
// Spawn trail with the provided arguments
|
|
1718
|
+
const trailProc = spawn('trail', args, {
|
|
1719
|
+
cwd: paths.projectRoot,
|
|
1720
|
+
stdio: 'inherit',
|
|
1721
|
+
env: {
|
|
1722
|
+
...process.env,
|
|
1723
|
+
TRAJECTORIES_PROJECT: paths.projectId,
|
|
1724
|
+
TRAJECTORIES_DATA_DIR: trajectoriesDir,
|
|
1725
|
+
},
|
|
1726
|
+
});
|
|
1727
|
+
trailProc.on('close', (code) => {
|
|
1728
|
+
process.exit(code ?? 0);
|
|
1729
|
+
});
|
|
1730
|
+
trailProc.on('error', (err) => {
|
|
1731
|
+
console.error(`Failed to run trail: ${err.message}`);
|
|
1732
|
+
process.exit(1);
|
|
1733
|
+
});
|
|
1734
|
+
});
|
|
1653
1735
|
cloudCommand
|
|
1654
1736
|
.command('agents')
|
|
1655
1737
|
.description('List agents across all linked machines')
|
|
@@ -1795,7 +1877,7 @@ cloudCommand
|
|
|
1795
1877
|
.command('daemons')
|
|
1796
1878
|
.description('List all linked daemon instances')
|
|
1797
1879
|
.option('--json', 'Output as JSON')
|
|
1798
|
-
.action(async (
|
|
1880
|
+
.action(async (_options) => {
|
|
1799
1881
|
const os = await import('node:os');
|
|
1800
1882
|
const dataDir = process.env.AGENT_RELAY_DATA_DIR ||
|
|
1801
1883
|
path.join(os.homedir(), '.local', 'share', 'agent-relay');
|
|
@@ -1824,5 +1906,536 @@ cloudCommand
|
|
|
1824
1906
|
process.exit(1);
|
|
1825
1907
|
}
|
|
1826
1908
|
});
|
|
1909
|
+
// ============================================================================
|
|
1910
|
+
// Monitoring commands (metrics, health, profiler)
|
|
1911
|
+
// ============================================================================
|
|
1912
|
+
// metrics - Show agent memory metrics
|
|
1913
|
+
program
|
|
1914
|
+
.command('metrics')
|
|
1915
|
+
.description('Show agent memory metrics and resource usage')
|
|
1916
|
+
.option('--agent <name>', 'Show metrics for specific agent')
|
|
1917
|
+
.option('--port <port>', 'Dashboard port', DEFAULT_DASHBOARD_PORT)
|
|
1918
|
+
.option('--json', 'Output as JSON')
|
|
1919
|
+
.option('--watch', 'Continuously update metrics')
|
|
1920
|
+
.option('--interval <ms>', 'Update interval for watch mode', '5000')
|
|
1921
|
+
.action(async (options) => {
|
|
1922
|
+
const port = options.port || DEFAULT_DASHBOARD_PORT;
|
|
1923
|
+
const fetchMetrics = async () => {
|
|
1924
|
+
try {
|
|
1925
|
+
const response = await fetch(`http://localhost:${port}/api/metrics/agents`);
|
|
1926
|
+
if (!response.ok) {
|
|
1927
|
+
throw new Error(`HTTP ${response.status}`);
|
|
1928
|
+
}
|
|
1929
|
+
return await response.json();
|
|
1930
|
+
}
|
|
1931
|
+
catch (err) {
|
|
1932
|
+
if (err.code === 'ECONNREFUSED') {
|
|
1933
|
+
console.error(`Cannot connect to dashboard at port ${port}. Is the daemon running?`);
|
|
1934
|
+
console.log(`Run 'agent-relay up' to start the daemon.`);
|
|
1935
|
+
}
|
|
1936
|
+
else {
|
|
1937
|
+
console.error(`Failed to fetch metrics: ${err.message}`);
|
|
1938
|
+
}
|
|
1939
|
+
process.exit(1);
|
|
1940
|
+
}
|
|
1941
|
+
};
|
|
1942
|
+
const formatBytes = (bytes) => {
|
|
1943
|
+
if (bytes === 0)
|
|
1944
|
+
return '0 B';
|
|
1945
|
+
const k = 1024;
|
|
1946
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
1947
|
+
const i = Math.floor(Math.log(Math.abs(bytes)) / Math.log(k));
|
|
1948
|
+
return `${(bytes / Math.pow(k, i)).toFixed(1)} ${sizes[i]}`;
|
|
1949
|
+
};
|
|
1950
|
+
const formatUptime = (ms) => {
|
|
1951
|
+
if (ms < 60000)
|
|
1952
|
+
return `${Math.floor(ms / 1000)}s`;
|
|
1953
|
+
if (ms < 3600000)
|
|
1954
|
+
return `${Math.floor(ms / 60000)}m`;
|
|
1955
|
+
return `${Math.floor(ms / 3600000)}h ${Math.floor((ms % 3600000) / 60000)}m`;
|
|
1956
|
+
};
|
|
1957
|
+
const displayMetrics = (data) => {
|
|
1958
|
+
let agents = data.agents;
|
|
1959
|
+
if (options.agent) {
|
|
1960
|
+
agents = agents.filter(a => a.name === options.agent);
|
|
1961
|
+
if (agents.length === 0) {
|
|
1962
|
+
console.error(`Agent "${options.agent}" not found`);
|
|
1963
|
+
return;
|
|
1964
|
+
}
|
|
1965
|
+
}
|
|
1966
|
+
if (options.json) {
|
|
1967
|
+
console.log(JSON.stringify({ agents, system: data.system }, null, 2));
|
|
1968
|
+
return;
|
|
1969
|
+
}
|
|
1970
|
+
if (options.watch) {
|
|
1971
|
+
// Clear screen for watch mode
|
|
1972
|
+
console.clear();
|
|
1973
|
+
console.log(`Agent Metrics (updating every ${options.interval}ms) [Ctrl+C to stop]`);
|
|
1974
|
+
console.log(`System: ${formatBytes(data.system.heapUsed)} heap / ${formatBytes(data.system.freeMemory)} free`);
|
|
1975
|
+
console.log('');
|
|
1976
|
+
}
|
|
1977
|
+
if (agents.length === 0) {
|
|
1978
|
+
console.log('No agents with memory metrics.');
|
|
1979
|
+
console.log('Ensure agents are running and memory monitoring is enabled.');
|
|
1980
|
+
return;
|
|
1981
|
+
}
|
|
1982
|
+
console.log('AGENT PID MEMORY CPU TREND ALERT UPTIME');
|
|
1983
|
+
console.log('─'.repeat(75));
|
|
1984
|
+
for (const agent of agents) {
|
|
1985
|
+
const name = agent.name.padEnd(15);
|
|
1986
|
+
const pid = (agent.pid?.toString() || '-').padEnd(8);
|
|
1987
|
+
const memory = formatBytes(agent.rssBytes || 0).padEnd(11);
|
|
1988
|
+
const cpu = ((agent.cpuPercent?.toFixed(1) || '0') + '%').padEnd(6);
|
|
1989
|
+
const trend = (agent.trend || 'unknown').padEnd(11);
|
|
1990
|
+
const alertColors = {
|
|
1991
|
+
normal: 'normal',
|
|
1992
|
+
warning: '\x1b[33mwarning\x1b[0m',
|
|
1993
|
+
critical: '\x1b[31mcritical\x1b[0m',
|
|
1994
|
+
oom_imminent: '\x1b[31;1mOOM!\x1b[0m',
|
|
1995
|
+
};
|
|
1996
|
+
const alert = (alertColors[agent.alertLevel || 'normal'] || agent.alertLevel || '-').padEnd(9);
|
|
1997
|
+
const uptime = formatUptime(agent.uptimeMs || 0);
|
|
1998
|
+
console.log(`${name} ${pid} ${memory} ${cpu} ${trend} ${alert} ${uptime}`);
|
|
1999
|
+
}
|
|
2000
|
+
if (!options.watch) {
|
|
2001
|
+
console.log('');
|
|
2002
|
+
console.log(`Total: ${agents.length} agent(s)`);
|
|
2003
|
+
if (agents.some(a => a.alertLevel && a.alertLevel !== 'normal')) {
|
|
2004
|
+
console.log('');
|
|
2005
|
+
console.log('⚠️ Some agents have elevated memory usage. Run `agent-relay health` for details.');
|
|
2006
|
+
}
|
|
2007
|
+
}
|
|
2008
|
+
};
|
|
2009
|
+
if (options.watch) {
|
|
2010
|
+
const interval = parseInt(options.interval || '5000', 10);
|
|
2011
|
+
const update = async () => {
|
|
2012
|
+
try {
|
|
2013
|
+
const data = await fetchMetrics();
|
|
2014
|
+
displayMetrics(data);
|
|
2015
|
+
}
|
|
2016
|
+
catch {
|
|
2017
|
+
// Error already logged in fetchMetrics
|
|
2018
|
+
}
|
|
2019
|
+
};
|
|
2020
|
+
process.on('SIGINT', () => {
|
|
2021
|
+
console.log('\nStopped watching metrics.');
|
|
2022
|
+
process.exit(0);
|
|
2023
|
+
});
|
|
2024
|
+
await update();
|
|
2025
|
+
setInterval(update, interval);
|
|
2026
|
+
}
|
|
2027
|
+
else {
|
|
2028
|
+
const data = await fetchMetrics();
|
|
2029
|
+
displayMetrics(data);
|
|
2030
|
+
}
|
|
2031
|
+
});
|
|
2032
|
+
// health - Show crash insights and system health
|
|
2033
|
+
program
|
|
2034
|
+
.command('health')
|
|
2035
|
+
.description('Show system health, crash insights, and recommendations')
|
|
2036
|
+
.option('--port <port>', 'Dashboard port', DEFAULT_DASHBOARD_PORT)
|
|
2037
|
+
.option('--json', 'Output as JSON')
|
|
2038
|
+
.option('--crashes', 'Show recent crash history')
|
|
2039
|
+
.option('--alerts', 'Show unacknowledged alerts')
|
|
2040
|
+
.action(async (options) => {
|
|
2041
|
+
const port = options.port || DEFAULT_DASHBOARD_PORT;
|
|
2042
|
+
try {
|
|
2043
|
+
const response = await fetch(`http://localhost:${port}/api/metrics/health`);
|
|
2044
|
+
if (!response.ok) {
|
|
2045
|
+
throw new Error(`HTTP ${response.status}`);
|
|
2046
|
+
}
|
|
2047
|
+
const data = await response.json();
|
|
2048
|
+
if (options.json) {
|
|
2049
|
+
console.log(JSON.stringify(data, null, 2));
|
|
2050
|
+
return;
|
|
2051
|
+
}
|
|
2052
|
+
// Health score with color
|
|
2053
|
+
const scoreColor = data.healthScore >= 80 ? '\x1b[32m' : // Green
|
|
2054
|
+
data.healthScore >= 50 ? '\x1b[33m' : // Yellow
|
|
2055
|
+
'\x1b[31m'; // Red
|
|
2056
|
+
const resetColor = '\x1b[0m';
|
|
2057
|
+
console.log('');
|
|
2058
|
+
console.log('═══════════════════════════════════════════════════════════════');
|
|
2059
|
+
console.log(` SYSTEM HEALTH: ${scoreColor}${data.healthScore}/100${resetColor}`);
|
|
2060
|
+
console.log('═══════════════════════════════════════════════════════════════');
|
|
2061
|
+
console.log('');
|
|
2062
|
+
console.log(` ${data.summary}`);
|
|
2063
|
+
console.log('');
|
|
2064
|
+
// Show stats
|
|
2065
|
+
console.log(` Agents: ${data.stats.agentCount}`);
|
|
2066
|
+
console.log(` Crashes (24h): ${data.stats.totalCrashes24h}`);
|
|
2067
|
+
console.log(` Alerts (24h): ${data.stats.totalAlerts24h}`);
|
|
2068
|
+
console.log('');
|
|
2069
|
+
// Show issues
|
|
2070
|
+
if (data.issues.length > 0) {
|
|
2071
|
+
console.log(' ISSUES:');
|
|
2072
|
+
for (const issue of data.issues) {
|
|
2073
|
+
const icon = issue.severity === 'critical' ? '🔴' :
|
|
2074
|
+
issue.severity === 'high' ? '🟠' :
|
|
2075
|
+
issue.severity === 'medium' ? '🟡' : '🔵';
|
|
2076
|
+
console.log(` ${icon} ${issue.message}`);
|
|
2077
|
+
}
|
|
2078
|
+
console.log('');
|
|
2079
|
+
}
|
|
2080
|
+
// Show recommendations
|
|
2081
|
+
if (data.recommendations.length > 0) {
|
|
2082
|
+
console.log(' RECOMMENDATIONS:');
|
|
2083
|
+
for (const rec of data.recommendations) {
|
|
2084
|
+
console.log(` → ${rec}`);
|
|
2085
|
+
}
|
|
2086
|
+
console.log('');
|
|
2087
|
+
}
|
|
2088
|
+
// Show crashes if requested
|
|
2089
|
+
if (options.crashes && data.crashes.length > 0) {
|
|
2090
|
+
console.log(' RECENT CRASHES:');
|
|
2091
|
+
console.log(' ─────────────────────────────────────────────────────────────');
|
|
2092
|
+
for (const crash of data.crashes.slice(0, 10)) {
|
|
2093
|
+
const time = new Date(crash.crashedAt).toLocaleString();
|
|
2094
|
+
console.log(` ${crash.agentName} - ${time}`);
|
|
2095
|
+
console.log(` Cause: ${crash.likelyCause} | ${crash.summary.slice(0, 60)}...`);
|
|
2096
|
+
}
|
|
2097
|
+
console.log('');
|
|
2098
|
+
}
|
|
2099
|
+
// Show alerts if requested
|
|
2100
|
+
if (options.alerts && data.alerts.length > 0) {
|
|
2101
|
+
console.log(' UNACKNOWLEDGED ALERTS:');
|
|
2102
|
+
console.log(' ─────────────────────────────────────────────────────────────');
|
|
2103
|
+
for (const alert of data.alerts.slice(0, 10)) {
|
|
2104
|
+
const _time = new Date(alert.createdAt).toLocaleString();
|
|
2105
|
+
const icon = alert.alertType === 'oom_imminent' ? '🔴' :
|
|
2106
|
+
alert.alertType === 'critical' ? '🟠' : '🟡';
|
|
2107
|
+
console.log(` ${icon} ${alert.agentName} - ${alert.alertType}`);
|
|
2108
|
+
console.log(` ${alert.message}`);
|
|
2109
|
+
}
|
|
2110
|
+
console.log('');
|
|
2111
|
+
}
|
|
2112
|
+
console.log('═══════════════════════════════════════════════════════════════');
|
|
2113
|
+
console.log('');
|
|
2114
|
+
if (!options.crashes && data.stats.totalCrashes24h > 0) {
|
|
2115
|
+
console.log(' Tip: Run `agent-relay health --crashes` to see crash details');
|
|
2116
|
+
}
|
|
2117
|
+
if (!options.alerts && data.stats.totalAlerts24h > 0) {
|
|
2118
|
+
console.log(' Tip: Run `agent-relay health --alerts` to see alerts');
|
|
2119
|
+
}
|
|
2120
|
+
console.log('');
|
|
2121
|
+
}
|
|
2122
|
+
catch (err) {
|
|
2123
|
+
if (err.code === 'ECONNREFUSED') {
|
|
2124
|
+
console.error(`Cannot connect to dashboard at port ${port}. Is the daemon running?`);
|
|
2125
|
+
console.log(`Run 'agent-relay up' to start the daemon.`);
|
|
2126
|
+
}
|
|
2127
|
+
else {
|
|
2128
|
+
console.error(`Failed to fetch health data: ${err.message}`);
|
|
2129
|
+
}
|
|
2130
|
+
process.exit(1);
|
|
2131
|
+
}
|
|
2132
|
+
});
|
|
2133
|
+
// profile - Run agent with profiling enabled
|
|
2134
|
+
program
|
|
2135
|
+
.command('profile')
|
|
2136
|
+
.description('Run an agent with memory profiling enabled')
|
|
2137
|
+
.argument('<command...>', 'Command to profile')
|
|
2138
|
+
.option('-n, --name <name>', 'Agent name')
|
|
2139
|
+
.option('--heap-snapshot-interval <ms>', 'Take heap snapshots at interval (ms)', '60000')
|
|
2140
|
+
.option('--output-dir <dir>', 'Directory for profile output', './profiles')
|
|
2141
|
+
.option('--expose-gc', 'Expose garbage collector for manual GC')
|
|
2142
|
+
.action(async (commandParts, options) => {
|
|
2143
|
+
const { getProjectPaths } = await import('../utils/project-namespace.js');
|
|
2144
|
+
if (!commandParts || commandParts.length === 0) {
|
|
2145
|
+
console.error('No command specified');
|
|
2146
|
+
process.exit(1);
|
|
2147
|
+
}
|
|
2148
|
+
const [cmd, ...args] = commandParts;
|
|
2149
|
+
const agentName = options.name ?? generateAgentName();
|
|
2150
|
+
const outputDir = options.outputDir || './profiles';
|
|
2151
|
+
const snapshotInterval = parseInt(options.heapSnapshotInterval || '60000', 10);
|
|
2152
|
+
// Create output directory
|
|
2153
|
+
if (!fs.existsSync(outputDir)) {
|
|
2154
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
2155
|
+
}
|
|
2156
|
+
console.log('');
|
|
2157
|
+
console.log('🔬 Agent Relay Profiler');
|
|
2158
|
+
console.log('');
|
|
2159
|
+
console.log(` Agent: ${agentName}`);
|
|
2160
|
+
console.log(` Command: ${cmd} ${args.join(' ')}`);
|
|
2161
|
+
console.log(` Output: ${outputDir}`);
|
|
2162
|
+
console.log(` Heap snapshots: every ${snapshotInterval}ms`);
|
|
2163
|
+
console.log('');
|
|
2164
|
+
// Build Node.js flags for profiling
|
|
2165
|
+
const nodeFlags = [
|
|
2166
|
+
'--inspect', // Enable inspector
|
|
2167
|
+
'--inspect-brk=0', // Don't actually break, just enable
|
|
2168
|
+
];
|
|
2169
|
+
if (options.exposeGc) {
|
|
2170
|
+
nodeFlags.push('--expose-gc');
|
|
2171
|
+
}
|
|
2172
|
+
// Set environment variables for profiling
|
|
2173
|
+
const profileEnv = {
|
|
2174
|
+
...process.env,
|
|
2175
|
+
NODE_OPTIONS: `${process.env.NODE_OPTIONS || ''} ${nodeFlags.join(' ')}`.trim(),
|
|
2176
|
+
AGENT_RELAY_PROFILE_ENABLED: '1',
|
|
2177
|
+
AGENT_RELAY_PROFILE_OUTPUT: outputDir,
|
|
2178
|
+
AGENT_RELAY_PROFILE_INTERVAL: snapshotInterval.toString(),
|
|
2179
|
+
};
|
|
2180
|
+
console.log('Starting profiled agent...');
|
|
2181
|
+
console.log('');
|
|
2182
|
+
// Use the regular wrapper but with profiling environment
|
|
2183
|
+
const paths = getProjectPaths();
|
|
2184
|
+
const { TmuxWrapper } = await import('../wrapper/tmux-wrapper.js');
|
|
2185
|
+
const wrapper = new TmuxWrapper({
|
|
2186
|
+
name: agentName,
|
|
2187
|
+
command: cmd,
|
|
2188
|
+
args,
|
|
2189
|
+
socketPath: paths.socketPath,
|
|
2190
|
+
debug: true,
|
|
2191
|
+
env: profileEnv,
|
|
2192
|
+
useInbox: true,
|
|
2193
|
+
inboxDir: paths.dataDir,
|
|
2194
|
+
});
|
|
2195
|
+
// Start memory sampling
|
|
2196
|
+
const sampleInterval = setInterval(() => {
|
|
2197
|
+
const memUsage = process.memoryUsage();
|
|
2198
|
+
const timestamp = new Date().toISOString();
|
|
2199
|
+
const sample = {
|
|
2200
|
+
timestamp,
|
|
2201
|
+
heapUsed: memUsage.heapUsed,
|
|
2202
|
+
heapTotal: memUsage.heapTotal,
|
|
2203
|
+
external: memUsage.external,
|
|
2204
|
+
rss: memUsage.rss,
|
|
2205
|
+
};
|
|
2206
|
+
// Append to samples file
|
|
2207
|
+
const samplesFile = path.join(outputDir, `${agentName}-memory.jsonl`);
|
|
2208
|
+
fs.appendFileSync(samplesFile, JSON.stringify(sample) + '\n');
|
|
2209
|
+
}, 5000);
|
|
2210
|
+
process.on('SIGINT', async () => {
|
|
2211
|
+
clearInterval(sampleInterval);
|
|
2212
|
+
console.log('\n');
|
|
2213
|
+
console.log('Profiling stopped.');
|
|
2214
|
+
console.log('');
|
|
2215
|
+
console.log(`Profile data saved to: ${outputDir}/`);
|
|
2216
|
+
console.log(` - ${agentName}-memory.jsonl (memory samples)`);
|
|
2217
|
+
console.log('');
|
|
2218
|
+
console.log('To analyze:');
|
|
2219
|
+
console.log(` 1. Open chrome://inspect in Chrome`);
|
|
2220
|
+
console.log(` 2. Load CPU/heap profiles from ${outputDir}/`);
|
|
2221
|
+
console.log('');
|
|
2222
|
+
wrapper.stop();
|
|
2223
|
+
process.exit(0);
|
|
2224
|
+
});
|
|
2225
|
+
await wrapper.start();
|
|
2226
|
+
console.log(`Profiling ${agentName}... Press Ctrl+C to stop.`);
|
|
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
|
+
});
|
|
1827
2440
|
program.parse();
|
|
1828
2441
|
//# sourceMappingURL=index.js.map
|