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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (568) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/components/exposition.octets/types/index.d.ts +1 -1
  3. package/components/identity.bans/operations/transit.js +1 -1
  4. package/components/identity.bans/tsconfig.json +1 -1
  5. package/components/identity.bans/tsconfig.tsbuildinfo +1 -1
  6. package/components/identity.bans/types/index.d.ts +1 -1
  7. package/components/identity.basic/operations/add.js +1 -1
  8. package/components/identity.basic/operations/authenticate.js +1 -1
  9. package/components/identity.basic/operations/check.js +1 -1
  10. package/components/identity.basic/operations/delete.js +1 -1
  11. package/components/identity.basic/operations/incept.js +18 -2
  12. package/components/identity.basic/operations/info.js +1 -1
  13. package/components/identity.basic/operations/lib/credentials.js +1 -1
  14. package/components/identity.basic/operations/transit.js +1 -1
  15. package/components/identity.basic/source/incept.ts +29 -1
  16. package/components/identity.basic/tsconfig.json +1 -1
  17. package/components/identity.basic/tsconfig.tsbuildinfo +1 -1
  18. package/components/identity.basic/types/index.d.ts +3 -2
  19. package/components/identity.clients/operations/describe.js +1 -1
  20. package/components/identity.clients/operations/lib/Context.js +1 -1
  21. package/components/identity.clients/operations/lib/Entity.js +1 -1
  22. package/components/identity.clients/operations/lib/canonical.js +1 -1
  23. package/components/identity.clients/operations/lib/cimd.js +1 -1
  24. package/components/identity.clients/operations/lib/errors.js +1 -1
  25. package/components/identity.clients/operations/lib/index.js +1 -1
  26. package/components/identity.clients/operations/lib/redirect.js +1 -1
  27. package/components/identity.clients/operations/register.js +1 -1
  28. package/components/identity.clients/tsconfig.json +1 -1
  29. package/components/identity.clients/tsconfig.tsbuildinfo +1 -1
  30. package/components/identity.clients/types/index.d.ts +1 -1
  31. package/components/identity.credentials/operations/list.js +1 -1
  32. package/components/identity.credentials/tsconfig.json +4 -2
  33. package/components/identity.credentials/tsconfig.tsbuildinfo +1 -1
  34. package/components/identity.credentials/types/index.d.ts +1 -1
  35. package/components/identity.federation/operations/authenticate.js +7 -3
  36. package/components/identity.federation/operations/create.js +1 -1
  37. package/components/identity.federation/operations/decode.js +1 -1
  38. package/components/identity.federation/operations/delete.js +1 -1
  39. package/components/identity.federation/operations/incept.js +6 -2
  40. package/components/identity.federation/operations/lib/Configuration.js +1 -1
  41. package/components/identity.federation/operations/lib/Ctx.js +1 -1
  42. package/components/identity.federation/operations/lib/Payload.js +1 -1
  43. package/components/identity.federation/operations/lib/decode.js +1 -1
  44. package/components/identity.federation/operations/lib/discovery.js +1 -1
  45. package/components/identity.federation/operations/lib/errors.js +1 -1
  46. package/components/identity.federation/operations/lib/exchange.js +1 -1
  47. package/components/identity.federation/operations/lib/index.js +2 -1
  48. package/components/identity.federation/operations/lib/jose.js +1 -1
  49. package/components/identity.federation/operations/lib/principal.js +14 -0
  50. package/components/identity.federation/operations/lib/resolve.js +1 -1
  51. package/components/identity.federation/operations/list.js +1 -1
  52. package/components/identity.federation/operations/types/Scheme.js +1 -1
  53. package/components/identity.federation/operations/types/configuration.js +1 -1
  54. package/components/identity.federation/operations/types/context.js +1 -1
  55. package/components/identity.federation/operations/types/entity.js +1 -1
  56. package/components/identity.federation/operations/types/index.js +1 -1
  57. package/components/identity.federation/source/authenticate.ts +8 -2
  58. package/components/identity.federation/source/incept.ts +7 -1
  59. package/components/identity.federation/source/lib/index.ts +1 -0
  60. package/components/identity.federation/source/lib/principal.ts +17 -0
  61. package/components/identity.federation/source/types/context.ts +3 -0
  62. package/components/identity.federation/tsconfig.json +4 -2
  63. package/components/identity.federation/tsconfig.tsbuildinfo +1 -1
  64. package/components/identity.federation/types/index.d.ts +1 -1
  65. package/components/identity.grants/operations/authorize.js +1 -1
  66. package/components/identity.grants/operations/exchange.js +1 -1
  67. package/components/identity.grants/operations/lib/code.js +1 -1
  68. package/components/identity.grants/operations/lib/identify.js +1 -1
  69. package/components/identity.grants/operations/lib/index.js +1 -1
  70. package/components/identity.grants/operations/list.js +1 -1
  71. package/components/identity.grants/operations/revoke.js +1 -1
  72. package/components/identity.grants/tsconfig.json +1 -1
  73. package/components/identity.grants/tsconfig.tsbuildinfo +1 -1
  74. package/components/identity.grants/types/index.d.ts +1 -1
  75. package/components/identity.keys/operations/create.js +1 -1
  76. package/components/identity.keys/operations/disable.js +1 -1
  77. package/components/identity.keys/operations/revoke.js +1 -1
  78. package/components/identity.keys/tsconfig.json +1 -1
  79. package/components/identity.keys/tsconfig.tsbuildinfo +1 -1
  80. package/components/identity.keys/types/index.d.ts +1 -1
  81. package/components/identity.otp/operations/authenticate.js +1 -1
  82. package/components/identity.otp/operations/issue.js +1 -1
  83. package/components/identity.otp/operations/lib/Context.js +1 -1
  84. package/components/identity.otp/operations/lib/Entity.js +1 -1
  85. package/components/identity.otp/operations/lib/index.js +1 -1
  86. package/components/identity.otp/tsconfig.json +1 -1
  87. package/components/identity.otp/tsconfig.tsbuildinfo +1 -1
  88. package/components/identity.otp/types/index.d.ts +1 -1
  89. package/components/identity.passkeys/operations/authenticate.js +1 -1
  90. package/components/identity.passkeys/operations/challenge.js +1 -1
  91. package/components/identity.passkeys/operations/create.js +1 -1
  92. package/components/identity.passkeys/operations/delete.js +1 -1
  93. package/components/identity.passkeys/operations/lib/const.js +1 -1
  94. package/components/identity.passkeys/operations/list.js +1 -1
  95. package/components/identity.passkeys/operations/types/Configuration.js +1 -1
  96. package/components/identity.passkeys/operations/types/Context.js +1 -1
  97. package/components/identity.passkeys/operations/types/Passkey.js +1 -1
  98. package/components/identity.passkeys/operations/types/index.js +1 -1
  99. package/components/identity.passkeys/operations/use.js +1 -1
  100. package/components/identity.passkeys/tsconfig.json +1 -1
  101. package/components/identity.passkeys/tsconfig.tsbuildinfo +1 -1
  102. package/components/identity.passkeys/types/index.d.ts +1 -1
  103. package/components/identity.roles/operations/grant.js +1 -1
  104. package/components/identity.roles/operations/lib/Entity.js +1 -1
  105. package/components/identity.roles/operations/list.js +1 -1
  106. package/components/identity.roles/operations/principal.js +29 -5
  107. package/components/identity.roles/source/principal.ts +33 -5
  108. package/components/identity.roles/tsconfig.json +1 -1
  109. package/components/identity.roles/tsconfig.tsbuildinfo +1 -1
  110. package/components/identity.roles/types/index.d.ts +1 -1
  111. package/components/identity.tokens/operations/authenticate.js +1 -1
  112. package/components/identity.tokens/operations/decrypt.js +1 -1
  113. package/components/identity.tokens/operations/encrypt.js +1 -1
  114. package/components/identity.tokens/operations/issue.js +1 -1
  115. package/components/identity.tokens/operations/lib/form.js +1 -1
  116. package/components/identity.tokens/operations/lib/index.js +1 -1
  117. package/components/identity.tokens/operations/lib/jose.js +1 -1
  118. package/components/identity.tokens/operations/lib/key.js +1 -1
  119. package/components/identity.tokens/operations/lib/pad.js +1 -1
  120. package/components/identity.tokens/operations/revoke.js +1 -1
  121. package/components/identity.tokens/tsconfig.json +1 -1
  122. package/components/identity.tokens/tsconfig.tsbuildinfo +1 -1
  123. package/components/identity.tokens/types/index.d.ts +1 -1
  124. package/documentation/access.md +13 -0
  125. package/documentation/components.md +3 -0
  126. package/documentation/introspection.md +13 -5
  127. package/documentation/io.md +6 -0
  128. package/documentation/map.md +8 -0
  129. package/documentation/mcp.md +186 -0
  130. package/documentation/oauth.md +8 -7
  131. package/documentation/rpc.md +144 -0
  132. package/documentation/tree.md +3 -0
  133. package/features/identity.basic.feature +44 -0
  134. package/features/identity.federation.feature +2 -5
  135. package/features/introspection.feature +333 -0
  136. package/features/mcp.feature +691 -0
  137. package/features/oauth.discovery.feature +10 -11
  138. package/features/oauth.grants.feature +22 -9
  139. package/features/octets.cloudinary.feature +1 -0
  140. package/features/rpc.feature +429 -0
  141. package/features/steps/Cloudinary.ts +13 -0
  142. package/features/steps/Components.ts +0 -4
  143. package/features/steps/Gateway.ts +19 -2
  144. package/features/steps/Parameters.ts +18 -7
  145. package/features/steps/Realtime.ts +3 -0
  146. package/features/steps/components/echo/manifest.toa.yaml +1 -0
  147. package/features/steps/components/pots/manifest.toa.yaml +2 -0
  148. package/package.json +3 -3
  149. package/readme.md +3 -0
  150. package/schemas/annotation.cos.yaml +33 -0
  151. package/schemas/call.cos.yaml +18 -0
  152. package/source/Annotation.ts +31 -0
  153. package/source/Directive.test.ts +15 -15
  154. package/source/Directive.ts +77 -9
  155. package/source/Endpoint.test.ts +67 -0
  156. package/source/Endpoint.ts +31 -11
  157. package/source/Factory.ts +5 -1
  158. package/source/Gateway.ts +73 -11
  159. package/source/HTTP/Context.ts +7 -0
  160. package/source/HTTP/Server.ts +7 -1
  161. package/source/HTTP/exceptions.ts +2 -2
  162. package/source/HTTP/messages.ts +10 -1
  163. package/source/Introspection.ts +105 -0
  164. package/source/MCP/Server.ts +275 -0
  165. package/source/MCP/discover.ts +52 -0
  166. package/source/MCP/errors.ts +81 -0
  167. package/source/MCP/index.ts +1 -0
  168. package/source/MCP/schema.test.ts +85 -0
  169. package/source/MCP/schema.ts +87 -0
  170. package/source/MCP/tools.ts +157 -0
  171. package/source/MCP/types.ts +84 -0
  172. package/source/Query.ts +48 -8
  173. package/source/RPC/Context.ts +78 -0
  174. package/source/RPC/Dispatcher.ts +130 -0
  175. package/source/RPC/errors.test.ts +52 -0
  176. package/source/RPC/errors.ts +83 -0
  177. package/source/RPC/index.ts +1 -0
  178. package/source/RPC/names.test.ts +122 -0
  179. package/source/RPC/names.ts +183 -0
  180. package/source/RPC/types.ts +34 -0
  181. package/source/RTD/Directives.ts +52 -2
  182. package/source/RTD/Endpoint.ts +2 -1
  183. package/source/RTD/Method.ts +14 -11
  184. package/source/RTD/Node.ts +38 -7
  185. package/source/RTD/Route.ts +30 -3
  186. package/source/RTD/Tree.ts +37 -1
  187. package/source/RTD/expiration.test.ts +1 -1
  188. package/source/RTD/walk.test.ts +110 -0
  189. package/source/const.ts +15 -0
  190. package/source/deployment.ts +8 -1
  191. package/source/directives/auth/Anonymous.test.ts +38 -0
  192. package/source/directives/auth/Anonymous.ts +12 -0
  193. package/source/directives/auth/Anyone.ts +4 -0
  194. package/source/directives/auth/Authorization.ts +62 -3
  195. package/source/directives/auth/Delegate.test.ts +36 -0
  196. package/source/directives/auth/Delegate.ts +14 -0
  197. package/source/directives/auth/Echo.ts +5 -0
  198. package/source/directives/auth/Incept.ts +2 -1
  199. package/source/directives/auth/Role.ts +13 -0
  200. package/source/directives/auth/Rule.ts +29 -0
  201. package/source/directives/auth/Scheme.ts +5 -0
  202. package/source/directives/auth/types.ts +21 -0
  203. package/source/directives/cache/Cache.ts +1 -1
  204. package/source/directives/dev/Development.ts +1 -1
  205. package/source/directives/flow/Flow.ts +1 -1
  206. package/source/directives/index.ts +3 -1
  207. package/source/directives/io/Directive.ts +1 -1
  208. package/source/directives/io/IO.ts +32 -3
  209. package/source/directives/io/Input.ts +3 -2
  210. package/source/directives/io/Output.ts +6 -3
  211. package/source/directives/io/Status.test.ts +2 -2
  212. package/source/directives/io/Status.ts +1 -1
  213. package/source/directives/io/Throttle.ts +1 -1
  214. package/source/directives/io/lib/throttle/Quotas.ts +2 -2
  215. package/source/directives/map/Headers.ts +11 -0
  216. package/source/directives/map/Map.ts +10 -1
  217. package/source/directives/map/Mapping.ts +23 -0
  218. package/source/directives/map/Segments.ts +12 -0
  219. package/source/directives/mcp/MCP.ts +40 -0
  220. package/source/directives/mcp/Tool.test.ts +90 -0
  221. package/source/directives/mcp/Tool.ts +47 -0
  222. package/source/directives/mcp/index.ts +6 -0
  223. package/source/directives/oauth/Discovery.ts +10 -16
  224. package/source/directives/octets/Octets.ts +1 -1
  225. package/source/directives/require/Directive.ts +1 -1
  226. package/source/directives/require/Headers.ts +1 -1
  227. package/source/directives/require/Require.ts +2 -2
  228. package/source/schemas.ts +2 -0
  229. package/transpiled/Annotation.d.ts +24 -0
  230. package/transpiled/Directive.d.ts +18 -1
  231. package/transpiled/Directive.js +50 -6
  232. package/transpiled/Directive.js.map +1 -1
  233. package/transpiled/Endpoint.d.ts +9 -0
  234. package/transpiled/Endpoint.js +27 -11
  235. package/transpiled/Endpoint.js.map +1 -1
  236. package/transpiled/Factory.js +5 -1
  237. package/transpiled/Factory.js.map +1 -1
  238. package/transpiled/Gateway.d.ts +19 -2
  239. package/transpiled/Gateway.js +51 -9
  240. package/transpiled/Gateway.js.map +1 -1
  241. package/transpiled/HTTP/Context.d.ts +6 -0
  242. package/transpiled/HTTP/Context.js +6 -0
  243. package/transpiled/HTTP/Context.js.map +1 -1
  244. package/transpiled/HTTP/Server.d.ts +5 -1
  245. package/transpiled/HTTP/exceptions.d.ts +1 -1
  246. package/transpiled/HTTP/exceptions.js +2 -2
  247. package/transpiled/HTTP/exceptions.js.map +1 -1
  248. package/transpiled/HTTP/messages.d.ts +6 -0
  249. package/transpiled/HTTP/messages.js +9 -1
  250. package/transpiled/HTTP/messages.js.map +1 -1
  251. package/transpiled/Introspection.d.ts +42 -0
  252. package/transpiled/Introspection.js +50 -1
  253. package/transpiled/Introspection.js.map +1 -1
  254. package/transpiled/MCP/Server.d.ts +41 -0
  255. package/transpiled/MCP/Server.js +180 -0
  256. package/transpiled/MCP/Server.js.map +1 -0
  257. package/transpiled/MCP/discover.d.ts +13 -0
  258. package/transpiled/MCP/discover.js +29 -0
  259. package/transpiled/MCP/discover.js.map +1 -0
  260. package/transpiled/MCP/errors.d.ts +24 -0
  261. package/transpiled/MCP/errors.js +67 -0
  262. package/transpiled/MCP/errors.js.map +1 -0
  263. package/transpiled/MCP/index.d.ts +1 -0
  264. package/transpiled/MCP/index.js +2 -0
  265. package/transpiled/MCP/index.js.map +1 -0
  266. package/transpiled/MCP/schema.d.ts +18 -0
  267. package/transpiled/MCP/schema.js +64 -0
  268. package/transpiled/MCP/schema.js.map +1 -0
  269. package/transpiled/MCP/tools.d.ts +31 -0
  270. package/transpiled/MCP/tools.js +122 -0
  271. package/transpiled/MCP/tools.js.map +1 -0
  272. package/transpiled/MCP/types.d.ts +66 -0
  273. package/transpiled/MCP/types.js +13 -0
  274. package/transpiled/MCP/types.js.map +1 -0
  275. package/transpiled/Query.d.ts +7 -0
  276. package/transpiled/Query.js +38 -7
  277. package/transpiled/Query.js.map +1 -1
  278. package/transpiled/RPC/Context.d.ts +11 -0
  279. package/transpiled/RPC/Context.js +63 -0
  280. package/transpiled/RPC/Context.js.map +1 -0
  281. package/transpiled/RPC/Dispatcher.d.ts +19 -0
  282. package/transpiled/RPC/Dispatcher.js +100 -0
  283. package/transpiled/RPC/Dispatcher.js.map +1 -0
  284. package/transpiled/RPC/errors.d.ts +18 -0
  285. package/transpiled/RPC/errors.js +67 -0
  286. package/transpiled/RPC/errors.js.map +1 -0
  287. package/transpiled/RPC/index.d.ts +1 -0
  288. package/transpiled/RPC/index.js +2 -0
  289. package/transpiled/RPC/index.js.map +1 -0
  290. package/transpiled/RPC/names.d.ts +31 -0
  291. package/transpiled/RPC/names.js +121 -0
  292. package/transpiled/RPC/names.js.map +1 -0
  293. package/transpiled/RPC/types.d.ts +27 -0
  294. package/transpiled/RPC/types.js +8 -0
  295. package/transpiled/RPC/types.js.map +1 -0
  296. package/transpiled/RTD/Directives.d.ts +41 -2
  297. package/transpiled/RTD/Endpoint.d.ts +2 -1
  298. package/transpiled/RTD/Method.d.ts +8 -3
  299. package/transpiled/RTD/Method.js +12 -10
  300. package/transpiled/RTD/Method.js.map +1 -1
  301. package/transpiled/RTD/Node.d.ts +20 -2
  302. package/transpiled/RTD/Node.js +22 -4
  303. package/transpiled/RTD/Node.js.map +1 -1
  304. package/transpiled/RTD/Route.d.ts +2 -1
  305. package/transpiled/RTD/Route.js +27 -2
  306. package/transpiled/RTD/Route.js.map +1 -1
  307. package/transpiled/RTD/Tree.d.ts +3 -1
  308. package/transpiled/RTD/Tree.js +26 -0
  309. package/transpiled/RTD/Tree.js.map +1 -1
  310. package/transpiled/const.d.ts +12 -0
  311. package/transpiled/const.js +12 -0
  312. package/transpiled/const.js.map +1 -1
  313. package/transpiled/deployment.js +4 -0
  314. package/transpiled/deployment.js.map +1 -1
  315. package/transpiled/directives/auth/Anonymous.d.ts +6 -0
  316. package/transpiled/directives/auth/Anonymous.js +10 -0
  317. package/transpiled/directives/auth/Anonymous.js.map +1 -1
  318. package/transpiled/directives/auth/Anyone.d.ts +1 -0
  319. package/transpiled/directives/auth/Anyone.js +3 -0
  320. package/transpiled/directives/auth/Anyone.js.map +1 -1
  321. package/transpiled/directives/auth/Authorization.d.ts +27 -1
  322. package/transpiled/directives/auth/Authorization.js +49 -1
  323. package/transpiled/directives/auth/Authorization.js.map +1 -1
  324. package/transpiled/directives/auth/Delegate.d.ts +5 -0
  325. package/transpiled/directives/auth/Delegate.js +10 -0
  326. package/transpiled/directives/auth/Delegate.js.map +1 -1
  327. package/transpiled/directives/auth/Echo.d.ts +2 -0
  328. package/transpiled/directives/auth/Echo.js +4 -0
  329. package/transpiled/directives/auth/Echo.js.map +1 -1
  330. package/transpiled/directives/auth/Incept.js +2 -1
  331. package/transpiled/directives/auth/Incept.js.map +1 -1
  332. package/transpiled/directives/auth/Role.d.ts +2 -0
  333. package/transpiled/directives/auth/Role.js +9 -0
  334. package/transpiled/directives/auth/Role.js.map +1 -1
  335. package/transpiled/directives/auth/Rule.d.ts +5 -0
  336. package/transpiled/directives/auth/Rule.js +20 -0
  337. package/transpiled/directives/auth/Rule.js.map +1 -1
  338. package/transpiled/directives/auth/Scheme.d.ts +2 -0
  339. package/transpiled/directives/auth/Scheme.js +4 -0
  340. package/transpiled/directives/auth/Scheme.js.map +1 -1
  341. package/transpiled/directives/auth/types.d.ts +16 -0
  342. package/transpiled/directives/cache/Cache.d.ts +1 -1
  343. package/transpiled/directives/cache/Cache.js +1 -1
  344. package/transpiled/directives/cache/Cache.js.map +1 -1
  345. package/transpiled/directives/dev/Development.d.ts +1 -1
  346. package/transpiled/directives/dev/Development.js +1 -1
  347. package/transpiled/directives/dev/Development.js.map +1 -1
  348. package/transpiled/directives/flow/Flow.d.ts +1 -1
  349. package/transpiled/directives/flow/Flow.js +1 -1
  350. package/transpiled/directives/flow/Flow.js.map +1 -1
  351. package/transpiled/directives/index.js +2 -1
  352. package/transpiled/directives/index.js.map +1 -1
  353. package/transpiled/directives/io/Directive.d.ts +1 -1
  354. package/transpiled/directives/io/IO.d.ts +7 -1
  355. package/transpiled/directives/io/IO.js +23 -3
  356. package/transpiled/directives/io/IO.js.map +1 -1
  357. package/transpiled/directives/io/Input.d.ts +3 -2
  358. package/transpiled/directives/io/Input.js +2 -1
  359. package/transpiled/directives/io/Input.js.map +1 -1
  360. package/transpiled/directives/io/Output.d.ts +5 -3
  361. package/transpiled/directives/io/Output.js +4 -2
  362. package/transpiled/directives/io/Output.js.map +1 -1
  363. package/transpiled/directives/io/Status.d.ts +1 -1
  364. package/transpiled/directives/io/Status.js +1 -1
  365. package/transpiled/directives/io/Status.js.map +1 -1
  366. package/transpiled/directives/io/Throttle.d.ts +1 -1
  367. package/transpiled/directives/io/Throttle.js +1 -1
  368. package/transpiled/directives/io/Throttle.js.map +1 -1
  369. package/transpiled/directives/io/lib/throttle/Quotas.d.ts +1 -1
  370. package/transpiled/directives/io/lib/throttle/Quotas.js +2 -2
  371. package/transpiled/directives/io/lib/throttle/Quotas.js.map +1 -1
  372. package/transpiled/directives/map/Headers.d.ts +2 -0
  373. package/transpiled/directives/map/Headers.js +8 -0
  374. package/transpiled/directives/map/Headers.js.map +1 -1
  375. package/transpiled/directives/map/Map.d.ts +3 -1
  376. package/transpiled/directives/map/Map.js +7 -1
  377. package/transpiled/directives/map/Map.js.map +1 -1
  378. package/transpiled/directives/map/Mapping.d.ts +13 -0
  379. package/transpiled/directives/map/Mapping.js +20 -0
  380. package/transpiled/directives/map/Mapping.js.map +1 -1
  381. package/transpiled/directives/map/Segments.d.ts +3 -0
  382. package/transpiled/directives/map/Segments.js +9 -0
  383. package/transpiled/directives/map/Segments.js.map +1 -1
  384. package/transpiled/directives/mcp/MCP.d.ts +15 -0
  385. package/transpiled/directives/mcp/MCP.js +29 -0
  386. package/transpiled/directives/mcp/MCP.js.map +1 -0
  387. package/transpiled/directives/mcp/Tool.d.ts +18 -0
  388. package/transpiled/directives/mcp/Tool.js +34 -0
  389. package/transpiled/directives/mcp/Tool.js.map +1 -0
  390. package/transpiled/directives/mcp/index.d.ts +4 -0
  391. package/transpiled/directives/mcp/index.js +4 -0
  392. package/transpiled/directives/mcp/index.js.map +1 -0
  393. package/transpiled/directives/oauth/Discovery.js +10 -13
  394. package/transpiled/directives/oauth/Discovery.js.map +1 -1
  395. package/transpiled/directives/octets/Octets.d.ts +1 -1
  396. package/transpiled/directives/octets/Octets.js +1 -1
  397. package/transpiled/directives/octets/Octets.js.map +1 -1
  398. package/transpiled/directives/require/Directive.d.ts +1 -1
  399. package/transpiled/directives/require/Headers.d.ts +1 -1
  400. package/transpiled/directives/require/Headers.js +1 -1
  401. package/transpiled/directives/require/Headers.js.map +1 -1
  402. package/transpiled/directives/require/Require.d.ts +1 -1
  403. package/transpiled/directives/require/Require.js +2 -2
  404. package/transpiled/directives/require/Require.js.map +1 -1
  405. package/transpiled/schemas.d.ts +2 -0
  406. package/transpiled/schemas.js +1 -0
  407. package/transpiled/schemas.js.map +1 -1
  408. package/tsconfig.tsbuildinfo +1 -1
  409. package/components/identity.bans/operations/transit.d.ts +0 -14
  410. package/components/identity.bans/operations/transit.js.map +0 -1
  411. package/components/identity.basic/operations/add.d.ts +0 -3
  412. package/components/identity.basic/operations/add.js.map +0 -1
  413. package/components/identity.basic/operations/authenticate.d.ts +0 -13
  414. package/components/identity.basic/operations/authenticate.js.map +0 -1
  415. package/components/identity.basic/operations/check.d.ts +0 -7
  416. package/components/identity.basic/operations/check.js.map +0 -1
  417. package/components/identity.basic/operations/delete.d.ts +0 -7
  418. package/components/identity.basic/operations/delete.js.map +0 -1
  419. package/components/identity.basic/operations/incept.d.ts +0 -12
  420. package/components/identity.basic/operations/incept.js.map +0 -1
  421. package/components/identity.basic/operations/info.d.ts +0 -10
  422. package/components/identity.basic/operations/info.js.map +0 -1
  423. package/components/identity.basic/operations/lib/credentials.d.ts +0 -5
  424. package/components/identity.basic/operations/lib/credentials.js.map +0 -1
  425. package/components/identity.basic/operations/transit.d.ts +0 -15
  426. package/components/identity.basic/operations/transit.js.map +0 -1
  427. package/components/identity.clients/operations/describe.d.ts +0 -27
  428. package/components/identity.clients/operations/describe.js.map +0 -1
  429. package/components/identity.clients/operations/lib/Context.d.ts +0 -29
  430. package/components/identity.clients/operations/lib/Context.js.map +0 -1
  431. package/components/identity.clients/operations/lib/Entity.d.ts +0 -29
  432. package/components/identity.clients/operations/lib/Entity.js.map +0 -1
  433. package/components/identity.clients/operations/lib/canonical.d.ts +0 -11
  434. package/components/identity.clients/operations/lib/canonical.js.map +0 -1
  435. package/components/identity.clients/operations/lib/cimd.d.ts +0 -8
  436. package/components/identity.clients/operations/lib/cimd.js.map +0 -1
  437. package/components/identity.clients/operations/lib/errors.d.ts +0 -7
  438. package/components/identity.clients/operations/lib/errors.js.map +0 -1
  439. package/components/identity.clients/operations/lib/index.d.ts +0 -6
  440. package/components/identity.clients/operations/lib/index.js.map +0 -1
  441. package/components/identity.clients/operations/lib/redirect.d.ts +0 -10
  442. package/components/identity.clients/operations/lib/redirect.js.map +0 -1
  443. package/components/identity.clients/operations/register.d.ts +0 -37
  444. package/components/identity.clients/operations/register.js.map +0 -1
  445. package/components/identity.credentials/operations/list.d.ts +0 -52
  446. package/components/identity.credentials/operations/list.js.map +0 -1
  447. package/components/identity.federation/operations/authenticate.d.ts +0 -16
  448. package/components/identity.federation/operations/authenticate.js.map +0 -1
  449. package/components/identity.federation/operations/create.d.ts +0 -8
  450. package/components/identity.federation/operations/create.js.map +0 -1
  451. package/components/identity.federation/operations/decode.d.ts +0 -3
  452. package/components/identity.federation/operations/decode.js.map +0 -1
  453. package/components/identity.federation/operations/delete.d.ts +0 -8
  454. package/components/identity.federation/operations/delete.js.map +0 -1
  455. package/components/identity.federation/operations/incept.d.ts +0 -11
  456. package/components/identity.federation/operations/incept.js.map +0 -1
  457. package/components/identity.federation/operations/lib/Configuration.d.ts +0 -39
  458. package/components/identity.federation/operations/lib/Configuration.js.map +0 -1
  459. package/components/identity.federation/operations/lib/Ctx.d.ts +0 -8
  460. package/components/identity.federation/operations/lib/Ctx.js.map +0 -1
  461. package/components/identity.federation/operations/lib/Payload.d.ts +0 -5
  462. package/components/identity.federation/operations/lib/Payload.js.map +0 -1
  463. package/components/identity.federation/operations/lib/decode.d.ts +0 -3
  464. package/components/identity.federation/operations/lib/decode.js.map +0 -1
  465. package/components/identity.federation/operations/lib/discovery.d.ts +0 -5
  466. package/components/identity.federation/operations/lib/discovery.js.map +0 -1
  467. package/components/identity.federation/operations/lib/errors.d.ts +0 -77
  468. package/components/identity.federation/operations/lib/errors.js.map +0 -1
  469. package/components/identity.federation/operations/lib/exchange.d.ts +0 -3
  470. package/components/identity.federation/operations/lib/exchange.js.map +0 -1
  471. package/components/identity.federation/operations/lib/index.d.ts +0 -4
  472. package/components/identity.federation/operations/lib/index.js.map +0 -1
  473. package/components/identity.federation/operations/lib/jose.d.ts +0 -1
  474. package/components/identity.federation/operations/lib/jose.js.map +0 -1
  475. package/components/identity.federation/operations/lib/resolve.d.ts +0 -3
  476. package/components/identity.federation/operations/lib/resolve.js.map +0 -1
  477. package/components/identity.federation/operations/list.d.ts +0 -7
  478. package/components/identity.federation/operations/list.js.map +0 -1
  479. package/components/identity.federation/operations/types/Scheme.d.ts +0 -1
  480. package/components/identity.federation/operations/types/Scheme.js.map +0 -1
  481. package/components/identity.federation/operations/types/configuration.d.ts +0 -22
  482. package/components/identity.federation/operations/types/configuration.js.map +0 -1
  483. package/components/identity.federation/operations/types/context.d.ts +0 -36
  484. package/components/identity.federation/operations/types/context.js.map +0 -1
  485. package/components/identity.federation/operations/types/entity.d.ts +0 -9
  486. package/components/identity.federation/operations/types/entity.js.map +0 -1
  487. package/components/identity.federation/operations/types/index.d.ts +0 -4
  488. package/components/identity.federation/operations/types/index.js.map +0 -1
  489. package/components/identity.grants/operations/authorize.d.ts +0 -35
  490. package/components/identity.grants/operations/authorize.js.map +0 -1
  491. package/components/identity.grants/operations/exchange.d.ts +0 -37
  492. package/components/identity.grants/operations/exchange.js.map +0 -1
  493. package/components/identity.grants/operations/lib/code.d.ts +0 -15
  494. package/components/identity.grants/operations/lib/code.js.map +0 -1
  495. package/components/identity.grants/operations/lib/identify.d.ts +0 -6
  496. package/components/identity.grants/operations/lib/identify.js.map +0 -1
  497. package/components/identity.grants/operations/lib/index.d.ts +0 -3
  498. package/components/identity.grants/operations/lib/index.js.map +0 -1
  499. package/components/identity.grants/operations/list.d.ts +0 -13
  500. package/components/identity.grants/operations/list.js.map +0 -1
  501. package/components/identity.grants/operations/revoke.d.ts +0 -18
  502. package/components/identity.grants/operations/revoke.js.map +0 -1
  503. package/components/identity.keys/operations/create.d.ts +0 -22
  504. package/components/identity.keys/operations/create.js.map +0 -1
  505. package/components/identity.keys/operations/disable.d.ts +0 -5
  506. package/components/identity.keys/operations/disable.js.map +0 -1
  507. package/components/identity.keys/operations/revoke.d.ts +0 -15
  508. package/components/identity.keys/operations/revoke.js.map +0 -1
  509. package/components/identity.otp/operations/authenticate.d.ts +0 -12
  510. package/components/identity.otp/operations/authenticate.js.map +0 -1
  511. package/components/identity.otp/operations/issue.d.ts +0 -12
  512. package/components/identity.otp/operations/issue.js.map +0 -1
  513. package/components/identity.otp/operations/lib/Context.d.ts +0 -16
  514. package/components/identity.otp/operations/lib/Context.js.map +0 -1
  515. package/components/identity.otp/operations/lib/Entity.d.ts +0 -6
  516. package/components/identity.otp/operations/lib/Entity.js.map +0 -1
  517. package/components/identity.otp/operations/lib/index.d.ts +0 -1
  518. package/components/identity.otp/operations/lib/index.js.map +0 -1
  519. package/components/identity.passkeys/operations/authenticate.d.ts +0 -16
  520. package/components/identity.passkeys/operations/authenticate.js.map +0 -1
  521. package/components/identity.passkeys/operations/challenge.d.ts +0 -35
  522. package/components/identity.passkeys/operations/challenge.js.map +0 -1
  523. package/components/identity.passkeys/operations/create.d.ts +0 -19
  524. package/components/identity.passkeys/operations/create.js.map +0 -1
  525. package/components/identity.passkeys/operations/delete.d.ts +0 -8
  526. package/components/identity.passkeys/operations/delete.js.map +0 -1
  527. package/components/identity.passkeys/operations/lib/const.d.ts +0 -1
  528. package/components/identity.passkeys/operations/lib/const.js.map +0 -1
  529. package/components/identity.passkeys/operations/list.d.ts +0 -7
  530. package/components/identity.passkeys/operations/list.js.map +0 -1
  531. package/components/identity.passkeys/operations/types/Configuration.d.ts +0 -6
  532. package/components/identity.passkeys/operations/types/Configuration.js.map +0 -1
  533. package/components/identity.passkeys/operations/types/Context.d.ts +0 -16
  534. package/components/identity.passkeys/operations/types/Context.js.map +0 -1
  535. package/components/identity.passkeys/operations/types/Passkey.d.ts +0 -12
  536. package/components/identity.passkeys/operations/types/Passkey.js.map +0 -1
  537. package/components/identity.passkeys/operations/types/index.d.ts +0 -2
  538. package/components/identity.passkeys/operations/types/index.js.map +0 -1
  539. package/components/identity.passkeys/operations/use.d.ts +0 -16
  540. package/components/identity.passkeys/operations/use.js.map +0 -1
  541. package/components/identity.roles/operations/grant.d.ts +0 -10
  542. package/components/identity.roles/operations/grant.js.map +0 -1
  543. package/components/identity.roles/operations/lib/Entity.d.ts +0 -5
  544. package/components/identity.roles/operations/lib/Entity.js.map +0 -1
  545. package/components/identity.roles/operations/list.d.ts +0 -2
  546. package/components/identity.roles/operations/list.js.map +0 -1
  547. package/components/identity.roles/operations/principal.d.ts +0 -13
  548. package/components/identity.roles/operations/principal.js.map +0 -1
  549. package/components/identity.tokens/operations/authenticate.d.ts +0 -10
  550. package/components/identity.tokens/operations/authenticate.js.map +0 -1
  551. package/components/identity.tokens/operations/decrypt.d.ts +0 -16
  552. package/components/identity.tokens/operations/decrypt.js.map +0 -1
  553. package/components/identity.tokens/operations/encrypt.d.ts +0 -9
  554. package/components/identity.tokens/operations/encrypt.js.map +0 -1
  555. package/components/identity.tokens/operations/issue.d.ts +0 -25
  556. package/components/identity.tokens/operations/issue.js.map +0 -1
  557. package/components/identity.tokens/operations/lib/form.d.ts +0 -8
  558. package/components/identity.tokens/operations/lib/form.js.map +0 -1
  559. package/components/identity.tokens/operations/lib/index.d.ts +0 -4
  560. package/components/identity.tokens/operations/lib/index.js.map +0 -1
  561. package/components/identity.tokens/operations/lib/jose.d.ts +0 -1
  562. package/components/identity.tokens/operations/lib/jose.js.map +0 -1
  563. package/components/identity.tokens/operations/lib/key.d.ts +0 -1
  564. package/components/identity.tokens/operations/lib/key.js.map +0 -1
  565. package/components/identity.tokens/operations/lib/pad.d.ts +0 -1
  566. package/components/identity.tokens/operations/lib/pad.js.map +0 -1
  567. package/components/identity.tokens/operations/revoke.d.ts +0 -2
  568. package/components/identity.tokens/operations/revoke.js.map +0 -1
