agent-relay 1.2.0 → 1.3.0
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/agent-relay-322-324.md +17 -0
- package/.trajectories/completed/2026-01/traj_03zupyv1s7b9.json +49 -0
- package/.trajectories/completed/2026-01/traj_03zupyv1s7b9.md +31 -0
- package/.trajectories/completed/2026-01/traj_0zacdjl1g4ht.json +125 -0
- package/.trajectories/completed/2026-01/traj_0zacdjl1g4ht.md +62 -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_33iuy72sezbk.json +49 -0
- package/.trajectories/completed/2026-01/traj_33iuy72sezbk.md +31 -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_5ammh5qtvklq.json +77 -0
- package/.trajectories/completed/2026-01/traj_5ammh5qtvklq.md +42 -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_6mieijqyvaag.json +77 -0
- package/.trajectories/completed/2026-01/traj_6mieijqyvaag.md +42 -0
- package/.trajectories/completed/2026-01/traj_78ffm31jn3uk.json +77 -0
- package/.trajectories/completed/2026-01/traj_78ffm31jn3uk.md +42 -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_94gnp3k30goq.json +66 -0
- package/.trajectories/completed/2026-01/traj_94gnp3k30goq.md +36 -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_avqeghu6pz5a.json +40 -0
- package/.trajectories/completed/2026-01/traj_avqeghu6pz5a.md +22 -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_dcsp9s8y01ra.json +121 -0
- package/.trajectories/completed/2026-01/traj_dcsp9s8y01ra.md +29 -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_fhx9irlckht6.json +53 -0
- package/.trajectories/completed/2026-01/traj_fhx9irlckht6.md +32 -0
- package/.trajectories/completed/2026-01/traj_fqduidx3xbtp.json +101 -0
- package/.trajectories/completed/2026-01/traj_fqduidx3xbtp.md +52 -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_hf81ey93uz6t.json +49 -0
- package/.trajectories/completed/2026-01/traj_hf81ey93uz6t.md +31 -0
- package/.trajectories/completed/2026-01/traj_hfmki2jr9d4r.json +65 -0
- package/.trajectories/completed/2026-01/traj_hfmki2jr9d4r.md +37 -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_lq450ly148uw.json +49 -0
- package/.trajectories/completed/2026-01/traj_lq450ly148uw.md +31 -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_multi_server_arch.md +101 -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_psd9ob0j2ru3.json +27 -0
- package/.trajectories/completed/2026-01/traj_psd9ob0j2ru3.md +14 -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_ub8csuv3lcv4.json +53 -0
- package/.trajectories/completed/2026-01/traj_ub8csuv3lcv4.md +32 -0
- package/.trajectories/completed/2026-01/traj_uc29tlso8i9s.json +186 -0
- package/.trajectories/completed/2026-01/traj_uc29tlso8i9s.md +86 -0
- package/.trajectories/completed/2026-01/traj_ui9b4tqxoa7j.json +77 -0
- package/.trajectories/completed/2026-01/traj_ui9b4tqxoa7j.md +42 -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_v9dkdoxylyid.json +89 -0
- package/.trajectories/completed/2026-01/traj_v9dkdoxylyid.md +47 -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_xy9vifpqet80.json +65 -0
- package/.trajectories/completed/2026-01/traj_xy9vifpqet80.md +37 -0
- package/.trajectories/completed/2026-01/traj_y7aiwijyfmmv.json +49 -0
- package/.trajectories/completed/2026-01/traj_y7aiwijyfmmv.md +31 -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/consolidate-settings-panel.md +24 -0
- package/.trajectories/gh-cli-user-token.md +26 -0
- package/.trajectories/index.json +468 -0
- package/ARCHITECTURE.md +1245 -0
- package/TESTING.md +278 -0
- package/deploy/init-db.sql +5 -0
- package/deploy/scripts/setup-fly-workspaces.sh +69 -0
- package/deploy/scripts/setup-railway.sh +75 -0
- package/deploy/workspace/codex.config.toml +15 -0
- package/deploy/workspace/entrypoint-browser.sh +118 -0
- package/deploy/workspace/entrypoint.sh +508 -0
- package/deploy/workspace/git-credential-relay +126 -0
- package/dist/bridge/spawner.d.ts +7 -0
- package/dist/bridge/spawner.js +40 -9
- package/dist/bridge/types.d.ts +2 -0
- package/dist/cli/index.js +260 -1
- package/dist/cloud/api/admin.d.ts +8 -0
- package/dist/cloud/api/admin.js +212 -0
- package/dist/cloud/api/auth.js +8 -0
- package/dist/cloud/api/billing.d.ts +0 -10
- package/dist/cloud/api/billing.js +278 -67
- package/dist/cloud/api/codex-auth-helper.d.ts +21 -0
- package/dist/cloud/api/codex-auth-helper.js +307 -0
- package/dist/cloud/api/coordinators.js +402 -0
- package/dist/cloud/api/daemons.js +15 -11
- package/dist/cloud/api/git.js +127 -19
- package/dist/cloud/api/github-app.js +42 -8
- package/dist/cloud/api/nango-auth.js +297 -16
- package/dist/cloud/api/onboarding.js +112 -35
- package/dist/cloud/api/providers.js +12 -16
- package/dist/cloud/api/repos.d.ts +1 -0
- package/dist/cloud/api/repos.js +311 -49
- package/dist/cloud/api/test-helpers.js +40 -0
- package/dist/cloud/api/usage.js +13 -0
- package/dist/cloud/api/webhooks.d.ts +1 -0
- package/dist/cloud/api/webhooks.js +149 -0
- package/dist/cloud/api/workspaces.d.ts +18 -0
- package/dist/cloud/api/workspaces.js +1042 -21
- package/dist/cloud/billing/plans.js +19 -19
- package/dist/cloud/config.d.ts +8 -0
- package/dist/cloud/config.js +15 -0
- package/dist/cloud/db/drizzle.d.ts +5 -2
- package/dist/cloud/db/drizzle.js +27 -20
- package/dist/cloud/db/schema.d.ts +19 -51
- package/dist/cloud/db/schema.js +5 -4
- package/dist/cloud/index.d.ts +0 -1
- package/dist/cloud/index.js +0 -1
- package/dist/cloud/provisioner/index.d.ts +125 -1
- package/dist/cloud/provisioner/index.js +939 -53
- package/dist/cloud/server.js +161 -16
- package/dist/cloud/services/compute-enforcement.d.ts +57 -0
- package/dist/cloud/services/compute-enforcement.js +175 -0
- package/dist/cloud/services/index.d.ts +2 -0
- package/dist/cloud/services/index.js +4 -0
- package/dist/cloud/services/intro-expiration.d.ts +55 -0
- package/dist/cloud/services/intro-expiration.js +211 -0
- package/dist/cloud/services/nango.d.ts +74 -0
- package/dist/cloud/services/nango.js +218 -5
- package/dist/cloud/services/planLimits.d.ts +22 -0
- package/dist/cloud/services/planLimits.js +58 -5
- package/dist/cloud/services/ssh-security.d.ts +31 -0
- package/dist/cloud/services/ssh-security.js +63 -0
- package/dist/continuity/manager.d.ts +5 -0
- package/dist/continuity/manager.js +56 -2
- package/dist/daemon/api.d.ts +2 -0
- package/dist/daemon/api.js +214 -5
- package/dist/daemon/cli-auth.d.ts +13 -1
- package/dist/daemon/cli-auth.js +166 -47
- package/dist/daemon/connection.d.ts +7 -1
- package/dist/daemon/connection.js +15 -0
- package/dist/daemon/orchestrator.d.ts +2 -0
- package/dist/daemon/orchestrator.js +26 -0
- package/dist/daemon/repo-manager.d.ts +116 -0
- package/dist/daemon/repo-manager.js +384 -0
- package/dist/daemon/router.d.ts +60 -1
- package/dist/daemon/router.js +281 -20
- package/dist/daemon/user-directory.d.ts +111 -0
- package/dist/daemon/user-directory.js +233 -0
- package/dist/dashboard/out/404.html +1 -1
- package/dist/dashboard/out/_next/static/T1tgCqVWHFIkV7ClEtzD7/_ssgManifest.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/532-bace199897eeab37.js +9 -0
- package/dist/dashboard/out/_next/static/chunks/766-b54f0853794b78c3.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/83-b51836037078006c.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/891-6cd50de1224f70bb.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/899-bb19a9b3d9b39ea6.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/app/onboarding/page-8939b0fc700f7eca.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/app/page-5af1b6b439858aa6.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/metrics/page-ac39dc0cc3c26fa7.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/{page-daf87e86f783f980.js → page-4a5938c18a11a654.js} +1 -1
- package/dist/dashboard/out/_next/static/chunks/app/providers/page-ac3a6ac433fd6001.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/providers/setup/[provider]/page-09f9caae98a18c09.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/{main-97850e03d723ea8c.js → main-2ee6beb2ae96d210.js} +1 -1
- package/dist/dashboard/out/_next/static/css/85d2af9c7ac74d62.css +1 -0
- package/dist/dashboard/out/_next/static/css/fe4b28883eeff359.css +1 -0
- package/dist/dashboard/out/app/onboarding.html +1 -0
- package/dist/dashboard/out/app/onboarding.txt +7 -0
- package/dist/dashboard/out/app.html +1 -1
- package/dist/dashboard/out/app.txt +3 -3
- package/dist/dashboard/out/apple-icon.png +0 -0
- package/dist/dashboard/out/connect-repos.html +1 -1
- package/dist/dashboard/out/connect-repos.txt +3 -3
- package/dist/dashboard/out/history.html +1 -1
- package/dist/dashboard/out/history.txt +3 -3
- package/dist/dashboard/out/index.html +1 -1
- package/dist/dashboard/out/index.txt +3 -3
- package/dist/dashboard/out/login.html +2 -2
- package/dist/dashboard/out/login.txt +3 -3
- package/dist/dashboard/out/metrics.html +1 -1
- package/dist/dashboard/out/metrics.txt +3 -3
- package/dist/dashboard/out/pricing.html +3 -3
- package/dist/dashboard/out/pricing.txt +3 -3
- package/dist/dashboard/out/providers/setup/claude.html +1 -0
- package/dist/dashboard/out/providers/setup/claude.txt +8 -0
- package/dist/dashboard/out/providers/setup/codex.html +1 -0
- package/dist/dashboard/out/providers/setup/codex.txt +8 -0
- package/dist/dashboard/out/providers.html +1 -1
- package/dist/dashboard/out/providers.txt +3 -3
- package/dist/dashboard/out/signup.html +2 -2
- package/dist/dashboard/out/signup.txt +3 -3
- package/dist/dashboard-server/server.js +316 -12
- package/dist/dashboard-server/user-bridge.d.ts +103 -0
- package/dist/dashboard-server/user-bridge.js +189 -0
- package/dist/protocol/channels.d.ts +205 -0
- package/dist/protocol/channels.js +154 -0
- package/dist/protocol/types.d.ts +13 -1
- package/dist/resiliency/provider-context.js +2 -0
- package/dist/shared/cli-auth-config.d.ts +19 -0
- package/dist/shared/cli-auth-config.js +58 -2
- package/dist/utils/agent-config.js +1 -1
- package/dist/wrapper/auth-detection.d.ts +49 -0
- package/dist/wrapper/auth-detection.js +192 -0
- package/dist/wrapper/base-wrapper.d.ts +153 -0
- package/dist/wrapper/base-wrapper.js +393 -0
- package/dist/wrapper/client.d.ts +7 -1
- package/dist/wrapper/client.js +3 -0
- package/dist/wrapper/index.d.ts +1 -0
- package/dist/wrapper/index.js +4 -3
- package/dist/wrapper/pty-wrapper.d.ts +62 -84
- package/dist/wrapper/pty-wrapper.js +154 -180
- package/dist/wrapper/tmux-wrapper.d.ts +41 -66
- package/dist/wrapper/tmux-wrapper.js +90 -134
- package/package.json +5 -12
- package/scripts/postinstall.js +11 -155
- package/scripts/test-interactive-terminal.sh +248 -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/cli-pty-runner.d.ts.map +0 -1
- package/dist/cloud/api/cli-pty-runner.js.map +0 -1
- package/dist/cloud/api/coordinators.d.ts.map +0 -1
- package/dist/cloud/api/coordinators.js.map +0 -1
- package/dist/cloud/api/daemons.d.ts.map +0 -1
- package/dist/cloud/api/daemons.js.map +0 -1
- package/dist/cloud/api/generic-webhooks.d.ts.map +0 -1
- package/dist/cloud/api/generic-webhooks.js.map +0 -1
- package/dist/cloud/api/git.d.ts.map +0 -1
- package/dist/cloud/api/git.js.map +0 -1
- package/dist/cloud/api/github-app.d.ts.map +0 -1
- package/dist/cloud/api/github-app.js.map +0 -1
- package/dist/cloud/api/middleware/planLimits.d.ts.map +0 -1
- package/dist/cloud/api/middleware/planLimits.js.map +0 -1
- package/dist/cloud/api/monitoring.d.ts.map +0 -1
- package/dist/cloud/api/monitoring.js.map +0 -1
- package/dist/cloud/api/nango-auth.d.ts.map +0 -1
- package/dist/cloud/api/nango-auth.js.map +0 -1
- package/dist/cloud/api/onboarding.d.ts.map +0 -1
- package/dist/cloud/api/onboarding.js.map +0 -1
- package/dist/cloud/api/policy.d.ts.map +0 -1
- package/dist/cloud/api/policy.js.map +0 -1
- package/dist/cloud/api/providers.d.ts.map +0 -1
- package/dist/cloud/api/providers.js.map +0 -1
- package/dist/cloud/api/repos.d.ts.map +0 -1
- package/dist/cloud/api/repos.js.map +0 -1
- package/dist/cloud/api/teams.d.ts.map +0 -1
- package/dist/cloud/api/teams.js.map +0 -1
- package/dist/cloud/api/test-helpers.d.ts.map +0 -1
- package/dist/cloud/api/test-helpers.js.map +0 -1
- package/dist/cloud/api/usage.d.ts.map +0 -1
- package/dist/cloud/api/usage.js.map +0 -1
- package/dist/cloud/api/webhooks.d.ts.map +0 -1
- package/dist/cloud/api/webhooks.js.map +0 -1
- package/dist/cloud/api/workspaces.d.ts.map +0 -1
- package/dist/cloud/api/workspaces.js.map +0 -1
- package/dist/cloud/billing/index.d.ts.map +0 -1
- package/dist/cloud/billing/index.js.map +0 -1
- package/dist/cloud/billing/plans.d.ts.map +0 -1
- package/dist/cloud/billing/plans.js.map +0 -1
- package/dist/cloud/billing/service.d.ts.map +0 -1
- package/dist/cloud/billing/service.js.map +0 -1
- package/dist/cloud/billing/types.d.ts.map +0 -1
- package/dist/cloud/billing/types.js.map +0 -1
- package/dist/cloud/config.d.ts.map +0 -1
- package/dist/cloud/config.js.map +0 -1
- package/dist/cloud/db/drizzle.d.ts.map +0 -1
- package/dist/cloud/db/drizzle.js.map +0 -1
- package/dist/cloud/db/index.d.ts.map +0 -1
- package/dist/cloud/db/index.js.map +0 -1
- package/dist/cloud/db/schema.d.ts.map +0 -1
- package/dist/cloud/db/schema.js.map +0 -1
- package/dist/cloud/index.d.ts.map +0 -1
- package/dist/cloud/index.js.map +0 -1
- package/dist/cloud/provisioner/index.d.ts.map +0 -1
- package/dist/cloud/provisioner/index.js.map +0 -1
- package/dist/cloud/server.d.ts.map +0 -1
- package/dist/cloud/server.js.map +0 -1
- package/dist/cloud/services/auto-scaler.d.ts.map +0 -1
- package/dist/cloud/services/auto-scaler.js.map +0 -1
- package/dist/cloud/services/capacity-manager.d.ts.map +0 -1
- package/dist/cloud/services/capacity-manager.js.map +0 -1
- package/dist/cloud/services/ci-agent-spawner.d.ts.map +0 -1
- package/dist/cloud/services/ci-agent-spawner.js.map +0 -1
- package/dist/cloud/services/coordinator.d.ts.map +0 -1
- package/dist/cloud/services/coordinator.js.map +0 -1
- package/dist/cloud/services/index.d.ts.map +0 -1
- package/dist/cloud/services/index.js.map +0 -1
- package/dist/cloud/services/mention-handler.d.ts.map +0 -1
- package/dist/cloud/services/mention-handler.js.map +0 -1
- package/dist/cloud/services/nango.d.ts.map +0 -1
- package/dist/cloud/services/nango.js.map +0 -1
- package/dist/cloud/services/persistence.d.ts.map +0 -1
- package/dist/cloud/services/persistence.js.map +0 -1
- package/dist/cloud/services/planLimits.d.ts.map +0 -1
- package/dist/cloud/services/planLimits.js.map +0 -1
- package/dist/cloud/services/scaling-orchestrator.d.ts.map +0 -1
- package/dist/cloud/services/scaling-orchestrator.js.map +0 -1
- package/dist/cloud/services/scaling-policy.d.ts.map +0 -1
- package/dist/cloud/services/scaling-policy.js.map +0 -1
- package/dist/cloud/vault/index.d.ts +0 -76
- package/dist/cloud/vault/index.d.ts.map +0 -1
- package/dist/cloud/vault/index.js +0 -219
- package/dist/cloud/vault/index.js.map +0 -1
- package/dist/cloud/webhooks/index.d.ts.map +0 -1
- package/dist/cloud/webhooks/index.js.map +0 -1
- package/dist/cloud/webhooks/parsers/github.d.ts.map +0 -1
- package/dist/cloud/webhooks/parsers/github.js.map +0 -1
- package/dist/cloud/webhooks/parsers/index.d.ts.map +0 -1
- package/dist/cloud/webhooks/parsers/index.js.map +0 -1
- package/dist/cloud/webhooks/parsers/linear.d.ts.map +0 -1
- package/dist/cloud/webhooks/parsers/linear.js.map +0 -1
- package/dist/cloud/webhooks/parsers/slack.d.ts.map +0 -1
- package/dist/cloud/webhooks/parsers/slack.js.map +0 -1
- package/dist/cloud/webhooks/responders/github.d.ts.map +0 -1
- package/dist/cloud/webhooks/responders/github.js.map +0 -1
- package/dist/cloud/webhooks/responders/index.d.ts.map +0 -1
- package/dist/cloud/webhooks/responders/index.js.map +0 -1
- package/dist/cloud/webhooks/responders/linear.d.ts.map +0 -1
- package/dist/cloud/webhooks/responders/linear.js.map +0 -1
- package/dist/cloud/webhooks/responders/slack.d.ts.map +0 -1
- package/dist/cloud/webhooks/responders/slack.js.map +0 -1
- package/dist/cloud/webhooks/router.d.ts.map +0 -1
- package/dist/cloud/webhooks/router.js.map +0 -1
- package/dist/cloud/webhooks/rules-engine.d.ts.map +0 -1
- package/dist/cloud/webhooks/rules-engine.js.map +0 -1
- package/dist/cloud/webhooks/types.d.ts.map +0 -1
- package/dist/cloud/webhooks/types.js.map +0 -1
- package/dist/continuity/formatter.d.ts.map +0 -1
- package/dist/continuity/formatter.js.map +0 -1
- package/dist/continuity/handoff-store.d.ts.map +0 -1
- package/dist/continuity/handoff-store.js.map +0 -1
- package/dist/continuity/index.d.ts.map +0 -1
- package/dist/continuity/index.js.map +0 -1
- package/dist/continuity/ledger-store.d.ts.map +0 -1
- package/dist/continuity/ledger-store.js.map +0 -1
- package/dist/continuity/manager.d.ts.map +0 -1
- package/dist/continuity/manager.js.map +0 -1
- package/dist/continuity/parser.d.ts.map +0 -1
- package/dist/continuity/parser.js.map +0 -1
- package/dist/continuity/types.d.ts.map +0 -1
- package/dist/continuity/types.js.map +0 -1
- package/dist/daemon/agent-manager.d.ts.map +0 -1
- package/dist/daemon/agent-manager.js.map +0 -1
- package/dist/daemon/agent-registry.d.ts.map +0 -1
- package/dist/daemon/agent-registry.js.map +0 -1
- package/dist/daemon/api.d.ts.map +0 -1
- package/dist/daemon/api.js.map +0 -1
- package/dist/daemon/auth.d.ts.map +0 -1
- package/dist/daemon/auth.js.map +0 -1
- package/dist/daemon/cli-auth.d.ts.map +0 -1
- package/dist/daemon/cli-auth.js.map +0 -1
- package/dist/daemon/cloud-sync.d.ts.map +0 -1
- package/dist/daemon/cloud-sync.js.map +0 -1
- package/dist/daemon/connection.d.ts.map +0 -1
- package/dist/daemon/connection.js.map +0 -1
- package/dist/daemon/index.d.ts.map +0 -1
- package/dist/daemon/index.js.map +0 -1
- package/dist/daemon/orchestrator.d.ts.map +0 -1
- package/dist/daemon/orchestrator.js.map +0 -1
- package/dist/daemon/registry.d.ts.map +0 -1
- package/dist/daemon/registry.js.map +0 -1
- package/dist/daemon/router.d.ts.map +0 -1
- package/dist/daemon/router.js.map +0 -1
- package/dist/daemon/server.d.ts.map +0 -1
- package/dist/daemon/server.js.map +0 -1
- package/dist/daemon/services/browser-testing.d.ts.map +0 -1
- package/dist/daemon/services/browser-testing.js.map +0 -1
- package/dist/daemon/services/container-spawner.d.ts.map +0 -1
- package/dist/daemon/services/container-spawner.js.map +0 -1
- package/dist/daemon/types.d.ts.map +0 -1
- package/dist/daemon/types.js.map +0 -1
- package/dist/daemon/workspace-manager.d.ts.map +0 -1
- package/dist/daemon/workspace-manager.js.map +0 -1
- package/dist/dashboard/out/_next/static/H5aWG0udPB4iOUIl_gytz/_ssgManifest.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/480-2d4111711d4e473c.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/724-73c1ee5f60abe860.js +0 -9
- package/dist/dashboard/out/_next/static/chunks/766-c3a14283c88d815b.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/app/page-7120be68bea622f3.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/metrics/page-1081dd190a331a91.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/providers/page-b68a681526eb145e.js +0 -1
- package/dist/dashboard/out/_next/static/css/29852f26181969a0.css +0 -1
- package/dist/dashboard/out/_next/static/css/411ce23ffeae9f76.css +0 -1
- package/dist/dashboard-server/metrics.d.ts.map +0 -1
- package/dist/dashboard-server/metrics.js.map +0 -1
- package/dist/dashboard-server/needs-attention.d.ts.map +0 -1
- package/dist/dashboard-server/needs-attention.js.map +0 -1
- package/dist/dashboard-server/server.d.ts.map +0 -1
- package/dist/dashboard-server/server.js.map +0 -1
- package/dist/dashboard-server/start.d.ts.map +0 -1
- package/dist/dashboard-server/start.js.map +0 -1
- package/dist/hooks/emitter.d.ts.map +0 -1
- package/dist/hooks/emitter.js.map +0 -1
- package/dist/hooks/inbox-check/hook.d.ts.map +0 -1
- package/dist/hooks/inbox-check/hook.js.map +0 -1
- package/dist/hooks/inbox-check/index.d.ts.map +0 -1
- package/dist/hooks/inbox-check/index.js.map +0 -1
- package/dist/hooks/inbox-check/types.d.ts.map +0 -1
- package/dist/hooks/inbox-check/types.js.map +0 -1
- package/dist/hooks/inbox-check/utils.d.ts.map +0 -1
- package/dist/hooks/inbox-check/utils.js.map +0 -1
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/index.js.map +0 -1
- package/dist/hooks/registry.d.ts.map +0 -1
- package/dist/hooks/registry.js.map +0 -1
- package/dist/hooks/trajectory-hooks.d.ts.map +0 -1
- package/dist/hooks/trajectory-hooks.js.map +0 -1
- package/dist/hooks/types.d.ts.map +0 -1
- package/dist/hooks/types.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/memory/adapters/index.d.ts.map +0 -1
- package/dist/memory/adapters/index.js.map +0 -1
- package/dist/memory/adapters/inmemory.d.ts.map +0 -1
- package/dist/memory/adapters/inmemory.js.map +0 -1
- package/dist/memory/adapters/supermemory.d.ts.map +0 -1
- package/dist/memory/adapters/supermemory.js.map +0 -1
- package/dist/memory/factory.d.ts.map +0 -1
- package/dist/memory/factory.js.map +0 -1
- package/dist/memory/index.d.ts.map +0 -1
- package/dist/memory/index.js.map +0 -1
- package/dist/memory/memory-hooks.d.ts.map +0 -1
- package/dist/memory/memory-hooks.js.map +0 -1
- package/dist/memory/service.d.ts.map +0 -1
- package/dist/memory/service.js.map +0 -1
- package/dist/memory/types.d.ts.map +0 -1
- package/dist/memory/types.js.map +0 -1
- package/dist/policy/agent-policy.d.ts.map +0 -1
- package/dist/policy/agent-policy.js.map +0 -1
- package/dist/policy/cloud-policy-fetcher.d.ts.map +0 -1
- package/dist/policy/cloud-policy-fetcher.js.map +0 -1
- package/dist/protocol/framing.d.ts.map +0 -1
- package/dist/protocol/framing.js.map +0 -1
- package/dist/protocol/index.d.ts.map +0 -1
- package/dist/protocol/index.js.map +0 -1
- package/dist/protocol/types.d.ts.map +0 -1
- package/dist/protocol/types.js.map +0 -1
- package/dist/resiliency/context-persistence.d.ts.map +0 -1
- package/dist/resiliency/context-persistence.js.map +0 -1
- package/dist/resiliency/crash-insights.d.ts.map +0 -1
- package/dist/resiliency/crash-insights.js.map +0 -1
- package/dist/resiliency/gossip-health.d.ts.map +0 -1
- package/dist/resiliency/gossip-health.js.map +0 -1
- package/dist/resiliency/health-monitor.d.ts.map +0 -1
- package/dist/resiliency/health-monitor.js.map +0 -1
- package/dist/resiliency/index.d.ts.map +0 -1
- package/dist/resiliency/index.js.map +0 -1
- package/dist/resiliency/leader-watchdog.d.ts.map +0 -1
- package/dist/resiliency/leader-watchdog.js.map +0 -1
- package/dist/resiliency/logger.d.ts.map +0 -1
- package/dist/resiliency/logger.js.map +0 -1
- package/dist/resiliency/memory-monitor.d.ts.map +0 -1
- package/dist/resiliency/memory-monitor.js.map +0 -1
- package/dist/resiliency/metrics.d.ts.map +0 -1
- package/dist/resiliency/metrics.js.map +0 -1
- package/dist/resiliency/provider-context.d.ts.map +0 -1
- package/dist/resiliency/provider-context.js.map +0 -1
- package/dist/resiliency/stateless-lead.d.ts.map +0 -1
- package/dist/resiliency/stateless-lead.js.map +0 -1
- package/dist/resiliency/supervisor.d.ts.map +0 -1
- package/dist/resiliency/supervisor.js.map +0 -1
- package/dist/shared/cli-auth-config.d.ts.map +0 -1
- package/dist/shared/cli-auth-config.js.map +0 -1
- package/dist/state/agent-state.d.ts.map +0 -1
- package/dist/state/agent-state.js.map +0 -1
- package/dist/storage/adapter.d.ts.map +0 -1
- package/dist/storage/adapter.js.map +0 -1
- package/dist/storage/sqlite-adapter.d.ts.map +0 -1
- package/dist/storage/sqlite-adapter.js.map +0 -1
- package/dist/trajectory/config.d.ts.map +0 -1
- package/dist/trajectory/config.js.map +0 -1
- package/dist/trajectory/index.d.ts.map +0 -1
- package/dist/trajectory/index.js.map +0 -1
- package/dist/trajectory/integration.d.ts.map +0 -1
- package/dist/trajectory/integration.js.map +0 -1
- package/dist/utils/agent-config.d.ts.map +0 -1
- package/dist/utils/agent-config.js.map +0 -1
- package/dist/utils/command-resolver.d.ts.map +0 -1
- package/dist/utils/command-resolver.js.map +0 -1
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/name-generator.d.ts.map +0 -1
- package/dist/utils/name-generator.js.map +0 -1
- package/dist/utils/project-namespace.d.ts.map +0 -1
- package/dist/utils/project-namespace.js.map +0 -1
- package/dist/utils/tmux-resolver.d.ts.map +0 -1
- package/dist/utils/tmux-resolver.js.map +0 -1
- package/dist/utils/update-checker.d.ts.map +0 -1
- package/dist/utils/update-checker.js.map +0 -1
- package/dist/wrapper/client.d.ts.map +0 -1
- package/dist/wrapper/client.js.map +0 -1
- package/dist/wrapper/inbox.d.ts.map +0 -1
- package/dist/wrapper/inbox.js.map +0 -1
- package/dist/wrapper/index.d.ts.map +0 -1
- package/dist/wrapper/index.js.map +0 -1
- package/dist/wrapper/parser.d.ts.map +0 -1
- package/dist/wrapper/parser.js.map +0 -1
- package/dist/wrapper/pty-wrapper.d.ts.map +0 -1
- package/dist/wrapper/pty-wrapper.js.map +0 -1
- package/dist/wrapper/shared.d.ts.map +0 -1
- package/dist/wrapper/shared.js.map +0 -1
- package/dist/wrapper/tmux-wrapper.d.ts.map +0 -1
- package/dist/wrapper/tmux-wrapper.js.map +0 -1
- package/docs/AGENTS.md +0 -513
- package/docs/ARCHITECTURE_DECISIONS.md +0 -175
- package/docs/CLOUD-ARCHITECTURE.md +0 -804
- package/docs/CLOUD-ONBOARDING-DESIGN.md +0 -1983
- package/docs/CONTRIBUTING.md +0 -151
- package/docs/HOOKS_API.md +0 -394
- package/docs/INTEGRATION-GUIDE.md +0 -926
- package/docs/PROTOCOL.md +0 -325
- package/docs/WRAPPER_EVENTS.md +0 -358
- package/docs/agent-policy-snippet.md +0 -40
- package/docs/agent-relay-protocol.md +0 -238
- package/docs/agent-relay-snippet.md +0 -174
- package/docs/archive/CHANGELOG.md +0 -11
- package/docs/archive/CLI-SIMPLIFICATION-COMPLETE.md +0 -48
- package/docs/archive/DESIGN_BRIDGE_STAFFING.md +0 -878
- package/docs/archive/DESIGN_V2.md +0 -1079
- package/docs/archive/EXECUTIVE_SUMMARY.md +0 -358
- package/docs/archive/MONETIZATION.md +0 -1679
- package/docs/archive/PROPOSAL-trajectories.md +0 -1582
- package/docs/archive/ROADMAP.md +0 -329
- package/docs/archive/SCALING_ANALYSIS.md +0 -280
- package/docs/archive/TESTING_PRESENCE_FEATURES.md +0 -327
- package/docs/archive/TMUX_IMPLEMENTATION_NOTES.md +0 -364
- package/docs/archive/TMUX_IMPROVEMENTS.md +0 -968
- package/docs/archive/dashboard-v2-plan.md +0 -179
- package/docs/archive/removable-code-analysis.md +0 -24
- package/docs/competitive/GASTOWN.md +0 -451
- package/docs/competitive/MCP_AGENT_MAIL.md +0 -389
- package/docs/competitive/OVERVIEW.md +0 -898
- package/docs/competitive/README.md +0 -34
- package/docs/competitive/TMUX_ORCHESTRATOR.md +0 -605
- package/docs/dashboard.png +0 -0
- package/docs/design/ci-failure-webhooks.md +0 -812
- package/docs/design/comprehensive-integrations.md +0 -238
- package/docs/design/e2b-sandbox-integration.md +0 -504
- package/docs/design/github-app-permissions.md +0 -264
- package/docs/guides/CLOUD.md +0 -236
- package/docs/guides/LOCAL.md +0 -535
- package/docs/guides/SELF-HOSTED.md +0 -494
- package/docs/local-testing.md +0 -428
- package/docs/proposals/continuous-claude-integration.md +0 -622
- package/docs/proposals/custom-commands.md +0 -368
- package/docs/proposals/shadow-as-subagent.md +0 -765
- package/docs/proposals/slack-bot-integration.md +0 -1457
- package/docs/tasks/global-skills-system.tasks.md +0 -230
- package/docs/tasks/webhook-integrations.tasks.md +0 -184
- package/docs/tasks/workspace-capabilities.tasks.md +0 -121
- package/docs/testing/RESILIENCY-TEST-PLAN-2026-01-01.md +0 -366
- package/scripts/cloud-setup.sh +0 -96
- package/scripts/dev/PUBLIC_RELEASE_PLAN.md +0 -88
- package/scripts/dev/dev-team-setup.sh +0 -431
- package/scripts/e2e-test.sh +0 -119
- package/scripts/games/game-protocol.md +0 -79
- package/scripts/games/hearts-setup.sh +0 -264
- package/scripts/manual-qa.sh +0 -293
- package/scripts/run-cloud-qa.sh +0 -220
- package/scripts/test-cli-auth/Dockerfile +0 -44
- package/scripts/test-cli-auth/Dockerfile.real +0 -79
- package/scripts/test-cli-auth/README.md +0 -286
- package/scripts/test-cli-auth/ci-test-real-clis.ts +0 -251
- package/scripts/test-cli-auth/ci-test-runner.ts +0 -263
- package/scripts/test-cli-auth/mock-cli.sh +0 -147
- package/scripts/test-cli-auth/package.json +0 -14
- package/scripts/test-cli-auth/test-oauth-flow.ts +0 -220
- package/scripts/test-pty-input-auto.js +0 -222
- package/scripts/test-pty-input.js +0 -150
- package/scripts/tictactoe-setup.sh +0 -181
- /package/dist/dashboard/out/_next/static/{H5aWG0udPB4iOUIl_gytz → T1tgCqVWHFIkV7ClEtzD7}/_buildManifest.js +0 -0
- /package/dist/dashboard/out/_next/static/chunks/{117-b100311aff8d5c61.js → 117-f7b8ab0809342e77.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/{648-a13d3c2b1be45466.js → 648-5cc6e1921389a58a.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/app/_not-found/{page-a4973f3e3c82fb67.js → page-53b8a69f76db17d0.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/app/connect-repos/{page-dc2e3a1a22478efc.js → page-f45ecbc3e06134fc.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/app/history/{page-56a8b4616a90dc43.js → page-8c8bed33beb2bf1c.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/app/login/{page-3eac37ea6f5dd153.js → page-16f3b49e55b1e0ed.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/app/pricing/{page-4d72d5a5d8a9b618.js → page-982a7000fee44014.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/app/signup/{page-fee4ed1709070bcd.js → page-547dd0ca55ecd0ba.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/{fd9d1056-bf46c09eb57e019c.js → fd9d1056-609918ca7b6280bb.js} +0 -0
package/dist/daemon/cli-auth.js
CHANGED
|
@@ -9,7 +9,7 @@ import * as crypto from 'crypto';
|
|
|
9
9
|
import * as fs from 'fs/promises';
|
|
10
10
|
import * as os from 'os';
|
|
11
11
|
import { createLogger } from '../resiliency/logger.js';
|
|
12
|
-
import { CLI_AUTH_CONFIG, stripAnsiCodes, matchesSuccessPattern, findMatchingPrompt, getSupportedProviders, } from '../shared/cli-auth-config.js';
|
|
12
|
+
import { CLI_AUTH_CONFIG, stripAnsiCodes, matchesSuccessPattern, findMatchingPrompt, findMatchingError, getSupportedProviders, } from '../shared/cli-auth-config.js';
|
|
13
13
|
const logger = createLogger('cli-auth');
|
|
14
14
|
// Re-export for consumers
|
|
15
15
|
export { CLI_AUTH_CONFIG, getSupportedProviders };
|
|
@@ -123,46 +123,49 @@ export async function startCLIAuth(provider, options = {}) {
|
|
|
123
123
|
session.error = 'Timeout waiting for auth completion (5 minutes). Please try again.';
|
|
124
124
|
}
|
|
125
125
|
}, config.waitTimeout + OAUTH_COMPLETION_TIMEOUT);
|
|
126
|
-
//
|
|
127
|
-
//
|
|
128
|
-
|
|
129
|
-
if (session.status === 'waiting_auth' && session.process) {
|
|
130
|
-
try {
|
|
131
|
-
// Send space then backspace - appears as user typing but no net effect
|
|
132
|
-
session.process.write(' \b');
|
|
133
|
-
logger.debug('Keep-alive ping sent', {
|
|
134
|
-
sessionId,
|
|
135
|
-
status: session.status,
|
|
136
|
-
ageSeconds: Math.round((Date.now() - session.createdAt.getTime()) / 1000),
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
catch {
|
|
140
|
-
// Process may have exited
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}, 20000);
|
|
126
|
+
// Note: Removed keep-alive mechanism that sent ' \b' every 20 seconds
|
|
127
|
+
// It was interfering with OAuth code paste, causing "invalid code" errors
|
|
128
|
+
// CLIs like Claude don't actually need stdin keep-alive during auth wait
|
|
144
129
|
proc.onData((data) => {
|
|
145
130
|
session.output += data;
|
|
146
|
-
// Handle prompts
|
|
147
|
-
const matchingPrompt = findMatchingPrompt(data, config.prompts, respondedPrompts);
|
|
148
|
-
if (matchingPrompt) {
|
|
149
|
-
respondedPrompts.add(matchingPrompt.description);
|
|
150
|
-
session.promptsHandled.push(matchingPrompt.description);
|
|
151
|
-
logger.info('Auto-responding to prompt', { description: matchingPrompt.description });
|
|
152
|
-
const delay = matchingPrompt.delay ?? 100;
|
|
153
|
-
setTimeout(() => {
|
|
154
|
-
try {
|
|
155
|
-
proc.write(matchingPrompt.response);
|
|
156
|
-
}
|
|
157
|
-
catch {
|
|
158
|
-
// Process may have exited
|
|
159
|
-
}
|
|
160
|
-
}, delay);
|
|
161
|
-
}
|
|
162
|
-
// Extract auth URL
|
|
163
131
|
const cleanText = stripAnsiCodes(data);
|
|
132
|
+
// Check for error patterns FIRST - if error detected, don't auto-respond to prompts
|
|
133
|
+
// This prevents us from auto-responding to "Press Enter to retry" in error messages
|
|
134
|
+
const matchedError = findMatchingError(data, config.errorPatterns);
|
|
135
|
+
if (matchedError && session.status !== 'error') {
|
|
136
|
+
logger.warn('Auth error detected', {
|
|
137
|
+
provider,
|
|
138
|
+
sessionId,
|
|
139
|
+
errorMessage: matchedError.message,
|
|
140
|
+
recoverable: matchedError.recoverable,
|
|
141
|
+
});
|
|
142
|
+
session.status = 'error';
|
|
143
|
+
session.error = matchedError.message;
|
|
144
|
+
session.errorHint = matchedError.hint;
|
|
145
|
+
session.recoverable = matchedError.recoverable;
|
|
146
|
+
}
|
|
147
|
+
// Don't auto-respond to prompts if we're in error state
|
|
148
|
+
// This prevents responding to "Press Enter to retry" after an error
|
|
149
|
+
if (session.status !== 'error') {
|
|
150
|
+
const matchingPrompt = findMatchingPrompt(data, config.prompts, respondedPrompts);
|
|
151
|
+
if (matchingPrompt) {
|
|
152
|
+
respondedPrompts.add(matchingPrompt.description);
|
|
153
|
+
session.promptsHandled.push(matchingPrompt.description);
|
|
154
|
+
logger.info('Auto-responding to prompt', { description: matchingPrompt.description });
|
|
155
|
+
const delay = matchingPrompt.delay ?? 100;
|
|
156
|
+
setTimeout(() => {
|
|
157
|
+
try {
|
|
158
|
+
proc.write(matchingPrompt.response);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// Process may have exited
|
|
162
|
+
}
|
|
163
|
+
}, delay);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// Extract auth URL (only if not in error state and don't have URL yet)
|
|
164
167
|
const match = cleanText.match(config.urlPattern);
|
|
165
|
-
if (match && match[1] && !session.authUrl) {
|
|
168
|
+
if (match && match[1] && !session.authUrl && session.status !== 'error') {
|
|
166
169
|
session.authUrl = match[1];
|
|
167
170
|
session.status = 'waiting_auth';
|
|
168
171
|
logger.info('Auth URL captured', { provider, url: session.authUrl });
|
|
@@ -172,7 +175,7 @@ export async function startCLIAuth(provider, options = {}) {
|
|
|
172
175
|
}
|
|
173
176
|
// Log all output after auth URL is captured (for debugging)
|
|
174
177
|
if (session.authUrl) {
|
|
175
|
-
const trimmedData =
|
|
178
|
+
const trimmedData = cleanText.trim();
|
|
176
179
|
if (trimmedData.length > 0) {
|
|
177
180
|
logger.info('PTY output after auth URL', {
|
|
178
181
|
provider,
|
|
@@ -182,12 +185,18 @@ export async function startCLIAuth(provider, options = {}) {
|
|
|
182
185
|
}
|
|
183
186
|
}
|
|
184
187
|
// Check for success and try to extract credentials
|
|
185
|
-
if
|
|
188
|
+
// Don't override error status - if there was an error, keep it
|
|
189
|
+
if (session.status !== 'error' && matchesSuccessPattern(data, config.successPatterns)) {
|
|
186
190
|
session.status = 'success';
|
|
187
191
|
logger.info('Success pattern detected, attempting credential extraction', { provider });
|
|
188
192
|
// Try to extract credentials immediately (CLI may not exit after success)
|
|
189
193
|
// Use a small delay to let the CLI finish writing the file
|
|
190
194
|
setTimeout(async () => {
|
|
195
|
+
// Don't extract if status changed to error (e.g., error detected after success pattern)
|
|
196
|
+
if (session.status === 'error') {
|
|
197
|
+
logger.info('Skipping credential extraction - session is in error state', { provider });
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
191
200
|
try {
|
|
192
201
|
const creds = await extractCredentials(provider, config);
|
|
193
202
|
if (creds) {
|
|
@@ -206,7 +215,6 @@ export async function startCLIAuth(provider, options = {}) {
|
|
|
206
215
|
proc.onExit(async ({ exitCode }) => {
|
|
207
216
|
clearTimeout(timeout);
|
|
208
217
|
clearTimeout(authUrlTimeout);
|
|
209
|
-
clearInterval(keepAliveInterval);
|
|
210
218
|
// Clear process reference so submitAuthCode knows PTY is gone
|
|
211
219
|
session.process = undefined;
|
|
212
220
|
// Log full output for debugging PTY exit issues
|
|
@@ -221,8 +229,9 @@ export async function startCLIAuth(provider, options = {}) {
|
|
|
221
229
|
// Last 500 chars of output for debugging
|
|
222
230
|
outputTail: cleanOutput.slice(-500),
|
|
223
231
|
});
|
|
224
|
-
// Try to extract credentials
|
|
225
|
-
|
|
232
|
+
// Try to extract credentials (but don't override error status)
|
|
233
|
+
// CLI might exit cleanly (code 0) even after an OAuth error
|
|
234
|
+
if ((session.authUrl || exitCode === 0) && session.status !== 'error') {
|
|
226
235
|
try {
|
|
227
236
|
const creds = await extractCredentials(provider, config);
|
|
228
237
|
if (creds) {
|
|
@@ -265,9 +274,12 @@ export function getAuthSession(sessionId) {
|
|
|
265
274
|
* Submit auth code to a waiting session
|
|
266
275
|
* This writes the code to the PTY process stdin
|
|
267
276
|
*
|
|
277
|
+
* @param sessionId - The auth session ID
|
|
278
|
+
* @param code - The OAuth authorization code
|
|
279
|
+
* @param state - Optional OAuth state parameter for CSRF validation (used by Codex)
|
|
268
280
|
* @returns Object with success status and optional error message
|
|
269
281
|
*/
|
|
270
|
-
export async function submitAuthCode(sessionId, code) {
|
|
282
|
+
export async function submitAuthCode(sessionId, code, state) {
|
|
271
283
|
// Log all active sessions for debugging
|
|
272
284
|
const activeSessionIds = Array.from(sessions.keys());
|
|
273
285
|
logger.info('submitAuthCode called', {
|
|
@@ -305,11 +317,14 @@ export async function submitAuthCode(sessionId, code) {
|
|
|
305
317
|
outputTail: session.output ? stripAnsiCodes(session.output).slice(-500) : 'no output',
|
|
306
318
|
});
|
|
307
319
|
// Try to extract credentials as a fallback - maybe auth completed in browser
|
|
320
|
+
// But don't override error status
|
|
308
321
|
const config = CLI_AUTH_CONFIG[session.provider];
|
|
309
|
-
if (config) {
|
|
322
|
+
if (config && session.status !== 'error') {
|
|
310
323
|
try {
|
|
311
324
|
const creds = await extractCredentials(session.provider, config);
|
|
312
|
-
|
|
325
|
+
// Re-check status after async operation (race condition protection)
|
|
326
|
+
// Use type assertion because TypeScript narrowing doesn't account for async race conditions
|
|
327
|
+
if (creds && session.status !== 'error') {
|
|
313
328
|
session.token = creds.token;
|
|
314
329
|
session.refreshToken = creds.refreshToken;
|
|
315
330
|
session.tokenExpiresAt = creds.expiresAt;
|
|
@@ -331,8 +346,78 @@ export async function submitAuthCode(sessionId, code) {
|
|
|
331
346
|
};
|
|
332
347
|
}
|
|
333
348
|
try {
|
|
334
|
-
// Clean the code - trim whitespace
|
|
335
|
-
|
|
349
|
+
// Clean the code - trim whitespace and strip state parameter if present
|
|
350
|
+
// Claude OAuth codes come as "CODE#STATE" - we only need the code part
|
|
351
|
+
let cleanCode = code.trim();
|
|
352
|
+
if (cleanCode.includes('#')) {
|
|
353
|
+
const originalCode = cleanCode;
|
|
354
|
+
cleanCode = cleanCode.split('#')[0];
|
|
355
|
+
logger.info('Stripped state parameter from auth code', {
|
|
356
|
+
sessionId,
|
|
357
|
+
originalLength: originalCode.length,
|
|
358
|
+
cleanLength: cleanCode.length,
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
// For Codex (openai), forward the callback to the CLI's localhost server
|
|
362
|
+
// instead of writing to PTY stdin. The CLI spawns a localhost server
|
|
363
|
+
// waiting for the OAuth callback.
|
|
364
|
+
if (session.provider === 'openai' && session.authUrl) {
|
|
365
|
+
// Extract the redirect port from the auth URL (usually 1455)
|
|
366
|
+
const redirectMatch = session.authUrl.match(/redirect_uri=http%3A%2F%2Flocalhost%3A(\d+)/);
|
|
367
|
+
const port = redirectMatch ? redirectMatch[1] : '1455';
|
|
368
|
+
logger.info('Forwarding OAuth callback to Codex CLI localhost server', {
|
|
369
|
+
sessionId,
|
|
370
|
+
port,
|
|
371
|
+
codeLength: cleanCode.length,
|
|
372
|
+
hasState: !!state,
|
|
373
|
+
});
|
|
374
|
+
try {
|
|
375
|
+
// Forward the callback to the CLI's localhost server
|
|
376
|
+
// Include state parameter for CSRF validation if provided
|
|
377
|
+
let callbackUrl = `http://localhost:${port}/auth/callback?code=${encodeURIComponent(cleanCode)}`;
|
|
378
|
+
if (state) {
|
|
379
|
+
callbackUrl += `&state=${encodeURIComponent(state)}`;
|
|
380
|
+
}
|
|
381
|
+
const response = await fetch(callbackUrl, {
|
|
382
|
+
method: 'GET',
|
|
383
|
+
signal: AbortSignal.timeout(5000),
|
|
384
|
+
});
|
|
385
|
+
if (response.ok) {
|
|
386
|
+
logger.info('OAuth callback forwarded successfully to Codex CLI', { sessionId, status: response.status });
|
|
387
|
+
// Start polling for credentials
|
|
388
|
+
const config = CLI_AUTH_CONFIG[session.provider];
|
|
389
|
+
if (config) {
|
|
390
|
+
pollForCredentials(session, config);
|
|
391
|
+
}
|
|
392
|
+
return { success: true };
|
|
393
|
+
}
|
|
394
|
+
else {
|
|
395
|
+
// Try to get error details from response body
|
|
396
|
+
let errorBody = '';
|
|
397
|
+
try {
|
|
398
|
+
errorBody = await response.text();
|
|
399
|
+
}
|
|
400
|
+
catch {
|
|
401
|
+
// Ignore
|
|
402
|
+
}
|
|
403
|
+
logger.warn('Codex CLI localhost server returned error', {
|
|
404
|
+
sessionId,
|
|
405
|
+
status: response.status,
|
|
406
|
+
statusText: response.statusText,
|
|
407
|
+
errorBody: errorBody.substring(0, 500), // Limit log size
|
|
408
|
+
callbackUrl: callbackUrl.replace(/code=[^&]+/, 'code=***'), // Redact code
|
|
409
|
+
});
|
|
410
|
+
// Fall through to PTY write as fallback
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
catch (err) {
|
|
414
|
+
logger.warn('Failed to forward callback to Codex CLI localhost server', {
|
|
415
|
+
sessionId,
|
|
416
|
+
error: String(err),
|
|
417
|
+
});
|
|
418
|
+
// Fall through to PTY write as fallback
|
|
419
|
+
}
|
|
420
|
+
}
|
|
336
421
|
logger.info('Writing auth code to PTY', {
|
|
337
422
|
sessionId,
|
|
338
423
|
originalLength: code.length,
|
|
@@ -382,6 +467,14 @@ async function pollForCredentials(session, config) {
|
|
|
382
467
|
try {
|
|
383
468
|
const creds = await extractCredentials(session.provider, config);
|
|
384
469
|
if (creds) {
|
|
470
|
+
// Double-check we're not in error state (race condition protection)
|
|
471
|
+
// Use type assertion because TypeScript narrowing doesn't account for async race conditions
|
|
472
|
+
if (session.status === 'error') {
|
|
473
|
+
logger.info('Credentials found but session is in error state, not overriding', {
|
|
474
|
+
provider: session.provider,
|
|
475
|
+
});
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
385
478
|
session.token = creds.token;
|
|
386
479
|
session.refreshToken = creds.refreshToken;
|
|
387
480
|
session.tokenExpiresAt = creds.expiresAt;
|
|
@@ -424,9 +517,18 @@ export async function completeAuthSession(sessionId) {
|
|
|
424
517
|
const maxAttempts = 15;
|
|
425
518
|
const pollInterval = 1000;
|
|
426
519
|
for (let i = 0; i < maxAttempts; i++) {
|
|
520
|
+
// Check if session went into error state
|
|
521
|
+
if (session.status === 'error') {
|
|
522
|
+
return { success: false, error: session.error || 'Authentication failed' };
|
|
523
|
+
}
|
|
427
524
|
try {
|
|
428
525
|
const creds = await extractCredentials(session.provider, config);
|
|
429
526
|
if (creds) {
|
|
527
|
+
// Double-check we're not in error state (race condition protection)
|
|
528
|
+
// Use type assertion because TypeScript narrowing doesn't account for async race conditions
|
|
529
|
+
if (session.status === 'error') {
|
|
530
|
+
return { success: false, error: session.error || 'Authentication failed' };
|
|
531
|
+
}
|
|
430
532
|
session.token = creds.token;
|
|
431
533
|
session.refreshToken = creds.refreshToken;
|
|
432
534
|
session.tokenExpiresAt = creds.expiresAt;
|
|
@@ -534,4 +636,21 @@ async function extractCredentials(provider, config) {
|
|
|
534
636
|
return null;
|
|
535
637
|
}
|
|
536
638
|
}
|
|
639
|
+
/**
|
|
640
|
+
* Check if a provider is authenticated (credentials exist)
|
|
641
|
+
* Used by the auth check endpoint for SSH tunnel flow
|
|
642
|
+
*/
|
|
643
|
+
export async function checkProviderAuth(provider) {
|
|
644
|
+
const config = CLI_AUTH_CONFIG[provider];
|
|
645
|
+
if (!config) {
|
|
646
|
+
return false;
|
|
647
|
+
}
|
|
648
|
+
try {
|
|
649
|
+
const creds = await extractCredentials(provider, config);
|
|
650
|
+
return !!creds?.token;
|
|
651
|
+
}
|
|
652
|
+
catch {
|
|
653
|
+
return false;
|
|
654
|
+
}
|
|
655
|
+
}
|
|
537
656
|
//# sourceMappingURL=cli-auth.js.map
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* ERROR -------> CLOSED
|
|
9
9
|
*/
|
|
10
10
|
import net from 'node:net';
|
|
11
|
-
import { type Envelope, type AckPayload } from '../protocol/types.js';
|
|
11
|
+
import { type Envelope, type AckPayload, type EntityType } from '../protocol/types.js';
|
|
12
12
|
export type ConnectionState = 'CONNECTING' | 'HANDSHAKING' | 'ACTIVE' | 'CLOSING' | 'CLOSED' | 'ERROR';
|
|
13
13
|
export interface ConnectionConfig {
|
|
14
14
|
maxFrameBytes: number;
|
|
@@ -39,11 +39,14 @@ export declare class Connection {
|
|
|
39
39
|
private config;
|
|
40
40
|
private _state;
|
|
41
41
|
private _agentName?;
|
|
42
|
+
private _entityType?;
|
|
42
43
|
private _cli?;
|
|
43
44
|
private _program?;
|
|
44
45
|
private _model?;
|
|
45
46
|
private _task?;
|
|
46
47
|
private _workingDirectory?;
|
|
48
|
+
private _displayName?;
|
|
49
|
+
private _avatarUrl?;
|
|
47
50
|
private _sessionId;
|
|
48
51
|
private _resumeToken;
|
|
49
52
|
private _isResumed;
|
|
@@ -59,11 +62,14 @@ export declare class Connection {
|
|
|
59
62
|
constructor(socket: net.Socket, config?: Partial<ConnectionConfig>);
|
|
60
63
|
get state(): ConnectionState;
|
|
61
64
|
get agentName(): string | undefined;
|
|
65
|
+
get entityType(): EntityType | undefined;
|
|
62
66
|
get cli(): string | undefined;
|
|
63
67
|
get program(): string | undefined;
|
|
64
68
|
get model(): string | undefined;
|
|
65
69
|
get task(): string | undefined;
|
|
66
70
|
get workingDirectory(): string | undefined;
|
|
71
|
+
get displayName(): string | undefined;
|
|
72
|
+
get avatarUrl(): string | undefined;
|
|
67
73
|
get sessionId(): string;
|
|
68
74
|
get resumeToken(): string;
|
|
69
75
|
get isResumed(): boolean;
|
|
@@ -23,11 +23,14 @@ export class Connection {
|
|
|
23
23
|
config;
|
|
24
24
|
_state = 'CONNECTING';
|
|
25
25
|
_agentName;
|
|
26
|
+
_entityType;
|
|
26
27
|
_cli;
|
|
27
28
|
_program;
|
|
28
29
|
_model;
|
|
29
30
|
_task;
|
|
30
31
|
_workingDirectory;
|
|
32
|
+
_displayName;
|
|
33
|
+
_avatarUrl;
|
|
31
34
|
_sessionId;
|
|
32
35
|
_resumeToken;
|
|
33
36
|
_isResumed = false;
|
|
@@ -58,6 +61,9 @@ export class Connection {
|
|
|
58
61
|
get agentName() {
|
|
59
62
|
return this._agentName;
|
|
60
63
|
}
|
|
64
|
+
get entityType() {
|
|
65
|
+
return this._entityType;
|
|
66
|
+
}
|
|
61
67
|
get cli() {
|
|
62
68
|
return this._cli;
|
|
63
69
|
}
|
|
@@ -73,6 +79,12 @@ export class Connection {
|
|
|
73
79
|
get workingDirectory() {
|
|
74
80
|
return this._workingDirectory;
|
|
75
81
|
}
|
|
82
|
+
get displayName() {
|
|
83
|
+
return this._displayName;
|
|
84
|
+
}
|
|
85
|
+
get avatarUrl() {
|
|
86
|
+
return this._avatarUrl;
|
|
87
|
+
}
|
|
76
88
|
get sessionId() {
|
|
77
89
|
return this._sessionId;
|
|
78
90
|
}
|
|
@@ -133,11 +145,14 @@ export class Connection {
|
|
|
133
145
|
return;
|
|
134
146
|
}
|
|
135
147
|
this._agentName = envelope.payload.agent;
|
|
148
|
+
this._entityType = envelope.payload.entityType;
|
|
136
149
|
this._cli = envelope.payload.cli;
|
|
137
150
|
this._program = envelope.payload.program;
|
|
138
151
|
this._model = envelope.payload.model;
|
|
139
152
|
this._task = envelope.payload.task;
|
|
140
153
|
this._workingDirectory = envelope.payload.workingDirectory;
|
|
154
|
+
this._displayName = envelope.payload.displayName;
|
|
155
|
+
this._avatarUrl = envelope.payload.avatarUrl;
|
|
141
156
|
// Check for session resume
|
|
142
157
|
const resumeToken = envelope.payload.session?.resume_token;
|
|
143
158
|
if (resumeToken) {
|
|
@@ -26,6 +26,8 @@ export declare class Orchestrator extends EventEmitter {
|
|
|
26
26
|
private sessions;
|
|
27
27
|
private supervisor;
|
|
28
28
|
private workspacesFile;
|
|
29
|
+
private clientAlive;
|
|
30
|
+
private pingInterval?;
|
|
29
31
|
constructor(config?: Partial<OrchestratorConfig>);
|
|
30
32
|
/**
|
|
31
33
|
* Start the orchestrator
|
|
@@ -39,6 +39,9 @@ export class Orchestrator extends EventEmitter {
|
|
|
39
39
|
contextPersistence: { enabled: true, autoInjectOnRestart: true },
|
|
40
40
|
});
|
|
41
41
|
workspacesFile;
|
|
42
|
+
// Track alive status for ping/pong keepalive
|
|
43
|
+
clientAlive = new WeakMap();
|
|
44
|
+
pingInterval;
|
|
42
45
|
constructor(config = {}) {
|
|
43
46
|
super();
|
|
44
47
|
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
@@ -73,6 +76,18 @@ export class Orchestrator extends EventEmitter {
|
|
|
73
76
|
// Setup WebSocket
|
|
74
77
|
this.wss = new WebSocketServer({ server: this.server });
|
|
75
78
|
this.wss.on('connection', (ws, req) => this.handleWebSocket(ws, req));
|
|
79
|
+
// Setup ping/pong keepalive (30 second interval)
|
|
80
|
+
this.pingInterval = setInterval(() => {
|
|
81
|
+
this.wss?.clients.forEach((ws) => {
|
|
82
|
+
if (this.clientAlive.get(ws) === false) {
|
|
83
|
+
logger.info('WebSocket client unresponsive, closing');
|
|
84
|
+
ws.terminate();
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
this.clientAlive.set(ws, false);
|
|
88
|
+
ws.ping();
|
|
89
|
+
});
|
|
90
|
+
}, 30000);
|
|
76
91
|
return new Promise((resolve) => {
|
|
77
92
|
this.server.listen(this.config.port, this.config.host, () => {
|
|
78
93
|
logger.info('Orchestrator started', {
|
|
@@ -87,6 +102,11 @@ export class Orchestrator extends EventEmitter {
|
|
|
87
102
|
*/
|
|
88
103
|
async stop() {
|
|
89
104
|
logger.info('Stopping orchestrator');
|
|
105
|
+
// Clear ping interval
|
|
106
|
+
if (this.pingInterval) {
|
|
107
|
+
clearInterval(this.pingInterval);
|
|
108
|
+
this.pingInterval = undefined;
|
|
109
|
+
}
|
|
90
110
|
// Stop all workspace daemons
|
|
91
111
|
for (const [id] of this.workspaces) {
|
|
92
112
|
await this.stopWorkspaceDaemon(id);
|
|
@@ -501,6 +521,12 @@ export class Orchestrator extends EventEmitter {
|
|
|
501
521
|
*/
|
|
502
522
|
handleWebSocket(ws, _req) {
|
|
503
523
|
logger.info('WebSocket client connected');
|
|
524
|
+
// Mark client as alive for ping/pong keepalive
|
|
525
|
+
this.clientAlive.set(ws, true);
|
|
526
|
+
// Handle pong responses
|
|
527
|
+
ws.on('pong', () => {
|
|
528
|
+
this.clientAlive.set(ws, true);
|
|
529
|
+
});
|
|
504
530
|
const session = {
|
|
505
531
|
userId: 'anonymous',
|
|
506
532
|
githubUsername: 'anonymous',
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace Repository Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages repository cloning, updating, and removal for workspace containers.
|
|
5
|
+
* Uses a file-based tracking system (repos.json) to persist state across restarts.
|
|
6
|
+
*
|
|
7
|
+
* This replaces the static REPOSITORIES env var approach, allowing dynamic
|
|
8
|
+
* repo management without workspace restart.
|
|
9
|
+
*/
|
|
10
|
+
import { EventEmitter } from 'events';
|
|
11
|
+
export interface RepoInfo {
|
|
12
|
+
/** Full GitHub repo name (e.g., "owner/repo") */
|
|
13
|
+
fullName: string;
|
|
14
|
+
/** Local directory name */
|
|
15
|
+
localName: string;
|
|
16
|
+
/** Absolute path to the cloned repo */
|
|
17
|
+
path: string;
|
|
18
|
+
/** Current status */
|
|
19
|
+
status: 'cloned' | 'cloning' | 'error' | 'removed';
|
|
20
|
+
/** Last sync timestamp */
|
|
21
|
+
lastSynced?: string;
|
|
22
|
+
/** Default branch */
|
|
23
|
+
defaultBranch?: string;
|
|
24
|
+
/** Error message if status is 'error' */
|
|
25
|
+
error?: string;
|
|
26
|
+
/** When the repo was added */
|
|
27
|
+
addedAt: string;
|
|
28
|
+
}
|
|
29
|
+
export interface ReposConfig {
|
|
30
|
+
version: number;
|
|
31
|
+
workspaceDir: string;
|
|
32
|
+
repos: Record<string, RepoInfo>;
|
|
33
|
+
lastUpdated: string;
|
|
34
|
+
}
|
|
35
|
+
export interface SyncResult {
|
|
36
|
+
success: boolean;
|
|
37
|
+
repo: string;
|
|
38
|
+
action: 'cloned' | 'updated' | 'already_synced' | 'error';
|
|
39
|
+
path?: string;
|
|
40
|
+
error?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface RepoManagerConfig {
|
|
43
|
+
workspaceDir: string;
|
|
44
|
+
configFile?: string;
|
|
45
|
+
}
|
|
46
|
+
export declare class RepoManager extends EventEmitter {
|
|
47
|
+
private workspaceDir;
|
|
48
|
+
private configPath;
|
|
49
|
+
private config;
|
|
50
|
+
constructor(options: RepoManagerConfig);
|
|
51
|
+
/**
|
|
52
|
+
* Load or initialize the repos config file
|
|
53
|
+
*/
|
|
54
|
+
private loadConfig;
|
|
55
|
+
/**
|
|
56
|
+
* Save the config to disk
|
|
57
|
+
*/
|
|
58
|
+
private saveConfig;
|
|
59
|
+
/**
|
|
60
|
+
* Get all tracked repos
|
|
61
|
+
*/
|
|
62
|
+
getRepos(): RepoInfo[];
|
|
63
|
+
/**
|
|
64
|
+
* Get a specific repo by full name
|
|
65
|
+
*/
|
|
66
|
+
getRepo(fullName: string): RepoInfo | null;
|
|
67
|
+
/**
|
|
68
|
+
* Sync a repository (clone if new, pull if exists)
|
|
69
|
+
*/
|
|
70
|
+
syncRepo(fullName: string): Promise<SyncResult>;
|
|
71
|
+
/**
|
|
72
|
+
* Remove a repository
|
|
73
|
+
*/
|
|
74
|
+
removeRepo(fullName: string, deleteFiles?: boolean): Promise<boolean>;
|
|
75
|
+
/**
|
|
76
|
+
* Sync multiple repos (e.g., from initial REPOSITORIES env var)
|
|
77
|
+
*/
|
|
78
|
+
syncRepos(fullNames: string[]): Promise<SyncResult[]>;
|
|
79
|
+
/**
|
|
80
|
+
* Initialize from REPOSITORIES env var (backward compatibility)
|
|
81
|
+
*/
|
|
82
|
+
initFromEnv(): Promise<SyncResult[]>;
|
|
83
|
+
/**
|
|
84
|
+
* Scan workspace directory for existing repos and register them
|
|
85
|
+
* This handles repos that were cloned by entrypoint.sh before daemon started
|
|
86
|
+
*/
|
|
87
|
+
scanExistingRepos(): void;
|
|
88
|
+
/**
|
|
89
|
+
* Clone a repository
|
|
90
|
+
*/
|
|
91
|
+
private gitClone;
|
|
92
|
+
/**
|
|
93
|
+
* Pull updates for a repository
|
|
94
|
+
*/
|
|
95
|
+
private gitPull;
|
|
96
|
+
/**
|
|
97
|
+
* Get the default branch of a repo
|
|
98
|
+
*/
|
|
99
|
+
private getDefaultBranch;
|
|
100
|
+
/**
|
|
101
|
+
* Mark directory as safe for git (prevents "dubious ownership" errors)
|
|
102
|
+
*/
|
|
103
|
+
private markSafeDirectory;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get or create the repo manager instance
|
|
107
|
+
*/
|
|
108
|
+
export declare function getRepoManager(workspaceDir?: string): RepoManager;
|
|
109
|
+
/**
|
|
110
|
+
* Initialize repo manager (call at startup)
|
|
111
|
+
*
|
|
112
|
+
* 1. Scans workspace for existing repos (handles entrypoint.sh clones)
|
|
113
|
+
* 2. Syncs any repos from REPOSITORIES env var that aren't already cloned
|
|
114
|
+
*/
|
|
115
|
+
export declare function initRepoManager(workspaceDir?: string): Promise<RepoManager>;
|
|
116
|
+
//# sourceMappingURL=repo-manager.d.ts.map
|