@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
|
@@ -21,37 +21,50 @@ export class Map implements DirectiveFamily {
|
|
|
21
21
|
|
|
22
22
|
private remotes!: Remotes
|
|
23
23
|
|
|
24
|
-
public create
|
|
24
|
+
public create(name: string, value: unknown, remotes: Remotes): Property | Mapping {
|
|
25
25
|
this.remotes = remotes
|
|
26
26
|
|
|
27
|
-
return match(
|
|
28
|
-
|
|
29
|
-
() =>
|
|
27
|
+
return match(
|
|
28
|
+
name,
|
|
29
|
+
() => properties.has(name),
|
|
30
|
+
(name: PN) => new Property(name, value as PV),
|
|
31
|
+
() => name in mappings,
|
|
32
|
+
(name: keyof typeof mappings) => new mappings[name](value, remotes),
|
|
30
33
|
() => {
|
|
31
34
|
throw new Error(`Directive 'map:${name}' is not implemented`)
|
|
32
|
-
}
|
|
35
|
+
}
|
|
36
|
+
)
|
|
33
37
|
}
|
|
34
38
|
|
|
35
|
-
public explain
|
|
39
|
+
public explain(
|
|
40
|
+
directives: Directive[],
|
|
41
|
+
_: Input,
|
|
42
|
+
introspection: Introspection
|
|
43
|
+
): Introspection {
|
|
36
44
|
for (const directive of directives)
|
|
37
|
-
if (directive instanceof Mapping)
|
|
38
|
-
directive.explain(introspection)
|
|
45
|
+
if (directive instanceof Mapping) directive.explain(introspection)
|
|
39
46
|
|
|
40
47
|
return introspection
|
|
41
48
|
}
|
|
42
49
|
|
|
43
|
-
public async precall
|
|
50
|
+
public async precall(
|
|
51
|
+
directives: Directive[],
|
|
52
|
+
context: Input,
|
|
53
|
+
parameters: Parameter[]
|
|
54
|
+
): Promise<Output> {
|
|
44
55
|
const properties = {}
|
|
45
56
|
|
|
46
57
|
for (const directive of directives)
|
|
47
58
|
if (directive instanceof Mapping)
|
|
48
|
-
Object.assign(
|
|
59
|
+
Object.assign(
|
|
60
|
+
properties,
|
|
61
|
+
await directive.properties(context, parameters, directives)
|
|
62
|
+
)
|
|
49
63
|
|
|
50
64
|
context.pipelines.body.push((body: unknown) => {
|
|
51
65
|
if (body === undefined || body === null || typeof body !== 'object')
|
|
52
66
|
return properties
|
|
53
|
-
else
|
|
54
|
-
return Object.assign(body, properties)
|
|
67
|
+
else return Object.assign(body, properties)
|
|
55
68
|
})
|
|
56
69
|
|
|
57
70
|
return null
|
|
@@ -9,12 +9,16 @@ export abstract class Mapping<T = unknown> {
|
|
|
9
9
|
protected value: T
|
|
10
10
|
protected remotes?: Remotes
|
|
11
11
|
|
|
12
|
-
protected constructor
|
|
12
|
+
protected constructor(value: T, remotes?: Remotes) {
|
|
13
13
|
this.value = value
|
|
14
14
|
this.remotes = remotes
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
public abstract properties
|
|
17
|
+
public abstract properties(
|
|
18
|
+
context: Input,
|
|
19
|
+
parameters: Parameter[],
|
|
20
|
+
directives: Directive[]
|
|
21
|
+
): Output
|
|
18
22
|
|
|
19
23
|
/**
|
|
20
24
|
* What this mapping does to what the method says about itself, which is the reverse of
|
|
@@ -25,13 +29,12 @@ export abstract class Mapping<T = unknown> {
|
|
|
25
29
|
* from the request itself and there is nowhere for a caller to put one; a header and a
|
|
26
30
|
* segment are the caller's, and those say where.
|
|
27
31
|
*/
|
|
28
|
-
public explain
|
|
29
|
-
for (const property of this.names())
|
|
30
|
-
take(introspection, property)
|
|
32
|
+
public explain(introspection: Introspection): void {
|
|
33
|
+
for (const property of this.names()) take(introspection, property)
|
|
31
34
|
}
|
|
32
35
|
|
|
33
36
|
/** The input properties this mapping fills, however its value names them. */
|
|
34
|
-
protected names
|
|
37
|
+
protected names(): string[] {
|
|
35
38
|
return typeof this.value === 'string'
|
|
36
39
|
? [this.value]
|
|
37
40
|
: Object.keys(this.value as object)
|
|
@@ -6,7 +6,7 @@ export class Property<K extends keyof Properties = keyof Properties> {
|
|
|
6
6
|
public readonly name: K
|
|
7
7
|
public readonly value: Properties[K]
|
|
8
8
|
|
|
9
|
-
public constructor
|
|
9
|
+
public constructor(name: K, value: Properties[K]) {
|
|
10
10
|
this.name = name
|
|
11
11
|
this.value = value
|
|
12
12
|
}
|
|
@@ -5,17 +5,19 @@ import type { Parameter } from '../../RTD/index.js'
|
|
|
5
5
|
import type { Introspection, Schema } from '../../Introspection.js'
|
|
6
6
|
|
|
7
7
|
export class Segments extends Mapping<Record<string, string>> {
|
|
8
|
-
public constructor
|
|
8
|
+
public constructor(map: Record<string, string>) {
|
|
9
9
|
assert.ok(map.constructor === Object, '`map:segments` must be an object')
|
|
10
10
|
|
|
11
|
-
assert.ok(
|
|
12
|
-
|
|
11
|
+
assert.ok(
|
|
12
|
+
Object.values(map).every((value) => typeof value === 'string'),
|
|
13
|
+
'`map:segments ` must be an object with string values'
|
|
14
|
+
)
|
|
13
15
|
|
|
14
16
|
super(map)
|
|
15
17
|
}
|
|
16
18
|
|
|
17
19
|
/** A segment is the caller's, so it moves to the route rather than out of sight. */
|
|
18
|
-
public override explain
|
|
20
|
+
public override explain(introspection: Introspection): void {
|
|
19
21
|
for (const property of Object.keys(this.value)) {
|
|
20
22
|
const schema = take(introspection, property)
|
|
21
23
|
|
|
@@ -24,22 +26,27 @@ export class Segments extends Mapping<Record<string, string>> {
|
|
|
24
26
|
}
|
|
25
27
|
}
|
|
26
28
|
|
|
27
|
-
public override properties
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
public override properties(
|
|
30
|
+
_: unknown,
|
|
31
|
+
parameters: Parameter[]
|
|
32
|
+
): Record<string, string> {
|
|
33
|
+
return Object.entries(this.value).reduce(
|
|
34
|
+
(properties: Record<string, string>, [property, parameter]) => {
|
|
35
|
+
const cut = parameter[0] === '~'
|
|
30
36
|
|
|
31
|
-
|
|
37
|
+
if (cut) parameter = parameter.slice(1)
|
|
32
38
|
|
|
33
|
-
|
|
39
|
+
const index = parameters.findIndex(({ name }) => name === parameter)
|
|
34
40
|
|
|
35
|
-
|
|
41
|
+
assert.ok(index > -1, `Route parameter '${parameter}' is missing`)
|
|
36
42
|
|
|
37
|
-
|
|
43
|
+
properties[property] = parameters[index].value
|
|
38
44
|
|
|
39
|
-
|
|
40
|
-
parameters.splice(index, 1)
|
|
45
|
+
if (cut) parameters.splice(index, 1)
|
|
41
46
|
|
|
42
|
-
|
|
43
|
-
|
|
47
|
+
return properties
|
|
48
|
+
},
|
|
49
|
+
{}
|
|
50
|
+
)
|
|
44
51
|
}
|
|
45
52
|
}
|
|
@@ -12,22 +12,31 @@ export class MCP implements DirectiveFamily<Tool> {
|
|
|
12
12
|
public readonly mandatory = false
|
|
13
13
|
|
|
14
14
|
/** What this method is published as, which is what the nearest declaration says. */
|
|
15
|
-
public static published
|
|
15
|
+
public static published(directives: Tool[] | undefined): Tool | null {
|
|
16
16
|
return directives?.[0] ?? null
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
// eslint-disable-next-line max-params
|
|
20
|
-
public create
|
|
20
|
+
public create(name: string, value: unknown, _: unknown, route: string): Tool {
|
|
21
21
|
assert.ok(name === 'tool', `Unknown directive: mcp:${name}`)
|
|
22
22
|
|
|
23
23
|
return new Tool(value, route)
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
/** What the route states this method is, which is the only thing that states it. */
|
|
27
|
-
public explain
|
|
28
|
-
|
|
27
|
+
public explain(
|
|
28
|
+
directives: Tool[],
|
|
29
|
+
_: Context,
|
|
30
|
+
introspection: Introspection
|
|
31
|
+
): Introspection {
|
|
29
32
|
const tool = MCP.published(directives)
|
|
30
33
|
|
|
31
|
-
|
|
34
|
+
if (tool === null) return introspection
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
...introspection,
|
|
38
|
+
description: tool.description,
|
|
39
|
+
...(tool.title === undefined ? {} : { title: tool.title })
|
|
40
|
+
}
|
|
32
41
|
}
|
|
33
42
|
}
|
|
@@ -5,8 +5,38 @@ import { MCP } from './MCP.js'
|
|
|
5
5
|
|
|
6
6
|
describe('mcp:tool', () => {
|
|
7
7
|
it('should take what the route states the tool is', () => {
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
const tool = new Tool('The pots that are hot.', '/pots/hot')
|
|
9
|
+
|
|
10
|
+
assert.strictEqual(tool.description, 'The pots that are hot.')
|
|
11
|
+
assert.strictEqual(tool.title, undefined)
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
it('should take a title beside the description', () => {
|
|
15
|
+
const tool = new Tool(
|
|
16
|
+
{ title: 'Hot pots', description: 'The pots that are hot.' },
|
|
17
|
+
'/pots'
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
assert.strictEqual(tool.title, 'Hot pots')
|
|
21
|
+
assert.strictEqual(tool.description, 'The pots that are hot.')
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
it('should not accept a mapping without a description', () => {
|
|
25
|
+
assert.throws(() => new Tool({ title: 'Hot pots' }, '/pots'), /cannot be empty/)
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
it('should not accept an empty title', () => {
|
|
29
|
+
assert.throws(
|
|
30
|
+
() => new Tool({ title: ' ', description: 'A pot.' }, '/pots'),
|
|
31
|
+
/a title cannot be empty/
|
|
32
|
+
)
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
it('should not accept what it does not know', () => {
|
|
36
|
+
assert.throws(
|
|
37
|
+
() => new Tool({ description: 'A pot.', name: 'pots' }, '/pots'),
|
|
38
|
+
/unknown 'name'/
|
|
39
|
+
)
|
|
10
40
|
})
|
|
11
41
|
|
|
12
42
|
it('should not accept an empty description', () => {
|
|
@@ -18,6 +48,7 @@ describe('mcp:tool', () => {
|
|
|
18
48
|
assert.throws(() => new Tool(true, '/pots'), /the value is what the tool is/)
|
|
19
49
|
assert.throws(() => new Tool(false, '/pots'), /the value is what the tool is/)
|
|
20
50
|
assert.throws(() => new Tool(1, '/pots'), /the value is what the tool is/)
|
|
51
|
+
assert.throws(() => new Tool(['A pot.'], '/pots'), /the value is what the tool is/)
|
|
21
52
|
})
|
|
22
53
|
|
|
23
54
|
it('should refuse a route no name can spell', () => {
|
|
@@ -49,8 +80,11 @@ describe('mcp:tool inheritance', () => {
|
|
|
49
80
|
})
|
|
50
81
|
|
|
51
82
|
it('should describe a method with what the route states', () => {
|
|
52
|
-
const described = family.explain(
|
|
53
|
-
|
|
83
|
+
const described = family.explain(
|
|
84
|
+
[new Tool('What the route is.', '/pots')],
|
|
85
|
+
null as never,
|
|
86
|
+
{ description: 'What the operation is.' }
|
|
87
|
+
)
|
|
54
88
|
|
|
55
89
|
assert.strictEqual(described.description, 'What the route is.')
|
|
56
90
|
})
|
|
@@ -60,7 +94,9 @@ describe('mcp:tool inheritance', () => {
|
|
|
60
94
|
})
|
|
61
95
|
|
|
62
96
|
it('should refuse a directive it does not know', () => {
|
|
63
|
-
assert.throws(
|
|
64
|
-
|
|
97
|
+
assert.throws(
|
|
98
|
+
() => family.create('resource', 'A pot.', null, '/pots'),
|
|
99
|
+
/Unknown directive: mcp:resource/
|
|
100
|
+
)
|
|
65
101
|
})
|
|
66
102
|
})
|
|
@@ -7,22 +7,53 @@ import { segment } from '../../RTD/segment.js'
|
|
|
7
7
|
* says is what it says it is: a tool a model cannot read the purpose of is one it cannot
|
|
8
8
|
* choose, so there is no way to publish one that states nothing.
|
|
9
9
|
*
|
|
10
|
+
* A `title` is what a person is shown where a client lists what it may call — a name is an
|
|
11
|
+
* address and reads as one. A description alone is written as the value; both are written as
|
|
12
|
+
* a mapping.
|
|
13
|
+
*
|
|
10
14
|
* The operation states what it is too, and that is not this. An operation is written without
|
|
11
15
|
* knowledge of any route, and a tool is an operation and a route together — the same
|
|
12
|
-
* operation mounted twice is two tools, and one sentence
|
|
16
|
+
* operation mounted twice is two tools, and one sentence is not true of both.
|
|
13
17
|
*/
|
|
14
18
|
export class Tool {
|
|
15
19
|
public readonly description: string
|
|
20
|
+
public readonly title: string | undefined
|
|
21
|
+
|
|
22
|
+
public constructor(value: unknown, route: string) {
|
|
23
|
+
const stated = typeof value === 'string' ? { description: value } : value
|
|
24
|
+
|
|
25
|
+
assert.ok(
|
|
26
|
+
typeof stated === 'object' && stated !== null && !Array.isArray(stated),
|
|
27
|
+
'Directive mcp:tool: the value is what the tool is, or a `title` and a `description`'
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
const { description, title, ...rest } = stated as Record<string, unknown>
|
|
31
|
+
|
|
32
|
+
assert.ok(
|
|
33
|
+
Object.keys(rest).length === 0,
|
|
34
|
+
`Directive mcp:tool: unknown ${Object.keys(rest)
|
|
35
|
+
.map((key) => `'${key}'`)
|
|
36
|
+
.join(', ')}`
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
assert.ok(
|
|
40
|
+
typeof description === 'string' && description.trim().length > 0,
|
|
41
|
+
'Directive mcp:tool: a description cannot be empty'
|
|
42
|
+
)
|
|
16
43
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
'Directive mcp:tool:
|
|
44
|
+
assert.ok(
|
|
45
|
+
title === undefined || (typeof title === 'string' && title.trim().length > 0),
|
|
46
|
+
'Directive mcp:tool: a title cannot be empty'
|
|
47
|
+
)
|
|
20
48
|
|
|
21
49
|
// a tool is called by name, so a route that cannot be named cannot be one — said where
|
|
22
50
|
// the mistake is, rather than as a tool that is quietly never listed
|
|
23
|
-
assert.ok(
|
|
24
|
-
|
|
51
|
+
assert.ok(
|
|
52
|
+
refusal(segment(route)) === null,
|
|
53
|
+
`Directive mcp:tool: '${route}' holds a segment no tool name can spell`
|
|
54
|
+
)
|
|
25
55
|
|
|
26
|
-
this.description =
|
|
56
|
+
this.description = description
|
|
57
|
+
this.title = title as string | undefined
|
|
27
58
|
}
|
|
28
59
|
}
|
|
@@ -20,11 +20,10 @@ export class Discovery implements Interceptor {
|
|
|
20
20
|
*/
|
|
21
21
|
private readonly authorities = new Map<string, Documents>()
|
|
22
22
|
|
|
23
|
-
public mount
|
|
23
|
+
public mount(options: http.Options): void {
|
|
24
24
|
this.authorities.clear()
|
|
25
25
|
|
|
26
|
-
if (options.oauth === undefined)
|
|
27
|
-
return
|
|
26
|
+
if (options.oauth === undefined) return
|
|
28
27
|
|
|
29
28
|
/*
|
|
30
29
|
* `https` always: RFC 8414 has an issuer be one, and OAuth 2.1 has every endpoint of an
|
|
@@ -39,20 +38,18 @@ export class Discovery implements Interceptor {
|
|
|
39
38
|
this.authorities.set(authority, documents(`https://${host}`, options.oauth))
|
|
40
39
|
}
|
|
41
40
|
|
|
42
|
-
public reset
|
|
41
|
+
public reset(): void {
|
|
43
42
|
this.authorities.clear()
|
|
44
43
|
}
|
|
45
44
|
|
|
46
|
-
public intercept
|
|
45
|
+
public intercept(input: Input): Output {
|
|
47
46
|
const known = this.authorities.get(input.authority)
|
|
48
47
|
|
|
49
|
-
if (known === undefined)
|
|
50
|
-
return null
|
|
48
|
+
if (known === undefined) return null
|
|
51
49
|
|
|
52
50
|
// every reply, not just a document's: the challenge is what points a client here
|
|
53
51
|
input.pipelines.response.push((response) => {
|
|
54
|
-
if (response.status !== UNAUTHORIZED)
|
|
55
|
-
return
|
|
52
|
+
if (response.status !== UNAUTHORIZED) return
|
|
56
53
|
|
|
57
54
|
response.headers ??= new Headers()
|
|
58
55
|
response.headers.set('www-authenticate', known.challenge(input.url.pathname))
|
|
@@ -60,8 +57,7 @@ export class Discovery implements Interceptor {
|
|
|
60
57
|
|
|
61
58
|
const body = known.read(input.url.pathname)
|
|
62
59
|
|
|
63
|
-
if (body === undefined)
|
|
64
|
-
return null
|
|
60
|
+
if (body === undefined) return null
|
|
65
61
|
|
|
66
62
|
return { body, headers: new Headers({ 'cache-control': 'public, max-age=3600' }) }
|
|
67
63
|
}
|
|
@@ -9,12 +9,12 @@ export interface Documents {
|
|
|
9
9
|
challenge: (pathname: string) => string
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
export function documents
|
|
12
|
+
export function documents(issuer: string, oauth: OAuth): Documents {
|
|
13
13
|
const server = authorizationServer(issuer, oauth)
|
|
14
14
|
const resources = protectedResources(issuer, oauth)
|
|
15
15
|
const scope = oauth.scopes === undefined ? '' : `, scope="${oauth.scopes.join(' ')}"`
|
|
16
16
|
|
|
17
|
-
function read
|
|
17
|
+
function read(pathname: string): object | undefined {
|
|
18
18
|
if (pathname === AUTHORIZATION_SERVER || pathname === OPENID_CONFIGURATION)
|
|
19
19
|
return server
|
|
20
20
|
|
|
@@ -24,7 +24,7 @@ export function documents (issuer: string, oauth: OAuth): Documents {
|
|
|
24
24
|
return undefined
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
function challenge
|
|
27
|
+
function challenge(pathname: string): string {
|
|
28
28
|
return `Bearer resource_metadata="${issuer}${PROTECTED_RESOURCE}${suffix(oauth, pathname)}"${scope}`
|
|
29
29
|
}
|
|
30
30
|
|
|
@@ -36,7 +36,7 @@ export function documents (issuer: string, oauth: OAuth): Documents {
|
|
|
36
36
|
* everything else this extension serves. Both flags are load-bearing for a client that
|
|
37
37
|
* prefers Client ID Metadata Documents: without either it falls back to registration.
|
|
38
38
|
*/
|
|
39
|
-
function authorizationServer
|
|
39
|
+
function authorizationServer(issuer: string, oauth: OAuth): object {
|
|
40
40
|
const metadata: Record<string, unknown> = {
|
|
41
41
|
issuer,
|
|
42
42
|
authorization_endpoint: oauth.authorize,
|
|
@@ -52,8 +52,7 @@ function authorizationServer (issuer: string, oauth: OAuth): object {
|
|
|
52
52
|
if (oauth.registration === 'open')
|
|
53
53
|
metadata.registration_endpoint = `${issuer}${REGISTRATION}`
|
|
54
54
|
|
|
55
|
-
if (oauth.scopes !== undefined)
|
|
56
|
-
metadata.scopes_supported = oauth.scopes
|
|
55
|
+
if (oauth.scopes !== undefined) metadata.scopes_supported = oauth.scopes
|
|
57
56
|
|
|
58
57
|
return metadata
|
|
59
58
|
}
|
|
@@ -63,7 +62,7 @@ function authorizationServer (issuer: string, oauth: OAuth): object {
|
|
|
63
62
|
* `https://host/mcp` reads `/.well-known/oauth-protected-resource/mcp`, and one that names
|
|
64
63
|
* no path reads the document at the origin.
|
|
65
64
|
*/
|
|
66
|
-
function protectedResources
|
|
65
|
+
function protectedResources(issuer: string, oauth: OAuth): Map<string, object> {
|
|
67
66
|
const map = new Map<string, object>()
|
|
68
67
|
|
|
69
68
|
for (const path of oauth.resources ?? [])
|
|
@@ -74,26 +73,24 @@ function protectedResources (issuer: string, oauth: OAuth): Map<string, object>
|
|
|
74
73
|
return map
|
|
75
74
|
}
|
|
76
75
|
|
|
77
|
-
function resource
|
|
76
|
+
function resource(issuer: string, path: string, oauth: OAuth): object {
|
|
78
77
|
const metadata: Record<string, unknown> = {
|
|
79
78
|
resource: issuer + path,
|
|
80
79
|
authorization_servers: [issuer],
|
|
81
80
|
bearer_methods_supported: ['header']
|
|
82
81
|
}
|
|
83
82
|
|
|
84
|
-
if (oauth.scopes !== undefined)
|
|
85
|
-
metadata.scopes_supported = oauth.scopes
|
|
83
|
+
if (oauth.scopes !== undefined) metadata.scopes_supported = oauth.scopes
|
|
86
84
|
|
|
87
85
|
return metadata
|
|
88
86
|
}
|
|
89
87
|
|
|
90
88
|
/** The document a request to this path was refused against: the longest resource holding it. */
|
|
91
|
-
function suffix
|
|
89
|
+
function suffix(oauth: OAuth, pathname: string): string {
|
|
92
90
|
let longest = ''
|
|
93
91
|
|
|
94
92
|
for (const path of oauth.resources ?? [])
|
|
95
|
-
if (pathname.startsWith(path) && path.length > longest.length)
|
|
96
|
-
longest = path
|
|
93
|
+
if (pathname.startsWith(path) && path.length > longest.length) longest = path
|
|
97
94
|
|
|
98
95
|
return canonical(longest)
|
|
99
96
|
}
|
|
@@ -102,7 +99,7 @@ function suffix (oauth: OAuth, pathname: string): string {
|
|
|
102
99
|
* A resource is identified without its trailing slash — the form MCP asks for — while a
|
|
103
100
|
* route is declared with one, so `/mcp/` identifies `…/mcp`.
|
|
104
101
|
*/
|
|
105
|
-
function canonical
|
|
102
|
+
function canonical(path: string): string {
|
|
106
103
|
return path.endsWith('/') ? path.slice(0, -1) : path
|
|
107
104
|
}
|
|
108
105
|
|
|
@@ -6,15 +6,18 @@ export class Context extends Directive {
|
|
|
6
6
|
public readonly targeted = false
|
|
7
7
|
public readonly storage: string
|
|
8
8
|
|
|
9
|
-
public constructor
|
|
9
|
+
public constructor(value: unknown) {
|
|
10
10
|
super()
|
|
11
11
|
|
|
12
|
-
assert.ok(
|
|
12
|
+
assert.ok(
|
|
13
|
+
typeof value === 'string',
|
|
14
|
+
"Directive 'octets:context' must must be a string"
|
|
15
|
+
)
|
|
13
16
|
|
|
14
17
|
this.storage = value
|
|
15
18
|
}
|
|
16
19
|
|
|
17
|
-
public async apply
|
|
20
|
+
public async apply(): Promise<Output> {
|
|
18
21
|
return null
|
|
19
22
|
}
|
|
20
23
|
}
|
|
@@ -5,7 +5,7 @@ import { Workflow } from './workflows/index.js'
|
|
|
5
5
|
import { Directive } from './Directive.js'
|
|
6
6
|
import type { Parameter } from '../../RTD/index.js'
|
|
7
7
|
import type { Unit, Location } from './workflows/index.js'
|
|
8
|
-
import type { Maybe } from '@toa.io/core'
|
|
8
|
+
import type { Maybe } from '@toa.io/core/types'
|
|
9
9
|
import type { Component } from '@toa.io/core'
|
|
10
10
|
import type { Output } from '../../io.js'
|
|
11
11
|
import type { Input } from './types.js'
|
|
@@ -19,7 +19,11 @@ export class Delete extends Directive {
|
|
|
19
19
|
private readonly discovery: Promise<Component>
|
|
20
20
|
private storage!: Component
|
|
21
21
|
|
|
22
|
-
public constructor
|
|
22
|
+
public constructor(
|
|
23
|
+
options: Options | null,
|
|
24
|
+
discovery: Promise<Component>,
|
|
25
|
+
remotes: Remotes
|
|
26
|
+
) {
|
|
23
27
|
super()
|
|
24
28
|
schemas.remove.validate(options)
|
|
25
29
|
|
|
@@ -29,43 +33,48 @@ export class Delete extends Directive {
|
|
|
29
33
|
this.discovery = discovery
|
|
30
34
|
}
|
|
31
35
|
|
|
32
|
-
public async apply
|
|
36
|
+
public async apply(
|
|
37
|
+
storage: string,
|
|
38
|
+
input: Input,
|
|
39
|
+
parameters: Parameter[]
|
|
40
|
+
): Promise<Output> {
|
|
33
41
|
this.storage ??= await this.discovery
|
|
34
42
|
|
|
35
43
|
const output: Output = {}
|
|
36
44
|
|
|
37
45
|
if (this.workflow !== undefined) {
|
|
38
|
-
const entry = await this.storage.invoke<Maybe<Entry>>('head',
|
|
39
|
-
{
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
})
|
|
46
|
+
const entry = await this.storage.invoke<Maybe<Entry>>('head', {
|
|
47
|
+
input: {
|
|
48
|
+
storage,
|
|
49
|
+
path: input.request.url
|
|
50
|
+
}
|
|
51
|
+
})
|
|
45
52
|
|
|
46
|
-
if (entry instanceof Error)
|
|
47
|
-
throw new NotFound()
|
|
53
|
+
if (entry instanceof Error) throw new NotFound()
|
|
48
54
|
|
|
49
55
|
output.status = 202
|
|
50
56
|
output.body = Readable.from(this.execute(input, storage, entry, parameters))
|
|
51
|
-
} else
|
|
52
|
-
await this.delete(storage, input)
|
|
57
|
+
} else await this.delete(storage, input)
|
|
53
58
|
|
|
54
59
|
return output
|
|
55
60
|
}
|
|
56
61
|
|
|
57
|
-
private async delete
|
|
58
|
-
await this.storage.invoke('delete',
|
|
59
|
-
{
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
})
|
|
62
|
+
private async delete(storage: string, input: Input): Promise<void> {
|
|
63
|
+
await this.storage.invoke('delete', {
|
|
64
|
+
input: {
|
|
65
|
+
storage,
|
|
66
|
+
path: input.request.url
|
|
67
|
+
}
|
|
68
|
+
})
|
|
65
69
|
}
|
|
66
70
|
|
|
67
71
|
// eslint-disable-next-line max-params
|
|
68
|
-
private async *
|
|
72
|
+
private async *execute(
|
|
73
|
+
input: Input,
|
|
74
|
+
storage: string,
|
|
75
|
+
entry: Entry,
|
|
76
|
+
parameters: Parameter[]
|
|
77
|
+
): AsyncGenerator {
|
|
69
78
|
const location: Location = {
|
|
70
79
|
storage,
|
|
71
80
|
authority: input.authority,
|
|
@@ -75,8 +84,7 @@ export class Delete extends Directive {
|
|
|
75
84
|
for await (const chunk of this.workflow!.execute(location, entry, parameters)) {
|
|
76
85
|
yield chunk
|
|
77
86
|
|
|
78
|
-
if (typeof chunk === 'object' && chunk !== null && 'error' in chunk)
|
|
79
|
-
return
|
|
87
|
+
if (typeof chunk === 'object' && chunk !== null && 'error' in chunk) return
|
|
80
88
|
}
|
|
81
89
|
|
|
82
90
|
await this.delete(storage, input)
|
|
@@ -6,5 +6,9 @@ export abstract class Directive {
|
|
|
6
6
|
public readonly name = 'octets.' + this.constructor.name.toLowerCase()
|
|
7
7
|
public abstract readonly targeted: boolean
|
|
8
8
|
|
|
9
|
-
public abstract apply
|
|
9
|
+
public abstract apply(
|
|
10
|
+
storage: string,
|
|
11
|
+
input: Input,
|
|
12
|
+
parameters: Parameter[]
|
|
13
|
+
): Promise<io.Output>
|
|
10
14
|
}
|