@antasphere/chassis-server 1.0.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 (798) hide show
  1. package/LICENSE +82 -0
  2. package/dist/accounts/deletion.d.ts +163 -0
  3. package/dist/accounts/deletion.d.ts.map +1 -0
  4. package/dist/accounts/deletion.js +360 -0
  5. package/dist/accounts/deletion.js.map +1 -0
  6. package/dist/accounts/erasure-log.d.ts +66 -0
  7. package/dist/accounts/erasure-log.d.ts.map +1 -0
  8. package/dist/accounts/erasure-log.js +117 -0
  9. package/dist/accounts/erasure-log.js.map +1 -0
  10. package/dist/accounts/index.d.ts +6 -0
  11. package/dist/accounts/index.d.ts.map +1 -0
  12. package/dist/accounts/index.js +6 -0
  13. package/dist/accounts/index.js.map +1 -0
  14. package/dist/accounts/mint-refusal.d.ts +47 -0
  15. package/dist/accounts/mint-refusal.d.ts.map +1 -0
  16. package/dist/accounts/mint-refusal.js +59 -0
  17. package/dist/accounts/mint-refusal.js.map +1 -0
  18. package/dist/accounts/signup-duplicate.d.ts +14 -0
  19. package/dist/accounts/signup-duplicate.d.ts.map +1 -0
  20. package/dist/accounts/signup-duplicate.js +25 -0
  21. package/dist/accounts/signup-duplicate.js.map +1 -0
  22. package/dist/accounts/superadmin.d.ts +27 -0
  23. package/dist/accounts/superadmin.d.ts.map +1 -0
  24. package/dist/accounts/superadmin.js +46 -0
  25. package/dist/accounts/superadmin.js.map +1 -0
  26. package/dist/api/apikeys.d.ts +14 -0
  27. package/dist/api/apikeys.d.ts.map +1 -0
  28. package/dist/api/apikeys.js +124 -0
  29. package/dist/api/apikeys.js.map +1 -0
  30. package/dist/api/audit.d.ts +4 -0
  31. package/dist/api/audit.d.ts.map +1 -0
  32. package/dist/api/audit.js +75 -0
  33. package/dist/api/audit.js.map +1 -0
  34. package/dist/api/break-glass.d.ts +48 -0
  35. package/dist/api/break-glass.d.ts.map +1 -0
  36. package/dist/api/break-glass.js +217 -0
  37. package/dist/api/break-glass.js.map +1 -0
  38. package/dist/api/cli-auth.d.ts +84 -0
  39. package/dist/api/cli-auth.d.ts.map +1 -0
  40. package/dist/api/cli-auth.js +177 -0
  41. package/dist/api/cli-auth.js.map +1 -0
  42. package/dist/api/create-api.d.ts +123 -0
  43. package/dist/api/create-api.d.ts.map +1 -0
  44. package/dist/api/create-api.js +1165 -0
  45. package/dist/api/create-api.js.map +1 -0
  46. package/dist/api/demo-passes.d.ts +45 -0
  47. package/dist/api/demo-passes.d.ts.map +1 -0
  48. package/dist/api/demo-passes.js +143 -0
  49. package/dist/api/demo-passes.js.map +1 -0
  50. package/dist/api/errors.d.ts +5 -0
  51. package/dist/api/errors.d.ts.map +1 -0
  52. package/dist/api/errors.js +5 -0
  53. package/dist/api/errors.js.map +1 -0
  54. package/dist/api/export.d.ts +63 -0
  55. package/dist/api/export.d.ts.map +1 -0
  56. package/dist/api/export.js +393 -0
  57. package/dist/api/export.js.map +1 -0
  58. package/dist/api/files.d.ts +40 -0
  59. package/dist/api/files.d.ts.map +1 -0
  60. package/dist/api/files.js +150 -0
  61. package/dist/api/files.js.map +1 -0
  62. package/dist/api/index.d.ts +17 -0
  63. package/dist/api/index.d.ts.map +1 -0
  64. package/dist/api/index.js +17 -0
  65. package/dist/api/index.js.map +1 -0
  66. package/dist/api/invitations.d.ts +50 -0
  67. package/dist/api/invitations.d.ts.map +1 -0
  68. package/dist/api/invitations.js +313 -0
  69. package/dist/api/invitations.js.map +1 -0
  70. package/dist/api/members.d.ts +25 -0
  71. package/dist/api/members.d.ts.map +1 -0
  72. package/dist/api/members.js +522 -0
  73. package/dist/api/members.js.map +1 -0
  74. package/dist/api/onboarding.d.ts +26 -0
  75. package/dist/api/onboarding.d.ts.map +1 -0
  76. package/dist/api/onboarding.js +23 -0
  77. package/dist/api/onboarding.js.map +1 -0
  78. package/dist/api/openapi-doc.d.ts +21 -0
  79. package/dist/api/openapi-doc.d.ts.map +1 -0
  80. package/dist/api/openapi-doc.js +25 -0
  81. package/dist/api/openapi-doc.js.map +1 -0
  82. package/dist/api/projects.d.ts +24 -0
  83. package/dist/api/projects.d.ts.map +1 -0
  84. package/dist/api/projects.js +624 -0
  85. package/dist/api/projects.js.map +1 -0
  86. package/dist/api/scope-routes.d.ts +12 -0
  87. package/dist/api/scope-routes.d.ts.map +1 -0
  88. package/dist/api/scope-routes.js +2 -0
  89. package/dist/api/scope-routes.js.map +1 -0
  90. package/dist/api/sso-connect.d.ts +70 -0
  91. package/dist/api/sso-connect.d.ts.map +1 -0
  92. package/dist/api/sso-connect.js +164 -0
  93. package/dist/api/sso-connect.js.map +1 -0
  94. package/dist/api/sso-logout.d.ts +41 -0
  95. package/dist/api/sso-logout.d.ts.map +1 -0
  96. package/dist/api/sso-logout.js +34 -0
  97. package/dist/api/sso-logout.js.map +1 -0
  98. package/dist/api/teams.d.ts +43 -0
  99. package/dist/api/teams.d.ts.map +1 -0
  100. package/dist/api/teams.js +447 -0
  101. package/dist/api/teams.js.map +1 -0
  102. package/dist/api/workspaces.d.ts +114 -0
  103. package/dist/api/workspaces.d.ts.map +1 -0
  104. package/dist/api/workspaces.js +462 -0
  105. package/dist/api/workspaces.js.map +1 -0
  106. package/dist/apikeys/index.d.ts +3 -0
  107. package/dist/apikeys/index.d.ts.map +1 -0
  108. package/dist/apikeys/index.js +3 -0
  109. package/dist/apikeys/index.js.map +1 -0
  110. package/dist/apikeys/peppers.d.ts +53 -0
  111. package/dist/apikeys/peppers.d.ts.map +1 -0
  112. package/dist/apikeys/peppers.js +97 -0
  113. package/dist/apikeys/peppers.js.map +1 -0
  114. package/dist/apikeys/service.d.ts +56 -0
  115. package/dist/apikeys/service.d.ts.map +1 -0
  116. package/dist/apikeys/service.js +196 -0
  117. package/dist/apikeys/service.js.map +1 -0
  118. package/dist/app.d.ts +65 -0
  119. package/dist/app.d.ts.map +1 -0
  120. package/dist/app.js +142 -0
  121. package/dist/app.js.map +1 -0
  122. package/dist/audit/filters.d.ts +38 -0
  123. package/dist/audit/filters.d.ts.map +1 -0
  124. package/dist/audit/filters.js +97 -0
  125. package/dist/audit/filters.js.map +1 -0
  126. package/dist/audit/index.d.ts +3 -0
  127. package/dist/audit/index.d.ts.map +1 -0
  128. package/dist/audit/index.js +3 -0
  129. package/dist/audit/index.js.map +1 -0
  130. package/dist/audit/service.d.ts +65 -0
  131. package/dist/audit/service.d.ts.map +1 -0
  132. package/dist/audit/service.js +103 -0
  133. package/dist/audit/service.js.map +1 -0
  134. package/dist/boot.d.ts +8 -0
  135. package/dist/boot.d.ts.map +1 -0
  136. package/dist/boot.js +822 -0
  137. package/dist/boot.js.map +1 -0
  138. package/dist/constant-time.d.ts +3 -0
  139. package/dist/constant-time.d.ts.map +1 -0
  140. package/dist/constant-time.js +10 -0
  141. package/dist/constant-time.js.map +1 -0
  142. package/dist/email/driver.d.ts +16 -0
  143. package/dist/email/driver.d.ts.map +1 -0
  144. package/dist/email/driver.js +136 -0
  145. package/dist/email/driver.js.map +1 -0
  146. package/dist/email/index.d.ts +4 -0
  147. package/dist/email/index.d.ts.map +1 -0
  148. package/dist/email/index.js +4 -0
  149. package/dist/email/index.js.map +1 -0
  150. package/dist/email/shell.d.ts +72 -0
  151. package/dist/email/shell.d.ts.map +1 -0
  152. package/dist/email/shell.js +146 -0
  153. package/dist/email/shell.js.map +1 -0
  154. package/dist/email/templates.d.ts +83 -0
  155. package/dist/email/templates.d.ts.map +1 -0
  156. package/dist/email/templates.js +96 -0
  157. package/dist/email/templates.js.map +1 -0
  158. package/dist/entitlements/check.d.ts +140 -0
  159. package/dist/entitlements/check.d.ts.map +1 -0
  160. package/dist/entitlements/check.js +276 -0
  161. package/dist/entitlements/check.js.map +1 -0
  162. package/dist/entitlements/clock-skew.d.ts +27 -0
  163. package/dist/entitlements/clock-skew.d.ts.map +1 -0
  164. package/dist/entitlements/clock-skew.js +58 -0
  165. package/dist/entitlements/clock-skew.js.map +1 -0
  166. package/dist/entitlements/gate.d.ts +113 -0
  167. package/dist/entitlements/gate.d.ts.map +1 -0
  168. package/dist/entitlements/gate.js +430 -0
  169. package/dist/entitlements/gate.js.map +1 -0
  170. package/dist/entitlements/hub-machine-token.d.ts +83 -0
  171. package/dist/entitlements/hub-machine-token.d.ts.map +1 -0
  172. package/dist/entitlements/hub-machine-token.js +175 -0
  173. package/dist/entitlements/hub-machine-token.js.map +1 -0
  174. package/dist/entitlements/hub-subject.d.ts +32 -0
  175. package/dist/entitlements/hub-subject.d.ts.map +1 -0
  176. package/dist/entitlements/hub-subject.js +68 -0
  177. package/dist/entitlements/hub-subject.js.map +1 -0
  178. package/dist/entitlements/index.d.ts +9 -0
  179. package/dist/entitlements/index.d.ts.map +1 -0
  180. package/dist/entitlements/index.js +9 -0
  181. package/dist/entitlements/index.js.map +1 -0
  182. package/dist/entitlements/poster.d.ts +81 -0
  183. package/dist/entitlements/poster.d.ts.map +1 -0
  184. package/dist/entitlements/poster.js +169 -0
  185. package/dist/entitlements/poster.js.map +1 -0
  186. package/dist/entitlements/profiles.d.ts +121 -0
  187. package/dist/entitlements/profiles.d.ts.map +1 -0
  188. package/dist/entitlements/profiles.js +212 -0
  189. package/dist/entitlements/profiles.js.map +1 -0
  190. package/dist/entitlements/slot.d.ts +33 -0
  191. package/dist/entitlements/slot.d.ts.map +1 -0
  192. package/dist/entitlements/slot.js +75 -0
  193. package/dist/entitlements/slot.js.map +1 -0
  194. package/dist/env.d.ts +293 -0
  195. package/dist/env.d.ts.map +1 -0
  196. package/dist/env.js +383 -0
  197. package/dist/env.js.map +1 -0
  198. package/dist/files/http.d.ts +23 -0
  199. package/dist/files/http.d.ts.map +1 -0
  200. package/dist/files/http.js +66 -0
  201. package/dist/files/http.js.map +1 -0
  202. package/dist/files/index.d.ts +5 -0
  203. package/dist/files/index.d.ts.map +1 -0
  204. package/dist/files/index.js +5 -0
  205. package/dist/files/index.js.map +1 -0
  206. package/dist/files/serve.d.ts +43 -0
  207. package/dist/files/serve.d.ts.map +1 -0
  208. package/dist/files/serve.js +71 -0
  209. package/dist/files/serve.js.map +1 -0
  210. package/dist/files/service.d.ts +69 -0
  211. package/dist/files/service.d.ts.map +1 -0
  212. package/dist/files/service.js +188 -0
  213. package/dist/files/service.js.map +1 -0
  214. package/dist/files/spool.d.ts +21 -0
  215. package/dist/files/spool.d.ts.map +1 -0
  216. package/dist/files/spool.js +47 -0
  217. package/dist/files/spool.js.map +1 -0
  218. package/dist/identity/better-auth.d.ts +3927 -0
  219. package/dist/identity/better-auth.d.ts.map +1 -0
  220. package/dist/identity/better-auth.js +896 -0
  221. package/dist/identity/better-auth.js.map +1 -0
  222. package/dist/identity/demo-pass-plugin.d.ts +29 -0
  223. package/dist/identity/demo-pass-plugin.d.ts.map +1 -0
  224. package/dist/identity/demo-pass-plugin.js +88 -0
  225. package/dist/identity/demo-pass-plugin.js.map +1 -0
  226. package/dist/identity/demo-pass-rules.d.ts +84 -0
  227. package/dist/identity/demo-pass-rules.d.ts.map +1 -0
  228. package/dist/identity/demo-pass-rules.js +223 -0
  229. package/dist/identity/demo-pass-rules.js.map +1 -0
  230. package/dist/identity/demo-pass.d.ts +159 -0
  231. package/dist/identity/demo-pass.d.ts.map +1 -0
  232. package/dist/identity/demo-pass.js +319 -0
  233. package/dist/identity/demo-pass.js.map +1 -0
  234. package/dist/identity/hub-grant.d.ts +182 -0
  235. package/dist/identity/hub-grant.d.ts.map +1 -0
  236. package/dist/identity/hub-grant.js +594 -0
  237. package/dist/identity/hub-grant.js.map +1 -0
  238. package/dist/identity/hub-jwt.d.ts +22 -0
  239. package/dist/identity/hub-jwt.d.ts.map +1 -0
  240. package/dist/identity/hub-jwt.js +77 -0
  241. package/dist/identity/hub-jwt.js.map +1 -0
  242. package/dist/identity/hub-live-gate.d.ts +17 -0
  243. package/dist/identity/hub-live-gate.d.ts.map +1 -0
  244. package/dist/identity/hub-live-gate.js +146 -0
  245. package/dist/identity/hub-live-gate.js.map +1 -0
  246. package/dist/identity/hub-logout.d.ts +88 -0
  247. package/dist/identity/hub-logout.d.ts.map +1 -0
  248. package/dist/identity/hub-logout.js +158 -0
  249. package/dist/identity/hub-logout.js.map +1 -0
  250. package/dist/identity/hub-projection.d.ts +103 -0
  251. package/dist/identity/hub-projection.d.ts.map +1 -0
  252. package/dist/identity/hub-projection.js +130 -0
  253. package/dist/identity/hub-projection.js.map +1 -0
  254. package/dist/identity/hub-reconcile.d.ts +151 -0
  255. package/dist/identity/hub-reconcile.d.ts.map +1 -0
  256. package/dist/identity/hub-reconcile.js +400 -0
  257. package/dist/identity/hub-reconcile.js.map +1 -0
  258. package/dist/identity/hub-sso.d.ts +363 -0
  259. package/dist/identity/hub-sso.d.ts.map +1 -0
  260. package/dist/identity/hub-sso.js +536 -0
  261. package/dist/identity/hub-sso.js.map +1 -0
  262. package/dist/identity/hub-user-client.d.ts +222 -0
  263. package/dist/identity/hub-user-client.d.ts.map +1 -0
  264. package/dist/identity/hub-user-client.js +406 -0
  265. package/dist/identity/hub-user-client.js.map +1 -0
  266. package/dist/identity/index.d.ts +13 -0
  267. package/dist/identity/index.d.ts.map +1 -0
  268. package/dist/identity/index.js +13 -0
  269. package/dist/identity/index.js.map +1 -0
  270. package/dist/identity/oauth-jwt.d.ts +32 -0
  271. package/dist/identity/oauth-jwt.d.ts.map +1 -0
  272. package/dist/identity/oauth-jwt.js +122 -0
  273. package/dist/identity/oauth-jwt.js.map +1 -0
  274. package/dist/identity/resolve-membership.d.ts +28 -0
  275. package/dist/identity/resolve-membership.d.ts.map +1 -0
  276. package/dist/identity/resolve-membership.js +69 -0
  277. package/dist/identity/resolve-membership.js.map +1 -0
  278. package/dist/identity/signing-key.d.ts +49 -0
  279. package/dist/identity/signing-key.d.ts.map +1 -0
  280. package/dist/identity/signing-key.js +144 -0
  281. package/dist/identity/signing-key.js.map +1 -0
  282. package/dist/index.d.ts +21 -0
  283. package/dist/index.d.ts.map +1 -0
  284. package/dist/index.js +11 -0
  285. package/dist/index.js.map +1 -0
  286. package/dist/invitations/index.d.ts +2 -0
  287. package/dist/invitations/index.d.ts.map +1 -0
  288. package/dist/invitations/index.js +2 -0
  289. package/dist/invitations/index.js.map +1 -0
  290. package/dist/invitations/service.d.ts +36 -0
  291. package/dist/invitations/service.d.ts.map +1 -0
  292. package/dist/invitations/service.js +122 -0
  293. package/dist/invitations/service.js.map +1 -0
  294. package/dist/jobs/index.d.ts +3 -0
  295. package/dist/jobs/index.d.ts.map +1 -0
  296. package/dist/jobs/index.js +3 -0
  297. package/dist/jobs/index.js.map +1 -0
  298. package/dist/jobs/pgboss.d.ts +119 -0
  299. package/dist/jobs/pgboss.d.ts.map +1 -0
  300. package/dist/jobs/pgboss.js +521 -0
  301. package/dist/jobs/pgboss.js.map +1 -0
  302. package/dist/jobs/timers.d.ts +127 -0
  303. package/dist/jobs/timers.d.ts.map +1 -0
  304. package/dist/jobs/timers.js +228 -0
  305. package/dist/jobs/timers.js.map +1 -0
  306. package/dist/logger.d.ts +17 -0
  307. package/dist/logger.d.ts.map +1 -0
  308. package/dist/logger.js +64 -0
  309. package/dist/logger.js.map +1 -0
  310. package/dist/mcp/errors.d.ts +37 -0
  311. package/dist/mcp/errors.d.ts.map +1 -0
  312. package/dist/mcp/errors.js +77 -0
  313. package/dist/mcp/errors.js.map +1 -0
  314. package/dist/mcp/http.d.ts +35 -0
  315. package/dist/mcp/http.d.ts.map +1 -0
  316. package/dist/mcp/http.js +80 -0
  317. package/dist/mcp/http.js.map +1 -0
  318. package/dist/mcp/index.d.ts +8 -0
  319. package/dist/mcp/index.d.ts.map +1 -0
  320. package/dist/mcp/index.js +8 -0
  321. package/dist/mcp/index.js.map +1 -0
  322. package/dist/mcp/inputs.d.ts +19 -0
  323. package/dist/mcp/inputs.d.ts.map +1 -0
  324. package/dist/mcp/inputs.js +28 -0
  325. package/dist/mcp/inputs.js.map +1 -0
  326. package/dist/mcp/projects.d.ts +31 -0
  327. package/dist/mcp/projects.d.ts.map +1 -0
  328. package/dist/mcp/projects.js +315 -0
  329. package/dist/mcp/projects.js.map +1 -0
  330. package/dist/mcp/server.d.ts +52 -0
  331. package/dist/mcp/server.d.ts.map +1 -0
  332. package/dist/mcp/server.js +93 -0
  333. package/dist/mcp/server.js.map +1 -0
  334. package/dist/mcp/teams.d.ts +7 -0
  335. package/dist/mcp/teams.d.ts.map +1 -0
  336. package/dist/mcp/teams.js +62 -0
  337. package/dist/mcp/teams.js.map +1 -0
  338. package/dist/mcp/tool-kit.d.ts +67 -0
  339. package/dist/mcp/tool-kit.d.ts.map +1 -0
  340. package/dist/mcp/tool-kit.js +74 -0
  341. package/dist/mcp/tool-kit.js.map +1 -0
  342. package/dist/members/removal.d.ts +95 -0
  343. package/dist/members/removal.d.ts.map +1 -0
  344. package/dist/members/removal.js +143 -0
  345. package/dist/members/removal.js.map +1 -0
  346. package/dist/middleware/auth-body.d.ts +25 -0
  347. package/dist/middleware/auth-body.d.ts.map +1 -0
  348. package/dist/middleware/auth-body.js +55 -0
  349. package/dist/middleware/auth-body.js.map +1 -0
  350. package/dist/middleware/auth-context.d.ts +170 -0
  351. package/dist/middleware/auth-context.d.ts.map +1 -0
  352. package/dist/middleware/auth-context.js +251 -0
  353. package/dist/middleware/auth-context.js.map +1 -0
  354. package/dist/middleware/body-cap.d.ts +17 -0
  355. package/dist/middleware/body-cap.d.ts.map +1 -0
  356. package/dist/middleware/body-cap.js +31 -0
  357. package/dist/middleware/body-cap.js.map +1 -0
  358. package/dist/middleware/body-refusal.d.ts +20 -0
  359. package/dist/middleware/body-refusal.d.ts.map +1 -0
  360. package/dist/middleware/body-refusal.js +5 -0
  361. package/dist/middleware/body-refusal.js.map +1 -0
  362. package/dist/middleware/cross-site.d.ts +61 -0
  363. package/dist/middleware/cross-site.d.ts.map +1 -0
  364. package/dist/middleware/cross-site.js +59 -0
  365. package/dist/middleware/cross-site.js.map +1 -0
  366. package/dist/middleware/hub-managed.d.ts +45 -0
  367. package/dist/middleware/hub-managed.d.ts.map +1 -0
  368. package/dist/middleware/hub-managed.js +56 -0
  369. package/dist/middleware/hub-managed.js.map +1 -0
  370. package/dist/middleware/idempotency.d.ts +14 -0
  371. package/dist/middleware/idempotency.d.ts.map +1 -0
  372. package/dist/middleware/idempotency.js +222 -0
  373. package/dist/middleware/idempotency.js.map +1 -0
  374. package/dist/middleware/index.d.ts +12 -0
  375. package/dist/middleware/index.d.ts.map +1 -0
  376. package/dist/middleware/index.js +12 -0
  377. package/dist/middleware/index.js.map +1 -0
  378. package/dist/middleware/json-depth.d.ts +32 -0
  379. package/dist/middleware/json-depth.d.ts.map +1 -0
  380. package/dist/middleware/json-depth.js +80 -0
  381. package/dist/middleware/json-depth.js.map +1 -0
  382. package/dist/middleware/no-store.d.ts +21 -0
  383. package/dist/middleware/no-store.d.ts.map +1 -0
  384. package/dist/middleware/no-store.js +32 -0
  385. package/dist/middleware/no-store.js.map +1 -0
  386. package/dist/middleware/oauth-public.d.ts +16 -0
  387. package/dist/middleware/oauth-public.d.ts.map +1 -0
  388. package/dist/middleware/oauth-public.js +50 -0
  389. package/dist/middleware/oauth-public.js.map +1 -0
  390. package/dist/middleware/rate-limit.d.ts +182 -0
  391. package/dist/middleware/rate-limit.d.ts.map +1 -0
  392. package/dist/middleware/rate-limit.js +277 -0
  393. package/dist/middleware/rate-limit.js.map +1 -0
  394. package/dist/middleware/request-id.d.ts +10 -0
  395. package/dist/middleware/request-id.d.ts.map +1 -0
  396. package/dist/middleware/request-id.js +42 -0
  397. package/dist/middleware/request-id.js.map +1 -0
  398. package/dist/middleware/scopes.d.ts +33 -0
  399. package/dist/middleware/scopes.d.ts.map +1 -0
  400. package/dist/middleware/scopes.js +139 -0
  401. package/dist/middleware/scopes.js.map +1 -0
  402. package/dist/middleware/security-headers.d.ts +53 -0
  403. package/dist/middleware/security-headers.d.ts.map +1 -0
  404. package/dist/middleware/security-headers.js +96 -0
  405. package/dist/middleware/security-headers.js.map +1 -0
  406. package/dist/observability/index.d.ts +3 -0
  407. package/dist/observability/index.d.ts.map +1 -0
  408. package/dist/observability/index.js +3 -0
  409. package/dist/observability/index.js.map +1 -0
  410. package/dist/observability/metrics.d.ts +17 -0
  411. package/dist/observability/metrics.d.ts.map +1 -0
  412. package/dist/observability/metrics.js +82 -0
  413. package/dist/observability/metrics.js.map +1 -0
  414. package/dist/observability/otel.d.ts +20 -0
  415. package/dist/observability/otel.d.ts.map +1 -0
  416. package/dist/observability/otel.js +54 -0
  417. package/dist/observability/otel.js.map +1 -0
  418. package/dist/pagination.d.ts +57 -0
  419. package/dist/pagination.d.ts.map +1 -0
  420. package/dist/pagination.js +90 -0
  421. package/dist/pagination.js.map +1 -0
  422. package/dist/platform/edition.d.ts +57 -0
  423. package/dist/platform/edition.d.ts.map +1 -0
  424. package/dist/platform/edition.js +90 -0
  425. package/dist/platform/edition.js.map +1 -0
  426. package/dist/platform/entitlements.d.ts +26 -0
  427. package/dist/platform/entitlements.d.ts.map +1 -0
  428. package/dist/platform/entitlements.js +28 -0
  429. package/dist/platform/entitlements.js.map +1 -0
  430. package/dist/platform/events.d.ts +87 -0
  431. package/dist/platform/events.d.ts.map +1 -0
  432. package/dist/platform/events.js +32 -0
  433. package/dist/platform/events.js.map +1 -0
  434. package/dist/platform/index.d.ts +8 -0
  435. package/dist/platform/index.d.ts.map +1 -0
  436. package/dist/platform/index.js +8 -0
  437. package/dist/platform/index.js.map +1 -0
  438. package/dist/platform/local-identity.d.ts +39 -0
  439. package/dist/platform/local-identity.d.ts.map +1 -0
  440. package/dist/platform/local-identity.js +87 -0
  441. package/dist/platform/local-identity.js.map +1 -0
  442. package/dist/platform/registry.d.ts +23 -0
  443. package/dist/platform/registry.d.ts.map +1 -0
  444. package/dist/platform/registry.js +5 -0
  445. package/dist/platform/registry.js.map +1 -0
  446. package/dist/platform/usage.d.ts +11 -0
  447. package/dist/platform/usage.d.ts.map +1 -0
  448. package/dist/platform/usage.js +12 -0
  449. package/dist/platform/usage.js.map +1 -0
  450. package/dist/platform/workspaces.d.ts +25 -0
  451. package/dist/platform/workspaces.d.ts.map +1 -0
  452. package/dist/platform/workspaces.js +44 -0
  453. package/dist/platform/workspaces.js.map +1 -0
  454. package/dist/projects/access.d.ts +40 -0
  455. package/dist/projects/access.d.ts.map +1 -0
  456. package/dist/projects/access.js +133 -0
  457. package/dist/projects/access.js.map +1 -0
  458. package/dist/projects/index.d.ts +2 -0
  459. package/dist/projects/index.d.ts.map +1 -0
  460. package/dist/projects/index.js +2 -0
  461. package/dist/projects/index.js.map +1 -0
  462. package/dist/route-label.d.ts +23 -0
  463. package/dist/route-label.d.ts.map +1 -0
  464. package/dist/route-label.js +29 -0
  465. package/dist/route-label.js.map +1 -0
  466. package/dist/routes/health.d.ts +30 -0
  467. package/dist/routes/health.d.ts.map +1 -0
  468. package/dist/routes/health.js +54 -0
  469. package/dist/routes/health.js.map +1 -0
  470. package/dist/routes/index.d.ts +3 -0
  471. package/dist/routes/index.d.ts.map +1 -0
  472. package/dist/routes/index.js +3 -0
  473. package/dist/routes/index.js.map +1 -0
  474. package/dist/routes/wellknown.d.ts +11 -0
  475. package/dist/routes/wellknown.d.ts.map +1 -0
  476. package/dist/routes/wellknown.js +45 -0
  477. package/dist/routes/wellknown.js.map +1 -0
  478. package/dist/secret.d.ts +30 -0
  479. package/dist/secret.d.ts.map +1 -0
  480. package/dist/secret.js +97 -0
  481. package/dist/secret.js.map +1 -0
  482. package/dist/setup-transport.d.ts +23 -0
  483. package/dist/setup-transport.d.ts.map +1 -0
  484. package/dist/setup-transport.js +52 -0
  485. package/dist/setup-transport.js.map +1 -0
  486. package/dist/state.d.ts +21 -0
  487. package/dist/state.d.ts.map +1 -0
  488. package/dist/state.js +4 -0
  489. package/dist/state.js.map +1 -0
  490. package/dist/storage/driver.d.ts +38 -0
  491. package/dist/storage/driver.d.ts.map +1 -0
  492. package/dist/storage/driver.js +14 -0
  493. package/dist/storage/driver.js.map +1 -0
  494. package/dist/storage/factory.d.ts +4 -0
  495. package/dist/storage/factory.d.ts.map +1 -0
  496. package/dist/storage/factory.js +20 -0
  497. package/dist/storage/factory.js.map +1 -0
  498. package/dist/storage/index.d.ts +4 -0
  499. package/dist/storage/index.d.ts.map +1 -0
  500. package/dist/storage/index.js +4 -0
  501. package/dist/storage/index.js.map +1 -0
  502. package/dist/storage/local.d.ts +21 -0
  503. package/dist/storage/local.d.ts.map +1 -0
  504. package/dist/storage/local.js +88 -0
  505. package/dist/storage/local.js.map +1 -0
  506. package/dist/storage/s3.d.ts +29 -0
  507. package/dist/storage/s3.d.ts.map +1 -0
  508. package/dist/storage/s3.js +82 -0
  509. package/dist/storage/s3.js.map +1 -0
  510. package/dist/testing/fake-hub.d.ts +425 -0
  511. package/dist/testing/fake-hub.d.ts.map +1 -0
  512. package/dist/testing/fake-hub.js +1074 -0
  513. package/dist/testing/fake-hub.js.map +1 -0
  514. package/dist/testing/helpers.d.ts +124 -0
  515. package/dist/testing/helpers.d.ts.map +1 -0
  516. package/dist/testing/helpers.js +174 -0
  517. package/dist/testing/helpers.js.map +1 -0
  518. package/dist/testing/index.d.ts +12 -0
  519. package/dist/testing/index.d.ts.map +1 -0
  520. package/dist/testing/index.js +12 -0
  521. package/dist/testing/index.js.map +1 -0
  522. package/dist/testing/setup-origins.d.ts +21 -0
  523. package/dist/testing/setup-origins.d.ts.map +1 -0
  524. package/dist/testing/setup-origins.js +57 -0
  525. package/dist/testing/setup-origins.js.map +1 -0
  526. package/dist/testing/sso-helpers.d.ts +43 -0
  527. package/dist/testing/sso-helpers.d.ts.map +1 -0
  528. package/dist/testing/sso-helpers.js +159 -0
  529. package/dist/testing/sso-helpers.js.map +1 -0
  530. package/dist/tool-definition.d.ts +382 -0
  531. package/dist/tool-definition.d.ts.map +1 -0
  532. package/dist/tool-definition.js +46 -0
  533. package/dist/tool-definition.js.map +1 -0
  534. package/dist/util/index.d.ts +8 -0
  535. package/dist/util/index.d.ts.map +1 -0
  536. package/dist/util/index.js +8 -0
  537. package/dist/util/index.js.map +1 -0
  538. package/package.json +161 -0
  539. package/src/accounts/deletion.ts +389 -0
  540. package/src/accounts/erasure-log.ts +140 -0
  541. package/src/accounts/index.ts +5 -0
  542. package/src/accounts/mint-refusal.ts +67 -0
  543. package/src/accounts/signup-duplicate.ts +21 -0
  544. package/src/accounts/superadmin.ts +46 -0
  545. package/src/api/apikeys.ts +147 -0
  546. package/src/api/audit.ts +83 -0
  547. package/src/api/break-glass.ts +294 -0
  548. package/src/api/cli-auth.ts +308 -0
  549. package/src/api/create-api.ts +1403 -0
  550. package/src/api/demo-passes.ts +207 -0
  551. package/src/api/errors.ts +13 -0
  552. package/src/api/export.ts +482 -0
  553. package/src/api/files.ts +200 -0
  554. package/src/api/index.ts +29 -0
  555. package/src/api/invitations.ts +396 -0
  556. package/src/api/members.ts +617 -0
  557. package/src/api/onboarding.ts +50 -0
  558. package/src/api/openapi-doc.ts +34 -0
  559. package/src/api/projects.ts +788 -0
  560. package/src/api/scope-routes.ts +12 -0
  561. package/src/api/sso-connect.ts +246 -0
  562. package/src/api/sso-logout.ts +76 -0
  563. package/src/api/teams.ts +575 -0
  564. package/src/api/workspaces.ts +649 -0
  565. package/src/apikeys/index.ts +2 -0
  566. package/src/apikeys/peppers.ts +118 -0
  567. package/src/apikeys/service.ts +223 -0
  568. package/src/app.ts +228 -0
  569. package/src/audit/filters.ts +101 -0
  570. package/src/audit/index.ts +9 -0
  571. package/src/audit/service.ts +154 -0
  572. package/src/boot.ts +953 -0
  573. package/src/constant-time.ts +9 -0
  574. package/src/email/driver.ts +139 -0
  575. package/src/email/index.ts +26 -0
  576. package/src/email/shell.ts +201 -0
  577. package/src/email/templates.ts +184 -0
  578. package/src/entitlements/check.ts +435 -0
  579. package/src/entitlements/clock-skew.ts +58 -0
  580. package/src/entitlements/gate.ts +636 -0
  581. package/src/entitlements/hub-machine-token.ts +205 -0
  582. package/src/entitlements/hub-subject.ts +77 -0
  583. package/src/entitlements/index.ts +37 -0
  584. package/src/entitlements/poster.ts +265 -0
  585. package/src/entitlements/profiles.ts +303 -0
  586. package/src/entitlements/slot.ts +105 -0
  587. package/src/env.ts +456 -0
  588. package/src/files/http.ts +77 -0
  589. package/src/files/index.ts +4 -0
  590. package/src/files/serve.ts +115 -0
  591. package/src/files/service.ts +209 -0
  592. package/src/files/spool.ts +58 -0
  593. package/src/identity/better-auth.ts +1103 -0
  594. package/src/identity/demo-pass-plugin.ts +121 -0
  595. package/src/identity/demo-pass-rules.ts +229 -0
  596. package/src/identity/demo-pass.ts +390 -0
  597. package/src/identity/hub-grant.ts +704 -0
  598. package/src/identity/hub-jwt.ts +78 -0
  599. package/src/identity/hub-live-gate.ts +167 -0
  600. package/src/identity/hub-logout.ts +174 -0
  601. package/src/identity/hub-projection.ts +251 -0
  602. package/src/identity/hub-reconcile.ts +572 -0
  603. package/src/identity/hub-sso.ts +696 -0
  604. package/src/identity/hub-user-client.ts +554 -0
  605. package/src/identity/index.ts +56 -0
  606. package/src/identity/oauth-jwt.ts +128 -0
  607. package/src/identity/resolve-membership.ts +104 -0
  608. package/src/identity/signing-key.ts +164 -0
  609. package/src/index.ts +65 -0
  610. package/src/invitations/index.ts +1 -0
  611. package/src/invitations/service.ts +171 -0
  612. package/src/jobs/index.ts +25 -0
  613. package/src/jobs/pgboss.ts +594 -0
  614. package/src/jobs/timers.ts +287 -0
  615. package/src/logger.ts +67 -0
  616. package/src/mcp/errors.ts +111 -0
  617. package/src/mcp/http.ts +129 -0
  618. package/src/mcp/index.ts +28 -0
  619. package/src/mcp/inputs.ts +33 -0
  620. package/src/mcp/projects.ts +480 -0
  621. package/src/mcp/server.ts +174 -0
  622. package/src/mcp/teams.ts +97 -0
  623. package/src/mcp/tool-kit.ts +148 -0
  624. package/src/members/removal.ts +216 -0
  625. package/src/middleware/auth-body.ts +58 -0
  626. package/src/middleware/auth-context.ts +384 -0
  627. package/src/middleware/body-cap.ts +33 -0
  628. package/src/middleware/body-refusal.ts +23 -0
  629. package/src/middleware/cross-site.ts +122 -0
  630. package/src/middleware/hub-managed.ts +61 -0
  631. package/src/middleware/idempotency.ts +264 -0
  632. package/src/middleware/index.ts +33 -0
  633. package/src/middleware/json-depth.ts +74 -0
  634. package/src/middleware/no-store.ts +30 -0
  635. package/src/middleware/oauth-public.ts +54 -0
  636. package/src/middleware/rate-limit.ts +432 -0
  637. package/src/middleware/request-id.ts +54 -0
  638. package/src/middleware/scopes.ts +150 -0
  639. package/src/middleware/security-headers.ts +129 -0
  640. package/src/observability/index.ts +2 -0
  641. package/src/observability/metrics.ts +102 -0
  642. package/src/observability/otel.ts +79 -0
  643. package/src/pagination.ts +118 -0
  644. package/src/platform/edition.ts +140 -0
  645. package/src/platform/entitlements.ts +47 -0
  646. package/src/platform/events.ts +71 -0
  647. package/src/platform/index.ts +7 -0
  648. package/src/platform/local-identity.ts +90 -0
  649. package/src/platform/registry.ts +28 -0
  650. package/src/platform/usage.ts +13 -0
  651. package/src/platform/workspaces.ts +41 -0
  652. package/src/projects/access.ts +160 -0
  653. package/src/projects/index.ts +7 -0
  654. package/src/route-label.ts +29 -0
  655. package/src/routes/health.ts +79 -0
  656. package/src/routes/index.ts +2 -0
  657. package/src/routes/wellknown.ts +67 -0
  658. package/src/secret.ts +115 -0
  659. package/src/setup-transport.ts +46 -0
  660. package/src/state.ts +23 -0
  661. package/src/storage/driver.ts +48 -0
  662. package/src/storage/factory.ts +34 -0
  663. package/src/storage/index.ts +3 -0
  664. package/src/storage/local.ts +93 -0
  665. package/src/storage/s3.ts +109 -0
  666. package/src/testing/fake-hub.ts +1316 -0
  667. package/src/testing/helpers.ts +254 -0
  668. package/src/testing/index.ts +11 -0
  669. package/src/testing/setup-origins.ts +58 -0
  670. package/src/testing/sso-helpers.ts +178 -0
  671. package/src/tool-definition.ts +463 -0
  672. package/src/util/index.ts +17 -0
  673. package/test/fixtures/onboarding-backfill.sql +13 -0
  674. package/test/fixtures/operator-user-id-backfill.sql +18 -0
  675. package/test/host/dr-lib.sh +253 -0
  676. package/test/host/drizzle/0000_chassis_baseline.sql +438 -0
  677. package/test/host/drizzle/0001_last_owner_guard.sql +42 -0
  678. package/test/host/drizzle/meta/0000_snapshot.json +3566 -0
  679. package/test/host/drizzle/meta/_journal.json +20 -0
  680. package/test/host/drizzle.config.ts +17 -0
  681. package/test/host/identity.ts +41 -0
  682. package/test/host/minimal-host.ts +35 -0
  683. package/test/host/minimal-tool.ts +123 -0
  684. package/test/integration/account-oracle-uniformity.test.ts +284 -0
  685. package/test/integration/account-recovery.test.ts +236 -0
  686. package/test/integration/account.test.ts +120 -0
  687. package/test/integration/api-quota.test.ts +208 -0
  688. package/test/integration/apikey-expiry.test.ts +178 -0
  689. package/test/integration/apikey-pepper-rotation.test.ts +190 -0
  690. package/test/integration/boot-posture.test.ts +169 -0
  691. package/test/integration/break-glass.test.ts +484 -0
  692. package/test/integration/cloud-lifecycle.test.ts +233 -0
  693. package/test/integration/credential-boundaries.test.ts +195 -0
  694. package/test/integration/default-workspace.test.ts +414 -0
  695. package/test/integration/demo-pass-rules.test.ts +332 -0
  696. package/test/integration/demo-pass.test.ts +1222 -0
  697. package/test/integration/dr-verify-real-dump.test.ts +154 -0
  698. package/test/integration/edition.test.ts +868 -0
  699. package/test/integration/email-change.test.ts +394 -0
  700. package/test/integration/empty-tool.test.ts +267 -0
  701. package/test/integration/entitlements-null-hook.test.ts +187 -0
  702. package/test/integration/entitlements.test.ts +693 -0
  703. package/test/integration/export-entries.test.ts +321 -0
  704. package/test/integration/files.test.ts +320 -0
  705. package/test/integration/first-boot-claim.test.ts +131 -0
  706. package/test/integration/gdpr.test.ts +532 -0
  707. package/test/integration/helpers.ts +29 -0
  708. package/test/integration/hub-grant.test.ts +505 -0
  709. package/test/integration/hub-live-gate.test.ts +612 -0
  710. package/test/integration/hub-managed-membership.test.ts +559 -0
  711. package/test/integration/hub-org-selector.test.ts +281 -0
  712. package/test/integration/hub-reconcile.test.ts +646 -0
  713. package/test/integration/hub-sso.test.ts +704 -0
  714. package/test/integration/hub-teams.test.ts +771 -0
  715. package/test/integration/idempotency.test.ts +261 -0
  716. package/test/integration/invite-verification.test.ts +210 -0
  717. package/test/integration/last-owner-race.test.ts +263 -0
  718. package/test/integration/m9-fixes.test.ts +290 -0
  719. package/test/integration/mcp-projects.test.ts +463 -0
  720. package/test/integration/member-removal-race.test.ts +466 -0
  721. package/test/integration/member-removal.test.ts +794 -0
  722. package/test/integration/oauth-mcp.test.ts +477 -0
  723. package/test/integration/oauth-workspace.test.ts +371 -0
  724. package/test/integration/observability.test.ts +183 -0
  725. package/test/integration/onboarding.test.ts +268 -0
  726. package/test/integration/orphan-purge.test.ts +451 -0
  727. package/test/integration/pagination.test.ts +344 -0
  728. package/test/integration/platform-core.test.ts +305 -0
  729. package/test/integration/platform.test.ts +246 -0
  730. package/test/integration/pool-survives-restart.test.ts +80 -0
  731. package/test/integration/projects-cloud.test.ts +193 -0
  732. package/test/integration/projects.test.ts +1310 -0
  733. package/test/integration/security-fixes.test.ts +190 -0
  734. package/test/integration/setup-transport.test.ts +118 -0
  735. package/test/integration/signin-wall.test.ts +103 -0
  736. package/test/integration/signing-key-rotation.test.ts +349 -0
  737. package/test/integration/sso-helpers.ts +15 -0
  738. package/test/integration/sso-logout.test.ts +283 -0
  739. package/test/integration/teams-cloud.test.ts +194 -0
  740. package/test/integration/teams.test.ts +551 -0
  741. package/test/integration/timers.test.ts +377 -0
  742. package/test/integration/two-factor.test.ts +301 -0
  743. package/test/integration/usage-window.test.ts +161 -0
  744. package/test/integration/workspace-create-cloud.test.ts +523 -0
  745. package/test/integration/workspace-create.test.ts +510 -0
  746. package/test/integration/workspace-scoping.test.ts +530 -0
  747. package/test/integration/zz-adv-replay-owner.test.ts +205 -0
  748. package/test/unit/apikey-peppers.test.ts +110 -0
  749. package/test/unit/apikey-prefix.test.ts +34 -0
  750. package/test/unit/audit-filters.test.ts +135 -0
  751. package/test/unit/auth-origins.test.ts +92 -0
  752. package/test/unit/body-cap.test.ts +84 -0
  753. package/test/unit/clock-skew.test.ts +68 -0
  754. package/test/unit/cross-site.test.ts +166 -0
  755. package/test/unit/declared-credits.test.ts +13 -0
  756. package/test/unit/demo-pass-rules.test.ts +192 -0
  757. package/test/unit/email-driver.test.ts +127 -0
  758. package/test/unit/end-pool.test.ts +181 -0
  759. package/test/unit/entitlement-check.test.ts +492 -0
  760. package/test/unit/entitlement-gate.test.ts +1333 -0
  761. package/test/unit/entitlement-profiles.test.ts +289 -0
  762. package/test/unit/erasure-log.test.ts +72 -0
  763. package/test/unit/error-mapping.test.ts +89 -0
  764. package/test/unit/export-entries.test.ts +85 -0
  765. package/test/unit/export-sanitize.test.ts +27 -0
  766. package/test/unit/files-head-route.test.ts +155 -0
  767. package/test/unit/files-http.test.ts +97 -0
  768. package/test/unit/head-rewrite.test.ts +72 -0
  769. package/test/unit/hub-create-org.test.ts +181 -0
  770. package/test/unit/hub-jwt.test.ts +93 -0
  771. package/test/unit/hub-sso-params.test.ts +39 -0
  772. package/test/unit/hub-subject.test.ts +83 -0
  773. package/test/unit/idempotency-crypto.test.ts +45 -0
  774. package/test/unit/json-depth.test.ts +88 -0
  775. package/test/unit/logger-redaction.test.ts +66 -0
  776. package/test/unit/mcp-errors.test.ts +110 -0
  777. package/test/unit/mcp-inputs.test.ts +106 -0
  778. package/test/unit/mcp-project-hints.test.ts +26 -0
  779. package/test/unit/no-store.test.ts +49 -0
  780. package/test/unit/no-tool-migration-filename.test.ts +70 -0
  781. package/test/unit/observability.test.ts +64 -0
  782. package/test/unit/openapi-doc.test.ts +93 -0
  783. package/test/unit/rate-limit-consume-on.test.ts +76 -0
  784. package/test/unit/rate-limit.test.ts +39 -0
  785. package/test/unit/readyz-storage.test.ts +157 -0
  786. package/test/unit/request-quota.test.ts +146 -0
  787. package/test/unit/scopes.test.ts +66 -0
  788. package/test/unit/security-headers.test.ts +131 -0
  789. package/test/unit/serve-content-type.test.ts +74 -0
  790. package/test/unit/setup-transport.test.ts +29 -0
  791. package/test/unit/storage-local.test.ts +53 -0
  792. package/test/unit/superadmin.test.ts +32 -0
  793. package/test/unit/timers.test.ts +287 -0
  794. package/test/unit/tool-definition-guards.test.ts +166 -0
  795. package/test/unit/tool-entitlements-guard.test.ts +168 -0
  796. package/test/unit/usage-poster.test.ts +542 -0
  797. package/test/unit/usage-window.test.ts +48 -0
  798. package/test/unit/workspace-create-audit.test.ts +48 -0
