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,32 @@
|
|
|
1
|
+
# Trajectory: Implement GitHub repo permission API via Nango for dashboard access
|
|
2
|
+
|
|
3
|
+
> **Status:** ✅ Completed
|
|
4
|
+
> **Task:** agent-relay-460
|
|
5
|
+
> **Confidence:** 90%
|
|
6
|
+
> **Started:** January 5, 2026 at 10:10 PM
|
|
7
|
+
> **Completed:** January 5, 2026 at 10:13 PM
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Summary
|
|
12
|
+
|
|
13
|
+
Implemented GitHub repo permission API via Nango for dashboard access control. Added checkUserRepoAccess() and listUserAccessibleRepos() to NangoService, plus three API endpoints: GET /api/repos/check-access/:owner/:repo, GET /api/repos/accessible, POST /api/repos/check-access-bulk
|
|
14
|
+
|
|
15
|
+
**Approach:** Standard approach
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Key Decisions
|
|
20
|
+
|
|
21
|
+
### Implemented three new Nango-based API endpoints for GitHub repo permissions
|
|
22
|
+
- **Chose:** Implemented three new Nango-based API endpoints for GitHub repo permissions
|
|
23
|
+
- **Reasoning:** Used user's OAuth connection via Nango proxy to check repo access. Endpoints: /api/repos/check-access/:owner/:repo, /api/repos/accessible, /api/repos/check-access-bulk
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Chapters
|
|
28
|
+
|
|
29
|
+
### 1. Work
|
|
30
|
+
*Agent: default*
|
|
31
|
+
|
|
32
|
+
- Implemented three new Nango-based API endpoints for GitHub repo permissions: Implemented three new Nango-based API endpoints for GitHub repo permissions
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "traj_tmux_orchestrator_analysis",
|
|
3
|
+
"title": "Tmux-Orchestrator competitive analysis",
|
|
4
|
+
"task": "analyze-tmux-orchestrator",
|
|
5
|
+
"status": "completed",
|
|
6
|
+
"startedAt": "2026-01-04T09:00:00.000Z",
|
|
7
|
+
"completedAt": "2026-01-04T09:30:00.000Z",
|
|
8
|
+
"confidence": 0.9,
|
|
9
|
+
"summary": "Competitive analysis of Tmux-Orchestrator validated our architecture - real-time messaging + continuity already covers their solutions",
|
|
10
|
+
"decisions": [
|
|
11
|
+
{
|
|
12
|
+
"decision": "Continuity context already works on spawn - no new feature needed",
|
|
13
|
+
"reasoning": "PtyWrapper.injectContinuityContext() already loads ledger + handoff and injects on agent spawn",
|
|
14
|
+
"timestamp": "2026-01-04T09:15:00.000Z"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"decision": "Use trajectories for learnings instead of separate learning repository",
|
|
18
|
+
"reasoning": "Trajectories already capture learnings via trail complete --learnings. Just need search functionality.",
|
|
19
|
+
"timestamp": "2026-01-04T09:20:00.000Z"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"decision": "Self-scheduling is the key missing feature for 24/7 autonomy",
|
|
23
|
+
"reasoning": "Tmux-Orchestrator's schedule_with_note.sh enables agents to wake themselves up. We need ->relay:schedule command.",
|
|
24
|
+
"timestamp": "2026-01-04T09:25:00.000Z"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"decision": "Skip git commit tracking - requires git worktree architecture we don't have",
|
|
28
|
+
"reasoning": "Tmux-Orchestrator's 30-minute commit rule assumes per-agent git worktrees. Not applicable to our current single-repo model.",
|
|
29
|
+
"timestamp": "2026-01-04T09:28:00.000Z"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"decision": "No beads needed - our architecture already covers their solutions",
|
|
33
|
+
"reasoning": "Self-scheduling solved by real-time messaging (agents wake each other). Context notes solved by continuity. Analysis validated our approach rather than finding gaps.",
|
|
34
|
+
"timestamp": "2026-01-04T09:35:00.000Z"
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
"learnings": [
|
|
38
|
+
"Tmux-Orchestrator pioneered 24/7 autonomous agent operation using tmux persistence + self-scheduling",
|
|
39
|
+
"Real-time messaging replaces scheduling - agents can wake each other instantly instead of scheduling delayed self-messages",
|
|
40
|
+
"Our continuity system (ledger + handoff injection on spawn) covers their context notes pattern",
|
|
41
|
+
"Fixed 3-tier hierarchy (Orchestrator→PM→Engineer) solves context window limits but is less flexible than relay's any-topology approach",
|
|
42
|
+
"Shell script + timing delays (~500ms) is simpler but 100x slower than our Unix socket (<5ms)",
|
|
43
|
+
"Self-scheduling with context notes is the killer feature for autonomous operation",
|
|
44
|
+
"Our continuity system (ledger + handoff) already covers spawn context injection",
|
|
45
|
+
"Trajectory learnings field already exists - just need search/index functionality"
|
|
46
|
+
],
|
|
47
|
+
"chapters": [
|
|
48
|
+
{
|
|
49
|
+
"phase": "plan",
|
|
50
|
+
"agent": "default",
|
|
51
|
+
"events": [
|
|
52
|
+
"Fetched Tmux-Orchestrator README and CLAUDE.md from GitHub",
|
|
53
|
+
"Reviewed existing competitive analyses format (GASTOWN.md, MCP_AGENT_MAIL.md)"
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"phase": "execute",
|
|
58
|
+
"agent": "default",
|
|
59
|
+
"events": [
|
|
60
|
+
"Created docs/competitive/TMUX_ORCHESTRATOR.md with full analysis",
|
|
61
|
+
"Updated OVERVIEW.md comparison matrix with Tmux-Orchestrator",
|
|
62
|
+
"Updated README.md with new analysis link"
|
|
63
|
+
]
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"phase": "execute",
|
|
67
|
+
"agent": "default",
|
|
68
|
+
"events": [
|
|
69
|
+
"Created 5 beads for features to adopt",
|
|
70
|
+
"Reviewed existing continuity system - found spawn context already works",
|
|
71
|
+
"Updated beads to reflect existing functionality"
|
|
72
|
+
]
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"phase": "review",
|
|
76
|
+
"agent": "default",
|
|
77
|
+
"events": [
|
|
78
|
+
"Confirmed PtyWrapper.injectContinuityContext() handles spawn context",
|
|
79
|
+
"Confirmed trajectories already capture learnings field",
|
|
80
|
+
"Identified self-scheduling as the truly new feature needed"
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
]
|
|
84
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Trajectory: Tmux-Orchestrator competitive analysis
|
|
2
|
+
|
|
3
|
+
> **Status:** Completed
|
|
4
|
+
> **Task:** analyze-tmux-orchestrator
|
|
5
|
+
> **Started:** January 4, 2026 at 09:00 AM
|
|
6
|
+
> **Completed:** January 4, 2026 at 09:30 AM
|
|
7
|
+
> **Confidence:** 0.9
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Summary
|
|
12
|
+
|
|
13
|
+
Comprehensive competitive analysis of Tmux-Orchestrator vs Agent Relay, identified key features to adopt.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Key Decisions
|
|
18
|
+
|
|
19
|
+
### 1. Continuity context already works on spawn - no new feature needed
|
|
20
|
+
- **Reasoning:** PtyWrapper.injectContinuityContext() already loads ledger + handoff and injects on agent spawn
|
|
21
|
+
|
|
22
|
+
### 2. Use trajectories for learnings instead of separate learning repository
|
|
23
|
+
- **Reasoning:** Trajectories already capture learnings via trail complete --learnings. Just need search functionality.
|
|
24
|
+
|
|
25
|
+
### 3. Self-scheduling is the key missing feature for 24/7 autonomy
|
|
26
|
+
- **Reasoning:** Tmux-Orchestrator's schedule_with_note.sh enables agents to wake themselves up. We need ->relay:schedule command.
|
|
27
|
+
|
|
28
|
+
### 4. Skip git commit tracking - requires git worktree architecture we don't have
|
|
29
|
+
- **Reasoning:** Tmux-Orchestrator's 30-minute commit rule assumes per-agent git worktrees. Not applicable to our current single-repo model.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Learnings
|
|
34
|
+
|
|
35
|
+
1. **Tmux-Orchestrator pioneered 24/7 autonomous agent operation** using tmux persistence + self-scheduling
|
|
36
|
+
|
|
37
|
+
2. **Git commit tracking requires per-agent worktrees** - their 30-min rule isn't applicable without that architecture
|
|
38
|
+
|
|
39
|
+
3. **Fixed 3-tier hierarchy** (Orchestrator→PM→Engineer) solves context window limits but is less flexible than relay's any-topology approach
|
|
40
|
+
|
|
41
|
+
4. **Shell script + timing delays (~500ms)** is simpler but 100x slower than our Unix socket (<5ms)
|
|
42
|
+
|
|
43
|
+
5. **Self-scheduling with context notes** is the killer feature for autonomous operation
|
|
44
|
+
|
|
45
|
+
6. **Our continuity system already covers spawn context** - ledger + handoff injection works
|
|
46
|
+
|
|
47
|
+
7. **Trajectory learnings field already exists** - just need search/index functionality
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Chapters
|
|
52
|
+
|
|
53
|
+
### 1. Plan
|
|
54
|
+
*Agent: default*
|
|
55
|
+
|
|
56
|
+
- Fetched Tmux-Orchestrator README and CLAUDE.md from GitHub
|
|
57
|
+
- Reviewed existing competitive analyses format (GASTOWN.md, MCP_AGENT_MAIL.md)
|
|
58
|
+
|
|
59
|
+
### 2. Execute
|
|
60
|
+
*Agent: default*
|
|
61
|
+
|
|
62
|
+
- Created docs/competitive/TMUX_ORCHESTRATOR.md with full analysis
|
|
63
|
+
- Updated OVERVIEW.md comparison matrix with Tmux-Orchestrator
|
|
64
|
+
- Updated README.md with new analysis link
|
|
65
|
+
|
|
66
|
+
### 3. Execute
|
|
67
|
+
*Agent: default*
|
|
68
|
+
|
|
69
|
+
- Created 5 beads for features to adopt
|
|
70
|
+
- Reviewed existing continuity system - found spawn context already works
|
|
71
|
+
- Updated beads to reflect existing functionality
|
|
72
|
+
|
|
73
|
+
### 4. Review
|
|
74
|
+
*Agent: default*
|
|
75
|
+
|
|
76
|
+
- Confirmed PtyWrapper.injectContinuityContext() handles spawn context
|
|
77
|
+
- Confirmed trajectories already capture learnings field
|
|
78
|
+
- Identified self-scheduling as the truly new feature needed
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Beads Created
|
|
83
|
+
|
|
84
|
+
**None** - Analysis validated our existing architecture covers their solutions.
|
|
85
|
+
|
|
86
|
+
### What They Built vs What We Have
|
|
87
|
+
|
|
88
|
+
| Their Solution | Our Solution |
|
|
89
|
+
|----------------|--------------|
|
|
90
|
+
| Self-scheduling (wake up) | Real-time messaging (agents wake each other) |
|
|
91
|
+
| Context notes for spawn | Continuity injection (ledger + handoff) |
|
|
92
|
+
| Git commit tracking | N/A (needs worktrees) |
|
|
93
|
+
| LEARNINGS.md | Trajectories with learnings field |
|
|
94
|
+
| ~500ms timing delays | <5ms Unix socket |
|
|
95
|
+
|
|
96
|
+
### Key Insight
|
|
97
|
+
Tmux-Orchestrator pioneered autonomous agents with shell scripts. Our architecture (real-time messaging + continuity) is the next evolution - we've already solved their problems more elegantly.
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Files Changed
|
|
102
|
+
|
|
103
|
+
- `docs/competitive/TMUX_ORCHESTRATOR.md` - New analysis (600+ lines)
|
|
104
|
+
- `docs/competitive/README.md` - Added to table
|
|
105
|
+
- `docs/competitive/OVERVIEW.md` - Added to comparison matrix
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
*Trajectory completed 2026-01-04*
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "traj_u9n9eqasw16k",
|
|
3
|
+
"version": 1,
|
|
4
|
+
"task": {
|
|
5
|
+
"title": "Backend trajectory data-loading fix review",
|
|
6
|
+
"source": {
|
|
7
|
+
"system": "plain",
|
|
8
|
+
"id": "backend-review"
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
"status": "completed",
|
|
12
|
+
"startedAt": "2026-01-03T14:40:11.376Z",
|
|
13
|
+
"agents": [
|
|
14
|
+
{
|
|
15
|
+
"name": "CodeReviewer",
|
|
16
|
+
"role": "lead",
|
|
17
|
+
"joinedAt": "2026-01-03T14:40:11.377Z"
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"chapters": [
|
|
21
|
+
{
|
|
22
|
+
"id": "chap_xfg9tvbm40wy",
|
|
23
|
+
"title": "Work",
|
|
24
|
+
"agentName": "default",
|
|
25
|
+
"startedAt": "2026-01-03T14:41:43.249Z",
|
|
26
|
+
"events": [
|
|
27
|
+
{
|
|
28
|
+
"ts": 1767451303250,
|
|
29
|
+
"type": "decision",
|
|
30
|
+
"content": "Active trajectories lose status coloring: Active trajectories lose status coloring",
|
|
31
|
+
"raw": {
|
|
32
|
+
"question": "Active trajectories lose status coloring",
|
|
33
|
+
"chosen": "Active trajectories lose status coloring",
|
|
34
|
+
"alternatives": [],
|
|
35
|
+
"reasoning": "mapEventStatus doesn't map 'active' so in-progress runs show no status indicator"
|
|
36
|
+
},
|
|
37
|
+
"significance": "high"
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
"endedAt": "2026-01-03T14:41:50.001Z"
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
"commits": [],
|
|
44
|
+
"filesChanged": [],
|
|
45
|
+
"projectId": "/Users/khaliqgant/Projects/agent-workforce/relay",
|
|
46
|
+
"tags": [],
|
|
47
|
+
"completedAt": "2026-01-03T14:41:50.001Z",
|
|
48
|
+
"retrospective": {
|
|
49
|
+
"summary": "Reviewed backend filesystem trajectory loading; flagged missing 'active' status mapping",
|
|
50
|
+
"approach": "Standard approach",
|
|
51
|
+
"confidence": 0.78
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Trajectory: Backend trajectory data-loading fix review
|
|
2
|
+
|
|
3
|
+
> **Status:** ✅ Completed
|
|
4
|
+
> **Task:** backend-review
|
|
5
|
+
> **Confidence:** 78%
|
|
6
|
+
> **Started:** January 3, 2026 at 03:40 PM
|
|
7
|
+
> **Completed:** January 3, 2026 at 03:41 PM
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Summary
|
|
12
|
+
|
|
13
|
+
Reviewed backend filesystem trajectory loading; flagged missing 'active' status mapping
|
|
14
|
+
|
|
15
|
+
**Approach:** Standard approach
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Key Decisions
|
|
20
|
+
|
|
21
|
+
### Active trajectories lose status coloring
|
|
22
|
+
- **Chose:** Active trajectories lose status coloring
|
|
23
|
+
- **Reasoning:** mapEventStatus doesn't map 'active' so in-progress runs show no status indicator
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Chapters
|
|
28
|
+
|
|
29
|
+
### 1. Work
|
|
30
|
+
*Agent: default*
|
|
31
|
+
|
|
32
|
+
- Active trajectories lose status coloring: Active trajectories lose status coloring
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "traj_ub8csuv3lcv4",
|
|
3
|
+
"version": 1,
|
|
4
|
+
"task": {
|
|
5
|
+
"title": "Fix WebSocket disconnections for workspace instances",
|
|
6
|
+
"source": {
|
|
7
|
+
"system": "plain",
|
|
8
|
+
"id": "workspace-websocket-stability"
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
"status": "completed",
|
|
12
|
+
"startedAt": "2026-01-06T18:13:23.603Z",
|
|
13
|
+
"agents": [
|
|
14
|
+
{
|
|
15
|
+
"name": "default",
|
|
16
|
+
"role": "lead",
|
|
17
|
+
"joinedAt": "2026-01-06T18:13:35.723Z"
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"chapters": [
|
|
21
|
+
{
|
|
22
|
+
"id": "chap_e4vj0j8ig7ma",
|
|
23
|
+
"title": "Work",
|
|
24
|
+
"agentName": "default",
|
|
25
|
+
"startedAt": "2026-01-06T18:13:35.723Z",
|
|
26
|
+
"events": [
|
|
27
|
+
{
|
|
28
|
+
"ts": 1767723215725,
|
|
29
|
+
"type": "decision",
|
|
30
|
+
"content": "Add ping/pong keepalive to main and bridge WebSockets: Add ping/pong keepalive to main and bridge WebSockets",
|
|
31
|
+
"raw": {
|
|
32
|
+
"question": "Add ping/pong keepalive to main and bridge WebSockets",
|
|
33
|
+
"chosen": "Add ping/pong keepalive to main and bridge WebSockets",
|
|
34
|
+
"alternatives": [],
|
|
35
|
+
"reasoning": "Main dashboard and bridge WebSocket endpoints were missing ping/pong keepalive, while logs and presence endpoints had it. Without keepalive, TCP/proxy timeouts kill idle connections (typically 60-120s)."
|
|
36
|
+
},
|
|
37
|
+
"significance": "high"
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
"endedAt": "2026-01-06T18:16:51.462Z"
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
"commits": [],
|
|
44
|
+
"filesChanged": [],
|
|
45
|
+
"projectId": "/home/user/relay",
|
|
46
|
+
"tags": [],
|
|
47
|
+
"completedAt": "2026-01-06T18:16:51.462Z",
|
|
48
|
+
"retrospective": {
|
|
49
|
+
"summary": "Added ping/pong keepalive to main and bridge WebSockets to fix connection instability",
|
|
50
|
+
"approach": "Standard approach",
|
|
51
|
+
"confidence": 0.9
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Trajectory: Fix WebSocket disconnections for workspace instances
|
|
2
|
+
|
|
3
|
+
> **Status:** ✅ Completed
|
|
4
|
+
> **Task:** workspace-websocket-stability
|
|
5
|
+
> **Confidence:** 90%
|
|
6
|
+
> **Started:** January 6, 2026 at 06:13 PM
|
|
7
|
+
> **Completed:** January 6, 2026 at 06:16 PM
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Summary
|
|
12
|
+
|
|
13
|
+
Added ping/pong keepalive to main and bridge WebSockets to fix connection instability
|
|
14
|
+
|
|
15
|
+
**Approach:** Standard approach
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Key Decisions
|
|
20
|
+
|
|
21
|
+
### Add ping/pong keepalive to main and bridge WebSockets
|
|
22
|
+
- **Chose:** Add ping/pong keepalive to main and bridge WebSockets
|
|
23
|
+
- **Reasoning:** Main dashboard and bridge WebSocket endpoints were missing ping/pong keepalive, while logs and presence endpoints had it. Without keepalive, TCP/proxy timeouts kill idle connections (typically 60-120s).
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Chapters
|
|
28
|
+
|
|
29
|
+
### 1. Work
|
|
30
|
+
*Agent: default*
|
|
31
|
+
|
|
32
|
+
- Add ping/pong keepalive to main and bridge WebSockets: Add ping/pong keepalive to main and bridge WebSockets
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "traj_uc29tlso8i9s",
|
|
3
|
+
"version": 1,
|
|
4
|
+
"task": {
|
|
5
|
+
"title": "Production-ready SSH tunneling for Codex OAuth with security hardening"
|
|
6
|
+
},
|
|
7
|
+
"status": "completed",
|
|
8
|
+
"startedAt": "2026-01-07T10:08:04.299Z",
|
|
9
|
+
"agents": [
|
|
10
|
+
{
|
|
11
|
+
"name": "khaliqgant",
|
|
12
|
+
"role": "lead",
|
|
13
|
+
"joinedAt": "2026-01-07T10:08:04.300Z"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"name": "default",
|
|
17
|
+
"role": "contributor",
|
|
18
|
+
"joinedAt": "2026-01-07T10:08:04.710Z"
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
"chapters": [
|
|
22
|
+
{
|
|
23
|
+
"id": "chap_8omowh9k21wa",
|
|
24
|
+
"title": "Work",
|
|
25
|
+
"agentName": "default",
|
|
26
|
+
"startedAt": "2026-01-07T10:08:04.710Z",
|
|
27
|
+
"events": [
|
|
28
|
+
{
|
|
29
|
+
"ts": 1767780484710,
|
|
30
|
+
"type": "decision",
|
|
31
|
+
"content": "Changed UsageBanner intro bonus from purple to cyan: Changed UsageBanner intro bonus from purple to cyan",
|
|
32
|
+
"raw": {
|
|
33
|
+
"question": "Changed UsageBanner intro bonus from purple to cyan",
|
|
34
|
+
"chosen": "Changed UsageBanner intro bonus from purple to cyan",
|
|
35
|
+
"alternatives": [],
|
|
36
|
+
"reasoning": "Brand consistency - cyan is primary accent color, purple was off-brand"
|
|
37
|
+
},
|
|
38
|
+
"significance": "high"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"ts": 1767780493469,
|
|
42
|
+
"type": "decision",
|
|
43
|
+
"content": "Added landing page auth check - shows Go to App when logged in: Added landing page auth check - shows Go to App when logged in",
|
|
44
|
+
"raw": {
|
|
45
|
+
"question": "Added landing page auth check - shows Go to App when logged in",
|
|
46
|
+
"chosen": "Added landing page auth check - shows Go to App when logged in",
|
|
47
|
+
"alternatives": [],
|
|
48
|
+
"reasoning": "Better UX for returning users who shouldn't see Sign In buttons"
|
|
49
|
+
},
|
|
50
|
+
"significance": "high"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"ts": 1767780494224,
|
|
54
|
+
"type": "decision",
|
|
55
|
+
"content": "Expose SSH port 2222 publicly on Fly.io via TCP service: Expose SSH port 2222 publicly on Fly.io via TCP service",
|
|
56
|
+
"raw": {
|
|
57
|
+
"question": "Expose SSH port 2222 publicly on Fly.io via TCP service",
|
|
58
|
+
"chosen": "Expose SSH port 2222 publicly on Fly.io via TCP service",
|
|
59
|
+
"alternatives": [],
|
|
60
|
+
"reasoning": "Internal .internal hostnames aren't routable from user machines. Public SSH with unique passwords per workspace is secure enough for production."
|
|
61
|
+
},
|
|
62
|
+
"significance": "high"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"ts": 1767780500783,
|
|
66
|
+
"type": "decision",
|
|
67
|
+
"content": "Updated CTA terminal to show realistic CLI flow (cloud link + send): Updated CTA terminal to show realistic CLI flow (cloud link + send)",
|
|
68
|
+
"raw": {
|
|
69
|
+
"question": "Updated CTA terminal to show realistic CLI flow (cloud link + send)",
|
|
70
|
+
"chosen": "Updated CTA terminal to show realistic CLI flow (cloud link + send)",
|
|
71
|
+
"alternatives": [],
|
|
72
|
+
"reasoning": "Previous mock commands were inaccurate. Now shows actual agent-relay cloud commands"
|
|
73
|
+
},
|
|
74
|
+
"significance": "high"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"ts": 1767780501007,
|
|
78
|
+
"type": "decision",
|
|
79
|
+
"content": "Use deterministic password derivation instead of storage: Use deterministic password derivation instead of storage",
|
|
80
|
+
"raw": {
|
|
81
|
+
"question": "Use deterministic password derivation instead of storage",
|
|
82
|
+
"chosen": "Use deterministic password derivation instead of storage",
|
|
83
|
+
"alternatives": [],
|
|
84
|
+
"reasoning": "SHA-256(workspaceId + salt) produces unique passwords without database storage. Both cloud server and container can derive the same password independently. 96 bits of entropy is sufficient."
|
|
85
|
+
},
|
|
86
|
+
"significance": "high"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"ts": 1767780508469,
|
|
90
|
+
"type": "decision",
|
|
91
|
+
"content": "Create shared ssh-security.ts utility: Create shared ssh-security.ts utility",
|
|
92
|
+
"raw": {
|
|
93
|
+
"question": "Create shared ssh-security.ts utility",
|
|
94
|
+
"chosen": "Create shared ssh-security.ts utility",
|
|
95
|
+
"alternatives": [],
|
|
96
|
+
"reasoning": "Password derivation was duplicated in provisioner and codex-auth-helper. Single source of truth prevents bugs if algorithm changes. Also adds startup validation."
|
|
97
|
+
},
|
|
98
|
+
"significance": "high"
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"ts": 1767780510961,
|
|
102
|
+
"type": "decision",
|
|
103
|
+
"content": "Fixed TypeScript error: Promise<never> to Promise<void>: Fixed TypeScript error: Promise<never> to Promise<void>",
|
|
104
|
+
"raw": {
|
|
105
|
+
"question": "Fixed TypeScript error: Promise<never> to Promise<void>",
|
|
106
|
+
"chosen": "Fixed TypeScript error: Promise<never> to Promise<void>",
|
|
107
|
+
"alternatives": [],
|
|
108
|
+
"reasoning": "Promise<never> caused control flow analysis to mark subsequent code as unreachable"
|
|
109
|
+
},
|
|
110
|
+
"significance": "high"
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"ts": 1767780517965,
|
|
114
|
+
"type": "decision",
|
|
115
|
+
"content": "Keep password-based SSH for now, defer key-based auth: Keep password-based SSH for now, defer key-based auth",
|
|
116
|
+
"raw": {
|
|
117
|
+
"question": "Keep password-based SSH for now, defer key-based auth",
|
|
118
|
+
"chosen": "Keep password-based SSH for now, defer key-based auth",
|
|
119
|
+
"alternatives": [],
|
|
120
|
+
"reasoning": "Password-based is simpler to implement and per-workspace unique passwords provide reasonable security. Key-based auth would require container-side authorized_keys management - tracked as future improvement in agent-relay-476."
|
|
121
|
+
},
|
|
122
|
+
"significance": "high"
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"ts": 1767780523070,
|
|
126
|
+
"type": "decision",
|
|
127
|
+
"content": "Settings page: replaced sidebar with always-visible horizontal tabs: Settings page: replaced sidebar with always-visible horizontal tabs",
|
|
128
|
+
"raw": {
|
|
129
|
+
"question": "Settings page: replaced sidebar with always-visible horizontal tabs",
|
|
130
|
+
"chosen": "Settings page: replaced sidebar with always-visible horizontal tabs",
|
|
131
|
+
"alternatives": [],
|
|
132
|
+
"reasoning": "Desktop sidebar wasn't rendering for user. Horizontal tabs provide consistent navigation on all screen sizes"
|
|
133
|
+
},
|
|
134
|
+
"significance": "high"
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"ts": 1767780530293,
|
|
138
|
+
"type": "decision",
|
|
139
|
+
"content": "Billing API: respect database user.plan when no Stripe subscription: Billing API: respect database user.plan when no Stripe subscription",
|
|
140
|
+
"raw": {
|
|
141
|
+
"question": "Billing API: respect database user.plan when no Stripe subscription",
|
|
142
|
+
"chosen": "Billing API: respect database user.plan when no Stripe subscription",
|
|
143
|
+
"alternatives": [],
|
|
144
|
+
"reasoning": "Allows manual plan overrides in database to take effect without Stripe subscription"
|
|
145
|
+
},
|
|
146
|
+
"significance": "high"
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"ts": 1767780538628,
|
|
150
|
+
"type": "decision",
|
|
151
|
+
"content": "Billing panel: dynamic tier descriptions and smart plan recommendations: Billing panel: dynamic tier descriptions and smart plan recommendations",
|
|
152
|
+
"raw": {
|
|
153
|
+
"question": "Billing panel: dynamic tier descriptions and smart plan recommendations",
|
|
154
|
+
"chosen": "Billing panel: dynamic tier descriptions and smart plan recommendations",
|
|
155
|
+
"alternatives": [],
|
|
156
|
+
"reasoning": "Fixed hardcoded Free tier text. Only highlight upgrades, not downgrades (no Pro promotion to Team users)"
|
|
157
|
+
},
|
|
158
|
+
"significance": "high"
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"ts": 1767780548294,
|
|
162
|
+
"type": "decision",
|
|
163
|
+
"content": "Aligned workspace Codex auth with /app onboarding: Aligned workspace Codex auth with /app onboarding",
|
|
164
|
+
"raw": {
|
|
165
|
+
"question": "Aligned workspace Codex auth with /app onboarding",
|
|
166
|
+
"chosen": "Aligned workspace Codex auth with /app onboarding",
|
|
167
|
+
"alternatives": [],
|
|
168
|
+
"reasoning": "Added supportsDeviceFlow prop to ProviderAuthFlow to match /app page props"
|
|
169
|
+
},
|
|
170
|
+
"significance": "high"
|
|
171
|
+
}
|
|
172
|
+
],
|
|
173
|
+
"endedAt": "2026-01-07T10:09:10.870Z"
|
|
174
|
+
}
|
|
175
|
+
],
|
|
176
|
+
"commits": [],
|
|
177
|
+
"filesChanged": [],
|
|
178
|
+
"projectId": "/Users/khaliqgant/Projects/agent-workforce/relay",
|
|
179
|
+
"tags": [],
|
|
180
|
+
"completedAt": "2026-01-07T10:09:10.870Z",
|
|
181
|
+
"retrospective": {
|
|
182
|
+
"summary": "Implemented production-ready SSH tunneling for Codex OAuth. Key changes: (1) Exposed SSH port 2222 publicly on Fly.io via TCP service, (2) Changed from .internal to .fly.dev hostname for public routing, (3) Created shared ssh-security.ts with deterministic password derivation (SHA-256 of workspaceId + salt), (4) Added startup validation for SSH_PASSWORD_SALT env var, (5) Created beads for future improvements: rate limiting, key-based auth, time-limited access.",
|
|
183
|
+
"approach": "Standard approach",
|
|
184
|
+
"confidence": 0.85
|
|
185
|
+
}
|
|
186
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Trajectory: Production-ready SSH tunneling for Codex OAuth with security hardening
|
|
2
|
+
|
|
3
|
+
> **Status:** ✅ Completed
|
|
4
|
+
> **Confidence:** 85%
|
|
5
|
+
> **Started:** January 7, 2026 at 11:08 AM
|
|
6
|
+
> **Completed:** January 7, 2026 at 11:09 AM
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Summary
|
|
11
|
+
|
|
12
|
+
Implemented production-ready SSH tunneling for Codex OAuth. Key changes: (1) Exposed SSH port 2222 publicly on Fly.io via TCP service, (2) Changed from .internal to .fly.dev hostname for public routing, (3) Created shared ssh-security.ts with deterministic password derivation (SHA-256 of workspaceId + salt), (4) Added startup validation for SSH_PASSWORD_SALT env var, (5) Created beads for future improvements: rate limiting, key-based auth, time-limited access.
|
|
13
|
+
|
|
14
|
+
**Approach:** Standard approach
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Key Decisions
|
|
19
|
+
|
|
20
|
+
### Changed UsageBanner intro bonus from purple to cyan
|
|
21
|
+
- **Chose:** Changed UsageBanner intro bonus from purple to cyan
|
|
22
|
+
- **Reasoning:** Brand consistency - cyan is primary accent color, purple was off-brand
|
|
23
|
+
|
|
24
|
+
### Added landing page auth check - shows Go to App when logged in
|
|
25
|
+
- **Chose:** Added landing page auth check - shows Go to App when logged in
|
|
26
|
+
- **Reasoning:** Better UX for returning users who shouldn't see Sign In buttons
|
|
27
|
+
|
|
28
|
+
### Expose SSH port 2222 publicly on Fly.io via TCP service
|
|
29
|
+
- **Chose:** Expose SSH port 2222 publicly on Fly.io via TCP service
|
|
30
|
+
- **Reasoning:** Internal .internal hostnames aren't routable from user machines. Public SSH with unique passwords per workspace is secure enough for production.
|
|
31
|
+
|
|
32
|
+
### Updated CTA terminal to show realistic CLI flow (cloud link + send)
|
|
33
|
+
- **Chose:** Updated CTA terminal to show realistic CLI flow (cloud link + send)
|
|
34
|
+
- **Reasoning:** Previous mock commands were inaccurate. Now shows actual agent-relay cloud commands
|
|
35
|
+
|
|
36
|
+
### Use deterministic password derivation instead of storage
|
|
37
|
+
- **Chose:** Use deterministic password derivation instead of storage
|
|
38
|
+
- **Reasoning:** SHA-256(workspaceId + salt) produces unique passwords without database storage. Both cloud server and container can derive the same password independently. 96 bits of entropy is sufficient.
|
|
39
|
+
|
|
40
|
+
### Create shared ssh-security.ts utility
|
|
41
|
+
- **Chose:** Create shared ssh-security.ts utility
|
|
42
|
+
- **Reasoning:** Password derivation was duplicated in provisioner and codex-auth-helper. Single source of truth prevents bugs if algorithm changes. Also adds startup validation.
|
|
43
|
+
|
|
44
|
+
### Fixed TypeScript error: Promise<never> to Promise<void>
|
|
45
|
+
- **Chose:** Fixed TypeScript error: Promise<never> to Promise<void>
|
|
46
|
+
- **Reasoning:** Promise<never> caused control flow analysis to mark subsequent code as unreachable
|
|
47
|
+
|
|
48
|
+
### Keep password-based SSH for now, defer key-based auth
|
|
49
|
+
- **Chose:** Keep password-based SSH for now, defer key-based auth
|
|
50
|
+
- **Reasoning:** Password-based is simpler to implement and per-workspace unique passwords provide reasonable security. Key-based auth would require container-side authorized_keys management - tracked as future improvement in agent-relay-476.
|
|
51
|
+
|
|
52
|
+
### Settings page: replaced sidebar with always-visible horizontal tabs
|
|
53
|
+
- **Chose:** Settings page: replaced sidebar with always-visible horizontal tabs
|
|
54
|
+
- **Reasoning:** Desktop sidebar wasn't rendering for user. Horizontal tabs provide consistent navigation on all screen sizes
|
|
55
|
+
|
|
56
|
+
### Billing API: respect database user.plan when no Stripe subscription
|
|
57
|
+
- **Chose:** Billing API: respect database user.plan when no Stripe subscription
|
|
58
|
+
- **Reasoning:** Allows manual plan overrides in database to take effect without Stripe subscription
|
|
59
|
+
|
|
60
|
+
### Billing panel: dynamic tier descriptions and smart plan recommendations
|
|
61
|
+
- **Chose:** Billing panel: dynamic tier descriptions and smart plan recommendations
|
|
62
|
+
- **Reasoning:** Fixed hardcoded Free tier text. Only highlight upgrades, not downgrades (no Pro promotion to Team users)
|
|
63
|
+
|
|
64
|
+
### Aligned workspace Codex auth with /app onboarding
|
|
65
|
+
- **Chose:** Aligned workspace Codex auth with /app onboarding
|
|
66
|
+
- **Reasoning:** Added supportsDeviceFlow prop to ProviderAuthFlow to match /app page props
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Chapters
|
|
71
|
+
|
|
72
|
+
### 1. Work
|
|
73
|
+
*Agent: default*
|
|
74
|
+
|
|
75
|
+
- Changed UsageBanner intro bonus from purple to cyan: Changed UsageBanner intro bonus from purple to cyan
|
|
76
|
+
- Added landing page auth check - shows Go to App when logged in: Added landing page auth check - shows Go to App when logged in
|
|
77
|
+
- Expose SSH port 2222 publicly on Fly.io via TCP service: Expose SSH port 2222 publicly on Fly.io via TCP service
|
|
78
|
+
- Updated CTA terminal to show realistic CLI flow (cloud link + send): Updated CTA terminal to show realistic CLI flow (cloud link + send)
|
|
79
|
+
- Use deterministic password derivation instead of storage: Use deterministic password derivation instead of storage
|
|
80
|
+
- Create shared ssh-security.ts utility: Create shared ssh-security.ts utility
|
|
81
|
+
- Fixed TypeScript error: Promise<never> to Promise<void>: Fixed TypeScript error: Promise<never> to Promise<void>
|
|
82
|
+
- Keep password-based SSH for now, defer key-based auth: Keep password-based SSH for now, defer key-based auth
|
|
83
|
+
- Settings page: replaced sidebar with always-visible horizontal tabs: Settings page: replaced sidebar with always-visible horizontal tabs
|
|
84
|
+
- Billing API: respect database user.plan when no Stripe subscription: Billing API: respect database user.plan when no Stripe subscription
|
|
85
|
+
- Billing panel: dynamic tier descriptions and smart plan recommendations: Billing panel: dynamic tier descriptions and smart plan recommendations
|
|
86
|
+
- Aligned workspace Codex auth with /app onboarding: Aligned workspace Codex auth with /app onboarding
|