@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,393 @@
1
+ import { Readable } from 'node:stream';
2
+ import { finished } from 'node:stream/promises';
3
+ import { and, asc, eq, gt, isNull, sql } from 'drizzle-orm';
4
+ import { ZipFile } from 'yazl';
5
+ import { apiKeys, auditLog, files, instanceSettings, invitations, projectMembers, projects, projectTeams, user as userTable, workspaceMembers, workspaces, workspaceTeamMembers, workspaceTeams } from '@antasphere/chassis-db';
6
+ import { blobKey } from '../storage/driver.js';
7
+ import { requireAuth, requireNonGuest, requireRole } from '../middleware/auth-context.js';
8
+ import { rateLimit } from '../middleware/rate-limit.js';
9
+ /**
10
+ * GET /workspace/export — the GDPR/portability bundle: every workspace table
11
+ * as JSON, the audit log as NDJSON, and every live blob, streamed as one zip
12
+ * (yazl; modeled on the files-content streaming precedent in files.ts).
13
+ * Secrets never leave: invitations drop tokenHash, api-keys drop secretHash.
14
+ */
15
+ const AUDIT_BATCH = 500;
16
+ /**
17
+ * The entry names the chassis writes itself, without their extension. A tool
18
+ * entry that lands on one of them is refused: never a silent overwrite, never
19
+ * two zip entries of one name. (`files/…` needs no line here: a sanitized name
20
+ * holds no `/`.) `audit-log` is reserved although its file is `.ndjson`, so
21
+ * that the bundle never holds two audit logs.
22
+ */
23
+ export const RESERVED_EXPORT_ENTRY_NAMES = [
24
+ 'manifest',
25
+ 'workspace',
26
+ 'members',
27
+ 'invitations',
28
+ 'api-keys',
29
+ 'projects',
30
+ 'project_members',
31
+ 'teams',
32
+ 'team_members',
33
+ 'project_teams',
34
+ 'audit-log',
35
+ 'files',
36
+ 'skipped-blobs'
37
+ ];
38
+ /**
39
+ * Tool entries → zip entries, BEFORE the stream starts: every name goes
40
+ * through `sanitizeEntryName`, every `rows` through `jsonBuffer`, and a name
41
+ * that collides (compared without case, since the bundle is extracted on
42
+ * case-insensitive disks too) with a chassis entry or with another tool entry
43
+ * throws. Order is the tool's.
44
+ */
45
+ export function resolveExportEntries(entries) {
46
+ if (!Array.isArray(entries))
47
+ throw new Error('export entries: the tool must return an array of entries');
48
+ const taken = new Set(RESERVED_EXPORT_ENTRY_NAMES);
49
+ return entries.map((entry) => {
50
+ if (typeof entry?.name !== 'string' || !Array.isArray(entry.rows)) {
51
+ throw new Error('export entries: every entry is { name: string, rows: unknown[] }');
52
+ }
53
+ const name = sanitizeEntryName(entry.name);
54
+ const key = name.toLowerCase();
55
+ if (taken.has(key)) {
56
+ throw new Error(`export entries: the name "${name}" is already an entry of the bundle`);
57
+ }
58
+ taken.add(key);
59
+ return { entryName: `${name}.json`, buffer: jsonBuffer(entry.rows) };
60
+ });
61
+ }
62
+ /**
63
+ * Zip-slip guard: entry names embed the user-supplied originalName, so strip
64
+ * path separators (`/`, `\`) and control chars, and cap the length — an
65
+ * uploaded name like `../../etc/cron.d/x` must never place an entry outside
66
+ * the extraction directory.
67
+ */
68
+ export function sanitizeEntryName(name) {
69
+ // eslint-disable-next-line no-control-regex
70
+ const cleaned = name.replace(/[/\\\u0000-\u001f\u007f]/g, '_');
71
+ return (cleaned || 'file').slice(0, 150);
72
+ }
73
+ function jsonBuffer(value) {
74
+ return Buffer.from(JSON.stringify(value, null, 2) + '\n', 'utf8');
75
+ }
76
+ /** Keyset walk of the audit log, one NDJSON line per row (never buffers the table). */
77
+ async function* auditNdjson(db, workspaceId) {
78
+ let lastId = 0;
79
+ for (;;) {
80
+ const rows = await db
81
+ .select()
82
+ .from(auditLog)
83
+ .where(and(eq(auditLog.workspaceId, workspaceId), gt(auditLog.id, lastId)))
84
+ .orderBy(asc(auditLog.id))
85
+ .limit(AUDIT_BATCH);
86
+ if (rows.length === 0)
87
+ return;
88
+ for (const row of rows) {
89
+ yield JSON.stringify({ ...row, createdAt: row.createdAt.toISOString() }) + '\n';
90
+ lastId = row.id;
91
+ }
92
+ if (rows.length < AUDIT_BATCH)
93
+ return;
94
+ }
95
+ }
96
+ export function registerExportRoutes(api, deps) {
97
+ const { db, env, storage, audit, limiters, clientIp, logger } = deps;
98
+ // Gates, in order: rate limit (IP AND user — exports are expensive) →
99
+ // authenticated → admin+. Machine principals additionally passed the
100
+ // fail-closed export-scope gate in authContext before landing here.
101
+ api.use('/workspace/export', rateLimit(limiters.workspaceExport, clientIp, async (c) => {
102
+ const principal = c.get('principal');
103
+ return principal ? [`u:${principal.userId}`] : [];
104
+ }));
105
+ api.use('/workspace/export', requireAuth());
106
+ // Guest capability limit (D2): the whole-workspace export is the named
107
+ // workspace-scope surface guests must never reach. Defense in depth in
108
+ // front of the admin gate — a guest is minted role 'member' and the role
109
+ // is locked (api/members.ts), but export is exactly the surface where a
110
+ // second, origin-keyed wall is cheap and the failure catastrophic.
111
+ api.use('/workspace/export', requireNonGuest());
112
+ api.use('/workspace/export', requireRole('admin'));
113
+ api.openapi(deps.workspaceExportRoute, async (c) => {
114
+ const principal = c.get('principal');
115
+ const workspaceId = principal.workspaceId;
116
+ const [instance] = await db.select().from(instanceSettings).limit(1);
117
+ const [{ liveFiles }] = (await db
118
+ .select({ liveFiles: sql `count(*)::int` })
119
+ .from(files)
120
+ .where(and(eq(files.workspaceId, workspaceId), isNull(files.deletedAt))));
121
+ // The tool's entries (the `api.exportEntries` slot), computed and
122
+ // serialized BEFORE the audit row and before the first byte: a
123
+ // contribution that throws, or whose name collides, answers the standard
124
+ // 500 with no audit row (the middleware writes none on a 4xx/5xx, and the
125
+ // session row below is not reached) and never a truncated zip. They are
126
+ // held in memory until their place in the pump: bounded tables only, the
127
+ // same stance as the chassis sections of step 2. No slot: nothing runs.
128
+ const toolEntries = deps.exportEntries
129
+ ? resolveExportEntries(await deps.exportEntries(db, workspaceId))
130
+ : [];
131
+ // Exactly one audit row either way: machine reads are audited by the
132
+ // middleware (it picks this up from c.set), session GETs are not
133
+ // (audit/service.ts) — so sessions write directly here.
134
+ const auditInfo = {
135
+ action: 'workspace.export',
136
+ resourceType: 'workspace',
137
+ resourceId: workspaceId,
138
+ metadata: { files: liveFiles }
139
+ };
140
+ c.set('audit', auditInfo);
141
+ if (principal.via === 'session') {
142
+ await audit.write({
143
+ workspaceId,
144
+ principal,
145
+ ...auditInfo,
146
+ requestId: c.get('requestId'),
147
+ ip: clientIp(c)
148
+ });
149
+ }
150
+ const zip = new ZipFile();
151
+ // @types/yazl types outputStream as the legacy NodeJS.ReadableStream; at
152
+ // runtime it is a real Readable (a PassThrough), which destroy/toWeb need.
153
+ const output = zip.outputStream;
154
+ // A client abort must tear down the source stream and the zip output or
155
+ // every cancelled download leaks a descriptor/S3 socket (files.ts rule).
156
+ let currentBlobStream = null;
157
+ c.req.raw.signal.addEventListener('abort', () => {
158
+ currentBlobStream?.destroy();
159
+ output.destroy(new Error('client aborted the export download'));
160
+ });
161
+ // Sequential pump, started before returning: entries are added in a
162
+ // fixed order while the output already streams. An error mid-pump
163
+ // destroys the output stream → the client sees a truncated (invalid)
164
+ // zip rather than a silently incomplete "valid" one — accepted: HTTP has
165
+ // no way to fail a 200 that already started streaming.
166
+ void (async () => {
167
+ // 1. Manifest first (no skip list here — it is not known yet; the
168
+ // skips land in skipped-blobs.json, written last).
169
+ zip.addBuffer(jsonBuffer({
170
+ formatVersion: 1,
171
+ exportedAt: new Date().toISOString(),
172
+ instance: {
173
+ instanceId: instance?.instanceId ?? null,
174
+ name: instance?.name ?? null,
175
+ edition: env.EDITION,
176
+ version: env.APP_VERSION
177
+ },
178
+ workspaceId
179
+ }), 'manifest.json');
180
+ // 2. The small bounded tables. Secrets are excluded by SELECTION, not
181
+ // by post-filtering: invitations.tokenHash and apiKeys.secretHash
182
+ // are simply never queried.
183
+ const [workspace] = await db
184
+ .select({ id: workspaces.id, name: workspaces.name, createdAt: workspaces.createdAt })
185
+ .from(workspaces)
186
+ .where(eq(workspaces.id, workspaceId))
187
+ .limit(1);
188
+ zip.addBuffer(jsonBuffer(workspace ?? null), 'workspace.json');
189
+ const memberRows = await db
190
+ .select({
191
+ id: workspaceMembers.id,
192
+ userId: workspaceMembers.userId,
193
+ email: userTable.email,
194
+ name: userTable.name,
195
+ role: workspaceMembers.role,
196
+ isActive: workspaceMembers.isActive,
197
+ createdAt: workspaceMembers.createdAt,
198
+ lastSeenAt: workspaceMembers.lastSeenAt
199
+ })
200
+ .from(workspaceMembers)
201
+ .innerJoin(userTable, eq(workspaceMembers.userId, userTable.id))
202
+ .where(eq(workspaceMembers.workspaceId, workspaceId))
203
+ .orderBy(asc(workspaceMembers.createdAt), asc(workspaceMembers.id));
204
+ zip.addBuffer(jsonBuffer(memberRows), 'members.json');
205
+ const invitationRows = await db
206
+ .select({
207
+ id: invitations.id,
208
+ email: invitations.email,
209
+ role: invitations.role,
210
+ invitedBy: invitations.invitedBy,
211
+ expiresAt: invitations.expiresAt,
212
+ acceptedAt: invitations.acceptedAt,
213
+ revokedAt: invitations.revokedAt,
214
+ createdAt: invitations.createdAt
215
+ })
216
+ .from(invitations)
217
+ .where(eq(invitations.workspaceId, workspaceId))
218
+ .orderBy(asc(invitations.createdAt), asc(invitations.id));
219
+ zip.addBuffer(jsonBuffer(invitationRows), 'invitations.json');
220
+ // PINNED keys only (workspace_id = this workspace): keys are USER
221
+ // credentials under the user-scoped model — an unpinned key belongs
222
+ // to its holder, not to any one workspace's export.
223
+ const apiKeyRows = await db
224
+ .select({
225
+ id: apiKeys.id,
226
+ keyId: apiKeys.keyId,
227
+ name: apiKeys.name,
228
+ scopes: apiKeys.scopes,
229
+ createdBy: apiKeys.createdBy,
230
+ createdAt: apiKeys.createdAt,
231
+ lastUsedAt: apiKeys.lastUsedAt,
232
+ revokedAt: apiKeys.revokedAt,
233
+ expiresAt: apiKeys.expiresAt
234
+ })
235
+ .from(apiKeys)
236
+ .where(eq(apiKeys.workspaceId, workspaceId))
237
+ .orderBy(asc(apiKeys.createdAt), asc(apiKeys.id));
238
+ zip.addBuffer(jsonBuffer(apiKeyRows), 'api-keys.json');
239
+ // Projects and their members, archived projects included (a project is
240
+ // never deleted). What a tool links to a project is the tool's entry.
241
+ const projectRows = await db
242
+ .select({
243
+ id: projects.id,
244
+ name: projects.name,
245
+ description: projects.description,
246
+ metadata: projects.metadata,
247
+ archivedAt: projects.archivedAt,
248
+ createdBy: projects.createdBy,
249
+ createdAt: projects.createdAt,
250
+ updatedAt: projects.updatedAt
251
+ })
252
+ .from(projects)
253
+ .where(eq(projects.workspaceId, workspaceId))
254
+ .orderBy(asc(projects.createdAt), asc(projects.id));
255
+ zip.addBuffer(jsonBuffer(projectRows), 'projects.json');
256
+ const projectMemberRows = await db
257
+ .select({
258
+ id: projectMembers.id,
259
+ projectId: projectMembers.projectId,
260
+ memberId: projectMembers.memberId,
261
+ userId: workspaceMembers.userId,
262
+ role: projectMembers.role,
263
+ addedBy: projectMembers.addedBy,
264
+ createdAt: projectMembers.createdAt
265
+ })
266
+ .from(projectMembers)
267
+ .innerJoin(projects, eq(projectMembers.projectId, projects.id))
268
+ .innerJoin(workspaceMembers, eq(projectMembers.memberId, workspaceMembers.id))
269
+ .where(eq(projects.workspaceId, workspaceId))
270
+ .orderBy(asc(projectMembers.createdAt), asc(projectMembers.id));
271
+ zip.addBuffer(jsonBuffer(projectMemberRows), 'project_members.json');
272
+ // The teams (PRDCT-2813): the tool's own and the hub's projections
273
+ // alike (`hubTeamId` tells them apart), their seats, and their places
274
+ // on projects (PRDCT-2794). The same three tables on both editions.
275
+ const teamRows = await db
276
+ .select({
277
+ id: workspaceTeams.id,
278
+ hubTeamId: workspaceTeams.hubTeamId,
279
+ slug: workspaceTeams.slug,
280
+ name: workspaceTeams.name,
281
+ createdBy: workspaceTeams.createdBy,
282
+ createdAt: workspaceTeams.createdAt,
283
+ updatedAt: workspaceTeams.updatedAt
284
+ })
285
+ .from(workspaceTeams)
286
+ .where(eq(workspaceTeams.workspaceId, workspaceId))
287
+ .orderBy(asc(workspaceTeams.createdAt), asc(workspaceTeams.id));
288
+ zip.addBuffer(jsonBuffer(teamRows), 'teams.json');
289
+ const teamMemberRows = await db
290
+ .select({
291
+ id: workspaceTeamMembers.id,
292
+ teamId: workspaceTeamMembers.teamId,
293
+ memberId: workspaceTeamMembers.memberId,
294
+ userId: workspaceMembers.userId,
295
+ addedBy: workspaceTeamMembers.addedBy,
296
+ createdAt: workspaceTeamMembers.createdAt
297
+ })
298
+ .from(workspaceTeamMembers)
299
+ .innerJoin(workspaceTeams, eq(workspaceTeamMembers.teamId, workspaceTeams.id))
300
+ .innerJoin(workspaceMembers, eq(workspaceTeamMembers.memberId, workspaceMembers.id))
301
+ .where(eq(workspaceTeams.workspaceId, workspaceId))
302
+ .orderBy(asc(workspaceTeamMembers.createdAt), asc(workspaceTeamMembers.id));
303
+ zip.addBuffer(jsonBuffer(teamMemberRows), 'team_members.json');
304
+ const projectTeamRows = await db
305
+ .select({
306
+ id: projectTeams.id,
307
+ projectId: projectTeams.projectId,
308
+ teamId: projectTeams.teamId,
309
+ role: projectTeams.role,
310
+ addedBy: projectTeams.addedBy,
311
+ createdAt: projectTeams.createdAt
312
+ })
313
+ .from(projectTeams)
314
+ .innerJoin(projects, eq(projectTeams.projectId, projects.id))
315
+ .where(eq(projects.workspaceId, workspaceId))
316
+ .orderBy(asc(projectTeams.createdAt), asc(projectTeams.id));
317
+ zip.addBuffer(jsonBuffer(projectTeamRows), 'project_teams.json');
318
+ // 3. Audit log as NDJSON, keyset-batched (this table is unbounded).
319
+ zip.addReadStream(Readable.from(auditNdjson(db, workspaceId)), 'audit-log.ndjson');
320
+ // 4. Files metadata — ALL rows including soft-deleted (deletedAt set;
321
+ // createdBy may be null after an account delete).
322
+ const fileRows = await db
323
+ .select()
324
+ .from(files)
325
+ .where(eq(files.workspaceId, workspaceId))
326
+ .orderBy(asc(files.createdAt), asc(files.id));
327
+ zip.addBuffer(jsonBuffer(fileRows.map((f) => ({
328
+ id: f.id,
329
+ sha256: f.sha256,
330
+ sizeBytes: f.sizeBytes,
331
+ contentType: f.contentType,
332
+ originalName: f.originalName,
333
+ createdBy: f.createdBy,
334
+ createdAt: f.createdAt.toISOString(),
335
+ deletedAt: f.deletedAt?.toISOString() ?? null
336
+ }))), 'files.json');
337
+ // 4b. The tool's entries, in the tool's order (none without the slot).
338
+ for (const entry of toolEntries)
339
+ zip.addBuffer(entry.buffer, entry.entryName);
340
+ // 5. Blobs, strictly one at a time: await each stream's end before
341
+ // opening the next so file descriptors / S3 sockets never pile up
342
+ // (yazl keeps accepting entries while piping until end()).
343
+ const skipped = [];
344
+ for (const f of fileRows) {
345
+ // Destroying yazl's output does NOT stop the pump: the ZipFile only
346
+ // latches errors emitted on itself, so entries added after an abort
347
+ // are still opened and fully drained. Check the signal explicitly or
348
+ // a cancelled multi-GB export keeps consuming disk/S3 bandwidth.
349
+ if (c.req.raw.signal.aborted)
350
+ throw new Error('client aborted the export download');
351
+ if (f.deletedAt) {
352
+ skipped.push({ fileId: f.id, sha256: f.sha256, reason: 'soft-deleted' });
353
+ continue;
354
+ }
355
+ const key = blobKey(f.workspaceId, f.sha256);
356
+ if (!(await storage.exists(key))) {
357
+ skipped.push({ fileId: f.id, sha256: f.sha256, reason: 'blob-missing' });
358
+ continue;
359
+ }
360
+ const stream = await storage.getStream(key);
361
+ currentBlobStream = stream;
362
+ // compress: false — media/binary blobs don't deflate; JSON entries
363
+ // above keep yazl's default compression.
364
+ zip.addReadStream(stream, `files/${f.id}-${sanitizeEntryName(f.originalName)}`, {
365
+ compress: false
366
+ });
367
+ await finished(stream);
368
+ currentBlobStream = null;
369
+ }
370
+ // 6. The skip list last (this is why the manifest carries none).
371
+ zip.addBuffer(jsonBuffer(skipped), 'skipped-blobs.json');
372
+ zip.end();
373
+ })().catch((err) => {
374
+ // A client cancel is routine, not an operational error.
375
+ if (c.req.raw.signal.aborted) {
376
+ logger.info({ workspaceId }, 'workspace export cancelled by the client');
377
+ }
378
+ else {
379
+ logger.error({ err, workspaceId }, 'workspace export pump failed — download truncated');
380
+ }
381
+ currentBlobStream?.destroy();
382
+ output.destroy(err instanceof Error ? err : new Error(String(err)));
383
+ });
384
+ const stamp = new Date().toISOString().slice(0, 10).replace(/-/g, '');
385
+ return c.body(Readable.toWeb(output), 200, {
386
+ 'content-type': 'application/zip',
387
+ 'content-disposition': `attachment; filename="export-${instance?.instanceId ?? 'instance'}-${stamp}.zip"`,
388
+ 'x-content-type-options': 'nosniff',
389
+ 'cache-control': 'no-store'
390
+ });
391
+ });
392
+ }
393
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/api/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { OpenAPIHono } from '@hono/zod-openapi';
2
+ import type { SQL } from 'drizzle-orm';
3
+ import type { Principal } from '@antasphere/chassis-contract';
4
+ import type { DbConn } from '@antasphere/chassis-db';
5
+ import type { Env } from '../env.js';
6
+ import type { ScopeRoutes } from './scope-routes.js';
7
+ import type { Logger } from '../logger.js';
8
+ import type { PlatformRegistry } from '../platform/registry.js';
9
+ import type { FileService } from '../files/service.js';
10
+ import type { StorageDriver } from '../storage/driver.js';
11
+ export interface FileRouteDeps {
12
+ service: FileService;
13
+ storage: StorageDriver;
14
+ registry: PlatformRegistry;
15
+ env: Pick<Env, 'MAX_FILE_SIZE_MB'>;
16
+ logger: Logger;
17
+ /**
18
+ * ADR 011 blob-delete guard: true when the blob is referenced by a live
19
+ * version manifest of the tool's resource — DELETE answers 409 file_in_use instead
20
+ * of removing it. Runs inside the delete transaction (files module stays
21
+ * tool-agnostic; the wiring point injects the tool's check).
22
+ */
23
+ blobInUse: (tx: DbConn, workspaceId: string, sha256: string) => Promise<boolean>;
24
+ /**
25
+ * ADR 013 per-blob read scope (SL-B1): a WHERE predicate over the `files`
26
+ * row, or `undefined` for the workspace admin/owner operator view. Injected
27
+ * for the same reason as `blobInUse` — the files module stays
28
+ * tool-agnostic and the wiring point supplies the tool's policy.
29
+ */
30
+ blobReadScope: (principal: Principal) => SQL | undefined;
31
+ /**
32
+ * The delete route the tool instantiated (its OpenAPI 409 carries the tool's
33
+ * wording), and the tool's message of that 409 `file_in_use`
34
+ * (`copy.fileInUse`): what references a blob is the tool's to name.
35
+ */
36
+ fileDeleteRoute: ScopeRoutes['fileDeleteRoute'];
37
+ fileInUse: string;
38
+ }
39
+ export declare function registerFileRoutes(api: OpenAPIHono, deps: FileRouteDeps): void;
40
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/api/files.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAW,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAgB1D,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACjF;;;;;OAKG;IACH,aAAa,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,GAAG,GAAG,SAAS,CAAC;IACzD;;;;OAIG;IACH,eAAe,EAAE,WAAW,CAAC,iBAAiB,CAAC,CAAC;IAChD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CA2I9E"}
@@ -0,0 +1,150 @@
1
+ import { Readable } from 'node:stream';
2
+ import { fileGetRoute, filesListRoute, fileUploadRoute } from '@antasphere/chassis-contract/routes';
3
+ import { FileTooLargeError } from '../files/spool.js';
4
+ import { serveBlob } from '../files/serve.js';
5
+ import { isUuid } from '../pagination.js';
6
+ import { requireAuth, requireNonGuest } from '../middleware/auth-context.js';
7
+ const err = (code, message) => ({ error: { code, message } });
8
+ const toWire = (f) => ({
9
+ id: f.id,
10
+ sha256: f.sha256,
11
+ sizeBytes: f.sizeBytes,
12
+ contentType: f.contentType,
13
+ originalName: f.originalName,
14
+ createdBy: f.createdBy,
15
+ createdAt: f.createdAt.toISOString()
16
+ });
17
+ export function registerFileRoutes(api, deps) {
18
+ const { service, storage, registry, env, logger } = deps;
19
+ const maxBytes = env.MAX_FILE_SIZE_MB * 1024 * 1024;
20
+ api.use('/files', requireAuth());
21
+ api.use('/files/*', requireAuth());
22
+ // Guest capability limit (D2, both editions): the generic files surface is
23
+ // a WORKSPACE-level surface (ADR 006) — an inventory of the tenant's blobs
24
+ // with a delete on it. Its READS are now per-resource authorized like every
25
+ // other content read (SL-B1: `deps.blobReadScope`, ADR 013), but the
26
+ // surface as a whole still belongs to the workspace, and an external guest
27
+ // has no business there: they were invited to ONE resource, not to the host
28
+ // tenant's file cabinet. Guests push and pull its bytes through the ADR
29
+ // 013-gated routes of the tool instead (its asset upload and its
30
+ // per-resource asset download).
31
+ api.use('/files', requireNonGuest());
32
+ api.use('/files/*', requireNonGuest());
33
+ api.openapi(filesListRoute, async (c) => {
34
+ const principal = c.get('principal');
35
+ const { cursor, limit } = c.req.valid('query');
36
+ const { files: rows, nextCursor } = await service.list(principal.workspaceId, {
37
+ ...(cursor !== undefined ? { cursor } : {}),
38
+ limit,
39
+ // ADR 013 (SL-B1): a plain member pages the blobs they uploaded plus
40
+ // those referenced by resources they can read; admins/owners keep the
41
+ // whole-workspace operator view.
42
+ visibility: deps.blobReadScope(principal)
43
+ });
44
+ return c.json({ files: rows.map(toWire), nextCursor }, 200);
45
+ });
46
+ api.openapi(fileUploadRoute, async (c) => {
47
+ const principal = c.get('principal');
48
+ const { name } = c.req.valid('query');
49
+ const contentType = c.req.header('content-type') ?? 'application/octet-stream';
50
+ // The declared-size check and the usage event are the entitlement gate's
51
+ // (the billing rail, §7): a tool declares `files.upload` on this route in
52
+ // its contract and the chassis gate runs it before this handler; the hard
53
+ // cap is still enforced mid-stream below. Nothing is checked or emitted
54
+ // by hand here.
55
+ if (!c.req.raw.body) {
56
+ return c.json(err('empty_body', 'Request body required'), 400);
57
+ }
58
+ try {
59
+ const { file, deduplicated } = await service.upload({
60
+ workspaceId: principal.workspaceId,
61
+ createdBy: principal.userId,
62
+ originalName: name,
63
+ contentType,
64
+ body: Readable.fromWeb(c.req.raw.body),
65
+ maxBytes
66
+ });
67
+ c.set('audit', {
68
+ action: 'file.upload',
69
+ resourceType: 'file',
70
+ resourceId: file.id,
71
+ metadata: { name, sizeBytes: file.sizeBytes, deduplicated }
72
+ });
73
+ registry.events.emit('file.uploaded', {
74
+ workspaceId: principal.workspaceId,
75
+ fileId: file.id,
76
+ sizeBytes: file.sizeBytes
77
+ });
78
+ return c.json({ file: toWire(file), deduplicated }, 201);
79
+ }
80
+ catch (e) {
81
+ if (e instanceof FileTooLargeError) {
82
+ return c.json(err('file_too_large', e.message), 413);
83
+ }
84
+ logger.error({ err: e }, 'file upload failed');
85
+ return c.json(err('upload_failed', 'Upload failed'), 400);
86
+ }
87
+ });
88
+ api.openapi(fileGetRoute, async (c) => {
89
+ const principal = c.get('principal');
90
+ const { id } = c.req.valid('param');
91
+ // 404, never 403, when the scope excludes the blob (ADR 013): a blob a
92
+ // principal cannot read must not be probeable by id either.
93
+ const file = await service.get(principal.workspaceId, id, deps.blobReadScope(principal));
94
+ if (!file)
95
+ return c.json(err('not_found', 'File not found'), 404);
96
+ return c.json(toWire(file), 200);
97
+ });
98
+ api.openapi(deps.fileDeleteRoute, async (c) => {
99
+ const principal = c.get('principal');
100
+ const { id } = c.req.valid('param');
101
+ // Same scope on the mutation: a member must not be able to delete (or
102
+ // probe) a blob they may not read.
103
+ const file = await service.get(principal.workspaceId, id, deps.blobReadScope(principal));
104
+ if (!file)
105
+ return c.json(err('not_found', 'File not found'), 404);
106
+ const outcome = await service.delete(file, (tx, row) => deps.blobInUse(tx, row.workspaceId, row.sha256));
107
+ if (outcome === 'in_use') {
108
+ return c.json(err('file_in_use', deps.fileInUse), 409);
109
+ }
110
+ c.set('audit', { action: 'file.delete', resourceType: 'file', resourceId: file.id });
111
+ return c.json(toWire(file), 200);
112
+ });
113
+ // ── Content: streamed, Range-capable. Registered as plain Hono routes (a
114
+ // byte endpoint, not part of the JSON OpenAPI surface); guarded by the
115
+ // same requireAuth + scope machinery as everything else under /files.
116
+ // The streaming machinery itself (ETag/304/Range/safe-serving) is shared
117
+ // with the tool's asset download — files/serve.ts.
118
+ const contentHandler = async (c, headOnly) => {
119
+ const principal = c.get('principal');
120
+ const id = c.req.param('id') ?? '';
121
+ // Plain Hono route (no contract param schema): reject a non-UUID id here
122
+ // or it reaches Postgres' uuid cast and surfaces as a sanitized 500.
123
+ if (!isUuid(id))
124
+ return c.json(err('not_found', 'File not found'), 404);
125
+ // The byte route carries the ADR 013 scope too (SL-B1) — this was the
126
+ // whole-tenant read: `workspace_id` alone served ANY resource's content to
127
+ // any member and to any read-scope key.
128
+ const file = await service.get(principal.workspaceId, id, deps.blobReadScope(principal));
129
+ if (!file)
130
+ return c.json(err('not_found', 'File not found'), 404);
131
+ return serveBlob(c, {
132
+ storage,
133
+ logger,
134
+ workspaceId: file.workspaceId,
135
+ sha256: file.sha256,
136
+ sizeBytes: file.sizeBytes,
137
+ contentType: file.contentType,
138
+ filename: file.originalName,
139
+ headOnly
140
+ });
141
+ };
142
+ // ONE registration for both verbs. Hono rewrites HEAD to GET before routing
143
+ // (verified against the pinned version: a HEAD request runs the GET handler
144
+ // and the HEAD registration never fires), so a separate `api.on('HEAD', …)`
145
+ // is dead code and every HEAD would silently stream the whole body. Read
146
+ // the verb off the request instead — that is the only signal that survives
147
+ // the rewrite. Never add an `api.on('HEAD', …)` route on this app.
148
+ api.get('/files/:id/content', (c) => contentHandler(c, c.req.method === 'HEAD'));
149
+ }
150
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/api/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export { registerApiKeyRoutes } from './apikeys.js';
2
+ export { registerAuditRoutes } from './audit.js';
3
+ export { registerBreakGlassRoutes } from './break-glass.js';
4
+ export { registerCliAuthRoutes } from './cli-auth.js';
5
+ export { demoSessionJudge, demoSignInOn, registerDemoPassRoutes } from './demo-passes.js';
6
+ export { registerExportRoutes, resolveExportEntries, sanitizeEntryName, RESERVED_EXPORT_ENTRY_NAMES, type ExportEntriesFn, type ExportEntry } from './export.js';
7
+ export { registerFileRoutes } from './files.js';
8
+ export { registerInvitationRoutes } from './invitations.js';
9
+ export { registerMemberRoutes } from './members.js';
10
+ export { registerOnboardingRoutes } from './onboarding.js';
11
+ export { registerOpenApiDoc } from './openapi-doc.js';
12
+ export { registerProjectRoutes } from './projects.js';
13
+ export { registerSsoConnectRoutes } from './sso-connect.js';
14
+ export { registerSsoLogoutRoutes } from './sso-logout.js';
15
+ export { registerTeamRoutes } from './teams.js';
16
+ export { type WorkspaceCloudDeps, registerWorkspaceRoutes, workspaceCreateWallClosed, workspaceCreationPolicy, workspaceCreationRefusal } from './workspaces.js';
17
+ //# sourceMappingURL=index.d.ts.map