@toa.io/extensions.exposition 1.0.0-alpha.283 → 1.0.0-alpha.285

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 (568) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/components/exposition.octets/types/index.d.ts +1 -1
  3. package/components/identity.bans/operations/transit.js +1 -1
  4. package/components/identity.bans/tsconfig.json +1 -1
  5. package/components/identity.bans/tsconfig.tsbuildinfo +1 -1
  6. package/components/identity.bans/types/index.d.ts +1 -1
  7. package/components/identity.basic/operations/add.js +1 -1
  8. package/components/identity.basic/operations/authenticate.js +1 -1
  9. package/components/identity.basic/operations/check.js +1 -1
  10. package/components/identity.basic/operations/delete.js +1 -1
  11. package/components/identity.basic/operations/incept.js +18 -2
  12. package/components/identity.basic/operations/info.js +1 -1
  13. package/components/identity.basic/operations/lib/credentials.js +1 -1
  14. package/components/identity.basic/operations/transit.js +1 -1
  15. package/components/identity.basic/source/incept.ts +29 -1
  16. package/components/identity.basic/tsconfig.json +1 -1
  17. package/components/identity.basic/tsconfig.tsbuildinfo +1 -1
  18. package/components/identity.basic/types/index.d.ts +3 -2
  19. package/components/identity.clients/operations/describe.js +1 -1
  20. package/components/identity.clients/operations/lib/Context.js +1 -1
  21. package/components/identity.clients/operations/lib/Entity.js +1 -1
  22. package/components/identity.clients/operations/lib/canonical.js +1 -1
  23. package/components/identity.clients/operations/lib/cimd.js +1 -1
  24. package/components/identity.clients/operations/lib/errors.js +1 -1
  25. package/components/identity.clients/operations/lib/index.js +1 -1
  26. package/components/identity.clients/operations/lib/redirect.js +1 -1
  27. package/components/identity.clients/operations/register.js +1 -1
  28. package/components/identity.clients/tsconfig.json +1 -1
  29. package/components/identity.clients/tsconfig.tsbuildinfo +1 -1
  30. package/components/identity.clients/types/index.d.ts +1 -1
  31. package/components/identity.credentials/operations/list.js +1 -1
  32. package/components/identity.credentials/tsconfig.json +4 -2
  33. package/components/identity.credentials/tsconfig.tsbuildinfo +1 -1
  34. package/components/identity.credentials/types/index.d.ts +1 -1
  35. package/components/identity.federation/operations/authenticate.js +7 -3
  36. package/components/identity.federation/operations/create.js +1 -1
  37. package/components/identity.federation/operations/decode.js +1 -1
  38. package/components/identity.federation/operations/delete.js +1 -1
  39. package/components/identity.federation/operations/incept.js +6 -2
  40. package/components/identity.federation/operations/lib/Configuration.js +1 -1
  41. package/components/identity.federation/operations/lib/Ctx.js +1 -1
  42. package/components/identity.federation/operations/lib/Payload.js +1 -1
  43. package/components/identity.federation/operations/lib/decode.js +1 -1
  44. package/components/identity.federation/operations/lib/discovery.js +1 -1
  45. package/components/identity.federation/operations/lib/errors.js +1 -1
  46. package/components/identity.federation/operations/lib/exchange.js +1 -1
  47. package/components/identity.federation/operations/lib/index.js +2 -1
  48. package/components/identity.federation/operations/lib/jose.js +1 -1
  49. package/components/identity.federation/operations/lib/principal.js +14 -0
  50. package/components/identity.federation/operations/lib/resolve.js +1 -1
  51. package/components/identity.federation/operations/list.js +1 -1
  52. package/components/identity.federation/operations/types/Scheme.js +1 -1
  53. package/components/identity.federation/operations/types/configuration.js +1 -1
  54. package/components/identity.federation/operations/types/context.js +1 -1
  55. package/components/identity.federation/operations/types/entity.js +1 -1
  56. package/components/identity.federation/operations/types/index.js +1 -1
  57. package/components/identity.federation/source/authenticate.ts +8 -2
  58. package/components/identity.federation/source/incept.ts +7 -1
  59. package/components/identity.federation/source/lib/index.ts +1 -0
  60. package/components/identity.federation/source/lib/principal.ts +17 -0
  61. package/components/identity.federation/source/types/context.ts +3 -0
  62. package/components/identity.federation/tsconfig.json +4 -2
  63. package/components/identity.federation/tsconfig.tsbuildinfo +1 -1
  64. package/components/identity.federation/types/index.d.ts +1 -1
  65. package/components/identity.grants/operations/authorize.js +1 -1
  66. package/components/identity.grants/operations/exchange.js +1 -1
  67. package/components/identity.grants/operations/lib/code.js +1 -1
  68. package/components/identity.grants/operations/lib/identify.js +1 -1
  69. package/components/identity.grants/operations/lib/index.js +1 -1
  70. package/components/identity.grants/operations/list.js +1 -1
  71. package/components/identity.grants/operations/revoke.js +1 -1
  72. package/components/identity.grants/tsconfig.json +1 -1
  73. package/components/identity.grants/tsconfig.tsbuildinfo +1 -1
  74. package/components/identity.grants/types/index.d.ts +1 -1
  75. package/components/identity.keys/operations/create.js +1 -1
  76. package/components/identity.keys/operations/disable.js +1 -1
  77. package/components/identity.keys/operations/revoke.js +1 -1
  78. package/components/identity.keys/tsconfig.json +1 -1
  79. package/components/identity.keys/tsconfig.tsbuildinfo +1 -1
  80. package/components/identity.keys/types/index.d.ts +1 -1
  81. package/components/identity.otp/operations/authenticate.js +1 -1
  82. package/components/identity.otp/operations/issue.js +1 -1
  83. package/components/identity.otp/operations/lib/Context.js +1 -1
  84. package/components/identity.otp/operations/lib/Entity.js +1 -1
  85. package/components/identity.otp/operations/lib/index.js +1 -1
  86. package/components/identity.otp/tsconfig.json +1 -1
  87. package/components/identity.otp/tsconfig.tsbuildinfo +1 -1
  88. package/components/identity.otp/types/index.d.ts +1 -1
  89. package/components/identity.passkeys/operations/authenticate.js +1 -1
  90. package/components/identity.passkeys/operations/challenge.js +1 -1
  91. package/components/identity.passkeys/operations/create.js +1 -1
  92. package/components/identity.passkeys/operations/delete.js +1 -1
  93. package/components/identity.passkeys/operations/lib/const.js +1 -1
  94. package/components/identity.passkeys/operations/list.js +1 -1
  95. package/components/identity.passkeys/operations/types/Configuration.js +1 -1
  96. package/components/identity.passkeys/operations/types/Context.js +1 -1
  97. package/components/identity.passkeys/operations/types/Passkey.js +1 -1
  98. package/components/identity.passkeys/operations/types/index.js +1 -1
  99. package/components/identity.passkeys/operations/use.js +1 -1
  100. package/components/identity.passkeys/tsconfig.json +1 -1
  101. package/components/identity.passkeys/tsconfig.tsbuildinfo +1 -1
  102. package/components/identity.passkeys/types/index.d.ts +1 -1
  103. package/components/identity.roles/operations/grant.js +1 -1
  104. package/components/identity.roles/operations/lib/Entity.js +1 -1
  105. package/components/identity.roles/operations/list.js +1 -1
  106. package/components/identity.roles/operations/principal.js +29 -5
  107. package/components/identity.roles/source/principal.ts +33 -5
  108. package/components/identity.roles/tsconfig.json +1 -1
  109. package/components/identity.roles/tsconfig.tsbuildinfo +1 -1
  110. package/components/identity.roles/types/index.d.ts +1 -1
  111. package/components/identity.tokens/operations/authenticate.js +1 -1
  112. package/components/identity.tokens/operations/decrypt.js +1 -1
  113. package/components/identity.tokens/operations/encrypt.js +1 -1
  114. package/components/identity.tokens/operations/issue.js +1 -1
  115. package/components/identity.tokens/operations/lib/form.js +1 -1
  116. package/components/identity.tokens/operations/lib/index.js +1 -1
  117. package/components/identity.tokens/operations/lib/jose.js +1 -1
  118. package/components/identity.tokens/operations/lib/key.js +1 -1
  119. package/components/identity.tokens/operations/lib/pad.js +1 -1
  120. package/components/identity.tokens/operations/revoke.js +1 -1
  121. package/components/identity.tokens/tsconfig.json +1 -1
  122. package/components/identity.tokens/tsconfig.tsbuildinfo +1 -1
  123. package/components/identity.tokens/types/index.d.ts +1 -1
  124. package/documentation/access.md +13 -0
  125. package/documentation/components.md +3 -0
  126. package/documentation/introspection.md +13 -5
  127. package/documentation/io.md +6 -0
  128. package/documentation/map.md +8 -0
  129. package/documentation/mcp.md +186 -0
  130. package/documentation/oauth.md +8 -7
  131. package/documentation/rpc.md +144 -0
  132. package/documentation/tree.md +3 -0
  133. package/features/identity.basic.feature +44 -0
  134. package/features/identity.federation.feature +2 -5
  135. package/features/introspection.feature +333 -0
  136. package/features/mcp.feature +691 -0
  137. package/features/oauth.discovery.feature +10 -11
  138. package/features/oauth.grants.feature +22 -9
  139. package/features/octets.cloudinary.feature +1 -0
  140. package/features/rpc.feature +429 -0
  141. package/features/steps/Cloudinary.ts +13 -0
  142. package/features/steps/Components.ts +0 -4
  143. package/features/steps/Gateway.ts +19 -2
  144. package/features/steps/Parameters.ts +18 -7
  145. package/features/steps/Realtime.ts +3 -0
  146. package/features/steps/components/echo/manifest.toa.yaml +1 -0
  147. package/features/steps/components/pots/manifest.toa.yaml +2 -0
  148. package/package.json +3 -3
  149. package/readme.md +3 -0
  150. package/schemas/annotation.cos.yaml +33 -0
  151. package/schemas/call.cos.yaml +18 -0
  152. package/source/Annotation.ts +31 -0
  153. package/source/Directive.test.ts +15 -15
  154. package/source/Directive.ts +77 -9
  155. package/source/Endpoint.test.ts +67 -0
  156. package/source/Endpoint.ts +31 -11
  157. package/source/Factory.ts +5 -1
  158. package/source/Gateway.ts +73 -11
  159. package/source/HTTP/Context.ts +7 -0
  160. package/source/HTTP/Server.ts +7 -1
  161. package/source/HTTP/exceptions.ts +2 -2
  162. package/source/HTTP/messages.ts +10 -1
  163. package/source/Introspection.ts +105 -0
  164. package/source/MCP/Server.ts +275 -0
  165. package/source/MCP/discover.ts +52 -0
  166. package/source/MCP/errors.ts +81 -0
  167. package/source/MCP/index.ts +1 -0
  168. package/source/MCP/schema.test.ts +85 -0
  169. package/source/MCP/schema.ts +87 -0
  170. package/source/MCP/tools.ts +157 -0
  171. package/source/MCP/types.ts +84 -0
  172. package/source/Query.ts +48 -8
  173. package/source/RPC/Context.ts +78 -0
  174. package/source/RPC/Dispatcher.ts +130 -0
  175. package/source/RPC/errors.test.ts +52 -0
  176. package/source/RPC/errors.ts +83 -0
  177. package/source/RPC/index.ts +1 -0
  178. package/source/RPC/names.test.ts +122 -0
  179. package/source/RPC/names.ts +183 -0
  180. package/source/RPC/types.ts +34 -0
  181. package/source/RTD/Directives.ts +52 -2
  182. package/source/RTD/Endpoint.ts +2 -1
  183. package/source/RTD/Method.ts +14 -11
  184. package/source/RTD/Node.ts +38 -7
  185. package/source/RTD/Route.ts +30 -3
  186. package/source/RTD/Tree.ts +37 -1
  187. package/source/RTD/expiration.test.ts +1 -1
  188. package/source/RTD/walk.test.ts +110 -0
  189. package/source/const.ts +15 -0
  190. package/source/deployment.ts +8 -1
  191. package/source/directives/auth/Anonymous.test.ts +38 -0
  192. package/source/directives/auth/Anonymous.ts +12 -0
  193. package/source/directives/auth/Anyone.ts +4 -0
  194. package/source/directives/auth/Authorization.ts +62 -3
  195. package/source/directives/auth/Delegate.test.ts +36 -0
  196. package/source/directives/auth/Delegate.ts +14 -0
  197. package/source/directives/auth/Echo.ts +5 -0
  198. package/source/directives/auth/Incept.ts +2 -1
  199. package/source/directives/auth/Role.ts +13 -0
  200. package/source/directives/auth/Rule.ts +29 -0
  201. package/source/directives/auth/Scheme.ts +5 -0
  202. package/source/directives/auth/types.ts +21 -0
  203. package/source/directives/cache/Cache.ts +1 -1
  204. package/source/directives/dev/Development.ts +1 -1
  205. package/source/directives/flow/Flow.ts +1 -1
  206. package/source/directives/index.ts +3 -1
  207. package/source/directives/io/Directive.ts +1 -1
  208. package/source/directives/io/IO.ts +32 -3
  209. package/source/directives/io/Input.ts +3 -2
  210. package/source/directives/io/Output.ts +6 -3
  211. package/source/directives/io/Status.test.ts +2 -2
  212. package/source/directives/io/Status.ts +1 -1
  213. package/source/directives/io/Throttle.ts +1 -1
  214. package/source/directives/io/lib/throttle/Quotas.ts +2 -2
  215. package/source/directives/map/Headers.ts +11 -0
  216. package/source/directives/map/Map.ts +10 -1
  217. package/source/directives/map/Mapping.ts +23 -0
  218. package/source/directives/map/Segments.ts +12 -0
  219. package/source/directives/mcp/MCP.ts +40 -0
  220. package/source/directives/mcp/Tool.test.ts +90 -0
  221. package/source/directives/mcp/Tool.ts +47 -0
  222. package/source/directives/mcp/index.ts +6 -0
  223. package/source/directives/oauth/Discovery.ts +10 -16
  224. package/source/directives/octets/Octets.ts +1 -1
  225. package/source/directives/require/Directive.ts +1 -1
  226. package/source/directives/require/Headers.ts +1 -1
  227. package/source/directives/require/Require.ts +2 -2
  228. package/source/schemas.ts +2 -0
  229. package/transpiled/Annotation.d.ts +24 -0
  230. package/transpiled/Directive.d.ts +18 -1
  231. package/transpiled/Directive.js +50 -6
  232. package/transpiled/Directive.js.map +1 -1
  233. package/transpiled/Endpoint.d.ts +9 -0
  234. package/transpiled/Endpoint.js +27 -11
  235. package/transpiled/Endpoint.js.map +1 -1
  236. package/transpiled/Factory.js +5 -1
  237. package/transpiled/Factory.js.map +1 -1
  238. package/transpiled/Gateway.d.ts +19 -2
  239. package/transpiled/Gateway.js +51 -9
  240. package/transpiled/Gateway.js.map +1 -1
  241. package/transpiled/HTTP/Context.d.ts +6 -0
  242. package/transpiled/HTTP/Context.js +6 -0
  243. package/transpiled/HTTP/Context.js.map +1 -1
  244. package/transpiled/HTTP/Server.d.ts +5 -1
  245. package/transpiled/HTTP/exceptions.d.ts +1 -1
  246. package/transpiled/HTTP/exceptions.js +2 -2
  247. package/transpiled/HTTP/exceptions.js.map +1 -1
  248. package/transpiled/HTTP/messages.d.ts +6 -0
  249. package/transpiled/HTTP/messages.js +9 -1
  250. package/transpiled/HTTP/messages.js.map +1 -1
  251. package/transpiled/Introspection.d.ts +42 -0
  252. package/transpiled/Introspection.js +50 -1
  253. package/transpiled/Introspection.js.map +1 -1
  254. package/transpiled/MCP/Server.d.ts +41 -0
  255. package/transpiled/MCP/Server.js +180 -0
  256. package/transpiled/MCP/Server.js.map +1 -0
  257. package/transpiled/MCP/discover.d.ts +13 -0
  258. package/transpiled/MCP/discover.js +29 -0
  259. package/transpiled/MCP/discover.js.map +1 -0
  260. package/transpiled/MCP/errors.d.ts +24 -0
  261. package/transpiled/MCP/errors.js +67 -0
  262. package/transpiled/MCP/errors.js.map +1 -0
  263. package/transpiled/MCP/index.d.ts +1 -0
  264. package/transpiled/MCP/index.js +2 -0
  265. package/transpiled/MCP/index.js.map +1 -0
  266. package/transpiled/MCP/schema.d.ts +18 -0
  267. package/transpiled/MCP/schema.js +64 -0
  268. package/transpiled/MCP/schema.js.map +1 -0
  269. package/transpiled/MCP/tools.d.ts +31 -0
  270. package/transpiled/MCP/tools.js +122 -0
  271. package/transpiled/MCP/tools.js.map +1 -0
  272. package/transpiled/MCP/types.d.ts +66 -0
  273. package/transpiled/MCP/types.js +13 -0
  274. package/transpiled/MCP/types.js.map +1 -0
  275. package/transpiled/Query.d.ts +7 -0
  276. package/transpiled/Query.js +38 -7
  277. package/transpiled/Query.js.map +1 -1
  278. package/transpiled/RPC/Context.d.ts +11 -0
  279. package/transpiled/RPC/Context.js +63 -0
  280. package/transpiled/RPC/Context.js.map +1 -0
  281. package/transpiled/RPC/Dispatcher.d.ts +19 -0
  282. package/transpiled/RPC/Dispatcher.js +100 -0
  283. package/transpiled/RPC/Dispatcher.js.map +1 -0
  284. package/transpiled/RPC/errors.d.ts +18 -0
  285. package/transpiled/RPC/errors.js +67 -0
  286. package/transpiled/RPC/errors.js.map +1 -0
  287. package/transpiled/RPC/index.d.ts +1 -0
  288. package/transpiled/RPC/index.js +2 -0
  289. package/transpiled/RPC/index.js.map +1 -0
  290. package/transpiled/RPC/names.d.ts +31 -0
  291. package/transpiled/RPC/names.js +121 -0
  292. package/transpiled/RPC/names.js.map +1 -0
  293. package/transpiled/RPC/types.d.ts +27 -0
  294. package/transpiled/RPC/types.js +8 -0
  295. package/transpiled/RPC/types.js.map +1 -0
  296. package/transpiled/RTD/Directives.d.ts +41 -2
  297. package/transpiled/RTD/Endpoint.d.ts +2 -1
  298. package/transpiled/RTD/Method.d.ts +8 -3
  299. package/transpiled/RTD/Method.js +12 -10
  300. package/transpiled/RTD/Method.js.map +1 -1
  301. package/transpiled/RTD/Node.d.ts +20 -2
  302. package/transpiled/RTD/Node.js +22 -4
  303. package/transpiled/RTD/Node.js.map +1 -1
  304. package/transpiled/RTD/Route.d.ts +2 -1
  305. package/transpiled/RTD/Route.js +27 -2
  306. package/transpiled/RTD/Route.js.map +1 -1
  307. package/transpiled/RTD/Tree.d.ts +3 -1
  308. package/transpiled/RTD/Tree.js +26 -0
  309. package/transpiled/RTD/Tree.js.map +1 -1
  310. package/transpiled/const.d.ts +12 -0
  311. package/transpiled/const.js +12 -0
  312. package/transpiled/const.js.map +1 -1
  313. package/transpiled/deployment.js +4 -0
  314. package/transpiled/deployment.js.map +1 -1
  315. package/transpiled/directives/auth/Anonymous.d.ts +6 -0
  316. package/transpiled/directives/auth/Anonymous.js +10 -0
  317. package/transpiled/directives/auth/Anonymous.js.map +1 -1
  318. package/transpiled/directives/auth/Anyone.d.ts +1 -0
  319. package/transpiled/directives/auth/Anyone.js +3 -0
  320. package/transpiled/directives/auth/Anyone.js.map +1 -1
  321. package/transpiled/directives/auth/Authorization.d.ts +27 -1
  322. package/transpiled/directives/auth/Authorization.js +49 -1
  323. package/transpiled/directives/auth/Authorization.js.map +1 -1
  324. package/transpiled/directives/auth/Delegate.d.ts +5 -0
  325. package/transpiled/directives/auth/Delegate.js +10 -0
  326. package/transpiled/directives/auth/Delegate.js.map +1 -1
  327. package/transpiled/directives/auth/Echo.d.ts +2 -0
  328. package/transpiled/directives/auth/Echo.js +4 -0
  329. package/transpiled/directives/auth/Echo.js.map +1 -1
  330. package/transpiled/directives/auth/Incept.js +2 -1
  331. package/transpiled/directives/auth/Incept.js.map +1 -1
  332. package/transpiled/directives/auth/Role.d.ts +2 -0
  333. package/transpiled/directives/auth/Role.js +9 -0
  334. package/transpiled/directives/auth/Role.js.map +1 -1
  335. package/transpiled/directives/auth/Rule.d.ts +5 -0
  336. package/transpiled/directives/auth/Rule.js +20 -0
  337. package/transpiled/directives/auth/Rule.js.map +1 -1
  338. package/transpiled/directives/auth/Scheme.d.ts +2 -0
  339. package/transpiled/directives/auth/Scheme.js +4 -0
  340. package/transpiled/directives/auth/Scheme.js.map +1 -1
  341. package/transpiled/directives/auth/types.d.ts +16 -0
  342. package/transpiled/directives/cache/Cache.d.ts +1 -1
  343. package/transpiled/directives/cache/Cache.js +1 -1
  344. package/transpiled/directives/cache/Cache.js.map +1 -1
  345. package/transpiled/directives/dev/Development.d.ts +1 -1
  346. package/transpiled/directives/dev/Development.js +1 -1
  347. package/transpiled/directives/dev/Development.js.map +1 -1
  348. package/transpiled/directives/flow/Flow.d.ts +1 -1
  349. package/transpiled/directives/flow/Flow.js +1 -1
  350. package/transpiled/directives/flow/Flow.js.map +1 -1
  351. package/transpiled/directives/index.js +2 -1
  352. package/transpiled/directives/index.js.map +1 -1
  353. package/transpiled/directives/io/Directive.d.ts +1 -1
  354. package/transpiled/directives/io/IO.d.ts +7 -1
  355. package/transpiled/directives/io/IO.js +23 -3
  356. package/transpiled/directives/io/IO.js.map +1 -1
  357. package/transpiled/directives/io/Input.d.ts +3 -2
  358. package/transpiled/directives/io/Input.js +2 -1
  359. package/transpiled/directives/io/Input.js.map +1 -1
  360. package/transpiled/directives/io/Output.d.ts +5 -3
  361. package/transpiled/directives/io/Output.js +4 -2
  362. package/transpiled/directives/io/Output.js.map +1 -1
  363. package/transpiled/directives/io/Status.d.ts +1 -1
  364. package/transpiled/directives/io/Status.js +1 -1
  365. package/transpiled/directives/io/Status.js.map +1 -1
  366. package/transpiled/directives/io/Throttle.d.ts +1 -1
  367. package/transpiled/directives/io/Throttle.js +1 -1
  368. package/transpiled/directives/io/Throttle.js.map +1 -1
  369. package/transpiled/directives/io/lib/throttle/Quotas.d.ts +1 -1
  370. package/transpiled/directives/io/lib/throttle/Quotas.js +2 -2
  371. package/transpiled/directives/io/lib/throttle/Quotas.js.map +1 -1
  372. package/transpiled/directives/map/Headers.d.ts +2 -0
  373. package/transpiled/directives/map/Headers.js +8 -0
  374. package/transpiled/directives/map/Headers.js.map +1 -1
  375. package/transpiled/directives/map/Map.d.ts +3 -1
  376. package/transpiled/directives/map/Map.js +7 -1
  377. package/transpiled/directives/map/Map.js.map +1 -1
  378. package/transpiled/directives/map/Mapping.d.ts +13 -0
  379. package/transpiled/directives/map/Mapping.js +20 -0
  380. package/transpiled/directives/map/Mapping.js.map +1 -1
  381. package/transpiled/directives/map/Segments.d.ts +3 -0
  382. package/transpiled/directives/map/Segments.js +9 -0
  383. package/transpiled/directives/map/Segments.js.map +1 -1
  384. package/transpiled/directives/mcp/MCP.d.ts +15 -0
  385. package/transpiled/directives/mcp/MCP.js +29 -0
  386. package/transpiled/directives/mcp/MCP.js.map +1 -0
  387. package/transpiled/directives/mcp/Tool.d.ts +18 -0
  388. package/transpiled/directives/mcp/Tool.js +34 -0
  389. package/transpiled/directives/mcp/Tool.js.map +1 -0
  390. package/transpiled/directives/mcp/index.d.ts +4 -0
  391. package/transpiled/directives/mcp/index.js +4 -0
  392. package/transpiled/directives/mcp/index.js.map +1 -0
  393. package/transpiled/directives/oauth/Discovery.js +10 -13
  394. package/transpiled/directives/oauth/Discovery.js.map +1 -1
  395. package/transpiled/directives/octets/Octets.d.ts +1 -1
  396. package/transpiled/directives/octets/Octets.js +1 -1
  397. package/transpiled/directives/octets/Octets.js.map +1 -1
  398. package/transpiled/directives/require/Directive.d.ts +1 -1
  399. package/transpiled/directives/require/Headers.d.ts +1 -1
  400. package/transpiled/directives/require/Headers.js +1 -1
  401. package/transpiled/directives/require/Headers.js.map +1 -1
  402. package/transpiled/directives/require/Require.d.ts +1 -1
  403. package/transpiled/directives/require/Require.js +2 -2
  404. package/transpiled/directives/require/Require.js.map +1 -1
  405. package/transpiled/schemas.d.ts +2 -0
  406. package/transpiled/schemas.js +1 -0
  407. package/transpiled/schemas.js.map +1 -1
  408. package/tsconfig.tsbuildinfo +1 -1
  409. package/components/identity.bans/operations/transit.d.ts +0 -14
  410. package/components/identity.bans/operations/transit.js.map +0 -1
  411. package/components/identity.basic/operations/add.d.ts +0 -3
  412. package/components/identity.basic/operations/add.js.map +0 -1
  413. package/components/identity.basic/operations/authenticate.d.ts +0 -13
  414. package/components/identity.basic/operations/authenticate.js.map +0 -1
  415. package/components/identity.basic/operations/check.d.ts +0 -7
  416. package/components/identity.basic/operations/check.js.map +0 -1
  417. package/components/identity.basic/operations/delete.d.ts +0 -7
  418. package/components/identity.basic/operations/delete.js.map +0 -1
  419. package/components/identity.basic/operations/incept.d.ts +0 -12
  420. package/components/identity.basic/operations/incept.js.map +0 -1
  421. package/components/identity.basic/operations/info.d.ts +0 -10
  422. package/components/identity.basic/operations/info.js.map +0 -1
  423. package/components/identity.basic/operations/lib/credentials.d.ts +0 -5
  424. package/components/identity.basic/operations/lib/credentials.js.map +0 -1
  425. package/components/identity.basic/operations/transit.d.ts +0 -15
  426. package/components/identity.basic/operations/transit.js.map +0 -1
  427. package/components/identity.clients/operations/describe.d.ts +0 -27
  428. package/components/identity.clients/operations/describe.js.map +0 -1
  429. package/components/identity.clients/operations/lib/Context.d.ts +0 -29
  430. package/components/identity.clients/operations/lib/Context.js.map +0 -1
  431. package/components/identity.clients/operations/lib/Entity.d.ts +0 -29
  432. package/components/identity.clients/operations/lib/Entity.js.map +0 -1
  433. package/components/identity.clients/operations/lib/canonical.d.ts +0 -11
  434. package/components/identity.clients/operations/lib/canonical.js.map +0 -1
  435. package/components/identity.clients/operations/lib/cimd.d.ts +0 -8
  436. package/components/identity.clients/operations/lib/cimd.js.map +0 -1
  437. package/components/identity.clients/operations/lib/errors.d.ts +0 -7
  438. package/components/identity.clients/operations/lib/errors.js.map +0 -1
  439. package/components/identity.clients/operations/lib/index.d.ts +0 -6
  440. package/components/identity.clients/operations/lib/index.js.map +0 -1
  441. package/components/identity.clients/operations/lib/redirect.d.ts +0 -10
  442. package/components/identity.clients/operations/lib/redirect.js.map +0 -1
  443. package/components/identity.clients/operations/register.d.ts +0 -37
  444. package/components/identity.clients/operations/register.js.map +0 -1
  445. package/components/identity.credentials/operations/list.d.ts +0 -52
  446. package/components/identity.credentials/operations/list.js.map +0 -1
  447. package/components/identity.federation/operations/authenticate.d.ts +0 -16
  448. package/components/identity.federation/operations/authenticate.js.map +0 -1
  449. package/components/identity.federation/operations/create.d.ts +0 -8
  450. package/components/identity.federation/operations/create.js.map +0 -1
  451. package/components/identity.federation/operations/decode.d.ts +0 -3
  452. package/components/identity.federation/operations/decode.js.map +0 -1
  453. package/components/identity.federation/operations/delete.d.ts +0 -8
  454. package/components/identity.federation/operations/delete.js.map +0 -1
  455. package/components/identity.federation/operations/incept.d.ts +0 -11
  456. package/components/identity.federation/operations/incept.js.map +0 -1
  457. package/components/identity.federation/operations/lib/Configuration.d.ts +0 -39
  458. package/components/identity.federation/operations/lib/Configuration.js.map +0 -1
  459. package/components/identity.federation/operations/lib/Ctx.d.ts +0 -8
  460. package/components/identity.federation/operations/lib/Ctx.js.map +0 -1
  461. package/components/identity.federation/operations/lib/Payload.d.ts +0 -5
  462. package/components/identity.federation/operations/lib/Payload.js.map +0 -1
  463. package/components/identity.federation/operations/lib/decode.d.ts +0 -3
  464. package/components/identity.federation/operations/lib/decode.js.map +0 -1
  465. package/components/identity.federation/operations/lib/discovery.d.ts +0 -5
  466. package/components/identity.federation/operations/lib/discovery.js.map +0 -1
  467. package/components/identity.federation/operations/lib/errors.d.ts +0 -77
  468. package/components/identity.federation/operations/lib/errors.js.map +0 -1
  469. package/components/identity.federation/operations/lib/exchange.d.ts +0 -3
  470. package/components/identity.federation/operations/lib/exchange.js.map +0 -1
  471. package/components/identity.federation/operations/lib/index.d.ts +0 -4
  472. package/components/identity.federation/operations/lib/index.js.map +0 -1
  473. package/components/identity.federation/operations/lib/jose.d.ts +0 -1
  474. package/components/identity.federation/operations/lib/jose.js.map +0 -1
  475. package/components/identity.federation/operations/lib/resolve.d.ts +0 -3
  476. package/components/identity.federation/operations/lib/resolve.js.map +0 -1
  477. package/components/identity.federation/operations/list.d.ts +0 -7
  478. package/components/identity.federation/operations/list.js.map +0 -1
  479. package/components/identity.federation/operations/types/Scheme.d.ts +0 -1
  480. package/components/identity.federation/operations/types/Scheme.js.map +0 -1
  481. package/components/identity.federation/operations/types/configuration.d.ts +0 -22
  482. package/components/identity.federation/operations/types/configuration.js.map +0 -1
  483. package/components/identity.federation/operations/types/context.d.ts +0 -36
  484. package/components/identity.federation/operations/types/context.js.map +0 -1
  485. package/components/identity.federation/operations/types/entity.d.ts +0 -9
  486. package/components/identity.federation/operations/types/entity.js.map +0 -1
  487. package/components/identity.federation/operations/types/index.d.ts +0 -4
  488. package/components/identity.federation/operations/types/index.js.map +0 -1
  489. package/components/identity.grants/operations/authorize.d.ts +0 -35
  490. package/components/identity.grants/operations/authorize.js.map +0 -1
  491. package/components/identity.grants/operations/exchange.d.ts +0 -37
  492. package/components/identity.grants/operations/exchange.js.map +0 -1
  493. package/components/identity.grants/operations/lib/code.d.ts +0 -15
  494. package/components/identity.grants/operations/lib/code.js.map +0 -1
  495. package/components/identity.grants/operations/lib/identify.d.ts +0 -6
  496. package/components/identity.grants/operations/lib/identify.js.map +0 -1
  497. package/components/identity.grants/operations/lib/index.d.ts +0 -3
  498. package/components/identity.grants/operations/lib/index.js.map +0 -1
  499. package/components/identity.grants/operations/list.d.ts +0 -13
  500. package/components/identity.grants/operations/list.js.map +0 -1
  501. package/components/identity.grants/operations/revoke.d.ts +0 -18
  502. package/components/identity.grants/operations/revoke.js.map +0 -1
  503. package/components/identity.keys/operations/create.d.ts +0 -22
  504. package/components/identity.keys/operations/create.js.map +0 -1
  505. package/components/identity.keys/operations/disable.d.ts +0 -5
  506. package/components/identity.keys/operations/disable.js.map +0 -1
  507. package/components/identity.keys/operations/revoke.d.ts +0 -15
  508. package/components/identity.keys/operations/revoke.js.map +0 -1
  509. package/components/identity.otp/operations/authenticate.d.ts +0 -12
  510. package/components/identity.otp/operations/authenticate.js.map +0 -1
  511. package/components/identity.otp/operations/issue.d.ts +0 -12
  512. package/components/identity.otp/operations/issue.js.map +0 -1
  513. package/components/identity.otp/operations/lib/Context.d.ts +0 -16
  514. package/components/identity.otp/operations/lib/Context.js.map +0 -1
  515. package/components/identity.otp/operations/lib/Entity.d.ts +0 -6
  516. package/components/identity.otp/operations/lib/Entity.js.map +0 -1
  517. package/components/identity.otp/operations/lib/index.d.ts +0 -1
  518. package/components/identity.otp/operations/lib/index.js.map +0 -1
  519. package/components/identity.passkeys/operations/authenticate.d.ts +0 -16
  520. package/components/identity.passkeys/operations/authenticate.js.map +0 -1
  521. package/components/identity.passkeys/operations/challenge.d.ts +0 -35
  522. package/components/identity.passkeys/operations/challenge.js.map +0 -1
  523. package/components/identity.passkeys/operations/create.d.ts +0 -19
  524. package/components/identity.passkeys/operations/create.js.map +0 -1
  525. package/components/identity.passkeys/operations/delete.d.ts +0 -8
  526. package/components/identity.passkeys/operations/delete.js.map +0 -1
  527. package/components/identity.passkeys/operations/lib/const.d.ts +0 -1
  528. package/components/identity.passkeys/operations/lib/const.js.map +0 -1
  529. package/components/identity.passkeys/operations/list.d.ts +0 -7
  530. package/components/identity.passkeys/operations/list.js.map +0 -1
  531. package/components/identity.passkeys/operations/types/Configuration.d.ts +0 -6
  532. package/components/identity.passkeys/operations/types/Configuration.js.map +0 -1
  533. package/components/identity.passkeys/operations/types/Context.d.ts +0 -16
  534. package/components/identity.passkeys/operations/types/Context.js.map +0 -1
  535. package/components/identity.passkeys/operations/types/Passkey.d.ts +0 -12
  536. package/components/identity.passkeys/operations/types/Passkey.js.map +0 -1
  537. package/components/identity.passkeys/operations/types/index.d.ts +0 -2
  538. package/components/identity.passkeys/operations/types/index.js.map +0 -1
  539. package/components/identity.passkeys/operations/use.d.ts +0 -16
  540. package/components/identity.passkeys/operations/use.js.map +0 -1
  541. package/components/identity.roles/operations/grant.d.ts +0 -10
  542. package/components/identity.roles/operations/grant.js.map +0 -1
  543. package/components/identity.roles/operations/lib/Entity.d.ts +0 -5
  544. package/components/identity.roles/operations/lib/Entity.js.map +0 -1
  545. package/components/identity.roles/operations/list.d.ts +0 -2
  546. package/components/identity.roles/operations/list.js.map +0 -1
  547. package/components/identity.roles/operations/principal.d.ts +0 -13
  548. package/components/identity.roles/operations/principal.js.map +0 -1
  549. package/components/identity.tokens/operations/authenticate.d.ts +0 -10
  550. package/components/identity.tokens/operations/authenticate.js.map +0 -1
  551. package/components/identity.tokens/operations/decrypt.d.ts +0 -16
  552. package/components/identity.tokens/operations/decrypt.js.map +0 -1
  553. package/components/identity.tokens/operations/encrypt.d.ts +0 -9
  554. package/components/identity.tokens/operations/encrypt.js.map +0 -1
  555. package/components/identity.tokens/operations/issue.d.ts +0 -25
  556. package/components/identity.tokens/operations/issue.js.map +0 -1
  557. package/components/identity.tokens/operations/lib/form.d.ts +0 -8
  558. package/components/identity.tokens/operations/lib/form.js.map +0 -1
  559. package/components/identity.tokens/operations/lib/index.d.ts +0 -4
  560. package/components/identity.tokens/operations/lib/index.js.map +0 -1
  561. package/components/identity.tokens/operations/lib/jose.d.ts +0 -1
  562. package/components/identity.tokens/operations/lib/jose.js.map +0 -1
  563. package/components/identity.tokens/operations/lib/key.d.ts +0 -1
  564. package/components/identity.tokens/operations/lib/key.js.map +0 -1
  565. package/components/identity.tokens/operations/lib/pad.d.ts +0 -1
  566. package/components/identity.tokens/operations/lib/pad.js.map +0 -1
  567. package/components/identity.tokens/operations/revoke.d.ts +0 -2
  568. package/components/identity.tokens/operations/revoke.js.map +0 -1
