@case-framework/survey-assistant 0.1.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 (98) hide show
  1. package/README.md +212 -0
  2. package/dist/authoring-references-Cy8J-DWt.d.mts +48 -0
  3. package/dist/authoring-references-Cy8J-DWt.d.mts.map +1 -0
  4. package/dist/authoring-references-X6uRaWuf.mjs +68 -0
  5. package/dist/authoring-references-X6uRaWuf.mjs.map +1 -0
  6. package/dist/capabilities-B6tvE7fK.mjs +66 -0
  7. package/dist/capabilities-B6tvE7fK.mjs.map +1 -0
  8. package/dist/capabilities-DvSKtjAw.d.mts +182 -0
  9. package/dist/capabilities-DvSKtjAw.d.mts.map +1 -0
  10. package/dist/capabilities-default.d.mts +15 -0
  11. package/dist/capabilities-default.d.mts.map +1 -0
  12. package/dist/capabilities-default.mjs +347 -0
  13. package/dist/capabilities-default.mjs.map +1 -0
  14. package/dist/constants-CFUWrRtl.mjs +7 -0
  15. package/dist/constants-CFUWrRtl.mjs.map +1 -0
  16. package/dist/constants-Jw0k8ojS.d.mts +67 -0
  17. package/dist/constants-Jw0k8ojS.d.mts.map +1 -0
  18. package/dist/controller-proxy-BRDusFiO.d.mts +57 -0
  19. package/dist/controller-proxy-BRDusFiO.d.mts.map +1 -0
  20. package/dist/controller-proxy-Duxo2IFE.mjs +92 -0
  21. package/dist/controller-proxy-Duxo2IFE.mjs.map +1 -0
  22. package/dist/digest-BsoVq49o.d.mts +9 -0
  23. package/dist/digest-BsoVq49o.d.mts.map +1 -0
  24. package/dist/digest.d.mts +2 -0
  25. package/dist/digest.mjs +20 -0
  26. package/dist/digest.mjs.map +1 -0
  27. package/dist/engine-sPvuixWg.mjs +4857 -0
  28. package/dist/engine-sPvuixWg.mjs.map +1 -0
  29. package/dist/engine.d.mts +3 -0
  30. package/dist/engine.mjs +4 -0
  31. package/dist/index-BWNHkpkh.d.mts +187 -0
  32. package/dist/index-BWNHkpkh.d.mts.map +1 -0
  33. package/dist/index-CUqbBjkc.d.mts +641 -0
  34. package/dist/index-CUqbBjkc.d.mts.map +1 -0
  35. package/dist/index-MpEMQzTm.d.mts +123 -0
  36. package/dist/index-MpEMQzTm.d.mts.map +1 -0
  37. package/dist/index-TFtvBiSQ.d.mts +1149 -0
  38. package/dist/index-TFtvBiSQ.d.mts.map +1 -0
  39. package/dist/memory-thread-repository-CJkkVE2-.mjs +718 -0
  40. package/dist/memory-thread-repository-CJkkVE2-.mjs.map +1 -0
  41. package/dist/protocol-DV0ka9WT.mjs +1032 -0
  42. package/dist/protocol-DV0ka9WT.mjs.map +1 -0
  43. package/dist/protocol.d.mts +3 -0
  44. package/dist/protocol.mjs +2 -0
  45. package/dist/react-VuYe-cPh.mjs +521 -0
  46. package/dist/react-VuYe-cPh.mjs.map +1 -0
  47. package/dist/react-integration.d.mts +2 -0
  48. package/dist/react-integration.mjs +3 -0
  49. package/dist/react.d.mts +3 -0
  50. package/dist/react.mjs +4 -0
  51. package/dist/references/assistant-operations.md +287 -0
  52. package/dist/references/core-rules.md +11 -0
  53. package/dist/references/embedded-forms.md +80 -0
  54. package/dist/references/expressions.md +301 -0
  55. package/dist/references/item-types.md +364 -0
  56. package/dist/references/localization.md +25 -0
  57. package/dist/references/rich-text-content.md +193 -0
  58. package/dist/references/source-material-surveys.md +60 -0
  59. package/dist/references/survey-data-model.md +109 -0
  60. package/dist/references/survey-quality.md +23 -0
  61. package/dist/request-context-jcmXT_Q2.mjs +44 -0
  62. package/dist/request-context-jcmXT_Q2.mjs.map +1 -0
  63. package/dist/request-guardrails-C59IWnH8.mjs +73 -0
  64. package/dist/request-guardrails-C59IWnH8.mjs.map +1 -0
  65. package/dist/server-agent.d.mts +131 -0
  66. package/dist/server-agent.d.mts.map +1 -0
  67. package/dist/server-agent.mjs +229 -0
  68. package/dist/server-agent.mjs.map +1 -0
  69. package/dist/server-runtime.d.mts +123 -0
  70. package/dist/server-runtime.d.mts.map +1 -0
  71. package/dist/server-runtime.mjs +296 -0
  72. package/dist/server-runtime.mjs.map +1 -0
  73. package/dist/server-tasks.d.mts +78 -0
  74. package/dist/server-tasks.d.mts.map +1 -0
  75. package/dist/server-tasks.mjs +253 -0
  76. package/dist/server-tasks.mjs.map +1 -0
  77. package/dist/server-tools.d.mts +2 -0
  78. package/dist/server-tools.mjs +2 -0
  79. package/dist/server.d.mts +52 -0
  80. package/dist/server.d.mts.map +1 -0
  81. package/dist/server.mjs +6 -0
  82. package/dist/storage-postgres.d.mts +37 -0
  83. package/dist/storage-postgres.d.mts.map +1 -0
  84. package/dist/storage-postgres.mjs +167 -0
  85. package/dist/storage-postgres.mjs.map +1 -0
  86. package/dist/thread-documents-DamIq9Od.d.mts +91 -0
  87. package/dist/thread-documents-DamIq9Od.d.mts.map +1 -0
  88. package/dist/thread-handlers-DpynUc64.d.mts +112 -0
  89. package/dist/thread-handlers-DpynUc64.d.mts.map +1 -0
  90. package/dist/tools-Hz2p7vyv.mjs +1879 -0
  91. package/dist/tools-Hz2p7vyv.mjs.map +1 -0
  92. package/dist/ui.css +2 -0
  93. package/dist/ui.d.mts +63 -0
  94. package/dist/ui.d.mts.map +1 -0
  95. package/dist/ui.mjs +2238 -0
  96. package/dist/ui.mjs.map +1 -0
  97. package/package.json +166 -0
  98. package/ui.css.d.ts +3 -0
