@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,147 +0,0 @@
1
- import { z } from "zod";
2
- import type { FastifyInstance, FastifyRequest, FastifyReply } from "fastify";
3
- import {
4
- type RegistrationResponseJSON,
5
- type AuthenticationResponseJSON,
6
- } from "@simplewebauthn/server";
7
- import {
8
- buildRegistrationOptions,
9
- verifyAndStoreRegistration,
10
- buildAuthenticationOptions,
11
- verifyAuthentication,
12
- consumeChallenge,
13
- } from "../services/webauthn.js";
14
- import { createTokenSet } from "../services/tokens.js";
15
- import { setSessionCookies } from "../plugins/auth.js";
16
- import { fingerprintFromRequest, recordDevice } from "../services/devices.js";
17
- import { toPublicUser } from "../types.js";
18
-
19
- const ChallengeCookieName = "keystone_webauthn_challenge";
20
-
21
- function setChallengeCookie(reply: FastifyReply, challenge: string): void {
22
- reply.setCookie(ChallengeCookieName, challenge, {
23
- path: "/",
24
- httpOnly: true,
25
- secure: process.env.COOKIE_SECURE === "true",
26
- sameSite: "lax",
27
- maxAge: 300,
28
- });
29
- }
30
-
31
- function getChallengeCookie(request: FastifyRequest): string | undefined {
32
- return request.cookies[ChallengeCookieName];
33
- }
34
-
35
- function clearChallengeCookie(reply: FastifyReply): void {
36
- reply.clearCookie(ChallengeCookieName, { path: "/" });
37
- }
38
-
39
- const RegisterVerifySchema = z.object({
40
- response: z.record(z.string(), z.unknown()),
41
- deviceName: z.string().max(100).optional(),
42
- });
43
-
44
- const AuthenticateOptionsSchema = z.object({
45
- email: z.string().email().optional(),
46
- });
47
-
48
- const AuthenticateVerifySchema = z.object({
49
- response: z.record(z.string(), z.unknown()),
50
- });
51
-
52
- export default async function webauthnRoutes(app: FastifyInstance) {
53
- app.get(
54
- "/webauthn/register/options",
55
- { preHandler: [app.authenticate] },
56
- async (request: FastifyRequest, reply: FastifyReply) => {
57
- const user = request.user!;
58
- const options = await buildRegistrationOptions(user);
59
- setChallengeCookie(reply, options.challenge);
60
- return options;
61
- }
62
- );
63
-
64
- app.post(
65
- "/webauthn/register/verify",
66
- { preHandler: [app.authenticate] },
67
- async (request: FastifyRequest, reply: FastifyReply) => {
68
- const user = request.user!;
69
- const body = RegisterVerifySchema.parse(request.body);
70
- const challenge = getChallengeCookie(request);
71
- if (!challenge) {
72
- return reply.status(400).send({ error: "Challenge expired or missing" });
73
- }
74
-
75
- const stored = consumeChallenge(challenge);
76
- if (!stored || stored.userId !== user.id) {
77
- clearChallengeCookie(reply);
78
- return reply.status(400).send({ error: "Invalid challenge" });
79
- }
80
-
81
- try {
82
- await verifyAndStoreRegistration(
83
- user,
84
- body.response as unknown as RegistrationResponseJSON,
85
- challenge,
86
- body.deviceName
87
- );
88
- clearChallengeCookie(reply);
89
- await request.audit("webauthn_registered", { userId: user.id });
90
- return { success: true };
91
- } catch (err) {
92
- const message = err instanceof Error ? err.message : "Registration failed";
93
- return reply.status(400).send({ error: message });
94
- }
95
- }
96
- );
97
-
98
- app.post("/webauthn/authenticate/options", async (request: FastifyRequest, reply: FastifyReply) => {
99
- const body = AuthenticateOptionsSchema.parse(request.body);
100
- const options = await buildAuthenticationOptions(body.email);
101
- setChallengeCookie(reply, options.challenge);
102
- return options;
103
- });
104
-
105
- app.post("/webauthn/authenticate/verify", async (request: FastifyRequest, reply: FastifyReply) => {
106
- const body = AuthenticateVerifySchema.parse(request.body);
107
- const challenge = getChallengeCookie(request);
108
- if (!challenge) {
109
- return reply.status(400).send({ error: "Challenge expired or missing" });
110
- }
111
-
112
- const stored = consumeChallenge(challenge);
113
- if (!stored) {
114
- clearChallengeCookie(reply);
115
- return reply.status(400).send({ error: "Invalid challenge" });
116
- }
117
-
118
- try {
119
- const { user } = await verifyAuthentication(
120
- body.response as unknown as AuthenticationResponseJSON,
121
- challenge
122
- );
123
- clearChallengeCookie(reply);
124
-
125
- const fingerprint = fingerprintFromRequest(request);
126
- await recordDevice(user.id, fingerprint, request.ip, request.headers["user-agent"]);
127
- const tokens = await createTokenSet(
128
- user,
129
- request.ip,
130
- request.headers["user-agent"],
131
- {},
132
- fingerprint
133
- );
134
- setSessionCookies(reply, tokens.accessToken, tokens.refreshToken);
135
-
136
- await request.audit("webauthn_authenticated", { userId: user.id });
137
- return {
138
- user: toPublicUser(user),
139
- accessToken: tokens.accessToken,
140
- refreshToken: tokens.refreshToken,
141
- };
142
- } catch (err) {
143
- const message = err instanceof Error ? err.message : "Authentication failed";
144
- return reply.status(400).send({ error: message });
145
- }
146
- });
147
- }
@@ -1,157 +0,0 @@
1
- import { z } from "zod";
2
- import type { FastifyInstance, FastifyRequest, FastifyReply } from "fastify";
3
- import { eq, and } from "drizzle-orm";
4
- import { db } from "../db/index.js";
5
- import { workflows, orgMemberships } from "../db/schema.js";
6
- import { registerWorkflow, listWorkflowRuns } from "../services/workflows/engine.js";
7
-
8
- const WorkflowStepSchema = z.object({
9
- type: z.string(),
10
- name: z.string().optional(),
11
- });
12
-
13
- const CreateWorkflowSchema = z.object({
14
- orgId: z.string().uuid(),
15
- name: z.string().min(1).max(255),
16
- trigger: z.enum(["user_registered", "user_login", "organization_created"]),
17
- definition: z.object({
18
- steps: z.array(WorkflowStepSchema.and(z.record(z.string(), z.unknown()))),
19
- }),
20
- isActive: z.boolean().optional(),
21
- });
22
-
23
- async function requireOrgMembership(request: FastifyRequest, reply: FastifyReply, orgId: string) {
24
- await request.server.authenticate(request, reply);
25
- if (reply.sent) return false;
26
-
27
- const userId = request.user!.id;
28
- const [membership] = await db
29
- .select()
30
- .from(orgMemberships)
31
- .where(and(eq(orgMemberships.orgId, orgId), eq(orgMemberships.userId, userId)))
32
- .limit(1);
33
-
34
- if (!membership) {
35
- reply.status(403).send({ error: "Forbidden: not a member of this organization" });
36
- return false;
37
- }
38
- return true;
39
- }
40
-
41
- export default async function workflowRoutes(app: FastifyInstance) {
42
- app.get("/workflows", { preHandler: [app.authenticate] }, async (request, reply) => {
43
- const query = request.query as { orgId?: string };
44
- const orgId = query?.orgId;
45
-
46
- if (!orgId) {
47
- return reply.status(400).send({ error: "orgId query parameter is required" });
48
- }
49
-
50
- // Verify org membership
51
- const userId = request.user!.id;
52
- const [membership] = await db
53
- .select()
54
- .from(orgMemberships)
55
- .where(and(eq(orgMemberships.orgId, orgId), eq(orgMemberships.userId, userId)))
56
- .limit(1);
57
- if (!membership) {
58
- return reply.status(403).send({ error: "Forbidden: not a member of this organization" });
59
- }
60
-
61
- const all = await db.select().from(workflows).where(eq(workflows.orgId, orgId));
62
- return { workflows: all };
63
- });
64
-
65
- app.post("/workflows", { preHandler: [app.authenticate] }, async (request, reply) => {
66
- const body = CreateWorkflowSchema.parse(request.body);
67
-
68
- // Verify org membership
69
- const userId = request.user!.id;
70
- const [membership] = await db
71
- .select()
72
- .from(orgMemberships)
73
- .where(and(eq(orgMemberships.orgId, body.orgId), eq(orgMemberships.userId, userId)))
74
- .limit(1);
75
- if (!membership) {
76
- return reply.status(403).send({ error: "Forbidden: not a member of this organization" });
77
- }
78
-
79
- const workflow = await registerWorkflow({
80
- orgId: body.orgId,
81
- name: body.name,
82
- trigger: body.trigger,
83
- definition: body.definition,
84
- });
85
- await request.audit("workflow_created", { workflowId: workflow.id, trigger: body.trigger, orgId: body.orgId });
86
- return reply.status(201).send(workflow);
87
- });
88
-
89
- app.get("/workflows/:id", { preHandler: [app.authenticate] }, async (request, reply) => {
90
- const { id } = request.params as { id: string };
91
- const [workflow] = await db.select().from(workflows).where(eq(workflows.id, id)).limit(1);
92
- if (!workflow) return reply.status(404).send({ error: "Workflow not found" });
93
-
94
- // Verify org membership
95
- if (workflow.orgId) {
96
- const userId = request.user!.id;
97
- const [membership] = await db
98
- .select()
99
- .from(orgMemberships)
100
- .where(and(eq(orgMemberships.orgId, workflow.orgId), eq(orgMemberships.userId, userId)))
101
- .limit(1);
102
- if (!membership) {
103
- return reply.status(403).send({ error: "Forbidden" });
104
- }
105
- }
106
-
107
- return { workflow };
108
- });
109
-
110
- app.delete("/workflows/:id", { preHandler: [app.authenticate] }, async (request, reply) => {
111
- const { id } = request.params as { id: string };
112
- const userId = request.user!.id;
113
-
114
- // Find the workflow and verify org membership
115
- const [workflow] = await db.select().from(workflows).where(eq(workflows.id, id)).limit(1);
116
- if (!workflow) return reply.status(404).send({ error: "Workflow not found" });
117
-
118
- // Verify org membership
119
- if (workflow.orgId) {
120
- const [membership] = await db
121
- .select()
122
- .from(orgMemberships)
123
- .where(and(eq(orgMemberships.orgId, workflow.orgId), eq(orgMemberships.userId, userId)))
124
- .limit(1);
125
- if (!membership) {
126
- return reply.status(403).send({ error: "Forbidden" });
127
- }
128
- }
129
-
130
- const [record] = await db.delete(workflows).where(eq(workflows.id, id)).returning();
131
- if (!record) return reply.status(404).send({ error: "Workflow not found" });
132
- await request.audit("workflow_deleted", { workflowId: record.id });
133
- return { success: true };
134
- });
135
-
136
- app.get("/workflows/:id/runs", { preHandler: [app.authenticate] }, async (request, reply) => {
137
- const { id } = request.params as { id: string };
138
- const [workflow] = await db.select().from(workflows).where(eq(workflows.id, id)).limit(1);
139
- if (!workflow) return reply.status(404).send({ error: "Workflow not found" });
140
-
141
- // Verify org membership
142
- if (workflow.orgId) {
143
- const userId = request.user!.id;
144
- const [membership] = await db
145
- .select()
146
- .from(orgMemberships)
147
- .where(and(eq(orgMemberships.orgId, workflow.orgId), eq(orgMemberships.userId, userId)))
148
- .limit(1);
149
- if (!membership) {
150
- return reply.status(403).send({ error: "Forbidden" });
151
- }
152
- }
153
-
154
- const runs = await listWorkflowRuns(id);
155
- return { runs };
156
- });
157
- }
package/src/sdk/index.ts DELETED
@@ -1,152 +0,0 @@
1
- import type { KeystoneSdk, AuthenticationSdk, IdentitySdk, OrganizationSdk, AuthorizationSdk } from "./types.js";
2
- import type {
3
- AuthenticationApplicationService,
4
- IdentityApplicationService,
5
- OrganizationApplicationService,
6
- } from "../services/application/index.js";
7
- import type { AuthorizationDomainService } from "../services/domain/authorization.js";
8
- import { getContainer } from "../container.js";
9
- import { buildApplicationServices } from "../di.js";
10
-
11
- class SdkAuthenticationClient implements AuthenticationSdk {
12
- constructor(private readonly app: AuthenticationApplicationService) {}
13
-
14
- register(input: { username: string; email: string; password: string; name?: string; clientId?: string; metadata?: Record<string, unknown> }) {
15
- return this.app.register(input);
16
- }
17
-
18
- login(input: { email: string; password: string; clientId?: string }) {
19
- return this.app.login(input);
20
- }
21
-
22
- async refresh(refreshToken: string, clientId?: string) {
23
- const result = await this.app.refresh(refreshToken, clientId);
24
- if (!result.success) return result;
25
- return { success: true as const, data: { accessToken: result.data.accessToken, refreshToken: result.data.refreshToken, expiresAt: result.data.expiresAt } };
26
- }
27
-
28
- logout(refreshToken?: string) {
29
- return this.app.logout(refreshToken);
30
- }
31
-
32
- createPasswordResetToken(email: string) {
33
- return this.app.createPasswordResetToken(email);
34
- }
35
-
36
- resetPasswordWithToken(token: string, newPassword: string) {
37
- return this.app.resetPasswordWithToken(token, newPassword);
38
- }
39
- }
40
-
41
- class SdkIdentityClient implements IdentitySdk {
42
- constructor(private readonly app: IdentityApplicationService) {}
43
-
44
- findUser(id: string) {
45
- return this.app.findUser(id);
46
- }
47
-
48
- findUserByEmail(email: string) {
49
- return this.app.findUserByEmail(email);
50
- }
51
-
52
- upsertInvitedUser(input: { email: string; name?: string; username?: string }) {
53
- return this.app.upsertInvitedUser(input);
54
- }
55
-
56
- updateUserProfile(userId: string, updates: Partial<{ name: string; username: string; role: string; emailVerified: boolean }>) {
57
- return this.app.updateUserProfile(userId, updates);
58
- }
59
-
60
- deactivate(userId: string) {
61
- return this.app.deactivate(userId);
62
- }
63
-
64
- listOrganizationUsers(orgId: string) {
65
- return this.app.listOrganizationUsers(orgId);
66
- }
67
-
68
- linkUserIdentity(userId: string, providerId: string, providerType: string, externalSub: string, email?: string) {
69
- return this.app.linkUserIdentity(userId, providerId, providerType, externalSub, email);
70
- }
71
-
72
- getFederationAuthorizeUrl(provider: string, state: string, redirectUri: string) {
73
- return this.app.getFederationAuthorizeUrl(provider, state, redirectUri);
74
- }
75
-
76
- completeFederationLogin(provider: string, code: string, redirectUri: string) {
77
- return this.app.completeFederationLogin(provider, code, redirectUri);
78
- }
79
- }
80
-
81
- class SdkOrganizationClient implements OrganizationSdk {
82
- constructor(private readonly app: OrganizationApplicationService) {}
83
-
84
- createOrganization(userId: string, input: { name: string; slug?: string; plan?: string }) {
85
- return this.app.createOrganization(userId, input);
86
- }
87
-
88
- getOrganization(userId: string, orgId: string) {
89
- return this.app.getOrganization(userId, orgId);
90
- }
91
-
92
- listUserOrganizations(userId: string) {
93
- return this.app.listUserOrganizations(userId);
94
- }
95
-
96
- inviteMember(actorId: string, orgId: string, input: { email: string; role: "owner" | "admin" | "member" }) {
97
- return this.app.inviteMember(actorId, orgId, input);
98
- }
99
-
100
- createApplication(actorId: string, orgId: string, input: { name: string; redirectUris?: string[]; allowedOrigins?: string[] }) {
101
- return this.app.createApplication(actorId, orgId, input);
102
- }
103
-
104
- listOrganizationApplications(actorId: string, orgId: string) {
105
- return this.app.listOrganizationApplications(actorId, orgId);
106
- }
107
-
108
- updateApplication(actorId: string, orgId: string, appId: string, updates: Partial<{ name: string; redirectUris: string[]; allowedOrigins: string[]; allowedIps: string[]; blockedIps: string[]; isActive: boolean; branding: Record<string, unknown> }>) {
109
- return this.app.updateApplication(actorId, orgId, appId, updates);
110
- }
111
- }
112
-
113
- class SdkAuthorizationClient implements AuthorizationSdk {
114
- constructor(private readonly domain: AuthorizationDomainService) {}
115
-
116
- hasPermission(role: string, resource: string, action: string) {
117
- return this.domain.hasPermission(role, resource, action);
118
- }
119
-
120
- requirePermission(role: string, resource: string, action: string) {
121
- return this.domain.requirePermission(role, resource, action);
122
- }
123
-
124
- requireOrgRole(userId: string, orgId: string, allowedRoles: Array<"owner" | "admin" | "member">) {
125
- return this.domain.requireOrgRole(userId, orgId, allowedRoles);
126
- }
127
-
128
- isOrgMember(userId: string, orgId: string) {
129
- return this.domain.isOrgMember(userId, orgId);
130
- }
131
- }
132
-
133
- let cachedSdk: KeystoneSdk | null = null;
134
-
135
- export function getSdk(): KeystoneSdk {
136
- if (cachedSdk) return cachedSdk;
137
- const container = getContainer();
138
- const apps = buildApplicationServices(container);
139
- cachedSdk = {
140
- authentication: new SdkAuthenticationClient(apps.auth),
141
- identity: new SdkIdentityClient(apps.identity),
142
- organization: new SdkOrganizationClient(apps.organization),
143
- authorization: new SdkAuthorizationClient(apps.authorization),
144
- };
145
- return cachedSdk;
146
- }
147
-
148
- export function setSdk(sdk: KeystoneSdk): void {
149
- cachedSdk = sdk;
150
- }
151
-
152
- export type { KeystoneSdk, AuthenticationSdk, IdentitySdk, OrganizationSdk, AuthorizationSdk } from "./types.js";
package/src/sdk/types.ts DELETED
@@ -1,54 +0,0 @@
1
- import type { User, Organization, Application, OrgMembership } from "../db/schema.js";
2
- import type { Result } from "../lib/result.js";
3
-
4
- export interface AuthResponse {
5
- user: User;
6
- accessToken: string;
7
- refreshToken: string;
8
- expiresAt: Date;
9
- }
10
-
11
- export interface AuthenticationSdk {
12
- register(input: { username: string; email: string; password: string; name?: string; clientId?: string; metadata?: Record<string, unknown> }): Promise<Result<AuthResponse>>;
13
- login(input: { email: string; password: string; clientId?: string }): Promise<Result<AuthResponse>>;
14
- refresh(refreshToken: string, clientId?: string): Promise<Result<{ accessToken: string; refreshToken: string; expiresAt: Date }>>;
15
- logout(refreshToken?: string): Promise<Result<void>>;
16
- createPasswordResetToken(email: string): Promise<Result<{ token: string; user: User } | null>>;
17
- resetPasswordWithToken(token: string, newPassword: string): Promise<Result<User>>;
18
- }
19
-
20
- export interface IdentitySdk {
21
- findUser(id: string): Promise<Result<User>>;
22
- findUserByEmail(email: string): Promise<Result<User>>;
23
- upsertInvitedUser(input: { email: string; name?: string; username?: string }): Promise<Result<User>>;
24
- updateUserProfile(userId: string, updates: Partial<{ name: string; username: string; role: string; emailVerified: boolean }>): Promise<Result<User>>;
25
- deactivate(userId: string): Promise<Result<void>>;
26
- listOrganizationUsers(orgId: string): Promise<User[]>;
27
- linkUserIdentity(userId: string, providerId: string, providerType: string, externalSub: string, email?: string): Promise<Result<void>>;
28
- getFederationAuthorizeUrl(provider: string, state: string, redirectUri: string): Promise<Result<{ url: string }>>;
29
- completeFederationLogin(provider: string, code: string, redirectUri: string): Promise<Result<{ user: User; tokens: { accessToken: string; refreshToken: string } }>>;
30
- }
31
-
32
- export interface OrganizationSdk {
33
- createOrganization(userId: string, input: { name: string; slug?: string; plan?: string }): Promise<Result<Organization>>;
34
- getOrganization(userId: string, orgId: string): Promise<Result<Organization>>;
35
- listUserOrganizations(userId: string): Promise<Organization[]>;
36
- inviteMember(actorId: string, orgId: string, input: { email: string; role: "owner" | "admin" | "member" }): Promise<Result<{ user: { id: string }; membership: OrgMembership }>>;
37
- createApplication(actorId: string, orgId: string, input: { name: string; redirectUris?: string[]; allowedOrigins?: string[] }): Promise<Result<Application & { clientSecret: string }>>;
38
- listOrganizationApplications(actorId: string, orgId: string): Promise<Result<Application[]>>;
39
- updateApplication(actorId: string, orgId: string, appId: string, updates: Partial<{ name: string; redirectUris: string[]; allowedOrigins: string[]; allowedIps: string[]; blockedIps: string[]; isActive: boolean; branding: Record<string, unknown> }>): Promise<Result<Application>>;
40
- }
41
-
42
- export interface AuthorizationSdk {
43
- hasPermission(role: string, resource: string, action: string): Promise<boolean>;
44
- requirePermission(role: string, resource: string, action: string): Promise<Result<void>>;
45
- requireOrgRole(userId: string, orgId: string, allowedRoles: Array<"owner" | "admin" | "member">): Promise<Result<OrgMembership>>;
46
- isOrgMember(userId: string, orgId: string): Promise<OrgMembership | undefined>;
47
- }
48
-
49
- export interface KeystoneSdk {
50
- authentication: AuthenticationSdk;
51
- identity: IdentitySdk;
52
- organization: OrganizationSdk;
53
- authorization: AuthorizationSdk;
54
- }
@@ -1,73 +0,0 @@
1
- import { redis } from "./redis.js";
2
-
3
- const ANOMALY_WINDOW_SECONDS = 300;
4
- const FAILED_LOGIN_THRESHOLD = 10;
5
- const NEW_DEVICE_THRESHOLD = 3;
6
- // Two logins from different IPs within this window are flagged as
7
- // suspicious (approximation of impossible travel without a GeoIP database).
8
- const IMPOSSIBLE_TRAVEL_WINDOW_SECONDS = 900;
9
-
10
- export async function recordFailedLogin(identifier: string): Promise<number> {
11
- if (redis.status !== "ready" && redis.status !== "connect") return 0;
12
- const key = `anomaly:failed_login:${identifier}`;
13
- const now = Date.now();
14
- const windowStart = now - ANOMALY_WINDOW_SECONDS * 1000;
15
-
16
- const pipeline = redis.pipeline();
17
- pipeline.zremrangebyscore(key, 0, windowStart);
18
- pipeline.zadd(key, now, `${now}:${Math.random().toString(36).slice(2)}`);
19
- pipeline.zcard(key);
20
- pipeline.pexpire(key, ANOMALY_WINDOW_SECONDS * 1000);
21
- const results = await pipeline.exec();
22
- return (results?.[2]?.[1] as number) ?? 0;
23
- }
24
-
25
- export async function isFailedLoginAnomaly(identifier: string): Promise<boolean> {
26
- const count = await recordFailedLogin(identifier);
27
- return count >= FAILED_LOGIN_THRESHOLD;
28
- }
29
-
30
- export async function recordNewDevice(userId: string): Promise<number> {
31
- if (redis.status !== "ready" && redis.status !== "connect") return 0;
32
- const key = `anomaly:new_device:${userId}`;
33
- const now = Date.now();
34
- const windowStart = now - ANOMALY_WINDOW_SECONDS * 1000;
35
-
36
- const pipeline = redis.pipeline();
37
- pipeline.zremrangebyscore(key, 0, windowStart);
38
- pipeline.zadd(key, now, `${now}:${Math.random().toString(36).slice(2)}`);
39
- pipeline.zcard(key);
40
- pipeline.pexpire(key, ANOMALY_WINDOW_SECONDS * 1000);
41
- const results = await pipeline.exec();
42
- return (results?.[2]?.[1] as number) ?? 0;
43
- }
44
-
45
- export async function isNewDeviceAnomaly(userId: string): Promise<boolean> {
46
- const count = await recordNewDevice(userId);
47
- return count >= NEW_DEVICE_THRESHOLD;
48
- }
49
-
50
- /**
51
- * Records the login location (IP) for a user and returns true when the
52
- * previous login happened from a *different* IP within the impossible-travel
53
- * window. Without a GeoIP database this is an approximation: physically
54
- * changing networks within a few minutes usually indicates credential misuse
55
- * (or a VPN/mobile network switch, so alerts should say "suspicious", not
56
- * "blocked").
57
- */
58
- export async function checkImpossibleTravel(userId: string, ip: string | undefined): Promise<boolean> {
59
- if (!ip || (redis.status !== "ready" && redis.status !== "connect")) return false;
60
- const key = `anomaly:last_login:${userId}`;
61
- const now = Date.now();
62
-
63
- const previous = await redis.hgetall(key);
64
- await redis
65
- .multi()
66
- .hset(key, "ip", ip, "ts", String(now))
67
- .pexpire(key, 30 * 24 * 60 * 60 * 1000)
68
- .exec();
69
-
70
- if (!previous?.ip || !previous?.ts) return false;
71
- const elapsed = now - Number(previous.ts);
72
- return previous.ip !== ip && elapsed < IMPOSSIBLE_TRAVEL_WINDOW_SECONDS * 1000;
73
- }
@@ -1,75 +0,0 @@
1
- import type { AuthenticationDomainService } from "../domain/authentication.js";
2
- import type { TokenSet } from "../tokens.js";
3
- import type { User } from "../../db/schema.js";
4
- import type { Result } from "../../lib/result.js";
5
-
6
- export interface RegisterRequest {
7
- username: string;
8
- email: string;
9
- password: string;
10
- name?: string;
11
- clientId?: string;
12
- metadata?: Record<string, unknown>;
13
- }
14
-
15
- export interface LoginRequest {
16
- email: string;
17
- password: string;
18
- clientId?: string;
19
- }
20
-
21
- export interface AuthResponse {
22
- user: User;
23
- accessToken: string;
24
- refreshToken: string;
25
- expiresAt: Date;
26
- }
27
-
28
- export class AuthenticationApplicationService {
29
- constructor(private readonly domain: AuthenticationDomainService) {}
30
-
31
- async register(request: RegisterRequest): Promise<Result<AuthResponse>> {
32
- const result = await this.domain.register(request);
33
- if (!result.success) return result;
34
- return {
35
- success: true,
36
- data: this.toAuthResponse(result.data.user, result.data.tokens),
37
- };
38
- }
39
-
40
- async login(request: LoginRequest): Promise<Result<AuthResponse>> {
41
- const result = await this.domain.login(request);
42
- if (!result.success) return result;
43
- return {
44
- success: true,
45
- data: this.toAuthResponse(result.data.user, result.data.tokens),
46
- };
47
- }
48
-
49
- async refresh(refreshToken: string, clientId?: string): Promise<Result<TokenSet>> {
50
- const result = await this.domain.refresh(refreshToken, clientId);
51
- if (!result.success) return result;
52
- return { success: true, data: result.data.tokens };
53
- }
54
-
55
- async logout(refreshToken?: string): Promise<Result<void>> {
56
- return this.domain.logout(refreshToken);
57
- }
58
-
59
- async createPasswordResetToken(email: string): Promise<Result<{ token: string; user: User } | null>> {
60
- return this.domain.createPasswordResetToken(email);
61
- }
62
-
63
- async resetPasswordWithToken(token: string, newPassword: string): Promise<Result<User>> {
64
- return this.domain.resetPasswordWithToken(token, newPassword);
65
- }
66
-
67
- private toAuthResponse(user: User, tokens: TokenSet): AuthResponse {
68
- return {
69
- user,
70
- accessToken: tokens.accessToken,
71
- refreshToken: tokens.refreshToken,
72
- expiresAt: tokens.expiresAt,
73
- };
74
- }
75
- }