@@ -11,14 +11,10 @@ Feature: Authorization server discovery
11
11
  nex: nex.toa.io
12
12
  oauth:
13
13
  authorize: https://app.nex.toa.io/oauth/authorize
14
- resources: ['/mcp/']
14
+ resources: ['/.mcp']
15
15
  scopes: [app:notes]
16
- /:
17
- io:output: true
18
- /mcp/**:
19
- anyone: true
20
- GET:
21
- dev:stub: Tools
16
+ mcp:
17
+ name: Teapots
22
18
  """
23
19
 
24
20
  Scenario: The authorization server names its endpoints
@@ -64,7 +60,7 @@ Feature: Authorization server discovery
64
60
  Scenario: The protected resource is named by the path it is reached at
65
61
  When the following request is received:
66
62
  """
67
- GET /.well-known/oauth-protected-resource/mcp HTTP/1.1
63
+ GET /.well-known/oauth-protected-resource/.mcp HTTP/1.1
68
64
  host: nex.toa.io
69
65
  accept: application/yaml
70
66
  """
@@ -72,7 +68,7 @@ Feature: Authorization server discovery
72
68
  """
73
69
  200 OK
74
70
 
75
- resource: https://nex.toa.io/mcp
71
+ resource: https://nex.toa.io/.mcp
76
72
  authorization_servers:
77
73
  - https://nex.toa.io
78
74
  bearer_methods_supported:
@@ -119,14 +115,17 @@ Feature: Authorization server discovery
119
115
  Scenario: The challenge names the resource the request was refused at
120
116
  When the following request is received:
121
117
  """
122
- GET /mcp/tools/ HTTP/1.1
118
+ POST /.mcp HTTP/1.1
123
119
  host: nex.toa.io
124
120
  accept: text/plain
121
+ content-type: application/json
122
+
123
+ {"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}
125
124
  """
126
125
  Then the following reply is sent:
127
126
  """
128
127
  401 Unauthorized
129
- www-authenticate: Bearer resource_metadata="https://nex.toa.io/.well-known/oauth-protected-resource/mcp", scope="app:notes"
128
+ www-authenticate: Bearer resource_metadata="https://nex.toa.io/.well-known/oauth-protected-resource/.mcp", scope="app:notes"
130
129
  """
131
130
 
132
131
  Scenario: A host named after a property a plain object answers on its own
@@ -17,14 +17,17 @@ Feature: Authorization code flow
17
17
  nex: nex.toa.io
18
18
  oauth:
19
19
  authorize: https://app.nex.toa.io/oauth/authorize
20
- resources: ['/mcp/']
20
+ resources: ['/.mcp']
21
21
  registration: open
22
+ mcp:
23
+ name: Teapots
22
24
  /:
23
25
  io:output: true
24
- /mcp/**:
26
+ /pots:
25
27
  anyone: true
26
28
  GET:
27
- dev:stub: Tools
29
+ mcp:tool: Every pot there is.
30
+ dev:stub: Kettles and teapots.
28
31
  """
29
32
  When the following request is received:
30
33
  """
@@ -69,14 +72,17 @@ Feature: Authorization code flow
69
72
  # nothing yet, and the client is told where to get one
70
73
  When the following request is received:
71
74
  """
72
- GET /mcp/tools/ HTTP/1.1
75
+ POST /.mcp HTTP/1.1
73
76
  host: nex.toa.io
74
- accept: text/plain
77
+ accept: application/yaml
78
+ content-type: application/json
79
+
80
+ {"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}
75
81
  """
76
82
  Then the following reply is sent:
77
83
  """
78
84
  401 Unauthorized
79
- www-authenticate: Bearer resource_metadata="https://nex.toa.io/.well-known/oauth-protected-resource/mcp"
85
+ www-authenticate: Bearer resource_metadata="https://nex.toa.io/.well-known/oauth-protected-resource/.mcp"
80
86
  """
81
87
  When the following request is received:
82
88
  """
@@ -97,16 +103,23 @@ Feature: Authorization code flow
97
103
  """
98
104
  When the following request is received:
99
105
  """
100
- GET /mcp/tools/ HTTP/1.1
106
+ POST /.mcp HTTP/1.1
101
107
  host: nex.toa.io
102
108
  authorization: Bearer ${{ access_token }}
103
- accept: text/plain
109
+ accept: application/yaml
110
+ content-type: application/json
111
+
112
+ {"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}
104
113
  """
105
114
  Then the following reply is sent:
106
115
  """
107
116
  200 OK
108
117
 
109
- Tools
118
+ jsonrpc: '2.0'
119
+ id: 1
120
+ result:
121
+ tools:
122
+ - name: pots.GET
110
123
  """
111
124
 
112
125
  Scenario: A code is spent once
@@ -1,3 +1,4 @@
1
+ @cloudinary
1
2
  Feature: Octets with Cloudinary storage
2
3
 
3
4
  Background:
@@ -0,0 +1,429 @@
1
+ Feature: JSON-RPC
2
+
3
+ A procedure is an RTD method addressed by name: the route template with its variables
4
+ marked, and the verb as the last segment. Nothing is declared for it — what is exposed as
5
+ a resource is exposed as a procedure, under the same directives.
6
+
7
+ Background:
8
+ Given the annotation:
9
+ """yaml
10
+ rpc: {}
11
+ """
12
+ And the `pots` is running with the following manifest:
13
+ """yaml
14
+ exposition:
15
+ /:
16
+ io:output: true
17
+ anonymous: true
18
+ GET: enumerate
19
+ POST: create
20
+ /:id:
21
+ GET: observe
22
+ /guarded:
23
+ isolated: true
24
+ GET:
25
+ auth:role: admin
26
+ dev:stub: never
27
+ /faulty:
28
+ GET:
29
+ dev:throw: nope
30
+ /v1.0:
31
+ GET:
32
+ dev:stub: never
33
+ """
34
+ And the `pots` database contains:
35
+ | _id | title | volume |
36
+ | 4c4759e6f9c74da989d64511df42d6f4 | First pot | 100 |
37
+
38
+ Scenario: A variable is taken from the parameters
39
+ When the following request is received:
40
+ """
41
+ POST /.rpc HTTP/1.1
42
+ host: nex.toa.io
43
+ accept: application/yaml
44
+ content-type: application/json
45
+
46
+ {"jsonrpc": "2.0", "id": 1, "method": "pots._id.GET",
47
+ "params": {"id": "4c4759e6f9c74da989d64511df42d6f4"}}
48
+ """
49
+ Then the following reply is sent:
50
+ """
51
+ 200 OK
52
+ cache-control: no-store
53
+
54
+ jsonrpc: '2.0'
55
+ id: 1
56
+ result:
57
+ id: 4c4759e6f9c74da989d64511df42d6f4
58
+ title: First pot
59
+ volume: 100
60
+ """
61
+
62
+ Scenario: What is left of the parameters is the input
63
+ When the following request is received:
64
+ """
65
+ POST /.rpc HTTP/1.1
66
+ host: nex.toa.io
67
+ accept: application/yaml
68
+ content-type: application/json
69
+
70
+ {"jsonrpc": "2.0", "id": 2, "method": "pots.POST",
71
+ "params": {"title": "Kettle", "volume": 1.7}}
72
+ """
73
+ Then the following reply is sent:
74
+ """
75
+ 200 OK
76
+
77
+ jsonrpc: '2.0'
78
+ id: 2
79
+ result:
80
+ id:
81
+ """
82
+
83
+ Scenario: A query travels under a name of its own
84
+ When the following request is received:
85
+ """
86
+ POST /.rpc HTTP/1.1
87
+ host: nex.toa.io
88
+ accept: application/yaml
89
+ content-type: application/json
90
+
91
+ {"jsonrpc": "2.0", "id": 3, "method": "pots.GET",
92
+ "params": {"query": {"limit": 1}}}
93
+ """
94
+ Then the following reply is sent:
95
+ """
96
+ 200 OK
97
+
98
+ jsonrpc: '2.0'
99
+ id: 3
100
+ result:
101
+ - id: 4c4759e6f9c74da989d64511df42d6f4
102
+ """
103
+
104
+ Scenario: A call without an id answers nothing
105
+ When the following request is received:
106
+ """
107
+ POST /.rpc HTTP/1.1
108
+ host: nex.toa.io
109
+ content-type: application/json
110
+
111
+ {"jsonrpc": "2.0", "method": "pots.POST", "params": {"title": "Pot", "volume": 1}}
112
+ """
113
+ Then the following reply is sent:
114
+ """
115
+ 204 No Content
116
+ """
117
+
118
+ Scenario: A name nothing answers to
119
+ When the following request is received:
120
+ """
121
+ POST /.rpc HTTP/1.1
122
+ host: nex.toa.io
123
+ accept: application/yaml
124
+ content-type: application/json
125
+
126
+ {"jsonrpc": "2.0", "id": 4, "method": "kettles.GET", "params": {}}
127
+ """
128
+ Then the following reply is sent:
129
+ """
130
+ 200 OK
131
+
132
+ jsonrpc: '2.0'
133
+ id: 4
134
+ error:
135
+ code: -32601
136
+ """
137
+
138
+ Scenario: A credential does not refuse an anonymous procedure
139
+ What refuses a credentialed request at an `anonymous` route is that the reply would not
140
+ be cacheable, and what a procedure answers is not a reply.
141
+
142
+ # developer:secret
143
+ Given the `identity.basic` database contains:
144
+ | _id | authority | username | password |
145
+ | efe3a65ebbee47ed95a73edd911ea328 | nex | developer | $2b$10$ZRSKkgZoGnrcTNA5w5eCcu3pxDzdTduhteVYXcp56AaNcilNkwJ.O |
146
+ And the `identity.bans` database is empty
147
+ When the following request is received:
148
+ """
149
+ GET /pots/ HTTP/1.1
150
+ host: nex.toa.io
151
+ authorization: Basic ZGV2ZWxvcGVyOnNlY3JldA==
152
+ accept: application/yaml
153
+ """
154
+ Then the following reply is sent:
155
+ """
156
+ 403 Forbidden
157
+ """
158
+ When the following request is received:
159
+ """
160
+ POST /.rpc HTTP/1.1
161
+ host: nex.toa.io
162
+ authorization: Basic ZGV2ZWxvcGVyOnNlY3JldA==
163
+ accept: application/yaml
164
+ content-type: application/json
165
+
166
+ {"jsonrpc": "2.0", "id": 17, "method": "pots.GET", "params": {}}
167
+ """
168
+ Then the following reply is sent:
169
+ """
170
+ 200 OK
171
+
172
+ jsonrpc: '2.0'
173
+ id: 17
174
+ result:
175
+ - id: 4c4759e6f9c74da989d64511df42d6f4
176
+ """
177
+
178
+ Scenario: A route no name can spell
179
+ A segment holding a `.` or a `_` has no name, so nothing addresses it — the resource
180
+ itself is served over HTTP as it always was.
181
+
182
+ When the following request is received:
183
+ """
184
+ POST /.rpc HTTP/1.1
185
+ host: nex.toa.io
186
+ accept: application/yaml
187
+ content-type: application/json
188
+
189
+ {"jsonrpc": "2.0", "id": 16, "method": "pots/v1.0/GET", "params": {}}
190
+ """
191
+ Then the following reply is sent:
192
+ """
193
+ 200 OK
194
+
195
+ jsonrpc: '2.0'
196
+ id: 16
197
+ error:
198
+ code: -32601
199
+ """
200
+ When the following request is received:
201
+ """
202
+ GET /pots/v1.0/ HTTP/1.1
203
+ host: nex.toa.io
204
+ accept: application/yaml
205
+ """
206
+ Then the following reply is sent:
207
+ """
208
+ 200 OK
209
+ """
210
+
211
+ Scenario: A variable the parameters do not carry
212
+ When the following request is received:
213
+ """
214
+ POST /.rpc HTTP/1.1
215
+ host: nex.toa.io
216
+ accept: application/yaml
217
+ content-type: application/json
218
+
219
+ {"jsonrpc": "2.0", "id": 5, "method": "pots._id.GET", "params": {}}
220
+ """
221
+ Then the following reply is sent:
222
+ """
223
+ 200 OK
224
+
225
+ jsonrpc: '2.0'
226
+ id: 5
227
+ error:
228
+ code: -32602
229
+ """
230
+
231
+ Scenario: A call that fails is a value, not a status
232
+ When the following request is received:
233
+ """
234
+ POST /.rpc HTTP/1.1
235
+ host: nex.toa.io
236
+ accept: application/yaml
237
+ content-type: application/json
238
+
239
+ {"jsonrpc": "2.0", "id": 6, "method": "pots.faulty.GET", "params": {}}
240
+ """
241
+ Then the following reply is sent:
242
+ """
243
+ 200 OK
244
+
245
+ jsonrpc: '2.0'
246
+ id: 6
247
+ error:
248
+ code: -32603
249
+ """
250
+
251
+ Scenario: A credential is the request's, so a call cannot be refused for one
252
+ When the following request is received:
253
+ """
254
+ POST /.rpc HTTP/1.1
255
+ host: nex.toa.io
256
+ accept: application/yaml
257
+ content-type: application/json
258
+
259
+ {"jsonrpc": "2.0", "id": 7, "method": "pots.guarded.GET", "params": {}}
260
+ """
261
+ Then the following reply is sent:
262
+ """
263
+ 401 Unauthorized
264
+ """
265
+
266
+ Scenario: A request may carry several calls
267
+ When the following request is received:
268
+ """
269
+ POST /.rpc HTTP/1.1
270
+ host: nex.toa.io
271
+ accept: application/yaml
272
+ content-type: application/json
273
+
274
+ [{"jsonrpc": "2.0", "id": 8, "method": "pots._id.GET",
275
+ "params": {"id": "4c4759e6f9c74da989d64511df42d6f4"}},
276
+ {"jsonrpc": "2.0", "id": 9, "method": "kettles.GET", "params": {}},
277
+ {"jsonrpc": "2.0", "method": "pots.POST", "params": {"title": "Pot", "volume": 1}}]
278
+ """
279
+ Then the following reply is sent:
280
+ """
281
+ 200 OK
282
+
283
+ - jsonrpc: '2.0'
284
+ id: 8
285
+ result:
286
+ id: 4c4759e6f9c74da989d64511df42d6f4
287
+ title: First pot
288
+ - jsonrpc: '2.0'
289
+ id: 9
290
+ error:
291
+ code: -32601
292
+ """
293
+
294
+ Scenario: What a request took is said once, whatever it carried
295
+ When the following request is received:
296
+ """
297
+ POST /.rpc HTTP/1.1
298
+ host: nex.toa.io
299
+ accept: application/yaml
300
+ content-type: application/json
301
+
302
+ [{"jsonrpc": "2.0", "id": 13, "method": "pots.GET", "params": {}},
303
+ {"jsonrpc": "2.0", "id": 14, "method": "pots.GET", "params": {}},
304
+ {"jsonrpc": "2.0", "id": 15, "method": "pots.GET", "params": {}}]
305
+ """
306
+ Then the following reply is sent:
307
+ """
308
+ 200 OK
309
+ """
310
+ # the stages of a call are measured per call, and a trace is where they are read
311
+ And the reply does not contain:
312
+ """
313
+ precall
314
+ """
315
+
316
+ Scenario: A request of notifications alone answers nothing
317
+ When the following request is received:
318
+ """
319
+ POST /.rpc HTTP/1.1
320
+ host: nex.toa.io
321
+ content-type: application/json
322
+
323
+ [{"jsonrpc": "2.0", "method": "pots.POST", "params": {"title": "One", "volume": 1}},
324
+ {"jsonrpc": "2.0", "method": "pots.POST", "params": {"title": "Two", "volume": 2}}]
325
+ """
326
+ Then the following reply is sent:
327
+ """
328
+ 204 No Content
329
+ """
330
+
331
+ Scenario: A request carries at least one call
332
+ When the following request is received:
333
+ """
334
+ POST /.rpc HTTP/1.1
335
+ host: nex.toa.io
336
+ accept: application/yaml
337
+ content-type: application/json
338
+
339
+ []
340
+ """
341
+ Then the following reply is sent:
342
+ """
343
+ 400 Bad Request
344
+
345
+ jsonrpc: '2.0'
346
+ id:
347
+ error:
348
+ code: -32600
349
+ """
350
+
351
+ Scenario: A call that is not one is answered to nobody
352
+ When the following request is received:
353
+ """
354
+ POST /.rpc HTTP/1.1
355
+ host: nex.toa.io
356
+ accept: application/yaml
357
+ content-type: application/json
358
+
359
+ {"jsonrpc": "1.0", "id": 10, "method": "pots.GET"}
360
+ """
361
+ Then the following reply is sent:
362
+ """
363
+ 200 OK
364
+
365
+ jsonrpc: '2.0'
366
+ id:
367
+ error:
368
+ code: -32600
369
+ """
370
+
371
+ Scenario: The endpoint answers POST alone
372
+ When the following request is received:
373
+ """
374
+ GET /.rpc HTTP/1.1
375
+ host: nex.toa.io
376
+ accept: application/yaml
377
+ """
378
+ Then the following reply is sent:
379
+ """
380
+ 405 Method Not Allowed
381
+ allow: POST
382
+ """
383
+
384
+ Scenario: What a request may carry at once is bounded
385
+ Given the annotation:
386
+ """yaml
387
+ rpc:
388
+ batch: 1
389
+ """
390
+ When the following request is received:
391
+ """
392
+ POST /.rpc HTTP/1.1
393
+ host: nex.toa.io
394
+ accept: application/yaml
395
+ content-type: application/json
396
+
397
+ [{"jsonrpc": "2.0", "id": 11, "method": "pots.GET", "params": {}},
398
+ {"jsonrpc": "2.0", "id": 12, "method": "pots.GET", "params": {}}]
399
+ """
400
+ Then the following reply is sent:
401
+ """
402
+ 400 Bad Request
403
+
404
+ jsonrpc: '2.0'
405
+ id:
406
+ error:
407
+ code: -32002
408
+ """
409
+
410
+ Scenario: Nothing is served where it was not asked for
411
+ Given the annotation:
412
+ """yaml
413
+ /:
414
+ io:output: true
415
+ anonymous: true
416
+ """
417
+ When the following request is received:
418
+ """
419
+ POST /.rpc HTTP/1.1
420
+ host: nex.toa.io
421
+ accept: application/yaml
422
+ content-type: application/json
423
+
424
+ {"jsonrpc": "2.0", "id": 9, "method": "pots.GET", "params": {}}
425
+ """
426
+ Then the following reply is sent:
427
+ """
428
+ 404 Not Found
429
+ """
@@ -0,0 +1,13 @@
1
+ import { Before } from '@cucumber/cucumber'
2
+
3
+ /**
4
+ * The Cloudinary scenarios upload to a real account, named by `features/steps/.env` — the
5
+ * environment and the keys `.env.example` lists. A checkout carries none, and an account is
6
+ * not something a run can stand up for itself, the way the compose file stands up a database.
7
+ * Without one the scenarios are skipped rather than failed, so `npm run features` answers on a
8
+ * fresh machine; with one they run, no flag to remember.
9
+ */
10
+ Before({ tags: '@cloudinary' }, function () {
11
+ if (process.env.CLOUDINARY_ENVIRONMENT === undefined)
12
+ return 'skipped'
13
+ })
@@ -4,7 +4,6 @@ import { dirname, join } from 'node:path'
4
4
  import tsflow from 'cucumber-tsflow'
