@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
@@ -21,37 +21,50 @@ export class Map implements DirectiveFamily {
21
21
 
22
22
  private remotes!: Remotes
23
23
 
24
- public create (name: string, value: unknown, remotes: Remotes): Property | Mapping {
24
+ public create(name: string, value: unknown, remotes: Remotes): Property | Mapping {
25
25
  this.remotes = remotes
26
26
 
27
- return match(name,
28
- () => properties.has(name), (name: PN) => new Property(name, value as PV),
29
- () => name in mappings, (name: keyof typeof mappings) => new mappings[name](value, remotes),
27
+ return match(
28
+ name,
29
+ () => properties.has(name),
30
+ (name: PN) => new Property(name, value as PV),
31
+ () => name in mappings,
32
+ (name: keyof typeof mappings) => new mappings[name](value, remotes),
30
33
  () => {
31
34
  throw new Error(`Directive 'map:${name}' is not implemented`)
32
- })
35
+ }
36
+ )
33
37
  }
34
38
 
35
- public explain (directives: Directive[], _: Input, introspection: Introspection): Introspection {
39
+ public explain(
40
+ directives: Directive[],
41
+ _: Input,
42
+ introspection: Introspection
43
+ ): Introspection {
36
44
  for (const directive of directives)
37
- if (directive instanceof Mapping)
38
- directive.explain(introspection)
45
+ if (directive instanceof Mapping) directive.explain(introspection)
39
46
 
40
47
  return introspection
41
48
  }
42
49
 
43
- public async precall (directives: Directive[], context: Input, parameters: Parameter[]): Promise<Output> {
50
+ public async precall(
51
+ directives: Directive[],
52
+ context: Input,
53
+ parameters: Parameter[]
54
+ ): Promise<Output> {
44
55
  const properties = {}
45
56
 
46
57
  for (const directive of directives)
47
58
  if (directive instanceof Mapping)
48
- Object.assign(properties, await directive.properties(context, parameters, directives))
59
+ Object.assign(
60
+ properties,
61
+ await directive.properties(context, parameters, directives)
62
+ )
49
63
 
50
64
  context.pipelines.body.push((body: unknown) => {
51
65
  if (body === undefined || body === null || typeof body !== 'object')
52
66
  return properties
53
- else
54
- return Object.assign(body, properties)
67
+ else return Object.assign(body, properties)
55
68
  })
56
69
 
57
70
  return null
@@ -9,12 +9,16 @@ export abstract class Mapping<T = unknown> {
9
9
  protected value: T
10
10
  protected remotes?: Remotes
11
11
 
12
- protected constructor (value: T, remotes?: Remotes) {
12
+ protected constructor(value: T, remotes?: Remotes) {
13
13
  this.value = value
14
14
  this.remotes = remotes
15
15
  }
16
16
 
17
- public abstract properties (context: Input, parameters: Parameter[], directives: Directive[]): Output
17
+ public abstract properties(
18
+ context: Input,
19
+ parameters: Parameter[],
20
+ directives: Directive[]
21
+ ): Output
18
22
 
19
23
  /**
20
24
  * What this mapping does to what the method says about itself, which is the reverse of
@@ -25,13 +29,12 @@ export abstract class Mapping<T = unknown> {
25
29
  * from the request itself and there is nowhere for a caller to put one; a header and a
26
30
  * segment are the caller's, and those say where.
27
31
  */
28
- public explain (introspection: Introspection): void {
29
- for (const property of this.names())
30
- take(introspection, property)
32
+ public explain(introspection: Introspection): void {
33
+ for (const property of this.names()) take(introspection, property)
31
34
  }
32
35
 
33
36
  /** The input properties this mapping fills, however its value names them. */
34
- protected names (): string[] {
37
+ protected names(): string[] {
35
38
  return typeof this.value === 'string'
36
39
  ? [this.value]
37
40
  : Object.keys(this.value as object)
@@ -6,7 +6,7 @@ export class Property<K extends keyof Properties = keyof Properties> {
6
6
  public readonly name: K
7
7
  public readonly value: Properties[K]
8
8
 
9
- public constructor (name: K, value: Properties[K]) {
9
+ public constructor(name: K, value: Properties[K]) {
10
10
  this.name = name
11
11
  this.value = value
12
12
  }
@@ -5,17 +5,19 @@ import type { Parameter } from '../../RTD/index.js'
5
5
  import type { Introspection, Schema } from '../../Introspection.js'
6
6
 
7
7
  export class Segments extends Mapping<Record<string, string>> {
8
- public constructor (map: Record<string, string>) {
8
+ public constructor(map: Record<string, string>) {
9
9
  assert.ok(map.constructor === Object, '`map:segments` must be an object')
10
10
 
11
- assert.ok(Object.values(map).every((value) => typeof value === 'string'),
12
- '`map:segments ` must be an object with string values')
11
+ assert.ok(
12
+ Object.values(map).every((value) => typeof value === 'string'),
13
+ '`map:segments ` must be an object with string values'
14
+ )
13
15
 
14
16
  super(map)
15
17
  }
16
18
 
17
19
  /** A segment is the caller's, so it moves to the route rather than out of sight. */
18
- public override explain (introspection: Introspection): void {
20
+ public override explain(introspection: Introspection): void {
19
21
  for (const property of Object.keys(this.value)) {
20
22
  const schema = take(introspection, property)
21
23
 
@@ -24,22 +26,27 @@ export class Segments extends Mapping<Record<string, string>> {
24
26
  }
25
27
  }
26
28
 
27
- public override properties (_: unknown, parameters: Parameter[]): Record<string, string> {
28
- return Object.entries(this.value).reduce((properties: Record<string, string>, [property, parameter]) => {
29
- const cut = parameter[0] === '~'
29
+ public override properties(
30
+ _: unknown,
31
+ parameters: Parameter[]
32
+ ): Record<string, string> {
33
+ return Object.entries(this.value).reduce(
34
+ (properties: Record<string, string>, [property, parameter]) => {
35
+ const cut = parameter[0] === '~'
30
36
 
31
- if (cut) parameter = parameter.slice(1)
37
+ if (cut) parameter = parameter.slice(1)
32
38
 
33
- const index = parameters.findIndex(({ name }) => name === parameter)
39
+ const index = parameters.findIndex(({ name }) => name === parameter)
34
40
 
35
- assert.ok(index > -1, `Route parameter '${parameter}' is missing`)
41
+ assert.ok(index > -1, `Route parameter '${parameter}' is missing`)
36
42
 
37
- properties[property] = parameters[index].value
43
+ properties[property] = parameters[index].value
38
44
 
39
- if (cut)
40
- parameters.splice(index, 1)
45
+ if (cut) parameters.splice(index, 1)
41
46
 
42
- return properties
43
- }, {})
47
+ return properties
48
+ },
49
+ {}
50
+ )
44
51
  }
45
52
  }
@@ -12,22 +12,31 @@ export class MCP implements DirectiveFamily<Tool> {
12
12
  public readonly mandatory = false
13
13
 
14
14
  /** What this method is published as, which is what the nearest declaration says. */
15
- public static published (directives: Tool[] | undefined): Tool | null {
15
+ public static published(directives: Tool[] | undefined): Tool | null {
16
16
  return directives?.[0] ?? null
17
17
  }
18
18
 
19
19
  // eslint-disable-next-line max-params
20
- public create (name: string, value: unknown, _: unknown, route: string): Tool {
20
+ public create(name: string, value: unknown, _: unknown, route: string): Tool {
21
21
  assert.ok(name === 'tool', `Unknown directive: mcp:${name}`)
22
22
 
23
23
  return new Tool(value, route)
24
24
  }
25
25
 
26
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 {
27
+ public explain(
28
+ directives: Tool[],
29
+ _: Context,
30
+ introspection: Introspection
31
+ ): Introspection {
29
32
  const tool = MCP.published(directives)
30
33
 
31
- return tool === null ? introspection : { ...introspection, description: tool.description }
34
+ if (tool === null) return introspection
35
+
36
+ return {
37
+ ...introspection,
38
+ description: tool.description,
39
+ ...(tool.title === undefined ? {} : { title: tool.title })
40
+ }
32
41
  }
33
42
  }
@@ -5,8 +5,38 @@ import { MCP } from './MCP.js'
5
5
 
6
6
  describe('mcp:tool', () => {
7
7
  it('should take what the route states the tool is', () => {
8
- assert.strictEqual(new Tool('The pots that are hot.', '/pots/hot').description,
9
- 'The pots that are hot.')
8
+ const tool = new Tool('The pots that are hot.', '/pots/hot')
9
+
10
+ assert.strictEqual(tool.description, 'The pots that are hot.')
11
+ assert.strictEqual(tool.title, undefined)
12
+ })
13
+
14
+ it('should take a title beside the description', () => {
15
+ const tool = new Tool(
16
+ { title: 'Hot pots', description: 'The pots that are hot.' },
17
+ '/pots'
18
+ )
19
+
20
+ assert.strictEqual(tool.title, 'Hot pots')
21
+ assert.strictEqual(tool.description, 'The pots that are hot.')
22
+ })
23
+
24
+ it('should not accept a mapping without a description', () => {
25
+ assert.throws(() => new Tool({ title: 'Hot pots' }, '/pots'), /cannot be empty/)
26
+ })
27
+
28
+ it('should not accept an empty title', () => {
29
+ assert.throws(
30
+ () => new Tool({ title: ' ', description: 'A pot.' }, '/pots'),
31
+ /a title cannot be empty/
32
+ )
33
+ })
34
+
35
+ it('should not accept what it does not know', () => {
36
+ assert.throws(
37
+ () => new Tool({ description: 'A pot.', name: 'pots' }, '/pots'),
38
+ /unknown 'name'/
39
+ )
10
40
  })
11
41
 
12
42
  it('should not accept an empty description', () => {
@@ -18,6 +48,7 @@ describe('mcp:tool', () => {
18
48
  assert.throws(() => new Tool(true, '/pots'), /the value is what the tool is/)
19
49
  assert.throws(() => new Tool(false, '/pots'), /the value is what the tool is/)
20
50
  assert.throws(() => new Tool(1, '/pots'), /the value is what the tool is/)
51
+ assert.throws(() => new Tool(['A pot.'], '/pots'), /the value is what the tool is/)
21
52
  })
22
53
 
23
54
  it('should refuse a route no name can spell', () => {
@@ -49,8 +80,11 @@ describe('mcp:tool inheritance', () => {
49
80
  })
50
81
 
51
82
  it('should describe a method with what the route states', () => {
52
- const described = family.explain([new Tool('What the route is.', '/pots')], null as never,
53
- { description: 'What the operation is.' })
83
+ const described = family.explain(
84
+ [new Tool('What the route is.', '/pots')],
85
+ null as never,
86
+ { description: 'What the operation is.' }
87
+ )
54
88
 
55
89
  assert.strictEqual(described.description, 'What the route is.')
56
90
  })
@@ -60,7 +94,9 @@ describe('mcp:tool inheritance', () => {
60
94
  })
61
95
 
62
96
  it('should refuse a directive it does not know', () => {
63
- assert.throws(() => family.create('resource', 'A pot.', null, '/pots'),
64
- /Unknown directive: mcp:resource/)
97
+ assert.throws(
98
+ () => family.create('resource', 'A pot.', null, '/pots'),
99
+ /Unknown directive: mcp:resource/
100
+ )
65
101
  })
66
102
  })
@@ -7,22 +7,53 @@ import { segment } from '../../RTD/segment.js'
7
7
  * says is what it says it is: a tool a model cannot read the purpose of is one it cannot
8
8
  * choose, so there is no way to publish one that states nothing.
9
9
  *
10
+ * A `title` is what a person is shown where a client lists what it may call — a name is an
11
+ * address and reads as one. A description alone is written as the value; both are written as
12
+ * a mapping.
13
+ *
10
14
  * The operation states what it is too, and that is not this. An operation is written without
11
15
  * knowledge of any route, and a tool is an operation and a route together — the same
12
- * operation mounted twice is two tools, and one sentence cannot be true of both.
16
+ * operation mounted twice is two tools, and one sentence is not true of both.
13
17
  */
14
18
  export class Tool {
15
19
  public readonly description: string
20
+ public readonly title: string | undefined
21
+
22
+ public constructor(value: unknown, route: string) {
23
+ const stated = typeof value === 'string' ? { description: value } : value
24
+
25
+ assert.ok(
26
+ typeof stated === 'object' && stated !== null && !Array.isArray(stated),
27
+ 'Directive mcp:tool: the value is what the tool is, or a `title` and a `description`'
28
+ )
29
+
30
+ const { description, title, ...rest } = stated as Record<string, unknown>
31
+
32
+ assert.ok(
33
+ Object.keys(rest).length === 0,
34
+ `Directive mcp:tool: unknown ${Object.keys(rest)
35
+ .map((key) => `'${key}'`)
36
+ .join(', ')}`
37
+ )
38
+
39
+ assert.ok(
40
+ typeof description === 'string' && description.trim().length > 0,
41
+ 'Directive mcp:tool: a description cannot be empty'
42
+ )
16
43
 
17
- public constructor (value: unknown, route: string) {
18
- assert.ok(typeof value === 'string' && value.trim().length > 0,
19
- 'Directive mcp:tool: the value is what the tool is, which cannot be empty')
44
+ assert.ok(
45
+ title === undefined || (typeof title === 'string' && title.trim().length > 0),
46
+ 'Directive mcp:tool: a title cannot be empty'
47
+ )
20
48
 
21
49
  // a tool is called by name, so a route that cannot be named cannot be one — said where
22
50
  // the mistake is, rather than as a tool that is quietly never listed
23
- assert.ok(refusal(segment(route)) === null,
24
- `Directive mcp:tool: '${route}' holds a segment no tool name can spell`)
51
+ assert.ok(
52
+ refusal(segment(route)) === null,
53
+ `Directive mcp:tool: '${route}' holds a segment no tool name can spell`
54
+ )
25
55
 
26
- this.description = value
56
+ this.description = description
57
+ this.title = title as string | undefined
27
58
  }
28
59
  }
@@ -20,11 +20,10 @@ export class Discovery implements Interceptor {
20
20
  */
21
21
  private readonly authorities = new Map<string, Documents>()
22
22
 
23
- public mount (options: http.Options): void {
23
+ public mount(options: http.Options): void {
24
24
  this.authorities.clear()
25
25
 
26
- if (options.oauth === undefined)
27
- return
26
+ if (options.oauth === undefined) return
28
27
 
29
28
  /*
30
29
  * `https` always: RFC 8414 has an issuer be one, and OAuth 2.1 has every endpoint of an
@@ -39,20 +38,18 @@ export class Discovery implements Interceptor {
39
38
  this.authorities.set(authority, documents(`https://${host}`, options.oauth))
40
39
  }
41
40
 
42
- public reset (): void {
41
+ public reset(): void {
43
42
  this.authorities.clear()
44
43
  }
45
44
 
46
- public intercept (input: Input): Output {
45
+ public intercept(input: Input): Output {
47
46
  const known = this.authorities.get(input.authority)
48
47
 
49
- if (known === undefined)
50
- return null
48
+ if (known === undefined) return null
51
49
 
52
50
  // every reply, not just a document's: the challenge is what points a client here
53
51
  input.pipelines.response.push((response) => {
54
- if (response.status !== UNAUTHORIZED)
55
- return
52
+ if (response.status !== UNAUTHORIZED) return
56
53
 
57
54
  response.headers ??= new Headers()
58
55
  response.headers.set('www-authenticate', known.challenge(input.url.pathname))
@@ -60,8 +57,7 @@ export class Discovery implements Interceptor {
60
57
 
61
58
  const body = known.read(input.url.pathname)
62
59
 
63
- if (body === undefined)
64
- return null
60
+ if (body === undefined) return null
65
61
 
66
62
  return { body, headers: new Headers({ 'cache-control': 'public, max-age=3600' }) }
67
63
  }
@@ -9,12 +9,12 @@ export interface Documents {
9
9
  challenge: (pathname: string) => string
10
10
  }
11
11
 
12
- export function documents (issuer: string, oauth: OAuth): Documents {
12
+ export function documents(issuer: string, oauth: OAuth): Documents {
13
13
  const server = authorizationServer(issuer, oauth)
14
14
  const resources = protectedResources(issuer, oauth)
15
15
  const scope = oauth.scopes === undefined ? '' : `, scope="${oauth.scopes.join(' ')}"`
16
16
 
17
- function read (pathname: string): object | undefined {
17
+ function read(pathname: string): object | undefined {
18
18
  if (pathname === AUTHORIZATION_SERVER || pathname === OPENID_CONFIGURATION)
19
19
  return server
20
20
 
@@ -24,7 +24,7 @@ export function documents (issuer: string, oauth: OAuth): Documents {
24
24
  return undefined
25
25
  }
26
26
 
27
- function challenge (pathname: string): string {
27
+ function challenge(pathname: string): string {
28
28
  return `Bearer resource_metadata="${issuer}${PROTECTED_RESOURCE}${suffix(oauth, pathname)}"${scope}`
29
29
  }
30
30
 
@@ -36,7 +36,7 @@ export function documents (issuer: string, oauth: OAuth): Documents {
36
36
  * everything else this extension serves. Both flags are load-bearing for a client that
37
37
  * prefers Client ID Metadata Documents: without either it falls back to registration.
38
38
  */
39
- function authorizationServer (issuer: string, oauth: OAuth): object {
39
+ function authorizationServer(issuer: string, oauth: OAuth): object {
40
40
  const metadata: Record<string, unknown> = {
41
41
  issuer,
42
42
  authorization_endpoint: oauth.authorize,
@@ -52,8 +52,7 @@ function authorizationServer (issuer: string, oauth: OAuth): object {
52
52
  if (oauth.registration === 'open')
53
53
  metadata.registration_endpoint = `${issuer}${REGISTRATION}`
54
54
 
55
- if (oauth.scopes !== undefined)
56
- metadata.scopes_supported = oauth.scopes
55
+ if (oauth.scopes !== undefined) metadata.scopes_supported = oauth.scopes
57
56
 
58
57
  return metadata
59
58
  }
@@ -63,7 +62,7 @@ function authorizationServer (issuer: string, oauth: OAuth): object {
63
62
  * `https://host/mcp` reads `/.well-known/oauth-protected-resource/mcp`, and one that names
64
63
  * no path reads the document at the origin.
65
64
  */
66
- function protectedResources (issuer: string, oauth: OAuth): Map<string, object> {
65
+ function protectedResources(issuer: string, oauth: OAuth): Map<string, object> {
67
66
  const map = new Map<string, object>()
68
67
 
69
68
  for (const path of oauth.resources ?? [])
@@ -74,26 +73,24 @@ function protectedResources (issuer: string, oauth: OAuth): Map<string, object>
74
73
  return map
75
74
  }
76
75
 
77
- function resource (issuer: string, path: string, oauth: OAuth): object {
76
+ function resource(issuer: string, path: string, oauth: OAuth): object {
78
77
  const metadata: Record<string, unknown> = {
79
78
  resource: issuer + path,
80
79
  authorization_servers: [issuer],
81
80
  bearer_methods_supported: ['header']
82
81
  }
83
82
 
84
- if (oauth.scopes !== undefined)
85
- metadata.scopes_supported = oauth.scopes
83
+ if (oauth.scopes !== undefined) metadata.scopes_supported = oauth.scopes
86
84
 
87
85
  return metadata
88
86
  }
89
87
 
90
88
  /** The document a request to this path was refused against: the longest resource holding it. */
91
- function suffix (oauth: OAuth, pathname: string): string {
89
+ function suffix(oauth: OAuth, pathname: string): string {
92
90
  let longest = ''
93
91
 
94
92
  for (const path of oauth.resources ?? [])
95
- if (pathname.startsWith(path) && path.length > longest.length)
96
- longest = path
93
+ if (pathname.startsWith(path) && path.length > longest.length) longest = path
97
94
 
98
95
  return canonical(longest)
99
96
  }
@@ -102,7 +99,7 @@ function suffix (oauth: OAuth, pathname: string): string {
102
99
  * A resource is identified without its trailing slash — the form MCP asks for — while a
103
100
  * route is declared with one, so `/mcp/` identifies `…/mcp`.
104
101
  */
105
- function canonical (path: string): string {
102
+ function canonical(path: string): string {
106
103
  return path.endsWith('/') ? path.slice(0, -1) : path
107
104
  }
108
105
 
@@ -6,15 +6,18 @@ export class Context extends Directive {
6
6
  public readonly targeted = false
7
7
  public readonly storage: string
8
8
 
9
- public constructor (value: unknown) {
9
+ public constructor(value: unknown) {
10
10
  super()
11
11
 
12
- assert.ok(typeof value === 'string', 'Directive \'octets:context\' must must be a string')
12
+ assert.ok(
13
+ typeof value === 'string',
14
+ "Directive 'octets:context' must must be a string"
15
+ )
13
16
 
14
17
  this.storage = value
15
18
  }
16
19
 
17
- public async apply (): Promise<Output> {
20
+ public async apply(): Promise<Output> {
18
21
  return null
19
22
  }
20
23
  }
@@ -5,7 +5,7 @@ import { Workflow } from './workflows/index.js'
5
5
  import { Directive } from './Directive.js'
6
6
  import type { Parameter } from '../../RTD/index.js'
7
7
  import type { Unit, Location } from './workflows/index.js'
8
- import type { Maybe } from '@toa.io/core'
8
+ import type { Maybe } from '@toa.io/core/types'
9
9
  import type { Component } from '@toa.io/core'
10
10
  import type { Output } from '../../io.js'
11
11
  import type { Input } from './types.js'
@@ -19,7 +19,11 @@ export class Delete extends Directive {
19
19
  private readonly discovery: Promise<Component>
20
20
  private storage!: Component
21
21
 
22
- public constructor (options: Options | null, discovery: Promise<Component>, remotes: Remotes) {
22
+ public constructor(
23
+ options: Options | null,
24
+ discovery: Promise<Component>,
25
+ remotes: Remotes
26
+ ) {
23
27
  super()
24
28
  schemas.remove.validate(options)
25
29
 
@@ -29,43 +33,48 @@ export class Delete extends Directive {
29
33
  this.discovery = discovery
30
34
  }
31
35
 
32
- public async apply (storage: string, input: Input, parameters: Parameter[]): Promise<Output> {
36
+ public async apply(
37
+ storage: string,
38
+ input: Input,
39
+ parameters: Parameter[]
40
+ ): Promise<Output> {
33
41
  this.storage ??= await this.discovery
34
42
 
35
43
  const output: Output = {}
36
44
 
37
45
  if (this.workflow !== undefined) {
38
- const entry = await this.storage.invoke<Maybe<Entry>>('head',
39
- {
40
- input: {
41
- storage,
42
- path: input.request.url
43
- }
44
- })
46
+ const entry = await this.storage.invoke<Maybe<Entry>>('head', {
47
+ input: {
48
+ storage,
49
+ path: input.request.url
50
+ }
51
+ })
45
52
 
46
- if (entry instanceof Error)
47
- throw new NotFound()
53
+ if (entry instanceof Error) throw new NotFound()
48
54
 
49
55
  output.status = 202
50
56
  output.body = Readable.from(this.execute(input, storage, entry, parameters))
51
- } else
52
- await this.delete(storage, input)
57
+ } else await this.delete(storage, input)
53
58
 
54
59
  return output
55
60
  }
56
61
 
57
- private async delete (storage: string, input: Input): Promise<void> {
58
- await this.storage.invoke('delete',
59
- {
60
- input: {
61
- storage,
62
- path: input.request.url
63
- }
64
- })
62
+ private async delete(storage: string, input: Input): Promise<void> {
63
+ await this.storage.invoke('delete', {
64
+ input: {
65
+ storage,
66
+ path: input.request.url
67
+ }
68
+ })
65
69
  }
66
70
 
67
71
  // eslint-disable-next-line max-params
68
- private async * execute (input: Input, storage: string, entry: Entry, parameters: Parameter[]): AsyncGenerator {
72
+ private async *execute(
73
+ input: Input,
74
+ storage: string,
75
+ entry: Entry,
76
+ parameters: Parameter[]
77
+ ): AsyncGenerator {
69
78
  const location: Location = {
70
79
  storage,
71
80
  authority: input.authority,
@@ -75,8 +84,7 @@ export class Delete extends Directive {
75
84
  for await (const chunk of this.workflow!.execute(location, entry, parameters)) {
76
85
  yield chunk
77
86
 
78
- if (typeof chunk === 'object' && chunk !== null && 'error' in chunk)
79
- return
87
+ if (typeof chunk === 'object' && chunk !== null && 'error' in chunk) return
80
88
  }
81
89
 
82
90
  await this.delete(storage, input)
@@ -6,5 +6,9 @@ export abstract class Directive {
6
6
  public readonly name = 'octets.' + this.constructor.name.toLowerCase()
7
7
  public abstract readonly targeted: boolean
8
8
 
9
- public abstract apply (storage: string, input: Input, parameters: Parameter[]): Promise<io.Output>
9
+ public abstract apply(
10
+ storage: string,
11
+ input: Input,
12
+ parameters: Parameter[]
13
+ ): Promise<io.Output>
10
14
  }