@toa.io/extensions.exposition 1.0.0-alpha.284 → 1.0.0-alpha.286

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 (620) hide show
  1. package/components/exposition.octets/operations/delete.js +1 -1
  2. package/components/exposition.octets/operations/get.js +5 -2
  3. package/components/exposition.octets/operations/head.js +1 -1
  4. package/components/exposition.octets/operations/put.js +29 -37
  5. package/components/exposition.octets/types/toa.d.ts +1 -1
  6. package/components/identity.bans/manifest.toa.yaml +12 -13
  7. package/components/identity.bans/migrations/0001-system-properties.yaml +14 -0
  8. package/components/identity.bans/operations/transit.js +1 -1
  9. package/components/identity.bans/source/transit.ts +1 -1
  10. package/components/identity.bans/tsconfig.tsbuildinfo +1 -1
  11. package/components/identity.bans/types/toa.d.ts +5 -5
  12. package/components/identity.basic/events/principal.js +3 -1
  13. package/components/identity.basic/manifest.toa.yaml +17 -23
  14. package/components/identity.basic/migrations/0001-system-properties.yaml +14 -0
  15. package/components/identity.basic/migrations/0002-indexes.yaml +13 -0
  16. package/components/identity.basic/operations/add.js +1 -1
  17. package/components/identity.basic/operations/authenticate.js +2 -2
  18. package/components/identity.basic/operations/check.js +4 -2
  19. package/components/identity.basic/operations/delete.js +1 -1
  20. package/components/identity.basic/operations/incept.js +1 -1
  21. package/components/identity.basic/operations/info.js +1 -1
  22. package/components/identity.basic/operations/lib/credentials.js +1 -1
  23. package/components/identity.basic/operations/transit.js +7 -8
  24. package/components/identity.basic/source/add.ts +5 -2
  25. package/components/identity.basic/source/authenticate.ts +11 -13
  26. package/components/identity.basic/source/check.ts +9 -6
  27. package/components/identity.basic/source/delete.ts +4 -1
  28. package/components/identity.basic/source/incept.ts +13 -10
  29. package/components/identity.basic/source/info.ts +4 -1
  30. package/components/identity.basic/source/lib/credentials.ts +2 -3
  31. package/components/identity.basic/source/transit.ts +27 -21
  32. package/components/identity.basic/tsconfig.tsbuildinfo +1 -1
  33. package/components/identity.basic/types/index.d.ts +7 -3
  34. package/components/identity.basic/types/toa.d.ts +5 -5
  35. package/components/identity.clients/manifest.toa.yaml +36 -40
  36. package/components/identity.clients/migrations/0001-system-properties.yaml +14 -0
  37. package/components/identity.clients/migrations/0002-indexes.yaml +4 -0
  38. package/components/identity.clients/operations/describe.js +1 -1
  39. package/components/identity.clients/operations/lib/canonical.js +1 -1
  40. package/components/identity.clients/operations/lib/cimd.js +3 -2
  41. package/components/identity.clients/operations/lib/redirect.js +7 -4
  42. package/components/identity.clients/operations/register.js +2 -2
  43. package/components/identity.clients/source/describe.ts +6 -8
  44. package/components/identity.clients/source/lib/Context.ts +6 -3
  45. package/components/identity.clients/source/lib/Entity.ts +1 -1
  46. package/components/identity.clients/source/lib/canonical.ts +1 -1
  47. package/components/identity.clients/source/lib/cimd.test.ts +8 -6
  48. package/components/identity.clients/source/lib/cimd.ts +24 -19
  49. package/components/identity.clients/source/lib/redirect.test.ts +8 -2
  50. package/components/identity.clients/source/lib/redirect.ts +12 -8
  51. package/components/identity.clients/source/register.ts +18 -18
  52. package/components/identity.clients/tsconfig.tsbuildinfo +1 -1
  53. package/components/identity.clients/types/toa.d.ts +5 -5
  54. package/components/identity.credentials/manifest.toa.yaml +4 -4
  55. package/components/identity.credentials/operations/list.js +8 -4
  56. package/components/identity.credentials/source/list.test.ts +39 -20
  57. package/components/identity.credentials/source/list.ts +12 -8
  58. package/components/identity.credentials/tsconfig.tsbuildinfo +1 -1
  59. package/components/identity.credentials/types/toa.d.ts +2 -2
  60. package/components/identity.federation/manifest.toa.yaml +23 -32
  61. package/components/identity.federation/migrations/0001-system-properties.yaml +14 -0
  62. package/components/identity.federation/migrations/0002-indexes.yaml +25 -0
  63. package/components/identity.federation/operations/authenticate.js +4 -2
  64. package/components/identity.federation/operations/create.js +2 -2
  65. package/components/identity.federation/operations/decode.js +1 -1
  66. package/components/identity.federation/operations/delete.js +1 -1
  67. package/components/identity.federation/operations/incept.js +1 -1
  68. package/components/identity.federation/operations/lib/decode.js +1 -1
  69. package/components/identity.federation/operations/lib/discovery.js +2 -2
  70. package/components/identity.federation/operations/lib/exchange.js +8 -4
  71. package/components/identity.federation/operations/lib/principal.js +1 -1
  72. package/components/identity.federation/operations/lib/resolve.js +1 -1
  73. package/components/identity.federation/operations/list.js +2 -2
  74. package/components/identity.federation/source/authenticate.ts +19 -17
  75. package/components/identity.federation/source/create.ts +6 -7
  76. package/components/identity.federation/source/decode.ts +4 -1
  77. package/components/identity.federation/source/delete.ts +4 -1
  78. package/components/identity.federation/source/incept.ts +2 -3
  79. package/components/identity.federation/source/lib/decode.ts +4 -7
  80. package/components/identity.federation/source/lib/discovery.test.ts +15 -5
  81. package/components/identity.federation/source/lib/discovery.ts +10 -9
  82. package/components/identity.federation/source/lib/exchange.ts +18 -15
  83. package/components/identity.federation/source/lib/jose.d.ts +1 -1
  84. package/components/identity.federation/source/lib/principal.ts +5 -3
  85. package/components/identity.federation/source/lib/resolve.ts +5 -1
  86. package/components/identity.federation/source/list.test.ts +26 -10
  87. package/components/identity.federation/source/list.ts +5 -2
  88. package/components/identity.federation/source/types/context.ts +5 -2
  89. package/components/identity.federation/source/types/entity.ts +2 -2
  90. package/components/identity.federation/tsconfig.tsbuildinfo +1 -1
  91. package/components/identity.federation/types/toa.d.ts +5 -5
  92. package/components/identity.grants/manifest.toa.yaml +27 -31
  93. package/components/identity.grants/migrations/0001-system-properties.yaml +14 -0
  94. package/components/identity.grants/migrations/0002-indexes.yaml +5 -0
  95. package/components/identity.grants/operations/authorize.js +1 -1
  96. package/components/identity.grants/operations/exchange.js +5 -2
  97. package/components/identity.grants/operations/lib/code.js +1 -1
  98. package/components/identity.grants/operations/lib/identify.js +1 -1
  99. package/components/identity.grants/operations/list.js +1 -1
  100. package/components/identity.grants/operations/revoke.js +3 -2
  101. package/components/identity.grants/source/authorize.ts +27 -19
  102. package/components/identity.grants/source/exchange.ts +15 -11
  103. package/components/identity.grants/source/lib/code.ts +20 -8
  104. package/components/identity.grants/source/lib/identify.ts +1 -1
  105. package/components/identity.grants/source/list.ts +2 -2
  106. package/components/identity.grants/source/revoke.ts +9 -7
  107. package/components/identity.grants/tsconfig.tsbuildinfo +1 -1
  108. package/components/identity.grants/types/index.d.ts +3 -3
  109. package/components/identity.grants/types/toa.d.ts +5 -5
  110. package/components/identity.keys/manifest.toa.yaml +18 -23
  111. package/components/identity.keys/migrations/0001-system-properties.yaml +14 -0
  112. package/components/identity.keys/migrations/0002-indexes.yaml +4 -0
  113. package/components/identity.keys/operations/create.js +1 -1
  114. package/components/identity.keys/operations/disable.js +1 -1
  115. package/components/identity.keys/operations/revoke.js +1 -1
  116. package/components/identity.keys/source/create.ts +2 -3
  117. package/components/identity.keys/source/disable.ts +1 -1
  118. package/components/identity.keys/source/revoke.ts +2 -2
  119. package/components/identity.keys/tsconfig.tsbuildinfo +1 -1
  120. package/components/identity.keys/types/toa.d.ts +5 -5
  121. package/components/identity.otp/manifest.toa.yaml +16 -24
  122. package/components/identity.otp/migrations/0001-system-properties.yaml +14 -0
  123. package/components/identity.otp/migrations/0002-indexes.yaml +5 -0
  124. package/components/identity.otp/operations/authenticate.js +1 -1
  125. package/components/identity.otp/operations/issue.js +1 -1
  126. package/components/identity.otp/source/authenticate.ts +4 -7
  127. package/components/identity.otp/source/issue.ts +1 -1
  128. package/components/identity.otp/source/lib/Context.ts +1 -1
  129. package/components/identity.otp/tsconfig.tsbuildinfo +1 -1
  130. package/components/identity.otp/types/toa.d.ts +5 -5
  131. package/components/identity.passkeys/manifest.toa.yaml +45 -53
  132. package/components/identity.passkeys/migrations/0001-system-properties.yaml +14 -0
  133. package/components/identity.passkeys/migrations/0002-indexes.yaml +11 -0
  134. package/components/identity.passkeys/operations/authenticate.js +1 -1
  135. package/components/identity.passkeys/operations/challenge.js +6 -3
  136. package/components/identity.passkeys/operations/create.js +1 -1
  137. package/components/identity.passkeys/operations/delete.js +1 -1
  138. package/components/identity.passkeys/operations/list.js +1 -1
  139. package/components/identity.passkeys/operations/use.js +1 -1
  140. package/components/identity.passkeys/source/authenticate.ts +3 -4
  141. package/components/identity.passkeys/source/challenge.ts +29 -25
  142. package/components/identity.passkeys/source/create.ts +8 -6
  143. package/components/identity.passkeys/source/delete.ts +4 -1
  144. package/components/identity.passkeys/source/list.ts +4 -1
  145. package/components/identity.passkeys/source/types/Context.ts +1 -1
  146. package/components/identity.passkeys/source/use.ts +12 -10
  147. package/components/identity.passkeys/tsconfig.tsbuildinfo +1 -1
  148. package/components/identity.passkeys/types/toa.d.ts +5 -5
  149. package/components/identity.roles/manifest.toa.yaml +12 -16
  150. package/components/identity.roles/migrations/0001-system-properties.yaml +14 -0
  151. package/components/identity.roles/migrations/0002-indexes.yaml +8 -0
  152. package/components/identity.roles/operations/grant.js +1 -1
  153. package/components/identity.roles/operations/list.js +1 -1
  154. package/components/identity.roles/operations/principal.js +2 -2
  155. package/components/identity.roles/source/grant.ts +7 -6
  156. package/components/identity.roles/source/list.ts +1 -1
  157. package/components/identity.roles/source/principal.ts +5 -7
  158. package/components/identity.roles/tsconfig.tsbuildinfo +1 -1
  159. package/components/identity.roles/types/toa.d.ts +5 -5
  160. package/components/identity.tokens/manifest.toa.yaml +17 -15
  161. package/components/identity.tokens/migrations/0001-system-properties.yaml +14 -0
  162. package/components/identity.tokens/operations/authenticate.js +2 -2
  163. package/components/identity.tokens/operations/decrypt.js +11 -5
  164. package/components/identity.tokens/operations/encrypt.js +2 -2
  165. package/components/identity.tokens/operations/issue.js +2 -4
  166. package/components/identity.tokens/operations/lib/form.js +1 -1
  167. package/components/identity.tokens/operations/lib/key.js +1 -1
  168. package/components/identity.tokens/operations/revoke.js +1 -1
  169. package/components/identity.tokens/source/authenticate.test.ts +22 -16
  170. package/components/identity.tokens/source/authenticate.ts +7 -10
  171. package/components/identity.tokens/source/decrypt.test.ts +62 -29
  172. package/components/identity.tokens/source/decrypt.ts +30 -27
  173. package/components/identity.tokens/source/encrypt.test.ts +21 -16
  174. package/components/identity.tokens/source/encrypt.ts +8 -11
  175. package/components/identity.tokens/source/issue.test.ts +4 -2
  176. package/components/identity.tokens/source/issue.ts +6 -8
  177. package/components/identity.tokens/source/lib/form.ts +5 -9
  178. package/components/identity.tokens/source/lib/jose.d.ts +1 -1
  179. package/components/identity.tokens/source/lib/key.ts +1 -1
  180. package/components/identity.tokens/source/lib/paseto.test.ts +17 -6
  181. package/components/identity.tokens/source/revoke.ts +1 -1
  182. package/components/identity.tokens/tsconfig.tsbuildinfo +1 -1
  183. package/components/identity.tokens/types/index.d.ts +13 -4
  184. package/components/identity.tokens/types/toa.d.ts +5 -5
  185. package/context.toa.yaml +2 -2
  186. package/cucumber.mjs +3 -0
  187. package/documentation/access.md +4 -3
  188. package/documentation/cache.md +17 -3
  189. package/documentation/components.md +2 -2
  190. package/documentation/credentials.md +2 -2
  191. package/documentation/identity.md +7 -9
  192. package/documentation/map.md +2 -2
  193. package/documentation/mcp.md +23 -17
  194. package/documentation/notes/peers.md +1 -1
  195. package/documentation/notes/throttling.md +1 -1
  196. package/documentation/octets.md +4 -4
  197. package/documentation/protocol.md +3 -3
  198. package/documentation/query.md +14 -8
  199. package/documentation/rpc.md +45 -31
  200. package/documentation/tracing.md +3 -3
  201. package/documentation/tree.md +1 -1
  202. package/features/auth.assert.feature +2 -2
  203. package/features/auth.bearer.feature +1 -1
  204. package/features/auth.claims.feature +5 -5
  205. package/features/auth.incept.feature +2 -2
  206. package/features/authorities.federation.feature +1 -1
  207. package/features/configuration.feature +3 -4
  208. package/features/credentials.feature +9 -9
  209. package/features/dev.feature +1 -0
  210. package/features/dynamic.feature +1 -0
  211. package/features/errors.feature +21 -0
  212. package/features/etag.feature +0 -86
  213. package/features/identity.bans.feature +3 -3
  214. package/features/identity.basic.feature +9 -9
  215. package/features/identity.federation.feature +11 -11
  216. package/features/identity.tokens.custom.feature +5 -5
  217. package/features/identity.tokens.feature +2 -2
  218. package/features/interruptions.feature +1 -0
  219. package/features/introspection.map.feature +4 -4
  220. package/features/io.throttle.feature +1 -0
  221. package/features/map.feature +2 -2
  222. package/features/mcp.feature +32 -28
  223. package/features/oauth.grants.feature +1 -1
  224. package/features/octets.cloudinary.feature +1 -1
  225. package/features/octets.download.feature +1 -0
  226. package/features/require.feature +1 -2
  227. package/features/rpc.feature +21 -21
  228. package/features/steps/Captures.ts +1 -1
  229. package/features/steps/Cloudinary.ts +1 -2
  230. package/features/steps/Common.ts +4 -5
  231. package/features/steps/Components.ts +17 -12
  232. package/features/steps/Database.ts +42 -23
  233. package/features/steps/Gateway.ts +55 -71
  234. package/features/steps/HTTP.ts +12 -15
  235. package/features/steps/IDP.ts +118 -94
  236. package/features/steps/Identity.ts +3 -3
  237. package/features/steps/OTP.ts +3 -3
  238. package/features/steps/Parameters.ts +20 -10
  239. package/features/steps/Probe.ts +9 -7
  240. package/features/steps/Realtime.ts +40 -22
  241. package/features/steps/Workspace.ts +10 -7
  242. package/features/steps/components/audit/operations/record.js +1 -1
  243. package/features/steps/components/echo/operations/affect.js +1 -1
  244. package/features/steps/components/echo/operations/compute.js +1 -1
  245. package/features/steps/components/echo/operations/echo.js +1 -1
  246. package/features/steps/components/echo/operations/error.js +1 -1
  247. package/features/steps/components/echo/operations/identity.js +1 -1
  248. package/features/steps/components/echo/operations/parameters.js +1 -1
  249. package/features/steps/components/echo/operations/ping.js +1 -1
  250. package/features/steps/components/echo/operations/unwrap.js +1 -1
  251. package/features/steps/components/greeter/operations/greet.js +1 -1
  252. package/features/steps/components/notify/operations/send.js +1 -1
  253. package/features/steps/components/octets.tester/operations/authority.js +1 -1
  254. package/features/steps/components/octets.tester/operations/bar.js +1 -1
  255. package/features/steps/components/octets.tester/operations/baz.js +1 -1
  256. package/features/steps/components/octets.tester/operations/concat.js +1 -1
  257. package/features/steps/components/octets.tester/operations/echo.js +1 -1
  258. package/features/steps/components/octets.tester/operations/err.js +1 -1
  259. package/features/steps/components/octets.tester/operations/foo.js +1 -1
  260. package/features/steps/components/octets.tester/operations/id.js +1 -1
  261. package/features/steps/components/octets.tester/operations/identity.js +1 -1
  262. package/features/steps/components/octets.tester/operations/redirect.js +6 -4
  263. package/features/steps/components/octets.tester/operations/yex.js +1 -1
  264. package/features/steps/components/octets.tester/operations/yield.js +1 -1
  265. package/features/steps/components/orders/manifest.toa.yaml +10 -12
  266. package/features/steps/components/orders/operations/create.js +4 -2
  267. package/features/steps/components/pots/manifest.toa.yaml +15 -20
  268. package/features/steps/components/pots/migrations/0002-indexes.yaml +4 -0
  269. package/features/steps/components/pricing/operations/quote.js +1 -1
  270. package/features/steps/components/sequences/manifest.toa.yaml +0 -1
  271. package/features/steps/components/sequences/operations/numbers.js +1 -1
  272. package/features/steps/components/sequences/operations/tokens.js +3 -3
  273. package/features/steps/components/users/manifest.toa.yaml +3 -5
  274. package/features/steps/components/users/operations/create.js +1 -1
  275. package/features/steps/components/users.properties/manifest.toa.yaml +5 -6
  276. package/features/steps/map.ts +2 -2
  277. package/features/timestamps.feature +1 -1
  278. package/package.json +7 -7
  279. package/readme.md +11 -11
  280. package/schemas/annotation.cos.yaml +1 -3
  281. package/schemas/method.cos.yaml +2 -0
  282. package/source/Branch.test.ts +2 -2
  283. package/source/Branch.ts +3 -5
  284. package/source/Composition.ts +5 -5
  285. package/source/Directive.test.ts +38 -20
  286. package/source/Directive.ts +61 -47
  287. package/source/Endpoint.test.ts +1 -1
  288. package/source/Endpoint.ts +27 -92
  289. package/source/Factory.ts +26 -12
  290. package/source/Gateway.ts +87 -76
  291. package/source/HTTP/Context.ts +23 -30
  292. package/source/HTTP/Probe.ts +7 -9
  293. package/source/HTTP/Server.ts +88 -69
  294. package/source/HTTP/Timing.ts +6 -21
  295. package/source/HTTP/address.test.ts +8 -2
  296. package/source/HTTP/address.ts +2 -3
  297. package/source/HTTP/exceptions.ts +20 -18
  298. package/source/HTTP/formats/form.ts +1 -1
  299. package/source/HTTP/formats/json.ts +2 -2
  300. package/source/HTTP/formats/msgpack.ts +3 -4
  301. package/source/HTTP/formats/text.ts +2 -2
  302. package/source/HTTP/formats/yaml.test.ts +4 -1
  303. package/source/HTTP/formats/yaml.ts +14 -11
  304. package/source/HTTP/messages.test.ts +38 -28
  305. package/source/HTTP/messages.ts +44 -98
  306. package/source/Interception.ts +3 -4
  307. package/source/Introspection.ts +29 -14
  308. package/source/MCP/Server.ts +114 -54
  309. package/source/MCP/discover.ts +6 -7
  310. package/source/MCP/errors.ts +7 -8
  311. package/source/MCP/schema.test.ts +9 -3
  312. package/source/MCP/schema.ts +12 -16
  313. package/source/MCP/tools.ts +33 -27
  314. package/source/MCP/types.ts +4 -1
  315. package/source/Mapping.ts +25 -27
  316. package/source/Query.ts +58 -44
  317. package/source/RPC/Context.ts +8 -11
  318. package/source/RPC/Dispatcher.ts +46 -26
  319. package/source/RPC/errors.test.ts +41 -16
  320. package/source/RPC/errors.ts +9 -10
  321. package/source/RPC/names.test.ts +51 -32
  322. package/source/RPC/names.ts +26 -32
  323. package/source/RTD/Directives.ts +21 -10
  324. package/source/RTD/Endpoint.ts +4 -1
  325. package/source/RTD/Method.ts +8 -6
  326. package/source/RTD/Node.ts +32 -34
  327. package/source/RTD/Route.ts +18 -21
  328. package/source/RTD/Tree.ts +18 -18
  329. package/source/RTD/factory.ts +13 -16
  330. package/source/RTD/segment.ts +12 -10
  331. package/source/RTD/syntax/parse.test.ts +12 -6
  332. package/source/RTD/syntax/parse.ts +30 -26
  333. package/source/RTD/syntax/types.ts +17 -1
  334. package/source/RTD/walk.test.ts +64 -27
  335. package/source/Remotes.test.ts +25 -4
  336. package/source/Remotes.ts +9 -4
  337. package/source/Tenant.ts +12 -12
  338. package/source/deployment.ts +20 -20
  339. package/source/directives/auth/Anonymous.test.ts +8 -2
  340. package/source/directives/auth/Anonymous.ts +5 -8
  341. package/source/directives/auth/Anyone.ts +3 -3
  342. package/source/directives/auth/Assert.ts +10 -10
  343. package/source/directives/auth/Authorization.ts +83 -69
  344. package/source/directives/auth/Delegate.test.ts +2 -2
  345. package/source/directives/auth/Delegate.ts +8 -10
  346. package/source/directives/auth/Echo.ts +5 -8
  347. package/source/directives/auth/Federation.ts +30 -21
  348. package/source/directives/auth/Id.ts +7 -4
  349. package/source/directives/auth/Incept.ts +32 -26
  350. package/source/directives/auth/Input.ts +36 -20
  351. package/source/directives/auth/Role.test.ts +49 -23
  352. package/source/directives/auth/Role.ts +29 -22
  353. package/source/directives/auth/Rule.ts +13 -8
  354. package/source/directives/auth/Scheme.ts +7 -7
  355. package/source/directives/auth/create.ts +1 -1
  356. package/source/directives/auth/schemes.ts +1 -1
  357. package/source/directives/auth/split.ts +2 -3
  358. package/source/directives/auth/types.ts +5 -2
  359. package/source/directives/cache/Cache.ts +44 -9
  360. package/source/directives/cache/Control.ts +25 -26
  361. package/source/directives/cache/Exact.ts +1 -1
  362. package/source/directives/cache/etag.ts +38 -0
  363. package/source/directives/cors/CORS.ts +9 -7
  364. package/source/directives/dev/Development.ts +3 -4
  365. package/source/directives/dev/Faulty.ts +11 -6
  366. package/source/directives/dev/Sleep.ts +5 -7
  367. package/source/directives/dev/Stub.ts +2 -2
  368. package/source/directives/dev/Throw.ts +2 -2
  369. package/source/directives/flow/Compose.ts +26 -20
  370. package/source/directives/flow/Fetch.ts +15 -15
  371. package/source/directives/flow/Flow.ts +9 -8
  372. package/source/directives/index.ts +11 -2
  373. package/source/directives/io/IO.ts +29 -20
  374. package/source/directives/io/Input.ts +9 -12
  375. package/source/directives/io/Output.ts +20 -23
  376. package/source/directives/io/Status.test.ts +12 -8
  377. package/source/directives/io/Status.ts +9 -8
  378. package/source/directives/io/Throttle.ts +6 -7
  379. package/source/directives/io/lib/throttle/Configuration.test.ts +32 -23
  380. package/source/directives/io/lib/throttle/Configuration.ts +14 -9
  381. package/source/directives/io/lib/throttle/Keys.ts +15 -10
  382. package/source/directives/io/lib/throttle/Quotas.test.ts +33 -17
  383. package/source/directives/io/lib/throttle/Quotas.ts +20 -26
  384. package/source/directives/io/lib/throttle/Sync.test.ts +14 -10
  385. package/source/directives/io/lib/throttle/Sync.ts +9 -12
  386. package/source/directives/io/lib/throttle/Warning.ts +3 -4
  387. package/source/directives/io/lib/throttle/components/IP.ts +4 -5
  388. package/source/directives/io/lib/throttle/components/Identity.ts +1 -1
  389. package/source/directives/io/lib/throttle/components/Path.ts +1 -1
  390. package/source/directives/io/lib/throttle/components/Route.ts +2 -2
  391. package/source/directives/io/lib/throttle/components/Segment.ts +2 -2
  392. package/source/directives/io/lib/throttle/conditions/Status.ts +2 -2
  393. package/source/directives/io/schemas.test.ts +12 -6
  394. package/source/directives/map/Authority.ts +2 -2
  395. package/source/directives/map/Buffer.ts +2 -2
  396. package/source/directives/map/Claims.ts +25 -20
  397. package/source/directives/map/Headers.ts +17 -13
  398. package/source/directives/map/Language.ts +8 -5
  399. package/source/directives/map/Languages.ts +9 -3
  400. package/source/directives/map/Map.ts +25 -12
  401. package/source/directives/map/Mapping.ts +9 -6
  402. package/source/directives/map/Properties.ts +1 -1
  403. package/source/directives/map/Segments.ts +22 -15
  404. package/source/directives/mcp/MCP.ts +14 -5
  405. package/source/directives/mcp/Tool.test.ts +42 -6
  406. package/source/directives/mcp/Tool.ts +38 -7
  407. package/source/directives/oauth/Discovery.ts +7 -11
  408. package/source/directives/oauth/documents.ts +11 -14
  409. package/source/directives/octets/Context.ts +6 -3
  410. package/source/directives/octets/Delete.ts +33 -25
  411. package/source/directives/octets/Directive.ts +5 -1
  412. package/source/directives/octets/Get.ts +13 -21
  413. package/source/directives/octets/Octets.ts +20 -15
  414. package/source/directives/octets/Put.ts +62 -27
  415. package/source/directives/octets/Workflow.ts +18 -12
  416. package/source/directives/octets/bytes.ts +1 -1
  417. package/source/directives/octets/schemas.test.ts +8 -14
  418. package/source/directives/octets/workflows/Execution.ts +19 -21
  419. package/source/directives/octets/workflows/Workflow.ts +10 -7
  420. package/source/directives/require/Headers.ts +3 -4
  421. package/source/directives/require/Require.ts +3 -4
  422. package/source/exceptions.ts +19 -12
  423. package/source/index.ts +1 -1
  424. package/source/manifest.test.ts +4 -1
  425. package/source/manifest.ts +19 -13
  426. package/source/octets.d.ts +1 -1
  427. package/source/root.ts +3 -2
  428. package/source/schemas.test.ts +17 -3
  429. package/transpiled/Branch.js.map +1 -1
  430. package/transpiled/Composition.js.map +1 -1
  431. package/transpiled/Directive.js +6 -2
  432. package/transpiled/Directive.js.map +1 -1
  433. package/transpiled/Endpoint.d.ts +0 -2
  434. package/transpiled/Endpoint.js +11 -52
  435. package/transpiled/Endpoint.js.map +1 -1
  436. package/transpiled/Factory.d.ts +2 -1
  437. package/transpiled/Factory.js +1 -0
  438. package/transpiled/Factory.js.map +1 -1
  439. package/transpiled/Gateway.d.ts +2 -1
  440. package/transpiled/Gateway.js +24 -15
  441. package/transpiled/Gateway.js.map +1 -1
  442. package/transpiled/HTTP/Context.d.ts +0 -3
  443. package/transpiled/HTTP/Context.js +7 -9
  444. package/transpiled/HTTP/Context.js.map +1 -1
  445. package/transpiled/HTTP/Probe.js.map +1 -1
  446. package/transpiled/HTTP/Server.js +19 -4
  447. package/transpiled/HTTP/Server.js.map +1 -1
  448. package/transpiled/HTTP/Timing.d.ts +1 -2
  449. package/transpiled/HTTP/Timing.js +2 -10
  450. package/transpiled/HTTP/Timing.js.map +1 -1
  451. package/transpiled/HTTP/address.js.map +1 -1
  452. package/transpiled/HTTP/exceptions.js.map +1 -1
  453. package/transpiled/HTTP/formats/form.js.map +1 -1
  454. package/transpiled/HTTP/formats/json.js.map +1 -1
  455. package/transpiled/HTTP/formats/msgpack.js.map +1 -1
  456. package/transpiled/HTTP/formats/text.js.map +1 -1
  457. package/transpiled/HTTP/formats/yaml.js +4 -1
  458. package/transpiled/HTTP/formats/yaml.js.map +1 -1
  459. package/transpiled/HTTP/messages.d.ts +3 -2
  460. package/transpiled/HTTP/messages.js +1 -43
  461. package/transpiled/HTTP/messages.js.map +1 -1
  462. package/transpiled/Interception.js.map +1 -1
  463. package/transpiled/Introspection.d.ts +2 -0
  464. package/transpiled/Introspection.js +13 -2
  465. package/transpiled/Introspection.js.map +1 -1
  466. package/transpiled/MCP/Server.js +15 -4
  467. package/transpiled/MCP/Server.js.map +1 -1
  468. package/transpiled/MCP/discover.js.map +1 -1
  469. package/transpiled/MCP/errors.js.map +1 -1
  470. package/transpiled/MCP/schema.js +1 -1
  471. package/transpiled/MCP/schema.js.map +1 -1
  472. package/transpiled/MCP/tools.js +10 -6
  473. package/transpiled/MCP/tools.js.map +1 -1
  474. package/transpiled/MCP/types.d.ts +3 -1
  475. package/transpiled/Mapping.d.ts +2 -2
  476. package/transpiled/Mapping.js +3 -5
  477. package/transpiled/Mapping.js.map +1 -1
  478. package/transpiled/Query.d.ts +6 -2
  479. package/transpiled/Query.js +23 -8
  480. package/transpiled/Query.js.map +1 -1
  481. package/transpiled/RPC/Context.js +0 -7
  482. package/transpiled/RPC/Context.js.map +1 -1
  483. package/transpiled/RPC/Dispatcher.js +4 -1
  484. package/transpiled/RPC/Dispatcher.js.map +1 -1
  485. package/transpiled/RPC/errors.js.map +1 -1
  486. package/transpiled/RPC/names.d.ts +3 -2
  487. package/transpiled/RPC/names.js +1 -1
  488. package/transpiled/RPC/names.js.map +1 -1
  489. package/transpiled/RTD/Directives.d.ts +1 -1
  490. package/transpiled/RTD/Method.js +1 -3
  491. package/transpiled/RTD/Method.js.map +1 -1
  492. package/transpiled/RTD/Node.js +5 -4
  493. package/transpiled/RTD/Node.js.map +1 -1
  494. package/transpiled/RTD/Route.js +4 -1
  495. package/transpiled/RTD/Route.js.map +1 -1
  496. package/transpiled/RTD/Tree.js +1 -1
  497. package/transpiled/RTD/Tree.js.map +1 -1
  498. package/transpiled/RTD/factory.js.map +1 -1
  499. package/transpiled/RTD/segment.js.map +1 -1
  500. package/transpiled/RTD/syntax/parse.js.map +1 -1
  501. package/transpiled/RTD/syntax/types.d.ts +6 -0
  502. package/transpiled/RTD/syntax/types.js +10 -1
  503. package/transpiled/RTD/syntax/types.js.map +1 -1
  504. package/transpiled/Remotes.js.map +1 -1
  505. package/transpiled/Tenant.d.ts +1 -1
  506. package/transpiled/Tenant.js.map +1 -1
  507. package/transpiled/deployment.d.ts +3 -0
  508. package/transpiled/deployment.js +6 -1
  509. package/transpiled/deployment.js.map +1 -1
  510. package/transpiled/directives/auth/Anonymous.js +1 -3
  511. package/transpiled/directives/auth/Anonymous.js.map +1 -1
  512. package/transpiled/directives/auth/Anyone.js.map +1 -1
  513. package/transpiled/directives/auth/Assert.js.map +1 -1
  514. package/transpiled/directives/auth/Authorization.js +7 -3
  515. package/transpiled/directives/auth/Authorization.js.map +1 -1
  516. package/transpiled/directives/auth/Delegate.js.map +1 -1
  517. package/transpiled/directives/auth/Echo.js +1 -3
  518. package/transpiled/directives/auth/Echo.js.map +1 -1
  519. package/transpiled/directives/auth/Federation.js +3 -7
  520. package/transpiled/directives/auth/Federation.js.map +1 -1
  521. package/transpiled/directives/auth/Id.js.map +1 -1
  522. package/transpiled/directives/auth/Incept.js +1 -1
  523. package/transpiled/directives/auth/Incept.js.map +1 -1
  524. package/transpiled/directives/auth/Input.js.map +1 -1
  525. package/transpiled/directives/auth/Role.js.map +1 -1
  526. package/transpiled/directives/auth/Rule.js.map +1 -1
  527. package/transpiled/directives/auth/Scheme.js +1 -2
  528. package/transpiled/directives/auth/Scheme.js.map +1 -1
  529. package/transpiled/directives/auth/create.js.map +1 -1
  530. package/transpiled/directives/auth/schemes.js.map +1 -1
  531. package/transpiled/directives/auth/split.js.map +1 -1
  532. package/transpiled/directives/auth/types.d.ts +3 -1
  533. package/transpiled/directives/cache/Cache.js +28 -2
  534. package/transpiled/directives/cache/Cache.js.map +1 -1
  535. package/transpiled/directives/cache/Control.js +1 -1
  536. package/transpiled/directives/cache/Control.js.map +1 -1
  537. package/transpiled/directives/cache/etag.d.ts +10 -0
  538. package/transpiled/directives/cache/etag.js +30 -0
  539. package/transpiled/directives/cache/etag.js.map +1 -0
  540. package/transpiled/directives/cors/CORS.js.map +1 -1
  541. package/transpiled/directives/dev/Development.js.map +1 -1
  542. package/transpiled/directives/dev/Faulty.js.map +1 -1
  543. package/transpiled/directives/dev/Sleep.js.map +1 -1
  544. package/transpiled/directives/dev/Stub.js.map +1 -1
  545. package/transpiled/directives/dev/Throw.js.map +1 -1
  546. package/transpiled/directives/flow/Compose.js +7 -3
  547. package/transpiled/directives/flow/Compose.js.map +1 -1
  548. package/transpiled/directives/flow/Fetch.js.map +1 -1
  549. package/transpiled/directives/flow/Flow.js.map +1 -1
  550. package/transpiled/directives/index.js +11 -1
  551. package/transpiled/directives/index.js.map +1 -1
  552. package/transpiled/directives/io/IO.d.ts +1 -1
  553. package/transpiled/directives/io/IO.js.map +1 -1
  554. package/transpiled/directives/io/Input.js +1 -1
  555. package/transpiled/directives/io/Input.js.map +1 -1
  556. package/transpiled/directives/io/Output.js +3 -3
  557. package/transpiled/directives/io/Output.js.map +1 -1
  558. package/transpiled/directives/io/Status.js.map +1 -1
  559. package/transpiled/directives/io/Throttle.js +1 -1
  560. package/transpiled/directives/io/Throttle.js.map +1 -1
  561. package/transpiled/directives/io/lib/throttle/Configuration.js +8 -2
  562. package/transpiled/directives/io/lib/throttle/Configuration.js.map +1 -1
  563. package/transpiled/directives/io/lib/throttle/Keys.js.map +1 -1
  564. package/transpiled/directives/io/lib/throttle/Quotas.js +4 -3
  565. package/transpiled/directives/io/lib/throttle/Quotas.js.map +1 -1
  566. package/transpiled/directives/io/lib/throttle/Sync.d.ts +1 -1
  567. package/transpiled/directives/io/lib/throttle/Sync.js.map +1 -1
  568. package/transpiled/directives/io/lib/throttle/Warning.js.map +1 -1
  569. package/transpiled/directives/io/lib/throttle/components/IP.js.map +1 -1
  570. package/transpiled/directives/io/lib/throttle/components/Identity.js.map +1 -1
  571. package/transpiled/directives/io/lib/throttle/components/Path.js.map +1 -1
  572. package/transpiled/directives/io/lib/throttle/components/Route.js.map +1 -1
  573. package/transpiled/directives/io/lib/throttle/components/Segment.js.map +1 -1
  574. package/transpiled/directives/io/lib/throttle/conditions/Status.js.map +1 -1
  575. package/transpiled/directives/map/Authority.js.map +1 -1
  576. package/transpiled/directives/map/Buffer.js.map +1 -1
  577. package/transpiled/directives/map/Claims.js.map +1 -1
  578. package/transpiled/directives/map/Headers.js.map +1 -1
  579. package/transpiled/directives/map/Language.js.map +1 -1
  580. package/transpiled/directives/map/Languages.js.map +1 -1
  581. package/transpiled/directives/map/Map.js.map +1 -1
  582. package/transpiled/directives/map/Mapping.js.map +1 -1
  583. package/transpiled/directives/map/Properties.js.map +1 -1
  584. package/transpiled/directives/map/Segments.js.map +1 -1
  585. package/transpiled/directives/mcp/MCP.js +7 -1
  586. package/transpiled/directives/mcp/MCP.js.map +1 -1
  587. package/transpiled/directives/mcp/Tool.d.ts +6 -1
  588. package/transpiled/directives/mcp/Tool.js +16 -3
  589. package/transpiled/directives/mcp/Tool.js.map +1 -1
  590. package/transpiled/directives/oauth/Discovery.js.map +1 -1
  591. package/transpiled/directives/oauth/documents.js.map +1 -1
  592. package/transpiled/directives/octets/Context.js +1 -1
  593. package/transpiled/directives/octets/Context.js.map +1 -1
  594. package/transpiled/directives/octets/Delete.js.map +1 -1
  595. package/transpiled/directives/octets/Directive.js.map +1 -1
  596. package/transpiled/directives/octets/Get.js.map +1 -1
  597. package/transpiled/directives/octets/Octets.js +1 -1
  598. package/transpiled/directives/octets/Octets.js.map +1 -1
  599. package/transpiled/directives/octets/Put.js.map +1 -1
  600. package/transpiled/directives/octets/Workflow.js.map +1 -1
  601. package/transpiled/directives/octets/bytes.js.map +1 -1
  602. package/transpiled/directives/octets/workflows/Execution.js +1 -2
  603. package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
  604. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
  605. package/transpiled/directives/require/Headers.js.map +1 -1
  606. package/transpiled/directives/require/Require.js.map +1 -1
  607. package/transpiled/exceptions.js.map +1 -1
  608. package/transpiled/index.d.ts +1 -1
  609. package/transpiled/index.js +1 -1
  610. package/transpiled/index.js.map +1 -1
  611. package/transpiled/manifest.js +5 -1
  612. package/transpiled/manifest.js.map +1 -1
  613. package/transpiled/root.js.map +1 -1
  614. package/tsconfig.tsbuildinfo +1 -1
  615. package/CHANGELOG.md +0 -541
  616. package/source/redact.test.ts +0 -27
  617. package/source/redact.ts +0 -21
  618. package/transpiled/redact.d.ts +0 -5
  619. package/transpiled/redact.js +0 -17
  620. package/transpiled/redact.js.map +0 -1
