@openwop/openwop-conformance 2.35.0 → 2.36.0

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 (123) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +3 -3
  3. package/coverage.md +13 -1
  4. package/dist/lib/certification-bundle-v3.js +21 -4
  5. package/dist/spec-artifacts.lock.json +2 -2
  6. package/fixtures/a2ui-v09/negative-event-name-deleteall.json +139 -0
  7. package/fixtures/a2ui-v09/negative-extra-property.json +140 -0
  8. package/fixtures/a2ui-v09/negative-foreign-catalog.json +139 -0
  9. package/fixtures/a2ui-v09/negative-formatstring-label.json +145 -0
  10. package/fixtures/a2ui-v09/negative-functioncall-openurl.json +129 -0
  11. package/fixtures/a2ui-v09/negative-image-component.json +145 -0
  12. package/fixtures/a2ui-v09/negative-textfield-obscured.json +140 -0
  13. package/fixtures/a2ui-v09/negative-theme-iconurl.json +142 -0
  14. package/fixtures/a2ui-v09/positive-approve-brief.json +139 -0
  15. package/fixtures/conformance-artifact-emit.json +28 -0
  16. package/fixtures/conformance-clarification-nested.json +53 -0
  17. package/fixtures/conformance-clarification-sensitive.json +49 -0
  18. package/fixtures/conformance-credential.json +25 -0
  19. package/fixtures/conformance-mcp-client.json +28 -0
  20. package/fixtures/interrupt-payloads/interrupt-payload-approval.json +1 -0
  21. package/fixtures/interrupt-payloads/interrupt-payload-clarification.json +1 -0
  22. package/fixtures/interrupt-payloads/interrupt-payload-conversation-close.json +1 -0
  23. package/fixtures/interrupt-payloads/interrupt-payload-conversation-exchange.json +1 -0
  24. package/fixtures/interrupt-payloads/interrupt-payload-conversation-start.json +1 -0
  25. package/fixtures/interrupt-payloads/interrupt-payload-custom.json +1 -0
  26. package/fixtures/interrupt-payloads/interrupt-payload-external-event.json +1 -0
  27. package/fixtures/interrupt-payloads/interrupt-payload-low-confidence.json +1 -0
  28. package/fixtures/interrupt-payloads/negative-approval-with-clarification-data.json +1 -0
  29. package/fixtures/interrupt-payloads/negative-conversation-close-with-conversation-start-data.json +1 -0
  30. package/fixtures/interrupt-payloads/negative-conversation-start-with-conversation-exchange-data.json +1 -0
  31. package/fixtures/interrupt-payloads/negative-custom-with-conversation-start-data.json +1 -0
  32. package/fixtures/interrupt-payloads/negative-low-confidence-with-custom-data.json +1 -0
  33. package/fixtures/node-pack-runtime/negative-entry-mismatch.json +31 -0
  34. package/fixtures/node-pack-runtime/negative-headers.json +37 -0
  35. package/fixtures/node-pack-runtime/negative-http.json +31 -0
  36. package/fixtures/node-pack-runtime/negative-icons.json +37 -0
  37. package/fixtures/node-pack-runtime/negative-meta.json +36 -0
  38. package/fixtures/node-pack-runtime/negative-non-remote-language.json +31 -0
  39. package/fixtures/node-pack-runtime/negative-packages.json +41 -0
  40. package/fixtures/node-pack-runtime/negative-sse.json +31 -0
  41. package/fixtures/node-pack-runtime/negative-templated-url.json +31 -0
  42. package/fixtures/node-pack-runtime/negative-two-remotes.json +35 -0
  43. package/fixtures/node-pack-runtime/negative-variables.json +38 -0
  44. package/fixtures/node-pack-runtime/negative-version-range.json +31 -0
  45. package/fixtures/node-pack-runtime/positive-every-optional-member.json +40 -0
  46. package/fixtures/node-pack-runtime/positive-rfc-example.json +31 -0
  47. package/fixtures/node-pack-runtime/upstream/mcp-registry-server-2025-12-11.schema.json +574 -0
  48. package/fixtures/oauth-providers/synthetic.json +36 -4
  49. package/fixtures/upstream/a2a-v1.0.1/README.md +24 -0
  50. package/fixtures/upstream/a2a-v1.0.1/a2a.proto +811 -0
  51. package/fixtures/upstream/a2ui-v0.9/README.md +33 -0
  52. package/fixtures/upstream/a2ui-v0.9/catalog.json +1383 -0
  53. package/fixtures/upstream/a2ui-v0.9/common_types.json +305 -0
  54. package/fixtures/upstream/a2ui-v0.9/server_to_client.json +132 -0
  55. package/fixtures.md +139 -0
  56. package/package.json +2 -2
  57. package/requirements.json +4480 -97
  58. package/scenario-majors.json +93 -6
  59. package/schemas/CORPUS-STAMP.json +103 -89
  60. package/src/lib/behavior-gate.ts +7 -1
  61. package/src/lib/certification-bundle-v3.ts +18 -4
  62. package/src/lib/localized-content.ts +53 -0
  63. package/src/lib/mcp-fake-server.ts +105 -4
  64. package/src/lib/node-pack-runtime.ts +41 -0
  65. package/src/lib/oauth-as-double.ts +316 -0
  66. package/src/lib/protected-resource.ts +88 -0
  67. package/src/lib/standard-webhooks.ts +120 -0
  68. package/src/lib/toolCatalog.ts +54 -4
  69. package/src/lib/trace-context.ts +98 -0
  70. package/src/lib/v2.ts +6 -0
  71. package/src/lib/webhook-receiver.ts +201 -1
  72. package/src/scenarios/artifact-type-pack-manifest-validation.test.ts +10 -1
  73. package/src/scenarios/auth-challenge-no-oracle.test.ts +122 -0
  74. package/src/scenarios/auth-oauth2-client-credentials.test.ts +46 -5
  75. package/src/scenarios/cross-host-traceparent-propagation.test.ts +92 -58
  76. package/src/scenarios/debugBundle.test.ts +41 -0
  77. package/src/scenarios/fixtures-valid.test.ts +72 -0
  78. package/src/scenarios/inbound-credential-no-passthrough.test.ts +115 -0
  79. package/src/scenarios/interrupt-approver-routing.test.ts +3 -0
  80. package/src/scenarios/localized-content-delivery.test.ts +26 -15
  81. package/src/scenarios/mcp-current-auth-boundary.test.ts +38 -0
  82. package/src/scenarios/mcp-tool-roundtrip.test.ts +29 -0
  83. package/src/scenarios/otel-mcp-semconv-projection.test.ts +85 -0
  84. package/src/scenarios/tool-catalog-compact-projection.test.ts +28 -14
  85. package/src/scenarios/tool-catalog-projection.test.ts +48 -12
  86. package/src/scenarios/tool-descriptor-shape.test.ts +34 -13
  87. package/src/scenarios/v2-a2a-agent-cards.test.ts +305 -0
  88. package/src/scenarios/v2-a2a-operation-map.test.ts +310 -0
  89. package/src/scenarios/v2-a2ui-v09-surface.test.ts +283 -0
  90. package/src/scenarios/v2-advertised-fixtures-exist.test.ts +2 -2
  91. package/src/scenarios/v2-artifact-a2a-shape.test.ts +122 -0
  92. package/src/scenarios/v2-auth-challenge.test.ts +119 -0
  93. package/src/scenarios/v2-bound-id-kinds.test.ts +1 -1
  94. package/src/scenarios/v2-callback-url-guarded.test.ts +2 -2
  95. package/src/scenarios/v2-capability-maturity-bounded.test.ts +108 -0
  96. package/src/scenarios/v2-configurable-closed.test.ts +1 -1
  97. package/src/scenarios/v2-content-locale-keys.test.ts +92 -0
  98. package/src/scenarios/v2-conversation-turn-parts.test.ts +74 -0
  99. package/src/scenarios/v2-credential-interrupt.test.ts +253 -0
  100. package/src/scenarios/v2-effect-identity-business-key.test.ts +2 -2
  101. package/src/scenarios/v2-fork-a-v1-run.test.ts +1 -1
  102. package/src/scenarios/v2-implementation-informational.test.ts +33 -0
  103. package/src/scenarios/v2-interop-trace-context.test.ts +351 -0
  104. package/src/scenarios/v2-lane-exp-only-bound.test.ts +236 -0
  105. package/src/scenarios/v2-lane-issuer-advertised.test.ts +52 -3
  106. package/src/scenarios/v2-mcp-client-results.test.ts +202 -0
  107. package/src/scenarios/v2-mcp-mount-map.test.ts +308 -0
  108. package/src/scenarios/v2-mcp-tasks.test.ts +503 -0
  109. package/src/scenarios/v2-oauth-client-pkce-state-iss.test.ts +203 -0
  110. package/src/scenarios/v2-oauth-mcp-reach-discovery.test.ts +186 -0
  111. package/src/scenarios/v2-oidc-id-token-audience.test.ts +108 -0
  112. package/src/scenarios/v2-protected-resource-metadata.test.ts +145 -0
  113. package/src/scenarios/v2-run-cancel.test.ts +1 -1
  114. package/src/scenarios/v2-run-fork-prefix.test.ts +4 -4
  115. package/src/scenarios/v2-run-pause-resume.test.ts +1 -1
  116. package/src/scenarios/v2-tool-catalog-annotations.test.ts +100 -0
  117. package/src/scenarios/v2-unmapped-type-refused.test.ts +1 -1
  118. package/src/scenarios/v2-v1-events-translated.test.ts +1 -1
  119. package/src/scenarios/v2-webhook-egress-refusal.test.ts +5 -5
  120. package/src/scenarios/v2-webhook-endpoint-verification.test.ts +124 -0
  121. package/src/scenarios/v2-webhook-message-id-stable.test.ts +124 -0
  122. package/src/scenarios/v2-webhook-secret-rotation.test.ts +132 -0
  123. package/src/scenarios/v2-webhook-standard-webhooks-delivery.test.ts +195 -0
