@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,13 @@
1
+ export { type AccountEvent, type Auth, createAuth, mcpResourceUrl, signInOriginRefused, trustedOriginsFor } from './better-auth.js';
2
+ export { DEMO_PASS_DEFAULT_MINUTES, DEMO_PASS_MAX_MINUTES, DEMO_PASS_MAX_PATH_LENGTH, DEMO_SESSION_REFUSED_API_ROUTES, DEMO_SESSION_REFUSED_AUTH_PATHS, type DemoSessionRefusedApiRoute, demoSessionApiRefusalMessage, demoSessionAuthRefusal, isDemoAddress, isDemoSignInHost, isSafeDemoPath, parseDemoEmailDomains, parseDemoHosts } from './demo-pass-rules.js';
3
+ export { DEFAULT_GRANT_DIALS, type GrantAccess, HubGrantService, LOCK_WATCHDOG_HEADROOM_MS } from './hub-grant.js';
4
+ export { HubJwtVerifier } from './hub-jwt.js';
5
+ export { HubLogoutService, hintCookieClearHeader } from './hub-logout.js';
6
+ export { projectOrgMembership } from './hub-projection.js';
7
+ export { DEFAULT_FEDERATION_DIALS, type HubFederationDials, HubOrgReconciler, type ReconcilePassOutcome } from './hub-reconcile.js';
8
+ export { HUB_SSO_PROVIDER_ID, HUB_SSO_SCOPES, type HubConnectAssertion, HubSsoLoginError, HubSsoService, ssoAuthorizationUrlParams } from './hub-sso.js';
9
+ export { type HubCreateOrgResult, type HubOrgCreator, HubUserClient, classifyHubOrgCreateAnswer, hubApiResource } from './hub-user-client.js';
10
+ export { OauthJwtVerifier } from './oauth-jwt.js';
11
+ export { type OnWorkspaceMiss, resolveMembership } from './resolve-membership.js';
12
+ export { preflightSigningKey, retireSigningKey, runSigningKeyCli } from './signing-key.js';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/identity/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,IAAI,EACT,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,yBAAyB,EACzB,+BAA+B,EAC/B,+BAA+B,EAC/B,KAAK,0BAA0B,EAC/B,4BAA4B,EAC5B,sBAAsB,EACtB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,qBAAqB,EACrB,cAAc,EACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,mBAAmB,EACnB,KAAK,WAAW,EAChB,eAAe,EACf,yBAAyB,EAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EACL,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,gBAAgB,EAChB,KAAK,oBAAoB,EAC1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,KAAK,mBAAmB,EACxB,gBAAgB,EAChB,aAAa,EACb,yBAAyB,EAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,aAAa,EACb,0BAA0B,EAC1B,cAAc,EACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,KAAK,eAAe,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,13 @@
1
+ export { createAuth, mcpResourceUrl, signInOriginRefused, trustedOriginsFor } from './better-auth.js';
2
+ export { DEMO_PASS_DEFAULT_MINUTES, DEMO_PASS_MAX_MINUTES, DEMO_PASS_MAX_PATH_LENGTH, DEMO_SESSION_REFUSED_API_ROUTES, DEMO_SESSION_REFUSED_AUTH_PATHS, demoSessionApiRefusalMessage, demoSessionAuthRefusal, isDemoAddress, isDemoSignInHost, isSafeDemoPath, parseDemoEmailDomains, parseDemoHosts } from './demo-pass-rules.js';
3
+ export { DEFAULT_GRANT_DIALS, HubGrantService, LOCK_WATCHDOG_HEADROOM_MS } from './hub-grant.js';
4
+ export { HubJwtVerifier } from './hub-jwt.js';
5
+ export { HubLogoutService, hintCookieClearHeader } from './hub-logout.js';
6
+ export { projectOrgMembership } from './hub-projection.js';
7
+ export { DEFAULT_FEDERATION_DIALS, HubOrgReconciler } from './hub-reconcile.js';
8
+ export { HUB_SSO_PROVIDER_ID, HUB_SSO_SCOPES, HubSsoLoginError, HubSsoService, ssoAuthorizationUrlParams } from './hub-sso.js';
9
+ export { HubUserClient, classifyHubOrgCreateAnswer, hubApiResource } from './hub-user-client.js';
10
+ export { OauthJwtVerifier } from './oauth-jwt.js';
11
+ export { resolveMembership } from './resolve-membership.js';
12
+ export { preflightSigningKey, retireSigningKey, runSigningKeyCli } from './signing-key.js';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/identity/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,yBAAyB,EACzB,+BAA+B,EAC/B,+BAA+B,EAE/B,4BAA4B,EAC5B,sBAAsB,EACtB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,qBAAqB,EACrB,cAAc,EACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,mBAAmB,EAEnB,eAAe,EACf,yBAAyB,EAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EACL,wBAAwB,EAExB,gBAAgB,EAEjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,mBAAmB,EACnB,cAAc,EAEd,gBAAgB,EAChB,aAAa,EACb,yBAAyB,EAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EAGL,aAAa,EACb,0BAA0B,EAC1B,cAAc,EACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAwB,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { type Db } from '@antasphere/chassis-db';
2
+ import type { Principal } from '@antasphere/chassis-contract';
3
+ import { type Auth } from './better-auth.js';
4
+ import { type OnWorkspaceMiss } from './resolve-membership.js';
5
+ export declare class OauthJwtVerifier {
6
+ private readonly auth;
7
+ private readonly db;
8
+ /** Cloud only: one cached reconcile on a well-formed selector miss. */
9
+ private readonly onWorkspaceMiss?;
10
+ private readonly issuer;
11
+ private readonly audience;
12
+ private jwksCache;
13
+ constructor(auth: Auth, db: Db, publicBaseUrl: string,
14
+ /** Cloud only: one cached reconcile on a well-formed selector miss. */
15
+ onWorkspaceMiss?: OnWorkspaceMiss | undefined);
16
+ private keySet;
17
+ private verify;
18
+ /**
19
+ * Resolve a Bearer JWT to its principal, or null when the token fails
20
+ * verification or no live membership answers the selection — the same
21
+ * fail-closed semantics as the session and API-key paths.
22
+ *
23
+ * `requested` is the request's X-Workspace-Id (or null). Resolution is
24
+ * verify → sub → resolveMembership(sub, requested): the LIVE membership
25
+ * lookup is the instant-revocation point AND the whole workspace
26
+ * authorization. A legacy `workspace_id` claim (minted before the
27
+ * user-scoped model) is deliberately ignored — claims stopped being an
28
+ * authorization input entirely.
29
+ */
30
+ resolve(token: string, requested: string | null): Promise<Principal | null>;
31
+ }
32
+ //# sourceMappingURL=oauth-jwt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-jwt.d.ts","sourceRoot":"","sources":["../../src/identity/oauth-jwt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAkB,KAAK,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAA0C,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAsBvG,qBAAa,gBAAgB;IAQzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,EAAE;IAEnB,uEAAuE;IACvE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IAXnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAGlC,OAAO,CAAC,SAAS,CAAoF;gBAGlF,IAAI,EAAE,IAAI,EACV,EAAE,EAAE,EAAE,EACvB,aAAa,EAAE,MAAM;IACrB,uEAAuE;IACtD,eAAe,CAAC,EAAE,eAAe,GAAG,SAAS;YAMlD,MAAM;YASN,MAAM;IA0BpB;;;;;;;;;;;OAWG;IACG,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;CAoClF"}
@@ -0,0 +1,122 @@
1
+ import { createLocalJWKSet, jwtVerify } from 'jose';
2
+ import {} from '@antasphere/chassis-db';
3
+ import { mcpResourceUrl } from './better-auth.js';
4
+ import { isWorkspaceSelector, resolveMembership } from './resolve-membership.js';
5
+ /**
6
+ * OAuth Bearer-JWT resolution — the third credential path in auth-context.
7
+ *
8
+ * Access tokens are RS256 JWTs this instance minted itself (Better Auth jwt +
9
+ * oauthProvider plugins), so verification is fully local: JWKS straight from
10
+ * the jwt plugin (DB-backed, no HTTP), hard issuer / audience / algorithm /
11
+ * expiry pinning. On top of the signature, every request re-resolves the
12
+ * workspace membership LIVE — deactivating a member cuts token access on
13
+ * their next request, not at token expiry. Scope enforcement stays in the
14
+ * fail-closed allowlist gate (middleware/scopes.ts), identical to API keys.
15
+ *
16
+ * User-scoped credential model: a token identifies its USER ("act as you")
17
+ * and carries NO workspace authority — claims are never an authorization
18
+ * input. The request's target workspace comes from the X-Workspace-Id
19
+ * selector through the shared resolveMembership rule (explicit → fail-closed
20
+ * membership check; absent → the user's default, else oldest active), the
21
+ * same rule sessions and API keys use.
22
+ */
23
+ const JWKS_TTL_MS = 10 * 60 * 1000;
24
+ export class OauthJwtVerifier {
25
+ auth;
26
+ db;
27
+ onWorkspaceMiss;
28
+ issuer;
29
+ audience;
30
+ // Per-instance cache: the process verifies its OWN tokens, keys rotate
31
+ // rarely; on an unknown-signature failure we refetch once and retry.
32
+ jwksCache = null;
33
+ constructor(auth, db, publicBaseUrl,
34
+ /** Cloud only: one cached reconcile on a well-formed selector miss. */
35
+ onWorkspaceMiss) {
36
+ this.auth = auth;
37
+ this.db = db;
38
+ this.onWorkspaceMiss = onWorkspaceMiss;
39
+ this.issuer = publicBaseUrl;
40
+ this.audience = mcpResourceUrl(publicBaseUrl);
41
+ }
42
+ async keySet(forceRefresh = false) {
43
+ if (!forceRefresh && this.jwksCache && Date.now() - this.jwksCache.fetchedAt < JWKS_TTL_MS) {
44
+ return this.jwksCache.keySet;
45
+ }
46
+ const jwks = (await this.auth.api.getJwks());
47
+ this.jwksCache = { keySet: createLocalJWKSet(jwks), fetchedAt: Date.now() };
48
+ return this.jwksCache.keySet;
49
+ }
50
+ async verify(token) {
51
+ const options = {
52
+ issuer: this.issuer,
53
+ audience: this.audience,
54
+ algorithms: ['RS256'], // hard allowlist — implicitly rejects none/HS256
55
+ clockTolerance: 5,
56
+ requiredClaims: ['sub']
57
+ };
58
+ try {
59
+ return await jwtVerify(token, await this.keySet(), options);
60
+ }
61
+ catch (err) {
62
+ // One retry with fresh keys covers signing-key rotation mid-cache —
63
+ // both directions: a token signed by a key the cache no longer trusts
64
+ // (JWSSignatureVerificationFailed) and a token signed by a key MINTED
65
+ // after the cache was warmed (JWKSNoMatchingKey — the rotate-signing-key
66
+ // drill would otherwise answer 401 for up to JWKS_TTL_MS, ADR 023).
67
+ if (err instanceof Error &&
68
+ (err.name === 'JWSSignatureVerificationFailed' || err.name === 'JWKSNoMatchingKey')) {
69
+ return await jwtVerify(token, await this.keySet(true), options);
70
+ }
71
+ throw err;
72
+ }
73
+ }
74
+ /**
75
+ * Resolve a Bearer JWT to its principal, or null when the token fails
76
+ * verification or no live membership answers the selection — the same
77
+ * fail-closed semantics as the session and API-key paths.
78
+ *
79
+ * `requested` is the request's X-Workspace-Id (or null). Resolution is
80
+ * verify → sub → resolveMembership(sub, requested): the LIVE membership
81
+ * lookup is the instant-revocation point AND the whole workspace
82
+ * authorization. A legacy `workspace_id` claim (minted before the
83
+ * user-scoped model) is deliberately ignored — claims stopped being an
84
+ * authorization input entirely.
85
+ */
86
+ async resolve(token, requested) {
87
+ let payload;
88
+ try {
89
+ ({ payload } = await this.verify(token));
90
+ }
91
+ catch {
92
+ return null;
93
+ }
94
+ const sub = typeof payload.sub === 'string' ? payload.sub : null;
95
+ if (!sub)
96
+ return null;
97
+ let member = await resolveMembership(this.db, sub, requested);
98
+ if (!member && requested && this.onWorkspaceMiss && isWorkspaceSelector(requested)) {
99
+ // Unknown-workspace retry (cloud): the JWT verified above — the miss
100
+ // may be a hub org granted since the last reconcile pass. One cached
101
+ // reconcile, one re-run of the SAME lookup — no recursion.
102
+ await this.onWorkspaceMiss(sub, requested);
103
+ member = await resolveMembership(this.db, sub, requested);
104
+ }
105
+ if (!member)
106
+ return null;
107
+ return {
108
+ userId: sub,
109
+ email: member.email,
110
+ name: member.name,
111
+ workspaceId: member.workspaceId,
112
+ role: member.role,
113
+ origin: member.origin,
114
+ via: 'oauth',
115
+ scopes: new Set(String(typeof payload.scope === 'string' ? payload.scope : '')
116
+ .split(' ')
117
+ .filter(Boolean)),
118
+ ...(member.accountRef ? { accountRef: member.accountRef } : {})
119
+ };
120
+ }
121
+ }
122
+ //# sourceMappingURL=oauth-jwt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-jwt.js","sourceRoot":"","sources":["../../src/identity/oauth-jwt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type Db } from '@antasphere/chassis-db';
2
+ /**
3
+ * Well-formed-selector check, shared with the cloud miss-retry hook: only a
4
+ * plausibly-real workspace id ever triggers a hub reconcile — a garbage
5
+ * header can never buy a hub round-trip (the reconciler's TTL/throttle
6
+ * bounds even well-formed ones).
7
+ */
8
+ export declare function isWorkspaceSelector(value: string): boolean;
9
+ /**
10
+ * The cloud edition's unknown-workspace retry hook (internal/federation.md):
11
+ * a verified credential naming a workspace the local join cannot see MAY be
12
+ * a hub org granted since the last reconcile pass — "invited at the hub,
13
+ * clicks a deep link". Boot wires ONE cached reconcile; the resolver then
14
+ * re-runs the SAME lookup once, no recursion. undefined on oss.
15
+ */
16
+ export type OnWorkspaceMiss = (userId: string, requested: string) => Promise<void>;
17
+ export interface ResolvedMembership {
18
+ workspaceId: string;
19
+ role: 'owner' | 'admin' | 'member';
20
+ origin: 'local' | 'hub' | 'guest';
21
+ /** The workspace's centralAccountId — null outside hub projections. */
22
+ accountRef: string | null;
23
+ /** Live user row fields, for the machine paths that carry no session. */
24
+ email: string;
25
+ name: string;
26
+ }
27
+ export declare function resolveMembership(db: Db, userId: string, requested: string | null): Promise<ResolvedMembership | null>;
28
+ //# sourceMappingURL=resolve-membership.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-membership.d.ts","sourceRoot":"","sources":["../../src/identity/resolve-membership.ts"],"names":[],"mappings":"AACA,OAAO,EAAmD,KAAK,EAAE,EAAE,MAAM,wBAAwB,CAAC;AA+BlG;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnF,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;IACnC,MAAM,EAAE,OAAO,GAAG,KAAK,GAAG,OAAO,CAAC;IAClC,uEAAuE;IACvE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAAG,IAAI,GACvB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAqCpC"}
@@ -0,0 +1,69 @@
1
+ import { and, asc, desc, eq, or, sql } from 'drizzle-orm';
2
+ import { user as userTable, workspaceMembers, workspaces } from '@antasphere/chassis-db';
3
+ /**
4
+ * The ONE membership-selection rule of the user-scoped credential model
5
+ * (ADR 014 as amended): every credential — session, API key, OAuth bearer —
6
+ * identifies a USER, and each request resolves exactly ONE target workspace
7
+ * for that user:
8
+ *
9
+ * - `requested` non-null (the X-Workspace-Id header, or an API key's pin):
10
+ * an ACTIVE membership of that workspace is required, else null — fail
11
+ * closed, so an unknown workspace and a workspace the user does not
12
+ * belong to are indistinguishable (no oracle). The selector is the
13
+ * workspace's LOCAL id, or (PRDCT-2947) the id of the hub organization
14
+ * it projects (`workspaces.central_account_id`): a person names the
15
+ * organization the hub's way (`--org <hub org id>`) and the tool maps
16
+ * it here, in the one rule, so no credential path can fork on it. On
17
+ * self-hosted the column is always empty and the second arm is inert.
18
+ * - `requested` null: the user's DEFAULT membership (`is_default`, at most
19
+ * one per user), else the deterministic fallback — the OLDEST active
20
+ * membership (created_at, then id). While no row carries `is_default`
21
+ * (nothing sets it on oss; the cloud reconcile materializes the hub-level
22
+ * default), the ordering is inert and selection is byte-identical to the
23
+ * pre-default behavior.
24
+ *
25
+ * All three resolvers share THIS query so the selection rule can never fork
26
+ * per credential path.
27
+ */
28
+ /** Strict UUID shape — a malformed selector must never reach Postgres' uuid cast. */
29
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
30
+ /**
31
+ * Well-formed-selector check, shared with the cloud miss-retry hook: only a
32
+ * plausibly-real workspace id ever triggers a hub reconcile — a garbage
33
+ * header can never buy a hub round-trip (the reconciler's TTL/throttle
34
+ * bounds even well-formed ones).
35
+ */
36
+ export function isWorkspaceSelector(value) {
37
+ return UUID_RE.test(value);
38
+ }
39
+ export async function resolveMembership(db, userId, requested) {
40
+ if (requested !== null && !UUID_RE.test(requested))
41
+ return null; // fail closed, no uuid-cast 500
42
+ const [row] = await db
43
+ .select({
44
+ workspaceId: workspaceMembers.workspaceId,
45
+ role: workspaceMembers.role,
46
+ origin: workspaceMembers.origin,
47
+ accountRef: workspaces.centralAccountId,
48
+ email: userTable.email,
49
+ name: userTable.name
50
+ })
51
+ .from(workspaceMembers)
52
+ .innerJoin(workspaces, eq(workspaceMembers.workspaceId, workspaces.id))
53
+ .innerJoin(userTable, eq(workspaceMembers.userId, userTable.id))
54
+ .where(and(eq(workspaceMembers.userId, userId), eq(workspaceMembers.isActive, true), ...(requested
55
+ ? [
56
+ or(eq(workspaceMembers.workspaceId, requested),
57
+ // Case-blind like the uuid arm and the pin check (verifier
58
+ // round 1, F6): the column is text, the selector a uuid.
59
+ sql `lower(${workspaces.centralAccountId}) = lower(${requested})`)
60
+ ]
61
+ : [])))
62
+ // Selector-less default: the default membership first, then the
63
+ // deterministic oldest. With a selector the filter pins a single row and
64
+ // the order is inert.
65
+ .orderBy(desc(workspaceMembers.isDefault), asc(workspaceMembers.createdAt), asc(workspaceMembers.id))
66
+ .limit(1);
67
+ return row ?? null;
68
+ }
69
+ //# sourceMappingURL=resolve-membership.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-membership.js","sourceRoot":"","sources":["../../src/identity/resolve-membership.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,gBAAgB,EAAE,UAAU,EAAW,MAAM,wBAAwB,CAAC;AAElG;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,qFAAqF;AACrF,MAAM,OAAO,GAAG,iEAAiE,CAAC;AAElF;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAsBD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,EAAM,EACN,MAAc,EACd,SAAwB;IAExB,IAAI,SAAS,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,gCAAgC;IAEjG,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE;SACnB,MAAM,CAAC;QACN,WAAW,EAAE,gBAAgB,CAAC,WAAW;QACzC,IAAI,EAAE,gBAAgB,CAAC,IAAI;QAC3B,MAAM,EAAE,gBAAgB,CAAC,MAAM;QAC/B,UAAU,EAAE,UAAU,CAAC,gBAAgB;QACvC,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,IAAI,EAAE,SAAS,CAAC,IAAI;KACrB,CAAC;SACD,IAAI,CAAC,gBAAgB,CAAC;SACtB,SAAS,CAAC,UAAU,EAAE,EAAE,CAAC,gBAAgB,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;SACtE,SAAS,CAAC,SAAS,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;SAC/D,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,EACnC,GAAG,CAAC,SAAS;QACX,CAAC,CAAC;YACE,EAAE,CACA,EAAE,CAAC,gBAAgB,CAAC,WAAW,EAAE,SAAS,CAAC;YAC3C,2DAA2D;YAC3D,yDAAyD;YACzD,GAAG,CAAA,SAAS,UAAU,CAAC,gBAAgB,aAAa,SAAS,GAAG,CACjE;SACF;QACH,CAAC,CAAC,EAAE,CAAC,CACR,CACF;QACD,gEAAgE;QAChE,yEAAyE;QACzE,sBAAsB;SACrB,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;SACpG,KAAK,CAAC,CAAC,CAAC,CAAC;IACZ,OAAO,GAAG,IAAI,IAAI,CAAC;AACrB,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { type Db } from '@antasphere/chassis-db';
2
+ export type SigningKeyPreflight = {
3
+ ok: true;
4
+ kid: string | null;
5
+ } | {
6
+ ok: false;
7
+ kid: string;
8
+ reason: string;
9
+ };
10
+ /**
11
+ * The operator-facing diagnostic — names the cause and BOTH safe remedies.
12
+ * Kept in one place so boot's fatal log and the tests pin the same message.
13
+ */
14
+ export declare function signingKeyPreflightMessage(kid: string): string;
15
+ /**
16
+ * Boot preflight: attempt one decrypt of the key the jwt plugin would sign
17
+ * with. Exactly the plugin's selection rule (sign.mjs): newest by createdAt;
18
+ * a missing table-or-row and an EXPIRED newest row are both fine — the next
19
+ * mint creates a fresh key under the current secret.
20
+ */
21
+ export declare function preflightSigningKey(db: Db, authSecret: string): Promise<SigningKeyPreflight>;
22
+ /**
23
+ * Mint a new signing key under the given secret — the manual rotation step
24
+ * (a compromise drill, or re-keying after an AUTH_SECRET change). Mirrors
25
+ * the plugin's createJwk (utils.mjs): extractable RS256 pair, JWK-exported,
26
+ * private half encrypted exactly as the plugin decrypts it. The new row's
27
+ * createdAt makes it the active signer; every older row stays published on
28
+ * /jwks (the overlap) until explicitly retired.
29
+ */
30
+ export declare function rotateSigningKey(db: Db, authSecret: string): Promise<{
31
+ kid: string;
32
+ }>;
33
+ /**
34
+ * Delete ONE retired key by kid, after the overlap window. Refuses the
35
+ * newest row: deleting the active signer would silently re-key the instance
36
+ * on the next mint with zero coordination — the exact failure the preflight
37
+ * exists to prevent.
38
+ */
39
+ export declare function retireSigningKey(db: Db, kid: string): Promise<void>;
40
+ /**
41
+ * `node dist/index.js rotate-signing-key [--retire <kid>]` — the operator
42
+ * entry point (index.ts). Runs against the container's own env (DATABASE_URL
43
+ * + AUTH_SECRET/DATA_DIR), so `docker compose run --rm app …` works while
44
+ * the server is down — the state the preflight refusal leaves you in.
45
+ * Output goes to stdout on purpose: this is an interactive operator command,
46
+ * not the service log.
47
+ */
48
+ export declare function runSigningKeyCli(db: Db, authSecret: string, args: readonly string[], out: (line: string) => void): Promise<number>;
49
+ //# sourceMappingURL=signing-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signing-key.d.ts","sourceRoot":"","sources":["../../src/identity/signing-key.ts"],"names":[],"mappings":"AAGA,OAAO,EAAQ,KAAK,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAgCvD,MAAM,MAAM,mBAAmB,GAC7B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhF;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAW9D;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAgBlG;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAe3F;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWzE;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,EAAE,EACN,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC1B,OAAO,CAAC,MAAM,CAAC,CA2BjB"}
@@ -0,0 +1,144 @@
1
+ import { desc, eq } from 'drizzle-orm';
2
+ import { exportJWK, generateKeyPair } from 'jose';
3
+ import { generateRandomString, symmetricDecrypt, symmetricEncrypt } from 'better-auth/crypto';
4
+ import { jwks } from '@antasphere/chassis-db';
5
+ /**
6
+ * OAuth signing-key durability across AUTH_SECRET rotation (ADR 023).
7
+ *
8
+ * The jwt plugin stores its RS256 private key in the `jwks` table encrypted
9
+ * under the auth secret (bare xchacha20 ciphertext — createAuth passes a
10
+ * plain string `secret`, so no versioned envelope). Signing decrypts the
11
+ * NEWEST row on every mint; with no `rotationInterval` the row never
12
+ * expires, so a rotated AUTH_SECRET turns every token mint into a 500 —
13
+ * forever. The three exports here close that:
14
+ *
15
+ * - `preflightSigningKey` mirrors the plugin's signing path (newest
16
+ * non-expired row → decrypt) at boot and reports failure BEFORE the
17
+ * instance serves an authorize endpoint it cannot follow with a token.
18
+ * - `rotateSigningKey` mints a fresh RS256 key under the CURRENT secret —
19
+ * the same row shape the plugin's own createJwk writes, so the plugin
20
+ * signs with it immediately (newest createdAt wins). Retired rows stay in
21
+ * the table, and /jwks publishes every row without an expiresAt, so
22
+ * already-issued tokens keep verifying for as long as the old row stays —
23
+ * the publish-overlap window.
24
+ * - `retireSigningKey` deletes ONE named retired row after the overlap
25
+ * window; the newest (active signer) is refused.
26
+ *
27
+ * Everything here mirrors the pinned better-auth 1.6.15 jwt plugin
28
+ * (plugins/jwt/{sign,utils,adapter}.mjs) — re-verify the row shape, the
29
+ * newest-key selection, and the /jwks publish filter on ANY bump.
30
+ */
31
+ /** The alg the chassis pins in `jwks.keyPairConfig` (identity/better-auth.ts). */
32
+ const SIGNING_ALG = 'RS256';
33
+ /**
34
+ * The operator-facing diagnostic — names the cause and BOTH safe remedies.
35
+ * Kept in one place so boot's fatal log and the tests pin the same message.
36
+ */
37
+ export function signingKeyPreflightMessage(kid) {
38
+ return (`OAuth signing-key preflight failed: the stored JWKS private key (kid ${kid}) ` +
39
+ 'cannot be decrypted with the current AUTH_SECRET. This happens when AUTH_SECRET ' +
40
+ 'was rotated without re-keying token signing; booting anyway would serve an ' +
41
+ 'authorize endpoint whose every token mint (POST /oauth2/token) answers 500. ' +
42
+ 'Remedies: restore the previous AUTH_SECRET, or mint a fresh signing key under ' +
43
+ 'the current secret with `node dist/index.js rotate-signing-key` — the retired ' +
44
+ 'key stays published on /jwks so already-issued tokens keep verifying ' +
45
+ '(internal/security-runbooks.md).');
46
+ }
47
+ /**
48
+ * Boot preflight: attempt one decrypt of the key the jwt plugin would sign
49
+ * with. Exactly the plugin's selection rule (sign.mjs): newest by createdAt;
50
+ * a missing table-or-row and an EXPIRED newest row are both fine — the next
51
+ * mint creates a fresh key under the current secret.
52
+ */
53
+ export async function preflightSigningKey(db, authSecret) {
54
+ const [latest] = await db
55
+ .select({ id: jwks.id, privateKey: jwks.privateKey, expiresAt: jwks.expiresAt })
56
+ .from(jwks)
57
+ .orderBy(desc(jwks.createdAt))
58
+ .limit(1);
59
+ if (!latest)
60
+ return { ok: true, kid: null };
61
+ if (latest.expiresAt && latest.expiresAt < new Date())
62
+ return { ok: true, kid: null };
63
+ try {
64
+ // The plugin stores JSON.stringify(symmetricEncrypt(...)) — decrypt takes
65
+ // the JSON.parse'd string (sign.mjs).
66
+ await symmetricDecrypt({ key: authSecret, data: JSON.parse(latest.privateKey) });
67
+ return { ok: true, kid: latest.id };
68
+ }
69
+ catch {
70
+ return { ok: false, kid: latest.id, reason: signingKeyPreflightMessage(latest.id) };
71
+ }
72
+ }
73
+ /**
74
+ * Mint a new signing key under the given secret — the manual rotation step
75
+ * (a compromise drill, or re-keying after an AUTH_SECRET change). Mirrors
76
+ * the plugin's createJwk (utils.mjs): extractable RS256 pair, JWK-exported,
77
+ * private half encrypted exactly as the plugin decrypts it. The new row's
78
+ * createdAt makes it the active signer; every older row stays published on
79
+ * /jwks (the overlap) until explicitly retired.
80
+ */
81
+ export async function rotateSigningKey(db, authSecret) {
82
+ const { publicKey, privateKey } = await generateKeyPair(SIGNING_ALG, { extractable: true });
83
+ const publicWebKey = await exportJWK(publicKey);
84
+ const privateWebKey = await exportJWK(privateKey);
85
+ const kid = generateRandomString(32, 'a-z', 'A-Z', '0-9');
86
+ await db.insert(jwks).values({
87
+ id: kid,
88
+ publicKey: JSON.stringify(publicWebKey),
89
+ privateKey: JSON.stringify(await symmetricEncrypt({ key: authSecret, data: JSON.stringify(privateWebKey) })),
90
+ createdAt: new Date(),
91
+ expiresAt: null
92
+ });
93
+ return { kid };
94
+ }
95
+ /**
96
+ * Delete ONE retired key by kid, after the overlap window. Refuses the
97
+ * newest row: deleting the active signer would silently re-key the instance
98
+ * on the next mint with zero coordination — the exact failure the preflight
99
+ * exists to prevent.
100
+ */
101
+ export async function retireSigningKey(db, kid) {
102
+ const [latest] = await db.select({ id: jwks.id }).from(jwks).orderBy(desc(jwks.createdAt)).limit(1);
103
+ if (!latest)
104
+ throw new Error('no signing keys exist');
105
+ if (latest.id === kid) {
106
+ throw new Error(`refusing to retire ${kid}: it is the ACTIVE signing key (newest row). ` +
107
+ 'Mint a replacement first with rotate-signing-key, wait out the overlap window, then retire.');
108
+ }
109
+ const deleted = await db.delete(jwks).where(eq(jwks.id, kid)).returning({ id: jwks.id });
110
+ if (deleted.length === 0)
111
+ throw new Error(`no signing key with kid ${kid}`);
112
+ }
113
+ /**
114
+ * `node dist/index.js rotate-signing-key [--retire <kid>]` — the operator
115
+ * entry point (index.ts). Runs against the container's own env (DATABASE_URL
116
+ * + AUTH_SECRET/DATA_DIR), so `docker compose run --rm app …` works while
117
+ * the server is down — the state the preflight refusal leaves you in.
118
+ * Output goes to stdout on purpose: this is an interactive operator command,
119
+ * not the service log.
120
+ */
121
+ export async function runSigningKeyCli(db, authSecret, args, out) {
122
+ const retireAt = args.indexOf('--retire');
123
+ if (retireAt !== -1) {
124
+ const kid = args[retireAt + 1];
125
+ if (!kid) {
126
+ out('usage: rotate-signing-key --retire <kid>');
127
+ return 1;
128
+ }
129
+ await retireSigningKey(db, kid);
130
+ out(`retired signing key ${kid} — it is no longer published on /jwks; tokens it signed no longer verify`);
131
+ return 0;
132
+ }
133
+ const before = await db.select({ id: jwks.id }).from(jwks).orderBy(desc(jwks.createdAt));
134
+ const { kid } = await rotateSigningKey(db, authSecret);
135
+ out(`minted new signing key ${kid} under the current AUTH_SECRET — it signs from the next mint on`);
136
+ if (before.length > 0) {
137
+ out(`retired key(s) still published for the overlap window (already-issued tokens keep verifying): ` +
138
+ before.map((k) => k.id).join(', '));
139
+ out('after the overlap window (outstanding access tokens live 15 min; allow for external JWKS caches), ' +
140
+ 'retire each with: rotate-signing-key --retire <kid>');
141
+ }
142
+ return 0;
143
+ }
144
+ //# sourceMappingURL=signing-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signing-key.js","sourceRoot":"","sources":["../../src/identity/signing-key.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { z } from 'zod';
2
+ import type { BootOverrides, BootResult, ToolDefinition } from './tool-definition.js';
3
+ export { type AppDeps, createApp, postgresErrorCode } from './app.js';
4
+ export type { ExportEntriesFn, ExportEntry } from './api/export.js';
5
+ export { EMPTY_TOOL_ENTITLEMENTS, HUB_USAGE_SCOPE, HubCreditCheck, HubMachineToken, HubUsagePoster, EntitlementProfiles, assertToolEntitlements, type ToolEntitlementDeclaration } from './entitlements/index.js';
6
+ export type { ApiContext, ApiRateLimitContext, ApiRoutesContext, BodyCap, BodyLimitVerdict, BootOverrides, BootResult, FilePolicy, JobsContext, PlatformCore, ServiceCore, ToolApiSlots, ToolAppSlots, ToolBuckets, ToolCopy, ToolDefinition, ToolRateLimiters } from './tool-definition.js';
7
+ /** A platform: one tool definition bound to the chassis' locked composition. */
8
+ export interface Platform<TEnvShape extends z.ZodRawShape, TDomain, TEvents, TToolOverrides> {
9
+ /**
10
+ * The boot sequence, in its locked order: env → logger → db probe → secret →
11
+ * migrations under advisory lock → app assembly → ready.
12
+ */
13
+ boot: (source?: NodeJS.ProcessEnv, overrides?: BootOverrides<TToolOverrides>) => Promise<BootResult<TEnvShape, TDomain, TEvents>>;
14
+ }
15
+ /**
16
+ * THE composition entry. A tool fills the named slots of `ToolDefinition`;
17
+ * the chassis owns every ordering (boot.ts, api/create-api.ts, app.ts).
18
+ */
19
+ export declare function createPlatform<TEnvShape extends z.ZodRawShape, TDomain, TBuckets extends string = never, TEvents = {}, TToolOverrides = never>(tool: ToolDefinition<TEnvShape, TDomain, TBuckets, TEvents, TToolOverrides>): Platform<TEnvShape, TDomain, TEvents, TToolOverrides>;
20
+ export type { MembershipRemovalHook, RemovedMembership, RemovalCounts } from './members/removal.js';
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtF,OAAO,EAAE,KAAK,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACtE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EACL,uBAAuB,EACvB,eAAe,EACf,cAAc,EACd,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,sBAAsB,EACtB,KAAK,0BAA0B,EAChC,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,OAAO,EACP,gBAAgB,EAChB,aAAa,EACb,UAAU,EACV,UAAU,EACV,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,cAAc,EACd,gBAAgB,EACjB,MAAM,sBAAsB,CAAC;AAE9B,gFAAgF;AAChF,MAAM,WAAW,QAAQ,CAAC,SAAS,SAAS,CAAC,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc;IACzF;;;OAGG;IACH,IAAI,EAAE,CACJ,MAAM,CAAC,EAAE,MAAM,CAAC,UAAU,EAC1B,SAAS,CAAC,EAAE,aAAa,CAAC,cAAc,CAAC,KACtC,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;CACvD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,SAAS,SAAS,CAAC,CAAC,WAAW,EAC/B,OAAO,EACP,QAAQ,SAAS,MAAM,GAAG,KAAK,EAE/B,OAAO,GAAG,EAAE,EACZ,cAAc,GAAG,KAAK,EAEtB,IAAI,EAAE,cAAc,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,CAAC,GAC1E,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC,CAEvD;AACD,YAAY,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ import { bootPlatform } from './boot.js';
2
+ export { createApp, postgresErrorCode } from './app.js';
3
+ export { EMPTY_TOOL_ENTITLEMENTS, HUB_USAGE_SCOPE, HubCreditCheck, HubMachineToken, HubUsagePoster, EntitlementProfiles, assertToolEntitlements } from './entitlements/index.js';
4
+ /**
5
+ * THE composition entry. A tool fills the named slots of `ToolDefinition`;
6
+ * the chassis owns every ordering (boot.ts, api/create-api.ts, app.ts).
7
+ */
8
+ export function createPlatform(tool) {
9
+ return { boot: (source, overrides) => bootPlatform(tool, source, overrides) };
10
+ }
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,EAAgB,SAAS,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAEtE,OAAO,EACL,uBAAuB,EACvB,eAAe,EACf,cAAc,EACd,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,sBAAsB,EAEvB,MAAM,yBAAyB,CAAC;AAiCjC;;;GAGG;AACH,MAAM,UAAU,cAAc,CAQ5B,IAA2E;IAE3E,OAAO,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;AAChF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { InvitationError, InvitationService } from './service.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/invitations/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { InvitationError, InvitationService } from './service.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/invitations/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { type Db, type Invitation } from '@antasphere/chassis-db';
2
+ /** A live invitation plus which of its two tokens the caller presented. */
3
+ export interface InvitationMatch {
4
+ invitation: Invitation;
5
+ /** True when the presented token is the one that ONLY the email carried. */
6
+ viaEmailToken: boolean;
7
+ }
8
+ export declare class InvitationService {
9
+ private readonly db;
10
+ constructor(db: Db);
11
+ create(opts: {
12
+ workspaceId: string;
13
+ email: string;
14
+ role: 'owner' | 'admin' | 'member';
15
+ invitedBy: string;
16
+ }): Promise<{
17
+ invitation: Invitation;
18
+ token: string;
19
+ emailToken: string;
20
+ }>;
21
+ /**
22
+ * Find a live (unaccepted, unrevoked, unexpired) invitation by raw token —
23
+ * either the copyable-link token or the emailed one — and report which.
24
+ */
25
+ findLiveByToken(token: string): Promise<InvitationMatch | null>;
26
+ /**
27
+ * Join: create the membership and stamp acceptance atomically enough that
28
+ * a token cannot be redeemed twice (the accepted_at guard is the gate).
29
+ */
30
+ accept(invitation: Invitation, userId: string): Promise<boolean>;
31
+ }
32
+ export declare class InvitationError extends Error {
33
+ readonly code: 'already_member' | 'already_invited';
34
+ constructor(code: 'already_member' | 'already_invited', message: string);
35
+ }
36
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/invitations/service.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,EAAE,EACP,KAAK,UAAU,EAChB,MAAM,wBAAwB,CAAC;AAoBhC,2EAA2E;AAC3E,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,UAAU,CAAC;IACvB,4EAA4E;IAC5E,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,EAAE;IAE7B,MAAM,CAAC,IAAI,EAAE;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;QACnC,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,UAAU,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAoD1E;;;OAGG;IACG,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAkBrE;;;OAGG;IACG,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAwCvE;AAED,qBAAa,eAAgB,SAAQ,KAAK;aAEtB,IAAI,EAAE,gBAAgB,GAAG,iBAAiB;gBAA1C,IAAI,EAAE,gBAAgB,GAAG,iBAAiB,EAC1D,OAAO,EAAE,MAAM;CAIlB"}