@hilbras/keystone 1.5.0 → 1.9.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 (559) hide show
  1. package/CHANGELOG.md +272 -0
  2. package/README.md +59 -25
  3. package/dist/cli.js +25 -27
  4. package/dist/cli.js.map +1 -1
  5. package/dist/config.d.ts +15 -1
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +45 -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/{src/db/migrations/meta/0007_snapshot.json → dist/db/migrations/meta/0008_snapshot.json} +136 -32
  20. package/{src/db/migrations/meta/0006_snapshot.json → dist/db/migrations/meta/0009_snapshot.json} +359 -30
  21. package/{src/db/migrations/meta/0005_snapshot.json → dist/db/migrations/meta/0010_snapshot.json} +459 -29
  22. package/{src/db/migrations/meta/0004_snapshot.json → dist/db/migrations/meta/0011_snapshot.json} +594 -30
  23. package/dist/db/migrations/meta/0012_snapshot.json +3891 -0
  24. package/dist/db/migrations/meta/0013_snapshot.json +3919 -0
  25. package/dist/db/migrations/meta/0014_snapshot.json +4311 -0
  26. package/dist/db/migrations/meta/_journal.json +49 -0
  27. package/dist/db/reencryptOidcSecrets.d.ts +2 -0
  28. package/dist/db/reencryptOidcSecrets.d.ts.map +1 -0
  29. package/dist/db/reencryptOidcSecrets.js +41 -0
  30. package/dist/db/reencryptOidcSecrets.js.map +1 -0
  31. package/dist/db/schema.d.ts +2521 -53
  32. package/dist/db/schema.d.ts.map +1 -1
  33. package/dist/db/schema.js +118 -3
  34. package/dist/db/schema.js.map +1 -1
  35. package/dist/db/seed.js +67 -40
  36. package/dist/db/seed.js.map +1 -1
  37. package/dist/di.d.ts.map +1 -1
  38. package/dist/di.js +11 -3
  39. package/dist/di.js.map +1 -1
  40. package/dist/index.d.ts +2 -2
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +26 -2
  43. package/dist/index.js.map +1 -1
  44. package/dist/lib/errors.d.ts +2 -1
  45. package/dist/lib/errors.d.ts.map +1 -1
  46. package/dist/lib/errors.js +10 -0
  47. package/dist/lib/errors.js.map +1 -1
  48. package/dist/plugins/appContext.d.ts.map +1 -1
  49. package/dist/plugins/appContext.js +3 -12
  50. package/dist/plugins/appContext.js.map +1 -1
  51. package/dist/plugins/audit.d.ts.map +1 -1
  52. package/dist/plugins/audit.js +26 -6
  53. package/dist/plugins/audit.js.map +1 -1
  54. package/dist/plugins/auth.d.ts.map +1 -1
  55. package/dist/plugins/auth.js +32 -7
  56. package/dist/plugins/auth.js.map +1 -1
  57. package/dist/plugins/metrics.d.ts.map +1 -1
  58. package/dist/plugins/mtls.d.ts.map +1 -1
  59. package/dist/plugins/permissions.d.ts.map +1 -1
  60. package/dist/plugins/permissions.js +29 -9
  61. package/dist/plugins/permissions.js.map +1 -1
  62. package/dist/plugins/rateLimit.d.ts +15 -0
  63. package/dist/plugins/rateLimit.d.ts.map +1 -1
  64. package/dist/plugins/rateLimit.js +11 -1
  65. package/dist/plugins/rateLimit.js.map +1 -1
  66. package/dist/plugins/requestLogger.d.ts.map +1 -1
  67. package/dist/repositories/apiKey.d.ts.map +1 -1
  68. package/dist/repositories/application.d.ts.map +1 -1
  69. package/dist/repositories/application.js +1 -1
  70. package/dist/repositories/application.js.map +1 -1
  71. package/dist/repositories/audit.d.ts.map +1 -1
  72. package/dist/repositories/index.d.ts +3 -0
  73. package/dist/repositories/index.d.ts.map +1 -1
  74. package/dist/repositories/index.js +3 -0
  75. package/dist/repositories/index.js.map +1 -1
  76. package/dist/repositories/mfaChallenge.d.ts +23 -0
  77. package/dist/repositories/mfaChallenge.d.ts.map +1 -0
  78. package/dist/repositories/mfaChallenge.js +71 -0
  79. package/dist/repositories/mfaChallenge.js.map +1 -0
  80. package/dist/repositories/oidcConnection.d.ts +27 -43
  81. package/dist/repositories/oidcConnection.d.ts.map +1 -1
  82. package/dist/repositories/oidcConnection.js +15 -6
  83. package/dist/repositories/oidcConnection.js.map +1 -1
  84. package/dist/repositories/organization.d.ts +9 -9
  85. package/dist/repositories/organization.d.ts.map +1 -1
  86. package/dist/repositories/organization.js +91 -37
  87. package/dist/repositories/organization.js.map +1 -1
  88. package/dist/repositories/permission.d.ts.map +1 -1
  89. package/dist/repositories/permission.js +27 -5
  90. package/dist/repositories/permission.js.map +1 -1
  91. package/dist/repositories/samlConnection.d.ts +28 -28
  92. package/dist/repositories/samlConnection.d.ts.map +1 -1
  93. package/dist/repositories/samlConnection.js +12 -4
  94. package/dist/repositories/samlConnection.js.map +1 -1
  95. package/dist/repositories/scimConnection.d.ts +38 -0
  96. package/dist/repositories/scimConnection.d.ts.map +1 -0
  97. package/dist/repositories/scimConnection.js +123 -0
  98. package/dist/repositories/scimConnection.js.map +1 -0
  99. package/dist/repositories/scimGroup.d.ts +36 -0
  100. package/dist/repositories/scimGroup.d.ts.map +1 -0
  101. package/dist/repositories/scimGroup.js +113 -0
  102. package/dist/repositories/scimGroup.js.map +1 -0
  103. package/dist/repositories/session.d.ts +23 -13
  104. package/dist/repositories/session.d.ts.map +1 -1
  105. package/dist/repositories/session.js +13 -1
  106. package/dist/repositories/session.js.map +1 -1
  107. package/dist/repositories/types.d.ts +112 -5
  108. package/dist/repositories/types.d.ts.map +1 -1
  109. package/dist/repositories/types.js +7 -1
  110. package/dist/repositories/types.js.map +1 -1
  111. package/dist/repositories/user.d.ts +23 -1
  112. package/dist/repositories/user.d.ts.map +1 -1
  113. package/dist/repositories/user.js +180 -4
  114. package/dist/repositories/user.js.map +1 -1
  115. package/dist/routes/admin/billing.js +4 -4
  116. package/dist/routes/admin/billing.js.map +1 -1
  117. package/dist/routes/admin/helpers.d.ts +16 -20
  118. package/dist/routes/admin/helpers.d.ts.map +1 -1
  119. package/dist/routes/admin/helpers.js +53 -10
  120. package/dist/routes/admin/helpers.js.map +1 -1
  121. package/dist/routes/admin/organizations.d.ts.map +1 -1
  122. package/dist/routes/admin/organizations.js +76 -69
  123. package/dist/routes/admin/organizations.js.map +1 -1
  124. package/dist/routes/admin/permissions.d.ts.map +1 -1
  125. package/dist/routes/admin/permissions.js +48 -14
  126. package/dist/routes/admin/permissions.js.map +1 -1
  127. package/dist/routes/admin/platform.d.ts.map +1 -1
  128. package/dist/routes/admin/platform.js +86 -35
  129. package/dist/routes/admin/platform.js.map +1 -1
  130. package/dist/routes/admin/sso.d.ts.map +1 -1
  131. package/dist/routes/admin/sso.js +143 -12
  132. package/dist/routes/admin/sso.js.map +1 -1
  133. package/dist/routes/admin/webhooks.js +8 -8
  134. package/dist/routes/admin/webhooks.js.map +1 -1
  135. package/dist/routes/apiKeys.d.ts.map +1 -1
  136. package/dist/routes/apiKeys.js +23 -5
  137. package/dist/routes/apiKeys.js.map +1 -1
  138. package/dist/routes/auth.d.ts.map +1 -1
  139. package/dist/routes/auth.js +112 -22
  140. package/dist/routes/auth.js.map +1 -1
  141. package/dist/routes/authz.d.ts.map +1 -1
  142. package/dist/routes/authz.js +16 -4
  143. package/dist/routes/authz.js.map +1 -1
  144. package/dist/routes/config.d.ts.map +1 -1
  145. package/dist/routes/config.js +16 -14
  146. package/dist/routes/config.js.map +1 -1
  147. package/dist/routes/federation.d.ts.map +1 -1
  148. package/dist/routes/federation.js +17 -3
  149. package/dist/routes/federation.js.map +1 -1
  150. package/dist/routes/magicLinks.d.ts.map +1 -1
  151. package/dist/routes/magicLinks.js +15 -3
  152. package/dist/routes/magicLinks.js.map +1 -1
  153. package/dist/routes/oauth.d.ts.map +1 -1
  154. package/dist/routes/oauth.js +22 -3
  155. package/dist/routes/oauth.js.map +1 -1
  156. package/dist/routes/oauth2.d.ts.map +1 -1
  157. package/dist/routes/oauth2.js +104 -11
  158. package/dist/routes/oauth2.js.map +1 -1
  159. package/dist/routes/oidcEnterprise.d.ts.map +1 -1
  160. package/dist/routes/oidcEnterprise.js +67 -21
  161. package/dist/routes/oidcEnterprise.js.map +1 -1
  162. package/dist/routes/password.d.ts.map +1 -1
  163. package/dist/routes/password.js.map +1 -1
  164. package/dist/routes/profile.js +4 -4
  165. package/dist/routes/profile.js.map +1 -1
  166. package/dist/routes/saml.d.ts +9 -0
  167. package/dist/routes/saml.d.ts.map +1 -1
  168. package/dist/routes/saml.js +187 -11
  169. package/dist/routes/saml.js.map +1 -1
  170. package/dist/routes/scim.d.ts +13 -0
  171. package/dist/routes/scim.d.ts.map +1 -1
  172. package/dist/routes/scim.js +885 -110
  173. package/dist/routes/scim.js.map +1 -1
  174. package/dist/routes/sdk.d.ts.map +1 -1
  175. package/dist/routes/sdk.js +24 -8
  176. package/dist/routes/sdk.js.map +1 -1
  177. package/dist/routes/serviceAccounts.d.ts.map +1 -1
  178. package/dist/routes/serviceAccounts.js +2 -1
  179. package/dist/routes/serviceAccounts.js.map +1 -1
  180. package/dist/routes/setup.d.ts.map +1 -1
  181. package/dist/routes/setup.js +15 -16
  182. package/dist/routes/setup.js.map +1 -1
  183. package/dist/routes/smsOtp.js +1 -1
  184. package/dist/routes/smsOtp.js.map +1 -1
  185. package/dist/routes/totp.d.ts.map +1 -1
  186. package/dist/routes/totp.js +113 -23
  187. package/dist/routes/totp.js.map +1 -1
  188. package/dist/routes/webauthn.d.ts.map +1 -1
  189. package/dist/routes/webauthn.js +44 -8
  190. package/dist/routes/webauthn.js.map +1 -1
  191. package/dist/routes/workflows.d.ts.map +1 -1
  192. package/dist/routes/workflows.js +58 -25
  193. package/dist/routes/workflows.js.map +1 -1
  194. package/dist/sdk/index.d.ts.map +1 -1
  195. package/dist/sdk/index.js +141 -40
  196. package/dist/sdk/index.js.map +1 -1
  197. package/dist/sdk/types.d.ts +60 -29
  198. package/dist/sdk/types.d.ts.map +1 -1
  199. package/dist/services/application/authentication.d.ts +39 -1
  200. package/dist/services/application/authentication.d.ts.map +1 -1
  201. package/dist/services/application/authentication.js +43 -1
  202. package/dist/services/application/authentication.js.map +1 -1
  203. package/dist/services/application/identity.d.ts +10 -7
  204. package/dist/services/application/identity.d.ts.map +1 -1
  205. package/dist/services/application/identity.js +13 -10
  206. package/dist/services/application/identity.js.map +1 -1
  207. package/dist/services/application/organization.d.ts +11 -7
  208. package/dist/services/application/organization.d.ts.map +1 -1
  209. package/dist/services/application/organization.js +160 -12
  210. package/dist/services/application/organization.js.map +1 -1
  211. package/dist/services/applications.js +2 -2
  212. package/dist/services/applications.js.map +1 -1
  213. package/dist/services/audit.d.ts +1 -0
  214. package/dist/services/audit.d.ts.map +1 -1
  215. package/dist/services/audit.js +13 -0
  216. package/dist/services/audit.js.map +1 -1
  217. package/dist/services/cache.d.ts.map +1 -1
  218. package/dist/services/configuration/profiles.d.ts +4 -0
  219. package/dist/services/configuration/profiles.d.ts.map +1 -1
  220. package/dist/services/configuration/profiles.js +50 -0
  221. package/dist/services/configuration/profiles.js.map +1 -1
  222. package/dist/services/configuration.d.ts.map +1 -1
  223. package/dist/services/configuration.js.map +1 -1
  224. package/dist/services/connectors/google.d.ts.map +1 -1
  225. package/dist/services/connectors/google.js +3 -2
  226. package/dist/services/connectors/google.js.map +1 -1
  227. package/dist/services/connectors/oidc.d.ts.map +1 -1
  228. package/dist/services/connectors/oidc.js +6 -3
  229. package/dist/services/connectors/oidc.js.map +1 -1
  230. package/dist/services/connectors/zitadel.d.ts.map +1 -1
  231. package/dist/services/connectors/zitadel.js +4 -3
  232. package/dist/services/connectors/zitadel.js.map +1 -1
  233. package/dist/services/domain/authentication.d.ts +43 -4
  234. package/dist/services/domain/authentication.d.ts.map +1 -1
  235. package/dist/services/domain/authentication.js +82 -20
  236. package/dist/services/domain/authentication.js.map +1 -1
  237. package/dist/services/domain/authorization.d.ts +11 -0
  238. package/dist/services/domain/authorization.d.ts.map +1 -1
  239. package/dist/services/domain/authorization.js +36 -1
  240. package/dist/services/domain/authorization.js.map +1 -1
  241. package/dist/services/domain/identity.d.ts +21 -9
  242. package/dist/services/domain/identity.d.ts.map +1 -1
  243. package/dist/services/domain/identity.js +187 -10
  244. package/dist/services/domain/identity.js.map +1 -1
  245. package/dist/services/domain/organization.d.ts +6 -9
  246. package/dist/services/domain/organization.d.ts.map +1 -1
  247. package/dist/services/domain/organization.js +48 -30
  248. package/dist/services/domain/organization.js.map +1 -1
  249. package/dist/services/emailVerification.d.ts +2 -2
  250. package/dist/services/enterpriseSso.d.ts +13 -6
  251. package/dist/services/enterpriseSso.d.ts.map +1 -1
  252. package/dist/services/enterpriseSso.js +75 -6
  253. package/dist/services/enterpriseSso.js.map +1 -1
  254. package/dist/services/events/subscribers/auditLog.js +1 -1
  255. package/dist/services/events/subscribers/auditLog.js.map +1 -1
  256. package/dist/services/events/types.d.ts +7 -1
  257. package/dist/services/events/types.d.ts.map +1 -1
  258. package/dist/services/events/types.js.map +1 -1
  259. package/dist/services/events/validate.d.ts.map +1 -1
  260. package/dist/services/events/validate.js +27 -0
  261. package/dist/services/events/validate.js.map +1 -1
  262. package/dist/services/features.d.ts.map +1 -1
  263. package/dist/services/features.js.map +1 -1
  264. package/dist/services/federation.d.ts +6 -1
  265. package/dist/services/federation.d.ts.map +1 -1
  266. package/dist/services/federation.js +31 -4
  267. package/dist/services/federation.js.map +1 -1
  268. package/dist/services/ipControls.js +2 -2
  269. package/dist/services/ipControls.js.map +1 -1
  270. package/dist/services/magicLinks.d.ts +2 -2
  271. package/dist/services/mfa.d.ts +53 -0
  272. package/dist/services/mfa.d.ts.map +1 -0
  273. package/dist/services/mfa.js +157 -0
  274. package/dist/services/mfa.js.map +1 -0
  275. package/dist/services/oauth2.d.ts +16 -12
  276. package/dist/services/oauth2.d.ts.map +1 -1
  277. package/dist/services/oauth2.js +22 -13
  278. package/dist/services/oauth2.js.map +1 -1
  279. package/dist/services/oidcSecretFormat.d.ts +3 -0
  280. package/dist/services/oidcSecretFormat.d.ts.map +1 -0
  281. package/dist/services/oidcSecretFormat.js +5 -0
  282. package/dist/services/oidcSecretFormat.js.map +1 -0
  283. package/dist/services/organizations.d.ts +4 -16
  284. package/dist/services/organizations.d.ts.map +1 -1
  285. package/dist/services/organizations.js +0 -62
  286. package/dist/services/organizations.js.map +1 -1
  287. package/dist/services/permissions.d.ts.map +1 -1
  288. package/dist/services/permissions.js +9 -1
  289. package/dist/services/permissions.js.map +1 -1
  290. package/dist/services/plugins/registry.d.ts.map +1 -1
  291. package/dist/services/plugins/registry.js.map +1 -1
  292. package/dist/services/plugins/types.d.ts.map +1 -1
  293. package/dist/services/queue/bullmq.d.ts.map +1 -1
  294. package/dist/services/queue/inProcess.d.ts.map +1 -1
  295. package/dist/services/redis.d.ts +1 -1
  296. package/dist/services/redis.d.ts.map +1 -1
  297. package/dist/services/scimCredentials.d.ts +46 -0
  298. package/dist/services/scimCredentials.d.ts.map +1 -0
  299. package/dist/services/scimCredentials.js +123 -0
  300. package/dist/services/scimCredentials.js.map +1 -0
  301. package/dist/services/scimLegacyMigration.d.ts +12 -0
  302. package/dist/services/scimLegacyMigration.d.ts.map +1 -0
  303. package/dist/services/scimLegacyMigration.js +44 -0
  304. package/dist/services/scimLegacyMigration.js.map +1 -0
  305. package/dist/services/secrets/awsKms.d.ts +2 -2
  306. package/dist/services/secrets/awsKms.d.ts.map +1 -1
  307. package/dist/services/secrets/awsKms.js +3 -5
  308. package/dist/services/secrets/awsKms.js.map +1 -1
  309. package/dist/services/secrets/azureKeyVault.d.ts.map +1 -1
  310. package/dist/services/secrets/database.d.ts.map +1 -1
  311. package/dist/services/secrets/database.js.map +1 -1
  312. package/dist/services/secrets/environment.d.ts.map +1 -1
  313. package/dist/services/secrets/environment.js.map +1 -1
  314. package/dist/services/secrets/index.d.ts.map +1 -1
  315. package/dist/services/secrets/password.d.ts.map +1 -1
  316. package/dist/services/secrets/password.js +0 -4
  317. package/dist/services/secrets/password.js.map +1 -1
  318. package/dist/services/secrets/provider.d.ts +2 -3
  319. package/dist/services/secrets/provider.d.ts.map +1 -1
  320. package/dist/services/secrets/vault.d.ts.map +1 -1
  321. package/dist/services/setup/configWriter.d.ts.map +1 -1
  322. package/dist/services/setup/configWriter.js.map +1 -1
  323. package/dist/services/ssoEndpointPolicy.d.ts +8 -0
  324. package/dist/services/ssoEndpointPolicy.d.ts.map +1 -0
  325. package/dist/services/ssoEndpointPolicy.js +136 -0
  326. package/dist/services/ssoEndpointPolicy.js.map +1 -0
  327. package/dist/services/stepUp.d.ts +35 -0
  328. package/dist/services/stepUp.d.ts.map +1 -0
  329. package/dist/services/stepUp.js +65 -0
  330. package/dist/services/stepUp.js.map +1 -0
  331. package/dist/services/tokens.d.ts +37 -11
  332. package/dist/services/tokens.d.ts.map +1 -1
  333. package/dist/services/tokens.js +75 -14
  334. package/dist/services/tokens.js.map +1 -1
  335. package/dist/services/totp.d.ts +46 -0
  336. package/dist/services/totp.d.ts.map +1 -1
  337. package/dist/services/totp.js +178 -41
  338. package/dist/services/totp.js.map +1 -1
  339. package/dist/services/users.d.ts +20 -12
  340. package/dist/services/users.d.ts.map +1 -1
  341. package/dist/services/users.js +24 -51
  342. package/dist/services/users.js.map +1 -1
  343. package/dist/services/webauthn.d.ts +8 -4
  344. package/dist/services/webauthn.d.ts.map +1 -1
  345. package/dist/services/webauthn.js +4 -4
  346. package/dist/services/webauthn.js.map +1 -1
  347. package/dist/services/webhooks.d.ts +20 -20
  348. package/dist/services/workflows/engine.d.ts +4 -2
  349. package/dist/services/workflows/engine.d.ts.map +1 -1
  350. package/dist/services/workflows/engine.js +181 -12
  351. package/dist/services/workflows/engine.js.map +1 -1
  352. package/dist/services/workflows/steps.d.ts +2 -0
  353. package/dist/services/workflows/steps.d.ts.map +1 -1
  354. package/dist/services/workflows/steps.js +8 -75
  355. package/dist/services/workflows/steps.js.map +1 -1
  356. package/dist/setup-server.js.map +1 -1
  357. package/dist/types.d.ts +33 -4
  358. package/dist/types.d.ts.map +1 -1
  359. package/dist/types.js +26 -2
  360. package/dist/types.js.map +1 -1
  361. package/package.json +26 -3
  362. package/dist/tests/errors.test.d.ts +0 -2
  363. package/dist/tests/errors.test.d.ts.map +0 -1
  364. package/dist/tests/errors.test.js +0 -64
  365. package/dist/tests/errors.test.js.map +0 -1
  366. package/dist/tests/events.test.d.ts +0 -2
  367. package/dist/tests/events.test.d.ts.map +0 -1
  368. package/dist/tests/events.test.js +0 -45
  369. package/dist/tests/events.test.js.map +0 -1
  370. package/dist/tests/featureFlags.test.d.ts +0 -2
  371. package/dist/tests/featureFlags.test.d.ts.map +0 -1
  372. package/dist/tests/featureFlags.test.js +0 -24
  373. package/dist/tests/featureFlags.test.js.map +0 -1
  374. package/dist/tests/integration/queue.test.d.ts +0 -2
  375. package/dist/tests/integration/queue.test.d.ts.map +0 -1
  376. package/dist/tests/integration/queue.test.js +0 -49
  377. package/dist/tests/integration/queue.test.js.map +0 -1
  378. package/dist/tests/plugins.test.d.ts +0 -2
  379. package/dist/tests/plugins.test.d.ts.map +0 -1
  380. package/dist/tests/plugins.test.js +0 -56
  381. package/dist/tests/plugins.test.js.map +0 -1
  382. package/dist/tests/result.test.d.ts +0 -2
  383. package/dist/tests/result.test.d.ts.map +0 -1
  384. package/dist/tests/result.test.js +0 -46
  385. package/dist/tests/result.test.js.map +0 -1
  386. package/dist/tests/setup/configWriter.test.d.ts +0 -2
  387. package/dist/tests/setup/configWriter.test.d.ts.map +0 -1
  388. package/dist/tests/setup/configWriter.test.js +0 -55
  389. package/dist/tests/setup/configWriter.test.js.map +0 -1
  390. package/dist/tests/setup/validation.test.d.ts +0 -2
  391. package/dist/tests/setup/validation.test.d.ts.map +0 -1
  392. package/dist/tests/setup/validation.test.js +0 -26
  393. package/dist/tests/setup/validation.test.js.map +0 -1
  394. package/dist/tests/smoke.test.d.ts +0 -2
  395. package/dist/tests/smoke.test.d.ts.map +0 -1
  396. package/dist/tests/smoke.test.js +0 -124
  397. package/dist/tests/smoke.test.js.map +0 -1
  398. package/src/cli.ts +0 -172
  399. package/src/config.ts +0 -143
  400. package/src/container.ts +0 -48
  401. package/src/db/index.ts +0 -53
  402. package/src/db/migrations/0000_skinny_ben_parker.sql +0 -553
  403. package/src/db/migrations/0001_brief_joseph.sql +0 -10
  404. package/src/db/migrations/0002_add_account_lockout.sql +0 -3
  405. package/src/db/migrations/0003_steep_rachel_grey.sql +0 -1
  406. package/src/db/migrations/0004_clever_bill_hollister.sql +0 -20
  407. package/src/db/migrations/0005_steep_the_call.sql +0 -2
  408. package/src/db/migrations/0006_ambitious_boomer.sql +0 -17
  409. package/src/db/migrations/0007_greedy_vindicator.sql +0 -40
  410. package/src/db/migrations/meta/0000_snapshot.json +0 -2964
  411. package/src/db/migrations/meta/0001_snapshot.json +0 -3031
  412. package/src/db/migrations/meta/0003_snapshot.json +0 -3051
  413. package/src/db/migrations/meta/_journal.json +0 -62
  414. package/src/db/schema.ts +0 -676
  415. package/src/db/seed.ts +0 -146
  416. package/src/di.ts +0 -81
  417. package/src/index.ts +0 -326
  418. package/src/lib/errors.ts +0 -139
  419. package/src/lib/result.ts +0 -44
  420. package/src/lib/webhookSignature.ts +0 -41
  421. package/src/plugins/appContext.ts +0 -76
  422. package/src/plugins/audit.ts +0 -42
  423. package/src/plugins/auth.ts +0 -230
  424. package/src/plugins/metrics.ts +0 -41
  425. package/src/plugins/mtls.ts +0 -94
  426. package/src/plugins/permissions.ts +0 -29
  427. package/src/plugins/rateLimit.ts +0 -133
  428. package/src/plugins/requestLogger.ts +0 -25
  429. package/src/plugins/tracing.ts +0 -22
  430. package/src/repositories/apiKey.ts +0 -158
  431. package/src/repositories/application.ts +0 -70
  432. package/src/repositories/audit.ts +0 -32
  433. package/src/repositories/index.ts +0 -9
  434. package/src/repositories/oidcConnection.ts +0 -111
  435. package/src/repositories/organization.ts +0 -167
  436. package/src/repositories/permission.ts +0 -153
  437. package/src/repositories/samlConnection.ts +0 -96
  438. package/src/repositories/session.ts +0 -86
  439. package/src/repositories/types.ts +0 -134
  440. package/src/repositories/user.ts +0 -161
  441. package/src/routes/admin/billing.ts +0 -48
  442. package/src/routes/admin/helpers.ts +0 -50
  443. package/src/routes/admin/index.ts +0 -16
  444. package/src/routes/admin/organizations.ts +0 -299
  445. package/src/routes/admin/permissions.ts +0 -80
  446. package/src/routes/admin/platform.ts +0 -335
  447. package/src/routes/admin/sso.ts +0 -138
  448. package/src/routes/admin/webhooks.ts +0 -73
  449. package/src/routes/admin.ts +0 -1
  450. package/src/routes/apiKeys.ts +0 -60
  451. package/src/routes/auth.ts +0 -214
  452. package/src/routes/authz.ts +0 -38
  453. package/src/routes/config.ts +0 -67
  454. package/src/routes/emailVerification.ts +0 -73
  455. package/src/routes/federation.ts +0 -156
  456. package/src/routes/helpers.ts +0 -17
  457. package/src/routes/magicLinks.ts +0 -107
  458. package/src/routes/oauth.ts +0 -167
  459. package/src/routes/oauth2.ts +0 -284
  460. package/src/routes/oidcEnterprise.ts +0 -166
  461. package/src/routes/password.ts +0 -90
  462. package/src/routes/profile.ts +0 -44
  463. package/src/routes/saml.ts +0 -209
  464. package/src/routes/scim.ts +0 -199
  465. package/src/routes/sdk.ts +0 -141
  466. package/src/routes/serviceAccounts.ts +0 -124
  467. package/src/routes/sessions.ts +0 -62
  468. package/src/routes/setup.ts +0 -315
  469. package/src/routes/smsOtp.ts +0 -67
  470. package/src/routes/totp.ts +0 -122
  471. package/src/routes/webauthn.ts +0 -147
  472. package/src/routes/workflows.ts +0 -157
  473. package/src/sdk/index.ts +0 -152
  474. package/src/sdk/types.ts +0 -54
  475. package/src/services/anomalyDetection.ts +0 -73
  476. package/src/services/application/authentication.ts +0 -75
  477. package/src/services/application/identity.ts +0 -56
  478. package/src/services/application/index.ts +0 -3
  479. package/src/services/application/organization.ts +0 -77
  480. package/src/services/applications.ts +0 -89
  481. package/src/services/audit.ts +0 -41
  482. package/src/services/auditExport.ts +0 -59
  483. package/src/services/billing.ts +0 -87
  484. package/src/services/cache.ts +0 -131
  485. package/src/services/configuration/profiles.ts +0 -115
  486. package/src/services/configuration.ts +0 -120
  487. package/src/services/connectors/google.ts +0 -92
  488. package/src/services/connectors/oidc.ts +0 -111
  489. package/src/services/connectors/registry.ts +0 -124
  490. package/src/services/connectors/types.ts +0 -38
  491. package/src/services/connectors/zitadel.ts +0 -77
  492. package/src/services/devices.ts +0 -76
  493. package/src/services/domain/authentication.ts +0 -279
  494. package/src/services/domain/authorization.ts +0 -49
  495. package/src/services/domain/identity.ts +0 -108
  496. package/src/services/domain/index.ts +0 -4
  497. package/src/services/domain/organization.ts +0 -114
  498. package/src/services/email.ts +0 -167
  499. package/src/services/emailVerification.ts +0 -75
  500. package/src/services/enterpriseSso.ts +0 -58
  501. package/src/services/events/bus.ts +0 -43
  502. package/src/services/events/subscribers/anomaly.ts +0 -13
  503. package/src/services/events/subscribers/auditLog.ts +0 -21
  504. package/src/services/events/subscribers/webhook.ts +0 -39
  505. package/src/services/events/subscribers/webhookDispatch.ts +0 -14
  506. package/src/services/events/types.ts +0 -106
  507. package/src/services/events/validate.ts +0 -118
  508. package/src/services/featureFlags.ts +0 -90
  509. package/src/services/features.ts +0 -22
  510. package/src/services/federation.ts +0 -30
  511. package/src/services/hibp.ts +0 -28
  512. package/src/services/ipControls.ts +0 -99
  513. package/src/services/magicLinks.ts +0 -51
  514. package/src/services/oauth2.ts +0 -216
  515. package/src/services/organizations.ts +0 -171
  516. package/src/services/permissions.ts +0 -146
  517. package/src/services/plugins/registry.ts +0 -242
  518. package/src/services/plugins/types.ts +0 -98
  519. package/src/services/queue/bullmq.ts +0 -104
  520. package/src/services/queue/inProcess.ts +0 -75
  521. package/src/services/queue/index.ts +0 -19
  522. package/src/services/queue/types.ts +0 -26
  523. package/src/services/redis.ts +0 -16
  524. package/src/services/secrets/awsKms.ts +0 -97
  525. package/src/services/secrets/azureKeyVault.ts +0 -171
  526. package/src/services/secrets/database.ts +0 -166
  527. package/src/services/secrets/environment.ts +0 -117
  528. package/src/services/secrets/index.ts +0 -50
  529. package/src/services/secrets/password.ts +0 -73
  530. package/src/services/secrets/provider.ts +0 -36
  531. package/src/services/secrets/vault.ts +0 -149
  532. package/src/services/secrets.ts +0 -2
  533. package/src/services/serviceAccounts.ts +0 -74
  534. package/src/services/setup/configWriter.ts +0 -200
  535. package/src/services/setup/diagnostics.ts +0 -76
  536. package/src/services/setup/token.ts +0 -42
  537. package/src/services/setup/types.ts +0 -40
  538. package/src/services/setup/validation.ts +0 -205
  539. package/src/services/sms.ts +0 -81
  540. package/src/services/smsOtp.ts +0 -74
  541. package/src/services/tokens.ts +0 -287
  542. package/src/services/totp.ts +0 -113
  543. package/src/services/users.ts +0 -239
  544. package/src/services/webauthn.ts +0 -193
  545. package/src/services/webhooks.ts +0 -190
  546. package/src/services/workflows/engine.ts +0 -125
  547. package/src/services/workflows/steps.ts +0 -129
  548. package/src/services/zitadel.ts +0 -277
  549. package/src/setup-server.ts +0 -71
  550. package/src/tests/errors.test.ts +0 -74
  551. package/src/tests/events.test.ts +0 -52
  552. package/src/tests/featureFlags.test.ts +0 -26
  553. package/src/tests/integration/queue.test.ts +0 -54
  554. package/src/tests/plugins.test.ts +0 -73
  555. package/src/tests/result.test.ts +0 -52
  556. package/src/tests/setup/configWriter.test.ts +0 -69
  557. package/src/tests/setup/validation.test.ts +0 -29
  558. package/src/tests/smoke.test.ts +0 -136
  559. 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
- }