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,191 @@
1
+ import { Nango } from '@nangohq/node';
2
+ import crypto from 'node:crypto';
3
+ import { getConfig } from '../config.js';
4
+ export const NANGO_INTEGRATIONS = {
5
+ GITHUB_USER: 'github',
6
+ GITHUB_APP: 'github-app-oauth',
7
+ };
8
+ class NangoService {
9
+ client;
10
+ secret;
11
+ constructor() {
12
+ const config = getConfig();
13
+ this.secret = config.nango.secretKey;
14
+ this.client = new Nango({
15
+ secretKey: config.nango.secretKey,
16
+ ...(config.nango.host ? { host: config.nango.host } : {}),
17
+ });
18
+ }
19
+ /**
20
+ * Create a Nango connect session restricted to specific integrations.
21
+ */
22
+ async createConnectSession(allowedIntegrations, endUser) {
23
+ const { data } = await this.client.createConnectSession({
24
+ allowed_integrations: allowedIntegrations,
25
+ end_user: {
26
+ id: endUser.id,
27
+ email: endUser.email,
28
+ },
29
+ });
30
+ return data;
31
+ }
32
+ /**
33
+ * Fetch GitHub user profile via Nango proxy.
34
+ */
35
+ async getGithubUser(connectionId) {
36
+ const response = await this.client.get({
37
+ connectionId,
38
+ providerConfigKey: NANGO_INTEGRATIONS.GITHUB_USER,
39
+ endpoint: '/user',
40
+ });
41
+ return response.data;
42
+ }
43
+ /**
44
+ * Retrieve an installation access token from a GitHub App connection.
45
+ * Use this ONLY when you need the raw token (e.g., for git clone URLs).
46
+ * For API calls, use the proxy methods instead.
47
+ */
48
+ async getGithubAppToken(connectionId) {
49
+ const token = await this.client.getToken(NANGO_INTEGRATIONS.GITHUB_APP, connectionId, false, true);
50
+ // Handle different return formats from Nango
51
+ if (typeof token === 'string') {
52
+ return token;
53
+ }
54
+ // Nango may return an object with access_token
55
+ if (token && typeof token === 'object') {
56
+ const tokenObj = token;
57
+ if (tokenObj.access_token) {
58
+ return tokenObj.access_token;
59
+ }
60
+ if (tokenObj.token) {
61
+ return tokenObj.token;
62
+ }
63
+ }
64
+ console.error('[nango] Unexpected token format:', typeof token, token);
65
+ throw new Error('Expected GitHub App token to be a string');
66
+ }
67
+ /**
68
+ * List repositories available to a GitHub App installation using the Nango Proxy.
69
+ * The proxy automatically handles token injection and refresh.
70
+ * @see https://nango.dev/docs/implementation-guides/requests-proxy/implement-requests-proxy
71
+ */
72
+ async listGithubAppRepos(connectionId) {
73
+ const response = await this.client.get({
74
+ connectionId,
75
+ providerConfigKey: NANGO_INTEGRATIONS.GITHUB_APP,
76
+ endpoint: '/installation/repositories',
77
+ params: { per_page: '100' },
78
+ });
79
+ return response.data;
80
+ }
81
+ /**
82
+ * Get the GitHub App installation ID from a connection.
83
+ * The installation ID is stored in connection_config.installation_id
84
+ */
85
+ async getGithubAppInstallationId(connectionId) {
86
+ try {
87
+ const connection = await this.client.getConnection(NANGO_INTEGRATIONS.GITHUB_APP, connectionId);
88
+ // Extract installation_id from connection_config (where Nango stores it for GitHub App OAuth)
89
+ const connectionConfig = connection.connection_config;
90
+ if (connectionConfig?.installation_id) {
91
+ return Number(connectionConfig.installation_id);
92
+ }
93
+ console.warn('[nango] No installation_id in connection_config');
94
+ return null;
95
+ }
96
+ catch (err) {
97
+ console.error('[nango] Failed to get installation ID:', err);
98
+ return null;
99
+ }
100
+ }
101
+ /**
102
+ * Create an issue via Nango Proxy.
103
+ */
104
+ async createGithubIssue(connectionId, owner, repo, data) {
105
+ const response = await this.client.post({
106
+ connectionId,
107
+ providerConfigKey: NANGO_INTEGRATIONS.GITHUB_APP,
108
+ endpoint: `/repos/${owner}/${repo}/issues`,
109
+ data,
110
+ });
111
+ return response.data;
112
+ }
113
+ /**
114
+ * Create a pull request via Nango Proxy.
115
+ */
116
+ async createGithubPullRequest(connectionId, owner, repo, data) {
117
+ const response = await this.client.post({
118
+ connectionId,
119
+ providerConfigKey: NANGO_INTEGRATIONS.GITHUB_APP,
120
+ endpoint: `/repos/${owner}/${repo}/pulls`,
121
+ data,
122
+ });
123
+ return response.data;
124
+ }
125
+ /**
126
+ * Add a comment to an issue via Nango Proxy.
127
+ */
128
+ async addGithubIssueComment(connectionId, owner, repo, issueNumber, body) {
129
+ const response = await this.client.post({
130
+ connectionId,
131
+ providerConfigKey: NANGO_INTEGRATIONS.GITHUB_APP,
132
+ endpoint: `/repos/${owner}/${repo}/issues/${issueNumber}/comments`,
133
+ data: { body },
134
+ });
135
+ return response.data;
136
+ }
137
+ /**
138
+ * Update connection end user metadata (e.g., after creating a user record).
139
+ */
140
+ async updateEndUser(connectionId, providerConfigKey, endUser) {
141
+ await this.client.patchConnection({ connectionId, provider_config_key: providerConfigKey }, { end_user: endUser });
142
+ }
143
+ /**
144
+ * Delete a connection from Nango.
145
+ *
146
+ * Used to remove temporary session connections for returning users
147
+ * to prevent duplicate connections in Nango. In the two-connection pattern,
148
+ * new users get a permanent connection but returning users authenticate
149
+ * with a temporary one that gets deleted.
150
+ *
151
+ * @param connectionId - Nango connection ID to delete
152
+ * @param providerConfigKey - The integration key (e.g., 'github')
153
+ */
154
+ async deleteConnection(connectionId, providerConfigKey) {
155
+ await this.client.deleteConnection(providerConfigKey, connectionId);
156
+ }
157
+ /**
158
+ * Get connection metadata including end_user info.
159
+ * Useful when webhook doesn't include end_user data.
160
+ */
161
+ async getConnection(connectionId, providerConfigKey) {
162
+ const connection = await this.client.getConnection(providerConfigKey, connectionId);
163
+ return connection;
164
+ }
165
+ /**
166
+ * Verify webhook signature sent by Nango.
167
+ * Uses the new verifyIncomingWebhookRequest method.
168
+ * @see https://nango.dev/docs/reference/sdks/node#verify-webhook-signature
169
+ */
170
+ verifyWebhookSignature(rawBody, headers) {
171
+ try {
172
+ // Use the new method: verifyIncomingWebhookRequest(body, headers)
173
+ return this.client.verifyIncomingWebhookRequest(rawBody, headers);
174
+ }
175
+ catch (err) {
176
+ console.error('[nango] verifyIncomingWebhookRequest error:', err);
177
+ // Fall back to manual HMAC verification using the secret key
178
+ const signature = headers['x-nango-signature'];
179
+ const hmacSha256 = headers['x-nango-hmac-sha256'];
180
+ if (!signature && !hmacSha256)
181
+ return false;
182
+ const expectedSignature = crypto
183
+ .createHmac('sha256', this.secret)
184
+ .update(rawBody)
185
+ .digest('hex');
186
+ return signature === expectedSignature || hmacSha256 === expectedSignature;
187
+ }
188
+ }
189
+ }
190
+ export const nangoService = new NangoService();
191
+ //# sourceMappingURL=nango.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nango.js","sourceRoot":"","sources":["../../../src/cloud/services/nango.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Cloud Persistence Service
3
+ *
4
+ * Handles durable persistence of agent session data for cloud deployments.
5
+ * Subscribes to PtyWrapper events ('summary', 'session-end') and persists
6
+ * to PostgreSQL via Drizzle ORM.
7
+ *
8
+ * This decouples PtyWrapper from storage concerns - the wrapper emits events,
9
+ * this service handles persistence. Different storage backends can be swapped
10
+ * by implementing alternative persistence services.
11
+ *
12
+ * @see PtyWrapperEvents in src/wrapper/pty-wrapper.ts for event definitions
13
+ */
14
+ import type { PtyWrapper } from '../../wrapper/pty-wrapper.js';
15
+ /**
16
+ * Configuration for CloudPersistenceService
17
+ */
18
+ export interface CloudPersistenceConfig {
19
+ /** Workspace ID for scoping sessions */
20
+ workspaceId: string;
21
+ /** Optional callback when summary is persisted */
22
+ onSummaryPersisted?: (agentName: string, summaryId: string) => void;
23
+ /** Optional callback when session ends */
24
+ onSessionEnded?: (agentName: string, sessionId: string) => void;
25
+ }
26
+ /**
27
+ * CloudPersistenceService manages durable storage for agent sessions.
28
+ *
29
+ * Usage:
30
+ * ```typescript
31
+ * const persistence = new CloudPersistenceService({
32
+ * workspaceId: 'workspace-123',
33
+ * });
34
+ *
35
+ * // Bind to a PtyWrapper instance
36
+ * const pty = new PtyWrapper(config);
37
+ * const sessionId = await persistence.bindToPtyWrapper(pty);
38
+ *
39
+ * // When done, unbind to clean up listeners
40
+ * persistence.unbindFromPtyWrapper(pty);
41
+ * ```
42
+ */
43
+ export declare class CloudPersistenceService {
44
+ private config;
45
+ private boundWrappers;
46
+ constructor(config: CloudPersistenceConfig);
47
+ /**
48
+ * Bind to a PtyWrapper instance and start persisting its events.
49
+ * Creates a new agent session record and returns the session ID.
50
+ *
51
+ * @param wrapper The PtyWrapper to bind to
52
+ * @returns The session ID for this agent session
53
+ */
54
+ bindToPtyWrapper(wrapper: PtyWrapper): Promise<string>;
55
+ /**
56
+ * Unbind from a PtyWrapper and clean up event listeners.
57
+ *
58
+ * @param wrapper The PtyWrapper to unbind from
59
+ */
60
+ unbindFromPtyWrapper(wrapper: PtyWrapper): void;
61
+ /**
62
+ * Handle a summary event - persist to agent_summaries table.
63
+ */
64
+ private handleSummary;
65
+ /**
66
+ * Handle a session-end event - update agent_sessions with end marker.
67
+ */
68
+ private handleSessionEnd;
69
+ /**
70
+ * Get the session ID for a bound wrapper.
71
+ */
72
+ getSessionId(wrapper: PtyWrapper): string | undefined;
73
+ /**
74
+ * Get all summaries for a session.
75
+ */
76
+ getSessionSummaries(sessionId: string): Promise<{
77
+ id: string;
78
+ sessionId: string;
79
+ agentName: string;
80
+ summary: {
81
+ currentTask?: string;
82
+ completedTasks?: string[];
83
+ decisions?: string[];
84
+ context?: string;
85
+ files?: string[];
86
+ };
87
+ createdAt: Date;
88
+ }[]>;
89
+ /**
90
+ * Get the latest summary for an agent in THIS workspace.
91
+ * Joins through agent_sessions to ensure workspace scoping.
92
+ */
93
+ getLatestSummary(agentName: string): Promise<{
94
+ id: string;
95
+ sessionId: string;
96
+ agentName: string;
97
+ summary: {
98
+ currentTask?: string;
99
+ completedTasks?: string[];
100
+ decisions?: string[];
101
+ context?: string;
102
+ files?: string[];
103
+ };
104
+ createdAt: Date;
105
+ }>;
106
+ /**
107
+ * Get active sessions for a workspace.
108
+ */
109
+ getActiveSessions(): Promise<{
110
+ id: string;
111
+ workspaceId: string;
112
+ agentName: string;
113
+ status: string;
114
+ startedAt: Date;
115
+ endedAt: Date | null;
116
+ endMarker: {
117
+ summary?: string;
118
+ completedTasks?: string[];
119
+ } | null;
120
+ metadata: unknown;
121
+ }[]>;
122
+ /**
123
+ * Clean up all bindings.
124
+ */
125
+ destroy(): void;
126
+ }
127
+ /**
128
+ * Factory function to create a persistence service for a workspace.
129
+ */
130
+ export declare function createPersistenceService(workspaceId: string): CloudPersistenceService;
131
+ //# sourceMappingURL=persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../../src/cloud/services/persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAiC,MAAM,8BAA8B,CAAC;AAI9F;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACpE,0CAA0C;IAC1C,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACjE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,aAAa,CAIhB;gBAEO,MAAM,EAAE,sBAAsB;IAI1C;;;;;;OAMG;IACG,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IA0C5D;;;;OAIG;IACH,oBAAoB,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAW/C;;OAEG;YACW,aAAa;IAyB3B;;OAEG;YACW,gBAAgB;IAoB9B;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS;IAIrD;;OAEG;IACG,mBAAmB,CAAC,SAAS,EAAE,MAAM;;;;;;;;;;;;;IAQ3C;;;OAGG;IACG,gBAAgB,CAAC,SAAS,EAAE,MAAM;;;;;;;;;;;;;IAqBxC;;OAEG;IACG,iBAAiB;;;;;;;;;;;;;IAUvB;;OAEG;IACH,OAAO,IAAI,IAAI;CAKhB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,uBAAuB,CAErF"}
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Cloud Persistence Service
3
+ *
4
+ * Handles durable persistence of agent session data for cloud deployments.
5
+ * Subscribes to PtyWrapper events ('summary', 'session-end') and persists
6
+ * to PostgreSQL via Drizzle ORM.
7
+ *
8
+ * This decouples PtyWrapper from storage concerns - the wrapper emits events,
9
+ * this service handles persistence. Different storage backends can be swapped
10
+ * by implementing alternative persistence services.
11
+ *
12
+ * @see PtyWrapperEvents in src/wrapper/pty-wrapper.ts for event definitions
13
+ */
14
+ import { eq, and, desc } from 'drizzle-orm';
15
+ import { getDb } from '../db/drizzle.js';
16
+ import { agentSessions, agentSummaries } from '../db/schema.js';
17
+ /**
18
+ * CloudPersistenceService manages durable storage for agent sessions.
19
+ *
20
+ * Usage:
21
+ * ```typescript
22
+ * const persistence = new CloudPersistenceService({
23
+ * workspaceId: 'workspace-123',
24
+ * });
25
+ *
26
+ * // Bind to a PtyWrapper instance
27
+ * const pty = new PtyWrapper(config);
28
+ * const sessionId = await persistence.bindToPtyWrapper(pty);
29
+ *
30
+ * // When done, unbind to clean up listeners
31
+ * persistence.unbindFromPtyWrapper(pty);
32
+ * ```
33
+ */
34
+ export class CloudPersistenceService {
35
+ config;
36
+ boundWrappers = new Map();
37
+ constructor(config) {
38
+ this.config = config;
39
+ }
40
+ /**
41
+ * Bind to a PtyWrapper instance and start persisting its events.
42
+ * Creates a new agent session record and returns the session ID.
43
+ *
44
+ * @param wrapper The PtyWrapper to bind to
45
+ * @returns The session ID for this agent session
46
+ */
47
+ async bindToPtyWrapper(wrapper) {
48
+ const db = getDb();
49
+ const agentName = wrapper.name;
50
+ // Create session record
51
+ const result = await db.insert(agentSessions).values({
52
+ workspaceId: this.config.workspaceId,
53
+ agentName,
54
+ status: 'active',
55
+ startedAt: new Date(),
56
+ }).returning();
57
+ const session = result[0];
58
+ if (!session) {
59
+ throw new Error(`Failed to create session for agent ${agentName}`);
60
+ }
61
+ const sessionId = session.id;
62
+ // Create event handlers
63
+ const summaryHandler = async (event) => {
64
+ await this.handleSummary(sessionId, event);
65
+ };
66
+ const sessionEndHandler = async (event) => {
67
+ await this.handleSessionEnd(sessionId, event);
68
+ };
69
+ // Bind handlers
70
+ wrapper.on('summary', summaryHandler);
71
+ wrapper.on('session-end', sessionEndHandler);
72
+ // Track binding for cleanup
73
+ this.boundWrappers.set(wrapper, {
74
+ sessionId,
75
+ summaryHandler,
76
+ sessionEndHandler,
77
+ });
78
+ console.log(`[persistence] Bound to ${agentName}, session=${sessionId}`);
79
+ return sessionId;
80
+ }
81
+ /**
82
+ * Unbind from a PtyWrapper and clean up event listeners.
83
+ *
84
+ * @param wrapper The PtyWrapper to unbind from
85
+ */
86
+ unbindFromPtyWrapper(wrapper) {
87
+ const binding = this.boundWrappers.get(wrapper);
88
+ if (!binding)
89
+ return;
90
+ wrapper.off('summary', binding.summaryHandler);
91
+ wrapper.off('session-end', binding.sessionEndHandler);
92
+ this.boundWrappers.delete(wrapper);
93
+ console.log(`[persistence] Unbound from ${wrapper.name}`);
94
+ }
95
+ /**
96
+ * Handle a summary event - persist to agent_summaries table.
97
+ */
98
+ async handleSummary(sessionId, event) {
99
+ try {
100
+ const db = getDb();
101
+ const result = await db.insert(agentSummaries).values({
102
+ sessionId,
103
+ agentName: event.agentName,
104
+ summary: event.summary,
105
+ createdAt: new Date(),
106
+ }).returning();
107
+ const summaryRecord = result[0];
108
+ if (!summaryRecord) {
109
+ console.error(`[persistence] Insert returned no record for ${event.agentName}`);
110
+ return;
111
+ }
112
+ console.log(`[persistence] Saved summary for ${event.agentName}: ${event.summary.currentTask || 'no task'}`);
113
+ this.config.onSummaryPersisted?.(event.agentName, summaryRecord.id);
114
+ }
115
+ catch (err) {
116
+ console.error(`[persistence] Failed to save summary for ${event.agentName}:`, err);
117
+ }
118
+ }
119
+ /**
120
+ * Handle a session-end event - update agent_sessions with end marker.
121
+ */
122
+ async handleSessionEnd(sessionId, event) {
123
+ try {
124
+ const db = getDb();
125
+ await db.update(agentSessions)
126
+ .set({
127
+ status: 'ended',
128
+ endedAt: new Date(),
129
+ endMarker: event.marker,
130
+ })
131
+ .where(eq(agentSessions.id, sessionId));
132
+ console.log(`[persistence] Session ended for ${event.agentName}: ${event.marker.summary || 'no summary'}`);
133
+ this.config.onSessionEnded?.(event.agentName, sessionId);
134
+ }
135
+ catch (err) {
136
+ console.error(`[persistence] Failed to end session for ${event.agentName}:`, err);
137
+ }
138
+ }
139
+ /**
140
+ * Get the session ID for a bound wrapper.
141
+ */
142
+ getSessionId(wrapper) {
143
+ return this.boundWrappers.get(wrapper)?.sessionId;
144
+ }
145
+ /**
146
+ * Get all summaries for a session.
147
+ */
148
+ async getSessionSummaries(sessionId) {
149
+ const db = getDb();
150
+ return db.select()
151
+ .from(agentSummaries)
152
+ .where(eq(agentSummaries.sessionId, sessionId))
153
+ .orderBy(agentSummaries.createdAt);
154
+ }
155
+ /**
156
+ * Get the latest summary for an agent in THIS workspace.
157
+ * Joins through agent_sessions to ensure workspace scoping.
158
+ */
159
+ async getLatestSummary(agentName) {
160
+ const db = getDb();
161
+ // Join with sessions to ensure we only get summaries from this workspace
162
+ const results = await db.select({
163
+ id: agentSummaries.id,
164
+ sessionId: agentSummaries.sessionId,
165
+ agentName: agentSummaries.agentName,
166
+ summary: agentSummaries.summary,
167
+ createdAt: agentSummaries.createdAt,
168
+ })
169
+ .from(agentSummaries)
170
+ .innerJoin(agentSessions, eq(agentSummaries.sessionId, agentSessions.id))
171
+ .where(and(eq(agentSummaries.agentName, agentName), eq(agentSessions.workspaceId, this.config.workspaceId)))
172
+ .orderBy(desc(agentSummaries.createdAt))
173
+ .limit(1);
174
+ return results[0] || null;
175
+ }
176
+ /**
177
+ * Get active sessions for a workspace.
178
+ */
179
+ async getActiveSessions() {
180
+ const db = getDb();
181
+ return db.select()
182
+ .from(agentSessions)
183
+ .where(and(eq(agentSessions.workspaceId, this.config.workspaceId), eq(agentSessions.status, 'active')));
184
+ }
185
+ /**
186
+ * Clean up all bindings.
187
+ */
188
+ destroy() {
189
+ for (const wrapper of this.boundWrappers.keys()) {
190
+ this.unbindFromPtyWrapper(wrapper);
191
+ }
192
+ }
193
+ }
194
+ /**
195
+ * Factory function to create a persistence service for a workspace.
196
+ */
197
+ export function createPersistenceService(workspaceId) {
198
+ return new CloudPersistenceService({ workspaceId });
199
+ }
200
+ //# sourceMappingURL=persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../../src/cloud/services/persistence.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,8 @@ export interface PlanLimits {
14
14
  maxConcurrentAgents: number;
