@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,193 +0,0 @@
1
- import crypto from "node:crypto";
2
- import { eq } from "drizzle-orm";
3
- import {
4
- generateRegistrationOptions,
5
- verifyRegistrationResponse,
6
- generateAuthenticationOptions,
7
- verifyAuthenticationResponse,
8
- type RegistrationResponseJSON,
9
- type AuthenticationResponseJSON,
10
- type AuthenticatorTransport,
11
- } from "@simplewebauthn/server";
12
- import { db } from "../db/index.js";
13
- import {
14
- webauthnCredentials,
15
- users,
16
- type User,
17
- type WebAuthnCredential as DbWebAuthnCredential,
18
- } from "../db/schema.js";
19
- import { config } from "../config.js";
20
-
21
- const RP_NAME = "Hilbras Keystone";
22
-
23
- function rpID(): string {
24
- const url = config.AUTH_API_PUBLIC_URL || `http://localhost:${config.PORT}`;
25
- return new URL(url).hostname;
26
- }
27
-
28
- function origin(): string {
29
- return config.AUTH_API_PUBLIC_URL || `http://localhost:${config.PORT}`;
30
- }
31
-
32
- export interface WebAuthnChallenge {
33
- challenge: string;
34
- userId?: string;
35
- expiresAt: number;
36
- }
37
-
38
- const challenges = new Map<string, WebAuthnChallenge>();
39
-
40
- function cleanupChallenges(): void {
41
- const now = Date.now();
42
- for (const [key, value] of challenges) {
43
- if (value.expiresAt < now) challenges.delete(key);
44
- }
45
- }
46
-
47
- export function createChallenge(userId?: string): string {
48
- cleanupChallenges();
49
- const challenge = crypto.randomBytes(32).toString("base64url");
50
- challenges.set(challenge, { challenge, userId, expiresAt: Date.now() + 5 * 60 * 1000 });
51
- return challenge;
52
- }
53
-
54
- export function consumeChallenge(challenge: string): WebAuthnChallenge | undefined {
55
- const record = challenges.get(challenge);
56
- challenges.delete(challenge);
57
- if (!record) return undefined;
58
- if (record.expiresAt < Date.now()) return undefined;
59
- return record;
60
- }
61
-
62
- export async function listCredentialsByUser(userId: string): Promise<DbWebAuthnCredential[]> {
63
- return db.select().from(webauthnCredentials).where(eq(webauthnCredentials.userId, userId));
64
- }
65
-
66
- export async function findCredentialById(credentialId: string): Promise<DbWebAuthnCredential | undefined> {
67
- const [record] = await db
68
- .select()
69
- .from(webauthnCredentials)
70
- .where(eq(webauthnCredentials.credentialId, credentialId))
71
- .limit(1);
72
- return record;
73
- }
74
-
75
- export async function buildRegistrationOptions(user: User) {
76
- const options = await generateRegistrationOptions({
77
- rpName: RP_NAME,
78
- rpID: rpID(),
79
- userName: user.email,
80
- userDisplayName: user.name || user.username,
81
- userID: Buffer.from(user.id, "utf8"),
82
- challenge: createChallenge(user.id),
83
- attestationType: "none",
84
- authenticatorSelection: {
85
- residentKey: "preferred",
86
- userVerification: "preferred",
87
- },
88
- });
89
- return options;
90
- }
91
-
92
- export async function verifyAndStoreRegistration(
93
- user: User,
94
- response: RegistrationResponseJSON,
95
- expectedChallenge: string,
96
- deviceName?: string
97
- ) {
98
- const verification = await verifyRegistrationResponse({
99
- response,
100
- expectedChallenge,
101
- expectedOrigin: origin(),
102
- expectedRPID: rpID(),
103
- requireUserVerification: false,
104
- });
105
-
106
- if (!verification.verified || !verification.registrationInfo) {
107
- throw new Error("WebAuthn registration verification failed");
108
- }
109
-
110
- const info = verification.registrationInfo;
111
- const credential = info.credential;
112
- await db.insert(webauthnCredentials).values({
113
- userId: user.id,
114
- credentialId: credential.id,
115
- publicKey: Buffer.from(credential.publicKey).toString("base64url"),
116
- counter: credential.counter,
117
- transports: (credential.transports || []) as AuthenticatorTransport[],
118
- aaguid: info.aaguid || null,
119
- deviceName: deviceName || null,
120
- });
121
-
122
- return { verified: true };
123
- }
124
-
125
- export async function buildAuthenticationOptions(email?: string) {
126
- let allowCredentials:
127
- | { id: string; type: "public-key"; transports?: AuthenticatorTransport[] }[]
128
- | undefined;
129
- let userId: string | undefined;
130
-
131
- if (email) {
132
- const [user] = await db.select().from(users).where(eq(users.email, email.toLowerCase())).limit(1);
133
- if (user) {
134
- userId = user.id;
135
- const credentials = await listCredentialsByUser(user.id);
136
- allowCredentials = credentials.map((c) => ({
137
- id: c.credentialId,
138
- type: "public-key" as const,
139
- transports: (c.transports || []) as AuthenticatorTransport[],
140
- }));
141
- }
142
- }
143
-
144
- const options = await generateAuthenticationOptions({
145
- rpID: rpID(),
146
- challenge: createChallenge(userId),
147
- allowCredentials,
148
- userVerification: "preferred",
149
- });
150
-
151
- return options;
152
- }
153
-
154
- export async function verifyAuthentication(response: AuthenticationResponseJSON, expectedChallenge: string) {
155
- const credentialId = response.id;
156
- const credential = await findCredentialById(credentialId);
157
- if (!credential) {
158
- throw new Error("Credential not found");
159
- }
160
-
161
- const verification = await verifyAuthenticationResponse({
162
- response,
163
- expectedChallenge,
164
- expectedOrigin: origin(),
165
- expectedRPID: rpID(),
166
- credential: {
167
- id: credential.credentialId,
168
- publicKey: Buffer.from(credential.publicKey, "base64url"),
169
- counter: credential.counter,
170
- transports: (credential.transports || []) as AuthenticatorTransport[],
171
- },
172
- requireUserVerification: false,
173
- });
174
-
175
- if (!verification.verified) {
176
- throw new Error("WebAuthn authentication verification failed");
177
- }
178
-
179
- await db
180
- .update(webauthnCredentials)
181
- .set({
182
- counter: verification.authenticationInfo.newCounter,
183
- lastUsedAt: new Date(),
184
- })
185
- .where(eq(webauthnCredentials.id, credential.id));
186
-
187
- const [user] = await db.select().from(users).where(eq(users.id, credential.userId)).limit(1);
188
- if (!user) {
189
- throw new Error("User not found");
190
- }
191
-
192
- return { verified: true, user };
193
- }
@@ -1,190 +0,0 @@
1
- import crypto from "node:crypto";
2
- import { and, desc, eq } from "drizzle-orm";
3
- import { db } from "../db/index.js";
4
- import { webhookDeliveries, webhookEndpoints, type WebhookEndpoint } from "../db/schema.js";
5
- import { signWebhookPayload } from "../lib/webhookSignature.js";
6
- import { queue } from "./queue/index.js";
7
- import type { KeystoneEvent } from "./events/types.js";
8
-
9
- const MAX_ATTEMPTS = 5;
10
- const RETRY_DELAY_MS = 30_000;
11
-
12
- export type { WebhookEndpoint };
13
-
14
- export async function listEndpoints(appId?: string) {
15
- if (appId) {
16
- return db.select().from(webhookEndpoints).where(eq(webhookEndpoints.appId, appId)).orderBy(webhookEndpoints.createdAt);
17
- }
18
- return db.select().from(webhookEndpoints).orderBy(webhookEndpoints.createdAt);
19
- }
20
-
21
- export async function createEndpoint(input: {
22
- appId?: string | null;
23
- url: string;
24
- description?: string;
25
- events?: string[];
26
- }): Promise<WebhookEndpoint & { signingSecret: string }> {
27
- const secret = `whsec_${crypto.randomBytes(24).toString("base64url")}`;
28
- const [endpoint] = await db
29
- .insert(webhookEndpoints)
30
- .values({
31
- appId: input.appId ?? null,
32
- url: input.url,
33
- description: input.description ?? null,
34
- events: input.events ?? [],
35
- secret,
36
- })
37
- .returning();
38
- return { ...endpoint, signingSecret: secret };
39
- }
40
-
41
- export async function updateEndpoint(
42
- id: string,
43
- input: Partial<{ url: string; description: string | null; events: string[]; isActive: boolean }>
44
- ) {
45
- const [updated] = await db
46
- .update(webhookEndpoints)
47
- .set({ ...input, updatedAt: new Date() })
48
- .where(eq(webhookEndpoints.id, id))
49
- .returning();
50
- return updated;
51
- }
52
-
53
- export async function deleteEndpoint(id: string) {
54
- const [deleted] = await db.delete(webhookEndpoints).where(eq(webhookEndpoints.id, id)).returning();
55
- return deleted;
56
- }
57
-
58
- export async function rotateEndpointSecret(id: string) {
59
- const secret = `whsec_${crypto.randomBytes(24).toString("base64url")}`;
60
- const [updated] = await db
61
- .update(webhookEndpoints)
62
- .set({ secret, updatedAt: new Date() })
63
- .where(eq(webhookEndpoints.id, id))
64
- .returning();
65
- return updated ? { endpoint: updated, signingSecret: secret } : undefined;
66
- }
67
-
68
- export async function listDeliveries(endpointId: string, limit = 50) {
69
- return db
70
- .select()
71
- .from(webhookDeliveries)
72
- .where(eq(webhookDeliveries.endpointId, endpointId))
73
- .orderBy(desc(webhookDeliveries.createdAt))
74
- .limit(limit);
75
- }
76
-
77
- /**
78
- * Fan an event out to every active endpoint subscribed to it.
79
- * Each delivery is persisted first, then handed to the queue worker.
80
- */
81
- export async function dispatchEvent(event: KeystoneEvent): Promise<void> {
82
- const endpoints = await db.select().from(webhookEndpoints).where(eq(webhookEndpoints.isActive, true));
83
-
84
- for (const endpoint of endpoints) {
85
- // App-scoped endpoints only receive events for their own application.
86
- if (endpoint.appId && event.payload.appId && endpoint.appId !== event.payload.appId) continue;
87
- if (endpoint.events.length > 0 && !endpoint.events.includes(event.type)) continue;
88
-
89
- const body = {
90
- id: crypto.randomUUID(),
91
- type: event.type,
92
- version: event.version,
93
- timestamp: event.timestamp,
94
- payload: event.payload,
95
- };
96
-
97
- const [delivery] = await db
98
- .insert(webhookDeliveries)
99
- .values({ endpointId: endpoint.id, eventType: event.type, payload: body })
100
- .returning();
101
-
102
- await queue.enqueue({
103
- type: "webhook-delivery",
104
- payload: { deliveryId: delivery.id },
105
- });
106
- }
107
- }
108
-
109
- export async function deliverNow(deliveryId: string): Promise<void> {
110
- const [delivery] = await db.select().from(webhookDeliveries).where(eq(webhookDeliveries.id, deliveryId)).limit(1);
111
- if (!delivery) return;
112
-
113
- const [endpoint] = await db.select().from(webhookEndpoints).where(eq(webhookEndpoints.id, delivery.endpointId)).limit(1);
114
- if (!endpoint || !endpoint.isActive) return;
115
-
116
- const attempts = delivery.attempts + 1;
117
- const now = new Date();
118
-
119
- try {
120
- const response = await fetch(endpoint.url, {
121
- method: "POST",
122
- headers: {
123
- "Content-Type": "application/json",
124
- "X-Keystone-Signature": signWebhookPayload(endpoint.secret, delivery.payload),
125
- "X-Keystone-Event": delivery.eventType,
126
- "X-Keystone-Delivery": delivery.id,
127
- },
128
- body: JSON.stringify(delivery.payload),
129
- signal: AbortSignal.timeout(10_000),
130
- });
131
-
132
- const responseBody = (await response.text()).slice(0, 2000);
133
- await db
134
- .update(webhookDeliveries)
135
- .set({
136
- attempts,
137
- lastAttemptAt: now,
138
- responseStatus: response.status,
139
- responseBody,
140
- status: response.ok ? "success" : "failed",
141
- })
142
- .where(eq(webhookDeliveries.id, deliveryId));
143
-
144
- if (!response.ok && attempts < MAX_ATTEMPTS) {
145
- await retryLater(deliveryId);
146
- }
147
- } catch (err) {
148
- await db
149
- .update(webhookDeliveries)
150
- .set({
151
- attempts,
152
- lastAttemptAt: now,
153
- responseBody: err instanceof Error ? err.message.slice(0, 2000) : "Delivery error",
154
- status: attempts >= MAX_ATTEMPTS ? "failed" : "pending",
155
- })
156
- .where(eq(webhookDeliveries.id, deliveryId));
157
-
158
- if (attempts < MAX_ATTEMPTS) {
159
- await retryLater(deliveryId);
160
- }
161
- }
162
- }
163
-
164
- async function retryLater(deliveryId: string): Promise<void> {
165
- setTimeout(() => {
166
- queue.enqueue({ type: "webhook-delivery", payload: { deliveryId } }).catch((err: unknown) => {
167
- console.error("[webhooks] failed to re-enqueue delivery:", err);
168
- });
169
- }, RETRY_DELAY_MS).unref();
170
- }
171
-
172
- /** Manual retry from the dashboard: reset to pending and enqueue. */
173
- export async function retryDelivery(deliveryId: string): Promise<boolean> {
174
- const [updated] = await db
175
- .update(webhookDeliveries)
176
- .set({ status: "pending" })
177
- .where(and(eq(webhookDeliveries.id, deliveryId), eq(webhookDeliveries.status, "failed")))
178
- .returning();
179
- if (!updated) return false;
180
- await queue.enqueue({ type: "webhook-delivery", payload: { deliveryId } });
181
- return true;
182
- }
183
-
184
- /** Register the delivery worker with the queue. */
185
- export function startWebhookWorker(): void {
186
- queue.process("webhook-delivery", async (job) => {
187
- const { deliveryId } = job.payload as { deliveryId: string };
188
- await deliverNow(deliveryId);
189
- });
190
- }
@@ -1,125 +0,0 @@
1
- import { eq, and } from "drizzle-orm";
2
- import { db } from "../../db/index.js";
3
- import { workflows, workflowRuns, type Workflow, type WorkflowRun } from "../../db/schema.js";
4
- import { findUserById } from "../users.js";
5
- import { subscribe } from "../events/bus.js";
6
- import type { KeystoneEvent } from "../events/types.js";
7
- import { queue } from "../queue/index.js";
8
- import { executeStep, type WorkflowStep } from "./steps.js";
9
-
10
- export interface WorkflowDefinition {
11
- steps: WorkflowStep[];
12
- [key: string]: unknown;
13
- }
14
-
15
- let loaded = false;
16
-
17
- export async function loadWorkflows(): Promise<void> {
18
- if (loaded) return;
19
- loaded = true;
20
-
21
- const activeWorkflows = await db
22
- .select()
23
- .from(workflows)
24
- .where(and(eq(workflows.isActive, true)));
25
-
26
- for (const workflow of activeWorkflows) {
27
- subscribe(workflow.trigger, async (event) => {
28
- await triggerWorkflowRun(workflow, event);
29
- });
30
- }
31
- }
32
-
33
- export async function registerWorkflow(input: {
34
- orgId?: string;
35
- name: string;
36
- trigger: string;
37
- definition: WorkflowDefinition;
38
- }): Promise<Workflow> {
39
- const [workflow] = await db
40
- .insert(workflows)
41
- .values({
42
- orgId: input.orgId ?? null,
43
- name: input.name,
44
- trigger: input.trigger,
45
- definition: input.definition,
46
- })
47
- .returning();
48
- subscribe(workflow.trigger, async (event) => {
49
- await triggerWorkflowRun(workflow, event);
50
- });
51
- return workflow;
52
- }
53
-
54
- export async function triggerWorkflowRun(workflow: Workflow, event: KeystoneEvent): Promise<WorkflowRun> {
55
- const [run] = await db
56
- .insert(workflowRuns)
57
- .values({
58
- workflowId: workflow.id,
59
- triggerEvent: event.type,
60
- payload: event.payload as Record<string, unknown>,
61
- status: "running",
62
- startedAt: new Date(),
63
- })
64
- .returning();
65
-
66
- // Dispatch to the background queue so the HTTP response is not blocked.
67
- await queue.enqueue({
68
- type: "workflow_run",
69
- payload: { runId: run.id, workflowId: workflow.id },
70
- });
71
-
72
- return run;
73
- }
74
-
75
- export async function executeRunById(runId: string, workflowId: string): Promise<void> {
76
- const [run] = await db.select().from(workflowRuns).where(eq(workflowRuns.id, runId)).limit(1);
77
- const [workflow] = await db.select().from(workflows).where(eq(workflows.id, workflowId)).limit(1);
78
- if (!run || !workflow) {
79
- console.error(`[workflow-engine] run or workflow not found: ${runId}, ${workflowId}`);
80
- return;
81
- }
82
- await executeRun(run, workflow);
83
- }
84
-
85
- async function executeRun(run: WorkflowRun, workflow: Workflow): Promise<void> {
86
- const definition = (workflow.definition ?? { steps: [] }) as WorkflowDefinition;
87
- const payload = (run.payload ?? {}) as Record<string, unknown>;
88
- const userId = payload.userId as string | undefined;
89
- const user = userId ? await findUserById(userId) : undefined;
90
- const outputs: Record<string, string> = {};
91
- const log: Array<{ step: string; status: string; output?: Record<string, string>; error?: string }> = [];
92
-
93
- for (const step of definition.steps ?? []) {
94
- const result = await executeStep(step, { payload, outputs, user });
95
- if (result.output) {
96
- Object.assign(outputs, result.output);
97
- if (step.name) outputs[step.name] = Object.values(result.output)[0] ?? "";
98
- }
99
- log.push({
100
- step: step.type,
101
- status: result.error ? "failed" : "ok",
102
- output: result.output,
103
- error: result.error,
104
- });
105
- if (result.error) {
106
- await db
107
- .update(workflowRuns)
108
- .set({ status: "failed", finishedAt: new Date(), log })
109
- .where(eq(workflowRuns.id, run.id));
110
- return;
111
- }
112
- }
113
-
114
- await db
115
- .update(workflowRuns)
116
- .set({ status: "completed", finishedAt: new Date(), log })
117
- .where(eq(workflowRuns.id, run.id));
118
- }
119
-
120
- export async function listWorkflowRuns(workflowId?: string): Promise<WorkflowRun[]> {
121
- if (workflowId) {
122
- return db.select().from(workflowRuns).where(eq(workflowRuns.workflowId, workflowId));
123
- }
124
- return db.select().from(workflowRuns);
125
- }
@@ -1,129 +0,0 @@
1
- import { createOrganization, addOrgMembership, findOrganizationBySlug } from "../organizations.js";
2
- import { findApplicationByClientId } from "../applications.js";
3
- import { updateUser } from "../users.js";
4
- import { queue } from "../queue/index.js";
5
- import { getPluginWorkflowStep } from "../plugins/registry.js";
6
- import type { EmailMessage } from "../email.js";
7
- import type { User } from "../../db/schema.js";
8
-
9
- export interface StepContext {
10
- payload: Record<string, unknown>;
11
- outputs: Record<string, string>;
12
- user?: User;
13
- }
14
-
15
- export interface WorkflowStep {
16
- type: string;
17
- name?: string;
18
- [key: string]: unknown;
19
- }
20
-
21
- export interface StepResult {
22
- output?: Record<string, string>;
23
- error?: string;
24
- }
25
-
26
- function interpolate(template: string, context: StepContext): string {
27
- return template.replace(/\{\{(\w+)\}\}/g, (_, key) => {
28
- const value = context.payload[key] ?? context.outputs[key] ?? "";
29
- return String(value);
30
- });
31
- }
32
-
33
- export async function executeStep(step: WorkflowStep, context: StepContext): Promise<StepResult> {
34
- const log = (msg: string) => console.log(`[workflow] step ${step.type}: ${msg}`);
35
-
36
- switch (step.type) {
37
- case "assign_role": {
38
- const role = String(step.role || "user");
39
- if (context.user) {
40
- await updateUser(context.user.id, { role });
41
- log(`assigned role ${role} to ${context.user.id}`);
42
- }
43
- return {};
44
- }
45
-
46
- case "create_organization": {
47
- const nameTemplate = String(step.orgName || "{{username}}-personal");
48
- const name = interpolate(nameTemplate, context);
49
- const slugTemplate = String(step.slug || "{{username}}-personal");
50
- const slug = interpolate(slugTemplate, context);
51
- const existing = await findOrganizationBySlug(slug);
52
- if (existing) {
53
- return { output: { [String(step.outputKey || "orgId")]: existing.id } };
54
- }
55
- const org = await createOrganization({ name, slug });
56
- log(`created organization ${org.id}`);
57
- return { output: { [String(step.outputKey || "orgId")]: org.id } };
58
- }
59
-
60
- case "add_membership": {
61
- const userId = context.user?.id;
62
- if (!userId) return { error: "missing user" };
63
- const orgRef = String(step.orgRef || "personalOrgId");
64
- const orgId = context.outputs[orgRef];
65
- if (!orgId) return { error: `missing output ${orgRef}` };
66
- const role = String(step.role || "member");
67
- await addOrgMembership({ orgId, userId, role: role as import("../organizations.js").OrgRole });
68
- log(`added membership ${userId} -> ${orgId} as ${role}`);
69
- return {};
70
- }
71
-
72
- case "add_app_membership": {
73
- const userId = context.user?.id;
74
- if (!userId) return { error: "missing user" };
75
- const clientId = String(step.clientId || context.payload.client_id || "");
76
- if (!clientId) return { error: "missing client_id" };
77
- const app = await findApplicationByClientId(clientId);
78
- if (!app) return { error: "application not found" };
79
- await addOrgMembership({ orgId: app.orgId, userId, role: "member" });
80
- log(`added app membership ${userId} -> ${app.orgId}`);
81
- return {};
82
- }
83
-
84
- case "send_email": {
85
- const to = String(step.to || context.user?.email || "");
86
- if (!to) return { error: "missing email" };
87
- const message: EmailMessage = {
88
- to,
89
- subject: String(step.subject || "Hilbras notification"),
90
- text: String(step.text || ""),
91
- };
92
- await queue.enqueue({ type: "email", payload: { message } });
93
- log(`enqueued email to ${to}`);
94
- return {};
95
- }
96
-
97
- case "send_welcome_email": {
98
- const to = context.user?.email;
99
- if (!to || !context.user) return { error: "missing user email" };
100
- const message: EmailMessage = {
101
- to,
102
- subject: "Welcome to Hilbras",
103
- text: `Hi ${context.user.name || context.user.username},\n\nWelcome to Hilbras! Your account has been created.`,
104
- };
105
- await queue.enqueue({ type: "email", payload: { message } });
106
- log(`enqueued welcome email to ${to}`);
107
- return {};
108
- }
109
-
110
- case "webhook": {
111
- const url = String(step.url || "");
112
- if (!url) return { error: "missing webhook url" };
113
- await queue.enqueue({
114
- type: "webhook",
115
- payload: { url, method: String(step.method || "POST"), body: context.payload },
116
- });
117
- log(`enqueued webhook ${url}`);
118
- return {};
119
- }
120
-
121
- default: {
122
- const pluginExecutor = getPluginWorkflowStep(step.type);
123
- if (pluginExecutor) {
124
- return pluginExecutor(step, context);
125
- }
126
- return { error: `unknown step type ${step.type}` };
127
- }
128
- }
129
- }