@@ -0,0 +1,1032 @@
1
+ import { z } from "zod";
2
+ //#region src/protocol/errors.ts
3
+ const surveyAssistantErrorCodeSchema = z.enum([
4
+ "attachment_unavailable",
5
+ "authorization_failed",
6
+ "model_unavailable",
7
+ "rate_limited",
8
+ "request_failed"
9
+ ]);
10
+ const surveyAssistantErrorInfoSchema = z.object({
11
+ code: surveyAssistantErrorCodeSchema,
12
+ detail: z.string().optional()
13
+ });
14
+ const ERROR_PREFIX = "case-survey-assistant-error:";
15
+ const serializeSurveyAssistantError = (error) => `${ERROR_PREFIX}${JSON.stringify(surveyAssistantErrorInfoSchema.parse(error))}`;
16
+ const parseSurveyAssistantError = (value) => {
17
+ if (typeof value === "object" && value !== null && "code" in value) {
18
+ const parsed = surveyAssistantErrorInfoSchema.safeParse({
19
+ code: value.code,
20
+ detail: "detail" in value && typeof value.detail === "string" ? value.detail : "message" in value && typeof value.message === "string" ? value.message : void 0
21
+ });
22
+ if (parsed.success) return parsed.data;
23
+ }
24
+ const message = value instanceof Error ? value.message : typeof value === "string" ? value : typeof value === "object" && value !== null && "message" in value ? String(value.message) : "";
25
+ if (message.startsWith(ERROR_PREFIX)) try {
26
+ const parsed = surveyAssistantErrorInfoSchema.safeParse(JSON.parse(message.slice(28)));
27
+ if (parsed.success) return parsed.data;
28
+ } catch {}
29
+ return {
30
+ code: "request_failed",
31
+ ...message.trim() ? { detail: message.trim() } : {}
32
+ };
33
+ };
34
+ //#endregion
35
+ //#region src/protocol/content.ts
36
+ const jsonValueSchema = z.lazy(() => z.union([
37
+ z.string(),
38
+ z.number(),
39
+ z.boolean(),
40
+ z.null(),
41
+ z.array(jsonValueSchema),
42
+ z.record(z.string(), jsonValueSchema)
43
+ ]));
44
+ const contentAttributesSchema = z.record(z.string(), jsonValueSchema);
45
+ const richTextStyleSchema = z.object({
46
+ weight: z.enum(["strong", "normal"]).optional(),
47
+ italic: z.enum(["italic", "normal"]).optional(),
48
+ underline: z.enum(["underline", "none"]).optional(),
49
+ color: z.enum([
50
+ "primary",
51
+ "accent",
52
+ "default"
53
+ ]).optional()
54
+ });
55
+ const richTextTextInlineSchema = z.object({
56
+ type: z.literal("text"),
57
+ text: z.string().max(2e4),
58
+ style: richTextStyleSchema.optional(),
59
+ attrs: contentAttributesSchema.optional()
60
+ });
61
+ const richTextTemplateInlineSchema = z.object({
62
+ type: z.literal("template"),
63
+ key: z.string().min(1).max(240),
64
+ style: richTextStyleSchema.optional(),
65
+ attrs: contentAttributesSchema.optional()
66
+ });
67
+ const richTextLineBreakInlineSchema = z.object({
68
+ type: z.literal("lineBreak"),
69
+ attrs: contentAttributesSchema.optional()
70
+ });
71
+ const richTextLinkChildInlineSchema = z.discriminatedUnion("type", [
72
+ richTextTextInlineSchema,
73
+ richTextTemplateInlineSchema,
74
+ richTextLineBreakInlineSchema
75
+ ]);
76
+ const richTextLinkInlineSchema = z.object({
77
+ type: z.literal("link"),
78
+ href: z.string().min(1).max(2e3),
79
+ target: z.string().max(120).nullable().optional(),
80
+ rel: z.string().max(240).nullable().optional(),
81
+ title: z.string().max(1e3).nullable().optional(),
82
+ attrs: contentAttributesSchema.optional(),
83
+ children: z.array(richTextLinkChildInlineSchema).max(200)
84
+ });
85
+ const richTextInlineExtensionSchema = z.object({
86
+ type: z.literal("inlineExtension"),
87
+ name: z.string().min(1).max(120),
88
+ attrs: contentAttributesSchema.optional()
89
+ });
90
+ const richTextInlineSchema = z.discriminatedUnion("type", [
91
+ richTextTextInlineSchema,
92
+ richTextTemplateInlineSchema,
93
+ richTextLinkInlineSchema,
94
+ richTextLineBreakInlineSchema,
95
+ richTextInlineExtensionSchema
96
+ ]);
97
+ const textAlignmentSchema = z.enum([
98
+ "left",
99
+ "center",
100
+ "right",
101
+ "justify"
102
+ ]);
103
+ const richTextParagraphBlockSchema = z.object({
104
+ type: z.literal("paragraph"),
105
+ children: z.array(richTextInlineSchema).max(500),
106
+ alignment: textAlignmentSchema.optional(),
107
+ attrs: contentAttributesSchema.optional()
108
+ });
109
+ const richTextHeadingBlockSchema = z.object({
110
+ type: z.literal("heading"),
111
+ level: z.union([z.literal(1), z.literal(2)]),
112
+ children: z.array(richTextInlineSchema).max(500),
113
+ alignment: textAlignmentSchema.optional(),
114
+ attrs: contentAttributesSchema.optional()
115
+ });
116
+ const richTextListItemBlockSchema = z.object({
117
+ type: z.literal("listItem"),
118
+ children: z.array(richTextParagraphBlockSchema).max(100),
119
+ attrs: contentAttributesSchema.optional()
120
+ });
121
+ const richTextBulletListBlockSchema = z.object({
122
+ type: z.literal("bulletList"),
123
+ items: z.array(richTextListItemBlockSchema).max(100),
124
+ attrs: contentAttributesSchema.optional()
125
+ });
126
+ const richTextImageDimensionSchema = z.union([z.object({
127
+ unit: z.literal("px"),
128
+ value: z.number().finite().nonnegative()
129
+ }), z.object({
130
+ unit: z.literal("%"),
131
+ value: z.number().finite().nonnegative()
132
+ })]);
133
+ const richTextImageSourceSchema = z.discriminatedUnion("type", [z.object({
134
+ type: z.literal("asset"),
135
+ assetId: z.string().min(1).max(240)
136
+ }), z.object({
137
+ type: z.literal("external"),
138
+ url: z.string().min(1).max(2e3)
139
+ })]);
140
+ const richTextImageBlockSchema = z.object({
141
+ type: z.literal("image"),
142
+ source: richTextImageSourceSchema,
143
+ alt: z.string().max(2e3).optional(),
144
+ caption: z.array(richTextParagraphBlockSchema).max(20).optional(),
145
+ size: z.object({
146
+ width: richTextImageDimensionSchema.optional(),
147
+ height: richTextImageDimensionSchema.optional(),
148
+ maxWidth: richTextImageDimensionSchema.optional(),
149
+ maxHeight: richTextImageDimensionSchema.optional()
150
+ }).optional(),
151
+ alignment: textAlignmentSchema.optional(),
152
+ attrs: contentAttributesSchema.optional()
153
+ });
154
+ const richTextInfoBoxBlockSchema = z.object({
155
+ type: z.literal("infoBox"),
156
+ tone: z.enum(["info", "warning"]).optional(),
157
+ title: z.array(richTextInlineSchema).max(100).optional(),
158
+ collapsible: z.boolean().optional(),
159
+ defaultOpen: z.boolean().optional(),
160
+ children: z.array(richTextParagraphBlockSchema).max(100),
161
+ attrs: contentAttributesSchema.optional()
162
+ });
163
+ const richTextSeparatorBlockSchema = z.object({
164
+ type: z.literal("separator"),
165
+ attrs: contentAttributesSchema.optional()
166
+ });
167
+ const richTextBlockExtensionSchema = z.object({
168
+ type: z.literal("blockExtension"),
169
+ name: z.string().min(1).max(120),
170
+ attrs: contentAttributesSchema.optional()
171
+ });
172
+ const richTextBlockSchema = z.discriminatedUnion("type", [
173
+ richTextParagraphBlockSchema,
174
+ richTextHeadingBlockSchema,
175
+ richTextBulletListBlockSchema,
176
+ richTextImageBlockSchema,
177
+ richTextInfoBoxBlockSchema,
178
+ richTextSeparatorBlockSchema,
179
+ richTextBlockExtensionSchema
180
+ ]);
181
+ const surveyContentSchema = z.discriminatedUnion("type", [
182
+ z.object({
183
+ type: z.literal("md"),
184
+ content: z.string().max(2e4)
185
+ }),
186
+ z.object({
187
+ type: z.literal("plain"),
188
+ content: z.string().max(2e4)
189
+ }),
190
+ z.object({
191
+ type: z.literal("richText"),
192
+ version: z.literal(1),
193
+ doc: z.object({
194
+ type: z.literal("doc"),
195
+ blocks: z.array(richTextBlockSchema).max(200)
196
+ })
197
+ })
198
+ ]);
199
+ //#endregion
200
+ //#region src/protocol/operations.ts
201
+ const operationIdSchema = z.string().min(1).max(120).optional().describe("Optional client/model supplied id for correlating validation issues.");
202
+ const itemIdentifierSchema = z.string().min(1).max(240).describe("Survey item id, key, or fullKey.");
203
+ const itemKeySchema = z.string().min(1).max(120).describe("New item key. It must be unique among siblings.");
204
+ const itemTranslationSchema = z.object({
205
+ locale: z.string().min(1).max(40),
206
+ contentKey: z.string().min(1).max(240).describe("Item translation content key, for example \"label\" or \"content\"."),
207
+ plainText: z.string().max(2e4).optional().describe("Simple text content to persist for the translation key."),
208
+ content: surveyContentSchema.optional().describe("Structured survey content to persist for the translation key. Use { \"type\": \"richText\", \"version\": 1, \"doc\": ... } for formatted text.")
209
+ }).refine((translation) => translation.plainText !== void 0 || translation.content !== void 0, { message: "Provide either plainText or content for a translation." });
210
+ const choiceOptionInputSchema = z.object({
211
+ id: z.string().min(1).max(120).optional().describe("Optional stable option id. If omitted, the validator derives a unique id."),
212
+ key: z.string().min(1).max(120).optional().describe("Optional coding key. If omitted, the validator derives a unique key."),
213
+ label: z.string().min(1).max(1e3).describe("Respondent-visible option label as a plain string. Do not pass a translation object here; add-choice-option creates the matching translation in its locale.")
214
+ });
215
+ const rawSurveyItemForCreateSchema = z.object({
216
+ id: z.string().min(1).max(120).optional(),
217
+ key: itemKeySchema,
218
+ itemType: z.string().min(1).max(120),
219
+ metadata: z.record(z.string(), z.string()).optional(),
220
+ config: z.unknown().optional().describe("Optional item-type config. For choiceItem, provide response options as config.options, for example [{ \"label\": \"Fuji\" }, { \"label\": \"Gala\" }]. Use config.maxSelection: 1 for single choice, null for unlimited multiple choice / select-all-that-apply, or a number greater than 1 for capped multiple choice. The validator converts option labels into options.<optionId>.label translations."),
221
+ validations: z.record(z.string(), z.any()).optional(),
222
+ displayConditions: z.any().optional(),
223
+ disabledConditions: z.any().optional(),
224
+ prefills: z.array(z.any()).optional()
225
+ }).passthrough();
226
+ const jsonPointerPathSchema = z.string().max(500).describe("JSON Pointer path into the survey document, for example \"/surveyItems/1/config/options/0/key\" or \"/translations/en/itemTranslations/<itemId>/title\".");
227
+ const jsonPatchOperationSchema = z.discriminatedUnion("op", [
228
+ z.object({
229
+ op: z.literal("add"),
230
+ path: jsonPointerPathSchema,
231
+ value: jsonValueSchema
232
+ }),
233
+ z.object({
234
+ op: z.literal("replace"),
235
+ path: jsonPointerPathSchema,
236
+ value: jsonValueSchema
237
+ }),
238
+ z.object({
239
+ op: z.literal("test"),
240
+ path: jsonPointerPathSchema,
241
+ value: jsonValueSchema
242
+ }),
243
+ z.object({
244
+ op: z.literal("remove"),
245
+ path: jsonPointerPathSchema
246
+ }),
247
+ z.object({
248
+ op: z.literal("move"),
249
+ from: jsonPointerPathSchema,
250
+ path: jsonPointerPathSchema
251
+ }),
252
+ z.object({
253
+ op: z.literal("copy"),
254
+ from: jsonPointerPathSchema,
255
+ path: jsonPointerPathSchema
256
+ })
257
+ ]);
258
+ const createItemOperationSchema = z.object({
259
+ id: operationIdSchema,
260
+ kind: z.literal("create-item"),
261
+ target: z.object({
262
+ parentItemId: z.string().max(240).describe("Parent group item id, key, or fullKey where the new item should be inserted. Use the root group id/key for top-level items."),
263
+ index: z.number().int().min(0).optional()
264
+ }),
265
+ item: rawSurveyItemForCreateSchema,
266
+ translations: z.array(itemTranslationSchema).optional().describe("Top-level item translations for visible content, for example [{ \"locale\": \"en\", \"contentKey\": \"title\", \"plainText\": \"Question text\" }]. For formatted content, use the \"content\" field with a richText object. Put translations beside target and item, not inside item. Form select/dropdown option labels must be translations at fields.<fieldId>.options.<optionId>.label.")
267
+ });
268
+ const updateItemKeyOperationSchema = z.object({
269
+ id: operationIdSchema,
270
+ kind: z.literal("update-item-key"),
271
+ itemId: itemIdentifierSchema,
272
+ key: itemKeySchema
273
+ });
274
+ const updateItemLabelOperationSchema = z.object({
275
+ id: operationIdSchema,
276
+ kind: z.literal("update-item-label"),
277
+ itemId: itemIdentifierSchema,
278
+ itemLabel: z.string().max(200)
279
+ });
280
+ const updateItemColorOperationSchema = z.object({
281
+ id: operationIdSchema,
282
+ kind: z.literal("update-item-color"),
283
+ itemId: itemIdentifierSchema,
284
+ color: z.enum([
285
+ "#404040",
286
+ "#b91c1c",
287
+ "#c2410c",
288
+ "#a16207",
289
+ "#4d7c0f",
290
+ "#047857",
291
+ "#0369a1",
292
+ "#4338ca",
293
+ "#7e22ce",
294
+ "#86198f",
295
+ "#be123c"
296
+ ]).describe("One of the Survey Editor's supported item-color swatches.")
297
+ });
298
+ const updateItemTranslationOperationSchema = z.object({
299
+ id: operationIdSchema,
300
+ kind: z.literal("update-item-translation"),
301
+ itemId: itemIdentifierSchema,
302
+ locale: z.string().min(1).max(40),
303
+ contentKey: z.string().min(1).max(240).describe("Item translation content key, for example \"label\"."),
304
+ plainText: z.string().max(2e4).optional().describe("Simple text content to persist for the translation key."),
305
+ content: surveyContentSchema.optional().describe("Structured survey content to persist for the translation key. Use { \"type\": \"richText\", \"version\": 1, \"doc\": ... } for formatted text.")
306
+ }).refine((operation) => operation.plainText !== void 0 || operation.content !== void 0, { message: "Provide either plainText or content for update-item-translation." });
307
+ const placedImageDimensionSchema = z.union([z.object({
308
+ unit: z.literal("px"),
309
+ value: z.number().finite().nonnegative()
310
+ }), z.object({
311
+ unit: z.literal("%"),
312
+ value: z.number().finite().nonnegative().max(100)
313
+ })]);
314
+ const placedImageSourceSchema = z.discriminatedUnion("type", [z.object({
315
+ type: z.literal("asset"),
316
+ assetId: z.string().min(1).max(240)
317
+ }), z.object({
318
+ type: z.literal("external"),
319
+ url: z.string().min(1).max(2e3)
320
+ })]);
321
+ const updatePlacedImageOperationSchema = z.object({
322
+ id: operationIdSchema,
323
+ kind: z.literal("update-placed-image"),
324
+ itemId: itemIdentifierSchema,
325
+ locale: z.string().min(1).max(40),
326
+ contentKey: z.string().min(1).max(240),
327
+ imageIndex: z.number().int().nonnegative().describe("Zero-based index among image blocks in the selected rich-text content value."),
328
+ expectedAssetId: z.string().min(1).max(240).optional(),
329
+ changes: z.object({
330
+ source: placedImageSourceSchema.optional(),
331
+ alt: z.string().max(2e3).nullable().optional(),
332
+ caption: z.string().max(2e4).nullable().optional(),
333
+ width: placedImageDimensionSchema.nullable().optional(),
334
+ height: placedImageDimensionSchema.nullable().optional(),
335
+ maxWidth: placedImageDimensionSchema.nullable().optional(),
336
+ maxHeight: placedImageDimensionSchema.nullable().optional(),
337
+ alignment: z.enum([
338
+ "left",
339
+ "center",
340
+ "right"
341
+ ]).nullable().optional()
342
+ }).refine((changes) => Object.values(changes).some((value) => value !== void 0), { message: "Provide at least one placed-image property to change." })
343
+ });
344
+ const patchItemConfigOperationSchema = z.object({
345
+ id: operationIdSchema,
346
+ kind: z.literal("patch-item-config"),
347
+ itemId: itemIdentifierSchema,
348
+ patches: z.array(jsonPatchOperationSchema).min(1).max(100).describe("JSON Patch operations relative to this item's config root, for example [{ \"op\": \"replace\", \"path\": \"/max\", \"value\": 7 }]. Inspect the item first and do not include /surveyItems/<index>/config in these paths.")
349
+ });
350
+ const formTargetSchema = z.object({
351
+ itemId: itemIdentifierSchema,
352
+ optionId: z.string().min(1).max(240).optional().describe("Choice option id when targeting an inline embedded form.")
353
+ });
354
+ const formTranslationsSchema = z.array(itemTranslationSchema).max(100).optional().describe("Translations written atomically with this form structure change. Content keys are relative to the form; embedded-form prefixes are added automatically.");
355
+ const formFieldGroupInputSchema = z.object({
356
+ id: z.string().min(1).max(120),
357
+ layout: z.object({
358
+ base: z.number().int().min(1).max(12),
359
+ xs: z.number().int().min(1).max(12),
360
+ sm: z.number().int().min(1).max(12),
361
+ md: z.number().int().min(1).max(12),
362
+ xl: z.number().int().min(1).max(12)
363
+ }).optional(),
364
+ fields: z.array(z.unknown()).optional(),
365
+ hasDisplayCondition: z.boolean().optional()
366
+ }).passthrough();
367
+ const formFieldInputSchema = z.object({
368
+ id: z.string().min(1).max(120),
369
+ key: z.string().min(1).max(120),
370
+ type: z.enum([
371
+ "input",
372
+ "textarea",
373
+ "number",
374
+ "datepicker",
375
+ "switch",
376
+ "select",
377
+ "slider"
378
+ ]),
379
+ controller: z.record(z.string(), z.unknown()),
380
+ required: z.boolean().optional(),
381
+ validations: z.array(z.record(z.string(), z.unknown())).optional()
382
+ }).passthrough();
383
+ const upsertFormFieldGroupOperationSchema = z.object({
384
+ id: operationIdSchema,
385
+ kind: z.literal("upsert-form-field-group"),
386
+ target: formTargetSchema,
387
+ index: z.number().int().min(0).optional(),
388
+ group: formFieldGroupInputSchema,
389
+ translations: formTranslationsSchema
390
+ });
391
+ const removeFormFieldGroupOperationSchema = z.object({
392
+ id: operationIdSchema,
393
+ kind: z.literal("remove-form-field-group"),
394
+ target: formTargetSchema,
395
+ groupId: z.string().min(1).max(240)
396
+ });
397
+ const reorderFormFieldGroupsOperationSchema = z.object({
398
+ id: operationIdSchema,
399
+ kind: z.literal("reorder-form-field-groups"),
400
+ target: formTargetSchema,
401
+ groupIds: z.array(z.string().min(1).max(240)).min(1).max(100)
402
+ });
403
+ const upsertFormFieldOperationSchema = z.object({
404
+ id: operationIdSchema,
405
+ kind: z.literal("upsert-form-field"),
406
+ target: formTargetSchema,
407
+ groupId: z.string().min(1).max(240),
408
+ index: z.number().int().min(0).optional(),
409
+ field: formFieldInputSchema,
410
+ translations: formTranslationsSchema
411
+ });
412
+ const removeFormFieldOperationSchema = z.object({
413
+ id: operationIdSchema,
414
+ kind: z.literal("remove-form-field"),
415
+ target: formTargetSchema,
416
+ fieldId: z.string().min(1).max(240)
417
+ });
418
+ const moveFormFieldOperationSchema = z.object({
419
+ id: operationIdSchema,
420
+ kind: z.literal("move-form-field"),
421
+ target: formTargetSchema,
422
+ fieldId: z.string().min(1).max(240),
423
+ targetGroupId: z.string().min(1).max(240),
424
+ index: z.number().int().min(0).optional()
425
+ });
426
+ const setEmbeddedFormOperationSchema = z.object({
427
+ id: operationIdSchema,
428
+ kind: z.literal("set-embedded-form"),
429
+ itemId: itemIdentifierSchema,
430
+ optionId: z.string().min(1).max(240),
431
+ form: z.object({
432
+ id: z.string().min(1).max(120),
433
+ fieldGroups: z.array(formFieldGroupInputSchema).max(100)
434
+ }).passthrough(),
435
+ translations: formTranslationsSchema
436
+ });
437
+ const removeEmbeddedFormOperationSchema = z.object({
438
+ id: operationIdSchema,
439
+ kind: z.literal("remove-embedded-form"),
440
+ itemId: itemIdentifierSchema,
441
+ optionId: z.string().min(1).max(240)
442
+ });
443
+ const addChoiceOptionOperationSchema = z.object({
444
+ id: operationIdSchema,
445
+ kind: z.literal("add-choice-option"),
446
+ itemId: itemIdentifierSchema,
447
+ locale: z.string().min(1).max(40).optional(),
448
+ index: z.number().int().min(0).optional(),
449
+ option: choiceOptionInputSchema
450
+ });
451
+ const updateChoiceOptionLabelOperationSchema = z.object({
452
+ id: operationIdSchema,
453
+ kind: z.literal("update-choice-option-label"),
454
+ itemId: itemIdentifierSchema,
455
+ optionId: z.string().min(1).max(240).describe("Existing choice option id, key, or current visible label."),
456
+ locale: z.string().min(1).max(40).optional(),
457
+ label: z.string().min(1).max(1e3).describe("New respondent-visible option label.")
458
+ });
459
+ const removeChoiceOptionOperationSchema = z.object({
460
+ id: operationIdSchema,
461
+ kind: z.literal("remove-choice-option"),
462
+ itemId: itemIdentifierSchema,
463
+ optionId: z.string().min(1).max(240).describe("Existing choice option id, key, or current visible label.")
464
+ });
465
+ const reorderChoiceOptionsOperationSchema = z.object({
466
+ id: operationIdSchema,
467
+ kind: z.literal("reorder-choice-options"),
468
+ itemId: itemIdentifierSchema,
469
+ optionIds: z.array(z.string().min(1).max(240)).min(1).max(100).describe("Complete desired order of existing choice options. Entries can be option ids, keys, or current visible labels.")
470
+ });
471
+ const removeItemOperationSchema = z.object({
472
+ id: operationIdSchema,
473
+ kind: z.literal("remove-item"),
474
+ itemId: itemIdentifierSchema,
475
+ includeChildren: z.boolean().optional().describe("Must be true when removing a group item that has children.")
476
+ });
477
+ const moveItemOperationSchema = z.object({
478
+ id: operationIdSchema,
479
+ kind: z.literal("move-item"),
480
+ itemId: itemIdentifierSchema,
481
+ target: z.object({
482
+ parentItemId: itemIdentifierSchema,
483
+ index: z.number().int().min(0).optional()
484
+ })
485
+ });
486
+ const reorderItemsOperationSchema = z.object({
487
+ id: operationIdSchema,
488
+ kind: z.literal("reorder-items"),
489
+ parentItemId: itemIdentifierSchema,
490
+ itemIds: z.array(itemIdentifierSchema).min(1).max(200)
491
+ });
492
+ const updateSurveyMetadataOperationSchema = z.object({
493
+ id: operationIdSchema,
494
+ kind: z.literal("update-survey-metadata"),
495
+ values: z.record(z.string().min(1).max(240), z.string().max(2e4).nullable())
496
+ });
497
+ const updateSurveyPaginationOperationSchema = z.object({
498
+ id: operationIdSchema,
499
+ kind: z.literal("update-survey-pagination"),
500
+ value: z.object({
501
+ large: z.number().int().min(1).max(1e3),
502
+ small: z.number().int().min(1).max(1e3)
503
+ }).nullable()
504
+ });
505
+ const updateSurveyTranslationOperationSchema = z.object({
506
+ id: operationIdSchema,
507
+ kind: z.literal("update-survey-translation"),
508
+ locale: z.string().min(1).max(40),
509
+ surface: z.enum([
510
+ "surveyCardContent",
511
+ "navigationContent",
512
+ "validationMessages"
513
+ ]),
514
+ contentKey: z.string().min(1).max(240),
515
+ plainText: z.string().max(2e4).optional(),
516
+ content: surveyContentSchema.optional()
517
+ }).refine((operation) => operation.plainText !== void 0 || operation.content !== void 0, { message: "Provide either plainText or content for update-survey-translation." });
518
+ const removeSurveyLocaleOperationSchema = z.object({
519
+ id: operationIdSchema,
520
+ kind: z.literal("remove-survey-locale"),
521
+ locale: z.string().min(1).max(40)
522
+ });
523
+ const imageAssetMetadataSchema = z.object({
524
+ name: z.string().max(500).optional(),
525
+ filename: z.string().max(500).optional(),
526
+ alt: z.string().max(2e3).optional(),
527
+ width: z.number().int().positive().optional(),
528
+ height: z.number().int().positive().optional()
529
+ });
530
+ const rawSurveyImageAssetSchema = z.object({
531
+ kind: z.literal("image"),
532
+ source: z.object({
533
+ type: z.literal("embedded"),
534
+ mediaType: z.string().regex(/^image\//),
535
+ encoding: z.literal("base64"),
536
+ data: z.string().min(1).max(8e6)
537
+ }),
538
+ metadata: imageAssetMetadataSchema.optional()
539
+ });
540
+ const setImageAssetOperationSchema = z.object({
541
+ id: operationIdSchema,
542
+ kind: z.literal("set-image-asset"),
543
+ assetId: z.string().min(1).max(240),
544
+ asset: rawSurveyImageAssetSchema
545
+ });
546
+ const updateImageAssetMetadataOperationSchema = z.object({
547
+ id: operationIdSchema,
548
+ kind: z.literal("update-image-asset-metadata"),
549
+ assetId: z.string().min(1).max(240),
550
+ metadata: z.object({
551
+ name: z.string().max(500).nullable().optional(),
552
+ filename: z.string().max(500).nullable().optional(),
553
+ alt: z.string().max(2e3).nullable().optional(),
554
+ width: z.number().int().positive().nullable().optional(),
555
+ height: z.number().int().positive().nullable().optional()
556
+ })
557
+ });
558
+ const removeImageAssetOperationSchema = z.object({
559
+ id: operationIdSchema,
560
+ kind: z.literal("remove-image-asset"),
561
+ assetId: z.string().min(1).max(240)
562
+ });
563
+ const surveyPatchOperationSchema = z.object({
564
+ id: operationIdSchema,
565
+ kind: z.literal("survey-json-patch"),
566
+ patches: z.array(jsonPatchOperationSchema).min(1).max(100).describe("Batch of JSON Patch operations applied to the survey document. Use this for raw survey edits such as reordering group items, editing item config, survey metadata, template values, translations/locales, or maxItemsPerPage.")
567
+ });
568
+ const asDiscriminable = (schema) => schema;
569
+ const surveyOperationSchema = z.discriminatedUnion("kind", [
570
+ asDiscriminable(createItemOperationSchema),
571
+ asDiscriminable(updateItemKeyOperationSchema),
572
+ asDiscriminable(updateItemLabelOperationSchema),
573
+ asDiscriminable(updateItemColorOperationSchema),
574
+ asDiscriminable(updateItemTranslationOperationSchema),
575
+ asDiscriminable(updatePlacedImageOperationSchema),
576
+ asDiscriminable(patchItemConfigOperationSchema),
577
+ asDiscriminable(upsertFormFieldGroupOperationSchema),
578
+ asDiscriminable(removeFormFieldGroupOperationSchema),
579
+ asDiscriminable(reorderFormFieldGroupsOperationSchema),
580
+ asDiscriminable(upsertFormFieldOperationSchema),
581
+ asDiscriminable(removeFormFieldOperationSchema),
582
+ asDiscriminable(moveFormFieldOperationSchema),
583
+ asDiscriminable(setEmbeddedFormOperationSchema),
584
+ asDiscriminable(removeEmbeddedFormOperationSchema),
585
+ asDiscriminable(addChoiceOptionOperationSchema),
586
+ asDiscriminable(updateChoiceOptionLabelOperationSchema),
587
+ asDiscriminable(removeChoiceOptionOperationSchema),
588
+ asDiscriminable(reorderChoiceOptionsOperationSchema),
589
+ asDiscriminable(removeItemOperationSchema),
590
+ asDiscriminable(moveItemOperationSchema),
591
+ asDiscriminable(reorderItemsOperationSchema),
592
+ asDiscriminable(updateSurveyMetadataOperationSchema),
593
+ asDiscriminable(updateSurveyPaginationOperationSchema),
594
+ asDiscriminable(updateSurveyTranslationOperationSchema),
595
+ asDiscriminable(removeSurveyLocaleOperationSchema),
596
+ asDiscriminable(setImageAssetOperationSchema),
597
+ asDiscriminable(updateImageAssetMetadataOperationSchema),
598
+ asDiscriminable(removeImageAssetOperationSchema),
599
+ asDiscriminable(surveyPatchOperationSchema)
600
+ ]);
601
+ const surveyValidationIssueSchema = z.object({
602
+ severity: z.enum(["error", "warning"]),
603
+ code: z.string(),
604
+ message: z.string(),
605
+ operationIndex: z.number().int().nonnegative().optional(),
606
+ operationId: z.string().optional(),
607
+ itemId: z.string().optional()
608
+ });
609
+ const surveyValidationResultSchema = z.object({
610
+ valid: z.boolean(),
611
+ issues: z.array(surveyValidationIssueSchema),
612
+ warnings: z.array(surveyValidationIssueSchema),
613
+ normalizedOperations: z.array(surveyOperationSchema)
614
+ });
615
+ const SURVEY_OPERATION_KINDS = [
616
+ "create-item",
617
+ "update-item-key",
618
+ "update-item-label",
619
+ "update-item-color",
620
+ "update-item-translation",
621
+ "update-placed-image",
622
+ "patch-item-config",
623
+ "upsert-form-field-group",
624
+ "remove-form-field-group",
625
+ "reorder-form-field-groups",
626
+ "upsert-form-field",
627
+ "remove-form-field",
628
+ "move-form-field",
629
+ "set-embedded-form",
630
+ "remove-embedded-form",
631
+ "add-choice-option",
632
+ "update-choice-option-label",
633
+ "remove-choice-option",
634
+ "reorder-choice-options",
635
+ "remove-item",
636
+ "move-item",
637
+ "reorder-items",
638
+ "update-survey-metadata",
639
+ "update-survey-pagination",
640
+ "update-survey-translation",
641
+ "remove-survey-locale",
642
+ "set-image-asset",
643
+ "update-image-asset-metadata",
644
+ "remove-image-asset",
645
+ "survey-json-patch"
646
+ ];
647
+ const surveyJsonPatchOperationSchema = jsonPatchOperationSchema;
648
+ const surveyAssistantCreateItemOperationSchema = createItemOperationSchema;
649
+ const surveyAssistantUpdateItemKeyOperationSchema = updateItemKeyOperationSchema;
650
+ const surveyAssistantUpdateItemLabelOperationSchema = updateItemLabelOperationSchema;
651
+ const surveyAssistantUpdateItemColorOperationSchema = updateItemColorOperationSchema;
652
+ const surveyAssistantUpdateItemTranslationOperationSchema = updateItemTranslationOperationSchema;
653
+ const surveyAssistantAddChoiceOptionOperationSchema = addChoiceOptionOperationSchema;
654
+ const surveyAssistantUpdateChoiceOptionLabelOperationSchema = updateChoiceOptionLabelOperationSchema;
655
+ const surveyAssistantRemoveChoiceOptionOperationSchema = removeChoiceOptionOperationSchema;
656
+ const surveyAssistantReorderChoiceOptionsOperationSchema = reorderChoiceOptionsOperationSchema;
657
+ const surveyAssistantRemoveItemOperationSchema = removeItemOperationSchema;
658
+ const surveyAssistantSurveyJsonPatchOperationSchema = surveyPatchOperationSchema;
659
+ const surveyAssistantOperationSchema = surveyOperationSchema;
660
+ const surveyAssistantValidationIssueSchema = surveyValidationIssueSchema;
661
+ const surveyAssistantValidationResultSchema = surveyValidationResultSchema;
662
+ //#endregion
663
+ //#region src/protocol/capabilities.ts
664
+ const assistantItemCreateModeSchema = z.enum([
665
+ "deterministic",
666
+ "interactive-only",
667
+ "unsupported"
668
+ ]);
669
+ const assistantContentSurfaceSchema = z.object({
670
+ key: z.string().min(1),
671
+ role: z.enum([
672
+ "primary",
673
+ "secondary",
674
+ "option",
675
+ "field",
676
+ "validation"
677
+ ]),
678
+ format: z.enum(["plain", "rich"]),
679
+ requiredOnCreate: z.boolean().optional(),
680
+ pattern: z.boolean().optional(),
681
+ aliases: z.array(z.string().min(1)).optional()
682
+ });
683
+ const assistantResponseSlotSchema = z.object({
684
+ key: z.string().min(1),
685
+ valueType: z.string().min(1)
686
+ });
687
+ const assistantItemAuthoringSchema = z.object({ configSummary: z.string().min(1).max(1e3).optional() });
688
+ const assistantItemTypeManifestSchema = z.object({
689
+ itemType: z.string().min(1),
690
+ capabilityVersion: z.string().min(1),
691
+ displayName: z.string().min(1),
692
+ description: z.string().optional(),
693
+ defaultItemKeyPrefix: z.string().min(1).optional(),
694
+ create: assistantItemCreateModeSchema,
695
+ supportedOperations: z.array(z.enum(SURVEY_OPERATION_KINDS)),
696
+ contentSurfaces: z.array(assistantContentSurfaceSchema),
697
+ responseSlots: z.array(assistantResponseSlotSchema).optional(),
698
+ referenceTopics: z.array(z.string().min(1)).optional(),
699
+ authoring: assistantItemAuthoringSchema.optional()
700
+ });
701
+ const surveyAssistantCapabilityManifestSchema = z.object({
702
+ digest: z.string().min(1),
703
+ itemTypes: z.array(assistantItemTypeManifestSchema)
704
+ });
705
+ //#endregion
706
+ //#region src/protocol/document.ts
707
+ const SURVEY_ASSISTANT_PROTOCOL_VERSION = 1;
708
+ const surveyAssistantProtocolVersionSchema = z.literal(1);
709
+ const surveyDocumentVersionSchema = z.object({
710
+ sessionId: z.string().nullable(),
711
+ revision: z.number().int().nonnegative(),
712
+ historyIndex: z.number().int(),
713
+ contentHash: z.string().min(1),
714
+ capabilityDigest: z.string().min(1)
715
+ });
716
+ const surveyEditorUIContextSchema = z.object({
717
+ view: z.enum([
718
+ "item-editor",
719
+ "preview-mode",
720
+ "translation-mode",
721
+ "asset-manager"
722
+ ]),
723
+ selectedItemId: z.string().optional(),
724
+ selectedLocale: z.string().min(1),
725
+ focusItemId: z.string().optional(),
726
+ recentItemIds: z.array(z.string()).max(10).optional(),
727
+ activeSurface: z.string().max(120).optional(),
728
+ openPanels: z.array(z.string().max(120)).max(12).optional(),
729
+ highlights: z.array(z.object({
730
+ kind: z.string().min(1).max(80),
731
+ itemId: z.string().optional(),
732
+ componentId: z.string().optional(),
733
+ label: z.string().max(240).optional(),
734
+ details: z.string().max(1e3).optional()
735
+ })).max(12).optional(),
736
+ history: z.object({
737
+ currentIndex: z.number().int(),
738
+ totalEntries: z.number().int().nonnegative(),
739
+ canUndo: z.boolean(),
740
+ canRedo: z.boolean(),
741
+ recent: z.array(z.object({
742
+ index: z.number().int().nonnegative(),
743
+ kind: z.enum(["survey-snapshot", "asset-change"]),
744
+ label: z.string(),
745
+ source: z.enum([
746
+ "user",
747
+ "system",
748
+ "assistant"
749
+ ]).optional(),
750
+ timestamp: z.number().nonnegative(),
751
+ isCurrent: z.boolean()
752
+ })).max(12)
753
+ }).optional()
754
+ });
755
+ const rawSurveyItemSchema = z.object({
756
+ id: z.string().min(1),
757
+ key: z.string().min(1),
758
+ itemType: z.string().min(1)
759
+ }).passthrough();
760
+ const rawSurveyTranslationsSchema = z.record(z.string(), z.object({ itemTranslations: z.record(z.string(), z.record(z.string(), surveyContentSchema)).optional() }).passthrough());
761
+ const rawSurveyDocumentSchema = z.object({
762
+ $schema: z.string().min(1),
763
+ surveyItems: z.array(rawSurveyItemSchema).min(1),
764
+ translations: rawSurveyTranslationsSchema.optional()
765
+ }).passthrough();
766
+ const surveyDocumentSnapshotSchema = z.object({
767
+ protocolVersion: surveyAssistantProtocolVersionSchema,
768
+ version: surveyDocumentVersionSchema,
769
+ survey: rawSurveyDocumentSchema,
770
+ ui: surveyEditorUIContextSchema,
771
+ capabilities: surveyAssistantCapabilityManifestSchema,
772
+ createdAt: z.string().min(1)
773
+ });
774
+ const surveyAssistantSnapshotSchema = surveyDocumentSnapshotSchema;
775
+ const surveyAssistantSnapshotPayloadSchema = surveyDocumentSnapshotSchema;
776
+ const surveyAssistantDraftChangePreconditionSchema = surveyDocumentVersionSchema;
777
+ //#endregion
778
+ //#region src/protocol/threads.ts
779
+ const surveyAssistantThreadSchema = z.object({
780
+ id: z.string().min(1).max(240),
781
+ title: z.string().min(1).max(160),
782
+ titleMode: z.enum(["automatic", "manual"]),
783
+ createdAt: z.string().datetime(),
784
+ updatedAt: z.string().datetime()
785
+ });
786
+ const surveyAssistantThreadListSchema = z.object({ threads: z.array(surveyAssistantThreadSchema) });
787
+ const surveyAssistantThreadTranscriptSchema = z.object({
788
+ thread: surveyAssistantThreadSchema,
789
+ messages: z.array(z.unknown())
790
+ });
791
+ const createSurveyAssistantThreadInputSchema = z.object({ title: z.string().trim().min(1).max(160).optional() });
792
+ const updateSurveyAssistantThreadInputSchema = z.union([z.object({
793
+ mode: z.literal("automatic"),
794
+ title: z.string().trim().min(1).max(160).optional()
795
+ }), z.object({
796
+ mode: z.literal("manual").optional(),
797
+ title: z.string().trim().min(1).max(160)
798
+ })]);
799
+ //#endregion
800
+ //#region src/protocol/tasks.ts
801
+ const surveyAssistantTaskInvocationModeSchema = z.enum(["user", "background"]);
802
+ const surveyAssistantSuggestedTextSchema = z.object({ text: z.string().min(1) });
803
+ const surveyAssistantKeySuggestionCategorySchema = z.enum([
804
+ "survey-pattern",
805
+ "compact",
806
+ "preferred",
807
+ "fair"
808
+ ]);
809
+ const surveyAssistantKeySuggestionSchema = surveyAssistantSuggestedTextSchema.extend({
810
+ category: surveyAssistantKeySuggestionCategorySchema,
811
+ rationale: z.string().optional()
812
+ });
813
+ const surveyAssistantSuggestItemKeyInputSchema = z.object({
814
+ itemId: z.string().min(1),
815
+ draftKey: z.string(),
816
+ currentKey: z.string(),
817
+ siblingKeys: z.array(z.string()),
818
+ maxSuggestions: z.number().int().positive().optional()
819
+ });
820
+ const surveyAssistantSuggestItemKeyResultSchema = z.object({ suggestions: z.array(surveyAssistantKeySuggestionSchema) });
821
+ const surveyAssistantSuggestItemLabelInputSchema = z.object({
822
+ itemId: z.string().min(1),
823
+ draftLabel: z.string(),
824
+ itemType: z.string().min(1),
825
+ locale: z.string().min(1).optional(),
826
+ maxSuggestions: z.number().int().positive().optional()
827
+ });
828
+ const surveyAssistantSuggestItemLabelResultSchema = z.object({ suggestions: z.array(surveyAssistantSuggestedTextSchema) });
829
+ const surveyAssistantTranslateContentEntrySchema = z.object({
830
+ id: z.string().min(1),
831
+ text: z.string(),
832
+ kind: z.string().min(1)
833
+ });
834
+ const surveyAssistantTranslateContentInputSchema = z.object({
835
+ sourceLocale: z.string().min(1),
836
+ targetLocales: z.array(z.string().min(1)).min(1),
837
+ entries: z.array(surveyAssistantTranslateContentEntrySchema).min(1)
838
+ });
839
+ const surveyAssistantTranslateContentResultSchema = z.object({ translations: z.record(z.string(), z.record(z.string(), z.string())) });
840
+ const surveyAssistantTaskItemSummarySchema = z.object({
841
+ id: z.string().min(1),
842
+ key: z.string(),
843
+ fullKey: z.string(),
844
+ itemType: z.string().min(1),
845
+ itemLabel: z.string().optional(),
846
+ visibleText: z.array(z.object({
847
+ locale: z.string().min(1),
848
+ contentKey: z.string().min(1),
849
+ text: z.string()
850
+ })),
851
+ visibleTextTruncated: z.boolean()
852
+ });
853
+ const namingRelationshipSchema = z.enum([
854
+ "sibling",
855
+ "same-type",
856
+ "survey"
857
+ ]);
858
+ const surveyAssistantTaskContextSchema = z.object({
859
+ document: z.object({
860
+ revision: z.number().int().nonnegative(),
861
+ contentHash: z.string().min(1),
862
+ capabilityDigest: z.string().min(1)
863
+ }),
864
+ survey: z.object({
865
+ key: z.string().optional(),
866
+ locales: z.array(z.string()),
867
+ itemCount: z.number().int().nonnegative(),
868
+ selectedLocale: z.string().min(1)
869
+ }),
870
+ focus: z.object({
871
+ item: surveyAssistantTaskItemSummarySchema,
872
+ parent: surveyAssistantTaskItemSummarySchema.optional(),
873
+ ancestorPath: z.array(surveyAssistantTaskItemSummarySchema),
874
+ siblingKeys: z.array(z.string()),
875
+ siblingItems: z.array(surveyAssistantTaskItemSummarySchema),
876
+ siblingItemCount: z.number().int().nonnegative(),
877
+ siblingItemsTruncated: z.boolean(),
878
+ relatedItems: z.array(surveyAssistantTaskItemSummarySchema),
879
+ relatedItemCount: z.number().int().nonnegative(),
880
+ relatedItemsTruncated: z.boolean()
881
+ }).optional(),
882
+ naming: z.object({
883
+ keyExamples: z.array(z.object({
884
+ itemId: z.string().min(1),
885
+ itemType: z.string().min(1),
886
+ key: z.string(),
887
+ relationship: namingRelationshipSchema
888
+ })),
889
+ keyExampleCount: z.number().int().nonnegative(),
890
+ keyExamplesTruncated: z.boolean(),
891
+ labelExamples: z.array(z.object({
892
+ itemId: z.string().min(1),
893
+ itemType: z.string().min(1),
894
+ key: z.string(),
895
+ label: z.string(),
896
+ relationship: namingRelationshipSchema
897
+ })),
898
+ labelExampleCount: z.number().int().nonnegative(),
899
+ labelExamplesTruncated: z.boolean()
900
+ }).optional(),
901
+ translation: z.object({
902
+ examples: z.array(z.object({
903
+ itemId: z.string().min(1),
904
+ contentKey: z.string().min(1),
905
+ values: z.record(z.string(), z.string())
906
+ })),
907
+ exampleCount: z.number().int().nonnegative(),
908
+ examplesTruncated: z.boolean()
909
+ }).optional()
910
+ });
911
+ const taskRequestBase = {
912
+ context: surveyAssistantTaskContextSchema,
913
+ mode: surveyAssistantTaskInvocationModeSchema.optional(),
914
+ modelId: z.string().trim().min(1).max(240).optional()
915
+ };
916
+ const surveyAssistantTaskRequestSchema = z.discriminatedUnion("taskId", [
917
+ z.object({
918
+ ...taskRequestBase,
919
+ taskId: z.literal("suggest-item-key"),
920
+ input: surveyAssistantSuggestItemKeyInputSchema
921
+ }),
922
+ z.object({
923
+ ...taskRequestBase,
924
+ taskId: z.literal("suggest-item-label"),
925
+ input: surveyAssistantSuggestItemLabelInputSchema
926
+ }),
927
+ z.object({
928
+ ...taskRequestBase,
929
+ taskId: z.literal("translate-content"),
930
+ input: surveyAssistantTranslateContentInputSchema
931
+ })
932
+ ]);
933
+ //#endregion
934
+ //#region src/protocol/models.ts
935
+ const surveyAssistantModelOptionSchema = z.object({
936
+ id: z.string().trim().min(1).max(240),
937
+ label: z.string().trim().min(1).max(240)
938
+ });
939
+ const surveyAssistantModelCatalogSchema = z.object({
940
+ defaultModelId: z.string().trim().min(1).max(240),
941
+ models: z.array(surveyAssistantModelOptionSchema).min(1)
942
+ }).refine(({ defaultModelId, models }) => models.some((model) => model.id === defaultModelId), "The default model must be present in the model catalog.");
943
+ //#endregion
944
+ //#region src/protocol/lifecycle.ts
945
+ const SURVEY_ASSISTANT_TURN_FINAL_DATA_NAME = "survey-assistant-turn-final";
946
+ const SURVEY_ASSISTANT_TURN_FINAL_PART_TYPE = `data-${SURVEY_ASSISTANT_TURN_FINAL_DATA_NAME}`;
947
+ const surveyChangeSetSchema = z.object({
948
+ protocolVersion: surveyAssistantProtocolVersionSchema.default(1),
949
+ id: z.string().min(1),
950
+ turnId: z.string().min(1),
951
+ status: z.enum(["validated", "rejected"]),
952
+ summary: z.string().min(1).max(500),
953
+ operations: z.array(surveyOperationSchema),
954
+ supersedesChangeIds: z.array(z.string().min(1)).max(100).optional(),
955
+ precondition: surveyDocumentVersionSchema.optional(),
956
+ validation: surveyValidationResultSchema,
957
+ createdAt: z.string().min(1)
958
+ });
959
+ const surveyAssistantTurnFinalSchema = z.object({
960
+ protocolVersion: surveyAssistantProtocolVersionSchema,
961
+ turnId: z.string().min(1),
962
+ status: z.enum([
963
+ "completed",
964
+ "failed",
965
+ "aborted"
966
+ ]),
967
+ executableChangeSetIds: z.array(z.string().min(1)),
968
+ blockedChangeSetIds: z.array(z.string().min(1)).max(100).optional(),
969
+ createdAt: z.string().min(1)
970
+ }).superRefine((value, context) => {
971
+ if (value.status !== "completed" && value.executableChangeSetIds.length > 0) context.addIssue({
972
+ code: "custom",
973
+ message: "Failed or aborted turns cannot authorize executable change sets.",
974
+ path: ["executableChangeSetIds"]
975
+ });
976
+ if (new Set(value.executableChangeSetIds).size !== value.executableChangeSetIds.length) context.addIssue({
977
+ code: "custom",
978
+ message: "Executable change-set ids must be unique.",
979
+ path: ["executableChangeSetIds"]
980
+ });
981
+ const blockedChangeSetIds = value.blockedChangeSetIds ?? [];
982
+ if (new Set(blockedChangeSetIds).size !== blockedChangeSetIds.length) context.addIssue({
983
+ code: "custom",
984
+ message: "Blocked change-set ids must be unique.",
985
+ path: ["blockedChangeSetIds"]
986
+ });
987
+ if (blockedChangeSetIds.length > 0 && value.executableChangeSetIds.length > 0) context.addIssue({
988
+ code: "custom",
989
+ message: "A blocked turn cannot authorize executable change sets.",
990
+ path: ["executableChangeSetIds"]
991
+ });
992
+ });
993
+ const surveyAssistantApplyPolicySchema = z.enum([
994
+ "auto",
995
+ "review",
996
+ "deny"
997
+ ]);
998
+ const surveyApplyStatusSchema = z.enum([
999
+ "applied",
1000
+ "rejected",
1001
+ "stale",
1002
+ "failed"
1003
+ ]);
1004
+ const surveyApplyResultSchema = z.object({
1005
+ status: surveyApplyStatusSchema,
1006
+ changeId: z.string(),
1007
+ summary: z.string(),
1008
+ message: z.string(),
1009
+ appliedOperations: z.number().int().nonnegative(),
1010
+ issues: z.array(surveyValidationIssueSchema).optional()
1011
+ });
1012
+ const surveyBatchApplyResultSchema = z.object({ results: z.array(surveyApplyResultSchema) });
1013
+ const applyReceiptSchema = z.object({
1014
+ protocolVersion: surveyAssistantProtocolVersionSchema,
1015
+ turnId: z.string().min(1),
1016
+ changeSetId: z.string().min(1),
1017
+ beforeVersion: surveyDocumentVersionSchema,
1018
+ afterVersion: surveyDocumentVersionSchema.optional(),
1019
+ status: surveyApplyStatusSchema,
1020
+ operationCount: z.number().int().nonnegative(),
1021
+ commit: z.object({
1022
+ id: z.string().min(1).optional(),
1023
+ index: z.number().int().optional()
1024
+ }).optional(),
1025
+ issues: z.array(surveyValidationIssueSchema).optional(),
1026
+ createdAt: z.string().min(1)
1027
+ });
1028
+ const surveyAssistantDraftChangeEventSchema = surveyChangeSetSchema;
1029
+ //#endregion
1030
+ export { removeItemOperationSchema as $, surveyAssistantThreadTranscriptSchema as A, surveyAssistantErrorInfoSchema as At, surveyEditorUIContextSchema as B, surveyAssistantTaskRequestSchema as C, updateItemLabelOperationSchema as Ct, createSurveyAssistantThreadInputSchema as D, parseSurveyAssistantError as Dt, surveyAssistantTranslateContentResultSchema as E, surveyContentSchema as Et, surveyAssistantProtocolVersionSchema as F, assistantResponseSlotSchema as G, assistantItemAuthoringSchema as H, surveyAssistantSnapshotPayloadSchema as I, addChoiceOptionOperationSchema as J, surveyAssistantCapabilityManifestSchema as K, surveyAssistantSnapshotSchema as L, SURVEY_ASSISTANT_PROTOCOL_VERSION as M, rawSurveyDocumentSchema as N, surveyAssistantThreadListSchema as O, serializeSurveyAssistantError as Ot, surveyAssistantDraftChangePreconditionSchema as P, removeChoiceOptionOperationSchema as Q, surveyDocumentSnapshotSchema as R, surveyAssistantTaskItemSummarySchema as S, updateItemKeyOperationSchema as St, surveyAssistantTranslateContentInputSchema as T, jsonValueSchema as Tt, assistantItemCreateModeSchema as U, assistantContentSurfaceSchema as V, assistantItemTypeManifestSchema as W, jsonPatchOperationSchema as X, createItemOperationSchema as Y, patchItemConfigOperationSchema as Z, surveyAssistantSuggestItemLabelInputSchema as _, surveyPatchOperationSchema as _t, surveyApplyStatusSchema as a, surveyAssistantRemoveItemOperationSchema as at, surveyAssistantTaskContextSchema as b, updateChoiceOptionLabelOperationSchema as bt, surveyAssistantTurnFinalSchema as c, surveyAssistantUpdateChoiceOptionLabelOperationSchema as ct, surveyAssistantModelCatalogSchema as d, surveyAssistantUpdateItemLabelOperationSchema as dt, reorderChoiceOptionsOperationSchema as et, surveyAssistantModelOptionSchema as f, surveyAssistantUpdateItemTranslationOperationSchema as ft, surveyAssistantSuggestItemKeyResultSchema as g, surveyOperationSchema as gt, surveyAssistantSuggestItemKeyInputSchema as h, surveyJsonPatchOperationSchema as ht, surveyApplyResultSchema as i, surveyAssistantRemoveChoiceOptionOperationSchema as it, updateSurveyAssistantThreadInputSchema as j, surveyAssistantThreadSchema as k, surveyAssistantErrorCodeSchema as kt, surveyBatchApplyResultSchema as l, surveyAssistantUpdateItemColorOperationSchema as lt, surveyAssistantKeySuggestionSchema as m, surveyAssistantValidationResultSchema as mt, SURVEY_ASSISTANT_TURN_FINAL_PART_TYPE as n, surveyAssistantCreateItemOperationSchema as nt, surveyAssistantApplyPolicySchema as o, surveyAssistantReorderChoiceOptionsOperationSchema as ot, surveyAssistantKeySuggestionCategorySchema as p, surveyAssistantValidationIssueSchema as pt, SURVEY_OPERATION_KINDS as q, applyReceiptSchema as r, surveyAssistantOperationSchema as rt, surveyAssistantDraftChangeEventSchema as s, surveyAssistantSurveyJsonPatchOperationSchema as st, SURVEY_ASSISTANT_TURN_FINAL_DATA_NAME as t, surveyAssistantAddChoiceOptionOperationSchema as tt, surveyChangeSetSchema as u, surveyAssistantUpdateItemKeyOperationSchema as ut, surveyAssistantSuggestItemLabelResultSchema as v, surveyValidationIssueSchema as vt, surveyAssistantTranslateContentEntrySchema as w, updateItemTranslationOperationSchema as wt, surveyAssistantTaskInvocationModeSchema as x, updateItemColorOperationSchema as xt, surveyAssistantSuggestedTextSchema as y, surveyValidationResultSchema as yt, surveyDocumentVersionSchema as z };
1031
+
1032
+ //# sourceMappingURL=protocol-DV0ka9WT.mjs.map