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,415 @@
1
+ /**
2
+ * Scaling Policy Service
3
+ *
4
+ * Defines rules and policies for auto-scaling workspaces based on:
5
+ * - Memory pressure
6
+ * - Agent count
7
+ * - CPU usage
8
+ * - Trend analysis
9
+ *
10
+ * Policies are configurable per user/plan tier.
11
+ */
12
+ import { EventEmitter } from 'events';
13
+ // Default thresholds by plan
14
+ const DEFAULT_THRESHOLDS = {
15
+ free: {
16
+ memoryWarningBytes: 256 * 1024 * 1024, // 256MB
17
+ memoryCriticalBytes: 512 * 1024 * 1024, // 512MB
18
+ memoryScaleUpBytes: 400 * 1024 * 1024, // 400MB (no auto-scale for free)
19
+ memoryGrowthRateWarning: 5 * 1024 * 1024, // 5MB/min
20
+ memoryGrowthRateScaleUp: 10 * 1024 * 1024, // 10MB/min
21
+ agentsPerWorkspaceWarning: 3,
22
+ agentsPerWorkspaceMax: 5,
23
+ cpuWarningPercent: 70,
24
+ cpuScaleUpPercent: 85,
25
+ evaluationWindowMs: 5 * 60 * 1000, // 5 minutes
26
+ cooldownMs: 30 * 60 * 1000, // 30 minutes (free tier)
27
+ },
28
+ pro: {
29
+ memoryWarningBytes: 512 * 1024 * 1024, // 512MB
30
+ memoryCriticalBytes: 1024 * 1024 * 1024, // 1GB
31
+ memoryScaleUpBytes: 768 * 1024 * 1024, // 768MB
32
+ memoryGrowthRateWarning: 10 * 1024 * 1024, // 10MB/min
33
+ memoryGrowthRateScaleUp: 20 * 1024 * 1024, // 20MB/min
34
+ agentsPerWorkspaceWarning: 8,
35
+ agentsPerWorkspaceMax: 15,
36
+ cpuWarningPercent: 75,
37
+ cpuScaleUpPercent: 90,
38
+ evaluationWindowMs: 3 * 60 * 1000, // 3 minutes
39
+ cooldownMs: 10 * 60 * 1000, // 10 minutes
40
+ },
41
+ team: {
42
+ memoryWarningBytes: 768 * 1024 * 1024, // 768MB
43
+ memoryCriticalBytes: 1.5 * 1024 * 1024 * 1024, // 1.5GB
44
+ memoryScaleUpBytes: 1024 * 1024 * 1024, // 1GB
45
+ memoryGrowthRateWarning: 15 * 1024 * 1024, // 15MB/min
46
+ memoryGrowthRateScaleUp: 30 * 1024 * 1024, // 30MB/min
47
+ agentsPerWorkspaceWarning: 15,
48
+ agentsPerWorkspaceMax: 25,
49
+ cpuWarningPercent: 80,
50
+ cpuScaleUpPercent: 92,
51
+ evaluationWindowMs: 2 * 60 * 1000, // 2 minutes
52
+ cooldownMs: 5 * 60 * 1000, // 5 minutes
53
+ },
54
+ enterprise: {
55
+ memoryWarningBytes: 1024 * 1024 * 1024, // 1GB
56
+ memoryCriticalBytes: 2 * 1024 * 1024 * 1024, // 2GB
57
+ memoryScaleUpBytes: 1.5 * 1024 * 1024 * 1024, // 1.5GB
58
+ memoryGrowthRateWarning: 20 * 1024 * 1024, // 20MB/min
59
+ memoryGrowthRateScaleUp: 50 * 1024 * 1024, // 50MB/min
60
+ agentsPerWorkspaceWarning: 25,
61
+ agentsPerWorkspaceMax: 50,
62
+ cpuWarningPercent: 85,
63
+ cpuScaleUpPercent: 95,
64
+ evaluationWindowMs: 1 * 60 * 1000, // 1 minute
65
+ cooldownMs: 2 * 60 * 1000, // 2 minutes
66
+ },
67
+ };
68
+ // Default policies - ordered by priority (higher = evaluated first)
69
+ // In-workspace scaling is preferred over adding new workspaces (more efficient)
70
+ const DEFAULT_POLICIES = [
71
+ // === In-Workspace Scaling (Higher Priority) ===
72
+ {
73
+ id: 'agent-limit-increase',
74
+ name: 'Increase Agent Limit',
75
+ description: 'Increase max agents when approaching limit within single workspace',
76
+ enabled: true,
77
+ priority: 150, // Higher priority - try this before adding workspaces
78
+ conditions: [
79
+ { metric: 'agent_count', operator: 'gte', value: 0.85 }, // 85% of max agents
80
+ { metric: 'workspace_count', operator: 'eq', value: 1 }, // Only 1 workspace
81
+ ],
82
+ action: { type: 'increase_agent_limit', percentage: 50 }, // Increase limit by 50%
83
+ maxInstances: 10,
84
+ minInstances: 1,
85
+ },
86
+ {
87
+ id: 'workspace-resize-up',
88
+ name: 'Resize Workspace Up',
89
+ description: 'Vertically scale workspace when memory is high',
90
+ enabled: true,
91
+ priority: 140, // Higher priority than horizontal scaling
92
+ conditions: [
93
+ { metric: 'memory_usage', operator: 'gte', value: 0.75, duration: 120000 }, // 75% for 2min
94
+ { metric: 'workspace_count', operator: 'eq', value: 1 }, // Only 1 workspace
95
+ ],
96
+ action: { type: 'resize_up', percentage: 100 }, // Double resources
97
+ maxInstances: 10,
98
+ minInstances: 1,
99
+ },
100
+ {
101
+ id: 'cpu-pressure-resize',
102
+ name: 'CPU Pressure Resize',
103
+ description: 'Resize workspace when CPU is consistently high',
104
+ enabled: true,
105
+ priority: 135,
106
+ conditions: [
107
+ { metric: 'cpu_usage', operator: 'gte', value: 0.85, duration: 180000 }, // 85% for 3min
108
+ ],
109
+ action: { type: 'resize_up', percentage: 50 }, // 50% more resources
110
+ maxInstances: 10,
111
+ minInstances: 1,
112
+ },
113
+ {
114
+ id: 'workspace-resize-down',
115
+ name: 'Resize Workspace Down',
116
+ description: 'Reduce workspace resources when underutilized',
117
+ enabled: true,
118
+ priority: 45, // Lower priority
119
+ conditions: [
120
+ { metric: 'memory_usage', operator: 'lt', value: 0.15, duration: 900000 }, // Under 15% for 15min
121
+ { metric: 'cpu_usage', operator: 'lt', value: 0.1, duration: 900000 }, // Under 10% CPU
122
+ ],
123
+ action: { type: 'resize_down', percentage: 50 }, // Halve resources
124
+ maxInstances: 10,
125
+ minInstances: 1,
126
+ },
127
+ // === Horizontal Scaling (Add/Remove Workspaces) ===
128
+ {
129
+ id: 'memory-pressure-scale-up',
130
+ name: 'Memory Pressure Scale Up',
131
+ description: 'Add workspace when memory exceeds threshold across all workspaces',
132
+ enabled: true,
133
+ priority: 100,
134
+ conditions: [
135
+ { metric: 'memory_usage', operator: 'gte', value: 0.8, duration: 60000 }, // 80% for 1min
136
+ ],
137
+ action: { type: 'scale_up', targetCount: 1 },
138
+ maxInstances: 10,
139
+ minInstances: 1,
140
+ },
141
+ {
142
+ id: 'memory-trend-scale-up',
143
+ name: 'Memory Trend Scale Up',
144
+ description: 'Add workspace when memory growth rate is high',
145
+ enabled: true,
146
+ priority: 90,
147
+ conditions: [
148
+ { metric: 'memory_trend', operator: 'gte', value: 1.0, duration: 180000 }, // At threshold for 3min
149
+ ],
150
+ action: { type: 'scale_up', targetCount: 1 },
151
+ maxInstances: 10,
152
+ minInstances: 1,
153
+ },
154
+ {
155
+ id: 'agent-count-scale-up',
156
+ name: 'Agent Count Scale Up',
157
+ description: 'Add workspace when agent count is high across all workspaces',
158
+ enabled: true,
159
+ priority: 80,
160
+ conditions: [
161
+ { metric: 'agent_count', operator: 'gte', value: 0.9 }, // 90% of max agents
162
+ { metric: 'workspace_count', operator: 'gte', value: 1 }, // Already tried in-workspace scaling
163
+ ],
164
+ action: { type: 'scale_up', targetCount: 1 },
165
+ maxInstances: 10,
166
+ minInstances: 1,
167
+ },
168
+ // === Rebalancing ===
169
+ {
170
+ id: 'agent-rebalance',
171
+ name: 'Agent Rebalance',
172
+ description: 'Redistribute agents when load is uneven across workspaces',
173
+ enabled: true,
174
+ priority: 60,
175
+ conditions: [
176
+ { metric: 'workspace_count', operator: 'gte', value: 2 }, // Multiple workspaces
177
+ ],
178
+ action: { type: 'rebalance' },
179
+ maxInstances: 10,
180
+ minInstances: 1,
181
+ },
182
+ // === Scale Down ===
183
+ {
184
+ id: 'low-usage-scale-down',
185
+ name: 'Low Usage Scale Down',
186
+ description: 'Remove workspace when usage is low',
187
+ enabled: true,
188
+ priority: 50,
189
+ conditions: [
190
+ { metric: 'memory_usage', operator: 'lt', value: 0.2, duration: 600000 }, // Under 20% for 10min
191
+ { metric: 'workspace_count', operator: 'gt', value: 1 }, // More than 1 workspace
192
+ ],
193
+ action: { type: 'scale_down', targetCount: 1 },
194
+ maxInstances: 10,
195
+ minInstances: 1,
196
+ },
197
+ ];
198
+ export class ScalingPolicyService extends EventEmitter {
199
+ thresholds = new Map();
200
+ policies = new Map();
201
+ conditionHistory = new Map();
202
+ constructor() {
203
+ super();
204
+ // Initialize with defaults
205
+ for (const [plan, thresholds] of Object.entries(DEFAULT_THRESHOLDS)) {
206
+ this.thresholds.set(plan, thresholds);
207
+ }
208
+ }
209
+ /**
210
+ * Get thresholds for a plan tier
211
+ */
212
+ getThresholds(plan) {
213
+ return this.thresholds.get(plan) || this.thresholds.get('free');
214
+ }
215
+ /**
216
+ * Set custom thresholds for a plan
217
+ */
218
+ setThresholds(plan, thresholds) {
219
+ const current = this.getThresholds(plan);
220
+ this.thresholds.set(plan, { ...current, ...thresholds });
221
+ }
222
+ /**
223
+ * Get policies for a user (default + custom)
224
+ */
225
+ getPolicies(userId) {
226
+ const userPolicies = this.policies.get(userId) || [];
227
+ return [...DEFAULT_POLICIES, ...userPolicies].sort((a, b) => b.priority - a.priority);
228
+ }
229
+ /**
230
+ * Add custom policy for a user
231
+ */
232
+ addPolicy(userId, policy) {
233
+ const existing = this.policies.get(userId) || [];
234
+ existing.push(policy);
235
+ this.policies.set(userId, existing);
236
+ }
237
+ /**
238
+ * Evaluate scaling decision based on current context
239
+ */
240
+ evaluate(context) {
241
+ const thresholds = this.getThresholds(context.plan);
242
+ const policies = this.getPolicies(context.userId);
243
+ // Calculate aggregate metrics
244
+ const metrics = this.calculateAggregateMetrics(context, thresholds);
245
+ // Check cooldown
246
+ if (context.lastScalingAction) {
247
+ const timeSinceLastScale = Date.now() - context.lastScalingAction.getTime();
248
+ if (timeSinceLastScale < thresholds.cooldownMs) {
249
+ return {
250
+ shouldScale: false,
251
+ action: null,
252
+ reason: `Cooldown active (${Math.round((thresholds.cooldownMs - timeSinceLastScale) / 1000)}s remaining)`,
253
+ triggeredPolicy: null,
254
+ metrics,
255
+ timestamp: new Date(),
256
+ };
257
+ }
258
+ }
259
+ // Evaluate policies in priority order
260
+ for (const policy of policies) {
261
+ if (!policy.enabled)
262
+ continue;
263
+ const conditionsMet = this.evaluateConditions(policy.conditions, metrics, thresholds, context.userId);
264
+ if (conditionsMet) {
265
+ // Check instance limits for horizontal scaling only
266
+ if (policy.action.type === 'scale_up') {
267
+ // Block if at workspace limit (for adding new workspaces)
268
+ if (context.currentWorkspaceCount >= context.maxWorkspaces) {
269
+ continue; // Try next policy (could be in-workspace scaling)
270
+ }
271
+ if (context.currentWorkspaceCount >= policy.maxInstances) {
272
+ continue;
273
+ }
274
+ }
275
+ if (policy.action.type === 'scale_down' && context.currentWorkspaceCount <= policy.minInstances) {
276
+ continue;
277
+ }
278
+ this.emit('scaling_decision', {
279
+ userId: context.userId,
280
+ policy: policy.id,
281
+ action: policy.action,
282
+ metrics,
283
+ });
284
+ return {
285
+ shouldScale: true,
286
+ action: policy.action,
287
+ reason: policy.description,
288
+ triggeredPolicy: policy.id,
289
+ metrics,
290
+ timestamp: new Date(),
291
+ };
292
+ }
293
+ }
294
+ return {
295
+ shouldScale: false,
296
+ action: null,
297
+ reason: 'No scaling conditions met',
298
+ triggeredPolicy: null,
299
+ metrics,
300
+ timestamp: new Date(),
301
+ };
302
+ }
303
+ /**
304
+ * Calculate aggregate metrics from workspace metrics
305
+ */
306
+ calculateAggregateMetrics(context, thresholds) {
307
+ const workspaces = context.workspaceMetrics;
308
+ if (workspaces.length === 0) {
309
+ return {
310
+ memory_usage: 0,
311
+ memory_trend: 0,
312
+ agent_count: 0,
313
+ cpu_usage: 0,
314
+ workspace_count: 0,
315
+ total_memory_bytes: 0,
316
+ total_agents: 0,
317
+ };
318
+ }
319
+ const totalMemory = workspaces.reduce((sum, w) => sum + w.totalMemoryBytes, 0);
320
+ const avgTrend = workspaces.reduce((sum, w) => sum + w.memoryTrendPerMinute, 0) / workspaces.length;
321
+ const totalAgents = workspaces.reduce((sum, w) => sum + w.agentCount, 0);
322
+ const avgCpu = workspaces.reduce((sum, w) => sum + w.cpuPercent, 0) / workspaces.length;
323
+ // Normalized metrics (0-1 scale relative to thresholds)
324
+ return {
325
+ memory_usage: totalMemory / (thresholds.memoryScaleUpBytes * workspaces.length),
326
+ memory_trend: avgTrend / thresholds.memoryGrowthRateScaleUp,
327
+ agent_count: totalAgents / (thresholds.agentsPerWorkspaceMax * workspaces.length),
328
+ cpu_usage: avgCpu / thresholds.cpuScaleUpPercent,
329
+ workspace_count: context.currentWorkspaceCount,
330
+ total_memory_bytes: totalMemory,
331
+ total_agents: totalAgents,
332
+ };
333
+ }
334
+ /**
335
+ * Evaluate conditions with duration support
336
+ */
337
+ evaluateConditions(conditions, metrics, thresholds, userId) {
338
+ for (const condition of conditions) {
339
+ const metricValue = metrics[condition.metric];
340
+ if (metricValue === undefined)
341
+ continue;
342
+ const conditionMet = this.compareValues(metricValue, condition.operator, condition.value);
343
+ if (condition.duration) {
344
+ // Track condition history for duration-based evaluation
345
+ const historyKey = `${userId}:${condition.metric}`;
346
+ const history = this.conditionHistory.get(historyKey) || [];
347
+ // Add current value
348
+ history.push({ timestamp: new Date(), value: metricValue });
349
+ // Clean old entries
350
+ const cutoff = Date.now() - condition.duration;
351
+ const recentHistory = history.filter((h) => h.timestamp.getTime() > cutoff);
352
+ this.conditionHistory.set(historyKey, recentHistory);
353
+ // Check if condition has been met for the full duration
354
+ if (recentHistory.length === 0)
355
+ return false;
356
+ const allMet = recentHistory.every((h) => this.compareValues(h.value, condition.operator, condition.value));
357
+ // Also check if we have enough history
358
+ const oldestEntry = recentHistory[0].timestamp.getTime();
359
+ const hasEnoughHistory = Date.now() - oldestEntry >= condition.duration * 0.8; // 80% of duration
360
+ if (!allMet || !hasEnoughHistory)
361
+ return false;
362
+ }
363
+ else {
364
+ if (!conditionMet)
365
+ return false;
366
+ }
367
+ }
368
+ return true;
369
+ }
370
+ /**
371
+ * Compare values based on operator
372
+ */
373
+ compareValues(actual, operator, target) {
374
+ switch (operator) {
375
+ case 'gt':
376
+ return actual > target;
377
+ case 'gte':
378
+ return actual >= target;
379
+ case 'lt':
380
+ return actual < target;
381
+ case 'lte':
382
+ return actual <= target;
383
+ case 'eq':
384
+ return actual === target;
385
+ default:
386
+ return false;
387
+ }
388
+ }
389
+ /**
390
+ * Get max workspaces for a plan
391
+ */
392
+ getMaxWorkspaces(plan) {
393
+ switch (plan) {
394
+ case 'free':
395
+ return 1;
396
+ case 'pro':
397
+ return 3;
398
+ case 'team':
399
+ return 10;
400
+ case 'enterprise':
401
+ return 50;
402
+ default:
403
+ return 1;
404
+ }
405
+ }
406
+ }
407
+ // Singleton instance
408
+ let _scalingPolicyService = null;
409
+ export function getScalingPolicyService() {
410
+ if (!_scalingPolicyService) {
411
+ _scalingPolicyService = new ScalingPolicyService();
412
+ }
413
+ return _scalingPolicyService;
414
+ }
415
+ //# sourceMappingURL=scaling-policy.js.map
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Secure storage for OAuth tokens with AES-256-GCM encryption.
5
5
  */