@@ -0,0 +1,522 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { and, desc, eq, ne } from 'drizzle-orm';
3
+ import { createEmailVerificationToken } from 'better-auth/api';
4
+ import { memberChangeEmailLinkRoute, memberDeleteRoute, memberRemoveRoute, memberResetLinkRoute, memberUpdateRoute, membersListRoute } from '@antasphere/chassis-contract/routes';
5
+ import { workspaceMembers, user as userTable } from '@antasphere/chassis-db';
6
+ import { isLastOwnerDbError, LastOwnerError } from '../accounts/deletion.js';
7
+ import { mintRefusal as sharedMintRefusal } from '../accounts/mint-refusal.js';
8
+ import { cursorRowId, keysetBefore, pageOf } from '../pagination.js';
9
+ import { requireAuth, requireNonGuest, requireRole } from '../middleware/auth-context.js';
10
+ import { hubManagedMembershipGate } from '../middleware/hub-managed.js';
11
+ import { deleteMembershipGrants, mergeRemovalCounts } from '../members/removal.js';
12
+ const err = (code, message) => ({ error: { code, message } });
13
+ const toWire = (m) => ({
14
+ id: m.id,
15
+ userId: m.userId,
16
+ email: m.email,
17
+ name: m.name,
18
+ role: m.role,
19
+ isActive: m.isActive,
20
+ createdAt: m.createdAt.toISOString(),
21
+ lastSeenAt: m.lastSeenAt?.toISOString() ?? null
22
+ });
23
+ export function registerMemberRoutes(api, deps) {
24
+ const { db, auth, publicBaseUrl, accountDeletion, hubManaged } = deps;
25
+ // P7 (cloud only): membership of a hub-origin workspace is the HUB's to
26
+ // manage — every local mutation shape under /members answers the
27
+ // `hub_managed` pointer. Registered BEFORE the role gates so any
28
+ // authenticated caller gets the truthful refusal (an anonymous caller
29
+ // passes through — no principal — and still 401s at requireRole below).
30
+ // GET /members is untouched: the gate is method-keyed and the projected
31
+ // roster is real. ONE wildcard mount covers the whole subtree — the
32
+ // collection root, `/members/:id`, the 3-segment link paths, and any
33
+ // FUTURE mutation registered under /members — so fail-closed holds by
34
+ // construction, never by remembering a per-path registration.
35
+ if (hubManaged) {
36
+ api.use('/members/*', hubManagedMembershipGate(hubManaged.manageUrl));
37
+ }
38
+ api.use('/members', requireAuth());
39
+ // Guest capability limit (D2, both editions): the member roster (names +
40
+ // emails of the whole team) is a workspace-level surface. A guest is an
41
+ // external party invited to ONE resource — the host tenant's directory is not
42
+ // theirs to read. Per-resource surfaces their grant opens are untouched.
43
+ api.use('/members', requireNonGuest());
44
+ api.openapi(membersListRoute, async (c) => {
45
+ const principal = c.get('principal');
46
+ const { cursor, limit } = c.req.valid('query');
47
+ const cursorId = cursorRowId(cursor);
48
+ const rows = await db
49
+ .select({
50
+ id: workspaceMembers.id,
51
+ userId: workspaceMembers.userId,
52
+ email: userTable.email,
53
+ name: userTable.name,
54
+ role: workspaceMembers.role,
55
+ isActive: workspaceMembers.isActive,
56
+ createdAt: workspaceMembers.createdAt,
57
+ lastSeenAt: workspaceMembers.lastSeenAt
58
+ })
59
+ .from(workspaceMembers)
60
+ .innerJoin(userTable, eq(workspaceMembers.userId, userTable.id))
61
+ .where(and(eq(workspaceMembers.workspaceId, principal.workspaceId), ...(cursorId
62
+ ? [
63
+ keysetBefore({
64
+ table: workspaceMembers,
65
+ id: workspaceMembers.id,
66
+ createdAt: workspaceMembers.createdAt,
67
+ workspaceId: workspaceMembers.workspaceId,
68
+ cursorId,
69
+ workspace: principal.workspaceId
70
+ })
71
+ ]
72
+ : [])))
73
+ .orderBy(desc(workspaceMembers.createdAt), desc(workspaceMembers.id))
74
+ .limit(limit + 1);
75
+ const { page, nextCursor } = pageOf(rows, limit);
76
+ return c.json({ members: page.map(toWire), nextCursor }, 200);
77
+ });
78
+ api.use('/members/:id', requireRole('admin'));
79
+ api.openapi(memberUpdateRoute, async (c) => {
80
+ const principal = c.get('principal');
81
+ const { id } = c.req.valid('param');
82
+ const patch = c.req.valid('json');
83
+ const [target] = await db
84
+ .select({
85
+ id: workspaceMembers.id,
86
+ userId: workspaceMembers.userId,
87
+ role: workspaceMembers.role,
88
+ origin: workspaceMembers.origin,
89
+ isActive: workspaceMembers.isActive
90
+ })
91
+ .from(workspaceMembers)
92
+ .where(and(eq(workspaceMembers.id, id), eq(workspaceMembers.workspaceId, principal.workspaceId)))
93
+ .limit(1);
94
+ if (!target)
95
+ return c.json(err('not_found', 'Member not found'), 404);
96
+ if (target.userId === principal.userId && patch.isActive === false) {
97
+ return c.json(err('cannot_deactivate_self', 'You cannot deactivate yourself'), 400);
98
+ }
99
+ // Guest role-lock (D2): a guest row is 'member' by construction and the
100
+ // guest capability limits key on origin, which no surface upgrades —
101
+ // promoting one would mint a workspace admin the guest gates still
102
+ // refuse resource creation to (an incoherent half-state), and on cloud an
103
+ // administrator the hub knows nothing about. To empower the person,
104
+ // invite them as a real member; the claim path preserves that row's
105
+ // origin. Deactivate/reactivate stays available — cutting a guest off
106
+ // entirely is a legitimate admin act.
107
+ if (target.origin === 'guest' && patch.role && patch.role !== target.role) {
108
+ return c.json(err('guest_role_locked', 'A guest membership cannot change role — invite them as a member instead'), 403);
109
+ }
110
+ // Only owners touch owners (grant or revoke).
111
+ if ((target.role === 'owner' || patch.role === 'owner') && principal.role !== 'owner') {
112
+ return c.json(err('forbidden', 'Only an owner can change owner roles'), 403);
113
+ }
114
+ // Never leave the workspace without an active owner (shared with the
115
+ // account-deletion guards in accounts/deletion.ts). Demotions run under
116
+ // the race-free guard: workspace advisory lock + re-check, with the
117
+ // migration-0009 trigger as the DB-level backstop — a concurrent-race
118
+ // loser gets this clean 400, never a 500.
119
+ const losesOwner = target.role === 'owner' && ((patch.role && patch.role !== 'owner') || patch.isActive === false);
120
+ const applyPatch = async () => {
121
+ await db
122
+ .update(workspaceMembers)
123
+ .set({
124
+ ...(patch.role ? { role: patch.role } : {}),
125
+ ...(patch.isActive !== undefined ? { isActive: patch.isActive } : {})
126
+ })
127
+ .where(eq(workspaceMembers.id, target.id));
128
+ };
129
+ try {
130
+ if (losesOwner) {
131
+ await accountDeletion.withLastOwnerGuard(principal.workspaceId, target.userId, applyPatch);
132
+ }
133
+ else {
134
+ await applyPatch();
135
+ }
136
+ }
137
+ catch (cause) {
138
+ // The guarded loser throws LastOwnerError; the unguarded branch (or a
139
+ // demotion racing invitation re-acceptance) can still trip the 0009
140
+ // trigger with P0409 — both mean the last active owner would be lost.
141
+ if (cause instanceof LastOwnerError || isLastOwnerDbError(cause)) {
142
+ const message = cause instanceof LastOwnerError
143
+ ? cause.message
144
+ : 'The workspace must keep at least one active owner';
145
+ return c.json(err('last_owner', message), 400);
146
+ }
147
+ throw cause;
148
+ }
149
+ const [updated] = await db
150
+ .select({
151
+ id: workspaceMembers.id,
152
+ userId: workspaceMembers.userId,
153
+ email: userTable.email,
154
+ name: userTable.name,
155
+ role: workspaceMembers.role,
156
+ isActive: workspaceMembers.isActive,
157
+ createdAt: workspaceMembers.createdAt,
158
+ lastSeenAt: workspaceMembers.lastSeenAt
159
+ })
160
+ .from(workspaceMembers)
161
+ .innerJoin(userTable, eq(workspaceMembers.userId, userTable.id))
162
+ .where(eq(workspaceMembers.id, target.id))
163
+ .limit(1);
164
+ c.set('audit', {
165
+ action: 'member.update',
166
+ resourceType: 'member',
167
+ resourceId: target.id,
168
+ metadata: { ...patch, targetUserId: target.userId }
169
+ });
170
+ return c.json(toWire(updated), 200);
171
+ });
172
+ // Admin account deletion (GDPR erasure, the second delete surface).
173
+ // Covered by the 2-segment `/members/:id` requireRole gate above; machines
174
+ // are excluded automatically because DELETE /members/{id} is deliberately
175
+ // unlisted in the fail-closed scope allowlist. Files the target uploaded
176
+ // stay with the workspace (created_by → NULL via FK); NO blob cleanup.
177
+ api.openapi(memberDeleteRoute, async (c) => {
178
+ const principal = c.get('principal');
179
+ const { id } = c.req.valid('param');
180
+ const [target] = await db
181
+ .select({
182
+ id: workspaceMembers.id,
183
+ userId: workspaceMembers.userId,
184
+ role: workspaceMembers.role,
185
+ isActive: workspaceMembers.isActive
186
+ })
187
+ .from(workspaceMembers)
188
+ .where(and(eq(workspaceMembers.id, id), eq(workspaceMembers.workspaceId, principal.workspaceId)))
189
+ .limit(1);
190
+ if (!target)
191
+ return c.json(err('not_found', 'Member not found'), 404);
192
+ if (target.userId === principal.userId) {
193
+ return c.json(err('cannot_delete_self', 'Delete your own account from the account page'), 400);
194
+ }
195
+ if (target.role === 'owner' && principal.role !== 'owner') {
196
+ return c.json(err('forbidden', 'Only an owner can delete an owner'), 403);
197
+ }
198
+ // ADR 014: deleting the ACCOUNT erases the user from EVERY workspace, and
199
+ // an admin's authority ends at their own — refuse when the target belongs
200
+ // to any other workspace (remove the person from this one instead; the account
201
+ // holder can erase themselves). Single-workspace instances never hit this.
202
+ const [foreign] = await db
203
+ .select({ id: workspaceMembers.id })
204
+ .from(workspaceMembers)
205
+ .where(and(eq(workspaceMembers.userId, target.userId), ne(workspaceMembers.workspaceId, principal.workspaceId)))
206
+ .limit(1);
207
+ if (foreign) {
208
+ return c.json(err('member_of_other_workspaces', 'This account belongs to other workspaces — remove the person from this workspace instead of deleting the account'), 409);
209
+ }
210
+ // Snapshot the wire member BEFORE the cascade removes the joined user row.
211
+ const [snapshot] = await db
212
+ .select({
213
+ id: workspaceMembers.id,
214
+ userId: workspaceMembers.userId,
215
+ email: userTable.email,
216
+ name: userTable.name,
217
+ role: workspaceMembers.role,
218
+ isActive: workspaceMembers.isActive,
219
+ createdAt: workspaceMembers.createdAt,
220
+ lastSeenAt: workspaceMembers.lastSeenAt
221
+ })
222
+ .from(workspaceMembers)
223
+ .innerJoin(userTable, eq(workspaceMembers.userId, userTable.id))
224
+ .where(eq(workspaceMembers.id, target.id))
225
+ .limit(1);
226
+ // Better Auth's own deletion path (adapter hooks included) — NOT raw
227
+ // drizzle. Membership, api keys, invitations they issued, and sessions
228
+ // cascade; audit rows and file uploader anonymize via SET NULL.
229
+ // Deleting an ACTIVE OWNER runs under the race-free last-owner guard
230
+ // (workspace advisory lock + re-check; the migration-0009 trigger
231
+ // backstops) so a concurrent-race loser gets a clean 400 last_owner.
232
+ const cascade = async () => {
233
+ const authCtx = await auth.$context;
234
+ await authCtx.internalAdapter.deleteUser(target.userId);
235
+ await authCtx.internalAdapter.deleteUserSessions(target.userId);
236
+ // OPS-3 (PRDCT-1357): this path bypasses the deleteUser hooks, so the
237
+ // erasure tombstone is written here — a restore must not undo this.
238
+ await accountDeletion.recordErasure({ id: target.userId, email: snapshot.email });
239
+ };
240
+ try {
241
+ if (target.role === 'owner' && target.isActive) {
242
+ await accountDeletion.withLastOwnerGuard(principal.workspaceId, target.userId, cascade);
243
+ }
244
+ else {
245
+ await cascade();
246
+ }
247
+ }
248
+ catch (cause) {
249
+ // isLastOwnerDbError: the unguarded branch can still trip the trigger
250
+ // when the target is promoted to last owner mid-flight.
251
+ if (cause instanceof LastOwnerError || isLastOwnerDbError(cause)) {
252
+ return c.json(err('last_owner', 'The workspace must keep at least one active owner'), 400);
253
+ }
254
+ throw cause;
255
+ }
256
+ c.set('audit', {
257
+ action: 'member.delete',
258
+ resourceType: 'member',
259
+ resourceId: target.id,
260
+ metadata: { targetUserId: target.userId, email: snapshot.email }
261
+ });
262
+ return c.json(toWire(snapshot), 200);
263
+ });
264
+ // Removal (PRDCT-2816): the act between the pause and the account erasure,
265
+ // and the same one the hub's removal is on cloud. The membership row is
266
+ // switched off, never deleted (a new invitation reactivates the very same
267
+ // row), and the person's project grants, their team seats and what the
268
+ // tool hangs on them in this workspace go with it, in ONE transaction: a
269
+ // person brought back starts with none. The row is left at the role
270
+ // `member`: the role a person held is not kept in wait for them either, so
271
+ // whatever switches the row back on (an admin's Reactivate, an invitation,
272
+ // which names its own role) never hands an old admin or owner role back.
273
+ // The account, and the person's memberships of other workspaces, are untouched.
274
+ // An already paused member can be removed: that turns the pause into a
275
+ // removal. The 2-segment gate above does NOT cover this 3-segment path, so
276
+ // it is gated explicitly. Machines never reach it: the path is deliberately
277
+ // UNLISTED in the fail-closed scope allowlist, like the account deletion.
278
+ // A hub-origin workspace died at the subtree gate with `hub_managed`.
279
+ api.use('/members/:id/remove', requireRole('admin'));
280
+ api.openapi(memberRemoveRoute, async (c) => {
281
+ const principal = c.get('principal');
282
+ const { id } = c.req.valid('param');
283
+ const [target] = await db
284
+ .select({
285
+ id: workspaceMembers.id,
286
+ userId: workspaceMembers.userId,
287
+ role: workspaceMembers.role,
288
+ isActive: workspaceMembers.isActive
289
+ })
290
+ .from(workspaceMembers)
291
+ .where(and(eq(workspaceMembers.id, id), eq(workspaceMembers.workspaceId, principal.workspaceId)))
292
+ .limit(1);
293
+ if (!target)
294
+ return c.json(err('not_found', 'Member not found'), 404);
295
+ if (target.userId === principal.userId) {
296
+ return c.json(err('cannot_remove_self', 'You cannot remove yourself'), 400);
297
+ }
298
+ if (target.role === 'owner' && principal.role !== 'owner') {
299
+ return c.json(err('forbidden', 'Only an owner can remove an owner'), 403);
300
+ }
301
+ // The WHERE names the workspace again: the row is the one read above,
302
+ // and the statement could not reach another workspace's even if it were not.
303
+ // What the person held goes first, the row second: the same lock order
304
+ // as an invitation's accept, which locks the invitation and then the
305
+ // membership row (members/removal.ts, ORDER).
306
+ const remove = () => db.transaction(async (tx) => {
307
+ const removedRow = [
308
+ { memberId: target.id, workspaceId: principal.workspaceId, userId: target.userId }
309
+ ];
310
+ const counts = await deleteMembershipGrants(tx, removedRow, deps.onMembershipRemoval);
311
+ await tx
312
+ .update(workspaceMembers)
313
+ .set({ isActive: false, isDefault: false, role: 'member' })
314
+ .where(and(eq(workspaceMembers.id, target.id), eq(workspaceMembers.workspaceId, principal.workspaceId)));
315
+ // The second pass, after the row is off (the end-to-end verification,
316
+ // finding 5): an add that held the membership row FOR SHARE before the
317
+ // update (`holdLiveMembership`: a project grant, a team seat, a demo
318
+ // pass) made the update wait, and committed its right between the
319
+ // first pass and the update. This pass takes it. Any add after the
320
+ // update re-reads the row off and writes nothing, so two passes end it.
321
+ const late = await deleteMembershipGrants(tx, removedRow, deps.onMembershipRemoval);
322
+ return mergeRemovalCounts(counts, late);
323
+ });
324
+ let removed;
325
+ try {
326
+ // Removing an ACTIVE owner runs under the race-free last-owner guard,
327
+ // as the pause and the account deletion do.
328
+ removed =
329
+ target.role === 'owner' && target.isActive
330
+ ? await accountDeletion.withLastOwnerGuard(principal.workspaceId, target.userId, remove)
331
+ : await remove();
332
+ }
333
+ catch (cause) {
334
+ if (cause instanceof LastOwnerError || isLastOwnerDbError(cause)) {
335
+ return c.json(err('last_owner', 'The workspace must keep at least one active owner'), 400);
336
+ }
337
+ throw cause;
338
+ }
339
+ const [after] = await db
340
+ .select({
341
+ id: workspaceMembers.id,
342
+ userId: workspaceMembers.userId,
343
+ email: userTable.email,
344
+ name: userTable.name,
345
+ role: workspaceMembers.role,
346
+ isActive: workspaceMembers.isActive,
347
+ createdAt: workspaceMembers.createdAt,
348
+ lastSeenAt: workspaceMembers.lastSeenAt
349
+ })
350
+ .from(workspaceMembers)
351
+ .innerJoin(userTable, eq(workspaceMembers.userId, userTable.id))
352
+ .where(eq(workspaceMembers.id, target.id))
353
+ .limit(1);
354
+ c.set('audit', {
355
+ action: 'member.remove',
356
+ resourceType: 'member',
357
+ resourceId: target.id,
358
+ // The tool's counts first: a name the chassis writes is the chassis's.
359
+ metadata: {
360
+ ...removed.tool,
361
+ targetUserId: target.userId,
362
+ roleBefore: target.role,
363
+ projectGrants: removed.projectGrants,
364
+ teamSeats: removed.teamSeats,
365
+ invitations: removed.invitations,
366
+ demoPasses: removed.demoPasses
367
+ }
368
+ });
369
+ return c.json(toWire(after), 200);
370
+ });
371
+ // The shared refusal of every route that mints a sign-in-equivalent
372
+ // credential for another user (PRDCT-1354): guest targets and targets
373
+ // belonging to another workspace. Its own module (accounts/mint-refusal.ts),
374
+ // shared with the demo pass mint; bound here to this router's db and copy.
375
+ const mintRefusal = (principal, target) => sharedMintRefusal(db, deps.guestTargetMessage, principal, target);
376
+ // Owner-generated password reset link — the recovery path that works with
377
+ // no email driver (invitations' copyable-link pattern). The 2-segment gate
378
+ // above does NOT cover this 3-segment path, so gate it explicitly — and at
379
+ // OWNER, not admin (AUTH-8: see mintRefusal).
380
+ api.use('/members/:id/reset-link', requireRole('owner'));
381
+ api.openapi(memberResetLinkRoute, async (c) => {
382
+ // Cloud edition (`hubManaged` is present iff EDITION=cloud): the token a
383
+ // mint would produce lands on POST /reset-password, which the D1 hub-only
384
+ // posture refuses there (identity/better-auth.ts isPasswordResetPath) —
385
+ // so minting would hand admins a dead link. Refuse at the source instead.
386
+ // Hub-origin workspaces already died at the subtree gate above with
387
+ // `hub_managed`; this covers cloud-LOCAL workspaces (the operator's,
388
+ // guest hosts). Recovery for local accounts there: hub SSO for
389
+ // humans, break-glass for the operator. oss is untouched.
390
+ if (hubManaged) {
391
+ return c.json(err('password_reset_disabled', 'Local password reset is disabled on this edition — credentials are managed at the Antasphere hub'), 403);
392
+ }
393
+ const principal = c.get('principal');
394
+ const { id } = c.req.valid('param');
395
+ const [target] = await db
396
+ .select({
397
+ id: workspaceMembers.id,
398
+ userId: workspaceMembers.userId,
399
+ role: workspaceMembers.role,
400
+ origin: workspaceMembers.origin
401
+ })
402
+ .from(workspaceMembers)
403
+ .where(and(eq(workspaceMembers.id, id), eq(workspaceMembers.workspaceId, principal.workspaceId)))
404
+ .limit(1);
405
+ if (!target)
406
+ return c.json(err('not_found', 'Member not found'), 404);
407
+ const refusal = await mintRefusal(principal, target);
408
+ if (refusal)
409
+ return c.json(err(refusal.code, refusal.message), 403);
410
+ // Mint a single-use token in Better Auth's own verification table, in the
411
+ // exact shape POST /reset-password consumes (`reset-password:<token>`).
412
+ const token = randomBytes(24).toString('base64url');
413
+ const expiresAt = new Date(Date.now() + 60 * 60 * 1000); // 1h
414
+ const authCtx = await auth.$context;
415
+ await authCtx.internalAdapter.createVerificationValue({
416
+ identifier: `reset-password:${token}`,
417
+ value: target.userId,
418
+ expiresAt
419
+ });
420
+ c.set('audit', {
421
+ action: 'member.reset_link',
422
+ resourceType: 'member',
423
+ resourceId: target.id,
424
+ metadata: { targetUserId: target.userId }
425
+ });
426
+ return c.json({
427
+ resetUrl: `${publicBaseUrl.replace(/\/+$/, '')}/reset-password?token=${token}`,
428
+ expiresAt: expiresAt.toISOString()
429
+ }, 200);
430
+ });
431
+ // Owner-generated email change link — the email-change path that works
432
+ // with no email driver (same copyable-link pattern as the reset link).
433
+ // The 2-segment gate above does NOT cover this 3-segment path either, so
434
+ // gate it explicitly — at OWNER, like its sibling (AUTH-8).
435
+ api.use('/members/:id/change-email-link', requireRole('owner'));
436
+ api.openapi(memberChangeEmailLinkRoute, async (c) => {
437
+ // Cloud edition (`hubManaged` is present iff EDITION=cloud): the SAME
438
+ // closure the reset-link sibling carries, which this route was missing
439
+ // (AUTH-1). It is the stronger of the two — the minted JWT is
440
+ // sign-in-equivalent AND rewrites the address the hub identity is keyed
441
+ // on, while on cloud a user's email is the hub's to own (D10 re-syncs it
442
+ // on every login, so a local rewrite is either overwritten or a
443
+ // hijack). Hub-origin workspaces already died at the P7 subtree gate
444
+ // with `hub_managed`; this covers cloud-LOCAL workspaces (the
445
+ // operator's, guest hosts). oss is untouched.
446
+ if (hubManaged) {
447
+ return c.json(err('email_change_disabled', 'Local email changes are disabled on this edition — identities are managed at the Antasphere hub'), 403);
448
+ }
449
+ const principal = c.get('principal');
450
+ const { id } = c.req.valid('param');
451
+ const body = c.req.valid('json');
452
+ const [target] = await db
453
+ .select({
454
+ id: workspaceMembers.id,
455
+ userId: workspaceMembers.userId,
456
+ role: workspaceMembers.role,
457
+ origin: workspaceMembers.origin,
458
+ email: userTable.email
459
+ })
460
+ .from(workspaceMembers)
461
+ .innerJoin(userTable, eq(workspaceMembers.userId, userTable.id))
462
+ .where(and(eq(workspaceMembers.id, id), eq(workspaceMembers.workspaceId, principal.workspaceId)))
463
+ .limit(1);
464
+ if (!target)
465
+ return c.json(err('not_found', 'Member not found'), 404);
466
+ const refusal = await mintRefusal(principal, target);
467
+ if (refusal)
468
+ return c.json(err(refusal.code, refusal.message), 403);
469
+ // Better Auth stores emails lowercased — compare and mint in that form.
470
+ // ⚠️ RACE-7: this lookup is ADVISORY ONLY, never the boundary. It is a
471
+ // read outside any lock, and the mint writes nothing (the token is a
472
+ // stateless JWT — LESSONS.md M6), so two concurrent mints for the same
473
+ // `newEmail` both pass it. The REAL enforcement is the `user.email`
474
+ // UNIQUE constraint at CONSUMPTION time: whichever link is consumed
475
+ // first wins the address and the loser's link fails, leaving exactly one
476
+ // account on that email (asserted in test/integration/minted-credentials
477
+ // .test.ts). Never promote this pre-check to a uniqueness guarantee.
478
+ // RACE-7 scope choice: joined on THIS workspace's membership rows — an
479
+ // unscoped user lookup made the 409-vs-200 an instance-global account
480
+ // oracle; the owner already sees these emails on the roster.
481
+ // ⚠️ The constraint at consumption is OBSERVABLE, not a silent backstop
482
+ // (PRDCT-1437): a colliding consume used to answer a raw 500 against the
483
+ // free case's 302 — a mint-then-consume account oracle. The consume path
484
+ // now answers the SAME redirect + session on both branches (the
485
+ // collision rewrite at the /auth mount — rewriteChangeEmailCollision in
486
+ // api/index.ts re-signs the token as a no-op change so Better Auth runs
487
+ // its native success path), and the honest residual — the owner can always
488
+ // read back whether the change TOOK, because email uniqueness is
489
+ // instance-global — is documented in ADR 013's amendment.
490
+ const newEmail = body.newEmail.toLowerCase();
491
+ const [existing] = await db
492
+ .select({ id: userTable.id })
493
+ .from(userTable)
494
+ .innerJoin(workspaceMembers, eq(workspaceMembers.userId, userTable.id))
495
+ .where(and(eq(userTable.email, newEmail), eq(workspaceMembers.workspaceId, principal.workspaceId)))
496
+ .limit(1);
497
+ if (existing) {
498
+ return c.json(err('email_taken', 'That email is already in use'), 409);
499
+ }
500
+ // Mint the exact stateless JWT GET /verify-email consumes for an email
501
+ // change ({email: current, updateTo: new, requestType}), signed with the
502
+ // auth secret — Better Auth's own helper, never hand-rolled jose.
503
+ // ⚠️ Consuming this link updates the email AND signs the target in (a
504
+ // session is created when none exists) — it is sign-in-equivalent. Hand
505
+ // it to the target member only, never to anyone else.
506
+ const expiresIn = 3600; // 1h
507
+ const expiresAt = new Date(Date.now() + expiresIn * 1000);
508
+ const authCtx = await auth.$context;
509
+ const token = await createEmailVerificationToken(authCtx.secret, target.email, newEmail, expiresIn, {
510
+ requestType: 'change-email-verification'
511
+ });
512
+ const verifyUrl = `${publicBaseUrl.replace(/\/+$/, '')}/api/v1/auth/verify-email?token=${token}&callbackURL=%2Faccount`;
513
+ c.set('audit', {
514
+ action: 'member.change_email_link',
515
+ resourceType: 'member',
516
+ resourceId: target.id,
517
+ metadata: { targetUserId: target.userId, newEmail }
518
+ });
519
+ return c.json({ verifyUrl, newEmail, expiresAt: expiresAt.toISOString() }, 200);
520
+ });
521
+ }
522
+ //# sourceMappingURL=members.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"members.js","sourceRoot":"","sources":["../../src/api/members.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { OpenAPIHono } from '@hono/zod-openapi';
2
+ import { type Db } from '@antasphere/chassis-db';
3
+ import type { Auth } from '../identity/better-auth.js';
4
+ /**
5
+ * POST /me/onboarding/dismiss — the explicit act that hides the first-run
6
+ * welcome (SL-6, cloud edition ONLY; api/index.ts registers this module iff
7
+ * the instance boots EDITION=cloud, so oss answers the JSON 404 terminator).
8
+ *
9
+ * Session-only, same construction as /sso/logout: the path is deliberately
10
+ * UNLISTED in the fail-closed scope allowlist (middleware/scopes.ts) — every
11
+ * API key / OAuth bearer 403s in authContext before this runs — and the
12
+ * session resolves ROUTE-LOCALLY (the /me zero-state pattern) so a
13
+ * zero-membership session can dismiss too.
14
+ *
15
+ * The upsert is idempotent and preserves the FIRST dismissal timestamp: a
16
+ * second dismiss (double-click, replayed request) changes nothing. Only this
17
+ * route (and the deploy backfill) ever sets dismissed_at — the login path's
18
+ * lazy insert writes NULL — so `firstRunPending` flips exactly on the user's
19
+ * explicit act, retry-safe on every other path.
20
+ */
21
+ export interface OnboardingRouteDeps {
22
+ db: Db;
23
+ auth: Auth;
24
+ }
25
+ export declare function registerOnboardingRoutes(api: OpenAPIHono, deps: OnboardingRouteDeps): void;
26
+ //# sourceMappingURL=onboarding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../../src/api/onboarding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,OAAO,EAAkB,KAAK,EAAE,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAIvD;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,EAAE,CAAC;IACP,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAkB1F"}
@@ -0,0 +1,23 @@
1
+ import { sql } from 'drizzle-orm';
2
+ import { onboardingDismissRoute } from '@antasphere/chassis-contract/routes';
3
+ import { userOnboarding } from '@antasphere/chassis-db';
4
+ const err = (code, message) => ({ error: { code, message } });
5
+ export function registerOnboardingRoutes(api, deps) {
6
+ const { db, auth } = deps;
7
+ api.openapi(onboardingDismissRoute, async (c) => {
8
+ const session = await auth.api.getSession({ headers: c.req.raw.headers });
9
+ if (!session?.user) {
10
+ return c.json(err('unauthenticated', 'Authentication required'), 401);
11
+ }
12
+ await db
13
+ .insert(userOnboarding)
14
+ .values({ userId: session.user.id, dismissedAt: new Date() })
15
+ .onConflictDoUpdate({
16
+ target: userOnboarding.userId,
17
+ // Keep an earlier dismissal's timestamp; fill only a NULL.
18
+ set: { dismissedAt: sql `coalesce(${userOnboarding.dismissedAt}, excluded.dismissed_at)` }
19
+ });
20
+ return c.json({ dismissed: true }, 200);
21
+ });
22
+ }
23
+ //# sourceMappingURL=onboarding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/api/onboarding.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAW,MAAM,wBAAwB,CAAC;AAGjE,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,OAAe,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;AAyB9E,MAAM,UAAU,wBAAwB,CAAC,GAAgB,EAAE,IAAyB;IAClF,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAE1B,GAAG,CAAC,OAAO,CAAC,sBAAsB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC9C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;YACnB,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,yBAAyB,CAAC,EAAE,GAAG,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,EAAE;aACL,MAAM,CAAC,cAAc,CAAC;aACtB,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;aAC5D,kBAAkB,CAAC;YAClB,MAAM,EAAE,cAAc,CAAC,MAAM;YAC7B,2DAA2D;YAC3D,GAAG,EAAE,EAAE,WAAW,EAAE,GAAG,CAAA,YAAY,cAAc,CAAC,WAAW,0BAA0B,EAAE;SAC1F,CAAC,CAAC;QACL,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAa,EAAE,EAAE,GAAG,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { OpenAPIHono } from '@hono/zod-openapi';
2
+ type OpenApiObjectConfig = Parameters<OpenAPIHono['getOpenAPIDocument']>[0];
3
+ /**
4
+ * Serve the OpenAPI document from a buffer generated ONCE, at registration.
5
+ *
6
+ * `OpenAPIHono.doc()` runs the whole generator inside the request handler:
7
+ * every route definition walked, every zod schema converted, the result
8
+ * re-serialized — synchronously, on the event loop, for every caller. The
9
+ * document is also unauthenticated by design (it is in `PUBLIC_API_PATHS`), so
10
+ * it never reaches the per-principal quota either. That combination is a
11
+ * one-line anonymous DoS: a few concurrent GETs stall the loop long enough to
12
+ * starve `/healthz` and fail the container health check.
13
+ *
14
+ * The document is a pure function of the route table, which is frozen once the
15
+ * app is built — so generating it at boot is not a cache with an invalidation
16
+ * problem, it is simply the right time to do the work. Call this AFTER every
17
+ * `api.openapi(...)` registration.
18
+ */
19
+ export declare function registerOpenApiDoc(api: OpenAPIHono, config: OpenApiObjectConfig, path?: string): void;
20
+ export {};
21
+ //# sourceMappingURL=openapi-doc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi-doc.d.ts","sourceRoot":"","sources":["../../src/api/openapi-doc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,KAAK,mBAAmB,GAAG,UAAU,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE5E;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,mBAAmB,EAC3B,IAAI,SAAkB,GACrB,IAAI,CASN"}