happy2 0.0.5

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 (373) hide show
  1. package/README.md +82 -0
  2. package/package.json +74 -0
  3. package/packages/happy2-server/Dockerfile +18 -0
  4. package/packages/happy2-server/README.md +418 -0
  5. package/packages/happy2-server/bin/happy2.js +3 -0
  6. package/packages/happy2-server/dist/cli.d.ts +3 -0
  7. package/packages/happy2-server/dist/cli.d.ts.map +1 -0
  8. package/packages/happy2-server/dist/cli.js +44 -0
  9. package/packages/happy2-server/dist/cli.js.map +1 -0
  10. package/packages/happy2-server/dist/index.d.ts +24 -0
  11. package/packages/happy2-server/dist/index.d.ts.map +1 -0
  12. package/packages/happy2-server/dist/index.js +22 -0
  13. package/packages/happy2-server/dist/index.js.map +1 -0
  14. package/packages/happy2-server/dist/modules/agents/builtin-images.d.ts +8 -0
  15. package/packages/happy2-server/dist/modules/agents/builtin-images.d.ts.map +1 -0
  16. package/packages/happy2-server/dist/modules/agents/builtin-images.js +283 -0
  17. package/packages/happy2-server/dist/modules/agents/builtin-images.js.map +1 -0
  18. package/packages/happy2-server/dist/modules/agents/command.d.ts +3 -0
  19. package/packages/happy2-server/dist/modules/agents/command.d.ts.map +1 -0
  20. package/packages/happy2-server/dist/modules/agents/command.js +7 -0
  21. package/packages/happy2-server/dist/modules/agents/command.js.map +1 -0
  22. package/packages/happy2-server/dist/modules/agents/daemon.d.ts +106 -0
  23. package/packages/happy2-server/dist/modules/agents/daemon.d.ts.map +1 -0
  24. package/packages/happy2-server/dist/modules/agents/daemon.js +522 -0
  25. package/packages/happy2-server/dist/modules/agents/daemon.js.map +1 -0
  26. package/packages/happy2-server/dist/modules/agents/docker.d.ts +51 -0
  27. package/packages/happy2-server/dist/modules/agents/docker.d.ts.map +1 -0
  28. package/packages/happy2-server/dist/modules/agents/docker.js +256 -0
  29. package/packages/happy2-server/dist/modules/agents/docker.js.map +1 -0
  30. package/packages/happy2-server/dist/modules/agents/docker.test.d.ts +2 -0
  31. package/packages/happy2-server/dist/modules/agents/docker.test.d.ts.map +1 -0
  32. package/packages/happy2-server/dist/modules/agents/docker.test.js +155 -0
  33. package/packages/happy2-server/dist/modules/agents/docker.test.js.map +1 -0
  34. package/packages/happy2-server/dist/modules/agents/index.d.ts +5 -0
  35. package/packages/happy2-server/dist/modules/agents/index.d.ts.map +1 -0
  36. package/packages/happy2-server/dist/modules/agents/index.js +4 -0
  37. package/packages/happy2-server/dist/modules/agents/index.js.map +1 -0
  38. package/packages/happy2-server/dist/modules/agents/service.d.ts +140 -0
  39. package/packages/happy2-server/dist/modules/agents/service.d.ts.map +1 -0
  40. package/packages/happy2-server/dist/modules/agents/service.js +1283 -0
  41. package/packages/happy2-server/dist/modules/agents/service.js.map +1 -0
  42. package/packages/happy2-server/dist/modules/auth/cloudflare-access.d.ts +15 -0
  43. package/packages/happy2-server/dist/modules/auth/cloudflare-access.d.ts.map +1 -0
  44. package/packages/happy2-server/dist/modules/auth/cloudflare-access.js +49 -0
  45. package/packages/happy2-server/dist/modules/auth/cloudflare-access.js.map +1 -0
  46. package/packages/happy2-server/dist/modules/auth/crypto.d.ts +4 -0
  47. package/packages/happy2-server/dist/modules/auth/crypto.d.ts.map +1 -0
  48. package/packages/happy2-server/dist/modules/auth/crypto.js +31 -0
  49. package/packages/happy2-server/dist/modules/auth/crypto.js.map +1 -0
  50. package/packages/happy2-server/dist/modules/auth/crypto.test.d.ts +2 -0
  51. package/packages/happy2-server/dist/modules/auth/crypto.test.d.ts.map +1 -0
  52. package/packages/happy2-server/dist/modules/auth/crypto.test.js +11 -0
  53. package/packages/happy2-server/dist/modules/auth/crypto.test.js.map +1 -0
  54. package/packages/happy2-server/dist/modules/auth/email.d.ts +3 -0
  55. package/packages/happy2-server/dist/modules/auth/email.d.ts.map +1 -0
  56. package/packages/happy2-server/dist/modules/auth/email.js +22 -0
  57. package/packages/happy2-server/dist/modules/auth/email.js.map +1 -0
  58. package/packages/happy2-server/dist/modules/auth/metadata.d.ts +5 -0
  59. package/packages/happy2-server/dist/modules/auth/metadata.d.ts.map +1 -0
  60. package/packages/happy2-server/dist/modules/auth/metadata.js +28 -0
  61. package/packages/happy2-server/dist/modules/auth/metadata.js.map +1 -0
  62. package/packages/happy2-server/dist/modules/auth/metadata.test.d.ts +2 -0
  63. package/packages/happy2-server/dist/modules/auth/metadata.test.d.ts.map +1 -0
  64. package/packages/happy2-server/dist/modules/auth/metadata.test.js +10 -0
  65. package/packages/happy2-server/dist/modules/auth/metadata.test.js.map +1 -0
  66. package/packages/happy2-server/dist/modules/auth/methods.d.ts +10 -0
  67. package/packages/happy2-server/dist/modules/auth/methods.d.ts.map +1 -0
  68. package/packages/happy2-server/dist/modules/auth/methods.js +21 -0
  69. package/packages/happy2-server/dist/modules/auth/methods.js.map +1 -0
  70. package/packages/happy2-server/dist/modules/auth/methods.test.d.ts +2 -0
  71. package/packages/happy2-server/dist/modules/auth/methods.test.d.ts.map +1 -0
  72. package/packages/happy2-server/dist/modules/auth/methods.test.js +16 -0
  73. package/packages/happy2-server/dist/modules/auth/methods.test.js.map +1 -0
  74. package/packages/happy2-server/dist/modules/auth/oidc.d.ts +9 -0
  75. package/packages/happy2-server/dist/modules/auth/oidc.d.ts.map +1 -0
  76. package/packages/happy2-server/dist/modules/auth/oidc.js +68 -0
  77. package/packages/happy2-server/dist/modules/auth/oidc.js.map +1 -0
  78. package/packages/happy2-server/dist/modules/auth/service.d.ts +44 -0
  79. package/packages/happy2-server/dist/modules/auth/service.d.ts.map +1 -0
  80. package/packages/happy2-server/dist/modules/auth/service.js +208 -0
  81. package/packages/happy2-server/dist/modules/auth/service.js.map +1 -0
  82. package/packages/happy2-server/dist/modules/auth/tokens.d.ts +21 -0
  83. package/packages/happy2-server/dist/modules/auth/tokens.d.ts.map +1 -0
  84. package/packages/happy2-server/dist/modules/auth/tokens.js +79 -0
  85. package/packages/happy2-server/dist/modules/auth/tokens.js.map +1 -0
  86. package/packages/happy2-server/dist/modules/automation/repository.d.ts +127 -0
  87. package/packages/happy2-server/dist/modules/automation/repository.d.ts.map +1 -0
  88. package/packages/happy2-server/dist/modules/automation/repository.js +821 -0
  89. package/packages/happy2-server/dist/modules/automation/repository.js.map +1 -0
  90. package/packages/happy2-server/dist/modules/collaboration/repository.d.ts +839 -0
  91. package/packages/happy2-server/dist/modules/collaboration/repository.d.ts.map +1 -0
  92. package/packages/happy2-server/dist/modules/collaboration/repository.js +5795 -0
  93. package/packages/happy2-server/dist/modules/collaboration/repository.js.map +1 -0
  94. package/packages/happy2-server/dist/modules/collaboration/repository.test.d.ts +2 -0
  95. package/packages/happy2-server/dist/modules/collaboration/repository.test.d.ts.map +1 -0
  96. package/packages/happy2-server/dist/modules/collaboration/repository.test.js +620 -0
  97. package/packages/happy2-server/dist/modules/collaboration/repository.test.js.map +1 -0
  98. package/packages/happy2-server/dist/modules/collaboration/types.d.ts +243 -0
  99. package/packages/happy2-server/dist/modules/collaboration/types.d.ts.map +1 -0
  100. package/packages/happy2-server/dist/modules/collaboration/types.js +8 -0
  101. package/packages/happy2-server/dist/modules/collaboration/types.js.map +1 -0
  102. package/packages/happy2-server/dist/modules/config/defaults.d.ts +8 -0
  103. package/packages/happy2-server/dist/modules/config/defaults.d.ts.map +1 -0
  104. package/packages/happy2-server/dist/modules/config/defaults.js +70 -0
  105. package/packages/happy2-server/dist/modules/config/defaults.js.map +1 -0
  106. package/packages/happy2-server/dist/modules/config/defaults.test.d.ts +2 -0
  107. package/packages/happy2-server/dist/modules/config/defaults.test.d.ts.map +1 -0
  108. package/packages/happy2-server/dist/modules/config/defaults.test.js +27 -0
  109. package/packages/happy2-server/dist/modules/config/defaults.test.js.map +1 -0
  110. package/packages/happy2-server/dist/modules/config/environment.d.ts +4 -0
  111. package/packages/happy2-server/dist/modules/config/environment.d.ts.map +1 -0
  112. package/packages/happy2-server/dist/modules/config/environment.js +92 -0
  113. package/packages/happy2-server/dist/modules/config/environment.js.map +1 -0
  114. package/packages/happy2-server/dist/modules/config/loader.d.ts +5 -0
  115. package/packages/happy2-server/dist/modules/config/loader.d.ts.map +1 -0
  116. package/packages/happy2-server/dist/modules/config/loader.js +251 -0
  117. package/packages/happy2-server/dist/modules/config/loader.js.map +1 -0
  118. package/packages/happy2-server/dist/modules/config/loader.test.d.ts +2 -0
  119. package/packages/happy2-server/dist/modules/config/loader.test.d.ts.map +1 -0
  120. package/packages/happy2-server/dist/modules/config/loader.test.js +108 -0
  121. package/packages/happy2-server/dist/modules/config/loader.test.js.map +1 -0
  122. package/packages/happy2-server/dist/modules/config/paths.d.ts +7 -0
  123. package/packages/happy2-server/dist/modules/config/paths.d.ts.map +1 -0
  124. package/packages/happy2-server/dist/modules/config/paths.js +15 -0
  125. package/packages/happy2-server/dist/modules/config/paths.js.map +1 -0
  126. package/packages/happy2-server/dist/modules/config/paths.test.d.ts +2 -0
  127. package/packages/happy2-server/dist/modules/config/paths.test.d.ts.map +1 -0
  128. package/packages/happy2-server/dist/modules/config/paths.test.js +22 -0
  129. package/packages/happy2-server/dist/modules/config/paths.test.js.map +1 -0
  130. package/packages/happy2-server/dist/modules/config/runtime.d.ts +6 -0
  131. package/packages/happy2-server/dist/modules/config/runtime.d.ts.map +1 -0
  132. package/packages/happy2-server/dist/modules/config/runtime.js +14 -0
  133. package/packages/happy2-server/dist/modules/config/runtime.js.map +1 -0
  134. package/packages/happy2-server/dist/modules/config/type.d.ts +88 -0
  135. package/packages/happy2-server/dist/modules/config/type.d.ts.map +1 -0
  136. package/packages/happy2-server/dist/modules/config/type.js +2 -0
  137. package/packages/happy2-server/dist/modules/config/type.js.map +1 -0
  138. package/packages/happy2-server/dist/modules/database.d.ts +105 -0
  139. package/packages/happy2-server/dist/modules/database.d.ts.map +1 -0
  140. package/packages/happy2-server/dist/modules/database.js +583 -0
  141. package/packages/happy2-server/dist/modules/database.js.map +1 -0
  142. package/packages/happy2-server/dist/modules/drizzle.d.ts +11 -0
  143. package/packages/happy2-server/dist/modules/drizzle.d.ts.map +1 -0
  144. package/packages/happy2-server/dist/modules/drizzle.js +31 -0
  145. package/packages/happy2-server/dist/modules/drizzle.js.map +1 -0
  146. package/packages/happy2-server/dist/modules/files/lock.d.ts +3 -0
  147. package/packages/happy2-server/dist/modules/files/lock.d.ts.map +1 -0
  148. package/packages/happy2-server/dist/modules/files/lock.js +83 -0
  149. package/packages/happy2-server/dist/modules/files/lock.js.map +1 -0
  150. package/packages/happy2-server/dist/modules/files/media.d.ts +18 -0
  151. package/packages/happy2-server/dist/modules/files/media.d.ts.map +1 -0
  152. package/packages/happy2-server/dist/modules/files/media.js +352 -0
  153. package/packages/happy2-server/dist/modules/files/media.js.map +1 -0
  154. package/packages/happy2-server/dist/modules/files/provider.d.ts +130 -0
  155. package/packages/happy2-server/dist/modules/files/provider.d.ts.map +1 -0
  156. package/packages/happy2-server/dist/modules/files/provider.js +448 -0
  157. package/packages/happy2-server/dist/modules/files/provider.js.map +1 -0
  158. package/packages/happy2-server/dist/modules/files/quota.d.ts +58 -0
  159. package/packages/happy2-server/dist/modules/files/quota.d.ts.map +1 -0
  160. package/packages/happy2-server/dist/modules/files/quota.js +180 -0
  161. package/packages/happy2-server/dist/modules/files/quota.js.map +1 -0
  162. package/packages/happy2-server/dist/modules/files/routes.test.d.ts +2 -0
  163. package/packages/happy2-server/dist/modules/files/routes.test.d.ts.map +1 -0
  164. package/packages/happy2-server/dist/modules/files/routes.test.js +163 -0
  165. package/packages/happy2-server/dist/modules/files/routes.test.js.map +1 -0
  166. package/packages/happy2-server/dist/modules/files/scanner.d.ts +27 -0
  167. package/packages/happy2-server/dist/modules/files/scanner.d.ts.map +1 -0
  168. package/packages/happy2-server/dist/modules/files/scanner.js +66 -0
  169. package/packages/happy2-server/dist/modules/files/scanner.js.map +1 -0
  170. package/packages/happy2-server/dist/modules/files/storage.d.ts +95 -0
  171. package/packages/happy2-server/dist/modules/files/storage.d.ts.map +1 -0
  172. package/packages/happy2-server/dist/modules/files/storage.js +855 -0
  173. package/packages/happy2-server/dist/modules/files/storage.js.map +1 -0
  174. package/packages/happy2-server/dist/modules/files/storage.test.d.ts +2 -0
  175. package/packages/happy2-server/dist/modules/files/storage.test.d.ts.map +1 -0
  176. package/packages/happy2-server/dist/modules/files/storage.test.js +170 -0
  177. package/packages/happy2-server/dist/modules/files/storage.test.js.map +1 -0
  178. package/packages/happy2-server/dist/modules/integrations/index.d.ts +6 -0
  179. package/packages/happy2-server/dist/modules/integrations/index.d.ts.map +1 -0
  180. package/packages/happy2-server/dist/modules/integrations/index.js +6 -0
  181. package/packages/happy2-server/dist/modules/integrations/index.js.map +1 -0
  182. package/packages/happy2-server/dist/modules/integrations/repository.d.ts +136 -0
  183. package/packages/happy2-server/dist/modules/integrations/repository.d.ts.map +1 -0
  184. package/packages/happy2-server/dist/modules/integrations/repository.js +1229 -0
  185. package/packages/happy2-server/dist/modules/integrations/repository.js.map +1 -0
  186. package/packages/happy2-server/dist/modules/integrations/repository.test.d.ts +2 -0
  187. package/packages/happy2-server/dist/modules/integrations/repository.test.d.ts.map +1 -0
  188. package/packages/happy2-server/dist/modules/integrations/repository.test.js +345 -0
  189. package/packages/happy2-server/dist/modules/integrations/repository.test.js.map +1 -0
  190. package/packages/happy2-server/dist/modules/integrations/routes.test.d.ts +2 -0
  191. package/packages/happy2-server/dist/modules/integrations/routes.test.d.ts.map +1 -0
  192. package/packages/happy2-server/dist/modules/integrations/routes.test.js +161 -0
  193. package/packages/happy2-server/dist/modules/integrations/routes.test.js.map +1 -0
  194. package/packages/happy2-server/dist/modules/integrations/secrets.d.ts +19 -0
  195. package/packages/happy2-server/dist/modules/integrations/secrets.d.ts.map +1 -0
  196. package/packages/happy2-server/dist/modules/integrations/secrets.js +69 -0
  197. package/packages/happy2-server/dist/modules/integrations/secrets.js.map +1 -0
  198. package/packages/happy2-server/dist/modules/integrations/ssrf.d.ts +32 -0
  199. package/packages/happy2-server/dist/modules/integrations/ssrf.d.ts.map +1 -0
  200. package/packages/happy2-server/dist/modules/integrations/ssrf.js +185 -0
  201. package/packages/happy2-server/dist/modules/integrations/ssrf.js.map +1 -0
  202. package/packages/happy2-server/dist/modules/integrations/ssrf.test.d.ts +2 -0
  203. package/packages/happy2-server/dist/modules/integrations/ssrf.test.d.ts.map +1 -0
  204. package/packages/happy2-server/dist/modules/integrations/ssrf.test.js +56 -0
  205. package/packages/happy2-server/dist/modules/integrations/ssrf.test.js.map +1 -0
  206. package/packages/happy2-server/dist/modules/integrations/transport.d.ts +21 -0
  207. package/packages/happy2-server/dist/modules/integrations/transport.d.ts.map +1 -0
  208. package/packages/happy2-server/dist/modules/integrations/transport.js +108 -0
  209. package/packages/happy2-server/dist/modules/integrations/transport.js.map +1 -0
  210. package/packages/happy2-server/dist/modules/integrations/transport.test.d.ts +2 -0
  211. package/packages/happy2-server/dist/modules/integrations/transport.test.d.ts.map +1 -0
  212. package/packages/happy2-server/dist/modules/integrations/transport.test.js +66 -0
  213. package/packages/happy2-server/dist/modules/integrations/transport.test.js.map +1 -0
  214. package/packages/happy2-server/dist/modules/integrations/types.d.ts +155 -0
  215. package/packages/happy2-server/dist/modules/integrations/types.d.ts.map +1 -0
  216. package/packages/happy2-server/dist/modules/integrations/types.js +26 -0
  217. package/packages/happy2-server/dist/modules/integrations/types.js.map +1 -0
  218. package/packages/happy2-server/dist/modules/operations/export-worker.d.ts +16 -0
  219. package/packages/happy2-server/dist/modules/operations/export-worker.d.ts.map +1 -0
  220. package/packages/happy2-server/dist/modules/operations/export-worker.js +56 -0
  221. package/packages/happy2-server/dist/modules/operations/export-worker.js.map +1 -0
  222. package/packages/happy2-server/dist/modules/operations/repository.d.ts +215 -0
  223. package/packages/happy2-server/dist/modules/operations/repository.d.ts.map +1 -0
  224. package/packages/happy2-server/dist/modules/operations/repository.js +2011 -0
  225. package/packages/happy2-server/dist/modules/operations/repository.js.map +1 -0
  226. package/packages/happy2-server/dist/modules/operations/repository.test.d.ts +2 -0
  227. package/packages/happy2-server/dist/modules/operations/repository.test.d.ts.map +1 -0
  228. package/packages/happy2-server/dist/modules/operations/repository.test.js +610 -0
  229. package/packages/happy2-server/dist/modules/operations/repository.test.js.map +1 -0
  230. package/packages/happy2-server/dist/modules/operations/types.d.ts +144 -0
  231. package/packages/happy2-server/dist/modules/operations/types.d.ts.map +1 -0
  232. package/packages/happy2-server/dist/modules/operations/types.js +9 -0
  233. package/packages/happy2-server/dist/modules/operations/types.js.map +1 -0
  234. package/packages/happy2-server/dist/modules/realtime/events.d.ts +99 -0
  235. package/packages/happy2-server/dist/modules/realtime/events.d.ts.map +1 -0
  236. package/packages/happy2-server/dist/modules/realtime/events.js +173 -0
  237. package/packages/happy2-server/dist/modules/realtime/events.js.map +1 -0
  238. package/packages/happy2-server/dist/modules/realtime/index.d.ts +4 -0
  239. package/packages/happy2-server/dist/modules/realtime/index.d.ts.map +1 -0
  240. package/packages/happy2-server/dist/modules/realtime/index.js +4 -0
  241. package/packages/happy2-server/dist/modules/realtime/index.js.map +1 -0
  242. package/packages/happy2-server/dist/modules/realtime/local.d.ts +37 -0
  243. package/packages/happy2-server/dist/modules/realtime/local.d.ts.map +1 -0
  244. package/packages/happy2-server/dist/modules/realtime/local.js +181 -0
  245. package/packages/happy2-server/dist/modules/realtime/local.js.map +1 -0
  246. package/packages/happy2-server/dist/modules/realtime/local.test.d.ts +2 -0
  247. package/packages/happy2-server/dist/modules/realtime/local.test.d.ts.map +1 -0
  248. package/packages/happy2-server/dist/modules/realtime/local.test.js +186 -0
  249. package/packages/happy2-server/dist/modules/realtime/local.test.js.map +1 -0
  250. package/packages/happy2-server/dist/modules/realtime/pubsub.d.ts +26 -0
  251. package/packages/happy2-server/dist/modules/realtime/pubsub.d.ts.map +1 -0
  252. package/packages/happy2-server/dist/modules/realtime/pubsub.js +7 -0
  253. package/packages/happy2-server/dist/modules/realtime/pubsub.js.map +1 -0
  254. package/packages/happy2-server/dist/modules/request/database-idempotency.d.ts +15 -0
  255. package/packages/happy2-server/dist/modules/request/database-idempotency.d.ts.map +1 -0
  256. package/packages/happy2-server/dist/modules/request/database-idempotency.js +141 -0
  257. package/packages/happy2-server/dist/modules/request/database-idempotency.js.map +1 -0
  258. package/packages/happy2-server/dist/modules/request/idempotency-hook.d.ts +12 -0
  259. package/packages/happy2-server/dist/modules/request/idempotency-hook.d.ts.map +1 -0
  260. package/packages/happy2-server/dist/modules/request/idempotency-hook.js +98 -0
  261. package/packages/happy2-server/dist/modules/request/idempotency-hook.js.map +1 -0
  262. package/packages/happy2-server/dist/modules/request/idempotency.d.ts +146 -0
  263. package/packages/happy2-server/dist/modules/request/idempotency.d.ts.map +1 -0
  264. package/packages/happy2-server/dist/modules/request/idempotency.js +312 -0
  265. package/packages/happy2-server/dist/modules/request/idempotency.js.map +1 -0
  266. package/packages/happy2-server/dist/modules/request/idempotency.test.d.ts +2 -0
  267. package/packages/happy2-server/dist/modules/request/idempotency.test.d.ts.map +1 -0
  268. package/packages/happy2-server/dist/modules/request/idempotency.test.js +191 -0
  269. package/packages/happy2-server/dist/modules/request/idempotency.test.js.map +1 -0
  270. package/packages/happy2-server/dist/modules/request/index.d.ts +5 -0
  271. package/packages/happy2-server/dist/modules/request/index.d.ts.map +1 -0
  272. package/packages/happy2-server/dist/modules/request/index.js +5 -0
  273. package/packages/happy2-server/dist/modules/request/index.js.map +1 -0
  274. package/packages/happy2-server/dist/modules/request/rate-limit.d.ts +100 -0
  275. package/packages/happy2-server/dist/modules/request/rate-limit.d.ts.map +1 -0
  276. package/packages/happy2-server/dist/modules/request/rate-limit.js +239 -0
  277. package/packages/happy2-server/dist/modules/request/rate-limit.js.map +1 -0
  278. package/packages/happy2-server/dist/modules/request/rate-limit.test.d.ts +2 -0
  279. package/packages/happy2-server/dist/modules/request/rate-limit.test.d.ts.map +1 -0
  280. package/packages/happy2-server/dist/modules/request/rate-limit.test.js +123 -0
  281. package/packages/happy2-server/dist/modules/request/rate-limit.test.js.map +1 -0
  282. package/packages/happy2-server/dist/modules/schema.d.ts +31454 -0
  283. package/packages/happy2-server/dist/modules/schema.d.ts.map +1 -0
  284. package/packages/happy2-server/dist/modules/schema.js +1081 -0
  285. package/packages/happy2-server/dist/modules/schema.js.map +1 -0
  286. package/packages/happy2-server/dist/modules/workspace/index.d.ts +3 -0
  287. package/packages/happy2-server/dist/modules/workspace/index.d.ts.map +1 -0
  288. package/packages/happy2-server/dist/modules/workspace/index.js +3 -0
  289. package/packages/happy2-server/dist/modules/workspace/index.js.map +1 -0
  290. package/packages/happy2-server/dist/modules/workspace/service.d.ts +54 -0
  291. package/packages/happy2-server/dist/modules/workspace/service.d.ts.map +1 -0
  292. package/packages/happy2-server/dist/modules/workspace/service.js +997 -0
  293. package/packages/happy2-server/dist/modules/workspace/service.js.map +1 -0
  294. package/packages/happy2-server/dist/modules/workspace/types.d.ts +58 -0
  295. package/packages/happy2-server/dist/modules/workspace/types.d.ts.map +1 -0
  296. package/packages/happy2-server/dist/modules/workspace/types.js +11 -0
  297. package/packages/happy2-server/dist/modules/workspace/types.js.map +1 -0
  298. package/packages/happy2-server/dist/routes/agents.d.ts +5 -0
  299. package/packages/happy2-server/dist/routes/agents.d.ts.map +1 -0
  300. package/packages/happy2-server/dist/routes/agents.js +225 -0
  301. package/packages/happy2-server/dist/routes/agents.js.map +1 -0
  302. package/packages/happy2-server/dist/routes/auth.d.ts +5 -0
  303. package/packages/happy2-server/dist/routes/auth.d.ts.map +1 -0
  304. package/packages/happy2-server/dist/routes/auth.js +128 -0
  305. package/packages/happy2-server/dist/routes/auth.js.map +1 -0
  306. package/packages/happy2-server/dist/routes/automation.d.ts +6 -0
  307. package/packages/happy2-server/dist/routes/automation.d.ts.map +1 -0
  308. package/packages/happy2-server/dist/routes/automation.js +315 -0
  309. package/packages/happy2-server/dist/routes/automation.js.map +1 -0
  310. package/packages/happy2-server/dist/routes/basic.d.ts +3 -0
  311. package/packages/happy2-server/dist/routes/basic.d.ts.map +1 -0
  312. package/packages/happy2-server/dist/routes/basic.js +5 -0
  313. package/packages/happy2-server/dist/routes/basic.js.map +1 -0
  314. package/packages/happy2-server/dist/routes/collaboration.d.ts +7 -0
  315. package/packages/happy2-server/dist/routes/collaboration.d.ts.map +1 -0
  316. package/packages/happy2-server/dist/routes/collaboration.js +1285 -0
  317. package/packages/happy2-server/dist/routes/collaboration.js.map +1 -0
  318. package/packages/happy2-server/dist/routes/files.d.ts +9 -0
  319. package/packages/happy2-server/dist/routes/files.d.ts.map +1 -0
  320. package/packages/happy2-server/dist/routes/files.js +397 -0
  321. package/packages/happy2-server/dist/routes/files.js.map +1 -0
  322. package/packages/happy2-server/dist/routes/integrations.d.ts +6 -0
  323. package/packages/happy2-server/dist/routes/integrations.d.ts.map +1 -0
  324. package/packages/happy2-server/dist/routes/integrations.js +486 -0
  325. package/packages/happy2-server/dist/routes/integrations.js.map +1 -0
  326. package/packages/happy2-server/dist/routes/operations.d.ts +5 -0
  327. package/packages/happy2-server/dist/routes/operations.d.ts.map +1 -0
  328. package/packages/happy2-server/dist/routes/operations.js +588 -0
  329. package/packages/happy2-server/dist/routes/operations.js.map +1 -0
  330. package/packages/happy2-server/dist/routes/operations.test.d.ts +2 -0
  331. package/packages/happy2-server/dist/routes/operations.test.d.ts.map +1 -0
  332. package/packages/happy2-server/dist/routes/operations.test.js +106 -0
  333. package/packages/happy2-server/dist/routes/operations.test.js.map +1 -0
  334. package/packages/happy2-server/dist/routes/sync.d.ts +6 -0
  335. package/packages/happy2-server/dist/routes/sync.d.ts.map +1 -0
  336. package/packages/happy2-server/dist/routes/sync.js +549 -0
  337. package/packages/happy2-server/dist/routes/sync.js.map +1 -0
  338. package/packages/happy2-server/dist/routes/workspace.d.ts +5 -0
  339. package/packages/happy2-server/dist/routes/workspace.d.ts.map +1 -0
  340. package/packages/happy2-server/dist/routes/workspace.js +240 -0
  341. package/packages/happy2-server/dist/routes/workspace.js.map +1 -0
  342. package/packages/happy2-server/dist/runner.d.ts +3 -0
  343. package/packages/happy2-server/dist/runner.d.ts.map +1 -0
  344. package/packages/happy2-server/dist/runner.js +30 -0
  345. package/packages/happy2-server/dist/runner.js.map +1 -0
  346. package/packages/happy2-server/dist/server.d.ts +32 -0
  347. package/packages/happy2-server/dist/server.d.ts.map +1 -0
  348. package/packages/happy2-server/dist/server.js +284 -0
  349. package/packages/happy2-server/dist/server.js.map +1 -0
  350. package/packages/happy2-server/dist/standalone.d.ts +13 -0
  351. package/packages/happy2-server/dist/standalone.d.ts.map +1 -0
  352. package/packages/happy2-server/dist/standalone.js +99 -0
  353. package/packages/happy2-server/dist/standalone.js.map +1 -0
  354. package/packages/happy2-server/dist/web/assets/figtree-latin-wght-normal-D_ZTVpCC.woff2 +0 -0
  355. package/packages/happy2-server/dist/web/assets/happy-otter-Q2O_g-DT.png +0 -0
  356. package/packages/happy2-server/dist/web/assets/index-COvbX8JP.css +2 -0
  357. package/packages/happy2-server/dist/web/assets/index-DdpugxMO.js +57 -0
  358. package/packages/happy2-server/dist/web/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  359. package/packages/happy2-server/dist/web/assets/onboarding-CRUpq9xl.png +0 -0
  360. package/packages/happy2-server/dist/web/index.html +13 -0
  361. package/packages/happy2-server/drizzle/0000_initial.sql +13 -0
  362. package/packages/happy2-server/drizzle/0001_accounts_profiles_files.sql +42 -0
  363. package/packages/happy2-server/drizzle/0002_file_visibility_and_uploader.sql +5 -0
  364. package/packages/happy2-server/drizzle/0003_collaboration.sql +565 -0
  365. package/packages/happy2-server/drizzle/0004_collaboration_expansion.sql +1099 -0
  366. package/packages/happy2-server/drizzle/0005_ai_agents.sql +85 -0
  367. package/packages/happy2-server/drizzle/0006_rig_global_event_queue.sql +10 -0
  368. package/packages/happy2-server/drizzle/0007_rename_server_identity.sql +3 -0
  369. package/packages/happy2-server/drizzle/0008_agent_message_streaming.sql +47 -0
  370. package/packages/happy2-server/drizzle/0009_chat_workspace_binding_lookup.sql +2 -0
  371. package/packages/happy2-server/drizzle/0010_rig_secret_assignments.sql +21 -0
  372. package/packages/happy2-server/drizzle/meta/_journal.json +83 -0
  373. package/packages/happy2-server/happy2.example.toml +104 -0
