@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,20 @@
1
+ {
2
+ "version": "7",
3
+ "dialect": "postgresql",
4
+ "entries": [
5
+ {
6
+ "idx": 0,
7
+ "version": "7",
8
+ "when": 1791388822563,
9
+ "tag": "0000_chassis_baseline",
10
+ "breakpoints": true
11
+ },
12
+ {
13
+ "idx": 1,
14
+ "version": "7",
15
+ "when": 1791388823563,
16
+ "tag": "0001_last_owner_guard",
17
+ "breakpoints": true
18
+ }
19
+ ]
20
+ }
@@ -0,0 +1,17 @@
1
+ import { defineConfig } from 'drizzle-kit';
2
+
3
+ /**
4
+ * The chassis's own migration history, for its own test host: the chassis
5
+ * tables alone, generated from the chassis schema into `test/host/drizzle`
6
+ * (`pnpm db:generate` in this package). A tool's history starts from these
7
+ * tables and adds its own; this one exists so the chassis suite boots without
8
+ * a tool beside it.
9
+ */
10
+ export default defineConfig({
11
+ dialect: 'postgresql',
12
+ // drizzle-kit resolves paths from the package root, where pnpm runs it.
13
+ schema: '../chassis-db/src/schema.ts',
14
+ out: './test/host/drizzle',
15
+ verbose: true,
16
+ strict: true
17
+ });
@@ -0,0 +1,41 @@
1
+ import type { ToolIdentity } from '@antasphere/chassis-contract';
2
+ import type { ChassisRoutesCopy } from '@antasphere/chassis-contract/routes';
3
+ import type { ToolCopy } from '@antasphere/chassis-server';
4
+
5
+ /**
6
+ * The identity of the test tools of this package (`minimal-tool.ts`, and the
7
+ * slot-less tool of `empty-tool.test.ts`): a tool called Things. Every value
8
+ * is its own, the key prefix included: the suite reads the prefix from its
9
+ * host (`host.identity.apiKeyPrefix`), so no file of this package spells a
10
+ * real tool's.
11
+ */
12
+ export const THINGS_IDENTITY = {
13
+ slug: 'things',
14
+ displayName: 'Things',
15
+ apiKeyPrefix: 'thg',
16
+ scopes: { read: 'things:read', write: 'things:write', dataExport: 'things:export' },
17
+ cliKeyScopesLabel: 'things:read+write',
18
+ cloud: { url: 'https://things.antasphere.test' },
19
+ cli: { bin: 'things', envPrefix: 'THINGS', legacyConfigDir: 'things' },
20
+ mcp: { serverName: 'things', toolPrefix: 'things_' },
21
+ otelServiceName: 'things',
22
+ imageName: 'example.test/things'
23
+ } as const satisfies ToolIdentity;
24
+
25
+ /** The same tool's wording of the chassis refusals that name a domain (the `copy` slot). */
26
+ export const THINGS_COPY: ToolCopy = {
27
+ guestForbidden: 'Guest access is limited to the things you were invited to',
28
+ guestTarget:
29
+ 'This member is an external guest of one thing: their account is not this workspace’s to recover',
30
+ fileInUse: 'This file is referenced by a thing',
31
+ mail: {
32
+ tagline: 'A place for things. A test tool.',
33
+ invitePitch: 'Join to see the things the team keeps there, and to add your own.',
34
+ invitePreheader: 'their things, and a place for yours.'
35
+ }
36
+ };
37
+
38
+ /** And its wording of the OpenAPI document (`defineChassisRoutes`' third argument). */
39
+ export const THINGS_ROUTES_COPY: ChassisRoutesCopy = {
40
+ fileInUseOpenApi: 'file_in_use: referenced by a thing'
41
+ };
@@ -0,0 +1,35 @@
1
+ import { dirname, join } from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { createPlatform } from '@antasphere/chassis-server';
4
+ import type { ChassisTestHost } from '@antasphere/chassis-server/testing';
5
+ import { THINGS_IDENTITY } from './identity.js';
6
+ import {
7
+ MIGRATIONS_FIXTURE,
8
+ minimalTool,
9
+ THINGS_ROUTE,
10
+ THINGS_SCOPES,
11
+ type MinimalBootOverrides,
12
+ type MinimalBootResult
13
+ } from './minimal-tool.js';
14
+
15
+ /**
16
+ * The chassis package's host of the suite (`test/integration`): the chassis
17
+ * composition bound to the minimal test tool. `@chassis-test/host` resolves
18
+ * here under this package's vitest config; the tool's app aliases the same
19
+ * specifier to its own host, over its real composition.
20
+ */
21
+ export type HostBootResult = MinimalBootResult;
22
+ export type HostBootOverrides = MinimalBootOverrides;
23
+
24
+ const here = dirname(fileURLToPath(import.meta.url));
25
+ const platform = createPlatform(minimalTool);
26
+
27
+ export const host: ChassisTestHost<HostBootResult, HostBootOverrides> = {
28
+ boot: (source, overrides) => platform.boot(source, overrides),
29
+ migrationsDir: MIGRATIONS_FIXTURE,
30
+ drLib: join(here, 'dr-lib.sh'),
31
+ identity: THINGS_IDENTITY,
32
+ hubClientId: 'tool-things-cloud',
33
+ scopes: THINGS_SCOPES,
34
+ probeRoute: THINGS_ROUTE
35
+ };
@@ -0,0 +1,123 @@
1
+ import { dirname, join } from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { createDb, schema } from '@antasphere/chassis-db';
4
+ import {
5
+ auditedSizeBytes,
6
+ declareRouteEntitlements,
7
+ declaredContentLength,
8
+ defineChassisContract
9
+ } from '@antasphere/chassis-contract';
10
+ import { defineChassisRoutes, fileUploadRoute } from '@antasphere/chassis-contract/routes';
11
+ import type { BootOverrides, BootResult, ToolDefinition } from '@antasphere/chassis-server';
12
+ import { createScopeAllowlist, requireAuth } from '@antasphere/chassis-server/middleware';
13
+ import { THINGS_COPY, THINGS_IDENTITY, THINGS_ROUTES_COPY } from './identity.js';
14
+
15
+ /**
16
+ * The MINIMAL test tool: the smallest tool that fills the required slots of
17
+ * `createPlatform` and gives the chassis suite something of a tool's to aim
18
+ * at. Its own three scope names, one tiny probe route per scope, the required
19
+ * blob policy, no domain, no env extension, no jobs, no buckets, no public
20
+ * app, no MCP tools.
21
+ *
22
+ * The migrations are a FIXTURE read by path, not an import (same stance as
23
+ * `empty-tool.test.ts`): the chassis's own history, `test/host/drizzle`,
24
+ * generated from the chassis schema by `pnpm db:generate` in this package
25
+ * (the chassis tables and nothing else). A tool's history starts from the
26
+ * same tables and adds its own; the tool's host of this suite boots on it.
27
+ */
28
+ const here = dirname(fileURLToPath(import.meta.url));
29
+ export const MIGRATIONS_FIXTURE = join(here, 'drizzle');
30
+
31
+ export const THINGS_SCOPES = THINGS_IDENTITY.scopes;
32
+ type ThingsScope = (typeof THINGS_SCOPES)[keyof typeof THINGS_SCOPES];
33
+
34
+ /** The probe routes, one per scope: authenticated, workspace-scoped, and empty. */
35
+ export const THINGS_ROUTE = '/api/v1/things';
36
+ const THINGS_EXPORT_ROUTE = '/api/v1/things/export';
37
+
38
+ const contract = defineChassisContract({
39
+ scopes: [THINGS_SCOPES.read, THINGS_SCOPES.write, THINGS_SCOPES.dataExport]
40
+ });
41
+
42
+ // eslint-disable-next-line @typescript-eslint/no-empty-object-type
43
+ type NoEnv = {};
44
+ type NoDomain = Record<string, never>;
45
+
46
+ export type MinimalBootOverrides = BootOverrides;
47
+ export type MinimalBootResult = BootResult<NoEnv, NoDomain>;
48
+
49
+ export const minimalTool: ToolDefinition<NoEnv, NoDomain> = {
50
+ identity: THINGS_IDENTITY,
51
+ runtime: {
52
+ version: '0.0.0-test',
53
+ findMigrationsDir: () => MIGRATIONS_FIXTURE,
54
+ publicDir: join(here, 'no-dashboard-build')
55
+ },
56
+ db: (url) => createDb(url, schema),
57
+ scopes: {
58
+ oauth: [
59
+ 'openid',
60
+ 'profile',
61
+ 'email',
62
+ 'offline_access',
63
+ THINGS_SCOPES.read,
64
+ THINGS_SCOPES.write,
65
+ THINGS_SCOPES.dataExport
66
+ ],
67
+ cliKey: [THINGS_SCOPES.read, THINGS_SCOPES.write],
68
+ requiredScopeFor: createScopeAllowlist<ThingsScope>({
69
+ ...THINGS_SCOPES,
70
+ rules: [
71
+ (path, _method, isRead) => {
72
+ if (path === THINGS_ROUTE) return isRead ? THINGS_SCOPES.read : THINGS_SCOPES.write;
73
+ if (path === THINGS_EXPORT_ROUTE && isRead) return THINGS_SCOPES.dataExport;
74
+ return null;
75
+ }
76
+ ]
77
+ }),
78
+ contractRoutes: defineChassisRoutes(contract, THINGS_IDENTITY, THINGS_ROUTES_COPY)
79
+ },
80
+ services: () => ({}),
81
+ api: {
82
+ // TEST FIXTURE ONLY: `undefined` is the whole-workspace view, for every member. The suite's
83
+ // files tests never assert member-to-member privacy (that proof is the tool's, SL-B1), so
84
+ // nothing here reads as a policy to copy: a real tool MUST return a per-principal scope.
85
+ filePolicy: () => ({ blobInUse: async () => false, blobReadScope: () => undefined }),
86
+ routes: (api) => {
87
+ api.use('/things', requireAuth());
88
+ api.use('/things/*', requireAuth());
89
+ api.get('/things', (c) => c.json({ things: [], nextCursor: null }, 200));
90
+ api.post('/things', (c) => c.json({ thing: { id: 'thing' } }, 201));
91
+ api.get('/things/export', (c) => c.json({ things: [] }, 200));
92
+ }
93
+ },
94
+ // The billing rail (slot 22): the generic files upload is the one metered
95
+ // route of the minimal tool — a price on the chassis' own route is the
96
+ // tool's declaration, never the chassis'. The limit's oss value is the
97
+ // operator's cap and so is the paid tier's (what discovery advertises is
98
+ // what the instance serves, PRDCT-2653); the free value is a fifth of it,
99
+ // so a suite can upload above the free value and below the cap as a pro
100
+ // account. Self-hosted instances read the oss value alone.
101
+ entitlements: (env) => {
102
+ const capBytes = env.MAX_FILE_SIZE_MB * 1024 * 1024;
103
+ return {
104
+ actions: [{ key: 'files.upload', creditsPerUnit: 5, unit: 'bytes', label: 'Upload a file' }],
105
+ limits: { 'files.maxBytes': { oss: capBytes, free: Math.floor(capBytes / 5), pro: capBytes } },
106
+ features: { 'things.premium': { free: false, pro: true } },
107
+ routes: declareRouteEntitlements([
108
+ {
109
+ route: fileUploadRoute,
110
+ meter: { key: 'files.upload', unit: 'bytes', quantity: auditedSizeBytes },
111
+ limit: { key: 'files.maxBytes', value: declaredContentLength }
112
+ }
113
+ ])
114
+ };
115
+ },
116
+ mcp: {
117
+ registerTools: () => {},
118
+ instructions: (info) => `MCP endpoint of the "${info.instanceName}" instance.`,
119
+ errorHints: {},
120
+ scopes: { read: THINGS_SCOPES.read, write: THINGS_SCOPES.write }
121
+ },
122
+ copy: THINGS_COPY
123
+ };
@@ -0,0 +1,284 @@
1
+ import { afterAll, beforeAll, describe, expect, it } from 'vitest';
2
+ import type { StartedPostgreSqlContainer } from '@testcontainers/postgresql';
3
+ import {
4
+ createDatabase,
5
+ createTestApp,
6
+ extractCookie,
7
+ readJson,
8
+ startPostgres,
9
+ type TestApp
10
+ } from './helpers.js';
11
+
12
+ /**
13
+ * PRDCT-1437 — the account-existence oracle, closed on both remaining doors.
14
+ *
15
+ * Door 1: minting a change-email link succeeds for ANY new address; consuming
16
+ * it used to answer a raw 500 when the address already had an account
17
+ * anywhere on the instance (the update died at the `user.email` UNIQUE
18
+ * constraint) versus a 302 when it did not — a mint-then-consume oracle for
19
+ * any owner, free on a "yes". The consume now answers the SAME observables on
20
+ * both branches: 302 to the callback, a session cookie for the target, no
21
+ * error param — the email just does not change on a collision.
22
+ *
23
+ * Door 2: the public invitation/collaborator lookups no longer carry
24
+ * `accountExists` (asserted in their own suites); this file pins door 1.
25
+ */
26
+
27
+ const OWNER = { email: 'owner@oracle.test', name: 'Oracle Owner', password: 'oracle-owner-pass-1' };
28
+ const MEMBER = { email: 'member@oracle.test', name: 'Oracle Member', password: 'oracle-member-pass-1' };
29
+ /** An account that exists on the instance but NOT in this workspace. */
30
+ const ELSEWHERE_EMAIL = 'elsewhere@oracle.test';
31
+
32
+ let container: StartedPostgreSqlContainer;
33
+ let app: TestApp;
34
+ let ownerCookie: string;
35
+ let memberId: string;
36
+
37
+ let ipCounter = 0;
38
+ const nextIp = () => `10.67.${Math.floor(ipCounter / 250)}.${(ipCounter++ % 250) + 1}`;
39
+
40
+ const json = (body: unknown, headers: Record<string, string> = {}) => ({
41
+ method: 'POST',
42
+ headers: { 'content-type': 'application/json', 'x-forwarded-for': nextIp(), ...headers },
43
+ body: JSON.stringify(body)
44
+ });
45
+
46
+ async function memberEmail(): Promise<string> {
47
+ const { rows } = await app.db.pool.query<{ email: string }>(
48
+ `SELECT u.email FROM "user" u JOIN workspace_members m ON m.user_id = u.id WHERE m.id = $1`,
49
+ [memberId]
50
+ );
51
+ return rows[0]!.email;
52
+ }
53
+
54
+ /** Mint a change-email link for the member; must succeed (200). */
55
+ async function mint(newEmail: string): Promise<string> {
56
+ const res = await app.app.request(
57
+ `/api/v1/members/${memberId}/change-email-link`,
58
+ json({ newEmail }, { cookie: ownerCookie })
59
+ );
60
+ expect(res.status).toBe(200);
61
+ return (await readJson(res)).verifyUrl as string;
62
+ }
63
+
64
+ interface Observables {
65
+ status: number;
66
+ location: string | null;
67
+ hasSessionCookie: boolean;
68
+ hasErrorParam: boolean;
69
+ body: string;
70
+ }
71
+
72
+ /** Consume a link logged out; returns the FULL observable set a prober reads. */
73
+ async function consume(verifyUrl: string): Promise<Observables> {
74
+ const res = await app.app.request(verifyUrl, { headers: { 'x-forwarded-for': nextIp() } });
75
+ const location = res.headers.get('location');
76
+ const setCookie = res.headers.get('set-cookie') ?? '';
77
+ const body = res.status === 200 ? await res.text() : '';
78
+ return {
79
+ status: res.status,
80
+ location,
81
+ hasSessionCookie: /better-auth\.session_token=[^;]/.test(setCookie),
82
+ hasErrorParam: (location ?? '').includes('error='),
83
+ body
84
+ };
85
+ }
86
+
87
+ /** Rewrite (or drop) the callbackURL query param on a minted verify URL. */
88
+ function withCallback(verifyUrl: string, callbackURL: string | null): string {
89
+ const u = new URL(verifyUrl, 'http://localhost:3000');
90
+ if (callbackURL === null) u.searchParams.delete('callbackURL');
91
+ else u.searchParams.set('callbackURL', callbackURL);
92
+ return u.pathname + u.search;
93
+ }
94
+
95
+ /** Every observable must agree between the taken and the free consume. */
96
+ function expectIdentical(taken: Observables, free: Observables): void {
97
+ expect(taken.status).toBe(free.status);
98
+ expect(taken.location).toBe(free.location);
99
+ expect(taken.hasSessionCookie).toBe(free.hasSessionCookie);
100
+ expect(taken.hasErrorParam).toBe(false);
101
+ expect(free.hasErrorParam).toBe(false);
102
+ expect(taken.body).toBe(free.body);
103
+ }
104
+
105
+ beforeAll(async () => {
106
+ container = await startPostgres();
107
+ app = await createTestApp(await createDatabase(container, 'oracle_uniform'));
108
+ await app.app.request(
109
+ '/api/v1/setup',
110
+ json({ setupToken: 'integration-test-setup-token', instanceName: 'Oracle', owner: OWNER })
111
+ );
112
+ ownerCookie = extractCookie(
113
+ await app.app.request(
114
+ '/api/v1/auth/sign-in/email',
115
+ json({ email: OWNER.email, password: OWNER.password })
116
+ )
117
+ );
118
+
119
+ // The member whose email the owner "changes" while probing.
120
+ const inv = await readJson(
121
+ await app.app.request(
122
+ '/api/v1/invitations',
123
+ json({ email: MEMBER.email, role: 'member' }, { cookie: ownerCookie })
124
+ )
125
+ );
126
+ const token = (inv.acceptUrl as string).split('/invite/')[1]!;
127
+ expect(
128
+ (
129
+ await app.app.request(
130
+ '/api/v1/invitations/accept',
131
+ json({ token, name: MEMBER.name, password: MEMBER.password })
132
+ )
133
+ ).status
134
+ ).toBe(200);
135
+ const members = await readJson(
136
+ await app.app.request('/api/v1/members', { headers: { cookie: ownerCookie } })
137
+ );
138
+ memberId = members.members.find((m: { email: string }) => m.email === MEMBER.email).id;
139
+
140
+ // The probed address: an account that exists on the instance but holds no
141
+ // membership in this workspace (another tenant's user, say) — so the mint's
142
+ // workspace-scoped advisory pre-check does NOT catch it and the collision
143
+ // would only surface at consumption, exactly the oracle's shape.
144
+ await app.db.pool.query(
145
+ `INSERT INTO "user" (id, name, email, email_verified, created_at, updated_at)
146
+ VALUES ('oracle-elsewhere-user', 'Elsewhere', $1, true, now(), now())`,
147
+ [ELSEWHERE_EMAIL]
148
+ );
149
+ }, 120_000);
150
+
151
+ afterAll(async () => {
152
+ await app?.stop();
153
+ await container?.stop();
154
+ });
155
+
156
+ /**
157
+ * Consume, once for a FRESH unused address (the change goes through) and once
158
+ * for ELSEWHERE_EMAIL (a collision), under the SAME callbackURL shape, and
159
+ * assert every observable agrees. A counter hands each call a distinct fresh
160
+ * address, since every successful free consume renames the member.
161
+ */
162
+ let freshCounter = 0;
163
+ async function bothWaysUnder(callbackURL: string | null): Promise<{ taken: Observables; free: Observables }> {
164
+ const fresh = `fresh${freshCounter++}@oracle.test`;
165
+ const free = await consume(withCallback(await mint(fresh), callbackURL));
166
+ const taken = await consume(withCallback(await mint(ELSEWHERE_EMAIL), callbackURL));
167
+ return { taken, free };
168
+ }
169
+
170
+ describe('the change-email consume answers uniformly (door 1)', () => {
171
+ it('the minted shape (relative callbackURL): taken ≡ free, and only free renames the member', async () => {
172
+ const before = await memberEmail();
173
+ const { taken, free } = await bothWaysUnder('/account');
174
+ expectIdentical(taken, free);
175
+ expect(free.status).toBeGreaterThanOrEqual(300);
176
+ expect(free.status).toBeLessThan(400);
177
+ // The free consume renamed the member; the collision left both accounts.
178
+ expect(await memberEmail()).not.toBe(before);
179
+ const { rows } = await app.db.pool.query(`SELECT 1 FROM "user" WHERE email = $1`, [ELSEWHERE_EMAIL]);
180
+ expect(rows.length).toBe(1);
181
+ });
182
+
183
+ it('Repro A — no callbackURL (the JSON path): taken ≡ free, both user:null (no user record leaks)', async () => {
184
+ const { taken, free } = await bothWaysUnder(null);
185
+ expectIdentical(taken, free);
186
+ expect(free.status).toBe(200);
187
+ // The free JSON must be normalized to user:null — a leaked user record is
188
+ // the whole oracle this repro exposed.
189
+ expect(JSON.parse(free.body)).toEqual({ status: true, user: null });
190
+ expect(JSON.parse(taken.body)).toEqual({ status: true, user: null });
191
+ });
192
+
193
+ it('Repro B — absolute SAME-ORIGIN callbackURL: taken ≡ free (both redirect, no oracle)', async () => {
194
+ const { taken, free } = await bothWaysUnder('http://localhost:3000/account');
195
+ expectIdentical(taken, free);
196
+ expect(free.status).toBeGreaterThanOrEqual(300);
197
+ expect(free.status).toBeLessThan(400);
198
+ });
199
+
200
+ // CAVEAT: this harness runs with NODE_ENV=test, which makes Better Auth
201
+ // skip ITS OWN callbackURL origin check — so these two assertions exercise
202
+ // safeRedirectLocation (our defence-in-depth layer) alone, not production's
203
+ // stacked guards. Do not read them as proof the upstream guard works.
204
+ it('an untrusted absolute callbackURL is refused IDENTICALLY on both branches (no open redirect)', async () => {
205
+ const { taken, free } = await bothWaysUnder('http://evil.example/x');
206
+ expect(taken.status).toBe(free.status);
207
+ expect(taken.location).toBe(free.location);
208
+ for (const o of [taken, free]) {
209
+ expect(o.location ?? '').not.toContain('evil.example');
210
+ }
211
+ });
212
+
213
+ it('a tab-smuggled protocol-relative callbackURL never redirects off-origin, and both branches agree', async () => {
214
+ const { taken, free } = await bothWaysUnder('/\t/evil.example');
215
+ expect(taken.status).toBe(free.status);
216
+ expect(taken.location).toBe(free.location);
217
+ for (const o of [taken, free]) {
218
+ // The one thing that must never happen: a Location resolving off-origin.
219
+ const loc = o.location;
220
+ if (loc) {
221
+ const resolved = new URL(loc, 'http://localhost:3000');
222
+ expect(resolved.origin).toBe('http://localhost:3000');
223
+ }
224
+ }
225
+ });
226
+
227
+ it('never answers 5xx on the consume path, and the collision-branch session authenticates the target', async () => {
228
+ const res = await app.app.request(withCallback(await mint(ELSEWHERE_EMAIL), '/account'), {
229
+ headers: { 'x-forwarded-for': nextIp() }
230
+ });
231
+ expect(res.status).toBeLessThan(500);
232
+ // The link is sign-in-equivalent by design (LESSONS M6) — on the collision
233
+ // branch too, and for the TARGET member, never the probed account.
234
+ const cookie = extractCookie(res);
235
+ const me = await readJson(await app.app.request('/api/v1/me', { headers: { cookie } }));
236
+ expect(me.user.email).toBe(await memberEmail());
237
+ expect(me.user.email).not.toBe(ELSEWHERE_EMAIL);
238
+ });
239
+
240
+ it('an invalid token keeps its ordinary error redirect (uniformity never hides real failures)', async () => {
241
+ const res = await app.app.request('/api/v1/auth/verify-email?token=not-a-jwt&callbackURL=%2Faccount', {
242
+ headers: { 'x-forwarded-for': nextIp() }
243
+ });
244
+ expect(res.status).toBeGreaterThanOrEqual(300);
245
+ expect(res.status).toBeLessThan(400);
246
+ expect(res.headers.get('location')).toContain('error=');
247
+ });
248
+ });
249
+
250
+ /** Mint an invitation and return its accept token. */
251
+ async function inviteToken(email: string): Promise<string> {
252
+ const inv = await readJson(
253
+ await app.app.request('/api/v1/invitations', json({ email, role: 'member' }, { cookie: ownerCookie }))
254
+ );
255
+ return (inv.acceptUrl as string).split('/invite/')[1]!;
256
+ }
257
+
258
+ describe('the invitation accept answers uniformly to a credential-less probe (door 2)', () => {
259
+ it('existing and fresh emails answer credentials_required alike; existence surfaces only on a committed create', async () => {
260
+ // ELSEWHERE_EMAIL has an account on the instance; the fresh one does not.
261
+ const takenToken = await inviteToken(ELSEWHERE_EMAIL);
262
+ const freshToken = await inviteToken('door2-fresh@oracle.test');
263
+
264
+ const probe = (token: string, body: Record<string, unknown> = {}) =>
265
+ app.app.request('/api/v1/invitations/accept', json({ token, ...body }));
266
+
267
+ // Credential-less: the account-existence bit is not readable for free —
268
+ // same status, same code on both. (The old oracle answered 409
269
+ // account_exists for the existing email, 400 for the fresh one.)
270
+ const taken = await probe(takenToken);
271
+ const fresh = await probe(freshToken);
272
+ expect(taken.status).toBe(fresh.status);
273
+ expect(taken.status).toBe(400);
274
+ expect((await readJson(taken)).error.code).toBe('credentials_required');
275
+ expect((await readJson(fresh)).error.code).toBe('credentials_required');
276
+
277
+ // Existence surfaces ONLY after real credentials are committed — the
278
+ // inherent signup collision, not a free pre-credential probe. The invite
279
+ // stays alive (nothing created on the collision branch).
280
+ const withCreds = await probe(takenToken, { name: 'Probe', password: 'a-probe-password-123' });
281
+ expect(withCreds.status).toBe(409);
282
+ expect((await readJson(withCreds)).error.code).toBe('account_exists');
283
+ });
284
+ });