@toa.io/extensions.exposition 1.0.0-alpha.291 → 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.
- package/components/identity.basic/package.json +8 -0
- package/components/identity.federation/package.json +8 -0
- package/components/identity.passkeys/package.json +8 -0
- package/components/identity.tokens/package.json +10 -0
- package/package.json +25 -13
- package/transpiled/Discovery/Explorer.js +1 -1
- package/transpiled/Discovery/Explorer.js.map +1 -1
- package/transpiled/Discovery/Site.js +1 -1
- package/transpiled/Discovery/Site.js.map +1 -1
- package/transpiled/Discovery/trunk.js +1 -1
- package/transpiled/Discovery/trunk.js.map +1 -1
- package/transpiled/Endpoint.js +3 -0
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Factory.js +1 -1
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.js +1 -1
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/HTTP/Server.d.ts +1 -1
- package/transpiled/HTTP/Server.js +1 -1
- package/transpiled/HTTP/Server.js.map +1 -1
- package/transpiled/Introspection.d.ts +6 -0
- package/transpiled/Introspection.js +1 -0
- package/transpiled/Introspection.js.map +1 -1
- package/transpiled/MCP/Server.d.ts +1 -1
- package/transpiled/MCP/Server.js +1 -1
- package/transpiled/MCP/Server.js.map +1 -1
- package/transpiled/MCP/discover.d.ts +1 -1
- package/transpiled/MCP/schema.js +2 -2
- package/transpiled/Query.d.ts +2 -12
- package/transpiled/Query.js +3 -13
- package/transpiled/Query.js.map +1 -1
- package/transpiled/RPC/Dispatcher.d.ts +1 -1
- package/transpiled/RPC/Dispatcher.js +2 -2
- package/transpiled/RPC/Dispatcher.js.map +1 -1
- package/transpiled/RTD/Endpoint.d.ts +2 -3
- package/transpiled/RTD/Tree.js +1 -1
- package/transpiled/RTD/Tree.js.map +1 -1
- package/transpiled/RTD/factory.js +1 -1
- package/transpiled/RTD/factory.js.map +1 -1
- package/transpiled/RTD/syntax/index.d.ts +1 -2
- package/transpiled/RTD/syntax/index.js +1 -2
- package/transpiled/RTD/syntax/index.js.map +1 -1
- package/transpiled/Tenant.js +1 -1
- package/transpiled/Tenant.js.map +1 -1
- package/transpiled/directives/auth/Authorization.js +1 -1
- package/transpiled/directives/auth/Authorization.js.map +1 -1
- package/transpiled/directives/io/IO.js +1 -1
- package/transpiled/directives/io/IO.js.map +1 -1
- package/transpiled/directives/oauth/documents.d.ts +1 -1
- package/transpiled/index.d.ts +0 -2
- package/transpiled/index.js +0 -2
- package/transpiled/index.js.map +1 -1
- package/transpiled/service.js +1 -1
- package/transpiled/service.js.map +1 -1
- package/ui/dist/_app/immutable/assets/0.Cu0AnR_8.css +2 -0
- package/ui/dist/_app/immutable/assets/2.BghF56l_.css +1 -0
- package/ui/dist/_app/immutable/assets/ui.C8aD6zzF.css +1 -0
- package/ui/dist/_app/immutable/chunks/B8GvXrmq.js +1 -0
- package/ui/dist/_app/immutable/chunks/BVDJTrf4.js +3 -0
- package/ui/dist/_app/immutable/chunks/D6q28_Ok.js +86 -0
- package/ui/dist/_app/immutable/chunks/{D9tE1yyO.js → DVlaUfVU.js} +1 -1
- package/ui/dist/_app/immutable/chunks/DpB73ZB6.js +6 -0
- package/ui/dist/_app/immutable/entry/app.CTava8yn.js +2 -0
- package/ui/dist/_app/immutable/entry/start.yWN0gSLA.js +1 -0
- package/ui/dist/_app/immutable/nodes/0.HKRDBYrC.js +1 -0
- package/ui/dist/_app/immutable/nodes/1.CLa0ydOi.js +1 -0
- package/ui/dist/_app/immutable/nodes/2.C9Kaym8C.js +8 -0
- package/ui/dist/_app/immutable/nodes/3.C1X4_rXZ.js +1 -0
- package/ui/dist/_app/immutable/nodes/4.DdzDIi9E.js +1 -0
- package/ui/dist/_app/immutable/nodes/5.DpbmCMdw.js +1 -0
- package/ui/dist/_app/version.json +1 -1
- package/ui/dist/index.html +12 -12
- package/CHANGELOG.md +0 -35
- package/components/identity.bans/tsconfig.tsbuildinfo +0 -1
- package/components/identity.basic/source/lib/credentials.test.ts +0 -18
- package/components/identity.basic/tsconfig.tsbuildinfo +0 -1
- package/components/identity.clients/source/lib/canonical.test.ts +0 -43
- package/components/identity.clients/source/lib/cimd.test.ts +0 -122
- package/components/identity.clients/source/lib/redirect.test.ts +0 -47
- package/components/identity.clients/tsconfig.tsbuildinfo +0 -1
- package/components/identity.credentials/source/list.test.ts +0 -70
- package/components/identity.credentials/tsconfig.tsbuildinfo +0 -1
- package/components/identity.federation/source/lib/discovery.test.ts +0 -60
- package/components/identity.federation/source/list.test.ts +0 -41
- package/components/identity.federation/tsconfig.tsbuildinfo +0 -1
- package/components/identity.grants/tsconfig.tsbuildinfo +0 -1
- package/components/identity.keys/tsconfig.tsbuildinfo +0 -1
- package/components/identity.otp/tsconfig.tsbuildinfo +0 -1
- package/components/identity.passkeys/source/errors.test.ts +0 -34
- package/components/identity.passkeys/source/webauthn.test.ts +0 -26
- package/components/identity.passkeys/tsconfig.tsbuildinfo +0 -1
- package/components/identity.roles/tsconfig.tsbuildinfo +0 -1
- package/components/identity.tokens/source/authenticate.test.ts +0 -112
- package/components/identity.tokens/source/decrypt.test.ts +0 -216
- package/components/identity.tokens/source/encrypt.test.ts +0 -150
- package/components/identity.tokens/source/issue.test.ts +0 -73
- package/components/identity.tokens/source/lib/form.test.ts +0 -25
- package/components/identity.tokens/source/lib/paseto.test.ts +0 -62
- package/components/identity.tokens/tsconfig.tsbuildinfo +0 -1
- package/context.toa.yaml +0 -31
- package/cucumber.mjs +0 -7
- package/documentation/.assets/ia3-dark.jpg +0 -0
- package/documentation/.assets/ia3-light.jpg +0 -0
- package/documentation/.assets/overview-dark.jpg +0 -0
- package/documentation/.assets/overview-light.jpg +0 -0
- package/documentation/.assets/role-scopes-dark.jpg +0 -0
- package/documentation/.assets/role-scopes-light.jpg +0 -0
- package/documentation/.assets/rtd-dark.jpg +0 -0
- package/documentation/.assets/rtd-light.jpg +0 -0
- package/documentation/access.md +0 -350
- package/documentation/authorities.md +0 -51
- package/documentation/cache.md +0 -72
- package/documentation/components.md +0 -472
- package/documentation/consent.md +0 -101
- package/documentation/credentials.md +0 -88
- package/documentation/dev.md +0 -30
- package/documentation/discovery.md +0 -81
- package/documentation/flow.md +0 -44
- package/documentation/help.md +0 -122
- package/documentation/identity.md +0 -304
- package/documentation/introspection.md +0 -123
- package/documentation/io.md +0 -167
- package/documentation/ip.md +0 -24
- package/documentation/map.md +0 -123
- package/documentation/mcp.md +0 -183
- package/documentation/notes/desync.jpg +0 -0
- package/documentation/notes/peers.md +0 -59
- package/documentation/notes/sse.md +0 -71
- package/documentation/notes/throttling.md +0 -122
- package/documentation/oauth.md +0 -180
- package/documentation/octets.md +0 -334
- package/documentation/passkeys.md +0 -11
- package/documentation/protocol.md +0 -120
- package/documentation/query.md +0 -324
- package/documentation/require.md +0 -15
- package/documentation/rpc.md +0 -154
- package/documentation/tracing.md +0 -70
- package/documentation/tree.md +0 -199
- package/features/access.feature +0 -596
- package/features/annotation.feature +0 -32
- package/features/auth.assert.feature +0 -55
- package/features/auth.bearer.feature +0 -120
- package/features/auth.claims.feature +0 -171
- package/features/auth.incept.feature +0 -166
- package/features/auth.input.feature +0 -59
- package/features/authorities.basic.feature +0 -141
- package/features/authorities.feature +0 -71
- package/features/authorities.federation.feature +0 -100
- package/features/authorities.tokens.feature +0 -117
- package/features/body.feature +0 -76
- package/features/cache.feature +0 -368
- package/features/configuration.feature +0 -206
- package/features/cors.feature +0 -127
- package/features/credentials.feature +0 -106
- package/features/debug.feature +0 -34
- package/features/dev.feature +0 -90
- package/features/directives.feature +0 -61
- package/features/discovery.feature +0 -213
- package/features/discovery.ui.feature +0 -213
- package/features/dynamic.feature +0 -192
- package/features/errors.feature +0 -258
- package/features/etag.feature +0 -239
- package/features/flow.feature +0 -148
- package/features/help.feature +0 -512
- package/features/identity.bans.feature +0 -200
- package/features/identity.basic.feature +0 -666
- package/features/identity.feature +0 -240
- package/features/identity.federation.feature +0 -396
- package/features/identity.otp.feature +0 -142
- package/features/identity.roles.feature +0 -568
- package/features/identity.tokens.custom.feature +0 -430
- package/features/identity.tokens.feature +0 -131
- package/features/interruptions.feature +0 -20
- package/features/introspection.feature +0 -565
- package/features/introspection.map.feature +0 -108
- package/features/io.feature +0 -204
- package/features/io.throttle.feature +0 -166
- package/features/map.feature +0 -360
- package/features/mcp.feature +0 -753
- package/features/methods.feature +0 -48
- package/features/oauth.clients.feature +0 -195
- package/features/oauth.discovery.feature +0 -164
- package/features/oauth.grants.feature +0 -301
- package/features/octets.cloudinary.feature +0 -233
- package/features/octets.download.feature +0 -194
- package/features/octets.entries.feature +0 -83
- package/features/octets.feature +0 -306
- package/features/octets.head.feature +0 -40
- package/features/octets.location.feature +0 -83
- package/features/octets.meta.feature +0 -117
- package/features/octets.workflows.feature +0 -565
- package/features/passkeys.feature +0 -66
- package/features/probes.feature +0 -18
- package/features/query.feature +0 -389
- package/features/realtime.feature +0 -34
- package/features/require.feature +0 -66
- package/features/response.feature +0 -103
- package/features/routes.feature +0 -224
- package/features/rpc.feature +0 -429
- package/features/server.feature +0 -21
- package/features/site/_app/immutable/asset.js +0 -1
- package/features/site/favicon.ico +0 -0
- package/features/site/index.html +0 -10
- package/features/steps/.env.example +0 -5
- package/features/steps/Captures.ts +0 -20
- package/features/steps/Cloudinary.ts +0 -12
- package/features/steps/Common.ts +0 -38
- package/features/steps/Components.ts +0 -115
- package/features/steps/Database.ts +0 -106
- package/features/steps/Gateway.ts +0 -240
- package/features/steps/HTTP.ts +0 -96
- package/features/steps/IDP.ts +0 -361
- package/features/steps/Identity.ts +0 -54
- package/features/steps/OTP.ts +0 -42
- package/features/steps/Parameters.ts +0 -162
- package/features/steps/Probe.ts +0 -38
- package/features/steps/Realtime.ts +0 -175
- package/features/steps/Workspace.ts +0 -48
- package/features/steps/components/audit/manifest.toa.yaml +0 -20
- package/features/steps/components/audit/operations/record.js +0 -5
- package/features/steps/components/echo/manifest.toa.yaml +0 -59
- package/features/steps/components/echo/operations/affect.js +0 -3
- package/features/steps/components/echo/operations/compute.js +0 -3
- package/features/steps/components/echo/operations/echo.js +0 -3
- package/features/steps/components/echo/operations/error.js +0 -7
- package/features/steps/components/echo/operations/identity.js +0 -3
- package/features/steps/components/echo/operations/parameters.js +0 -3
- package/features/steps/components/echo/operations/ping.js +0 -3
- package/features/steps/components/echo/operations/unwrap.js +0 -3
- package/features/steps/components/echo.beacon/manifest.toa.yaml +0 -2
- package/features/steps/components/echo.beacon/operations/hello.js +0 -3
- package/features/steps/components/greeter/manifest.toa.yaml +0 -5
- package/features/steps/components/greeter/operations/greet.js +0 -3
- package/features/steps/components/notify/manifest.toa.yaml +0 -20
- package/features/steps/components/notify/operations/send.js +0 -5
- package/features/steps/components/octets.tester/manifest.toa.yaml +0 -73
- package/features/steps/components/octets.tester/operations/authority.js +0 -3
- package/features/steps/components/octets.tester/operations/bar.js +0 -9
- package/features/steps/components/octets.tester/operations/baz.js +0 -9
- package/features/steps/components/octets.tester/operations/concat.js +0 -5
- package/features/steps/components/octets.tester/operations/echo.js +0 -5
- package/features/steps/components/octets.tester/operations/err.js +0 -14
- package/features/steps/components/octets.tester/operations/foo.js +0 -5
- package/features/steps/components/octets.tester/operations/id.js +0 -5
- package/features/steps/components/octets.tester/operations/identity.js +0 -5
- package/features/steps/components/octets.tester/operations/lenna.png +0 -0
- package/features/steps/components/octets.tester/operations/redirect.js +0 -17
- package/features/steps/components/octets.tester/operations/yex.js +0 -14
- package/features/steps/components/octets.tester/operations/yield.js +0 -11
- package/features/steps/components/orders/manifest.toa.yaml +0 -30
- package/features/steps/components/orders/operations/create.js +0 -7
- package/features/steps/components/pots/manifest.toa.yaml +0 -91
- package/features/steps/components/pots/migrations/0002-indexes.yaml +0 -4
- package/features/steps/components/pricing/manifest.toa.yaml +0 -13
- package/features/steps/components/pricing/operations/quote.js +0 -3
- package/features/steps/components/sequences/manifest.toa.yaml +0 -11
- package/features/steps/components/sequences/operations/numbers.js +0 -5
- package/features/steps/components/sequences/operations/tokens.js +0 -14
- package/features/steps/components/users/manifest.toa.yaml +0 -30
- package/features/steps/components/users/operations/create.js +0 -11
- package/features/steps/components/users.properties/manifest.toa.yaml +0 -22
- package/features/steps/map.ts +0 -30
- package/features/steps/tsconfig.json +0 -9
- package/features/streams.feature +0 -35
- package/features/timestamps.feature +0 -41
- package/features/timing.feature +0 -49
- package/features/tracing.feature +0 -123
- package/schemas/annotation.cos.yaml +0 -125
- package/schemas/call.cos.yaml +0 -18
- package/schemas/directive.cos.yaml +0 -7
- package/schemas/method.cos.yaml +0 -23
- package/schemas/node.cos.yaml +0 -22
- package/schemas/query.cos.yaml +0 -31
- package/schemas/querystring.cos.yaml +0 -19
- package/schemas/range.cos.yaml +0 -10
- package/schemas/route.cos.yaml +0 -6
- package/source/Annotation.ts +0 -89
- package/source/Branch.test.ts +0 -40
- package/source/Branch.ts +0 -44
- package/source/Composition.ts +0 -51
- package/source/Context.ts +0 -11
- package/source/Directive.test.ts +0 -199
- package/source/Directive.ts +0 -248
- package/source/Discovery/Explorer.ts +0 -34
- package/source/Discovery/Site.test.ts +0 -147
- package/source/Discovery/Site.ts +0 -202
- package/source/Discovery/index.ts +0 -3
- package/source/Discovery/tree.test.ts +0 -175
- package/source/Discovery/tree.ts +0 -77
- package/source/Discovery/trunk.ts +0 -33
- package/source/Endpoint.test.ts +0 -67
- package/source/Endpoint.ts +0 -157
- package/source/Factory.ts +0 -42
- package/source/Gateway.ts +0 -390
- package/source/HTTP/Context.ts +0 -143
- package/source/HTTP/Probe.ts +0 -99
- package/source/HTTP/Server.ts +0 -430
- package/source/HTTP/Timing.ts +0 -14
- package/source/HTTP/address.test.ts +0 -28
- package/source/HTTP/address.ts +0 -16
- package/source/HTTP/exceptions.ts +0 -99
- package/source/HTTP/formats/form.ts +0 -21
- package/source/HTTP/formats/index.ts +0 -36
- package/source/HTTP/formats/json.ts +0 -14
- package/source/HTTP/formats/msgpack.ts +0 -14
- package/source/HTTP/formats/text.ts +0 -10
- package/source/HTTP/formats/yaml.test.ts +0 -22
- package/source/HTTP/formats/yaml.ts +0 -40
- package/source/HTTP/index.ts +0 -6
- package/source/HTTP/messages.test.ts +0 -196
- package/source/HTTP/messages.ts +0 -186
- package/source/HTTP/types.ts +0 -39
- package/source/Interception.ts +0 -37
- package/source/Introspection.ts +0 -179
- package/source/MCP/Server.ts +0 -335
- package/source/MCP/discover.ts +0 -51
- package/source/MCP/errors.ts +0 -80
- package/source/MCP/index.ts +0 -1
- package/source/MCP/schema.test.ts +0 -91
- package/source/MCP/schema.ts +0 -94
- package/source/MCP/tools.ts +0 -144
- package/source/MCP/types.ts +0 -84
- package/source/Mapping.ts +0 -101
- package/source/Query.test.ts +0 -54
- package/source/Query.ts +0 -277
- package/source/RPC/Context.ts +0 -75
- package/source/RPC/Dispatcher.ts +0 -150
- package/source/RPC/errors.test.ts +0 -77
- package/source/RPC/errors.ts +0 -82
- package/source/RPC/index.ts +0 -1
- package/source/RPC/names.test.ts +0 -141
- package/source/RPC/names.ts +0 -176
- package/source/RPC/types.ts +0 -34
- package/source/RTD/Context.ts +0 -16
- package/source/RTD/Directives.ts +0 -126
- package/source/RTD/Endpoint.ts +0 -27
- package/source/RTD/Match.ts +0 -11
- package/source/RTD/Method.ts +0 -39
- package/source/RTD/Node.ts +0 -169
- package/source/RTD/Route.ts +0 -93
- package/source/RTD/Tree.ts +0 -137
- package/source/RTD/expiration.test.ts +0 -81
- package/source/RTD/factory.ts +0 -105
- package/source/RTD/index.ts +0 -8
- package/source/RTD/segment.test.ts +0 -35
- package/source/RTD/segment.ts +0 -51
- package/source/RTD/syntax/index.ts +0 -2
- package/source/RTD/syntax/parse.test.ts +0 -196
- package/source/RTD/syntax/parse.ts +0 -171
- package/source/RTD/syntax/types.ts +0 -69
- package/source/RTD/walk.test.ts +0 -147
- package/source/Remotes.test.ts +0 -79
- package/source/Remotes.ts +0 -39
- package/source/Tenant.ts +0 -73
- package/source/const.ts +0 -45
- package/source/deployment.ts +0 -96
- package/source/directives/auth/Anonymous.test.ts +0 -70
- package/source/directives/auth/Anonymous.ts +0 -36
- package/source/directives/auth/Anyone.ts +0 -23
- package/source/directives/auth/Assert.ts +0 -43
- package/source/directives/auth/Authorization.test.ts +0 -24
- package/source/directives/auth/Authorization.ts +0 -388
- package/source/directives/auth/Delegate.test.ts +0 -36
- package/source/directives/auth/Delegate.ts +0 -54
- package/source/directives/auth/Echo.ts +0 -24
- package/source/directives/auth/Federation.ts +0 -104
- package/source/directives/auth/Id.ts +0 -37
- package/source/directives/auth/Incept.ts +0 -117
- package/source/directives/auth/Input.ts +0 -92
- package/source/directives/auth/Role.test.ts +0 -147
- package/source/directives/auth/Role.ts +0 -99
- package/source/directives/auth/Rule.ts +0 -59
- package/source/directives/auth/Scheme.ts +0 -31
- package/source/directives/auth/create.ts +0 -11
- package/source/directives/auth/index.ts +0 -3
- package/source/directives/auth/schemes.test.ts +0 -18
- package/source/directives/auth/schemes.ts +0 -39
- package/source/directives/auth/split.ts +0 -14
- package/source/directives/auth/types.ts +0 -75
- package/source/directives/cache/Cache.ts +0 -92
- package/source/directives/cache/Control.ts +0 -81
- package/source/directives/cache/Exact.ts +0 -7
- package/source/directives/cache/etag.ts +0 -38
- package/source/directives/cache/index.ts +0 -3
- package/source/directives/cache/types.ts +0 -9
- package/source/directives/cors/CORS.test.ts +0 -75
- package/source/directives/cors/CORS.ts +0 -88
- package/source/directives/cors/index.ts +0 -3
- package/source/directives/dev/Development.ts +0 -41
- package/source/directives/dev/Faulty.ts +0 -31
- package/source/directives/dev/Sleep.ts +0 -53
- package/source/directives/dev/Stub.ts +0 -14
- package/source/directives/dev/Throw.ts +0 -14
- package/source/directives/dev/index.ts +0 -3
- package/source/directives/dev/types.ts +0 -5
- package/source/directives/flow/Compose.ts +0 -98
- package/source/directives/flow/Fetch.ts +0 -86
- package/source/directives/flow/Flow.ts +0 -43
- package/source/directives/flow/index.ts +0 -3
- package/source/directives/flow/types.ts +0 -7
- package/source/directives/help/Family.ts +0 -122
- package/source/directives/help/Help.test.ts +0 -227
- package/source/directives/help/Help.ts +0 -47
- package/source/directives/help/Parameters.ts +0 -47
- package/source/directives/help/described.ts +0 -57
- package/source/directives/help/index.ts +0 -45
- package/source/directives/index.ts +0 -33
- package/source/directives/io/Directive.ts +0 -17
- package/source/directives/io/IO.ts +0 -118
- package/source/directives/io/Input.ts +0 -55
- package/source/directives/io/Message.ts +0 -1
- package/source/directives/io/Output.ts +0 -81
- package/source/directives/io/Status.test.ts +0 -88
- package/source/directives/io/Status.ts +0 -47
- package/source/directives/io/Throttle.ts +0 -30
- package/source/directives/io/index.ts +0 -3
- package/source/directives/io/lib/throttle/Configuration.test.ts +0 -72
- package/source/directives/io/lib/throttle/Configuration.ts +0 -68
- package/source/directives/io/lib/throttle/Keys.ts +0 -53
- package/source/directives/io/lib/throttle/Quotas.test.ts +0 -411
- package/source/directives/io/lib/throttle/Quotas.ts +0 -190
- package/source/directives/io/lib/throttle/Sync.test.ts +0 -163
- package/source/directives/io/lib/throttle/Sync.ts +0 -93
- package/source/directives/io/lib/throttle/Warning.test.ts +0 -32
- package/source/directives/io/lib/throttle/Warning.ts +0 -29
- package/source/directives/io/lib/throttle/components/Component.ts +0 -7
- package/source/directives/io/lib/throttle/components/IP.ts +0 -30
- package/source/directives/io/lib/throttle/components/Identity.ts +0 -19
- package/source/directives/io/lib/throttle/components/Path.ts +0 -8
- package/source/directives/io/lib/throttle/components/Route.ts +0 -19
- package/source/directives/io/lib/throttle/components/Segment.ts +0 -19
- package/source/directives/io/lib/throttle/components/index.ts +0 -19
- package/source/directives/io/lib/throttle/conditions/Condition.ts +0 -5
- package/source/directives/io/lib/throttle/conditions/Status.ts +0 -17
- package/source/directives/io/lib/throttle/conditions/index.ts +0 -11
- package/source/directives/io/lib/throttle/index.ts +0 -4
- package/source/directives/io/schemas.test.ts +0 -40
- package/source/directives/io/schemas.ts +0 -16
- package/source/directives/map/Authority.ts +0 -15
- package/source/directives/map/Buffer.ts +0 -15
- package/source/directives/map/Claims.ts +0 -63
- package/source/directives/map/Directive.ts +0 -4
- package/source/directives/map/Headers.ts +0 -60
- package/source/directives/map/Language.ts +0 -45
- package/source/directives/map/Languages.ts +0 -17
- package/source/directives/map/Map.ts +0 -85
- package/source/directives/map/Mapping.ts +0 -45
- package/source/directives/map/Properties.ts +0 -15
- package/source/directives/map/Segments.ts +0 -52
- package/source/directives/map/index.ts +0 -3
- package/source/directives/mcp/MCP.ts +0 -33
- package/source/directives/mcp/Tool.test.ts +0 -56
- package/source/directives/mcp/Tool.ts +0 -32
- package/source/directives/mcp/index.ts +0 -6
- package/source/directives/oauth/Discovery.ts +0 -66
- package/source/directives/oauth/documents.ts +0 -110
- package/source/directives/oauth/index.ts +0 -3
- package/source/directives/octets/Context.ts +0 -23
- package/source/directives/octets/Delete.ts +0 -96
- package/source/directives/octets/Directive.ts +0 -21
- package/source/directives/octets/Get.ts +0 -88
- package/source/directives/octets/Octets.ts +0 -82
- package/source/directives/octets/Put.ts +0 -186
- package/source/directives/octets/Workflow.ts +0 -60
- package/source/directives/octets/bytes.test.ts +0 -33
- package/source/directives/octets/bytes.ts +0 -18
- package/source/directives/octets/index.ts +0 -3
- package/source/directives/octets/schemas.test.ts +0 -20
- package/source/directives/octets/schemas.ts +0 -15
- package/source/directives/octets/types.ts +0 -9
- package/source/directives/octets/workflows/Execution.ts +0 -130
- package/source/directives/octets/workflows/Workflow.ts +0 -51
- package/source/directives/octets/workflows/index.ts +0 -1
- package/source/directives/require/Directive.ts +0 -5
- package/source/directives/require/Headers.ts +0 -19
- package/source/directives/require/Require.ts +0 -27
- package/source/directives/require/index.ts +0 -3
- package/source/discovery.ts +0 -1
- package/source/exceptions.ts +0 -47
- package/source/index.ts +0 -12
- package/source/io.ts +0 -4
- package/source/manifest.test.ts +0 -56
- package/source/manifest.ts +0 -56
- package/source/octets.d.ts +0 -17
- package/source/root.ts +0 -59
- package/source/schemas.test.ts +0 -31
- package/source/schemas.ts +0 -15
- package/source/service.ts +0 -94
- package/source/shortcuts.ts +0 -14
- package/source/userland.ts +0 -47
- package/transpiled/Annotation.d.ts +0 -70
- package/transpiled/Annotation.js +0 -2
- package/transpiled/Annotation.js.map +0 -1
- package/transpiled/RTD/syntax/parse.d.ts +0 -4
- package/transpiled/RTD/syntax/parse.js +0 -112
- package/transpiled/RTD/syntax/parse.js.map +0 -1
- package/transpiled/RTD/syntax/types.d.ts +0 -52
- package/transpiled/RTD/syntax/types.js +0 -11
- package/transpiled/RTD/syntax/types.js.map +0 -1
- package/transpiled/const.d.ts +0 -36
- package/transpiled/const.js +0 -37
- package/transpiled/const.js.map +0 -1
- package/transpiled/deployment.d.ts +0 -6
- package/transpiled/deployment.js +0 -76
- package/transpiled/deployment.js.map +0 -1
- package/transpiled/manifest.d.ts +0 -3
- package/transpiled/manifest.js +0 -39
- package/transpiled/manifest.js.map +0 -1
- package/transpiled/schemas.d.ts +0 -9
- package/transpiled/schemas.js +0 -9
- package/transpiled/schemas.js.map +0 -1
- package/transpiled/shortcuts.d.ts +0 -3
- package/transpiled/shortcuts.js +0 -13
- package/transpiled/shortcuts.js.map +0 -1
- package/tsconfig.json +0 -13
- package/tsconfig.tsbuildinfo +0 -1
- package/ui/dist/_app/immutable/assets/0.Bl7vLmIK.css +0 -2
- package/ui/dist/_app/immutable/assets/2.BC0-Jhqu.css +0 -1
- package/ui/dist/_app/immutable/chunks/B_pK3U1C.js +0 -6
- package/ui/dist/_app/immutable/chunks/CiKbPLyY.js +0 -1
- package/ui/dist/_app/immutable/chunks/DjIYL2zC.js +0 -3
- package/ui/dist/_app/immutable/entry/app.DMqmL4NY.js +0 -2
- package/ui/dist/_app/immutable/entry/start.CRe7HWBI.js +0 -1
- package/ui/dist/_app/immutable/nodes/0.D9m-6cbM.js +0 -1
- package/ui/dist/_app/immutable/nodes/1.Cgi_RcSO.js +0 -1
- package/ui/dist/_app/immutable/nodes/2.D_Cbxgz4.js +0 -14
package/source/Introspection.ts
DELETED
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
import type { Remote } from '@toa.io/core'
|
|
2
|
-
import type { Context } from './HTTP/index.js'
|
|
3
|
-
|
|
4
|
-
export interface Introspection {
|
|
5
|
-
/**
|
|
6
|
-
* What the route states this method is. The operation states what it is too, and that is
|
|
7
|
-
* not this: an operation is written without knowledge of any route, and a method is an
|
|
8
|
-
* operation and a route together — the same operation mounted twice is two methods, and
|
|
9
|
-
* one sentence cannot be true of both. The operation's own is for the Introspection.
|
|
10
|
-
*/
|
|
11
|
-
description?: string
|
|
12
|
-
|
|
13
|
-
/** what a person is shown where a client lists this method, which a name is not */
|
|
14
|
-
title?: string
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* whether reaching it takes nothing at all — `auth:anonymous`. Said rather than left
|
|
18
|
-
* unsaid, because it is also what refuses a caller presenting a credential: a client
|
|
19
|
-
* cannot know that from an answer that says nothing.
|
|
20
|
-
*/
|
|
21
|
-
anonymous?: boolean
|
|
22
|
-
|
|
23
|
-
/** whether reaching it takes being someone, whoever — `auth:anyone` and its like */
|
|
24
|
-
authenticated?: boolean
|
|
25
|
-
|
|
26
|
-
/** whether reaching it is being the identity it is about — `auth:id` */
|
|
27
|
-
private?: boolean
|
|
28
|
-
|
|
29
|
-
/** whether reaching it takes a role — `auth:role` */
|
|
30
|
-
protected?: boolean
|
|
31
|
-
|
|
32
|
-
/** and whether that role is one of the `system` scope */
|
|
33
|
-
system?: boolean
|
|
34
|
-
|
|
35
|
-
/** whether the route publishes this method to a model — [`mcp:tool`](mcp.md) */
|
|
36
|
-
mcp?: boolean
|
|
37
|
-
route?: Record<string, Schema>
|
|
38
|
-
query?: Record<string, Schema>
|
|
39
|
-
|
|
40
|
-
/** what the body is, where it is a file rather than a value — [`octets:put`](octets.md) */
|
|
41
|
-
octets?: Octets
|
|
42
|
-
input?: Schema
|
|
43
|
-
output?: Schema
|
|
44
|
-
errors?: string[]
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/** What sending a file to a resource takes, which is not something a schema states. */
|
|
48
|
-
export interface Octets {
|
|
49
|
-
/** what may be sent, in the syntax of an `accept` header; anything where unstated */
|
|
50
|
-
accept?: string
|
|
51
|
-
|
|
52
|
-
/** the largest body it takes, as it is written and as a refusal reports it */
|
|
53
|
-
limit: string
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Whether the reply arrives as a stream of parts rather than as one object: a workflow
|
|
57
|
-
* runs on what was stored, and each step answers as it finishes. The first part is the
|
|
58
|
-
* entry itself, which is what a caller that wants nothing else reads and stops.
|
|
59
|
-
*/
|
|
60
|
-
stream?: boolean
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export type Schema = Awaited<ReturnType<Remote['explain']>>['input']
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* The same request, as a description of a resource rather than a call to one. A directive
|
|
67
|
-
* that answers differently to the two reads `exploratory` — `Anonymous` is the one that
|
|
68
|
-
* does, because the rule refusing a credential at an `anonymous` route is about a reply a
|
|
69
|
-
* cache would hold, and a description is not one.
|
|
70
|
-
*/
|
|
71
|
-
export function describing(context: Context): Context {
|
|
72
|
-
return Object.create(context, {
|
|
73
|
-
exploratory: { value: true, enumerable: true }
|
|
74
|
-
}) as Context
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* The same, in the order the shape states — whatever order the families that filled it ran
|
|
79
|
-
* in. What a resource says about itself is read, so it is written the way it is documented.
|
|
80
|
-
*/
|
|
81
|
-
export function order(introspection: Introspection): Introspection {
|
|
82
|
-
const ordered: Introspection = {}
|
|
83
|
-
|
|
84
|
-
for (const key of KEYS)
|
|
85
|
-
if (introspection[key] !== undefined) (ordered[key] as unknown) = introspection[key]
|
|
86
|
-
|
|
87
|
-
return ordered
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
const KEYS = [
|
|
91
|
-
'title',
|
|
92
|
-
'description',
|
|
93
|
-
'anonymous',
|
|
94
|
-
'authenticated',
|
|
95
|
-
'private',
|
|
96
|
-
'protected',
|
|
97
|
-
'system',
|
|
98
|
-
'mcp',
|
|
99
|
-
'route',
|
|
100
|
-
'query',
|
|
101
|
-
'octets',
|
|
102
|
-
'input',
|
|
103
|
-
'output',
|
|
104
|
-
'errors'
|
|
105
|
-
] as const
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* The schema of one input property, taken out of it: a property another family fills is
|
|
109
|
-
* not the caller's to send, and what took it says where it comes from instead.
|
|
110
|
-
*/
|
|
111
|
-
export function take(carrier: Carrier, property: string): Schema | undefined {
|
|
112
|
-
const input = carrier.input as Shape | null | undefined
|
|
113
|
-
const properties = input?.properties
|
|
114
|
-
|
|
115
|
-
if (
|
|
116
|
-
input === undefined ||
|
|
117
|
-
input === null ||
|
|
118
|
-
properties === undefined ||
|
|
119
|
-
!(property in properties)
|
|
120
|
-
)
|
|
121
|
-
return undefined
|
|
122
|
-
|
|
123
|
-
const schema = properties[property]
|
|
124
|
-
|
|
125
|
-
delete properties[property]
|
|
126
|
-
|
|
127
|
-
if (input.required !== undefined)
|
|
128
|
-
input.required = input.required.filter((name) => name !== property)
|
|
129
|
-
|
|
130
|
-
return schema
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* A schema restricted to the properties a whitelist admits, and an array's items where it
|
|
135
|
-
* describes an array. What is not an object of properties is left alone: a whitelist has
|
|
136
|
-
* nothing to say about a string.
|
|
137
|
-
*/
|
|
138
|
-
export function restrict(
|
|
139
|
-
schema: Schema | undefined,
|
|
140
|
-
allowed: Set<string>
|
|
141
|
-
): Schema | undefined {
|
|
142
|
-
const shape = schema as Shape | null | undefined
|
|
143
|
-
|
|
144
|
-
if (shape === undefined || shape === null) return schema
|
|
145
|
-
|
|
146
|
-
if (shape.items !== undefined)
|
|
147
|
-
return { ...shape, items: restrict(shape.items, allowed) } as unknown as Schema
|
|
148
|
-
|
|
149
|
-
if (shape.properties === undefined) return schema
|
|
150
|
-
|
|
151
|
-
const properties: Record<string, Schema> = {}
|
|
152
|
-
|
|
153
|
-
for (const [name, property] of Object.entries(shape.properties))
|
|
154
|
-
if (allowed.has(name)) properties[name] = property
|
|
155
|
-
|
|
156
|
-
const restricted: Shape = { ...shape, properties }
|
|
157
|
-
|
|
158
|
-
if (shape.required !== undefined)
|
|
159
|
-
restricted.required = shape.required.filter((name) => allowed.has(name))
|
|
160
|
-
|
|
161
|
-
return restricted as unknown as Schema
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* What a schema is read as here: the keywords these narrow, and whatever else it carries.
|
|
166
|
-
* `Schema` as core declares it requires `properties`, which a schema of a string has not,
|
|
167
|
-
* so the two are cast through rather than assigned.
|
|
168
|
-
*/
|
|
169
|
-
/** Whatever states an input: an explanation as the operation gave it, or as a route left it. */
|
|
170
|
-
interface Carrier {
|
|
171
|
-
input?: Schema
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
interface Shape {
|
|
175
|
-
properties?: Record<string, Schema>
|
|
176
|
-
required?: string[]
|
|
177
|
-
items?: Schema
|
|
178
|
-
[keyword: string]: unknown
|
|
179
|
-
}
|
package/source/MCP/Server.ts
DELETED
|
@@ -1,335 +0,0 @@
|
|
|
1
|
-
import { console } from 'openspan'
|
|
2
|
-
import { BRANCH_TTL } from '../const.js'
|
|
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 { MCP } from '../Annotation.js'
|
|
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 = '?='
|
package/source/MCP/discover.ts
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from 'node:fs'
|
|
2
|
-
import { LEGACY, MODERN, SERVER_INFO, VERSIONS } from './types.js'
|
|
3
|
-
import type { MCP } from '../Annotation.js'
|
|
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
|
package/source/MCP/errors.ts
DELETED
|
@@ -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
|
-
}
|
package/source/MCP/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { Server } from './Server.js'
|