@case-framework/survey-assistant 0.6.0 → 0.8.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.
- package/README.md +67 -7
- package/dist/{attachments-B0hg3vpT.mjs → attachments-BuNni5vB.mjs} +1 -1
- package/dist/{attachments-B0hg3vpT.mjs.map → attachments-BuNni5vB.mjs.map} +1 -1
- package/dist/{authoring-references-CW38pYzK.mjs → authoring-references-DbuOKerg.mjs} +13 -4
- package/dist/authoring-references-DbuOKerg.mjs.map +1 -0
- package/dist/{capabilities-DVTfogjv.d.mts → capabilities-CmeeAjEc.d.mts} +3 -4
- package/dist/capabilities-CmeeAjEc.d.mts.map +1 -0
- package/dist/capabilities-DCMA71PP.mjs +58 -0
- package/dist/capabilities-DCMA71PP.mjs.map +1 -0
- package/dist/capabilities-default.d.mts +13 -12
- package/dist/capabilities-default.d.mts.map +1 -1
- package/dist/capabilities-default.mjs +2 -414
- package/dist/{constants-BMGTgfjv.d.mts → constants-B6HzpEsx.d.mts} +7 -28
- package/dist/constants-B6HzpEsx.d.mts.map +1 -0
- package/dist/{constants-0UHGFcRJ.mjs → constants-Ct-vv9cu.mjs} +1 -1
- package/dist/{constants-0UHGFcRJ.mjs.map → constants-Ct-vv9cu.mjs.map} +1 -1
- package/dist/controller-proxy-D7uQfm5f.d.mts +65 -0
- package/dist/controller-proxy-D7uQfm5f.d.mts.map +1 -0
- package/dist/{controller-proxy-DMTqer6T.mjs → controller-proxy-DEeFl9IA.mjs} +29 -26
- package/dist/controller-proxy-DEeFl9IA.mjs.map +1 -0
- package/dist/default-fhSon2RM.mjs +760 -0
- package/dist/default-fhSon2RM.mjs.map +1 -0
- package/dist/{digest-SJmoYVaK.d.mts → digest-C39WyAWG.d.mts} +2 -3
- package/dist/digest-C39WyAWG.d.mts.map +1 -0
- package/dist/digest.d.mts +1 -1
- package/dist/digest.mjs.map +1 -1
- package/dist/{engine-CQwOAcwK.mjs → engine-nXoCWYpQ.mjs} +2821 -2018
- package/dist/engine-nXoCWYpQ.mjs.map +1 -0
- package/dist/engine.d.mts +3 -3
- package/dist/engine.mjs +3 -3
- package/dist/{fair-guidance-CRYCRxQm.mjs → fair-guidance-BmO4PswW.mjs} +1 -1
- package/dist/{fair-guidance-CRYCRxQm.mjs.map → fair-guidance-BmO4PswW.mjs.map} +1 -1
- package/dist/{index-D6nqkz0O.d.mts → index-Ciq7vHIs.d.mts} +121 -197
- package/dist/index-Ciq7vHIs.d.mts.map +1 -0
- package/dist/{index-DvTqML-0.d.mts → index-D7wT6P3t.d.mts} +294 -63
- package/dist/index-D7wT6P3t.d.mts.map +1 -0
- package/dist/index-WB5kfnz0.d.mts +348 -0
- package/dist/index-WB5kfnz0.d.mts.map +1 -0
- package/dist/{index-B0lxsAzx.d.mts → index-r5riv4md.d.mts} +50 -29
- package/dist/index-r5riv4md.d.mts.map +1 -0
- package/dist/{lifecycle-BmGAIUlv.d.mts → lifecycle-Dm8u7QFh.d.mts} +40 -18
- package/dist/lifecycle-Dm8u7QFh.d.mts.map +1 -0
- package/dist/{memory-thread-repository-CjFGVNZh.mjs → memory-thread-repository-DAnOGIB3.mjs} +89 -34
- package/dist/memory-thread-repository-DAnOGIB3.mjs.map +1 -0
- package/dist/{protocol-DJUP4gc0.mjs → protocol-CF4Bh_Ch.mjs} +182 -50
- package/dist/protocol-CF4Bh_Ch.mjs.map +1 -0
- package/dist/protocol.d.mts +4 -4
- package/dist/protocol.mjs +3 -3
- package/dist/react-C_GY-Fsc.mjs +1727 -0
- package/dist/react-C_GY-Fsc.mjs.map +1 -0
- package/dist/react-integration.d.mts +2 -2
- package/dist/react-integration.mjs +2 -2
- package/dist/react.d.mts +3 -3
- package/dist/react.mjs +3 -3
- package/dist/references/assistant-operations.md +143 -68
- package/dist/references/core-rules.md +6 -3
- package/dist/references/embedded-forms.md +34 -14
- package/dist/references/expressions.md +238 -48
- package/dist/references/fair-by-design.md +9 -9
- package/dist/references/item-types.md +306 -72
- package/dist/references/localization.md +5 -4
- package/dist/references/response-variables.md +38 -0
- package/dist/references/rich-text-content.md +60 -27
- package/dist/references/source-material-surveys.md +13 -5
- package/dist/references/survey-data-model.md +32 -9
- package/dist/{request-context-BjTHNcDd.mjs → request-context-Dg4jSwN1.mjs} +4 -10
- package/dist/request-context-Dg4jSwN1.mjs.map +1 -0
- package/dist/{request-guardrails-TmgQtqp4.mjs → request-guardrails-C0ugBOp0.mjs} +6 -5
- package/dist/request-guardrails-C0ugBOp0.mjs.map +1 -0
- package/dist/server-agent.d.mts +53 -44
- package/dist/server-agent.d.mts.map +1 -1
- package/dist/server-agent.mjs +48 -27
- package/dist/server-agent.mjs.map +1 -1
- package/dist/server-runtime.d.mts +36 -49
- package/dist/server-runtime.d.mts.map +1 -1
- package/dist/server-runtime.mjs +17 -12
- package/dist/server-runtime.mjs.map +1 -1
- package/dist/server-tasks.d.mts +2 -2
- package/dist/server-tasks.mjs +2 -313
- package/dist/server-tools.d.mts +1 -1
- package/dist/server-tools.mjs +1 -1
- package/dist/server.d.mts +13 -36
- package/dist/server.d.mts.map +1 -1
- package/dist/server.mjs +5 -5
- package/dist/server.mjs.map +1 -1
- package/dist/storage-postgres.d.mts +9 -25
- package/dist/storage-postgres.d.mts.map +1 -1
- package/dist/storage-postgres.mjs +5 -4
- package/dist/storage-postgres.mjs.map +1 -1
- package/dist/{tasks-DxzD25Zc.d.mts → tasks-B9h3LPam.d.mts} +19 -35
- package/dist/tasks-B9h3LPam.d.mts.map +1 -0
- package/dist/tasks-BZEiwgxA.mjs +396 -0
- package/dist/tasks-BZEiwgxA.mjs.map +1 -0
- package/dist/thread-documents-DrHbaXqP.d.mts +119 -0
- package/dist/thread-documents-DrHbaXqP.d.mts.map +1 -0
- package/dist/{thread-handlers-AbQbt4sX.d.mts → thread-handlers-Bef0td9N.d.mts} +10 -40
- package/dist/thread-handlers-Bef0td9N.d.mts.map +1 -0
- package/dist/{tools-CFh35R4d.mjs → tools-CEsv-WoO.mjs} +705 -578
- package/dist/tools-CEsv-WoO.mjs.map +1 -0
- package/dist/ui.css +1 -1
- package/dist/ui.d.mts +17 -55
- package/dist/ui.d.mts.map +1 -1
- package/dist/ui.mjs +759 -171
- package/dist/ui.mjs.map +1 -1
- package/docs/integration.md +51 -1
- package/package.json +49 -42
- package/dist/authoring-references-CW38pYzK.mjs.map +0 -1
- package/dist/capabilities-DVTfogjv.d.mts.map +0 -1
- package/dist/capabilities-default.mjs.map +0 -1
- package/dist/constants-BMGTgfjv.d.mts.map +0 -1
- package/dist/controller-proxy-DMTqer6T.mjs.map +0 -1
- package/dist/controller-proxy-mRvez2qw.d.mts +0 -85
- package/dist/controller-proxy-mRvez2qw.d.mts.map +0 -1
- package/dist/digest-SJmoYVaK.d.mts.map +0 -1
- package/dist/engine-CQwOAcwK.mjs.map +0 -1
- package/dist/form-authoring-kQDgC5oz.mjs +0 -155
- package/dist/form-authoring-kQDgC5oz.mjs.map +0 -1
- package/dist/index-B0lxsAzx.d.mts.map +0 -1
- package/dist/index-BS-Xjk1h.d.mts +0 -224
- package/dist/index-BS-Xjk1h.d.mts.map +0 -1
- package/dist/index-D6nqkz0O.d.mts.map +0 -1
- package/dist/index-DvTqML-0.d.mts.map +0 -1
- package/dist/lifecycle-BmGAIUlv.d.mts.map +0 -1
- package/dist/memory-thread-repository-CjFGVNZh.mjs.map +0 -1
- package/dist/protocol-DJUP4gc0.mjs.map +0 -1
- package/dist/react-Dqlmasrs.mjs +0 -768
- package/dist/react-Dqlmasrs.mjs.map +0 -1
- package/dist/request-context-BjTHNcDd.mjs.map +0 -1
- package/dist/request-guardrails-TmgQtqp4.mjs.map +0 -1
- package/dist/server-tasks.mjs.map +0 -1
- package/dist/tasks-DxzD25Zc.d.mts.map +0 -1
- package/dist/thread-documents-rmd6nyX9.d.mts +0 -107
- package/dist/thread-documents-rmd6nyX9.d.mts.map +0 -1
- package/dist/thread-handlers-AbQbt4sX.d.mts.map +0 -1
- package/dist/tools-CFh35R4d.mjs.map +0 -1
|
@@ -1,414 +1,2 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
|
|
3
|
-
//#region src/capabilities/default.ts
|
|
4
|
-
const COMMON_OPERATIONS = [
|
|
5
|
-
"create-item",
|
|
6
|
-
"update-item-key",
|
|
7
|
-
"update-item-label",
|
|
8
|
-
"update-item-color",
|
|
9
|
-
"update-item-translation",
|
|
10
|
-
"update-placed-image",
|
|
11
|
-
"patch-item-config",
|
|
12
|
-
"remove-item",
|
|
13
|
-
"move-item",
|
|
14
|
-
"survey-json-patch"
|
|
15
|
-
];
|
|
16
|
-
const QUESTION_CONTENT_SURFACES = [
|
|
17
|
-
{
|
|
18
|
-
key: "title",
|
|
19
|
-
role: "primary",
|
|
20
|
-
format: "rich",
|
|
21
|
-
requiredOnCreate: true,
|
|
22
|
-
aliases: [
|
|
23
|
-
"content",
|
|
24
|
-
"label",
|
|
25
|
-
"prompt",
|
|
26
|
-
"question",
|
|
27
|
-
"text"
|
|
28
|
-
]
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
key: "subtitle",
|
|
32
|
-
role: "secondary",
|
|
33
|
-
format: "rich",
|
|
34
|
-
aliases: ["subheading", "subtext"]
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
key: "topContent",
|
|
38
|
-
role: "secondary",
|
|
39
|
-
format: "rich",
|
|
40
|
-
aliases: ["preContent", "preResponse"]
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
key: "bottomContent",
|
|
44
|
-
role: "secondary",
|
|
45
|
-
format: "rich",
|
|
46
|
-
aliases: ["postContent", "postResponse"]
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
key: "cardFooter",
|
|
50
|
-
role: "secondary",
|
|
51
|
-
format: "rich",
|
|
52
|
-
aliases: ["footer"]
|
|
53
|
-
}
|
|
54
|
-
];
|
|
55
|
-
const FIELD_CONTENT_SURFACES = [
|
|
56
|
-
"label",
|
|
57
|
-
"description",
|
|
58
|
-
"error",
|
|
59
|
-
"placeholder",
|
|
60
|
-
"unit",
|
|
61
|
-
"checkedLabel",
|
|
62
|
-
"uncheckedLabel"
|
|
63
|
-
].map((key) => ({
|
|
64
|
-
key: `fields.<fieldId>.${key}`,
|
|
65
|
-
role: key === "error" ? "validation" : "field",
|
|
66
|
-
format: "rich",
|
|
67
|
-
pattern: true
|
|
68
|
-
}));
|
|
69
|
-
const createManifest = (manifest) => ({
|
|
70
|
-
capabilityVersion: "1",
|
|
71
|
-
...manifest
|
|
72
|
-
});
|
|
73
|
-
const STRUCTURE_REFERENCE = {
|
|
74
|
-
topic: "item-types",
|
|
75
|
-
markdown: "Groups are containers. Create a group without child ids, then create or move children through separate operations. Page breaks are standalone structural boundaries."
|
|
76
|
-
};
|
|
77
|
-
const QUESTION_REFERENCE = {
|
|
78
|
-
topic: "item-types",
|
|
79
|
-
markdown: "Question titles and supporting text are translations. Configuration stores response behavior; respondent-visible option and field labels use the declared dynamic content surfaces."
|
|
80
|
-
};
|
|
81
|
-
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
82
|
-
const withMaterializedConfig = (item, defaults) => ({
|
|
83
|
-
...item,
|
|
84
|
-
config: {
|
|
85
|
-
...defaults,
|
|
86
|
-
...isRecord(item.config) ? item.config : {}
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
const materializeGroupCreate = (item) => withMaterializedConfig(item, {
|
|
90
|
-
items: [],
|
|
91
|
-
shuffleItems: false
|
|
92
|
-
});
|
|
93
|
-
const materializeEmptyConfigCreate = (item) => withMaterializedConfig(item, {});
|
|
94
|
-
const materializeChoiceCreate = (item) => normalizeEmbeddedFormAuthoringModes({
|
|
95
|
-
...item,
|
|
96
|
-
config: {
|
|
97
|
-
...isRecord(item.config) ? item.config : {},
|
|
98
|
-
id: item.id,
|
|
99
|
-
maxSelection: isRecord(item.config) && "maxSelection" in item.config ? item.config.maxSelection : 1,
|
|
100
|
-
shuffleOptions: isRecord(item.config) && "shuffleOptions" in item.config ? item.config.shuffleOptions : false,
|
|
101
|
-
options: isRecord(item.config) && Array.isArray(item.config.options) ? item.config.options : []
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
const materializeFormCreate = (item) => ({
|
|
105
|
-
...item,
|
|
106
|
-
config: normalizeFormAuthoringConfig({
|
|
107
|
-
fieldGroups: [],
|
|
108
|
-
...isRecord(item.config) ? item.config : {},
|
|
109
|
-
id: item.id
|
|
110
|
-
})
|
|
111
|
-
});
|
|
112
|
-
const getFieldValueType = (field) => {
|
|
113
|
-
switch (field.type) {
|
|
114
|
-
case "number":
|
|
115
|
-
case "slider": return ValueType.number;
|
|
116
|
-
case "datepicker": return ValueType.date;
|
|
117
|
-
case "switch": return ValueType.boolean;
|
|
118
|
-
default: return ValueType.string;
|
|
119
|
-
}
|
|
120
|
-
};
|
|
121
|
-
const deriveFormResponseSlots = (config, prefix) => {
|
|
122
|
-
if (!isRecord(config) || !Array.isArray(config.fieldGroups)) return {};
|
|
123
|
-
const slots = {};
|
|
124
|
-
for (const group of config.fieldGroups.filter(isRecord)) {
|
|
125
|
-
if (!Array.isArray(group.fields)) continue;
|
|
126
|
-
for (const field of group.fields.filter(isRecord)) {
|
|
127
|
-
if (typeof field.key !== "string" || field.key.length === 0) continue;
|
|
128
|
-
slots[prefix ? `${prefix}.${field.key}` : field.key] = getFieldValueType(field);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
return slots;
|
|
132
|
-
};
|
|
133
|
-
const deriveChoiceResponseSlots = (item) => {
|
|
134
|
-
const config = isRecord(item.config) ? item.config : {};
|
|
135
|
-
const slots = { [typeof config.id === "string" && config.id.length > 0 ? config.id : item.id]: config.maxSelection === 1 ? ValueType.reference : ValueType.referenceArray };
|
|
136
|
-
if (Array.isArray(config.options)) for (const option of config.options.filter(isRecord)) {
|
|
137
|
-
if (typeof option.id !== "string" || !option.embeddedForm) continue;
|
|
138
|
-
Object.assign(slots, deriveFormResponseSlots(option.embeddedForm, `embedded.${option.id}`));
|
|
139
|
-
}
|
|
140
|
-
return slots;
|
|
141
|
-
};
|
|
142
|
-
const normalizeEmbeddedFormAuthoringModes = (item) => {
|
|
143
|
-
if (!isRecord(item.config) || !Array.isArray(item.config.options)) return item;
|
|
144
|
-
return {
|
|
145
|
-
...item,
|
|
146
|
-
config: {
|
|
147
|
-
...item.config,
|
|
148
|
-
options: item.config.options.map((option) => {
|
|
149
|
-
if (!isRecord(option) || !isRecord(option.embeddedForm)) return option;
|
|
150
|
-
return {
|
|
151
|
-
...option,
|
|
152
|
-
embeddedForm: normalizeFormAuthoringConfig(option.embeddedForm)
|
|
153
|
-
};
|
|
154
|
-
})
|
|
155
|
-
}
|
|
156
|
-
};
|
|
157
|
-
};
|
|
158
|
-
const getSimpleFormValidationIssues = (config, subject) => isValidSimpleFormConfig(config) ? [] : [{
|
|
159
|
-
severity: "error",
|
|
160
|
-
code: "invalid-simple-form-structure",
|
|
161
|
-
message: `${subject} with authoringMode "simple" must contain one single-column field group without group display behavior and exactly one supported field whose controller type matches the field type. Use authoringMode "custom" for any other structure.`
|
|
162
|
-
}];
|
|
163
|
-
const rootItemAssistantCapability = { manifest: createManifest({
|
|
164
|
-
itemType: "root",
|
|
165
|
-
displayName: "Survey root",
|
|
166
|
-
description: "The existing root container. A second root cannot be created.",
|
|
167
|
-
create: "unsupported",
|
|
168
|
-
supportedOperations: [
|
|
169
|
-
"update-item-key",
|
|
170
|
-
"update-item-label",
|
|
171
|
-
"update-item-color"
|
|
172
|
-
],
|
|
173
|
-
contentSurfaces: [],
|
|
174
|
-
referenceTopics: ["survey-data-model", "item-types"]
|
|
175
|
-
}) };
|
|
176
|
-
const groupItemAssistantCapability = {
|
|
177
|
-
manifest: createManifest({
|
|
178
|
-
itemType: "group",
|
|
179
|
-
displayName: "Group",
|
|
180
|
-
description: "A structural container whose children are created as separate items.",
|
|
181
|
-
defaultItemKeyPrefix: "group",
|
|
182
|
-
create: "deterministic",
|
|
183
|
-
supportedOperations: [...COMMON_OPERATIONS, "reorder-items"],
|
|
184
|
-
contentSurfaces: [{
|
|
185
|
-
key: "title",
|
|
186
|
-
role: "primary",
|
|
187
|
-
format: "rich",
|
|
188
|
-
aliases: [
|
|
189
|
-
"content",
|
|
190
|
-
"label",
|
|
191
|
-
"name",
|
|
192
|
-
"text"
|
|
193
|
-
]
|
|
194
|
-
}],
|
|
195
|
-
referenceTopics: ["survey-data-model", "item-types"]
|
|
196
|
-
}),
|
|
197
|
-
references: [STRUCTURE_REFERENCE],
|
|
198
|
-
normalizeCreate: materializeGroupCreate
|
|
199
|
-
};
|
|
200
|
-
const pageBreakItemAssistantCapability = {
|
|
201
|
-
manifest: createManifest({
|
|
202
|
-
itemType: "page-break",
|
|
203
|
-
displayName: "Page break",
|
|
204
|
-
description: "A structural page boundary.",
|
|
205
|
-
defaultItemKeyPrefix: "page",
|
|
206
|
-
create: "deterministic",
|
|
207
|
-
supportedOperations: COMMON_OPERATIONS,
|
|
208
|
-
contentSurfaces: [{
|
|
209
|
-
key: "title",
|
|
210
|
-
role: "primary",
|
|
211
|
-
format: "rich",
|
|
212
|
-
aliases: [
|
|
213
|
-
"content",
|
|
214
|
-
"label",
|
|
215
|
-
"name",
|
|
216
|
-
"text"
|
|
217
|
-
]
|
|
218
|
-
}],
|
|
219
|
-
referenceTopics: ["survey-data-model", "item-types"]
|
|
220
|
-
}),
|
|
221
|
-
references: [STRUCTURE_REFERENCE],
|
|
222
|
-
normalizeCreate: materializeEmptyConfigCreate
|
|
223
|
-
};
|
|
224
|
-
const infoItemAssistantCapability = {
|
|
225
|
-
manifest: createManifest({
|
|
226
|
-
itemType: "infoItem",
|
|
227
|
-
displayName: "Info",
|
|
228
|
-
description: "Display-only formatted content without a response slot.",
|
|
229
|
-
defaultItemKeyPrefix: "info",
|
|
230
|
-
create: "deterministic",
|
|
231
|
-
supportedOperations: COMMON_OPERATIONS,
|
|
232
|
-
contentSurfaces: [{
|
|
233
|
-
key: "content",
|
|
234
|
-
role: "primary",
|
|
235
|
-
format: "rich",
|
|
236
|
-
requiredOnCreate: true,
|
|
237
|
-
aliases: [
|
|
238
|
-
"body",
|
|
239
|
-
"label",
|
|
240
|
-
"prompt",
|
|
241
|
-
"question",
|
|
242
|
-
"text",
|
|
243
|
-
"title"
|
|
244
|
-
]
|
|
245
|
-
}],
|
|
246
|
-
referenceTopics: ["item-types", "rich-text-content"]
|
|
247
|
-
}),
|
|
248
|
-
references: [{
|
|
249
|
-
topic: "rich-text-content",
|
|
250
|
-
markdown: "Info content uses the rich `content` surface. Markdown strings are not parsed; send structured rich text when formatting matters."
|
|
251
|
-
}],
|
|
252
|
-
normalizeCreate: materializeEmptyConfigCreate
|
|
253
|
-
};
|
|
254
|
-
const choiceItemAssistantCapability = {
|
|
255
|
-
manifest: createManifest({
|
|
256
|
-
itemType: "choiceItem",
|
|
257
|
-
displayName: "Choice question",
|
|
258
|
-
description: "A single- or multiple-choice question with optional embedded forms.",
|
|
259
|
-
defaultItemKeyPrefix: "choice",
|
|
260
|
-
create: "deterministic",
|
|
261
|
-
supportedOperations: [
|
|
262
|
-
...COMMON_OPERATIONS,
|
|
263
|
-
"add-choice-option",
|
|
264
|
-
"update-choice-option-label",
|
|
265
|
-
"remove-choice-option",
|
|
266
|
-
"reorder-choice-options",
|
|
267
|
-
"upsert-form-field-group",
|
|
268
|
-
"remove-form-field-group",
|
|
269
|
-
"reorder-form-field-groups",
|
|
270
|
-
"upsert-form-field",
|
|
271
|
-
"remove-form-field",
|
|
272
|
-
"move-form-field",
|
|
273
|
-
"set-embedded-form",
|
|
274
|
-
"remove-embedded-form"
|
|
275
|
-
],
|
|
276
|
-
contentSurfaces: [
|
|
277
|
-
...QUESTION_CONTENT_SURFACES,
|
|
278
|
-
{
|
|
279
|
-
key: "options.<optionId>.label",
|
|
280
|
-
role: "option",
|
|
281
|
-
format: "rich",
|
|
282
|
-
pattern: true
|
|
283
|
-
},
|
|
284
|
-
...FIELD_CONTENT_SURFACES.map((surface) => ({
|
|
285
|
-
...surface,
|
|
286
|
-
key: `embeddedForms.<optionId>.${surface.key}`
|
|
287
|
-
})),
|
|
288
|
-
{
|
|
289
|
-
key: "embeddedForms.<optionId>.fields.<fieldId>.options.<optionId>.label",
|
|
290
|
-
role: "option",
|
|
291
|
-
format: "rich",
|
|
292
|
-
pattern: true
|
|
293
|
-
},
|
|
294
|
-
{
|
|
295
|
-
key: "embeddedForms.<optionId>.fields.<fieldId>.validations.<validationId>.message",
|
|
296
|
-
role: "validation",
|
|
297
|
-
format: "rich",
|
|
298
|
-
pattern: true
|
|
299
|
-
},
|
|
300
|
-
{
|
|
301
|
-
key: "embeddedForms.<optionId>.fieldGroups.<groupId>.title",
|
|
302
|
-
role: "field",
|
|
303
|
-
format: "rich",
|
|
304
|
-
pattern: true
|
|
305
|
-
},
|
|
306
|
-
{
|
|
307
|
-
key: "embeddedForms.<optionId>.fieldGroups.<groupId>.description",
|
|
308
|
-
role: "field",
|
|
309
|
-
format: "rich",
|
|
310
|
-
pattern: true
|
|
311
|
-
}
|
|
312
|
-
],
|
|
313
|
-
responseSlots: [{
|
|
314
|
-
key: "<responseId>",
|
|
315
|
-
valueType: "reference|referenceArray"
|
|
316
|
-
}],
|
|
317
|
-
referenceTopics: [
|
|
318
|
-
"item-types",
|
|
319
|
-
"embedded-forms",
|
|
320
|
-
"localization",
|
|
321
|
-
"expressions",
|
|
322
|
-
"rich-text-content"
|
|
323
|
-
],
|
|
324
|
-
authoring: {
|
|
325
|
-
compactHint: "presets choice.single=maxSelection 1; choice.multiple=maxSelection null; embedded one supported field=simple; embedded blank/structured=custom",
|
|
326
|
-
configSummary: "Config stores id, maxSelection, shuffleOptions, and options. Put every initial option and inline embeddedForm in create-item config; choice option operations edit only choice items already present in the live snapshot. Default an eligible one-field embedded form to authoringMode simple; use custom for blank or structured follow-ups. Embedded field content uses embeddedForms.<choiceOption.id> (case-sensitive), never the option key or embeddedForm id. Form layout values are column counts 1-4; one column makes a lone field full width."
|
|
327
|
-
}
|
|
328
|
-
}),
|
|
329
|
-
references: [QUESTION_REFERENCE],
|
|
330
|
-
normalizeCreate: materializeChoiceCreate,
|
|
331
|
-
validateItem: (item) => {
|
|
332
|
-
if (!isRecord(item.config) || !Array.isArray(item.config.options)) return [];
|
|
333
|
-
return item.config.options.flatMap((option) => isRecord(option) && isRecord(option.embeddedForm) ? getSimpleFormValidationIssues(option.embeddedForm, "An embedded form") : []);
|
|
334
|
-
},
|
|
335
|
-
deriveResponseSlots: deriveChoiceResponseSlots
|
|
336
|
-
};
|
|
337
|
-
const formItemAssistantCapability = {
|
|
338
|
-
manifest: createManifest({
|
|
339
|
-
itemType: "formItem",
|
|
340
|
-
displayName: "Form",
|
|
341
|
-
description: "A form with groups, typed fields, validations, and select options.",
|
|
342
|
-
defaultItemKeyPrefix: "form",
|
|
343
|
-
create: "deterministic",
|
|
344
|
-
supportedOperations: [
|
|
345
|
-
...COMMON_OPERATIONS,
|
|
346
|
-
"upsert-form-field-group",
|
|
347
|
-
"remove-form-field-group",
|
|
348
|
-
"reorder-form-field-groups",
|
|
349
|
-
"upsert-form-field",
|
|
350
|
-
"remove-form-field",
|
|
351
|
-
"move-form-field"
|
|
352
|
-
],
|
|
353
|
-
contentSurfaces: [
|
|
354
|
-
...QUESTION_CONTENT_SURFACES,
|
|
355
|
-
{
|
|
356
|
-
key: "fieldGroups.<groupId>.title",
|
|
357
|
-
role: "field",
|
|
358
|
-
format: "rich",
|
|
359
|
-
pattern: true
|
|
360
|
-
},
|
|
361
|
-
{
|
|
362
|
-
key: "fieldGroups.<groupId>.description",
|
|
363
|
-
role: "field",
|
|
364
|
-
format: "rich",
|
|
365
|
-
pattern: true
|
|
366
|
-
},
|
|
367
|
-
...FIELD_CONTENT_SURFACES,
|
|
368
|
-
{
|
|
369
|
-
key: "fields.<fieldId>.options.<optionId>.label",
|
|
370
|
-
role: "option",
|
|
371
|
-
format: "rich",
|
|
372
|
-
pattern: true
|
|
373
|
-
},
|
|
374
|
-
{
|
|
375
|
-
key: "fields.<fieldId>.validations.<validationId>.message",
|
|
376
|
-
role: "validation",
|
|
377
|
-
format: "rich",
|
|
378
|
-
pattern: true
|
|
379
|
-
}
|
|
380
|
-
],
|
|
381
|
-
responseSlots: [{
|
|
382
|
-
key: "<fieldKey>",
|
|
383
|
-
valueType: "field-dependent"
|
|
384
|
-
}],
|
|
385
|
-
referenceTopics: [
|
|
386
|
-
"item-types",
|
|
387
|
-
"localization",
|
|
388
|
-
"expressions",
|
|
389
|
-
"rich-text-content"
|
|
390
|
-
],
|
|
391
|
-
authoring: {
|
|
392
|
-
compactHint: "presets form.text=input|form.long-text=textarea|form.number=number|form.slider=slider|form.dropdown=select|form.date=datepicker|form.switch=switch; form.blank=custom",
|
|
393
|
-
configSummary: "Config stores authoringMode and fieldGroups with typed fields. Use authoringMode \"simple\" only for exactly one internal group with exactly one field: text=input, long text=textarea, number=number, slider=slider, dropdown=select, date=datepicker, switch=switch. Use \"custom\" for blank or multi-field forms. Structural changes are a one-way transition to custom. The controller type must match the field type; full date uses datepicker/year-month-day. Layout values are column counts 1-4, not spans."
|
|
394
|
-
}
|
|
395
|
-
}),
|
|
396
|
-
references: [QUESTION_REFERENCE],
|
|
397
|
-
normalizeCreate: materializeFormCreate,
|
|
398
|
-
validateItem: (item) => getSimpleFormValidationIssues(item.config, "A formItem"),
|
|
399
|
-
deriveResponseSlots: (item) => deriveFormResponseSlots(item.config)
|
|
400
|
-
};
|
|
401
|
-
const defaultSurveyAssistantCapabilities = [
|
|
402
|
-
rootItemAssistantCapability,
|
|
403
|
-
groupItemAssistantCapability,
|
|
404
|
-
pageBreakItemAssistantCapability,
|
|
405
|
-
infoItemAssistantCapability,
|
|
406
|
-
choiceItemAssistantCapability,
|
|
407
|
-
formItemAssistantCapability
|
|
408
|
-
];
|
|
409
|
-
const defaultSurveyAssistantCapabilitySet = createSurveyAssistantCapabilities(defaultSurveyAssistantCapabilities);
|
|
410
|
-
const getDefaultSurveyAssistantCapability = (itemType) => defaultSurveyAssistantCapabilitySet.byItemType.get(itemType);
|
|
411
|
-
//#endregion
|
|
412
|
-
export { choiceItemAssistantCapability, defaultSurveyAssistantCapabilities, defaultSurveyAssistantCapabilitySet, formItemAssistantCapability, getDefaultSurveyAssistantCapability, groupItemAssistantCapability, infoItemAssistantCapability, pageBreakItemAssistantCapability, rootItemAssistantCapability };
|
|
413
|
-
|
|
414
|
-
//# sourceMappingURL=capabilities-default.mjs.map
|
|
1
|
+
import { a as defaultSurveyAssistantCapabilitySet, c as getDefaultSurveyAssistantCapability, d as pageBreakItemAssistantCapability, f as rootItemAssistantCapability, i as defaultSurveyAssistantCapabilities, l as groupItemAssistantCapability, n as choiceMatrixAssistantCapability, o as formItemAssistantCapability, r as consentItemAssistantCapability, s as formMatrixAssistantCapability, t as choiceItemAssistantCapability, u as infoItemAssistantCapability } from "./default-fhSon2RM.mjs";
|
|
2
|
+
export { choiceItemAssistantCapability, choiceMatrixAssistantCapability, consentItemAssistantCapability, defaultSurveyAssistantCapabilities, defaultSurveyAssistantCapabilitySet, formItemAssistantCapability, formMatrixAssistantCapability, getDefaultSurveyAssistantCapability, groupItemAssistantCapability, infoItemAssistantCapability, pageBreakItemAssistantCapability, rootItemAssistantCapability };
|
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import "./index-D7wT6P3t.mjs";
|
|
2
|
+
import { St as SurveyDocumentVersion, o as SurveyAssistantApplyOutcome, xt as SurveyDocumentSnapshot } from "./lifecycle-Dm8u7QFh.mjs";
|
|
3
|
+
import { Pt as SurveyAssistantEngineContext, qt as SurveyAssistantCapabilitySet, x as TurnSurveyDraft } from "./index-Ciq7vHIs.mjs";
|
|
4
|
+
import { r as SurveyAssistantModelAttachment, t as SurveyAssistantAttachmentAccess } from "./thread-documents-DrHbaXqP.mjs";
|
|
4
5
|
import { RequestContext } from "@mastra/core/request-context";
|
|
5
6
|
import { AgentExecutionOptions } from "@mastra/core/agent";
|
|
6
7
|
import { OpenAICompatibleConfig } from "@mastra/core/llm";
|
|
7
|
-
|
|
8
8
|
//#region src/server/request-context.d.ts
|
|
9
|
-
interface SurveyAssistantInvocationContext {
|
|
10
|
-
kind: "chat";
|
|
11
|
-
}
|
|
12
9
|
interface SurveyAssistantIdentityContext {
|
|
13
10
|
authority: "experimental-client-request" | "authenticated-host";
|
|
14
11
|
resourceId: string;
|
|
@@ -41,18 +38,13 @@ type SurveyAssistantDocumentTransition = {
|
|
|
41
38
|
capabilitiesChanged: boolean;
|
|
42
39
|
};
|
|
43
40
|
interface SurveyAssistantRequestContext {
|
|
44
|
-
invocation: SurveyAssistantInvocationContext;
|
|
45
41
|
turnId: string;
|
|
46
42
|
turnDraft: TurnSurveyDraft;
|
|
47
43
|
identity: SurveyAssistantIdentityContext;
|
|
48
|
-
authenticatedResourceId?: string;
|
|
49
|
-
authorizedThreadId?: string;
|
|
50
|
-
applyPolicy?: "auto" | "review" | "deny";
|
|
51
44
|
mastra__resourceId?: string;
|
|
52
45
|
mastra__threadId?: string;
|
|
53
46
|
documentTransition?: SurveyAssistantDocumentTransition;
|
|
54
47
|
engineContext?: SurveyAssistantEngineContext;
|
|
55
|
-
documentSnapshot?: SurveyDocumentSnapshot;
|
|
56
48
|
modelAttachments?: SurveyAssistantModelAttachment[];
|
|
57
49
|
attachmentAccess?: SurveyAssistantAttachmentAccess;
|
|
58
50
|
modelSelection?: SurveyAssistantModelSelection;
|
|
@@ -61,24 +53,11 @@ interface SurveyAssistantRequestContext {
|
|
|
61
53
|
declare const parseSurveyAssistantSnapshot: (value: unknown) => SurveyDocumentSnapshot | null;
|
|
62
54
|
declare const parseSurveyAssistantPreviousSettledVersion: (value: unknown) => SurveyDocumentVersion | null;
|
|
63
55
|
declare const parseSurveyAssistantPreviousApplyOutcome: (value: unknown) => SurveyAssistantApplyOutcome | null;
|
|
64
|
-
declare const deriveSurveyAssistantDocumentTransition: ({
|
|
65
|
-
current,
|
|
66
|
-
previous
|
|
67
|
-
}: {
|
|
56
|
+
declare const deriveSurveyAssistantDocumentTransition: ({ current, previous }: {
|
|
68
57
|
current: SurveyDocumentSnapshot | null;
|
|
69
58
|
previous: SurveyDocumentVersion | null;
|
|
70
59
|
}) => SurveyAssistantDocumentTransition | undefined;
|
|
71
|
-
declare const buildSurveyAssistantRequestContext: ({
|
|
72
|
-
turnDraft,
|
|
73
|
-
identity,
|
|
74
|
-
snapshot,
|
|
75
|
-
previousSettledVersion,
|
|
76
|
-
trustedCapabilities,
|
|
77
|
-
attachmentAccess,
|
|
78
|
-
modelAttachments,
|
|
79
|
-
modelSelection,
|
|
80
|
-
previousApplyOutcome
|
|
81
|
-
}: {
|
|
60
|
+
declare const buildSurveyAssistantRequestContext: ({ turnDraft, identity, snapshot, previousSettledVersion, trustedCapabilities, attachmentAccess, modelAttachments, modelSelection, previousApplyOutcome }: {
|
|
82
61
|
turnDraft: TurnSurveyDraft;
|
|
83
62
|
identity: SurveyAssistantIdentityContext;
|
|
84
63
|
snapshot: SurveyDocumentSnapshot | null;
|
|
@@ -99,4 +78,4 @@ declare const SURVEY_ASSISTANT_AGENT_ID = "survey-assistant-agent";
|
|
|
99
78
|
declare const SURVEY_ASSISTANT_TASK_AGENT_ID = "survey-assistant-task-agent";
|
|
100
79
|
//#endregion
|
|
101
80
|
export { SurveyAssistantModelSelection as a, deriveSurveyAssistantDocumentTransition as c, parseSurveyAssistantSnapshot as d, requireSurveyAssistantTurnState as f, SurveyAssistantIdentityContext as i, parseSurveyAssistantPreviousApplyOutcome as l, SURVEY_ASSISTANT_TASK_AGENT_ID as n, SurveyAssistantRequestContext as o, SurveyAssistantDocumentTransition as r, buildSurveyAssistantRequestContext as s, SURVEY_ASSISTANT_AGENT_ID as t, parseSurveyAssistantPreviousSettledVersion as u };
|
|
102
|
-
//# sourceMappingURL=constants-
|
|
81
|
+
//# sourceMappingURL=constants-B6HzpEsx.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants-B6HzpEsx.d.mts","names":[],"sources":["../src/server/request-context.ts","../src/server/constants.ts"],"mappings":";;;;;;;;UA2BiB;EACf;EACA;EACA;EACA;;UAGe;EACf;EACA,gBAAgB;EAChB;EACA,kBAAkB;;KAGR;EACN;;EAEA;EACA;EACA;;EAGA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA,iBAAiB;EACjB;;UAGW;EACf;EACA,WAAW;EACX,UAAU;EACV;EACA;EACA,qBAAqB;EACrB,gBAAgB;EAChB,mBAAmB;EACnB,mBAAmB;EACnB,iBAAiB;EACjB,uBAAuB;;cAGZ,+BAAgC,mBAAiB;cAQjD,6CACX,mBACC;cAQU,2CACX,mBACC;cAQU,4CAA2C,SAAA;EAItD,SAAS;EACT,UAAU;MACR;cAqDS,uCAAsC,WAAA,UAAA,UAAA,wBAAA,qBAAA,kBAAA,kBAAA,gBAAA;EAWjD,WAAW;EACX,UAAU;EACV,UAAU;EACV,yBAAyB;EACzB,sBAAsB;EACtB,mBAAmB;EACnB,mBAAmB;EACnB,iBAAiB;EACjB,uBAAuB;MACrB,eAAe;cAiDN,kCACX,gBAAgB,eAAe;;;;;;cC1OpB;cACA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants-
|
|
1
|
+
{"version":3,"file":"constants-Ct-vv9cu.mjs","names":[],"sources":["../src/server/constants.ts"],"sourcesContent":["export const SURVEY_ASSISTANT_AGENT_ID = \"survey-assistant-agent\";\nexport const SURVEY_ASSISTANT_TASK_AGENT_ID = \"survey-assistant-task-agent\";\n"],"mappings":";AAAA,MAAa,4BAA4B;AACzC,MAAa,iCAAiC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { G as SurveyAssistantThread, b as SurveyAssistantTranslateContentInput, c as SurveyAssistantSuggestItemLabelInput, d as SurveyAssistantSuggestResponseNameResult, f as SurveyAssistantSuggestResponseSettingsInput, g as SurveyAssistantTaskInvocationMode, h as SurveyAssistantTaskContext, l as SurveyAssistantSuggestItemLabelResult, p as SurveyAssistantSuggestResponseSettingsResult, u as SurveyAssistantSuggestResponseNameInput, x as SurveyAssistantTranslateContentResult } from "./index-D7wT6P3t.mjs";
|
|
2
|
+
import { Ct as SurveyEditorUIContext, h as SurveyChangeSet, m as SurveyBatchApplyResult, yt as SurveyAssistantSnapshot } from "./lifecycle-Dm8u7QFh.mjs";
|
|
3
|
+
import { FileUIPart } from "ai";
|
|
4
|
+
//#region src/react/thread-launcher.d.ts
|
|
5
|
+
type SurveyAssistantLaunchUIContext = Partial<Omit<SurveyEditorUIContext, "history">>;
|
|
6
|
+
interface SurveyAssistantThreadLaunch {
|
|
7
|
+
/** User-visible prompt submitted as the first message in the new thread. */
|
|
8
|
+
prompt: string;
|
|
9
|
+
files?: FileUIPart[];
|
|
10
|
+
/** Optional model used for the opening assistant turn. */
|
|
11
|
+
modelId?: string;
|
|
12
|
+
/** Optional manual thread title. The prompt-derived automatic title is used by default. */
|
|
13
|
+
title?: string;
|
|
14
|
+
/** Turn-local editor context merged into the snapshot captured when the prompt is submitted. */
|
|
15
|
+
uiContext?: SurveyAssistantLaunchUIContext;
|
|
16
|
+
}
|
|
17
|
+
interface SurveyAssistantThreadLauncher {
|
|
18
|
+
/**
|
|
19
|
+
* Creates a new thread and submits its first prompt when a connected panel is ready.
|
|
20
|
+
* Calls made before the panel mounts are queued.
|
|
21
|
+
*/
|
|
22
|
+
startThread(input: SurveyAssistantThreadLaunch): Promise<SurveyAssistantThread>;
|
|
23
|
+
}
|
|
24
|
+
declare const createSurveyAssistantThreadLauncher: () => SurveyAssistantThreadLauncher;
|
|
25
|
+
//#endregion
|
|
26
|
+
//#region src/react/controller.d.ts
|
|
27
|
+
interface SurveyAssistantController {
|
|
28
|
+
/** Snapshot version.sessionId identifies the editor document session, independently of this wrapper's identity. */
|
|
29
|
+
getSnapshot(): SurveyAssistantSnapshot | null;
|
|
30
|
+
/** Applies the authorized turn, including a one-change turn, and returns one result per change. */
|
|
31
|
+
applyAssistantChanges(changes: SurveyChangeSet[]): SurveyBatchApplyResult;
|
|
32
|
+
}
|
|
33
|
+
//#endregion
|
|
34
|
+
//#region src/react/task-client.d.ts
|
|
35
|
+
interface SurveyAssistantTaskClientOptions {
|
|
36
|
+
api?: string;
|
|
37
|
+
resourceId?: string;
|
|
38
|
+
surveyId?: string;
|
|
39
|
+
}
|
|
40
|
+
interface SurveyAssistantTaskExecutionOptions {
|
|
41
|
+
mode?: SurveyAssistantTaskInvocationMode;
|
|
42
|
+
modelId?: string;
|
|
43
|
+
signal?: AbortSignal;
|
|
44
|
+
}
|
|
45
|
+
interface SurveyAssistantTaskClient {
|
|
46
|
+
suggestResponseSettings(input: SurveyAssistantSuggestResponseSettingsInput, context: SurveyAssistantTaskContext, options?: SurveyAssistantTaskExecutionOptions): Promise<SurveyAssistantSuggestResponseSettingsResult>;
|
|
47
|
+
suggestResponseName(input: SurveyAssistantSuggestResponseNameInput, context: SurveyAssistantTaskContext, options?: SurveyAssistantTaskExecutionOptions): Promise<SurveyAssistantSuggestResponseNameResult>;
|
|
48
|
+
suggestItemLabel(input: SurveyAssistantSuggestItemLabelInput, context: SurveyAssistantTaskContext, options?: SurveyAssistantTaskExecutionOptions): Promise<SurveyAssistantSuggestItemLabelResult>;
|
|
49
|
+
translateContent(input: SurveyAssistantTranslateContentInput, context: SurveyAssistantTaskContext, options?: SurveyAssistantTaskExecutionOptions): Promise<SurveyAssistantTranslateContentResult>;
|
|
50
|
+
}
|
|
51
|
+
declare const createSurveyAssistantTaskClient: ({ api, resourceId, surveyId }?: SurveyAssistantTaskClientOptions) => SurveyAssistantTaskClient;
|
|
52
|
+
//#endregion
|
|
53
|
+
//#region src/react/controller-proxy.d.ts
|
|
54
|
+
interface CreateSurveyAssistantControllerProxyOptions {
|
|
55
|
+
notReadyMessage?: string;
|
|
56
|
+
}
|
|
57
|
+
interface SurveyAssistantControllerBridge {
|
|
58
|
+
controller: SurveyAssistantController;
|
|
59
|
+
setController(controller: SurveyAssistantController | null | undefined): void;
|
|
60
|
+
}
|
|
61
|
+
declare const createSurveyAssistantControllerProxy: (getController: () => SurveyAssistantController | null | undefined, { notReadyMessage }?: CreateSurveyAssistantControllerProxyOptions) => SurveyAssistantController;
|
|
62
|
+
declare const createSurveyAssistantControllerBridge: (options?: CreateSurveyAssistantControllerProxyOptions) => SurveyAssistantControllerBridge;
|
|
63
|
+
//#endregion
|
|
64
|
+
export { SurveyAssistantTaskClient as a, createSurveyAssistantTaskClient as c, SurveyAssistantThreadLaunch as d, SurveyAssistantThreadLauncher as f, createSurveyAssistantControllerProxy as i, SurveyAssistantController as l, SurveyAssistantControllerBridge as n, SurveyAssistantTaskClientOptions as o, createSurveyAssistantThreadLauncher as p, createSurveyAssistantControllerBridge as r, SurveyAssistantTaskExecutionOptions as s, CreateSurveyAssistantControllerProxyOptions as t, SurveyAssistantLaunchUIContext as u };
|
|
65
|
+
//# sourceMappingURL=controller-proxy-D7uQfm5f.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller-proxy-D7uQfm5f.d.mts","names":[],"sources":["../src/react/thread-launcher.ts","../src/react/controller.ts","../src/react/task-client.ts","../src/react/controller-proxy.ts"],"mappings":";;;;KAOY,iCAAiC,QAAQ,KAAK;UAEzC;;EAEf;EACA,QAAQ;;EAER;;EAEA;;EAEA,YAAY;;UAGG;;;;;EAKf,YAAY,OAAO,8BAA8B,QAAQ;;cA6D9C,2CAA0C;;;UCrFtC;;EAEf,eAAe;;EAEf,sBAAsB,SAAS,oBAAoB;;;;UCcpC;EACf;EACA;EACA;;UAGe;EACf,OAAO;EACP;EACA,SAAS;;UAGM;EACf,wBACE,OAAO,6CACP,SAAS,4BACT,UAAU,sCACT,QAAQ;EACX,oBACE,OAAO,yCACP,SAAS,4BACT,UAAU,sCACT,QAAQ;EACX,iBACE,OAAO,sCACP,SAAS,4BACT,UAAU,sCACT,QAAQ;EACX,iBACE,OAAO,sCACP,SAAS,4BACT,UAAU,sCACT,QAAQ;;cAGA,oCAAmC,KAAA,YAAA,aAI7C,qCAAwC;;;UCxD1B;EACf;;UAGe;EACf,YAAY;EACZ,cAAc,YAAY;;cAWf,uCACX,qBAAqB,gDACrB,oBAEG,gDACF;cAWU,wCACX,UAAU,gDACT"}
|