@@ -42,15 +42,17 @@ export class Server {
42
42
  private readonly discovery: Discovery
43
43
  private readonly origins: Set<string>
44
44
 
45
- public constructor (options: MCP, tree: Tree) {
45
+ public constructor(options: MCP, tree: Tree) {
46
46
  this.options = options
47
47
  this.tree = tree
48
48
  this.discovery = discovery(options)
49
49
  this.origins = new Set(options.origins ?? [])
50
50
  }
51
51
 
52
- public async process (context: http.Context,
53
- route: http.Processor): Promise<http.OutgoingMessage> {
52
+ public async process(
53
+ context: http.Context,
54
+ route: http.Processor
55
+ ): Promise<http.OutgoingMessage> {
54
56
  if (context.request.method !== 'POST')
55
57
  throw new http.MethodNotAllowed(new Headers({ allow: 'POST' }))
56
58
 
@@ -60,14 +62,12 @@ export class Server {
60
62
  const version = this.version(context, message)
61
63
  const modern = version === MODERN
62
64
 
63
- if (modern)
64
- this.mirrored(context, message)
65
+ if (modern) this.mirrored(context, message)
65
66
 
66
67
  const result = await this.answer({ context, route, tree: this.tree }, message, modern)
67
68
 
68
69
  // a notification is answered by not answering, and there is nothing here to remember
69
- if (message.id === undefined)
70
- return { status: ACCEPTED }
70
+ if (message.id === undefined) return { status: ACCEPTED }
71
71
 
72
72
  return {
73
73
  status: OK,
@@ -77,21 +77,24 @@ export class Server {
77
77
  }
78
78
 
79
79
  /** Who may reach the endpoint at all, before anything it carries is read. */
80
- private admit (context: http.Context): void {
80
+ private admit(context: http.Context): void {
81
81
  const origin = context.request.headers.origin
82
82
 
83
83
  // the revision requires this against DNS rebinding; a request without one is no browser's
84
84
  if (origin !== undefined && !this.origins.has(origin))
85
85
  throw new http.Forbidden('Origin is not allowed')
86
86
 
87
- if (this.options.anonymous === true)
88
- return
87
+ if (this.options.anonymous === true) return
89
88
 
90
89
  if ((context as { identity?: unknown }).identity == null)
91
90
  throw new http.Unauthorized()
92
91
  }
93
92
 
94
- private async answer (scope: Scope, message: Message, modern: boolean): Promise<unknown> {
93
+ private async answer(
94
+ scope: Scope,
95
+ message: Message,
96
+ modern: boolean
97
+ ): Promise<unknown> {
95
98
  const params = message.params ?? {}
96
99
 
97
100
  switch (message.method) {
@@ -99,7 +102,11 @@ export class Server {
99
102
  return this.complete(this.discovery.modern, modern, DISCOVERY_CACHE)
100
103
 
101
104
  case 'tools/list':
102
- return this.complete({ tools: await list(this.tree, scope.context) }, modern, TOOLS_CACHE)
105
+ return this.complete(
106
+ { tools: await list(this.tree, scope.context) },
107
+ modern,
108
+ TOOLS_CACHE
109
+ )
103
110
 
104
111
  case 'tools/call':
105
112
  return this.complete(await this.tool(scope, params), modern)
@@ -115,66 +122,98 @@ export class Server {
115
122
  return {}
116
123
 
117
124
  default:
118
- throw new http.NotFound(response(message.id ?? null,
119
- failure(METHOD_NOT_FOUND, `'${message.method}' is not a method this server answers`)))
125
+ throw new http.NotFound(
126
+ response(
127
+ message.id ?? null,
128
+ failure(
129
+ METHOD_NOT_FOUND,
130
+ `'${message.method}' is not a method this server answers`
131
+ )
132
+ )
133
+ )
120
134
  }
121
135
  }
122
136
 
123
- private async tool (scope: Scope, params: Params): Promise<object> {
137
+ private async tool(scope: Scope, params: Params): Promise<object> {
124
138
  const named = params.name
125
139
 
126
140
  if (typeof named !== 'string')
127
- throw new http.BadRequest(response(null,
128
- failure(INVALID_PARAMS, '`tools/call` states the tool it calls by name')))
141
+ throw new http.BadRequest(
142
+ response(
143
+ null,
144
+ failure(INVALID_PARAMS, '`tools/call` states the tool it calls by name')
145
+ )
146
+ )
129
147
 
130
148
  const args = params.arguments ?? {}
131
149
 
132
150
  if (typeof args !== 'object' || args === null || Array.isArray(args))
133
- throw new http.BadRequest(response(null,
134
- failure(INVALID_PARAMS, '`arguments` must be an object')))
135
-
136
- return await console.span({ name: named },
137
- async () => await call(scope, named, args as Params))
151
+ throw new http.BadRequest(
152
+ response(null, failure(INVALID_PARAMS, '`arguments` must be an object'))
153
+ )
154
+
155
+ return await console.span(
156
+ { name: named },
157
+ async () => await call(scope, named, args as Params)
158
+ )
138
159
  }
139
160
 
140
161
  /**
141
162
  * Every result of the modern revision says what kind it is, and who answered it. Where the
142
163
  * revision names the operation as one whose result may be held, it says that too, and must.
143
164
  */
144
- private complete (result: object, modern: boolean, cache?: Cache): object {
165
+ private complete(result: object, modern: boolean, cache?: Cache): object {
145
166
  return modern
146
- ? { ...result, ...cache, resultType: 'complete', _meta: { [SERVER_INFO]: this.serverInfo() } }
167
+ ? {
168
+ ...result,
169
+ ...cache,
170
+ resultType: 'complete',
171
+ _meta: { [SERVER_INFO]: this.serverInfo() }
172
+ }
147
173
  : result
148
174
  }
149
175
 
150
- private serverInfo (): unknown {
151
- return (this.discovery.modern as { _meta: Record<string, unknown> })._meta[SERVER_INFO]
176
+ private serverInfo(): unknown {
177
+ return (this.discovery.modern as { _meta: Record<string, unknown> })._meta[
178
+ SERVER_INFO
179
+ ]
152
180
  }
153
181
 
154
182
  /**
155
183
  * Which revision this request is of. `initialize` is one by itself; otherwise the header
156
184
  * says, and a request that names none is of a revision that did not send one.
157
185
  */
158
- private version (context: http.Context, message: Message): string {
159
- if (message.method === 'initialize')
160
- return LEGACY
186
+ private version(context: http.Context, message: Message): string {
187
+ if (message.method === 'initialize') return LEGACY
161
188
 
162
189
  const header = context.request.headers['mcp-protocol-version']
163
190
  const stated = declared(message.params ?? {})
164
191
 
165
192
  if (header !== undefined && stated !== undefined && header !== stated)
166
- throw new http.BadRequest(response(message.id ?? null, failure(HEADER_MISMATCH,
167
- `'MCP-Protocol-Version' says '${String(header)}' and the body says '${stated}'`)))
193
+ throw new http.BadRequest(
194
+ response(
195
+ message.id ?? null,
196
+ failure(
197
+ HEADER_MISMATCH,
198
+ `'MCP-Protocol-Version' says '${String(header)}' and the body says '${stated}'`
199
+ )
200
+ )
201
+ )
168
202
 
169
203
  const value = (header as string | undefined) ?? stated
170
204
 
171
- if (value === undefined)
172
- return LEGACY
205
+ if (value === undefined) return LEGACY
173
206
 
174
207
  if (!VERSIONS.includes(value))
175
- throw new http.BadRequest(response(message.id ?? null,
176
- failure(UNSUPPORTED_VERSION, 'Unsupported protocol version',
177
- { supported: VERSIONS, requested: value })))
208
+ throw new http.BadRequest(
209
+ response(
210
+ message.id ?? null,
211
+ failure(UNSUPPORTED_VERSION, 'Unsupported protocol version', {
212
+ supported: VERSIONS,
213
+ requested: value
214
+ })
215
+ )
216
+ )
178
217
 
179
218
  return value
180
219
  }
@@ -183,12 +222,19 @@ export class Server {
183
222
  * What the modern revision mirrors into headers, so that what routes a request and what
184
223
  * answers it cannot be told two different things.
185
224
  */
186
- private mirrored (context: http.Context, message: Message): void {
225
+ private mirrored(context: http.Context, message: Message): void {
187
226
  const meta = metadata(message.params ?? {})
188
227
 
189
228
  if (meta?.[PROTOCOL_VERSION] === undefined || meta[CLIENT_CAPABILITIES] === undefined)
190
- throw new http.BadRequest(response(message.id ?? null, failure(INVALID_PARAMS,
191
- `'_meta' states '${PROTOCOL_VERSION}' and '${CLIENT_CAPABILITIES}'`)))
229
+ throw new http.BadRequest(
230
+ response(
231
+ message.id ?? null,
232
+ failure(
233
+ INVALID_PARAMS,
234
+ `'_meta' states '${PROTOCOL_VERSION}' and '${CLIENT_CAPABILITIES}'`
235
+ )
236
+ )
237
+ )
192
238
 
193
239
  const id = message.id ?? null
194
240
 
@@ -199,7 +245,7 @@ export class Server {
199
245
  }
200
246
 
201
247
  /** A body the decoder refuses is a parse error; a media type it does not know is not. */
202
- private async read (context: http.Context): Promise<Message> {
248
+ private async read(context: http.Context): Promise<Message> {
203
249
  let body: unknown
204
250
 
205
251
  try {
@@ -211,26 +257,41 @@ export class Server {
211
257
  throw exception
212
258
  }
213
259
 
214
- if (typeof body !== 'object' || body === null || Array.isArray(body) ||
215
- (body as Message).jsonrpc !== JSONRPC || typeof (body as Message).method !== 'string')
216
- throw new http.BadRequest(response(null,
217
- failure(INVALID_REQUEST, 'A request carries one JSON-RPC message')))
260
+ if (
261
+ typeof body !== 'object' ||
262
+ body === null ||
263
+ Array.isArray(body) ||
264
+ (body as Message).jsonrpc !== JSONRPC ||
265
+ typeof (body as Message).method !== 'string'
266
+ )
267
+ throw new http.BadRequest(
268
+ response(null, failure(INVALID_REQUEST, 'A request carries one JSON-RPC message'))
269
+ )
218
270
 
219
271
  return body as Message
220
272
  }
221
273
  }
222
274
 
223
275
  /** What a header says must be what the body says, or what routes and what answers differ. */
224
- function mirrors (context: http.Context, mirror: Mirror): void {
276
+ function mirrors(context: http.Context, mirror: Mirror): void {
225
277
  const { id, header, value } = mirror
226
278
  const stated = context.request.headers[header]
227
279
 
228
280
  if (stated === undefined)
229
- throw new http.BadRequest(response(id, failure(HEADER_MISMATCH, `'${header}' is required`)))
281
+ throw new http.BadRequest(
282
+ response(id, failure(HEADER_MISMATCH, `'${header}' is required`))
283
+ )
230
284
 
231
285
  if (decode(String(stated)) !== value)
232
- throw new http.BadRequest(response(id, failure(HEADER_MISMATCH,
233
- `'${header}' says '${String(stated)}' and the body says '${String(value)}'`)))
286
+ throw new http.BadRequest(
287
+ response(
288
+ id,
289
+ failure(
290
+ HEADER_MISMATCH,
291
+ `'${header}' says '${String(stated)}' and the body says '${String(value)}'`
292
+ )
293
+ )
294
+ )
234
295
  }
235
296
 
236
297
  interface Mirror {
@@ -239,24 +300,23 @@ interface Mirror {
239
300
  value: unknown
240
301
  }
241
302
 
242
- function metadata (params: Params): Record<string, unknown> | undefined {
303
+ function metadata(params: Params): Record<string, unknown> | undefined {
243
304
  const meta = params._meta
244
305
 
245
306
  return typeof meta === 'object' && meta !== null
246
- ? meta as Record<string, unknown>
307
+ ? (meta as Record<string, unknown>)
247
308
  : undefined
248
309
  }
249
310
 
250
- function declared (params: Params): string | undefined {
311
+ function declared(params: Params): string | undefined {
251
312
  const stated = metadata(params)?.[PROTOCOL_VERSION]
252
313
 
253
314
  return typeof stated === 'string' ? stated : undefined
254
315
  }
255
316
 
256
317
  /** What a header value that could not be written as ASCII was encoded as. */
257
- function decode (value: string): string {
258
- if (!value.startsWith(SENTINEL) || !value.endsWith(TERMINATOR))
259
- return value
318
+ function decode(value: string): string {
319
+ if (!value.startsWith(SENTINEL) || !value.endsWith(TERMINATOR)) return value
260
320
 
261
321
  const encoded = value.slice(SENTINEL.length, -TERMINATOR.length)
262
322
 
@@ -15,7 +15,7 @@ export interface Discovery {
15
15
  legacy: (offered: string | undefined) => object
16
16
  }
17
17
 
18
- export function discovery (options: MCP): Discovery {
18
+ export function discovery(options: MCP): Discovery {
19
19
  const info = { name: options.name, version: VERSION }
20
20
 
21
21
  // `listChanged` is a stream a client holds open, and this endpoint holds none
@@ -27,10 +27,9 @@ export function discovery (options: MCP): Discovery {
27
27
  _meta: { [SERVER_INFO]: info }
28
28
  }
29
29
 
30
- if (options.instructions !== undefined)
31
- modern.instructions = options.instructions
30
+ if (options.instructions !== undefined) modern.instructions = options.instructions
32
31
 
33
- function legacy (offered: string | undefined): object {
32
+ function legacy(offered: string | undefined): object {
34
33
  const value: Record<string, unknown> = {
35
34
  // what the client asked for where that is served, and the newest handshake otherwise
36
35
  protocolVersion: offered !== undefined && offered !== MODERN ? offered : LEGACY,
@@ -38,8 +37,7 @@ export function discovery (options: MCP): Discovery {
38
37
  serverInfo: info
39
38
  }
40
39
 
41
- if (options.instructions !== undefined)
42
- value.instructions = options.instructions
40
+ if (options.instructions !== undefined) value.instructions = options.instructions
43
41
 
44
42
  return value
45
43
  }
@@ -49,4 +47,5 @@ export function discovery (options: MCP): Discovery {
49
47
 
50
48
  /** What this gateway is, which is what answers however an application names itself. */
51
49
  const VERSION: string = JSON.parse(
52
- readFileSync(new URL('../../package.json', import.meta.url), 'utf8')).version
50
+ readFileSync(new URL('../../package.json', import.meta.url), 'utf8')
51
+ ).version
@@ -17,16 +17,15 @@ export const HEADER_MISMATCH = -32020
17
17
  export const MISSING_CAPABILITY = -32021
18
18
  export const UNSUPPORTED_VERSION = -32022
19
19
 
20
- export function failure (code: number, message: string, data?: unknown): Failure {
20
+ export function failure(code: number, message: string, data?: unknown): Failure {
21
21
  const value: Failure = { code, message }
22
22
 
23
- if (data !== undefined)
24
- value.data = data
23
+ if (data !== undefined) value.data = data
25
24
 
26
25
  return value
27
26
  }
28
27
 
29
- export function response (id: string | number | null, error: Failure): Response {
28
+ export function response(id: string | number | null, error: Failure): Response {
30
29
  return { jsonrpc: JSONRPC, id, error }
31
30
  }
32
31
 
@@ -36,7 +35,7 @@ export function response (id: string | number | null, error: Failure): Response
36
35
  * The readable text is `body`, never `message`: `http.Exception` calls `super()` with no
37
36
  * argument, so every one of them carries an empty `message`.
38
37
  */
39
- export function of (exception: unknown): Failure {
38
+ export function of(exception: unknown): Failure {
40
39
  if (exception instanceof http.NotFound || exception instanceof http.MethodNotAllowed)
41
40
  return failure(METHOD_NOT_FOUND, text(exception, 'Method not found'))
42
41
 
@@ -50,7 +49,7 @@ export function of (exception: unknown): Failure {
50
49
  * What the call was refused with, which a model reads and may correct itself by: what the
51
50
  * operation said, where it said anything, and otherwise what the status means here.
52
51
  */
53
- export function refusal (exception: http.ClientError): string {
52
+ export function refusal(exception: http.ClientError): string {
54
53
  const body = exception.body
55
54
 
56
55
  if (typeof body !== 'object' || body === null || typeof body.code !== 'string')
@@ -58,7 +57,7 @@ export function refusal (exception: http.ClientError): string {
58
57
 
59
58
  const message = body.message as unknown
60
59
 
61
- return typeof message === 'string' && message !== '' ? message : body.code as string
60
+ return typeof message === 'string' && message !== '' ? message : (body.code as string)
62
61
  }
63
62
 
64
63
  /**
@@ -74,7 +73,7 @@ const REFUSALS: Record<number, string> = {
74
73
  429: 'Too many calls'
75
74
  }
76
75
 
77
- function text (exception: http.Exception, fallback: string): string {
76
+ function text(exception: http.Exception, fallback: string): string {
78
77
  return typeof exception.body === 'string' && exception.body !== ''
79
78
  ? exception.body
80
79
  : fallback
@@ -38,8 +38,11 @@ describe('input', () => {
38
38
  headers: { token: { header: 'x-access-token', type: 'string' } }
39
39
  }
40
40
 
41
- assert.deepEqual(input(introspection, []),
42
- { type: 'object', properties: {}, additionalProperties: false })
41
+ assert.deepEqual(input(introspection, []), {
42
+ type: 'object',
43
+ properties: {},
44
+ additionalProperties: false
45
+ })
43
46
  })
44
47
 
45
48
  it('should take the body as it is, requiring what it requires', () => {
@@ -78,7 +81,10 @@ describe('annotations', () => {
78
81
  it('should read what the verb says of the call', () => {
79
82
  assert.deepEqual(annotations('GET'), { readOnlyHint: true })
80
83
  assert.deepEqual(annotations('HEAD'), { readOnlyHint: true })
81
- assert.deepEqual(annotations('DELETE'), { destructiveHint: true, idempotentHint: true })
84
+ assert.deepEqual(annotations('DELETE'), {
85
+ destructiveHint: true,
86
+ idempotentHint: true
87
+ })
82
88
  assert.deepEqual(annotations('PUT'), { idempotentHint: true })
83
89
  assert.equal(annotations('POST'), undefined)
84
90
  })
@@ -8,7 +8,7 @@ import type { Annotations } from './types.js'
8
8
  * A `map:headers` property is not here: a call carries no headers of its own, so there is
9
9
  * nowhere for a model to put one.
10
10
  */
11
- export function input (introspection: Introspection, variables: string[]): object {
11
+ export function input(introspection: Introspection, variables: string[]): object {
12
12
  const properties: Record<string, unknown> = {}
13
13
  const required: string[] = []
14
14
 
@@ -28,7 +28,8 @@ export function input (introspection: Introspection, variables: string[]): objec
28
28
  if (introspection.query !== undefined)
29
29
  properties.query = {
30
30
  type: 'object',
31
- description: 'Which records the call works on: what to match, in what order, ' +
31
+ description:
32
+ 'Which records the call works on: what to match, in what order, ' +
32
33
  'and how many at once.',
33
34
  properties: introspection.query
34
35
  }
@@ -37,13 +38,12 @@ export function input (introspection: Introspection, variables: string[]): objec
37
38
 
38
39
  if (body?.properties !== undefined) {
39
40
  Object.assign(properties, body.properties)
40
- required.push(...body.required ?? [])
41
+ required.push(...(body.required ?? []))
41
42
  }
42
43
 
43
44
  const schema: Record<string, unknown> = { type: 'object', properties }
44
45
 
45
- if (required.length > 0)
46
- schema.required = required
46
+ if (required.length > 0) schema.required = required
47
47
 
48
48
  // what a name does not state is not a parameter, and a model should not invent one
49
49
  schema.additionalProperties = false
@@ -56,27 +56,23 @@ export function input (introspection: Introspection, variables: string[]): objec
56
56
  * and normalizes to `{}`, which describes nothing — and a schema the revision would have the
57
57
  * reply validated against is worse said emptily than left unsaid.
58
58
  */
59
- export function output (introspection: Introspection): object | undefined {
59
+ export function output(introspection: Introspection): object | undefined {
60
60
  const schema = introspection.output as Shape | null | undefined
61
61
 
62
- if (schema === undefined || schema === null)
63
- return undefined
62
+ if (schema === undefined || schema === null) return undefined
64
63
 
65
- return Object.keys(schema).length === 0 ? undefined : schema as object
64
+ return Object.keys(schema).length === 0 ? undefined : (schema as object)
66
65
  }
67
66
 
68
67
  /** What the verb says of the call, which the revision has a client treat as a hint. */
69
- export function annotations (verb: string): Annotations | undefined {
68
+ export function annotations(verb: string): Annotations | undefined {
70
69
  const value: Annotations = {}
71
70
 
72
- if (verb === 'GET' || verb === 'HEAD')
73
- value.readOnlyHint = true
71
+ if (verb === 'GET' || verb === 'HEAD') value.readOnlyHint = true
74
72
 
75
- if (verb === 'DELETE')
76
- value.destructiveHint = true
73
+ if (verb === 'DELETE') value.destructiveHint = true
77
74
 
78
- if (verb === 'PUT' || verb === 'DELETE')
79
- value.idempotentHint = true
75
+ if (verb === 'PUT' || verb === 'DELETE') value.idempotentHint = true
80
76
 
81
77
  return Object.keys(value).length === 0 ? undefined : value
82
78
  }
@@ -20,7 +20,7 @@ import type { Params, Result, Tool } from './types.js'
20
20
  *
21
21
  * Sorted, because the revision asks for an order a client can cache on.
22
22
  */
23
- export async function list (tree: Tree, context: http.Context): Promise<Tool[]> {
23
+ export async function list(tree: Tree, context: http.Context): Promise<Tool[]> {
24
24
  const tools: Tool[] = []
25
25
 
26
26
  /*
@@ -28,24 +28,22 @@ export async function list (tree: Tree, context: http.Context): Promise<Tool[]>
28
28
  * refuses a credentialed request at an `anonymous` route does not refuse the call a tool
29
29
  * makes, and a list that says otherwise disagrees with what `tools/call` then does.
30
30
  */
31
- const describing: http.Context = Object.create(context,
32
- { procedural: { value: true, enumerable: true } })
31
+ const describing: http.Context = Object.create(context, {
32
+ procedural: { value: true, enumerable: true }
33
+ })
33
34
 
34
35
  for (const { segments, verb, method } of tree.walk()) {
35
- if (MCP.published(method.directives.declared<Declaration>(FAMILY)) === null)
36
- continue
36
+ if (MCP.published(method.directives.declared<Declaration>(FAMILY)) === null) continue
37
37
 
38
38
  const named = name(segments, verb)
39
39
 
40
40
  // a route a name cannot spell is a route nothing addresses, here or at `/.rpc`
41
- if (named === null)
42
- continue
41
+ if (named === null) continue
43
42
 
44
43
  const variables = parameters(segments)
45
44
  const introspection = await method.explain(describing, variables)
46
45
 
47
- if (introspection === null)
48
- continue
46
+ if (introspection === null) continue
49
47
 
50
48
  const described = introspection.description
51
49
  const schema = output(introspection)
@@ -54,16 +52,20 @@ export async function list (tree: Tree, context: http.Context): Promise<Tool[]>
54
52
  // in the order the revision documents one, which is the order it is read in
55
53
  const tool: Tool = {
56
54
  name: named,
57
- ...described === undefined ? {} : { description: described },
58
- inputSchema: input(introspection, variables.map((variable) => variable.name)),
59
- ...schema === undefined ? {} : { outputSchema: schema },
60
- ...hints === undefined ? {} : { annotations: hints }
55
+ ...(introspection.title === undefined ? {} : { title: introspection.title }),
56
+ ...(described === undefined ? {} : { description: described }),
57
+ inputSchema: input(
58
+ introspection,
59
+ variables.map((variable) => variable.name)
60
+ ),
61
+ ...(schema === undefined ? {} : { outputSchema: schema }),
62
+ ...(hints === undefined ? {} : { annotations: hints })
61
63
  }
62
64
 
63
65
  tools.push(tool)
64
66
  }
65
67
 
66
- return tools.sort((one, other) => one.name < other.name ? -1 : 1)
68
+ return tools.sort((one, other) => (one.name < other.name ? -1 : 1))
67
69
  }
68
70
 
69
71
  /**
@@ -74,10 +76,14 @@ export async function list (tree: Tree, context: http.Context): Promise<Tool[]>
74
76
  * would have taken it: what an application did not publish is not reachable here by guessing
75
77
  * its name. What the caller may then do with one that is published is still `auth`'s to say.
76
78
  */
77
- export async function call (scope: Scope, named: string, args: Params): Promise<Result> {
79
+ export async function call(scope: Scope, named: string, args: Params): Promise<Result> {
78
80
  if (!published(scope.tree, named))
79
- throw new http.NotFound(response(null,
80
- failure(METHOD_NOT_FOUND, `'${named}' is not a tool this server publishes`)))
81
+ throw new http.NotFound(
82
+ response(
83
+ null,
84
+ failure(METHOD_NOT_FOUND, `'${named}' is not a tool this server publishes`)
85
+ )
86
+ )
81
87
 
82
88
  const { path, verb, variables } = address(named, args)
83
89
  const { query, input: body } = split(args, variables)
@@ -98,7 +104,10 @@ export async function call (scope: Scope, named: string, args: Params): Promise<
98
104
  * — that is the client's to fix and not the model's, so it is answered as it is — and
99
105
  * neither is a fault of this server, which is a protocol error and stays one.
100
106
  */
101
- if (exception instanceof http.ClientError && !(exception instanceof http.Unauthorized))
107
+ if (
108
+ exception instanceof http.ClientError &&
109
+ !(exception instanceof http.Unauthorized)
110
+ )
102
111
  return { content: [{ type: 'text', text: refusal(exception) }], isError: true }
103
112
 
104
113
  throw exception
@@ -117,7 +126,7 @@ export interface Scope {
117
126
  * asked here — the declaration is the route's and does not vary by who is calling, and the
118
127
  * call that follows is authorized as any request to that route is.
119
128
  */
120
- function published (tree: Tree, named: string): boolean {
129
+ function published(tree: Tree, named: string): boolean {
121
130
  for (const { segments, verb, method } of tree.walk())
122
131
  if (name(segments, verb) === named)
123
132
  return MCP.published(method.directives.declared<Declaration>(FAMILY)) !== null
@@ -125,9 +134,8 @@ function published (tree: Tree, named: string): boolean {
125
134
  return false
126
135
  }
127
136
 
128
- function result (body: unknown): Result {
129
- if (body === undefined || body === null)
130
- return { content: [] }
137
+ function result(body: unknown): Result {
138
+ if (body === undefined || body === null) return { content: [] }
131
139
 
132
140
  return {
133
141
  content: [{ type: 'text', text: JSON.stringify(body) }],
@@ -139,15 +147,13 @@ function result (body: unknown): Result {
139
147
  * What a route template takes, by name. Describing has no values for them — a template is
140
148
  * not a path — and nothing that describes a method reads one.
141
149
  */
142
- function parameters (segments: Segment[]): Parameter[] {
150
+ function parameters(segments: Segment[]): Parameter[] {
143
151
  const params: Parameter[] = []
144
152
 
145
153
  for (const segment of segments) {
146
- if (segment.fragment !== null)
147
- continue
154
+ if (segment.fragment !== null) continue
148
155
 
149
- if (segment.wildcard === true)
150
- params.push({ name: '**', value: '' })
156
+ if (segment.wildcard === true) params.push({ name: '**', value: '' })
151
157
  else if (segment.placeholder !== null)
152
158
  params.push({ name: segment.placeholder, value: '' })
153
159
  }
@@ -66,7 +66,10 @@ export interface Content {
66
66
  export interface Tool {
67
67
  name: string
68
68
 
69
- /** what the operation states it is; absent where it states nothing */
69
+ /** what a person is shown where a client lists this tool; a name is an address */
70
+ title?: string
71
+
72
+ /** what the route states this method is */
70
73
  description?: string
71
74
  inputSchema: object
72
75
  outputSchema?: object