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,508 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
log() {
|
|
6
|
+
echo "[workspace] $*"
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
# Fix volume permissions and drop to workspace user if running as root
|
|
10
|
+
if [[ "$(id -u)" == "0" ]]; then
|
|
11
|
+
# Fix /data and /workspace permissions before dropping privileges
|
|
12
|
+
# Fresh Fly.io volumes are root-owned, need to chown for workspace user
|
|
13
|
+
log "Fixing volume permissions..."
|
|
14
|
+
chown -R workspace:workspace /data /workspace 2>/dev/null || true
|
|
15
|
+
|
|
16
|
+
# ============================================================================
|
|
17
|
+
# SSH Server Setup (for CLI tunneling - Codex OAuth callback forwarding)
|
|
18
|
+
# When ENABLE_SSH=true, start SSH server on port 2222 for secure tunneling
|
|
19
|
+
# ============================================================================
|
|
20
|
+
if [[ "${ENABLE_SSH:-false}" == "true" ]]; then
|
|
21
|
+
log "Starting SSH server on port 2222..."
|
|
22
|
+
|
|
23
|
+
# Set SSH password for workspace user
|
|
24
|
+
SSH_PASS="${SSH_PASSWORD:-devpassword}"
|
|
25
|
+
echo "workspace:${SSH_PASS}" | chpasswd
|
|
26
|
+
|
|
27
|
+
# Configure SSH server for tunneling
|
|
28
|
+
# - Allow password auth (for CLI simplicity)
|
|
29
|
+
# - Listen on port 2222 (non-privileged)
|
|
30
|
+
# - Allow TCP forwarding (for port tunneling)
|
|
31
|
+
cat > /etc/ssh/sshd_config.d/workspace.conf <<SSHEOF
|
|
32
|
+
Port 2222
|
|
33
|
+
PasswordAuthentication yes
|
|
34
|
+
PermitRootLogin no
|
|
35
|
+
AllowUsers workspace
|
|
36
|
+
AllowTcpForwarding yes
|
|
37
|
+
GatewayPorts no
|
|
38
|
+
X11Forwarding no
|
|
39
|
+
SSHEOF
|
|
40
|
+
|
|
41
|
+
# Start SSH server in background
|
|
42
|
+
/usr/sbin/sshd -e
|
|
43
|
+
log "SSH server started (port 2222, user: workspace)"
|
|
44
|
+
fi
|
|
45
|
+
|
|
46
|
+
# ============================================================================
|
|
47
|
+
# Persist workspace environment for SSH sessions (must be done as root)
|
|
48
|
+
# SSH sessions don't inherit the container's runtime environment, so we write
|
|
49
|
+
# critical variables to /etc/profile.d/ which gets sourced by login shells
|
|
50
|
+
# ============================================================================
|
|
51
|
+
if [[ -n "${CLOUD_API_URL:-}" || -n "${WORKSPACE_ID:-}" ]]; then
|
|
52
|
+
log "Persisting workspace environment for SSH sessions"
|
|
53
|
+
# Compute HOME path for the env file
|
|
54
|
+
_DATA_DIR="${AGENT_RELAY_DATA_DIR:-/data}"
|
|
55
|
+
if [[ -n "${WORKSPACE_OWNER_USER_ID:-}" ]]; then
|
|
56
|
+
_USER_HOME="${_DATA_DIR}/users/${WORKSPACE_OWNER_USER_ID}"
|
|
57
|
+
else
|
|
58
|
+
_USER_HOME="/home/workspace"
|
|
59
|
+
fi
|
|
60
|
+
cat > /etc/profile.d/workspace-env.sh <<ENVEOF
|
|
61
|
+
# Workspace environment variables (auto-generated by entrypoint.sh)
|
|
62
|
+
export WORKSPACE_ID="${WORKSPACE_ID:-}"
|
|
63
|
+
export WORKSPACE_OWNER_USER_ID="${WORKSPACE_OWNER_USER_ID:-}"
|
|
64
|
+
export CLOUD_API_URL="${CLOUD_API_URL:-}"
|
|
65
|
+
export WORKSPACE_TOKEN="${WORKSPACE_TOKEN:-}"
|
|
66
|
+
export WORKSPACE_DIR="${WORKSPACE_DIR:-/workspace}"
|
|
67
|
+
export HOME="${_USER_HOME}"
|
|
68
|
+
export AGENT_RELAY_USER_ID="${WORKSPACE_OWNER_USER_ID:-}"
|
|
69
|
+
export AGENT_RELAY_DATA_DIR="${_DATA_DIR}"
|
|
70
|
+
ENVEOF
|
|
71
|
+
chmod 644 /etc/profile.d/workspace-env.sh
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
log "Dropping privileges to workspace user..."
|
|
75
|
+
exec gosu workspace "$0" "$@"
|
|
76
|
+
fi
|
|
77
|
+
|
|
78
|
+
PORT="${AGENT_RELAY_DASHBOARD_PORT:-${PORT:-3888}}"
|
|
79
|
+
export AGENT_RELAY_DASHBOARD_PORT="${PORT}"
|
|
80
|
+
export PORT="${PORT}"
|
|
81
|
+
|
|
82
|
+
# Disable auto-updates for AI CLIs in container environments
|
|
83
|
+
# Prevents permission errors when CLIs try to self-update with npm/pip
|
|
84
|
+
export DISABLE_AUTOUPDATER=1
|
|
85
|
+
# Belt-and-suspenders flags to block Codex/OpenAI update checks
|
|
86
|
+
export CODEX_CHECK_FOR_UPDATES=false
|
|
87
|
+
export CODEX_DISABLE_AUTOUPDATE=1
|
|
88
|
+
export OPENAI_CLI_NO_UPDATE=1
|
|
89
|
+
export NO_UPDATE_NOTIFIER=1
|
|
90
|
+
export NPM_CONFIG_UPDATE_NOTIFIER=false
|
|
91
|
+
log "Auto-updates disabled for AI CLIs (container environment)"
|
|
92
|
+
|
|
93
|
+
# ============================================================================
|
|
94
|
+
# Per-user credential storage setup
|
|
95
|
+
# Create user-specific HOME on persistent volume (/data)
|
|
96
|
+
# This enables multi-user workspaces where each user has their own credentials
|
|
97
|
+
# ============================================================================
|
|
98
|
+
DATA_DIR="${AGENT_RELAY_DATA_DIR:-/data}"
|
|
99
|
+
if [[ -n "${WORKSPACE_OWNER_USER_ID:-}" ]]; then
|
|
100
|
+
USER_HOME="${DATA_DIR}/users/${WORKSPACE_OWNER_USER_ID}"
|
|
101
|
+
log "Setting up per-user HOME at ${USER_HOME}"
|
|
102
|
+
mkdir -p "${USER_HOME}"
|
|
103
|
+
mkdir -p "${USER_HOME}/.claude"
|
|
104
|
+
mkdir -p "${USER_HOME}/.codex"
|
|
105
|
+
mkdir -p "${USER_HOME}/.config/gcloud"
|
|
106
|
+
mkdir -p "${USER_HOME}/.config/gh"
|
|
107
|
+
export HOME="${USER_HOME}"
|
|
108
|
+
# Ensure user-local bin is on PATH for per-user shims/wrappers
|
|
109
|
+
export PATH="${HOME}/.local/bin:${PATH}"
|
|
110
|
+
export XDG_CONFIG_HOME="${USER_HOME}/.config"
|
|
111
|
+
export AGENT_RELAY_USER_ID="${WORKSPACE_OWNER_USER_ID}"
|
|
112
|
+
log "HOME set to ${HOME} (user: ${WORKSPACE_OWNER_USER_ID})"
|
|
113
|
+
else
|
|
114
|
+
log "No WORKSPACE_OWNER_USER_ID set, using default HOME: ${HOME}"
|
|
115
|
+
fi
|
|
116
|
+
|
|
117
|
+
WORKSPACE_DIR="${WORKSPACE_DIR:-/workspace}"
|
|
118
|
+
REPO_LIST="${REPOSITORIES:-}"
|
|
119
|
+
|
|
120
|
+
mkdir -p "${WORKSPACE_DIR}"
|
|
121
|
+
cd "${WORKSPACE_DIR}"
|
|
122
|
+
|
|
123
|
+
# Configure Git credentials via the gateway (tokens auto-refresh via Nango)
|
|
124
|
+
# The credential helper fetches fresh tokens from the cloud API on each git operation
|
|
125
|
+
if [[ -n "${CLOUD_API_URL:-}" && -n "${WORKSPACE_ID:-}" && -n "${WORKSPACE_TOKEN:-}" ]]; then
|
|
126
|
+
log "Configuring git credential helper (gateway mode)"
|
|
127
|
+
git config --global credential.helper "/usr/local/bin/git-credential-relay"
|
|
128
|
+
git config --global credential.useHttpPath true
|
|
129
|
+
export GIT_TERMINAL_PROMPT=0
|
|
130
|
+
|
|
131
|
+
# Configure git identity for commits
|
|
132
|
+
# Use env vars if set, otherwise default to "Agent Relay" / "agent@agent-relay.com"
|
|
133
|
+
DEFAULT_GIT_EMAIL="${AGENT_NAME:-agent}@agent-relay.com"
|
|
134
|
+
git config --global user.name "${GIT_USER_NAME:-Agent Relay}"
|
|
135
|
+
git config --global user.email "${GIT_USER_EMAIL:-${DEFAULT_GIT_EMAIL}}"
|
|
136
|
+
log "Git identity configured: ${GIT_USER_NAME:-Agent Relay} <${GIT_USER_EMAIL:-${DEFAULT_GIT_EMAIL}}>"
|
|
137
|
+
|
|
138
|
+
# Configure gh CLI to use the same token mechanism
|
|
139
|
+
# gh auth login expects a token via stdin or GH_TOKEN env var
|
|
140
|
+
# We'll set up a wrapper that fetches fresh tokens
|
|
141
|
+
mkdir -p "${HOME}/.config/gh"
|
|
142
|
+
cat > "${HOME}/.config/gh/hosts.yml" <<EOF
|
|
143
|
+
github.com:
|
|
144
|
+
oauth_token: placeholder
|
|
145
|
+
git_protocol: https
|
|
146
|
+
EOF
|
|
147
|
+
|
|
148
|
+
# Create gh token wrapper script
|
|
149
|
+
# Uses userToken (OAuth) for gh CLI, not installation token
|
|
150
|
+
cat > "/tmp/gh-token-helper.sh" <<'GHEOF'
|
|
151
|
+
#!/usr/bin/env bash
|
|
152
|
+
# Fetch fresh user OAuth token for gh CLI
|
|
153
|
+
response=$(curl -sf \
|
|
154
|
+
-H "Authorization: Bearer ${WORKSPACE_TOKEN}" \
|
|
155
|
+
"${CLOUD_API_URL}/api/git/token?workspaceId=${WORKSPACE_ID}" 2>/dev/null)
|
|
156
|
+
if [[ -n "$response" ]]; then
|
|
157
|
+
# Prefer userToken (OAuth) for gh CLI, fall back to installation token
|
|
158
|
+
user_token=$(echo "$response" | jq -r '.userToken // empty')
|
|
159
|
+
if [[ -n "$user_token" && "$user_token" != "null" ]]; then
|
|
160
|
+
echo "$user_token"
|
|
161
|
+
else
|
|
162
|
+
echo "$response" | jq -r '.token // empty'
|
|
163
|
+
fi
|
|
164
|
+
fi
|
|
165
|
+
GHEOF
|
|
166
|
+
chmod +x "/tmp/gh-token-helper.sh"
|
|
167
|
+
|
|
168
|
+
# Create gh wrapper that auto-refreshes token on each invocation
|
|
169
|
+
# This ensures gh always has a valid token without agents needing to do anything
|
|
170
|
+
GH_REAL=$(which gh 2>/dev/null || echo "/usr/bin/gh")
|
|
171
|
+
if [[ -x "${GH_REAL}" ]]; then
|
|
172
|
+
cat > "/tmp/gh-wrapper" <<GHWRAPPER
|
|
173
|
+
#!/usr/bin/env bash
|
|
174
|
+
# Auto-refreshing gh wrapper - fetches fresh token on each invocation
|
|
175
|
+
export GH_TOKEN=\$(/tmp/gh-token-helper.sh 2>/dev/null)
|
|
176
|
+
if [[ -z "\${GH_TOKEN}" ]]; then
|
|
177
|
+
echo "gh-wrapper: Failed to fetch GitHub token" >&2
|
|
178
|
+
echo "gh-wrapper: Check CLOUD_API_URL, WORKSPACE_ID, and WORKSPACE_TOKEN are set" >&2
|
|
179
|
+
exit 1
|
|
180
|
+
fi
|
|
181
|
+
exec "${GH_REAL}" "\$@"
|
|
182
|
+
GHWRAPPER
|
|
183
|
+
chmod +x "/tmp/gh-wrapper"
|
|
184
|
+
|
|
185
|
+
# Create symlink or copy to override the real gh
|
|
186
|
+
# We use /usr/local/bin which comes before /usr/bin in PATH
|
|
187
|
+
if [[ -w "/usr/local/bin" ]]; then
|
|
188
|
+
cp "/tmp/gh-wrapper" "/usr/local/bin/gh"
|
|
189
|
+
log "Installed auto-refreshing gh wrapper to /usr/local/bin/gh"
|
|
190
|
+
else
|
|
191
|
+
# If we can't write to /usr/local/bin, add /tmp to PATH
|
|
192
|
+
export PATH="/tmp:${PATH}"
|
|
193
|
+
mv "/tmp/gh-wrapper" "/tmp/gh"
|
|
194
|
+
log "Added auto-refreshing gh wrapper to PATH"
|
|
195
|
+
fi
|
|
196
|
+
fi
|
|
197
|
+
|
|
198
|
+
# Also set GH_TOKEN at startup for any tools that read it directly
|
|
199
|
+
# (The wrapper handles runtime refresh, this is just for initialization)
|
|
200
|
+
export GH_TOKEN=""
|
|
201
|
+
for attempt in 1 2 3; do
|
|
202
|
+
GH_TOKEN=$(/tmp/gh-token-helper.sh 2>/dev/null || echo "")
|
|
203
|
+
if [[ -n "${GH_TOKEN}" ]]; then
|
|
204
|
+
break
|
|
205
|
+
fi
|
|
206
|
+
sleep 1
|
|
207
|
+
done
|
|
208
|
+
if [[ -n "${GH_TOKEN}" ]]; then
|
|
209
|
+
log "GitHub CLI configured with fresh token"
|
|
210
|
+
else
|
|
211
|
+
log "WARN: Could not fetch initial GitHub token for gh CLI"
|
|
212
|
+
fi
|
|
213
|
+
|
|
214
|
+
# Fallback: Use static GITHUB_TOKEN if provided (legacy mode)
|
|
215
|
+
elif [[ -n "${GITHUB_TOKEN:-}" ]]; then
|
|
216
|
+
log "Configuring git credentials (legacy static token mode)"
|
|
217
|
+
GIT_ASKPASS_SCRIPT="/tmp/git-askpass.sh"
|
|
218
|
+
cat > "${GIT_ASKPASS_SCRIPT}" <<'EOF'
|
|
219
|
+
#!/usr/bin/env bash
|
|
220
|
+
prompt="${1:-}"
|
|
221
|
+
if [[ "${prompt}" == *"Username"* ]]; then
|
|
222
|
+
echo "x-access-token"
|
|
223
|
+
else
|
|
224
|
+
echo "${GITHUB_TOKEN}"
|
|
225
|
+
fi
|
|
226
|
+
EOF
|
|
227
|
+
chmod +x "${GIT_ASKPASS_SCRIPT}"
|
|
228
|
+
export GIT_ASKPASS="${GIT_ASKPASS_SCRIPT}"
|
|
229
|
+
export GIT_TERMINAL_PROMPT=0
|
|
230
|
+
export GH_TOKEN="${GITHUB_TOKEN}"
|
|
231
|
+
|
|
232
|
+
# Configure git identity for commits
|
|
233
|
+
DEFAULT_GIT_EMAIL="${AGENT_NAME:-agent}@agent-relay.com"
|
|
234
|
+
git config --global user.name "${GIT_USER_NAME:-Agent Relay}"
|
|
235
|
+
git config --global user.email "${GIT_USER_EMAIL:-${DEFAULT_GIT_EMAIL}}"
|
|
236
|
+
log "Git identity configured: ${GIT_USER_NAME:-Agent Relay} <${GIT_USER_EMAIL:-${DEFAULT_GIT_EMAIL}}>"
|
|
237
|
+
fi
|
|
238
|
+
|
|
239
|
+
clone_or_update_repo() {
|
|
240
|
+
local repo="$1"
|
|
241
|
+
repo="${repo// /}"
|
|
242
|
+
if [[ -z "${repo}" ]]; then
|
|
243
|
+
return
|
|
244
|
+
fi
|
|
245
|
+
|
|
246
|
+
local repo_name
|
|
247
|
+
repo_name="$(basename "${repo}")"
|
|
248
|
+
local target="${WORKSPACE_DIR}/${repo_name}"
|
|
249
|
+
local url="https://github.com/${repo}.git"
|
|
250
|
+
|
|
251
|
+
if [[ -d "${target}/.git" ]]; then
|
|
252
|
+
log "Updating ${repo}..."
|
|
253
|
+
git -C "${target}" remote set-url origin "${url}" >/dev/null 2>&1 || true
|
|
254
|
+
git -C "${target}" fetch --all --prune >/dev/null 2>&1 || true
|
|
255
|
+
git -C "${target}" pull --ff-only >/dev/null 2>&1 || true
|
|
256
|
+
else
|
|
257
|
+
log "Cloning ${repo}..."
|
|
258
|
+
git clone "${url}" "${target}" >/dev/null 2>&1 || {
|
|
259
|
+
log "WARN: Failed to clone ${repo}"
|
|
260
|
+
}
|
|
261
|
+
fi
|
|
262
|
+
|
|
263
|
+
# Mark directory as safe to prevent "dubious ownership" errors
|
|
264
|
+
# This is needed when git runs as a different user (e.g., root via SSH)
|
|
265
|
+
if [[ -d "${target}/.git" ]]; then
|
|
266
|
+
git config --global --add safe.directory "${target}" 2>/dev/null || true
|
|
267
|
+
fi
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
if [[ -n "${REPO_LIST}" ]]; then
|
|
271
|
+
# Check if we have credentials configured (gateway mode or static token)
|
|
272
|
+
if [[ -z "${GITHUB_TOKEN:-}" && -z "${CLOUD_API_URL:-}" ]]; then
|
|
273
|
+
log "WARN: REPOSITORIES set but no credentials configured; clones may fail."
|
|
274
|
+
fi
|
|
275
|
+
|
|
276
|
+
IFS=',' read -ra repos <<< "${REPO_LIST}"
|
|
277
|
+
for repo in "${repos[@]}"; do
|
|
278
|
+
clone_or_update_repo "${repo}"
|
|
279
|
+
done
|
|
280
|
+
fi
|
|
281
|
+
|
|
282
|
+
# ============================================================================
|
|
283
|
+
# Configure agent policy enforcement for cloud workspaces
|
|
284
|
+
# Policy is fetched from cloud API and enforced at runtime
|
|
285
|
+
# ============================================================================
|
|
286
|
+
|
|
287
|
+
if [[ -n "${CLOUD_API_URL:-}" && -n "${WORKSPACE_ID:-}" ]]; then
|
|
288
|
+
log "Enabling agent policy enforcement"
|
|
289
|
+
export AGENT_POLICY_ENFORCEMENT=1
|
|
290
|
+
# Policy is fetched from ${CLOUD_API_URL}/api/policy/${WORKSPACE_ID}/internal
|
|
291
|
+
fi
|
|
292
|
+
|
|
293
|
+
# ============================================================================
|
|
294
|
+
# Configure AI provider credentials
|
|
295
|
+
# Create credential files that CLIs expect from ENV vars passed by provisioner
|
|
296
|
+
# ============================================================================
|
|
297
|
+
|
|
298
|
+
# Claude CLI expects ~/.claude/.credentials.json (note the dot prefix on filename)
|
|
299
|
+
# Format: { claudeAiOauth: { accessToken: "...", refreshToken: "...", expiresAt: ... } }
|
|
300
|
+
if [[ -n "${ANTHROPIC_TOKEN:-}" ]]; then
|
|
301
|
+
log "Configuring Claude credentials..."
|
|
302
|
+
mkdir -p "${HOME}/.claude"
|
|
303
|
+
cat > "${HOME}/.claude/.credentials.json" <<EOF
|
|
304
|
+
{
|
|
305
|
+
"claudeAiOauth": {
|
|
306
|
+
"accessToken": "${ANTHROPIC_TOKEN}",
|
|
307
|
+
"refreshToken": "${ANTHROPIC_REFRESH_TOKEN:-}",
|
|
308
|
+
"expiresAt": ${ANTHROPIC_TOKEN_EXPIRES_AT:-null}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
EOF
|
|
312
|
+
chmod 600 "${HOME}/.claude/.credentials.json"
|
|
313
|
+
fi
|
|
314
|
+
|
|
315
|
+
# Configure Claude Code for cloud workspaces
|
|
316
|
+
# Create both settings and instructions files
|
|
317
|
+
log "Configuring Claude Code for cloud workspace..."
|
|
318
|
+
mkdir -p "${HOME}/.claude"
|
|
319
|
+
|
|
320
|
+
# Create settings.json to auto-accept permissions (required for cloud workspaces)
|
|
321
|
+
# This tells Claude Code to skip the "Ready to code here?" permission prompt
|
|
322
|
+
# Reference: Claude Code uses this for headless/automated environments
|
|
323
|
+
cat > "${HOME}/.claude/settings.json" <<'SETTINGSEOF'
|
|
324
|
+
{
|
|
325
|
+
"permissions": {
|
|
326
|
+
"allow": [
|
|
327
|
+
"Read",
|
|
328
|
+
"Edit",
|
|
329
|
+
"Write",
|
|
330
|
+
"Bash",
|
|
331
|
+
"Glob",
|
|
332
|
+
"Grep",
|
|
333
|
+
"Task",
|
|
334
|
+
"WebFetch",
|
|
335
|
+
"WebSearch",
|
|
336
|
+
"NotebookEdit",
|
|
337
|
+
"TodoWrite"
|
|
338
|
+
],
|
|
339
|
+
"deny": []
|
|
340
|
+
},
|
|
341
|
+
"autoApproveApiRequest": true
|
|
342
|
+
}
|
|
343
|
+
SETTINGSEOF
|
|
344
|
+
chmod 600 "${HOME}/.claude/settings.json"
|
|
345
|
+
log "Created Claude Code settings (auto-approve enabled)"
|
|
346
|
+
|
|
347
|
+
# Create CLAUDE.md with agent relay protocol instructions
|
|
348
|
+
# This is loaded automatically by Claude Code and provides the relay protocol
|
|
349
|
+
if [[ -f "/app/docs/agent-relay-snippet.md" ]]; then
|
|
350
|
+
cp "/app/docs/agent-relay-snippet.md" "${HOME}/.claude/CLAUDE.md"
|
|
351
|
+
log "Copied relay protocol from /app/docs/agent-relay-snippet.md"
|
|
352
|
+
else
|
|
353
|
+
# Fallback: create minimal instructions
|
|
354
|
+
log "WARN: /app/docs/agent-relay-snippet.md not found, creating minimal instructions"
|
|
355
|
+
cat > "${HOME}/.claude/CLAUDE.md" <<'RELAYEOF'
|
|
356
|
+
# Agent Relay
|
|
357
|
+
|
|
358
|
+
Real-time agent-to-agent messaging. Output `->relay:` patterns to communicate.
|
|
359
|
+
|
|
360
|
+
## Sending Messages
|
|
361
|
+
|
|
362
|
+
Use fenced format for reliable delivery:
|
|
363
|
+
```
|
|
364
|
+
->relay:AgentName <<<
|
|
365
|
+
Your message here.>>>
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
Broadcast to all: `->relay:* <<<message>>>`
|
|
369
|
+
|
|
370
|
+
## Protocol
|
|
371
|
+
|
|
372
|
+
1. ACK immediately when you receive a task
|
|
373
|
+
2. Do the work
|
|
374
|
+
3. Send DONE: summary when complete
|
|
375
|
+
|
|
376
|
+
## Session Persistence
|
|
377
|
+
|
|
378
|
+
Output periodically to checkpoint progress:
|
|
379
|
+
```
|
|
380
|
+
[[SUMMARY]]{"currentTask":"...","completedTasks":[...],"context":"..."}[[/SUMMARY]]
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
When session is complete:
|
|
384
|
+
```
|
|
385
|
+
[[SESSION_END]]{"summary":"...","completedTasks":[...]}[[/SESSION_END]]
|
|
386
|
+
```
|
|
387
|
+
RELAYEOF
|
|
388
|
+
fi
|
|
389
|
+
log "Claude Code configuration complete"
|
|
390
|
+
|
|
391
|
+
# Codex CLI settings (always install config to disable auto-updates)
|
|
392
|
+
mkdir -p "${HOME}/.codex"
|
|
393
|
+
if [[ -f "/app/deploy/workspace/codex.config.toml" ]]; then
|
|
394
|
+
cp "/app/deploy/workspace/codex.config.toml" "${HOME}/.codex/config.toml"
|
|
395
|
+
chmod 600 "${HOME}/.codex/config.toml"
|
|
396
|
+
log "Codex configuration applied from codex.config.toml"
|
|
397
|
+
else
|
|
398
|
+
# Fallback: create minimal config (should not happen in production)
|
|
399
|
+
log "WARN: codex.config.toml not found, creating minimal config"
|
|
400
|
+
cat > "${HOME}/.codex/config.toml" <<CODEXCONFIGEOF
|
|
401
|
+
check_for_updates = false
|
|
402
|
+
CODEXCONFIGEOF
|
|
403
|
+
chmod 600 "${HOME}/.codex/config.toml"
|
|
404
|
+
fi
|
|
405
|
+
# Also create JSON config for Codex (some versions read config.json instead of config.toml)
|
|
406
|
+
cat > "${HOME}/.codex/config.json" <<'CODEXJSON'
|
|
407
|
+
{
|
|
408
|
+
"check_for_updates": false
|
|
409
|
+
}
|
|
410
|
+
CODEXJSON
|
|
411
|
+
chmod 600 "${HOME}/.codex/config.json"
|
|
412
|
+
|
|
413
|
+
# NPM wrapper to block Codex self-updates (no-op when Codex tries npm install -g @openai/codex)
|
|
414
|
+
mkdir -p "${HOME}/.local/bin"
|
|
415
|
+
cat > "${HOME}/.local/bin/npm" <<'NPMWRAPPER'
|
|
416
|
+
#!/usr/bin/env bash
|
|
417
|
+
if [[ "$1" == "install" && "$2" == "-g" && "$3" == @openai/codex* ]]; then
|
|
418
|
+
echo "npm wrapper: skipping Codex self-update (auto-update disabled)" >&2
|
|
419
|
+
exit 0
|
|
420
|
+
fi
|
|
421
|
+
exec /usr/local/bin/npm "$@"
|
|
422
|
+
NPMWRAPPER
|
|
423
|
+
chmod +x "${HOME}/.local/bin/npm"
|
|
424
|
+
|
|
425
|
+
# Codex CLI expects ~/.codex/auth.json for credentials
|
|
426
|
+
# Format: { tokens: { access_token: "...", refresh_token: "...", ... } }
|
|
427
|
+
if [[ -n "${OPENAI_TOKEN:-}" ]]; then
|
|
428
|
+
log "Configuring Codex credentials..."
|
|
429
|
+
cat > "${HOME}/.codex/auth.json" <<EOF
|
|
430
|
+
{
|
|
431
|
+
"tokens": {
|
|
432
|
+
"access_token": "${OPENAI_TOKEN}",
|
|
433
|
+
"refresh_token": "${OPENAI_REFRESH_TOKEN:-}"
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
EOF
|
|
437
|
+
chmod 600 "${HOME}/.codex/auth.json"
|
|
438
|
+
fi
|
|
439
|
+
|
|
440
|
+
# Google/Gemini - uses application default credentials
|
|
441
|
+
if [[ -n "${GOOGLE_TOKEN:-}" ]]; then
|
|
442
|
+
log "Configuring Google credentials..."
|
|
443
|
+
mkdir -p "${HOME}/.config/gcloud"
|
|
444
|
+
cat > "${HOME}/.config/gcloud/application_default_credentials.json" <<EOF
|
|
445
|
+
{
|
|
446
|
+
"type": "authorized_user",
|
|
447
|
+
"access_token": "${GOOGLE_TOKEN}"
|
|
448
|
+
}
|
|
449
|
+
EOF
|
|
450
|
+
chmod 600 "${HOME}/.config/gcloud/application_default_credentials.json"
|
|
451
|
+
fi
|
|
452
|
+
|
|
453
|
+
# ============================================================================
|
|
454
|
+
# Detect workspace path and start daemon
|
|
455
|
+
# The daemon must start from the same directory that spawned agents will use
|
|
456
|
+
# to ensure consistent socket paths
|
|
457
|
+
# ============================================================================
|
|
458
|
+
|
|
459
|
+
# Function to detect the actual workspace path (same logic as project-namespace.ts)
|
|
460
|
+
detect_workspace_path() {
|
|
461
|
+
local base_dir="${1}"
|
|
462
|
+
|
|
463
|
+
# 1. Explicit override via env var
|
|
464
|
+
if [[ -n "${WORKSPACE_CWD:-}" ]]; then
|
|
465
|
+
echo "${WORKSPACE_CWD}"
|
|
466
|
+
return
|
|
467
|
+
fi
|
|
468
|
+
|
|
469
|
+
# 2. Check if base_dir itself is a git repo
|
|
470
|
+
if [[ -d "${base_dir}/.git" ]]; then
|
|
471
|
+
echo "${base_dir}"
|
|
472
|
+
return
|
|
473
|
+
fi
|
|
474
|
+
|
|
475
|
+
# 3. Scan for cloned repos (directories with .git)
|
|
476
|
+
local first_repo=""
|
|
477
|
+
for dir in "${base_dir}"/*/; do
|
|
478
|
+
if [[ -d "${dir}.git" ]]; then
|
|
479
|
+
# Use first repo found (alphabetically sorted by bash glob)
|
|
480
|
+
first_repo="${dir%/}"
|
|
481
|
+
break
|
|
482
|
+
fi
|
|
483
|
+
done
|
|
484
|
+
|
|
485
|
+
if [[ -n "${first_repo}" ]]; then
|
|
486
|
+
echo "${first_repo}"
|
|
487
|
+
return
|
|
488
|
+
fi
|
|
489
|
+
|
|
490
|
+
# 4. Fall back to base_dir
|
|
491
|
+
echo "${base_dir}"
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
# Detect the actual workspace path
|
|
495
|
+
ACTUAL_WORKSPACE=$(detect_workspace_path "${WORKSPACE_DIR}")
|
|
496
|
+
log "Detected workspace path: ${ACTUAL_WORKSPACE}"
|
|
497
|
+
|
|
498
|
+
# Change to the detected workspace before starting daemon
|
|
499
|
+
cd "${ACTUAL_WORKSPACE}"
|
|
500
|
+
|
|
501
|
+
log "Starting agent-relay daemon on port ${PORT} from ${ACTUAL_WORKSPACE}"
|
|
502
|
+
args=(/app/dist/cli/index.js up --port "${PORT}")
|
|
503
|
+
|
|
504
|
+
if [[ "${SUPERVISOR_ENABLED:-true}" == "true" ]]; then
|
|
505
|
+
args+=("--watch")
|
|
506
|
+
fi
|
|
507
|
+
|
|
508
|
+
exec node "${args[@]}"
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# Git Credential Helper for Agent Relay Workspaces
|
|
4
|
+
#
|
|
5
|
+
# This script fetches fresh GitHub tokens from the cloud API gateway.
|
|
6
|
+
# Nango handles token refresh, so tokens are always valid.
|
|
7
|
+
#
|
|
8
|
+
# Usage: git config --global credential.helper /usr/local/bin/git-credential-relay
|
|
9
|
+
#
|
|
10
|
+
# Environment variables:
|
|
11
|
+
# WORKSPACE_ID - Required: The workspace ID for token lookup
|
|
12
|
+
# CLOUD_API_URL - Required: The cloud API base URL
|
|
13
|
+
# WORKSPACE_TOKEN - Required: Bearer token for API auth
|
|
14
|
+
#
|
|
15
|
+
|
|
16
|
+
set -euo pipefail
|
|
17
|
+
|
|
18
|
+
# Debug logging (enable with GIT_CREDENTIAL_DEBUG=1)
|
|
19
|
+
debug() {
|
|
20
|
+
if [[ "${GIT_CREDENTIAL_DEBUG:-}" == "1" ]]; then
|
|
21
|
+
echo "git-credential-relay: $*" >&2
|
|
22
|
+
fi
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
debug "Called with args: $*"
|
|
26
|
+
|
|
27
|
+
# Only handle 'get' operation
|
|
28
|
+
if [[ "${1:-}" != "get" ]]; then
|
|
29
|
+
debug "Ignoring non-get operation"
|
|
30
|
+
exit 0
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
# Read input from git (protocol=https, host=github.com, etc.)
|
|
34
|
+
declare -A input
|
|
35
|
+
while IFS='=' read -r key value; do
|
|
36
|
+
[[ -z "$key" ]] && break
|
|
37
|
+
input["$key"]="$value"
|
|
38
|
+
done
|
|
39
|
+
|
|
40
|
+
# Only provide credentials for github.com
|
|
41
|
+
host="${input[host]:-}"
|
|
42
|
+
debug "Host: $host"
|
|
43
|
+
if [[ "$host" != "github.com" ]]; then
|
|
44
|
+
debug "Not github.com, skipping"
|
|
45
|
+
exit 0
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
# Check required environment variables
|
|
49
|
+
if [[ -z "${WORKSPACE_ID:-}" ]]; then
|
|
50
|
+
echo "git-credential-relay: WORKSPACE_ID not set" >&2
|
|
51
|
+
echo "git-credential-relay: Hint - check if env vars are passed to agent process" >&2
|
|
52
|
+
exit 1
|
|
53
|
+
fi
|
|
54
|
+
|
|
55
|
+
if [[ -z "${CLOUD_API_URL:-}" ]]; then
|
|
56
|
+
echo "git-credential-relay: CLOUD_API_URL not set" >&2
|
|
57
|
+
exit 1
|
|
58
|
+
fi
|
|
59
|
+
|
|
60
|
+
if [[ -z "${WORKSPACE_TOKEN:-}" ]]; then
|
|
61
|
+
echo "git-credential-relay: WORKSPACE_TOKEN not set" >&2
|
|
62
|
+
exit 1
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
debug "Fetching token from ${CLOUD_API_URL}/api/git/token?workspaceId=${WORKSPACE_ID}"
|
|
66
|
+
|
|
67
|
+
# Fetch fresh token from gateway (capture stderr for debugging)
|
|
68
|
+
http_code=""
|
|
69
|
+
response=""
|
|
70
|
+
if [[ "${GIT_CREDENTIAL_DEBUG:-}" == "1" ]]; then
|
|
71
|
+
# With debug, show full curl output
|
|
72
|
+
response=$(curl -sf -w "\n%{http_code}" \
|
|
73
|
+
-H "Authorization: Bearer ${WORKSPACE_TOKEN}" \
|
|
74
|
+
"${CLOUD_API_URL}/api/git/token?workspaceId=${WORKSPACE_ID}" \
|
|
75
|
+
2>&1) || true
|
|
76
|
+
http_code="${response##*$'\n'}"
|
|
77
|
+
response="${response%$'\n'*}"
|
|
78
|
+
debug "HTTP response code: $http_code"
|
|
79
|
+
debug "Response: ${response:0:200}"
|
|
80
|
+
else
|
|
81
|
+
response=$(curl -sf \
|
|
82
|
+
-H "Authorization: Bearer ${WORKSPACE_TOKEN}" \
|
|
83
|
+
"${CLOUD_API_URL}/api/git/token?workspaceId=${WORKSPACE_ID}" \
|
|
84
|
+
2>/dev/null) || true
|
|
85
|
+
fi
|
|
86
|
+
|
|
87
|
+
if [[ -z "$response" ]]; then
|
|
88
|
+
echo "git-credential-relay: Failed to fetch token from gateway" >&2
|
|
89
|
+
echo "git-credential-relay: Check that CLOUD_API_URL is accessible: ${CLOUD_API_URL}" >&2
|
|
90
|
+
exit 1
|
|
91
|
+
fi
|
|
92
|
+
|
|
93
|
+
# Parse JSON response using jq (more robust than grep)
|
|
94
|
+
token=$(echo "$response" | jq -r '.token // empty')
|
|
95
|
+
username=$(echo "$response" | jq -r '.username // "x-access-token"')
|
|
96
|
+
|
|
97
|
+
if [[ -z "$token" ]]; then
|
|
98
|
+
# Check if there's an error message with details
|
|
99
|
+
error=$(echo "$response" | jq -r '.error // empty')
|
|
100
|
+
code=$(echo "$response" | jq -r '.code // empty')
|
|
101
|
+
hint=$(echo "$response" | jq -r '.hint // empty')
|
|
102
|
+
details=$(echo "$response" | jq -r '.details // empty')
|
|
103
|
+
|
|
104
|
+
if [[ -n "$error" ]]; then
|
|
105
|
+
echo "git-credential-relay: ERROR: $error" >&2
|
|
106
|
+
if [[ -n "$code" ]]; then
|
|
107
|
+
echo "git-credential-relay: Code: $code" >&2
|
|
108
|
+
fi
|
|
109
|
+
if [[ -n "$hint" ]]; then
|
|
110
|
+
echo "git-credential-relay: Hint: $hint" >&2
|
|
111
|
+
fi
|
|
112
|
+
if [[ -n "$details" ]]; then
|
|
113
|
+
echo "git-credential-relay: Details: $details" >&2
|
|
114
|
+
fi
|
|
115
|
+
else
|
|
116
|
+
echo "git-credential-relay: No token in response" >&2
|
|
117
|
+
debug "Raw response: $response"
|
|
118
|
+
fi
|
|
119
|
+
exit 1
|
|
120
|
+
fi
|
|
121
|
+
|
|
122
|
+
# Output credentials in git credential format
|
|
123
|
+
echo "protocol=https"
|
|
124
|
+
echo "host=github.com"
|
|
125
|
+
echo "username=${username:-x-access-token}"
|
|
126
|
+
echo "password=${token}"
|
package/dist/bridge/spawner.d.ts
CHANGED
|
@@ -128,6 +128,13 @@ export declare class AgentSpawner {
|
|
|
128
128
|
* Get raw output from a worker
|
|
129
129
|
*/
|
|
130
130
|
getWorkerRawOutput(name: string): string | null;
|
|
131
|
+
/**
|
|
132
|
+
* Send input to a worker's PTY (for interactive terminal support)
|
|
133
|
+
* @param name - Worker name
|
|
134
|
+
* @param data - Input data to send (keystrokes, text, etc.)
|
|
135
|
+
* @returns true if input was sent, false if worker not found
|
|
136
|
+
*/
|
|
137
|
+
sendWorkerInput(name: string, data: string): boolean;
|
|
131
138
|
/**
|
|
132
139
|
* Wait for an agent to appear in the registry (agents.json)
|
|
133
140
|
*/
|