@@ -0,0 +1,145 @@
1
+ {
2
+ "version": "v0.9",
3
+ "catalogId": "https://a2ui.org/specification/v0_9/catalogs/basic/catalog.json",
4
+ "surfaceId": "approve-brief",
5
+ "messages": [
6
+ {
7
+ "version": "v0.9",
8
+ "createSurface": {
9
+ "surfaceId": "approve-brief",
10
+ "catalogId": "https://a2ui.org/specification/v0_9/catalogs/basic/catalog.json"
11
+ }
12
+ },
13
+ {
14
+ "version": "v0.9",
15
+ "updateComponents": {
16
+ "surfaceId": "approve-brief",
17
+ "components": [
18
+ {
19
+ "id": "root",
20
+ "component": "Column",
21
+ "children": [
22
+ "h",
23
+ "name",
24
+ "when",
25
+ "region",
26
+ "agree",
27
+ "submit"
28
+ ]
29
+ },
30
+ {
31
+ "id": "h",
32
+ "component": "Text",
33
+ "text": {
34
+ "call": "formatString",
35
+ "args": {
36
+ "value": "${/name}"
37
+ },
38
+ "returnType": "string"
39
+ },
40
+ "variant": "h2"
41
+ },
42
+ {
43
+ "id": "name",
44
+ "component": "TextField",
45
+ "label": "Product name",
46
+ "value": {
47
+ "path": "/name"
48
+ },
49
+ "checks": [
50
+ {
51
+ "condition": {
52
+ "call": "required",
53
+ "args": {
54
+ "value": {
55
+ "path": "/name"
56
+ }
57
+ }
58
+ },
59
+ "message": "Required"
60
+ }
61
+ ]
62
+ },
63
+ {
64
+ "id": "when",
65
+ "component": "DateTimeInput",
66
+ "label": "Launch date",
67
+ "value": {
68
+ "path": "/when"
69
+ },
70
+ "enableDate": true
71
+ },
72
+ {
73
+ "id": "region",
74
+ "component": "ChoicePicker",
75
+ "label": "Region",
76
+ "options": [
77
+ {
78
+ "label": "EU",
79
+ "value": "eu"
80
+ },
81
+ {
82
+ "label": "US",
83
+ "value": "us"
84
+ }
85
+ ],
86
+ "value": {
87
+ "path": "/region"
88
+ },
89
+ "variant": "mutuallyExclusive"
90
+ },
91
+ {
92
+ "id": "agree",
93
+ "component": "CheckBox",
94
+ "label": "I agree",
95
+ "value": {
96
+ "path": "/agree"
97
+ }
98
+ },
99
+ {
100
+ "id": "submit_label",
101
+ "component": "Text",
102
+ "text": "Submit"
103
+ },
104
+ {
105
+ "id": "submit",
106
+ "component": "Button",
107
+ "child": "submit_label",
108
+ "variant": "primary",
109
+ "action": {
110
+ "event": {
111
+ "name": "resume",
112
+ "context": {
113
+ "name": {
114
+ "path": "/name"
115
+ },
116
+ "when": {
117
+ "path": "/when"
118
+ },
119
+ "region": {
120
+ "path": "/region"
121
+ },
122
+ "agree": {
123
+ "path": "/agree"
124
+ }
125
+ }
126
+ }
127
+ }
128
+ }
129
+ ]
130
+ }
131
+ },
132
+ {
133
+ "version": "v0.9",
134
+ "updateDataModel": {
135
+ "surfaceId": "approve-brief",
136
+ "value": {
137
+ "name": "",
138
+ "when": "",
139
+ "region": [],
140
+ "agree": false
141
+ }
142
+ }
143
+ }
144
+ ]
145
+ }
@@ -0,0 +1,129 @@
1
+ {
2
+ "version": "v0.9",
3
+ "catalogId": "https://a2ui.org/specification/v0_9/catalogs/basic/catalog.json",
4
+ "surfaceId": "approve-brief",
5
+ "messages": [
6
+ {
7
+ "version": "v0.9",
8
+ "createSurface": {
9
+ "surfaceId": "approve-brief",
10
+ "catalogId": "https://a2ui.org/specification/v0_9/catalogs/basic/catalog.json"
11
+ }
12
+ },
13
+ {
14
+ "version": "v0.9",
15
+ "updateComponents": {
16
+ "surfaceId": "approve-brief",
17
+ "components": [
18
+ {
19
+ "id": "root",
20
+ "component": "Column",
21
+ "children": [
22
+ "h",
23
+ "name",
24
+ "when",
25
+ "region",
26
+ "agree",
27
+ "submit"
28
+ ]
29
+ },
30
+ {
31
+ "id": "h",
32
+ "component": "Text",
33
+ "text": "Launch brief",
34
+ "variant": "h2"
35
+ },
36
+ {
37
+ "id": "name",
38
+ "component": "TextField",
39
+ "label": "Product name",
40
+ "value": {
41
+ "path": "/name"
42
+ },
43
+ "checks": [
44
+ {
45
+ "condition": {
46
+ "call": "required",
47
+ "args": {
48
+ "value": {
49
+ "path": "/name"
50
+ }
51
+ }
52
+ },
53
+ "message": "Required"
54
+ }
55
+ ]
56
+ },
57
+ {
58
+ "id": "when",
59
+ "component": "DateTimeInput",
60
+ "label": "Launch date",
61
+ "value": {
62
+ "path": "/when"
63
+ },
64
+ "enableDate": true
65
+ },
66
+ {
67
+ "id": "region",
68
+ "component": "ChoicePicker",
69
+ "label": "Region",
70
+ "options": [
71
+ {
72
+ "label": "EU",
73
+ "value": "eu"
74
+ },
75
+ {
76
+ "label": "US",
77
+ "value": "us"
78
+ }
79
+ ],
80
+ "value": {
81
+ "path": "/region"
82
+ },
83
+ "variant": "mutuallyExclusive"
84
+ },
85
+ {
86
+ "id": "agree",
87
+ "component": "CheckBox",
88
+ "label": "I agree",
89
+ "value": {
90
+ "path": "/agree"
91
+ }
92
+ },
93
+ {
94
+ "id": "submit_label",
95
+ "component": "Text",
96
+ "text": "Submit"
97
+ },
98
+ {
99
+ "id": "submit",
100
+ "component": "Button",
101
+ "child": "submit_label",
102
+ "variant": "primary",
103
+ "action": {
104
+ "functionCall": {
105
+ "call": "openUrl",
106
+ "args": {
107
+ "url": "https://evil.example/"
108
+ },
109
+ "returnType": "void"
110
+ }
111
+ }
112
+ }
113
+ ]
114
+ }
115
+ },
116
+ {
117
+ "version": "v0.9",
118
+ "updateDataModel": {
119
+ "surfaceId": "approve-brief",
120
+ "value": {
121
+ "name": "",
122
+ "when": "",
123
+ "region": [],
124
+ "agree": false
125
+ }
126
+ }
127
+ }
128
+ ]
129
+ }
@@ -0,0 +1,145 @@
1
+ {
2
+ "version": "v0.9",
3
+ "catalogId": "https://a2ui.org/specification/v0_9/catalogs/basic/catalog.json",
4
+ "surfaceId": "approve-brief",
5
+ "messages": [
6
+ {
7
+ "version": "v0.9",
8
+ "createSurface": {
9
+ "surfaceId": "approve-brief",
10
+ "catalogId": "https://a2ui.org/specification/v0_9/catalogs/basic/catalog.json"
11
+ }
12
+ },
13
+ {
14
+ "version": "v0.9",
15
+ "updateComponents": {
16
+ "surfaceId": "approve-brief",
17
+ "components": [
18
+ {
19
+ "id": "root",
20
+ "component": "Column",
21
+ "children": [
22
+ "h",
23
+ "name",
24
+ "when",
25
+ "region",
26
+ "agree",
27
+ "submit",
28
+ "img"
29
+ ]
30
+ },
31
+ {
32
+ "id": "h",
33
+ "component": "Text",
34
+ "text": "Launch brief",
35
+ "variant": "h2"
36
+ },
37
+ {
38
+ "id": "name",
39
+ "component": "TextField",
40
+ "label": "Product name",
41
+ "value": {
42
+ "path": "/name"
43
+ },
44
+ "checks": [
45
+ {
46
+ "condition": {
47
+ "call": "required",
48
+ "args": {
49
+ "value": {
50
+ "path": "/name"
51
+ }
52
+ }
53
+ },
54
+ "message": "Required"
55
+ }
56
+ ]
57
+ },
58
+ {
59
+ "id": "when",
60
+ "component": "DateTimeInput",
61
+ "label": "Launch date",
62
+ "value": {
63
+ "path": "/when"
64
+ },
65
+ "enableDate": true
66
+ },
67
+ {
68
+ "id": "region",
69
+ "component": "ChoicePicker",
70
+ "label": "Region",
71
+ "options": [
72
+ {
73
+ "label": "EU",
74
+ "value": "eu"
75
+ },
76
+ {
77
+ "label": "US",
78
+ "value": "us"
79
+ }
80
+ ],
81
+ "value": {
82
+ "path": "/region"
83
+ },
84
+ "variant": "mutuallyExclusive"
85
+ },
86
+ {
87
+ "id": "agree",
88
+ "component": "CheckBox",
89
+ "label": "I agree",
90
+ "value": {
91
+ "path": "/agree"
92
+ }
93
+ },
94
+ {
95
+ "id": "submit_label",
96
+ "component": "Text",
97
+ "text": "Submit"
98
+ },
99
+ {
100
+ "id": "submit",
101
+ "component": "Button",
102
+ "child": "submit_label",
103
+ "variant": "primary",
104
+ "action": {
105
+ "event": {
106
+ "name": "resume",
107
+ "context": {
108
+ "name": {
109
+ "path": "/name"
110
+ },
111
+ "when": {
112
+ "path": "/when"
113
+ },
114
+ "region": {
115
+ "path": "/region"
116
+ },
117
+ "agree": {
118
+ "path": "/agree"
119
+ }
120
+ }
121
+ }
122
+ }
123
+ },
124
+ {
125
+ "id": "img",
126
+ "component": "Image",
127
+ "url": "https://evil.example/p.png"
128
+ }
129
+ ]
130
+ }
131
+ },
132
+ {
133
+ "version": "v0.9",
134
+ "updateDataModel": {
135
+ "surfaceId": "approve-brief",
136
+ "value": {
137
+ "name": "",
138
+ "when": "",
139
+ "region": [],
140
+ "agree": false
141
+ }
142
+ }
143
+ }
144
+ ]
145
+ }
@@ -0,0 +1,140 @@
1
+ {
2
+ "version": "v0.9",
3
+ "catalogId": "https://a2ui.org/specification/v0_9/catalogs/basic/catalog.json",
4
+ "surfaceId": "approve-brief",
5
+ "messages": [
6
+ {
7
+ "version": "v0.9",
8
+ "createSurface": {
9
+ "surfaceId": "approve-brief",
10
+ "catalogId": "https://a2ui.org/specification/v0_9/catalogs/basic/catalog.json"
11
+ }
12
+ },
13
+ {
14
+ "version": "v0.9",
15
+ "updateComponents": {
16
+ "surfaceId": "approve-brief",
17
+ "components": [
18
+ {
19
+ "id": "root",
20
+ "component": "Column",
21
+ "children": [
22
+ "h",
23
+ "name",
24
+ "when",
25
+ "region",
26
+ "agree",
27
+ "submit"
28
+ ]
29
+ },
30
+ {
31
+ "id": "h",
32
+ "component": "Text",
33
+ "text": "Launch brief",
34
+ "variant": "h2"
35
+ },
36
+ {
37
+ "id": "name",
38
+ "component": "TextField",
39
+ "label": "Product name",
40
+ "value": {
41
+ "path": "/name"
42
+ },
43
+ "checks": [
44
+ {
45
+ "condition": {
46
+ "call": "required",
47
+ "args": {
48
+ "value": {
49
+ "path": "/name"
50
+ }
51
+ }
52
+ },
53
+ "message": "Required"
54
+ }
55
+ ],
56
+ "variant": "obscured"
57
+ },
58
+ {
59
+ "id": "when",
60
+ "component": "DateTimeInput",
61
+ "label": "Launch date",
62
+ "value": {
63
+ "path": "/when"
64
+ },
65
+ "enableDate": true
66
+ },
67
+ {
68
+ "id": "region",
69
+ "component": "ChoicePicker",
70
+ "label": "Region",
71
+ "options": [
72
+ {
73
+ "label": "EU",
74
+ "value": "eu"
75
+ },
76
+ {
77
+ "label": "US",
78
+ "value": "us"
79
+ }
80
+ ],
81
+ "value": {
82
+ "path": "/region"
83
+ },
84
+ "variant": "mutuallyExclusive"
85
+ },
86
+ {
87
+ "id": "agree",
88
+ "component": "CheckBox",
89
+ "label": "I agree",
90
+ "value": {
91
+ "path": "/agree"
92
+ }
93
+ },
94
+ {
95
+ "id": "submit_label",
96
+ "component": "Text",
97
+ "text": "Submit"
98
+ },
99
+ {
100
+ "id": "submit",
101
+ "component": "Button",
102
+ "child": "submit_label",
103
+ "variant": "primary",
104
+ "action": {
105
+ "event": {
106
+ "name": "resume",
107
+ "context": {
108
+ "name": {
109
+ "path": "/name"
110
+ },
111
+ "when": {
112
+ "path": "/when"
113
+ },
114
+ "region": {
115
+ "path": "/region"
116
+ },
117
+ "agree": {
118
+ "path": "/agree"
119
+ }
120
+ }
121
+ }
122
+ }
123
+ }
124
+ ]
125
+ }
126
+ },
127
+ {
128
+ "version": "v0.9",
129
+ "updateDataModel": {
130
+ "surfaceId": "approve-brief",
131
+ "value": {
132
+ "name": "",
133
+ "when": "",
134
+ "region": [],
135
+ "agree": false
136
+ }
137
+ }
138
+ }
139
+ ]
140
+ }
@@ -0,0 +1,142 @@
1
+ {
2
+ "version": "v0.9",
3
+ "catalogId": "https://a2ui.org/specification/v0_9/catalogs/basic/catalog.json",
4
+ "surfaceId": "approve-brief",
5
+ "messages": [
6
+ {
7
+ "version": "v0.9",
8
+ "createSurface": {
9
+ "surfaceId": "approve-brief",
10
+ "catalogId": "https://a2ui.org/specification/v0_9/catalogs/basic/catalog.json",
11
+ "theme": {
12
+ "iconUrl": "https://evil.example/i.png"
13
+ }
14
+ }
15
+ },
16
+ {
17
+ "version": "v0.9",
18
+ "updateComponents": {
19
+ "surfaceId": "approve-brief",
20
+ "components": [
21
+ {
22
+ "id": "root",
23
+ "component": "Column",
24
+ "children": [
25
+ "h",
26
+ "name",
27
+ "when",
28
+ "region",
29
+ "agree",
30
+ "submit"
31
+ ]
32
+ },
33
+ {
34
+ "id": "h",
35
+ "component": "Text",
36
+ "text": "Launch brief",
37
+ "variant": "h2"
38
+ },
39
+ {
40
+ "id": "name",
41
+ "component": "TextField",
42
+ "label": "Product name",
43
+ "value": {
44
+ "path": "/name"
45
+ },
46
+ "checks": [
47
+ {
48
+ "condition": {
49
+ "call": "required",
50
+ "args": {
51
+ "value": {
52
+ "path": "/name"
53
+ }
54
+ }
55
+ },
56
+ "message": "Required"
57
+ }
58
+ ]
59
+ },
60
+ {
61
+ "id": "when",
62
+ "component": "DateTimeInput",
63
+ "label": "Launch date",
64
+ "value": {
65
+ "path": "/when"
66
+ },
67
+ "enableDate": true
68
+ },
69
+ {
70
+ "id": "region",
71
+ "component": "ChoicePicker",
72
+ "label": "Region",
73
+ "options": [
74
+ {
75
+ "label": "EU",
76
+ "value": "eu"
77
+ },
78
+ {
79
+ "label": "US",
80
+ "value": "us"
81
+ }
82
+ ],
83
+ "value": {
84
+ "path": "/region"
85
+ },
86
+ "variant": "mutuallyExclusive"
87
+ },
88
+ {
89
+ "id": "agree",
90
+ "component": "CheckBox",
91
+ "label": "I agree",
92
+ "value": {
93
+ "path": "/agree"
94
+ }
95
+ },
96
+ {
97
+ "id": "submit_label",
98
+ "component": "Text",
99
+ "text": "Submit"
100
+ },
101
+ {
102
+ "id": "submit",
103
+ "component": "Button",
104
+ "child": "submit_label",
105
+ "variant": "primary",
106
+ "action": {
107
+ "event": {
108
+ "name": "resume",
109
+ "context": {
110
+ "name": {
111
+ "path": "/name"
112
+ },
113
+ "when": {
114
+ "path": "/when"
115
+ },
116
+ "region": {
117
+ "path": "/region"
118
+ },
119
+ "agree": {
120
+ "path": "/agree"
121
+ }
122
+ }
123
+ }
124
+ }
125
+ }
126
+ ]
127
+ }
128
+ },
129
+ {
130
+ "version": "v0.9",
131
+ "updateDataModel": {
132
+ "surfaceId": "approve-brief",
133
+ "value": {
134
+ "name": "",
135
+ "when": "",
136
+ "region": [],
137
+ "agree": false
138
+ }
139
+ }
140
+ }
141
+ ]
142
+ }