@toa.io/extensions.exposition 1.0.0-alpha.292 → 1.0.0-alpha.293

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 (443) hide show
  1. package/components/identity.basic/package.json +8 -0
  2. package/components/identity.federation/package.json +8 -0
  3. package/components/identity.passkeys/package.json +8 -0
  4. package/components/identity.tokens/package.json +10 -0
  5. package/package.json +24 -13
  6. package/transpiled/Endpoint.js +3 -0
  7. package/transpiled/Endpoint.js.map +1 -1
  8. package/transpiled/Introspection.d.ts +6 -0
  9. package/transpiled/Introspection.js +1 -0
  10. package/transpiled/Introspection.js.map +1 -1
  11. package/transpiled/MCP/schema.js +2 -2
  12. package/transpiled/Query.d.ts +2 -12
  13. package/transpiled/Query.js +2 -12
  14. package/transpiled/Query.js.map +1 -1
  15. package/transpiled/RTD/Endpoint.d.ts +2 -3
  16. package/ui/dist/_app/immutable/assets/0.Cu0AnR_8.css +2 -0
  17. package/ui/dist/_app/immutable/assets/2.BghF56l_.css +1 -0
  18. package/ui/dist/_app/immutable/assets/ui.C8aD6zzF.css +1 -0
  19. package/ui/dist/_app/immutable/chunks/B8GvXrmq.js +1 -0
  20. package/ui/dist/_app/immutable/chunks/BVDJTrf4.js +3 -0
  21. package/ui/dist/_app/immutable/chunks/D6q28_Ok.js +86 -0
  22. package/ui/dist/_app/immutable/chunks/{aLpTDmOc.js → DVlaUfVU.js} +1 -1
  23. package/ui/dist/_app/immutable/chunks/DpB73ZB6.js +6 -0
  24. package/ui/dist/_app/immutable/entry/app.CTava8yn.js +2 -0
  25. package/ui/dist/_app/immutable/entry/start.yWN0gSLA.js +1 -0
  26. package/ui/dist/_app/immutable/nodes/0.HKRDBYrC.js +1 -0
  27. package/ui/dist/_app/immutable/nodes/1.CLa0ydOi.js +1 -0
  28. package/ui/dist/_app/immutable/nodes/2.C9Kaym8C.js +8 -0
  29. package/ui/dist/_app/immutable/nodes/3.C1X4_rXZ.js +1 -0
  30. package/ui/dist/_app/immutable/nodes/4.DdzDIi9E.js +1 -0
  31. package/ui/dist/_app/immutable/nodes/5.DpbmCMdw.js +1 -0
  32. package/ui/dist/_app/version.json +1 -1
  33. package/ui/dist/index.html +12 -12
  34. package/CHANGELOG.md +0 -42
  35. package/components/identity.bans/tsconfig.tsbuildinfo +0 -1
  36. package/components/identity.basic/source/lib/credentials.test.ts +0 -18
  37. package/components/identity.basic/tsconfig.tsbuildinfo +0 -1
  38. package/components/identity.clients/source/lib/canonical.test.ts +0 -43
  39. package/components/identity.clients/source/lib/cimd.test.ts +0 -122
  40. package/components/identity.clients/source/lib/redirect.test.ts +0 -47
  41. package/components/identity.clients/tsconfig.tsbuildinfo +0 -1
  42. package/components/identity.credentials/source/list.test.ts +0 -70
  43. package/components/identity.credentials/tsconfig.tsbuildinfo +0 -1
  44. package/components/identity.federation/source/lib/discovery.test.ts +0 -60
  45. package/components/identity.federation/source/list.test.ts +0 -41
  46. package/components/identity.federation/tsconfig.tsbuildinfo +0 -1
  47. package/components/identity.grants/tsconfig.tsbuildinfo +0 -1
  48. package/components/identity.keys/tsconfig.tsbuildinfo +0 -1
  49. package/components/identity.otp/tsconfig.tsbuildinfo +0 -1
  50. package/components/identity.passkeys/source/errors.test.ts +0 -34
  51. package/components/identity.passkeys/source/webauthn.test.ts +0 -26
  52. package/components/identity.passkeys/tsconfig.tsbuildinfo +0 -1
  53. package/components/identity.roles/tsconfig.tsbuildinfo +0 -1
  54. package/components/identity.tokens/source/authenticate.test.ts +0 -112
  55. package/components/identity.tokens/source/decrypt.test.ts +0 -216
  56. package/components/identity.tokens/source/encrypt.test.ts +0 -150
  57. package/components/identity.tokens/source/issue.test.ts +0 -73
  58. package/components/identity.tokens/source/lib/form.test.ts +0 -25
  59. package/components/identity.tokens/source/lib/paseto.test.ts +0 -62
  60. package/components/identity.tokens/tsconfig.tsbuildinfo +0 -1
  61. package/context.toa.yaml +0 -31
  62. package/cucumber.mjs +0 -7
  63. package/documentation/.assets/ia3-dark.jpg +0 -0
  64. package/documentation/.assets/ia3-light.jpg +0 -0
  65. package/documentation/.assets/overview-dark.jpg +0 -0
  66. package/documentation/.assets/overview-light.jpg +0 -0
  67. package/documentation/.assets/role-scopes-dark.jpg +0 -0
  68. package/documentation/.assets/role-scopes-light.jpg +0 -0
  69. package/documentation/.assets/rtd-dark.jpg +0 -0
  70. package/documentation/.assets/rtd-light.jpg +0 -0
  71. package/documentation/access.md +0 -350
  72. package/documentation/authorities.md +0 -51
  73. package/documentation/cache.md +0 -72
  74. package/documentation/components.md +0 -472
  75. package/documentation/consent.md +0 -101
  76. package/documentation/credentials.md +0 -88
  77. package/documentation/dev.md +0 -30
  78. package/documentation/discovery.md +0 -81
  79. package/documentation/flow.md +0 -44
  80. package/documentation/help.md +0 -122
  81. package/documentation/identity.md +0 -304
  82. package/documentation/introspection.md +0 -123
  83. package/documentation/io.md +0 -167
  84. package/documentation/ip.md +0 -24
  85. package/documentation/map.md +0 -123
  86. package/documentation/mcp.md +0 -183
  87. package/documentation/notes/desync.jpg +0 -0
  88. package/documentation/notes/peers.md +0 -59
  89. package/documentation/notes/sse.md +0 -71
  90. package/documentation/notes/throttling.md +0 -122
  91. package/documentation/oauth.md +0 -180
  92. package/documentation/octets.md +0 -334
  93. package/documentation/passkeys.md +0 -11
  94. package/documentation/protocol.md +0 -120
  95. package/documentation/query.md +0 -324
  96. package/documentation/require.md +0 -15
  97. package/documentation/rpc.md +0 -154
  98. package/documentation/tracing.md +0 -70
  99. package/documentation/tree.md +0 -199
  100. package/features/access.feature +0 -596
  101. package/features/annotation.feature +0 -32
  102. package/features/auth.assert.feature +0 -55
  103. package/features/auth.bearer.feature +0 -120
  104. package/features/auth.claims.feature +0 -171
  105. package/features/auth.incept.feature +0 -166
  106. package/features/auth.input.feature +0 -59
  107. package/features/authorities.basic.feature +0 -141
  108. package/features/authorities.feature +0 -71
  109. package/features/authorities.federation.feature +0 -100
  110. package/features/authorities.tokens.feature +0 -117
  111. package/features/body.feature +0 -76
  112. package/features/cache.feature +0 -368
  113. package/features/configuration.feature +0 -206
  114. package/features/cors.feature +0 -127
  115. package/features/credentials.feature +0 -106
  116. package/features/debug.feature +0 -34
  117. package/features/dev.feature +0 -90
  118. package/features/directives.feature +0 -61
  119. package/features/discovery.feature +0 -213
  120. package/features/discovery.ui.feature +0 -213
  121. package/features/dynamic.feature +0 -192
  122. package/features/errors.feature +0 -258
  123. package/features/etag.feature +0 -239
  124. package/features/flow.feature +0 -148
  125. package/features/help.feature +0 -512
  126. package/features/identity.bans.feature +0 -200
  127. package/features/identity.basic.feature +0 -666
  128. package/features/identity.feature +0 -240
  129. package/features/identity.federation.feature +0 -396
  130. package/features/identity.otp.feature +0 -142
  131. package/features/identity.roles.feature +0 -568
  132. package/features/identity.tokens.custom.feature +0 -430
  133. package/features/identity.tokens.feature +0 -131
  134. package/features/interruptions.feature +0 -20
  135. package/features/introspection.feature +0 -565
  136. package/features/introspection.map.feature +0 -108
  137. package/features/io.feature +0 -204
  138. package/features/io.throttle.feature +0 -166
  139. package/features/map.feature +0 -360
  140. package/features/mcp.feature +0 -753
  141. package/features/methods.feature +0 -48
  142. package/features/oauth.clients.feature +0 -195
  143. package/features/oauth.discovery.feature +0 -164
  144. package/features/oauth.grants.feature +0 -301
  145. package/features/octets.cloudinary.feature +0 -233
  146. package/features/octets.download.feature +0 -194
  147. package/features/octets.entries.feature +0 -83
  148. package/features/octets.feature +0 -306
  149. package/features/octets.head.feature +0 -40
  150. package/features/octets.location.feature +0 -83
  151. package/features/octets.meta.feature +0 -117
  152. package/features/octets.workflows.feature +0 -565
  153. package/features/passkeys.feature +0 -66
  154. package/features/probes.feature +0 -18
  155. package/features/query.feature +0 -389
  156. package/features/realtime.feature +0 -34
  157. package/features/require.feature +0 -66
  158. package/features/response.feature +0 -103
  159. package/features/routes.feature +0 -224
  160. package/features/rpc.feature +0 -429
  161. package/features/server.feature +0 -21
  162. package/features/site/_app/immutable/asset.js +0 -1
  163. package/features/site/favicon.ico +0 -0
  164. package/features/site/index.html +0 -10
  165. package/features/steps/.env.example +0 -5
  166. package/features/steps/Captures.ts +0 -20
  167. package/features/steps/Cloudinary.ts +0 -12
  168. package/features/steps/Common.ts +0 -38
  169. package/features/steps/Components.ts +0 -115
  170. package/features/steps/Database.ts +0 -106
  171. package/features/steps/Gateway.ts +0 -239
  172. package/features/steps/HTTP.ts +0 -96
  173. package/features/steps/IDP.ts +0 -361
  174. package/features/steps/Identity.ts +0 -54
  175. package/features/steps/OTP.ts +0 -42
  176. package/features/steps/Parameters.ts +0 -162
  177. package/features/steps/Probe.ts +0 -38
  178. package/features/steps/Realtime.ts +0 -175
  179. package/features/steps/Workspace.ts +0 -48
  180. package/features/steps/components/audit/manifest.toa.yaml +0 -20
  181. package/features/steps/components/audit/operations/record.js +0 -5
  182. package/features/steps/components/echo/manifest.toa.yaml +0 -59
  183. package/features/steps/components/echo/operations/affect.js +0 -3
  184. package/features/steps/components/echo/operations/compute.js +0 -3
  185. package/features/steps/components/echo/operations/echo.js +0 -3
  186. package/features/steps/components/echo/operations/error.js +0 -7
  187. package/features/steps/components/echo/operations/identity.js +0 -3
  188. package/features/steps/components/echo/operations/parameters.js +0 -3
  189. package/features/steps/components/echo/operations/ping.js +0 -3
  190. package/features/steps/components/echo/operations/unwrap.js +0 -3
  191. package/features/steps/components/echo.beacon/manifest.toa.yaml +0 -2
  192. package/features/steps/components/echo.beacon/operations/hello.js +0 -3
  193. package/features/steps/components/greeter/manifest.toa.yaml +0 -5
  194. package/features/steps/components/greeter/operations/greet.js +0 -3
  195. package/features/steps/components/notify/manifest.toa.yaml +0 -20
  196. package/features/steps/components/notify/operations/send.js +0 -5
  197. package/features/steps/components/octets.tester/manifest.toa.yaml +0 -73
  198. package/features/steps/components/octets.tester/operations/authority.js +0 -3
  199. package/features/steps/components/octets.tester/operations/bar.js +0 -9
  200. package/features/steps/components/octets.tester/operations/baz.js +0 -9
  201. package/features/steps/components/octets.tester/operations/concat.js +0 -5
  202. package/features/steps/components/octets.tester/operations/echo.js +0 -5
  203. package/features/steps/components/octets.tester/operations/err.js +0 -14
  204. package/features/steps/components/octets.tester/operations/foo.js +0 -5
  205. package/features/steps/components/octets.tester/operations/id.js +0 -5
  206. package/features/steps/components/octets.tester/operations/identity.js +0 -5
  207. package/features/steps/components/octets.tester/operations/lenna.png +0 -0
  208. package/features/steps/components/octets.tester/operations/redirect.js +0 -17
  209. package/features/steps/components/octets.tester/operations/yex.js +0 -14
  210. package/features/steps/components/octets.tester/operations/yield.js +0 -11
  211. package/features/steps/components/orders/manifest.toa.yaml +0 -30
  212. package/features/steps/components/orders/operations/create.js +0 -7
  213. package/features/steps/components/pots/manifest.toa.yaml +0 -91
  214. package/features/steps/components/pots/migrations/0002-indexes.yaml +0 -4
  215. package/features/steps/components/pricing/manifest.toa.yaml +0 -13
  216. package/features/steps/components/pricing/operations/quote.js +0 -3
  217. package/features/steps/components/sequences/manifest.toa.yaml +0 -11
  218. package/features/steps/components/sequences/operations/numbers.js +0 -5
  219. package/features/steps/components/sequences/operations/tokens.js +0 -14
  220. package/features/steps/components/users/manifest.toa.yaml +0 -30
  221. package/features/steps/components/users/operations/create.js +0 -11
  222. package/features/steps/components/users.properties/manifest.toa.yaml +0 -22
  223. package/features/steps/map.ts +0 -30
  224. package/features/steps/tsconfig.json +0 -9
  225. package/features/streams.feature +0 -35
  226. package/features/timestamps.feature +0 -41
  227. package/features/timing.feature +0 -49
  228. package/features/tracing.feature +0 -123
  229. package/source/Branch.test.ts +0 -40
  230. package/source/Branch.ts +0 -44
  231. package/source/Composition.ts +0 -51
  232. package/source/Context.ts +0 -11
  233. package/source/Directive.test.ts +0 -199
  234. package/source/Directive.ts +0 -248
  235. package/source/Discovery/Explorer.ts +0 -34
  236. package/source/Discovery/Site.test.ts +0 -147
  237. package/source/Discovery/Site.ts +0 -202
  238. package/source/Discovery/index.ts +0 -3
  239. package/source/Discovery/tree.test.ts +0 -175
  240. package/source/Discovery/tree.ts +0 -77
  241. package/source/Discovery/trunk.ts +0 -33
  242. package/source/Endpoint.test.ts +0 -67
  243. package/source/Endpoint.ts +0 -157
  244. package/source/Factory.ts +0 -42
  245. package/source/Gateway.ts +0 -390
  246. package/source/HTTP/Context.ts +0 -143
  247. package/source/HTTP/Probe.ts +0 -99
  248. package/source/HTTP/Server.ts +0 -435
  249. package/source/HTTP/Timing.ts +0 -14
  250. package/source/HTTP/address.test.ts +0 -28
  251. package/source/HTTP/address.ts +0 -16
  252. package/source/HTTP/exceptions.ts +0 -99
  253. package/source/HTTP/formats/form.ts +0 -21
  254. package/source/HTTP/formats/index.ts +0 -36
  255. package/source/HTTP/formats/json.ts +0 -14
  256. package/source/HTTP/formats/msgpack.ts +0 -14
  257. package/source/HTTP/formats/text.ts +0 -10
  258. package/source/HTTP/formats/yaml.test.ts +0 -22
  259. package/source/HTTP/formats/yaml.ts +0 -40
  260. package/source/HTTP/index.ts +0 -6
  261. package/source/HTTP/messages.test.ts +0 -196
  262. package/source/HTTP/messages.ts +0 -186
  263. package/source/HTTP/types.ts +0 -39
  264. package/source/Interception.ts +0 -37
  265. package/source/Introspection.ts +0 -179
  266. package/source/MCP/Server.ts +0 -335
  267. package/source/MCP/discover.ts +0 -51
  268. package/source/MCP/errors.ts +0 -80
  269. package/source/MCP/index.ts +0 -1
  270. package/source/MCP/schema.test.ts +0 -91
  271. package/source/MCP/schema.ts +0 -94
  272. package/source/MCP/tools.ts +0 -144
  273. package/source/MCP/types.ts +0 -84
  274. package/source/Mapping.ts +0 -101
  275. package/source/Query.test.ts +0 -54
  276. package/source/Query.ts +0 -277
  277. package/source/RPC/Context.ts +0 -75
  278. package/source/RPC/Dispatcher.ts +0 -150
  279. package/source/RPC/errors.test.ts +0 -77
  280. package/source/RPC/errors.ts +0 -82
  281. package/source/RPC/index.ts +0 -1
  282. package/source/RPC/names.test.ts +0 -141
  283. package/source/RPC/names.ts +0 -176
  284. package/source/RPC/types.ts +0 -34
  285. package/source/RTD/Context.ts +0 -16
  286. package/source/RTD/Directives.ts +0 -126
  287. package/source/RTD/Endpoint.ts +0 -27
  288. package/source/RTD/Match.ts +0 -11
  289. package/source/RTD/Method.ts +0 -39
  290. package/source/RTD/Node.ts +0 -169
  291. package/source/RTD/Route.ts +0 -93
  292. package/source/RTD/Tree.ts +0 -137
  293. package/source/RTD/expiration.test.ts +0 -81
  294. package/source/RTD/factory.ts +0 -105
  295. package/source/RTD/index.ts +0 -8
  296. package/source/RTD/segment.test.ts +0 -35
  297. package/source/RTD/segment.ts +0 -51
  298. package/source/RTD/syntax/index.ts +0 -1
  299. package/source/RTD/walk.test.ts +0 -147
  300. package/source/Remotes.test.ts +0 -79
  301. package/source/Remotes.ts +0 -39
  302. package/source/Tenant.ts +0 -73
  303. package/source/directives/auth/Anonymous.test.ts +0 -70
  304. package/source/directives/auth/Anonymous.ts +0 -36
  305. package/source/directives/auth/Anyone.ts +0 -23
  306. package/source/directives/auth/Assert.ts +0 -43
  307. package/source/directives/auth/Authorization.test.ts +0 -24
  308. package/source/directives/auth/Authorization.ts +0 -388
  309. package/source/directives/auth/Delegate.test.ts +0 -36
  310. package/source/directives/auth/Delegate.ts +0 -54
  311. package/source/directives/auth/Echo.ts +0 -24
  312. package/source/directives/auth/Federation.ts +0 -104
  313. package/source/directives/auth/Id.ts +0 -37
  314. package/source/directives/auth/Incept.ts +0 -117
  315. package/source/directives/auth/Input.ts +0 -92
  316. package/source/directives/auth/Role.test.ts +0 -147
  317. package/source/directives/auth/Role.ts +0 -99
  318. package/source/directives/auth/Rule.ts +0 -59
  319. package/source/directives/auth/Scheme.ts +0 -31
  320. package/source/directives/auth/create.ts +0 -11
  321. package/source/directives/auth/index.ts +0 -3
  322. package/source/directives/auth/schemes.test.ts +0 -18
  323. package/source/directives/auth/schemes.ts +0 -39
  324. package/source/directives/auth/split.ts +0 -14
  325. package/source/directives/auth/types.ts +0 -75
  326. package/source/directives/cache/Cache.ts +0 -92
  327. package/source/directives/cache/Control.ts +0 -81
  328. package/source/directives/cache/Exact.ts +0 -7
  329. package/source/directives/cache/etag.ts +0 -38
  330. package/source/directives/cache/index.ts +0 -3
  331. package/source/directives/cache/types.ts +0 -9
  332. package/source/directives/cors/CORS.test.ts +0 -75
  333. package/source/directives/cors/CORS.ts +0 -88
  334. package/source/directives/cors/index.ts +0 -3
  335. package/source/directives/dev/Development.ts +0 -41
  336. package/source/directives/dev/Faulty.ts +0 -31
  337. package/source/directives/dev/Sleep.ts +0 -53
  338. package/source/directives/dev/Stub.ts +0 -14
  339. package/source/directives/dev/Throw.ts +0 -14
  340. package/source/directives/dev/index.ts +0 -3
  341. package/source/directives/dev/types.ts +0 -5
  342. package/source/directives/flow/Compose.ts +0 -98
  343. package/source/directives/flow/Fetch.ts +0 -86
  344. package/source/directives/flow/Flow.ts +0 -43
  345. package/source/directives/flow/index.ts +0 -3
  346. package/source/directives/flow/types.ts +0 -7
  347. package/source/directives/help/Family.ts +0 -122
  348. package/source/directives/help/Help.test.ts +0 -227
  349. package/source/directives/help/Help.ts +0 -47
  350. package/source/directives/help/Parameters.ts +0 -47
  351. package/source/directives/help/described.ts +0 -57
  352. package/source/directives/help/index.ts +0 -45
  353. package/source/directives/index.ts +0 -33
  354. package/source/directives/io/Directive.ts +0 -17
  355. package/source/directives/io/IO.ts +0 -118
  356. package/source/directives/io/Input.ts +0 -55
  357. package/source/directives/io/Message.ts +0 -1
  358. package/source/directives/io/Output.ts +0 -81
  359. package/source/directives/io/Status.test.ts +0 -88
  360. package/source/directives/io/Status.ts +0 -47
  361. package/source/directives/io/Throttle.ts +0 -30
  362. package/source/directives/io/index.ts +0 -3
  363. package/source/directives/io/lib/throttle/Configuration.test.ts +0 -72
  364. package/source/directives/io/lib/throttle/Configuration.ts +0 -68
  365. package/source/directives/io/lib/throttle/Keys.ts +0 -53
  366. package/source/directives/io/lib/throttle/Quotas.test.ts +0 -411
  367. package/source/directives/io/lib/throttle/Quotas.ts +0 -190
  368. package/source/directives/io/lib/throttle/Sync.test.ts +0 -163
  369. package/source/directives/io/lib/throttle/Sync.ts +0 -93
  370. package/source/directives/io/lib/throttle/Warning.test.ts +0 -32
  371. package/source/directives/io/lib/throttle/Warning.ts +0 -29
  372. package/source/directives/io/lib/throttle/components/Component.ts +0 -7
  373. package/source/directives/io/lib/throttle/components/IP.ts +0 -30
  374. package/source/directives/io/lib/throttle/components/Identity.ts +0 -19
  375. package/source/directives/io/lib/throttle/components/Path.ts +0 -8
  376. package/source/directives/io/lib/throttle/components/Route.ts +0 -19
  377. package/source/directives/io/lib/throttle/components/Segment.ts +0 -19
  378. package/source/directives/io/lib/throttle/components/index.ts +0 -19
  379. package/source/directives/io/lib/throttle/conditions/Condition.ts +0 -5
  380. package/source/directives/io/lib/throttle/conditions/Status.ts +0 -17
  381. package/source/directives/io/lib/throttle/conditions/index.ts +0 -11
  382. package/source/directives/io/lib/throttle/index.ts +0 -4
  383. package/source/directives/io/schemas.test.ts +0 -40
  384. package/source/directives/io/schemas.ts +0 -16
  385. package/source/directives/map/Authority.ts +0 -15
  386. package/source/directives/map/Buffer.ts +0 -15
  387. package/source/directives/map/Claims.ts +0 -63
  388. package/source/directives/map/Directive.ts +0 -4
  389. package/source/directives/map/Headers.ts +0 -60
  390. package/source/directives/map/Language.ts +0 -45
  391. package/source/directives/map/Languages.ts +0 -17
  392. package/source/directives/map/Map.ts +0 -85
  393. package/source/directives/map/Mapping.ts +0 -45
  394. package/source/directives/map/Properties.ts +0 -15
  395. package/source/directives/map/Segments.ts +0 -52
  396. package/source/directives/map/index.ts +0 -3
  397. package/source/directives/mcp/MCP.ts +0 -33
  398. package/source/directives/mcp/Tool.test.ts +0 -56
  399. package/source/directives/mcp/Tool.ts +0 -32
  400. package/source/directives/mcp/index.ts +0 -6
  401. package/source/directives/oauth/Discovery.ts +0 -66
  402. package/source/directives/oauth/documents.ts +0 -110
  403. package/source/directives/oauth/index.ts +0 -3
  404. package/source/directives/octets/Context.ts +0 -23
  405. package/source/directives/octets/Delete.ts +0 -96
  406. package/source/directives/octets/Directive.ts +0 -21
  407. package/source/directives/octets/Get.ts +0 -88
  408. package/source/directives/octets/Octets.ts +0 -82
  409. package/source/directives/octets/Put.ts +0 -186
  410. package/source/directives/octets/Workflow.ts +0 -60
  411. package/source/directives/octets/bytes.test.ts +0 -33
  412. package/source/directives/octets/bytes.ts +0 -18
  413. package/source/directives/octets/index.ts +0 -3
  414. package/source/directives/octets/schemas.test.ts +0 -20
  415. package/source/directives/octets/schemas.ts +0 -15
  416. package/source/directives/octets/types.ts +0 -9
  417. package/source/directives/octets/workflows/Execution.ts +0 -130
  418. package/source/directives/octets/workflows/Workflow.ts +0 -51
  419. package/source/directives/octets/workflows/index.ts +0 -1
  420. package/source/directives/require/Directive.ts +0 -5
  421. package/source/directives/require/Headers.ts +0 -19
  422. package/source/directives/require/Require.ts +0 -27
  423. package/source/directives/require/index.ts +0 -3
  424. package/source/discovery.ts +0 -1
  425. package/source/exceptions.ts +0 -47
  426. package/source/index.ts +0 -10
  427. package/source/io.ts +0 -4
  428. package/source/octets.d.ts +0 -17
  429. package/source/root.ts +0 -59
  430. package/source/service.ts +0 -95
  431. package/source/userland.ts +0 -47
  432. package/tsconfig.json +0 -13
  433. package/tsconfig.tsbuildinfo +0 -1
  434. package/ui/dist/_app/immutable/assets/0.Bl7vLmIK.css +0 -2
  435. package/ui/dist/_app/immutable/assets/2.BC0-Jhqu.css +0 -1
  436. package/ui/dist/_app/immutable/chunks/BaWe3aOV.js +0 -1
  437. package/ui/dist/_app/immutable/chunks/DjIYL2zC.js +0 -3
  438. package/ui/dist/_app/immutable/chunks/GZTfV0ks.js +0 -6
  439. package/ui/dist/_app/immutable/entry/app.D5v4JoUx.js +0 -2
  440. package/ui/dist/_app/immutable/entry/start.CWxFoIyZ.js +0 -1
  441. package/ui/dist/_app/immutable/nodes/0.DIh5T_5-.js +0 -1
  442. package/ui/dist/_app/immutable/nodes/1.CY-bFzHC.js +0 -1
  443. package/ui/dist/_app/immutable/nodes/2.6Ubd1ItY.js +0 -14