5
5
 
6
6
  import * as boot from '@toa.io/boot'
7
- import { timeout } from '@toa.io/generic'
8
7
  import { type Connector } from '@toa.io/core'
9
8
  import { load as parse } from 'js-yaml'
10
9
  import { Gateway } from './Gateway.js'
@@ -49,7 +48,6 @@ export class Components {
49
48
  this.compositions[MAP] = await boot.composition(map())
50
49
 
51
50
  await this.compositions[MAP].connect()
52
- await timeout(50) // discovery
53
51
  }
54
52
 
55
53
  /** The values component, as the configuration extension ships it; the service hosts it alone. */
@@ -62,7 +60,6 @@ export class Components {
62
60
  this.compositions[VALUES] = await boot.composition([values()])
63
61
 
64
62
  await this.compositions[VALUES].connect()
65
- await timeout(50) // discovery
66
63
  }
67
64
 
68
65
  /** What the deployment would tell the values service, as the scenario needs it. */
@@ -101,7 +98,6 @@ export class Components {
101
98
  this.compositions[name] = await boot.composition([path])
102
99
 
103
100
  await this.compositions[name].connect()
104
- await timeout(50) // discovery
105
101
  }
106
102
  }
107
103
 
@@ -29,7 +29,7 @@ export class Gateway {
29
29
  process.env.TOA_EXPOSITION = JSON.stringify(tree)
30
30
  }
