@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,80 @@
1
+ import { Hono } from 'hono';
2
+ import { bodyLimit } from 'hono/body-limit';
3
+ import { HTTPException } from 'hono/http-exception';
4
+ import { StreamableHTTPTransport } from '@hono/mcp';
5
+ import { looksLikeJwt } from '../middleware/scopes.js';
6
+ import { buildMcpServer } from './server.js';
7
+ export function mcpRoutes(deps) {
8
+ const app = new Hono();
9
+ const challengeUrl = `${deps.publicBaseUrl.replace(/\/+$/, '')}/.well-known/oauth-protected-resource/mcp`;
10
+ app.use('*', deps.limiter);
11
+ // JSON-RPC bodies are small; cap them so a caller can't force the transport
12
+ // to buffer an arbitrarily large body (the /api/v1 cap does not cover /mcp).
13
+ app.use('*', bodyLimit({
14
+ maxSize: 1024 * 1024,
15
+ onError: (c) => c.json({ error: 'payload_too_large', error_description: 'MCP request body exceeds 1 MiB' }, 413)
16
+ }));
17
+ const unauthorized = (description) => new Response(JSON.stringify({ error: 'invalid_token', error_description: description }), {
18
+ status: 401,
19
+ headers: {
20
+ 'content-type': 'application/json',
21
+ 'www-authenticate': `Bearer resource_metadata="${challengeUrl}"`
22
+ }
23
+ });
24
+ app.post('/', async (c) => {
25
+ const authHeader = c.req.header('authorization')?.trim() ?? '';
26
+ const bearer = /^Bearer\s+(.+)$/i.exec(authHeader)?.[1]?.trim() ?? null;
27
+ if (!bearer) {
28
+ return unauthorized('Authentication required');
29
+ }
30
+ let principal = null;
31
+ if (deps.isApiKeyToken(bearer)) {
32
+ principal = await deps.resolveApiKey(bearer);
33
+ }
34
+ else if (looksLikeJwt(bearer)) {
35
+ principal = await deps.resolveOauthJwt(bearer);
36
+ }
37
+ if (!principal) {
38
+ return unauthorized('Bearer token is invalid, expired, or revoked');
39
+ }
40
+ const server = buildMcpServer({
41
+ fetchApi: deps.fetchApi,
42
+ principal,
43
+ authorizationHeader: `Bearer ${bearer}`,
44
+ publicBaseUrl: deps.publicBaseUrl
45
+ }, { version: deps.version, instanceName: await deps.instanceName() }, deps.tool, deps.identity);
46
+ // No sessionIdGenerator = stateless: every POST is self-contained.
47
+ // enableJsonResponse returns plain JSON bodies (no SSE), so the Response
48
+ // handed back to Hono is complete — no stream outlives the request,
49
+ // nothing to tear down (the per-request server + transport are
50
+ // unreferenced after this).
51
+ const transport = new StreamableHTTPTransport({ enableJsonResponse: true });
52
+ await server.connect(transport);
53
+ try {
54
+ const res = await transport.handleRequest(c);
55
+ return res ?? c.body(null, 204);
56
+ }
57
+ catch (cause) {
58
+ // The transport reports protocol failures by THROWING HTTPException
59
+ // (400 -32700 for a malformed / non-JSON-RPC body, 406/415 for header
60
+ // problems), each carrying a complete JSON-RPC error response. Return
61
+ // that response instead of letting the root onError turn it into a
62
+ // generic 500.
63
+ if (cause instanceof HTTPException) {
64
+ return cause.getResponse();
65
+ }
66
+ throw cause;
67
+ }
68
+ });
69
+ // Non-POST is rejected here EXPLICITLY (ADR 002): the stateless transport
70
+ // does NOT 405 on its own — its GET handler would happily open a long-lived
71
+ // server-initiated SSE stream, and DELETE would answer a session teardown.
72
+ // Neither exists in stateless mode, so every non-POST method gets
73
+ // 405 + Allow: POST with a JSON-RPC error envelope (the shape the official
74
+ // SDK expects and tolerates).
75
+ app.all('/', (c) => c.json({ jsonrpc: '2.0', error: { code: -32000, message: 'Method not allowed' }, id: null }, 405, {
76
+ allow: 'POST'
77
+ }));
78
+ return app;
79
+ }
80
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/mcp/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export { ApiToolError, type ErrorHints, type ToolTextResult, deny, jsonText, mergeErrorHints, wrapToolErrors } from './errors.js';
2
+ export { mcpRoutes } from './http.js';
3
+ export { projectErrorHints, registerProjectTools } from './projects.js';
4
+ export { registerTeamTools } from './teams.js';
5
+ export { type McpInputs, mcpInputs } from './inputs.js';
6
+ export { type McpIdentity, type McpServerInfo, type McpToolDefinition, buildMcpServer, composeErrorHints } from './server.js';
7
+ export { type McpToolContext, callApi, createScopeCheck, fetchApiRaw, forWorkspace, pageQuery } from './tool-kit.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,IAAI,EACJ,QAAQ,EACR,eAAe,EACf,cAAc,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,KAAK,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,cAAc,EACd,iBAAiB,EAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,cAAc,EACnB,OAAO,EACP,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,SAAS,EACV,MAAM,eAAe,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { ApiToolError, deny, jsonText, mergeErrorHints, wrapToolErrors } from './errors.js';
2
+ export { mcpRoutes } from './http.js';
3
+ export { projectErrorHints, registerProjectTools } from './projects.js';
4
+ export { registerTeamTools } from './teams.js';
5
+ export { mcpInputs } from './inputs.js';
6
+ export { buildMcpServer, composeErrorHints } from './server.js';
7
+ export { callApi, createScopeCheck, fetchApiRaw, forWorkspace, pageQuery } from './tool-kit.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAGZ,IAAI,EACJ,QAAQ,EACR,eAAe,EACf,cAAc,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAkB,SAAS,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAIL,cAAc,EACd,iBAAiB,EAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAEL,OAAO,EACP,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,SAAS,EACV,MAAM,eAAe,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { z } from 'zod';
2
+ import type { ToolIdentity } from '@antasphere/chassis-contract';
3
+ /**
4
+ * The inputs every MCP tool of an instance shares, chassis tools and the
5
+ * tool's own alike: ONE definition, so the same argument reads the same in
6
+ * every tool of `tools/list`. The workspace input names `<toolPrefix>whoami`
7
+ * (the identity tool the chassis registers), hence a factory over the MCP half
8
+ * of the tool's identity. Build it once per server, next to `registerTools`.
9
+ */
10
+ export declare function mcpInputs(identity: Pick<ToolIdentity['mcp'], 'toolPrefix'>): {
11
+ /** The per-call target workspace; omitted, the caller's default one. */
12
+ workspaceInput: z.ZodOptional<z.ZodUUID>;
13
+ /** The cursor of a paginated list, passed through to the API. */
14
+ cursorInput: z.ZodOptional<z.ZodString>;
15
+ /** The page size of a paginated list. */
16
+ limitInput: z.ZodOptional<z.ZodNumber>;
17
+ };
18
+ export type McpInputs = ReturnType<typeof mcpInputs>;
19
+ //# sourceMappingURL=inputs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputs.d.ts","sourceRoot":"","sources":["../../src/mcp/inputs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC;IAEvE,wEAAwE;;IAOxE,iEAAiE;;IAEjE,yCAAyC;;EAS5C;AAED,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * The inputs every MCP tool of an instance shares, chassis tools and the
4
+ * tool's own alike: ONE definition, so the same argument reads the same in
5
+ * every tool of `tools/list`. The workspace input names `<toolPrefix>whoami`
6
+ * (the identity tool the chassis registers), hence a factory over the MCP half
7
+ * of the tool's identity. Build it once per server, next to `registerTools`.
8
+ */
9
+ export function mcpInputs(identity) {
10
+ return {
11
+ /** The per-call target workspace; omitted, the caller's default one. */
12
+ workspaceInput: z
13
+ .uuid()
14
+ .optional()
15
+ .describe(`Target organization (workspace id). Omit to use your default org — see ${identity.toolPrefix}whoami.`),
16
+ /** The cursor of a paginated list, passed through to the API. */
17
+ cursorInput: z.string().optional().describe('nextCursor from a previous page.'),
18
+ /** The page size of a paginated list. */
19
+ limitInput: z
20
+ .number()
21
+ .int()
22
+ .min(1)
23
+ .max(100)
24
+ .optional()
25
+ .describe('Page size (server max 100). Default 50.')
26
+ };
27
+ }
28
+ //# sourceMappingURL=inputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputs.js","sourceRoot":"","sources":["../../src/mcp/inputs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,QAAiD;IACzE,OAAO;QACL,wEAAwE;QACxE,cAAc,EAAE,CAAC;aACd,IAAI,EAAE;aACN,QAAQ,EAAE;aACV,QAAQ,CACP,0EAA0E,QAAQ,CAAC,UAAU,SAAS,CACvG;QACH,iEAAiE;QACjE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QAC/E,yCAAyC;QACzC,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,GAAG,EAAE;aACL,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,GAAG,CAAC;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,yCAAyC,CAAC;KACvD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { type ErrorHints } from './errors.js';
3
+ import { type McpScopes, type McpToolContext, type ScopeCheck } from './tool-kit.js';
4
+ import type { McpIdentity } from './server.js';
5
+ /**
6
+ * The project codes, turned from an API code into a sentence a model can act
7
+ * on, for the tool whose prefix is given: a hint that names a tool names it
8
+ * as it is registered (`<toolPrefix>list_project_members`), or the model
9
+ * follows it to a tool that does not exist. Merged into the instance's hint
10
+ * table (`mergeErrorHints`) so a refusal reads as words rather than as a
11
+ * code. The role a refusal needs is the message's, never assumed here: a
12
+ * tool's own route over a project may gate on `editor` where every chassis
13
+ * route gates on `manager`.
14
+ *
15
+ * Every key here is a code only the project routes answer. `not_found` is
16
+ * DELIBERATELY absent: it is the whole instance's code, a tool already words
17
+ * it for its own domain (and its hint wins, `buildMcpServer`), and a sentence
18
+ * about projects on the answer of every other 404 would be worse than none.
19
+ * The tiered answer is stated in the descriptions instead, where it belongs:
20
+ * a project you cannot read answers not found, so being refused is not proof
21
+ * that it exists.
22
+ */
23
+ export declare function projectErrorHints(toolPrefix: string): ErrorHints;
24
+ /**
25
+ * Register the eleven project tools on a server. Called by `buildMcpServer`
26
+ * after `<toolPrefix>whoami` and before the tool's own set, so `tools/list`
27
+ * keeps one stable order: the chassis examples, whoami, the projects, the
28
+ * tool's own.
29
+ */
30
+ export declare function registerProjectTools(server: McpServer, ctx: McpToolContext, identity: McpIdentity, scopes: McpScopes, checkScope: ScopeCheck<string>, hints: ErrorHints): void;
31
+ //# sourceMappingURL=projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/mcp/projects.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,EAAkC,KAAK,UAAU,EAAuB,MAAM,aAAa,CAAC;AACnG,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,UAAU,EAChB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA8C/C;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CA8BhE;AAkCD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,EAC9B,KAAK,EAAE,UAAU,GAChB,IAAI,CAiUN"}
@@ -0,0 +1,315 @@
1
+ import { z } from 'zod';
2
+ import { PROJECT_METADATA_MAX_LENGTH, projectRoleSchema, projectsArchivedFilterSchema } from '@antasphere/chassis-contract';
3
+ import { mcpInputs } from './inputs.js';
4
+ import { deny, jsonText, wrapToolErrors } from './errors.js';
5
+ import { callApi, forWorkspace, pageQuery } from './tool-kit.js';
6
+ /**
7
+ * The eleven PROJECT tools, registered by the chassis beside
8
+ * `<toolPrefix>whoami` — a project is a chassis concept (a subgroup of a
9
+ * workspace with its own members and roles), so every tool an instance serves
10
+ * over it is the chassis', not a tool's. Each one is a thin shim over the
11
+ * instance's own /api/v1/projects called IN-PROCESS with the caller's bearer
12
+ * forwarded verbatim: no privileged path, no MCP-only endpoint, and the API's
13
+ * fail-closed scope allowlist plus the tiered project answer (404 before 403
14
+ * before 409) apply unchanged.
15
+ *
16
+ * The conventions of the set are the chassis' (server.ts): reads carry
17
+ * `readOnlyHint: true` and pre-check the read scope, writes describe
18
+ * themselves confirm-first and pre-check the write scope, and every tool
19
+ * takes the same optional `workspace` argument.
20
+ *
21
+ * Nothing here names a tool, a brand or a domain: the prefix arrives as
22
+ * `identity.toolPrefix` and the wire shapes are the contract's.
23
+ */
24
+ /**
25
+ * What a project IS, in the words an agent that has never seen one needs. It
26
+ * opens every description in the set, so a model reading `tools/list` learns
27
+ * the concept once from whichever tool it looks at first.
28
+ */
29
+ const WHAT_IS_A_PROJECT = 'A project is a subgroup of an organization (workspace): a named space with its own members, ' +
30
+ 'used to group work and who may touch it.';
31
+ /**
32
+ * The three roles, each containing the one before it. Written out wherever a
33
+ * role is chosen or shown, because the whole authorization story of the
34
+ * surface is in it.
35
+ */
36
+ const ROLE_LADDER_BODY = '`viewer` reads the project and what is linked to it; `editor` may also write what is linked to ' +
37
+ 'it; `manager` may also rename the project, archive it, and manage its members. An organization ' +
38
+ 'owner or admin acts as a manager on every project.';
39
+ const ROLE_LADDER = `Roles, each containing the one before it: ${ROLE_LADDER_BODY}`;
40
+ /** How an archived project behaves, and the one way back. */
41
+ const ARCHIVED_RULE = 'An archived project is out of the default list and read-only: every change is refused until it ' +
42
+ 'is brought back. A project is never deleted.';
43
+ /**
44
+ * The project codes, turned from an API code into a sentence a model can act
45
+ * on, for the tool whose prefix is given: a hint that names a tool names it
46
+ * as it is registered (`<toolPrefix>list_project_members`), or the model
47
+ * follows it to a tool that does not exist. Merged into the instance's hint
48
+ * table (`mergeErrorHints`) so a refusal reads as words rather than as a
49
+ * code. The role a refusal needs is the message's, never assumed here: a
50
+ * tool's own route over a project may gate on `editor` where every chassis
51
+ * route gates on `manager`.
52
+ *
53
+ * Every key here is a code only the project routes answer. `not_found` is
54
+ * DELIBERATELY absent: it is the whole instance's code, a tool already words
55
+ * it for its own domain (and its hint wins, `buildMcpServer`), and a sentence
56
+ * about projects on the answer of every other 404 would be worse than none.
57
+ * The tiered answer is stated in the descriptions instead, where it belongs:
58
+ * a project you cannot read answers not found, so being refused is not proof
59
+ * that it exists.
60
+ */
61
+ export function projectErrorHints(toolPrefix) {
62
+ const t = (name) => `${toolPrefix}${name}`;
63
+ return {
64
+ insufficient_project_role: 'Your role on this project is below what this needs (the message names the role; the chassis ' +
65
+ 'routes need manager). Ask a project manager, or an owner or admin of the organization, to make ' +
66
+ 'the change or to raise your role.',
67
+ project_archived: 'This project is archived, so it is read-only. Bring it back first (archive the project with ' +
68
+ 'archived set to false), then try again.',
69
+ project_not_archived: 'This project is not archived, so there is nothing to bring back.',
70
+ member_not_found: `No such member. On ${t('add_project_member')}: nobody in the organization matches, and a project ` +
71
+ 'member must already be an active organization member, named by the exact user id or email ' +
72
+ `address they joined with. On ${t('set_project_member_role')} or ${t('remove_project_member')}: ` +
73
+ `this person is not on the project (${t('list_project_members')} shows who is).`,
74
+ already_member: 'This person or team is already a member of the project — change the role instead of adding ' +
75
+ 'them again.',
76
+ team_not_found: `No such team. On ${t('add_project_member')}: no team of the organization has this id ` +
77
+ `(${t('list_teams')} lists them). On ${t('set_project_team_role')} or ${t('remove_project_team')}: ` +
78
+ `this team is not on the project (${t('list_project_members')} shows who is).`,
79
+ guest_target: 'This person is an external guest invited to one item: their account is not this organization’s ' +
80
+ 'to put on a project.',
81
+ guest_forbidden: 'This credential is a guest of the organization, invited to one item only, and guests take no ' +
82
+ 'part in projects: nothing under the project tools answers it. Use a member’s credential.'
83
+ };
84
+ }
85
+ /**
86
+ * A project is named by an opaque id, never by its name: two projects may
87
+ * share a name, and the API answers 404 to whoever cannot read one.
88
+ */
89
+ const projectIdInput = z
90
+ .uuid()
91
+ .describe('The project id, from the list or the create answer (never the project name).');
92
+ const teamIdInput = z
93
+ .uuid()
94
+ .describe('The team id, as the teams list or the project member list reports it (never its name or slug).');
95
+ const userIdInput = z
96
+ .string()
97
+ .min(1)
98
+ .max(200)
99
+ .describe('The member’s user id, as the member list reports it.');
100
+ const roleInput = projectRoleSchema.describe(`The role on this project. ${ROLE_LADDER_BODY}`);
101
+ const nameInput = z.string().min(1).max(200).describe('The project name, as people will read it.');
102
+ const descriptionInput = z.string().max(2000).describe('A sentence or two on what the project is for.');
103
+ const metadataInput = z
104
+ .record(z.string(), z.unknown())
105
+ .describe('Your own structured data on the project, a plain JSON object the server keeps verbatim ' +
106
+ `(at most ${PROJECT_METADATA_MAX_LENGTH} characters once serialized). It REPLACES the whole ` +
107
+ 'object: read the project first and send the merged result, never a fragment.');
108
+ /**
109
+ * Register the eleven project tools on a server. Called by `buildMcpServer`
110
+ * after `<toolPrefix>whoami` and before the tool's own set, so `tools/list`
111
+ * keeps one stable order: the chassis examples, whoami, the projects, the
112
+ * tool's own.
113
+ */
114
+ export function registerProjectTools(server, ctx, identity, scopes, checkScope, hints) {
115
+ const { workspaceInput, cursorInput, limitInput } = mcpInputs(identity);
116
+ const prefix = identity.toolPrefix;
117
+ /** The read/write pre-check + the per-call workspace seam, in one step. */
118
+ const enter = (scope, workspace) => {
119
+ const denied = checkScope(ctx.principal, scope);
120
+ return denied ? { denied } : { ctx: forWorkspace(ctx, workspace) };
121
+ };
122
+ const run = (scope, workspace, body) => {
123
+ const entered = enter(scope, workspace);
124
+ if ('denied' in entered)
125
+ return Promise.resolve(entered.denied);
126
+ return wrapToolErrors(async () => jsonText(await body(entered.ctx)), hints);
127
+ };
128
+ const jsonBody = (value) => ({
129
+ method: 'POST',
130
+ headers: { 'content-type': 'application/json' },
131
+ body: JSON.stringify(value)
132
+ });
133
+ // ── Reads ────────────────────────────────────────────────────────────────
134
+ server.registerTool(`${prefix}list_projects`, {
135
+ description: `List the projects you belong to in an organization, newest first. ${WHAT_IS_A_PROJECT} ` +
136
+ `${ROLE_LADDER} Returns { projects: [{ id, name, description, metadata, archivedAt, ` +
137
+ 'createdBy, createdAt, updatedAt, myRole, memberCount }], nextCursor } — `myRole` is YOUR ' +
138
+ 'role on that project, so it tells you in advance what you may do. When nextCursor is ' +
139
+ `non-null, call again with cursor set to it. By default only the live projects are listed; ` +
140
+ `${ARCHIVED_RULE}`,
141
+ inputSchema: {
142
+ workspace: workspaceInput,
143
+ archived: z
144
+ .union([z.boolean(), projectsArchivedFilterSchema])
145
+ .optional()
146
+ .describe('Which projects to list: false (the default) the live ones, true the archived ones, ' +
147
+ '"all" both.'),
148
+ limit: limitInput,
149
+ cursor: cursorInput
150
+ },
151
+ annotations: { readOnlyHint: true }
152
+ }, async ({ workspace, archived, limit, cursor }) => run(scopes.read, workspace, (c) =>
153
+ // A model writes the natural boolean; the wire takes the enum.
154
+ callApi(c, pageQuery('/api/v1/projects', { cursor, limit }, { archived: typeof archived === 'boolean' ? String(archived) : archived }))));
155
+ server.registerTool(`${prefix}get_project`, {
156
+ description: `Read one project, with your own role on it. ${WHAT_IS_A_PROJECT} ${ROLE_LADDER} Returns ` +
157
+ '{ id, name, description, metadata, archivedAt, createdBy, createdAt, updatedAt, myRole, ' +
158
+ 'memberCount }. A project you are not a member of answers "not found" whether or not it ' +
159
+ 'exists — being refused is not proof that it is there.',
160
+ inputSchema: { workspace: workspaceInput, projectId: projectIdInput },
161
+ annotations: { readOnlyHint: true }
162
+ }, async ({ workspace, projectId }) => run(scopes.read, workspace, (c) => callApi(c, `/api/v1/projects/${projectId}`)));
163
+ server.registerTool(`${prefix}list_project_members`, {
164
+ description: `List a project's members and what each of them may do. ${ROLE_LADDER} A member is a ` +
165
+ 'person or a team, told apart by `kind`: a person entry is { kind: "person", userId, email, ' +
166
+ 'name, role, addedBy, createdAt }, a team entry { kind: "team", teamId, slug, name, ' +
167
+ 'membersCount, hubTeamId, role, addedBy, createdAt }, and every member of a team holds the ' +
168
+ 'team’s role; a person’s effective role is the highest of their own entry and their teams’. ' +
169
+ 'Returns { members, nextCursor }; pass a person’s `userId` to the tools that change or remove ' +
170
+ `a member, a team’s \`teamId\` to ${prefix}set_project_team_role and ${prefix}remove_project_team.`,
171
+ inputSchema: {
172
+ workspace: workspaceInput,
173
+ projectId: projectIdInput,
174
+ limit: limitInput,
175
+ cursor: cursorInput
176
+ },
177
+ annotations: { readOnlyHint: true }
178
+ }, async ({ workspace, projectId, limit, cursor }) => run(scopes.read, workspace, (c) => callApi(c, pageQuery(`/api/v1/projects/${projectId}/members`, { cursor, limit }))));
179
+ // ── Writes ───────────────────────────────────────────────────────────────
180
+ server.registerTool(`${prefix}create_project`, {
181
+ description: `Create a project in an organization — confirm with the user first (name included). ` +
182
+ `${WHAT_IS_A_PROJECT} You become its first manager, so you may then add members and set ` +
183
+ `their roles. ${ROLE_LADDER} Returns the new project, whose id is what every other ` +
184
+ 'project tool takes.',
185
+ inputSchema: {
186
+ workspace: workspaceInput,
187
+ name: nameInput,
188
+ description: descriptionInput.optional(),
189
+ metadata: metadataInput.optional()
190
+ }
191
+ }, async ({ workspace, name, description, metadata }) => run(scopes.write, workspace, (c) => callApi(c, '/api/v1/projects', jsonBody({
192
+ name,
193
+ ...(description !== undefined ? { description } : {}),
194
+ ...(metadata !== undefined ? { metadata } : {})
195
+ }))));
196
+ server.registerTool(`${prefix}update_project`, {
197
+ description: 'Change a project’s name, description or metadata — confirm with the user first. Needs the ' +
198
+ 'manager role on the project (an organization owner or admin has it everywhere). Send only ' +
199
+ 'the fields you are changing; `metadata` REPLACES the whole object, and a description set to ' +
200
+ `null clears it. ${ARCHIVED_RULE} Returns the project as it now is.`,
201
+ inputSchema: {
202
+ workspace: workspaceInput,
203
+ projectId: projectIdInput,
204
+ name: nameInput.optional(),
205
+ description: descriptionInput
206
+ .nullable()
207
+ .optional()
208
+ .describe('A sentence or two on what the project is for; null clears it.'),
209
+ metadata: metadataInput.optional()
210
+ }
211
+ }, async ({ workspace, projectId, name, description, metadata }) => {
212
+ if (name === undefined && description === undefined && metadata === undefined) {
213
+ return deny('Nothing to change: pass at least one of name, description or metadata. ' +
214
+ 'Read the project first if you need its current values.');
215
+ }
216
+ return run(scopes.write, workspace, (c) => callApi(c, `/api/v1/projects/${projectId}`, {
217
+ ...jsonBody({
218
+ ...(name !== undefined ? { name } : {}),
219
+ ...(description !== undefined ? { description } : {}),
220
+ ...(metadata !== undefined ? { metadata } : {})
221
+ }),
222
+ method: 'PATCH'
223
+ }));
224
+ });
225
+ server.registerTool(`${prefix}archive_project`, {
226
+ description: 'Archive a project, or bring an archived one back — confirm with the user first. Needs the ' +
227
+ `manager role on the project. ${ARCHIVED_RULE} Nothing is lost: archiving is reversible, by ` +
228
+ 'calling this same tool with `archived` set to false. Returns the project in its new state.',
229
+ inputSchema: {
230
+ workspace: workspaceInput,
231
+ projectId: projectIdInput,
232
+ archived: z
233
+ .boolean()
234
+ .optional()
235
+ .describe('true (the default) archives the project; false brings an archived one back.')
236
+ }
237
+ // No destructiveHint: a reversible, read-only switch is not a delete,
238
+ // and a host that gates destructive tools must not block the restore.
239
+ }, async ({ workspace, projectId, archived }) => {
240
+ const leg = archived === false ? 'unarchive' : 'archive';
241
+ return run(scopes.write, workspace, (c) => callApi(c, `/api/v1/projects/${projectId}/${leg}`, { method: 'POST' }));
242
+ });
243
+ server.registerTool(`${prefix}add_project_member`, {
244
+ description: 'Put one of the organization’s own members on a project, with a role — confirm with the ' +
245
+ `user first. Needs the manager role on the project. ${ROLE_LADDER} Name the person by ` +
246
+ 'either `userId` or `email`, and it must be someone who is already an active member of the ' +
247
+ 'organization: this invites nobody and creates no account. Or a team by `teamId` (from ' +
248
+ `${prefix}list_teams), which puts every member of the team on the project with that role. ` +
249
+ 'Exactly one of `userId`, `email` or `teamId`. Returns the new project member, a person or a ' +
250
+ 'team entry.',
251
+ inputSchema: {
252
+ workspace: workspaceInput,
253
+ projectId: projectIdInput,
254
+ userId: userIdInput.optional(),
255
+ email: z.email().optional().describe('The email address the person joined the organization with.'),
256
+ teamId: teamIdInput.optional(),
257
+ role: roleInput
258
+ }
259
+ }, async ({ workspace, projectId, userId, email, teamId, role }) => {
260
+ if ([userId, email, teamId].filter((k) => k !== undefined).length !== 1) {
261
+ return deny('Name exactly one member: a person by userId or email, or a team by teamId, not several ' +
262
+ `and not none. The organization member list has both for everyone who has joined; ` +
263
+ `${prefix}list_teams has the team ids.`);
264
+ }
265
+ const who = userId !== undefined ? { userId } : email !== undefined ? { email } : { teamId };
266
+ return run(scopes.write, workspace, (c) => callApi(c, `/api/v1/projects/${projectId}/members`, jsonBody({ ...who, role })));
267
+ });
268
+ server.registerTool(`${prefix}set_project_member_role`, {
269
+ description: 'Change what a project member may do — confirm with the user first. Needs the manager role ' +
270
+ `on the project. ${ROLE_LADDER} Raising someone to manager lets them manage the members and ` +
271
+ 'archive the project too. Returns the member as they now are.',
272
+ inputSchema: {
273
+ workspace: workspaceInput,
274
+ projectId: projectIdInput,
275
+ userId: userIdInput,
276
+ role: roleInput
277
+ }
278
+ }, async ({ workspace, projectId, userId, role }) => run(scopes.write, workspace, (c) => callApi(c, `/api/v1/projects/${projectId}/members/${encodeURIComponent(userId)}`, {
279
+ ...jsonBody({ role }),
280
+ method: 'PATCH'
281
+ })));
282
+ server.registerTool(`${prefix}remove_project_member`, {
283
+ description: 'Take someone off a project — confirm with the user first; their access to the project and ' +
284
+ 'to what is linked to it stops immediately. Needs the manager role on the project (anyone ' +
285
+ 'may remove themselves). This removes the person from THIS project only: they stay a member ' +
286
+ 'of the organization. Returns a last snapshot of the member that was removed.',
287
+ inputSchema: { workspace: workspaceInput, projectId: projectIdInput, userId: userIdInput },
288
+ annotations: { destructiveHint: true }
289
+ }, async ({ workspace, projectId, userId }) => run(scopes.write, workspace, (c) => callApi(c, `/api/v1/projects/${projectId}/members/${encodeURIComponent(userId)}`, {
290
+ method: 'DELETE'
291
+ })));
292
+ server.registerTool(`${prefix}set_project_team_role`, {
293
+ description: 'Change the role a team holds on a project — confirm with the user first. Every member of ' +
294
+ `the team holds this role on the project through it. Needs the manager role on the project. ` +
295
+ `${ROLE_LADDER} Returns the team entry as it now is.`,
296
+ inputSchema: {
297
+ workspace: workspaceInput,
298
+ projectId: projectIdInput,
299
+ teamId: teamIdInput,
300
+ role: roleInput
301
+ }
302
+ }, async ({ workspace, projectId, teamId, role }) => run(scopes.write, workspace, (c) => callApi(c, `/api/v1/projects/${projectId}/teams/${teamId}`, {
303
+ ...jsonBody({ role }),
304
+ method: 'PATCH'
305
+ })));
306
+ server.registerTool(`${prefix}remove_project_team`, {
307
+ description: 'Take a team off a project — confirm with the user first; the access its members held ' +
308
+ 'THROUGH the team stops immediately. Needs the manager role on the project. People who also ' +
309
+ 'have their own entry on the project keep it, and the team itself stays in the organization. ' +
310
+ 'Returns a last snapshot of the team entry that was removed.',
311
+ inputSchema: { workspace: workspaceInput, projectId: projectIdInput, teamId: teamIdInput },
312
+ annotations: { destructiveHint: true }
313
+ }, async ({ workspace, projectId, teamId }) => run(scopes.write, workspace, (c) => callApi(c, `/api/v1/projects/${projectId}/teams/${teamId}`, { method: 'DELETE' })));
314
+ }
315
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/mcp/projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import type { ToolIdentity } from '@antasphere/chassis-contract';
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import { type ErrorHints } from './errors.js';
4
+ import { type McpScopes, type McpToolContext } from './tool-kit.js';
5
+ /**
6
+ * The bundled MCP server: tools are thin shims over the instance's own
7
+ * /api/v1 — called IN-PROCESS with the caller's Authorization header
8
+ * forwarded verbatim. MCP is just another API client: no privileged path, no
9
+ * MCP-only endpoints; new behavior lands in the API first. Identity comes
10
+ * from the verified credential, never from a tool parameter.
11
+ *
12
+ * Conventions (ported from the predecessor MCP template):
13
+ * - read tools: `readOnlyHint: true` + a checkScope on the tool's read scope
14
+ * - write tools: confirm-first description + the tool's write scope (+ destructiveHint
15
+ * for deletes) — see the write tools of the tool's own set (its tools.ts)
16
+ * - checkScope is UX only — the API's fail-closed allowlist is the
17
+ * enforcement point; this just gives the model a clean, actionable error.
18
+ *
19
+ * get_me and list_files below are the chassis' original example tools (the
20
+ * end-to-end whoami proof + a cursor-paginated list), followed by
21
+ * `<toolPrefix>whoami`, the identity tool under the tool's own prefix; the product tool set
22
+ * (`<toolPrefix>*`) lives in the tool's app (its tools.ts).
23
+ */
24
+ export type { McpToolContext } from './tool-kit.js';
25
+ export interface McpServerInfo {
26
+ version: string;
27
+ instanceName: string;
28
+ }
29
+ /**
30
+ * What a tool plugs into the bundled MCP server: its own tool set (registered
31
+ * AFTER the three chassis tools, so `tools/list` keeps its order), the server
32
+ * instructions, the error hints of its domain codes, and the two scope names
33
+ * the chassis tools pre-check.
34
+ */
35
+ export interface McpToolDefinition {
36
+ registerTools: (server: McpServer, ctx: McpToolContext) => void;
37
+ instructions: (info: McpServerInfo) => string;
38
+ errorHints: ErrorHints;
39
+ scopes: McpScopes;
40
+ }
41
+ /** The MCP half of the tool's identity (`ToolIdentity['mcp']`): the server's name and the tool names' prefix. */
42
+ export type McpIdentity = ToolIdentity['mcp'];
43
+ /**
44
+ * The ONE composition of an instance's hint table: the domain hints, then
45
+ * every chassis group (the projects today), then the tool's own last, so a
46
+ * tool may re-word a chassis code and never the reverse. A tool set that
47
+ * wraps its own errors reads the same composition (never a copy), so a
48
+ * chassis group added here reaches the tool's tools without a second edit.
49
+ */
50
+ export declare function composeErrorHints(toolHints: ErrorHints, toolPrefix: string): ErrorHints;
51
+ export declare function buildMcpServer(ctx: McpToolContext, info: McpServerInfo, tool: McpToolDefinition, identity: McpIdentity): McpServer;
52
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAA6C,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzF,OAAO,EAKL,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,eAAe,CAAC;AAEvB;;;;;;;;;;;;;;;;;;GAkBG;AACH,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,cAAc,KAAK,IAAI,CAAC;IAChE,YAAY,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,MAAM,CAAC;IAC9C,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,SAAS,CAAC;CACnB;AAED,iHAAiH;AACjH,MAAM,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;AAE9C;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,UAAU,CAEvF;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,aAAa,EACnB,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,WAAW,GACpB,SAAS,CAoGX"}