@@ -1,335 +0,0 @@
1
- import { console } from 'openspan'
2
- import { BRANCH_TTL } from '@toa.io/definitions/extensions.exposition'
3
- import * as http from '../HTTP/index.js'
4
- import { discovery, type Discovery } from './discover.js'
5
- import { call, list, type Scope } from './tools.js'
6
- import {
7
- HEADER_MISMATCH,
8
- INVALID_PARAMS,
9
- INVALID_REQUEST,
10
- METHOD_NOT_FOUND,
11
- PARSE,
12
- UNSUPPORTED_VERSION,
13
- failure,
14
- response
15
- } from './errors.js'
16
- import {
17
- CLIENT_CAPABILITIES,
18
- JSONRPC,
19
- LEGACY,
20
- MODERN,
21
- PROTOCOL_VERSION,
22
- SERVER_INFO,
23
- VERSIONS,
24
- type Cache,
25
- type Message,
26
- type Params
27
- } from './types.js'
28
- import type { Tree } from '../RTD/index.js'
29
- import type { MCPAnnotation as MCP } from '@toa.io/definitions/extensions.exposition'
30
-
31
- /**
32
- * The Model Context Protocol, as one endpoint that remembers nothing between requests.
33
- *
34
- * Two revisions are answered from it. The modern one carries the version and the client's
35
- * capabilities in every request; the one before it opens with `initialize`, which is what
36
- * most clients still send. Neither needs a session, and neither needs a stream: every method
37
- * here answers one object, which is why this can exist in a package that serves no SSE.
38
- */
39
- export class Server {
40
- private readonly options: MCP
41
- private readonly tree: Tree
42
- private readonly discovery: Discovery
43
- private readonly origins: Set<string>
44
-
45
- public constructor(options: MCP, tree: Tree) {
46
- this.options = options
47
- this.tree = tree
48
- this.discovery = discovery(options)
49
- this.origins = new Set(options.origins ?? [])
50
- }
51
-
52
- public async process(
53
- context: http.Context,
54
- route: http.Processor
55
- ): Promise<http.OutgoingMessage> {
56
- if (context.request.method !== 'POST')
57
- throw new http.MethodNotAllowed(new Headers({ allow: 'POST' }))
58
-
59
- this.admit(context)
60
-
61
- const message = await this.read(context)
62
- const version = this.version(context, message)
63
- const modern = version === MODERN
64
-
65
- if (modern) this.mirrored(context, message)
66
-
67
- const result = await this.answer({ context, route, tree: this.tree }, message, modern)
68
-
69
- // a notification is answered by not answering, and there is nothing here to remember
70
- if (message.id === undefined) return { status: ACCEPTED }
71
-
72
- return {
73
- status: OK,
74
- body: { jsonrpc: JSONRPC, id: message.id, result },
75
- headers: new Headers({ 'cache-control': 'no-store' })
76
- }
77
- }
78
-
79
- /** Who may reach the endpoint at all, before anything it carries is read. */
80
- private admit(context: http.Context): void {
81
- const origin = context.request.headers.origin
82
-
83
- // the revision requires this against DNS rebinding; a request without one is no browser's
84
- if (origin !== undefined && !this.origins.has(origin))
85
- throw new http.Forbidden('Origin is not allowed')
86
-
87
- if (this.options.anonymous === true) return
88
-
89
- if ((context as { identity?: unknown }).identity == null)
90
- throw new http.Unauthorized()
91
- }
92
-
93
- private async answer(
94
- scope: Scope,
95
- message: Message,
96
- modern: boolean
97
- ): Promise<unknown> {
98
- const params = message.params ?? {}
99
-
100
- switch (message.method) {
101
- case 'server/discover':
102
- return this.complete(this.discovery.modern, modern, DISCOVERY_CACHE)
103
-
104
- case 'tools/list':
105
- return this.complete(
106
- { tools: await list(this.tree, scope.context) },
107
- modern,
108
- TOOLS_CACHE
109
- )
110
-
111
- case 'tools/call':
112
- return this.complete(await this.tool(scope, params), modern)
113
-
114
- // what a client of an earlier revision opens with; no session is made and none is named
115
- case 'initialize':
116
- return this.discovery.legacy(declared(params))
117
-
118
- case 'notifications/initialized':
119
- return null
120
-
121
- case 'ping':
122
- return {}
123
-
124
- default:
125
- throw new http.NotFound(
126
- response(
127
- message.id ?? null,
128
- failure(
129
- METHOD_NOT_FOUND,
130
- `'${message.method}' is not a method this server answers`
131
- )
132
- )
133
- )
134
- }
135
- }
136
-
137
- private async tool(scope: Scope, params: Params): Promise<object> {
138
- const named = params.name
139
-
140
- if (typeof named !== 'string')
141
- throw new http.BadRequest(
142
- response(
143
- null,
144
- failure(INVALID_PARAMS, '`tools/call` states the tool it calls by name')
145
- )
146
- )
147
-
148
- const args = params.arguments ?? {}
149
-
150
- if (typeof args !== 'object' || args === null || Array.isArray(args))
151
- throw new http.BadRequest(
152
- response(null, failure(INVALID_PARAMS, '`arguments` must be an object'))
153
- )
154
-
155
- return await console.span(
156
- { name: named },
157
- async () => await call(scope, named, args as Params)
158
- )
159
- }
160
-
161
- /**
162
- * Every result of the modern revision says what kind it is, and who answered it. Where the
163
- * revision names the operation as one whose result may be held, it says that too, and must.
164
- */
165
- private complete(result: object, modern: boolean, cache?: Cache): object {
166
- return modern
167
- ? {
168
- ...result,
169
- ...cache,
170
- resultType: 'complete',
171
- _meta: { [SERVER_INFO]: this.serverInfo() }
172
- }
173
- : result
174
- }
175
-
176
- private serverInfo(): unknown {
177
- return (this.discovery.modern as { _meta: Record<string, unknown> })._meta[
178
- SERVER_INFO
179
- ]
180
- }
181
-
182
- /**
183
- * Which revision this request is of. `initialize` is one by itself; otherwise the header
184
- * says, and a request that names none is of a revision that did not send one.
185
- */
186
- private version(context: http.Context, message: Message): string {
187
- if (message.method === 'initialize') return LEGACY
188
-
189
- const header = context.request.headers['mcp-protocol-version']
190
- const stated = declared(message.params ?? {})
191
-
192
- if (header !== undefined && stated !== undefined && header !== stated)
193
- throw new http.BadRequest(
194
- response(
195
- message.id ?? null,
196
- failure(
197
- HEADER_MISMATCH,
198
- `'MCP-Protocol-Version' says '${String(header)}' and the body says '${stated}'`
199
- )
200
- )
201
- )
202
-
203
- const value = (header as string | undefined) ?? stated
204
-
205
- if (value === undefined) return LEGACY
206
-
207
- if (!VERSIONS.includes(value))
208
- throw new http.BadRequest(
209
- response(
210
- message.id ?? null,
211
- failure(UNSUPPORTED_VERSION, 'Unsupported protocol version', {
212
- supported: VERSIONS,
213
- requested: value
214
- })
215
- )
216
- )
217
-
218
- return value
219
- }
220
-
221
- /**
222
- * What the modern revision mirrors into headers, so that what routes a request and what
223
- * answers it cannot be told two different things.
224
- */
225
- private mirrored(context: http.Context, message: Message): void {
226
- const meta = metadata(message.params ?? {})
227
-
228
- if (meta?.[PROTOCOL_VERSION] === undefined || meta[CLIENT_CAPABILITIES] === undefined)
229
- throw new http.BadRequest(
230
- response(
231
- message.id ?? null,
232
- failure(
233
- INVALID_PARAMS,
234
- `'_meta' states '${PROTOCOL_VERSION}' and '${CLIENT_CAPABILITIES}'`
235
- )
236
- )
237
- )
238
-
239
- const id = message.id ?? null
240
-
241
- mirrors(context, { id, header: 'mcp-method', value: message.method })
242
-
243
- if (message.method === 'tools/call')
244
- mirrors(context, { id, header: 'mcp-name', value: (message.params ?? {}).name })
245
- }
246
-
247
- /** A body the decoder refuses is a parse error; a media type it does not know is not. */
248
- private async read(context: http.Context): Promise<Message> {
249
- let body: unknown
250
-
251
- try {
252
- body = await context.body()
253
- } catch (exception) {
254
- if (exception instanceof http.BadRequest)
255
- throw new http.BadRequest(response(null, failure(PARSE, 'Parse error')))
256
-
257
- throw exception
258
- }
259
-
260
- if (
261
- typeof body !== 'object' ||
262
- body === null ||
263
- Array.isArray(body) ||
264
- (body as Message).jsonrpc !== JSONRPC ||
265
- typeof (body as Message).method !== 'string'
266
- )
267
- throw new http.BadRequest(
268
- response(null, failure(INVALID_REQUEST, 'A request carries one JSON-RPC message'))
269
- )
270
-
271
- return body as Message
272
- }
273
- }
274
-
275
- /** What a header says must be what the body says, or what routes and what answers differ. */
276
- function mirrors(context: http.Context, mirror: Mirror): void {
277
- const { id, header, value } = mirror
278
- const stated = context.request.headers[header]
279
-
280
- if (stated === undefined)
281
- throw new http.BadRequest(
282
- response(id, failure(HEADER_MISMATCH, `'${header}' is required`))
283
- )
284
-
285
- if (decode(String(stated)) !== value)
286
- throw new http.BadRequest(
287
- response(
288
- id,
289
- failure(
290
- HEADER_MISMATCH,
291
- `'${header}' says '${String(stated)}' and the body says '${String(value)}'`
292
- )
293
- )
294
- )
295
- }
296
-
297
- interface Mirror {
298
- id: string | number | null
299
- header: string
300
- value: unknown
301
- }
302
-
303
- function metadata(params: Params): Record<string, unknown> | undefined {
304
- const meta = params._meta
305
-
306
- return typeof meta === 'object' && meta !== null
307
- ? (meta as Record<string, unknown>)
308
- : undefined
309
- }
310
-
311
- function declared(params: Params): string | undefined {
312
- const stated = metadata(params)?.[PROTOCOL_VERSION]
313
-
314
- return typeof stated === 'string' ? stated : undefined
315
- }
316
-
317
- /** What a header value that could not be written as ASCII was encoded as. */
318
- function decode(value: string): string {
319
- if (!value.startsWith(SENTINEL) || !value.endsWith(TERMINATOR)) return value
320
-
321
- const encoded = value.slice(SENTINEL.length, -TERMINATOR.length)
322
-
323
- return Buffer.from(encoded, 'base64').toString('utf8')
324
- }
325
-
326
- /** A tool list is what the tree holds, which stands until a branch of it expires. */
327
- const TOOLS_CACHE: Cache = { ttlMs: BRANCH_TTL, cacheScope: 'private' }
328
-
329
- /** What the annotation says, which is the same for every caller until the application is redeployed. */
330
- const DISCOVERY_CACHE: Cache = { ttlMs: BRANCH_TTL, cacheScope: 'public' }
331
-
332
- const OK = 200
333
- const ACCEPTED = 202
334
- const SENTINEL = '=?base64?'
335
- const TERMINATOR = '?='
@@ -1,51 +0,0 @@
1
- import { readFileSync } from 'node:fs'
2
- import { LEGACY, MODERN, SERVER_INFO, VERSIONS } from './types.js'
3
- import type { MCPAnnotation as MCP } from '@toa.io/definitions/extensions.exposition'
4
-
5
- /**
6
- * What a client is told before it calls anything: the revisions served, what is served, and
7
- * who serves it. It is a function of the annotation alone, so it is built once and answered
8
- * as it is.
9
- */
10
- export interface Discovery {
11
- /** `server/discover`, which the modern revision has replaced the handshake with. */
12
- modern: object
13
-
14
- /** `initialize`, in the shape a client of an earlier revision reads. */
15
- legacy: (offered: string | undefined) => object
16
- }
17
-
18
- export function discovery(options: MCP): Discovery {
19
- const info = { name: options.name, version: VERSION }
20
-
21
- // `listChanged` is a stream a client holds open, and this endpoint holds none
22
- const capabilities = { tools: {} }
23
-
24
- const modern: Record<string, unknown> = {
25
- supportedVersions: VERSIONS,
26
- capabilities,
27
- _meta: { [SERVER_INFO]: info }
28
- }
29
-
30
- if (options.instructions !== undefined) modern.instructions = options.instructions
31
-
32
- function legacy(offered: string | undefined): object {
33
- const value: Record<string, unknown> = {
34
- // what the client asked for where that is served, and the newest handshake otherwise
35
- protocolVersion: offered !== undefined && offered !== MODERN ? offered : LEGACY,
36
- capabilities,
37
- serverInfo: info
38
- }
39
-
40
- if (options.instructions !== undefined) value.instructions = options.instructions
41
-
42
- return value
43
- }
44
-
45
- return { modern, legacy }
46
- }
47
-
48
- /** What this gateway is, which is what answers however an application names itself. */
49
- const VERSION: string = JSON.parse(
50
- readFileSync(new URL('../../package.json', import.meta.url), 'utf8')
51
- ).version
@@ -1,80 +0,0 @@
1
- import * as http from '../HTTP/index.js'
2
- import { JSONRPC, type Failure, type Response } from './types.js'
3
-
4
- /* The five JSON-RPC 2.0 fixes, which mean the same to every client. */
5
- export const PARSE = -32700
6
- export const INVALID_REQUEST = -32600
7
- export const METHOD_NOT_FOUND = -32601
8
- export const INVALID_PARAMS = -32602
9
- export const INTERNAL = -32603
10
-
11
- /*
12
- * MCP's own. It reserves -32020 to -32099 for the specification and tells an implementation
13
- * to use nothing of -32000 to -32019 at all — which is where this gateway's JSON-RPC codes
14
- * sit, so none of them is answered here.
15
- */
16
- export const HEADER_MISMATCH = -32020
17
- export const MISSING_CAPABILITY = -32021
18
- export const UNSUPPORTED_VERSION = -32022
19
-
20
- export function failure(code: number, message: string, data?: unknown): Failure {
21
- const value: Failure = { code, message }
22
-
23
- if (data !== undefined) value.data = data
24
-
25
- return value
26
- }
27
-
28
- export function response(id: string | number | null, error: Failure): Response {
29
- return { jsonrpc: JSONRPC, id, error }
30
- }
31
-
32
- /**
33
- * What an exception says as a JSON-RPC error.
34
- *
35
- * The readable text is `body`, never `message`: `http.Exception` calls `super()` with no
36
- * argument, so every one of them carries an empty `message`.
37
- */
38
- export function of(exception: unknown): Failure {
39
- if (exception instanceof http.NotFound || exception instanceof http.MethodNotAllowed)
40
- return failure(METHOD_NOT_FOUND, text(exception, 'Method not found'))
41
-
42
- if (exception instanceof http.BadRequest)
43
- return failure(INVALID_PARAMS, text(exception, 'Invalid params'))
44
-
45
- return failure(INTERNAL, 'Internal error')
46
- }
47
-
48
- /**
49
- * What the call was refused with, which a model reads and may correct itself by: what the
50
- * operation said, where it said anything, and otherwise what the status means here.
51
- */
52
- export function refusal(exception: http.ClientError): string {
53
- const body = exception.body
54
-
55
- if (typeof body !== 'object' || body === null || typeof body.code !== 'string')
56
- return text(exception, REFUSALS[exception.status] ?? 'Refused')
57
-
58
- const message = body.message as unknown
59
-
60
- return typeof message === 'string' && message !== '' ? message : (body.code as string)
61
- }
62
-
63
- /**
64
- * A refusal a model can act on, where the reply carried no words of its own. `auth` does
65
- * not say which of its directives refused, and `auth:id` is what most of them are: a call
66
- * naming a record that is not the caller's is the likeliest thing to have gone wrong.
67
- */
68
- const REFUSALS: Record<number, string> = {
69
- 400: 'The arguments were refused',
70
- 403: "Not authorized. If an argument names an identity or a record, it may not be the caller's own",
71
- 404: 'There is nothing at that address',
72
- 409: 'The record changed while the call was made',
73
- 429: 'Too many calls'
74
- }
75
-
76
- function text(exception: http.Exception, fallback: string): string {
77
- return typeof exception.body === 'string' && exception.body !== ''
78
- ? exception.body
79
- : fallback
80
- }
@@ -1 +0,0 @@
1
- export { Server } from './Server.js'
@@ -1,91 +0,0 @@
1
- import { describe, it } from 'node:test'
2
- import assert from 'node:assert/strict'
3
-
4
- import { annotations, input, output } from './schema.js'
5
- import type { Introspection, Schema } from '../Introspection.js'
6
-
7
- const schema = (value: object): Schema => value as unknown as Schema
8
-
9
- describe('input', () => {
10
- it('should ask for a route variable by the name the template gives it', () => {
11
- assert.deepEqual(input({ route: { id: schema({ type: 'string' }) } }, ['id']), {
12
- type: 'object',
13
- properties: { id: { type: 'string' } },
14
- required: ['id'],
15
- additionalProperties: false
16
- })
17
- })
18
-
19
- it('should ask for a variable the operation does not declare', () => {
20
- assert.deepEqual(input({}, ['id']), {
21
- type: 'object',
22
- properties: { id: { type: 'string' } },
23
- required: ['id'],
24
- additionalProperties: false
25
- })
26
- })
27
-
28
- it('should carry the querystring under a name of its own', () => {
29
- const introspection: Introspection = { query: { limit: schema({ type: 'integer' }) } }
30
- const { properties } = input(introspection, []) as { properties: Record<string, any> }
31
-
32
- assert.equal(properties.query.type, 'object')
33
- assert.deepEqual(properties.query.properties, { limit: { type: 'integer' } })
34
- })
35
-
36
- it('should leave a header where a call has nowhere to put one', () => {
37
- const introspection: Introspection = {
38
- headers: { token: { header: 'x-access-token', type: 'string' } }
39
- }
40
-
41
- assert.deepEqual(input(introspection, []), {
42
- type: 'object',
43
- properties: {},
44
- additionalProperties: false
45
- })
46
- })
47
-
48
- it('should take the body as it is, requiring what it requires', () => {
49
- const introspection: Introspection = {
50
- input: schema({
51
- type: 'object',
52
- properties: { title: { type: 'string' }, volume: { type: 'number' } },
53
- required: ['title']
54
- })
55
- }
56
-
57
- assert.deepEqual(input(introspection, []), {
58
- type: 'object',
59
- properties: { title: { type: 'string' }, volume: { type: 'number' } },
60
- required: ['title'],
61
- additionalProperties: false
62
- })
63
- })
64
- })
65
-
66
- describe('output', () => {
67
- it('should state a schema the operation declared', () => {
68
- const declared = schema({ type: 'object', properties: { id: { type: 'string' } } })
69
-
70
- assert.deepEqual(output({ output: declared }), declared)
71
- })
72
-
73
- it('should state none where the operation declared none', () => {
74
- // an operation's `output` is optional and normalizes to `{}`, which describes nothing
75
- assert.equal(output({ output: schema({}) }), undefined)
76
- assert.equal(output({}), undefined)
77
- })
78
- })
79
-
80
- describe('annotations', () => {
81
- it('should read what the verb says of the call', () => {
82
- assert.deepEqual(annotations('GET'), { readOnlyHint: true })
83
- assert.deepEqual(annotations('HEAD'), { readOnlyHint: true })
84
- assert.deepEqual(annotations('DELETE'), {
85
- destructiveHint: true,
86
- idempotentHint: true
87
- })
88
- assert.deepEqual(annotations('PUT'), { idempotentHint: true })
89
- assert.equal(annotations('POST'), undefined)
90
- })
91
- })
@@ -1,94 +0,0 @@
1
- import type { Introspection, Schema } from '../Introspection.js'
2
- import type { Annotations } from './types.js'
3
-
4
- /**
5
- * What a tool takes, which is what the procedure takes: a route variable by the name the
6
- * template gives it, the querystring under a name of its own, and what is left is the body.
7
- *
8
- * A `map:headers` property is not here: a call carries no headers of its own, so there is
9
- * nowhere for a model to put one.
10
- */
11
- // eslint-disable-next-line max-params
12
- export function input(
13
- introspection: Introspection,
14
- variables: string[],
15
- selection: Record<string, Schema> | null
16
- ): object {
17
- const properties: Record<string, unknown> = {}
18
- const required: string[] = []
19
-
20
- /*
21
- * By the name the template gives it, which is what the tool's own name states and what
22
- * resolving it consumes. A `map:segments` renaming is the gateway's, as invisible here as
23
- * it is to whoever writes the path; and a variable the operation does not declare has no
24
- * schema of its own, being a segment.
25
- */
26
- for (const variable of variables) {
27
- properties[variable] = introspection.route?.[variable] ?? { type: 'string' }
28
- required.push(variable)
29
- }
30
-
31
- /*
32
- * It is a querystring on the wire, which is nothing a model knows or needs to; what it is
33
- * to a caller is the part of a call that picks what the call is about. What selects
34
- * records is stated here and not in the resource's own description, where it would be the
35
- * same sentence on every queryable resource there is.
36
- */
37
- const query = { ...introspection.query, ...selection }
38
-
39
- if (Object.keys(query).length > 0)
40
- properties.query = {
41
- type: 'object',
42
- description:
43
- 'Which records the call works on: what to match, in what order, ' +
44
- 'and how many at once.',
45
- properties: query
46
- }
47
-
48
- const body = introspection.input as Shape | null | undefined
49
-
50
- if (body?.properties !== undefined) {
51
- Object.assign(properties, body.properties)
52
- required.push(...(body.required ?? []))
53
- }
54
-
55
- const schema: Record<string, unknown> = { type: 'object', properties }
56
-
57
- if (required.length > 0) schema.required = required
58
-
59
- // what a name does not state is not a parameter, and a model should not invent one
60
- schema.additionalProperties = false
61
-
62
- return schema
63
- }
64
-
65
- /**
66
- * What a tool answers with, where that is worth stating. An operation's `output` is optional
67
- * and normalizes to `{}`, which describes nothing — and a schema the revision would have the
68
- * reply validated against is worse said emptily than left unsaid.
69
- */
70
- export function output(introspection: Introspection): object | undefined {
71
- const schema = introspection.output as Shape | null | undefined
72
-
73
- if (schema === undefined || schema === null) return undefined
74
-
75
- return Object.keys(schema).length === 0 ? undefined : (schema as object)
76
- }
77
-
78
- /** What the verb says of the call, which the revision has a client treat as a hint. */
79
- export function annotations(verb: string): Annotations | undefined {
80
- const value: Annotations = {}
81
-
82
- if (verb === 'GET' || verb === 'HEAD') value.readOnlyHint = true
83
-
84
- if (verb === 'DELETE') value.destructiveHint = true
85
-
86
- if (verb === 'PUT' || verb === 'DELETE') value.idempotentHint = true
87
-
88
- return Object.keys(value).length === 0 ? undefined : value
89
- }
90
-
91
- interface Shape {
92
- properties?: Record<string, Schema>
93
- required?: string[]
94
- }