@toa.io/extensions.exposition 1.0.0-alpha.272 → 1.0.0-alpha.274

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/CHANGELOG.md +211 -0
  2. package/components/exposition.atom/manifest.toa.yaml +3 -1
  3. package/components/exposition.octets/manifest.toa.yaml +28 -10
  4. package/components/exposition.octets/operations/put.js +20 -5
  5. package/components/identity.bans/manifest.toa.yaml +26 -7
  6. package/components/identity.bans/operations/tsconfig.tsbuildinfo +1 -1
  7. package/components/identity.basic/manifest.toa.yaml +106 -30
  8. package/components/identity.basic/operations/authenticate.js +7 -4
  9. package/components/identity.basic/operations/authenticate.js.map +1 -1
  10. package/components/identity.basic/operations/incept.js +3 -2
  11. package/components/identity.basic/operations/incept.js.map +1 -1
  12. package/components/identity.basic/operations/transit.js +17 -6
  13. package/components/identity.basic/operations/transit.js.map +1 -1
  14. package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
  15. package/components/identity.basic/operations/types.d.ts +2 -2
  16. package/components/identity.basic/source/authenticate.ts +8 -4
  17. package/components/identity.basic/source/incept.ts +3 -2
  18. package/components/identity.basic/source/transit.ts +20 -6
  19. package/components/identity.basic/source/types.ts +2 -2
  20. package/components/identity.credentials/manifest.toa.yaml +34 -13
  21. package/components/identity.credentials/operations/tsconfig.tsbuildinfo +1 -1
  22. package/components/identity.federation/manifest.toa.yaml +120 -28
  23. package/components/identity.federation/operations/authenticate.js +3 -2
  24. package/components/identity.federation/operations/authenticate.js.map +1 -1
  25. package/components/identity.federation/operations/create.js +4 -2
  26. package/components/identity.federation/operations/create.js.map +1 -1
  27. package/components/identity.federation/operations/lib/errors.d.ts +70 -11
  28. package/components/identity.federation/operations/lib/errors.js +40 -11
  29. package/components/identity.federation/operations/lib/errors.js.map +1 -1
  30. package/components/identity.federation/operations/lib/exchange.js +2 -2
  31. package/components/identity.federation/operations/lib/exchange.js.map +1 -1
  32. package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -1
  33. package/components/identity.federation/operations/types/configuration.d.ts +3 -2
  34. package/components/identity.federation/source/authenticate.ts +3 -2
  35. package/components/identity.federation/source/create.ts +4 -2
  36. package/components/identity.federation/source/lib/errors.ts +49 -12
  37. package/components/identity.federation/source/lib/exchange.ts +2 -2
  38. package/components/identity.federation/source/types/configuration.ts +4 -2
  39. package/components/identity.keys/manifest.toa.yaml +14 -6
  40. package/components/identity.keys/operations/tsconfig.tsbuildinfo +1 -1
  41. package/components/identity.otp/manifest.toa.yaml +44 -15
  42. package/components/identity.otp/operations/authenticate.js +9 -4
  43. package/components/identity.otp/operations/authenticate.js.map +1 -1
  44. package/components/identity.otp/operations/tsconfig.tsbuildinfo +1 -1
  45. package/components/identity.otp/source/authenticate.ts +11 -4
  46. package/components/identity.passkeys/manifest.toa.yaml +38 -8
  47. package/components/identity.passkeys/operations/authenticate.js +3 -2
  48. package/components/identity.passkeys/operations/authenticate.js.map +1 -1
  49. package/components/identity.passkeys/operations/create.js +6 -3
  50. package/components/identity.passkeys/operations/create.js.map +1 -1
  51. package/components/identity.passkeys/operations/tsconfig.tsbuildinfo +1 -1
  52. package/components/identity.passkeys/operations/use.js +6 -3
  53. package/components/identity.passkeys/operations/use.js.map +1 -1
  54. package/components/identity.passkeys/source/authenticate.ts +3 -2
  55. package/components/identity.passkeys/source/create.ts +7 -3
  56. package/components/identity.passkeys/source/use.ts +7 -3
  57. package/components/identity.roles/manifest.toa.yaml +41 -10
  58. package/components/identity.roles/operations/grant.js +3 -2
  59. package/components/identity.roles/operations/grant.js.map +1 -1
  60. package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
  61. package/components/identity.roles/source/grant.ts +3 -2
  62. package/components/identity.tokens/manifest.toa.yaml +99 -39
  63. package/components/identity.tokens/operations/authenticate.js +6 -3
  64. package/components/identity.tokens/operations/authenticate.js.map +1 -1
  65. package/components/identity.tokens/operations/decrypt.js +10 -5
  66. package/components/identity.tokens/operations/decrypt.js.map +1 -1
  67. package/components/identity.tokens/operations/encrypt.js +4 -3
  68. package/components/identity.tokens/operations/encrypt.js.map +1 -1
  69. package/components/identity.tokens/operations/lib/types.d.ts +3 -2
  70. package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
  71. package/components/identity.tokens/source/authenticate.test.ts +7 -2
  72. package/components/identity.tokens/source/authenticate.ts +7 -3
  73. package/components/identity.tokens/source/decrypt.test.ts +13 -7
  74. package/components/identity.tokens/source/decrypt.ts +12 -5
  75. package/components/identity.tokens/source/encrypt.test.ts +9 -4
  76. package/components/identity.tokens/source/encrypt.ts +4 -3
  77. package/components/identity.tokens/source/lib/types.ts +3 -2
  78. package/context.toa.yaml +2 -2
  79. package/documentation/components.md +1 -1
  80. package/documentation/identity.md +4 -1
  81. package/features/configuration.feature +207 -0
  82. package/features/cors.feature +1 -1
  83. package/features/dev.feature +1 -1
  84. package/features/identity.federation.feature +18 -9
  85. package/features/{identtiy.tokens.custom.feature → identity.tokens.custom.feature} +39 -0
  86. package/features/introspection.map.feature +16 -0
  87. package/features/map.feature +1 -1
  88. package/features/octets.download.feature +1 -1
  89. package/features/octets.meta.feature +1 -1
  90. package/features/passkeys.feature +8 -8
  91. package/features/require.feature +2 -2
  92. package/features/response.feature +3 -3
  93. package/features/steps/Components.ts +41 -4
  94. package/features/steps/Gateway.ts +61 -23
  95. package/features/steps/HTTP.ts +3 -5
  96. package/features/steps/Parameters.ts +2 -3
  97. package/features/steps/Realtime.ts +4 -4
  98. package/features/steps/Workspace.ts +8 -3
  99. package/features/steps/components/audit/manifest.toa.yaml +12 -5
  100. package/features/steps/components/echo/manifest.toa.yaml +33 -8
  101. package/features/steps/components/notify/manifest.toa.yaml +12 -5
  102. package/features/steps/components/octets.tester/manifest.toa.yaml +43 -14
  103. package/features/steps/components/orders/manifest.toa.yaml +22 -5
  104. package/features/steps/components/pots/manifest.toa.yaml +71 -17
  105. package/features/steps/components/pricing/manifest.toa.yaml +8 -2
  106. package/features/steps/components/sequences/manifest.toa.yaml +3 -1
  107. package/features/steps/components/users/manifest.toa.yaml +18 -3
  108. package/features/steps/components/users.properties/manifest.toa.yaml +12 -2
  109. package/package.json +5 -6
  110. package/schemas/annotation.cos.yaml +37 -17
  111. package/schemas/directive.cos.yaml +7 -3
  112. package/schemas/io/throttle.cos.yaml +47 -8
  113. package/schemas/method.cos.yaml +21 -9
  114. package/schemas/node.cos.yaml +22 -7
  115. package/schemas/octets/delete.cos.yaml +15 -2
  116. package/schemas/octets/get.cos.yaml +5 -2
  117. package/schemas/octets/put.cos.yaml +6 -3
  118. package/schemas/octets/workflow.cos.yaml +0 -1
  119. package/schemas/query.cos.yaml +31 -14
  120. package/schemas/querystring.cos.yaml +19 -9
  121. package/schemas/range.cos.yaml +10 -2
  122. package/schemas/route.cos.yaml +6 -2
  123. package/source/Branch.test.ts +37 -0
  124. package/source/Branch.ts +37 -0
  125. package/source/Factory.ts +5 -5
  126. package/source/Gateway.ts +20 -13
  127. package/source/HTTP/formats/yaml.test.ts +10 -2
  128. package/source/HTTP/formats/yaml.ts +21 -1
  129. package/source/RTD/Tree.ts +4 -1
  130. package/source/Tenant.ts +3 -3
  131. package/source/deployment.ts +3 -4
  132. package/source/directives/map/Headers.ts +8 -1
  133. package/source/directives/octets/Put.ts +6 -3
  134. package/source/root.ts +2 -2
  135. package/transpiled/Branch.d.ts +23 -0
  136. package/transpiled/Branch.js +16 -0
  137. package/transpiled/Branch.js.map +1 -1
  138. package/transpiled/Factory.js +4 -4
  139. package/transpiled/Factory.js.map +1 -1
  140. package/transpiled/Gateway.js +17 -7
  141. package/transpiled/Gateway.js.map +1 -1
  142. package/transpiled/HTTP/formats/yaml.js +15 -1
  143. package/transpiled/HTTP/formats/yaml.js.map +1 -1
  144. package/transpiled/RTD/Tree.js +4 -1
  145. package/transpiled/RTD/Tree.js.map +1 -1
  146. package/transpiled/Tenant.d.ts +1 -1
  147. package/transpiled/Tenant.js +1 -1
  148. package/transpiled/Tenant.js.map +1 -1
  149. package/transpiled/deployment.js +3 -4
  150. package/transpiled/deployment.js.map +1 -1
  151. package/transpiled/directives/map/Headers.js +7 -1
  152. package/transpiled/directives/map/Headers.js.map +1 -1
  153. package/transpiled/directives/octets/Put.js.map +1 -1
  154. package/transpiled/root.js +1 -1
  155. package/transpiled/root.js.map +1 -1
  156. package/transpiled/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md CHANGED
