@toa.io/extensions.exposition 1.0.0-alpha.284 → 1.0.0-alpha.286
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +23 -17
- 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 +45 -31
- 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/mcp.feature +32 -28
- package/features/oauth.grants.feature +1 -1
- package/features/octets.cloudinary.feature +1 -1
- package/features/octets.download.feature +1 -0
- package/features/require.feature +1 -2
- package/features/rpc.feature +21 -21
- 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 -71
- 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 +29 -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 -27
- package/source/MCP/types.ts +4 -1
- 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 +51 -32
- package/source/RPC/names.ts +26 -32
- 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 +64 -27
- 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 +14 -5
- package/source/directives/mcp/Tool.test.ts +42 -6
- package/source/directives/mcp/Tool.ts +38 -7
- 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.d.ts +2 -0
- 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 -6
- package/transpiled/MCP/tools.js.map +1 -1
- package/transpiled/MCP/types.d.ts +3 -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.d.ts +3 -2
- package/transpiled/RPC/names.js +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 +7 -1
- package/transpiled/directives/mcp/MCP.js.map +1 -1
- package/transpiled/directives/mcp/Tool.d.ts +6 -1
- package/transpiled/directives/mcp/Tool.js +16 -3
- 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/CHANGELOG.md +0 -541
- 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/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
|
}
|
package/source/MCP/tools.ts
CHANGED
|
@@ -20,7 +20,7 @@ import type { Params, Result, Tool } from './types.js'
|
|
|
20
20
|
*
|
|
21
21
|
* Sorted, because the revision asks for an order a client can cache on.
|
|
22
22
|
*/
|
|
23
|
-
export async function list
|
|
23
|
+
export async function list(tree: Tree, context: http.Context): Promise<Tool[]> {
|
|
24
24
|
const tools: Tool[] = []
|
|
25
25
|
|
|
26
26
|
/*
|
|
@@ -28,24 +28,22 @@ export async function list (tree: Tree, context: http.Context): Promise<Tool[]>
|
|
|
28
28
|
* refuses a credentialed request at an `anonymous` route does not refuse the call a tool
|
|
29
29
|
* makes, and a list that says otherwise disagrees with what `tools/call` then does.
|
|
30
30
|
*/
|
|
31
|
-
const describing: http.Context = Object.create(context,
|
|
32
|
-
|
|
31
|
+
const describing: http.Context = Object.create(context, {
|
|
32
|
+
procedural: { value: true, enumerable: true }
|
|
33
|
+
})
|
|
33
34
|
|
|
34
35
|
for (const { segments, verb, method } of tree.walk()) {
|
|
35
|
-
if (MCP.published(method.directives.declared<Declaration>(FAMILY)) === null)
|
|
36
|
-
continue
|
|
36
|
+
if (MCP.published(method.directives.declared<Declaration>(FAMILY)) === null) continue
|
|
37
37
|
|
|
38
38
|
const named = name(segments, verb)
|
|
39
39
|
|
|
40
40
|
// a route a name cannot spell is a route nothing addresses, here or at `/.rpc`
|
|
41
|
-
if (named === null)
|
|
42
|
-
continue
|
|
41
|
+
if (named === null) continue
|
|
43
42
|
|
|
44
43
|
const variables = parameters(segments)
|
|
45
44
|
const introspection = await method.explain(describing, variables)
|
|
46
45
|
|
|
47
|
-
if (introspection === null)
|
|
48
|
-
continue
|
|
46
|
+
if (introspection === null) continue
|
|
49
47
|
|
|
50
48
|
const described = introspection.description
|
|
51
49
|
const schema = output(introspection)
|
|
@@ -54,16 +52,20 @@ export async function list (tree: Tree, context: http.Context): Promise<Tool[]>
|
|
|
54
52
|
// in the order the revision documents one, which is the order it is read in
|
|
55
53
|
const tool: Tool = {
|
|
56
54
|
name: named,
|
|
57
|
-
...
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
55
|
+
...(introspection.title === undefined ? {} : { title: introspection.title }),
|
|
56
|
+
...(described === undefined ? {} : { description: described }),
|
|
57
|
+
inputSchema: input(
|
|
58
|
+
introspection,
|
|
59
|
+
variables.map((variable) => variable.name)
|
|
60
|
+
),
|
|
61
|
+
...(schema === undefined ? {} : { outputSchema: schema }),
|
|
62
|
+
...(hints === undefined ? {} : { annotations: hints })
|
|
61
63
|
}
|
|
62
64
|
|
|
63
65
|
tools.push(tool)
|
|
64
66
|
}
|
|
65
67
|
|
|
66
|
-
return tools.sort((one, other) => one.name < other.name ? -1 : 1)
|
|
68
|
+
return tools.sort((one, other) => (one.name < other.name ? -1 : 1))
|
|
67
69
|
}
|
|
68
70
|
|
|
69
71
|
/**
|
|
@@ -74,10 +76,14 @@ export async function list (tree: Tree, context: http.Context): Promise<Tool[]>
|
|
|
74
76
|
* would have taken it: what an application did not publish is not reachable here by guessing
|
|
75
77
|
* its name. What the caller may then do with one that is published is still `auth`'s to say.
|
|
76
78
|
*/
|
|
77
|
-
export async function call
|
|
79
|
+
export async function call(scope: Scope, named: string, args: Params): Promise<Result> {
|
|
78
80
|
if (!published(scope.tree, named))
|
|
79
|
-
throw new http.NotFound(
|
|
80
|
-
|
|
81
|
+
throw new http.NotFound(
|
|
82
|
+
response(
|
|
83
|
+
null,
|
|
84
|
+
failure(METHOD_NOT_FOUND, `'${named}' is not a tool this server publishes`)
|
|
85
|
+
)
|
|
86
|
+
)
|
|
81
87
|
|
|
82
88
|
const { path, verb, variables } = address(named, args)
|
|
83
89
|
const { query, input: body } = split(args, variables)
|
|
@@ -98,7 +104,10 @@ export async function call (scope: Scope, named: string, args: Params): Promise<
|
|
|
98
104
|
* — that is the client's to fix and not the model's, so it is answered as it is — and
|
|
99
105
|
* neither is a fault of this server, which is a protocol error and stays one.
|
|
100
106
|
*/
|
|
101
|
-
if (
|
|
107
|
+
if (
|
|
108
|
+
exception instanceof http.ClientError &&
|
|
109
|
+
!(exception instanceof http.Unauthorized)
|
|
110
|
+
)
|
|
102
111
|
return { content: [{ type: 'text', text: refusal(exception) }], isError: true }
|
|
103
112
|
|
|
104
113
|
throw exception
|
|
@@ -117,7 +126,7 @@ export interface Scope {
|
|
|
117
126
|
* asked here — the declaration is the route's and does not vary by who is calling, and the
|
|
118
127
|
* call that follows is authorized as any request to that route is.
|
|
119
128
|
*/
|
|
120
|
-
function published
|
|
129
|
+
function published(tree: Tree, named: string): boolean {
|
|
121
130
|
for (const { segments, verb, method } of tree.walk())
|
|
122
131
|
if (name(segments, verb) === named)
|
|
123
132
|
return MCP.published(method.directives.declared<Declaration>(FAMILY)) !== null
|
|
@@ -125,9 +134,8 @@ function published (tree: Tree, named: string): boolean {
|
|
|
125
134
|
return false
|
|
126
135
|
}
|
|
127
136
|
|
|
128
|
-
function result
|
|
129
|
-
if (body === undefined || body === null)
|
|
130
|
-
return { content: [] }
|
|
137
|
+
function result(body: unknown): Result {
|
|
138
|
+
if (body === undefined || body === null) return { content: [] }
|
|
131
139
|
|
|
132
140
|
return {
|
|
133
141
|
content: [{ type: 'text', text: JSON.stringify(body) }],
|
|
@@ -139,15 +147,13 @@ function result (body: unknown): Result {
|
|
|
139
147
|
* What a route template takes, by name. Describing has no values for them — a template is
|
|
140
148
|
* not a path — and nothing that describes a method reads one.
|
|
141
149
|
*/
|
|
142
|
-
function parameters
|
|
150
|
+
function parameters(segments: Segment[]): Parameter[] {
|
|
143
151
|
const params: Parameter[] = []
|
|
144
152
|
|
|
145
153
|
for (const segment of segments) {
|
|
146
|
-
if (segment.fragment !== null)
|
|
147
|
-
continue
|
|
154
|
+
if (segment.fragment !== null) continue
|
|
148
155
|
|
|
149
|
-
if (segment.wildcard === true)
|
|
150
|
-
params.push({ name: '**', value: '' })
|
|
156
|
+
if (segment.wildcard === true) params.push({ name: '**', value: '' })
|
|
151
157
|
else if (segment.placeholder !== null)
|
|
152
158
|
params.push({ name: segment.placeholder, value: '' })
|
|
153
159
|
}
|
package/source/MCP/types.ts
CHANGED
|
@@ -66,7 +66,10 @@ export interface Content {
|
|
|
66
66
|
export interface Tool {
|
|
67
67
|
name: string
|
|
68
68
|
|
|
69
|
-
/** what
|
|
69
|
+
/** what a person is shown where a client lists this tool; a name is an address */
|
|
70
|
+
title?: string
|
|
71
|
+
|
|
72
|
+
/** what the route states this method is */
|
|
70
73
|
description?: string
|
|
71
74
|
inputSchema: object
|
|
72
75
|
outputSchema?: object
|