@overlordai/server 1.0.1

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 (345) hide show
  1. package/database/migrations/001-init-schema.sql +226 -0
  2. package/database/migrations/002-add-indexes.sql +17 -0
  3. package/database/migrations/003-add-settings-table.sql +4 -0
  4. package/database/migrations/004-add-developer-id-index.sql +5 -0
  5. package/dist/adapters/adapter.interface.d.ts +41 -0
  6. package/dist/adapters/adapter.interface.d.ts.map +1 -0
  7. package/dist/adapters/adapter.interface.js +6 -0
  8. package/dist/adapters/adapter.interface.js.map +1 -0
  9. package/dist/adapters/adapter.module.d.ts +3 -0
  10. package/dist/adapters/adapter.module.d.ts.map +1 -0
  11. package/dist/adapters/adapter.module.js +54 -0
  12. package/dist/adapters/adapter.module.js.map +1 -0
  13. package/dist/adapters/adapter.registry.d.ts +19 -0
  14. package/dist/adapters/adapter.registry.d.ts.map +1 -0
  15. package/dist/adapters/adapter.registry.js +51 -0
  16. package/dist/adapters/adapter.registry.js.map +1 -0
  17. package/dist/adapters/lark/lark-card.builder.d.ts +48 -0
  18. package/dist/adapters/lark/lark-card.builder.d.ts.map +1 -0
  19. package/dist/adapters/lark/lark-card.builder.js +259 -0
  20. package/dist/adapters/lark/lark-card.builder.js.map +1 -0
  21. package/dist/adapters/lark/lark-message.parser.d.ts +51 -0
  22. package/dist/adapters/lark/lark-message.parser.d.ts.map +1 -0
  23. package/dist/adapters/lark/lark-message.parser.js +189 -0
  24. package/dist/adapters/lark/lark-message.parser.js.map +1 -0
  25. package/dist/adapters/lark/lark-signature.d.ts +13 -0
  26. package/dist/adapters/lark/lark-signature.d.ts.map +1 -0
  27. package/dist/adapters/lark/lark-signature.js +58 -0
  28. package/dist/adapters/lark/lark-signature.js.map +1 -0
  29. package/dist/adapters/lark/lark.adapter.d.ts +65 -0
  30. package/dist/adapters/lark/lark.adapter.d.ts.map +1 -0
  31. package/dist/adapters/lark/lark.adapter.js +565 -0
  32. package/dist/adapters/lark/lark.adapter.js.map +1 -0
  33. package/dist/adapters/lark/lark.controller.d.ts +21 -0
  34. package/dist/adapters/lark/lark.controller.d.ts.map +1 -0
  35. package/dist/adapters/lark/lark.controller.js +120 -0
  36. package/dist/adapters/lark/lark.controller.js.map +1 -0
  37. package/dist/adapters/slack/slack.adapter.d.ts +19 -0
  38. package/dist/adapters/slack/slack.adapter.d.ts.map +1 -0
  39. package/dist/adapters/slack/slack.adapter.js +42 -0
  40. package/dist/adapters/slack/slack.adapter.js.map +1 -0
  41. package/dist/app.module.d.ts +5 -0
  42. package/dist/app.module.d.ts.map +1 -0
  43. package/dist/app.module.js +48 -0
  44. package/dist/app.module.js.map +1 -0
  45. package/dist/auth/auth.controller.d.ts +15 -0
  46. package/dist/auth/auth.controller.d.ts.map +1 -0
  47. package/dist/auth/auth.controller.js +67 -0
  48. package/dist/auth/auth.controller.js.map +1 -0
  49. package/dist/auth/auth.module.d.ts +3 -0
  50. package/dist/auth/auth.module.d.ts.map +1 -0
  51. package/dist/auth/auth.module.js +46 -0
  52. package/dist/auth/auth.module.js.map +1 -0
  53. package/dist/auth/auth.service.d.ts +62 -0
  54. package/dist/auth/auth.service.d.ts.map +1 -0
  55. package/dist/auth/auth.service.js +307 -0
  56. package/dist/auth/auth.service.js.map +1 -0
  57. package/dist/auth/decorators/allow-totp-setup.decorator.d.ts +3 -0
  58. package/dist/auth/decorators/allow-totp-setup.decorator.d.ts.map +1 -0
  59. package/dist/auth/decorators/allow-totp-setup.decorator.js +8 -0
  60. package/dist/auth/decorators/allow-totp-setup.decorator.js.map +1 -0
  61. package/dist/auth/decorators/project-roles.decorator.d.ts +4 -0
  62. package/dist/auth/decorators/project-roles.decorator.d.ts.map +1 -0
  63. package/dist/auth/decorators/project-roles.decorator.js +8 -0
  64. package/dist/auth/decorators/project-roles.decorator.js.map +1 -0
  65. package/dist/auth/decorators/roles.decorator.d.ts +4 -0
  66. package/dist/auth/decorators/roles.decorator.d.ts.map +1 -0
  67. package/dist/auth/decorators/roles.decorator.js +8 -0
  68. package/dist/auth/decorators/roles.decorator.js.map +1 -0
  69. package/dist/auth/extract-user.middleware.d.ts +21 -0
  70. package/dist/auth/extract-user.middleware.d.ts.map +1 -0
  71. package/dist/auth/extract-user.middleware.js +57 -0
  72. package/dist/auth/extract-user.middleware.js.map +1 -0
  73. package/dist/auth/guards/jwt-auth.guard.d.ts +14 -0
  74. package/dist/auth/guards/jwt-auth.guard.d.ts.map +1 -0
  75. package/dist/auth/guards/jwt-auth.guard.js +139 -0
  76. package/dist/auth/guards/jwt-auth.guard.js.map +1 -0
  77. package/dist/auth/guards/project-role.guard.d.ts +10 -0
  78. package/dist/auth/guards/project-role.guard.d.ts.map +1 -0
  79. package/dist/auth/guards/project-role.guard.js +72 -0
  80. package/dist/auth/guards/project-role.guard.js.map +1 -0
  81. package/dist/auth/guards/roles.guard.d.ts +8 -0
  82. package/dist/auth/guards/roles.guard.d.ts.map +1 -0
  83. package/dist/auth/guards/roles.guard.js +56 -0
  84. package/dist/auth/guards/roles.guard.js.map +1 -0
  85. package/dist/auth/jwt.strategy.d.ts +23 -0
  86. package/dist/auth/jwt.strategy.d.ts.map +1 -0
  87. package/dist/auth/jwt.strategy.js +49 -0
  88. package/dist/auth/jwt.strategy.js.map +1 -0
  89. package/dist/common/crypto.service.d.ts +31 -0
  90. package/dist/common/crypto.service.d.ts.map +1 -0
  91. package/dist/common/crypto.service.js +120 -0
  92. package/dist/common/crypto.service.js.map +1 -0
  93. package/dist/common/error-filter.d.ts +6 -0
  94. package/dist/common/error-filter.d.ts.map +1 -0
  95. package/dist/common/error-filter.js +78 -0
  96. package/dist/common/error-filter.js.map +1 -0
  97. package/dist/common/health.controller.d.ts +13 -0
  98. package/dist/common/health.controller.d.ts.map +1 -0
  99. package/dist/common/health.controller.js +75 -0
  100. package/dist/common/health.controller.js.map +1 -0
  101. package/dist/common/logger.service.d.ts +11 -0
  102. package/dist/common/logger.service.d.ts.map +1 -0
  103. package/dist/common/logger.service.js +48 -0
  104. package/dist/common/logger.service.js.map +1 -0
  105. package/dist/common/pagination.d.ts +18 -0
  106. package/dist/common/pagination.d.ts.map +1 -0
  107. package/dist/common/pagination.js +39 -0
  108. package/dist/common/pagination.js.map +1 -0
  109. package/dist/common/rate-limit.guard.d.ts +48 -0
  110. package/dist/common/rate-limit.guard.d.ts.map +1 -0
  111. package/dist/common/rate-limit.guard.js +129 -0
  112. package/dist/common/rate-limit.guard.js.map +1 -0
  113. package/dist/common/sensitive-filter.d.ts +7 -0
  114. package/dist/common/sensitive-filter.d.ts.map +1 -0
  115. package/dist/common/sensitive-filter.js +20 -0
  116. package/dist/common/sensitive-filter.js.map +1 -0
  117. package/dist/database/database.module.d.ts +3 -0
  118. package/dist/database/database.module.d.ts.map +1 -0
  119. package/dist/database/database.module.js +22 -0
  120. package/dist/database/database.module.js.map +1 -0
  121. package/dist/database/database.service.d.ts +13 -0
  122. package/dist/database/database.service.d.ts.map +1 -0
  123. package/dist/database/database.service.js +107 -0
  124. package/dist/database/database.service.js.map +1 -0
  125. package/dist/database/migration-runner.d.ts +5 -0
  126. package/dist/database/migration-runner.d.ts.map +1 -0
  127. package/dist/database/migration-runner.js +86 -0
  128. package/dist/database/migration-runner.js.map +1 -0
  129. package/dist/database/repositories/audit-log.repository.d.ts +29 -0
  130. package/dist/database/repositories/audit-log.repository.d.ts.map +1 -0
  131. package/dist/database/repositories/audit-log.repository.js +80 -0
  132. package/dist/database/repositories/audit-log.repository.js.map +1 -0
  133. package/dist/database/repositories/bot.repository.d.ts +67 -0
  134. package/dist/database/repositories/bot.repository.d.ts.map +1 -0
  135. package/dist/database/repositories/bot.repository.js +133 -0
  136. package/dist/database/repositories/bot.repository.js.map +1 -0
  137. package/dist/database/repositories/developer-token.repository.d.ts +40 -0
  138. package/dist/database/repositories/developer-token.repository.d.ts.map +1 -0
  139. package/dist/database/repositories/developer-token.repository.js +84 -0
  140. package/dist/database/repositories/developer-token.repository.js.map +1 -0
  141. package/dist/database/repositories/developer.repository.d.ts +25 -0
  142. package/dist/database/repositories/developer.repository.d.ts.map +1 -0
  143. package/dist/database/repositories/developer.repository.js +139 -0
  144. package/dist/database/repositories/developer.repository.js.map +1 -0
  145. package/dist/database/repositories/machine.repository.d.ts +39 -0
  146. package/dist/database/repositories/machine.repository.d.ts.map +1 -0
  147. package/dist/database/repositories/machine.repository.js +176 -0
  148. package/dist/database/repositories/machine.repository.js.map +1 -0
  149. package/dist/database/repositories/notification.repository.d.ts +19 -0
  150. package/dist/database/repositories/notification.repository.d.ts.map +1 -0
  151. package/dist/database/repositories/notification.repository.js +94 -0
  152. package/dist/database/repositories/notification.repository.js.map +1 -0
  153. package/dist/database/repositories/project-member.repository.d.ts +30 -0
  154. package/dist/database/repositories/project-member.repository.d.ts.map +1 -0
  155. package/dist/database/repositories/project-member.repository.js +75 -0
  156. package/dist/database/repositories/project-member.repository.js.map +1 -0
  157. package/dist/database/repositories/project.repository.d.ts +24 -0
  158. package/dist/database/repositories/project.repository.d.ts.map +1 -0
  159. package/dist/database/repositories/project.repository.js +154 -0
  160. package/dist/database/repositories/project.repository.js.map +1 -0
  161. package/dist/database/repositories/session.repository.d.ts +19 -0
  162. package/dist/database/repositories/session.repository.d.ts.map +1 -0
  163. package/dist/database/repositories/session.repository.js +117 -0
  164. package/dist/database/repositories/session.repository.js.map +1 -0
  165. package/dist/database/repositories/task.repository.d.ts +37 -0
  166. package/dist/database/repositories/task.repository.d.ts.map +1 -0
  167. package/dist/database/repositories/task.repository.js +229 -0
  168. package/dist/database/repositories/task.repository.js.map +1 -0
  169. package/dist/database/repositories/worker-token.repository.d.ts +20 -0
  170. package/dist/database/repositories/worker-token.repository.d.ts.map +1 -0
  171. package/dist/database/repositories/worker-token.repository.js +94 -0
  172. package/dist/database/repositories/worker-token.repository.js.map +1 -0
  173. package/dist/database/repositories/workspace.repository.d.ts +19 -0
  174. package/dist/database/repositories/workspace.repository.d.ts.map +1 -0
  175. package/dist/database/repositories/workspace.repository.js +82 -0
  176. package/dist/database/repositories/workspace.repository.js.map +1 -0
  177. package/dist/dispatcher/capability.service.d.ts +50 -0
  178. package/dist/dispatcher/capability.service.d.ts.map +1 -0
  179. package/dist/dispatcher/capability.service.js +159 -0
  180. package/dist/dispatcher/capability.service.js.map +1 -0
  181. package/dist/dispatcher/cleanup.service.d.ts +23 -0
  182. package/dist/dispatcher/cleanup.service.d.ts.map +1 -0
  183. package/dist/dispatcher/cleanup.service.js +107 -0
  184. package/dist/dispatcher/cleanup.service.js.map +1 -0
  185. package/dist/dispatcher/dedup.service.d.ts +48 -0
  186. package/dist/dispatcher/dedup.service.d.ts.map +1 -0
  187. package/dist/dispatcher/dedup.service.js +189 -0
  188. package/dist/dispatcher/dedup.service.js.map +1 -0
  189. package/dist/dispatcher/dispatcher.module.d.ts +3 -0
  190. package/dist/dispatcher/dispatcher.module.d.ts.map +1 -0
  191. package/dist/dispatcher/dispatcher.module.js +76 -0
  192. package/dist/dispatcher/dispatcher.module.js.map +1 -0
  193. package/dist/dispatcher/dispatcher.service.d.ts +134 -0
  194. package/dist/dispatcher/dispatcher.service.d.ts.map +1 -0
  195. package/dist/dispatcher/dispatcher.service.js +1034 -0
  196. package/dist/dispatcher/dispatcher.service.js.map +1 -0
  197. package/dist/dispatcher/heartbeat.service.d.ts +50 -0
  198. package/dist/dispatcher/heartbeat.service.d.ts.map +1 -0
  199. package/dist/dispatcher/heartbeat.service.js +154 -0
  200. package/dist/dispatcher/heartbeat.service.js.map +1 -0
  201. package/dist/dispatcher/machine-selector.d.ts +18 -0
  202. package/dist/dispatcher/machine-selector.d.ts.map +1 -0
  203. package/dist/dispatcher/machine-selector.js +144 -0
  204. package/dist/dispatcher/machine-selector.js.map +1 -0
  205. package/dist/dispatcher/pty-relay.service.d.ts +75 -0
  206. package/dist/dispatcher/pty-relay.service.d.ts.map +1 -0
  207. package/dist/dispatcher/pty-relay.service.js +404 -0
  208. package/dist/dispatcher/pty-relay.service.js.map +1 -0
  209. package/dist/dispatcher/reconciler.d.ts +39 -0
  210. package/dist/dispatcher/reconciler.d.ts.map +1 -0
  211. package/dist/dispatcher/reconciler.js +556 -0
  212. package/dist/dispatcher/reconciler.js.map +1 -0
  213. package/dist/dispatcher/scheduler.service.d.ts +50 -0
  214. package/dist/dispatcher/scheduler.service.d.ts.map +1 -0
  215. package/dist/dispatcher/scheduler.service.js +287 -0
  216. package/dist/dispatcher/scheduler.service.js.map +1 -0
  217. package/dist/dispatcher/state-machine.d.ts +16 -0
  218. package/dist/dispatcher/state-machine.d.ts.map +1 -0
  219. package/dist/dispatcher/state-machine.js +77 -0
  220. package/dist/dispatcher/state-machine.js.map +1 -0
  221. package/dist/dispatcher/task-log-batcher.d.ts +50 -0
  222. package/dist/dispatcher/task-log-batcher.d.ts.map +1 -0
  223. package/dist/dispatcher/task-log-batcher.js +184 -0
  224. package/dist/dispatcher/task-log-batcher.js.map +1 -0
  225. package/dist/dispatcher/worker-connection.manager.d.ts +49 -0
  226. package/dist/dispatcher/worker-connection.manager.d.ts.map +1 -0
  227. package/dist/dispatcher/worker-connection.manager.js +128 -0
  228. package/dist/dispatcher/worker-connection.manager.js.map +1 -0
  229. package/dist/main.d.ts +2 -0
  230. package/dist/main.d.ts.map +1 -0
  231. package/dist/main.js +85 -0
  232. package/dist/main.js.map +1 -0
  233. package/dist/notifier/debouncer.d.ts +39 -0
  234. package/dist/notifier/debouncer.d.ts.map +1 -0
  235. package/dist/notifier/debouncer.js +123 -0
  236. package/dist/notifier/debouncer.js.map +1 -0
  237. package/dist/notifier/notification-consumer.d.ts +88 -0
  238. package/dist/notifier/notification-consumer.d.ts.map +1 -0
  239. package/dist/notifier/notification-consumer.js +186 -0
  240. package/dist/notifier/notification-consumer.js.map +1 -0
  241. package/dist/notifier/notifier.module.d.ts +9 -0
  242. package/dist/notifier/notifier.module.d.ts.map +1 -0
  243. package/dist/notifier/notifier.module.js +58 -0
  244. package/dist/notifier/notifier.module.js.map +1 -0
  245. package/dist/notifier/notifier.service.d.ts +40 -0
  246. package/dist/notifier/notifier.service.d.ts.map +1 -0
  247. package/dist/notifier/notifier.service.js +191 -0
  248. package/dist/notifier/notifier.service.js.map +1 -0
  249. package/dist/notifier/template.service.d.ts +42 -0
  250. package/dist/notifier/template.service.d.ts.map +1 -0
  251. package/dist/notifier/template.service.js +201 -0
  252. package/dist/notifier/template.service.js.map +1 -0
  253. package/dist/redis/redis.module.d.ts +3 -0
  254. package/dist/redis/redis.module.d.ts.map +1 -0
  255. package/dist/redis/redis.module.js +22 -0
  256. package/dist/redis/redis.module.js.map +1 -0
  257. package/dist/redis/redis.service.d.ts +19 -0
  258. package/dist/redis/redis.service.d.ts.map +1 -0
  259. package/dist/redis/redis.service.js +69 -0
  260. package/dist/redis/redis.service.js.map +1 -0
  261. package/dist/web/admin/admin-audit.controller.d.ts +7 -0
  262. package/dist/web/admin/admin-audit.controller.d.ts.map +1 -0
  263. package/dist/web/admin/admin-audit.controller.js +53 -0
  264. package/dist/web/admin/admin-audit.controller.js.map +1 -0
  265. package/dist/web/admin/admin-bot.controller.d.ts +79 -0
  266. package/dist/web/admin/admin-bot.controller.d.ts.map +1 -0
  267. package/dist/web/admin/admin-bot.controller.js +193 -0
  268. package/dist/web/admin/admin-bot.controller.js.map +1 -0
  269. package/dist/web/admin/admin-developer.controller.d.ts +52 -0
  270. package/dist/web/admin/admin-developer.controller.d.ts.map +1 -0
  271. package/dist/web/admin/admin-developer.controller.js +160 -0
  272. package/dist/web/admin/admin-developer.controller.js.map +1 -0
  273. package/dist/web/admin/admin-machine.controller.d.ts +64 -0
  274. package/dist/web/admin/admin-machine.controller.d.ts.map +1 -0
  275. package/dist/web/admin/admin-machine.controller.js +111 -0
  276. package/dist/web/admin/admin-machine.controller.js.map +1 -0
  277. package/dist/web/admin/admin-project.controller.d.ts +45 -0
  278. package/dist/web/admin/admin-project.controller.d.ts.map +1 -0
  279. package/dist/web/admin/admin-project.controller.js +207 -0
  280. package/dist/web/admin/admin-project.controller.js.map +1 -0
  281. package/dist/web/admin/admin-settings.controller.d.ts +18 -0
  282. package/dist/web/admin/admin-settings.controller.d.ts.map +1 -0
  283. package/dist/web/admin/admin-settings.controller.js +93 -0
  284. package/dist/web/admin/admin-settings.controller.js.map +1 -0
  285. package/dist/web/admin/admin-token.controller.d.ts +45 -0
  286. package/dist/web/admin/admin-token.controller.d.ts.map +1 -0
  287. package/dist/web/admin/admin-token.controller.js +182 -0
  288. package/dist/web/admin/admin-token.controller.js.map +1 -0
  289. package/dist/web/dashboard.controller.d.ts +16 -0
  290. package/dist/web/dashboard.controller.d.ts.map +1 -0
  291. package/dist/web/dashboard.controller.js +78 -0
  292. package/dist/web/dashboard.controller.js.map +1 -0
  293. package/dist/web/dashboard.service.d.ts +39 -0
  294. package/dist/web/dashboard.service.d.ts.map +1 -0
  295. package/dist/web/dashboard.service.js +234 -0
  296. package/dist/web/dashboard.service.js.map +1 -0
  297. package/dist/web/interaction.service.d.ts +42 -0
  298. package/dist/web/interaction.service.d.ts.map +1 -0
  299. package/dist/web/interaction.service.js +102 -0
  300. package/dist/web/interaction.service.js.map +1 -0
  301. package/dist/web/machine.controller.d.ts +102 -0
  302. package/dist/web/machine.controller.d.ts.map +1 -0
  303. package/dist/web/machine.controller.js +121 -0
  304. package/dist/web/machine.controller.js.map +1 -0
  305. package/dist/web/notification.controller.d.ts +22 -0
  306. package/dist/web/notification.controller.d.ts.map +1 -0
  307. package/dist/web/notification.controller.js +70 -0
  308. package/dist/web/notification.controller.js.map +1 -0
  309. package/dist/web/profile.controller.d.ts +70 -0
  310. package/dist/web/profile.controller.d.ts.map +1 -0
  311. package/dist/web/profile.controller.js +262 -0
  312. package/dist/web/profile.controller.js.map +1 -0
  313. package/dist/web/project.controller.d.ts +8 -0
  314. package/dist/web/project.controller.d.ts.map +1 -0
  315. package/dist/web/project.controller.js +54 -0
  316. package/dist/web/project.controller.js.map +1 -0
  317. package/dist/web/pty.gateway.d.ts +32 -0
  318. package/dist/web/pty.gateway.d.ts.map +1 -0
  319. package/dist/web/pty.gateway.js +358 -0
  320. package/dist/web/pty.gateway.js.map +1 -0
  321. package/dist/web/search.service.d.ts +34 -0
  322. package/dist/web/search.service.d.ts.map +1 -0
  323. package/dist/web/search.service.js +106 -0
  324. package/dist/web/search.service.js.map +1 -0
  325. package/dist/web/task.controller.d.ts +54 -0
  326. package/dist/web/task.controller.d.ts.map +1 -0
  327. package/dist/web/task.controller.js +266 -0
  328. package/dist/web/task.controller.js.map +1 -0
  329. package/dist/web/web.module.d.ts +3 -0
  330. package/dist/web/web.module.d.ts.map +1 -0
  331. package/dist/web/web.module.js +97 -0
  332. package/dist/web/web.module.js.map +1 -0
  333. package/dist/web/worker-channel.gateway.d.ts +45 -0
  334. package/dist/web/worker-channel.gateway.d.ts.map +1 -0
  335. package/dist/web/worker-channel.gateway.js +283 -0
  336. package/dist/web/worker-channel.gateway.js.map +1 -0
  337. package/dist/web/worker.controller.d.ts +14 -0
  338. package/dist/web/worker.controller.d.ts.map +1 -0
  339. package/dist/web/worker.controller.js +73 -0
  340. package/dist/web/worker.controller.js.map +1 -0
  341. package/dist/web/workspace.controller.d.ts +109 -0
  342. package/dist/web/workspace.controller.d.ts.map +1 -0
  343. package/dist/web/workspace.controller.js +386 -0
  344. package/dist/web/workspace.controller.js.map +1 -0
  345. package/package.json +61 -0