@@ -0,0 +1,610 @@
1
+ import { createClient } from "@libsql/client";
2
+ import { createId } from "@paralleldrive/cuid2";
3
+ import { mkdtemp, rm } from "node:fs/promises";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
7
+ import { Database } from "../database.js";
8
+ import { OperationsRepository } from "./repository.js";
9
+ describe("OperationsRepository", () => {
10
+ let directory;
11
+ let database;
12
+ let raw;
13
+ let repository;
14
+ let admin;
15
+ let member;
16
+ beforeEach(async () => {
17
+ directory = await mkdtemp(join(tmpdir(), "happy2-operations-"));
18
+ const url = `file:${join(directory, "happy2.db")}`;
19
+ database = new Database(url);
20
+ await database.migrate();
21
+ raw = createClient({ url });
22
+ repository = new OperationsRepository(url);
23
+ admin = await createUser(database, "admin@example.com", "admin", "Ada");
24
+ member = await createUser(database, "member@example.com", "member", "Grace");
25
+ });
26
+ afterEach(async () => {
27
+ repository.close();
28
+ raw.close();
29
+ database.close();
30
+ await rm(directory, { recursive: true, force: true });
31
+ });
32
+ it("applies and revokes reasoned bans atomically with session revocation and audit telemetry", async () => {
33
+ const session = await database.createSession(member.account.id, new Date(Date.now() + 60_000), { ip: "203.0.113.9" });
34
+ const ban = await repository.applyBan({
35
+ actorUserId: admin.user.id,
36
+ targetUserId: member.user.id,
37
+ reason: "Repeated abuse",
38
+ expiresAt: new Date(Date.now() + 3_600_000).toISOString(),
39
+ context: {
40
+ request: {
41
+ ip: "198.51.100.12",
42
+ device: "Happy (2) Desktop",
43
+ appVersion: "1.2.3",
44
+ userAgent: "happy2/1.2.3",
45
+ },
46
+ },
47
+ });
48
+ expect(ban).toMatchObject({
49
+ userId: member.user.id,
50
+ reason: "Repeated abuse",
51
+ status: "active",
52
+ });
53
+ expect(await database.findActiveSession(session.id)).toBeUndefined();
54
+ await expect(database.createSession(member.account.id, new Date(Date.now() + 60_000), {})).rejects.toThrow("not allowed");
55
+ const audit = await repository.listAuditLog({ actorUserId: admin.user.id, limit: 20 });
56
+ expect(audit.items[0]).toMatchObject({
57
+ action: "user.ban_applied",
58
+ targetId: member.user.id,
59
+ clientIp: "198.51.100.12",
60
+ device: "Happy (2) Desktop",
61
+ });
62
+ expect(audit.items[0]?.metadata).toMatchObject({ revokedSessionCount: 1 });
63
+ const revoked = await repository.revokeBan({
64
+ actorUserId: admin.user.id,
65
+ targetUserId: member.user.id,
66
+ reason: "Appeal accepted",
67
+ });
68
+ expect(revoked).toMatchObject({ status: "revoked", revokeReason: "Appeal accepted" });
69
+ await expect(database.createSession(member.account.id, new Date(Date.now() + 60_000), {})).resolves.toMatchObject({ accountId: member.account.id });
70
+ const history = await repository.listBans({
71
+ actorUserId: admin.user.id,
72
+ targetUserId: member.user.id,
73
+ limit: 20,
74
+ });
75
+ expect(history.items).toHaveLength(1);
76
+ });
77
+ it("expires elapsed bans idempotently and records a system audit entry", async () => {
78
+ await repository.applyBan({
79
+ actorUserId: admin.user.id,
80
+ targetUserId: member.user.id,
81
+ expiresAt: new Date(Date.now() + 3_600_000).toISOString(),
82
+ });
83
+ await raw.execute({
84
+ sql: `UPDATE accounts SET ban_expires_at = ? WHERE id = ?`,
85
+ args: [new Date(Date.now() - 1_000).toISOString(), member.account.id],
86
+ });
87
+ await raw.execute({
88
+ sql: `UPDATE account_bans SET expires_at = ? WHERE account_id = ?`,
89
+ args: [new Date(Date.now() - 1_000).toISOString(), member.account.id],
90
+ });
91
+ await expect(repository.expireDueBans()).resolves.toBe(1);
92
+ await expect(repository.expireDueBans()).resolves.toBe(0);
93
+ await expect(database.createSession(member.account.id, new Date(Date.now() + 60_000), {})).resolves.toBeDefined();
94
+ const audit = await repository.listAuditLog({
95
+ actorUserId: admin.user.id,
96
+ action: "user.ban_expired",
97
+ limit: 10,
98
+ });
99
+ expect(audit.items).toHaveLength(1);
100
+ expect(audit.items[0]).toMatchObject({ actorUserId: undefined, targetId: member.user.id });
101
+ });
102
+ it("accepts privacy-checked reports and durably resolves them with moderation actions", async () => {
103
+ const report = await repository.createReport({
104
+ actorUserId: member.user.id,
105
+ targetUserId: admin.user.id,
106
+ reason: "Inappropriate profile content",
107
+ details: "Please review the title.",
108
+ });
109
+ expect(report).toMatchObject({ status: "open", reportedByUserId: member.user.id });
110
+ await expect(repository.listReports({ actorUserId: member.user.id, limit: 20 })).rejects.toMatchObject({ code: "forbidden" });
111
+ const reviewing = await repository.updateReport({
112
+ actorUserId: admin.user.id,
113
+ reportId: report.id,
114
+ status: "reviewing",
115
+ assignedToUserId: admin.user.id,
116
+ });
117
+ expect(reviewing).toMatchObject({ status: "reviewing", assignedToUserId: admin.user.id });
118
+ const acted = await repository.takeModerationAction({
119
+ actorUserId: admin.user.id,
120
+ reportId: report.id,
121
+ action: "warn",
122
+ reason: "Content policy reminder sent",
123
+ metadata: { template: "profile-content-v1" },
124
+ });
125
+ expect(acted.report).toMatchObject({ status: "resolved" });
126
+ expect(acted.action).toMatchObject({
127
+ action: "warn",
128
+ metadata: { template: "profile-content-v1" },
129
+ });
130
+ expect(acted.sync).toMatchObject({ areas: ["notifications"] });
131
+ expect((await raw.execute({
132
+ sql: `SELECT kind, user_id, sync_sequence FROM notifications
133
+ WHERE user_id = ? ORDER BY created_at`,
134
+ args: [admin.user.id],
135
+ })).rows).toMatchObject([{ kind: "moderation", user_id: admin.user.id }]);
136
+ const restrictionReport = await repository.createReport({
137
+ actorUserId: admin.user.id,
138
+ targetUserId: member.user.id,
139
+ reason: "Repeated disruptive posting",
140
+ });
141
+ const restriction = await repository.takeModerationAction({
142
+ actorUserId: admin.user.id,
143
+ reportId: restrictionReport.id,
144
+ action: "restrict",
145
+ reason: "Posting paused pending review",
146
+ expiresAt: new Date(Date.now() + 3_600_000).toISOString(),
147
+ });
148
+ expect(restriction.action).toMatchObject({
149
+ action: "restrict",
150
+ targetUserId: member.user.id,
151
+ });
152
+ const revokedRestriction = await repository.revokeModerationAction({
153
+ actorUserId: admin.user.id,
154
+ actionId: restriction.action.id,
155
+ reason: "Review completed",
156
+ });
157
+ expect(revokedRestriction.action.revokedAt).toEqual(expect.any(String));
158
+ expect(revokedRestriction.sync).toMatchObject({ areas: ["notifications"] });
159
+ expect((await raw.execute({
160
+ sql: `SELECT count(*) AS count FROM notifications WHERE user_id = ? AND kind = 'moderation'`,
161
+ args: [member.user.id],
162
+ })).rows[0]?.count).toBe(2);
163
+ await expect(repository.revokeModerationAction({
164
+ actorUserId: admin.user.id,
165
+ actionId: restriction.action.id,
166
+ })).rejects.toMatchObject({ code: "conflict" });
167
+ const queue = await repository.listReports({
168
+ actorUserId: admin.user.id,
169
+ status: "resolved",
170
+ limit: 20,
171
+ });
172
+ expect(queue.items.map((item) => item.id)).toContain(report.id);
173
+ });
174
+ it("redacts moderated messages and quarantines files while advancing durable chat sync", async () => {
175
+ const chatId = await createChat(raw, admin.user.id, member.user.id, admin.user.id);
176
+ const removedMessageId = createId();
177
+ const attachmentMessageId = createId();
178
+ await raw.batch([
179
+ {
180
+ sql: `INSERT INTO messages
181
+ (id, chat_id, sequence, change_pts, sender_user_id, text, content_json)
182
+ VALUES (?, ?, 1, 1, ?, 'searchable abuse', '{"kind":"text"}')`,
183
+ args: [removedMessageId, chatId, member.user.id],
184
+ },
185
+ {
186
+ sql: `INSERT INTO messages
187
+ (id, chat_id, sequence, change_pts, sender_user_id, text)
188
+ VALUES (?, ?, 2, 2, ?, 'file attachment')`,
189
+ args: [attachmentMessageId, chatId, member.user.id],
190
+ },
191
+ {
192
+ sql: `INSERT INTO message_search_documents
193
+ (message_id, chat_id, normalized_text, normalized_length, gram_count,
194
+ indexed_revision, message_created_at)
195
+ VALUES (?, ?, 'searchable abuse', 16, 14, 1, CURRENT_TIMESTAMP)`,
196
+ args: [removedMessageId, chatId],
197
+ },
198
+ {
199
+ sql: `INSERT INTO message_search_ngrams (gram, message_id) VALUES ('abu', ?)`,
200
+ args: [removedMessageId],
201
+ },
202
+ {
203
+ sql: `INSERT INTO message_revisions
204
+ (id, message_id, revision, text, content_json, edited_by_user_id)
205
+ VALUES (?, ?, 1, 'searchable abuse', '{"kind":"text"}', ?)`,
206
+ args: [createId(), removedMessageId, member.user.id],
207
+ },
208
+ {
209
+ sql: `UPDATE chats SET pts = 2, last_message_sequence = 2,
210
+ last_change_sequence = 2 WHERE id = ?`,
211
+ args: [chatId],
212
+ },
213
+ ]);
214
+ const messageReport = await repository.createReport({
215
+ actorUserId: admin.user.id,
216
+ chatId,
217
+ messageId: removedMessageId,
218
+ reason: "Abusive message",
219
+ });
220
+ const removedMessage = await repository.takeModerationAction({
221
+ actorUserId: admin.user.id,
222
+ reportId: messageReport.id,
223
+ action: "remove_message",
224
+ reason: "Policy violation",
225
+ });
226
+ expect(removedMessage.action).toMatchObject({
227
+ action: "remove_message",
228
+ chatId,
229
+ messageId: removedMessageId,
230
+ });
231
+ expect(removedMessage.sync?.chats).toEqual([{ chatId, pts: "3" }]);
232
+ const messageRow = (await raw.execute({
233
+ sql: `SELECT text, content_json, deleted_at, deleted_by_user_id, delete_reason,
234
+ change_pts FROM messages WHERE id = ?`,
235
+ args: [removedMessageId],
236
+ })).rows[0];
237
+ expect(messageRow).toMatchObject({
238
+ text: "",
239
+ content_json: null,
240
+ deleted_by_user_id: admin.user.id,
241
+ delete_reason: "Policy violation",
242
+ change_pts: 3,
243
+ });
244
+ expect(messageRow.deleted_at).toEqual(expect.any(String));
245
+ expect((await raw.execute({
246
+ sql: `SELECT count(*) AS count FROM message_search_documents WHERE message_id = ?`,
247
+ args: [removedMessageId],
248
+ })).rows[0]?.count).toBe(0);
249
+ expect((await raw.execute({
250
+ sql: `SELECT count(*) AS count FROM message_revisions WHERE message_id = ?`,
251
+ args: [removedMessageId],
252
+ })).rows[0]?.count).toBe(0);
253
+ const file = {
254
+ id: createId(),
255
+ userId: member.user.id,
256
+ uploadedByUserId: member.user.id,
257
+ isPublic: true,
258
+ storageName: "reported-file.bin",
259
+ contentType: "application/octet-stream",
260
+ size: 64,
261
+ width: 0,
262
+ height: 0,
263
+ thumbhash: "",
264
+ kind: "file",
265
+ };
266
+ await database.createFile(file);
267
+ await raw.batch([
268
+ {
269
+ sql: `INSERT INTO message_attachments (message_id, file_id, position)
270
+ VALUES (?, ?, 0)`,
271
+ args: [attachmentMessageId, file.id],
272
+ },
273
+ {
274
+ sql: `INSERT INTO file_access_grants
275
+ (id, file_id, principal_type, principal_id, granted_by_user_id)
276
+ VALUES (?, ?, 'chat', ?, ?)`,
277
+ args: [createId(), file.id, chatId, admin.user.id],
278
+ },
279
+ ]);
280
+ const fileReport = await repository.createReport({
281
+ actorUserId: admin.user.id,
282
+ chatId,
283
+ fileId: file.id,
284
+ reason: "Unsafe attachment",
285
+ });
286
+ const removedFile = await repository.takeModerationAction({
287
+ actorUserId: admin.user.id,
288
+ reportId: fileReport.id,
289
+ action: "remove_file",
290
+ reason: "Quarantined by moderation",
291
+ });
292
+ expect(removedFile.action).toMatchObject({ action: "remove_file", fileId: file.id });
293
+ expect(removedFile.sync).toMatchObject({
294
+ chats: [{ chatId, pts: "4" }],
295
+ areas: ["files"],
296
+ });
297
+ expect((await raw.execute({
298
+ sql: `SELECT deleted_at, deleted_by_user_id, delete_reason, access_scope,
299
+ is_public, orphaned_at FROM files WHERE id = ?`,
300
+ args: [file.id],
301
+ })).rows[0]).toMatchObject({
302
+ deleted_by_user_id: admin.user.id,
303
+ delete_reason: "Quarantined by moderation",
304
+ access_scope: "private",
305
+ is_public: 0,
306
+ deleted_at: expect.any(String),
307
+ orphaned_at: expect.any(String),
308
+ });
309
+ expect((await raw.execute({
310
+ sql: `SELECT count(*) AS count FROM file_access_grants WHERE file_id = ?`,
311
+ args: [file.id],
312
+ })).rows[0]?.count).toBe(0);
313
+ });
314
+ it("recomputes thread projections when moderation removes a reply", async () => {
315
+ const chatId = await createChat(raw, admin.user.id, member.user.id, admin.user.id);
316
+ const rootMessageId = createId();
317
+ const survivingReplyId = createId();
318
+ const removedReplyId = createId();
319
+ await raw.batch([
320
+ {
321
+ sql: `INSERT INTO messages
322
+ (id, chat_id, sequence, change_pts, sender_user_id, text)
323
+ VALUES (?, ?, 1, 1, ?, 'thread root')`,
324
+ args: [rootMessageId, chatId, admin.user.id],
325
+ },
326
+ {
327
+ sql: `INSERT INTO messages
328
+ (id, chat_id, sequence, change_pts, sender_user_id, text,
329
+ thread_root_message_id)
330
+ VALUES (?, ?, 2, 2, ?, 'surviving reply', ?)`,
331
+ args: [survivingReplyId, chatId, admin.user.id, rootMessageId],
332
+ },
333
+ {
334
+ sql: `INSERT INTO messages
335
+ (id, chat_id, sequence, change_pts, sender_user_id, text,
336
+ thread_root_message_id)
337
+ VALUES (?, ?, 3, 3, ?, 'removed reply', ?)`,
338
+ args: [removedReplyId, chatId, member.user.id, rootMessageId],
339
+ },
340
+ {
341
+ sql: `INSERT INTO threads
342
+ (root_message_id, chat_id, created_by_user_id, reply_count, last_pts,
343
+ last_reply_message_id, last_reply_sequence, participant_count)
344
+ VALUES (?, ?, ?, 2, 3, ?, 3, 2)`,
345
+ args: [rootMessageId, chatId, admin.user.id, removedReplyId],
346
+ },
347
+ {
348
+ sql: `INSERT INTO thread_participants
349
+ (thread_root_message_id, user_id, reply_count)
350
+ VALUES (?, ?, 1), (?, ?, 1)`,
351
+ args: [rootMessageId, admin.user.id, rootMessageId, member.user.id],
352
+ },
353
+ {
354
+ sql: `INSERT INTO thread_user_states
355
+ (thread_root_message_id, user_id, last_read_sequence, unread_count,
356
+ mention_count)
357
+ VALUES (?, ?, 0, 1, 1), (?, ?, 0, 1, 0)`,
358
+ args: [rootMessageId, admin.user.id, rootMessageId, member.user.id],
359
+ },
360
+ {
361
+ sql: `INSERT INTO message_mentions
362
+ (id, message_id, kind, mentioned_user_id, start_offset, length, raw_text)
363
+ VALUES (?, ?, 'user', ?, 0, 6, '@admin')`,
364
+ args: [createId(), removedReplyId, admin.user.id],
365
+ },
366
+ {
367
+ sql: `UPDATE chats SET pts = 3, last_message_sequence = 3,
368
+ last_change_sequence = 3 WHERE id = ?`,
369
+ args: [chatId],
370
+ },
371
+ ]);
372
+ const report = await repository.createReport({
373
+ actorUserId: admin.user.id,
374
+ chatId,
375
+ messageId: removedReplyId,
376
+ reason: "Thread reply violates policy",
377
+ });
378
+ const removed = await repository.takeModerationAction({
379
+ actorUserId: admin.user.id,
380
+ reportId: report.id,
381
+ action: "remove_message",
382
+ });
383
+ expect(removed.sync?.chats).toEqual([{ chatId, pts: "4" }]);
384
+ expect((await raw.execute({
385
+ sql: `SELECT reply_count, participant_count, last_reply_message_id,
386
+ last_reply_sequence, last_pts
387
+ FROM threads WHERE root_message_id = ?`,
388
+ args: [rootMessageId],
389
+ })).rows[0]).toMatchObject({
390
+ reply_count: 1,
391
+ participant_count: 1,
392
+ last_reply_message_id: survivingReplyId,
393
+ last_reply_sequence: 2,
394
+ last_pts: 4,
395
+ });
396
+ expect((await raw.execute({
397
+ sql: `SELECT user_id, reply_count FROM thread_participants
398
+ WHERE thread_root_message_id = ?`,
399
+ args: [rootMessageId],
400
+ })).rows).toEqual([{ user_id: admin.user.id, reply_count: 1 }]);
401
+ expect((await raw.execute({
402
+ sql: `SELECT unread_count, mention_count FROM thread_user_states
403
+ WHERE thread_root_message_id = ? AND user_id = ?`,
404
+ args: [rootMessageId, admin.user.id],
405
+ })).rows[0]).toMatchObject({ unread_count: 0, mention_count: 0 });
406
+ expect((await raw.execute({
407
+ sql: `SELECT change_pts FROM messages WHERE id = ?`,
408
+ args: [rootMessageId],
409
+ })).rows[0]?.change_pts).toBe(4);
410
+ });
411
+ it("deletes users by revoking sessions, anonymizing identity, and transferring ownership", async () => {
412
+ const chatId = await createChat(raw, admin.user.id, member.user.id, member.user.id);
413
+ const session = await database.createSession(member.account.id, new Date(Date.now() + 60_000), {});
414
+ const report = await repository.createReport({
415
+ actorUserId: admin.user.id,
416
+ targetUserId: member.user.id,
417
+ reason: "Account removal required",
418
+ });
419
+ const deleted = await repository.takeModerationAction({
420
+ actorUserId: admin.user.id,
421
+ reportId: report.id,
422
+ action: "delete_user",
423
+ reason: "Confirmed abusive account",
424
+ });
425
+ expect(deleted.action).toMatchObject({
426
+ action: "delete_user",
427
+ targetUserId: member.user.id,
428
+ });
429
+ expect(deleted.sync).toMatchObject({
430
+ chats: [{ chatId, pts: "1" }],
431
+ areas: ["users"],
432
+ });
433
+ expect(await database.findActiveSession(session.id)).toBeUndefined();
434
+ expect((await raw.execute({
435
+ sql: `SELECT active, deleted_at, password_hash, email FROM accounts WHERE id = ?`,
436
+ args: [member.account.id],
437
+ })).rows[0]).toMatchObject({
438
+ active: 0,
439
+ password_hash: null,
440
+ deleted_at: expect.any(String),
441
+ email: `deleted+${member.account.id}@invalid.local`,
442
+ });
443
+ expect((await raw.execute({
444
+ sql: `SELECT first_name, username, email, deleted_at FROM users WHERE id = ?`,
445
+ args: [member.user.id],
446
+ })).rows[0]).toMatchObject({
447
+ first_name: "Deleted",
448
+ username: `deleted_${member.user.id}`,
449
+ email: null,
450
+ deleted_at: expect.any(String),
451
+ });
452
+ expect((await raw.execute({
453
+ sql: `SELECT c.owner_user_id, cm.role
454
+ FROM chats c JOIN chat_members cm
455
+ ON cm.chat_id = c.id AND cm.user_id = ?
456
+ WHERE c.id = ?`,
457
+ args: [admin.user.id, chatId],
458
+ })).rows[0]).toMatchObject({ owner_user_id: admin.user.id, role: "owner" });
459
+ });
460
+ it("manages safe export artifacts, backup records, retention runs, and paged audit history", async () => {
461
+ const requested = await repository.requestDataExport({
462
+ actorUserId: member.user.id,
463
+ kind: "user_data",
464
+ options: { includeFiles: true },
465
+ });
466
+ expect(requested).toMatchObject({
467
+ kind: "user_data",
468
+ targetId: member.user.id,
469
+ status: "pending",
470
+ });
471
+ await repository.updateDataExport({
472
+ actorUserId: admin.user.id,
473
+ jobId: requested.id,
474
+ status: "running",
475
+ });
476
+ const output = {
477
+ id: "export-artifact",
478
+ userId: admin.user.id,
479
+ uploadedByUserId: admin.user.id,
480
+ isPublic: false,
481
+ storageName: "export-artifact.zip",
482
+ contentType: "application/zip",
483
+ size: 512,
484
+ width: 0,
485
+ height: 0,
486
+ thumbhash: "",
487
+ kind: "file",
488
+ originalName: "happy2-export.zip",
489
+ };
490
+ await database.createFile(output);
491
+ const complete = await repository.updateDataExport({
492
+ actorUserId: admin.user.id,
493
+ jobId: requested.id,
494
+ status: "complete",
495
+ outputFileId: output.id,
496
+ expiresAt: new Date(Date.now() + 86_400_000).toISOString(),
497
+ });
498
+ expect(complete).toMatchObject({ status: "complete", outputFileId: output.id });
499
+ expect(complete).not.toHaveProperty("storageKey");
500
+ const artifactGrant = await raw.execute({
501
+ sql: `SELECT principal_id, expires_at FROM file_access_grants
502
+ WHERE file_id = ? AND principal_type = 'user'`,
503
+ args: [output.id],
504
+ });
505
+ expect(artifactGrant.rows[0]?.principal_id).toBe(member.user.id);
506
+ expect(artifactGrant.rows[0]?.expires_at).toBe(complete.expiresAt);
507
+ const backup = await repository.createBackup({
508
+ actorUserId: admin.user.id,
509
+ storageProvider: "local",
510
+ storageKey: "backups/server-2026-07-12.db",
511
+ metadata: { encrypted: true },
512
+ });
513
+ await repository.updateBackup({
514
+ actorUserId: admin.user.id,
515
+ backupId: backup.id,
516
+ status: "running",
517
+ });
518
+ const completedBackup = await repository.updateBackup({
519
+ actorUserId: admin.user.id,
520
+ backupId: backup.id,
521
+ status: "complete",
522
+ checksumSha256: "a".repeat(64),
523
+ size: 1_024,
524
+ });
525
+ expect(completedBackup).toMatchObject({ status: "complete", size: 1_024 });
526
+ const run = await repository.startRetentionRun({
527
+ actorUserId: admin.user.id,
528
+ scope: "audit",
529
+ details: { cutoffDays: 365 },
530
+ });
531
+ const finished = await repository.finishRetentionRun({
532
+ actorUserId: admin.user.id,
533
+ runId: run.id,
534
+ status: "complete",
535
+ itemsExamined: 80,
536
+ itemsDeleted: 12,
537
+ });
538
+ expect(finished).toMatchObject({ status: "complete", itemsExamined: 80, itemsDeleted: 12 });
539
+ const firstPage = await repository.listAuditLog({ actorUserId: admin.user.id, limit: 2 });
540
+ expect(firstPage.items).toHaveLength(2);
541
+ expect(firstPage.nextCursor).toEqual(expect.any(String));
542
+ const secondPage = await repository.listAuditLog({
543
+ actorUserId: admin.user.id,
544
+ before: firstPage.nextCursor,
545
+ limit: 2,
546
+ });
547
+ expect(secondPage.items).toHaveLength(2);
548
+ expect(secondPage.items.map((item) => item.id)).not.toEqual(firstPage.items.map((item) => item.id));
549
+ });
550
+ it("keeps access telemetry admin-only", async () => {
551
+ await database.createSession(member.account.id, new Date(Date.now() + 60_000), {
552
+ ip: "192.0.2.44",
553
+ device: "MacBookPro",
554
+ appVersion: "4.0.0",
555
+ userAgent: "happy2/4.0.0",
556
+ });
557
+ await expect(repository.listUserAccess({ actorUserId: member.user.id, limit: 20 })).rejects.toMatchObject({ code: "forbidden" });
558
+ const telemetry = await repository.listUserAccess({
559
+ actorUserId: admin.user.id,
560
+ limit: 20,
561
+ });
562
+ expect(telemetry.items.find((item) => item.userId === member.user.id)).toMatchObject({
563
+ email: "member@example.com",
564
+ activeSessionCount: 1,
565
+ lastClientIp: "192.0.2.44",
566
+ lastDevice: "MacBookPro",
567
+ });
568
+ const firstPage = await repository.listUserAccess({
569
+ actorUserId: admin.user.id,
570
+ limit: 1,
571
+ });
572
+ expect(firstPage.nextCursor).toEqual(expect.any(String));
573
+ const secondPage = await repository.listUserAccess({
574
+ actorUserId: admin.user.id,
575
+ before: firstPage.nextCursor,
576
+ limit: 1,
577
+ });
578
+ expect(secondPage.items).toHaveLength(1);
579
+ expect(secondPage.items[0]?.userId).not.toBe(firstPage.items[0]?.userId);
580
+ });
581
+ it("does not close a shared extension client", async () => {
582
+ const sharedRepository = new OperationsRepository(raw);
583
+ sharedRepository.close();
584
+ await expect(raw.execute("SELECT 1 AS alive")).resolves.toMatchObject({
585
+ rows: [{ alive: 1 }],
586
+ });
587
+ });
588
+ });
589
+ async function createChat(client, adminUserId, memberUserId, ownerUserId) {
590
+ const chatId = createId();
591
+ await client.execute({
592
+ sql: `INSERT INTO chats
593
+ (id, kind, name, slug, created_by_user_id, owner_user_id, visibility)
594
+ VALUES (?, 'private_channel', 'Moderation', ?, ?, ?, 'private')`,
595
+ args: [chatId, `moderation-${chatId}`, adminUserId, ownerUserId],
596
+ });
597
+ for (const userId of [adminUserId, memberUserId])
598
+ await client.execute({
599
+ sql: `INSERT INTO chat_members (chat_id, user_id, role, membership_epoch)
600
+ VALUES (?, ?, ?, ?)`,
601
+ args: [chatId, userId, userId === ownerUserId ? "owner" : "member", createId()],
602
+ });
603
+ return chatId;
604
+ }
605
+ async function createUser(database, email, username, firstName) {
606
+ const account = await database.createPasswordAccount(email, "not-used-in-this-test");
607
+ const user = await database.createProfile(account.id, { firstName, username, email });
608
+ return { account, user };
609
+ }
610
+ //# sourceMappingURL=repository.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.test.js","sourceRoot":"","sources":["../../../sources/modules/operations/repository.test.ts"],"names":[],"mappings":"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"}