agent-relay 1.1.0 → 1.2.0

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 (490) hide show
  1. package/README.md +1 -1
  2. package/dist/bridge/spawner.d.ts +53 -0
  3. package/dist/bridge/spawner.d.ts.map +1 -1
  4. package/dist/bridge/spawner.js +203 -19
  5. package/dist/bridge/spawner.js.map +1 -1
  6. package/dist/bridge/types.d.ts +12 -0
  7. package/dist/bridge/types.d.ts.map +1 -1
  8. package/dist/cli/index.js +401 -5
  9. package/dist/cli/index.js.map +1 -1
  10. package/dist/cloud/api/auth.d.ts +3 -2
  11. package/dist/cloud/api/auth.d.ts.map +1 -1
  12. package/dist/cloud/api/auth.js +10 -98
  13. package/dist/cloud/api/auth.js.map +1 -1
  14. package/dist/cloud/api/cli-pty-runner.d.ts +54 -0
  15. package/dist/cloud/api/cli-pty-runner.d.ts.map +1 -0
  16. package/dist/cloud/api/cli-pty-runner.js +119 -0
  17. package/dist/cloud/api/cli-pty-runner.js.map +1 -0
  18. package/dist/cloud/api/generic-webhooks.d.ts +8 -0
  19. package/dist/cloud/api/generic-webhooks.d.ts.map +1 -0
  20. package/dist/cloud/api/generic-webhooks.js +129 -0
  21. package/dist/cloud/api/generic-webhooks.js.map +1 -0
  22. package/dist/cloud/api/git.d.ts +8 -0
  23. package/dist/cloud/api/git.d.ts.map +1 -0
  24. package/dist/cloud/api/git.js +131 -0
  25. package/dist/cloud/api/git.js.map +1 -0
  26. package/dist/cloud/api/github-app.d.ts +11 -0
  27. package/dist/cloud/api/github-app.d.ts.map +1 -0
  28. package/dist/cloud/api/github-app.js +189 -0
  29. package/dist/cloud/api/github-app.js.map +1 -0
  30. package/dist/cloud/api/middleware/planLimits.d.ts +7 -0
  31. package/dist/cloud/api/middleware/planLimits.d.ts.map +1 -1
  32. package/dist/cloud/api/middleware/planLimits.js +39 -1
  33. package/dist/cloud/api/middleware/planLimits.js.map +1 -1
  34. package/dist/cloud/api/monitoring.d.ts +11 -0
  35. package/dist/cloud/api/monitoring.d.ts.map +1 -0
  36. package/dist/cloud/api/monitoring.js +578 -0
  37. package/dist/cloud/api/monitoring.js.map +1 -0
  38. package/dist/cloud/api/nango-auth.d.ts +9 -0
  39. package/dist/cloud/api/nango-auth.d.ts.map +1 -0
  40. package/dist/cloud/api/nango-auth.js +377 -0
  41. package/dist/cloud/api/nango-auth.js.map +1 -0
  42. package/dist/cloud/api/onboarding.d.ts +8 -1
  43. package/dist/cloud/api/onboarding.d.ts.map +1 -1
  44. package/dist/cloud/api/onboarding.js +300 -119
  45. package/dist/cloud/api/onboarding.js.map +1 -1
  46. package/dist/cloud/api/policy.d.ts +8 -0
  47. package/dist/cloud/api/policy.d.ts.map +1 -0
  48. package/dist/cloud/api/policy.js +229 -0
  49. package/dist/cloud/api/policy.js.map +1 -0
  50. package/dist/cloud/api/providers.js +114 -42
  51. package/dist/cloud/api/providers.js.map +1 -1
  52. package/dist/cloud/api/test-helpers.d.ts +10 -0
  53. package/dist/cloud/api/test-helpers.d.ts.map +1 -0
  54. package/dist/cloud/api/test-helpers.js +575 -0
  55. package/dist/cloud/api/test-helpers.js.map +1 -0
  56. package/dist/cloud/api/webhooks.d.ts +7 -0
  57. package/dist/cloud/api/webhooks.d.ts.map +1 -0
  58. package/dist/cloud/api/webhooks.js +496 -0
  59. package/dist/cloud/api/webhooks.js.map +1 -0
  60. package/dist/cloud/api/workspaces.js +225 -8
  61. package/dist/cloud/api/workspaces.js.map +1 -1
  62. package/dist/cloud/billing/plans.d.ts.map +1 -1
  63. package/dist/cloud/billing/plans.js +13 -0
  64. package/dist/cloud/billing/plans.js.map +1 -1
  65. package/dist/cloud/billing/types.d.ts +9 -3
  66. package/dist/cloud/billing/types.d.ts.map +1 -1
  67. package/dist/cloud/config.d.ts +9 -2
  68. package/dist/cloud/config.d.ts.map +1 -1
  69. package/dist/cloud/config.js +13 -4
  70. package/dist/cloud/config.js.map +1 -1
  71. package/dist/cloud/db/drizzle.d.ts +84 -1
  72. package/dist/cloud/db/drizzle.d.ts.map +1 -1
  73. package/dist/cloud/db/drizzle.js +470 -0
  74. package/dist/cloud/db/drizzle.js.map +1 -1
  75. package/dist/cloud/db/index.d.ts +9 -4
  76. package/dist/cloud/db/index.d.ts.map +1 -1
  77. package/dist/cloud/db/index.js +11 -3
  78. package/dist/cloud/db/index.js.map +1 -1
  79. package/dist/cloud/db/schema.d.ts +3283 -556
  80. package/dist/cloud/db/schema.d.ts.map +1 -1
  81. package/dist/cloud/db/schema.js +314 -1
  82. package/dist/cloud/db/schema.js.map +1 -1
  83. package/dist/cloud/index.d.ts +1 -0
  84. package/dist/cloud/index.d.ts.map +1 -1
  85. package/dist/cloud/index.js +2 -0
  86. package/dist/cloud/index.js.map +1 -1
  87. package/dist/cloud/provisioner/index.d.ts +24 -0
  88. package/dist/cloud/provisioner/index.d.ts.map +1 -1
  89. package/dist/cloud/provisioner/index.js +319 -18
  90. package/dist/cloud/provisioner/index.js.map +1 -1
  91. package/dist/cloud/server.d.ts +1 -0
  92. package/dist/cloud/server.d.ts.map +1 -1
  93. package/dist/cloud/server.js +357 -13
  94. package/dist/cloud/server.js.map +1 -1
  95. package/dist/cloud/services/auto-scaler.d.ts +152 -0
  96. package/dist/cloud/services/auto-scaler.d.ts.map +1 -0
  97. package/dist/cloud/services/auto-scaler.js +439 -0
  98. package/dist/cloud/services/auto-scaler.js.map +1 -0
  99. package/dist/cloud/services/capacity-manager.d.ts +148 -0
  100. package/dist/cloud/services/capacity-manager.d.ts.map +1 -0
  101. package/dist/cloud/services/capacity-manager.js +449 -0
  102. package/dist/cloud/services/capacity-manager.js.map +1 -0
  103. package/dist/cloud/services/ci-agent-spawner.d.ts +49 -0
  104. package/dist/cloud/services/ci-agent-spawner.d.ts.map +1 -0
  105. package/dist/cloud/services/ci-agent-spawner.js +373 -0
  106. package/dist/cloud/services/ci-agent-spawner.js.map +1 -0
  107. package/dist/cloud/services/index.d.ts +12 -0
  108. package/dist/cloud/services/index.d.ts.map +1 -0
  109. package/dist/cloud/services/index.js +15 -0
  110. package/dist/cloud/services/index.js.map +1 -0
  111. package/dist/cloud/services/mention-handler.d.ts +65 -0
  112. package/dist/cloud/services/mention-handler.d.ts.map +1 -0
  113. package/dist/cloud/services/mention-handler.js +405 -0
  114. package/dist/cloud/services/mention-handler.js.map +1 -0
  115. package/dist/cloud/services/nango.d.ts +126 -0
  116. package/dist/cloud/services/nango.d.ts.map +1 -0
  117. package/dist/cloud/services/nango.js +191 -0
  118. package/dist/cloud/services/nango.js.map +1 -0
  119. package/dist/cloud/services/persistence.d.ts +131 -0
  120. package/dist/cloud/services/persistence.d.ts.map +1 -0
  121. package/dist/cloud/services/persistence.js +200 -0
  122. package/dist/cloud/services/persistence.js.map +1 -0
  123. package/dist/cloud/services/planLimits.d.ts +15 -0
  124. package/dist/cloud/services/planLimits.d.ts.map +1 -1
  125. package/dist/cloud/services/planLimits.js +28 -0
  126. package/dist/cloud/services/planLimits.js.map +1 -1
  127. package/dist/cloud/services/scaling-orchestrator.d.ts +159 -0
  128. package/dist/cloud/services/scaling-orchestrator.d.ts.map +1 -0
  129. package/dist/cloud/services/scaling-orchestrator.js +502 -0
  130. package/dist/cloud/services/scaling-orchestrator.js.map +1 -0
  131. package/dist/cloud/services/scaling-policy.d.ts +121 -0
  132. package/dist/cloud/services/scaling-policy.d.ts.map +1 -0
  133. package/dist/cloud/services/scaling-policy.js +415 -0
  134. package/dist/cloud/services/scaling-policy.js.map +1 -0
  135. package/dist/cloud/vault/index.js +1 -1
  136. package/dist/cloud/vault/index.js.map +1 -1
  137. package/dist/cloud/webhooks/index.d.ts +24 -0
  138. package/dist/cloud/webhooks/index.d.ts.map +1 -0
  139. package/dist/cloud/webhooks/index.js +29 -0
  140. package/dist/cloud/webhooks/index.js.map +1 -0
  141. package/dist/cloud/webhooks/parsers/github.d.ts +8 -0
  142. package/dist/cloud/webhooks/parsers/github.d.ts.map +1 -0
  143. package/dist/cloud/webhooks/parsers/github.js +234 -0
  144. package/dist/cloud/webhooks/parsers/github.js.map +1 -0
  145. package/dist/cloud/webhooks/parsers/index.d.ts +23 -0
  146. package/dist/cloud/webhooks/parsers/index.d.ts.map +1 -0
  147. package/dist/cloud/webhooks/parsers/index.js +30 -0
  148. package/dist/cloud/webhooks/parsers/index.js.map +1 -0
  149. package/dist/cloud/webhooks/parsers/linear.d.ts +9 -0
  150. package/dist/cloud/webhooks/parsers/linear.d.ts.map +1 -0
  151. package/dist/cloud/webhooks/parsers/linear.js +258 -0
  152. package/dist/cloud/webhooks/parsers/linear.js.map +1 -0
  153. package/dist/cloud/webhooks/parsers/slack.d.ts +9 -0
  154. package/dist/cloud/webhooks/parsers/slack.d.ts.map +1 -0
  155. package/dist/cloud/webhooks/parsers/slack.js +214 -0
  156. package/dist/cloud/webhooks/parsers/slack.js.map +1 -0
  157. package/dist/cloud/webhooks/responders/github.d.ts +8 -0
  158. package/dist/cloud/webhooks/responders/github.d.ts.map +1 -0
  159. package/dist/cloud/webhooks/responders/github.js +73 -0
  160. package/dist/cloud/webhooks/responders/github.js.map +1 -0
  161. package/dist/cloud/webhooks/responders/index.d.ts +23 -0
  162. package/dist/cloud/webhooks/responders/index.d.ts.map +1 -0
  163. package/dist/cloud/webhooks/responders/index.js +30 -0
  164. package/dist/cloud/webhooks/responders/index.js.map +1 -0
  165. package/dist/cloud/webhooks/responders/linear.d.ts +9 -0
  166. package/dist/cloud/webhooks/responders/linear.d.ts.map +1 -0
  167. package/dist/cloud/webhooks/responders/linear.js +149 -0
  168. package/dist/cloud/webhooks/responders/linear.js.map +1 -0
  169. package/dist/cloud/webhooks/responders/slack.d.ts +20 -0
  170. package/dist/cloud/webhooks/responders/slack.d.ts.map +1 -0
  171. package/dist/cloud/webhooks/responders/slack.js +178 -0
  172. package/dist/cloud/webhooks/responders/slack.js.map +1 -0
  173. package/dist/cloud/webhooks/router.d.ts +25 -0
  174. package/dist/cloud/webhooks/router.d.ts.map +1 -0
  175. package/dist/cloud/webhooks/router.js +504 -0
  176. package/dist/cloud/webhooks/router.js.map +1 -0
  177. package/dist/cloud/webhooks/rules-engine.d.ts +24 -0
  178. package/dist/cloud/webhooks/rules-engine.d.ts.map +1 -0
  179. package/dist/cloud/webhooks/rules-engine.js +287 -0
  180. package/dist/cloud/webhooks/rules-engine.js.map +1 -0
  181. package/dist/cloud/webhooks/types.d.ts +186 -0
  182. package/dist/cloud/webhooks/types.d.ts.map +1 -0
  183. package/dist/cloud/webhooks/types.js +8 -0
  184. package/dist/cloud/webhooks/types.js.map +1 -0
  185. package/dist/continuity/formatter.d.ts +51 -0
  186. package/dist/continuity/formatter.d.ts.map +1 -0
  187. package/dist/continuity/formatter.js +313 -0
  188. package/dist/continuity/formatter.js.map +1 -0
  189. package/dist/continuity/handoff-store.d.ts +67 -0
  190. package/dist/continuity/handoff-store.d.ts.map +1 -0
  191. package/dist/continuity/handoff-store.js +472 -0
  192. package/dist/continuity/handoff-store.js.map +1 -0
  193. package/dist/continuity/index.d.ts +45 -0
  194. package/dist/continuity/index.d.ts.map +1 -0
  195. package/dist/continuity/index.js +48 -0
  196. package/dist/continuity/index.js.map +1 -0
  197. package/dist/continuity/ledger-store.d.ts +110 -0
  198. package/dist/continuity/ledger-store.d.ts.map +1 -0
  199. package/dist/continuity/ledger-store.js +500 -0
  200. package/dist/continuity/ledger-store.js.map +1 -0
  201. package/dist/continuity/manager.d.ts +178 -0
  202. package/dist/continuity/manager.d.ts.map +1 -0
  203. package/dist/continuity/manager.js +562 -0
  204. package/dist/continuity/manager.js.map +1 -0
  205. package/dist/continuity/parser.d.ts +76 -0
  206. package/dist/continuity/parser.d.ts.map +1 -0
  207. package/dist/continuity/parser.js +579 -0
  208. package/dist/continuity/parser.js.map +1 -0
  209. package/dist/continuity/types.d.ts +180 -0
  210. package/dist/continuity/types.d.ts.map +1 -0
  211. package/dist/continuity/types.js +9 -0
  212. package/dist/continuity/types.js.map +1 -0
  213. package/dist/daemon/agent-manager.d.ts +27 -0
  214. package/dist/daemon/agent-manager.d.ts.map +1 -1
  215. package/dist/daemon/agent-manager.js +107 -6
  216. package/dist/daemon/agent-manager.js.map +1 -1
  217. package/dist/daemon/agent-registry.d.ts +32 -0
  218. package/dist/daemon/agent-registry.d.ts.map +1 -1
  219. package/dist/daemon/agent-registry.js +42 -2
  220. package/dist/daemon/agent-registry.js.map +1 -1
  221. package/dist/daemon/api.d.ts +12 -0
  222. package/dist/daemon/api.d.ts.map +1 -1
  223. package/dist/daemon/api.js +131 -2
  224. package/dist/daemon/api.js.map +1 -1
  225. package/dist/daemon/cli-auth.d.ts +67 -0
  226. package/dist/daemon/cli-auth.d.ts.map +1 -0
  227. package/dist/daemon/cli-auth.js +537 -0
  228. package/dist/daemon/cli-auth.js.map +1 -0
  229. package/dist/daemon/cloud-sync.d.ts.map +1 -1
  230. package/dist/daemon/cloud-sync.js +9 -7
  231. package/dist/daemon/cloud-sync.js.map +1 -1
  232. package/dist/daemon/orchestrator.d.ts.map +1 -1
  233. package/dist/daemon/orchestrator.js +30 -0
  234. package/dist/daemon/orchestrator.js.map +1 -1
  235. package/dist/daemon/router.d.ts +5 -0
  236. package/dist/daemon/router.d.ts.map +1 -1
  237. package/dist/daemon/router.js +78 -26
  238. package/dist/daemon/router.js.map +1 -1
  239. package/dist/daemon/server.d.ts +5 -0
  240. package/dist/daemon/server.d.ts.map +1 -1
  241. package/dist/daemon/server.js +9 -1
  242. package/dist/daemon/server.js.map +1 -1
  243. package/dist/daemon/services/browser-testing.d.ts +88 -0
  244. package/dist/daemon/services/browser-testing.d.ts.map +1 -0
  245. package/dist/daemon/services/browser-testing.js +244 -0
  246. package/dist/daemon/services/browser-testing.js.map +1 -0
  247. package/dist/daemon/services/container-spawner.d.ts +135 -0
  248. package/dist/daemon/services/container-spawner.d.ts.map +1 -0
  249. package/dist/daemon/services/container-spawner.js +313 -0
  250. package/dist/daemon/services/container-spawner.js.map +1 -0
  251. package/dist/daemon/types.d.ts +5 -1
  252. package/dist/daemon/types.d.ts.map +1 -1
  253. package/dist/dashboard/out/404.html +1 -1
  254. package/dist/dashboard/out/_next/static/chunks/116-2502180def231162.js +1 -0
  255. package/dist/dashboard/out/_next/static/chunks/282-980c2eb8fff20123.js +1 -0
  256. package/dist/dashboard/out/_next/static/chunks/480-2d4111711d4e473c.js +1 -0
  257. package/dist/dashboard/out/_next/static/chunks/724-73c1ee5f60abe860.js +9 -0
  258. package/dist/dashboard/out/_next/static/chunks/766-c3a14283c88d815b.js +1 -0
  259. package/dist/dashboard/out/_next/static/chunks/app/app/page-7120be68bea622f3.js +1 -0
  260. package/dist/dashboard/out/_next/static/chunks/app/connect-repos/page-dc2e3a1a22478efc.js +1 -0
  261. package/dist/dashboard/out/_next/static/chunks/app/history/{page-b6edd4dde8d08194.js → page-56a8b4616a90dc43.js} +1 -1
  262. package/dist/dashboard/out/_next/static/chunks/app/login/page-3eac37ea6f5dd153.js +1 -0
  263. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-1081dd190a331a91.js +1 -0
  264. package/dist/dashboard/out/_next/static/chunks/app/page-daf87e86f783f980.js +1 -0
  265. package/dist/dashboard/out/_next/static/chunks/app/providers/page-b68a681526eb145e.js +1 -0
  266. package/dist/dashboard/out/_next/static/chunks/app/signup/page-fee4ed1709070bcd.js +1 -0
  267. package/dist/dashboard/out/_next/static/chunks/e868780c-48e5f147c90a3a41.js +18 -0
  268. package/dist/dashboard/out/_next/static/chunks/{main-c2f423b9c9f4591b.js → main-97850e03d723ea8c.js} +1 -1
  269. package/dist/dashboard/out/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +1 -0
  270. package/dist/dashboard/out/_next/static/css/29852f26181969a0.css +1 -0
  271. package/dist/dashboard/out/_next/static/css/411ce23ffeae9f76.css +1 -0
  272. package/dist/dashboard/out/app.html +1 -14
  273. package/dist/dashboard/out/app.txt +2 -2
  274. package/dist/dashboard/out/connect-repos.html +1 -0
  275. package/dist/dashboard/out/connect-repos.txt +7 -0
  276. package/dist/dashboard/out/history.html +1 -1
  277. package/dist/dashboard/out/history.txt +2 -2
  278. package/dist/dashboard/out/index.html +1 -1
  279. package/dist/dashboard/out/index.txt +2 -2
  280. package/dist/dashboard/out/login.html +6 -0
  281. package/dist/dashboard/out/login.txt +7 -0
  282. package/dist/dashboard/out/metrics.html +1 -1
  283. package/dist/dashboard/out/metrics.txt +2 -2
  284. package/dist/dashboard/out/pricing.html +2 -2
  285. package/dist/dashboard/out/pricing.txt +2 -2
  286. package/dist/dashboard/out/providers.html +1 -0
  287. package/dist/dashboard/out/providers.txt +7 -0
  288. package/dist/dashboard/out/signup.html +6 -0
  289. package/dist/dashboard/out/signup.txt +7 -0
  290. package/dist/dashboard-server/server.d.ts.map +1 -1
  291. package/dist/dashboard-server/server.js +1308 -8
  292. package/dist/dashboard-server/server.js.map +1 -1
  293. package/dist/hooks/emitter.d.ts +40 -0
  294. package/dist/hooks/emitter.d.ts.map +1 -0
  295. package/dist/hooks/emitter.js +63 -0
  296. package/dist/hooks/emitter.js.map +1 -0
  297. package/dist/hooks/index.d.ts +3 -0
  298. package/dist/hooks/index.d.ts.map +1 -1
  299. package/dist/hooks/index.js +3 -0
  300. package/dist/hooks/index.js.map +1 -1
  301. package/dist/hooks/registry.d.ts +173 -0
  302. package/dist/hooks/registry.d.ts.map +1 -0
  303. package/dist/hooks/registry.js +476 -0
  304. package/dist/hooks/registry.js.map +1 -0
  305. package/dist/hooks/trajectory-hooks.d.ts +52 -0
  306. package/dist/hooks/trajectory-hooks.d.ts.map +1 -0
  307. package/dist/hooks/trajectory-hooks.js +183 -0
  308. package/dist/hooks/trajectory-hooks.js.map +1 -0
  309. package/dist/hooks/types.d.ts +141 -0
  310. package/dist/hooks/types.d.ts.map +1 -1
  311. package/dist/index.d.ts +2 -0
  312. package/dist/index.d.ts.map +1 -1
  313. package/dist/index.js +3 -0
  314. package/dist/index.js.map +1 -1
  315. package/dist/memory/adapters/index.d.ts +8 -0
  316. package/dist/memory/adapters/index.d.ts.map +1 -0
  317. package/dist/memory/adapters/index.js +8 -0
  318. package/dist/memory/adapters/index.js.map +1 -0
  319. package/dist/memory/adapters/inmemory.d.ts +59 -0
  320. package/dist/memory/adapters/inmemory.d.ts.map +1 -0
  321. package/dist/memory/adapters/inmemory.js +195 -0
  322. package/dist/memory/adapters/inmemory.js.map +1 -0
  323. package/dist/memory/adapters/supermemory.d.ts +71 -0
  324. package/dist/memory/adapters/supermemory.d.ts.map +1 -0
  325. package/dist/memory/adapters/supermemory.js +338 -0
  326. package/dist/memory/adapters/supermemory.js.map +1 -0
  327. package/dist/memory/factory.d.ts +48 -0
  328. package/dist/memory/factory.d.ts.map +1 -0
  329. package/dist/memory/factory.js +143 -0
  330. package/dist/memory/factory.js.map +1 -0
  331. package/dist/memory/index.d.ts +32 -0
  332. package/dist/memory/index.d.ts.map +1 -0
  333. package/dist/memory/index.js +32 -0
  334. package/dist/memory/index.js.map +1 -0
  335. package/dist/memory/memory-hooks.d.ts +60 -0
  336. package/dist/memory/memory-hooks.d.ts.map +1 -0
  337. package/dist/memory/memory-hooks.js +313 -0
  338. package/dist/memory/memory-hooks.js.map +1 -0
  339. package/dist/memory/service.d.ts +49 -0
  340. package/dist/memory/service.d.ts.map +1 -0
  341. package/dist/memory/service.js +146 -0
  342. package/dist/memory/service.js.map +1 -0
  343. package/dist/memory/types.d.ts +195 -0
  344. package/dist/memory/types.d.ts.map +1 -0
  345. package/dist/memory/types.js +8 -0
  346. package/dist/memory/types.js.map +1 -0
  347. package/dist/policy/agent-policy.d.ts +225 -0
  348. package/dist/policy/agent-policy.d.ts.map +1 -0
  349. package/dist/policy/agent-policy.js +665 -0
  350. package/dist/policy/agent-policy.js.map +1 -0
  351. package/dist/policy/cloud-policy-fetcher.d.ts +12 -0
  352. package/dist/policy/cloud-policy-fetcher.d.ts.map +1 -0
  353. package/dist/policy/cloud-policy-fetcher.js +64 -0
  354. package/dist/policy/cloud-policy-fetcher.js.map +1 -0
  355. package/dist/resiliency/crash-insights.d.ts +156 -0
  356. package/dist/resiliency/crash-insights.d.ts.map +1 -0
  357. package/dist/resiliency/crash-insights.js +492 -0
  358. package/dist/resiliency/crash-insights.js.map +1 -0
  359. package/dist/resiliency/gossip-health.d.ts +137 -0
  360. package/dist/resiliency/gossip-health.d.ts.map +1 -0
  361. package/dist/resiliency/gossip-health.js +241 -0
  362. package/dist/resiliency/gossip-health.js.map +1 -0
  363. package/dist/resiliency/index.d.ts +5 -0
  364. package/dist/resiliency/index.d.ts.map +1 -1
  365. package/dist/resiliency/index.js +5 -0
  366. package/dist/resiliency/index.js.map +1 -1
  367. package/dist/resiliency/leader-watchdog.d.ts +109 -0
  368. package/dist/resiliency/leader-watchdog.d.ts.map +1 -0
  369. package/dist/resiliency/leader-watchdog.js +189 -0
  370. package/dist/resiliency/leader-watchdog.js.map +1 -0
  371. package/dist/resiliency/memory-monitor.d.ts +172 -0
  372. package/dist/resiliency/memory-monitor.d.ts.map +1 -0
  373. package/dist/resiliency/memory-monitor.js +593 -0
  374. package/dist/resiliency/memory-monitor.js.map +1 -0
  375. package/dist/resiliency/stateless-lead.d.ts +149 -0
  376. package/dist/resiliency/stateless-lead.d.ts.map +1 -0
  377. package/dist/resiliency/stateless-lead.js +308 -0
  378. package/dist/resiliency/stateless-lead.js.map +1 -0
  379. package/dist/resiliency/supervisor.d.ts +38 -0
  380. package/dist/resiliency/supervisor.d.ts.map +1 -1
  381. package/dist/resiliency/supervisor.js +122 -0
  382. package/dist/resiliency/supervisor.js.map +1 -1
  383. package/dist/shared/cli-auth-config.d.ts +91 -0
  384. package/dist/shared/cli-auth-config.d.ts.map +1 -0
  385. package/dist/shared/cli-auth-config.js +264 -0
  386. package/dist/shared/cli-auth-config.js.map +1 -0
  387. package/dist/storage/adapter.d.ts +1 -1
  388. package/dist/storage/adapter.d.ts.map +1 -1
  389. package/dist/trajectory/config.d.ts +84 -0
  390. package/dist/trajectory/config.d.ts.map +1 -0
  391. package/dist/trajectory/config.js +163 -0
  392. package/dist/trajectory/config.js.map +1 -0
  393. package/dist/trajectory/index.d.ts +8 -0
  394. package/dist/trajectory/index.d.ts.map +1 -0
  395. package/dist/trajectory/index.js +8 -0
  396. package/dist/trajectory/index.js.map +1 -0
  397. package/dist/trajectory/integration.d.ts +292 -0
  398. package/dist/trajectory/integration.d.ts.map +1 -0
  399. package/dist/trajectory/integration.js +834 -0
  400. package/dist/trajectory/integration.js.map +1 -0
  401. package/dist/utils/logger.js +1 -1
  402. package/dist/utils/logger.js.map +1 -1
  403. package/dist/utils/project-namespace.d.ts +24 -0
  404. package/dist/utils/project-namespace.d.ts.map +1 -1
  405. package/dist/utils/project-namespace.js +84 -0
  406. package/dist/utils/project-namespace.js.map +1 -1
  407. package/dist/wrapper/parser.d.ts +10 -0
  408. package/dist/wrapper/parser.d.ts.map +1 -1
  409. package/dist/wrapper/parser.js +100 -33
  410. package/dist/wrapper/parser.js.map +1 -1
  411. package/dist/wrapper/pty-wrapper.d.ts +197 -16
  412. package/dist/wrapper/pty-wrapper.d.ts.map +1 -1
  413. package/dist/wrapper/pty-wrapper.js +943 -106
  414. package/dist/wrapper/pty-wrapper.js.map +1 -1
  415. package/dist/wrapper/shared.d.ts +165 -0
  416. package/dist/wrapper/shared.d.ts.map +1 -0
  417. package/dist/wrapper/shared.js +270 -0
  418. package/dist/wrapper/shared.js.map +1 -0
  419. package/dist/wrapper/tmux-wrapper.d.ts +73 -11
  420. package/dist/wrapper/tmux-wrapper.d.ts.map +1 -1
  421. package/dist/wrapper/tmux-wrapper.js +541 -120
  422. package/dist/wrapper/tmux-wrapper.js.map +1 -1
  423. package/docs/CLOUD-ARCHITECTURE.md +152 -0
  424. package/docs/HOOKS_API.md +394 -0
  425. package/docs/WRAPPER_EVENTS.md +358 -0
  426. package/docs/agent-policy-snippet.md +40 -0
  427. package/docs/agent-relay-protocol.md +238 -0
  428. package/docs/agent-relay-snippet.md +53 -47
  429. package/docs/archive/EXECUTIVE_SUMMARY.md +358 -0
  430. package/docs/archive/ROADMAP.md +329 -0
  431. package/docs/competitive/GASTOWN.md +451 -0
  432. package/docs/{COMPETITIVE_ANALYSIS.md → competitive/OVERVIEW.md} +1 -0
  433. package/docs/competitive/README.md +34 -0
  434. package/docs/competitive/TMUX_ORCHESTRATOR.md +605 -0
  435. package/docs/dashboard.png +0 -0
  436. package/docs/design/ci-failure-webhooks.md +812 -0
  437. package/docs/design/comprehensive-integrations.md +238 -0
  438. package/docs/design/e2b-sandbox-integration.md +504 -0
  439. package/docs/design/github-app-permissions.md +264 -0
  440. package/docs/local-testing.md +428 -0
  441. package/docs/proposals/continuous-claude-integration.md +622 -0
  442. package/docs/proposals/custom-commands.md +368 -0
  443. package/docs/tasks/global-skills-system.tasks.md +230 -0
  444. package/docs/tasks/webhook-integrations.tasks.md +184 -0
  445. package/docs/tasks/workspace-capabilities.tasks.md +121 -0
  446. package/docs/testing/RESILIENCY-TEST-PLAN-2026-01-01.md +366 -0
  447. package/package.json +16 -7
  448. package/scripts/cloud-setup.sh +96 -0
  449. package/scripts/manual-qa.sh +293 -0
  450. package/scripts/postinstall.js +60 -0
  451. package/scripts/run-cloud-qa.sh +220 -0
  452. package/scripts/test-cli-auth/Dockerfile +44 -0
  453. package/scripts/test-cli-auth/Dockerfile.real +79 -0
  454. package/scripts/test-cli-auth/README.md +286 -0
  455. package/scripts/test-cli-auth/ci-test-real-clis.ts +251 -0
  456. package/scripts/test-cli-auth/ci-test-runner.ts +263 -0
  457. package/scripts/test-cli-auth/mock-cli.sh +147 -0
  458. package/scripts/test-cli-auth/package.json +14 -0
  459. package/scripts/test-cli-auth/test-oauth-flow.ts +220 -0
  460. package/scripts/test-pty-input-auto.js +222 -0
  461. package/scripts/test-pty-input.js +150 -0
  462. package/dist/dashboard/out/_next/static/chunks/693-7b3301d8f6bc5014.js +0 -1
  463. package/dist/dashboard/out/_next/static/chunks/713-f78477eb185f1f4d.js +0 -1
  464. package/dist/dashboard/out/_next/static/chunks/766-e53e1cfe39b0b5b5.js +0 -1
  465. package/dist/dashboard/out/_next/static/chunks/900-037c64bfd797fb2a.js +0 -1
  466. package/dist/dashboard/out/_next/static/chunks/app/app/page-e3d9e1f4466b9bae.js +0 -1
  467. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-e68825a81db67ba1.js +0 -1
  468. package/dist/dashboard/out/_next/static/chunks/app/page-cc108bf68c8a657f.js +0 -1
  469. package/dist/dashboard/out/_next/static/chunks/webpack-a5acc2831d094776.js +0 -1
  470. package/dist/dashboard/out/_next/static/css/79b80143647a07d7.css +0 -1
  471. package/dist/dashboard/out/_next/static/css/8cf277370ad48cfe.css +0 -1
  472. /package/dist/dashboard/out/_next/static/{6HHWb2ZmnJ4OSm0zUP7h4 → H5aWG0udPB4iOUIl_gytz}/_buildManifest.js +0 -0
  473. /package/dist/dashboard/out/_next/static/{6HHWb2ZmnJ4OSm0zUP7h4 → H5aWG0udPB4iOUIl_gytz}/_ssgManifest.js +0 -0
  474. /package/dist/dashboard/out/_next/static/chunks/{117-b2cd8d6485aacf2b.js → 117-b100311aff8d5c61.js} +0 -0
  475. /package/dist/dashboard/out/_next/static/chunks/{648-8f3f26864ce515e5.js → 648-a13d3c2b1be45466.js} +0 -0
  476. /package/dist/dashboard/out/_next/static/chunks/app/_not-found/{page-0b990dbb71d72a98.js → page-a4973f3e3c82fb67.js} +0 -0
  477. /package/dist/dashboard/out/_next/static/chunks/app/pricing/{page-d80e03a5297f95b6.js → page-4d72d5a5d8a9b618.js} +0 -0
  478. /package/docs/{CHANGELOG.md → archive/CHANGELOG.md} +0 -0
  479. /package/docs/{CLI-SIMPLIFICATION-COMPLETE.md → archive/CLI-SIMPLIFICATION-COMPLETE.md} +0 -0
  480. /package/docs/{DESIGN_BRIDGE_STAFFING.md → archive/DESIGN_BRIDGE_STAFFING.md} +0 -0
  481. /package/docs/{DESIGN_V2.md → archive/DESIGN_V2.md} +0 -0
  482. /package/docs/{MONETIZATION.md → archive/MONETIZATION.md} +0 -0
  483. /package/docs/{PROPOSAL-trajectories.md → archive/PROPOSAL-trajectories.md} +0 -0
  484. /package/docs/{SCALING_ANALYSIS.md → archive/SCALING_ANALYSIS.md} +0 -0
  485. /package/docs/{TESTING_PRESENCE_FEATURES.md → archive/TESTING_PRESENCE_FEATURES.md} +0 -0
  486. /package/docs/{TMUX_IMPLEMENTATION_NOTES.md → archive/TMUX_IMPLEMENTATION_NOTES.md} +0 -0
  487. /package/docs/{TMUX_IMPROVEMENTS.md → archive/TMUX_IMPROVEMENTS.md} +0 -0
  488. /package/docs/{dashboard-v2-plan.md → archive/dashboard-v2-plan.md} +0 -0
  489. /package/docs/{removable-code-analysis.md → archive/removable-code-analysis.md} +0 -0
  490. /package/docs/{competitive-analysis-mcp-agent-mail.md → competitive/MCP_AGENT_MAIL.md} +0 -0