15
15
  maxComputeHoursPerMonth: number;
16
16
  coordinatorsEnabled: boolean;
17
+ /** Cloud session persistence (summaries, session tracking) - Pro+ only */
18
+ sessionPersistence: boolean;
17
19
  }
18
20
  /**
19
21
  * Plan limits configuration
@@ -76,6 +78,19 @@ export declare function canUseCoordinator(userId: string): Promise<{
76
78
  reason?: string;
77
79
  requiredPlan?: string;
78
80
  }>;
81
+ /**
82
+ * Check if user can use cloud session persistence
83
+ *
84
+ * Session persistence enables:
85
+ * - [[SUMMARY]] blocks saved to cloud database
86
+ * - [[SESSION_END]] markers for session tracking
87
+ * - Session recovery and handoff between agents
88
+ */
89
+ export declare function canUseSessionPersistence(userId: string): Promise<{
90
+ allowed: boolean;
91
+ reason?: string;
92
+ requiredPlan?: string;
93
+ }>;
79
94
  /**
80
95
  * Check if user has compute hours available
81
96
  */
@@ -1 +1 @@
1
- {"version":3,"file":"planLimits.d.ts","sourceRoot":"","sources":["../../../src/cloud/services/planLimits.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"planLimits.d.ts","sourceRoot":"","sources":["../../../src/cloud/services/planLimits.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,7 @@ export const PLAN_LIMITS = {
22
22
  maxConcurrentAgents: 2,
23
23
  maxComputeHoursPerMonth: 10,
24
24
  coordinatorsEnabled: false,
25
+ sessionPersistence: false,
25
26
  },
26
27
  pro: {
27
28
  maxWorkspaces: 5,
@@ -29,6 +30,7 @@ export const PLAN_LIMITS = {
29
30
  maxConcurrentAgents: 10,
30
31
  maxComputeHoursPerMonth: 100,
31
32
  coordinatorsEnabled: true,
33
+ sessionPersistence: true,
32
34
  },
33
35
  team: {
34
36
  maxWorkspaces: 20,
@@ -36,6 +38,7 @@ export const PLAN_LIMITS = {
36
38
  maxConcurrentAgents: 50,
37
39
  maxComputeHoursPerMonth: 500,
38
40
  coordinatorsEnabled: true,
41
+ sessionPersistence: true,
39
42
  },
40
43
  enterprise: {
41
44
  maxWorkspaces: Infinity,
@@ -43,6 +46,7 @@ export const PLAN_LIMITS = {
43
46
  maxConcurrentAgents: Infinity,
44
47
  maxComputeHoursPerMonth: Infinity,
45
48
  coordinatorsEnabled: true,
49
+ sessionPersistence: true,
46
50
  },
47
51
  };
48
52
  /**
@@ -179,6 +183,30 @@ export async function canUseCoordinator(userId) {
179
183
  }
180
184
  return { allowed: true };
181
185
  }
186
+ /**
187
+ * Check if user can use cloud session persistence
188
+ *
189
+ * Session persistence enables:
190
+ * - [[SUMMARY]] blocks saved to cloud database
191
+ * - [[SESSION_END]] markers for session tracking
192
+ * - Session recovery and handoff between agents
193
+ */
194
+ export async function canUseSessionPersistence(userId) {
195
+ const user = await db.users.findById(userId);
196
+ if (!user) {
197
+ return { allowed: false, reason: 'User not found' };
198
+ }
199
+ const plan = user.plan || 'free';
200
+ const limits = getPlanLimits(plan);
201
+ if (!limits.sessionPersistence) {
202
+ return {
203
+ allowed: false,
204
+ reason: 'Cloud session persistence requires a Pro plan or higher',
205
+ requiredPlan: 'pro',
206
+ };
207
+ }
208
+ return { allowed: true };
209
+ }
182
210
  /**
183
211
  * Check if user has compute hours available
184
212
  */