6
- import crypto from 'crypto';
6
+ import * as crypto from 'crypto';
7
7
  import { getConfig } from '../config.js';
8
8
  import { db } from '../db/index.js';
9
9
  const ALGORITHM = 'aes-256-gcm';
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Generic Webhook System
3
+ *
4
+ * A configurable webhook system that can handle events from any source
5
+ * (GitHub, GitLab, Linear, Slack, Jira, etc.) and route them to agents.
6
+ *
7
+ * Components:
8
+ * - Parsers: Transform source-specific payloads to normalized events
9
+ * - Responders: Send responses back to source systems
10
+ * - Rules Engine: Match events to actions based on configuration
11
+ * - Router: Orchestrates the full webhook processing pipeline
12
+ */
13
+ export * from './types.js';
14
+ export { getParser, registerParser, parsers } from './parsers/index.js';
15
+ export { githubParser } from './parsers/github.js';
16
+ export { linearParser } from './parsers/linear.js';
17
+ export { slackParser } from './parsers/slack.js';
18
+ export { getResponder, registerResponder, responders } from './responders/index.js';
19
+ export { githubResponder } from './responders/github.js';
20
+ export { linearResponder } from './responders/linear.js';
21
+ export { slackResponder, formatSlackBlocks } from './responders/slack.js';
22
+ export { matchesRule, findMatchingRules, resolveActionTemplate, defaultRules, } from './rules-engine.js';
23
+ export { processWebhook, getWebhookConfig, defaultSources, } from './router.js';
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Generic Webhook System
3
+ *
4
+ * A configurable webhook system that can handle events from any source
5
+ * (GitHub, GitLab, Linear, Slack, Jira, etc.) and route them to agents.
6
+ *
7
+ * Components:
8
+ * - Parsers: Transform source-specific payloads to normalized events
9
+ * - Responders: Send responses back to source systems
10
+ * - Rules Engine: Match events to actions based on configuration
11
+ * - Router: Orchestrates the full webhook processing pipeline
12
+ */
13
+ // Types
14
+ export * from './types.js';
15
+ // Parsers
16
+ export { getParser, registerParser, parsers } from './parsers/index.js';
17
+ export { githubParser } from './parsers/github.js';
18
+ export { linearParser } from './parsers/linear.js';
19
+ export { slackParser } from './parsers/slack.js';
20
+ // Responders
21
+ export { getResponder, registerResponder, responders } from './responders/index.js';
22
+ export { githubResponder } from './responders/github.js';
23
+ export { linearResponder } from './responders/linear.js';
24
+ export { slackResponder, formatSlackBlocks } from './responders/slack.js';
25
+ // Rules Engine
26
+ export { matchesRule, findMatchingRules, resolveActionTemplate, defaultRules, } from './rules-engine.js';
27
+ // Router
28
+ export { processWebhook, getWebhookConfig, defaultSources, } from './router.js';
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,8 @@
1
+ /**
2
+ * GitHub Webhook Parser
3
+ *
4
+ * Transforms GitHub webhook payloads into normalized events.
5
+ */
6
+ import type { WebhookParser } from '../types.js';
7
+ export declare const githubParser: WebhookParser;
8
+ //# sourceMappingURL=github.d.ts.map