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