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
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSH Security Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides secure SSH password derivation for workspace containers.
|
|
5
|
+
* Uses a deterministic approach based on workspace ID + secret salt,
|
|
6
|
+
* ensuring each workspace has a unique password without storage.
|
|
7
|
+
*/
|
|
8
|
+
import * as crypto from 'crypto';
|
|
9
|
+
const DEFAULT_SALT = 'default-salt-change-in-prod';
|
|
10
|
+
/**
|
|
11
|
+
* Derive a unique SSH password for a workspace.
|
|
12
|
+
*
|
|
13
|
+
* Uses SHA-256 hash of (workspaceId + salt) to generate a deterministic
|
|
14
|
+
* but unique password for each workspace. This approach:
|
|
15
|
+
* - Ensures each workspace has a unique password
|
|
16
|
+
* - Requires no database storage
|
|
17
|
+
* - Produces consistent results across cloud server and container
|
|
18
|
+
*
|
|
19
|
+
* SECURITY: Set SSH_PASSWORD_SALT environment variable in production!
|
|
20
|
+
* The default salt is insecure and should never be used in production.
|
|
21
|
+
*
|
|
22
|
+
* @param workspaceId - The workspace UUID
|
|
23
|
+
* @returns A 24-character hex password (96 bits of entropy)
|
|
24
|
+
*/
|
|
25
|
+
export function deriveSshPassword(workspaceId) {
|
|
26
|
+
const salt = process.env.SSH_PASSWORD_SALT;
|
|
27
|
+
// Warn if using default salt in production
|
|
28
|
+
if (!salt) {
|
|
29
|
+
const isProduction = process.env.NODE_ENV === 'production' || process.env.FLY_APP_NAME;
|
|
30
|
+
if (isProduction) {
|
|
31
|
+
console.warn('[SECURITY WARNING] SSH_PASSWORD_SALT is not set! ' +
|
|
32
|
+
'Using default salt is INSECURE in production. ' +
|
|
33
|
+
'Set SSH_PASSWORD_SALT to a random 32+ character secret.');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const effectiveSalt = salt || DEFAULT_SALT;
|
|
37
|
+
return crypto
|
|
38
|
+
.createHash('sha256')
|
|
39
|
+
.update(`${workspaceId}:${effectiveSalt}`)
|
|
40
|
+
.digest('hex')
|
|
41
|
+
.substring(0, 24); // 24 hex chars = 96 bits of entropy
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Validate that SSH security is properly configured.
|
|
45
|
+
* Call this at server startup to catch configuration issues early.
|
|
46
|
+
*
|
|
47
|
+
* @returns true if properly configured, false otherwise
|
|
48
|
+
*/
|
|
49
|
+
export function validateSshSecurityConfig() {
|
|
50
|
+
const salt = process.env.SSH_PASSWORD_SALT;
|
|
51
|
+
const isProduction = process.env.NODE_ENV === 'production' || process.env.FLY_APP_NAME;
|
|
52
|
+
if (isProduction && !salt) {
|
|
53
|
+
console.error('[SECURITY ERROR] SSH_PASSWORD_SALT must be set in production! ' +
|
|
54
|
+
'Generate one with: openssl rand -hex 32');
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
if (salt && salt.length < 16) {
|
|
58
|
+
console.warn('[SECURITY WARNING] SSH_PASSWORD_SALT should be at least 16 characters. ' +
|
|
59
|
+
'Current length: ' + salt.length);
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=ssh-security.js.map
|
|
@@ -102,6 +102,11 @@ export declare class ContinuityManager {
|
|
|
102
102
|
* Filter placeholder values from a handoff (defensive)
|
|
103
103
|
*/
|
|
104
104
|
private filterHandoffPlaceholders;
|
|
105
|
+
/**
|
|
106
|
+
* Filter placeholder values from ledger updates (for object input to saveLedger).
|
|
107
|
+
* This ensures placeholder values like "...", "task1", etc. don't get saved.
|
|
108
|
+
*/
|
|
109
|
+
private filterUpdatesPlaceholders;
|
|
105
110
|
/**
|
|
106
111
|
* Format a ledger for display/injection
|
|
107
112
|
*/
|
|
@@ -91,8 +91,16 @@ export class ContinuityManager {
|
|
|
91
91
|
*/
|
|
92
92
|
async saveLedger(agentName, content, options = {}) {
|
|
93
93
|
await this.initialize();
|
|
94
|
-
// Parse content if string
|
|
95
|
-
|
|
94
|
+
// Parse content if string, otherwise filter placeholders from object input
|
|
95
|
+
// This ensures placeholder values like "...", "task1", etc. never get saved
|
|
96
|
+
let updates;
|
|
97
|
+
if (typeof content === 'string') {
|
|
98
|
+
updates = parseSaveContent(content);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// Filter placeholders from object input (e.g., from [[SUMMARY]] blocks)
|
|
102
|
+
updates = this.filterUpdatesPlaceholders(content);
|
|
103
|
+
}
|
|
96
104
|
// Get or create existing ledger
|
|
97
105
|
let ledger = await this.ledgerStore.load(agentName);
|
|
98
106
|
if (ledger) {
|
|
@@ -329,6 +337,52 @@ export class ContinuityManager {
|
|
|
329
337
|
learnings: handoff.learnings ? filterPlaceholders(handoff.learnings) : undefined,
|
|
330
338
|
};
|
|
331
339
|
}
|
|
340
|
+
/**
|
|
341
|
+
* Filter placeholder values from ledger updates (for object input to saveLedger).
|
|
342
|
+
* This ensures placeholder values like "...", "task1", etc. don't get saved.
|
|
343
|
+
*/
|
|
344
|
+
filterUpdatesPlaceholders(updates) {
|
|
345
|
+
const filtered = { ...updates };
|
|
346
|
+
// Filter string fields
|
|
347
|
+
if (filtered.currentTask !== undefined) {
|
|
348
|
+
filtered.currentTask = isPlaceholderValue(filtered.currentTask) ? undefined : filtered.currentTask;
|
|
349
|
+
if (filtered.currentTask === undefined)
|
|
350
|
+
delete filtered.currentTask;
|
|
351
|
+
}
|
|
352
|
+
// Filter array fields
|
|
353
|
+
if (filtered.completed) {
|
|
354
|
+
filtered.completed = filterPlaceholders(filtered.completed);
|
|
355
|
+
if (filtered.completed.length === 0)
|
|
356
|
+
delete filtered.completed;
|
|
357
|
+
}
|
|
358
|
+
if (filtered.inProgress) {
|
|
359
|
+
filtered.inProgress = filterPlaceholders(filtered.inProgress);
|
|
360
|
+
if (filtered.inProgress.length === 0)
|
|
361
|
+
delete filtered.inProgress;
|
|
362
|
+
}
|
|
363
|
+
if (filtered.blocked) {
|
|
364
|
+
filtered.blocked = filterPlaceholders(filtered.blocked);
|
|
365
|
+
if (filtered.blocked.length === 0)
|
|
366
|
+
delete filtered.blocked;
|
|
367
|
+
}
|
|
368
|
+
if (filtered.uncertainItems) {
|
|
369
|
+
filtered.uncertainItems = filterPlaceholders(filtered.uncertainItems);
|
|
370
|
+
if (filtered.uncertainItems.length === 0)
|
|
371
|
+
delete filtered.uncertainItems;
|
|
372
|
+
}
|
|
373
|
+
// Filter complex array fields
|
|
374
|
+
if (filtered.fileContext) {
|
|
375
|
+
filtered.fileContext = filtered.fileContext.filter(f => !isPlaceholderValue(f.path));
|
|
376
|
+
if (filtered.fileContext.length === 0)
|
|
377
|
+
delete filtered.fileContext;
|
|
378
|
+
}
|
|
379
|
+
if (filtered.keyDecisions) {
|
|
380
|
+
filtered.keyDecisions = filtered.keyDecisions.filter(d => !isPlaceholderValue(d.decision));
|
|
381
|
+
if (filtered.keyDecisions.length === 0)
|
|
382
|
+
delete filtered.keyDecisions;
|
|
383
|
+
}
|
|
384
|
+
return filtered;
|
|
385
|
+
}
|
|
332
386
|
/**
|
|
333
387
|
* Format a ledger for display/injection
|
|
334
388
|
*/
|
package/dist/daemon/api.d.ts
CHANGED
|
@@ -14,6 +14,8 @@ export declare class DaemonApi extends EventEmitter {
|
|
|
14
14
|
private config;
|
|
15
15
|
private allowedOrigins;
|
|
16
16
|
private allowAllOrigins;
|
|
17
|
+
private clientAlive;
|
|
18
|
+
private pingInterval?;
|
|
17
19
|
constructor(config: ApiDaemonConfig);
|
|
18
20
|
/**
|
|
19
21
|
* Resolve allowed origins from config/env (comma-separated list).
|
package/dist/daemon/api.js
CHANGED
|
@@ -9,7 +9,8 @@ import { createLogger } from '../resiliency/logger.js';
|
|
|
9
9
|
import { metrics } from '../resiliency/metrics.js';
|
|
10
10
|
import { getWorkspaceManager } from './workspace-manager.js';
|
|
11
11
|
import { getAgentManager } from './agent-manager.js';
|
|
12
|
-
import { startCLIAuth, getAuthSession, cancelAuthSession, getSupportedProviders, } from './cli-auth.js';
|
|
12
|
+
import { startCLIAuth, getAuthSession, submitAuthCode, cancelAuthSession, getSupportedProviders, } from './cli-auth.js';
|
|
13
|
+
import { getRepoManager, initRepoManager } from './repo-manager.js';
|
|
13
14
|
const logger = createLogger('daemon-api');
|
|
14
15
|
export class DaemonApi extends EventEmitter {
|
|
15
16
|
server;
|
|
@@ -21,6 +22,9 @@ export class DaemonApi extends EventEmitter {
|
|
|
21
22
|
config;
|
|
22
23
|
allowedOrigins;
|
|
23
24
|
allowAllOrigins;
|
|
25
|
+
// Track alive status for ping/pong keepalive
|
|
26
|
+
clientAlive = new WeakMap();
|
|
27
|
+
pingInterval;
|
|
24
28
|
constructor(config) {
|
|
25
29
|
super();
|
|
26
30
|
this.config = config;
|
|
@@ -80,11 +84,28 @@ export class DaemonApi extends EventEmitter {
|
|
|
80
84
|
* Start the API server
|
|
81
85
|
*/
|
|
82
86
|
async start() {
|
|
87
|
+
// Initialize repo manager (scans for existing repos, syncs from env)
|
|
88
|
+
// This runs in background - don't block server startup
|
|
89
|
+
initRepoManager().catch((err) => {
|
|
90
|
+
logger.warn('Failed to initialize repo manager', { error: String(err) });
|
|
91
|
+
});
|
|
83
92
|
return new Promise((resolve) => {
|
|
84
93
|
this.server = http.createServer((req, res) => this.handleRequest(req, res));
|
|
85
|
-
// Setup WebSocket server
|
|
86
|
-
this.wss = new WebSocketServer({ server: this.server });
|
|
94
|
+
// Setup WebSocket server (disable compression for compatibility)
|
|
95
|
+
this.wss = new WebSocketServer({ server: this.server, perMessageDeflate: false });
|
|
87
96
|
this.wss.on('connection', (ws, req) => this.handleWebSocketConnection(ws, req));
|
|
97
|
+
// Setup ping/pong keepalive (30 second interval)
|
|
98
|
+
this.pingInterval = setInterval(() => {
|
|
99
|
+
this.wss?.clients.forEach((ws) => {
|
|
100
|
+
if (this.clientAlive.get(ws) === false) {
|
|
101
|
+
logger.info('WebSocket client unresponsive, closing');
|
|
102
|
+
ws.terminate();
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
this.clientAlive.set(ws, false);
|
|
106
|
+
ws.ping();
|
|
107
|
+
});
|
|
108
|
+
}, 30000);
|
|
88
109
|
this.server.listen(this.config.port, this.config.host, () => {
|
|
89
110
|
logger.info('Daemon API started', { port: this.config.port, host: this.config.host });
|
|
90
111
|
resolve();
|
|
@@ -95,6 +116,11 @@ export class DaemonApi extends EventEmitter {
|
|
|
95
116
|
* Stop the API server
|
|
96
117
|
*/
|
|
97
118
|
async stop() {
|
|
119
|
+
// Clear ping interval
|
|
120
|
+
if (this.pingInterval) {
|
|
121
|
+
clearInterval(this.pingInterval);
|
|
122
|
+
this.pingInterval = undefined;
|
|
123
|
+
}
|
|
98
124
|
// Close all WebSocket connections
|
|
99
125
|
if (this.wss) {
|
|
100
126
|
for (const ws of this.wss.clients) {
|
|
@@ -295,6 +321,8 @@ export class DaemonApi extends EventEmitter {
|
|
|
295
321
|
status: session.status,
|
|
296
322
|
authUrl: session.authUrl,
|
|
297
323
|
error: session.error,
|
|
324
|
+
errorHint: session.errorHint,
|
|
325
|
+
recoverable: session.recoverable,
|
|
298
326
|
promptsHandled: session.promptsHandled,
|
|
299
327
|
},
|
|
300
328
|
};
|
|
@@ -306,17 +334,109 @@ export class DaemonApi extends EventEmitter {
|
|
|
306
334
|
if (!session) {
|
|
307
335
|
return { status: 404, body: { error: 'Session not found' } };
|
|
308
336
|
}
|
|
309
|
-
|
|
310
|
-
|
|
337
|
+
// Check for error state first
|
|
338
|
+
if (session.status === 'error') {
|
|
339
|
+
return {
|
|
340
|
+
status: 400,
|
|
341
|
+
body: {
|
|
342
|
+
error: session.error || 'Authentication failed',
|
|
343
|
+
errorHint: session.errorHint,
|
|
344
|
+
recoverable: session.recoverable,
|
|
345
|
+
status: session.status,
|
|
346
|
+
},
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
// Check if auth is complete AND we have credentials
|
|
350
|
+
// Status can be 'success' before credentials are extracted (race condition)
|
|
351
|
+
if (session.status !== 'success' || !session.token) {
|
|
352
|
+
return {
|
|
353
|
+
status: 400,
|
|
354
|
+
body: {
|
|
355
|
+
error: 'Auth not complete or credentials not yet available',
|
|
356
|
+
status: session.status,
|
|
357
|
+
hasToken: !!session.token,
|
|
358
|
+
},
|
|
359
|
+
};
|
|
311
360
|
}
|
|
312
361
|
return {
|
|
313
362
|
status: 200,
|
|
314
363
|
body: {
|
|
315
364
|
token: session.token,
|
|
365
|
+
refreshToken: session.refreshToken,
|
|
366
|
+
tokenExpiresAt: session.tokenExpiresAt,
|
|
316
367
|
provider: session.provider,
|
|
317
368
|
},
|
|
318
369
|
};
|
|
319
370
|
});
|
|
371
|
+
// Submit auth code to PTY session
|
|
372
|
+
this.routes.set('POST /auth/cli/:provider/code/:sessionId', async (req) => {
|
|
373
|
+
const { sessionId } = req.params;
|
|
374
|
+
const { code, state } = req.body;
|
|
375
|
+
if (!code || typeof code !== 'string') {
|
|
376
|
+
return { status: 400, body: { error: 'Auth code is required' } };
|
|
377
|
+
}
|
|
378
|
+
const result = await submitAuthCode(sessionId, code, state);
|
|
379
|
+
if (!result.success) {
|
|
380
|
+
return {
|
|
381
|
+
status: 400,
|
|
382
|
+
body: {
|
|
383
|
+
error: result.error || 'Failed to submit auth code',
|
|
384
|
+
needsRestart: result.needsRestart,
|
|
385
|
+
},
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
return { status: 200, body: { success: true, message: 'Auth code submitted' } };
|
|
389
|
+
});
|
|
390
|
+
// Complete auth and wait for credentials
|
|
391
|
+
this.routes.set('POST /auth/cli/:provider/complete/:sessionId', async (req) => {
|
|
392
|
+
const { sessionId } = req.params;
|
|
393
|
+
const { authCode, state } = req.body;
|
|
394
|
+
// For Codex, we need to forward the authCode to the CLI's callback server
|
|
395
|
+
// The Codex CLI starts a callback server at localhost:1455
|
|
396
|
+
if (authCode) {
|
|
397
|
+
try {
|
|
398
|
+
// Forward the OAuth callback to the Codex CLI's callback server
|
|
399
|
+
const callbackUrl = `http://localhost:1455/auth/callback?code=${encodeURIComponent(authCode)}${state ? `&state=${encodeURIComponent(state)}` : ''}`;
|
|
400
|
+
logger.info('Forwarding OAuth callback to Codex CLI', { callbackUrl: callbackUrl.replace(authCode, '[REDACTED]') });
|
|
401
|
+
const callbackResponse = await fetch(callbackUrl, {
|
|
402
|
+
signal: AbortSignal.timeout(5000),
|
|
403
|
+
});
|
|
404
|
+
if (!callbackResponse.ok) {
|
|
405
|
+
logger.error('Failed to forward callback to Codex CLI', { status: callbackResponse.status });
|
|
406
|
+
return {
|
|
407
|
+
status: 400,
|
|
408
|
+
body: {
|
|
409
|
+
error: 'Failed to deliver OAuth callback to Codex CLI. The CLI may have timed out.',
|
|
410
|
+
needsRestart: true,
|
|
411
|
+
},
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
logger.info('Successfully forwarded OAuth callback to Codex CLI');
|
|
415
|
+
}
|
|
416
|
+
catch (err) {
|
|
417
|
+
logger.error('Error forwarding callback to Codex CLI', { error: String(err) });
|
|
418
|
+
return {
|
|
419
|
+
status: 500,
|
|
420
|
+
body: {
|
|
421
|
+
error: 'Failed to reach Codex CLI callback server. The CLI may not be running.',
|
|
422
|
+
needsRestart: true,
|
|
423
|
+
},
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
// Wait for credentials to be available (polls for up to 15 seconds)
|
|
428
|
+
const { completeAuthSession } = await import('./cli-auth.js');
|
|
429
|
+
const completeResult = await completeAuthSession(sessionId);
|
|
430
|
+
if (!completeResult.success) {
|
|
431
|
+
return {
|
|
432
|
+
status: 400,
|
|
433
|
+
body: {
|
|
434
|
+
error: completeResult.error || 'Authentication failed',
|
|
435
|
+
},
|
|
436
|
+
};
|
|
437
|
+
}
|
|
438
|
+
return { status: 200, body: { success: true, token: completeResult.token } };
|
|
439
|
+
});
|
|
320
440
|
// Cancel auth session
|
|
321
441
|
this.routes.set('POST /auth/cli/:provider/cancel/:sessionId', async (req) => {
|
|
322
442
|
const { sessionId } = req.params;
|
|
@@ -326,6 +446,89 @@ export class DaemonApi extends EventEmitter {
|
|
|
326
446
|
}
|
|
327
447
|
return { status: 200, body: { success: true } };
|
|
328
448
|
});
|
|
449
|
+
// Check if provider is authenticated (credentials exist)
|
|
450
|
+
this.routes.set('GET /auth/cli/:provider/check', async (req) => {
|
|
451
|
+
const { provider } = req.params;
|
|
452
|
+
const { checkProviderAuth } = await import('./cli-auth.js');
|
|
453
|
+
const authenticated = await checkProviderAuth(provider);
|
|
454
|
+
return { status: 200, body: { authenticated } };
|
|
455
|
+
});
|
|
456
|
+
// === Repository Management ===
|
|
457
|
+
// Dynamic repo management without workspace restart
|
|
458
|
+
// List all repos
|
|
459
|
+
this.routes.set('GET /repos', async () => {
|
|
460
|
+
try {
|
|
461
|
+
const repoManager = getRepoManager();
|
|
462
|
+
const repos = repoManager.getRepos();
|
|
463
|
+
return { status: 200, body: { repos } };
|
|
464
|
+
}
|
|
465
|
+
catch (err) {
|
|
466
|
+
logger.error('Failed to list repos', { error: String(err) });
|
|
467
|
+
return { status: 500, body: { error: 'Failed to list repositories' } };
|
|
468
|
+
}
|
|
469
|
+
});
|
|
470
|
+
// Get a specific repo
|
|
471
|
+
this.routes.set('GET /repos/:name', async (req) => {
|
|
472
|
+
try {
|
|
473
|
+
const repoManager = getRepoManager();
|
|
474
|
+
// Handle encoded slashes (e.g., "owner%2Frepo" -> "owner/repo")
|
|
475
|
+
const fullName = decodeURIComponent(req.params.name);
|
|
476
|
+
const repo = repoManager.getRepo(fullName);
|
|
477
|
+
if (!repo) {
|
|
478
|
+
return { status: 404, body: { error: 'Repository not found' } };
|
|
479
|
+
}
|
|
480
|
+
return { status: 200, body: repo };
|
|
481
|
+
}
|
|
482
|
+
catch (err) {
|
|
483
|
+
logger.error('Failed to get repo', { error: String(err) });
|
|
484
|
+
return { status: 500, body: { error: 'Failed to get repository' } };
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
// Sync (clone or update) a repo
|
|
488
|
+
this.routes.set('POST /repos/sync', async (req) => {
|
|
489
|
+
const body = req.body;
|
|
490
|
+
// Support single repo or batch
|
|
491
|
+
const reposToSync = [];
|
|
492
|
+
if (body.repo) {
|
|
493
|
+
reposToSync.push(body.repo);
|
|
494
|
+
}
|
|
495
|
+
if (body.repos && Array.isArray(body.repos)) {
|
|
496
|
+
reposToSync.push(...body.repos);
|
|
497
|
+
}
|
|
498
|
+
if (reposToSync.length === 0) {
|
|
499
|
+
return { status: 400, body: { error: 'repo or repos field is required' } };
|
|
500
|
+
}
|
|
501
|
+
try {
|
|
502
|
+
const repoManager = getRepoManager();
|
|
503
|
+
const results = await repoManager.syncRepos(reposToSync);
|
|
504
|
+
const allSuccess = results.every(r => r.success);
|
|
505
|
+
return {
|
|
506
|
+
status: allSuccess ? 200 : 207, // 207 Multi-Status if partial success
|
|
507
|
+
body: { results },
|
|
508
|
+
};
|
|
509
|
+
}
|
|
510
|
+
catch (err) {
|
|
511
|
+
logger.error('Failed to sync repos', { error: String(err) });
|
|
512
|
+
return { status: 500, body: { error: 'Failed to sync repositories' } };
|
|
513
|
+
}
|
|
514
|
+
});
|
|
515
|
+
// Remove a repo
|
|
516
|
+
this.routes.set('DELETE /repos/:name', async (req) => {
|
|
517
|
+
try {
|
|
518
|
+
const repoManager = getRepoManager();
|
|
519
|
+
const fullName = decodeURIComponent(req.params.name);
|
|
520
|
+
const deleteFiles = req.query.deleteFiles === 'true';
|
|
521
|
+
const removed = await repoManager.removeRepo(fullName, deleteFiles);
|
|
522
|
+
if (!removed) {
|
|
523
|
+
return { status: 404, body: { error: 'Repository not found' } };
|
|
524
|
+
}
|
|
525
|
+
return { status: 200, body: { success: true, deleted: deleteFiles } };
|
|
526
|
+
}
|
|
527
|
+
catch (err) {
|
|
528
|
+
logger.error('Failed to remove repo', { error: String(err) });
|
|
529
|
+
return { status: 500, body: { error: 'Failed to remove repository' } };
|
|
530
|
+
}
|
|
531
|
+
});
|
|
329
532
|
}
|
|
330
533
|
/**
|
|
331
534
|
* Handle HTTP request
|
|
@@ -461,6 +664,12 @@ export class DaemonApi extends EventEmitter {
|
|
|
461
664
|
*/
|
|
462
665
|
handleWebSocketConnection(ws, req) {
|
|
463
666
|
logger.info('WebSocket client connected', { url: req.url });
|
|
667
|
+
// Mark client as alive for ping/pong keepalive
|
|
668
|
+
this.clientAlive.set(ws, true);
|
|
669
|
+
// Handle pong responses
|
|
670
|
+
ws.on('pong', () => {
|
|
671
|
+
this.clientAlive.set(ws, true);
|
|
672
|
+
});
|
|
464
673
|
// Create session
|
|
465
674
|
const session = {
|
|
466
675
|
userId: 'anonymous', // Would be set from auth
|
|
@@ -20,6 +20,10 @@ interface AuthSession {
|
|
|
20
20
|
refreshToken?: string;
|
|
21
21
|
tokenExpiresAt?: Date;
|
|
22
22
|
error?: string;
|
|
23
|
+
/** User-friendly hint for resolving the error */
|
|
24
|
+
errorHint?: string;
|
|
25
|
+
/** Whether the error can be resolved by retrying */
|
|
26
|
+
recoverable?: boolean;
|
|
23
27
|
output: string;
|
|
24
28
|
promptsHandled: string[];
|
|
25
29
|
createdAt: Date;
|
|
@@ -44,9 +48,12 @@ export declare function getAuthSession(sessionId: string): AuthSession | null;
|
|
|
44
48
|
* Submit auth code to a waiting session
|
|
45
49
|
* This writes the code to the PTY process stdin
|
|
46
50
|
*
|
|
51
|
+
* @param sessionId - The auth session ID
|
|
52
|
+
* @param code - The OAuth authorization code
|
|
53
|
+
* @param state - Optional OAuth state parameter for CSRF validation (used by Codex)
|
|
47
54
|
* @returns Object with success status and optional error message
|
|
48
55
|
*/
|
|
49
|
-
export declare function submitAuthCode(sessionId: string, code: string): Promise<{
|
|
56
|
+
export declare function submitAuthCode(sessionId: string, code: string, state?: string): Promise<{
|
|
50
57
|
success: boolean;
|
|
51
58
|
error?: string;
|
|
52
59
|
needsRestart?: boolean;
|
|
@@ -64,4 +71,9 @@ export declare function completeAuthSession(sessionId: string): Promise<{
|
|
|
64
71
|
* Cancel auth session
|
|
65
72
|
*/
|
|
66
73
|
export declare function cancelAuthSession(sessionId: string): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Check if a provider is authenticated (credentials exist)
|
|
76
|
+
* Used by the auth check endpoint for SSH tunnel flow
|
|
77
|
+
*/
|
|
78
|
+
export declare function checkProviderAuth(provider: string): Promise<boolean>;
|
|
67
79
|
//# sourceMappingURL=cli-auth.d.ts.map
|