31
31
 
32
- const { debug, authorities, bouncer, ip, oauth } = annotation
32
+ const { debug, authorities, bouncer, ip, oauth, rpc, mcp } = annotation
33
33
  const properties = Object.assign({}, DEFAULT_PROPERTIES)
34
34
 
35
35
  if (debug !== undefined)
@@ -47,6 +47,12 @@ export class Gateway {
47
47
  if (oauth !== undefined)
48
48
  properties.oauth = oauth
49
49
 
50
+ if (rpc !== undefined)
51
+ properties.rpc = rpc
52
+
53
+ if (mcp !== undefined)
54
+ properties.mcp = mcp
55
+
50
56
  process.env.TOA_EXPOSITION_PROPERTIES = JSON.stringify(properties)
51
57
 
52
58
  await Gateway.stop()
@@ -148,7 +154,15 @@ export class Gateway {
148
154
  instance = service
149
155
 
150
156
  await service.connect()
151
- await timeout(50) // resource discovery
157
+
158
+ /*
159
+ * The gateway waits for the branches it discovers, but a component's own resources —
160
+ * a storage, a queue — are still connecting when it answers. Fifty milliseconds was
161
+ * enough until the composition grew, then a hundred; a scenario that asks too early
162
+ * reads the 404 that precedes the route, which `realtime` was failing on in two runs
163
+ * of three. It is a sleep and not a poll, so it is raised rather than fixed.
164
+ */
165
+ await timeout(DISCOVERY)
152
166
  }
153
167
 
154
168
  @after()
@@ -203,6 +217,9 @@ const DEFAULT_TREE = JSON.stringify({
203
217
  ]
204
218
  } satisfies syntax.Node)