@@ -0,0 +1,404 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var PtyRelayService_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.PtyRelayService = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const ws_1 = require("ws");
13
+ const protocol_1 = require("@overlordai/protocol");
14
+ /** Maximum number of frames buffered per channel before backpressure kicks in. */
15
+ const MAX_BUFFER_SIZE = 1000;
16
+ /** Number of bytes to keep from the tail of each frame for overlap matching. */
17
+ const OVERLAP_BUFFER_BYTES = 128;
18
+ const REDACTED = '***REDACTED***';
19
+ /**
20
+ * PtyOutputFilter: sanitizes PTY output for sensitive patterns.
21
+ * Maintains a 128-byte overlap buffer between frames to detect secrets
22
+ * that span frame boundaries.
23
+ */
24
+ class PtyOutputFilter {
25
+ projectFilterEnabled;
26
+ developerId;
27
+ role;
28
+ taskOwnerId;
29
+ previousTail = '';
30
+ enabled;
31
+ constructor(projectFilterEnabled, developerId, role, taskOwnerId) {
32
+ this.projectFilterEnabled = projectFilterEnabled;
33
+ this.developerId = developerId;
34
+ this.role = role;
35
+ this.taskOwnerId = taskOwnerId;
36
+ // Filter is enabled if:
37
+ // 1. Project config has ptyOutputFilter = 1
38
+ // 2. Admin is viewing another developer's session (auto-enable)
39
+ this.enabled =
40
+ projectFilterEnabled ||
41
+ (role === 'admin' && developerId !== taskOwnerId);
42
+ }
43
+ /**
44
+ * Filter PTY output data through sensitive pattern detection.
45
+ * Uses a 128-byte overlapping buffer between frames to catch
46
+ * secrets split across frame boundaries.
47
+ */
48
+ filter(data) {
49
+ if (!this.enabled)
50
+ return data;
51
+ // Use a unique marker at the join point so we can find the split
52
+ // position even after redaction changes string lengths.
53
+ const MARKER = '\x00SPLIT\x00';
54
+ const combined = this.previousTail + MARKER + data;
55
+ // Apply all sensitive patterns to the combined buffer
56
+ let filtered = combined;
57
+ for (const pattern of protocol_1.SENSITIVE_PATTERNS) {
58
+ pattern.lastIndex = 0;
59
+ filtered = filtered.replace(pattern, REDACTED);
60
+ }
61
+ // Store the tail of the current data for next frame overlap
62
+ if (data.length > OVERLAP_BUFFER_BYTES) {
63
+ this.previousTail = data.slice(-OVERLAP_BUFFER_BYTES);
64
+ }
65
+ else {
66
+ this.previousTail = data;
67
+ }
68
+ // Find the marker and return only the portion after it
69
+ const markerPos = filtered.indexOf(MARKER);
70
+ if (markerPos >= 0) {
71
+ return filtered.slice(markerPos + MARKER.length);
72
+ }
73
+ // Marker was inside a redacted region; return best-effort slice
74
+ return filtered.slice(Math.max(0, filtered.length - data.length));
75
+ }
76
+ }
77
+ let PtyRelayService = PtyRelayService_1 = class PtyRelayService {
78
+ logger = new common_1.Logger(PtyRelayService_1.name);
79
+ channels = new Map();
80
+ /**
81
+ * Register the worker-side PTY WebSocket for a task.
82
+ * @param taskId - Task ID
83
+ * @param ws - Worker WebSocket connection
84
+ * @param taskOwnerId - Developer ID of the task owner (for filter auto-enable)
85
+ * @param projectFilterEnabled - Whether the project has ptyOutputFilter = 1
86
+ */
87
+ registerWorkerPtyChannel(taskId, ws, taskOwnerId = 0, projectFilterEnabled = false) {
88
+ const existing = this.channels.get(taskId);
89
+ if (existing) {
90
+ // Replace worker ws but keep web clients
91
+ existing.workerWs = ws;
92
+ this.logger.log(`Replaced worker PTY channel for task ${taskId}`);
93
+ }
94
+ else {
95
+ this.channels.set(taskId, {
96
+ workerWs: ws,
97
+ webWsSet: new Map(),
98
+ writerConnectionId: null,
99
+ sendQueue: [],
100
+ stdinTimestamps: [],
101
+ outputFilter: null,
102
+ taskOwnerId,
103
+ projectFilterEnabled,
104
+ });
105
+ this.logger.log(`Registered worker PTY channel for task ${taskId}`);
106
+ }
107
+ }
108
+ /**
109
+ * Register a web client's WebSocket for a task's PTY channel.
110
+ * The first web client to connect becomes the writer.
111
+ * When an admin views another developer's session, the PtyOutputFilter
112
+ * is automatically enabled to sanitize sensitive patterns.
113
+ *
114
+ * @param taskId - Task ID
115
+ * @param ws - Web client WebSocket connection
116
+ * @param connectionId - Unique connection identifier
117
+ * @param developerId - The developer ID of the connecting user
118
+ * @param role - The role of the connecting user (e.g. 'admin', 'developer')
119
+ */
120
+ registerWebPtyChannel(taskId, ws, connectionId, developerId = 0, role = 'developer') {
121
+ const channel = this.channels.get(taskId);
122
+ if (!channel) {
123
+ this.logger.warn(`No PTY channel for task ${taskId}; cannot register web client ${connectionId}`);
124
+ return;
125
+ }
126
+ channel.webWsSet.set(connectionId, { ws, developerId, role });
127
+ // Create or update the output filter when a web client connects.
128
+ // Auto-enable filter if admin is viewing another developer's session
129
+ // or if the project has ptyOutputFilter enabled.
130
+ const needsFilter = channel.projectFilterEnabled ||
131
+ (role === 'admin' && developerId !== channel.taskOwnerId);
132
+ if (needsFilter && !channel.outputFilter) {
133
+ channel.outputFilter = new PtyOutputFilter(channel.projectFilterEnabled, developerId, role, channel.taskOwnerId);
134
+ this.logger.log(`PtyOutputFilter enabled for task ${taskId} (admin=${role === 'admin'}, projectFilter=${channel.projectFilterEnabled})`);
135
+ }
136
+ // First web client becomes writer automatically
137
+ if (channel.writerConnectionId === null) {
138
+ channel.writerConnectionId = connectionId;
139
+ this.logger.log(`Web client ${connectionId} is writer for task ${taskId}`);
140
+ }
141
+ this.logger.log(`Web client ${connectionId} registered for PTY task ${taskId} (${channel.webWsSet.size} clients)`);
142
+ }
143
+ /**
144
+ * Relay PTY output from the worker to all connected web clients.
145
+ * Implements backpressure: if the buffer exceeds MAX_BUFFER_SIZE, intermediate
146
+ * frames are dropped and a frames_dropped notification is sent.
147
+ */
148
+ relayWorkerToWeb(taskId, data) {
149
+ const channel = this.channels.get(taskId);
150
+ if (!channel) {
151
+ return;
152
+ }
153
+ // Apply PtyOutputFilter if enabled (sanitize sensitive patterns)
154
+ let filteredData;
155
+ if (channel.outputFilter) {
156
+ try {
157
+ filteredData = channel.outputFilter.filter(data);
158
+ }
159
+ catch (err) {
160
+ this.logger.error(`PtyOutputFilter.filter() threw for task ${taskId}; falling back to unfiltered data`, err instanceof Error ? err.stack : String(err));
161
+ filteredData = data;
162
+ }
163
+ }
164
+ else {
165
+ filteredData = data;
166
+ }
167
+ const frame = { type: 'data', data: filteredData };
168
+ const serialized = JSON.stringify(frame);
169
+ // Backpressure: buffer management
170
+ channel.sendQueue.push(serialized);
171
+ if (channel.sendQueue.length > MAX_BUFFER_SIZE) {
172
+ // Keep first and last frames, drop intermediate ones
173
+ const dropped = channel.sendQueue.length - 2;
174
+ const first = channel.sendQueue[0];
175
+ const last = channel.sendQueue[channel.sendQueue.length - 1];
176
+ channel.sendQueue.length = 0;
177
+ channel.sendQueue.push(first);
178
+ // Send a frames_dropped notification
179
+ const droppedFrame = {
180
+ type: 'frames_dropped',
181
+ count: dropped,
182
+ };
183
+ const droppedSerialized = JSON.stringify(droppedFrame);
184
+ channel.sendQueue.push(droppedSerialized);
185
+ channel.sendQueue.push(last);
186
+ this.logger.warn(`Backpressure: dropped ${dropped} frames for task ${taskId}`);
187
+ }
188
+ // Drain the send queue to all web clients
189
+ while (channel.sendQueue.length > 0) {
190
+ const msg = channel.sendQueue.shift();
191
+ for (const [connId, client] of channel.webWsSet) {
192
+ if (client.ws.readyState === ws_1.WebSocket.OPEN) {
193
+ try {
194
+ client.ws.send(msg);
195
+ }
196
+ catch (err) {
197
+ this.logger.error(`Failed to relay to web client ${connId} for task ${taskId}`, err instanceof Error ? err.stack : String(err));
198
+ }
199
+ }
200
+ }
201
+ }
202
+ }
203
+ /**
204
+ * Relay stdin input from a web client to the worker.
205
+ * Only the current writer is allowed to send input.
206
+ * Rate limiting: max PTY_STDIN_RATE_LIMIT writes per second,
207
+ * each write at most PTY_STDIN_MAX_BYTES bytes.
208
+ */
209
+ relayWebToWorker(taskId, data, connectionId) {
210
+ const channel = this.channels.get(taskId);
211
+ if (!channel) {
212
+ this.logger.warn(`No PTY channel for task ${taskId}`);
213
+ return false;
214
+ }
215
+ // Only the writer can send input
216
+ if (channel.writerConnectionId !== connectionId) {
217
+ this.logger.debug(`Connection ${connectionId} is not the writer for task ${taskId}; ignoring stdin`);
218
+ return false;
219
+ }
220
+ // Size limit
221
+ const byteLength = Buffer.byteLength(data, 'utf8');
222
+ if (byteLength > protocol_1.PTY_STDIN_MAX_BYTES) {
223
+ this.logger.warn(`Stdin from ${connectionId} for task ${taskId} exceeds max bytes (${byteLength} > ${protocol_1.PTY_STDIN_MAX_BYTES})`);
224
+ return false;
225
+ }
226
+ // Rate limit: sliding window of 60 seconds (100/min/connection per plan)
227
+ const now = Date.now();
228
+ const windowStart = now - 60_000;
229
+ channel.stdinTimestamps = channel.stdinTimestamps.filter((t) => t > windowStart);
230
+ if (channel.stdinTimestamps.length >= protocol_1.PTY_STDIN_RATE_LIMIT) {
231
+ this.logger.warn(`Rate limit exceeded for task ${taskId} from connection ${connectionId}`);
232
+ return false;
233
+ }
234
+ channel.stdinTimestamps.push(now);
235
+ // Forward to worker
236
+ if (channel.workerWs.readyState !== ws_1.WebSocket.OPEN) {
237
+ this.logger.warn(`Worker WebSocket not open for task ${taskId}; cannot relay stdin`);
238
+ return false;
239
+ }
240
+ try {
241
+ const frame = { type: 'data', data };
242
+ channel.workerWs.send(JSON.stringify(frame));
243
+ return true;
244
+ }
245
+ catch (err) {
246
+ this.logger.error(`Failed to relay stdin to worker for task ${taskId}`, err instanceof Error ? err.stack : String(err));
247
+ return false;
248
+ }
249
+ }
250
+ /**
251
+ * Relay a resize event from a web client to the worker.
252
+ * @param taskId - Task ID
253
+ * @param cols - New terminal column count
254
+ * @param rows - New terminal row count
255
+ */
256
+ relayResize(taskId, cols, rows) {
257
+ const channel = this.channels.get(taskId);
258
+ if (!channel) {
259
+ this.logger.warn(`No PTY channel for task ${taskId}; cannot relay resize`);
260
+ return false;
261
+ }
262
+ if (channel.workerWs.readyState !== ws_1.WebSocket.OPEN) {
263
+ this.logger.warn(`Worker WebSocket not open for task ${taskId}; cannot relay resize`);
264
+ return false;
265
+ }
266
+ try {
267
+ const frame = { type: 'resize', cols, rows };
268
+ channel.workerWs.send(JSON.stringify(frame));
269
+ return true;
270
+ }
271
+ catch (err) {
272
+ this.logger.error(`Failed to relay resize to worker for task ${taskId}`, err instanceof Error ? err.stack : String(err));
273
+ return false;
274
+ }
275
+ }
276
+ /**
277
+ * Get the current writer's connection ID for a task's PTY channel.
278
+ */
279
+ getWriterConnectionId(taskId) {
280
+ const channel = this.channels.get(taskId);
281
+ return channel?.writerConnectionId ?? null;
282
+ }
283
+ /**
284
+ * Release the writer role for a connection, clearing it without assigning a new writer.
285
+ */
286
+ releaseWriter(taskId, connectionId) {
287
+ const channel = this.channels.get(taskId);
288
+ if (!channel)
289
+ return false;
290
+ if (channel.writerConnectionId !== connectionId)
291
+ return false;
292
+ channel.writerConnectionId = null;
293
+ this.logger.log(`Writer ${connectionId} released for task ${taskId}`);
294
+ return true;
295
+ }
296
+ /**
297
+ * Force a takeover: revoke the current writer and assign a new one.
298
+ * The old writer receives a 'writer_revoked' frame.
299
+ */
300
+ forceTakeover(taskId, newConnectionId) {
301
+ const channel = this.channels.get(taskId);
302
+ if (!channel) {
303
+ this.logger.warn(`No PTY channel for task ${taskId}; cannot force takeover`);
304
+ return false;
305
+ }
306
+ const oldWriterId = channel.writerConnectionId;
307
+ // Notify old writer that they have been revoked
308
+ if (oldWriterId && oldWriterId !== newConnectionId) {
309
+ const oldClient = channel.webWsSet.get(oldWriterId);
310
+ if (oldClient && oldClient.ws.readyState === ws_1.WebSocket.OPEN) {
311
+ try {
312
+ const revokedFrame = {
313
+ type: 'writer_revoked',
314
+ };
315
+ oldClient.ws.send(JSON.stringify(revokedFrame));
316
+ }
317
+ catch {
318
+ // Best effort notification
319
+ }
320
+ }
321
+ this.logger.log(`Writer revoked from ${oldWriterId} for task ${taskId}`);
322
+ }
323
+ channel.writerConnectionId = newConnectionId;
324
+ this.logger.log(`Writer for task ${taskId} set to ${newConnectionId}`);
325
+ return true;
326
+ }
327
+ /**
328
+ * Handle a takeover request by forwarding it to the worker.
329
+ * The worker decides whether to grant or deny the takeover.
330
+ */
331
+ handleTakeoverRequest(taskId, sessionId, connectionId) {
332
+ const channel = this.channels.get(taskId);
333
+ if (!channel) {
334
+ this.logger.warn(`No PTY channel for task ${taskId}; cannot handle takeover request`);
335
+ return false;
336
+ }
337
+ if (channel.workerWs.readyState !== ws_1.WebSocket.OPEN) {
338
+ this.logger.warn(`Worker WebSocket not open for task ${taskId}; cannot forward takeover request`);
339
+ return false;
340
+ }
341
+ try {
342
+ const frame = {
343
+ type: 'request_takeover',
344
+ sessionId,
345
+ };
346
+ channel.workerWs.send(JSON.stringify(frame));
347
+ return true;
348
+ }
349
+ catch (err) {
350
+ this.logger.error(`Failed to forward takeover request for task ${taskId}`, err instanceof Error ? err.stack : String(err));
351
+ return false;
352
+ }
353
+ }
354
+ /**
355
+ * Unregister a web client from a task's PTY channel.
356
+ * If the disconnected client was the writer, the writer role is cleared.
357
+ */
358
+ unregisterWebChannel(taskId, connectionId) {
359
+ const channel = this.channels.get(taskId);
360
+ if (!channel) {
361
+ return;
362
+ }
363
+ channel.webWsSet.delete(connectionId);
364
+ if (channel.writerConnectionId === connectionId) {
365
+ channel.writerConnectionId = null;
366
+ this.logger.log(`Writer ${connectionId} disconnected from task ${taskId}; writer role cleared`);
367
+ }
368
+ this.logger.debug(`Web client ${connectionId} unregistered from task ${taskId} (${channel.webWsSet.size} remaining)`);
369
+ // Clean up channel if no web clients and no worker
370
+ if (channel.webWsSet.size === 0 &&
371
+ channel.workerWs.readyState !== ws_1.WebSocket.OPEN) {
372
+ this.channels.delete(taskId);
373
+ this.logger.log(`PTY channel for task ${taskId} cleaned up`);
374
+ }
375
+ }
376
+ /**
377
+ * Unregister the worker-side PTY channel for a task.
378
+ * Notifies all web clients by closing their connections.
379
+ */
380
+ unregisterWorkerChannel(taskId) {
381
+ const channel = this.channels.get(taskId);
382
+ if (!channel) {
383
+ return;
384
+ }
385
+ // Close all web client connections
386
+ for (const [connId, client] of channel.webWsSet) {
387
+ if (client.ws.readyState === ws_1.WebSocket.OPEN) {
388
+ try {
389
+ client.ws.close(1000, 'Worker PTY channel closed');
390
+ }
391
+ catch {
392
+ // Best effort
393
+ }
394
+ }
395
+ }
396
+ this.channels.delete(taskId);
397
+ this.logger.log(`Worker PTY channel for task ${taskId} unregistered; all web clients disconnected`);
398
+ }
399
+ };
400
+ exports.PtyRelayService = PtyRelayService;
401
+ exports.PtyRelayService = PtyRelayService = PtyRelayService_1 = __decorate([
402
+ (0, common_1.Injectable)()
403
+ ], PtyRelayService);
404
+ //# sourceMappingURL=pty-relay.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pty-relay.service.js","sourceRoot":"","sources":["../../src/dispatcher/pty-relay.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { OnModuleInit } from '@nestjs/common';
2
+ import type { WorkerReconnectFrame } from '@overlordai/protocol';
3
+ import { TaskRepository } from '../database/repositories/task.repository';
4
+ import { MachineRepository } from '../database/repositories/machine.repository';
5
+ import { AuditLogRepository } from '../database/repositories/audit-log.repository';
6
+ import { WorkspaceRepository } from '../database/repositories/workspace.repository';
7
+ import { SchedulerService } from './scheduler.service';
8
+ import { CleanupService } from './cleanup.service';
9
+ import { WorkerConnectionManager } from './worker-connection.manager';
10
+ export declare class Reconciler implements OnModuleInit {
11
+ private readonly taskRepo;
12
+ private readonly machineRepo;
13
+ private readonly auditLogRepo;
14
+ private readonly workspaceRepo;
15
+ private readonly schedulerService;
16
+ private readonly cleanupService;
17
+ private readonly workerConnectionManager;
18
+ private readonly logger;
19
+ constructor(taskRepo: TaskRepository, machineRepo: MachineRepository, auditLogRepo: AuditLogRepository, workspaceRepo: WorkspaceRepository, schedulerService: SchedulerService, cleanupService: CleanupService, workerConnectionManager: WorkerConnectionManager);
20
+ onModuleInit(): Promise<void>;
21
+ onBoot(): Promise<void>;
22
+ handleReconnect(machineId: string, tasks: WorkerReconnectFrame['tasks']): Promise<Array<{
23
+ taskId: number;
24
+ action: string;
25
+ }>>;
26
+ private reconcileReportedTask;
27
+ /**
28
+ * Update task status with CAS retry, logging on failure instead of throwing.
29
+ * Best-effort for reconciliation — continues processing other tasks on failure.
30
+ */
31
+ private updateTaskStatusSafe;
32
+ /** Send cancel frame to a Worker for a specific task. */
33
+ private sendCancelToWorker;
34
+ /** Send cleanup instruction to Worker for a specific task. */
35
+ private sendCleanupToWorker;
36
+ /** Schedule workspace cleanup for a task that reached a terminal state. */
37
+ private scheduleWorkspaceCleanup;
38
+ }
39
+ //# sourceMappingURL=reconciler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconciler.d.ts","sourceRoot":"","sources":["../../src/dispatcher/reconciler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAElE,OAAO,KAAK,EAGV,oBAAoB,EAIrB,MAAM,sBAAsB,CAAC;AAS9B,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,+CAA+C,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,+CAA+C,CAAC;AAEpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,qBACa,UAAW,YAAW,YAAY;IAI3C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,uBAAuB;IAT1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;gBAGnC,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,iBAAiB,EAC9B,YAAY,EAAE,kBAAkB,EAChC,aAAa,EAAE,mBAAmB,EAClC,gBAAgB,EAAE,gBAAgB,EAClC,cAAc,EAAE,cAAc,EAC9B,uBAAuB,EAAE,uBAAuB;IAG7D,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAU7B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAyLvB,eAAe,CACnB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,oBAAoB,CAAC,OAAO,CAAC,GACnC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAkGrD,OAAO,CAAC,qBAAqB;IAyP7B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAqC5B,yDAAyD;IACzD,OAAO,CAAC,kBAAkB;IAS1B,8DAA8D;IAC9D,OAAO,CAAC,mBAAmB;IAW3B,2EAA2E;IAC3E,OAAO,CAAC,wBAAwB;CAcjC"}