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
package/dist/bridge/spawner.js
CHANGED
|
@@ -10,6 +10,19 @@ import { getProjectPaths } from '../utils/project-namespace.js';
|
|
|
10
10
|
import { resolveCommand } from '../utils/command-resolver.js';
|
|
11
11
|
import { PtyWrapper } from '../wrapper/pty-wrapper.js';
|
|
12
12
|
import { selectShadowCli } from './shadow-cli.js';
|
|
13
|
+
import { AgentPolicyService } from '../policy/agent-policy.js';
|
|
14
|
+
/**
|
|
15
|
+
* Get a minimal relay reminder.
|
|
16
|
+
* Agents already have full relay docs via CLAUDE.md - this is just a brief reminder.
|
|
17
|
+
* Loading full docs (400+ lines) overwhelms agents and causes "meandering".
|
|
18
|
+
*/
|
|
19
|
+
function getMinimalRelayReminder() {
|
|
20
|
+
return `# Quick Relay Reference
|
|
21
|
+
- Send: \`->relay:Name <<<message>>>\`
|
|
22
|
+
- ACK tasks, send DONE when complete
|
|
23
|
+
- Use \`trail start/decision/complete\` for trajectories
|
|
24
|
+
- Output \`[[SESSION_END]]..[[/SESSION_END]]\` when done`;
|
|
25
|
+
}
|
|
13
26
|
export class AgentSpawner {
|
|
14
27
|
activeWorkers = new Map();
|
|
15
28
|
agentsPath;
|
|
@@ -18,6 +31,10 @@ export class AgentSpawner {
|
|
|
18
31
|
logsDir;
|
|
19
32
|
workersPath;
|
|
20
33
|
dashboardPort;
|
|
34
|
+
onAgentDeath;
|
|
35
|
+
cloudPersistence;
|
|
36
|
+
policyService;
|
|
37
|
+
policyEnforcementEnabled = false;
|
|
21
38
|
constructor(projectRoot, _tmuxSession, dashboardPort) {
|
|
22
39
|
const paths = getProjectPaths(projectRoot);
|
|
23
40
|
this.projectRoot = paths.projectRoot;
|
|
@@ -28,19 +45,111 @@ export class AgentSpawner {
|
|
|
28
45
|
this.dashboardPort = dashboardPort;
|
|
29
46
|
// Ensure logs directory exists
|
|
30
47
|
fs.mkdirSync(this.logsDir, { recursive: true });
|
|
48
|
+
// Initialize policy service if enforcement is enabled
|
|
49
|
+
if (process.env.AGENT_POLICY_ENFORCEMENT === '1') {
|
|
50
|
+
this.policyEnforcementEnabled = true;
|
|
51
|
+
this.policyService = new AgentPolicyService({
|
|
52
|
+
projectRoot: this.projectRoot,
|
|
53
|
+
workspaceId: process.env.WORKSPACE_ID,
|
|
54
|
+
strictMode: process.env.AGENT_POLICY_STRICT === '1',
|
|
55
|
+
});
|
|
56
|
+
console.log('[spawner] Policy enforcement enabled');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Set cloud policy fetcher for workspace-level policies
|
|
61
|
+
*/
|
|
62
|
+
setCloudPolicyFetcher(fetcher) {
|
|
63
|
+
if (this.policyService) {
|
|
64
|
+
// Recreate policy service with cloud fetcher
|
|
65
|
+
this.policyService = new AgentPolicyService({
|
|
66
|
+
projectRoot: this.projectRoot,
|
|
67
|
+
workspaceId: process.env.WORKSPACE_ID,
|
|
68
|
+
cloudFetcher: fetcher,
|
|
69
|
+
strictMode: process.env.AGENT_POLICY_STRICT === '1',
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get the policy service (for external access to policy checks)
|
|
75
|
+
*/
|
|
76
|
+
getPolicyService() {
|
|
77
|
+
return this.policyService;
|
|
31
78
|
}
|
|
32
79
|
/**
|
|
33
80
|
* Set the dashboard port (for nested spawn API calls).
|
|
34
81
|
* Called after the dashboard server starts and we know the actual port.
|
|
35
82
|
*/
|
|
36
83
|
setDashboardPort(port) {
|
|
84
|
+
console.log(`[spawner] Dashboard port set to ${port} - nested spawns now enabled`);
|
|
37
85
|
this.dashboardPort = port;
|
|
38
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Set callback for agent death notifications.
|
|
89
|
+
* Called when an agent exits unexpectedly (non-zero exit code).
|
|
90
|
+
*/
|
|
91
|
+
setOnAgentDeath(callback) {
|
|
92
|
+
this.onAgentDeath = callback;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Set cloud persistence handler for forwarding PtyWrapper events.
|
|
96
|
+
* When set, 'summary' and 'session-end' events from spawned agents
|
|
97
|
+
* are forwarded to the handler for cloud persistence (PostgreSQL/Redis).
|
|
98
|
+
*
|
|
99
|
+
* Note: Enable via RELAY_CLOUD_ENABLED=true environment variable.
|
|
100
|
+
*/
|
|
101
|
+
setCloudPersistence(handler) {
|
|
102
|
+
this.cloudPersistence = handler;
|
|
103
|
+
console.log('[spawner] Cloud persistence handler set');
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Bind cloud persistence event handlers to a PtyWrapper.
|
|
107
|
+
* Returns the listener references for cleanup.
|
|
108
|
+
*/
|
|
109
|
+
bindCloudPersistenceEvents(name, pty) {
|
|
110
|
+
if (!this.cloudPersistence)
|
|
111
|
+
return {};
|
|
112
|
+
const summaryListener = async (event) => {
|
|
113
|
+
try {
|
|
114
|
+
await this.cloudPersistence.onSummary(name, event);
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
console.error(`[spawner] Cloud persistence summary error for ${name}:`, err);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
const sessionEndListener = async (event) => {
|
|
121
|
+
try {
|
|
122
|
+
await this.cloudPersistence.onSessionEnd(name, event);
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
console.error(`[spawner] Cloud persistence session-end error for ${name}:`, err);
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
pty.on('summary', summaryListener);
|
|
129
|
+
pty.on('session-end', sessionEndListener);
|
|
130
|
+
return { summary: summaryListener, sessionEnd: sessionEndListener };
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Unbind all tracked listeners from a PtyWrapper.
|
|
134
|
+
*/
|
|
135
|
+
unbindListeners(pty, listeners) {
|
|
136
|
+
if (!listeners)
|
|
137
|
+
return;
|
|
138
|
+
if (listeners.output) {
|
|
139
|
+
pty.off('output', listeners.output);
|
|
140
|
+
}
|
|
141
|
+
if (listeners.summary) {
|
|
142
|
+
pty.off('summary', listeners.summary);
|
|
143
|
+
}
|
|
144
|
+
if (listeners.sessionEnd) {
|
|
145
|
+
pty.off('session-end', listeners.sessionEnd);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
39
148
|
/**
|
|
40
149
|
* Spawn a new worker agent using node-pty
|
|
41
150
|
*/
|
|
42
151
|
async spawn(request) {
|
|
43
|
-
const { name, cli, task, team } = request;
|
|
152
|
+
const { name, cli, task, team, spawnerName } = request;
|
|
44
153
|
const debug = process.env.DEBUG_SPAWN === '1';
|
|
45
154
|
// Check if worker already exists
|
|
46
155
|
if (this.activeWorkers.has(name)) {
|
|
@@ -50,6 +159,22 @@ export class AgentSpawner {
|
|
|
50
159
|
error: `Worker ${name} already exists`,
|
|
51
160
|
};
|
|
52
161
|
}
|
|
162
|
+
// Policy enforcement: check if the spawner is authorized to spawn this agent
|
|
163
|
+
if (this.policyEnforcementEnabled && this.policyService && spawnerName) {
|
|
164
|
+
const decision = await this.policyService.canSpawn(spawnerName, name, cli);
|
|
165
|
+
if (!decision.allowed) {
|
|
166
|
+
console.warn(`[spawner] Policy blocked spawn: ${spawnerName} -> ${name}: ${decision.reason}`);
|
|
167
|
+
return {
|
|
168
|
+
success: false,
|
|
169
|
+
name,
|
|
170
|
+
error: `Policy denied: ${decision.reason}`,
|
|
171
|
+
policyDecision: decision,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
if (debug) {
|
|
175
|
+
console.log(`[spawner:debug] Policy allowed spawn: ${spawnerName} -> ${name} (source: ${decision.policySource})`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
53
178
|
try {
|
|
54
179
|
// Parse CLI command
|
|
55
180
|
const cliParts = cli.split(' ');
|
|
@@ -76,13 +201,19 @@ export class AgentSpawner {
|
|
|
76
201
|
console.log(`[spawner:debug] Spawning ${name} with: ${command} ${args.join(' ')}`);
|
|
77
202
|
// Create PtyWrapper config
|
|
78
203
|
// Use dashboardPort for nested spawns (API-based, works in non-TTY contexts)
|
|
79
|
-
// Fall back to callbacks only if no dashboardPort is set
|
|
204
|
+
// Fall back to callbacks only if no dashboardPort is not set
|
|
205
|
+
// Note: Spawned agents CAN spawn sub-workers intentionally - the parser is strict enough
|
|
206
|
+
// to avoid accidental spawns from documentation text (requires line start, PascalCase, known CLI)
|
|
207
|
+
// Use request.cwd if specified, otherwise use projectRoot
|
|
208
|
+
const agentCwd = request.cwd || this.projectRoot;
|
|
209
|
+
// Log whether nested spawning will be enabled for this agent
|
|
210
|
+
console.log(`[spawner] Spawning ${name}: dashboardPort=${this.dashboardPort || 'none'} (${this.dashboardPort ? 'nested spawns enabled' : 'nested spawns disabled'})`);
|
|
80
211
|
const ptyConfig = {
|
|
81
212
|
name,
|
|
82
213
|
command,
|
|
83
214
|
args,
|
|
84
215
|
socketPath: this.socketPath,
|
|
85
|
-
cwd:
|
|
216
|
+
cwd: agentCwd,
|
|
86
217
|
logsDir: this.logsDir,
|
|
87
218
|
dashboardPort: this.dashboardPort,
|
|
88
219
|
// Shadow agent configuration
|
|
@@ -109,20 +240,52 @@ export class AgentSpawner {
|
|
|
109
240
|
onExit: (code) => {
|
|
110
241
|
if (debug)
|
|
111
242
|
console.log(`[spawner:debug] Worker ${name} exited with code ${code}`);
|
|
243
|
+
// Get the agentId and clean up listeners before removing from active workers
|
|
244
|
+
const worker = this.activeWorkers.get(name);
|
|
245
|
+
const agentId = worker?.pty?.getAgentId?.();
|
|
246
|
+
if (worker?.listeners) {
|
|
247
|
+
this.unbindListeners(worker.pty, worker.listeners);
|
|
248
|
+
}
|
|
112
249
|
this.activeWorkers.delete(name);
|
|
113
|
-
|
|
250
|
+
try {
|
|
251
|
+
this.saveWorkersMetadata();
|
|
252
|
+
}
|
|
253
|
+
catch (err) {
|
|
254
|
+
console.error(`[spawner] Failed to save metadata on exit:`, err);
|
|
255
|
+
}
|
|
256
|
+
// Notify if agent died unexpectedly (non-zero exit)
|
|
257
|
+
if (code !== 0 && code !== null && this.onAgentDeath) {
|
|
258
|
+
this.onAgentDeath({
|
|
259
|
+
name,
|
|
260
|
+
exitCode: code,
|
|
261
|
+
agentId,
|
|
262
|
+
resumeInstructions: agentId
|
|
263
|
+
? `To resume this agent's work, use: --resume ${agentId}`
|
|
264
|
+
: undefined,
|
|
265
|
+
});
|
|
266
|
+
}
|
|
114
267
|
},
|
|
115
268
|
};
|
|
116
269
|
// Create and start the pty wrapper
|
|
117
270
|
const pty = new PtyWrapper(ptyConfig);
|
|
271
|
+
// Track listener references for proper cleanup
|
|
272
|
+
const listeners = {};
|
|
118
273
|
// Hook up output events for live log streaming
|
|
119
|
-
|
|
274
|
+
const outputListener = (data) => {
|
|
120
275
|
// Broadcast to any connected WebSocket clients via global function
|
|
121
276
|
const broadcast = global.__broadcastLogOutput;
|
|
122
277
|
if (broadcast) {
|
|
123
278
|
broadcast(name, data);
|
|
124
279
|
}
|
|
125
|
-
}
|
|
280
|
+
};
|
|
281
|
+
pty.on('output', outputListener);
|
|
282
|
+
listeners.output = outputListener;
|
|
283
|
+
// Bind cloud persistence events (if enabled) and store references
|
|
284
|
+
const cloudListeners = this.bindCloudPersistenceEvents(name, pty);
|
|
285
|
+
if (cloudListeners.summary)
|
|
286
|
+
listeners.summary = cloudListeners.summary;
|
|
287
|
+
if (cloudListeners.sessionEnd)
|
|
288
|
+
listeners.sessionEnd = cloudListeners.sessionEnd;
|
|
126
289
|
await pty.start();
|
|
127
290
|
if (debug)
|
|
128
291
|
console.log(`[spawner:debug] PTY started, pid: ${pty.pid}`);
|
|
@@ -131,18 +294,37 @@ export class AgentSpawner {
|
|
|
131
294
|
if (!registered) {
|
|
132
295
|
const error = `Worker ${name} failed to register within 30s`;
|
|
133
296
|
console.error(`[spawner] ${error}`);
|
|
134
|
-
pty.kill();
|
|
297
|
+
await pty.kill();
|
|
135
298
|
return {
|
|
136
299
|
success: false,
|
|
137
300
|
name,
|
|
138
301
|
error,
|
|
139
302
|
};
|
|
140
303
|
}
|
|
304
|
+
// Build the full message: minimal relay reminder + policy instructions (if any) + task
|
|
305
|
+
let fullMessage = task || '';
|
|
306
|
+
// Prepend a brief relay reminder (agents have full docs via CLAUDE.md)
|
|
307
|
+
// Note: Previously loaded full 400+ line docs which overwhelmed agents
|
|
308
|
+
const relayReminder = getMinimalRelayReminder();
|
|
309
|
+
if (relayReminder) {
|
|
310
|
+
fullMessage = `${relayReminder}\n\n---\n\n${fullMessage}`;
|
|
311
|
+
if (debug)
|
|
312
|
+
console.log(`[spawner:debug] Prepended relay reminder for ${name}`);
|
|
313
|
+
}
|
|
314
|
+
// Prepend policy instructions if enforcement is enabled
|
|
315
|
+
if (this.policyEnforcementEnabled && this.policyService) {
|
|
316
|
+
const policyInstruction = await this.policyService.getPolicyInstruction(name);
|
|
317
|
+
if (policyInstruction) {
|
|
318
|
+
fullMessage = `${policyInstruction}\n\n${fullMessage}`;
|
|
319
|
+
if (debug)
|
|
320
|
+
console.log(`[spawner:debug] Prepended policy instructions to task for ${name}`);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
141
323
|
// Send task via relay message if provided (not via direct PTY injection)
|
|
142
324
|
// This ensures the agent is ready to receive before processing the task
|
|
143
|
-
if (
|
|
325
|
+
if (fullMessage && fullMessage.trim()) {
|
|
144
326
|
if (debug)
|
|
145
|
-
console.log(`[spawner:debug] Will send task via relay: ${
|
|
327
|
+
console.log(`[spawner:debug] Will send task via relay: ${fullMessage.substring(0, 50)}...`);
|
|
146
328
|
// If we have dashboard API, send task as relay message
|
|
147
329
|
if (this.dashboardPort) {
|
|
148
330
|
// Wait a moment for the agent's relay client to be ready
|
|
@@ -153,7 +335,7 @@ export class AgentSpawner {
|
|
|
153
335
|
headers: { 'Content-Type': 'application/json' },
|
|
154
336
|
body: JSON.stringify({
|
|
155
337
|
to: name,
|
|
156
|
-
message:
|
|
338
|
+
message: fullMessage,
|
|
157
339
|
from: '__spawner__',
|
|
158
340
|
}),
|
|
159
341
|
});
|
|
@@ -165,19 +347,19 @@ export class AgentSpawner {
|
|
|
165
347
|
else {
|
|
166
348
|
console.warn(`[spawner] Failed to send task via relay: ${result.error}`);
|
|
167
349
|
// Fall back to direct injection
|
|
168
|
-
pty.write(
|
|
350
|
+
pty.write(fullMessage + '\r');
|
|
169
351
|
}
|
|
170
352
|
}
|
|
171
353
|
catch (err) {
|
|
172
354
|
console.warn(`[spawner] Relay send failed, falling back to direct injection: ${err.message}`);
|
|
173
|
-
pty.write(
|
|
355
|
+
pty.write(fullMessage + '\r');
|
|
174
356
|
}
|
|
175
357
|
}
|
|
176
358
|
else {
|
|
177
359
|
// No dashboard API available - use direct injection as fallback
|
|
178
360
|
if (debug)
|
|
179
361
|
console.log(`[spawner:debug] No dashboard API, using direct injection`);
|
|
180
|
-
pty.write(
|
|
362
|
+
pty.write(fullMessage + '\r');
|
|
181
363
|
}
|
|
182
364
|
}
|
|
183
365
|
// Track the worker
|
|
@@ -190,6 +372,7 @@ export class AgentSpawner {
|
|
|
190
372
|
pid: pty.pid,
|
|
191
373
|
pty,
|
|
192
374
|
logFile: pty.logPath,
|
|
375
|
+
listeners, // Store for cleanup
|
|
193
376
|
};
|
|
194
377
|
this.activeWorkers.set(name, workerInfo);
|
|
195
378
|
this.saveWorkersMetadata();
|
|
@@ -334,13 +517,13 @@ export class AgentSpawner {
|
|
|
334
517
|
return false;
|
|
335
518
|
}
|
|
336
519
|
try {
|
|
337
|
-
//
|
|
338
|
-
worker.pty.
|
|
339
|
-
//
|
|
340
|
-
await
|
|
520
|
+
// Unbind all listeners first to prevent memory leaks
|
|
521
|
+
this.unbindListeners(worker.pty, worker.listeners);
|
|
522
|
+
// Stop the pty process gracefully (handles auto-save internally)
|
|
523
|
+
await worker.pty.stop();
|
|
341
524
|
// Force kill if still running
|
|
342
525
|
if (worker.pty.isRunning) {
|
|
343
|
-
worker.pty.kill();
|
|
526
|
+
await worker.pty.kill();
|
|
344
527
|
}
|
|
345
528
|
this.activeWorkers.delete(name);
|
|
346
529
|
this.saveWorkersMetadata();
|
|
@@ -349,7 +532,8 @@ export class AgentSpawner {
|
|
|
349
532
|
}
|
|
350
533
|
catch (err) {
|
|
351
534
|
console.error(`[spawner] Failed to release ${name}:`, err.message);
|
|
352
|
-
// Still remove from tracking
|
|
535
|
+
// Still unbind and remove from tracking
|
|
536
|
+
this.unbindListeners(worker.pty, worker.listeners);
|
|
353
537
|
this.activeWorkers.delete(name);
|
|
354
538
|
this.saveWorkersMetadata();
|
|
355
539
|
return false;
|
package/dist/bridge/types.d.ts
CHANGED
|
@@ -37,6 +37,10 @@ export interface SpawnRequest {
|
|
|
37
37
|
task: string;
|
|
38
38
|
/** Optional team name to organize agents under */
|
|
39
39
|
team?: string;
|
|
40
|
+
/** Working directory for the agent (defaults to detected workspace) */
|
|
41
|
+
cwd?: string;
|
|
42
|
+
/** Name of the agent requesting the spawn (for policy enforcement) */
|
|
43
|
+
spawnerName?: string;
|
|
40
44
|
/** Shadow execution mode (subagent = no extra process) */
|
|
41
45
|
shadowMode?: 'subagent' | 'process';
|
|
42
46
|
/** Primary agent to shadow (if this agent is a shadow) */
|
|
@@ -48,12 +52,20 @@ export interface SpawnRequest {
|
|
|
48
52
|
/** When the shadow should speak (default: ['EXPLICIT_ASK']) */
|
|
49
53
|
shadowSpeakOn?: Array<'SESSION_END' | 'CODE_WRITTEN' | 'REVIEW_REQUEST' | 'EXPLICIT_ASK' | 'ALL_MESSAGES'>;
|
|
50
54
|
}
|
|
55
|
+
/** Policy decision details */
|
|
56
|
+
export interface PolicyDecision {
|
|
57
|
+
allowed: boolean;
|
|
58
|
+
reason: string;
|
|
59
|
+
policySource: 'repo' | 'local' | 'workspace' | 'default';
|
|
60
|
+
}
|
|
51
61
|
export interface SpawnResult {
|
|
52
62
|
success: boolean;
|
|
53
63
|
name: string;
|
|
54
64
|
/** PID of the spawned process (for pty-based workers) */
|
|
55
65
|
pid?: number;
|
|
56
66
|
error?: string;
|
|
67
|
+
/** Policy decision details if spawn was blocked by policy */
|
|
68
|
+
policyDecision?: PolicyDecision;
|
|
57
69
|
}
|
|
58
70
|
export interface WorkerInfo {
|
|
59
71
|
name: string;
|