@@ -3,6 +3,217 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [1.0.0-alpha.274](https://github.com/toa-io/toa/compare/v1.0.0-alpha.273...v1.0.0-alpha.274) (2026-09-02)
7
+
8
+
9
+ * Configuration is served by a component, followed live, and kept per epoch (#1017) ([b05997d](https://github.com/toa-io/toa/commit/b05997d3adb784f238a222cb46878b23859339a2)), closes [#1017](https://github.com/toa-io/toa/issues/1017)
10
+
11
+
12
+ ### BREAKING CHANGES
13
+
14
+ * a secret configuration value is an object, not a string;
15
+ read it with `unwrap()`.
16
+
17
+ Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
18
+
19
+ * test(configuration): wait for the second round rather than assume it
20
+
21
+ Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
22
+
23
+ * refactor(configuration)!: read a secret with its own unwrap
24
+
25
+ Component code depends on no Toa package, so a secret is read as
26
+ `context.configuration.apiKey.unwrap()` and the helper in `@toa.io/generic`
27
+ goes. A value a component reads as a secret is therefore given as a reference:
28
+ `identity.basic` no longer defaults `pepper` to `''`, the development context
29
+ and the feature harness give the token keys, the federation client secret and
30
+ the signing key as references, and the harness has a step for the secrets a
31
+ scenario refers to. CONTRIBUTING states the rule.
32
+ * `identity.basic` `pepper` has no default; a value read as a
33
+ secret must be given as a `$NAME` reference.
34
+
35
+ Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
36
+
37
+ * feat(configuration): list the configurations
38
+
39
+ `configuration.values.list` returns every component's configuration for its
40
+ deployed epoch, by component name, and `GET /configuration/values/` serves it
41
+ behind `system:configuration:get`.
42
+
43
+ Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
44
+
45
+ * fix(exposition): write a value in YAML the way its toJSON says
46
+
47
+ A redacted secret in a reply was dumped as an empty object; it is written as
48
+ `<REDACTED>`, as JSON and msgpack already write it.
49
+
50
+ Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
51
+
52
+ * test(configuration): a secret is an object, and stays redacted in a reply
53
+
54
+ A component with `{ a: 1, b: $SECRET_B }` returns its configuration as
55
+ `{ a: 1, b: '<REDACTED>' }` and the secret itself through `unwrap()`. The reply
56
+ step also accepts a reply as a caller across a process boundary receives it,
57
+ since a call within the process hands the object over as it is.
58
+
59
+ Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
60
+
61
+ * chore(schemas): bump the dependencies
62
+
63
+ ajv 8.18.0 to 8.20.0, ajv-formats 2.1.1 to 3.0.1, better-ajv-errors 1.2.0
64
+ to 2.0.3, fast-glob 3.2.12 to 3.3.3 and js-yaml 4.3.1 to 5.4.1 — the version
65
+ exposition already uses. The three majors keep the CommonJS entry points this
66
+ library calls: ajv-formats as a function, better-ajv-errors as .default, and
67
+ js-yaml's load.
68
+
69
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
70
+
71
+ * feat(configuration)!: serve the schema with the value
72
+
73
+ GET /configuration/values/:component/ answers { configuration, schema, epoch }
74
+ where it answered with the configuration alone, and list carries the schema of
75
+ every component. Nothing reads a configuration without needing to know what it
76
+ is checked against, and the schema was only ever on the values service.
77
+
78
+ An epoch the deployment does not know has no schema; the value stored for it
79
+ is still returned.
80
+
81
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
82
+
83
+ * feat(configuration): publish a configuration UI
84
+
85
+ The values service serves a page at /.configuration on port 8003, out of the
86
+ directory ui builds: the configured components, a screen per component showing
87
+ what it holds now, and a dialog creating the next one. Reading needs
88
+ system:configuration:get and creating needs system:configuration:create.
89
+
90
+ A configuration is immutable, so the dialog opens on the current value and what
91
+ is left out of it is left out of the component. The editor takes YAML, the
92
+ schema is applied before anything is sent, and a secret is a reference the page
93
+ never shows.
94
+
95
+ The page is always published: the annotation is the per-component values map
96
+ and has nowhere to carry a switch.
97
+
98
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
99
+
100
+ * feat(introspection): link a component to its configuration
101
+
102
+ A card carrying @toa.io/extensions.configuration reads that extension as a link
103
+ to the configuration UI rather than as a name, and configuration joins the
104
+ namespaces the runtime provides, so its components band under System.
105
+
106
+ Deployed, both pages sit behind the same ingress and the path alone is right;
107
+ locally each console has its own port.
108
+
109
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
110
+
111
+ * feat(introspection): scroll the map, zoom with a modifier
112
+
113
+ The map was grabbed to move and zoomed with a bare wheel, which is neither what
114
+ a page does nor what the wheel does anywhere else. A plain scroll now pans on
115
+ both axes and the wheel scales only with the modifier held — a trackpad pinch
116
+ arrives as one of those on every platform.
117
+
118
+ A card's own scrollable box keeps its wheel, in both paths.
119
+
120
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
121
+
122
+ * refactor(introspection): centre the filter in the header
123
+
124
+ The sides take equal space, which is what leaves the filter between them.
125
+ Neither side may shrink under what it holds, or the tabs run out from under
126
+ their side and across the filter, and the filter across the sign-out button;
127
+ the title gives way instead.
128
+
129
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
130
+
131
+ * fix(configuration): connect the UI to the values service
132
+
133
+ The page was declared as a dependency from inside `open`, and a connector connects
134
+ what it depends on before `open` runs — so the server was constructed and never
135
+ listened. Nothing caught it: the UI feature builds the server itself.
136
+
137
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
138
+
139
+ * feat(configuration)!: reserve resources in the annotation
140
+
141
+ The values service deploys like any other and must state what it may take, but the
142
+ annotation is a map of component ids and had nowhere to put it — so `toa env` failed
143
+ for every context using configuration unless it declared a context-wide `resources`.
144
+
145
+ `resources` is now the service's own, read the way `introspection` and `realtime` read
146
+ theirs. A component actually named `resources` is written `default.resources`, which is
147
+ what its id is anyway.
148
+
149
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
150
+
151
+ * feat(configuration): follow the system colour scheme
152
+
153
+ The dark tokens were behind a `.dark` class nothing sets, and the `dark:` variant was
154
+ pointed at that class too — so a component's own dark styling never applied either.
155
+ Both now key off `prefers-color-scheme`, and `color-scheme` hands the native chrome
156
+ the same answer.
157
+
158
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
159
+
160
+ * feat(introspection): follow the system colour scheme
161
+
162
+ The dark tokens were behind a `.dark` class nothing sets, and the `dark:` variant was
163
+ pointed at that class too — so a component's own dark styling never applied either.
164
+ Both now key off `prefers-color-scheme`, and `color-scheme` hands the native chrome
165
+ the same answer.
166
+
167
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
168
+
169
+ * feat(configuration): present a change as an edit of what is there
170
+
171
+ A configuration is immutable and creating one replaces the whole of it, but the dialog
172
+ opens on the current value and the page never shows an older one — so what the reader
173
+ does is edit. The words follow: Edit rather than New, Update rather than Create, and
174
+ the paragraph explaining the model goes, along with the field's label, which the title
175
+ above it already said.
176
+
177
+ The editor also stayed as wide as its longest line — `field-sizing: content` sizes to
178
+ content, and no `max-width` clamps that — so a long value painted outside the dialog.
179
+ It is fixed now, the dialog takes the width the screen has rather than a fixed step,
180
+ and the band held for errors no longer leaves a gap when there are none.
181
+
182
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
183
+
184
+ * feat(configuration): mark a component that keeps a secret
185
+
186
+ A key after the name on the row, wherever the configuration holds a reference, however
187
+ deep. The predicate reads the same lines the value screen renders, so the two cannot
188
+ disagree about what counts as a secret.
189
+
190
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
191
+
192
+ * feat(configuration): lead back to the list from the title
193
+
194
+ Every address ends in a slash, so the way up is the address itself on the list and one
195
+ level above it on a component's screen — which holds wherever the page is mounted.
196
+
197
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
198
+
199
+
200
+
201
+
202
+
203
+ # [1.0.0-alpha.273](https://github.com/toa-io/toa/compare/v1.0.0-alpha.272...v1.0.0-alpha.273) (2026-09-02)
204
+
205
+
206
+ ### Bug Fixes
207
+
208
+ * **exposition:** green the feature suite ([67c25ad](https://github.com/toa-io/toa/commit/67c25ad627db3b3779b09405c5a3c319ecd47722))
209
+ * **exposition:** keep a departing tenant from taking a branch back ([64a4eaf](https://github.com/toa-io/toa/commit/64a4eafc9122fabba7b59bf7d559a9d4ef36f773))
210
+ * **exposition:** remove redundant inputs ([34763e4](https://github.com/toa-io/toa/commit/34763e417c93c4eecc5f96879a68c2b68bd6b8a8))
211
+ * **exposition:** report a refreshed branch at trace ([4f170ef](https://github.com/toa-io/toa/commit/4f170ef529a04755b22494789407305f11ce395e))
212
+
213
+
214
+
215
+
216
+
6
217
  # [1.0.0-alpha.272](https://github.com/toa-io/toa/compare/v1.0.0-alpha.271...v1.0.0-alpha.272) (2026-09-01)
7
218
 
8
219
 
@@ -15,5 +15,7 @@ operations:
15
15
  type: array
16
16
  items:
17
17
  type: number
18
- required: [keys, deltas]
18
+ required:
19
+ - keys
20
+ - deltas
19
21
  additionalProperties: false
@@ -7,12 +7,21 @@ operations:
7
7
  put:
8
8
  bindings: ~
9
9
  input:
10
- storage*: string
11
- request*: ~
12
- location: string
13
- accept: string
14
- limit: number
15
- trust: ~ # array of strings or regular expressions
10
+ properties:
11
+ location:
12
+ type: string
13
+ accept:
14
+ type: string
15
+ limit:
16
+ type: number
17
+ trust: {}
18
+ storage:
19
+ type: string
20
+ request: {}
21
+ type: object
22
+ required:
23
+ - storage
24
+ - request
16
25
  errors:
17
26
  - LOCATION_UNTRUSTED
18
27
  - LOCATION_LENGTH
@@ -21,9 +30,18 @@ operations:
21
30
  get: &simple
22
31
  bindings: ~
23
32
  input:
24
- storage*: string
25
- path*: string
26
- range: string
27
- agent: string
33
+ properties:
34
+ range:
35
+ type: string
36
+ agent:
37
+ type: string
38
+ storage:
39
+ type: string
40
+ path:
41
+ type: string
42
+ type: object
43
+ required:
44
+ - storage
45
+ - path
28
46
  head: *simple
29
47
  delete: *simple
@@ -2,7 +2,6 @@
2
2
 
3
3
  const { Readable } = require('node:stream')
4
4
  const { posix } = require('node:path')
5
- const { Err } = require('error-value')
6
5
  const { match } = require('matchacho')
7
6
 
8
7
  async function put (input, context) {
@@ -122,10 +121,26 @@ function toURL (location) {
122
121
  }
123
122
  }
124
123
 
125
- const ERR_UNTRUSTED = new Err('LOCATION_UNTRUSTED', 'Location is not trusted')
126
- const ERR_LENGTH = new Err('LOCATION_LENGTH', 'Content-Length must be 0 when Content-Location is used')
127
- const ERR_UNAVAILABLE = new Err('LOCATION_UNAVAILABLE', 'Location is not available')
128
- const ERR_INVALID_ID = new Err('INVALID_ID', 'Invalid Content-ID')
124
+ const ERR_UNTRUSTED = new (class LocationUntrustedError extends Error {
125
+ code = 'LOCATION_UNTRUSTED'
126
+ message = 'Location is not trusted'
127
+ })()
128
+
129
+ const ERR_LENGTH = new (class LocationLengthError extends Error {
130
+ code = 'LOCATION_LENGTH'
131
+ message = 'Content-Length must be 0 when Content-Location is used'
132
+ })()
133
+
134
+ const ERR_UNAVAILABLE = new (class LocationUnavailableError extends Error {
135
+ code = 'LOCATION_UNAVAILABLE'
136
+ message = 'Location is not available'
137
+ })()
138
+
139
+ const ERR_INVALID_ID = new (class InvalidIdError extends Error {
140
+ code = 'INVALID_ID'
141
+ message = 'Invalid Content-ID'
142
+ })()
143
+
129
144
 
130
145
  const ID_RX = /^[a-zA-Z0-9-_]{1,32}$/
131
146
 
@@ -3,19 +3,38 @@ name: bans
3
3
 
4
4
  entity:
5
5
  schema:
6
- banned*: false
7
- originator*: string
8
- comment: string
6
+ properties:
7
+ comment:
8
+ type: string
9
+ banned:
10
+ type: boolean
11
+ default: false
12
+ originator:
13
+ type: string
14
+ type: object
15
+ required:
16
+ - banned
17
+ - originator
9
18
  associated: true
10
19
 
11
20
  operations:
12
21
  transit:
13
22
  concurrency: retry
14
23
  input:
15
- banned*: boolean
16
- originator*:
17
- id: string
18
- comment: string
24
+ properties:
25
+ comment:
26
+ type: string
27
+ banned:
28
+ type: boolean
29
+ originator:
30
+ properties:
31
+ id:
32
+ type: string
33
+ type: object
34
+ type: object
35
+ required:
36
+ - banned
37
+ - originator
19
38
 
20
39
  exposition:
21
40
  isolated: true