205
219
 
220
+ /** Milliseconds a composition is given to finish connecting what it needs. */
221
+ const DISCOVERY = 500
222
+
206
223
  const DEFAULT_PROPERTIES: Partial<http.Options> = {
207
224
  authorities: {
208
225
  nex: 'nex.toa.io'
@@ -33,14 +33,17 @@ process.env.TOA_TELEMETRY_TRACES ??= JSON.stringify({
33
33
  }
34
34
  })
35
35
 
36
- process.env.TOA_STORAGES = JSON.stringify({
37
- octets: {
38
- provider: 'tmp',
39
- directory: Math.random().toString(36).substring(2)
40
- },
36
+ const environment = process.env.CLOUDINARY_ENVIRONMENT
37
+
38
+ /**
39
+ * A storage is built when a component's context is — for every scenario, not only for the ones
40
+ * that reach for it — and a Cloudinary storage asks for the keys of a real account. A checkout
41
+ * carries none, so these two are declared only where `features/steps/.env` names an environment.
42
+ */
43
+ const CLOUDINARY = {
41
44
  cloudinary: {
42
45
  provider: 'cloudinary',
43
- environment: process.env.CLOUDINARY_ENVIRONMENT ?? 'nope',
46
+ environment,
44
47
  type: 'image',
45
48
  prefix: 'toa-dev',
46
49
  transformations: [
@@ -87,7 +90,7 @@ process.env.TOA_STORAGES = JSON.stringify({
87
90
  },
88
91
  cloudinary_video: {
89
92
  provider: 'cloudinary',
90
- environment: process.env.CLOUDINARY_ENVIRONMENT ?? 'nope',
93
+ environment,
91
94
  type: 'video',
92
95
  prefix: 'toa-dev',
93
96
  eager: [
@@ -117,4 +120,12 @@ process.env.TOA_STORAGES = JSON.stringify({
117
120
  }
118
121
  ]
119
122
  }
123
+ }
124
+
125
+ process.env.TOA_STORAGES = JSON.stringify({
126
+ octets: {
127
+ provider: 'tmp',
128
+ directory: Math.random().toString(36).substring(2)
129
+ },
130
+ ...(environment === undefined ? {} : CLOUDINARY)
120
131
  })