@@ -0,0 +1,36 @@
1
+ import assert from 'node:assert'
2
+ import { describe, it } from 'node:test'
3
+ import { Delegate } from './Delegate.js'
4
+ import type { Introspection } from '../../Introspection.js'
5
+
6
+ describe('auth:delegate', () => {
7
+ function explanation (): Introspection {
8
+ return {
9
+ input: {
10
+ type: 'object',
11
+ properties: {
12
+ identity: { type: 'object' },
13
+ title: { type: 'string' }
14
+ },
15
+ required: ['identity', 'title']
16
+ }
17
+ } as unknown as Introspection
18
+ }
19
+
20
+ it('should take the property it embeds out of the input', () => {
21
+ const delegate = new Delegate('identity', null as never)
22
+ const described = delegate.describe(explanation())
23
+ const input = described.input as { properties: object, required: string[] }
24
+
25
+ assert.deepStrictEqual(Object.keys(input.properties), ['title'])
26
+ assert.deepStrictEqual(input.required, ['title'])
27
+ })
28
+
29
+ it('should leave an input that does not declare it alone', () => {
30
+ const delegate = new Delegate('originator', null as never)
31
+ const described = delegate.describe(explanation())
32
+ const input = described.input as { properties: object }
33
+
34
+ assert.deepStrictEqual(Object.keys(input.properties), ['identity', 'title'])
35
+ })
36
+ })
@@ -1,5 +1,7 @@
1
1
  import { BadRequest } from '../../HTTP/index.js'
