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.
Files changed (567) hide show
  1. package/.gitattributes +3 -0
  2. package/.nvmrc +1 -0
  3. package/.trajectories/completed/2026-01/traj_1dviorhnkcb5.json +65 -0
  4. package/.trajectories/completed/2026-01/traj_1dviorhnkcb5.md +37 -0
  5. package/.trajectories/completed/2026-01/traj_1k5if5snst2e.json +65 -0
  6. package/.trajectories/completed/2026-01/traj_1k5if5snst2e.md +37 -0
  7. package/.trajectories/completed/2026-01/traj_1rp3rges5811.json +49 -0
  8. package/.trajectories/completed/2026-01/traj_1rp3rges5811.md +31 -0
  9. package/.trajectories/completed/2026-01/traj_22bhyulruouw.json +113 -0
  10. package/.trajectories/completed/2026-01/traj_22bhyulruouw.md +57 -0
  11. package/.trajectories/completed/2026-01/traj_2dao7ddgnta0.json +53 -0
  12. package/.trajectories/completed/2026-01/traj_2dao7ddgnta0.md +32 -0
  13. package/.trajectories/completed/2026-01/traj_3t0440mjeunc.json +26 -0
  14. package/.trajectories/completed/2026-01/traj_3t0440mjeunc.md +6 -0
  15. package/.trajectories/completed/2026-01/traj_45x9494d9xnr.json +47 -0
  16. package/.trajectories/completed/2026-01/traj_45x9494d9xnr.md +32 -0
  17. package/.trajectories/completed/2026-01/traj_4aa0bb77s4nh.json +53 -0
  18. package/.trajectories/completed/2026-01/traj_4aa0bb77s4nh.md +32 -0
  19. package/.trajectories/completed/2026-01/traj_5lhmzq8rxpqv.json +59 -0
  20. package/.trajectories/completed/2026-01/traj_5lhmzq8rxpqv.md +33 -0
  21. package/.trajectories/completed/2026-01/traj_5vr4e9erb1fs.json +53 -0
  22. package/.trajectories/completed/2026-01/traj_5vr4e9erb1fs.md +32 -0
  23. package/.trajectories/completed/2026-01/traj_6fgiwdoklvym.json +48 -0
  24. package/.trajectories/completed/2026-01/traj_6fgiwdoklvym.md +24 -0
  25. package/.trajectories/completed/2026-01/traj_7ludwvz45veh.json +209 -0
  26. package/.trajectories/completed/2026-01/traj_7ludwvz45veh.md +97 -0
  27. package/.trajectories/completed/2026-01/traj_9921cuhel0pj.json +48 -0
  28. package/.trajectories/completed/2026-01/traj_9921cuhel0pj.md +24 -0
  29. package/.trajectories/completed/2026-01/traj_ajs7zqfux4wc.json +49 -0
  30. package/.trajectories/completed/2026-01/traj_ajs7zqfux4wc.md +23 -0
  31. package/.trajectories/completed/2026-01/traj_cvtqhlwcq9s0.json +53 -0
  32. package/.trajectories/completed/2026-01/traj_cvtqhlwcq9s0.md +32 -0
  33. package/.trajectories/completed/2026-01/traj_cxofprm2m2en.json +49 -0
  34. package/.trajectories/completed/2026-01/traj_cxofprm2m2en.md +31 -0
  35. package/.trajectories/completed/2026-01/traj_d2hhz3k0vrhn.json +26 -0
  36. package/.trajectories/completed/2026-01/traj_d2hhz3k0vrhn.md +6 -0
  37. package/.trajectories/completed/2026-01/traj_dfuvww9pege5.json +59 -0
  38. package/.trajectories/completed/2026-01/traj_dfuvww9pege5.md +37 -0
  39. package/.trajectories/completed/2026-01/traj_g0fisy9h51mf.json +77 -0
  40. package/.trajectories/completed/2026-01/traj_g0fisy9h51mf.md +42 -0
  41. package/.trajectories/completed/2026-01/traj_gjdre5voouod.json +53 -0
  42. package/.trajectories/completed/2026-01/traj_gjdre5voouod.md +32 -0
  43. package/.trajectories/completed/2026-01/traj_gtlyqtta3x8l.json +25 -0
  44. package/.trajectories/completed/2026-01/traj_gtlyqtta3x8l.md +15 -0
  45. package/.trajectories/completed/2026-01/traj_h4xijiuip3w4.json +101 -0
  46. package/.trajectories/completed/2026-01/traj_h4xijiuip3w4.md +44 -0
  47. package/.trajectories/completed/2026-01/traj_hhxte7w4gjjx.json +22 -0
  48. package/.trajectories/completed/2026-01/traj_hhxte7w4gjjx.md +5 -0
  49. package/.trajectories/completed/2026-01/traj_hpungyhoj6v5.json +53 -0
  50. package/.trajectories/completed/2026-01/traj_hpungyhoj6v5.md +32 -0
  51. package/.trajectories/completed/2026-01/traj_m2xkjv0w2sq7.json +25 -0
  52. package/.trajectories/completed/2026-01/traj_m2xkjv0w2sq7.md +15 -0
  53. package/.trajectories/completed/2026-01/traj_noq5zbvnrdvz.json +53 -0
  54. package/.trajectories/completed/2026-01/traj_noq5zbvnrdvz.md +32 -0
  55. package/.trajectories/completed/2026-01/traj_ntbs6ppopf46.json +53 -0
  56. package/.trajectories/completed/2026-01/traj_ntbs6ppopf46.md +32 -0
  57. package/.trajectories/completed/2026-01/traj_ozd98si6a7ns.json +48 -0
  58. package/.trajectories/completed/2026-01/traj_ozd98si6a7ns.md +24 -0
  59. package/.trajectories/completed/2026-01/traj_prdza7a5cxp5.json +53 -0
  60. package/.trajectories/completed/2026-01/traj_prdza7a5cxp5.md +32 -0
  61. package/.trajectories/completed/2026-01/traj_qb3twvvywfwi.json +77 -0
  62. package/.trajectories/completed/2026-01/traj_qb3twvvywfwi.md +42 -0
  63. package/.trajectories/completed/2026-01/traj_qft54mi7nfor.json +53 -0
  64. package/.trajectories/completed/2026-01/traj_qft54mi7nfor.md +32 -0
  65. package/.trajectories/completed/2026-01/traj_qx9uhf8whhxo.json +83 -0
  66. package/.trajectories/completed/2026-01/traj_qx9uhf8whhxo.md +47 -0
  67. package/.trajectories/completed/2026-01/traj_rd9toccj18a0.json +59 -0
  68. package/.trajectories/completed/2026-01/traj_rd9toccj18a0.md +37 -0
  69. package/.trajectories/completed/2026-01/traj_rt4fiw3ecp50.json +48 -0
  70. package/.trajectories/completed/2026-01/traj_rt4fiw3ecp50.md +16 -0
  71. package/.trajectories/completed/2026-01/traj_st8j35b0hrlc.json +59 -0
  72. package/.trajectories/completed/2026-01/traj_st8j35b0hrlc.md +37 -0
  73. package/.trajectories/completed/2026-01/traj_t1yy8m7hbuxp.json +53 -0
  74. package/.trajectories/completed/2026-01/traj_t1yy8m7hbuxp.md +32 -0
  75. package/.trajectories/completed/2026-01/traj_tmux_orchestrator_analysis.json +84 -0
  76. package/.trajectories/completed/2026-01/traj_tmux_orchestrator_analysis.md +109 -0
  77. package/.trajectories/completed/2026-01/traj_u9n9eqasw16k.json +53 -0
  78. package/.trajectories/completed/2026-01/traj_u9n9eqasw16k.md +32 -0
  79. package/.trajectories/completed/2026-01/traj_v87hypnongqx.json +71 -0
  80. package/.trajectories/completed/2026-01/traj_v87hypnongqx.md +42 -0
  81. package/.trajectories/completed/2026-01/traj_wkp2fgzdyinb.json +53 -0
  82. package/.trajectories/completed/2026-01/traj_wkp2fgzdyinb.md +32 -0
  83. package/.trajectories/completed/2026-01/traj_x14t8w8rn7xg.json +20 -0
  84. package/.trajectories/completed/2026-01/traj_x14t8w8rn7xg.md +6 -0
  85. package/.trajectories/completed/2026-01/traj_xnwbznkvv8ua.json +175 -0
  86. package/.trajectories/completed/2026-01/traj_xnwbznkvv8ua.md +82 -0
  87. package/.trajectories/completed/2026-01/traj_ysjc8zaeqtd3.json +47 -0
  88. package/.trajectories/completed/2026-01/traj_ysjc8zaeqtd3.md +32 -0
  89. package/.trajectories/completed/2026-01/traj_yvdadtvdgnz3.json +59 -0
  90. package/.trajectories/completed/2026-01/traj_yvdadtvdgnz3.md +37 -0
  91. package/.trajectories/completed/2026-01/traj_z0vcw1wrzide.json +53 -0
  92. package/.trajectories/completed/2026-01/traj_z0vcw1wrzide.md +32 -0
  93. package/.trajectories/index.json +314 -0
  94. package/ARCHITECTURE.md +1245 -0
  95. package/README.md +1 -1
  96. package/TESTING.md +278 -0
  97. package/deploy/init-db.sql +5 -0
  98. package/deploy/scripts/setup-fly-workspaces.sh +69 -0
  99. package/deploy/scripts/setup-railway.sh +75 -0
  100. package/deploy/workspace/entrypoint-browser.sh +118 -0
  101. package/deploy/workspace/entrypoint.sh +348 -0
  102. package/deploy/workspace/git-credential-relay +111 -0
  103. package/dist/bridge/spawner.d.ts +53 -0
  104. package/dist/bridge/spawner.js +203 -19
  105. package/dist/bridge/types.d.ts +12 -0
  106. package/dist/cli/index.js +618 -5
  107. package/dist/cloud/api/auth.d.ts +3 -2
  108. package/dist/cloud/api/auth.js +10 -98
  109. package/dist/cloud/api/billing.js +30 -9
  110. package/dist/cloud/api/cli-pty-runner.d.ts +54 -0
  111. package/dist/cloud/api/cli-pty-runner.js +119 -0
  112. package/dist/cloud/api/codex-auth-helper.d.ts +15 -0
  113. package/dist/cloud/api/codex-auth-helper.js +100 -0
  114. package/dist/cloud/api/generic-webhooks.d.ts +8 -0
  115. package/dist/cloud/api/generic-webhooks.js +129 -0
  116. package/dist/cloud/api/git.d.ts +8 -0
  117. package/dist/cloud/api/git.js +152 -0
  118. package/dist/cloud/api/github-app.d.ts +11 -0
  119. package/dist/cloud/api/github-app.js +189 -0
  120. package/dist/cloud/api/middleware/planLimits.d.ts +7 -0
  121. package/dist/cloud/api/middleware/planLimits.js +39 -1
  122. package/dist/cloud/api/monitoring.d.ts +11 -0
  123. package/dist/cloud/api/monitoring.js +578 -0
  124. package/dist/cloud/api/nango-auth.d.ts +9 -0
  125. package/dist/cloud/api/nango-auth.js +377 -0
  126. package/dist/cloud/api/onboarding.d.ts +8 -1
  127. package/dist/cloud/api/onboarding.js +313 -119
  128. package/dist/cloud/api/policy.d.ts +8 -0
  129. package/dist/cloud/api/policy.js +229 -0
  130. package/dist/cloud/api/providers.js +114 -42
  131. package/dist/cloud/api/repos.d.ts +1 -0
  132. package/dist/cloud/api/repos.js +186 -0
  133. package/dist/cloud/api/test-helpers.d.ts +10 -0
  134. package/dist/cloud/api/test-helpers.js +575 -0
  135. package/dist/cloud/api/webhooks.d.ts +8 -0
  136. package/dist/cloud/api/webhooks.js +645 -0
  137. package/dist/cloud/api/workspaces.js +320 -12
  138. package/dist/cloud/billing/plans.js +32 -19
  139. package/dist/cloud/billing/types.d.ts +9 -3
  140. package/dist/cloud/config.d.ts +9 -2
  141. package/dist/cloud/config.js +13 -4
  142. package/dist/cloud/db/drizzle.d.ts +84 -1
  143. package/dist/cloud/db/drizzle.js +470 -0
  144. package/dist/cloud/db/index.d.ts +9 -4
  145. package/dist/cloud/db/index.js +11 -3
  146. package/dist/cloud/db/schema.d.ts +3283 -556
  147. package/dist/cloud/db/schema.js +314 -1
  148. package/dist/cloud/index.d.ts +1 -0
  149. package/dist/cloud/index.js +2 -0
  150. package/dist/cloud/provisioner/index.d.ts +56 -0
  151. package/dist/cloud/provisioner/index.js +676 -34
  152. package/dist/cloud/server.d.ts +1 -0
  153. package/dist/cloud/server.js +362 -13
  154. package/dist/cloud/services/auto-scaler.d.ts +152 -0
  155. package/dist/cloud/services/auto-scaler.js +439 -0
  156. package/dist/cloud/services/capacity-manager.d.ts +148 -0
  157. package/dist/cloud/services/capacity-manager.js +449 -0
  158. package/dist/cloud/services/ci-agent-spawner.d.ts +49 -0
  159. package/dist/cloud/services/ci-agent-spawner.js +373 -0
  160. package/dist/cloud/services/index.d.ts +12 -0
  161. package/dist/cloud/services/index.js +15 -0
  162. package/dist/cloud/services/mention-handler.d.ts +65 -0
  163. package/dist/cloud/services/mention-handler.js +405 -0
  164. package/dist/cloud/services/nango.d.ts +186 -0
  165. package/dist/cloud/services/nango.js +344 -0
  166. package/dist/cloud/services/persistence.d.ts +131 -0
  167. package/dist/cloud/services/persistence.js +200 -0
  168. package/dist/cloud/services/planLimits.d.ts +37 -0
  169. package/dist/cloud/services/planLimits.js +86 -5
  170. package/dist/cloud/services/scaling-orchestrator.d.ts +159 -0
  171. package/dist/cloud/services/scaling-orchestrator.js +502 -0
  172. package/dist/cloud/services/scaling-policy.d.ts +121 -0
  173. package/dist/cloud/services/scaling-policy.js +415 -0
  174. package/dist/cloud/vault/index.js +1 -1
  175. package/dist/cloud/webhooks/index.d.ts +24 -0
  176. package/dist/cloud/webhooks/index.js +29 -0
  177. package/dist/cloud/webhooks/parsers/github.d.ts +8 -0
  178. package/dist/cloud/webhooks/parsers/github.js +234 -0
  179. package/dist/cloud/webhooks/parsers/index.d.ts +23 -0
  180. package/dist/cloud/webhooks/parsers/index.js +30 -0
  181. package/dist/cloud/webhooks/parsers/linear.d.ts +9 -0
  182. package/dist/cloud/webhooks/parsers/linear.js +258 -0
  183. package/dist/cloud/webhooks/parsers/slack.d.ts +9 -0
  184. package/dist/cloud/webhooks/parsers/slack.js +214 -0
  185. package/dist/cloud/webhooks/responders/github.d.ts +8 -0
  186. package/dist/cloud/webhooks/responders/github.js +73 -0
  187. package/dist/cloud/webhooks/responders/index.d.ts +23 -0
  188. package/dist/cloud/webhooks/responders/index.js +30 -0
  189. package/dist/cloud/webhooks/responders/linear.d.ts +9 -0
  190. package/dist/cloud/webhooks/responders/linear.js +149 -0
  191. package/dist/cloud/webhooks/responders/slack.d.ts +20 -0
  192. package/dist/cloud/webhooks/responders/slack.js +178 -0
  193. package/dist/cloud/webhooks/router.d.ts +25 -0
  194. package/dist/cloud/webhooks/router.js +504 -0
  195. package/dist/cloud/webhooks/rules-engine.d.ts +24 -0
  196. package/dist/cloud/webhooks/rules-engine.js +287 -0
  197. package/dist/cloud/webhooks/types.d.ts +186 -0
  198. package/dist/cloud/webhooks/types.js +8 -0
  199. package/dist/continuity/formatter.d.ts +51 -0
  200. package/dist/continuity/formatter.js +313 -0
  201. package/dist/continuity/handoff-store.d.ts +67 -0
  202. package/dist/continuity/handoff-store.js +472 -0
  203. package/dist/continuity/index.d.ts +45 -0
  204. package/dist/continuity/index.js +48 -0
  205. package/dist/continuity/ledger-store.d.ts +110 -0
  206. package/dist/continuity/ledger-store.js +500 -0
  207. package/dist/continuity/manager.d.ts +178 -0
  208. package/dist/continuity/manager.js +562 -0
  209. package/dist/continuity/parser.d.ts +76 -0
  210. package/dist/continuity/parser.js +579 -0
  211. package/dist/continuity/types.d.ts +180 -0
  212. package/dist/continuity/types.js +9 -0
  213. package/dist/daemon/agent-manager.d.ts +27 -0
  214. package/dist/daemon/agent-manager.js +107 -6
  215. package/dist/daemon/agent-registry.d.ts +32 -0
  216. package/dist/daemon/agent-registry.js +42 -2
  217. package/dist/daemon/api.d.ts +12 -0
  218. package/dist/daemon/api.js +131 -2
  219. package/dist/daemon/cli-auth.d.ts +67 -0
  220. package/dist/daemon/cli-auth.js +537 -0
  221. package/dist/daemon/cloud-sync.js +9 -7
  222. package/dist/daemon/orchestrator.js +30 -0
  223. package/dist/daemon/router.d.ts +5 -0
  224. package/dist/daemon/router.js +78 -26
  225. package/dist/daemon/server.d.ts +5 -0
  226. package/dist/daemon/server.js +9 -1
  227. package/dist/daemon/services/browser-testing.d.ts +88 -0
  228. package/dist/daemon/services/browser-testing.js +244 -0
  229. package/dist/daemon/services/container-spawner.d.ts +135 -0
  230. package/dist/daemon/services/container-spawner.js +313 -0
  231. package/dist/daemon/types.d.ts +5 -1
  232. package/dist/dashboard/out/404.html +1 -1
  233. package/dist/dashboard/out/_next/static/chunks/116-2502180def231162.js +1 -0
  234. package/dist/dashboard/out/_next/static/chunks/282-980c2eb8fff20123.js +1 -0
  235. package/dist/dashboard/out/_next/static/chunks/699-3b1cd6618a45d259.js +1 -0
  236. package/dist/dashboard/out/_next/static/chunks/724-2dae7627550ab88f.js +9 -0
  237. package/dist/dashboard/out/_next/static/chunks/766-1f2dd8cb7f766b0b.js +1 -0
  238. package/dist/dashboard/out/_next/static/chunks/app/app/onboarding/page-3fdfa60e53f2810d.js +1 -0
  239. package/dist/dashboard/out/_next/static/chunks/app/app/page-e6381e5a6e1fbcfd.js +1 -0
  240. package/dist/dashboard/out/_next/static/chunks/app/connect-repos/page-3538dfe0ffe984b8.js +1 -0
  241. package/dist/dashboard/out/_next/static/chunks/app/history/{page-b6edd4dde8d08194.js → page-abb9ab2d329f56e9.js} +1 -1
  242. package/dist/dashboard/out/_next/static/chunks/app/layout-c0d118c0f92d969c.js +1 -0
  243. package/dist/dashboard/out/_next/static/chunks/app/login/page-c22d080201cbd9fb.js +1 -0
  244. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-67a3e98d9a43a6ed.js +1 -0
  245. package/dist/dashboard/out/_next/static/chunks/app/page-77e9c65420a06cfb.js +1 -0
  246. package/dist/dashboard/out/_next/static/chunks/app/pricing/page-b08ed1c34d14434a.js +1 -0
  247. package/dist/dashboard/out/_next/static/chunks/app/providers/page-e88bc117ef7671c3.js +1 -0
  248. package/dist/dashboard/out/_next/static/chunks/app/signup/page-68d34f50baa8ab6b.js +1 -0
  249. package/dist/dashboard/out/_next/static/chunks/e868780c-48e5f147c90a3a41.js +18 -0
  250. package/dist/dashboard/out/_next/static/chunks/{main-app-5d692157a8eb1fd9.js → main-app-6e8e8d3ef4e0192a.js} +1 -1
  251. package/dist/dashboard/out/_next/static/chunks/{main-c2f423b9c9f4591b.js → main-ed4e1fb6f29c34cf.js} +1 -1
  252. package/dist/dashboard/out/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +1 -0
  253. package/dist/dashboard/out/_next/static/css/29852f26181969a0.css +1 -0
  254. package/dist/dashboard/out/_next/static/css/7c3ae9e8617d42a5.css +1 -0
  255. package/dist/dashboard/out/app/onboarding.html +1 -0
  256. package/dist/dashboard/out/app/onboarding.txt +7 -0
  257. package/dist/dashboard/out/app.html +1 -14
  258. package/dist/dashboard/out/app.txt +2 -2
  259. package/dist/dashboard/out/connect-repos.html +1 -0
  260. package/dist/dashboard/out/connect-repos.txt +7 -0
  261. package/dist/dashboard/out/history.html +1 -1
  262. package/dist/dashboard/out/history.txt +2 -2
  263. package/dist/dashboard/out/index.html +1 -1
  264. package/dist/dashboard/out/index.txt +2 -2
  265. package/dist/dashboard/out/login.html +6 -0
  266. package/dist/dashboard/out/login.txt +7 -0
  267. package/dist/dashboard/out/metrics.html +1 -1
  268. package/dist/dashboard/out/metrics.txt +2 -2
  269. package/dist/dashboard/out/pricing.html +3 -3
  270. package/dist/dashboard/out/pricing.txt +2 -2
  271. package/dist/dashboard/out/providers.html +1 -0
  272. package/dist/dashboard/out/providers.txt +7 -0
  273. package/dist/dashboard/out/signup.html +6 -0
  274. package/dist/dashboard/out/signup.txt +7 -0
  275. package/dist/dashboard-server/server.js +1308 -8
  276. package/dist/hooks/emitter.d.ts +40 -0
  277. package/dist/hooks/emitter.js +63 -0
  278. package/dist/hooks/index.d.ts +3 -0
  279. package/dist/hooks/index.js +3 -0
  280. package/dist/hooks/registry.d.ts +173 -0
  281. package/dist/hooks/registry.js +476 -0
  282. package/dist/hooks/trajectory-hooks.d.ts +52 -0
  283. package/dist/hooks/trajectory-hooks.js +183 -0
  284. package/dist/hooks/types.d.ts +141 -0
  285. package/dist/index.d.ts +2 -0
  286. package/dist/index.js +3 -0
  287. package/dist/memory/adapters/index.d.ts +8 -0
  288. package/dist/memory/adapters/index.js +8 -0
  289. package/dist/memory/adapters/inmemory.d.ts +59 -0
  290. package/dist/memory/adapters/inmemory.js +195 -0
  291. package/dist/memory/adapters/supermemory.d.ts +71 -0
  292. package/dist/memory/adapters/supermemory.js +338 -0
  293. package/dist/memory/factory.d.ts +48 -0
  294. package/dist/memory/factory.js +143 -0
  295. package/dist/memory/index.d.ts +32 -0
  296. package/dist/memory/index.js +32 -0
  297. package/dist/memory/memory-hooks.d.ts +60 -0
  298. package/dist/memory/memory-hooks.js +313 -0
  299. package/dist/memory/service.d.ts +49 -0
  300. package/dist/memory/service.js +146 -0
  301. package/dist/memory/types.d.ts +195 -0
  302. package/dist/memory/types.js +8 -0
  303. package/dist/policy/agent-policy.d.ts +225 -0
  304. package/dist/policy/agent-policy.js +665 -0
  305. package/dist/policy/cloud-policy-fetcher.d.ts +12 -0
  306. package/dist/policy/cloud-policy-fetcher.js +64 -0
  307. package/dist/resiliency/crash-insights.d.ts +156 -0
  308. package/dist/resiliency/crash-insights.js +492 -0
  309. package/dist/resiliency/gossip-health.d.ts +137 -0
  310. package/dist/resiliency/gossip-health.js +241 -0
  311. package/dist/resiliency/index.d.ts +5 -0
  312. package/dist/resiliency/index.js +5 -0
  313. package/dist/resiliency/leader-watchdog.d.ts +109 -0
  314. package/dist/resiliency/leader-watchdog.js +189 -0
  315. package/dist/resiliency/memory-monitor.d.ts +172 -0
  316. package/dist/resiliency/memory-monitor.js +593 -0
  317. package/dist/resiliency/stateless-lead.d.ts +149 -0
  318. package/dist/resiliency/stateless-lead.js +308 -0
  319. package/dist/resiliency/supervisor.d.ts +38 -0
  320. package/dist/resiliency/supervisor.js +122 -0
  321. package/dist/shared/cli-auth-config.d.ts +91 -0
  322. package/dist/shared/cli-auth-config.js +264 -0
  323. package/dist/storage/adapter.d.ts +1 -1
  324. package/dist/trajectory/config.d.ts +84 -0
  325. package/dist/trajectory/config.js +163 -0
  326. package/dist/trajectory/index.d.ts +8 -0
  327. package/dist/trajectory/index.js +8 -0
  328. package/dist/trajectory/integration.d.ts +292 -0
  329. package/dist/trajectory/integration.js +834 -0
  330. package/dist/utils/logger.js +1 -1
  331. package/dist/utils/project-namespace.d.ts +24 -0
  332. package/dist/utils/project-namespace.js +84 -0
  333. package/dist/wrapper/parser.d.ts +10 -0
  334. package/dist/wrapper/parser.js +100 -33
  335. package/dist/wrapper/pty-wrapper.d.ts +197 -16
  336. package/dist/wrapper/pty-wrapper.js +943 -106
  337. package/dist/wrapper/shared.d.ts +165 -0
  338. package/dist/wrapper/shared.js +270 -0
  339. package/dist/wrapper/tmux-wrapper.d.ts +73 -11
  340. package/dist/wrapper/tmux-wrapper.js +541 -120
  341. package/package.json +16 -16
  342. package/scripts/postinstall.js +60 -0
  343. package/test-push.txt +1 -0
  344. package/bin/tmux +0 -0
  345. package/dist/bridge/config.d.ts.map +0 -1
  346. package/dist/bridge/config.js.map +0 -1
  347. package/dist/bridge/index.d.ts.map +0 -1
  348. package/dist/bridge/index.js.map +0 -1
  349. package/dist/bridge/multi-project-client.d.ts.map +0 -1
  350. package/dist/bridge/multi-project-client.js.map +0 -1
  351. package/dist/bridge/shadow-cli.d.ts.map +0 -1
  352. package/dist/bridge/shadow-cli.js.map +0 -1
  353. package/dist/bridge/shadow-config.d.ts.map +0 -1
  354. package/dist/bridge/shadow-config.js.map +0 -1
  355. package/dist/bridge/spawner.d.ts.map +0 -1
  356. package/dist/bridge/spawner.js.map +0 -1
  357. package/dist/bridge/teams-config.d.ts.map +0 -1
  358. package/dist/bridge/teams-config.js.map +0 -1
  359. package/dist/bridge/types.d.ts.map +0 -1
  360. package/dist/bridge/types.js.map +0 -1
  361. package/dist/bridge/utils.d.ts.map +0 -1
  362. package/dist/bridge/utils.js.map +0 -1
  363. package/dist/cli/index.d.ts.map +0 -1
  364. package/dist/cli/index.js.map +0 -1
  365. package/dist/cloud/api/auth.d.ts.map +0 -1
  366. package/dist/cloud/api/auth.js.map +0 -1
  367. package/dist/cloud/api/billing.d.ts.map +0 -1
  368. package/dist/cloud/api/billing.js.map +0 -1
  369. package/dist/cloud/api/coordinators.d.ts.map +0 -1
  370. package/dist/cloud/api/coordinators.js.map +0 -1
  371. package/dist/cloud/api/daemons.d.ts.map +0 -1
  372. package/dist/cloud/api/daemons.js.map +0 -1
  373. package/dist/cloud/api/middleware/planLimits.d.ts.map +0 -1
  374. package/dist/cloud/api/middleware/planLimits.js.map +0 -1
  375. package/dist/cloud/api/onboarding.d.ts.map +0 -1
  376. package/dist/cloud/api/onboarding.js.map +0 -1
  377. package/dist/cloud/api/providers.d.ts.map +0 -1
  378. package/dist/cloud/api/providers.js.map +0 -1
  379. package/dist/cloud/api/repos.d.ts.map +0 -1
  380. package/dist/cloud/api/repos.js.map +0 -1
  381. package/dist/cloud/api/teams.d.ts.map +0 -1
  382. package/dist/cloud/api/teams.js.map +0 -1
  383. package/dist/cloud/api/usage.d.ts.map +0 -1
  384. package/dist/cloud/api/usage.js.map +0 -1
  385. package/dist/cloud/api/workspaces.d.ts.map +0 -1
  386. package/dist/cloud/api/workspaces.js.map +0 -1
  387. package/dist/cloud/billing/index.d.ts.map +0 -1
  388. package/dist/cloud/billing/index.js.map +0 -1
  389. package/dist/cloud/billing/plans.d.ts.map +0 -1
  390. package/dist/cloud/billing/plans.js.map +0 -1
  391. package/dist/cloud/billing/service.d.ts.map +0 -1
  392. package/dist/cloud/billing/service.js.map +0 -1
  393. package/dist/cloud/billing/types.d.ts.map +0 -1
  394. package/dist/cloud/billing/types.js.map +0 -1
  395. package/dist/cloud/config.d.ts.map +0 -1
  396. package/dist/cloud/config.js.map +0 -1
  397. package/dist/cloud/db/drizzle.d.ts.map +0 -1
  398. package/dist/cloud/db/drizzle.js.map +0 -1
  399. package/dist/cloud/db/index.d.ts.map +0 -1
  400. package/dist/cloud/db/index.js.map +0 -1
  401. package/dist/cloud/db/schema.d.ts.map +0 -1
  402. package/dist/cloud/db/schema.js.map +0 -1
  403. package/dist/cloud/index.d.ts.map +0 -1
  404. package/dist/cloud/index.js.map +0 -1
  405. package/dist/cloud/provisioner/index.d.ts.map +0 -1
  406. package/dist/cloud/provisioner/index.js.map +0 -1
  407. package/dist/cloud/server.d.ts.map +0 -1
  408. package/dist/cloud/server.js.map +0 -1
  409. package/dist/cloud/services/coordinator.d.ts.map +0 -1
  410. package/dist/cloud/services/coordinator.js.map +0 -1
  411. package/dist/cloud/services/planLimits.d.ts.map +0 -1
  412. package/dist/cloud/services/planLimits.js.map +0 -1
  413. package/dist/cloud/vault/index.d.ts.map +0 -1
  414. package/dist/cloud/vault/index.js.map +0 -1
  415. package/dist/daemon/agent-manager.d.ts.map +0 -1
  416. package/dist/daemon/agent-manager.js.map +0 -1
  417. package/dist/daemon/agent-registry.d.ts.map +0 -1
  418. package/dist/daemon/agent-registry.js.map +0 -1
  419. package/dist/daemon/api.d.ts.map +0 -1
  420. package/dist/daemon/api.js.map +0 -1
  421. package/dist/daemon/auth.d.ts.map +0 -1
  422. package/dist/daemon/auth.js.map +0 -1
  423. package/dist/daemon/cloud-sync.d.ts.map +0 -1
  424. package/dist/daemon/cloud-sync.js.map +0 -1
  425. package/dist/daemon/connection.d.ts.map +0 -1
  426. package/dist/daemon/connection.js.map +0 -1
  427. package/dist/daemon/index.d.ts.map +0 -1
  428. package/dist/daemon/index.js.map +0 -1
  429. package/dist/daemon/orchestrator.d.ts.map +0 -1
  430. package/dist/daemon/orchestrator.js.map +0 -1
  431. package/dist/daemon/registry.d.ts.map +0 -1
  432. package/dist/daemon/registry.js.map +0 -1
  433. package/dist/daemon/router.d.ts.map +0 -1
  434. package/dist/daemon/router.js.map +0 -1
  435. package/dist/daemon/server.d.ts.map +0 -1
  436. package/dist/daemon/server.js.map +0 -1
  437. package/dist/daemon/types.d.ts.map +0 -1
  438. package/dist/daemon/types.js.map +0 -1
  439. package/dist/daemon/workspace-manager.d.ts.map +0 -1
  440. package/dist/daemon/workspace-manager.js.map +0 -1
  441. package/dist/dashboard/out/_next/static/chunks/693-7b3301d8f6bc5014.js +0 -1
  442. package/dist/dashboard/out/_next/static/chunks/713-f78477eb185f1f4d.js +0 -1
  443. package/dist/dashboard/out/_next/static/chunks/766-e53e1cfe39b0b5b5.js +0 -1
  444. package/dist/dashboard/out/_next/static/chunks/900-037c64bfd797fb2a.js +0 -1
  445. package/dist/dashboard/out/_next/static/chunks/app/app/page-e3d9e1f4466b9bae.js +0 -1
  446. package/dist/dashboard/out/_next/static/chunks/app/layout-2433bb48965f4333.js +0 -1
  447. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-e68825a81db67ba1.js +0 -1
  448. package/dist/dashboard/out/_next/static/chunks/app/page-cc108bf68c8a657f.js +0 -1
  449. package/dist/dashboard/out/_next/static/chunks/app/pricing/page-d80e03a5297f95b6.js +0 -1
  450. package/dist/dashboard/out/_next/static/chunks/webpack-a5acc2831d094776.js +0 -1
  451. package/dist/dashboard/out/_next/static/css/79b80143647a07d7.css +0 -1
  452. package/dist/dashboard/out/_next/static/css/8cf277370ad48cfe.css +0 -1
  453. package/dist/dashboard-server/metrics.d.ts.map +0 -1
  454. package/dist/dashboard-server/metrics.js.map +0 -1
  455. package/dist/dashboard-server/needs-attention.d.ts.map +0 -1
  456. package/dist/dashboard-server/needs-attention.js.map +0 -1
  457. package/dist/dashboard-server/server.d.ts.map +0 -1
  458. package/dist/dashboard-server/server.js.map +0 -1
  459. package/dist/dashboard-server/start.d.ts.map +0 -1
  460. package/dist/dashboard-server/start.js.map +0 -1
  461. package/dist/hooks/inbox-check/hook.d.ts.map +0 -1
  462. package/dist/hooks/inbox-check/hook.js.map +0 -1
  463. package/dist/hooks/inbox-check/index.d.ts.map +0 -1
  464. package/dist/hooks/inbox-check/index.js.map +0 -1
  465. package/dist/hooks/inbox-check/types.d.ts.map +0 -1
  466. package/dist/hooks/inbox-check/types.js.map +0 -1
  467. package/dist/hooks/inbox-check/utils.d.ts.map +0 -1
  468. package/dist/hooks/inbox-check/utils.js.map +0 -1
  469. package/dist/hooks/index.d.ts.map +0 -1
  470. package/dist/hooks/index.js.map +0 -1
  471. package/dist/hooks/types.d.ts.map +0 -1
  472. package/dist/hooks/types.js.map +0 -1
  473. package/dist/index.d.ts.map +0 -1
  474. package/dist/index.js.map +0 -1
  475. package/dist/protocol/framing.d.ts.map +0 -1
  476. package/dist/protocol/framing.js.map +0 -1
  477. package/dist/protocol/index.d.ts.map +0 -1
  478. package/dist/protocol/index.js.map +0 -1
  479. package/dist/protocol/types.d.ts.map +0 -1
  480. package/dist/protocol/types.js.map +0 -1
  481. package/dist/resiliency/context-persistence.d.ts.map +0 -1
  482. package/dist/resiliency/context-persistence.js.map +0 -1
  483. package/dist/resiliency/health-monitor.d.ts.map +0 -1
  484. package/dist/resiliency/health-monitor.js.map +0 -1
  485. package/dist/resiliency/index.d.ts.map +0 -1
  486. package/dist/resiliency/index.js.map +0 -1
  487. package/dist/resiliency/logger.d.ts.map +0 -1
  488. package/dist/resiliency/logger.js.map +0 -1
  489. package/dist/resiliency/metrics.d.ts.map +0 -1
  490. package/dist/resiliency/metrics.js.map +0 -1
  491. package/dist/resiliency/provider-context.d.ts.map +0 -1
  492. package/dist/resiliency/provider-context.js.map +0 -1
  493. package/dist/resiliency/supervisor.d.ts.map +0 -1
  494. package/dist/resiliency/supervisor.js.map +0 -1
  495. package/dist/state/agent-state.d.ts.map +0 -1
  496. package/dist/state/agent-state.js.map +0 -1
  497. package/dist/storage/adapter.d.ts.map +0 -1
  498. package/dist/storage/adapter.js.map +0 -1
  499. package/dist/storage/sqlite-adapter.d.ts.map +0 -1
  500. package/dist/storage/sqlite-adapter.js.map +0 -1
  501. package/dist/utils/agent-config.d.ts.map +0 -1
  502. package/dist/utils/agent-config.js.map +0 -1
  503. package/dist/utils/command-resolver.d.ts.map +0 -1
  504. package/dist/utils/command-resolver.js.map +0 -1
  505. package/dist/utils/index.d.ts.map +0 -1
  506. package/dist/utils/index.js.map +0 -1
  507. package/dist/utils/logger.d.ts.map +0 -1
  508. package/dist/utils/logger.js.map +0 -1
  509. package/dist/utils/name-generator.d.ts.map +0 -1
  510. package/dist/utils/name-generator.js.map +0 -1
  511. package/dist/utils/project-namespace.d.ts.map +0 -1
  512. package/dist/utils/project-namespace.js.map +0 -1
  513. package/dist/utils/tmux-resolver.d.ts.map +0 -1
  514. package/dist/utils/tmux-resolver.js.map +0 -1
  515. package/dist/utils/update-checker.d.ts.map +0 -1
  516. package/dist/utils/update-checker.js.map +0 -1
  517. package/dist/wrapper/client.d.ts.map +0 -1
  518. package/dist/wrapper/client.js.map +0 -1
  519. package/dist/wrapper/inbox.d.ts.map +0 -1
  520. package/dist/wrapper/inbox.js.map +0 -1
  521. package/dist/wrapper/index.d.ts.map +0 -1
  522. package/dist/wrapper/index.js.map +0 -1
  523. package/dist/wrapper/parser.d.ts.map +0 -1
  524. package/dist/wrapper/parser.js.map +0 -1
  525. package/dist/wrapper/pty-wrapper.d.ts.map +0 -1
  526. package/dist/wrapper/pty-wrapper.js.map +0 -1
  527. package/dist/wrapper/tmux-wrapper.d.ts.map +0 -1
  528. package/dist/wrapper/tmux-wrapper.js.map +0 -1
  529. package/docs/AGENTS.md +0 -513
  530. package/docs/ARCHITECTURE_DECISIONS.md +0 -175
  531. package/docs/CHANGELOG.md +0 -11
  532. package/docs/CLI-SIMPLIFICATION-COMPLETE.md +0 -48
  533. package/docs/CLOUD-ARCHITECTURE.md +0 -652
  534. package/docs/CLOUD-ONBOARDING-DESIGN.md +0 -1983
  535. package/docs/COMPETITIVE_ANALYSIS.md +0 -897
  536. package/docs/CONTRIBUTING.md +0 -151
  537. package/docs/DESIGN_BRIDGE_STAFFING.md +0 -878
  538. package/docs/DESIGN_V2.md +0 -1079
  539. package/docs/INTEGRATION-GUIDE.md +0 -926
  540. package/docs/MONETIZATION.md +0 -1679
  541. package/docs/PROPOSAL-trajectories.md +0 -1582
  542. package/docs/PROTOCOL.md +0 -325
  543. package/docs/SCALING_ANALYSIS.md +0 -280
  544. package/docs/TESTING_PRESENCE_FEATURES.md +0 -327
  545. package/docs/TMUX_IMPLEMENTATION_NOTES.md +0 -364
  546. package/docs/TMUX_IMPROVEMENTS.md +0 -968
  547. package/docs/agent-relay-snippet.md +0 -168
  548. package/docs/competitive-analysis-mcp-agent-mail.md +0 -389
  549. package/docs/dashboard-v2-plan.md +0 -179
  550. package/docs/guides/CLOUD.md +0 -236
  551. package/docs/guides/LOCAL.md +0 -535
  552. package/docs/guides/SELF-HOSTED.md +0 -494
  553. package/docs/proposals/shadow-as-subagent.md +0 -765
  554. package/docs/proposals/slack-bot-integration.md +0 -1457
  555. package/docs/removable-code-analysis.md +0 -24
  556. package/scripts/dev/PUBLIC_RELEASE_PLAN.md +0 -88
  557. package/scripts/dev/dev-team-setup.sh +0 -431
  558. package/scripts/e2e-test.sh +0 -119
  559. package/scripts/games/game-protocol.md +0 -79
  560. package/scripts/games/hearts-setup.sh +0 -264
  561. package/scripts/tictactoe-setup.sh +0 -181
  562. /package/dist/dashboard/out/_next/static/chunks/{117-b2cd8d6485aacf2b.js → 117-f7b8ab0809342e77.js} +0 -0
  563. /package/dist/dashboard/out/_next/static/chunks/{648-8f3f26864ce515e5.js → 648-5cc6e1921389a58a.js} +0 -0
  564. /package/dist/dashboard/out/_next/static/chunks/app/_not-found/{page-0b990dbb71d72a98.js → page-53b8a69f76db17d0.js} +0 -0
  565. /package/dist/dashboard/out/_next/static/chunks/{fd9d1056-bf46c09eb57e019c.js → fd9d1056-609918ca7b6280bb.js} +0 -0
  566. /package/dist/dashboard/out/_next/static/{6HHWb2ZmnJ4OSm0zUP7h4 → wPgKJtcOmTFLpUncDg16A}/_buildManifest.js +0 -0
  567. /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