@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,124 +0,0 @@
1
- import { describe, it, before, after } from "node:test";
2
- import assert from "node:assert";
3
- import path from "node:path";
4
- import { fileURLToPath } from "node:url";
5
- process.env.DATABASE_URL = process.env.DATABASE_URL || "postgresql://hilbras:hilbras@localhost:5432/hilbras";
6
- process.env.ZITADEL_DOMAIN = process.env.ZITADEL_DOMAIN || "http://localhost:8080";
7
- process.env.ZITADEL_CLIENT_ID = process.env.ZITADEL_CLIENT_ID || "test-client";
8
- process.env.ZITADEL_CLIENT_SECRET = process.env.ZITADEL_CLIENT_SECRET || "test-secret";
9
- // Generate an ephemeral JWT key pair so JWKS and auth tests don't need the secrets table.
10
- const { generateKeyPair, exportPKCS8, exportSPKI } = await import("jose");
11
- const jwtPair = await generateKeyPair("RS256", { extractable: true });
12
- process.env.JWT_PRIVATE_KEY = await exportPKCS8(jwtPair.privateKey);
13
- process.env.JWT_PUBLIC_KEY = await exportSPKI(jwtPair.publicKey);
14
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
15
- let dbAvailable = false;
16
- before(async () => {
17
- try {
18
- const { migrate } = await import("drizzle-orm/postgres-js/migrator");
19
- const { db } = await import("../db/index.js");
20
- await migrate(db, { migrationsFolder: path.resolve(__dirname, "../db/migrations") });
21
- dbAvailable = true;
22
- }
23
- catch (err) {
24
- console.warn("Postgres not available; skipping DB-dependent smoke tests:", err.message);
25
- }
26
- });
27
- const { buildApp } = await import("../index.js");
28
- // The postgres pool (db/index.ts) and the shared lazy ioredis client
29
- // (services/redis.ts, used by the global rate limiter on every request) are
30
- // process-wide singletons that app.close() does not release. Without this,
31
- // open sockets keep the node:test process alive after all tests finish.
32
- after(async () => {
33
- const { closeDb } = await import("../db/index.js");
34
- const { redis } = await import("../services/redis.js");
35
- await closeDb().catch(() => { });
36
- try {
37
- if (redis.status !== "end")
38
- await redis.quit();
39
- }
40
- catch {
41
- redis.disconnect();
42
- }
43
- });
44
- describe("Hilbras Keystone smoke test", () => {
45
- it("boots and responds to /health", async () => {
46
- const app = await buildApp();
47
- const res = await app.inject({ method: "GET", url: "/health" });
48
- assert.strictEqual(res.statusCode, 200);
49
- const body = JSON.parse(res.body);
50
- assert.strictEqual(body.status, "ok");
51
- await app.close();
52
- });
53
- it("serves OIDC discovery document", async () => {
54
- const app = await buildApp();
55
- const res = await app.inject({ method: "GET", url: "/.well-known/openid-configuration" });
56
- assert.strictEqual(res.statusCode, 200);
57
- const body = JSON.parse(res.body);
58
- assert.strictEqual(body.response_types_supported[0], "code");
59
- assert.ok(body.token_endpoint_auth_methods_supported.includes("client_secret_basic"));
60
- await app.close();
61
- });
62
- it("serves JWKS", async () => {
63
- const app = await buildApp();
64
- const res = await app.inject({ method: "GET", url: "/.well-known/jwks.json" });
65
- assert.strictEqual(res.statusCode, 200);
66
- const body = JSON.parse(res.body);
67
- assert.ok(Array.isArray(body.keys));
68
- await app.close();
69
- });
70
- it("serves Prometheus metrics", async () => {
71
- const app = await buildApp();
72
- const res = await app.inject({ method: "GET", url: "/metrics" });
73
- assert.strictEqual(res.statusCode, 200);
74
- assert.ok(res.body.includes("keystone_http_requests_total"));
75
- await app.close();
76
- });
77
- it("requires authentication for /v1/authz/check", async () => {
78
- const app = await buildApp();
79
- const res = await app.inject({
80
- method: "POST",
81
- url: "/v1/authz/check",
82
- payload: { resource: "application", action: "read" },
83
- });
84
- assert.strictEqual(res.statusCode, 401);
85
- await app.close();
86
- });
87
- it("lists federation providers", async () => {
88
- const app = await buildApp();
89
- const res = await app.inject({ method: "GET", url: "/federation/providers" });
90
- assert.strictEqual(res.statusCode, 200);
91
- const body = JSON.parse(res.body);
92
- assert.ok(Array.isArray(body.providers));
93
- assert.ok(body.providers.some((p) => p.type === "google"));
94
- await app.close();
95
- });
96
- it("exposes admin permissions endpoint", async () => {
97
- const app = await buildApp();
98
- const res = await app.inject({ method: "GET", url: "/v1/admin/permissions" });
99
- assert.strictEqual(res.statusCode, 401);
100
- await app.close();
101
- });
102
- (dbAvailable ? it : it.skip)("registers and logs in a local password user without Zitadel", async () => {
103
- const app = await buildApp();
104
- const email = `smoke-${Date.now()}@example.com`;
105
- const registerRes = await app.inject({
106
- method: "POST",
107
- url: "/auth/register",
108
- payload: { username: `smoke${Date.now()}`, email, password: "SmokeTest123!" },
109
- });
110
- assert.strictEqual(registerRes.statusCode, 200);
111
- const registerBody = JSON.parse(registerRes.body);
112
- assert.strictEqual(registerBody.user.email, email);
113
- const loginRes = await app.inject({
114
- method: "POST",
115
- url: "/auth/login",
116
- payload: { email, password: "SmokeTest123!" },
117
- });
118
- assert.strictEqual(loginRes.statusCode, 200);
119
- const loginBody = JSON.parse(loginRes.body);
120
- assert.strictEqual(loginBody.user.email, email);
121
- await app.close();
122
- });
123
- });
124
- //# sourceMappingURL=smoke.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"smoke.test.js","sourceRoot":"","sources":["../../src/tests/smoke.test.ts"],"names":[],"mappings":"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"}
package/src/cli.ts DELETED
@@ -1,172 +0,0 @@
1
- #!/usr/bin/env node
2
- import { Command } from "commander";
3
-
4
- const program = new Command();
5
-
6
- program.name("keystone").description("Hilbras Keystone CLI").version("1.0.0");
7
-
8
- program
9
- .command("init")
10
- .description("Create a sample .env file for Keystone")
11
- .action(async () => {
12
- console.log("Keystone init: copy .env.example and configure DATABASE_URL, ZITADEL_DOMAIN, etc.");
13
- });
14
-
15
- program
16
- .command("migrate")
17
- .description("Run database migrations")
18
- .action(async () => {
19
- const { migrate } = await import("drizzle-orm/postgres-js/migrator");
20
- const { db } = await import("./db/index.js");
21
- const path = await import("node:path");
22
- const { fileURLToPath } = await import("node:url");
23
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
24
- await migrate(db, { migrationsFolder: path.resolve(__dirname, "./db/migrations") });
25
- console.log("Migrations applied");
26
- });
27
-
28
- program
29
- .command("keys:create")
30
- .description("Generate a JWT signing key pair")
31
- .action(async () => {
32
- const { generateKeyPair, exportPKCS8, exportSPKI } = await import("jose");
33
- const pair = await generateKeyPair("RS256", { extractable: true });
34
- const privateKey = await exportPKCS8(pair.privateKey);
35
- const publicKey = await exportSPKI(pair.publicKey);
36
- console.log("JWT_PRIVATE_KEY=");
37
- console.log(privateKey);
38
- console.log("JWT_PUBLIC_KEY=");
39
- console.log(publicKey);
40
- });
41
-
42
- program
43
- .command("secrets:rotate")
44
- .description("Rotate the active JWT signing key")
45
- .action(async () => {
46
- const { rotateSigningKeys } = await import("./services/secrets/index.js");
47
- const pair = await rotateSigningKeys();
48
- console.log(`Rotated signing key. New key id: ${pair.keyId}`);
49
- });
50
-
51
- program
52
- .command("user:create")
53
- .description("Create a local user account")
54
- .requiredOption("--email <email>", "User email")
55
- .requiredOption("--password <password>", "User password")
56
- .option("--username <username>", "Username")
57
- .option("--name <name>", "Display name")
58
- .option("--role <role>", "Role (e.g. owner, admin, member)", "member")
59
- .action(
60
- async (options: {
61
- email: string;
62
- password: string;
63
- username?: string;
64
- name?: string;
65
- role: string;
66
- }) => {
67
- const { initializeContainer } = await import("./di.js");
68
- const { AuthenticationDomainService } = await import("./services/domain/index.js");
69
- const { db } = await import("./db/index.js");
70
- const { users } = await import("./db/schema.js");
71
- const { eq } = await import("drizzle-orm");
72
-
73
- const container = initializeContainer();
74
- const authService = new AuthenticationDomainService(container.userRepository, container.applicationRepository);
75
- const result = await authService.register({
76
- email: options.email,
77
- password: options.password,
78
- username:
79
- options.username ||
80
- options.email.split("@")[0].toLowerCase().replace(/[^a-z0-9_-]/g, "-").slice(0, 32),
81
- name: options.name,
82
- });
83
-
84
- if (!result.success) {
85
- console.error(`Failed to create user: ${result.error.message}`);
86
- process.exit(1);
87
- }
88
-
89
- if (options.role !== "member") {
90
- await db.update(users).set({ role: options.role }).where(eq(users.id, result.data.user.id));
91
- }
92
-
93
- console.log(`Created user ${result.data.user.id} (${result.data.user.email}) with role ${options.role}`);
94
- }
95
- );
96
-
97
- program
98
- .command("org:create")
99
- .description("Create a new organization")
100
- .requiredOption("--name <name>", "Organization name")
101
- .option("--slug <slug>", "Organization slug")
102
- .option("--plan <plan>", "Billing plan", "free")
103
- .option("--owner-email <email>", "Owner email")
104
- .action(async (options: { name: string; slug?: string; plan: string; ownerEmail?: string }) => {
105
- const { initializeContainer } = await import("./di.js");
106
- const { OrganizationDomainService } = await import("./services/domain/index.js");
107
- const { DrizzleUserRepository, DrizzleOrganizationRepository } = await import(
108
- "./repositories/index.js"
109
- );
110
- const container = initializeContainer();
111
- const orgService = new OrganizationDomainService(
112
- container.organizationRepository,
113
- container.applicationRepository,
114
- container.userRepository
115
- );
116
- const orgResult = await orgService.createOrganization({
117
- name: options.name,
118
- slug: options.slug,
119
- plan: options.plan,
120
- });
121
- if (!orgResult.success) {
122
- console.error(`Failed to create organization: ${orgResult.error.message}`);
123
- process.exit(1);
124
- }
125
- const org = orgResult.data;
126
- if (options.ownerEmail) {
127
- const users = new DrizzleUserRepository();
128
- const owner = await users.findByEmail(options.ownerEmail);
129
- if (owner) {
130
- const orgs = new DrizzleOrganizationRepository();
131
- await orgs.addMembership({
132
- orgId: org.id,
133
- userId: owner.id,
134
- role: "owner",
135
- });
136
- } else {
137
- console.warn(`Owner email ${options.ownerEmail} not found; organization created without owner`);
138
- }
139
- }
140
- console.log(`Created organization ${org.id} (${org.slug})`);
141
- });
142
-
143
- program
144
- .command("keys:list")
145
- .description("List active JWT signing keys")
146
- .action(async () => {
147
- const { listActiveSigningKeys } = await import("./services/secrets/index.js");
148
- const keys = await listActiveSigningKeys();
149
- for (const key of keys) {
150
- console.log(`${key.keyId}\tcreated=${key.createdAt.toISOString()}\texpires=${key.expiresAt?.toISOString() ?? "never"}`);
151
- }
152
- });
153
-
154
- program
155
- .command("config:validate")
156
- .description("Validate required configuration and print status")
157
- .action(async () => {
158
- const { config } = await import("./config.js");
159
- const required = ["DATABASE_URL"];
160
- const missing = required.filter((name) => !process.env[name]);
161
- if (missing.length > 0) {
162
- console.error(`Missing required environment variables: ${missing.join(", ")}`);
163
- process.exit(1);
164
- }
165
- console.log("Configuration OK");
166
- console.log(` DATABASE_URL: ${config.DATABASE_URL.replace(/\/\/.*@/, "//***@")}`);
167
- console.log(` REDIS_URL: ${config.REDIS_URL.replace(/\/\/.*@/, "//***@")}`);
168
- console.log(` Queue provider: ${config.KEYSTONE_QUEUE_PROVIDER || "auto"}`);
169
- console.log(` Secrets provider: ${config.KEYSTONE_SECRETS_PROVIDER}`);
170
- });
171
-
172
- program.parse();
package/src/config.ts DELETED
@@ -1,143 +0,0 @@
1
- import dotenv from "dotenv";
2
- import path from "node:path";
3
- import { fileURLToPath } from "node:url";
4
-
5
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
6
- dotenv.config({ path: path.resolve(__dirname, "../.env") });
7
- dotenv.config();
8
-
9
- function getEnv(name: string, fallback = ""): string {
10
- return process.env[name] ?? fallback;
11
- }
12
-
13
- function requireEnv(name: string): string {
14
- const value = process.env[name];
15
- if (!value) {
16
- throw new Error(`Missing required environment variable: ${name}`);
17
- }
18
- return value;
19
- }
20
-
21
- function requireEnvUnlessSetup(name: string): string {
22
- const value = process.env[name];
23
- if (!value && process.env.KEYSTONE_SETUP_MODE !== "true") {
24
- throw new Error(`Missing required environment variable: ${name}`);
25
- }
26
- return value || "";
27
- }
28
-
29
- function getList(name: string): string[] {
30
- const value = process.env[name];
31
- if (!value) return [];
32
- return value.split(",").map((s) => s.trim()).filter(Boolean);
33
- }
34
-
35
- export const config = {
36
- NODE_ENV: getEnv("NODE_ENV", "development"),
37
- PORT: Number(getEnv("PORT", "4001")),
38
- HOST: getEnv("HOST", "0.0.0.0"),
39
-
40
- DATABASE_URL: requireEnvUnlessSetup("DATABASE_URL"),
41
- REDIS_URL: getEnv("REDIS_URL", "redis://localhost:6379"),
42
-
43
- // Zitadel is now an optional identity connector, not a hard dependency.
44
- ZITADEL_DOMAIN: getEnv("ZITADEL_DOMAIN"),
45
- ZITADEL_ORG_ID: getEnv("ZITADEL_ORG_ID"),
46
- ZITADEL_PROJECT_ID: getEnv("ZITADEL_PROJECT_ID"),
47
-
48
- // Service account used to call Zitadel management/user APIs.
49
- ZITADEL_SERVICE_CLIENT_ID: getEnv("ZITADEL_SERVICE_CLIENT_ID"),
50
- ZITADEL_SERVICE_CLIENT_SECRET: getEnv("ZITADEL_SERVICE_CLIENT_SECRET"),
51
- ZITADEL_SERVICE_PAT: getEnv("ZITADEL_SERVICE_PAT"),
52
-
53
- // Keystone OIDC app registered in Zitadel (for OAuth callbacks).
54
- ZITADEL_CLIENT_ID: getEnv("ZITADEL_CLIENT_ID"),
55
- ZITADEL_CLIENT_SECRET: getEnv("ZITADEL_CLIENT_SECRET"),
56
-
57
- // Optional IdP IDs to skip the Zitadel login selector and go straight to Google/GitHub.
58
- ZITADEL_GOOGLE_IDP_ID: getEnv("ZITADEL_GOOGLE_IDP_ID"),
59
- ZITADEL_GITHUB_IDP_ID: getEnv("ZITADEL_GITHUB_IDP_ID"),
60
-
61
- COOKIE_NAME: getEnv("COOKIE_NAME", "__Host-keystone-session"),
62
- COOKIE_DOMAIN: getEnv("COOKIE_DOMAIN", ".local.hilbras.ai"),
63
- COOKIE_SECURE: getEnv("COOKIE_SECURE", "false") === "true",
64
- COOKIE_SAME_SITE: getEnv("COOKIE_SAME_SITE", getEnv("NODE_ENV", "development") === "production" ? "strict" : "lax") as "strict" | "lax" | "none",
65
-
66
- AUTH_API_PUBLIC_URL: getEnv("AUTH_API_PUBLIC_URL"),
67
- ACCESS_TOKEN_TTL_SECONDS: Number(getEnv("JWT_ACCESS_TOKEN_TTL", "900")),
68
- REFRESH_TOKEN_TTL_SECONDS: Number(getEnv("JWT_REFRESH_TOKEN_TTL", "604800")),
69
-
70
- // RSA PEM keys. If not provided, a new key pair is generated at startup (dev only).
71
- JWT_PRIVATE_KEY: getEnv("JWT_PRIVATE_KEY"),
72
- JWT_PUBLIC_KEY: getEnv("JWT_PUBLIC_KEY"),
73
-
74
- // Optional master encryption key. If omitted, a random key is stored in the secrets table (dev only).
75
- KEYSTONE_ENCRYPTION_KEY: getEnv("KEYSTONE_ENCRYPTION_KEY"),
76
-
77
- // Secrets provider: "database" (default) or "environment".
78
- KEYSTONE_SECRETS_PROVIDER: getEnv("KEYSTONE_SECRETS_PROVIDER", "database"),
79
-
80
- // Queue provider: "in-process" (default/fallback), "bullmq", or "" to auto-select bullmq when REDIS_URL is set.
81
- KEYSTONE_QUEUE_PROVIDER: getEnv("KEYSTONE_QUEUE_PROVIDER", "in-process"),
82
-
83
- // Cache key prefix for Redis/in-memory cache entries.
84
- CACHE_KEY_PREFIX: getEnv("CACHE_KEY_PREFIX", "keystone:"),
85
-
86
- // Comma-separated list of plugin module paths to load at startup.
87
- KEYSTONE_PLUGINS: getEnv("KEYSTONE_PLUGINS"),
88
-
89
- INTERNAL_API_KEY: getEnv("KEYSTONE_INTERNAL_API_KEY") || getEnv("HILBRAS_INTERNAL_API_KEY", ""),
90
-
91
- SEED_OWNER_EMAIL: getEnv("KEYSTONE_SEED_OWNER_EMAIL"),
92
-
93
- ALLOWED_ORIGINS: getList("ALLOWED_ORIGINS"),
94
-
95
- RATE_LIMIT_ATTEMPTS: Number(getEnv("RATE_LIMIT_ATTEMPTS", "5")),
96
- RATE_LIMIT_WINDOW_SECONDS: Number(getEnv("RATE_LIMIT_WINDOW_SECONDS", "900")),
97
- GLOBAL_RATE_LIMIT_MAX: Number(getEnv("GLOBAL_RATE_LIMIT_MAX", "100")),
98
- GLOBAL_RATE_LIMIT_WINDOW: Number(getEnv("GLOBAL_RATE_LIMIT_WINDOW", "60")),
99
-
100
- ACCOUNT_LOCKOUT_THRESHOLD: Number(getEnv("ACCOUNT_LOCKOUT_THRESHOLD", "5")),
101
- ACCOUNT_LOCKOUT_DURATION_SECONDS: Number(getEnv("ACCOUNT_LOCKOUT_DURATION_SECONDS", "1800")),
102
-
103
- HIBP_CHECK_ENABLED: getEnv("HIBP_CHECK_ENABLED", "false") === "true",
104
- // When true, new registrations start unverified and a verification email
105
- // is sent automatically; login still works but emailVerified stays false
106
- // until the user clicks the link.
107
- EMAIL_VERIFICATION_REQUIRED: getEnv("EMAIL_VERIFICATION_REQUIRED", "false") === "true",
108
- MAGIC_LINK_TTL_SECONDS: Number(getEnv("MAGIC_LINK_TTL_SECONDS", "900")),
109
- OAUTH_CODE_TTL_SECONDS: Number(getEnv("OAUTH_CODE_TTL_SECONDS", "60")),
110
- TOTP_ISSUER: getEnv("TOTP_ISSUER", "Hilbras"),
111
- TOTP_ENCRYPTION_KEY: getEnv("KEYSTONE_TOTP_ENCRYPTION_KEY"),
112
- EMAIL_PROVIDER: getEnv("EMAIL_PROVIDER", "none"),
113
- EMAIL_FROM: getEnv("EMAIL_FROM", "keystone@local.hilbras.ai"),
114
- SMTP_HOST: getEnv("SMTP_HOST"),
115
- SMTP_PORT: Number(getEnv("SMTP_PORT", "587")),
116
- SMTP_USER: getEnv("SMTP_USER"),
117
- SMTP_PASS: getEnv("SMTP_PASS"),
118
- SMTP_SECURE: getEnv("SMTP_SECURE", "false") === "true",
119
- SENDGRID_API_KEY: getEnv("SENDGRID_API_KEY"),
120
- MAILGUN_API_KEY: getEnv("MAILGUN_API_KEY"),
121
- MAILGUN_DOMAIN: getEnv("MAILGUN_DOMAIN"),
122
- SMS_PROVIDER: getEnv("SMS_PROVIDER", "none"),
123
- TWILIO_ACCOUNT_SID: getEnv("TWILIO_ACCOUNT_SID"),
124
- TWILIO_AUTH_TOKEN: getEnv("TWILIO_AUTH_TOKEN"),
125
- TWILIO_FROM_NUMBER: getEnv("TWILIO_FROM_NUMBER"),
126
- TWILIO_MESSAGING_SERVICE_SID: getEnv("TWILIO_MESSAGING_SERVICE_SID"),
127
- OTEL_EXPORTER_OTLP_ENDPOINT: getEnv("OTEL_EXPORTER_OTLP_ENDPOINT"),
128
- AUDIT_WEBHOOK_URL: getEnv("AUDIT_WEBHOOK_URL"),
129
- AUDIT_CONSOLE_EXPORT: getEnv("AUDIT_CONSOLE_EXPORT", "false"),
130
- WEBHOOK_SIGNING_SECRET: getEnv("WEBHOOK_SIGNING_SECRET") || getEnv("KEYSTONE_WEBHOOK_SIGNING_SECRET"),
131
- } as const;
132
-
133
- export function zitadelBaseUrl(): string {
134
- if (!config.ZITADEL_DOMAIN) {
135
- throw new Error("Zitadel is not configured");
136
- }
137
- const domain = config.ZITADEL_DOMAIN.replace(/\/$/, "");
138
- return domain.startsWith("http") ? domain : `https://${domain}`;
139
- }
140
-
141
- export function isZitadelConfigured(): boolean {
142
- return Boolean(config.ZITADEL_DOMAIN && config.ZITADEL_CLIENT_ID);
143
- }
package/src/container.ts DELETED
@@ -1,48 +0,0 @@
1
- import type { ConfigurationService } from "./services/configuration.js";
2
- import type { FeatureFlagService } from "./services/features.js";
3
- import type {
4
- UserRepository,
5
- OrganizationRepository,
6
- ApplicationRepository,
7
- AuditRepository,
8
- IdentityRepository,
9
- PermissionRepository,
10
- } from "./repositories/types.js";
11
- import type { ApiKeyRepository } from "./repositories/apiKey.js";
12
- import type { SamlConnectionRepository } from "./repositories/samlConnection.js";
13
- import type { OidcConnectionRepository } from "./repositories/oidcConnection.js";
14
- import type { SecretsProvider } from "./services/secrets/provider.js";
15
- import type { Queue } from "./services/queue/types.js";
16
-
17
- export interface Container {
18
- config: ConfigurationService;
19
- features: FeatureFlagService;
20
- userRepository: UserRepository;
21
- identityRepository: IdentityRepository;
22
- organizationRepository: OrganizationRepository;
23
- applicationRepository: ApplicationRepository;
24
- auditRepository: AuditRepository;
25
- permissionRepository: PermissionRepository;
26
- apiKeyRepository: ApiKeyRepository;
27
- samlConnectionRepository: SamlConnectionRepository;
28
- oidcConnectionRepository: OidcConnectionRepository;
29
- secretsProvider: SecretsProvider;
30
- queue: Queue;
31
- }
32
-
33
- let globalContainer: Container | null = null;
34
-
35
- export function setContainer(container: Container): void {
36
- globalContainer = container;
37
- }
38
-
39
- export function getContainer(): Container {
40
- if (!globalContainer) {
41
- throw new Error("DI container has not been initialized");
42
- }
43
- return globalContainer;
44
- }
45
-
46
- export function resolve<K extends keyof Container>(key: K): Container[K] {
47
- return getContainer()[key];
48
- }
package/src/db/index.ts DELETED
@@ -1,53 +0,0 @@
1
- import { drizzle } from "drizzle-orm/postgres-js";
2
- import postgres from "postgres";
3
- import type { PostgresJsDatabase } from "drizzle-orm/postgres-js";
4
- import { config } from "../config.js";
5
- import * as schema from "./schema.js";
6
-
7
- let dbClient: postgres.Sql | null = null;
8
-
9
- /**
10
- * Live binding for the Drizzle database client. Re-assigned by `initDb()` once
11
- * DATABASE_URL is known. ES module imports see the updated value, so existing
12
- * code that imports `db` continues to work after configuration changes.
13
- */
14
- export let db: PostgresJsDatabase<typeof schema>;
15
-
16
- export function initDb(): void {
17
- const databaseUrl = config.DATABASE_URL;
18
- if (!databaseUrl) {
19
- throw new Error("DATABASE_URL is not configured");
20
- }
21
- if (dbClient) {
22
- dbClient.end().catch(() => {});
23
- }
24
- dbClient = postgres(databaseUrl, { max: 10 });
25
- db = drizzle(dbClient, { schema });
26
- }
27
-
28
- export function getDb(): PostgresJsDatabase<typeof schema> {
29
- if (!db) {
30
- initDb();
31
- }
32
- return db;
33
- }
34
-
35
- /**
36
- * Close the underlying connection pool. Used on graceful shutdown and in tests
37
- * so pooled sockets do not keep the Node process alive after work is done.
38
- */
39
- export async function closeDb(): Promise<void> {
40
- if (dbClient) {
41
- const client = dbClient;
42
- dbClient = null;
43
- await client.end({ timeout: 5 });
44
- }
45
- }
46
-
47
- export { schema };
48
-
49
- // Initialize immediately when DATABASE_URL is available so existing code paths
50
- // keep working without an explicit initDb() call.
51
- if (config.DATABASE_URL) {
52
- initDb();
53
- }