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,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Continuity System Types
|
|
3
|
+
*
|
|
4
|
+
* Core types for the CLI-agnostic session continuity system.
|
|
5
|
+
* Works with any CLI (Claude, Codex, Gemini, custom) via output
|
|
6
|
+
* pattern detection and PTY injection.
|
|
7
|
+
*/
|
|
8
|
+
import type { PDEROPhase } from '../trajectory/integration.js';
|
|
9
|
+
/**
|
|
10
|
+
* A decision recorded during agent work
|
|
11
|
+
*/
|
|
12
|
+
export interface Decision {
|
|
13
|
+
/** The choice that was made */
|
|
14
|
+
decision: string;
|
|
15
|
+
/** Why this choice was made */
|
|
16
|
+
reasoning?: string;
|
|
17
|
+
/** Alternative options considered */
|
|
18
|
+
alternatives?: string[];
|
|
19
|
+
/** Confidence level (0-1) */
|
|
20
|
+
confidence?: number;
|
|
21
|
+
/** When the decision was made */
|
|
22
|
+
timestamp: Date;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* A file reference with optional line numbers
|
|
26
|
+
*/
|
|
27
|
+
export interface FileRef {
|
|
28
|
+
/** Relative or absolute path */
|
|
29
|
+
path: string;
|
|
30
|
+
/** Line range [start, end] */
|
|
31
|
+
lines?: [number, number];
|
|
32
|
+
/** Brief description of what's relevant */
|
|
33
|
+
description?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Ledger - Within-session state snapshot
|
|
37
|
+
*
|
|
38
|
+
* Ephemeral, overwritten each session. Captures current work state
|
|
39
|
+
* for context injection on restart/clear.
|
|
40
|
+
*/
|
|
41
|
+
export interface Ledger {
|
|
42
|
+
/** Agent name this ledger belongs to */
|
|
43
|
+
agentName: string;
|
|
44
|
+
/** Unique agent instance ID (persists across restarts for resume) */
|
|
45
|
+
agentId: string;
|
|
46
|
+
/** Unique session identifier */
|
|
47
|
+
sessionId: string;
|
|
48
|
+
/** CLI being used (claude, codex, gemini, custom) */
|
|
49
|
+
cli: string;
|
|
50
|
+
/** What the agent is currently working on */
|
|
51
|
+
currentTask: string;
|
|
52
|
+
/** Completed work items */
|
|
53
|
+
completed: string[];
|
|
54
|
+
/** Work in progress */
|
|
55
|
+
inProgress: string[];
|
|
56
|
+
/** Blocked items with reasons */
|
|
57
|
+
blocked: string[];
|
|
58
|
+
/** Key decisions made during session */
|
|
59
|
+
keyDecisions: Decision[];
|
|
60
|
+
/** Items marked as uncertain (need verification) */
|
|
61
|
+
uncertainItems: string[];
|
|
62
|
+
/** Recently touched files */
|
|
63
|
+
fileContext: FileRef[];
|
|
64
|
+
/** Active trajectory ID if using trail */
|
|
65
|
+
trajectoryId?: string;
|
|
66
|
+
/** Current PDERO phase */
|
|
67
|
+
pderoPhase?: PDEROPhase;
|
|
68
|
+
/** Last update timestamp */
|
|
69
|
+
updatedAt: Date;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Handoff - Cross-session transfer document
|
|
73
|
+
*
|
|
74
|
+
* Permanent, searchable. Created on trajectory completion,
|
|
75
|
+
* context limit, crash, or manual save.
|
|
76
|
+
*/
|
|
77
|
+
export interface Handoff {
|
|
78
|
+
/** Unique handoff identifier */
|
|
79
|
+
id: string;
|
|
80
|
+
/** Agent that created this handoff */
|
|
81
|
+
agentName: string;
|
|
82
|
+
/** Agent instance ID that created this handoff */
|
|
83
|
+
agentId?: string;
|
|
84
|
+
/** CLI used (for context) */
|
|
85
|
+
cli: string;
|
|
86
|
+
/** Brief summary of the handoff */
|
|
87
|
+
summary: string;
|
|
88
|
+
/** Task being worked on */
|
|
89
|
+
taskDescription: string;
|
|
90
|
+
/** Work completed before handoff */
|
|
91
|
+
completedWork: string[];
|
|
92
|
+
/** Recommended next steps */
|
|
93
|
+
nextSteps: string[];
|
|
94
|
+
/** Files relevant to the work */
|
|
95
|
+
fileReferences: FileRef[];
|
|
96
|
+
/** Key decisions made */
|
|
97
|
+
decisions: Decision[];
|
|
98
|
+
/** Links to related previous handoffs */
|
|
99
|
+
relatedHandoffs: string[];
|
|
100
|
+
/** When the handoff was created */
|
|
101
|
+
createdAt: Date;
|
|
102
|
+
/** What triggered the handoff */
|
|
103
|
+
triggerReason: HandoffTrigger;
|
|
104
|
+
/** Trajectory ID if created from trajectory completion */
|
|
105
|
+
trajectoryId?: string;
|
|
106
|
+
/** PDERO phase at handoff time */
|
|
107
|
+
pderoPhase?: PDEROPhase;
|
|
108
|
+
/** Confidence level from trajectory */
|
|
109
|
+
confidence?: number;
|
|
110
|
+
/** Learnings extracted from trajectory */
|
|
111
|
+
learnings?: string[];
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* What triggered handoff creation
|
|
115
|
+
*/
|
|
116
|
+
export type HandoffTrigger = 'manual' | 'trajectory_complete' | 'context_limit' | 'auto_restart' | 'crash' | 'session_end';
|
|
117
|
+
/**
|
|
118
|
+
* Continuity command parsed from agent output
|
|
119
|
+
*/
|
|
120
|
+
export interface ContinuityCommand {
|
|
121
|
+
/** Command type */
|
|
122
|
+
type: 'save' | 'load' | 'search' | 'uncertain' | 'handoff';
|
|
123
|
+
/** Content for save commands */
|
|
124
|
+
content?: string;
|
|
125
|
+
/** Query for search commands */
|
|
126
|
+
query?: string;
|
|
127
|
+
/** Item for uncertain command */
|
|
128
|
+
item?: string;
|
|
129
|
+
/** Whether to create a handoff (for save) */
|
|
130
|
+
createHandoff?: boolean;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Context to inject on agent startup
|
|
134
|
+
*/
|
|
135
|
+
export interface StartupContext {
|
|
136
|
+
/** The ledger if available */
|
|
137
|
+
ledger?: Ledger;
|
|
138
|
+
/** The most recent handoff if available */
|
|
139
|
+
handoff?: Handoff;
|
|
140
|
+
/** Relevant learnings from past sessions */
|
|
141
|
+
learnings?: string[];
|
|
142
|
+
/** Formatted markdown to inject */
|
|
143
|
+
formatted: string;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Continuity storage paths
|
|
147
|
+
*/
|
|
148
|
+
export interface ContinuityPaths {
|
|
149
|
+
/** Base continuity directory */
|
|
150
|
+
base: string;
|
|
151
|
+
/** Ledgers directory */
|
|
152
|
+
ledgers: string;
|
|
153
|
+
/** Handoffs directory */
|
|
154
|
+
handoffs: string;
|
|
155
|
+
/** Artifact index database */
|
|
156
|
+
artifactDb: string;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Options for saving a ledger
|
|
160
|
+
*/
|
|
161
|
+
export interface SaveLedgerOptions {
|
|
162
|
+
/** Create a handoff as well */
|
|
163
|
+
createHandoff?: boolean;
|
|
164
|
+
/** Trigger reason if creating handoff */
|
|
165
|
+
triggerReason?: HandoffTrigger;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Options for searching handoffs
|
|
169
|
+
*/
|
|
170
|
+
export interface SearchOptions {
|
|
171
|
+
/** Filter by agent name */
|
|
172
|
+
agentName?: string;
|
|
173
|
+
/** Maximum results to return */
|
|
174
|
+
limit?: number;
|
|
175
|
+
/** Filter by date range */
|
|
176
|
+
since?: Date;
|
|
177
|
+
/** Filter by trigger reason */
|
|
178
|
+
triggerReason?: HandoffTrigger;
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -3,13 +3,31 @@
|
|
|
3
3
|
* Manages agents across workspaces with integrated resiliency.
|
|
4
4
|
*/
|
|
5
5
|
import { EventEmitter } from 'events';
|
|
6
|
+
import { type SummaryEvent, type SessionEndEvent } from '../wrapper/pty-wrapper.js';
|
|
6
7
|
import type { Agent, SpawnAgentRequest } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Optional cloud persistence handler.
|
|
10
|
+
* When set, agent-manager forwards PtyWrapper events to this handler.
|
|
11
|
+
*/
|
|
12
|
+
export interface CloudPersistenceHandler {
|
|
13
|
+
onSummary: (agentId: string, event: SummaryEvent) => Promise<void>;
|
|
14
|
+
onSessionEnd: (agentId: string, event: SessionEndEvent) => Promise<void>;
|
|
15
|
+
/** Optional cleanup method for tests and graceful shutdown */
|
|
16
|
+
destroy?: () => void;
|
|
17
|
+
}
|
|
7
18
|
export declare class AgentManager extends EventEmitter {
|
|
8
19
|
private agents;
|
|
9
20
|
private supervisor;
|
|
10
21
|
private dataDir;
|
|
11
22
|
private logsDir;
|
|
23
|
+
private cloudPersistence?;
|
|
12
24
|
constructor(dataDir: string);
|
|
25
|
+
/**
|
|
26
|
+
* Set cloud persistence handler for forwarding PtyWrapper events.
|
|
27
|
+
* When set, 'summary' and 'session-end' events from agents are forwarded
|
|
28
|
+
* to the handler for cloud persistence (PostgreSQL/Redis).
|
|
29
|
+
*/
|
|
30
|
+
setCloudPersistence(handler: CloudPersistenceHandler): void;
|
|
13
31
|
/**
|
|
14
32
|
* Spawn a new agent in a workspace
|
|
15
33
|
*/
|
|
@@ -62,6 +80,15 @@ export declare class AgentManager extends EventEmitter {
|
|
|
62
80
|
* Handle agent exit
|
|
63
81
|
*/
|
|
64
82
|
private handleAgentExit;
|
|
83
|
+
/**
|
|
84
|
+
* Bind PtyWrapper events to cloud persistence and daemon events.
|
|
85
|
+
*
|
|
86
|
+
* Events bound:
|
|
87
|
+
* - 'summary': Agent output a [[SUMMARY]] block
|
|
88
|
+
* - 'session-end': Agent output a [[SESSION_END]] block
|
|
89
|
+
* - 'injection-failed': Message injection failed after retries
|
|
90
|
+
*/
|
|
91
|
+
private bindPtyEvents;
|
|
65
92
|
/**
|
|
66
93
|
* Setup supervisor event handlers
|
|
67
94
|
*/
|
|
@@ -26,6 +26,7 @@ export class AgentManager extends EventEmitter {
|
|
|
26
26
|
});
|
|
27
27
|
dataDir;
|
|
28
28
|
logsDir;
|
|
29
|
+
cloudPersistence;
|
|
29
30
|
constructor(dataDir) {
|
|
30
31
|
super();
|
|
31
32
|
this.dataDir = dataDir;
|
|
@@ -40,6 +41,15 @@ export class AgentManager extends EventEmitter {
|
|
|
40
41
|
this.supervisor.start();
|
|
41
42
|
logger.info('Agent manager initialized');
|
|
42
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* Set cloud persistence handler for forwarding PtyWrapper events.
|
|
46
|
+
* When set, 'summary' and 'session-end' events from agents are forwarded
|
|
47
|
+
* to the handler for cloud persistence (PostgreSQL/Redis).
|
|
48
|
+
*/
|
|
49
|
+
setCloudPersistence(handler) {
|
|
50
|
+
this.cloudPersistence = handler;
|
|
51
|
+
logger.info('Cloud persistence handler set');
|
|
52
|
+
}
|
|
43
53
|
/**
|
|
44
54
|
* Spawn a new agent in a workspace
|
|
45
55
|
*/
|
|
@@ -97,6 +107,8 @@ export class AgentManager extends EventEmitter {
|
|
|
97
107
|
await pty.start();
|
|
98
108
|
agent.pid = pty.pid;
|
|
99
109
|
agent.pty = pty;
|
|
110
|
+
// Subscribe to PtyWrapper events for cloud persistence
|
|
111
|
+
this.bindPtyEvents(agent.id, pty);
|
|
100
112
|
// Inject initial task
|
|
101
113
|
if (task && task.trim()) {
|
|
102
114
|
pty.write(task + '\r');
|
|
@@ -161,14 +173,12 @@ export class AgentManager extends EventEmitter {
|
|
|
161
173
|
try {
|
|
162
174
|
// Remove from supervisor
|
|
163
175
|
this.supervisor.unsupervise(agent.name);
|
|
164
|
-
// Stop PTY
|
|
176
|
+
// Stop PTY (handles auto-save internally)
|
|
165
177
|
if (agent.pty) {
|
|
166
|
-
agent.pty.stop();
|
|
167
|
-
// Wait for graceful shutdown
|
|
168
|
-
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
178
|
+
await agent.pty.stop();
|
|
169
179
|
// Force kill if still running
|
|
170
180
|
if (agent.pty.isRunning) {
|
|
171
|
-
agent.pty.kill();
|
|
181
|
+
await agent.pty.kill();
|
|
172
182
|
}
|
|
173
183
|
}
|
|
174
184
|
agent.status = 'stopped';
|
|
@@ -300,6 +310,8 @@ export class AgentManager extends EventEmitter {
|
|
|
300
310
|
agent.pty = pty;
|
|
301
311
|
agent.status = 'running';
|
|
302
312
|
agent.spawnedAt = new Date();
|
|
313
|
+
// Re-bind events for the new PTY
|
|
314
|
+
this.bindPtyEvents(agent.id, pty);
|
|
303
315
|
logger.info('Agent restarted', { id: agentId, name: agent.name, pid: agent.pid });
|
|
304
316
|
this.emitEvent({
|
|
305
317
|
type: 'agent:restarted',
|
|
@@ -324,16 +336,104 @@ export class AgentManager extends EventEmitter {
|
|
|
324
336
|
if (agent.status === 'running') {
|
|
325
337
|
agent.status = code === 0 ? 'stopped' : 'crashed';
|
|
326
338
|
if (agent.status === 'crashed') {
|
|
339
|
+
// Get the continuity agentId for resume info
|
|
340
|
+
const continuityAgentId = agent.agentId ?? agent.pty?.getAgentId();
|
|
327
341
|
this.emitEvent({
|
|
328
342
|
type: 'agent:crashed',
|
|
329
343
|
workspaceId: agent.workspaceId,
|
|
330
344
|
agentId,
|
|
331
|
-
data: {
|
|
345
|
+
data: {
|
|
346
|
+
name: agent.name,
|
|
347
|
+
exitCode: code,
|
|
348
|
+
continuityAgentId,
|
|
349
|
+
resumeInstructions: continuityAgentId
|
|
350
|
+
? `To resume this agent's work, use: --resume ${continuityAgentId}`
|
|
351
|
+
: undefined,
|
|
352
|
+
},
|
|
332
353
|
timestamp: new Date(),
|
|
333
354
|
});
|
|
334
355
|
}
|
|
335
356
|
}
|
|
336
357
|
}
|
|
358
|
+
/**
|
|
359
|
+
* Bind PtyWrapper events to cloud persistence and daemon events.
|
|
360
|
+
*
|
|
361
|
+
* Events bound:
|
|
362
|
+
* - 'summary': Agent output a [[SUMMARY]] block
|
|
363
|
+
* - 'session-end': Agent output a [[SESSION_END]] block
|
|
364
|
+
* - 'injection-failed': Message injection failed after retries
|
|
365
|
+
*/
|
|
366
|
+
bindPtyEvents(agentId, pty) {
|
|
367
|
+
const agent = this.agents.get(agentId);
|
|
368
|
+
if (!agent)
|
|
369
|
+
return;
|
|
370
|
+
// Forward summary events
|
|
371
|
+
pty.on('summary', async (event) => {
|
|
372
|
+
logger.info('Agent summary', {
|
|
373
|
+
agentId,
|
|
374
|
+
name: event.agentName,
|
|
375
|
+
task: event.summary.currentTask,
|
|
376
|
+
});
|
|
377
|
+
// Emit daemon event
|
|
378
|
+
this.emitEvent({
|
|
379
|
+
type: 'agent:summary',
|
|
380
|
+
workspaceId: agent.workspaceId,
|
|
381
|
+
agentId,
|
|
382
|
+
data: { summary: event.summary },
|
|
383
|
+
timestamp: new Date(),
|
|
384
|
+
});
|
|
385
|
+
// Forward to cloud persistence if configured
|
|
386
|
+
if (this.cloudPersistence) {
|
|
387
|
+
try {
|
|
388
|
+
await this.cloudPersistence.onSummary(agentId, event);
|
|
389
|
+
}
|
|
390
|
+
catch (err) {
|
|
391
|
+
logger.error('Cloud persistence failed for summary', { agentId, error: String(err) });
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
// Forward session-end events
|
|
396
|
+
pty.on('session-end', async (event) => {
|
|
397
|
+
logger.info('Agent session ended', {
|
|
398
|
+
agentId,
|
|
399
|
+
name: event.agentName,
|
|
400
|
+
summary: event.marker.summary,
|
|
401
|
+
});
|
|
402
|
+
// Emit daemon event
|
|
403
|
+
this.emitEvent({
|
|
404
|
+
type: 'agent:session-end',
|
|
405
|
+
workspaceId: agent.workspaceId,
|
|
406
|
+
agentId,
|
|
407
|
+
data: { marker: event.marker },
|
|
408
|
+
timestamp: new Date(),
|
|
409
|
+
});
|
|
410
|
+
// Forward to cloud persistence if configured
|
|
411
|
+
if (this.cloudPersistence) {
|
|
412
|
+
try {
|
|
413
|
+
await this.cloudPersistence.onSessionEnd(agentId, event);
|
|
414
|
+
}
|
|
415
|
+
catch (err) {
|
|
416
|
+
logger.error('Cloud persistence failed for session-end', { agentId, error: String(err) });
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
});
|
|
420
|
+
// Log injection failures
|
|
421
|
+
pty.on('injection-failed', (event) => {
|
|
422
|
+
logger.warn('Message injection failed', {
|
|
423
|
+
agentId,
|
|
424
|
+
messageId: event.messageId,
|
|
425
|
+
from: event.from,
|
|
426
|
+
attempts: event.attempts,
|
|
427
|
+
});
|
|
428
|
+
this.emitEvent({
|
|
429
|
+
type: 'agent:injection-failed',
|
|
430
|
+
workspaceId: agent.workspaceId,
|
|
431
|
+
agentId,
|
|
432
|
+
data: event,
|
|
433
|
+
timestamp: new Date(),
|
|
434
|
+
});
|
|
435
|
+
});
|
|
436
|
+
}
|
|
337
437
|
/**
|
|
338
438
|
* Setup supervisor event handlers
|
|
339
439
|
*/
|
|
@@ -384,6 +484,7 @@ export class AgentManager extends EventEmitter {
|
|
|
384
484
|
lastHealthCheck: agent.lastHealthCheck,
|
|
385
485
|
restartCount: agent.restartCount,
|
|
386
486
|
logFile: agent.logFile,
|
|
487
|
+
agentId: agent.agentId ?? agent.pty?.getAgentId(),
|
|
387
488
|
};
|
|
388
489
|
}
|
|
389
490
|
/**
|
|
@@ -2,6 +2,25 @@
|
|
|
2
2
|
* Agent Registry
|
|
3
3
|
* Persists agent metadata across daemon restarts.
|
|
4
4
|
*/
|
|
5
|
+
/**
|
|
6
|
+
* Agent profile information for display and understanding agent behavior
|
|
7
|
+
*/
|
|
8
|
+
export interface AgentProfileRecord {
|
|
9
|
+
/** Display title/role (e.g., "Lead Developer", "Code Reviewer") */
|
|
10
|
+
title?: string;
|
|
11
|
+
/** Short description of what this agent does */
|
|
12
|
+
description?: string;
|
|
13
|
+
/** The prompt/task the agent was spawned with */
|
|
14
|
+
spawnPrompt?: string;
|
|
15
|
+
/** Agent profile/persona prompt (e.g., lead agent instructions) */
|
|
16
|
+
personaPrompt?: string;
|
|
17
|
+
/** Name of the persona preset used (e.g., "lead", "reviewer", "shadow-auditor") */
|
|
18
|
+
personaName?: string;
|
|
19
|
+
/** Capabilities or tools available to the agent */
|
|
20
|
+
capabilities?: string[];
|
|
21
|
+
/** Tags for categorization */
|
|
22
|
+
tags?: string[];
|
|
23
|
+
}
|
|
5
24
|
export interface AgentRecord {
|
|
6
25
|
id: string;
|
|
7
26
|
name: string;
|
|
@@ -15,6 +34,8 @@ export interface AgentRecord {
|
|
|
15
34
|
lastSeen: string;
|
|
16
35
|
messagesSent: number;
|
|
17
36
|
messagesReceived: number;
|
|
37
|
+
/** Profile information for understanding agent behavior */
|
|
38
|
+
profile?: AgentProfileRecord;
|
|
18
39
|
}
|
|
19
40
|
type AgentInput = {
|
|
20
41
|
name: string;
|
|
@@ -24,6 +45,7 @@ type AgentInput = {
|
|
|
24
45
|
task?: string;
|
|
25
46
|
workingDirectory?: string;
|
|
26
47
|
team?: string;
|
|
48
|
+
profile?: AgentProfileRecord;
|
|
27
49
|
};
|
|
28
50
|
export declare class AgentRegistry {
|
|
29
51
|
private registryPath;
|
|
@@ -53,6 +75,16 @@ export declare class AgentRegistry {
|
|
|
53
75
|
* Get a snapshot of all agents.
|
|
54
76
|
*/
|
|
55
77
|
getAgents(): AgentRecord[];
|
|
78
|
+
/**
|
|
79
|
+
* Remove an agent from the registry.
|
|
80
|
+
*/
|
|
81
|
+
remove(agentName: string): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Remove agents that haven't been seen for longer than the threshold.
|
|
84
|
+
* @param thresholdMs - Time in milliseconds (default: 24 hours)
|
|
85
|
+
* @returns Number of agents removed
|
|
86
|
+
*/
|
|
87
|
+
pruneStale(thresholdMs?: number): number;
|
|
56
88
|
private ensureRecord;
|
|
57
89
|
private ensureDir;
|
|
58
90
|
load(): void;
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
import fs from 'node:fs';
|
|
6
6
|
import path from 'node:path';
|
|
7
7
|
import { v4 as uuid } from 'uuid';
|
|
8
|
+
import { createLogger } from '../utils/logger.js';
|
|
9
|
+
const log = createLogger('registry');
|
|
8
10
|
export class AgentRegistry {
|
|
9
11
|
registryPath;
|
|
10
12
|
agents = new Map(); // name -> record
|
|
@@ -26,6 +28,10 @@ export class AgentRegistry {
|
|
|
26
28
|
const now = new Date().toISOString();
|
|
27
29
|
const existing = this.agents.get(agent.name);
|
|
28
30
|
if (existing) {
|
|
31
|
+
// Merge profile data if provided
|
|
32
|
+
const mergedProfile = agent.profile
|
|
33
|
+
? { ...existing.profile, ...agent.profile }
|
|
34
|
+
: existing.profile;
|
|
29
35
|
const updated = {
|
|
30
36
|
...existing,
|
|
31
37
|
cli: agent.cli ?? existing.cli,
|
|
@@ -34,6 +40,7 @@ export class AgentRegistry {
|
|
|
34
40
|
task: agent.task ?? existing.task,
|
|
35
41
|
workingDirectory: agent.workingDirectory ?? existing.workingDirectory,
|
|
36
42
|
team: agent.team ?? existing.team,
|
|
43
|
+
profile: mergedProfile,
|
|
37
44
|
lastSeen: now,
|
|
38
45
|
};
|
|
39
46
|
this.agents.set(agent.name, updated);
|
|
@@ -49,6 +56,7 @@ export class AgentRegistry {
|
|
|
49
56
|
task: agent.task,
|
|
50
57
|
workingDirectory: agent.workingDirectory,
|
|
51
58
|
team: agent.team,
|
|
59
|
+
profile: agent.profile,
|
|
52
60
|
firstSeen: now,
|
|
53
61
|
lastSeen: now,
|
|
54
62
|
messagesSent: 0,
|
|
@@ -93,6 +101,37 @@ export class AgentRegistry {
|
|
|
93
101
|
getAgents() {
|
|
94
102
|
return Array.from(this.agents.values());
|
|
95
103
|
}
|
|
104
|
+
/**
|
|
105
|
+
* Remove an agent from the registry.
|
|
106
|
+
*/
|
|
107
|
+
remove(agentName) {
|
|
108
|
+
const deleted = this.agents.delete(agentName);
|
|
109
|
+
if (deleted) {
|
|
110
|
+
this.save();
|
|
111
|
+
}
|
|
112
|
+
return deleted;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Remove agents that haven't been seen for longer than the threshold.
|
|
116
|
+
* @param thresholdMs - Time in milliseconds (default: 24 hours)
|
|
117
|
+
* @returns Number of agents removed
|
|
118
|
+
*/
|
|
119
|
+
pruneStale(thresholdMs = 24 * 60 * 60 * 1000) {
|
|
120
|
+
const cutoff = Date.now() - thresholdMs;
|
|
121
|
+
let removed = 0;
|
|
122
|
+
for (const [name, record] of this.agents) {
|
|
123
|
+
const lastSeenTime = new Date(record.lastSeen).getTime();
|
|
124
|
+
if (lastSeenTime < cutoff) {
|
|
125
|
+
this.agents.delete(name);
|
|
126
|
+
removed++;
|
|
127
|
+
log.info('Pruned stale agent', { name, lastSeen: record.lastSeen });
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (removed > 0) {
|
|
131
|
+
this.save();
|
|
132
|
+
}
|
|
133
|
+
return removed;
|
|
134
|
+
}
|
|
96
135
|
ensureRecord(agentName) {
|
|
97
136
|
const existing = this.agents.get(agentName);
|
|
98
137
|
if (existing)
|
|
@@ -137,6 +176,7 @@ export class AgentRegistry {
|
|
|
137
176
|
task: raw.task,
|
|
138
177
|
workingDirectory: raw.workingDirectory,
|
|
139
178
|
team: raw.team,
|
|
179
|
+
profile: raw.profile,
|
|
140
180
|
firstSeen: raw.firstSeen ?? new Date().toISOString(),
|
|
141
181
|
lastSeen: raw.lastSeen ?? new Date().toISOString(),
|
|
142
182
|
messagesSent: typeof raw.messagesSent === 'number' ? raw.messagesSent : 0,
|
|
@@ -146,7 +186,7 @@ export class AgentRegistry {
|
|
|
146
186
|
}
|
|
147
187
|
}
|
|
148
188
|
catch (err) {
|
|
149
|
-
|
|
189
|
+
log.error('Failed to load agents.json', { error: String(err) });
|
|
150
190
|
}
|
|
151
191
|
}
|
|
152
192
|
save() {
|
|
@@ -159,7 +199,7 @@ export class AgentRegistry {
|
|
|
159
199
|
fs.renameSync(tempPath, this.registryPath);
|
|
160
200
|
}
|
|
161
201
|
catch (err) {
|
|
162
|
-
|
|
202
|
+
log.error('Failed to write agents.json', { error: String(err) });
|
|
163
203
|
}
|
|
164
204
|
}
|
|
165
205
|
}
|
package/dist/daemon/api.d.ts
CHANGED
|
@@ -12,7 +12,19 @@ export declare class DaemonApi extends EventEmitter {
|
|
|
12
12
|
private sessions;
|
|
13
13
|
private routes;
|
|
14
14
|
private config;
|
|
15
|
+
private allowedOrigins;
|
|
16
|
+
private allowAllOrigins;
|
|
15
17
|
constructor(config: ApiDaemonConfig);
|
|
18
|
+
/**
|
|
19
|
+
* Resolve allowed origins from config/env (comma-separated list).
|
|
20
|
+
* Empty list means no cross-origin access is permitted.
|
|
21
|
+
*/
|
|
22
|
+
private loadAllowedOrigins;
|
|
23
|
+
/**
|
|
24
|
+
* Return allowed origin for CORS or null if explicitly blocked.
|
|
25
|
+
* Undefined means no CORS header will be set (same-origin/server-to-server).
|
|
26
|
+
*/
|
|
27
|
+
private resolveAllowedOrigin;
|
|
16
28
|
/**
|
|
17
29
|
* Start the API server
|
|
18
30
|
*/
|