2
+ import { take } from '../../Introspection.js'
2
3
  import { Role } from './Role.js'
4
+ import type { Introspection } from '../../Introspection.js'
3
5
  import type { Context, Directive, Identity } from './types.js'
4
6
  import type { Component } from '@toa.io/core'
5
7
 
@@ -22,6 +24,18 @@ export class Delegate implements Directive {
22
24
  return true
23
25
  }
24
26
 
27
+ /** It admits whoever there is, and embedding the identity is the request's business. */
28
+ public admits (identity: Identity | null): boolean {
29
+ return identity !== null
30
+ }
31
+
32
+ /** The property it embeds is the identity's, so a caller has nothing to put there. */
33
+ public describe (introspection: Introspection): Introspection {
34
+ take(introspection, this.property)
35
+
36
+ return introspection
37
+ }
38
+
25
39
  private embed (body: unknown, identity: Identity): Record<string, unknown> {
26
40
  if (body === undefined)
27
41
  body = {}
@@ -12,6 +12,11 @@ export class Echo implements Directive {
12
12
  return true
13
13
  }
14
14
 
15
+ /** What `authorize` answers, without inventing the identity it would go on to invent. */
16
+ public admits (identity: Identity | null, context: Context): boolean {
17
+ return !(identity === null && 'authorization' in context.request.headers)
18
+ }
19
+
15
20
  public reply (context: Context): OutgoingMessage {
16
21
  const body = context.identity!
17
22
 
@@ -61,8 +61,9 @@ export class Incept implements Directive {
61
61
  throw new http.UnprocessableEntity(identity)
62
62
 
63
63
  identity.scheme = scheme
64
- identity.roles = []
65
64
 
65
+ // the roles are read where the token is minted: an Identity incepted as the principal
66
+ // has one already
66
67
  return identity
67
68
  }
68
69
 
@@ -36,6 +36,19 @@ export class Role implements Directive {
36
36
  return this.match(identity.roles, parameters)
37
37
  }
38
38
 
39
+ /** A role naming a route variable cannot be told from a description, which has no values. */
40
+ public async admits (identity: Identity | null): Promise<boolean | undefined> {
41
+ if (this.dynamic)
42
+ return undefined
43
+
44
+ if (identity === null)
45
+ return false
46
+
47
+ identity.roles ??= await Role.get(identity, this.discovery)
48
+
49
+ return this.match(identity.roles, [])
50
+ }
51
+
39
52
  private match (roles: string[], parameters: Parameter[]): boolean {
40
53
  const required = this.dynamic ? this.substitute(parameters) : this.roles
41
54
 
@@ -1,4 +1,5 @@
1
1
  import { type Parameter } from '../../RTD/index.js'
2
+ import type { Introspection } from '../../Introspection.js'
2
3
  import type { Context, Directive, Identity, Create } from './types.js'
3
4
 
4
5
  export class Rule implements Directive {
@@ -22,4 +23,32 @@ export class Rule implements Directive {
22
23
 
23
24
  return true
24
25
  }
26
+
27
+ /** Whatever each of them makes of it, in the order they were declared. */
28
+ public describe (introspection: Introspection): Introspection {
29
+ for (const directive of this.directives)
30
+ introspection = directive.describe?.(introspection) ?? introspection
31
+
32
+ return introspection
33
+ }
34
+
35
+ /** All of them, so one that refuses ends it and one that cannot tell leaves it untold. */
36
+ public async admits (identity: Identity | null, context: Context): Promise<boolean | undefined> {
37
+ let untold = false
38
+
39
+ for (const directive of this.directives) {
40
+ const admits = await directive.admits?.(identity, context)
41
+
42
+ if (admits === undefined) {
43
+ untold = true
44
+
45
+ continue
46
+ }
47
+
48
+ if (!admits)
49
+ return false
50
+ }
51
+
52
+ return untold ? undefined : true
53
+ }
25
54
  }
@@ -23,4 +23,9 @@ export class Scheme implements Directive {
23
23
 
24
24
  return false
25
25
  }
26
+
27
+ /** It admits nobody: it is there to refuse a scheme, not to authorize one. */
28
+ public admits (): boolean {
29
+ return false
30
+ }
26
31
  }
@@ -1,6 +1,7 @@
1
1
  import { type Component } from '@toa.io/core'
2
2
  import { type Maybe } from '@toa.io/core'
3
3
  import { type Parameter } from '../../RTD/index.js'
4
+ import type { Introspection } from '../../Introspection.js'
4
5
  import type * as http from '../../HTTP/index.js'
5
6
  import type * as io from '../../io.js'
6
7
 
@@ -13,6 +14,26 @@ export interface Directive {
13
14
  parameters: Parameter[]
14
15
  ) => boolean | Promise<boolean>
15
16
 
17
+ /**
18
+ * Whether this admits the identity where that can be told without a request — which is
19
+ * what describing a method is. `undefined` says it cannot be told: a directive reading a
20
+ * route variable's value or the body has neither here, and one that is not implemented
21
+ * says the same by its absence. Nothing here may have an effect on the request.
22
+ */
23
+ admits?: (
24
+ identity: Identity | null,
25
+ context: Context
26
+ ) => boolean | undefined | Promise<boolean | undefined>
27
+
28
+ /**
29
+ * What this directive makes of what the method says about itself, which is the reverse of
30
+ * what it does to a request: a property it fills from the identity is taken out of the
31
+ * input, because it is not the caller's to send — and a description that offers one invites
32
+ * a caller to name an identity that is not theirs. Nothing here may have an effect on the
33
+ * request.
34
+ */
35
+ describe?: (introspection: Introspection) => Introspection
36
+
16
37
  reply?: (context: Context) => http.OutgoingMessage | null
17
38
 
18
39
  settle?: (context: Context, response: http.OutgoingMessage) => Promise<void>
@@ -18,7 +18,7 @@ export class Cache implements DirectiveFamily<Directive> {
18
18
  return new Class(value)
19
19
  }
20
20
 
21
- public preflight (): Output {
21
+ public precall (): Output {
22
22
  return null
23
23
  }
24
24
 
@@ -19,7 +19,7 @@ export class Development implements DirectiveFamily<Directive> {
19
19
  return new Class(value)
20
20
  }
21
21
 
22
- public async preflight (directives: Directive[], input: Input): Promise<Output> {
22
+ public async precall (directives: Directive[], input: Input): Promise<Output> {
23
23
  let output = null
24
24
 
25
25
  for (const directive of directives) {
@@ -18,7 +18,7 @@ export class Flow implements DirectiveFamily<Directive> {
18
18
  return new Class(value, remotes)
19
19
  }
20
20
 
21
- public async preflight (directives: Directive[], input: Input, parameters: Parameter[]): Promise<Output> {
21
+ public async precall (directives: Directive[], input: Input, parameters: Parameter[]): Promise<Output> {
22
22
  for (const directive of directives) {
23
23
  if (directive.attach !== undefined)
24
24
  directive.attach(input)
@@ -5,11 +5,13 @@ import { dev } from './dev/index.js'
5
5
  import { octets } from './octets/index.js'
6
6
  import { io } from './io/index.js'
7
7
  import { map } from './map/index.js'
8
+ import { mcp } from './mcp/index.js'
8
9
  import { req } from './require/index.js'
9
10
  import { flow } from './flow/index.js'
10
11
  import { discovery } from './oauth/index.js'
11
12
  import type { DirectiveFamily } from '../RTD/index.js'
12
13
  import type { Interceptor } from '../Interception.js'
13
14
 
14
- export const families: DirectiveFamily[] = [authorization, io, cache, map, req, flow, octets, dev]
15
+ export const families: DirectiveFamily[] =
16
+ [authorization, io, cache, map, mcp, req, flow, octets, dev]
15
17
  export const interceptors: Interceptor[] = [cors, discovery]
@@ -4,7 +4,7 @@ import type { Input as Context } from '../../io.js'
4
4
  import type * as http from '../../HTTP/index.js'
5
5
 
6
6
  export interface Directive {
7
- preflight: (context: Context, parameters: Parameter[]) => void
7
+ precall: (context: Context, parameters: Parameter[]) => void
8
8
 
9
9
  /** Synchronous by contract: settling holds the response, and none of it needs I/O. */
10
10
  settle?: (context: Context, response: http.OutgoingMessage) => void
@@ -1,3 +1,4 @@
1
+ import { restrict } from '../../Introspection.js'
1
2
  import { Output } from './Output.js'
2
3
  import { Input } from './Input.js'
3
4
  import { Throttle } from './Throttle.js'
@@ -7,6 +8,7 @@ import type * as http from '../../HTTP/index.js'
7
8
  import type { Parameter, DirectiveFamily } from '../../RTD/index.js'
8
9
  import type { Remotes } from '../../Remotes.js'
9
10
  import type { Constructor, Directive } from './Directive.js'
11
+ import type { Introspection } from '../../Introspection.js'
10
12
  import { ATOM_GROUP } from '../../const.js'
11
13
  import type { extensions } from '@toa.io/core'
12
14
 
@@ -38,22 +40,49 @@ export class IO implements DirectiveFamily<Directive> {
38
40
  return new Directive(value, this.sync!, route)
39
41
  }
40
42
 
41
- public preflight (directives: Directive[], context: http.Context,
43
+ public precall (directives: Directive[], context: http.Context,
42
44
  parameters: Parameter[]): null {
43
45
  let restricted = false
44
46
 
45
47
  for (const directive of directives) {
46
48
  restricted ||= directive instanceof Output
47
49
 
48
- directive.preflight(context, parameters)
50
+ directive.precall(context, parameters)
49
51
  }
50
52
 
51
53
  if (!restricted)
52
- DENIAL.preflight(context, parameters)
54
+ DENIAL.precall(context, parameters)
53
55
 
54
56
  return null
55
57
  }
56
58
 
59
+ /**
60
+ * What a whitelist admits is what the schema states. Without an `io:output` the reply is
61
+ * dropped before it is sent, so there is no output to describe at all.
62
+ */
63
+ public explain (directives: Directive[], _: http.Context,
64
+ introspection: Introspection): Introspection {
65
+ let restricted = false
66
+
67
+ for (const directive of directives) {
68
+ if (directive instanceof Input)
69
+ introspection.input = restrict(introspection.input, directive.allowed)
70
+
71
+ if (!(directive instanceof Output))
72
+ continue
73
+
74
+ restricted = true
75
+
76
+ if (!directive.disabled)
77
+ introspection.output = restrict(introspection.output, directive.allowed)
78
+ }
79
+
80
+ if (!restricted)
81
+ delete introspection.output
82
+
83
+ return introspection
84
+ }
85
+
57
86
  public settle (directives: Directive[], context: http.Context,
58
87
  output: http.OutgoingMessage): void {
59
88
  for (const directive of directives)
@@ -5,7 +5,8 @@ import type { Directive } from './Directive.js'
5
5
  import type { Input as Context } from '../../io.js'
6
6
 
7
7
  export class Input implements Directive {
8
- private readonly allowed: Set<string>
8
+ /** what a client may send, which is therefore what the input schema states */
9
+ public readonly allowed: Set<string>
9
10
 
10
11
  public constructor (permissions: Permissions) {
11
12
  this.allowed = new Set(permissions)
@@ -15,7 +16,7 @@ export class Input implements Directive {
15
16
  schemas.input.validate<Permissions>(permissions, 'Incorrect \'io:input\' format')
16
17
  }
17
18
 
18
- public preflight (context: Context): void {
19
+ public precall (context: Context): void {
19
20
  // Restrictions are on what the client sent, so the check goes to the front of the
20
21
  // pipeline whatever order the families ran in: `auth:delegate` embeds the identity
21
22
  // and `map:*` assigns mapped properties, and those additions are the server's own,
@@ -7,10 +7,13 @@ import type { Input as Context } from '../../io.js'
7
7
  import type { OutgoingMessage } from '../../HTTP/index.js'
8
8
 
9
9
  export class Output implements Directive {
10
- private readonly disabled: boolean = false
10
+ /** whether the reply passes whole, which is when the schema is the operation's own */
11
+ public readonly disabled: boolean = false
12
+
13
+ /** what a reply may carry, which is therefore what the output schema states */
14
+ public readonly allowed: Set<string>
11
15
  private readonly omitted: boolean = true
12
16
  private readonly permissions: string[] = []
13
- private readonly allowed: Set<string>
14
17
 
15
18
  public constructor (permissions: Permissions) {
16
19
  if (typeof permissions === 'boolean')
@@ -29,7 +32,7 @@ export class Output implements Directive {
29
32
  schemas.output.validate(permissions, 'Incorrect \'io:output\' format')
30
33
  }
31
34
 
32
- public preflight (context: Context): void {
35
+ public precall (context: Context): void {
33
36
  context.pipelines.response.push(this.restriction(context))
34
37
  }
35
38
 
@@ -47,7 +47,7 @@ it('should have a reply it named the status of restricted, whatever that status
47
47
  const ctx = context()
48
48
  const output = new Output(['code', 'error'])
49
49
 
50
- output.preflight(ctx, [])
50
+ output.precall(ctx, [])
51
51
 
52
52
  const response: OutgoingMessage = {
53
53
  body: { status: stated, code: 'SplxlO', error: 'invalid_grant', secret: 'x' }
@@ -67,7 +67,7 @@ it('should leave a failure the gateway built alone, on such a route too', () =>
67
67
  const ctx = context()
68
68
  const output = new Output(['code'])
69
69
 
70
- output.preflight(ctx, [])
70
+ output.precall(ctx, [])
71
71
 
72
72
  // what `Server.fail` builds out of an exception, on a route that also declares `io:status`
73
73
  const response: OutgoingMessage = {
@@ -23,7 +23,7 @@ export class Status implements Directive {
23
23
  assert.ok(typeof value === 'string', '`io:status` must be a string')
24
24
  }
25
25
 
26
- public preflight (): void {
26
+ public precall (): void {
27
27
  // nothing to do until the operation has answered
28
28
  }
29
29
 
@@ -18,7 +18,7 @@ export class Throttle implements Directive {
18
18
  schemas.throttle.validate(declaration, 'Incorrect \'io:throttle\' format')
19
19
  }
20
20
 
21
- public preflight (context: http.Context, parameters: Parameter[]): void {
21
+ public precall (context: http.Context, parameters: Parameter[]): void {
22
22
  const retry = this.quotas.check(context, parameters)
23
23
 
24
24
  if (retry > 0)
@@ -34,7 +34,7 @@ export class Quotas {
34
34
  private readonly entries = new Map<string, Entry>()
35
35
 
36
36
  /**
37
- * The key computed at preflight, for settle to charge against.
37
+ * The key computed at precall, for settle to charge against.
38
38
  *
39
39
  * `segment` reads the route parameters, which settle is not given, and `identity`
40
40
  * can be refreshed between the two — so recomputing there would key a request
@@ -97,7 +97,7 @@ export class Quotas {
97
97
  if (!this.conditional || !this.keys.matches(input, output))
98
98
  return
99
99
 
100
- // preflight always runs first, and a request it refuses never reaches settle
100
+ // precall always runs first, and a request it refuses never reaches settle
101
101
  const key = this.keyed.get(input) ?? this.keys.get(input)
102
102
 
103
103
  if (key === undefined)
@@ -1,7 +1,9 @@
1
1
  import assert from 'node:assert'
2
2
  import { cors } from '../cors/index.js'
3
3
  import { Mapping } from './Mapping.js'
4
+ import { take } from '../../Introspection.js'
4
5
  import type { Input } from '../../io.js'
6
+ import type { Introspection } from '../../Introspection.js'
5
7
 
6
8
  /**
7
9
  * Forbidden request header names: the browser sets them itself and a script cannot
@@ -25,6 +27,15 @@ export class Headers extends Mapping<Record<string, string>> {
25
27
  this.headers.forEach((header) => cors.allow(header))
26
28
  }
27
29
 
30
+ public override explain (introspection: Introspection): void {
31
+ for (const [property, header] of Object.entries(this.value)) {
32
+ const schema = take(introspection, property)
33
+
34
+ introspection.headers ??= {}
35
+ introspection.headers[property] = { ...schema, header }
36
+ }
37
+ }
38
+
28
39
  public properties (context: Input): Record<string, string> {
29
40
  context.pipelines.response.push((response) => {
30
41
  response.headers ??= new global.Headers()
@@ -12,6 +12,7 @@ import type { Directive } from './Directive.js'
12
12
  import type { Properties } from './Properties.js'
13
13
  import type { DirectiveFamily, Parameter } from '../../RTD/index.js'
14
14
  import type { Input, Output } from '../../io.js'
15
+ import type { Introspection } from '../../Introspection.js'
15
16
  import type { Remotes } from '../../Remotes.js'
16
17
 
17
18
  export class Map implements DirectiveFamily {
@@ -31,7 +32,15 @@ export class Map implements DirectiveFamily {
31
32
  })
32
33
  }
33
34
 
34
- public async preflight (directives: Directive[], context: Input, parameters: Parameter[]): Promise<Output> {
35
+ public explain (directives: Directive[], _: Input, introspection: Introspection): Introspection {
36
+ for (const directive of directives)
37
+ if (directive instanceof Mapping)
38
+ directive.explain(introspection)
39
+
40
+ return introspection
41
+ }
42
+
43
+ public async precall (directives: Directive[], context: Input, parameters: Parameter[]): Promise<Output> {
35
44
  const properties = {}
36
45
 
37
46
  for (const directive of directives)
@@ -1,7 +1,9 @@
1
+ import { take } from '../../Introspection.js'
1
2
  import type { Remotes } from '../../Remotes.js'
2
3
  import type { Directive } from './Directive.js'
3
4
  import type { Input } from '../../io.js'
4
5
  import type { Parameter } from '../../RTD/index.js'
6
+ import type { Introspection } from '../../Introspection.js'
5
7
 
6
8
  export abstract class Mapping<T = unknown> {
7
9
  protected value: T
@@ -13,6 +15,27 @@ export abstract class Mapping<T = unknown> {
13
15
  }
14
16
 
15
17
  public abstract properties (context: Input, parameters: Parameter[], directives: Directive[]): Output
18
+
19
+ /**
20
+ * What this mapping does to what the method says about itself, which is the reverse of
21
+ * what it does to a request: a property the gateway fills is taken out of the input,
22
+ * because it is not the caller's to send.
23
+ *
24
+ * The default says nothing more than that. A claim, an authority and a language come
25
+ * from the request itself and there is nowhere for a caller to put one; a header and a
26
+ * segment are the caller's, and those say where.
27
+ */
28
+ public explain (introspection: Introspection): void {
29
+ for (const property of this.names())
30
+ take(introspection, property)
31
+ }
32
+
33
+ /** The input properties this mapping fills, however its value names them. */
34
+ protected names (): string[] {
35
+ return typeof this.value === 'string'
36
+ ? [this.value]
37
+ : Object.keys(this.value as object)
38
+ }
16
39
  }
17
40
 
18
41
  type Properties = Record<string, unknown> | null
@@ -1,6 +1,8 @@
1
1
  import assert from 'node:assert'
2
2
  import { Mapping } from './Mapping.js'
3
+ import { take } from '../../Introspection.js'
3
4
  import type { Parameter } from '../../RTD/index.js'
5
+ import type { Introspection, Schema } from '../../Introspection.js'
4
6
 
5
7
  export class Segments extends Mapping<Record<string, string>> {
6
8
  public constructor (map: Record<string, string>) {
@@ -12,6 +14,16 @@ export class Segments extends Mapping<Record<string, string>> {
12
14
  super(map)
13
15
  }
14
16
 
17
+ /** A segment is the caller's, so it moves to the route rather than out of sight. */
18
+ public override explain (introspection: Introspection): void {
19
+ for (const property of Object.keys(this.value)) {
20
+ const schema = take(introspection, property)
21
+
22
+ introspection.route ??= {}
23
+ introspection.route[property] = schema ?? ({ type: 'string' } as unknown as Schema)
24
+ }
25
+ }
26
+
15
27
  public override properties (_: unknown, parameters: Parameter[]): Record<string, string> {
16
28
  return Object.entries(this.value).reduce((properties: Record<string, string>, [property, parameter]) => {
17
29
  const cut = parameter[0] === '~'
@@ -0,0 +1,40 @@
1
+ import assert from 'node:assert'
2
+ import { Tool } from './Tool.js'
3
+ import type { Context } from '../../HTTP/index.js'
4
+ import type { Introspection } from '../../Introspection.js'
5
+ import type { DirectiveFamily } from '../../RTD/index.js'
6
+
7
+ /** The name the family is declared under, and what `MCP` asks a method for. */
8
+ export const FAMILY = 'mcp'
9
+
10
+ export class MCP implements DirectiveFamily<Tool> {
11
+ public readonly name = FAMILY
12
+ public readonly mandatory = false
13
+
14
+ /** What this method is published as, which is what the nearest declaration says. */
15
+ public static published (directives: Tool[] | undefined): Tool | null {
16
+ return directives?.[0] ?? null
17
+ }
18
+
19
+ // eslint-disable-next-line max-params
20
+ public create (name: string, value: unknown, _: unknown, route: string): Tool {
21
+ assert.ok(name === 'tool', `Unknown directive: mcp:${name}`)
22
+
23
+ return new Tool(value, route)
24
+ }
25
+
26
+ /** What the route states this method is, which is the only thing that states it. */
27
+ public explain (directives: Tool[], _: Context,
28
+ introspection: Introspection): Introspection {
29
+ const tool = MCP.published(directives)
30
+
31
+ if (tool === null)
32
+ return introspection
33
+
34
+ return {
35
+ ...introspection,
36
+ description: tool.description,
37
+ ...tool.title === undefined ? {} : { title: tool.title }
38
+ }
39
+ }
40
+ }