@@ -0,0 +1,184 @@
1
+ # Webhook Integrations - Task Breakdown
2
+
3
+ Tasks for future iterations of the webhook and integrations system.
4
+ Convert to beads tasks with: `bd import docs/tasks/webhook-integrations.tasks.md`
5
+
6
+ ## Phase 1: Linear Full Integration [priority: high]
7
+
8
+ ### linear-outbound-comments
9
+ - [ ] Create LinearIntegration service class
10
+ - [ ] Implement createComment() with Linear GraphQL API
11
+ - [ ] Add Linear API key management to workspace settings
12
+ - [ ] Add encryption for stored API keys
13
+
14
+ Dependencies: none
15
+ Estimate: 2 story points
16
+
17
+ ### linear-outbound-state
18
+ - [ ] Implement setIssueState() for state transitions
19
+ - [ ] Implement getAvailableStates() to fetch team states
20
+ - [ ] Add state ID caching with TTL
21
+
22
+ Dependencies: linear-outbound-comments
23
+ Estimate: 1 story point
24
+
25
+ ### linear-outbound-issues
26
+ - [ ] Implement createIssue() with full CreateIssueInput
27
+ - [ ] Implement updateIssue() for editing
28
+ - [ ] Implement assignIssue() for assignment changes
29
+ - [ ] Add label operations (add/remove)
30
+
31
+ Dependencies: linear-outbound-state
32
+ Estimate: 3 story points
33
+
34
+ ### linear-webhook-state-change
35
+ - [ ] Parse issue state change webhooks
36
+ - [ ] Add `issue_state_changed` event type
37
+ - [ ] Create rule for auto-responding to state changes
38
+
39
+ Dependencies: none
40
+ Estimate: 1 story point
41
+
42
+ ### linear-webhook-due-dates
43
+ - [ ] Parse due date approaching events
44
+ - [ ] Add `issue_due_soon` event type with configurable threshold
45
+ - [ ] Create reminder rule for approaching due dates
46
+
47
+ Dependencies: linear-webhook-state-change
48
+ Estimate: 1 story point
49
+
50
+ ## Phase 2: Slack Enhanced [priority: high]
51
+
52
+ ### slack-slash-commands
53
+ - [ ] Create slash command handler endpoint
54
+ - [ ] Parse slash command payloads
55
+ - [ ] Add slash_command event type
56
+ - [ ] Create agent spawning from slash commands
57
+
58
+ Dependencies: none
59
+ Estimate: 2 story points
60
+
61
+ ### slack-interactive-components
62
+ - [ ] Handle button click callbacks
63
+ - [ ] Handle modal submission callbacks
64
+ - [ ] Add interactive_message event type
65
+ - [ ] Implement openModal() and updateModal()
66
+
67
+ Dependencies: slack-slash-commands
68
+ Estimate: 3 story points
69
+
70
+ ### slack-rich-messages
71
+ - [ ] Implement postBlocks() with Block Kit
72
+ - [ ] Add common block templates (code, error, success)
73
+ - [ ] Add file upload support
74
+ - [ ] Add scheduled message support
75
+
76
+ Dependencies: none
77
+ Estimate: 2 story points
78
+
79
+ ## Phase 3: GitHub Enhanced [priority: high]
80
+
81
+ ### github-pr-management
82
+ - [ ] Parse PR opened/updated webhooks
83
+ - [ ] Add pr_opened, pr_updated event types
84
+ - [ ] Implement PR review request parsing
85
+ - [ ] Add createPR() outbound action
86
+
87
+ Dependencies: none
88
+ Estimate: 3 story points
89
+
90
+ ### github-check-runs
91
+ - [ ] Implement createCheckRun() for CI status
92
+ - [ ] Implement updateCheckRun() for progress
93
+ - [ ] Add annotations support for inline errors
94
+ - [ ] Parse deployment status webhooks
95
+
96
+ Dependencies: github-pr-management
97
+ Estimate: 2 story points
98
+
99
+ ### github-issue-management
100
+ - [ ] Implement createIssue()
101
+ - [ ] Implement addLabels() and removeLabels()
102
+ - [ ] Implement assignUsers()
103
+ - [ ] Add issue linking support
104
+
105
+ Dependencies: none
106
+ Estimate: 2 story points
107
+
108
+ ## Phase 4: Agent Tools [priority: medium]
109
+
110
+ ### agent-integration-tools
111
+ - [ ] Create integration tools accessible to agents
112
+ - [ ] Add LinearTool for agent actions
113
+ - [ ] Add SlackTool for agent messages
114
+ - [ ] Add GitHubTool for agent operations
115
+
116
+ Dependencies: linear-outbound-issues, slack-rich-messages, github-issue-management
117
+ Estimate: 4 story points
118
+
119
+ ### agent-permissions
120
+ - [ ] Implement AgentIntegrationPermissions type
121
+ - [ ] Add permission checking before actions
122
+ - [ ] Create permission UI in spawn modal
123
+ - [ ] Add audit logging for all external calls
124
+
125
+ Dependencies: agent-integration-tools
126
+ Estimate: 2 story points
127
+
128
+ ## Phase 5: Additional Integrations [priority: low]
129
+
130
+ ### jira-integration
131
+ - [ ] Create Jira webhook parser
132
+ - [ ] Implement JiraIntegration service
133
+ - [ ] Add Jira responder
134
+ - [ ] Add workspace settings for Jira
135
+
136
+ Dependencies: agent-integration-tools
137
+ Estimate: 4 story points
138
+
139
+ ### gitlab-integration
140
+ - [ ] Create GitLab webhook parser
141
+ - [ ] Implement GitLabIntegration service
142
+ - [ ] Add GitLab responder
143
+ - [ ] Map GitLab events to normalized format
144
+
145
+ Dependencies: agent-integration-tools
146
+ Estimate: 3 story points
147
+
148
+ ### discord-integration
149
+ - [ ] Create Discord webhook parser
150
+ - [ ] Implement DiscordIntegration service
151
+ - [ ] Add Discord responder
152
+ - [ ] Handle Discord-specific message formatting
153
+
154
+ Dependencies: agent-integration-tools
155
+ Estimate: 3 story points
156
+
157
+ ## Testing & Infrastructure
158
+
159
+ ### webhook-load-testing
160
+ - [ ] Create load test suite for webhook endpoint
161
+ - [ ] Measure p50/p95/p99 latencies
162
+ - [ ] Test concurrent webhook handling
163
+ - [ ] Add rate limiting if needed
164
+
165
+ Dependencies: none
166
+ Estimate: 2 story points
167
+
168
+ ### integration-mocks
169
+ - [ ] Create mock Linear API server for tests
170
+ - [ ] Create mock Slack API server for tests
171
+ - [ ] Create mock GitHub API server for tests
172
+ - [ ] Add E2E test suite with mocks
173
+
174
+ Dependencies: none
175
+ Estimate: 3 story points
176
+
177
+ ### sandbox-testing
178
+ - [ ] Set up Linear sandbox workspace
179
+ - [ ] Set up Slack test workspace
180
+ - [ ] Set up GitHub test repository
181
+ - [ ] Create E2E test suite with real APIs
182
+
183
+ Dependencies: integration-mocks
184
+ Estimate: 2 story points
@@ -0,0 +1,121 @@
1
+ # Workspace Capabilities - Agent Discovery
2
+
3
+ How should agents discover and use workspace capabilities (browser testing, container spawning, etc.)?
4
+
5
+ ## Problem Statement
6
+
7
+ We have workspace capabilities:
8
+ - Browser testing (Playwright, Xvfb, VNC)
9
+ - Container spawning (Docker socket)
10
+ - Potentially more in the future (E2B, Browserbase)
11
+
12
+ **Challenge:** How do agents know these exist without bloating context for every agent?
13
+
14
+ Current implementations exist but are not wired up:
15
+ - `src/daemon/services/browser-testing.ts`
16
+ - `src/daemon/services/container-spawner.ts`
17
+ - `deploy/workspace/Dockerfile.browser`
18
+
19
+ ## Key Questions
20
+
21
+ ### 1. Static vs Dynamic Discovery
22
+ - [ ] Should capabilities be in rules/skills (static, always injected)?
23
+ - [ ] Should capabilities be discovered via MCP at runtime (dynamic)?
24
+ - [ ] Hybrid: minimal hint in rules, full discovery via MCP?
25
+
26
+ ### 2. Cloud vs Local
27
+ - [ ] Cloud workspaces: How are capabilities configured per workspace?
28
+ - [ ] Local daemons: How does the daemon know what's available?
29
+ - [ ] Should there be a "capability manifest" per workspace?
30
+
31
+ ### 3. Context Budget
32
+ - [ ] How much context is acceptable for capability hints?
33
+ - [ ] Should agents ask for capabilities only when needed?
34
+ - [ ] Can we use tool descriptions instead of injected prompts?
35
+
36
+ ### 4. Opt-in vs Opt-out
37
+ - [ ] Should capabilities be enabled by default?
38
+ - [ ] Per-workspace configuration?
39
+ - [ ] Per-agent configuration?
40
+
41
+ ## Design Options
42
+
43
+ ### Option A: MCP-Only Discovery
44
+ Agents call `workspace_capabilities` tool to discover what's available.
45
+ No static context injection.
46
+
47
+ **Pros:** Zero context overhead, dynamic
48
+ **Cons:** Agents might not know to call it
49
+
50
+ ### Option B: Minimal Hint + MCP
51
+ One line in system prompt: "Call workspace_capabilities to check for browser/container tools"
52
+
53
+ **Pros:** Tiny context, agents know to look
54
+ **Cons:** Still some static injection
55
+
56
+ ### Option C: Workspace Manifest
57
+ Each workspace has a capabilities.json that configures what's available.
58
+ Cloud provisions this, agents read at startup.
59
+
60
+ **Pros:** Explicit configuration
61
+ **Cons:** More infrastructure
62
+
63
+ ### Option D: Auto-Detection
64
+ MCP server auto-detects capabilities (checks DISPLAY, docker.sock) and only exposes available tools.
65
+
66
+ **Pros:** Zero configuration, just works
67
+ **Cons:** Magic behavior
68
+
69
+ ## Tasks
70
+
71
+ ### capability-discovery-design
72
+ - [ ] Decide on discovery mechanism
73
+ - [ ] Document decision rationale
74
+ - [ ] Create ADR (Architecture Decision Record)
75
+
76
+ Dependencies: none
77
+ Priority: high
78
+
79
+ ### capability-manifest-schema
80
+ - [ ] Define WorkspaceCapabilities schema
81
+ - [ ] Define how cloud provisions capabilities
82
+ - [ ] Define how daemon reads capabilities
83
+
84
+ Dependencies: capability-discovery-design
85
+ Priority: medium
86
+
87
+ ### mcp-capability-tools
88
+ - [ ] Create MCP server for workspace tools
89
+ - [ ] Only expose tools for available capabilities
90
+ - [ ] Add workspace_capabilities discovery tool
91
+
92
+ Dependencies: capability-manifest-schema
93
+ Priority: medium
94
+
95
+ ### agent-prompting-strategy
96
+ - [ ] Determine minimal context for capability awareness
97
+ - [ ] Test with real agents
98
+ - [ ] Measure context overhead
99
+
100
+ Dependencies: capability-discovery-design
101
+ Priority: medium
102
+
103
+ ### cloud-workspace-config
104
+ - [ ] Add capabilities to workspace provisioning
105
+ - [ ] UI for enabling/disabling capabilities
106
+ - [ ] Per-workspace capability billing (if applicable)
107
+
108
+ Dependencies: capability-manifest-schema
109
+ Priority: low
110
+
111
+ ## Notes
112
+
113
+ The core services are already implemented:
114
+ - Browser testing: `src/daemon/services/browser-testing.ts`
115
+ - Container spawning: `src/daemon/services/container-spawner.ts`
116
+ - Browser Dockerfile: `deploy/workspace/Dockerfile.browser`
117
+
118
+ What's missing is the discovery/awareness layer that doesn't bloat context.
119
+
120
+ See also:
121
+ - `docs/design/e2b-sandbox-integration.md` - E2B as alternative backend
@@ -0,0 +1,366 @@
1
+ # Resiliency Features Test Plan
2
+
3
+ **Date:** 2026-01-01
4
+ **Features:** P0-P5 Leader Coordination and Failover
5
+ **Branch:** `claude/add-continuous-claude-logic-kba3r`
6
+
7
+ ---
8
+
9
+ ## Prerequisites
10
+
11
+ 1. Build the project: `npm run build`
12
+ 2. Have at least 2-3 terminal windows ready
13
+ 3. Ensure `.beads/` directory exists with `issues.jsonl`
14
+
15
+ ---
16
+
17
+ ## P0: Stateless Lead Pattern
18
+
19
+ ### Test 1: Lead reads tasks from Beads
20
+
21
+ **Setup:**
22
+ ```bash
23
+ # Add a test task to Beads
24
+ echo '{"id":"test-001","title":"Test task for P0","status":"open","priority":1,"created_at":"2026-01-01T00:00:00Z","updated_at":"2026-01-01T00:00:00Z"}' >> .beads/issues.jsonl
25
+ ```
26
+
27
+ **Test:**
28
+ ```typescript
29
+ import { createStatelessLead } from './src/resiliency';
30
+
31
+ const lead = createStatelessLead('.beads', 'TestLead', 'lead-001', {
32
+ sendRelay: async (to, msg) => console.log(`[RELAY] To ${to}: ${msg}`),
33
+ getAvailableWorkers: async () => ['Worker1', 'Worker2'],
34
+ });
35
+
36
+ await lead.start();
37
+ // Wait 5 seconds for poll
38
+ // Expected: Console shows "Assigned test-001 to Worker1"
39
+ ```
40
+
41
+ **Verify:**
42
+ ```bash
43
+ # Check task was assigned in Beads
44
+ grep "test-001" .beads/issues.jsonl
45
+ # Should show: "status":"in_progress","assignee":"Worker1"
46
+ ```
47
+
48
+ **Pass criteria:**
49
+ - [ ] Task status changed to `in_progress`
50
+ - [ ] Task has `assignee` field set
51
+ - [ ] Task has `leaseExpires` timestamp
52
+
53
+ ---
54
+
55
+ ## P1: Task Lease Timeouts
56
+
57
+ ### Test 2: Lease expiration returns task to queue
58
+
59
+ **Setup:**
60
+ ```typescript
61
+ // Create lead with short lease (10 seconds for testing)
62
+ const lead = new StatelessLeadCoordinator({
63
+ beadsDir: '.beads',
64
+ agentName: 'TestLead',
65
+ agentId: 'lead-001',
66
+ pollIntervalMs: 2000,
67
+ heartbeatIntervalMs: 5000,
68
+ leaseDurationMs: 10000, // 10 second lease
69
+ sendRelay: async (to, msg) => console.log(`[RELAY] To ${to}: ${msg}`),
70
+ getAvailableWorkers: async () => ['Worker1'],
71
+ });
72
+ ```
73
+
74
+ **Test:**
75
+ 1. Start lead - task gets assigned
76
+ 2. Wait 15 seconds (lease expires)
77
+ 3. Add new worker to available list
78
+ 4. Wait for next poll
79
+
80
+ **Verify:**
81
+ ```bash
82
+ # Task should be reassigned after lease expires
83
+ grep "test-001" .beads/issues.jsonl
84
+ ```
85
+
86
+ **Pass criteria:**
87
+ - [ ] Task returned to queue after lease expired
88
+ - [ ] Task reassigned to new worker on next poll
89
+
90
+ ### Test 3: Lease renewal
91
+
92
+ **Test:**
93
+ ```typescript
94
+ // Worker renews lease before expiration
95
+ await lead.renewLease('test-001', 'Worker1');
96
+ ```
97
+
98
+ **Pass criteria:**
99
+ - [ ] `leaseExpires` timestamp updated
100
+ - [ ] Console shows "Renewed lease for test-001"
101
+
102
+ ---
103
+
104
+ ## P2: Leader Heartbeat File
105
+
106
+ ### Test 4: Heartbeat file created and updated
107
+
108
+ **Test:**
109
+ ```typescript
110
+ const lead = createStatelessLead('.beads', 'TestLead', 'lead-001', {
111
+ sendRelay: async () => {},
112
+ getAvailableWorkers: async () => [],
113
+ });
114
+
115
+ await lead.start();
116
+ // Wait 15 seconds
117
+ ```
118
+
119
+ **Verify:**
120
+ ```bash
121
+ cat .beads/leader-heartbeat.json
122
+ ```
123
+
124
+ **Expected output:**
125
+ ```json
126
+ {
127
+ "leadName": "TestLead",
128
+ "leadId": "lead-001",
129
+ "timestamp": 1735689600000,
130
+ "activeTaskCount": 0,
131
+ "assignedAgents": []
132
+ }
133
+ ```
134
+
135
+ **Pass criteria:**
136
+ - [ ] File exists at `.beads/leader-heartbeat.json`
137
+ - [ ] `timestamp` updates every 10 seconds
138
+ - [ ] `activeTaskCount` reflects assigned tasks
139
+
140
+ ---
141
+
142
+ ## P3: Watchdog in AgentSupervisor
143
+
144
+ ### Test 5: Watchdog detects stale leader
145
+
146
+ **Terminal 1 - Start leader:**
147
+ ```typescript
148
+ import { createStatelessLead } from './src/resiliency';
149
+
150
+ const lead = createStatelessLead('.beads', 'Leader1', 'lead-001', {
151
+ sendRelay: async () => {},
152
+ getAvailableWorkers: async () => [],
153
+ });
154
+ await lead.start();
155
+ console.log('Leader1 started');
156
+ ```
157
+
158
+ **Terminal 2 - Start watchdog:**
159
+ ```typescript
160
+ import { createLeaderWatchdog } from './src/resiliency';
161
+
162
+ const watchdog = createLeaderWatchdog('.beads', 'Watchdog1', 'watch-001', {
163
+ onBecomeLeader: async () => console.log('I AM NOW LEADER!'),
164
+ getHealthyAgents: async () => [
165
+ { name: 'Watchdog1', id: 'watch-001', spawnedAt: new Date() }
166
+ ],
167
+ });
168
+
169
+ watchdog.on('leaderDetected', (h) => console.log('Leader detected:', h.leadName));
170
+ watchdog.on('leaderStale', (d) => console.log('Leader stale!', d));
171
+ watchdog.on('becameLeader', () => console.log('Became leader'));
172
+
173
+ watchdog.start();
174
+ ```
175
+
176
+ **Test:**
177
+ 1. Both running - watchdog should detect Leader1
178
+ 2. Kill Terminal 1 (Ctrl+C)
179
+ 3. Wait 35 seconds (stale threshold + check interval)
180
+
181
+ **Pass criteria:**
182
+ - [ ] Watchdog logs "Leader detected: Leader1"
183
+ - [ ] After leader killed, watchdog logs "Leader stale!"
184
+ - [ ] Watchdog logs "I AM NOW LEADER!"
185
+ - [ ] New heartbeat file shows Watchdog1 as leader
186
+
187
+ ---
188
+
189
+ ## P4: Gossip-Based Health Broadcast
190
+
191
+ ### Test 6: Peer discovery via heartbeats
192
+
193
+ **Terminal 1 - Agent A:**
194
+ ```typescript
195
+ import { createGossipHealth } from './src/resiliency';
196
+
197
+ const messages: string[] = [];
198
+ const gossipA = createGossipHealth('AgentA', 'a-001', async (msg) => {
199
+ messages.push(msg);
200
+ console.log('[A broadcast]', msg);
201
+ });
202
+
203
+ gossipA.on('peerDiscovered', (p) => console.log('Discovered peer:', p.name));
204
+ gossipA.start();
205
+
206
+ // Simulate receiving B's heartbeat
207
+ setTimeout(() => {
208
+ const heartbeat = {
209
+ type: 'HEARTBEAT',
210
+ agent: 'AgentB',
211
+ agentId: 'b-001',
212
+ timestamp: Date.now(),
213
+ load: 0.5,
214
+ healthy: true,
215
+ isLeader: false,
216
+ taskCount: 2,
217
+ };
218
+ gossipA.processHeartbeat(heartbeat);
219
+ }, 5000);
220
+ ```
221
+
222
+ **Pass criteria:**
223
+ - [ ] AgentA broadcasts HEARTBEAT messages
224
+ - [ ] "Discovered peer: AgentB" logged
225
+ - [ ] `gossipA.getPeers()` returns AgentB
226
+
227
+ ### Test 7: Stale peer detection
228
+
229
+ **Test:**
230
+ ```typescript
231
+ // Process old heartbeat
232
+ const staleHeartbeat = {
233
+ type: 'HEARTBEAT',
234
+ agent: 'AgentC',
235
+ agentId: 'c-001',
236
+ timestamp: Date.now() - 60000, // 1 minute old
237
+ load: 0,
238
+ healthy: true,
239
+ isLeader: false,
240
+ taskCount: 0,
241
+ };
242
+
243
+ gossipA.on('peerStale', (d) => console.log('Peer stale:', d.peer.name));
244
+ gossipA.processHeartbeat(staleHeartbeat);
245
+
246
+ // Wait for check interval (5 seconds)
247
+ ```
248
+
249
+ **Pass criteria:**
250
+ - [ ] "Peer stale: AgentC" logged within 10 seconds
251
+ - [ ] `gossipA.getPeer('AgentC').healthy` is `false`
252
+
253
+ ---
254
+
255
+ ## P5: Full Leader Election
256
+
257
+ ### Test 8: Oldest agent wins election
258
+
259
+ **Setup:** Start 3 agents at different times
260
+
261
+ **Terminal 1 (start first):**
262
+ ```typescript
263
+ import { getSupervisor } from './src/resiliency';
264
+
265
+ const supervisor = getSupervisor();
266
+ supervisor.start();
267
+
268
+ supervisor.on('electionStarted', (d) => console.log('Election started:', d));
269
+ supervisor.on('electionComplete', (d) => console.log('Election result:', d));
270
+ supervisor.on('becameLeader', () => console.log('*** I AM LEADER ***'));
271
+
272
+ supervisor.enableLeaderCoordination('.beads', async (to, msg) => {
273
+ console.log(`Send to ${to}: ${msg}`);
274
+ });
275
+
276
+ console.log('Supervisor started at', new Date().toISOString());
277
+ ```
278
+
279
+ **Verify:**
280
+ ```bash
281
+ cat .beads/leader-heartbeat.json
282
+ # Should show first supervisor as leader
283
+ ```
284
+
285
+ **Pass criteria:**
286
+ - [ ] First started supervisor becomes leader
287
+ - [ ] `leader-heartbeat.json` shows correct leader
288
+ - [ ] Election uses "oldest" method
289
+
290
+ ### Test 9: Failover on leader death
291
+
292
+ **Test:**
293
+ 1. Start Supervisor A (becomes leader)
294
+ 2. Start Supervisor B (detects A as leader)
295
+ 3. Kill Supervisor A
296
+ 4. Wait 35 seconds
297
+
298
+ **Pass criteria:**
299
+ - [ ] Supervisor B logs "Leader stale"
300
+ - [ ] Supervisor B logs "*** I AM LEADER ***"
301
+ - [ ] Heartbeat file updates to show B as leader
302
+
303
+ ---
304
+
305
+ ## Integration Test: Full Workflow
306
+
307
+ ### Test 10: End-to-end task assignment and failover
308
+
309
+ **Setup:**
310
+ ```bash
311
+ # Clear test data
312
+ rm -f .beads/leader-heartbeat.json
313
+ # Add test tasks
314
+ cat >> .beads/issues.jsonl << 'EOF'
315
+ {"id":"e2e-001","title":"E2E Test Task 1","status":"open","priority":1,"created_at":"2026-01-01T00:00:00Z","updated_at":"2026-01-01T00:00:00Z"}
316
+ {"id":"e2e-002","title":"E2E Test Task 2","status":"open","priority":2,"created_at":"2026-01-01T00:00:00Z","updated_at":"2026-01-01T00:00:00Z"}
317
+ EOF
318
+ ```
319
+
320
+ **Workflow:**
321
+ 1. Start Lead agent
322
+ 2. Start 2 Worker agents
323
+ 3. Verify tasks assigned
324
+ 4. Kill Lead agent
325
+ 5. Verify new leader elected
326
+ 6. Verify tasks continue processing
327
+
328
+ **Pass criteria:**
329
+ - [ ] Tasks assigned to workers
330
+ - [ ] Leader failover completes in <35 seconds
331
+ - [ ] No task duplication
332
+ - [ ] Orphaned tasks return to queue
333
+
334
+ ---
335
+
336
+ ## Cleanup
337
+
338
+ ```bash
339
+ # Remove test data
340
+ grep -v "test-001\|e2e-00" .beads/issues.jsonl > .beads/issues.jsonl.tmp
341
+ mv .beads/issues.jsonl.tmp .beads/issues.jsonl
342
+ rm -f .beads/leader-heartbeat.json
343
+ ```
344
+
345
+ ---
346
+
347
+ ## Summary Checklist
348
+
349
+ | Feature | Test | Status |
350
+ |---------|------|--------|
351
+ | P0: Stateless Lead | Test 1: Lead reads from Beads | ☐ |
352
+ | P1: Lease Timeouts | Test 2: Lease expiration | ☐ |
353
+ | P1: Lease Timeouts | Test 3: Lease renewal | ☐ |
354
+ | P2: Heartbeat File | Test 4: File created/updated | ☐ |
355
+ | P3: Watchdog | Test 5: Stale leader detection | ☐ |
356
+ | P4: Gossip Health | Test 6: Peer discovery | ☐ |
357
+ | P4: Gossip Health | Test 7: Stale peer detection | ☐ |
358
+ | P5: Leader Election | Test 8: Oldest wins | ☐ |
359
+ | P5: Leader Election | Test 9: Failover | ☐ |
360
+ | Integration | Test 10: Full workflow | ☐ |
361
+
362
+ ---
363
+
364
+ **Tester:** ____________________
365
+ **Date Completed:** ____________________
366
+ **Notes:**