@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,254 @@
1
+ import { PostgreSqlContainer, type StartedPostgreSqlContainer } from '@testcontainers/postgresql';
2
+ import { mkdtemp } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import pg from 'pg';
6
+ import type { Hono } from 'hono';
7
+ import type { ToolIdentity } from '@antasphere/chassis-contract';
8
+ import type { EmailDriver, EmailMessage } from '../email/driver.js';
9
+
10
+ /**
11
+ * Delivering driver that records instead of sending. Exists because
12
+ * change-email tokens are stateless JWTs (never stored in the verification
13
+ * table) — the only way a test can obtain the link is to capture the
14
+ * outbound mail. Passed via the `email` boot override.
15
+ */
16
+ export class RecordingEmailDriver implements EmailDriver {
17
+ readonly name = 'smtp' as const; // narrowest honest label the union allows
18
+ readonly delivers = true;
19
+ readonly sent: EmailMessage[] = [];
20
+ async send(message: EmailMessage): Promise<void> {
21
+ this.sent.push(message);
22
+ }
23
+ }
24
+
25
+ /**
26
+ * The first-boot claim credential every test app boots with (PRDCT-1347:
27
+ * POST /setup ALWAYS requires a token now). Suites that exercise the
28
+ * generated-token path override it with an empty SETUP_TOKEN.
29
+ */
30
+ export const SETUP_TOKEN = 'integration-test-setup-token';
31
+
32
+ /** Matches the compose stack: Postgres 17 with pgvector available. */
33
+ export const PG_IMAGE = 'pgvector/pgvector:pg17';
34
+
35
+ export async function startPostgres(): Promise<StartedPostgreSqlContainer> {
36
+ return new PostgreSqlContainer(PG_IMAGE).start();
37
+ }
38
+
39
+ /**
40
+ * What the harness needs of a boot result: the three handles every suite
41
+ * drives (`app`, `db.pool`, `jobs`). Any `BootResult` of `createPlatform`
42
+ * satisfies it, whatever the tool.
43
+ */
44
+ export interface BootResultLike {
45
+ app: Hono;
46
+ db: { pool: pg.Pool };
47
+ jobs: { stop: () => Promise<void> };
48
+ }
49
+
50
+ /** A tool's boot function, as `createPlatform(tool).boot` hands it out. */
51
+ export type BootFn<TResult extends BootResultLike, TOverrides> = (
52
+ source?: NodeJS.ProcessEnv,
53
+ overrides?: TOverrides
54
+ ) => Promise<TResult>;
55
+
56
+ export type TestApp<TResult extends BootResultLike = BootResultLike> = TResult & {
57
+ stop: () => Promise<void>;
58
+ };
59
+
60
+ /**
61
+ * The scope names and the probe routes of the tool a suite runs against. The
62
+ * chassis suite (`test/integration`) never spells a tool's vocabulary: where
63
+ * it needs "some valid scope" or "some authenticated tool route", it takes
64
+ * them from here.
65
+ */
66
+ export interface ChassisTestHost<TResult extends BootResultLike, TOverrides> {
67
+ boot: BootFn<TResult, TOverrides>;
68
+ /**
69
+ * The host tool's migration history, the folder its boot applies: the suite's
70
+ * migration checks run it a second time by hand. The chassis's own host gives
71
+ * `test/host/drizzle` (the chassis tables alone); a tool gives its `packages/db/drizzle`.
72
+ */
73
+ migrationsDir: string;
74
+ /**
75
+ * The host tool's disaster-recovery shell library (`scripts/lib/dr-lib.sh` in a
76
+ * tool): the suite's dump check sources it and runs its verifier on a real pg_dump.
77
+ */
78
+ drLib: string;
79
+ /** The host tool's identity: where the suite reads the key prefix a minted key must carry. */
80
+ identity: ToolIdentity;
81
+ /** The host tool's OAuth client id at the hub: the cloud boots' `HUB_CLIENT_ID`, and the fake hub's. */
82
+ hubClientId: string;
83
+ scopes: {
84
+ /** The scope behind the chassis read surfaces (`/me`, the files reads). */
85
+ read: string;
86
+ /** The scope behind the chassis mutations. */
87
+ write: string;
88
+ /** The dedicated opt-in scope of the workspace export. */
89
+ dataExport: string;
90
+ };
91
+ /**
92
+ * An authenticated, workspace-scoped GET route of the TOOL (under the read
93
+ * scope) that answers 200 to any principal the gates let through.
94
+ */
95
+ probeRoute: string;
96
+ }
97
+
98
+ /** Postgres `admin_shutdown`: what a backend answers a still-connected client when the server stops. */
99
+ const ADMIN_SHUTDOWN = '57P01';
100
+
101
+ /** How long `endPool` waits for the sockets, so that a teardown can never hang on one. */
102
+ const POOL_CLOSE_TIMEOUT_MS = 10_000;
103
+
104
+ /**
105
+ * End a pool and wait until every one of its clients has REALLY closed
106
+ * (PRDCT-2547). `pool.end()` alone does not say that: pg-pool takes each
107
+ * client off its list and only then calls `client.end()`, so its promise
108
+ * resolves while the sockets are still open. A suite that stops its container
109
+ * right after (`await app.stop(); await container.stop()`) then races the
110
+ * server's shutdown: the backend answers the still-connected client with
111
+ * `57P01`, the client hands it to the pool, the pool has no `error` listener,
112
+ * and Node reports an unhandled error: the run fails with every test passed.
113
+ *
114
+ * The pool emits `remove` from the callback of `client.end()`, which pg calls
115
+ * on the connection's `end`, the socket's close. So: count the clients, end
116
+ * the pool, wait for as many `remove`. The `error` listener is the net under
117
+ * it (a wait that timed out): it takes `57P01` on this ENDING pool and nothing
118
+ * else, any other error is thrown as it was before.
119
+ *
120
+ * A ceiling that expires SAYS so, in one `console.warn` line with the number
121
+ * of clients still open: it does not throw (the listener stays the net), but
122
+ * a chronically slow teardown is then visible instead of leaning on the
123
+ * listener in silence. `ceilingMs` exists for the helper's own unit test.
124
+ */
125
+ export async function endPool(pool: pg.Pool, ceilingMs: number = POOL_CLOSE_TIMEOUT_MS): Promise<void> {
126
+ pool.on('error', (err: Error & { code?: string }) => {
127
+ if (err.code !== ADMIN_SHUTDOWN) throw err;
128
+ });
129
+ let open = pool.totalCount;
130
+ let timer: NodeJS.Timeout | undefined;
131
+ const closed = new Promise<void>((resolve) => {
132
+ if (open === 0) return resolve();
133
+ pool.on('remove', () => {
134
+ if (--open === 0) resolve();
135
+ });
136
+ timer = setTimeout(() => {
137
+ console.warn(
138
+ `endPool: ${open} pool client(s) still open after the ${ceilingMs} ms ceiling; the teardown goes on`
139
+ );
140
+ resolve();
141
+ }, ceilingMs);
142
+ timer.unref();
143
+ });
144
+ await pool.end();
145
+ await closed;
146
+ clearTimeout(timer);
147
+ }
148
+
149
+ /**
150
+ * Binds `createTestApp` to a boot function: boots the real app (real
151
+ * migrations, real Better Auth) against a database.
152
+ */
153
+ export function makeCreateTestApp<TResult extends BootResultLike, TOverrides>(
154
+ boot: BootFn<TResult, TOverrides>
155
+ ): (
156
+ connectionString: string,
157
+ extraEnv?: Record<string, string>,
158
+ overrides?: TOverrides
159
+ ) => Promise<TestApp<TResult>> {
160
+ return async (connectionString, extraEnv = {}, overrides) => {
161
+ const dataDir = await mkdtemp(join(tmpdir(), 'chassis-test-'));
162
+ const result = await boot(
163
+ {
164
+ DATABASE_URL: connectionString,
165
+ DATA_DIR: dataDir,
166
+ AUTH_SECRET: 'integration-test-secret-0123456789abcdef0123456789abcdef',
167
+ SETUP_TOKEN,
168
+ NODE_ENV: 'test',
169
+ LOG_LEVEL: 'error',
170
+ PUBLIC_BASE_URL: 'http://localhost:3000',
171
+ // app.request() has no socket; trusting XFF lets tests exercise the
172
+ // per-IP bucket behavior deliberately.
173
+ TRUST_PROXY: 'true',
174
+ // Generous general-API quota so unrelated suites never trip it while
175
+ // still exercising the consume path; the api-quota suite overrides
176
+ // these with tight values via extraEnv.
177
+ API_RATE_LIMIT_PER_MINUTE: '100000',
178
+ API_RATE_LIMIT_BURST: '10000',
179
+ ...extraEnv
180
+ },
181
+ overrides
182
+ );
183
+ return {
184
+ ...result,
185
+ stop: async () => {
186
+ await result.jobs.stop().catch(() => {});
187
+ await endPool(result.db.pool);
188
+ }
189
+ };
190
+ };
191
+ }
192
+
193
+ /**
194
+ * Assert a boot REFUSES with a message matching `re`. Never `expect(boot)
195
+ * .rejects.toThrow(...)` directly: when the refusal is missing the promise
196
+ * resolves with a live BootResult, vitest tries to serialise it for the
197
+ * failure message (OOM, worker crash), and the app is never stopped.
198
+ */
199
+ export async function expectBootRefusal(boot: Promise<TestApp>, re: RegExp): Promise<void> {
200
+ let app: TestApp | undefined;
201
+ try {
202
+ app = await boot;
203
+ } catch (err) {
204
+ const message = err instanceof Error ? err.message : String(err);
205
+ if (!re.test(message)) throw new Error(`boot refused for the wrong reason: ${message}`);
206
+ return;
207
+ }
208
+ await app.stop();
209
+ throw new Error(`boot succeeded but a refusal matching ${re} was expected`);
210
+ }
211
+
212
+ /** Create an extra empty database inside the shared container. */
213
+ export async function createDatabase(container: StartedPostgreSqlContainer, name: string): Promise<string> {
214
+ const client = new pg.Client({ connectionString: container.getConnectionUri() });
215
+ await client.connect();
216
+ await client.query(`CREATE DATABASE ${name}`);
217
+ await client.end();
218
+ const base = new URL(container.getConnectionUri());
219
+ base.pathname = `/${name}`;
220
+ return base.toString();
221
+ }
222
+
223
+ /** Deliberate state isolation: wipe all rows, keep the schema. */
224
+ export async function truncateAll(connectionString: string): Promise<void> {
225
+ const client = new pg.Client({ connectionString });
226
+ await client.connect();
227
+ try {
228
+ const res = await client.query<{ tablename: string }>(
229
+ `SELECT tablename FROM pg_tables WHERE schemaname = 'public'`
230
+ );
231
+ const tables = res.rows.map((r) => `"${r.tablename}"`).join(', ');
232
+ if (tables.length > 0) {
233
+ await client.query(`TRUNCATE ${tables} RESTART IDENTITY CASCADE`);
234
+ }
235
+ } finally {
236
+ await client.end();
237
+ }
238
+ }
239
+
240
+ /** Read a JSON body without fighting Response's `unknown` under strict TS. */
241
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
242
+ export async function readJson(res: Response): Promise<any> {
243
+ return res.json();
244
+ }
245
+
246
+ export function extractCookie(res: Response): string {
247
+ const setCookie = res.headers.get('set-cookie');
248
+ if (!setCookie) throw new Error('no set-cookie header in response');
249
+ return setCookie
250
+ .split(',')
251
+ .map((part) => part.split(';')[0]?.trim())
252
+ .filter(Boolean)
253
+ .join('; ');
254
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * The test harness of a chassis-based tool: the container and database
3
+ * helpers, the recording mail driver, the fake hub and the SSO dances — ONE
4
+ * copy, parametrized by the boot function, shared by the chassis suite
5
+ * (`packages/chassis-server/test`) and by the tool's own tests. Never imported
6
+ * by production code.
7
+ */
8
+ export * from './helpers.js';
9
+ export * from './fake-hub.js';
10
+ export * from './sso-helpers.js';
11
+ export * from './setup-origins.js';
@@ -0,0 +1,58 @@
1
+ /**
2
+ * The single URL table for the setup-transport rule (PLT-10).
3
+ *
4
+ * The rule is implemented TWICE on purpose: in TypeScript, where the server
5
+ * enforces it (`apps/server/src/setup-transport.ts`), and in shell, where
6
+ * setup.sh has to warn the operator before they discover it as a 403
7
+ * (`dr_origin_is_secure` in scripts/lib/dr-lib.sh). Two implementations of a
8
+ * security rule drift — the first shell version accepted
9
+ * `http://localhost.evil.test` as loopback — so both are driven from this one
10
+ * table, by test/unit/setup-transport.test.ts here and the app's test/unit/dr-lib.test.ts.
11
+ *
12
+ * Add a case here and BOTH implementations have to satisfy it. The contract for
13
+ * anything NOT listed: the shell twin may be stricter than the server (it only
14
+ * decides whether to print a warning) but never looser, because looser means
15
+ * setup.sh reassures the operator about an origin the server is about to 403.
16
+ */
17
+
18
+ /** POST /api/v1/setup is accepted on these origins. */
19
+ export const SECURE_SETUP_ORIGINS = [
20
+ // https anywhere: the credentials are protected in transit.
21
+ 'https://platform.example.com',
22
+ 'https://10.0.0.4:8443',
23
+ 'https://platform.example.com/base',
24
+ // Plaintext on loopback: nothing leaves the host, which is what makes the
25
+ // `ssh -L` tunnel a legitimate way to finish setup on a TLS-less server.
26
+ 'http://localhost:3000',
27
+ 'http://LOCALHOST:3000',
28
+ 'http://localhost',
29
+ 'http://app.localhost:3000',
30
+ 'http://127.0.0.1:3000',
31
+ 'http://127.1.2.3:3000', // the whole 127.0.0.0/8 block is loopback
32
+ 'http://127.0.0.1',
33
+ // URL parsing normalises dotted-shorthand IPv4: `127.0.0` IS 127.0.0.0 and
34
+ // `127.1` IS 127.0.0.1. Both are loopback, and both really do connect there.
35
+ 'http://127.0.0:3000',
36
+ 'http://127.1:3000',
37
+ 'http://[::1]:3000',
38
+ 'http://[::1]'
39
+ ] as const;
40
+
41
+ /** POST /api/v1/setup is refused on these origins without the explicit opt-in. */
42
+ export const INSECURE_SETUP_ORIGINS = [
43
+ 'http://platform.example.com',
44
+ 'http://platform.example.com:8080',
45
+ 'http://203.0.113.10:3000',
46
+ 'http://10.0.0.4:3000',
47
+ 'http://192.168.1.20:3000',
48
+ // Hostnames somebody else controls that merely LOOK like loopback. A
49
+ // prefix/suffix match on the raw URL accepts every one of these.
50
+ 'http://localhost.evil.test:3000',
51
+ 'http://127.0.0.1.evil.test:3000',
52
+ 'http://notlocalhost:3000',
53
+ 'http://[::2]:3000',
54
+ 'http://[2001:db8::1]:3000',
55
+ // 127-ish but not in 127.0.0.0/8: a hostname, not an address.
56
+ 'http://1270.0.0.1:3000',
57
+ 'http://127a.0.0.1:3000'
58
+ ] as const;
@@ -0,0 +1,178 @@
1
+ import { expect } from 'vitest';
2
+ import { extractCookie, readJson, type TestApp } from './helpers.js';
3
+ import type { FakeHub, HubUserFixture } from './fake-hub.js';
4
+
5
+ /**
6
+ * The SSO dance against the FakeHub, shared by the P3 (hub-sso) and P4
7
+ * (hub-entitlements) suites: initiate the sign-in leg, drive the callback
8
+ * with a hub-minted one-shot code, and hand back the session cookie.
9
+ */
10
+
11
+ export const json = (body: unknown) => ({
12
+ method: 'POST',
13
+ headers: { 'content-type': 'application/json' },
14
+ body: JSON.stringify(body)
15
+ });
16
+
17
+ let ipCounter = 0;
18
+ /** Unique per-dance client IP — the login limiter (10/15min per IP) must never gate a suite. */
19
+ export const nextIp = () => `10.99.${Math.floor(ipCounter / 250)}.${(ipCounter++ % 250) + 1}`;
20
+
21
+ /**
22
+ * Seed a cloud-LOCAL workspace (`central_account_id NULL`) owned by the
23
+ * given user, straight into the database. Cloud setup mints NO workspace
24
+ * (user-scoped federation), so fixtures that need one — guest host
25
+ * workspaces, the P7 local-vs-projected contrast — seed it here; the state
26
+ * is exactly what a pre-flip instance (or break-glass recovery) leaves
27
+ * behind.
28
+ */
29
+ export async function seedLocalWorkspace(app: TestApp, name: string, ownerEmail: string): Promise<string> {
30
+ const user = await app.db.pool.query(`SELECT id FROM "user" WHERE email = $1`, [ownerEmail]);
31
+ expect(user.rows).toHaveLength(1);
32
+ const ws = await app.db.pool.query(`INSERT INTO workspaces (name) VALUES ($1) RETURNING id`, [name]);
33
+ const workspaceId = ws.rows[0].id as string;
34
+ await app.db.pool.query(
35
+ `INSERT INTO workspace_members (workspace_id, user_id, role, origin, is_active)
36
+ VALUES ($1, $2, 'owner', 'local', true)`,
37
+ [workspaceId, user.rows[0].id]
38
+ );
39
+ return workspaceId;
40
+ }
41
+
42
+ /**
43
+ * Initiate the sign-in leg: returns the `state` plus the signed state
44
+ * cookie the callback must present (better-auth's double-submit check —
45
+ * a browser carries it automatically).
46
+ */
47
+ export async function ssoInitiate(
48
+ app: TestApp
49
+ ): Promise<{ state: string; stateCookie: string; scope: string | null }> {
50
+ const init = json({ providerId: 'antasphere', callbackURL: '/' });
51
+ const signIn = await app.app.request('/api/v1/auth/sign-in/oauth2', {
52
+ ...init,
53
+ headers: { ...init.headers, 'x-forwarded-for': nextIp() }
54
+ });
55
+ expect(signIn.status).toBe(200);
56
+ const { url } = await readJson(signIn);
57
+ const state = new URL(url).searchParams.get('state')!;
58
+ expect(state).toBeTruthy();
59
+ // What the tool REALLY asked the hub for: the fake hub grants exactly this
60
+ // (FakeHub.mintCode), so a scope the tool stops requesting is a scope its
61
+ // grants stop carrying — in the suites as at the real hub.
62
+ return { state, stateCookie: extractCookie(signIn), scope: new URL(url).searchParams.get('scope') };
63
+ }
64
+
65
+ /** Initiate the SSO dance and drive the callback with a hub-minted code. */
66
+ export async function ssoDance(app: TestApp, hub: FakeHub, fixture: HubUserFixture): Promise<Response> {
67
+ const { state, stateCookie, scope } = await ssoInitiate(app);
68
+ const code = hub.mintCode(fixture, scope);
69
+ return app.app.request(
70
+ `/api/v1/auth/oauth2/callback/antasphere?code=${encodeURIComponent(code)}&state=${encodeURIComponent(state)}`,
71
+ { headers: { cookie: stateCookie } }
72
+ );
73
+ }
74
+
75
+ /** A successful dance: 302 to the callbackURL with a live session cookie. */
76
+ export async function ssoLogin(app: TestApp, hub: FakeHub, fixture: HubUserFixture): Promise<string> {
77
+ const res = await ssoDance(app, hub, fixture);
78
+ expect(res.status).toBe(302);
79
+ expect(res.headers.get('location')).toBe('/');
80
+ return extractCookie(res);
81
+ }
82
+
83
+ /** Assert a callback response is a session-less redirect carrying an error code. */
84
+ export async function expectFailedLogin(app: TestApp, res: Response, errorContains: string): Promise<void> {
85
+ expect(res.status).toBe(302);
86
+ expect(res.headers.get('location')).toContain(errorContains);
87
+ const setCookie = res.headers.get('set-cookie');
88
+ if (setCookie) {
89
+ // Whatever cookies the failure path left behind must not resolve a session.
90
+ const me = await app.app.request('/api/v1/me', { headers: { cookie: extractCookie(res) } });
91
+ expect(me.status).toBe(401);
92
+ }
93
+ }
94
+
95
+ /**
96
+ * The in-process OAuth 2.1 dance against the instance's OWN authorization
97
+ * server (register once per app + PKCE + consent) — mints a Bearer JWT for
98
+ * the session's user, so suites can exercise the third credential path.
99
+ *
100
+ * Bound to the scope string the dance requests: the scope NAMES are the
101
+ * tool's, so each host binds its own (`openid <the tool's read scope>`).
102
+ */
103
+ const oauthClientIds = new WeakMap<TestApp, string>();
104
+ export function makeOauthBearer(scope: string): (app: TestApp, cookie: string) => Promise<string> {
105
+ return (app, cookie) => oauthBearerFor(scope, app, cookie);
106
+ }
107
+
108
+ async function oauthBearerFor(scope: string, app: TestApp, cookie: string): Promise<string> {
109
+ const { createHash, randomBytes } = await import('node:crypto');
110
+ const redirectUri = 'http://127.0.0.1:19999/callback';
111
+ let clientId = oauthClientIds.get(app);
112
+ if (!clientId) {
113
+ const register = await app.app.request(
114
+ '/api/v1/auth/oauth2/register',
115
+ json({
116
+ client_name: 'sso-helper-client',
117
+ redirect_uris: [redirectUri],
118
+ token_endpoint_auth_method: 'none',
119
+ grant_types: ['authorization_code', 'refresh_token'],
120
+ response_types: ['code']
121
+ })
122
+ );
123
+ expect([200, 201]).toContain(register.status);
124
+ clientId = (await readJson(register)).client_id as string;
125
+ oauthClientIds.set(app, clientId);
126
+ }
127
+ const verifier = randomBytes(48).toString('base64url');
128
+ const challenge = createHash('sha256').update(verifier).digest().toString('base64url');
129
+ const params = new URLSearchParams({
130
+ response_type: 'code',
131
+ client_id: clientId,
132
+ redirect_uri: redirectUri,
133
+ scope,
134
+ state: 'helper-state',
135
+ code_challenge: challenge,
136
+ code_challenge_method: 'S256',
137
+ resource: 'http://localhost:3000/mcp'
138
+ });
139
+ const authorize = await app.app.request(`/api/v1/auth/oauth2/authorize?${params}`, {
140
+ headers: { cookie }
141
+ });
142
+ let location: string;
143
+ if (authorize.status === 302) {
144
+ location = authorize.headers.get('location') ?? '';
145
+ } else {
146
+ expect(authorize.status).toBe(200);
147
+ location = (await readJson(authorize)).url;
148
+ }
149
+ let codeUrl: URL;
150
+ if (location.includes('/oauth/consent?')) {
151
+ const consent = await app.app.request('/api/v1/auth/oauth2/consent', {
152
+ method: 'POST',
153
+ headers: { cookie, 'content-type': 'application/json' },
154
+ body: JSON.stringify({ accept: true, oauth_query: location.split('?')[1] ?? '' })
155
+ });
156
+ expect(consent.status).toBe(200);
157
+ const body = await readJson(consent);
158
+ codeUrl = new URL(body.redirect_uri ?? body.url ?? '');
159
+ } else {
160
+ codeUrl = new URL(location);
161
+ }
162
+ const code = codeUrl.searchParams.get('code');
163
+ expect(code).toBeTruthy();
164
+ const token = await app.app.request('/api/v1/auth/oauth2/token', {
165
+ method: 'POST',
166
+ headers: { 'content-type': 'application/x-www-form-urlencoded' },
167
+ body: new URLSearchParams({
168
+ grant_type: 'authorization_code',
169
+ code: code!,
170
+ redirect_uri: redirectUri,
171
+ client_id: clientId,
172
+ code_verifier: verifier,
173
+ resource: 'http://localhost:3000/mcp'
174
+ })
175
+ });
176
+ expect(token.status).toBe(200);
177
+ return (await readJson(token)).access_token as string;
178
+ }