@toa.io/extensions.exposition 1.0.0-alpha.285 → 1.0.0-alpha.287
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/CHANGELOG.md +1 -545
- package/components/exposition.octets/operations/delete.js +1 -1
- package/components/exposition.octets/operations/get.js +5 -2
- package/components/exposition.octets/operations/head.js +1 -1
- package/components/exposition.octets/operations/put.js +29 -37
- package/components/exposition.octets/types/toa.d.ts +1 -1
- package/components/identity.bans/manifest.toa.yaml +12 -13
- package/components/identity.bans/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.bans/operations/transit.js +1 -1
- package/components/identity.bans/source/transit.ts +1 -1
- package/components/identity.bans/tsconfig.tsbuildinfo +1 -1
- package/components/identity.bans/types/toa.d.ts +5 -5
- package/components/identity.basic/events/principal.js +3 -1
- package/components/identity.basic/manifest.toa.yaml +17 -23
- package/components/identity.basic/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.basic/migrations/0002-indexes.yaml +13 -0
- package/components/identity.basic/operations/add.js +1 -1
- package/components/identity.basic/operations/authenticate.js +2 -2
- package/components/identity.basic/operations/check.js +4 -2
- package/components/identity.basic/operations/delete.js +1 -1
- package/components/identity.basic/operations/incept.js +1 -1
- package/components/identity.basic/operations/info.js +1 -1
- package/components/identity.basic/operations/lib/credentials.js +1 -1
- package/components/identity.basic/operations/transit.js +7 -8
- package/components/identity.basic/source/add.ts +5 -2
- package/components/identity.basic/source/authenticate.ts +11 -13
- package/components/identity.basic/source/check.ts +9 -6
- package/components/identity.basic/source/delete.ts +4 -1
- package/components/identity.basic/source/incept.ts +13 -10
- package/components/identity.basic/source/info.ts +4 -1
- package/components/identity.basic/source/lib/credentials.ts +2 -3
- package/components/identity.basic/source/transit.ts +27 -21
- package/components/identity.basic/tsconfig.tsbuildinfo +1 -1
- package/components/identity.basic/types/index.d.ts +7 -3
- package/components/identity.basic/types/toa.d.ts +5 -5
- package/components/identity.clients/manifest.toa.yaml +36 -40
- package/components/identity.clients/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.clients/migrations/0002-indexes.yaml +4 -0
- package/components/identity.clients/operations/describe.js +1 -1
- package/components/identity.clients/operations/lib/canonical.js +1 -1
- package/components/identity.clients/operations/lib/cimd.js +3 -2
- package/components/identity.clients/operations/lib/redirect.js +7 -4
- package/components/identity.clients/operations/register.js +2 -2
- package/components/identity.clients/source/describe.ts +6 -8
- package/components/identity.clients/source/lib/Context.ts +6 -3
- package/components/identity.clients/source/lib/Entity.ts +1 -1
- package/components/identity.clients/source/lib/canonical.ts +1 -1
- package/components/identity.clients/source/lib/cimd.test.ts +8 -6
- package/components/identity.clients/source/lib/cimd.ts +24 -19
- package/components/identity.clients/source/lib/redirect.test.ts +8 -2
- package/components/identity.clients/source/lib/redirect.ts +12 -8
- package/components/identity.clients/source/register.ts +18 -18
- package/components/identity.clients/tsconfig.tsbuildinfo +1 -1
- package/components/identity.clients/types/toa.d.ts +5 -5
- package/components/identity.credentials/manifest.toa.yaml +4 -4
- package/components/identity.credentials/operations/list.js +8 -4
- package/components/identity.credentials/source/list.test.ts +39 -20
- package/components/identity.credentials/source/list.ts +12 -8
- package/components/identity.credentials/tsconfig.tsbuildinfo +1 -1
- package/components/identity.credentials/types/toa.d.ts +2 -2
- package/components/identity.federation/manifest.toa.yaml +23 -32
- package/components/identity.federation/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.federation/migrations/0002-indexes.yaml +25 -0
- package/components/identity.federation/operations/authenticate.js +4 -2
- package/components/identity.federation/operations/create.js +2 -2
- package/components/identity.federation/operations/decode.js +1 -1
- package/components/identity.federation/operations/delete.js +1 -1
- package/components/identity.federation/operations/incept.js +1 -1
- package/components/identity.federation/operations/lib/decode.js +1 -1
- package/components/identity.federation/operations/lib/discovery.js +2 -2
- package/components/identity.federation/operations/lib/exchange.js +8 -4
- package/components/identity.federation/operations/lib/principal.js +1 -1
- package/components/identity.federation/operations/lib/resolve.js +1 -1
- package/components/identity.federation/operations/list.js +2 -2
- package/components/identity.federation/source/authenticate.ts +19 -17
- package/components/identity.federation/source/create.ts +6 -7
- package/components/identity.federation/source/decode.ts +4 -1
- package/components/identity.federation/source/delete.ts +4 -1
- package/components/identity.federation/source/incept.ts +2 -3
- package/components/identity.federation/source/lib/decode.ts +4 -7
- package/components/identity.federation/source/lib/discovery.test.ts +15 -5
- package/components/identity.federation/source/lib/discovery.ts +10 -9
- package/components/identity.federation/source/lib/exchange.ts +18 -15
- package/components/identity.federation/source/lib/jose.d.ts +1 -1
- package/components/identity.federation/source/lib/principal.ts +5 -3
- package/components/identity.federation/source/lib/resolve.ts +5 -1
- package/components/identity.federation/source/list.test.ts +26 -10
- package/components/identity.federation/source/list.ts +5 -2
- package/components/identity.federation/source/types/context.ts +5 -2
- package/components/identity.federation/source/types/entity.ts +2 -2
- package/components/identity.federation/tsconfig.tsbuildinfo +1 -1
- package/components/identity.federation/types/toa.d.ts +5 -5
- package/components/identity.grants/manifest.toa.yaml +27 -31
- package/components/identity.grants/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.grants/migrations/0002-indexes.yaml +5 -0
- package/components/identity.grants/operations/authorize.js +1 -1
- package/components/identity.grants/operations/exchange.js +5 -2
- package/components/identity.grants/operations/lib/code.js +1 -1
- package/components/identity.grants/operations/lib/identify.js +1 -1
- package/components/identity.grants/operations/list.js +1 -1
- package/components/identity.grants/operations/revoke.js +3 -2
- package/components/identity.grants/source/authorize.ts +27 -19
- package/components/identity.grants/source/exchange.ts +15 -11
- package/components/identity.grants/source/lib/code.ts +20 -8
- package/components/identity.grants/source/lib/identify.ts +1 -1
- package/components/identity.grants/source/list.ts +2 -2
- package/components/identity.grants/source/revoke.ts +9 -7
- package/components/identity.grants/tsconfig.tsbuildinfo +1 -1
- package/components/identity.grants/types/index.d.ts +3 -3
- package/components/identity.grants/types/toa.d.ts +5 -5
- package/components/identity.keys/manifest.toa.yaml +18 -23
- package/components/identity.keys/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.keys/migrations/0002-indexes.yaml +4 -0
- package/components/identity.keys/operations/create.js +1 -1
- package/components/identity.keys/operations/disable.js +1 -1
- package/components/identity.keys/operations/revoke.js +1 -1
- package/components/identity.keys/source/create.ts +2 -3
- package/components/identity.keys/source/disable.ts +1 -1
- package/components/identity.keys/source/revoke.ts +2 -2
- package/components/identity.keys/tsconfig.tsbuildinfo +1 -1
- package/components/identity.keys/types/toa.d.ts +5 -5
- package/components/identity.otp/manifest.toa.yaml +16 -24
- package/components/identity.otp/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.otp/migrations/0002-indexes.yaml +5 -0
- package/components/identity.otp/operations/authenticate.js +1 -1
- package/components/identity.otp/operations/issue.js +1 -1
- package/components/identity.otp/source/authenticate.ts +4 -7
- package/components/identity.otp/source/issue.ts +1 -1
- package/components/identity.otp/source/lib/Context.ts +1 -1
- package/components/identity.otp/tsconfig.tsbuildinfo +1 -1
- package/components/identity.otp/types/toa.d.ts +5 -5
- package/components/identity.passkeys/manifest.toa.yaml +45 -53
- package/components/identity.passkeys/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.passkeys/migrations/0002-indexes.yaml +11 -0
- package/components/identity.passkeys/operations/authenticate.js +1 -1
- package/components/identity.passkeys/operations/challenge.js +6 -3
- package/components/identity.passkeys/operations/create.js +1 -1
- package/components/identity.passkeys/operations/delete.js +1 -1
- package/components/identity.passkeys/operations/list.js +1 -1
- package/components/identity.passkeys/operations/use.js +1 -1
- package/components/identity.passkeys/source/authenticate.ts +3 -4
- package/components/identity.passkeys/source/challenge.ts +29 -25
- package/components/identity.passkeys/source/create.ts +8 -6
- package/components/identity.passkeys/source/delete.ts +4 -1
- package/components/identity.passkeys/source/list.ts +4 -1
- package/components/identity.passkeys/source/types/Context.ts +1 -1
- package/components/identity.passkeys/source/use.ts +12 -10
- package/components/identity.passkeys/tsconfig.tsbuildinfo +1 -1
- package/components/identity.passkeys/types/toa.d.ts +5 -5
- package/components/identity.roles/manifest.toa.yaml +12 -16
- package/components/identity.roles/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.roles/migrations/0002-indexes.yaml +8 -0
- package/components/identity.roles/operations/grant.js +1 -1
- package/components/identity.roles/operations/list.js +1 -1
- package/components/identity.roles/operations/principal.js +2 -2
- package/components/identity.roles/source/grant.ts +7 -6
- package/components/identity.roles/source/list.ts +1 -1
- package/components/identity.roles/source/principal.ts +5 -7
- package/components/identity.roles/tsconfig.tsbuildinfo +1 -1
- package/components/identity.roles/types/toa.d.ts +5 -5
- package/components/identity.tokens/manifest.toa.yaml +17 -15
- package/components/identity.tokens/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.tokens/operations/authenticate.js +2 -2
- package/components/identity.tokens/operations/decrypt.js +11 -5
- package/components/identity.tokens/operations/encrypt.js +2 -2
- package/components/identity.tokens/operations/issue.js +2 -4
- package/components/identity.tokens/operations/lib/form.js +1 -1
- package/components/identity.tokens/operations/lib/key.js +1 -1
- package/components/identity.tokens/operations/revoke.js +1 -1
- package/components/identity.tokens/source/authenticate.test.ts +22 -16
- package/components/identity.tokens/source/authenticate.ts +7 -10
- package/components/identity.tokens/source/decrypt.test.ts +62 -29
- package/components/identity.tokens/source/decrypt.ts +30 -27
- package/components/identity.tokens/source/encrypt.test.ts +21 -16
- package/components/identity.tokens/source/encrypt.ts +8 -11
- package/components/identity.tokens/source/issue.test.ts +4 -2
- package/components/identity.tokens/source/issue.ts +6 -8
- package/components/identity.tokens/source/lib/form.ts +5 -9
- package/components/identity.tokens/source/lib/jose.d.ts +1 -1
- package/components/identity.tokens/source/lib/key.ts +1 -1
- package/components/identity.tokens/source/lib/paseto.test.ts +17 -6
- package/components/identity.tokens/source/revoke.ts +1 -1
- package/components/identity.tokens/tsconfig.tsbuildinfo +1 -1
- package/components/identity.tokens/types/index.d.ts +13 -4
- package/components/identity.tokens/types/toa.d.ts +5 -5
- package/context.toa.yaml +2 -2
- package/cucumber.mjs +3 -0
- package/documentation/access.md +4 -3
- package/documentation/cache.md +17 -3
- package/documentation/components.md +2 -2
- package/documentation/credentials.md +2 -2
- package/documentation/identity.md +7 -9
- package/documentation/map.md +2 -2
- package/documentation/mcp.md +16 -16
- package/documentation/notes/peers.md +1 -1
- package/documentation/notes/throttling.md +1 -1
- package/documentation/octets.md +4 -4
- package/documentation/protocol.md +3 -3
- package/documentation/query.md +14 -8
- package/documentation/rpc.md +31 -21
- package/documentation/tracing.md +3 -3
- package/documentation/tree.md +1 -1
- package/features/auth.assert.feature +2 -2
- package/features/auth.bearer.feature +1 -1
- package/features/auth.claims.feature +5 -5
- package/features/auth.incept.feature +2 -2
- package/features/authorities.federation.feature +1 -1
- package/features/configuration.feature +3 -4
- package/features/credentials.feature +9 -9
- package/features/dev.feature +1 -0
- package/features/dynamic.feature +1 -0
- package/features/errors.feature +21 -0
- package/features/etag.feature +0 -86
- package/features/identity.bans.feature +3 -3
- package/features/identity.basic.feature +9 -9
- package/features/identity.federation.feature +11 -11
- package/features/identity.tokens.custom.feature +5 -5
- package/features/identity.tokens.feature +2 -2
- package/features/interruptions.feature +1 -0
- package/features/introspection.map.feature +4 -4
- package/features/io.throttle.feature +1 -0
- package/features/map.feature +2 -2
- package/features/octets.cloudinary.feature +1 -1
- package/features/octets.download.feature +1 -0
- package/features/require.feature +1 -2
- package/features/steps/Captures.ts +1 -1
- package/features/steps/Cloudinary.ts +1 -2
- package/features/steps/Common.ts +4 -5
- package/features/steps/Components.ts +17 -12
- package/features/steps/Database.ts +42 -23
- package/features/steps/Gateway.ts +55 -72
- package/features/steps/HTTP.ts +12 -15
- package/features/steps/IDP.ts +118 -94
- package/features/steps/Identity.ts +3 -3
- package/features/steps/OTP.ts +3 -3
- package/features/steps/Parameters.ts +20 -10
- package/features/steps/Probe.ts +9 -7
- package/features/steps/Realtime.ts +40 -22
- package/features/steps/Workspace.ts +10 -7
- package/features/steps/components/audit/operations/record.js +1 -1
- package/features/steps/components/echo/operations/affect.js +1 -1
- package/features/steps/components/echo/operations/compute.js +1 -1
- package/features/steps/components/echo/operations/echo.js +1 -1
- package/features/steps/components/echo/operations/error.js +1 -1
- package/features/steps/components/echo/operations/identity.js +1 -1
- package/features/steps/components/echo/operations/parameters.js +1 -1
- package/features/steps/components/echo/operations/ping.js +1 -1
- package/features/steps/components/echo/operations/unwrap.js +1 -1
- package/features/steps/components/greeter/operations/greet.js +1 -1
- package/features/steps/components/notify/operations/send.js +1 -1
- package/features/steps/components/octets.tester/operations/authority.js +1 -1
- package/features/steps/components/octets.tester/operations/bar.js +1 -1
- package/features/steps/components/octets.tester/operations/baz.js +1 -1
- package/features/steps/components/octets.tester/operations/concat.js +1 -1
- package/features/steps/components/octets.tester/operations/echo.js +1 -1
- package/features/steps/components/octets.tester/operations/err.js +1 -1
- package/features/steps/components/octets.tester/operations/foo.js +1 -1
- package/features/steps/components/octets.tester/operations/id.js +1 -1
- package/features/steps/components/octets.tester/operations/identity.js +1 -1
- package/features/steps/components/octets.tester/operations/redirect.js +6 -4
- package/features/steps/components/octets.tester/operations/yex.js +1 -1
- package/features/steps/components/octets.tester/operations/yield.js +1 -1
- package/features/steps/components/orders/manifest.toa.yaml +10 -12
- package/features/steps/components/orders/operations/create.js +4 -2
- package/features/steps/components/pots/manifest.toa.yaml +15 -20
- package/features/steps/components/pots/migrations/0002-indexes.yaml +4 -0
- package/features/steps/components/pricing/operations/quote.js +1 -1
- package/features/steps/components/sequences/manifest.toa.yaml +0 -1
- package/features/steps/components/sequences/operations/numbers.js +1 -1
- package/features/steps/components/sequences/operations/tokens.js +3 -3
- package/features/steps/components/users/manifest.toa.yaml +3 -5
- package/features/steps/components/users/operations/create.js +1 -1
- package/features/steps/components/users.properties/manifest.toa.yaml +5 -6
- package/features/steps/map.ts +2 -2
- package/features/timestamps.feature +1 -1
- package/package.json +7 -7
- package/readme.md +11 -11
- package/schemas/annotation.cos.yaml +1 -3
- package/schemas/method.cos.yaml +2 -0
- package/source/Branch.test.ts +2 -2
- package/source/Branch.ts +3 -5
- package/source/Composition.ts +5 -5
- package/source/Directive.test.ts +38 -20
- package/source/Directive.ts +61 -47
- package/source/Endpoint.test.ts +1 -1
- package/source/Endpoint.ts +27 -92
- package/source/Factory.ts +26 -12
- package/source/Gateway.ts +87 -76
- package/source/HTTP/Context.ts +23 -30
- package/source/HTTP/Probe.ts +7 -9
- package/source/HTTP/Server.ts +88 -69
- package/source/HTTP/Timing.ts +6 -21
- package/source/HTTP/address.test.ts +8 -2
- package/source/HTTP/address.ts +2 -3
- package/source/HTTP/exceptions.ts +20 -18
- package/source/HTTP/formats/form.ts +1 -1
- package/source/HTTP/formats/json.ts +2 -2
- package/source/HTTP/formats/msgpack.ts +3 -4
- package/source/HTTP/formats/text.ts +2 -2
- package/source/HTTP/formats/yaml.test.ts +4 -1
- package/source/HTTP/formats/yaml.ts +14 -11
- package/source/HTTP/messages.test.ts +38 -28
- package/source/HTTP/messages.ts +44 -98
- package/source/Interception.ts +3 -4
- package/source/Introspection.ts +26 -14
- package/source/MCP/Server.ts +114 -54
- package/source/MCP/discover.ts +6 -7
- package/source/MCP/errors.ts +7 -8
- package/source/MCP/schema.test.ts +9 -3
- package/source/MCP/schema.ts +12 -16
- package/source/MCP/tools.ts +33 -28
- package/source/Mapping.ts +25 -27
- package/source/Query.ts +58 -44
- package/source/RPC/Context.ts +8 -11
- package/source/RPC/Dispatcher.ts +46 -26
- package/source/RPC/errors.test.ts +41 -16
- package/source/RPC/errors.ts +9 -10
- package/source/RPC/names.test.ts +35 -16
- package/source/RPC/names.ts +22 -29
- package/source/RTD/Directives.ts +21 -10
- package/source/RTD/Endpoint.ts +4 -1
- package/source/RTD/Method.ts +8 -6
- package/source/RTD/Node.ts +32 -34
- package/source/RTD/Route.ts +18 -21
- package/source/RTD/Tree.ts +18 -18
- package/source/RTD/factory.ts +13 -16
- package/source/RTD/segment.ts +12 -10
- package/source/RTD/syntax/parse.test.ts +12 -6
- package/source/RTD/syntax/parse.ts +30 -26
- package/source/RTD/syntax/types.ts +17 -1
- package/source/RTD/walk.test.ts +59 -22
- package/source/Remotes.test.ts +25 -4
- package/source/Remotes.ts +9 -4
- package/source/Tenant.ts +12 -12
- package/source/deployment.ts +20 -20
- package/source/directives/auth/Anonymous.test.ts +8 -2
- package/source/directives/auth/Anonymous.ts +5 -8
- package/source/directives/auth/Anyone.ts +3 -3
- package/source/directives/auth/Assert.ts +10 -10
- package/source/directives/auth/Authorization.ts +83 -69
- package/source/directives/auth/Delegate.test.ts +2 -2
- package/source/directives/auth/Delegate.ts +8 -10
- package/source/directives/auth/Echo.ts +5 -8
- package/source/directives/auth/Federation.ts +30 -21
- package/source/directives/auth/Id.ts +7 -4
- package/source/directives/auth/Incept.ts +32 -26
- package/source/directives/auth/Input.ts +36 -20
- package/source/directives/auth/Role.test.ts +49 -23
- package/source/directives/auth/Role.ts +29 -22
- package/source/directives/auth/Rule.ts +13 -8
- package/source/directives/auth/Scheme.ts +7 -7
- package/source/directives/auth/create.ts +1 -1
- package/source/directives/auth/schemes.ts +1 -1
- package/source/directives/auth/split.ts +2 -3
- package/source/directives/auth/types.ts +5 -2
- package/source/directives/cache/Cache.ts +44 -9
- package/source/directives/cache/Control.ts +25 -26
- package/source/directives/cache/Exact.ts +1 -1
- package/source/directives/cache/etag.ts +38 -0
- package/source/directives/cors/CORS.ts +9 -7
- package/source/directives/dev/Development.ts +3 -4
- package/source/directives/dev/Faulty.ts +11 -6
- package/source/directives/dev/Sleep.ts +5 -7
- package/source/directives/dev/Stub.ts +2 -2
- package/source/directives/dev/Throw.ts +2 -2
- package/source/directives/flow/Compose.ts +26 -20
- package/source/directives/flow/Fetch.ts +15 -15
- package/source/directives/flow/Flow.ts +9 -8
- package/source/directives/index.ts +11 -2
- package/source/directives/io/IO.ts +29 -20
- package/source/directives/io/Input.ts +9 -12
- package/source/directives/io/Output.ts +20 -23
- package/source/directives/io/Status.test.ts +12 -8
- package/source/directives/io/Status.ts +9 -8
- package/source/directives/io/Throttle.ts +6 -7
- package/source/directives/io/lib/throttle/Configuration.test.ts +32 -23
- package/source/directives/io/lib/throttle/Configuration.ts +14 -9
- package/source/directives/io/lib/throttle/Keys.ts +15 -10
- package/source/directives/io/lib/throttle/Quotas.test.ts +33 -17
- package/source/directives/io/lib/throttle/Quotas.ts +20 -26
- package/source/directives/io/lib/throttle/Sync.test.ts +14 -10
- package/source/directives/io/lib/throttle/Sync.ts +9 -12
- package/source/directives/io/lib/throttle/Warning.ts +3 -4
- package/source/directives/io/lib/throttle/components/IP.ts +4 -5
- package/source/directives/io/lib/throttle/components/Identity.ts +1 -1
- package/source/directives/io/lib/throttle/components/Path.ts +1 -1
- package/source/directives/io/lib/throttle/components/Route.ts +2 -2
- package/source/directives/io/lib/throttle/components/Segment.ts +2 -2
- package/source/directives/io/lib/throttle/conditions/Status.ts +2 -2
- package/source/directives/io/schemas.test.ts +12 -6
- package/source/directives/map/Authority.ts +2 -2
- package/source/directives/map/Buffer.ts +2 -2
- package/source/directives/map/Claims.ts +25 -20
- package/source/directives/map/Headers.ts +17 -13
- package/source/directives/map/Language.ts +8 -5
- package/source/directives/map/Languages.ts +9 -3
- package/source/directives/map/Map.ts +25 -12
- package/source/directives/map/Mapping.ts +9 -6
- package/source/directives/map/Properties.ts +1 -1
- package/source/directives/map/Segments.ts +22 -15
- package/source/directives/mcp/MCP.ts +9 -7
- package/source/directives/mcp/Tool.test.ts +21 -9
- package/source/directives/mcp/Tool.ts +23 -11
- package/source/directives/oauth/Discovery.ts +7 -11
- package/source/directives/oauth/documents.ts +11 -14
- package/source/directives/octets/Context.ts +6 -3
- package/source/directives/octets/Delete.ts +33 -25
- package/source/directives/octets/Directive.ts +5 -1
- package/source/directives/octets/Get.ts +13 -21
- package/source/directives/octets/Octets.ts +20 -15
- package/source/directives/octets/Put.ts +62 -27
- package/source/directives/octets/Workflow.ts +18 -12
- package/source/directives/octets/bytes.ts +1 -1
- package/source/directives/octets/schemas.test.ts +8 -14
- package/source/directives/octets/workflows/Execution.ts +19 -21
- package/source/directives/octets/workflows/Workflow.ts +10 -7
- package/source/directives/require/Headers.ts +3 -4
- package/source/directives/require/Require.ts +3 -4
- package/source/exceptions.ts +19 -12
- package/source/index.ts +1 -1
- package/source/manifest.test.ts +4 -1
- package/source/manifest.ts +19 -13
- package/source/octets.d.ts +1 -1
- package/source/root.ts +3 -2
- package/source/schemas.test.ts +17 -3
- package/transpiled/Branch.js.map +1 -1
- package/transpiled/Composition.js.map +1 -1
- package/transpiled/Directive.js +6 -2
- package/transpiled/Directive.js.map +1 -1
- package/transpiled/Endpoint.d.ts +0 -2
- package/transpiled/Endpoint.js +11 -52
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Factory.d.ts +2 -1
- package/transpiled/Factory.js +1 -0
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.d.ts +2 -1
- package/transpiled/Gateway.js +24 -15
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/HTTP/Context.d.ts +0 -3
- package/transpiled/HTTP/Context.js +7 -9
- package/transpiled/HTTP/Context.js.map +1 -1
- package/transpiled/HTTP/Probe.js.map +1 -1
- package/transpiled/HTTP/Server.js +19 -4
- package/transpiled/HTTP/Server.js.map +1 -1
- package/transpiled/HTTP/Timing.d.ts +1 -2
- package/transpiled/HTTP/Timing.js +2 -10
- package/transpiled/HTTP/Timing.js.map +1 -1
- package/transpiled/HTTP/address.js.map +1 -1
- package/transpiled/HTTP/exceptions.js.map +1 -1
- package/transpiled/HTTP/formats/form.js.map +1 -1
- package/transpiled/HTTP/formats/json.js.map +1 -1
- package/transpiled/HTTP/formats/msgpack.js.map +1 -1
- package/transpiled/HTTP/formats/text.js.map +1 -1
- package/transpiled/HTTP/formats/yaml.js +4 -1
- package/transpiled/HTTP/formats/yaml.js.map +1 -1
- package/transpiled/HTTP/messages.d.ts +3 -2
- package/transpiled/HTTP/messages.js +1 -43
- package/transpiled/HTTP/messages.js.map +1 -1
- package/transpiled/Interception.js.map +1 -1
- package/transpiled/Introspection.js +13 -2
- package/transpiled/Introspection.js.map +1 -1
- package/transpiled/MCP/Server.js +15 -4
- package/transpiled/MCP/Server.js.map +1 -1
- package/transpiled/MCP/discover.js.map +1 -1
- package/transpiled/MCP/errors.js.map +1 -1
- package/transpiled/MCP/schema.js +1 -1
- package/transpiled/MCP/schema.js.map +1 -1
- package/transpiled/MCP/tools.js +10 -7
- package/transpiled/MCP/tools.js.map +1 -1
- package/transpiled/Mapping.d.ts +2 -2
- package/transpiled/Mapping.js +3 -5
- package/transpiled/Mapping.js.map +1 -1
- package/transpiled/Query.d.ts +6 -2
- package/transpiled/Query.js +23 -8
- package/transpiled/Query.js.map +1 -1
- package/transpiled/RPC/Context.js +0 -7
- package/transpiled/RPC/Context.js.map +1 -1
- package/transpiled/RPC/Dispatcher.js +4 -1
- package/transpiled/RPC/Dispatcher.js.map +1 -1
- package/transpiled/RPC/errors.js.map +1 -1
- package/transpiled/RPC/names.js.map +1 -1
- package/transpiled/RTD/Directives.d.ts +1 -1
- package/transpiled/RTD/Method.js +1 -3
- package/transpiled/RTD/Method.js.map +1 -1
- package/transpiled/RTD/Node.js +5 -4
- package/transpiled/RTD/Node.js.map +1 -1
- package/transpiled/RTD/Route.js +4 -1
- package/transpiled/RTD/Route.js.map +1 -1
- package/transpiled/RTD/Tree.js +1 -1
- package/transpiled/RTD/Tree.js.map +1 -1
- package/transpiled/RTD/factory.js.map +1 -1
- package/transpiled/RTD/segment.js.map +1 -1
- package/transpiled/RTD/syntax/parse.js.map +1 -1
- package/transpiled/RTD/syntax/types.d.ts +6 -0
- package/transpiled/RTD/syntax/types.js +10 -1
- package/transpiled/RTD/syntax/types.js.map +1 -1
- package/transpiled/Remotes.js.map +1 -1
- package/transpiled/Tenant.d.ts +1 -1
- package/transpiled/Tenant.js.map +1 -1
- package/transpiled/deployment.d.ts +3 -0
- package/transpiled/deployment.js +6 -1
- package/transpiled/deployment.js.map +1 -1
- package/transpiled/directives/auth/Anonymous.js +1 -3
- package/transpiled/directives/auth/Anonymous.js.map +1 -1
- package/transpiled/directives/auth/Anyone.js.map +1 -1
- package/transpiled/directives/auth/Assert.js.map +1 -1
- package/transpiled/directives/auth/Authorization.js +7 -3
- package/transpiled/directives/auth/Authorization.js.map +1 -1
- package/transpiled/directives/auth/Delegate.js.map +1 -1
- package/transpiled/directives/auth/Echo.js +1 -3
- package/transpiled/directives/auth/Echo.js.map +1 -1
- package/transpiled/directives/auth/Federation.js +3 -7
- package/transpiled/directives/auth/Federation.js.map +1 -1
- package/transpiled/directives/auth/Id.js.map +1 -1
- package/transpiled/directives/auth/Incept.js +1 -1
- package/transpiled/directives/auth/Incept.js.map +1 -1
- package/transpiled/directives/auth/Input.js.map +1 -1
- package/transpiled/directives/auth/Role.js.map +1 -1
- package/transpiled/directives/auth/Rule.js.map +1 -1
- package/transpiled/directives/auth/Scheme.js +1 -2
- package/transpiled/directives/auth/Scheme.js.map +1 -1
- package/transpiled/directives/auth/create.js.map +1 -1
- package/transpiled/directives/auth/schemes.js.map +1 -1
- package/transpiled/directives/auth/split.js.map +1 -1
- package/transpiled/directives/auth/types.d.ts +3 -1
- package/transpiled/directives/cache/Cache.js +28 -2
- package/transpiled/directives/cache/Cache.js.map +1 -1
- package/transpiled/directives/cache/Control.js +1 -1
- package/transpiled/directives/cache/Control.js.map +1 -1
- package/transpiled/directives/cache/etag.d.ts +10 -0
- package/transpiled/directives/cache/etag.js +30 -0
- package/transpiled/directives/cache/etag.js.map +1 -0
- package/transpiled/directives/cors/CORS.js.map +1 -1
- package/transpiled/directives/dev/Development.js.map +1 -1
- package/transpiled/directives/dev/Faulty.js.map +1 -1
- package/transpiled/directives/dev/Sleep.js.map +1 -1
- package/transpiled/directives/dev/Stub.js.map +1 -1
- package/transpiled/directives/dev/Throw.js.map +1 -1
- package/transpiled/directives/flow/Compose.js +7 -3
- package/transpiled/directives/flow/Compose.js.map +1 -1
- package/transpiled/directives/flow/Fetch.js.map +1 -1
- package/transpiled/directives/flow/Flow.js.map +1 -1
- package/transpiled/directives/index.js +11 -1
- package/transpiled/directives/index.js.map +1 -1
- package/transpiled/directives/io/IO.d.ts +1 -1
- package/transpiled/directives/io/IO.js.map +1 -1
- package/transpiled/directives/io/Input.js +1 -1
- package/transpiled/directives/io/Input.js.map +1 -1
- package/transpiled/directives/io/Output.js +3 -3
- package/transpiled/directives/io/Output.js.map +1 -1
- package/transpiled/directives/io/Status.js.map +1 -1
- package/transpiled/directives/io/Throttle.js +1 -1
- package/transpiled/directives/io/Throttle.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/Configuration.js +8 -2
- package/transpiled/directives/io/lib/throttle/Configuration.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/Keys.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/Quotas.js +4 -3
- package/transpiled/directives/io/lib/throttle/Quotas.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/Sync.d.ts +1 -1
- package/transpiled/directives/io/lib/throttle/Sync.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/Warning.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/components/IP.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/components/Identity.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/components/Path.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/components/Route.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/components/Segment.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/conditions/Status.js.map +1 -1
- package/transpiled/directives/map/Authority.js.map +1 -1
- package/transpiled/directives/map/Buffer.js.map +1 -1
- package/transpiled/directives/map/Claims.js.map +1 -1
- package/transpiled/directives/map/Headers.js.map +1 -1
- package/transpiled/directives/map/Language.js.map +1 -1
- package/transpiled/directives/map/Languages.js.map +1 -1
- package/transpiled/directives/map/Map.js.map +1 -1
- package/transpiled/directives/map/Mapping.js.map +1 -1
- package/transpiled/directives/map/Properties.js.map +1 -1
- package/transpiled/directives/map/Segments.js.map +1 -1
- package/transpiled/directives/mcp/MCP.js +1 -1
- package/transpiled/directives/mcp/MCP.js.map +1 -1
- package/transpiled/directives/mcp/Tool.js +3 -1
- package/transpiled/directives/mcp/Tool.js.map +1 -1
- package/transpiled/directives/oauth/Discovery.js.map +1 -1
- package/transpiled/directives/oauth/documents.js.map +1 -1
- package/transpiled/directives/octets/Context.js +1 -1
- package/transpiled/directives/octets/Context.js.map +1 -1
- package/transpiled/directives/octets/Delete.js.map +1 -1
- package/transpiled/directives/octets/Directive.js.map +1 -1
- package/transpiled/directives/octets/Get.js.map +1 -1
- package/transpiled/directives/octets/Octets.js +1 -1
- package/transpiled/directives/octets/Octets.js.map +1 -1
- package/transpiled/directives/octets/Put.js.map +1 -1
- package/transpiled/directives/octets/Workflow.js.map +1 -1
- package/transpiled/directives/octets/bytes.js.map +1 -1
- package/transpiled/directives/octets/workflows/Execution.js +1 -2
- package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
- package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
- package/transpiled/directives/require/Headers.js.map +1 -1
- package/transpiled/directives/require/Require.js.map +1 -1
- package/transpiled/exceptions.js.map +1 -1
- package/transpiled/index.d.ts +1 -1
- package/transpiled/index.js +1 -1
- package/transpiled/index.js.map +1 -1
- package/transpiled/manifest.js +5 -1
- package/transpiled/manifest.js.map +1 -1
- package/transpiled/root.js.map +1 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/source/redact.test.ts +0 -27
- package/source/redact.ts +0 -21
- package/transpiled/redact.d.ts +0 -5
- package/transpiled/redact.js +0 -17
- package/transpiled/redact.js.map +0 -1
package/source/Introspection.ts
CHANGED
|
@@ -33,28 +33,40 @@ export type Schema = Awaited<ReturnType<Remote['explain']>>['input']
|
|
|
33
33
|
* The same, in the order the shape states — whatever order the families that filled it ran
|
|
34
34
|
* in. What a resource says about itself is read, so it is written the way it is documented.
|
|
35
35
|
*/
|
|
36
|
-
export function order
|
|
36
|
+
export function order(introspection: Introspection): Introspection {
|
|
37
37
|
const ordered: Introspection = {}
|
|
38
38
|
|
|
39
39
|
for (const key of KEYS)
|
|
40
|
-
if (introspection[key] !== undefined)
|
|
41
|
-
(ordered[key] as unknown) = introspection[key]
|
|
40
|
+
if (introspection[key] !== undefined) (ordered[key] as unknown) = introspection[key]
|
|
42
41
|
|
|
43
42
|
return ordered
|
|
44
43
|
}
|
|
45
44
|
|
|
46
|
-
const KEYS = [
|
|
45
|
+
const KEYS = [
|
|
46
|
+
'title',
|
|
47
|
+
'description',
|
|
48
|
+
'route',
|
|
49
|
+
'query',
|
|
50
|
+
'headers',
|
|
51
|
+
'input',
|
|
52
|
+
'output',
|
|
53
|
+
'errors'
|
|
54
|
+
] as const
|
|
47
55
|
|
|
48
56
|
/**
|
|
49
57
|
* The schema of one input property, taken out of it: a property another family fills is
|
|
50
58
|
* not the caller's to send, and what took it says where it comes from instead.
|
|
51
59
|
*/
|
|
52
|
-
export function take
|
|
60
|
+
export function take(carrier: Carrier, property: string): Schema | undefined {
|
|
53
61
|
const input = carrier.input as Shape | null | undefined
|
|
54
62
|
const properties = input?.properties
|
|
55
63
|
|
|
56
|
-
if (
|
|
57
|
-
|
|
64
|
+
if (
|
|
65
|
+
input === undefined ||
|
|
66
|
+
input === null ||
|
|
67
|
+
properties === undefined ||
|
|
68
|
+
!(property in properties)
|
|
69
|
+
)
|
|
58
70
|
return undefined
|
|
59
71
|
|
|
60
72
|
const schema = properties[property]
|
|
@@ -72,23 +84,23 @@ export function take (carrier: Carrier, property: string): Schema | undefined {
|
|
|
72
84
|
* describes an array. What is not an object of properties is left alone: a whitelist has
|
|
73
85
|
* nothing to say about a string.
|
|
74
86
|
*/
|
|
75
|
-
export function restrict
|
|
87
|
+
export function restrict(
|
|
88
|
+
schema: Schema | undefined,
|
|
89
|
+
allowed: Set<string>
|
|
90
|
+
): Schema | undefined {
|
|
76
91
|
const shape = schema as Shape | null | undefined
|
|
77
92
|
|
|
78
|
-
if (shape === undefined || shape === null)
|
|
79
|
-
return schema
|
|
93
|
+
if (shape === undefined || shape === null) return schema
|
|
80
94
|
|
|
81
95
|
if (shape.items !== undefined)
|
|
82
96
|
return { ...shape, items: restrict(shape.items, allowed) } as unknown as Schema
|
|
83
97
|
|
|
84
|
-
if (shape.properties === undefined)
|
|
85
|
-
return schema
|
|
98
|
+
if (shape.properties === undefined) return schema
|
|
86
99
|
|
|
87
100
|
const properties: Record<string, Schema> = {}
|
|
88
101
|
|
|
89
102
|
for (const [name, property] of Object.entries(shape.properties))
|
|
90
|
-
if (allowed.has(name))
|
|
91
|
-
properties[name] = property
|
|
103
|
+
if (allowed.has(name)) properties[name] = property
|
|
92
104
|
|
|
93
105
|
const restricted: Shape = { ...shape, properties }
|
|
94
106
|
|
package/source/MCP/Server.ts
CHANGED
|
@@ -42,15 +42,17 @@ export class Server {
|
|
|
42
42
|
private readonly discovery: Discovery
|
|
43
43
|
private readonly origins: Set<string>
|
|
44
44
|
|
|
45
|
-
public constructor
|
|
45
|
+
public constructor(options: MCP, tree: Tree) {
|
|
46
46
|
this.options = options
|
|
47
47
|
this.tree = tree
|
|
48
48
|
this.discovery = discovery(options)
|
|
49
49
|
this.origins = new Set(options.origins ?? [])
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
public async process
|
|
53
|
-
|
|
52
|
+
public async process(
|
|
53
|
+
context: http.Context,
|
|
54
|
+
route: http.Processor
|
|
55
|
+
): Promise<http.OutgoingMessage> {
|
|
54
56
|
if (context.request.method !== 'POST')
|
|
55
57
|
throw new http.MethodNotAllowed(new Headers({ allow: 'POST' }))
|
|
56
58
|
|
|
@@ -60,14 +62,12 @@ export class Server {
|
|
|
60
62
|
const version = this.version(context, message)
|
|
61
63
|
const modern = version === MODERN
|
|
62
64
|
|
|
63
|
-
if (modern)
|
|
64
|
-
this.mirrored(context, message)
|
|
65
|
+
if (modern) this.mirrored(context, message)
|
|
65
66
|
|
|
66
67
|
const result = await this.answer({ context, route, tree: this.tree }, message, modern)
|
|
67
68
|
|
|
68
69
|
// a notification is answered by not answering, and there is nothing here to remember
|
|
69
|
-
if (message.id === undefined)
|
|
70
|
-
return { status: ACCEPTED }
|
|
70
|
+
if (message.id === undefined) return { status: ACCEPTED }
|
|
71
71
|
|
|
72
72
|
return {
|
|
73
73
|
status: OK,
|
|
@@ -77,21 +77,24 @@ export class Server {
|
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
/** Who may reach the endpoint at all, before anything it carries is read. */
|
|
80
|
-
private admit
|
|
80
|
+
private admit(context: http.Context): void {
|
|
81
81
|
const origin = context.request.headers.origin
|
|
82
82
|
|
|
83
83
|
// the revision requires this against DNS rebinding; a request without one is no browser's
|
|
84
84
|
if (origin !== undefined && !this.origins.has(origin))
|
|
85
85
|
throw new http.Forbidden('Origin is not allowed')
|
|
86
86
|
|
|
87
|
-
if (this.options.anonymous === true)
|
|
88
|
-
return
|
|
87
|
+
if (this.options.anonymous === true) return
|
|
89
88
|
|
|
90
89
|
if ((context as { identity?: unknown }).identity == null)
|
|
91
90
|
throw new http.Unauthorized()
|
|
92
91
|
}
|
|
93
92
|
|
|
94
|
-
private async answer
|
|
93
|
+
private async answer(
|
|
94
|
+
scope: Scope,
|
|
95
|
+
message: Message,
|
|
96
|
+
modern: boolean
|
|
97
|
+
): Promise<unknown> {
|
|
95
98
|
const params = message.params ?? {}
|
|
96
99
|
|
|
97
100
|
switch (message.method) {
|
|
@@ -99,7 +102,11 @@ export class Server {
|
|
|
99
102
|
return this.complete(this.discovery.modern, modern, DISCOVERY_CACHE)
|
|
100
103
|
|
|
101
104
|
case 'tools/list':
|
|
102
|
-
return this.complete(
|
|
105
|
+
return this.complete(
|
|
106
|
+
{ tools: await list(this.tree, scope.context) },
|
|
107
|
+
modern,
|
|
108
|
+
TOOLS_CACHE
|
|
109
|
+
)
|
|
103
110
|
|
|
104
111
|
case 'tools/call':
|
|
105
112
|
return this.complete(await this.tool(scope, params), modern)
|
|
@@ -115,66 +122,98 @@ export class Server {
|
|
|
115
122
|
return {}
|
|
116
123
|
|
|
117
124
|
default:
|
|
118
|
-
throw new http.NotFound(
|
|
119
|
-
|
|
125
|
+
throw new http.NotFound(
|
|
126
|
+
response(
|
|
127
|
+
message.id ?? null,
|
|
128
|
+
failure(
|
|
129
|
+
METHOD_NOT_FOUND,
|
|
130
|
+
`'${message.method}' is not a method this server answers`
|
|
131
|
+
)
|
|
132
|
+
)
|
|
133
|
+
)
|
|
120
134
|
}
|
|
121
135
|
}
|
|
122
136
|
|
|
123
|
-
private async tool
|
|
137
|
+
private async tool(scope: Scope, params: Params): Promise<object> {
|
|
124
138
|
const named = params.name
|
|
125
139
|
|
|
126
140
|
if (typeof named !== 'string')
|
|
127
|
-
throw new http.BadRequest(
|
|
128
|
-
|
|
141
|
+
throw new http.BadRequest(
|
|
142
|
+
response(
|
|
143
|
+
null,
|
|
144
|
+
failure(INVALID_PARAMS, '`tools/call` states the tool it calls by name')
|
|
145
|
+
)
|
|
146
|
+
)
|
|
129
147
|
|
|
130
148
|
const args = params.arguments ?? {}
|
|
131
149
|
|
|
132
150
|
if (typeof args !== 'object' || args === null || Array.isArray(args))
|
|
133
|
-
throw new http.BadRequest(
|
|
134
|
-
failure(INVALID_PARAMS, '`arguments` must be an object'))
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
151
|
+
throw new http.BadRequest(
|
|
152
|
+
response(null, failure(INVALID_PARAMS, '`arguments` must be an object'))
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
return await console.span(
|
|
156
|
+
{ name: named },
|
|
157
|
+
async () => await call(scope, named, args as Params)
|
|
158
|
+
)
|
|
138
159
|
}
|
|
139
160
|
|
|
140
161
|
/**
|
|
141
162
|
* Every result of the modern revision says what kind it is, and who answered it. Where the
|
|
142
163
|
* revision names the operation as one whose result may be held, it says that too, and must.
|
|
143
164
|
*/
|
|
144
|
-
private complete
|
|
165
|
+
private complete(result: object, modern: boolean, cache?: Cache): object {
|
|
145
166
|
return modern
|
|
146
|
-
? {
|
|
167
|
+
? {
|
|
168
|
+
...result,
|
|
169
|
+
...cache,
|
|
170
|
+
resultType: 'complete',
|
|
171
|
+
_meta: { [SERVER_INFO]: this.serverInfo() }
|
|
172
|
+
}
|
|
147
173
|
: result
|
|
148
174
|
}
|
|
149
175
|
|
|
150
|
-
private serverInfo
|
|
151
|
-
return (this.discovery.modern as { _meta: Record<string, unknown> })._meta[
|
|
176
|
+
private serverInfo(): unknown {
|
|
177
|
+
return (this.discovery.modern as { _meta: Record<string, unknown> })._meta[
|
|
178
|
+
SERVER_INFO
|
|
179
|
+
]
|
|
152
180
|
}
|
|
153
181
|
|
|
154
182
|
/**
|
|
155
183
|
* Which revision this request is of. `initialize` is one by itself; otherwise the header
|
|
156
184
|
* says, and a request that names none is of a revision that did not send one.
|
|
157
185
|
*/
|
|
158
|
-
private version
|
|
159
|
-
if (message.method === 'initialize')
|
|
160
|
-
return LEGACY
|
|
186
|
+
private version(context: http.Context, message: Message): string {
|
|
187
|
+
if (message.method === 'initialize') return LEGACY
|
|
161
188
|
|
|
162
189
|
const header = context.request.headers['mcp-protocol-version']
|
|
163
190
|
const stated = declared(message.params ?? {})
|
|
164
191
|
|
|
165
192
|
if (header !== undefined && stated !== undefined && header !== stated)
|
|
166
|
-
throw new http.BadRequest(
|
|
167
|
-
|
|
193
|
+
throw new http.BadRequest(
|
|
194
|
+
response(
|
|
195
|
+
message.id ?? null,
|
|
196
|
+
failure(
|
|
197
|
+
HEADER_MISMATCH,
|
|
198
|
+
`'MCP-Protocol-Version' says '${String(header)}' and the body says '${stated}'`
|
|
199
|
+
)
|
|
200
|
+
)
|
|
201
|
+
)
|
|
168
202
|
|
|
169
203
|
const value = (header as string | undefined) ?? stated
|
|
170
204
|
|
|
171
|
-
if (value === undefined)
|
|
172
|
-
return LEGACY
|
|
205
|
+
if (value === undefined) return LEGACY
|
|
173
206
|
|
|
174
207
|
if (!VERSIONS.includes(value))
|
|
175
|
-
throw new http.BadRequest(
|
|
176
|
-
|
|
177
|
-
|
|
208
|
+
throw new http.BadRequest(
|
|
209
|
+
response(
|
|
210
|
+
message.id ?? null,
|
|
211
|
+
failure(UNSUPPORTED_VERSION, 'Unsupported protocol version', {
|
|
212
|
+
supported: VERSIONS,
|
|
213
|
+
requested: value
|
|
214
|
+
})
|
|
215
|
+
)
|
|
216
|
+
)
|
|
178
217
|
|
|
179
218
|
return value
|
|
180
219
|
}
|
|
@@ -183,12 +222,19 @@ export class Server {
|
|
|
183
222
|
* What the modern revision mirrors into headers, so that what routes a request and what
|
|
184
223
|
* answers it cannot be told two different things.
|
|
185
224
|
*/
|
|
186
|
-
private mirrored
|
|
225
|
+
private mirrored(context: http.Context, message: Message): void {
|
|
187
226
|
const meta = metadata(message.params ?? {})
|
|
188
227
|
|
|
189
228
|
if (meta?.[PROTOCOL_VERSION] === undefined || meta[CLIENT_CAPABILITIES] === undefined)
|
|
190
|
-
throw new http.BadRequest(
|
|
191
|
-
|
|
229
|
+
throw new http.BadRequest(
|
|
230
|
+
response(
|
|
231
|
+
message.id ?? null,
|
|
232
|
+
failure(
|
|
233
|
+
INVALID_PARAMS,
|
|
234
|
+
`'_meta' states '${PROTOCOL_VERSION}' and '${CLIENT_CAPABILITIES}'`
|
|
235
|
+
)
|
|
236
|
+
)
|
|
237
|
+
)
|
|
192
238
|
|
|
193
239
|
const id = message.id ?? null
|
|
194
240
|
|
|
@@ -199,7 +245,7 @@ export class Server {
|
|
|
199
245
|
}
|
|
200
246
|
|
|
201
247
|
/** A body the decoder refuses is a parse error; a media type it does not know is not. */
|
|
202
|
-
private async read
|
|
248
|
+
private async read(context: http.Context): Promise<Message> {
|
|
203
249
|
let body: unknown
|
|
204
250
|
|
|
205
251
|
try {
|
|
@@ -211,26 +257,41 @@ export class Server {
|
|
|
211
257
|
throw exception
|
|
212
258
|
}
|
|
213
259
|
|
|
214
|
-
if (
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
260
|
+
if (
|
|
261
|
+
typeof body !== 'object' ||
|
|
262
|
+
body === null ||
|
|
263
|
+
Array.isArray(body) ||
|
|
264
|
+
(body as Message).jsonrpc !== JSONRPC ||
|
|
265
|
+
typeof (body as Message).method !== 'string'
|
|
266
|
+
)
|
|
267
|
+
throw new http.BadRequest(
|
|
268
|
+
response(null, failure(INVALID_REQUEST, 'A request carries one JSON-RPC message'))
|
|
269
|
+
)
|
|
218
270
|
|
|
219
271
|
return body as Message
|
|
220
272
|
}
|
|
221
273
|
}
|
|
222
274
|
|
|
223
275
|
/** What a header says must be what the body says, or what routes and what answers differ. */
|
|
224
|
-
function mirrors
|
|
276
|
+
function mirrors(context: http.Context, mirror: Mirror): void {
|
|
225
277
|
const { id, header, value } = mirror
|
|
226
278
|
const stated = context.request.headers[header]
|
|
227
279
|
|
|
228
280
|
if (stated === undefined)
|
|
229
|
-
throw new http.BadRequest(
|
|
281
|
+
throw new http.BadRequest(
|
|
282
|
+
response(id, failure(HEADER_MISMATCH, `'${header}' is required`))
|
|
283
|
+
)
|
|
230
284
|
|
|
231
285
|
if (decode(String(stated)) !== value)
|
|
232
|
-
throw new http.BadRequest(
|
|
233
|
-
|
|
286
|
+
throw new http.BadRequest(
|
|
287
|
+
response(
|
|
288
|
+
id,
|
|
289
|
+
failure(
|
|
290
|
+
HEADER_MISMATCH,
|
|
291
|
+
`'${header}' says '${String(stated)}' and the body says '${String(value)}'`
|
|
292
|
+
)
|
|
293
|
+
)
|
|
294
|
+
)
|
|
234
295
|
}
|
|
235
296
|
|
|
236
297
|
interface Mirror {
|
|
@@ -239,24 +300,23 @@ interface Mirror {
|
|
|
239
300
|
value: unknown
|
|
240
301
|
}
|
|
241
302
|
|
|
242
|
-
function metadata
|
|
303
|
+
function metadata(params: Params): Record<string, unknown> | undefined {
|
|
243
304
|
const meta = params._meta
|
|
244
305
|
|
|
245
306
|
return typeof meta === 'object' && meta !== null
|
|
246
|
-
? meta as Record<string, unknown>
|
|
307
|
+
? (meta as Record<string, unknown>)
|
|
247
308
|
: undefined
|
|
248
309
|
}
|
|
249
310
|
|
|
250
|
-
function declared
|
|
311
|
+
function declared(params: Params): string | undefined {
|
|
251
312
|
const stated = metadata(params)?.[PROTOCOL_VERSION]
|
|
252
313
|
|
|
253
314
|
return typeof stated === 'string' ? stated : undefined
|
|
254
315
|
}
|
|
255
316
|
|
|
256
317
|
/** What a header value that could not be written as ASCII was encoded as. */
|
|
257
|
-
function decode
|
|
258
|
-
if (!value.startsWith(SENTINEL) || !value.endsWith(TERMINATOR))
|
|
259
|
-
return value
|
|
318
|
+
function decode(value: string): string {
|
|
319
|
+
if (!value.startsWith(SENTINEL) || !value.endsWith(TERMINATOR)) return value
|
|
260
320
|
|
|
261
321
|
const encoded = value.slice(SENTINEL.length, -TERMINATOR.length)
|
|
262
322
|
|
package/source/MCP/discover.ts
CHANGED
|
@@ -15,7 +15,7 @@ export interface Discovery {
|
|
|
15
15
|
legacy: (offered: string | undefined) => object
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
export function discovery
|
|
18
|
+
export function discovery(options: MCP): Discovery {
|
|
19
19
|
const info = { name: options.name, version: VERSION }
|
|
20
20
|
|
|
21
21
|
// `listChanged` is a stream a client holds open, and this endpoint holds none
|
|
@@ -27,10 +27,9 @@ export function discovery (options: MCP): Discovery {
|
|
|
27
27
|
_meta: { [SERVER_INFO]: info }
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
if (options.instructions !== undefined)
|
|
31
|
-
modern.instructions = options.instructions
|
|
30
|
+
if (options.instructions !== undefined) modern.instructions = options.instructions
|
|
32
31
|
|
|
33
|
-
function legacy
|
|
32
|
+
function legacy(offered: string | undefined): object {
|
|
34
33
|
const value: Record<string, unknown> = {
|
|
35
34
|
// what the client asked for where that is served, and the newest handshake otherwise
|
|
36
35
|
protocolVersion: offered !== undefined && offered !== MODERN ? offered : LEGACY,
|
|
@@ -38,8 +37,7 @@ export function discovery (options: MCP): Discovery {
|
|
|
38
37
|
serverInfo: info
|
|
39
38
|
}
|
|
40
39
|
|
|
41
|
-
if (options.instructions !== undefined)
|
|
42
|
-
value.instructions = options.instructions
|
|
40
|
+
if (options.instructions !== undefined) value.instructions = options.instructions
|
|
43
41
|
|
|
44
42
|
return value
|
|
45
43
|
}
|
|
@@ -49,4 +47,5 @@ export function discovery (options: MCP): Discovery {
|
|
|
49
47
|
|
|
50
48
|
/** What this gateway is, which is what answers however an application names itself. */
|
|
51
49
|
const VERSION: string = JSON.parse(
|
|
52
|
-
readFileSync(new URL('../../package.json', import.meta.url), 'utf8')
|
|
50
|
+
readFileSync(new URL('../../package.json', import.meta.url), 'utf8')
|
|
51
|
+
).version
|
package/source/MCP/errors.ts
CHANGED
|
@@ -17,16 +17,15 @@ export const HEADER_MISMATCH = -32020
|
|
|
17
17
|
export const MISSING_CAPABILITY = -32021
|
|
18
18
|
export const UNSUPPORTED_VERSION = -32022
|
|
19
19
|
|
|
20
|
-
export function failure
|
|
20
|
+
export function failure(code: number, message: string, data?: unknown): Failure {
|
|
21
21
|
const value: Failure = { code, message }
|
|
22
22
|
|
|
23
|
-
if (data !== undefined)
|
|
24
|
-
value.data = data
|
|
23
|
+
if (data !== undefined) value.data = data
|
|
25
24
|
|
|
26
25
|
return value
|
|
27
26
|
}
|
|
28
27
|
|
|
29
|
-
export function response
|
|
28
|
+
export function response(id: string | number | null, error: Failure): Response {
|
|
30
29
|
return { jsonrpc: JSONRPC, id, error }
|
|
31
30
|
}
|
|
32
31
|
|
|
@@ -36,7 +35,7 @@ export function response (id: string | number | null, error: Failure): Response
|
|
|
36
35
|
* The readable text is `body`, never `message`: `http.Exception` calls `super()` with no
|
|
37
36
|
* argument, so every one of them carries an empty `message`.
|
|
38
37
|
*/
|
|
39
|
-
export function of
|
|
38
|
+
export function of(exception: unknown): Failure {
|
|
40
39
|
if (exception instanceof http.NotFound || exception instanceof http.MethodNotAllowed)
|
|
41
40
|
return failure(METHOD_NOT_FOUND, text(exception, 'Method not found'))
|
|
42
41
|
|
|
@@ -50,7 +49,7 @@ export function of (exception: unknown): Failure {
|
|
|
50
49
|
* What the call was refused with, which a model reads and may correct itself by: what the
|
|
51
50
|
* operation said, where it said anything, and otherwise what the status means here.
|
|
52
51
|
*/
|
|
53
|
-
export function refusal
|
|
52
|
+
export function refusal(exception: http.ClientError): string {
|
|
54
53
|
const body = exception.body
|
|
55
54
|
|
|
56
55
|
if (typeof body !== 'object' || body === null || typeof body.code !== 'string')
|
|
@@ -58,7 +57,7 @@ export function refusal (exception: http.ClientError): string {
|
|
|
58
57
|
|
|
59
58
|
const message = body.message as unknown
|
|
60
59
|
|
|
61
|
-
return typeof message === 'string' && message !== '' ? message : body.code as string
|
|
60
|
+
return typeof message === 'string' && message !== '' ? message : (body.code as string)
|
|
62
61
|
}
|
|
63
62
|
|
|
64
63
|
/**
|
|
@@ -74,7 +73,7 @@ const REFUSALS: Record<number, string> = {
|
|
|
74
73
|
429: 'Too many calls'
|
|
75
74
|
}
|
|
76
75
|
|
|
77
|
-
function text
|
|
76
|
+
function text(exception: http.Exception, fallback: string): string {
|
|
78
77
|
return typeof exception.body === 'string' && exception.body !== ''
|
|
79
78
|
? exception.body
|
|
80
79
|
: fallback
|
|
@@ -38,8 +38,11 @@ describe('input', () => {
|
|
|
38
38
|
headers: { token: { header: 'x-access-token', type: 'string' } }
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
assert.deepEqual(input(introspection, []),
|
|
42
|
-
|
|
41
|
+
assert.deepEqual(input(introspection, []), {
|
|
42
|
+
type: 'object',
|
|
43
|
+
properties: {},
|
|
44
|
+
additionalProperties: false
|
|
45
|
+
})
|
|
43
46
|
})
|
|
44
47
|
|
|
45
48
|
it('should take the body as it is, requiring what it requires', () => {
|
|
@@ -78,7 +81,10 @@ describe('annotations', () => {
|
|
|
78
81
|
it('should read what the verb says of the call', () => {
|
|
79
82
|
assert.deepEqual(annotations('GET'), { readOnlyHint: true })
|
|
80
83
|
assert.deepEqual(annotations('HEAD'), { readOnlyHint: true })
|
|
81
|
-
assert.deepEqual(annotations('DELETE'), {
|
|
84
|
+
assert.deepEqual(annotations('DELETE'), {
|
|
85
|
+
destructiveHint: true,
|
|
86
|
+
idempotentHint: true
|
|
87
|
+
})
|
|
82
88
|
assert.deepEqual(annotations('PUT'), { idempotentHint: true })
|
|
83
89
|
assert.equal(annotations('POST'), undefined)
|
|
84
90
|
})
|
package/source/MCP/schema.ts
CHANGED
|
@@ -8,7 +8,7 @@ import type { Annotations } from './types.js'
|
|
|
8
8
|
* A `map:headers` property is not here: a call carries no headers of its own, so there is
|
|
9
9
|
* nowhere for a model to put one.
|
|
10
10
|
*/
|
|
11
|
-
export function input
|
|
11
|
+
export function input(introspection: Introspection, variables: string[]): object {
|
|
12
12
|
const properties: Record<string, unknown> = {}
|
|
13
13
|
const required: string[] = []
|
|
14
14
|
|
|
@@ -28,7 +28,8 @@ export function input (introspection: Introspection, variables: string[]): objec
|
|
|
28
28
|
if (introspection.query !== undefined)
|
|
29
29
|
properties.query = {
|
|
30
30
|
type: 'object',
|
|
31
|
-
description:
|
|
31
|
+
description:
|
|
32
|
+
'Which records the call works on: what to match, in what order, ' +
|
|
32
33
|
'and how many at once.',
|
|
33
34
|
properties: introspection.query
|
|
34
35
|
}
|
|
@@ -37,13 +38,12 @@ export function input (introspection: Introspection, variables: string[]): objec
|
|
|
37
38
|
|
|
38
39
|
if (body?.properties !== undefined) {
|
|
39
40
|
Object.assign(properties, body.properties)
|
|
40
|
-
required.push(...body.required ?? [])
|
|
41
|
+
required.push(...(body.required ?? []))
|
|
41
42
|
}
|
|
42
43
|
|
|
43
44
|
const schema: Record<string, unknown> = { type: 'object', properties }
|
|
44
45
|
|
|
45
|
-
if (required.length > 0)
|
|
46
|
-
schema.required = required
|
|
46
|
+
if (required.length > 0) schema.required = required
|
|
47
47
|
|
|
48
48
|
// what a name does not state is not a parameter, and a model should not invent one
|
|
49
49
|
schema.additionalProperties = false
|
|
@@ -56,27 +56,23 @@ export function input (introspection: Introspection, variables: string[]): objec
|
|
|
56
56
|
* and normalizes to `{}`, which describes nothing — and a schema the revision would have the
|
|
57
57
|
* reply validated against is worse said emptily than left unsaid.
|
|
58
58
|
*/
|
|
59
|
-
export function output
|
|
59
|
+
export function output(introspection: Introspection): object | undefined {
|
|
60
60
|
const schema = introspection.output as Shape | null | undefined
|
|
61
61
|
|
|
62
|
-
if (schema === undefined || schema === null)
|
|
63
|
-
return undefined
|
|
62
|
+
if (schema === undefined || schema === null) return undefined
|
|
64
63
|
|
|
65
|
-
return Object.keys(schema).length === 0 ? undefined : schema as object
|
|
64
|
+
return Object.keys(schema).length === 0 ? undefined : (schema as object)
|
|
66
65
|
}
|
|
67
66
|
|
|
68
67
|
/** What the verb says of the call, which the revision has a client treat as a hint. */
|
|
69
|
-
export function annotations
|
|
68
|
+
export function annotations(verb: string): Annotations | undefined {
|
|
70
69
|
const value: Annotations = {}
|
|
71
70
|
|
|
72
|
-
if (verb === 'GET' || verb === 'HEAD')
|
|
73
|
-
value.readOnlyHint = true
|
|
71
|
+
if (verb === 'GET' || verb === 'HEAD') value.readOnlyHint = true
|
|
74
72
|
|
|
75
|
-
if (verb === 'DELETE')
|
|
76
|
-
value.destructiveHint = true
|
|
73
|
+
if (verb === 'DELETE') value.destructiveHint = true
|
|
77
74
|
|
|
78
|
-
if (verb === 'PUT' || verb === 'DELETE')
|
|
79
|
-
value.idempotentHint = true
|
|
75
|
+
if (verb === 'PUT' || verb === 'DELETE') value.idempotentHint = true
|
|
80
76
|
|
|
81
77
|
return Object.keys(value).length === 0 ? undefined : value
|
|
82
78
|
}
|