@hilbras/keystone 1.6.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (604) hide show
  1. package/CHANGELOG.md +625 -0
  2. package/README.md +198 -50
  3. package/dist/cli.js +25 -27
  4. package/dist/cli.js.map +1 -1
  5. package/dist/config.d.ts +23 -1
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +53 -8
  8. package/dist/config.js.map +1 -1
  9. package/dist/container.d.ts +4 -1
  10. package/dist/container.d.ts.map +1 -1
  11. package/dist/container.js.map +1 -1
  12. package/dist/db/migrations/0008_flashy_firestar.sql +5 -0
  13. package/dist/db/migrations/0009_daffy_changeling.sql +1 -0
  14. package/dist/db/migrations/0010_wealthy_shadow_king.sql +37 -0
  15. package/dist/db/migrations/0011_overrated_vector.sql +18 -0
  16. package/dist/db/migrations/0012_brave_darkhawk.sql +28 -0
  17. package/dist/db/migrations/0013_wonderful_chimera.sql +5 -0
  18. package/dist/db/migrations/0014_magical_morph.sql +48 -0
  19. package/dist/db/migrations/0015_chief_vargas.sql +7 -0
  20. package/dist/db/migrations/0016_gorgeous_charles_xavier.sql +5 -0
  21. package/dist/db/migrations/0017_flashy_nekra.sql +1 -0
  22. package/{src/db/migrations/meta/0007_snapshot.json → dist/db/migrations/meta/0008_snapshot.json} +136 -32
  23. package/{src/db/migrations/meta/0006_snapshot.json → dist/db/migrations/meta/0009_snapshot.json} +359 -30
  24. package/{src/db/migrations/meta/0005_snapshot.json → dist/db/migrations/meta/0010_snapshot.json} +459 -29
  25. package/{src/db/migrations/meta/0004_snapshot.json → dist/db/migrations/meta/0011_snapshot.json} +594 -30
  26. package/dist/db/migrations/meta/0012_snapshot.json +3891 -0
  27. package/dist/db/migrations/meta/0013_snapshot.json +3919 -0
  28. package/dist/db/migrations/meta/0014_snapshot.json +4311 -0
  29. package/dist/db/migrations/meta/0015_snapshot.json +4340 -0
  30. package/dist/db/migrations/meta/0016_snapshot.json +4363 -0
  31. package/dist/db/migrations/meta/0017_snapshot.json +4370 -0
  32. package/dist/db/migrations/meta/_journal.json +70 -0
  33. package/dist/db/reencryptOidcSecrets.d.ts +2 -0
  34. package/dist/db/reencryptOidcSecrets.d.ts.map +1 -0
  35. package/dist/db/reencryptOidcSecrets.js +41 -0
  36. package/dist/db/reencryptOidcSecrets.js.map +1 -0
  37. package/dist/db/schema.d.ts +2693 -88
  38. package/dist/db/schema.d.ts.map +1 -1
  39. package/dist/db/schema.js +157 -4
  40. package/dist/db/schema.js.map +1 -1
  41. package/dist/db/seed.js +67 -40
  42. package/dist/db/seed.js.map +1 -1
  43. package/dist/di.d.ts.map +1 -1
  44. package/dist/di.js +11 -3
  45. package/dist/di.js.map +1 -1
  46. package/dist/index.d.ts +2 -2
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +34 -3
  49. package/dist/index.js.map +1 -1
  50. package/dist/lib/errors.d.ts +2 -1
  51. package/dist/lib/errors.d.ts.map +1 -1
  52. package/dist/lib/errors.js +10 -0
  53. package/dist/lib/errors.js.map +1 -1
  54. package/dist/plugins/appContext.d.ts.map +1 -1
  55. package/dist/plugins/appContext.js +3 -12
  56. package/dist/plugins/appContext.js.map +1 -1
  57. package/dist/plugins/audit.d.ts.map +1 -1
  58. package/dist/plugins/audit.js +26 -6
  59. package/dist/plugins/audit.js.map +1 -1
  60. package/dist/plugins/auth.d.ts.map +1 -1
  61. package/dist/plugins/auth.js +32 -7
  62. package/dist/plugins/auth.js.map +1 -1
  63. package/dist/plugins/headerSanitization.d.ts +15 -0
  64. package/dist/plugins/headerSanitization.d.ts.map +1 -0
  65. package/dist/plugins/headerSanitization.js +39 -0
  66. package/dist/plugins/headerSanitization.js.map +1 -0
  67. package/dist/plugins/metrics.d.ts.map +1 -1
  68. package/dist/plugins/mtls.d.ts +21 -2
  69. package/dist/plugins/mtls.d.ts.map +1 -1
  70. package/dist/plugins/mtls.js +94 -47
  71. package/dist/plugins/mtls.js.map +1 -1
  72. package/dist/plugins/permissions.d.ts.map +1 -1
  73. package/dist/plugins/permissions.js +29 -9
  74. package/dist/plugins/permissions.js.map +1 -1
  75. package/dist/plugins/rateLimit.d.ts +16 -0
  76. package/dist/plugins/rateLimit.d.ts.map +1 -1
  77. package/dist/plugins/rateLimit.js +16 -3
  78. package/dist/plugins/rateLimit.js.map +1 -1
  79. package/dist/plugins/requestLogger.d.ts.map +1 -1
  80. package/dist/repositories/apiKey.d.ts.map +1 -1
  81. package/dist/repositories/application.d.ts +1 -1
  82. package/dist/repositories/application.d.ts.map +1 -1
  83. package/dist/repositories/application.js +9 -3
  84. package/dist/repositories/application.js.map +1 -1
  85. package/dist/repositories/audit.d.ts.map +1 -1
  86. package/dist/repositories/index.d.ts +3 -0
  87. package/dist/repositories/index.d.ts.map +1 -1
  88. package/dist/repositories/index.js +3 -0
  89. package/dist/repositories/index.js.map +1 -1
  90. package/dist/repositories/mfaChallenge.d.ts +23 -0
  91. package/dist/repositories/mfaChallenge.d.ts.map +1 -0
  92. package/dist/repositories/mfaChallenge.js +71 -0
  93. package/dist/repositories/mfaChallenge.js.map +1 -0
  94. package/dist/repositories/oidcConnection.d.ts +27 -43
  95. package/dist/repositories/oidcConnection.d.ts.map +1 -1
  96. package/dist/repositories/oidcConnection.js +15 -6
  97. package/dist/repositories/oidcConnection.js.map +1 -1
  98. package/dist/repositories/organization.d.ts +9 -9
  99. package/dist/repositories/organization.d.ts.map +1 -1
  100. package/dist/repositories/organization.js +91 -37
  101. package/dist/repositories/organization.js.map +1 -1
  102. package/dist/repositories/permission.d.ts.map +1 -1
  103. package/dist/repositories/permission.js +27 -5
  104. package/dist/repositories/permission.js.map +1 -1
  105. package/dist/repositories/samlConnection.d.ts +28 -28
  106. package/dist/repositories/samlConnection.d.ts.map +1 -1
  107. package/dist/repositories/samlConnection.js +12 -4
  108. package/dist/repositories/samlConnection.js.map +1 -1
  109. package/dist/repositories/scimConnection.d.ts +38 -0
  110. package/dist/repositories/scimConnection.d.ts.map +1 -0
  111. package/dist/repositories/scimConnection.js +123 -0
  112. package/dist/repositories/scimConnection.js.map +1 -0
  113. package/dist/repositories/scimGroup.d.ts +36 -0
  114. package/dist/repositories/scimGroup.d.ts.map +1 -0
  115. package/dist/repositories/scimGroup.js +113 -0
  116. package/dist/repositories/scimGroup.js.map +1 -0
  117. package/dist/repositories/session.d.ts +24 -13
  118. package/dist/repositories/session.d.ts.map +1 -1
  119. package/dist/repositories/session.js +13 -1
  120. package/dist/repositories/session.js.map +1 -1
  121. package/dist/repositories/types.d.ts +117 -6
  122. package/dist/repositories/types.d.ts.map +1 -1
  123. package/dist/repositories/types.js +7 -1
  124. package/dist/repositories/types.js.map +1 -1
  125. package/dist/repositories/user.d.ts +23 -1
  126. package/dist/repositories/user.d.ts.map +1 -1
  127. package/dist/repositories/user.js +180 -4
  128. package/dist/repositories/user.js.map +1 -1
  129. package/dist/routes/admin/billing.js +4 -4
  130. package/dist/routes/admin/billing.js.map +1 -1
  131. package/dist/routes/admin/helpers.d.ts +16 -20
  132. package/dist/routes/admin/helpers.d.ts.map +1 -1
  133. package/dist/routes/admin/helpers.js +53 -10
  134. package/dist/routes/admin/helpers.js.map +1 -1
  135. package/dist/routes/admin/organizations.d.ts.map +1 -1
  136. package/dist/routes/admin/organizations.js +105 -69
  137. package/dist/routes/admin/organizations.js.map +1 -1
  138. package/dist/routes/admin/permissions.d.ts.map +1 -1
  139. package/dist/routes/admin/permissions.js +48 -14
  140. package/dist/routes/admin/permissions.js.map +1 -1
  141. package/dist/routes/admin/platform.d.ts.map +1 -1
  142. package/dist/routes/admin/platform.js +86 -35
  143. package/dist/routes/admin/platform.js.map +1 -1
  144. package/dist/routes/admin/sso.d.ts.map +1 -1
  145. package/dist/routes/admin/sso.js +143 -12
  146. package/dist/routes/admin/sso.js.map +1 -1
  147. package/dist/routes/admin/webhooks.js +8 -8
  148. package/dist/routes/admin/webhooks.js.map +1 -1
  149. package/dist/routes/apiKeys.d.ts.map +1 -1
  150. package/dist/routes/apiKeys.js +23 -5
  151. package/dist/routes/apiKeys.js.map +1 -1
  152. package/dist/routes/auth.d.ts.map +1 -1
  153. package/dist/routes/auth.js +112 -22
  154. package/dist/routes/auth.js.map +1 -1
  155. package/dist/routes/authz.d.ts.map +1 -1
  156. package/dist/routes/authz.js +16 -4
  157. package/dist/routes/authz.js.map +1 -1
  158. package/dist/routes/config.d.ts.map +1 -1
  159. package/dist/routes/config.js +16 -14
  160. package/dist/routes/config.js.map +1 -1
  161. package/dist/routes/federation.d.ts.map +1 -1
  162. package/dist/routes/federation.js +17 -3
  163. package/dist/routes/federation.js.map +1 -1
  164. package/dist/routes/magicLinks.d.ts.map +1 -1
  165. package/dist/routes/magicLinks.js +15 -3
  166. package/dist/routes/magicLinks.js.map +1 -1
  167. package/dist/routes/oauth.d.ts.map +1 -1
  168. package/dist/routes/oauth.js +60 -5
  169. package/dist/routes/oauth.js.map +1 -1
  170. package/dist/routes/oauth2.d.ts.map +1 -1
  171. package/dist/routes/oauth2.js +188 -22
  172. package/dist/routes/oauth2.js.map +1 -1
  173. package/dist/routes/oidcEnterprise.d.ts.map +1 -1
  174. package/dist/routes/oidcEnterprise.js +67 -21
  175. package/dist/routes/oidcEnterprise.js.map +1 -1
  176. package/dist/routes/password.d.ts.map +1 -1
  177. package/dist/routes/password.js.map +1 -1
  178. package/dist/routes/profile.js +4 -4
  179. package/dist/routes/profile.js.map +1 -1
  180. package/dist/routes/saml.d.ts +33 -0
  181. package/dist/routes/saml.d.ts.map +1 -1
  182. package/dist/routes/saml.js +217 -12
  183. package/dist/routes/saml.js.map +1 -1
  184. package/dist/routes/scim.d.ts +13 -0
  185. package/dist/routes/scim.d.ts.map +1 -1
  186. package/dist/routes/scim.js +885 -110
  187. package/dist/routes/scim.js.map +1 -1
  188. package/dist/routes/sdk.d.ts.map +1 -1
  189. package/dist/routes/sdk.js +24 -8
  190. package/dist/routes/sdk.js.map +1 -1
  191. package/dist/routes/serviceAccounts.d.ts.map +1 -1
  192. package/dist/routes/serviceAccounts.js +63 -2
  193. package/dist/routes/serviceAccounts.js.map +1 -1
  194. package/dist/routes/setup.d.ts.map +1 -1
  195. package/dist/routes/setup.js +15 -16
  196. package/dist/routes/setup.js.map +1 -1
  197. package/dist/routes/smsOtp.js +1 -1
  198. package/dist/routes/smsOtp.js.map +1 -1
  199. package/dist/routes/totp.d.ts.map +1 -1
  200. package/dist/routes/totp.js +112 -23
  201. package/dist/routes/totp.js.map +1 -1
  202. package/dist/routes/webauthn.d.ts.map +1 -1
  203. package/dist/routes/webauthn.js +44 -8
  204. package/dist/routes/webauthn.js.map +1 -1
  205. package/dist/routes/workflows.d.ts.map +1 -1
  206. package/dist/routes/workflows.js +58 -25
  207. package/dist/routes/workflows.js.map +1 -1
  208. package/dist/sdk/index.d.ts.map +1 -1
  209. package/dist/sdk/index.js +141 -40
  210. package/dist/sdk/index.js.map +1 -1
  211. package/dist/sdk/types.d.ts +64 -30
  212. package/dist/sdk/types.d.ts.map +1 -1
  213. package/dist/services/application/authentication.d.ts +39 -1
  214. package/dist/services/application/authentication.d.ts.map +1 -1
  215. package/dist/services/application/authentication.js +43 -1
  216. package/dist/services/application/authentication.js.map +1 -1
  217. package/dist/services/application/identity.d.ts +10 -7
  218. package/dist/services/application/identity.d.ts.map +1 -1
  219. package/dist/services/application/identity.js +13 -10
  220. package/dist/services/application/identity.js.map +1 -1
  221. package/dist/services/application/organization.d.ts +16 -8
  222. package/dist/services/application/organization.d.ts.map +1 -1
  223. package/dist/services/application/organization.js +160 -12
  224. package/dist/services/application/organization.js.map +1 -1
  225. package/dist/services/applications.js +2 -2
  226. package/dist/services/applications.js.map +1 -1
  227. package/dist/services/audit.d.ts +1 -0
  228. package/dist/services/audit.d.ts.map +1 -1
  229. package/dist/services/audit.js +13 -0
  230. package/dist/services/audit.js.map +1 -1
  231. package/dist/services/cache.d.ts.map +1 -1
  232. package/dist/services/configuration/profiles.d.ts +4 -0
  233. package/dist/services/configuration/profiles.d.ts.map +1 -1
  234. package/dist/services/configuration/profiles.js +50 -0
  235. package/dist/services/configuration/profiles.js.map +1 -1
  236. package/dist/services/configuration.d.ts.map +1 -1
  237. package/dist/services/configuration.js.map +1 -1
  238. package/dist/services/connectors/google.d.ts +18 -1
  239. package/dist/services/connectors/google.d.ts.map +1 -1
  240. package/dist/services/connectors/google.js +27 -4
  241. package/dist/services/connectors/google.js.map +1 -1
  242. package/dist/services/connectors/oidc.d.ts +14 -2
  243. package/dist/services/connectors/oidc.d.ts.map +1 -1
  244. package/dist/services/connectors/oidc.js +35 -6
  245. package/dist/services/connectors/oidc.js.map +1 -1
  246. package/dist/services/connectors/types.d.ts +13 -1
  247. package/dist/services/connectors/types.d.ts.map +1 -1
  248. package/dist/services/connectors/zitadel.d.ts.map +1 -1
  249. package/dist/services/connectors/zitadel.js +4 -3
  250. package/dist/services/connectors/zitadel.js.map +1 -1
  251. package/dist/services/domain/authentication.d.ts +43 -4
  252. package/dist/services/domain/authentication.d.ts.map +1 -1
  253. package/dist/services/domain/authentication.js +119 -40
  254. package/dist/services/domain/authentication.js.map +1 -1
  255. package/dist/services/domain/authorization.d.ts +11 -0
  256. package/dist/services/domain/authorization.d.ts.map +1 -1
  257. package/dist/services/domain/authorization.js +36 -1
  258. package/dist/services/domain/authorization.js.map +1 -1
  259. package/dist/services/domain/identity.d.ts +21 -9
  260. package/dist/services/domain/identity.d.ts.map +1 -1
  261. package/dist/services/domain/identity.js +187 -10
  262. package/dist/services/domain/identity.js.map +1 -1
  263. package/dist/services/domain/organization.d.ts +11 -10
  264. package/dist/services/domain/organization.d.ts.map +1 -1
  265. package/dist/services/domain/organization.js +48 -30
  266. package/dist/services/domain/organization.js.map +1 -1
  267. package/dist/services/emailVerification.d.ts +2 -2
  268. package/dist/services/enterpriseSso.d.ts +13 -6
  269. package/dist/services/enterpriseSso.d.ts.map +1 -1
  270. package/dist/services/enterpriseSso.js +75 -6
  271. package/dist/services/enterpriseSso.js.map +1 -1
  272. package/dist/services/events/subscribers/auditLog.js +1 -1
  273. package/dist/services/events/subscribers/auditLog.js.map +1 -1
  274. package/dist/services/events/types.d.ts +7 -1
  275. package/dist/services/events/types.d.ts.map +1 -1
  276. package/dist/services/events/types.js.map +1 -1
  277. package/dist/services/events/validate.d.ts.map +1 -1
  278. package/dist/services/events/validate.js +33 -0
  279. package/dist/services/events/validate.js.map +1 -1
  280. package/dist/services/features.d.ts.map +1 -1
  281. package/dist/services/features.js.map +1 -1
  282. package/dist/services/federation.d.ts +6 -1
  283. package/dist/services/federation.d.ts.map +1 -1
  284. package/dist/services/federation.js +31 -4
  285. package/dist/services/federation.js.map +1 -1
  286. package/dist/services/ipControls.js +2 -2
  287. package/dist/services/ipControls.js.map +1 -1
  288. package/dist/services/magicLinks.d.ts +2 -2
  289. package/dist/services/magicLinks.d.ts.map +1 -1
  290. package/dist/services/magicLinks.js +13 -9
  291. package/dist/services/magicLinks.js.map +1 -1
  292. package/dist/services/mfa.d.ts +53 -0
  293. package/dist/services/mfa.d.ts.map +1 -0
  294. package/dist/services/mfa.js +157 -0
  295. package/dist/services/mfa.js.map +1 -0
  296. package/dist/services/oauth2.d.ts +88 -14
  297. package/dist/services/oauth2.d.ts.map +1 -1
  298. package/dist/services/oauth2.js +125 -16
  299. package/dist/services/oauth2.js.map +1 -1
  300. package/dist/services/oidcSecretFormat.d.ts +3 -0
  301. package/dist/services/oidcSecretFormat.d.ts.map +1 -0
  302. package/dist/services/oidcSecretFormat.js +5 -0
  303. package/dist/services/oidcSecretFormat.js.map +1 -0
  304. package/dist/services/organizations.d.ts +4 -16
  305. package/dist/services/organizations.d.ts.map +1 -1
  306. package/dist/services/organizations.js +0 -62
  307. package/dist/services/organizations.js.map +1 -1
  308. package/dist/services/permissions.d.ts.map +1 -1
  309. package/dist/services/permissions.js +9 -1
  310. package/dist/services/permissions.js.map +1 -1
  311. package/dist/services/plugins/registry.d.ts.map +1 -1
  312. package/dist/services/plugins/registry.js.map +1 -1
  313. package/dist/services/plugins/types.d.ts.map +1 -1
  314. package/dist/services/queue/bullmq.d.ts.map +1 -1
  315. package/dist/services/queue/inProcess.d.ts.map +1 -1
  316. package/dist/services/redirectUri.d.ts +56 -0
  317. package/dist/services/redirectUri.d.ts.map +1 -0
  318. package/dist/services/redirectUri.js +129 -0
  319. package/dist/services/redirectUri.js.map +1 -0
  320. package/dist/services/redis.d.ts +1 -1
  321. package/dist/services/redis.d.ts.map +1 -1
  322. package/dist/services/scimCredentials.d.ts +46 -0
  323. package/dist/services/scimCredentials.d.ts.map +1 -0
  324. package/dist/services/scimCredentials.js +123 -0
  325. package/dist/services/scimCredentials.js.map +1 -0
  326. package/dist/services/scimLegacyMigration.d.ts +12 -0
  327. package/dist/services/scimLegacyMigration.d.ts.map +1 -0
  328. package/dist/services/scimLegacyMigration.js +44 -0
  329. package/dist/services/scimLegacyMigration.js.map +1 -0
  330. package/dist/services/secrets/awsKms.d.ts +2 -2
  331. package/dist/services/secrets/awsKms.d.ts.map +1 -1
  332. package/dist/services/secrets/awsKms.js +3 -5
  333. package/dist/services/secrets/awsKms.js.map +1 -1
  334. package/dist/services/secrets/azureKeyVault.d.ts.map +1 -1
  335. package/dist/services/secrets/database.d.ts.map +1 -1
  336. package/dist/services/secrets/database.js.map +1 -1
  337. package/dist/services/secrets/environment.d.ts.map +1 -1
  338. package/dist/services/secrets/environment.js.map +1 -1
  339. package/dist/services/secrets/index.d.ts.map +1 -1
  340. package/dist/services/secrets/password.d.ts.map +1 -1
  341. package/dist/services/secrets/password.js +0 -4
  342. package/dist/services/secrets/password.js.map +1 -1
  343. package/dist/services/secrets/provider.d.ts +2 -3
  344. package/dist/services/secrets/provider.d.ts.map +1 -1
  345. package/dist/services/secrets/vault.d.ts.map +1 -1
  346. package/dist/services/serviceAccounts.d.ts +20 -0
  347. package/dist/services/serviceAccounts.d.ts.map +1 -1
  348. package/dist/services/serviceAccounts.js +47 -1
  349. package/dist/services/serviceAccounts.js.map +1 -1
  350. package/dist/services/sessionRevocation.d.ts +76 -0
  351. package/dist/services/sessionRevocation.d.ts.map +1 -0
  352. package/dist/services/sessionRevocation.js +86 -0
  353. package/dist/services/sessionRevocation.js.map +1 -0
  354. package/dist/services/setup/configWriter.d.ts.map +1 -1
  355. package/dist/services/setup/configWriter.js.map +1 -1
  356. package/dist/services/singleUse.d.ts +68 -0
  357. package/dist/services/singleUse.d.ts.map +1 -0
  358. package/dist/services/singleUse.js +54 -0
  359. package/dist/services/singleUse.js.map +1 -0
  360. package/dist/services/smsOtp.d.ts.map +1 -1
  361. package/dist/services/smsOtp.js +12 -8
  362. package/dist/services/smsOtp.js.map +1 -1
  363. package/dist/services/ssoEndpointPolicy.d.ts +8 -0
  364. package/dist/services/ssoEndpointPolicy.d.ts.map +1 -0
  365. package/dist/services/ssoEndpointPolicy.js +136 -0
  366. package/dist/services/ssoEndpointPolicy.js.map +1 -0
  367. package/dist/services/stepUp.d.ts +35 -0
  368. package/dist/services/stepUp.d.ts.map +1 -0
  369. package/dist/services/stepUp.js +65 -0
  370. package/dist/services/stepUp.js.map +1 -0
  371. package/dist/services/tokens.d.ts +39 -11
  372. package/dist/services/tokens.d.ts.map +1 -1
  373. package/dist/services/tokens.js +80 -14
  374. package/dist/services/tokens.js.map +1 -1
  375. package/dist/services/totp.d.ts +46 -0
  376. package/dist/services/totp.d.ts.map +1 -1
  377. package/dist/services/totp.js +178 -41
  378. package/dist/services/totp.js.map +1 -1
  379. package/dist/services/trustedProxies.d.ts +90 -0
  380. package/dist/services/trustedProxies.d.ts.map +1 -0
  381. package/dist/services/trustedProxies.js +283 -0
  382. package/dist/services/trustedProxies.js.map +1 -0
  383. package/dist/services/users.d.ts +20 -12
  384. package/dist/services/users.d.ts.map +1 -1
  385. package/dist/services/users.js +24 -51
  386. package/dist/services/users.js.map +1 -1
  387. package/dist/services/webauthn.d.ts +8 -4
  388. package/dist/services/webauthn.d.ts.map +1 -1
  389. package/dist/services/webauthn.js +4 -4
  390. package/dist/services/webauthn.js.map +1 -1
  391. package/dist/services/webhooks.d.ts +20 -20
  392. package/dist/services/workflows/engine.d.ts +4 -2
  393. package/dist/services/workflows/engine.d.ts.map +1 -1
  394. package/dist/services/workflows/engine.js +181 -12
  395. package/dist/services/workflows/engine.js.map +1 -1
  396. package/dist/services/workflows/steps.d.ts +2 -0
  397. package/dist/services/workflows/steps.d.ts.map +1 -1
  398. package/dist/services/workflows/steps.js +8 -75
  399. package/dist/services/workflows/steps.js.map +1 -1
  400. package/dist/setup-server.js +2 -1
  401. package/dist/setup-server.js.map +1 -1
  402. package/dist/types.d.ts +33 -4
  403. package/dist/types.d.ts.map +1 -1
  404. package/dist/types.js +26 -2
  405. package/dist/types.js.map +1 -1
  406. package/package.json +25 -3
  407. package/dist/tests/errors.test.d.ts +0 -2
  408. package/dist/tests/errors.test.d.ts.map +0 -1
  409. package/dist/tests/errors.test.js +0 -64
  410. package/dist/tests/errors.test.js.map +0 -1
  411. package/dist/tests/events.test.d.ts +0 -2
  412. package/dist/tests/events.test.d.ts.map +0 -1
  413. package/dist/tests/events.test.js +0 -45
  414. package/dist/tests/events.test.js.map +0 -1
  415. package/dist/tests/featureFlags.test.d.ts +0 -2
  416. package/dist/tests/featureFlags.test.d.ts.map +0 -1
  417. package/dist/tests/featureFlags.test.js +0 -24
  418. package/dist/tests/featureFlags.test.js.map +0 -1
  419. package/dist/tests/integration/queue.test.d.ts +0 -2
  420. package/dist/tests/integration/queue.test.d.ts.map +0 -1
  421. package/dist/tests/integration/queue.test.js +0 -49
  422. package/dist/tests/integration/queue.test.js.map +0 -1
  423. package/dist/tests/plugins.test.d.ts +0 -2
  424. package/dist/tests/plugins.test.d.ts.map +0 -1
  425. package/dist/tests/plugins.test.js +0 -56
  426. package/dist/tests/plugins.test.js.map +0 -1
  427. package/dist/tests/result.test.d.ts +0 -2
  428. package/dist/tests/result.test.d.ts.map +0 -1
  429. package/dist/tests/result.test.js +0 -46
  430. package/dist/tests/result.test.js.map +0 -1
  431. package/dist/tests/setup/configWriter.test.d.ts +0 -2
  432. package/dist/tests/setup/configWriter.test.d.ts.map +0 -1
  433. package/dist/tests/setup/configWriter.test.js +0 -55
  434. package/dist/tests/setup/configWriter.test.js.map +0 -1
  435. package/dist/tests/setup/validation.test.d.ts +0 -2
  436. package/dist/tests/setup/validation.test.d.ts.map +0 -1
  437. package/dist/tests/setup/validation.test.js +0 -26
  438. package/dist/tests/setup/validation.test.js.map +0 -1
  439. package/dist/tests/smoke.test.d.ts +0 -2
  440. package/dist/tests/smoke.test.d.ts.map +0 -1
  441. package/dist/tests/smoke.test.js +0 -124
  442. package/dist/tests/smoke.test.js.map +0 -1
  443. package/src/cli.ts +0 -172
  444. package/src/config.ts +0 -143
  445. package/src/container.ts +0 -48
  446. package/src/db/index.ts +0 -53
  447. package/src/db/migrations/0000_skinny_ben_parker.sql +0 -553
  448. package/src/db/migrations/0001_brief_joseph.sql +0 -10
  449. package/src/db/migrations/0002_add_account_lockout.sql +0 -3
  450. package/src/db/migrations/0003_steep_rachel_grey.sql +0 -1
  451. package/src/db/migrations/0004_clever_bill_hollister.sql +0 -20
  452. package/src/db/migrations/0005_steep_the_call.sql +0 -2
  453. package/src/db/migrations/0006_ambitious_boomer.sql +0 -17
  454. package/src/db/migrations/0007_greedy_vindicator.sql +0 -40
  455. package/src/db/migrations/meta/0000_snapshot.json +0 -2964
  456. package/src/db/migrations/meta/0001_snapshot.json +0 -3031
  457. package/src/db/migrations/meta/0003_snapshot.json +0 -3051
  458. package/src/db/migrations/meta/_journal.json +0 -62
  459. package/src/db/schema.ts +0 -676
  460. package/src/db/seed.ts +0 -146
  461. package/src/di.ts +0 -81
  462. package/src/index.ts +0 -326
  463. package/src/lib/errors.ts +0 -139
  464. package/src/lib/result.ts +0 -44
  465. package/src/lib/webhookSignature.ts +0 -41
  466. package/src/plugins/appContext.ts +0 -76
  467. package/src/plugins/audit.ts +0 -42
  468. package/src/plugins/auth.ts +0 -230
  469. package/src/plugins/metrics.ts +0 -41
  470. package/src/plugins/mtls.ts +0 -94
  471. package/src/plugins/permissions.ts +0 -29
  472. package/src/plugins/rateLimit.ts +0 -133
  473. package/src/plugins/requestLogger.ts +0 -25
  474. package/src/plugins/tracing.ts +0 -22
  475. package/src/repositories/apiKey.ts +0 -158
  476. package/src/repositories/application.ts +0 -70
  477. package/src/repositories/audit.ts +0 -32
  478. package/src/repositories/index.ts +0 -9
  479. package/src/repositories/oidcConnection.ts +0 -111
  480. package/src/repositories/organization.ts +0 -167
  481. package/src/repositories/permission.ts +0 -153
  482. package/src/repositories/samlConnection.ts +0 -96
  483. package/src/repositories/session.ts +0 -86
  484. package/src/repositories/types.ts +0 -134
  485. package/src/repositories/user.ts +0 -161
  486. package/src/routes/admin/billing.ts +0 -48
  487. package/src/routes/admin/helpers.ts +0 -50
  488. package/src/routes/admin/index.ts +0 -16
  489. package/src/routes/admin/organizations.ts +0 -299
  490. package/src/routes/admin/permissions.ts +0 -80
  491. package/src/routes/admin/platform.ts +0 -335
  492. package/src/routes/admin/sso.ts +0 -138
  493. package/src/routes/admin/webhooks.ts +0 -73
  494. package/src/routes/admin.ts +0 -1
  495. package/src/routes/apiKeys.ts +0 -60
  496. package/src/routes/auth.ts +0 -214
  497. package/src/routes/authz.ts +0 -38
  498. package/src/routes/config.ts +0 -67
  499. package/src/routes/emailVerification.ts +0 -73
  500. package/src/routes/federation.ts +0 -156
  501. package/src/routes/helpers.ts +0 -17
  502. package/src/routes/magicLinks.ts +0 -107
  503. package/src/routes/oauth.ts +0 -167
  504. package/src/routes/oauth2.ts +0 -284
  505. package/src/routes/oidcEnterprise.ts +0 -166
  506. package/src/routes/password.ts +0 -90
  507. package/src/routes/profile.ts +0 -44
  508. package/src/routes/saml.ts +0 -209
  509. package/src/routes/scim.ts +0 -199
  510. package/src/routes/sdk.ts +0 -141
  511. package/src/routes/serviceAccounts.ts +0 -124
  512. package/src/routes/sessions.ts +0 -62
  513. package/src/routes/setup.ts +0 -315
  514. package/src/routes/smsOtp.ts +0 -67
  515. package/src/routes/totp.ts +0 -122
  516. package/src/routes/webauthn.ts +0 -147
  517. package/src/routes/workflows.ts +0 -157
  518. package/src/sdk/index.ts +0 -152
  519. package/src/sdk/types.ts +0 -54
  520. package/src/services/anomalyDetection.ts +0 -73
  521. package/src/services/application/authentication.ts +0 -75
  522. package/src/services/application/identity.ts +0 -56
  523. package/src/services/application/index.ts +0 -3
  524. package/src/services/application/organization.ts +0 -77
  525. package/src/services/applications.ts +0 -89
  526. package/src/services/audit.ts +0 -41
  527. package/src/services/auditExport.ts +0 -59
  528. package/src/services/billing.ts +0 -87
  529. package/src/services/cache.ts +0 -131
  530. package/src/services/configuration/profiles.ts +0 -115
  531. package/src/services/configuration.ts +0 -120
  532. package/src/services/connectors/google.ts +0 -92
  533. package/src/services/connectors/oidc.ts +0 -111
  534. package/src/services/connectors/registry.ts +0 -124
  535. package/src/services/connectors/types.ts +0 -38
  536. package/src/services/connectors/zitadel.ts +0 -77
  537. package/src/services/devices.ts +0 -76
  538. package/src/services/domain/authentication.ts +0 -279
  539. package/src/services/domain/authorization.ts +0 -49
  540. package/src/services/domain/identity.ts +0 -108
  541. package/src/services/domain/index.ts +0 -4
  542. package/src/services/domain/organization.ts +0 -114
  543. package/src/services/email.ts +0 -167
  544. package/src/services/emailVerification.ts +0 -75
  545. package/src/services/enterpriseSso.ts +0 -58
  546. package/src/services/events/bus.ts +0 -43
  547. package/src/services/events/subscribers/anomaly.ts +0 -13
  548. package/src/services/events/subscribers/auditLog.ts +0 -21
  549. package/src/services/events/subscribers/webhook.ts +0 -39
  550. package/src/services/events/subscribers/webhookDispatch.ts +0 -14
  551. package/src/services/events/types.ts +0 -106
  552. package/src/services/events/validate.ts +0 -118
  553. package/src/services/featureFlags.ts +0 -90
  554. package/src/services/features.ts +0 -22
  555. package/src/services/federation.ts +0 -30
  556. package/src/services/hibp.ts +0 -28
  557. package/src/services/ipControls.ts +0 -99
  558. package/src/services/magicLinks.ts +0 -51
  559. package/src/services/oauth2.ts +0 -216
  560. package/src/services/organizations.ts +0 -171
  561. package/src/services/permissions.ts +0 -146
  562. package/src/services/plugins/registry.ts +0 -242
  563. package/src/services/plugins/types.ts +0 -98
  564. package/src/services/queue/bullmq.ts +0 -104
  565. package/src/services/queue/inProcess.ts +0 -75
  566. package/src/services/queue/index.ts +0 -19
  567. package/src/services/queue/types.ts +0 -26
  568. package/src/services/redis.ts +0 -16
  569. package/src/services/secrets/awsKms.ts +0 -97
  570. package/src/services/secrets/azureKeyVault.ts +0 -171
  571. package/src/services/secrets/database.ts +0 -166
  572. package/src/services/secrets/environment.ts +0 -117
  573. package/src/services/secrets/index.ts +0 -50
  574. package/src/services/secrets/password.ts +0 -73
  575. package/src/services/secrets/provider.ts +0 -36
  576. package/src/services/secrets/vault.ts +0 -149
  577. package/src/services/secrets.ts +0 -2
  578. package/src/services/serviceAccounts.ts +0 -74
  579. package/src/services/setup/configWriter.ts +0 -200
  580. package/src/services/setup/diagnostics.ts +0 -76
  581. package/src/services/setup/token.ts +0 -42
  582. package/src/services/setup/types.ts +0 -40
  583. package/src/services/setup/validation.ts +0 -205
  584. package/src/services/sms.ts +0 -81
  585. package/src/services/smsOtp.ts +0 -74
  586. package/src/services/tokens.ts +0 -287
  587. package/src/services/totp.ts +0 -113
  588. package/src/services/users.ts +0 -239
  589. package/src/services/webauthn.ts +0 -193
  590. package/src/services/webhooks.ts +0 -190
  591. package/src/services/workflows/engine.ts +0 -125
  592. package/src/services/workflows/steps.ts +0 -129
  593. package/src/services/zitadel.ts +0 -277
  594. package/src/setup-server.ts +0 -71
  595. package/src/tests/errors.test.ts +0 -74
  596. package/src/tests/events.test.ts +0 -52
  597. package/src/tests/featureFlags.test.ts +0 -26
  598. package/src/tests/integration/queue.test.ts +0 -54
  599. package/src/tests/plugins.test.ts +0 -73
  600. package/src/tests/result.test.ts +0 -52
  601. package/src/tests/setup/configWriter.test.ts +0 -69
  602. package/src/tests/setup/validation.test.ts +0 -29
  603. package/src/tests/smoke.test.ts +0 -136
  604. package/src/types.ts +0 -70
