@agent-relay/cloud 0.1.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 (269) hide show
  1. package/dist/api/admin.d.ts +8 -0
  2. package/dist/api/admin.d.ts.map +1 -0
  3. package/dist/api/admin.js +225 -0
  4. package/dist/api/admin.js.map +1 -0
  5. package/dist/api/auth.d.ts +20 -0
  6. package/dist/api/auth.d.ts.map +1 -0
  7. package/dist/api/auth.js +136 -0
  8. package/dist/api/auth.js.map +1 -0
  9. package/dist/api/billing.d.ts +7 -0
  10. package/dist/api/billing.d.ts.map +1 -0
  11. package/dist/api/billing.js +564 -0
  12. package/dist/api/billing.js.map +1 -0
  13. package/dist/api/cli-pty-runner.d.ts +53 -0
  14. package/dist/api/cli-pty-runner.d.ts.map +1 -0
  15. package/dist/api/cli-pty-runner.js +193 -0
  16. package/dist/api/cli-pty-runner.js.map +1 -0
  17. package/dist/api/codex-auth-helper.d.ts +21 -0
  18. package/dist/api/codex-auth-helper.d.ts.map +1 -0
  19. package/dist/api/codex-auth-helper.js +327 -0
  20. package/dist/api/codex-auth-helper.js.map +1 -0
  21. package/dist/api/consensus.d.ts +13 -0
  22. package/dist/api/consensus.d.ts.map +1 -0
  23. package/dist/api/consensus.js +261 -0
  24. package/dist/api/consensus.js.map +1 -0
  25. package/dist/api/coordinators.d.ts +8 -0
  26. package/dist/api/coordinators.d.ts.map +1 -0
  27. package/dist/api/coordinators.js +750 -0
  28. package/dist/api/coordinators.js.map +1 -0
  29. package/dist/api/daemons.d.ts +12 -0
  30. package/dist/api/daemons.d.ts.map +1 -0
  31. package/dist/api/daemons.js +535 -0
  32. package/dist/api/daemons.js.map +1 -0
  33. package/dist/api/generic-webhooks.d.ts +8 -0
  34. package/dist/api/generic-webhooks.d.ts.map +1 -0
  35. package/dist/api/generic-webhooks.js +129 -0
  36. package/dist/api/generic-webhooks.js.map +1 -0
  37. package/dist/api/git.d.ts +8 -0
  38. package/dist/api/git.d.ts.map +1 -0
  39. package/dist/api/git.js +269 -0
  40. package/dist/api/git.js.map +1 -0
  41. package/dist/api/github-app.d.ts +11 -0
  42. package/dist/api/github-app.d.ts.map +1 -0
  43. package/dist/api/github-app.js +223 -0
  44. package/dist/api/github-app.js.map +1 -0
  45. package/dist/api/middleware/planLimits.d.ts +43 -0
  46. package/dist/api/middleware/planLimits.d.ts.map +1 -0
  47. package/dist/api/middleware/planLimits.js +202 -0
  48. package/dist/api/middleware/planLimits.js.map +1 -0
  49. package/dist/api/monitoring.d.ts +11 -0
  50. package/dist/api/monitoring.d.ts.map +1 -0
  51. package/dist/api/monitoring.js +578 -0
  52. package/dist/api/monitoring.js.map +1 -0
  53. package/dist/api/nango-auth.d.ts +9 -0
  54. package/dist/api/nango-auth.d.ts.map +1 -0
  55. package/dist/api/nango-auth.js +674 -0
  56. package/dist/api/nango-auth.js.map +1 -0
  57. package/dist/api/onboarding.d.ts +15 -0
  58. package/dist/api/onboarding.d.ts.map +1 -0
  59. package/dist/api/onboarding.js +679 -0
  60. package/dist/api/onboarding.js.map +1 -0
  61. package/dist/api/policy.d.ts +8 -0
  62. package/dist/api/policy.d.ts.map +1 -0
  63. package/dist/api/policy.js +229 -0
  64. package/dist/api/policy.js.map +1 -0
  65. package/dist/api/provider-env.d.ts +14 -0
  66. package/dist/api/provider-env.d.ts.map +1 -0
  67. package/dist/api/provider-env.js +75 -0
  68. package/dist/api/provider-env.js.map +1 -0
  69. package/dist/api/providers.d.ts +7 -0
  70. package/dist/api/providers.d.ts.map +1 -0
  71. package/dist/api/providers.js +564 -0
  72. package/dist/api/providers.js.map +1 -0
  73. package/dist/api/repos.d.ts +8 -0
  74. package/dist/api/repos.d.ts.map +1 -0
  75. package/dist/api/repos.js +577 -0
  76. package/dist/api/repos.js.map +1 -0
  77. package/dist/api/sessions.d.ts +11 -0
  78. package/dist/api/sessions.d.ts.map +1 -0
  79. package/dist/api/sessions.js +302 -0
  80. package/dist/api/sessions.js.map +1 -0
  81. package/dist/api/teams.d.ts +7 -0
  82. package/dist/api/teams.d.ts.map +1 -0
  83. package/dist/api/teams.js +281 -0
  84. package/dist/api/teams.js.map +1 -0
  85. package/dist/api/test-helpers.d.ts +10 -0
  86. package/dist/api/test-helpers.d.ts.map +1 -0
  87. package/dist/api/test-helpers.js +745 -0
  88. package/dist/api/test-helpers.js.map +1 -0
  89. package/dist/api/usage.d.ts +7 -0
  90. package/dist/api/usage.d.ts.map +1 -0
  91. package/dist/api/usage.js +111 -0
  92. package/dist/api/usage.js.map +1 -0
  93. package/dist/api/webhooks.d.ts +8 -0
  94. package/dist/api/webhooks.d.ts.map +1 -0
  95. package/dist/api/webhooks.js +645 -0
  96. package/dist/api/webhooks.js.map +1 -0
  97. package/dist/api/workspaces.d.ts +25 -0
  98. package/dist/api/workspaces.d.ts.map +1 -0
  99. package/dist/api/workspaces.js +1799 -0
  100. package/dist/api/workspaces.js.map +1 -0
  101. package/dist/billing/index.d.ts +9 -0
  102. package/dist/billing/index.d.ts.map +1 -0
  103. package/dist/billing/index.js +9 -0
  104. package/dist/billing/index.js.map +1 -0
  105. package/dist/billing/plans.d.ts +39 -0
  106. package/dist/billing/plans.d.ts.map +1 -0
  107. package/dist/billing/plans.js +245 -0
  108. package/dist/billing/plans.js.map +1 -0
  109. package/dist/billing/service.d.ts +80 -0
  110. package/dist/billing/service.d.ts.map +1 -0
  111. package/dist/billing/service.js +388 -0
  112. package/dist/billing/service.js.map +1 -0
  113. package/dist/billing/types.d.ts +141 -0
  114. package/dist/billing/types.d.ts.map +1 -0
  115. package/dist/billing/types.js +7 -0
  116. package/dist/billing/types.js.map +1 -0
  117. package/dist/config.d.ts +5 -0
  118. package/dist/config.d.ts.map +1 -0
  119. package/dist/config.js +5 -0
  120. package/dist/config.js.map +1 -0
  121. package/dist/db/bulk-ingest.d.ts +89 -0
  122. package/dist/db/bulk-ingest.d.ts.map +1 -0
  123. package/dist/db/bulk-ingest.js +268 -0
  124. package/dist/db/bulk-ingest.js.map +1 -0
  125. package/dist/db/drizzle.d.ts +256 -0
  126. package/dist/db/drizzle.d.ts.map +1 -0
  127. package/dist/db/drizzle.js +1286 -0
  128. package/dist/db/drizzle.js.map +1 -0
  129. package/dist/db/index.d.ts +55 -0
  130. package/dist/db/index.d.ts.map +1 -0
  131. package/dist/db/index.js +68 -0
  132. package/dist/db/index.js.map +1 -0
  133. package/dist/db/schema.d.ts +4873 -0
  134. package/dist/db/schema.d.ts.map +1 -0
  135. package/dist/db/schema.js +620 -0
  136. package/dist/db/schema.js.map +1 -0
  137. package/dist/index.d.ts +11 -0
  138. package/dist/index.d.ts.map +1 -0
  139. package/dist/index.js +38 -0
  140. package/dist/index.js.map +1 -0
  141. package/dist/provisioner/index.d.ts +207 -0
  142. package/dist/provisioner/index.d.ts.map +1 -0
  143. package/dist/provisioner/index.js +2114 -0
  144. package/dist/provisioner/index.js.map +1 -0
  145. package/dist/server.d.ts +17 -0
  146. package/dist/server.d.ts.map +1 -0
  147. package/dist/server.js +1924 -0
  148. package/dist/server.js.map +1 -0
  149. package/dist/services/auto-scaler.d.ts +152 -0
  150. package/dist/services/auto-scaler.d.ts.map +1 -0
  151. package/dist/services/auto-scaler.js +439 -0
  152. package/dist/services/auto-scaler.js.map +1 -0
  153. package/dist/services/capacity-manager.d.ts +148 -0
  154. package/dist/services/capacity-manager.d.ts.map +1 -0
  155. package/dist/services/capacity-manager.js +449 -0
  156. package/dist/services/capacity-manager.js.map +1 -0
  157. package/dist/services/ci-agent-spawner.d.ts +49 -0
  158. package/dist/services/ci-agent-spawner.d.ts.map +1 -0
  159. package/dist/services/ci-agent-spawner.js +373 -0
  160. package/dist/services/ci-agent-spawner.js.map +1 -0
  161. package/dist/services/cloud-message-bus.d.ts +28 -0
  162. package/dist/services/cloud-message-bus.d.ts.map +1 -0
  163. package/dist/services/cloud-message-bus.js +19 -0
  164. package/dist/services/cloud-message-bus.js.map +1 -0
  165. package/dist/services/compute-enforcement.d.ts +57 -0
  166. package/dist/services/compute-enforcement.d.ts.map +1 -0
  167. package/dist/services/compute-enforcement.js +175 -0
  168. package/dist/services/compute-enforcement.js.map +1 -0
  169. package/dist/services/coordinator.d.ts +62 -0
  170. package/dist/services/coordinator.d.ts.map +1 -0
  171. package/dist/services/coordinator.js +389 -0
  172. package/dist/services/coordinator.js.map +1 -0
  173. package/dist/services/index.d.ts +17 -0
  174. package/dist/services/index.d.ts.map +1 -0
  175. package/dist/services/index.js +25 -0
  176. package/dist/services/index.js.map +1 -0
  177. package/dist/services/intro-expiration.d.ts +60 -0
  178. package/dist/services/intro-expiration.d.ts.map +1 -0
  179. package/dist/services/intro-expiration.js +252 -0
  180. package/dist/services/intro-expiration.js.map +1 -0
  181. package/dist/services/mention-handler.d.ts +65 -0
  182. package/dist/services/mention-handler.d.ts.map +1 -0
  183. package/dist/services/mention-handler.js +405 -0
  184. package/dist/services/mention-handler.js.map +1 -0
  185. package/dist/services/nango.d.ts +201 -0
  186. package/dist/services/nango.d.ts.map +1 -0
  187. package/dist/services/nango.js +392 -0
  188. package/dist/services/nango.js.map +1 -0
  189. package/dist/services/persistence.d.ts +131 -0
  190. package/dist/services/persistence.d.ts.map +1 -0
  191. package/dist/services/persistence.js +200 -0
  192. package/dist/services/persistence.js.map +1 -0
  193. package/dist/services/planLimits.d.ts +147 -0
  194. package/dist/services/planLimits.d.ts.map +1 -0
  195. package/dist/services/planLimits.js +335 -0
  196. package/dist/services/planLimits.js.map +1 -0
  197. package/dist/services/presence-registry.d.ts +56 -0
  198. package/dist/services/presence-registry.d.ts.map +1 -0
  199. package/dist/services/presence-registry.js +91 -0
  200. package/dist/services/presence-registry.js.map +1 -0
  201. package/dist/services/scaling-orchestrator.d.ts +159 -0
  202. package/dist/services/scaling-orchestrator.d.ts.map +1 -0
  203. package/dist/services/scaling-orchestrator.js +502 -0
  204. package/dist/services/scaling-orchestrator.js.map +1 -0
  205. package/dist/services/scaling-policy.d.ts +121 -0
  206. package/dist/services/scaling-policy.d.ts.map +1 -0
  207. package/dist/services/scaling-policy.js +415 -0
  208. package/dist/services/scaling-policy.js.map +1 -0
  209. package/dist/services/ssh-security.d.ts +31 -0
  210. package/dist/services/ssh-security.d.ts.map +1 -0
  211. package/dist/services/ssh-security.js +63 -0
  212. package/dist/services/ssh-security.js.map +1 -0
  213. package/dist/services/workspace-keepalive.d.ts +76 -0
  214. package/dist/services/workspace-keepalive.d.ts.map +1 -0
  215. package/dist/services/workspace-keepalive.js +234 -0
  216. package/dist/services/workspace-keepalive.js.map +1 -0
  217. package/dist/shims/consensus.d.ts +23 -0
  218. package/dist/shims/consensus.d.ts.map +1 -0
  219. package/dist/shims/consensus.js +5 -0
  220. package/dist/shims/consensus.js.map +1 -0
  221. package/dist/webhooks/index.d.ts +24 -0
  222. package/dist/webhooks/index.d.ts.map +1 -0
  223. package/dist/webhooks/index.js +29 -0
  224. package/dist/webhooks/index.js.map +1 -0
  225. package/dist/webhooks/parsers/github.d.ts +8 -0
  226. package/dist/webhooks/parsers/github.d.ts.map +1 -0
  227. package/dist/webhooks/parsers/github.js +234 -0
  228. package/dist/webhooks/parsers/github.js.map +1 -0
  229. package/dist/webhooks/parsers/index.d.ts +23 -0
  230. package/dist/webhooks/parsers/index.d.ts.map +1 -0
  231. package/dist/webhooks/parsers/index.js +30 -0
  232. package/dist/webhooks/parsers/index.js.map +1 -0
  233. package/dist/webhooks/parsers/linear.d.ts +9 -0
  234. package/dist/webhooks/parsers/linear.d.ts.map +1 -0
  235. package/dist/webhooks/parsers/linear.js +258 -0
  236. package/dist/webhooks/parsers/linear.js.map +1 -0
  237. package/dist/webhooks/parsers/slack.d.ts +9 -0
  238. package/dist/webhooks/parsers/slack.d.ts.map +1 -0
  239. package/dist/webhooks/parsers/slack.js +214 -0
  240. package/dist/webhooks/parsers/slack.js.map +1 -0
  241. package/dist/webhooks/responders/github.d.ts +8 -0
  242. package/dist/webhooks/responders/github.d.ts.map +1 -0
  243. package/dist/webhooks/responders/github.js +73 -0
  244. package/dist/webhooks/responders/github.js.map +1 -0
  245. package/dist/webhooks/responders/index.d.ts +23 -0
  246. package/dist/webhooks/responders/index.d.ts.map +1 -0
  247. package/dist/webhooks/responders/index.js +30 -0
  248. package/dist/webhooks/responders/index.js.map +1 -0
  249. package/dist/webhooks/responders/linear.d.ts +9 -0
  250. package/dist/webhooks/responders/linear.d.ts.map +1 -0
  251. package/dist/webhooks/responders/linear.js +149 -0
  252. package/dist/webhooks/responders/linear.js.map +1 -0
  253. package/dist/webhooks/responders/slack.d.ts +20 -0
  254. package/dist/webhooks/responders/slack.d.ts.map +1 -0
  255. package/dist/webhooks/responders/slack.js +178 -0
  256. package/dist/webhooks/responders/slack.js.map +1 -0
  257. package/dist/webhooks/router.d.ts +25 -0
  258. package/dist/webhooks/router.d.ts.map +1 -0
  259. package/dist/webhooks/router.js +504 -0
  260. package/dist/webhooks/router.js.map +1 -0
  261. package/dist/webhooks/rules-engine.d.ts +24 -0
  262. package/dist/webhooks/rules-engine.d.ts.map +1 -0
  263. package/dist/webhooks/rules-engine.js +287 -0
  264. package/dist/webhooks/rules-engine.js.map +1 -0
  265. package/dist/webhooks/types.d.ts +186 -0
  266. package/dist/webhooks/types.d.ts.map +1 -0
  267. package/dist/webhooks/types.js +8 -0
  268. package/dist/webhooks/types.js.map +1 -0
  269. package/package.json +55 -0
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Cloud Services Index
3
+ *
4
+ * Exports all cloud-side services for easy importing.
5
+ */
6
+ export { ScalingPolicyService, type ScalingThresholds, type ScalingPolicy, type ScalingCondition, type ScalingAction, type ScalingDecision, type UserScalingContext, type WorkspaceMetrics, getScalingPolicyService, } from './scaling-policy.js';
7
+ export { AutoScaler, type AutoScalerConfig, type ScalingOperation, type MetricsSnapshot, getAutoScaler, createAutoScaler, } from './auto-scaler.js';
8
+ export { CapacityManager, type CapacityManagerConfig, type WorkspaceCapacity, type PlacementRecommendation, type CapacitySnapshot, type CapacityForecast, getCapacityManager, createCapacityManager, } from './capacity-manager.js';
9
+ export { ScalingOrchestrator, type OrchestratorConfig, type ScalingEvent, getScalingOrchestrator, createScalingOrchestrator, } from './scaling-orchestrator.js';
10
+ export { spawnCIFixAgent, notifyAgentOfCIFailure, completeFixAttempt, getFailureHistory, getPRFailureHistory, } from './ci-agent-spawner.js';
11
+ export { handleMention, handleIssueAssignment, getPendingMentions, getPendingIssueAssignments, processPendingMentions, processPendingIssueAssignments, KNOWN_AGENTS, isKnownAgent, } from './mention-handler.js';
12
+ export { ComputeEnforcementService, type ComputeEnforcementConfig, type EnforcementResult, getComputeEnforcementService, createComputeEnforcementService, } from './compute-enforcement.js';
13
+ export { IntroExpirationService, type IntroExpirationConfig, type IntroStatus, type ExpirationResult as IntroExpirationResult, INTRO_PERIOD_DAYS, DESTROY_GRACE_PERIOD_DAYS, getIntroStatus, getIntroExpirationService, startIntroExpirationService, stopIntroExpirationService, } from './intro-expiration.js';
14
+ export { WorkspaceKeepaliveService, type WorkspaceKeepaliveConfig, type KeepaliveStats, getWorkspaceKeepaliveService, createWorkspaceKeepaliveService, } from './workspace-keepalive.js';
15
+ export { registerUserPresence, unregisterUserPresence, updateUserLastSeen, isUserOnline, getOnlineUser, getOnlineUsers, getOnlineUsersForDiscovery, clearAllPresence, type PresenceUserInfo, } from './presence-registry.js';
16
+ export { cloudMessageBus, type CloudMessage, } from './cloud-message-bus.js';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,oBAAoB,EACpB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,UAAU,EACV,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,aAAa,EACb,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,mBAAmB,EACnB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,0BAA0B,EAC1B,sBAAsB,EACtB,8BAA8B,EAC9B,YAAY,EACZ,YAAY,GACb,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,yBAAyB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,4BAA4B,EAC5B,+BAA+B,GAChC,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,sBAAsB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EAChB,KAAK,gBAAgB,IAAI,qBAAqB,EAC9C,iBAAiB,EACjB,yBAAyB,EACzB,cAAc,EACd,yBAAyB,EACzB,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,yBAAyB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACnB,4BAA4B,EAC5B,+BAA+B,GAChC,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,cAAc,EACd,0BAA0B,EAC1B,gBAAgB,EAChB,KAAK,gBAAgB,GACtB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,eAAe,EACf,KAAK,YAAY,GAClB,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Cloud Services Index
3
+ *
4
+ * Exports all cloud-side services for easy importing.
5
+ */
6
+ // Scaling infrastructure
7
+ export { ScalingPolicyService, getScalingPolicyService, } from './scaling-policy.js';
8
+ export { AutoScaler, getAutoScaler, createAutoScaler, } from './auto-scaler.js';
9
+ export { CapacityManager, getCapacityManager, createCapacityManager, } from './capacity-manager.js';
10
+ export { ScalingOrchestrator, getScalingOrchestrator, createScalingOrchestrator, } from './scaling-orchestrator.js';
11
+ // CI failure handling
12
+ export { spawnCIFixAgent, notifyAgentOfCIFailure, completeFixAttempt, getFailureHistory, getPRFailureHistory, } from './ci-agent-spawner.js';
13
+ // Issue and mention handling
14
+ export { handleMention, handleIssueAssignment, getPendingMentions, getPendingIssueAssignments, processPendingMentions, processPendingIssueAssignments, KNOWN_AGENTS, isKnownAgent, } from './mention-handler.js';
15
+ // Compute enforcement (free tier limits)
16
+ export { ComputeEnforcementService, getComputeEnforcementService, createComputeEnforcementService, } from './compute-enforcement.js';
17
+ // Intro expiration (auto-resize/destroy after free tier intro period)
18
+ export { IntroExpirationService, INTRO_PERIOD_DAYS, DESTROY_GRACE_PERIOD_DAYS, getIntroStatus, getIntroExpirationService, startIntroExpirationService, stopIntroExpirationService, } from './intro-expiration.js';
19
+ // Workspace keepalive (prevent Fly.io from idling machines with active agents)
20
+ export { WorkspaceKeepaliveService, getWorkspaceKeepaliveService, createWorkspaceKeepaliveService, } from './workspace-keepalive.js';
21
+ // Presence registry (shared registry for tracking online users)
22
+ export { registerUserPresence, unregisterUserPresence, updateUserLastSeen, isUserOnline, getOnlineUser, getOnlineUsers, getOnlineUsersForDiscovery, clearAllPresence, } from './presence-registry.js';
23
+ // Cloud message bus (event-based message delivery for cloud users)
24
+ export { cloudMessageBus, } from './cloud-message-bus.js';
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,yBAAyB;AACzB,OAAO,EACL,oBAAoB,EAQpB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,UAAU,EAIV,aAAa,EACb,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,eAAe,EAMf,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,mBAAmB,EAGnB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AAEnC,sBAAsB;AACtB,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAE/B,6BAA6B;AAC7B,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,0BAA0B,EAC1B,sBAAsB,EACtB,8BAA8B,EAC9B,YAAY,EACZ,YAAY,GACb,MAAM,sBAAsB,CAAC;AAE9B,yCAAyC;AACzC,OAAO,EACL,yBAAyB,EAGzB,4BAA4B,EAC5B,+BAA+B,GAChC,MAAM,0BAA0B,CAAC;AAElC,sEAAsE;AACtE,OAAO,EACL,sBAAsB,EAItB,iBAAiB,EACjB,yBAAyB,EACzB,cAAc,EACd,yBAAyB,EACzB,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAE/B,+EAA+E;AAC/E,OAAO,EACL,yBAAyB,EAGzB,4BAA4B,EAC5B,+BAA+B,GAChC,MAAM,0BAA0B,CAAC;AAElC,gEAAgE;AAChE,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,cAAc,EACd,0BAA0B,EAC1B,gBAAgB,GAEjB,MAAM,wBAAwB,CAAC;AAEhC,mEAAmE;AACnE,OAAO,EACL,eAAe,GAEhB,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Intro Expiration Service
3
+ *
4
+ * Handles auto-resize and auto-destroy of free tier workspaces:
5
+ * 1. Resize: Free users get Pro-level resources (2 CPU / 4GB) for the first 14 days,
6
+ * then get automatically downsized to standard free tier (1 CPU / 2GB).
7
+ * 2. Destroy: Free workspaces inactive for 7+ days after intro expires get auto-destroyed
8
+ * to prevent ongoing infrastructure costs for churned users.
9
+ */
10
+ export declare const INTRO_PERIOD_DAYS = 14;
11
+ export declare const DESTROY_GRACE_PERIOD_DAYS = 7;
12
+ export interface IntroExpirationConfig {
13
+ enabled: boolean;
14
+ checkIntervalMs: number;
15
+ }
16
+ export interface IntroStatus {
17
+ isIntroPeriod: boolean;
18
+ daysRemaining: number;
19
+ introPeriodDays: number;
20
+ expiresAt: Date | null;
21
+ }
22
+ export interface ExpirationResult {
23
+ userId: string;
24
+ workspaceId: string;
25
+ workspaceName: string;
26
+ action: 'resized' | 'destroyed' | 'skipped' | 'error';
27
+ reason?: string;
28
+ }
29
+ /**
30
+ * Get intro period status for a user
31
+ */
32
+ export declare function getIntroStatus(userCreatedAt: Date | string | null, plan: string): IntroStatus;
33
+ export declare class IntroExpirationService {
34
+ private config;
35
+ private checkTimer;
36
+ private isRunning;
37
+ constructor(config?: Partial<IntroExpirationConfig>);
38
+ /**
39
+ * Start the expiration service
40
+ */
41
+ start(): void;
42
+ /**
43
+ * Stop the expiration service
44
+ */
45
+ stop(): void;
46
+ /**
47
+ * Run expiration check for all free tier users with expired intro periods
48
+ */
49
+ runExpirationCheck(): Promise<ExpirationResult[]>;
50
+ /**
51
+ * Check and process workspaces for a user whose intro period has expired
52
+ * - Resize workspaces that are still at intro-tier resources
53
+ * - Destroy workspaces that have been inactive for DESTROY_GRACE_PERIOD_DAYS
54
+ */
55
+ private checkAndProcessUserWorkspaces;
56
+ }
57
+ export declare function getIntroExpirationService(): IntroExpirationService;
58
+ export declare function startIntroExpirationService(): void;
59
+ export declare function stopIntroExpirationService(): void;
60
+ //# sourceMappingURL=intro-expiration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intro-expiration.d.ts","sourceRoot":"","sources":["../../src/services/intro-expiration.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;CACzB;AAOD,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,aAAa,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CA0B7F;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,SAAS,CAAkB;gBAEvB,MAAM,GAAE,OAAO,CAAC,qBAAqB,CAAM;IAIvD;;OAEG;IACH,KAAK,IAAI,IAAI;IA6Bb;;OAEG;IACH,IAAI,IAAI,IAAI;IASZ;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IA6CvD;;;;OAIG;YACW,6BAA6B;CAkH5C;AAKD,wBAAgB,yBAAyB,IAAI,sBAAsB,CAKlE;AAED,wBAAgB,2BAA2B,IAAI,IAAI,CAElD;AAED,wBAAgB,0BAA0B,IAAI,IAAI,CAIjD"}
@@ -0,0 +1,252 @@
1
+ /**
2
+ * Intro Expiration Service
3
+ *
4
+ * Handles auto-resize and auto-destroy of free tier workspaces:
5
+ * 1. Resize: Free users get Pro-level resources (2 CPU / 4GB) for the first 14 days,
6
+ * then get automatically downsized to standard free tier (1 CPU / 2GB).
7
+ * 2. Destroy: Free workspaces inactive for 7+ days after intro expires get auto-destroyed
8
+ * to prevent ongoing infrastructure costs for churned users.
9
+ */
10
+ import { db } from '../db/index.js';
11
+ import { getProvisioner } from '../provisioner/index.js';
12
+ export const INTRO_PERIOD_DAYS = 14;
13
+ export const DESTROY_GRACE_PERIOD_DAYS = 7; // Days of inactivity after intro before auto-destroy
14
+ const DEFAULT_CONFIG = {
15
+ enabled: true,
16
+ checkIntervalMs: 60 * 60 * 1000, // 1 hour
17
+ };
18
+ /**
19
+ * Get intro period status for a user
20
+ */
21
+ export function getIntroStatus(userCreatedAt, plan) {
22
+ const introPeriodDays = INTRO_PERIOD_DAYS;
23
+ // Only free tier users get intro bonus
24
+ if (plan !== 'free' || !userCreatedAt) {
25
+ return {
26
+ isIntroPeriod: false,
27
+ daysRemaining: 0,
28
+ introPeriodDays,
29
+ expiresAt: null,
30
+ };
31
+ }
32
+ const createdAt = typeof userCreatedAt === 'string' ? new Date(userCreatedAt) : userCreatedAt;
33
+ const daysSinceSignup = (Date.now() - createdAt.getTime()) / (1000 * 60 * 60 * 24);
34
+ const isIntroPeriod = daysSinceSignup < introPeriodDays;
35
+ const daysRemaining = Math.max(0, Math.ceil(introPeriodDays - daysSinceSignup));
36
+ const expiresAt = new Date(createdAt.getTime() + introPeriodDays * 24 * 60 * 60 * 1000);
37
+ return {
38
+ isIntroPeriod,
39
+ daysRemaining,
40
+ introPeriodDays,
41
+ expiresAt,
42
+ };
43
+ }
44
+ export class IntroExpirationService {
45
+ config;
46
+ checkTimer = null;
47
+ isRunning = false;
48
+ constructor(config = {}) {
49
+ this.config = { ...DEFAULT_CONFIG, ...config };
50
+ }
51
+ /**
52
+ * Start the expiration service
53
+ */
54
+ start() {
55
+ if (!this.config.enabled) {
56
+ console.log('[intro-expiration] Service disabled');
57
+ return;
58
+ }
59
+ if (this.isRunning) {
60
+ console.warn('[intro-expiration] Service already running');
61
+ return;
62
+ }
63
+ this.isRunning = true;
64
+ console.log(`[intro-expiration] Started (checking every ${this.config.checkIntervalMs / 1000 / 60} minutes)`);
65
+ // Run immediately on start
66
+ this.runExpirationCheck().catch((err) => {
67
+ console.error('[intro-expiration] Initial run failed:', err);
68
+ });
69
+ // Then run periodically
70
+ this.checkTimer = setInterval(() => {
71
+ this.runExpirationCheck().catch((err) => {
72
+ console.error('[intro-expiration] Periodic run failed:', err);
73
+ });
74
+ }, this.config.checkIntervalMs);
75
+ }
76
+ /**
77
+ * Stop the expiration service
78
+ */
79
+ stop() {
80
+ if (this.checkTimer) {
81
+ clearInterval(this.checkTimer);
82
+ this.checkTimer = null;
83
+ }
84
+ this.isRunning = false;
85
+ console.log('[intro-expiration] Stopped');
86
+ }
87
+ /**
88
+ * Run expiration check for all free tier users with expired intro periods
89
+ */
90
+ async runExpirationCheck() {
91
+ const results = [];
92
+ try {
93
+ // Get all users on free tier
94
+ const freeUsers = await db.users.findByPlan('free');
95
+ // Filter to users whose intro period has expired
96
+ const expiredUsers = freeUsers.filter((user) => {
97
+ const status = getIntroStatus(user.createdAt, user.plan || 'free');
98
+ return !status.isIntroPeriod && status.expiresAt !== null;
99
+ });
100
+ if (expiredUsers.length === 0) {
101
+ return results;
102
+ }
103
+ console.log(`[intro-expiration] Checking ${expiredUsers.length} users with expired intro periods`);
104
+ for (const user of expiredUsers) {
105
+ try {
106
+ const userResults = await this.checkAndProcessUserWorkspaces(user.id, user.createdAt);
107
+ results.push(...userResults);
108
+ }
109
+ catch (err) {
110
+ console.error(`[intro-expiration] Error checking user ${user.id}:`, err);
111
+ }
112
+ }
113
+ // Summary
114
+ const resized = results.filter((r) => r.action === 'resized').length;
115
+ const destroyed = results.filter((r) => r.action === 'destroyed').length;
116
+ const skipped = results.filter((r) => r.action === 'skipped').length;
117
+ const errors = results.filter((r) => r.action === 'error').length;
118
+ if (resized > 0 || destroyed > 0 || errors > 0) {
119
+ console.log(`[intro-expiration] Results: ${resized} resized, ${destroyed} destroyed, ${skipped} skipped, ${errors} errors`);
120
+ }
121
+ return results;
122
+ }
123
+ catch (err) {
124
+ console.error('[intro-expiration] Run failed:', err);
125
+ return results;
126
+ }
127
+ }
128
+ /**
129
+ * Check and process workspaces for a user whose intro period has expired
130
+ * - Resize workspaces that are still at intro-tier resources
131
+ * - Destroy workspaces that have been inactive for DESTROY_GRACE_PERIOD_DAYS
132
+ */
133
+ async checkAndProcessUserWorkspaces(userId, userCreatedAt) {
134
+ const results = [];
135
+ const provisioner = getProvisioner();
136
+ // Get user's workspaces
137
+ const workspaces = await db.workspaces.findByUserId(userId);
138
+ // Calculate when intro period expired for this user
139
+ const introExpiredAt = new Date(userCreatedAt.getTime() + INTRO_PERIOD_DAYS * 24 * 60 * 60 * 1000);
140
+ const destroyThreshold = new Date(introExpiredAt.getTime() + DESTROY_GRACE_PERIOD_DAYS * 24 * 60 * 60 * 1000);
141
+ const now = new Date();
142
+ for (const workspace of workspaces) {
143
+ try {
144
+ // Check if workspace has intro-sized resources
145
+ const config = workspace.config;
146
+ const resourceTier = config?.resourceTier;
147
+ // Check last activity via linked daemons
148
+ const daemons = await db.linkedDaemons.findByWorkspaceId(workspace.id);
149
+ const lastActivity = daemons.length > 0
150
+ ? daemons.reduce((latest, d) => {
151
+ const seen = d.lastSeenAt ? new Date(d.lastSeenAt) : new Date(0);
152
+ return seen > latest ? seen : latest;
153
+ }, new Date(0))
154
+ : workspace.updatedAt; // Fall back to workspace updatedAt
155
+ // Check if workspace should be destroyed (inactive for grace period after intro)
156
+ const daysSinceActivity = (now.getTime() - lastActivity.getTime()) / (1000 * 60 * 60 * 24);
157
+ const shouldDestroy = now > destroyThreshold && daysSinceActivity >= DESTROY_GRACE_PERIOD_DAYS;
158
+ if (shouldDestroy) {
159
+ console.log(`[intro-expiration] Destroying inactive free workspace ${workspace.name} (${daysSinceActivity.toFixed(1)} days inactive)`);
160
+ try {
161
+ await provisioner.deprovision(workspace.id);
162
+ results.push({
163
+ userId,
164
+ workspaceId: workspace.id,
165
+ workspaceName: workspace.name,
166
+ action: 'destroyed',
167
+ reason: `Inactive for ${Math.round(daysSinceActivity)} days after intro period expired`,
168
+ });
169
+ }
170
+ catch (deprovisionErr) {
171
+ console.error(`[intro-expiration] Failed to destroy workspace ${workspace.id}:`, deprovisionErr);
172
+ results.push({
173
+ userId,
174
+ workspaceId: workspace.id,
175
+ workspaceName: workspace.name,
176
+ action: 'error',
177
+ reason: `Failed to destroy: ${deprovisionErr instanceof Error ? deprovisionErr.message : 'Unknown error'}`,
178
+ });
179
+ }
180
+ continue;
181
+ }
182
+ // Skip resize if already at standard free tier
183
+ if (resourceTier === 'small') {
184
+ results.push({
185
+ userId,
186
+ workspaceId: workspace.id,
187
+ workspaceName: workspace.name,
188
+ action: 'skipped',
189
+ reason: 'Already at standard free tier size',
190
+ });
191
+ continue;
192
+ }
193
+ // Skip if workspace is not running (resize happens on next start)
194
+ if (workspace.status !== 'running') {
195
+ results.push({
196
+ userId,
197
+ workspaceId: workspace.id,
198
+ workspaceName: workspace.name,
199
+ action: 'skipped',
200
+ reason: `Workspace status is ${workspace.status}`,
201
+ });
202
+ continue;
203
+ }
204
+ // Resize to standard free tier (small: 2 CPU / 2GB)
205
+ // Use skipRestart=true to not disrupt running agents
206
+ console.log(`[intro-expiration] Resizing workspace ${workspace.name} to standard free tier`);
207
+ await provisioner.resize(workspace.id, {
208
+ name: 'small',
209
+ cpuCores: 2,
210
+ cpuKind: 'shared',
211
+ memoryMb: 2048,
212
+ maxAgents: 2,
213
+ }, true); // skipRestart = true for graceful resize
214
+ results.push({
215
+ userId,
216
+ workspaceId: workspace.id,
217
+ workspaceName: workspace.name,
218
+ action: 'resized',
219
+ reason: 'Intro period expired, downsized to standard free tier (applies on next restart)',
220
+ });
221
+ }
222
+ catch (err) {
223
+ console.error(`[intro-expiration] Failed to process workspace ${workspace.id}:`, err);
224
+ results.push({
225
+ userId,
226
+ workspaceId: workspace.id,
227
+ workspaceName: workspace.name,
228
+ action: 'error',
229
+ reason: err instanceof Error ? err.message : 'Unknown error',
230
+ });
231
+ }
232
+ }
233
+ return results;
234
+ }
235
+ }
236
+ // Singleton instance
237
+ let _service = null;
238
+ export function getIntroExpirationService() {
239
+ if (!_service) {
240
+ _service = new IntroExpirationService();
241
+ }
242
+ return _service;
243
+ }
244
+ export function startIntroExpirationService() {
245
+ getIntroExpirationService().start();
246
+ }
247
+ export function stopIntroExpirationService() {
248
+ if (_service) {
249
+ _service.stop();
250
+ }
251
+ }
252
+ //# sourceMappingURL=intro-expiration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intro-expiration.js","sourceRoot":"","sources":["../../src/services/intro-expiration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Mention Handler Service
3
+ *
4
+ * Handles @mentions of agents in GitHub issues and PR comments.
5
+ * Routes mentions to appropriate agents for response.
6
+ *
7
+ * Flow:
8
+ * 1. App posts acknowledgment comment
9
+ * 2. Finds a linked daemon for the repository
10
+ * 3. Queues spawn command for the daemon
11
+ * 4. Agent works and posts response comment
12
+ */
13
+ import { CommentMention, IssueAssignment } from '../db/index.js';
14
+ /**
15
+ * Known agent types that can be mentioned
16
+ */
17
+ export declare const KNOWN_AGENTS: {
18
+ readonly 'agent-relay': "General purpose agent for any task";
19
+ readonly lead: "Lead agent for coordination and delegation";
20
+ readonly developer: "Developer agent for coding tasks";
21
+ readonly reviewer: "Code review agent";
22
+ readonly 'ci-fix': "CI failure fixing agent";
23
+ readonly debugger: "Bug investigation and fixing agent";
24
+ readonly docs: "Documentation agent";
25
+ readonly test: "Test writing agent";
26
+ readonly refactor: "Code refactoring agent";
27
+ };
28
+ export type KnownAgentType = keyof typeof KNOWN_AGENTS;
29
+ /**
30
+ * Check if a mention is for a known agent type
31
+ */
32
+ export declare function isKnownAgent(mention: string): mention is KnownAgentType;
33
+ /**
34
+ * Handle a mention record
35
+ *
36
+ * This function:
37
+ * 1. Validates the mention is for a known agent
38
+ * 2. Posts an acknowledgment comment
39
+ * 3. Finds a linked daemon
40
+ * 4. Queues a spawn command for the agent
41
+ */
42
+ export declare function handleMention(mention: CommentMention): Promise<void>;
43
+ /**
44
+ * Handle an issue assignment
45
+ *
46
+ * Called when an issue should be assigned to an agent
47
+ */
48
+ export declare function handleIssueAssignment(assignment: IssueAssignment): Promise<void>;
49
+ /**
50
+ * Get pending mentions for processing
51
+ */
52
+ export declare function getPendingMentions(limit?: number): Promise<CommentMention[]>;
53
+ /**
54
+ * Get pending issue assignments for processing
55
+ */
56
+ export declare function getPendingIssueAssignments(limit?: number): Promise<IssueAssignment[]>;
57
+ /**
58
+ * Process all pending mentions (background job)
59
+ */
60
+ export declare function processPendingMentions(): Promise<number>;
61
+ /**
62
+ * Process all pending issue assignments (background job)
63
+ */
64
+ export declare function processPendingIssueAssignments(): Promise<number>;
65
+ //# sourceMappingURL=mention-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mention-handler.d.ts","sourceRoot":"","sources":["../../src/services/mention-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAM,cAAc,EAAE,eAAe,EAAc,MAAM,gBAAgB,CAAC;AAGjF;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;CAaf,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,YAAY,CAAC;AAEvD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,IAAI,cAAc,CAEvE;AA0GD;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA8E1E;AAyED;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,UAAU,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAyEtF;AA4DD;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,SAAK,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAE9E;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAAC,KAAK,SAAK,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAEvF;AAED;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC,CAc9D;AAED;;GAEG;AACH,wBAAsB,8BAA8B,IAAI,OAAO,CAAC,MAAM,CAAC,CActE"}