agent-relay 1.1.0 → 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitattributes +3 -0
- package/.nvmrc +1 -0
- package/.trajectories/completed/2026-01/traj_1dviorhnkcb5.json +65 -0
- package/.trajectories/completed/2026-01/traj_1dviorhnkcb5.md +37 -0
- package/.trajectories/completed/2026-01/traj_1k5if5snst2e.json +65 -0
- package/.trajectories/completed/2026-01/traj_1k5if5snst2e.md +37 -0
- package/.trajectories/completed/2026-01/traj_1rp3rges5811.json +49 -0
- package/.trajectories/completed/2026-01/traj_1rp3rges5811.md +31 -0
- package/.trajectories/completed/2026-01/traj_22bhyulruouw.json +113 -0
- package/.trajectories/completed/2026-01/traj_22bhyulruouw.md +57 -0
- package/.trajectories/completed/2026-01/traj_2dao7ddgnta0.json +53 -0
- package/.trajectories/completed/2026-01/traj_2dao7ddgnta0.md +32 -0
- package/.trajectories/completed/2026-01/traj_3t0440mjeunc.json +26 -0
- package/.trajectories/completed/2026-01/traj_3t0440mjeunc.md +6 -0
- package/.trajectories/completed/2026-01/traj_45x9494d9xnr.json +47 -0
- package/.trajectories/completed/2026-01/traj_45x9494d9xnr.md +32 -0
- package/.trajectories/completed/2026-01/traj_4aa0bb77s4nh.json +53 -0
- package/.trajectories/completed/2026-01/traj_4aa0bb77s4nh.md +32 -0
- package/.trajectories/completed/2026-01/traj_5lhmzq8rxpqv.json +59 -0
- package/.trajectories/completed/2026-01/traj_5lhmzq8rxpqv.md +33 -0
- package/.trajectories/completed/2026-01/traj_5vr4e9erb1fs.json +53 -0
- package/.trajectories/completed/2026-01/traj_5vr4e9erb1fs.md +32 -0
- package/.trajectories/completed/2026-01/traj_6fgiwdoklvym.json +48 -0
- package/.trajectories/completed/2026-01/traj_6fgiwdoklvym.md +24 -0
- package/.trajectories/completed/2026-01/traj_7ludwvz45veh.json +209 -0
- package/.trajectories/completed/2026-01/traj_7ludwvz45veh.md +97 -0
- package/.trajectories/completed/2026-01/traj_9921cuhel0pj.json +48 -0
- package/.trajectories/completed/2026-01/traj_9921cuhel0pj.md +24 -0
- package/.trajectories/completed/2026-01/traj_ajs7zqfux4wc.json +49 -0
- package/.trajectories/completed/2026-01/traj_ajs7zqfux4wc.md +23 -0
- package/.trajectories/completed/2026-01/traj_cvtqhlwcq9s0.json +53 -0
- package/.trajectories/completed/2026-01/traj_cvtqhlwcq9s0.md +32 -0
- package/.trajectories/completed/2026-01/traj_cxofprm2m2en.json +49 -0
- package/.trajectories/completed/2026-01/traj_cxofprm2m2en.md +31 -0
- package/.trajectories/completed/2026-01/traj_d2hhz3k0vrhn.json +26 -0
- package/.trajectories/completed/2026-01/traj_d2hhz3k0vrhn.md +6 -0
- package/.trajectories/completed/2026-01/traj_dfuvww9pege5.json +59 -0
- package/.trajectories/completed/2026-01/traj_dfuvww9pege5.md +37 -0
- package/.trajectories/completed/2026-01/traj_g0fisy9h51mf.json +77 -0
- package/.trajectories/completed/2026-01/traj_g0fisy9h51mf.md +42 -0
- package/.trajectories/completed/2026-01/traj_gjdre5voouod.json +53 -0
- package/.trajectories/completed/2026-01/traj_gjdre5voouod.md +32 -0
- package/.trajectories/completed/2026-01/traj_gtlyqtta3x8l.json +25 -0
- package/.trajectories/completed/2026-01/traj_gtlyqtta3x8l.md +15 -0
- package/.trajectories/completed/2026-01/traj_h4xijiuip3w4.json +101 -0
- package/.trajectories/completed/2026-01/traj_h4xijiuip3w4.md +44 -0
- package/.trajectories/completed/2026-01/traj_hhxte7w4gjjx.json +22 -0
- package/.trajectories/completed/2026-01/traj_hhxte7w4gjjx.md +5 -0
- package/.trajectories/completed/2026-01/traj_hpungyhoj6v5.json +53 -0
- package/.trajectories/completed/2026-01/traj_hpungyhoj6v5.md +32 -0
- package/.trajectories/completed/2026-01/traj_m2xkjv0w2sq7.json +25 -0
- package/.trajectories/completed/2026-01/traj_m2xkjv0w2sq7.md +15 -0
- package/.trajectories/completed/2026-01/traj_noq5zbvnrdvz.json +53 -0
- package/.trajectories/completed/2026-01/traj_noq5zbvnrdvz.md +32 -0
- package/.trajectories/completed/2026-01/traj_ntbs6ppopf46.json +53 -0
- package/.trajectories/completed/2026-01/traj_ntbs6ppopf46.md +32 -0
- package/.trajectories/completed/2026-01/traj_ozd98si6a7ns.json +48 -0
- package/.trajectories/completed/2026-01/traj_ozd98si6a7ns.md +24 -0
- package/.trajectories/completed/2026-01/traj_prdza7a5cxp5.json +53 -0
- package/.trajectories/completed/2026-01/traj_prdza7a5cxp5.md +32 -0
- package/.trajectories/completed/2026-01/traj_qb3twvvywfwi.json +77 -0
- package/.trajectories/completed/2026-01/traj_qb3twvvywfwi.md +42 -0
- package/.trajectories/completed/2026-01/traj_qft54mi7nfor.json +53 -0
- package/.trajectories/completed/2026-01/traj_qft54mi7nfor.md +32 -0
- package/.trajectories/completed/2026-01/traj_qx9uhf8whhxo.json +83 -0
- package/.trajectories/completed/2026-01/traj_qx9uhf8whhxo.md +47 -0
- package/.trajectories/completed/2026-01/traj_rd9toccj18a0.json +59 -0
- package/.trajectories/completed/2026-01/traj_rd9toccj18a0.md +37 -0
- package/.trajectories/completed/2026-01/traj_rt4fiw3ecp50.json +48 -0
- package/.trajectories/completed/2026-01/traj_rt4fiw3ecp50.md +16 -0
- package/.trajectories/completed/2026-01/traj_st8j35b0hrlc.json +59 -0
- package/.trajectories/completed/2026-01/traj_st8j35b0hrlc.md +37 -0
- package/.trajectories/completed/2026-01/traj_t1yy8m7hbuxp.json +53 -0
- package/.trajectories/completed/2026-01/traj_t1yy8m7hbuxp.md +32 -0
- package/.trajectories/completed/2026-01/traj_tmux_orchestrator_analysis.json +84 -0
- package/.trajectories/completed/2026-01/traj_tmux_orchestrator_analysis.md +109 -0
- package/.trajectories/completed/2026-01/traj_u9n9eqasw16k.json +53 -0
- package/.trajectories/completed/2026-01/traj_u9n9eqasw16k.md +32 -0
- package/.trajectories/completed/2026-01/traj_v87hypnongqx.json +71 -0
- package/.trajectories/completed/2026-01/traj_v87hypnongqx.md +42 -0
- package/.trajectories/completed/2026-01/traj_wkp2fgzdyinb.json +53 -0
- package/.trajectories/completed/2026-01/traj_wkp2fgzdyinb.md +32 -0
- package/.trajectories/completed/2026-01/traj_x14t8w8rn7xg.json +20 -0
- package/.trajectories/completed/2026-01/traj_x14t8w8rn7xg.md +6 -0
- package/.trajectories/completed/2026-01/traj_xnwbznkvv8ua.json +175 -0
- package/.trajectories/completed/2026-01/traj_xnwbznkvv8ua.md +82 -0
- package/.trajectories/completed/2026-01/traj_ysjc8zaeqtd3.json +47 -0
- package/.trajectories/completed/2026-01/traj_ysjc8zaeqtd3.md +32 -0
- package/.trajectories/completed/2026-01/traj_yvdadtvdgnz3.json +59 -0
- package/.trajectories/completed/2026-01/traj_yvdadtvdgnz3.md +37 -0
- package/.trajectories/completed/2026-01/traj_z0vcw1wrzide.json +53 -0
- package/.trajectories/completed/2026-01/traj_z0vcw1wrzide.md +32 -0
- package/.trajectories/index.json +314 -0
- package/ARCHITECTURE.md +1245 -0
- package/README.md +1 -1
- package/TESTING.md +278 -0
- package/deploy/init-db.sql +5 -0
- package/deploy/scripts/setup-fly-workspaces.sh +69 -0
- package/deploy/scripts/setup-railway.sh +75 -0
- package/deploy/workspace/entrypoint-browser.sh +118 -0
- package/deploy/workspace/entrypoint.sh +348 -0
- package/deploy/workspace/git-credential-relay +111 -0
- package/dist/bridge/spawner.d.ts +53 -0
- package/dist/bridge/spawner.js +203 -19
- package/dist/bridge/types.d.ts +12 -0
- package/dist/cli/index.js +618 -5
- package/dist/cloud/api/auth.d.ts +3 -2
- package/dist/cloud/api/auth.js +10 -98
- package/dist/cloud/api/billing.js +30 -9
- package/dist/cloud/api/cli-pty-runner.d.ts +54 -0
- package/dist/cloud/api/cli-pty-runner.js +119 -0
- package/dist/cloud/api/codex-auth-helper.d.ts +15 -0
- package/dist/cloud/api/codex-auth-helper.js +100 -0
- package/dist/cloud/api/generic-webhooks.d.ts +8 -0
- package/dist/cloud/api/generic-webhooks.js +129 -0
- package/dist/cloud/api/git.d.ts +8 -0
- package/dist/cloud/api/git.js +152 -0
- package/dist/cloud/api/github-app.d.ts +11 -0
- package/dist/cloud/api/github-app.js +189 -0
- package/dist/cloud/api/middleware/planLimits.d.ts +7 -0
- package/dist/cloud/api/middleware/planLimits.js +39 -1
- package/dist/cloud/api/monitoring.d.ts +11 -0
- package/dist/cloud/api/monitoring.js +578 -0
- package/dist/cloud/api/nango-auth.d.ts +9 -0
- package/dist/cloud/api/nango-auth.js +377 -0
- package/dist/cloud/api/onboarding.d.ts +8 -1
- package/dist/cloud/api/onboarding.js +313 -119
- package/dist/cloud/api/policy.d.ts +8 -0
- package/dist/cloud/api/policy.js +229 -0
- package/dist/cloud/api/providers.js +114 -42
- package/dist/cloud/api/repos.d.ts +1 -0
- package/dist/cloud/api/repos.js +186 -0
- package/dist/cloud/api/test-helpers.d.ts +10 -0
- package/dist/cloud/api/test-helpers.js +575 -0
- package/dist/cloud/api/webhooks.d.ts +8 -0
- package/dist/cloud/api/webhooks.js +645 -0
- package/dist/cloud/api/workspaces.js +320 -12
- package/dist/cloud/billing/plans.js +32 -19
- package/dist/cloud/billing/types.d.ts +9 -3
- package/dist/cloud/config.d.ts +9 -2
- package/dist/cloud/config.js +13 -4
- package/dist/cloud/db/drizzle.d.ts +84 -1
- package/dist/cloud/db/drizzle.js +470 -0
- package/dist/cloud/db/index.d.ts +9 -4
- package/dist/cloud/db/index.js +11 -3
- package/dist/cloud/db/schema.d.ts +3283 -556
- package/dist/cloud/db/schema.js +314 -1
- package/dist/cloud/index.d.ts +1 -0
- package/dist/cloud/index.js +2 -0
- package/dist/cloud/provisioner/index.d.ts +56 -0
- package/dist/cloud/provisioner/index.js +676 -34
- package/dist/cloud/server.d.ts +1 -0
- package/dist/cloud/server.js +362 -13
- package/dist/cloud/services/auto-scaler.d.ts +152 -0
- package/dist/cloud/services/auto-scaler.js +439 -0
- package/dist/cloud/services/capacity-manager.d.ts +148 -0
- package/dist/cloud/services/capacity-manager.js +449 -0
- package/dist/cloud/services/ci-agent-spawner.d.ts +49 -0
- package/dist/cloud/services/ci-agent-spawner.js +373 -0
- package/dist/cloud/services/index.d.ts +12 -0
- package/dist/cloud/services/index.js +15 -0
- package/dist/cloud/services/mention-handler.d.ts +65 -0
- package/dist/cloud/services/mention-handler.js +405 -0
- package/dist/cloud/services/nango.d.ts +186 -0
- package/dist/cloud/services/nango.js +344 -0
- package/dist/cloud/services/persistence.d.ts +131 -0
- package/dist/cloud/services/persistence.js +200 -0
- package/dist/cloud/services/planLimits.d.ts +37 -0
- package/dist/cloud/services/planLimits.js +86 -5
- package/dist/cloud/services/scaling-orchestrator.d.ts +159 -0
- package/dist/cloud/services/scaling-orchestrator.js +502 -0
- package/dist/cloud/services/scaling-policy.d.ts +121 -0
- package/dist/cloud/services/scaling-policy.js +415 -0
- package/dist/cloud/vault/index.js +1 -1
- package/dist/cloud/webhooks/index.d.ts +24 -0
- package/dist/cloud/webhooks/index.js +29 -0
- package/dist/cloud/webhooks/parsers/github.d.ts +8 -0
- package/dist/cloud/webhooks/parsers/github.js +234 -0
- package/dist/cloud/webhooks/parsers/index.d.ts +23 -0
- package/dist/cloud/webhooks/parsers/index.js +30 -0
- package/dist/cloud/webhooks/parsers/linear.d.ts +9 -0
- package/dist/cloud/webhooks/parsers/linear.js +258 -0
- package/dist/cloud/webhooks/parsers/slack.d.ts +9 -0
- package/dist/cloud/webhooks/parsers/slack.js +214 -0
- package/dist/cloud/webhooks/responders/github.d.ts +8 -0
- package/dist/cloud/webhooks/responders/github.js +73 -0
- package/dist/cloud/webhooks/responders/index.d.ts +23 -0
- package/dist/cloud/webhooks/responders/index.js +30 -0
- package/dist/cloud/webhooks/responders/linear.d.ts +9 -0
- package/dist/cloud/webhooks/responders/linear.js +149 -0
- package/dist/cloud/webhooks/responders/slack.d.ts +20 -0
- package/dist/cloud/webhooks/responders/slack.js +178 -0
- package/dist/cloud/webhooks/router.d.ts +25 -0
- package/dist/cloud/webhooks/router.js +504 -0
- package/dist/cloud/webhooks/rules-engine.d.ts +24 -0
- package/dist/cloud/webhooks/rules-engine.js +287 -0
- package/dist/cloud/webhooks/types.d.ts +186 -0
- package/dist/cloud/webhooks/types.js +8 -0
- package/dist/continuity/formatter.d.ts +51 -0
- package/dist/continuity/formatter.js +313 -0
- package/dist/continuity/handoff-store.d.ts +67 -0
- package/dist/continuity/handoff-store.js +472 -0
- package/dist/continuity/index.d.ts +45 -0
- package/dist/continuity/index.js +48 -0
- package/dist/continuity/ledger-store.d.ts +110 -0
- package/dist/continuity/ledger-store.js +500 -0
- package/dist/continuity/manager.d.ts +178 -0
- package/dist/continuity/manager.js +562 -0
- package/dist/continuity/parser.d.ts +76 -0
- package/dist/continuity/parser.js +579 -0
- package/dist/continuity/types.d.ts +180 -0
- package/dist/continuity/types.js +9 -0
- package/dist/daemon/agent-manager.d.ts +27 -0
- package/dist/daemon/agent-manager.js +107 -6
- package/dist/daemon/agent-registry.d.ts +32 -0
- package/dist/daemon/agent-registry.js +42 -2
- package/dist/daemon/api.d.ts +12 -0
- package/dist/daemon/api.js +131 -2
- package/dist/daemon/cli-auth.d.ts +67 -0
- package/dist/daemon/cli-auth.js +537 -0
- package/dist/daemon/cloud-sync.js +9 -7
- package/dist/daemon/orchestrator.js +30 -0
- package/dist/daemon/router.d.ts +5 -0
- package/dist/daemon/router.js +78 -26
- package/dist/daemon/server.d.ts +5 -0
- package/dist/daemon/server.js +9 -1
- package/dist/daemon/services/browser-testing.d.ts +88 -0
- package/dist/daemon/services/browser-testing.js +244 -0
- package/dist/daemon/services/container-spawner.d.ts +135 -0
- package/dist/daemon/services/container-spawner.js +313 -0
- package/dist/daemon/types.d.ts +5 -1
- package/dist/dashboard/out/404.html +1 -1
- package/dist/dashboard/out/_next/static/chunks/116-2502180def231162.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/282-980c2eb8fff20123.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/699-3b1cd6618a45d259.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/724-2dae7627550ab88f.js +9 -0
- package/dist/dashboard/out/_next/static/chunks/766-1f2dd8cb7f766b0b.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/app/onboarding/page-3fdfa60e53f2810d.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/app/page-e6381e5a6e1fbcfd.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/connect-repos/page-3538dfe0ffe984b8.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/history/{page-b6edd4dde8d08194.js → page-abb9ab2d329f56e9.js} +1 -1
- package/dist/dashboard/out/_next/static/chunks/app/layout-c0d118c0f92d969c.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/login/page-c22d080201cbd9fb.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/metrics/page-67a3e98d9a43a6ed.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/page-77e9c65420a06cfb.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/pricing/page-b08ed1c34d14434a.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/providers/page-e88bc117ef7671c3.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/app/signup/page-68d34f50baa8ab6b.js +1 -0
- package/dist/dashboard/out/_next/static/chunks/e868780c-48e5f147c90a3a41.js +18 -0
- package/dist/dashboard/out/_next/static/chunks/{main-app-5d692157a8eb1fd9.js → main-app-6e8e8d3ef4e0192a.js} +1 -1
- package/dist/dashboard/out/_next/static/chunks/{main-c2f423b9c9f4591b.js → main-ed4e1fb6f29c34cf.js} +1 -1
- package/dist/dashboard/out/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +1 -0
- package/dist/dashboard/out/_next/static/css/29852f26181969a0.css +1 -0
- package/dist/dashboard/out/_next/static/css/7c3ae9e8617d42a5.css +1 -0
- package/dist/dashboard/out/app/onboarding.html +1 -0
- package/dist/dashboard/out/app/onboarding.txt +7 -0
- package/dist/dashboard/out/app.html +1 -14
- package/dist/dashboard/out/app.txt +2 -2
- package/dist/dashboard/out/connect-repos.html +1 -0
- package/dist/dashboard/out/connect-repos.txt +7 -0
- package/dist/dashboard/out/history.html +1 -1
- package/dist/dashboard/out/history.txt +2 -2
- package/dist/dashboard/out/index.html +1 -1
- package/dist/dashboard/out/index.txt +2 -2
- package/dist/dashboard/out/login.html +6 -0
- package/dist/dashboard/out/login.txt +7 -0
- package/dist/dashboard/out/metrics.html +1 -1
- package/dist/dashboard/out/metrics.txt +2 -2
- package/dist/dashboard/out/pricing.html +3 -3
- package/dist/dashboard/out/pricing.txt +2 -2
- package/dist/dashboard/out/providers.html +1 -0
- package/dist/dashboard/out/providers.txt +7 -0
- package/dist/dashboard/out/signup.html +6 -0
- package/dist/dashboard/out/signup.txt +7 -0
- package/dist/dashboard-server/server.js +1308 -8
- package/dist/hooks/emitter.d.ts +40 -0
- package/dist/hooks/emitter.js +63 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.js +3 -0
- package/dist/hooks/registry.d.ts +173 -0
- package/dist/hooks/registry.js +476 -0
- package/dist/hooks/trajectory-hooks.d.ts +52 -0
- package/dist/hooks/trajectory-hooks.js +183 -0
- package/dist/hooks/types.d.ts +141 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -0
- package/dist/memory/adapters/index.d.ts +8 -0
- package/dist/memory/adapters/index.js +8 -0
- package/dist/memory/adapters/inmemory.d.ts +59 -0
- package/dist/memory/adapters/inmemory.js +195 -0
- package/dist/memory/adapters/supermemory.d.ts +71 -0
- package/dist/memory/adapters/supermemory.js +338 -0
- package/dist/memory/factory.d.ts +48 -0
- package/dist/memory/factory.js +143 -0
- package/dist/memory/index.d.ts +32 -0
- package/dist/memory/index.js +32 -0
- package/dist/memory/memory-hooks.d.ts +60 -0
- package/dist/memory/memory-hooks.js +313 -0
- package/dist/memory/service.d.ts +49 -0
- package/dist/memory/service.js +146 -0
- package/dist/memory/types.d.ts +195 -0
- package/dist/memory/types.js +8 -0
- package/dist/policy/agent-policy.d.ts +225 -0
- package/dist/policy/agent-policy.js +665 -0
- package/dist/policy/cloud-policy-fetcher.d.ts +12 -0
- package/dist/policy/cloud-policy-fetcher.js +64 -0
- package/dist/resiliency/crash-insights.d.ts +156 -0
- package/dist/resiliency/crash-insights.js +492 -0
- package/dist/resiliency/gossip-health.d.ts +137 -0
- package/dist/resiliency/gossip-health.js +241 -0
- package/dist/resiliency/index.d.ts +5 -0
- package/dist/resiliency/index.js +5 -0
- package/dist/resiliency/leader-watchdog.d.ts +109 -0
- package/dist/resiliency/leader-watchdog.js +189 -0
- package/dist/resiliency/memory-monitor.d.ts +172 -0
- package/dist/resiliency/memory-monitor.js +593 -0
- package/dist/resiliency/stateless-lead.d.ts +149 -0
- package/dist/resiliency/stateless-lead.js +308 -0
- package/dist/resiliency/supervisor.d.ts +38 -0
- package/dist/resiliency/supervisor.js +122 -0
- package/dist/shared/cli-auth-config.d.ts +91 -0
- package/dist/shared/cli-auth-config.js +264 -0
- package/dist/storage/adapter.d.ts +1 -1
- package/dist/trajectory/config.d.ts +84 -0
- package/dist/trajectory/config.js +163 -0
- package/dist/trajectory/index.d.ts +8 -0
- package/dist/trajectory/index.js +8 -0
- package/dist/trajectory/integration.d.ts +292 -0
- package/dist/trajectory/integration.js +834 -0
- package/dist/utils/logger.js +1 -1
- package/dist/utils/project-namespace.d.ts +24 -0
- package/dist/utils/project-namespace.js +84 -0
- package/dist/wrapper/parser.d.ts +10 -0
- package/dist/wrapper/parser.js +100 -33
- package/dist/wrapper/pty-wrapper.d.ts +197 -16
- package/dist/wrapper/pty-wrapper.js +943 -106
- package/dist/wrapper/shared.d.ts +165 -0
- package/dist/wrapper/shared.js +270 -0
- package/dist/wrapper/tmux-wrapper.d.ts +73 -11
- package/dist/wrapper/tmux-wrapper.js +541 -120
- package/package.json +16 -16
- package/scripts/postinstall.js +60 -0
- package/test-push.txt +1 -0
- package/bin/tmux +0 -0
- package/dist/bridge/config.d.ts.map +0 -1
- package/dist/bridge/config.js.map +0 -1
- package/dist/bridge/index.d.ts.map +0 -1
- package/dist/bridge/index.js.map +0 -1
- package/dist/bridge/multi-project-client.d.ts.map +0 -1
- package/dist/bridge/multi-project-client.js.map +0 -1
- package/dist/bridge/shadow-cli.d.ts.map +0 -1
- package/dist/bridge/shadow-cli.js.map +0 -1
- package/dist/bridge/shadow-config.d.ts.map +0 -1
- package/dist/bridge/shadow-config.js.map +0 -1
- package/dist/bridge/spawner.d.ts.map +0 -1
- package/dist/bridge/spawner.js.map +0 -1
- package/dist/bridge/teams-config.d.ts.map +0 -1
- package/dist/bridge/teams-config.js.map +0 -1
- package/dist/bridge/types.d.ts.map +0 -1
- package/dist/bridge/types.js.map +0 -1
- package/dist/bridge/utils.d.ts.map +0 -1
- package/dist/bridge/utils.js.map +0 -1
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js.map +0 -1
- package/dist/cloud/api/auth.d.ts.map +0 -1
- package/dist/cloud/api/auth.js.map +0 -1
- package/dist/cloud/api/billing.d.ts.map +0 -1
- package/dist/cloud/api/billing.js.map +0 -1
- package/dist/cloud/api/coordinators.d.ts.map +0 -1
- package/dist/cloud/api/coordinators.js.map +0 -1
- package/dist/cloud/api/daemons.d.ts.map +0 -1
- package/dist/cloud/api/daemons.js.map +0 -1
- package/dist/cloud/api/middleware/planLimits.d.ts.map +0 -1
- package/dist/cloud/api/middleware/planLimits.js.map +0 -1
- package/dist/cloud/api/onboarding.d.ts.map +0 -1
- package/dist/cloud/api/onboarding.js.map +0 -1
- package/dist/cloud/api/providers.d.ts.map +0 -1
- package/dist/cloud/api/providers.js.map +0 -1
- package/dist/cloud/api/repos.d.ts.map +0 -1
- package/dist/cloud/api/repos.js.map +0 -1
- package/dist/cloud/api/teams.d.ts.map +0 -1
- package/dist/cloud/api/teams.js.map +0 -1
- package/dist/cloud/api/usage.d.ts.map +0 -1
- package/dist/cloud/api/usage.js.map +0 -1
- package/dist/cloud/api/workspaces.d.ts.map +0 -1
- package/dist/cloud/api/workspaces.js.map +0 -1
- package/dist/cloud/billing/index.d.ts.map +0 -1
- package/dist/cloud/billing/index.js.map +0 -1
- package/dist/cloud/billing/plans.d.ts.map +0 -1
- package/dist/cloud/billing/plans.js.map +0 -1
- package/dist/cloud/billing/service.d.ts.map +0 -1
- package/dist/cloud/billing/service.js.map +0 -1
- package/dist/cloud/billing/types.d.ts.map +0 -1
- package/dist/cloud/billing/types.js.map +0 -1
- package/dist/cloud/config.d.ts.map +0 -1
- package/dist/cloud/config.js.map +0 -1
- package/dist/cloud/db/drizzle.d.ts.map +0 -1
- package/dist/cloud/db/drizzle.js.map +0 -1
- package/dist/cloud/db/index.d.ts.map +0 -1
- package/dist/cloud/db/index.js.map +0 -1
- package/dist/cloud/db/schema.d.ts.map +0 -1
- package/dist/cloud/db/schema.js.map +0 -1
- package/dist/cloud/index.d.ts.map +0 -1
- package/dist/cloud/index.js.map +0 -1
- package/dist/cloud/provisioner/index.d.ts.map +0 -1
- package/dist/cloud/provisioner/index.js.map +0 -1
- package/dist/cloud/server.d.ts.map +0 -1
- package/dist/cloud/server.js.map +0 -1
- package/dist/cloud/services/coordinator.d.ts.map +0 -1
- package/dist/cloud/services/coordinator.js.map +0 -1
- package/dist/cloud/services/planLimits.d.ts.map +0 -1
- package/dist/cloud/services/planLimits.js.map +0 -1
- package/dist/cloud/vault/index.d.ts.map +0 -1
- package/dist/cloud/vault/index.js.map +0 -1
- package/dist/daemon/agent-manager.d.ts.map +0 -1
- package/dist/daemon/agent-manager.js.map +0 -1
- package/dist/daemon/agent-registry.d.ts.map +0 -1
- package/dist/daemon/agent-registry.js.map +0 -1
- package/dist/daemon/api.d.ts.map +0 -1
- package/dist/daemon/api.js.map +0 -1
- package/dist/daemon/auth.d.ts.map +0 -1
- package/dist/daemon/auth.js.map +0 -1
- package/dist/daemon/cloud-sync.d.ts.map +0 -1
- package/dist/daemon/cloud-sync.js.map +0 -1
- package/dist/daemon/connection.d.ts.map +0 -1
- package/dist/daemon/connection.js.map +0 -1
- package/dist/daemon/index.d.ts.map +0 -1
- package/dist/daemon/index.js.map +0 -1
- package/dist/daemon/orchestrator.d.ts.map +0 -1
- package/dist/daemon/orchestrator.js.map +0 -1
- package/dist/daemon/registry.d.ts.map +0 -1
- package/dist/daemon/registry.js.map +0 -1
- package/dist/daemon/router.d.ts.map +0 -1
- package/dist/daemon/router.js.map +0 -1
- package/dist/daemon/server.d.ts.map +0 -1
- package/dist/daemon/server.js.map +0 -1
- package/dist/daemon/types.d.ts.map +0 -1
- package/dist/daemon/types.js.map +0 -1
- package/dist/daemon/workspace-manager.d.ts.map +0 -1
- package/dist/daemon/workspace-manager.js.map +0 -1
- package/dist/dashboard/out/_next/static/chunks/693-7b3301d8f6bc5014.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/713-f78477eb185f1f4d.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/766-e53e1cfe39b0b5b5.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/900-037c64bfd797fb2a.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/app/page-e3d9e1f4466b9bae.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/layout-2433bb48965f4333.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/metrics/page-e68825a81db67ba1.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/page-cc108bf68c8a657f.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/pricing/page-d80e03a5297f95b6.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/webpack-a5acc2831d094776.js +0 -1
- package/dist/dashboard/out/_next/static/css/79b80143647a07d7.css +0 -1
- package/dist/dashboard/out/_next/static/css/8cf277370ad48cfe.css +0 -1
- package/dist/dashboard-server/metrics.d.ts.map +0 -1
- package/dist/dashboard-server/metrics.js.map +0 -1
- package/dist/dashboard-server/needs-attention.d.ts.map +0 -1
- package/dist/dashboard-server/needs-attention.js.map +0 -1
- package/dist/dashboard-server/server.d.ts.map +0 -1
- package/dist/dashboard-server/server.js.map +0 -1
- package/dist/dashboard-server/start.d.ts.map +0 -1
- package/dist/dashboard-server/start.js.map +0 -1
- package/dist/hooks/inbox-check/hook.d.ts.map +0 -1
- package/dist/hooks/inbox-check/hook.js.map +0 -1
- package/dist/hooks/inbox-check/index.d.ts.map +0 -1
- package/dist/hooks/inbox-check/index.js.map +0 -1
- package/dist/hooks/inbox-check/types.d.ts.map +0 -1
- package/dist/hooks/inbox-check/types.js.map +0 -1
- package/dist/hooks/inbox-check/utils.d.ts.map +0 -1
- package/dist/hooks/inbox-check/utils.js.map +0 -1
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/index.js.map +0 -1
- package/dist/hooks/types.d.ts.map +0 -1
- package/dist/hooks/types.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/protocol/framing.d.ts.map +0 -1
- package/dist/protocol/framing.js.map +0 -1
- package/dist/protocol/index.d.ts.map +0 -1
- package/dist/protocol/index.js.map +0 -1
- package/dist/protocol/types.d.ts.map +0 -1
- package/dist/protocol/types.js.map +0 -1
- package/dist/resiliency/context-persistence.d.ts.map +0 -1
- package/dist/resiliency/context-persistence.js.map +0 -1
- package/dist/resiliency/health-monitor.d.ts.map +0 -1
- package/dist/resiliency/health-monitor.js.map +0 -1
- package/dist/resiliency/index.d.ts.map +0 -1
- package/dist/resiliency/index.js.map +0 -1
- package/dist/resiliency/logger.d.ts.map +0 -1
- package/dist/resiliency/logger.js.map +0 -1
- package/dist/resiliency/metrics.d.ts.map +0 -1
- package/dist/resiliency/metrics.js.map +0 -1
- package/dist/resiliency/provider-context.d.ts.map +0 -1
- package/dist/resiliency/provider-context.js.map +0 -1
- package/dist/resiliency/supervisor.d.ts.map +0 -1
- package/dist/resiliency/supervisor.js.map +0 -1
- package/dist/state/agent-state.d.ts.map +0 -1
- package/dist/state/agent-state.js.map +0 -1
- package/dist/storage/adapter.d.ts.map +0 -1
- package/dist/storage/adapter.js.map +0 -1
- package/dist/storage/sqlite-adapter.d.ts.map +0 -1
- package/dist/storage/sqlite-adapter.js.map +0 -1
- package/dist/utils/agent-config.d.ts.map +0 -1
- package/dist/utils/agent-config.js.map +0 -1
- package/dist/utils/command-resolver.d.ts.map +0 -1
- package/dist/utils/command-resolver.js.map +0 -1
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/name-generator.d.ts.map +0 -1
- package/dist/utils/name-generator.js.map +0 -1
- package/dist/utils/project-namespace.d.ts.map +0 -1
- package/dist/utils/project-namespace.js.map +0 -1
- package/dist/utils/tmux-resolver.d.ts.map +0 -1
- package/dist/utils/tmux-resolver.js.map +0 -1
- package/dist/utils/update-checker.d.ts.map +0 -1
- package/dist/utils/update-checker.js.map +0 -1
- package/dist/wrapper/client.d.ts.map +0 -1
- package/dist/wrapper/client.js.map +0 -1
- package/dist/wrapper/inbox.d.ts.map +0 -1
- package/dist/wrapper/inbox.js.map +0 -1
- package/dist/wrapper/index.d.ts.map +0 -1
- package/dist/wrapper/index.js.map +0 -1
- package/dist/wrapper/parser.d.ts.map +0 -1
- package/dist/wrapper/parser.js.map +0 -1
- package/dist/wrapper/pty-wrapper.d.ts.map +0 -1
- package/dist/wrapper/pty-wrapper.js.map +0 -1
- package/dist/wrapper/tmux-wrapper.d.ts.map +0 -1
- package/dist/wrapper/tmux-wrapper.js.map +0 -1
- package/docs/AGENTS.md +0 -513
- package/docs/ARCHITECTURE_DECISIONS.md +0 -175
- package/docs/CHANGELOG.md +0 -11
- package/docs/CLI-SIMPLIFICATION-COMPLETE.md +0 -48
- package/docs/CLOUD-ARCHITECTURE.md +0 -652
- package/docs/CLOUD-ONBOARDING-DESIGN.md +0 -1983
- package/docs/COMPETITIVE_ANALYSIS.md +0 -897
- package/docs/CONTRIBUTING.md +0 -151
- package/docs/DESIGN_BRIDGE_STAFFING.md +0 -878
- package/docs/DESIGN_V2.md +0 -1079
- package/docs/INTEGRATION-GUIDE.md +0 -926
- package/docs/MONETIZATION.md +0 -1679
- package/docs/PROPOSAL-trajectories.md +0 -1582
- package/docs/PROTOCOL.md +0 -325
- package/docs/SCALING_ANALYSIS.md +0 -280
- package/docs/TESTING_PRESENCE_FEATURES.md +0 -327
- package/docs/TMUX_IMPLEMENTATION_NOTES.md +0 -364
- package/docs/TMUX_IMPROVEMENTS.md +0 -968
- package/docs/agent-relay-snippet.md +0 -168
- package/docs/competitive-analysis-mcp-agent-mail.md +0 -389
- package/docs/dashboard-v2-plan.md +0 -179
- package/docs/guides/CLOUD.md +0 -236
- package/docs/guides/LOCAL.md +0 -535
- package/docs/guides/SELF-HOSTED.md +0 -494
- package/docs/proposals/shadow-as-subagent.md +0 -765
- package/docs/proposals/slack-bot-integration.md +0 -1457
- package/docs/removable-code-analysis.md +0 -24
- package/scripts/dev/PUBLIC_RELEASE_PLAN.md +0 -88
- package/scripts/dev/dev-team-setup.sh +0 -431
- package/scripts/e2e-test.sh +0 -119
- package/scripts/games/game-protocol.md +0 -79
- package/scripts/games/hearts-setup.sh +0 -264
- package/scripts/tictactoe-setup.sh +0 -181
- /package/dist/dashboard/out/_next/static/chunks/{117-b2cd8d6485aacf2b.js → 117-f7b8ab0809342e77.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/{648-8f3f26864ce515e5.js → 648-5cc6e1921389a58a.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/app/_not-found/{page-0b990dbb71d72a98.js → page-53b8a69f76db17d0.js} +0 -0
- /package/dist/dashboard/out/_next/static/chunks/{fd9d1056-bf46c09eb57e019c.js → fd9d1056-609918ca7b6280bb.js} +0 -0
- /package/dist/dashboard/out/_next/static/{6HHWb2ZmnJ4OSm0zUP7h4 → wPgKJtcOmTFLpUncDg16A}/_buildManifest.js +0 -0
- /package/dist/dashboard/out/_next/static/{6HHWb2ZmnJ4OSm0zUP7h4 → wPgKJtcOmTFLpUncDg16A}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
log() {
|
|
6
|
+
echo "[workspace] $*"
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
# Drop to workspace user if running as root
|
|
10
|
+
if [[ "$(id -u)" == "0" ]]; then
|
|
11
|
+
log "Dropping privileges to workspace user..."
|
|
12
|
+
exec gosu workspace "$0" "$@"
|
|
13
|
+
fi
|
|
14
|
+
|
|
15
|
+
PORT="${AGENT_RELAY_DASHBOARD_PORT:-${PORT:-3888}}"
|
|
16
|
+
export AGENT_RELAY_DASHBOARD_PORT="${PORT}"
|
|
17
|
+
export PORT="${PORT}"
|
|
18
|
+
|
|
19
|
+
WORKSPACE_DIR="${WORKSPACE_DIR:-/workspace}"
|
|
20
|
+
REPO_LIST="${REPOSITORIES:-}"
|
|
21
|
+
|
|
22
|
+
mkdir -p "${WORKSPACE_DIR}"
|
|
23
|
+
cd "${WORKSPACE_DIR}"
|
|
24
|
+
|
|
25
|
+
# Configure Git credentials via the gateway (tokens auto-refresh via Nango)
|
|
26
|
+
# The credential helper fetches fresh tokens from the cloud API on each git operation
|
|
27
|
+
if [[ -n "${CLOUD_API_URL:-}" && -n "${WORKSPACE_ID:-}" && -n "${WORKSPACE_TOKEN:-}" ]]; then
|
|
28
|
+
log "Configuring git credential helper (gateway mode)"
|
|
29
|
+
git config --global credential.helper "/usr/local/bin/git-credential-relay"
|
|
30
|
+
git config --global credential.useHttpPath true
|
|
31
|
+
export GIT_TERMINAL_PROMPT=0
|
|
32
|
+
|
|
33
|
+
# Configure git identity for commits
|
|
34
|
+
# Use env vars if set, otherwise default to "Agent Relay" / "agent@agent-relay.com"
|
|
35
|
+
DEFAULT_GIT_EMAIL="${AGENT_NAME:-agent}@agent-relay.com"
|
|
36
|
+
git config --global user.name "${GIT_USER_NAME:-Agent Relay}"
|
|
37
|
+
git config --global user.email "${GIT_USER_EMAIL:-${DEFAULT_GIT_EMAIL}}"
|
|
38
|
+
log "Git identity configured: ${GIT_USER_NAME:-Agent Relay} <${GIT_USER_EMAIL:-${DEFAULT_GIT_EMAIL}}>"
|
|
39
|
+
|
|
40
|
+
# Configure gh CLI to use the same token mechanism
|
|
41
|
+
# gh auth login expects a token via stdin or GH_TOKEN env var
|
|
42
|
+
# We'll set up a wrapper that fetches fresh tokens
|
|
43
|
+
mkdir -p "${HOME}/.config/gh"
|
|
44
|
+
cat > "${HOME}/.config/gh/hosts.yml" <<EOF
|
|
45
|
+
github.com:
|
|
46
|
+
oauth_token: placeholder
|
|
47
|
+
git_protocol: https
|
|
48
|
+
EOF
|
|
49
|
+
|
|
50
|
+
# Create gh token wrapper script
|
|
51
|
+
# Uses userToken (OAuth) for gh CLI, not installation token
|
|
52
|
+
cat > "/tmp/gh-token-helper.sh" <<'GHEOF'
|
|
53
|
+
#!/usr/bin/env bash
|
|
54
|
+
# Fetch fresh user OAuth token for gh CLI
|
|
55
|
+
response=$(curl -sf \
|
|
56
|
+
-H "Authorization: Bearer ${WORKSPACE_TOKEN}" \
|
|
57
|
+
"${CLOUD_API_URL}/api/git/token?workspaceId=${WORKSPACE_ID}" 2>/dev/null)
|
|
58
|
+
if [[ -n "$response" ]]; then
|
|
59
|
+
# Prefer userToken (OAuth) for gh CLI, fall back to installation token
|
|
60
|
+
user_token=$(echo "$response" | jq -r '.userToken // empty')
|
|
61
|
+
if [[ -n "$user_token" && "$user_token" != "null" ]]; then
|
|
62
|
+
echo "$user_token"
|
|
63
|
+
else
|
|
64
|
+
echo "$response" | jq -r '.token // empty'
|
|
65
|
+
fi
|
|
66
|
+
fi
|
|
67
|
+
GHEOF
|
|
68
|
+
chmod +x "/tmp/gh-token-helper.sh"
|
|
69
|
+
|
|
70
|
+
# gh CLI will use GH_TOKEN if set; we export a function to refresh it
|
|
71
|
+
# For now, set it once at startup (will be refreshed by the credential helper for git operations)
|
|
72
|
+
# Retry a few times in case the cloud API isn't ready yet
|
|
73
|
+
export GH_TOKEN=""
|
|
74
|
+
for attempt in 1 2 3; do
|
|
75
|
+
GH_TOKEN=$(/tmp/gh-token-helper.sh 2>/dev/null || echo "")
|
|
76
|
+
if [[ -n "${GH_TOKEN}" ]]; then
|
|
77
|
+
break
|
|
78
|
+
fi
|
|
79
|
+
sleep 1
|
|
80
|
+
done
|
|
81
|
+
if [[ -n "${GH_TOKEN}" ]]; then
|
|
82
|
+
log "GitHub CLI configured with fresh token"
|
|
83
|
+
else
|
|
84
|
+
log "WARN: Could not fetch GitHub token for gh CLI"
|
|
85
|
+
fi
|
|
86
|
+
|
|
87
|
+
# Fallback: Use static GITHUB_TOKEN if provided (legacy mode)
|
|
88
|
+
elif [[ -n "${GITHUB_TOKEN:-}" ]]; then
|
|
89
|
+
log "Configuring git credentials (legacy static token mode)"
|
|
90
|
+
GIT_ASKPASS_SCRIPT="/tmp/git-askpass.sh"
|
|
91
|
+
cat > "${GIT_ASKPASS_SCRIPT}" <<'EOF'
|
|
92
|
+
#!/usr/bin/env bash
|
|
93
|
+
prompt="${1:-}"
|
|
94
|
+
if [[ "${prompt}" == *"Username"* ]]; then
|
|
95
|
+
echo "x-access-token"
|
|
96
|
+
else
|
|
97
|
+
echo "${GITHUB_TOKEN}"
|
|
98
|
+
fi
|
|
99
|
+
EOF
|
|
100
|
+
chmod +x "${GIT_ASKPASS_SCRIPT}"
|
|
101
|
+
export GIT_ASKPASS="${GIT_ASKPASS_SCRIPT}"
|
|
102
|
+
export GIT_TERMINAL_PROMPT=0
|
|
103
|
+
export GH_TOKEN="${GITHUB_TOKEN}"
|
|
104
|
+
|
|
105
|
+
# Configure git identity for commits
|
|
106
|
+
DEFAULT_GIT_EMAIL="${AGENT_NAME:-agent}@agent-relay.com"
|
|
107
|
+
git config --global user.name "${GIT_USER_NAME:-Agent Relay}"
|
|
108
|
+
git config --global user.email "${GIT_USER_EMAIL:-${DEFAULT_GIT_EMAIL}}"
|
|
109
|
+
log "Git identity configured: ${GIT_USER_NAME:-Agent Relay} <${GIT_USER_EMAIL:-${DEFAULT_GIT_EMAIL}}>"
|
|
110
|
+
fi
|
|
111
|
+
|
|
112
|
+
clone_or_update_repo() {
|
|
113
|
+
local repo="$1"
|
|
114
|
+
repo="${repo// /}"
|
|
115
|
+
if [[ -z "${repo}" ]]; then
|
|
116
|
+
return
|
|
117
|
+
fi
|
|
118
|
+
|
|
119
|
+
local repo_name
|
|
120
|
+
repo_name="$(basename "${repo}")"
|
|
121
|
+
local target="${WORKSPACE_DIR}/${repo_name}"
|
|
122
|
+
local url="https://github.com/${repo}.git"
|
|
123
|
+
|
|
124
|
+
if [[ -d "${target}/.git" ]]; then
|
|
125
|
+
log "Updating ${repo}..."
|
|
126
|
+
git -C "${target}" remote set-url origin "${url}" >/dev/null 2>&1 || true
|
|
127
|
+
git -C "${target}" fetch --all --prune >/dev/null 2>&1 || true
|
|
128
|
+
git -C "${target}" pull --ff-only >/dev/null 2>&1 || true
|
|
129
|
+
else
|
|
130
|
+
log "Cloning ${repo}..."
|
|
131
|
+
git clone "${url}" "${target}" >/dev/null 2>&1 || {
|
|
132
|
+
log "WARN: Failed to clone ${repo}"
|
|
133
|
+
}
|
|
134
|
+
fi
|
|
135
|
+
|
|
136
|
+
# Mark directory as safe to prevent "dubious ownership" errors
|
|
137
|
+
# This is needed when git runs as a different user (e.g., root via SSH)
|
|
138
|
+
if [[ -d "${target}/.git" ]]; then
|
|
139
|
+
git config --global --add safe.directory "${target}" 2>/dev/null || true
|
|
140
|
+
fi
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if [[ -n "${REPO_LIST}" ]]; then
|
|
144
|
+
# Check if we have credentials configured (gateway mode or static token)
|
|
145
|
+
if [[ -z "${GITHUB_TOKEN:-}" && -z "${CLOUD_API_URL:-}" ]]; then
|
|
146
|
+
log "WARN: REPOSITORIES set but no credentials configured; clones may fail."
|
|
147
|
+
fi
|
|
148
|
+
|
|
149
|
+
IFS=',' read -ra repos <<< "${REPO_LIST}"
|
|
150
|
+
for repo in "${repos[@]}"; do
|
|
151
|
+
clone_or_update_repo "${repo}"
|
|
152
|
+
done
|
|
153
|
+
fi
|
|
154
|
+
|
|
155
|
+
# ============================================================================
|
|
156
|
+
# Configure agent policy enforcement for cloud workspaces
|
|
157
|
+
# Policy is fetched from cloud API and enforced at runtime
|
|
158
|
+
# ============================================================================
|
|
159
|
+
|
|
160
|
+
if [[ -n "${CLOUD_API_URL:-}" && -n "${WORKSPACE_ID:-}" ]]; then
|
|
161
|
+
log "Enabling agent policy enforcement"
|
|
162
|
+
export AGENT_POLICY_ENFORCEMENT=1
|
|
163
|
+
# Policy is fetched from ${CLOUD_API_URL}/api/policy/${WORKSPACE_ID}/internal
|
|
164
|
+
fi
|
|
165
|
+
|
|
166
|
+
# ============================================================================
|
|
167
|
+
# Configure AI provider credentials
|
|
168
|
+
# Create credential files that CLIs expect from ENV vars passed by provisioner
|
|
169
|
+
# ============================================================================
|
|
170
|
+
|
|
171
|
+
# Claude CLI expects ~/.claude/.credentials.json (note the dot prefix on filename)
|
|
172
|
+
# Format: { claudeAiOauth: { accessToken: "...", refreshToken: "...", expiresAt: ... } }
|
|
173
|
+
if [[ -n "${ANTHROPIC_TOKEN:-}" ]]; then
|
|
174
|
+
log "Configuring Claude credentials..."
|
|
175
|
+
mkdir -p "${HOME}/.claude"
|
|
176
|
+
cat > "${HOME}/.claude/.credentials.json" <<EOF
|
|
177
|
+
{
|
|
178
|
+
"claudeAiOauth": {
|
|
179
|
+
"accessToken": "${ANTHROPIC_TOKEN}",
|
|
180
|
+
"refreshToken": "${ANTHROPIC_REFRESH_TOKEN:-}",
|
|
181
|
+
"expiresAt": ${ANTHROPIC_TOKEN_EXPIRES_AT:-null}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
EOF
|
|
185
|
+
chmod 600 "${HOME}/.claude/.credentials.json"
|
|
186
|
+
fi
|
|
187
|
+
|
|
188
|
+
# Configure Claude Code for cloud workspaces
|
|
189
|
+
# Create both settings and instructions files
|
|
190
|
+
log "Configuring Claude Code for cloud workspace..."
|
|
191
|
+
mkdir -p "${HOME}/.claude"
|
|
192
|
+
|
|
193
|
+
# Create settings.json to auto-accept permissions (required for cloud workspaces)
|
|
194
|
+
# This tells Claude Code to skip the "Ready to code here?" permission prompt
|
|
195
|
+
# Reference: Claude Code uses this for headless/automated environments
|
|
196
|
+
cat > "${HOME}/.claude/settings.json" <<'SETTINGSEOF'
|
|
197
|
+
{
|
|
198
|
+
"permissions": {
|
|
199
|
+
"allow": [
|
|
200
|
+
"Read",
|
|
201
|
+
"Edit",
|
|
202
|
+
"Write",
|
|
203
|
+
"Bash",
|
|
204
|
+
"Glob",
|
|
205
|
+
"Grep",
|
|
206
|
+
"Task",
|
|
207
|
+
"WebFetch",
|
|
208
|
+
"WebSearch",
|
|
209
|
+
"NotebookEdit",
|
|
210
|
+
"TodoWrite"
|
|
211
|
+
],
|
|
212
|
+
"deny": []
|
|
213
|
+
},
|
|
214
|
+
"autoApproveApiRequest": true
|
|
215
|
+
}
|
|
216
|
+
SETTINGSEOF
|
|
217
|
+
chmod 600 "${HOME}/.claude/settings.json"
|
|
218
|
+
log "Created Claude Code settings (auto-approve enabled)"
|
|
219
|
+
|
|
220
|
+
# Create CLAUDE.md with agent relay protocol instructions
|
|
221
|
+
# This is loaded automatically by Claude Code and provides the relay protocol
|
|
222
|
+
if [[ -f "/app/docs/agent-relay-snippet.md" ]]; then
|
|
223
|
+
cp "/app/docs/agent-relay-snippet.md" "${HOME}/.claude/CLAUDE.md"
|
|
224
|
+
log "Copied relay protocol from /app/docs/agent-relay-snippet.md"
|
|
225
|
+
else
|
|
226
|
+
# Fallback: create minimal instructions
|
|
227
|
+
log "WARN: /app/docs/agent-relay-snippet.md not found, creating minimal instructions"
|
|
228
|
+
cat > "${HOME}/.claude/CLAUDE.md" <<'RELAYEOF'
|
|
229
|
+
# Agent Relay
|
|
230
|
+
|
|
231
|
+
Real-time agent-to-agent messaging. Output `->relay:` patterns to communicate.
|
|
232
|
+
|
|
233
|
+
## Sending Messages
|
|
234
|
+
|
|
235
|
+
Use fenced format for reliable delivery:
|
|
236
|
+
```
|
|
237
|
+
->relay:AgentName <<<
|
|
238
|
+
Your message here.>>>
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
Broadcast to all: `->relay:* <<<message>>>`
|
|
242
|
+
|
|
243
|
+
## Protocol
|
|
244
|
+
|
|
245
|
+
1. ACK immediately when you receive a task
|
|
246
|
+
2. Do the work
|
|
247
|
+
3. Send DONE: summary when complete
|
|
248
|
+
|
|
249
|
+
## Session Persistence
|
|
250
|
+
|
|
251
|
+
Output periodically to checkpoint progress:
|
|
252
|
+
```
|
|
253
|
+
[[SUMMARY]]{"currentTask":"...","completedTasks":[...],"context":"..."}[[/SUMMARY]]
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
When session is complete:
|
|
257
|
+
```
|
|
258
|
+
[[SESSION_END]]{"summary":"...","completedTasks":[...]}[[/SESSION_END]]
|
|
259
|
+
```
|
|
260
|
+
RELAYEOF
|
|
261
|
+
fi
|
|
262
|
+
log "Claude Code configuration complete"
|
|
263
|
+
|
|
264
|
+
# Codex CLI expects ~/.codex/auth.json
|
|
265
|
+
# Format: { tokens: { access_token: "...", refresh_token: "...", ... } }
|
|
266
|
+
if [[ -n "${OPENAI_TOKEN:-}" ]]; then
|
|
267
|
+
log "Configuring Codex credentials..."
|
|
268
|
+
mkdir -p "${HOME}/.codex"
|
|
269
|
+
cat > "${HOME}/.codex/auth.json" <<EOF
|
|
270
|
+
{
|
|
271
|
+
"tokens": {
|
|
272
|
+
"access_token": "${OPENAI_TOKEN}",
|
|
273
|
+
"refresh_token": "${OPENAI_REFRESH_TOKEN:-}"
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
EOF
|
|
277
|
+
chmod 600 "${HOME}/.codex/auth.json"
|
|
278
|
+
fi
|
|
279
|
+
|
|
280
|
+
# Google/Gemini - uses application default credentials
|
|
281
|
+
if [[ -n "${GOOGLE_TOKEN:-}" ]]; then
|
|
282
|
+
log "Configuring Google credentials..."
|
|
283
|
+
mkdir -p "${HOME}/.config/gcloud"
|
|
284
|
+
cat > "${HOME}/.config/gcloud/application_default_credentials.json" <<EOF
|
|
285
|
+
{
|
|
286
|
+
"type": "authorized_user",
|
|
287
|
+
"access_token": "${GOOGLE_TOKEN}"
|
|
288
|
+
}
|
|
289
|
+
EOF
|
|
290
|
+
chmod 600 "${HOME}/.config/gcloud/application_default_credentials.json"
|
|
291
|
+
fi
|
|
292
|
+
|
|
293
|
+
# ============================================================================
|
|
294
|
+
# Detect workspace path and start daemon
|
|
295
|
+
# The daemon must start from the same directory that spawned agents will use
|
|
296
|
+
# to ensure consistent socket paths
|
|
297
|
+
# ============================================================================
|
|
298
|
+
|
|
299
|
+
# Function to detect the actual workspace path (same logic as project-namespace.ts)
|
|
300
|
+
detect_workspace_path() {
|
|
301
|
+
local base_dir="${1}"
|
|
302
|
+
|
|
303
|
+
# 1. Explicit override via env var
|
|
304
|
+
if [[ -n "${WORKSPACE_CWD:-}" ]]; then
|
|
305
|
+
echo "${WORKSPACE_CWD}"
|
|
306
|
+
return
|
|
307
|
+
fi
|
|
308
|
+
|
|
309
|
+
# 2. Check if base_dir itself is a git repo
|
|
310
|
+
if [[ -d "${base_dir}/.git" ]]; then
|
|
311
|
+
echo "${base_dir}"
|
|
312
|
+
return
|
|
313
|
+
fi
|
|
314
|
+
|
|
315
|
+
# 3. Scan for cloned repos (directories with .git)
|
|
316
|
+
local first_repo=""
|
|
317
|
+
for dir in "${base_dir}"/*/; do
|
|
318
|
+
if [[ -d "${dir}.git" ]]; then
|
|
319
|
+
# Use first repo found (alphabetically sorted by bash glob)
|
|
320
|
+
first_repo="${dir%/}"
|
|
321
|
+
break
|
|
322
|
+
fi
|
|
323
|
+
done
|
|
324
|
+
|
|
325
|
+
if [[ -n "${first_repo}" ]]; then
|
|
326
|
+
echo "${first_repo}"
|
|
327
|
+
return
|
|
328
|
+
fi
|
|
329
|
+
|
|
330
|
+
# 4. Fall back to base_dir
|
|
331
|
+
echo "${base_dir}"
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
# Detect the actual workspace path
|
|
335
|
+
ACTUAL_WORKSPACE=$(detect_workspace_path "${WORKSPACE_DIR}")
|
|
336
|
+
log "Detected workspace path: ${ACTUAL_WORKSPACE}"
|
|
337
|
+
|
|
338
|
+
# Change to the detected workspace before starting daemon
|
|
339
|
+
cd "${ACTUAL_WORKSPACE}"
|
|
340
|
+
|
|
341
|
+
log "Starting agent-relay daemon on port ${PORT} from ${ACTUAL_WORKSPACE}"
|
|
342
|
+
args=(/app/dist/cli/index.js up --port "${PORT}")
|
|
343
|
+
|
|
344
|
+
if [[ "${SUPERVISOR_ENABLED:-true}" == "true" ]]; then
|
|
345
|
+
args+=("--watch")
|
|
346
|
+
fi
|
|
347
|
+
|
|
348
|
+
exec node "${args[@]}"
|
|
@@ -0,0 +1,111 @@
|
|
|
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
|
+
exit 1
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
# Parse JSON response using jq (more robust than grep)
|
|
93
|
+
token=$(echo "$response" | jq -r '.token // empty')
|
|
94
|
+
username=$(echo "$response" | jq -r '.username // "x-access-token"')
|
|
95
|
+
|
|
96
|
+
if [[ -z "$token" ]]; then
|
|
97
|
+
# Check if there's an error message
|
|
98
|
+
error=$(echo "$response" | jq -r '.error // empty')
|
|
99
|
+
if [[ -n "$error" ]]; then
|
|
100
|
+
echo "git-credential-relay: $error" >&2
|
|
101
|
+
else
|
|
102
|
+
echo "git-credential-relay: No token in response" >&2
|
|
103
|
+
fi
|
|
104
|
+
exit 1
|
|
105
|
+
fi
|
|
106
|
+
|
|
107
|
+
# Output credentials in git credential format
|
|
108
|
+
echo "protocol=https"
|
|
109
|
+
echo "host=github.com"
|
|
110
|
+
echo "username=${username:-x-access-token}"
|
|
111
|
+
echo "password=${token}"
|
package/dist/bridge/spawner.d.ts
CHANGED
|
@@ -3,7 +3,19 @@
|
|
|
3
3
|
* Handles spawning and releasing worker agents via node-pty.
|
|
4
4
|
* Workers run headlessly with output capture for logs.
|
|
5
5
|
*/
|
|
6
|
+
import { type SummaryEvent, type SessionEndEvent } from '../wrapper/pty-wrapper.js';
|
|
7
|
+
import { AgentPolicyService, type CloudPolicyFetcher } from '../policy/agent-policy.js';
|
|
6
8
|
import type { SpawnRequest, SpawnResult, WorkerInfo, SpawnWithShadowRequest, SpawnWithShadowResult } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Cloud persistence handler interface.
|
|
11
|
+
* Implement this to persist agent session data to cloud storage.
|
|
12
|
+
*/
|
|
13
|
+
export interface CloudPersistenceHandler {
|
|
14
|
+
onSummary: (agentName: string, event: SummaryEvent) => Promise<void>;
|
|
15
|
+
onSessionEnd: (agentName: string, event: SessionEndEvent) => Promise<void>;
|
|
16
|
+
/** Optional cleanup method for tests and graceful shutdown */
|
|
17
|
+
destroy?: () => void;
|
|
18
|
+
}
|
|
7
19
|
/** Worker metadata stored in workers.json */
|
|
8
20
|
interface WorkerMeta {
|
|
9
21
|
name: string;
|
|
@@ -15,6 +27,13 @@ interface WorkerMeta {
|
|
|
15
27
|
pid?: number;
|
|
16
28
|
logFile?: string;
|
|
17
29
|
}
|
|
30
|
+
/** Callback for agent death notifications */
|
|
31
|
+
export type OnAgentDeathCallback = (info: {
|
|
32
|
+
name: string;
|
|
33
|
+
exitCode: number | null;
|
|
34
|
+
agentId?: string;
|
|
35
|
+
resumeInstructions?: string;
|
|
36
|
+
}) => void;
|
|
18
37
|
export declare class AgentSpawner {
|
|
19
38
|
private activeWorkers;
|
|
20
39
|
private agentsPath;
|
|
@@ -23,12 +42,46 @@ export declare class AgentSpawner {
|
|
|
23
42
|
private logsDir;
|
|
24
43
|
private workersPath;
|
|
25
44
|
private dashboardPort?;
|
|
45
|
+
private onAgentDeath?;
|
|
46
|
+
private cloudPersistence?;
|
|
47
|
+
private policyService?;
|
|
48
|
+
private policyEnforcementEnabled;
|
|
26
49
|
constructor(projectRoot: string, _tmuxSession?: string, dashboardPort?: number);
|
|
50
|
+
/**
|
|
51
|
+
* Set cloud policy fetcher for workspace-level policies
|
|
52
|
+
*/
|
|
53
|
+
setCloudPolicyFetcher(fetcher: CloudPolicyFetcher): void;
|
|
54
|
+
/**
|
|
55
|
+
* Get the policy service (for external access to policy checks)
|
|
56
|
+
*/
|
|
57
|
+
getPolicyService(): AgentPolicyService | undefined;
|
|
27
58
|
/**
|
|
28
59
|
* Set the dashboard port (for nested spawn API calls).
|
|
29
60
|
* Called after the dashboard server starts and we know the actual port.
|
|
30
61
|
*/
|
|
31
62
|
setDashboardPort(port: number): void;
|
|
63
|
+
/**
|
|
64
|
+
* Set callback for agent death notifications.
|
|
65
|
+
* Called when an agent exits unexpectedly (non-zero exit code).
|
|
66
|
+
*/
|
|
67
|
+
setOnAgentDeath(callback: OnAgentDeathCallback): void;
|
|
68
|
+
/**
|
|
69
|
+
* Set cloud persistence handler for forwarding PtyWrapper events.
|
|
70
|
+
* When set, 'summary' and 'session-end' events from spawned agents
|
|
71
|
+
* are forwarded to the handler for cloud persistence (PostgreSQL/Redis).
|
|
72
|
+
*
|
|
73
|
+
* Note: Enable via RELAY_CLOUD_ENABLED=true environment variable.
|
|
74
|
+
*/
|
|
75
|
+
setCloudPersistence(handler: CloudPersistenceHandler): void;
|
|
76
|
+
/**
|
|
77
|
+
* Bind cloud persistence event handlers to a PtyWrapper.
|
|
78
|
+
* Returns the listener references for cleanup.
|
|
79
|
+
*/
|
|
80
|
+
private bindCloudPersistenceEvents;
|
|
81
|
+
/**
|
|
82
|
+
* Unbind all tracked listeners from a PtyWrapper.
|
|
83
|
+
*/
|
|
84
|
+
private unbindListeners;
|
|
32
85
|
/**
|
|
33
86
|
* Spawn a new worker agent using node-pty
|
|
34
87
|
*/
|