@@ -1,167 +0,0 @@
1
- import { config } from "../config.js";
2
- import { getPluginEmailProvider } from "./plugins/registry.js";
3
-
4
- export interface EmailMessage {
5
- to: string;
6
- subject: string;
7
- text: string;
8
- html?: string;
9
- }
10
-
11
- export interface EmailProvider {
12
- name?: string;
13
- send(message: EmailMessage): Promise<void>;
14
- }
15
-
16
- class NoOpEmailProvider implements EmailProvider {
17
- async send(message: EmailMessage): Promise<void> {
18
- console.log("[email] no-op provider would send:", JSON.stringify(message));
19
- }
20
- }
21
-
22
- class ConsoleEmailProvider implements EmailProvider {
23
- async send(message: EmailMessage): Promise<void> {
24
- console.log("[email] console provider:");
25
- console.log(`To: ${message.to}`);
26
- console.log(`Subject: ${message.subject}`);
27
- console.log(message.text);
28
- }
29
- }
30
-
31
- class SmtpEmailProvider implements EmailProvider {
32
- private transporter: import("nodemailer").Transporter | null = null;
33
-
34
- async send(message: EmailMessage): Promise<void> {
35
- if (!this.transporter) {
36
- const { createTransport } = await import("nodemailer");
37
- this.transporter = createTransport({
38
- host: config.SMTP_HOST,
39
- port: config.SMTP_PORT,
40
- secure: config.SMTP_SECURE,
41
- auth:
42
- config.SMTP_USER && config.SMTP_PASS
43
- ? { user: config.SMTP_USER, pass: config.SMTP_PASS }
44
- : undefined,
45
- });
46
- }
47
-
48
- await this.transporter.sendMail({
49
- from: config.EMAIL_FROM,
50
- to: message.to,
51
- subject: message.subject,
52
- text: message.text,
53
- html: message.html,
54
- });
55
- }
56
- }
57
-
58
- class SendGridEmailProvider implements EmailProvider {
59
- async send(message: EmailMessage): Promise<void> {
60
- if (!config.SENDGRID_API_KEY) {
61
- throw new Error("SendGrid provider requires SENDGRID_API_KEY");
62
- }
63
-
64
- const response = await fetch("https://api.sendgrid.com/v3/mail/send", {
65
- method: "POST",
66
- headers: {
67
- Authorization: `Bearer ${config.SENDGRID_API_KEY}`,
68
- "Content-Type": "application/json",
69
- },
70
- body: JSON.stringify({
71
- personalizations: [{ to: [{ email: message.to }] }],
72
- from: { email: config.EMAIL_FROM },
73
- subject: message.subject,
74
- content: [
75
- { type: "text/plain", value: message.text },
76
- ...(message.html ? [{ type: "text/html", value: message.html }] : []),
77
- ],
78
- }),
79
- });
80
-
81
- if (!response.ok) {
82
- const body = await response.text();
83
- throw new Error(`SendGrid request failed: ${response.status} ${body}`);
84
- }
85
- }
86
- }
87
-
88
- class MailgunEmailProvider implements EmailProvider {
89
- async send(message: EmailMessage): Promise<void> {
90
- if (!config.MAILGUN_API_KEY || !config.MAILGUN_DOMAIN) {
91
- throw new Error("Mailgun provider requires MAILGUN_API_KEY and MAILGUN_DOMAIN");
92
- }
93
-
94
- const params = new URLSearchParams();
95
- params.set("from", config.EMAIL_FROM);
96
- params.set("to", message.to);
97
- params.set("subject", message.subject);
98
- params.set("text", message.text);
99
- if (message.html) params.set("html", message.html);
100
-
101
- const response = await fetch(
102
- `https://api.mailgun.net/v3/${config.MAILGUN_DOMAIN}/messages`,
103
- {
104
- method: "POST",
105
- headers: {
106
- Authorization: `Basic ${Buffer.from(`api:${config.MAILGUN_API_KEY}`).toString("base64")}`,
107
- "Content-Type": "application/x-www-form-urlencoded",
108
- },
109
- body: params.toString(),
110
- }
111
- );
112
-
113
- if (!response.ok) {
114
- const body = await response.text();
115
- throw new Error(`Mailgun request failed: ${response.status} ${body}`);
116
- }
117
- }
118
- }
119
-
120
- function createEmailProvider(): EmailProvider {
121
- const plugin = getPluginEmailProvider();
122
- if (plugin) return plugin;
123
-
124
- const provider = config.EMAIL_PROVIDER || "none";
125
- switch (provider) {
126
- case "smtp":
127
- return new SmtpEmailProvider();
128
- case "sendgrid":
129
- return new SendGridEmailProvider();
130
- case "mailgun":
131
- return new MailgunEmailProvider();
132
- case "console":
133
- return new ConsoleEmailProvider();
134
- case "none":
135
- default:
136
- return new NoOpEmailProvider();
137
- }
138
- }
139
-
140
- export const emailProvider = createEmailProvider();
141
-
142
- export async function sendNewDeviceAlert(input: {
143
- email: string;
144
- ipAddress?: string;
145
- userAgent?: string;
146
- deviceName?: string;
147
- }): Promise<void> {
148
- await emailProvider.send({
149
- to: input.email,
150
- subject: "New sign-in from an unrecognized device",
151
- text: `A new device was used to sign in to your Hilbras account.\n\nIP: ${input.ipAddress || "unknown"}\nDevice: ${input.deviceName || input.userAgent || "unknown"}\n\nIf this wasn't you, please change your password immediately.`,
152
- });
153
- }
154
-
155
- export async function sendSuspiciousLoginAlert(input: {
156
- email: string;
157
- ipAddress?: string;
158
- userAgent?: string;
159
- reason: string;
160
- }): Promise<void> {
161
- await emailProvider.send({
162
- to: input.email,
163
- subject: "Suspicious sign-in activity detected",
164
- text: `We detected suspicious sign-in activity on your Hilbras account.\n\nReason: ${input.reason}\nIP: ${input.ipAddress || "unknown"}\nDevice: ${input.userAgent || "unknown"}\n\nIf this wasn't you, please change your password immediately and review your active sessions.`,
165
- html: `<p>We detected suspicious sign-in activity on your Hilbras account.</p><ul><li><strong>Reason:</strong> ${input.reason}</li><li><strong>IP:</strong> ${input.ipAddress || "unknown"}</li><li><strong>Device:</strong> ${input.userAgent || "unknown"}</li></ul><p>If this wasn't you, please change your password immediately and review your active sessions.</p>`,
166
- });
167
- }
@@ -1,75 +0,0 @@
1
- import crypto from "node:crypto";
2
- import { eq, and, gt, isNull } from "drizzle-orm";
3
- import { db } from "../db/index.js";
4
- import { emailVerificationTokens, users, type User } from "../db/schema.js";
5
- import { emailProvider } from "./email.js";
6
-
7
- const TOKEN_TTL_SECONDS = 24 * 60 * 60; // 24 hours
8
-
9
- function hashToken(token: string): string {
10
- return crypto.createHash("sha256").update(token).digest("hex");
11
- }
12
-
13
- export function generateVerificationToken(): { token: string; tokenHash: string } {
14
- const token = crypto.randomBytes(48).toString("base64url");
15
- return { token, tokenHash: hashToken(token) };
16
- }
17
-
18
- export async function storeVerificationToken(userId: string, tokenHash: string) {
19
- const [record] = await db
20
- .insert(emailVerificationTokens)
21
- .values({
22
- userId,
23
- tokenHash,
24
- expiresAt: new Date(Date.now() + TOKEN_TTL_SECONDS * 1000),
25
- })
26
- .returning();
27
- return record;
28
- }
29
-
30
- export async function consumeVerificationToken(token: string): Promise<User | undefined> {
31
- const tokenHash = hashToken(token);
32
- const now = new Date();
33
-
34
- const [record] = await db
35
- .select()
36
- .from(emailVerificationTokens)
37
- .where(
38
- and(
39
- eq(emailVerificationTokens.tokenHash, tokenHash),
40
- gt(emailVerificationTokens.expiresAt, now),
41
- isNull(emailVerificationTokens.usedAt)
42
- )
43
- )
44
- .limit(1);
45
-
46
- if (!record) return undefined;
47
-
48
- await db.update(emailVerificationTokens).set({ usedAt: now }).where(eq(emailVerificationTokens.id, record.id));
49
-
50
- const [user] = await db
51
- .update(users)
52
- .set({ emailVerified: true, updatedAt: now })
53
- .where(eq(users.id, record.userId))
54
- .returning();
55
-
56
- return user;
57
- }
58
-
59
- function verificationUrl(token: string): string {
60
- const base = process.env.CLIENT_APP_URL || "http://localhost:5173";
61
- return `${base}/#verify-email=${encodeURIComponent(token)}`;
62
- }
63
-
64
- export async function sendVerificationEmail(user: { id: string; email: string; name?: string | null }): Promise<void> {
65
- const { token, tokenHash } = generateVerificationToken();
66
- await storeVerificationToken(user.id, tokenHash);
67
-
68
- const url = verificationUrl(token);
69
- await emailProvider.send({
70
- to: user.email,
71
- subject: "Verify your email address",
72
- text: `Hi${user.name ? ` ${user.name}` : ""},\n\nPlease verify your email address by clicking the link below:\n\n${url}\n\nThis link expires in 24 hours.`,
73
- html: `<p>Hi${user.name ? ` ${user.name}` : ""},</p><p>Please verify your email address by clicking <a href="${url}">here</a>.</p><p>This link expires in 24 hours.</p>`,
74
- });
75
- }
@@ -1,58 +0,0 @@
1
- import { eq } from "drizzle-orm";
2
- import { db } from "../db/index.js";
3
- import { users, orgMemberships, type Organization } from "../db/schema.js";
4
- import { slugifyUsername, ensureUniqueUsername } from "./users.js";
5
-
6
- export interface EnterpriseUserClaims {
7
- email: string;
8
- name?: string;
9
- username?: string;
10
- externalId?: string;
11
- }
12
-
13
- export async function provisionEnterpriseUser(
14
- orgId: string,
15
- claims: EnterpriseUserClaims,
16
- defaultRole: "owner" | "admin" | "member" = "member"
17
- ) {
18
- const email = claims.email.toLowerCase().trim();
19
-
20
- let [user] = await db.select().from(users).where(eq(users.email, email)).limit(1);
21
-
22
- if (!user) {
23
- const baseUsername = claims.username || claims.email.split("@")[0];
24
- const username = await ensureUniqueUsername(slugifyUsername(baseUsername));
25
-
26
- [user] = await db
27
- .insert(users)
28
- .values({
29
- email,
30
- username,
31
- name: claims.name || username,
32
- provider: "enterprise_sso",
33
- emailVerified: true,
34
- })
35
- .returning();
36
- }
37
-
38
- const [existingMembership] = await db
39
- .select()
40
- .from(orgMemberships)
41
- .where(eq(orgMemberships.userId, user.id))
42
- .limit(1);
43
-
44
- if (!existingMembership) {
45
- await db.insert(orgMemberships).values({
46
- orgId,
47
- userId: user.id,
48
- role: defaultRole,
49
- });
50
- }
51
-
52
- return user;
53
- }
54
-
55
- export function defaultRoleForOrg(_org: Organization): "owner" | "admin" | "member" {
56
- // Future: allow org-level default SSO role configuration.
57
- return "member";
58
- }
@@ -1,43 +0,0 @@
1
- import type { KeystoneEvent, EventHandler, EventPayload } from "./types.js";
2
- import { normalizeEvent } from "./validate.js";
3
-
4
- const subscribers = new Map<string, EventHandler[]>();
5
- const allSubscribers: EventHandler[] = [];
6
-
7
- export function subscribe(eventType: string, handler: EventHandler): () => void {
8
- const list = subscribers.get(eventType) ?? [];
9
- list.push(handler);
10
- subscribers.set(eventType, list);
11
- return () => {
12
- const updated = subscribers.get(eventType)?.filter((h) => h !== handler) ?? [];
13
- subscribers.set(eventType, updated);
14
- };
15
- }
16
-
17
- export function subscribeAll(handler: EventHandler): () => void {
18
- allSubscribers.push(handler);
19
- return () => {
20
- const idx = allSubscribers.indexOf(handler);
21
- if (idx >= 0) allSubscribers.splice(idx, 1);
22
- };
23
- }
24
-
25
- export type EmittableEvent = Omit<KeystoneEvent, "timestamp" | "version"> & { version?: number };
26
-
27
- export async function emit(event: EmittableEvent): Promise<void> {
28
- const fullEvent = normalizeEvent(event);
29
- const handlers = [...allSubscribers, ...(subscribers.get(fullEvent.type) ?? [])];
30
- await Promise.all(
31
- handlers.map(async (handler) => {
32
- try {
33
- await handler(fullEvent);
34
- } catch (err) {
35
- console.error(`[event-bus] handler failed for ${fullEvent.type}:`, err);
36
- }
37
- })
38
- );
39
- }
40
-
41
- export function buildEvent(type: string, payload: EventPayload): EmittableEvent {
42
- return { type, payload };
43
- }
@@ -1,13 +0,0 @@
1
- import { recordFailedLogin, recordNewDevice } from "../../anomalyDetection.js";
2
- import type { KeystoneEvent } from "../types.js";
3
-
4
- export async function anomalySubscriber(event: KeystoneEvent): Promise<void> {
5
- if (event.type === "user_login_failed") {
6
- const identifier = event.payload.userId || event.payload.metadata?.email || event.payload.ip || "unknown";
7
- await recordFailedLogin(String(identifier));
8
- }
9
- if (event.type === "new_device_detected") {
10
- const userId = event.payload.userId;
11
- if (userId) await recordNewDevice(userId);
12
- }
13
- }
@@ -1,21 +0,0 @@
1
- import { db } from "../../../db/index.js";
2
- import { auditLog } from "../../../db/schema.js";
3
- import type { KeystoneEvent } from "../types.js";
4
-
5
- export async function auditLogSubscriber(event: KeystoneEvent): Promise<void> {
6
- try {
7
- const { userId, orgId, appId, requestId, ip, userAgent, metadata } = event.payload;
8
- await db.insert(auditLog).values({
9
- userId: userId ?? null,
10
- orgId: orgId ?? null,
11
- appId: appId ?? null,
12
- requestId: requestId ?? null,
13
- event: `${event.type}:v${event.version}`,
14
- ipAddress: ip ?? null,
15
- userAgent: userAgent ?? null,
16
- metadata: { ...(metadata ?? {}), eventVersion: event.version },
17
- });
18
- } catch (err) {
19
- console.error("[audit-log-subscriber] failed to write event:", err);
20
- }
21
- }
@@ -1,39 +0,0 @@
1
- import { config } from "../../../config.js";
2
- import { queue } from "../../queue/index.js";
3
- import { signWebhookPayload } from "../../../lib/webhookSignature.js";
4
- import type { KeystoneEvent } from "../types.js";
5
-
6
- function shouldEmit(): boolean {
7
- return Boolean(config.AUDIT_WEBHOOK_URL || process.env.AUDIT_WEBHOOK_URL || config.AUDIT_CONSOLE_EXPORT === "true");
8
- }
9
-
10
- export async function webhookSubscriber(event: KeystoneEvent): Promise<void> {
11
- if (!shouldEmit()) return;
12
- const record = {
13
- event: event.type,
14
- version: event.version,
15
- userId: event.payload.userId,
16
- orgId: event.payload.orgId,
17
- appId: event.payload.appId,
18
- ip: event.payload.ip,
19
- userAgent: event.payload.userAgent,
20
- metadata: event.payload.metadata,
21
- createdAt: event.timestamp,
22
- };
23
-
24
- if (config.AUDIT_CONSOLE_EXPORT === "true") {
25
- console.log("[audit-export]", JSON.stringify(record));
26
- }
27
-
28
- const webhookUrl = config.AUDIT_WEBHOOK_URL || process.env.AUDIT_WEBHOOK_URL;
29
- if (webhookUrl) {
30
- const headers: Record<string, string> = { "Content-Type": "application/json" };
31
- if (config.WEBHOOK_SIGNING_SECRET) {
32
- headers["X-Keystone-Signature"] = signWebhookPayload(config.WEBHOOK_SIGNING_SECRET, record);
33
- }
34
- await queue.enqueue({
35
- type: "webhook",
36
- payload: { url: webhookUrl, method: "POST", body: record, headers },
37
- });
38
- }
39
- }
@@ -1,14 +0,0 @@
1
- import { dispatchEvent } from "../../webhooks.js";
2
- import type { KeystoneEvent } from "../types.js";
3
-
4
- /**
5
- * Fans every platform event out to registered webhook endpoints.
6
- * Delivery itself happens asynchronously via the queue worker.
7
- */
8
- export async function webhookDispatchSubscriber(event: KeystoneEvent): Promise<void> {
9
- try {
10
- await dispatchEvent(event);
11
- } catch (err) {
12
- console.error("[webhooks] dispatch failed:", err);
13
- }
14
- }
@@ -1,106 +0,0 @@
1
- export interface EventPayload {
2
- userId?: string;
3
- orgId?: string;
4
- appId?: string;
5
- requestId?: string;
6
- ip?: string;
7
- userAgent?: string;
8
- metadata?: Record<string, unknown>;
9
- [key: string]: unknown;
10
- }
11
-
12
- export interface KeystoneEvent {
13
- type: string;
14
- version: number;
15
- timestamp: Date;
16
- payload: EventPayload;
17
- }
18
-
19
- export type EventHandler = (event: KeystoneEvent) => void | Promise<void>;
20
-
21
- export const EVENT_VERSIONS: Record<string, number> = {
22
- // Default version for all existing events.
23
- default: 1,
24
- };
25
-
26
- export function eventVersion(type: string): number {
27
- return EVENT_VERSIONS[type] ?? EVENT_VERSIONS.default;
28
- }
29
-
30
- export type AuditEventType =
31
- | "user_registered"
32
- | "user_login"
33
- | "user_login_failed"
34
- | "user_logout"
35
- | "token_refresh"
36
- | "token_refresh_failed"
37
- | "oauth_callback"
38
- | "oauth2_authorize"
39
- | "oauth2_token"
40
- | "oauth2_client_credentials"
41
- | "oauth2_revoke"
42
- | "oauth2_consent"
43
- | "password_reset_requested"
44
- | "password_reset_completed"
45
- | "api_key_created"
46
- | "api_key_revoked"
47
- | "api_key_used"
48
- | "service_account_created"
49
- | "service_account_updated"
50
- | "unauthorized_access"
51
- | "organization_created"
52
- | "organization_updated"
53
- | "organization_plan_updated"
54
- | "billing_customer_provisioned"
55
- | "organization_member_invited"
56
- | "organization_member_removed"
57
- | "organization_member_role_updated"
58
- | "permission_created"
59
- | "permission_deleted"
60
- | "application_created"
61
- | "application_updated"
62
- | "magic_link_sent"
63
- | "magic_link_verified"
64
- | "totp_enrolled"
65
- | "totp_verify_failed"
66
- | "totp_enabled"
67
- | "totp_disable_failed"
68
- | "totp_disabled"
69
- | "webauthn_registered"
70
- | "webauthn_authenticated"
71
- | "new_device_detected"
72
- | "sms_otp_sent"
73
- | "sms_otp_verify_failed"
74
- | "sms_otp_verified"
75
- | "authz_check"
76
- | "saml_sso_login"
77
- | "oidc_enterprise_login"
78
- | "saml_connection_created"
79
- | "saml_connection_deleted"
80
- | "oidc_connection_created"
81
- | "oidc_connection_deleted"
82
- | "scim_user_created"
83
- | "scim_user_updated"
84
- | "scim_user_deleted"
85
- | "federation_login"
86
- | "workflow_triggered"
87
- | "workflow_step_executed"
88
- | "workflow_created"
89
- | "workflow_deleted"
90
- | "platform_user_updated"
91
- | "platform_user_deactivated"
92
- | "platform_signing_key_rotated"
93
- | "platform_plugin_unregistered"
94
- | "platform_feature_flag_updated"
95
- | "platform_feature_flag_deleted"
96
- | "profile_updated"
97
- | "email_verification_sent"
98
- | "email_verified"
99
- | "platform_webhook_created"
100
- | "platform_webhook_updated"
101
- | "platform_webhook_deleted"
102
- | "platform_webhook_secret_rotated"
103
- | "federation_identity_linked"
104
- | "user_token_login"
105
- | "session_revoked"
106
- | "sessions_revoked_all";
@@ -1,118 +0,0 @@
1
- import type { KeystoneEvent } from "./types.js";
2
- import { eventVersion } from "./types.js";
3
- import type { EmittableEvent } from "./bus.js";
4
-
5
- export interface EventValidationResult {
6
- valid: boolean;
7
- errors: string[];
8
- }
9
-
10
- const VALID_EVENT_TYPES = new Set([
11
- "user_registered",
12
- "user_login",
13
- "user_login_failed",
14
- "user_logout",
15
- "token_refresh",
16
- "token_refresh_failed",
17
- "oauth_callback",
18
- "oauth2_authorize",
19
- "oauth2_token",
20
- "oauth2_client_credentials",
21
- "oauth2_revoke",
22
- "oauth2_consent",
23
- "password_reset_requested",
24
- "password_reset_completed",
25
- "api_key_created",
26
- "api_key_revoked",
27
- "api_key_used",
28
- "service_account_created",
29
- "service_account_updated",
30
- "unauthorized_access",
31
- "organization_created",
32
- "organization_updated",
33
- "organization_plan_updated",
34
- "billing_customer_provisioned",
35
- "organization_member_invited",
36
- "organization_member_removed",
37
- "organization_member_role_updated",
38
- "permission_created",
39
- "permission_deleted",
40
- "application_created",
41
- "application_updated",
42
- "magic_link_sent",
43
- "magic_link_verified",
44
- "totp_enrolled",
45
- "totp_verify_failed",
46
- "totp_enabled",
47
- "totp_disable_failed",
48
- "totp_disabled",
49
- "webauthn_registered",
50
- "webauthn_authenticated",
51
- "new_device_detected",
52
- "sms_otp_sent",
53
- "sms_otp_verify_failed",
54
- "sms_otp_verified",
55
- "authz_check",
56
- "saml_sso_login",
57
- "saml_connection_created",
58
- "saml_connection_deleted",
59
- "oidc_enterprise_login",
60
- "oidc_connection_created",
61
- "oidc_connection_deleted",
62
- "scim_user_created",
63
- "scim_user_updated",
64
- "scim_user_deleted",
65
- "federation_login",
66
- "workflow_triggered",
67
- "workflow_step_executed",
68
- "workflow_created",
69
- "workflow_deleted",
70
- "platform_user_updated",
71
- "platform_user_deactivated",
72
- "platform_signing_key_rotated",
73
- "platform_plugin_unregistered",
74
- "platform_feature_flag_updated",
75
- "platform_feature_flag_deleted",
76
- "profile_updated",
77
- "email_verification_sent",
78
- "email_verified",
79
- "platform_webhook_created",
80
- "platform_webhook_deleted",
81
- ]);
82
-
83
- export function validateEvent(event: EmittableEvent): EventValidationResult {
84
- const errors: string[] = [];
85
-
86
- if (!event.type || typeof event.type !== "string") {
87
- errors.push("Event type is required and must be a string");
88
- return { valid: false, errors };
89
- }
90
-
91
- if (!VALID_EVENT_TYPES.has(event.type)) {
92
- errors.push(`Unknown event type: ${event.type}`);
93
- }
94
-
95
- if (event.version !== undefined && (typeof event.version !== "number" || event.version < 1)) {
96
- errors.push("Event version must be a positive integer");
97
- }
98
-
99
- if (!event.payload || typeof event.payload !== "object" || Array.isArray(event.payload)) {
100
- errors.push("Event payload must be an object");
101
- }
102
-
103
- return { valid: errors.length === 0, errors };
104
- }
105
-
106
- export function normalizeEvent(event: EmittableEvent): KeystoneEvent {
107
- const validation = validateEvent(event);
108
- if (!validation.valid) {
109
- throw new Error(`Invalid event: ${validation.errors.join("; ")}`);
110
- }
111
-
112
- return {
113
- type: event.type,
114
- version: event.version ?? eventVersion(event.type),
115
- timestamp: new Date(),
116
- payload: event.payload,
117
- };
118
- }