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,562 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Continuity Manager
|
|
3
|
+
*
|
|
4
|
+
* Central service for managing session continuity.
|
|
5
|
+
* Coordinates ledger storage, handoff creation, and context injection.
|
|
6
|
+
*/
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import fs from 'node:fs/promises';
|
|
9
|
+
import crypto from 'node:crypto';
|
|
10
|
+
import os from 'node:os';
|
|
11
|
+
import { LedgerStore } from './ledger-store.js';
|
|
12
|
+
import { HandoffStore } from './handoff-store.js';
|
|
13
|
+
import { parseSaveContent, parseHandoffContent, isPlaceholderValue, filterPlaceholders, } from './parser.js';
|
|
14
|
+
import { formatStartupContext, formatLedger, formatHandoff, formatSearchResults, formatBriefStatus, } from './formatter.js';
|
|
15
|
+
/**
|
|
16
|
+
* ContinuityManager - Central service for session continuity
|
|
17
|
+
*/
|
|
18
|
+
export class ContinuityManager {
|
|
19
|
+
paths;
|
|
20
|
+
ledgerStore;
|
|
21
|
+
handoffStore;
|
|
22
|
+
defaultCli;
|
|
23
|
+
initialized = false;
|
|
24
|
+
constructor(options = {}) {
|
|
25
|
+
const basePath = options.basePath ||
|
|
26
|
+
path.join(os.homedir(), '.agent-relay', 'continuity');
|
|
27
|
+
this.paths = {
|
|
28
|
+
base: basePath,
|
|
29
|
+
ledgers: path.join(basePath, 'ledgers'),
|
|
30
|
+
handoffs: path.join(basePath, 'handoffs'),
|
|
31
|
+
artifactDb: path.join(basePath, 'artifact-index.db'),
|
|
32
|
+
};
|
|
33
|
+
this.ledgerStore = new LedgerStore(this.paths.ledgers);
|
|
34
|
+
this.handoffStore = new HandoffStore(this.paths.handoffs);
|
|
35
|
+
this.defaultCli = options.defaultCli || 'unknown';
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Initialize the continuity system (create directories)
|
|
39
|
+
*/
|
|
40
|
+
async initialize() {
|
|
41
|
+
if (this.initialized)
|
|
42
|
+
return;
|
|
43
|
+
await fs.mkdir(this.paths.base, { recursive: true });
|
|
44
|
+
await this.ledgerStore.initialize();
|
|
45
|
+
await this.handoffStore.initialize();
|
|
46
|
+
this.initialized = true;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Generate a session ID
|
|
50
|
+
*/
|
|
51
|
+
generateSessionId() {
|
|
52
|
+
return `sess_${crypto.randomBytes(8).toString('hex')}`;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Generate a unique agent ID using UUID v4
|
|
56
|
+
*/
|
|
57
|
+
generateAgentId() {
|
|
58
|
+
// Use crypto.randomUUID() for proper UUID v4
|
|
59
|
+
return crypto.randomUUID();
|
|
60
|
+
}
|
|
61
|
+
// =========================================================================
|
|
62
|
+
// Ledger Operations
|
|
63
|
+
// =========================================================================
|
|
64
|
+
/**
|
|
65
|
+
* Get or create a ledger for an agent
|
|
66
|
+
*/
|
|
67
|
+
async getOrCreateLedger(agentName, cli, agentId) {
|
|
68
|
+
await this.initialize();
|
|
69
|
+
let ledger = await this.ledgerStore.load(agentName);
|
|
70
|
+
if (!ledger) {
|
|
71
|
+
ledger = await this.ledgerStore.create(agentName, cli || this.defaultCli, this.generateSessionId(), agentId || this.generateAgentId());
|
|
72
|
+
}
|
|
73
|
+
return ledger;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Find a ledger by agent ID (for resume functionality)
|
|
77
|
+
*/
|
|
78
|
+
async findLedgerByAgentId(agentId) {
|
|
79
|
+
await this.initialize();
|
|
80
|
+
return this.ledgerStore.findByAgentId(agentId);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Get a ledger for an agent (returns null if not exists)
|
|
84
|
+
*/
|
|
85
|
+
async getLedger(agentName) {
|
|
86
|
+
await this.initialize();
|
|
87
|
+
return this.ledgerStore.load(agentName);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Save a ledger, optionally creating a handoff
|
|
91
|
+
*/
|
|
92
|
+
async saveLedger(agentName, content, options = {}) {
|
|
93
|
+
await this.initialize();
|
|
94
|
+
// Parse content if string
|
|
95
|
+
const updates = typeof content === 'string' ? parseSaveContent(content) : content;
|
|
96
|
+
// Get or create existing ledger
|
|
97
|
+
let ledger = await this.ledgerStore.load(agentName);
|
|
98
|
+
if (ledger) {
|
|
99
|
+
// Merge updates into existing ledger (preserve agentId)
|
|
100
|
+
ledger = {
|
|
101
|
+
...ledger,
|
|
102
|
+
...updates,
|
|
103
|
+
agentName,
|
|
104
|
+
agentId: ledger.agentId, // Always preserve existing agentId
|
|
105
|
+
updatedAt: new Date(),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
// Create new ledger with new agentId
|
|
110
|
+
ledger = {
|
|
111
|
+
agentName,
|
|
112
|
+
agentId: this.generateAgentId(),
|
|
113
|
+
sessionId: this.generateSessionId(),
|
|
114
|
+
cli: this.defaultCli,
|
|
115
|
+
currentTask: '',
|
|
116
|
+
completed: [],
|
|
117
|
+
inProgress: [],
|
|
118
|
+
blocked: [],
|
|
119
|
+
keyDecisions: [],
|
|
120
|
+
uncertainItems: [],
|
|
121
|
+
fileContext: [],
|
|
122
|
+
...updates,
|
|
123
|
+
updatedAt: new Date(),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
await this.ledgerStore.save(agentName, ledger);
|
|
127
|
+
// Create handoff if requested
|
|
128
|
+
if (options.createHandoff) {
|
|
129
|
+
await this.createHandoffFromLedger(ledger, options.triggerReason || 'manual');
|
|
130
|
+
}
|
|
131
|
+
return ledger;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Update specific fields in a ledger
|
|
135
|
+
*/
|
|
136
|
+
async updateLedger(agentName, updates) {
|
|
137
|
+
await this.initialize();
|
|
138
|
+
return this.ledgerStore.update(agentName, updates);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Add an uncertain item to the ledger
|
|
142
|
+
*/
|
|
143
|
+
async addUncertainItem(agentName, item) {
|
|
144
|
+
await this.initialize();
|
|
145
|
+
const prefixedItem = item.startsWith('UNCONFIRMED:')
|
|
146
|
+
? item
|
|
147
|
+
: `UNCONFIRMED: ${item}`;
|
|
148
|
+
return this.ledgerStore.addToList(agentName, 'uncertainItems', prefixedItem);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Delete a ledger
|
|
152
|
+
*/
|
|
153
|
+
async deleteLedger(agentName) {
|
|
154
|
+
await this.initialize();
|
|
155
|
+
return this.ledgerStore.delete(agentName);
|
|
156
|
+
}
|
|
157
|
+
// =========================================================================
|
|
158
|
+
// Handoff Operations
|
|
159
|
+
// =========================================================================
|
|
160
|
+
/**
|
|
161
|
+
* Create a handoff from a ledger
|
|
162
|
+
*/
|
|
163
|
+
async createHandoffFromLedger(ledger, triggerReason) {
|
|
164
|
+
const handoff = {
|
|
165
|
+
id: '', // Will be generated by store
|
|
166
|
+
agentName: ledger.agentName,
|
|
167
|
+
agentId: ledger.agentId,
|
|
168
|
+
cli: ledger.cli,
|
|
169
|
+
summary: '',
|
|
170
|
+
taskDescription: ledger.currentTask,
|
|
171
|
+
completedWork: [...ledger.completed],
|
|
172
|
+
nextSteps: [...ledger.inProgress],
|
|
173
|
+
fileReferences: [...ledger.fileContext],
|
|
174
|
+
decisions: [...ledger.keyDecisions],
|
|
175
|
+
relatedHandoffs: [],
|
|
176
|
+
createdAt: new Date(),
|
|
177
|
+
triggerReason,
|
|
178
|
+
trajectoryId: ledger.trajectoryId,
|
|
179
|
+
pderoPhase: ledger.pderoPhase,
|
|
180
|
+
};
|
|
181
|
+
await this.handoffStore.save(handoff);
|
|
182
|
+
return handoff;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Create a handoff from parsed content
|
|
186
|
+
*/
|
|
187
|
+
async createHandoff(agentName, content, triggerReason = 'manual') {
|
|
188
|
+
await this.initialize();
|
|
189
|
+
const parsed = typeof content === 'string' ? parseHandoffContent(content) : content;
|
|
190
|
+
const handoff = {
|
|
191
|
+
id: '',
|
|
192
|
+
agentName,
|
|
193
|
+
cli: this.defaultCli,
|
|
194
|
+
summary: parsed.summary || '',
|
|
195
|
+
taskDescription: parsed.taskDescription || '',
|
|
196
|
+
completedWork: parsed.completedWork,
|
|
197
|
+
nextSteps: parsed.nextSteps,
|
|
198
|
+
fileReferences: parsed.fileReferences,
|
|
199
|
+
decisions: parsed.decisions,
|
|
200
|
+
relatedHandoffs: [],
|
|
201
|
+
createdAt: new Date(),
|
|
202
|
+
triggerReason,
|
|
203
|
+
learnings: parsed.learnings,
|
|
204
|
+
};
|
|
205
|
+
const id = await this.handoffStore.save(handoff);
|
|
206
|
+
handoff.id = id;
|
|
207
|
+
return handoff;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Get the latest handoff for an agent
|
|
211
|
+
*/
|
|
212
|
+
async getLatestHandoff(agentName) {
|
|
213
|
+
await this.initialize();
|
|
214
|
+
return this.handoffStore.getLatest(agentName);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Get a handoff by ID
|
|
218
|
+
*/
|
|
219
|
+
async getHandoff(handoffId) {
|
|
220
|
+
await this.initialize();
|
|
221
|
+
return this.handoffStore.loadById(handoffId);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* List handoffs for an agent
|
|
225
|
+
*/
|
|
226
|
+
async listHandoffs(agentName, limit) {
|
|
227
|
+
await this.initialize();
|
|
228
|
+
return this.handoffStore.listForAgent(agentName, limit);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Search handoffs (basic text search - FTS to be added)
|
|
232
|
+
*/
|
|
233
|
+
async searchHandoffs(query, options = {}) {
|
|
234
|
+
await this.initialize();
|
|
235
|
+
const queryLower = query.toLowerCase();
|
|
236
|
+
const results = [];
|
|
237
|
+
// Get all agents or filter by agent
|
|
238
|
+
const agents = options.agentName
|
|
239
|
+
? [options.agentName]
|
|
240
|
+
: await this.handoffStore.listAgents();
|
|
241
|
+
for (const agent of agents) {
|
|
242
|
+
const handoffs = await this.handoffStore.listForAgent(agent);
|
|
243
|
+
for (const handoff of handoffs) {
|
|
244
|
+
// Filter by date if specified
|
|
245
|
+
if (options.since && handoff.createdAt < options.since) {
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
// Filter by trigger reason if specified
|
|
249
|
+
if (options.triggerReason &&
|
|
250
|
+
handoff.triggerReason !== options.triggerReason) {
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
// Basic text search
|
|
254
|
+
const searchText = [
|
|
255
|
+
handoff.taskDescription,
|
|
256
|
+
handoff.summary,
|
|
257
|
+
...handoff.completedWork,
|
|
258
|
+
...handoff.nextSteps,
|
|
259
|
+
...handoff.decisions.map((d) => d.decision),
|
|
260
|
+
...(handoff.learnings || []),
|
|
261
|
+
]
|
|
262
|
+
.join(' ')
|
|
263
|
+
.toLowerCase();
|
|
264
|
+
if (searchText.includes(queryLower)) {
|
|
265
|
+
results.push(handoff);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// Apply limit
|
|
270
|
+
if (options.limit) {
|
|
271
|
+
return results.slice(0, options.limit);
|
|
272
|
+
}
|
|
273
|
+
return results;
|
|
274
|
+
}
|
|
275
|
+
// =========================================================================
|
|
276
|
+
// Context Injection
|
|
277
|
+
// =========================================================================
|
|
278
|
+
/**
|
|
279
|
+
* Get startup context for an agent (for injection on spawn).
|
|
280
|
+
* Applies defensive filtering to remove any placeholder values.
|
|
281
|
+
*/
|
|
282
|
+
async getStartupContext(agentName) {
|
|
283
|
+
await this.initialize();
|
|
284
|
+
let ledger = await this.ledgerStore.load(agentName);
|
|
285
|
+
const handoff = await this.handoffStore.getLatest(agentName);
|
|
286
|
+
if (!ledger && !handoff) {
|
|
287
|
+
return null;
|
|
288
|
+
}
|
|
289
|
+
// Defensive filtering: clean any placeholder values that may have slipped through
|
|
290
|
+
if (ledger) {
|
|
291
|
+
ledger = this.filterLedgerPlaceholders(ledger);
|
|
292
|
+
}
|
|
293
|
+
const context = {
|
|
294
|
+
ledger: ledger || undefined,
|
|
295
|
+
handoff: handoff ? this.filterHandoffPlaceholders(handoff) : undefined,
|
|
296
|
+
learnings: handoff?.learnings ? filterPlaceholders(handoff.learnings) : undefined,
|
|
297
|
+
formatted: '',
|
|
298
|
+
};
|
|
299
|
+
context.formatted = formatStartupContext(context);
|
|
300
|
+
return context;
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Filter placeholder values from a ledger (defensive)
|
|
304
|
+
*/
|
|
305
|
+
filterLedgerPlaceholders(ledger) {
|
|
306
|
+
return {
|
|
307
|
+
...ledger,
|
|
308
|
+
currentTask: isPlaceholderValue(ledger.currentTask) ? '' : ledger.currentTask,
|
|
309
|
+
completed: filterPlaceholders(ledger.completed),
|
|
310
|
+
inProgress: filterPlaceholders(ledger.inProgress),
|
|
311
|
+
blocked: filterPlaceholders(ledger.blocked),
|
|
312
|
+
uncertainItems: filterPlaceholders(ledger.uncertainItems),
|
|
313
|
+
fileContext: ledger.fileContext.filter(f => !isPlaceholderValue(f.path)),
|
|
314
|
+
keyDecisions: ledger.keyDecisions.filter(d => !isPlaceholderValue(d.decision)),
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Filter placeholder values from a handoff (defensive)
|
|
319
|
+
*/
|
|
320
|
+
filterHandoffPlaceholders(handoff) {
|
|
321
|
+
return {
|
|
322
|
+
...handoff,
|
|
323
|
+
taskDescription: isPlaceholderValue(handoff.taskDescription) ? '' : handoff.taskDescription,
|
|
324
|
+
summary: isPlaceholderValue(handoff.summary) ? '' : handoff.summary,
|
|
325
|
+
completedWork: filterPlaceholders(handoff.completedWork),
|
|
326
|
+
nextSteps: filterPlaceholders(handoff.nextSteps),
|
|
327
|
+
fileReferences: handoff.fileReferences.filter(f => !isPlaceholderValue(f.path)),
|
|
328
|
+
decisions: handoff.decisions.filter(d => !isPlaceholderValue(d.decision)),
|
|
329
|
+
learnings: handoff.learnings ? filterPlaceholders(handoff.learnings) : undefined,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Format a ledger for display/injection
|
|
334
|
+
*/
|
|
335
|
+
formatLedger(ledger, compact = false) {
|
|
336
|
+
return formatLedger(ledger, { compact });
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Format a handoff for display/injection
|
|
340
|
+
*/
|
|
341
|
+
formatHandoff(handoff, compact = false) {
|
|
342
|
+
return formatHandoff(handoff, { compact });
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Format search results
|
|
346
|
+
*/
|
|
347
|
+
formatSearchResults(handoffs, query) {
|
|
348
|
+
return formatSearchResults(handoffs, query);
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Get a brief status summary
|
|
352
|
+
*/
|
|
353
|
+
async getBriefStatus(agentName) {
|
|
354
|
+
const ledger = await this.getLedger(agentName);
|
|
355
|
+
const handoff = await this.getLatestHandoff(agentName);
|
|
356
|
+
return formatBriefStatus(ledger, handoff);
|
|
357
|
+
}
|
|
358
|
+
// =========================================================================
|
|
359
|
+
// Command Handling
|
|
360
|
+
// =========================================================================
|
|
361
|
+
/**
|
|
362
|
+
* Handle a continuity command from agent output
|
|
363
|
+
*/
|
|
364
|
+
async handleCommand(agentName, command) {
|
|
365
|
+
switch (command.type) {
|
|
366
|
+
case 'save':
|
|
367
|
+
await this.saveLedger(agentName, command.content || '', {
|
|
368
|
+
createHandoff: command.createHandoff,
|
|
369
|
+
});
|
|
370
|
+
return null; // No response needed
|
|
371
|
+
case 'load': {
|
|
372
|
+
const context = await this.getStartupContext(agentName);
|
|
373
|
+
return context?.formatted || 'No continuity data found.';
|
|
374
|
+
}
|
|
375
|
+
case 'search': {
|
|
376
|
+
const results = await this.searchHandoffs(command.query || '', {
|
|
377
|
+
limit: 5,
|
|
378
|
+
});
|
|
379
|
+
return this.formatSearchResults(results, command.query || '');
|
|
380
|
+
}
|
|
381
|
+
case 'uncertain':
|
|
382
|
+
if (command.item) {
|
|
383
|
+
await this.addUncertainItem(agentName, command.item);
|
|
384
|
+
}
|
|
385
|
+
return null;
|
|
386
|
+
case 'handoff':
|
|
387
|
+
await this.createHandoff(agentName, command.content || '');
|
|
388
|
+
return null;
|
|
389
|
+
default:
|
|
390
|
+
return null;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
// =========================================================================
|
|
394
|
+
// Auto-save (for crash/restart)
|
|
395
|
+
// =========================================================================
|
|
396
|
+
/**
|
|
397
|
+
* Auto-save current state (called by wrapper on agent exit)
|
|
398
|
+
* @param agentName - Name of the agent
|
|
399
|
+
* @param reason - Why the save is happening
|
|
400
|
+
* @param sessionEndData - Optional data from [[SESSION_END]] block to populate handoff
|
|
401
|
+
*/
|
|
402
|
+
async autoSave(agentName, reason, sessionEndData) {
|
|
403
|
+
await this.initialize();
|
|
404
|
+
const triggerReason = reason === 'crash'
|
|
405
|
+
? 'crash'
|
|
406
|
+
: reason === 'restart'
|
|
407
|
+
? 'auto_restart'
|
|
408
|
+
: 'session_end';
|
|
409
|
+
// If we have SESSION_END data, use it to create handoff directly
|
|
410
|
+
// This fixes the issue where ledger is empty but SESSION_END has content
|
|
411
|
+
if (sessionEndData && (sessionEndData.summary || sessionEndData.completedTasks?.length)) {
|
|
412
|
+
const handoff = {
|
|
413
|
+
id: '',
|
|
414
|
+
agentName,
|
|
415
|
+
cli: this.defaultCli,
|
|
416
|
+
summary: sessionEndData.summary || '',
|
|
417
|
+
taskDescription: '',
|
|
418
|
+
completedWork: sessionEndData.completedTasks || [],
|
|
419
|
+
nextSteps: [],
|
|
420
|
+
fileReferences: [],
|
|
421
|
+
decisions: [],
|
|
422
|
+
relatedHandoffs: [],
|
|
423
|
+
createdAt: new Date(),
|
|
424
|
+
triggerReason,
|
|
425
|
+
};
|
|
426
|
+
await this.handoffStore.save(handoff);
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
// Fall back to ledger-based handoff if no SESSION_END data
|
|
430
|
+
const ledger = await this.ledgerStore.load(agentName);
|
|
431
|
+
if (ledger) {
|
|
432
|
+
await this.createHandoffFromLedger(ledger, triggerReason);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
// =========================================================================
|
|
436
|
+
// Cleanup
|
|
437
|
+
// =========================================================================
|
|
438
|
+
/**
|
|
439
|
+
* Clean placeholder data from all ledgers.
|
|
440
|
+
* Removes known placeholder/template values that were incorrectly saved.
|
|
441
|
+
* Returns the number of ledgers that were cleaned.
|
|
442
|
+
*/
|
|
443
|
+
async cleanupPlaceholders() {
|
|
444
|
+
await this.initialize();
|
|
445
|
+
const agents = await this.ledgerStore.listAgents();
|
|
446
|
+
const cleanedAgents = [];
|
|
447
|
+
for (const agentName of agents) {
|
|
448
|
+
const ledger = await this.ledgerStore.load(agentName);
|
|
449
|
+
if (!ledger)
|
|
450
|
+
continue;
|
|
451
|
+
let modified = false;
|
|
452
|
+
// Clean currentTask
|
|
453
|
+
if (ledger.currentTask && isPlaceholderValue(ledger.currentTask)) {
|
|
454
|
+
ledger.currentTask = '';
|
|
455
|
+
modified = true;
|
|
456
|
+
}
|
|
457
|
+
// Clean arrays
|
|
458
|
+
const originalCompleted = ledger.completed.length;
|
|
459
|
+
ledger.completed = filterPlaceholders(ledger.completed);
|
|
460
|
+
if (ledger.completed.length !== originalCompleted)
|
|
461
|
+
modified = true;
|
|
462
|
+
const originalInProgress = ledger.inProgress.length;
|
|
463
|
+
ledger.inProgress = filterPlaceholders(ledger.inProgress);
|
|
464
|
+
if (ledger.inProgress.length !== originalInProgress)
|
|
465
|
+
modified = true;
|
|
466
|
+
const originalBlocked = ledger.blocked.length;
|
|
467
|
+
ledger.blocked = filterPlaceholders(ledger.blocked);
|
|
468
|
+
if (ledger.blocked.length !== originalBlocked)
|
|
469
|
+
modified = true;
|
|
470
|
+
const originalUncertain = ledger.uncertainItems.length;
|
|
471
|
+
ledger.uncertainItems = filterPlaceholders(ledger.uncertainItems);
|
|
472
|
+
if (ledger.uncertainItems.length !== originalUncertain)
|
|
473
|
+
modified = true;
|
|
474
|
+
// Clean file context
|
|
475
|
+
const originalFiles = ledger.fileContext.length;
|
|
476
|
+
ledger.fileContext = ledger.fileContext.filter(f => !isPlaceholderValue(f.path));
|
|
477
|
+
if (ledger.fileContext.length !== originalFiles)
|
|
478
|
+
modified = true;
|
|
479
|
+
// Clean decisions
|
|
480
|
+
const originalDecisions = ledger.keyDecisions.length;
|
|
481
|
+
ledger.keyDecisions = ledger.keyDecisions.filter(d => !isPlaceholderValue(d.decision));
|
|
482
|
+
if (ledger.keyDecisions.length !== originalDecisions)
|
|
483
|
+
modified = true;
|
|
484
|
+
if (modified) {
|
|
485
|
+
await this.ledgerStore.save(agentName, ledger);
|
|
486
|
+
cleanedAgents.push(agentName);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
return { cleaned: cleanedAgents.length, agents: cleanedAgents };
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Clear all continuity data for an agent
|
|
493
|
+
*/
|
|
494
|
+
async clearAgent(agentName) {
|
|
495
|
+
await this.initialize();
|
|
496
|
+
await this.ledgerStore.delete(agentName);
|
|
497
|
+
// Note: We don't delete handoffs as they're meant to be permanent
|
|
498
|
+
}
|
|
499
|
+
/**
|
|
500
|
+
* List all agents with continuity data
|
|
501
|
+
*/
|
|
502
|
+
async listAgents() {
|
|
503
|
+
await this.initialize();
|
|
504
|
+
const ledgerAgents = await this.ledgerStore.listAgents();
|
|
505
|
+
const handoffAgents = await this.handoffStore.listAgents();
|
|
506
|
+
// Combine and deduplicate
|
|
507
|
+
const allAgents = new Set([...ledgerAgents, ...handoffAgents]);
|
|
508
|
+
return Array.from(allAgents).sort();
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Get continuity paths
|
|
512
|
+
*/
|
|
513
|
+
getPaths() {
|
|
514
|
+
return { ...this.paths };
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
// Singleton instance with lazy initialization
|
|
518
|
+
let instance = null;
|
|
519
|
+
let instancePromise = null;
|
|
520
|
+
/**
|
|
521
|
+
* Get the singleton ContinuityManager instance (sync version)
|
|
522
|
+
*
|
|
523
|
+
* Note: This is safe for most uses since ContinuityManager methods
|
|
524
|
+
* call initialize() internally. The race condition only matters
|
|
525
|
+
* if multiple calls happen before the first completes AND they
|
|
526
|
+
* pass different options (which is unlikely in practice).
|
|
527
|
+
*/
|
|
528
|
+
export function getContinuityManager(options) {
|
|
529
|
+
if (!instance) {
|
|
530
|
+
instance = new ContinuityManager(options);
|
|
531
|
+
}
|
|
532
|
+
return instance;
|
|
533
|
+
}
|
|
534
|
+
/**
|
|
535
|
+
* Get the singleton ContinuityManager instance (async version)
|
|
536
|
+
*
|
|
537
|
+
* This is the thread-safe version that ensures only one instance
|
|
538
|
+
* is created even with concurrent calls. Use this in async contexts
|
|
539
|
+
* where race conditions are possible.
|
|
540
|
+
*/
|
|
541
|
+
export async function getContinuityManagerAsync(options) {
|
|
542
|
+
if (instance) {
|
|
543
|
+
return instance;
|
|
544
|
+
}
|
|
545
|
+
if (!instancePromise) {
|
|
546
|
+
instancePromise = (async () => {
|
|
547
|
+
const manager = new ContinuityManager(options);
|
|
548
|
+
await manager.initialize();
|
|
549
|
+
instance = manager;
|
|
550
|
+
return manager;
|
|
551
|
+
})();
|
|
552
|
+
}
|
|
553
|
+
return instancePromise;
|
|
554
|
+
}
|
|
555
|
+
/**
|
|
556
|
+
* Reset the singleton instance (for testing)
|
|
557
|
+
*/
|
|
558
|
+
export function resetContinuityManager() {
|
|
559
|
+
instance = null;
|
|
560
|
+
instancePromise = null;
|
|
561
|
+
}
|
|
562
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Continuity Command Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses `->continuity:` patterns from agent output.
|
|
5
|
+
* Similar to how `->relay:` works for messaging.
|
|
6
|
+
*
|
|
7
|
+
* Supported patterns:
|
|
8
|
+
* ->continuity:save <<<...>>>
|
|
9
|
+
* ->continuity:load
|
|
10
|
+
* ->continuity:search "query"
|
|
11
|
+
* ->continuity:uncertain "item"
|
|
12
|
+
* ->continuity:handoff <<<...>>>
|
|
13
|
+
*/
|
|
14
|
+
import type { ContinuityCommand, Ledger, Decision, FileRef } from './types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Check if a value is a placeholder/template string that should be filtered out.
|
|
17
|
+
*/
|
|
18
|
+
export declare function isPlaceholderValue(value: string): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Filter an array to remove placeholder values.
|
|
21
|
+
*/
|
|
22
|
+
export declare function filterPlaceholders<T extends string>(items: T[]): T[];
|
|
23
|
+
/**
|
|
24
|
+
* Parse a continuity command from agent output
|
|
25
|
+
*/
|
|
26
|
+
export declare function parseContinuityCommand(output: string): ContinuityCommand | null;
|
|
27
|
+
/**
|
|
28
|
+
* Check if output contains any continuity command
|
|
29
|
+
*/
|
|
30
|
+
export declare function hasContinuityCommand(output: string): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Parse the content of a save command into ledger fields
|
|
33
|
+
*
|
|
34
|
+
* Expected format:
|
|
35
|
+
* Current task: <task>
|
|
36
|
+
* Completed: <item>, <item>, ...
|
|
37
|
+
* In progress: <item>, ...
|
|
38
|
+
* Blocked: <item>, ...
|
|
39
|
+
* Key decisions: <decision>
|
|
40
|
+
* Uncertain: <item>, ...
|
|
41
|
+
* Files: <path>:<lines>, ...
|
|
42
|
+
*
|
|
43
|
+
* Also handles markdown-formatted content:
|
|
44
|
+
* **Current Task:** <task>
|
|
45
|
+
* ### Completed
|
|
46
|
+
* - ✓ <item>
|
|
47
|
+
*/
|
|
48
|
+
export declare function parseSaveContent(content: string): Partial<Ledger>;
|
|
49
|
+
/**
|
|
50
|
+
* Parse handoff content (similar to save but for permanent handoffs)
|
|
51
|
+
*
|
|
52
|
+
* Expected format:
|
|
53
|
+
* Summary: <summary>
|
|
54
|
+
* Task: <task description>
|
|
55
|
+
* Completed: <item>, ...
|
|
56
|
+
* Next steps: <item>, ...
|
|
57
|
+
* Key decisions: <decision>, ...
|
|
58
|
+
* Files: <path>, ...
|
|
59
|
+
* Learnings: <learning>, ...
|
|
60
|
+
*/
|
|
61
|
+
export interface ParsedHandoffContent {
|
|
62
|
+
summary?: string;
|
|
63
|
+
taskDescription?: string;
|
|
64
|
+
completedWork: string[];
|
|
65
|
+
nextSteps: string[];
|
|
66
|
+
decisions: Decision[];
|
|
67
|
+
fileReferences: FileRef[];
|
|
68
|
+
learnings: string[];
|
|
69
|
+
}
|
|
70
|
+
export declare function parseHandoffContent(content: string): ParsedHandoffContent;
|
|
71
|
+
/**
|
|
72
|
+
* Extract all continuity commands from a block of output
|
|
73
|
+
* (in case multiple commands are present)
|
|
74
|
+
*/
|
|
75
|
+
export declare function extractAllCommands(output: string): ContinuityCommand[];
|
|
76
|
+
//# sourceMappingURL=parser.d.ts.map
|