@syntrologie/adapt-chatbot 2.57.1 → 2.58.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/dist/schema.d.ts CHANGED
@@ -195,6 +195,16 @@ export declare const chatBarPropsSchema: z.ZodObject<{
195
195
  elementsEnabled: z.ZodOptional<z.ZodBoolean>;
196
196
  uiTemplates: z.ZodOptional<z.ZodEffects<z.ZodRecord<z.ZodString, z.ZodUnknown>, Record<string, unknown>, Record<string, unknown>>>;
197
197
  voiceInput: z.ZodOptional<z.ZodBoolean>;
198
+ transcript: z.ZodOptional<z.ZodArray<z.ZodObject<{
199
+ role: z.ZodEnum<["user", "assistant"]>;
200
+ text: z.ZodString;
201
+ }, "strict", z.ZodTypeAny, {
202
+ text: string;
203
+ role: "user" | "assistant";
204
+ }, {
205
+ text: string;
206
+ role: "user" | "assistant";
207
+ }>, "many">>;
198
208
  supportChat: z.ZodOptional<z.ZodEffects<z.ZodObject<{
199
209
  vendor: z.ZodString;
200
210
  suppressNative: z.ZodOptional<z.ZodBoolean>;
@@ -277,6 +287,10 @@ export declare const chatBarPropsSchema: z.ZodObject<{
277
287
  ctaLabel: z.ZodOptional<z.ZodString>;
278
288
  }, z.ZodTypeAny, "passthrough"> | undefined;
279
289
  uiTemplates?: Record<string, unknown> | undefined;
290
+ transcript?: {
291
+ text: string;
292
+ role: "user" | "assistant";
293
+ }[] | undefined;
280
294
  elementsEnabled?: boolean | undefined;
281
295
  supportChat?: {
282
296
  vendor: string;
@@ -322,6 +336,10 @@ export declare const chatBarPropsSchema: z.ZodObject<{
322
336
  ctaLabel: z.ZodOptional<z.ZodString>;
323
337
  }, z.ZodTypeAny, "passthrough"> | undefined;
324
338
  uiTemplates?: Record<string, unknown> | undefined;
339
+ transcript?: {
340
+ text: string;
341
+ role: "user" | "assistant";
342
+ }[] | undefined;
325
343
  elementsEnabled?: boolean | undefined;
326
344
  supportChat?: {
327
345
  vendor: string;
@@ -814,14 +832,14 @@ export declare const chipsStripPropsSchema: z.ZodObject<{
814
832
  below: z.ZodUnknown;
815
833
  }, "strip", z.ZodTypeAny, {
816
834
  type: "score";
817
- threshold: number;
818
835
  field: string;
836
+ threshold: number;
819
837
  above?: unknown;
820
838
  below?: unknown;
821
839
  }, {
822
840
  type: "score";
823
- threshold: number;
824
841
  field: string;
842
+ threshold: number;
825
843
  above?: unknown;
826
844
  below?: unknown;
827
845
  }>, z.ZodObject<{
@@ -955,8 +973,8 @@ export declare const chipsStripPropsSchema: z.ZodObject<{
955
973
  default?: unknown;
956
974
  } | {
957
975
  type: "score";
958
- threshold: number;
959
976
  field: string;
977
+ threshold: number;
960
978
  above?: unknown;
961
979
  below?: unknown;
962
980
  } | {
@@ -1055,8 +1073,8 @@ export declare const chipsStripPropsSchema: z.ZodObject<{
1055
1073
  default?: unknown;
1056
1074
  } | {
1057
1075
  type: "score";
1058
- threshold: number;
1059
1076
  field: string;
1077
+ threshold: number;
1060
1078
  above?: unknown;
1061
1079
  below?: unknown;
1062
1080
  } | {
@@ -1155,8 +1173,8 @@ export declare const chipsStripPropsSchema: z.ZodObject<{
1155
1173
  default?: unknown;
1156
1174
  } | {
1157
1175
  type: "score";
1158
- threshold: number;
1159
1176
  field: string;
1177
+ threshold: number;
1160
1178
  above?: unknown;
1161
1179
  below?: unknown;
1162
1180
  } | {
@@ -1255,8 +1273,8 @@ export declare const chipsStripPropsSchema: z.ZodObject<{
1255
1273
  default?: unknown;
1256
1274
  } | {
1257
1275
  type: "score";
1258
- threshold: number;
1259
1276
  field: string;
1277
+ threshold: number;
1260
1278
  above?: unknown;
1261
1279
  below?: unknown;
1262
1280
  } | {
@@ -1357,8 +1375,8 @@ export declare const chipsStripPropsSchema: z.ZodObject<{
1357
1375
  default?: unknown;
1358
1376
  } | {
1359
1377
  type: "score";
1360
- threshold: number;
1361
1378
  field: string;
1379
+ threshold: number;
1362
1380
  above?: unknown;
1363
1381
  below?: unknown;
1364
1382
  } | {
@@ -1459,8 +1477,8 @@ export declare const chipsStripPropsSchema: z.ZodObject<{
1459
1477
  default?: unknown;
1460
1478
  } | {
1461
1479
  type: "score";
1462
- threshold: number;
1463
1480
  field: string;
1481
+ threshold: number;
1464
1482
  above?: unknown;
1465
1483
  below?: unknown;
1466
1484
  } | {
@@ -1649,6 +1667,16 @@ export declare const tileWidgets: ({
1649
1667
  elementsEnabled: z.ZodOptional<z.ZodBoolean>;
1650
1668
  uiTemplates: z.ZodOptional<z.ZodEffects<z.ZodRecord<z.ZodString, z.ZodUnknown>, Record<string, unknown>, Record<string, unknown>>>;
1651
1669
  voiceInput: z.ZodOptional<z.ZodBoolean>;
1670
+ transcript: z.ZodOptional<z.ZodArray<z.ZodObject<{
1671
+ role: z.ZodEnum<["user", "assistant"]>;
1672
+ text: z.ZodString;
1673
+ }, "strict", z.ZodTypeAny, {
1674
+ text: string;
1675
+ role: "user" | "assistant";
1676
+ }, {
1677
+ text: string;
1678
+ role: "user" | "assistant";
1679
+ }>, "many">>;
1652
1680
  supportChat: z.ZodOptional<z.ZodEffects<z.ZodObject<{
1653
1681
  vendor: z.ZodString;
1654
1682
  suppressNative: z.ZodOptional<z.ZodBoolean>;
@@ -1731,6 +1759,10 @@ export declare const tileWidgets: ({
1731
1759
  ctaLabel: z.ZodOptional<z.ZodString>;
1732
1760
  }, z.ZodTypeAny, "passthrough"> | undefined;
1733
1761
  uiTemplates?: Record<string, unknown> | undefined;
1762
+ transcript?: {
1763
+ text: string;
1764
+ role: "user" | "assistant";
1765
+ }[] | undefined;
1734
1766
  elementsEnabled?: boolean | undefined;
1735
1767
  supportChat?: {
1736
1768
  vendor: string;
@@ -1776,6 +1808,10 @@ export declare const tileWidgets: ({
1776
1808
  ctaLabel: z.ZodOptional<z.ZodString>;
1777
1809
  }, z.ZodTypeAny, "passthrough"> | undefined;
1778
1810
  uiTemplates?: Record<string, unknown> | undefined;
1811
+ transcript?: {
1812
+ text: string;
1813
+ role: "user" | "assistant";
1814
+ }[] | undefined;
1779
1815
  elementsEnabled?: boolean | undefined;
1780
1816
  supportChat?: {
1781
1817
  vendor: string;
@@ -2265,14 +2301,14 @@ export declare const tileWidgets: ({
2265
2301
  below: z.ZodUnknown;
2266
2302
  }, "strip", z.ZodTypeAny, {
2267
2303
  type: "score";
2268
- threshold: number;
2269
2304
  field: string;
2305
+ threshold: number;
2270
2306
  above?: unknown;
2271
2307
  below?: unknown;
2272
2308
  }, {
2273
2309
  type: "score";
2274
- threshold: number;
2275
2310
  field: string;
2311
+ threshold: number;
2276
2312
  above?: unknown;
2277
2313
  below?: unknown;
2278
2314
  }>, z.ZodObject<{
@@ -2406,8 +2442,8 @@ export declare const tileWidgets: ({
2406
2442
  default?: unknown;
2407
2443
  } | {
2408
2444
  type: "score";
2409
- threshold: number;
2410
2445
  field: string;
2446
+ threshold: number;
2411
2447
  above?: unknown;
2412
2448
  below?: unknown;
2413
2449
  } | {
@@ -2506,8 +2542,8 @@ export declare const tileWidgets: ({
2506
2542
  default?: unknown;
2507
2543
  } | {
2508
2544
  type: "score";
2509
- threshold: number;
2510
2545
  field: string;
2546
+ threshold: number;
2511
2547
  above?: unknown;
2512
2548
  below?: unknown;
2513
2549
  } | {
@@ -2606,8 +2642,8 @@ export declare const tileWidgets: ({
2606
2642
  default?: unknown;
2607
2643
  } | {
2608
2644
  type: "score";
2609
- threshold: number;
2610
2645
  field: string;
2646
+ threshold: number;
2611
2647
  above?: unknown;
2612
2648
  below?: unknown;
2613
2649
  } | {
@@ -2706,8 +2742,8 @@ export declare const tileWidgets: ({
2706
2742
  default?: unknown;
2707
2743
  } | {
2708
2744
  type: "score";
2709
- threshold: number;
2710
2745
  field: string;
2746
+ threshold: number;
2711
2747
  above?: unknown;
2712
2748
  below?: unknown;
2713
2749
  } | {
@@ -2808,8 +2844,8 @@ export declare const tileWidgets: ({
2808
2844
  default?: unknown;
2809
2845
  } | {
2810
2846
  type: "score";
2811
- threshold: number;
2812
2847
  field: string;
2848
+ threshold: number;
2813
2849
  above?: unknown;
2814
2850
  below?: unknown;
2815
2851
  } | {
@@ -2910,8 +2946,8 @@ export declare const tileWidgets: ({
2910
2946
  default?: unknown;
2911
2947
  } | {
2912
2948
  type: "score";
2913
- threshold: number;
2914
2949
  field: string;
2950
+ threshold: number;
2915
2951
  above?: unknown;
2916
2952
  below?: unknown;
2917
2953
  } | {
@@ -3440,14 +3476,14 @@ export declare const actionStepSchemas: {
3440
3476
  below: z.ZodUnknown;
3441
3477
  }, "strip", z.ZodTypeAny, {
3442
3478
  type: "score";
3443
- threshold: number;
3444
3479
  field: string;
3480
+ threshold: number;
3445
3481
  above?: unknown;
3446
3482
  below?: unknown;
3447
3483
  }, {
3448
3484
  type: "score";
3449
- threshold: number;
3450
3485
  field: string;
3486
+ threshold: number;
3451
3487
  above?: unknown;
3452
3488
  below?: unknown;
3453
3489
  }>, z.ZodObject<{
@@ -3581,8 +3617,8 @@ export declare const actionStepSchemas: {
3581
3617
  default?: unknown;
3582
3618
  } | {
3583
3619
  type: "score";
3584
- threshold: number;
3585
3620
  field: string;
3621
+ threshold: number;
3586
3622
  above?: unknown;
3587
3623
  below?: unknown;
3588
3624
  } | {
@@ -3681,8 +3717,8 @@ export declare const actionStepSchemas: {
3681
3717
  default?: unknown;
3682
3718
  } | {
3683
3719
  type: "score";
3684
- threshold: number;
3685
3720
  field: string;
3721
+ threshold: number;
3686
3722
  above?: unknown;
3687
3723
  below?: unknown;
3688
3724
  } | {
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAgFxB,eAAO,MAAM,YAAY;IACvB,gGAAgG;;IAEhG,4CAA4C;;IAE5C,iDAAiD;;IAEjD,6DAA6D;;IAE7D,uDAAuD;;;IAQvD;;;;;OAKG;;QAjCD,mFAAmF;;QAEnF,kEAAkE;;QAElE,iFAAiF;;QAEjF,+EAA+E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BjF,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAE/D,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;GAElD;AAMD;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAulBpB,CAAC;AAEZ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAM9D;;;;GAIG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BA2JonyB,CAAC;;;;4BAA0H,CAAC;;;;;;;;yBAA+Q,CAAC;;;;yBAAoG,CAAC;;;;;;;;;4BAAiX,CAAC;4BAA0C,CAAC;6BAA2C,CAAC;6BAA2C,CAAC;;;4BAAqF,CAAC;4BAA0C,CAAC;6BAA2C,CAAC;6BAA2C,CAAC;;;;;;;;;;;;;;;;;;;;;;;4BAA08B,CAAC;;;;4BAAgH,CAAC;;;;;;;;4BAA2S,CAAC;;;;4BAAsH,CAAC;;;;;;;;;;4BAAsW,CAAC;;;;;4BAAiJ,CAAC;;;;;;;;;;;;;kCAAu3B,CAAC;oCAAqE,CAAC;;kCAAqE,CAAC;oCAAqE,CAAC;;kCAAsE,CAAC;oCAAqE,CAAC;;kCAAqE,CAAC;oCAAqE,CAAC;;;;6BAAiV,CAAC;kCAA6C,CAAC;oCAAqE,CAAC;;;;6BAAoU,CAAC;kCAA6C,CAAC;oCAAqE,CAAC;;;;;;;;4BAA8Q,CAAC;2BAAyC,CAAC;;6BAAiQ,CAAC;kCAA6C,CAAC;oCAAqE,CAAC;;;;;;;;4BAAiQ,CAAC;2BAAyC,CAAC;;6BAAiQ,CAAC;kCAA6C,CAAC;oCAAqE,CAAC;;;;;;;;;;;;;;;;;;;4BAAmiB,CAAC;;;;yBAAgH,CAAC;;;4BAA2E,CAAC;4BAA0C,CAAC;6BAA2C,CAAC;6BAA2C,CAAC;;;;;;;;;4BAA4T,CAAC;;;;4BAAuH,CAAC;;;;;4BAAkJ,CAAC;;;;;;4BAAwM,CAAC;2BAAyC,CAAC;;6BAAiQ,CAAC;kCAA6C,CAAC;oCAAqE,CAAC;;;;qBAA4G,CAAC;;;;;;;;;;;;;;;4BAAkZ,CAAC;;;;yBAAgH,CAAC;;;4BAA2E,CAAC;4BAA0C,CAAC;6BAA2C,CAAC;6BAA2C,CAAC;;;;;;;;;4BAA4T,CAAC;;;;4BAAuH,CAAC;;;;;4BAAkJ,CAAC;;;;;;4BAAwM,CAAC;2BAAyC,CAAC;;6BAAiQ,CAAC;kCAA6C,CAAC;oCAAqE,CAAC;;;;qBAA4G,CAAC;;;;;;;;;;;;;;;;;;;4BAAif,CAAC;;;;yBAAgH,CAAC;;;4BAA2E,CAAC;4BAA0C,CAAC;6BAA2C,CAAC;6BAA2C,CAAC;;;;;;;;;4BAA4T,CAAC;;;;4BAAuH,CAAC;;;;;4BAAkJ,CAAC;;;;;;4BAAwM,CAAC;2BAAyC,CAAC;;6BAAiQ,CAAC;kCAA6C,CAAC;oCAAqE,CAAC;;;;qBAA4G,CAAC;;;;;;;;;;;;;;;;;;;4BAA8c,CAAC;;;;yBAAgH,CAAC;;;4BAA2E,CAAC;4BAA0C,CAAC;6BAA2C,CAAC;6BAA2C,CAAC;;;;;;;;;4BAA4T,CAAC;;;;4BAAuH,CAAC;;;;;4BAAkJ,CAAC;;;;;;4BAAwM,CAAC;2BAAyC,CAAC;;6BAAiQ,CAAC;kCAA6C,CAAC;oCAAqE,CAAC;;;;qBAA4G,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAA5oH,CAAC;;;;yBAAgH,CAAC;;;4BAA2E,CAAC;4BAA0C,CAAC;6BAA2C,CAAC;6BAA2C,CAAC;;;;;;;;;4BAA4T,CAAC;;;;4BAAuH,CAAC;;;;;4BAAkJ,CAAC;;;;;;4BAAwM,CAAC;2BAAyC,CAAC;;6BAAiQ,CAAC;kCAA6C,CAAC;oCAAqE,CAAC;;;;qBAA4G,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAA8c,CAAC;;;;yBAAgH,CAAC;;;4BAA2E,CAAC;4BAA0C,CAAC;6BAA2C,CAAC;6BAA2C,CAAC;;;;;;;;;4BAA4T,CAAC;;;;4BAAuH,CAAC;;;;;4BAAkJ,CAAC;;;;;;4BAAwM,CAAC;2BAAyC,CAAC;;6BAAiQ,CAAC;kCAA6C,CAAC;oCAAqE,CAAC;;;;qBAA4G,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAA5oH,CAAC;;;;yBAAgH,CAAC;;;4BAA2E,CAAC;4BAA0C,CAAC;6BAA2C,CAAC;6BAA2C,CAAC;;;;;;;;;4BAA4T,CAAC;;;;4BAAuH,CAAC;;;;;4BAAkJ,CAAC;;;;;;4BAAwM,CAAC;2BAAyC,CAAC;;6BAAiQ,CAAC;kCAA6C,CAAC;oCAAqE,CAAC;;;;qBAA4G,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAA8c,CAAC;;;;yBAAgH,CAAC;;;4BAA2E,CAAC;4BAA0C,CAAC;6BAA2C,CAAC;6BAA2C,CAAC;;;;;;;;;4BAA4T,CAAC;;;;4BAAuH,CAAC;;;;;4BAAkJ,CAAC;;;;;;4BAAwM,CAAC;2BAAyC,CAAC;;6BAAiQ,CAAC;kCAA6C,CAAC;oCAAqE,CAAC;;;;qBAA4G,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAA5oH,CAAC;;;;yBAAgH,CAAC;;;4BAA2E,CAAC;4BAA0C,CAAC;6BAA2C,CAAC;6BAA2C,CAAC;;;;;;;;;4BAA4T,CAAC;;;;4BAAuH,CAAC;;;;;4BAAkJ,CAAC;;;;;;4BAAwM,CAAC;2BAAyC,CAAC;;6BAAiQ,CAAC;kCAA6C,CAAC;oCAAqE,CAAC;;;;qBAA4G,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAA8c,CAAC;;;;yBAAgH,CAAC;;;4BAA2E,CAAC;4BAA0C,CAAC;6BAA2C,CAAC;6BAA2C,CAAC;;;;;;;;;4BAA4T,CAAC;;;;4BAAuH,CAAC;;;;;4BAAkJ,CAAC;;;;;;4BAAwM,CAAC;2BAAyC,CAAC;;6BAAiQ,CAAC;kCAA6C,CAAC;oCAAqE,CAAC;;;;qBAA4G,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAlJrkwC,CAAC;AAEZ,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAMpE;;;;GAIG;AACH,eAAO,MAAM,WAAW;;;;QAvqBtB,gGAAgG;;QAEhG,4CAA4C;;QAE5C,iDAAiD;;QAEjD,6DAA6D;;QAE7D,uDAAuD;;;QAQvD;;;;;WAKG;;YAjCD,mFAAmF;;YAEnF,kEAAkE;;YAElE,iFAAiF;;YAEjF,+EAA+E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAkzBmkyB,CAAC;;;;gCAA0H,CAAC;;;;;;;;6BAA+Q,CAAC;;;;6BAAoG,CAAC;;;;;;;;;gCAAiX,CAAC;gCAA0C,CAAC;iCAA2C,CAAC;iCAA2C,CAAC;;;gCAAqF,CAAC;gCAA0C,CAAC;iCAA2C,CAAC;iCAA2C,CAAC;;;;;;;;;;;;;;;;;;;;;;;gCAA08B,CAAC;;;;gCAAgH,CAAC;;;;;;;;gCAA2S,CAAC;;;;gCAAsH,CAAC;;;;;;;;;;gCAAsW,CAAC;;;;;gCAAiJ,CAAC;;;;;;;;;;;;;sCAAu3B,CAAC;wCAAqE,CAAC;;sCAAqE,CAAC;wCAAqE,CAAC;;sCAAsE,CAAC;wCAAqE,CAAC;;sCAAqE,CAAC;wCAAqE,CAAC;;;;iCAAiV,CAAC;sCAA6C,CAAC;wCAAqE,CAAC;;;;iCAAoU,CAAC;sCAA6C,CAAC;wCAAqE,CAAC;;;;;;;;gCAA8Q,CAAC;+BAAyC,CAAC;;iCAAiQ,CAAC;sCAA6C,CAAC;wCAAqE,CAAC;;;;;;;;gCAAiQ,CAAC;+BAAyC,CAAC;;iCAAiQ,CAAC;sCAA6C,CAAC;wCAAqE,CAAC;;;;;;;;;;;;;;;;;;;gCAAmiB,CAAC;;;;6BAAgH,CAAC;;;gCAA2E,CAAC;gCAA0C,CAAC;iCAA2C,CAAC;iCAA2C,CAAC;;;;;;;;;gCAA4T,CAAC;;;;gCAAuH,CAAC;;;;;gCAAkJ,CAAC;;;;;;gCAAwM,CAAC;+BAAyC,CAAC;;iCAAiQ,CAAC;sCAA6C,CAAC;wCAAqE,CAAC;;;;yBAA4G,CAAC;;;;;;;;;;;;;;;gCAAkZ,CAAC;;;;6BAAgH,CAAC;;;gCAA2E,CAAC;gCAA0C,CAAC;iCAA2C,CAAC;iCAA2C,CAAC;;;;;;;;;gCAA4T,CAAC;;;;gCAAuH,CAAC;;;;;gCAAkJ,CAAC;;;;;;gCAAwM,CAAC;+BAAyC,CAAC;;iCAAiQ,CAAC;sCAA6C,CAAC;wCAAqE,CAAC;;;;yBAA4G,CAAC;;;;;;;;;;;;;;;;;;;gCAAif,CAAC;;;;6BAAgH,CAAC;;;gCAA2E,CAAC;gCAA0C,CAAC;iCAA2C,CAAC;iCAA2C,CAAC;;;;;;;;;gCAA4T,CAAC;;;;gCAAuH,CAAC;;;;;gCAAkJ,CAAC;;;;;;gCAAwM,CAAC;+BAAyC,CAAC;;iCAAiQ,CAAC;sCAA6C,CAAC;wCAAqE,CAAC;;;;yBAA4G,CAAC;;;;;;;;;;;;;;;;;;;gCAA8c,CAAC;;;;6BAAgH,CAAC;;;gCAA2E,CAAC;gCAA0C,CAAC;iCAA2C,CAAC;iCAA2C,CAAC;;;;;;;;;gCAA4T,CAAC;;;;gCAAuH,CAAC;;;;;gCAAkJ,CAAC;;;;;;gCAAwM,CAAC;+BAAyC,CAAC;;iCAAiQ,CAAC;sCAA6C,CAAC;wCAAqE,CAAC;;;;yBAA4G,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAA5oH,CAAC;;;;6BAAgH,CAAC;;;gCAA2E,CAAC;gCAA0C,CAAC;iCAA2C,CAAC;iCAA2C,CAAC;;;;;;;;;gCAA4T,CAAC;;;;gCAAuH,CAAC;;;;;gCAAkJ,CAAC;;;;;;gCAAwM,CAAC;+BAAyC,CAAC;;iCAAiQ,CAAC;sCAA6C,CAAC;wCAAqE,CAAC;;;;yBAA4G,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAA8c,CAAC;;;;6BAAgH,CAAC;;;gCAA2E,CAAC;gCAA0C,CAAC;iCAA2C,CAAC;iCAA2C,CAAC;;;;;;;;;gCAA4T,CAAC;;;;gCAAuH,CAAC;;;;;gCAAkJ,CAAC;;;;;;gCAAwM,CAAC;+BAAyC,CAAC;;iCAAiQ,CAAC;sCAA6C,CAAC;wCAAqE,CAAC;;;;yBAA4G,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAA5oH,CAAC;;;;6BAAgH,CAAC;;;gCAA2E,CAAC;gCAA0C,CAAC;iCAA2C,CAAC;iCAA2C,CAAC;;;;;;;;;gCAA4T,CAAC;;;;gCAAuH,CAAC;;;;;gCAAkJ,CAAC;;;;;;gCAAwM,CAAC;+BAAyC,CAAC;;iCAAiQ,CAAC;sCAA6C,CAAC;wCAAqE,CAAC;;;;yBAA4G,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAA8c,CAAC;;;;6BAAgH,CAAC;;;gCAA2E,CAAC;gCAA0C,CAAC;iCAA2C,CAAC;iCAA2C,CAAC;;;;;;;;;gCAA4T,CAAC;;;;gCAAuH,CAAC;;;;;gCAAkJ,CAAC;;;;;;gCAAwM,CAAC;+BAAyC,CAAC;;iCAAiQ,CAAC;sCAA6C,CAAC;wCAAqE,CAAC;;;;yBAA4G,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAA5oH,CAAC;;;;6BAAgH,CAAC;;;gCAA2E,CAAC;gCAA0C,CAAC;iCAA2C,CAAC;iCAA2C,CAAC;;;;;;;;;gCAA4T,CAAC;;;;gCAAuH,CAAC;;;;;gCAAkJ,CAAC;;;;;;gCAAwM,CAAC;+BAAyC,CAAC;;iCAAiQ,CAAC;sCAA6C,CAAC;wCAAqE,CAAC;;;;yBAA4G,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAA8c,CAAC;;;;6BAAgH,CAAC;;;gCAA2E,CAAC;gCAA0C,CAAC;iCAA2C,CAAC;iCAA2C,CAAC;;;;;;;;;gCAA4T,CAAC;;;;gCAAuH,CAAC;;;;;gCAAkJ,CAAC;;;;;;gCAAwM,CAAC;+BAAyC,CAAC;;iCAAiQ,CAAC;sCAA6C,CAAC;wCAAqE,CAAC;;;;yBAA4G,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IArH/kwC,CAAC;AAMF,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;CAgGtC,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAGwnyB,CAAC;;;;4BAA0H,CAAC;;;;;;;;yBAA+Q,CAAC;;;;yBAAoG,CAAC;;;;;;;;;4BAAiX,CAAC;4BAA0C,CAAC;6BAA2C,CAAC;6BAA2C,CAAC;;;4BAAqF,CAAC;4BAA0C,CAAC;6BAA2C,CAAC;6BAA2C,CAAC;;;;;;;;;;;;;;;;;;;;;;;4BAA08B,CAAC;;;;4BAAgH,CAAC;;;;;;;;4BAA2S,CAAC;;;;4BAAsH,CAAC;;;;;;;;;;4BAAsW,CAAC;;;;;4BAAiJ,CAAC;;;;;;;;;;;;;kCAAu3B,CAAC;oCAAqE,CAAC;;kCAAqE,CAAC;oCAAqE,CAAC;;kCAAsE,CAAC;oCAAqE,CAAC;;kCAAqE,CAAC;oCAAqE,CAAC;;;;6BAAiV,CAAC;kCAA6C,CAAC;oCAAqE,CAAC;;;;6BAAoU,CAAC;kCAA6C,CAAC;oCAAqE,CAAC;;;;;;;;4BAA8Q,CAAC;2BAAyC,CAAC;;6BAAiQ,CAAC;kCAA6C,CAAC;oCAAqE,CAAC;;;;;;;;4BAAiQ,CAAC;2BAAyC,CAAC;;6BAAiQ,CAAC;kCAA6C,CAAC;oCAAqE,CAAC;;;;;;;;;;;;;;;;;;;4BAAmiB,CAAC;;;;yBAAgH,CAAC;;;4BAA2E,CAAC;4BAA0C,CAAC;6BAA2C,CAAC;6BAA2C,CAAC;;;;;;;;;4BAA4T,CAAC;;;;4BAAuH,CAAC;;;;;4BAAkJ,CAAC;;;;;;4BAAwM,CAAC;2BAAyC,CAAC;;6BAAiQ,CAAC;kCAA6C,CAAC;oCAAqE,CAAC;;;;qBAA4G,CAAC;;;;;;;;;;;;;;;4BAAkZ,CAAC;;;;yBAAgH,CAAC;;;4BAA2E,CAAC;4BAA0C,CAAC;6BAA2C,CAAC;6BAA2C,CAAC;;;;;;;;;4BAA4T,CAAC;;;;4BAAuH,CAAC;;;;;4BAAkJ,CAAC;;;;;;4BAAwM,CAAC;2BAAyC,CAAC;;6BAAiQ,CAAC;kCAA6C,CAAC;oCAAqE,CAAC;;;;qBAA4G,CAAC;;;;;;;;;;;;;;;;;;;4BAAif,CAAC;;;;yBAAgH,CAAC;;;4BAA2E,CAAC;4BAA0C,CAAC;6BAA2C,CAAC;6BAA2C,CAAC;;;;;;;;;4BAA4T,CAAC;;;;4BAAuH,CAAC;;;;;4BAAkJ,CAAC;;;;;;4BAAwM,CAAC;2BAAyC,CAAC;;6BAAiQ,CAAC;kCAA6C,CAAC;oCAAqE,CAAC;;;;qBAA4G,CAAC;;;;;;;;;;;;;;;;;;;4BAA8c,CAAC;;;;yBAAgH,CAAC;;;4BAA2E,CAAC;4BAA0C,CAAC;6BAA2C,CAAC;6BAA2C,CAAC;;;;;;;;;4BAA4T,CAAC;;;;4BAAuH,CAAC;;;;;4BAAkJ,CAAC;;;;;;4BAAwM,CAAC;2BAAyC,CAAC;;6BAAiQ,CAAC;kCAA6C,CAAC;oCAAqE,CAAC;;;;qBAA4G,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAA5oH,CAAC;;;;yBAAgH,CAAC;;;4BAA2E,CAAC;4BAA0C,CAAC;6BAA2C,CAAC;6BAA2C,CAAC;;;;;;;;;4BAA4T,CAAC;;;;4BAAuH,CAAC;;;;;4BAAkJ,CAAC;;;;;;4BAAwM,CAAC;2BAAyC,CAAC;;6BAAiQ,CAAC;kCAA6C,CAAC;oCAAqE,CAAC;;;;qBAA4G,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAA8c,CAAC;;;;yBAAgH,CAAC;;;4BAA2E,CAAC;4BAA0C,CAAC;6BAA2C,CAAC;6BAA2C,CAAC;;;;;;;;;4BAA4T,CAAC;;;;4BAAuH,CAAC;;;;;4BAAkJ,CAAC;;;;;;4BAAwM,CAAC;2BAAyC,CAAC;;6BAAiQ,CAAC;kCAA6C,CAAC;oCAAqE,CAAC;;;;qBAA4G,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAD/kwC,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
package/dist/schema.js CHANGED
@@ -423,6 +423,9 @@ var chatBarPropsSchema = external_exports.object({
423
423
  voiceInput: external_exports.boolean().optional().describe(
424
424
  "Show a mic button that dictates into the input via the browser Web Speech API where supported (vendor-cloud recognition; degrades to hidden when unsupported). Absent/false = no button."
425
425
  ),
426
+ transcript: external_exports.array(external_exports.object({ role: external_exports.enum(["user", "assistant"]), text: external_exports.string().min(1) }).strict()).min(1).max(6).optional().describe(
427
+ "Preview only: a fixed exchange the bar shows read-only. No conversation starts, nothing is sent, and the input is disabled."
428
+ ),
426
429
  supportChat: external_exports.object({
427
430
  vendor: external_exports.string().min(1),
428
431
  suppressNative: external_exports.boolean().optional(),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/generated/mount-tool-description.json", "../src/generated/widget-props-field-index.json", "../src/schema.ts"],
4
- "sourcesContent": ["{\n \"maxLength\": 1024,\n \"base\": \"Mount a {type_key} element. Pick template_id; author the fields.\",\n \"templatesPrefix\": \" Templates: \",\n \"templateItem\": \"'{id}' \u2014 {description}\",\n \"templateSeparator\": \"; \",\n \"notePrefix\": \" \",\n \"notes\": {\n \"syntro-product-reco-carousel\": \"The store's recommendation engine picks the products in this carousel; heading and focus steer it, they do not choose which products appear.\",\n \"adaptive-chatbot:leave-a-message\": \"Mounting shows the visitor a draft card; nothing is sent until the visitor taps Send in it, so never say it was sent or is on its way: ask them to review it and tap Send.\"\n }\n}\n", "{\n \"$comment\": \"DO NOT EDIT BY HAND \u2014 generated from packages/runtime-sdk/schema/canvas-config.schema.json and platform/common/syntrologie_common/sdk/widget-props-always-allowed-fields.json. Re-run: node packages/runtime-sdk/scripts/generate-widget-props-field-index.mjs. Consumed by packages/adaptives/adaptive-chatbot/src/schema.ts (uiTemplates dangling-field-reference rule). Mirrors platform/common/syntrologie_common/sdk/schema.py:widget_schema_field_exists \u2014 same resolution semantics, same widget allowlist (_DANGLING_CHECK_WIDGETS in adaptive_tools_gen.py) \u2014 keep both in sync. The $alwaysAllowedFields key is the merged tileChromeFields/handleField/handlesField from the always-allowed-fields JSON above \u2014 fields that are NEVER real widget-props properties for ANY widget.\",\n \"$alwaysAllowedFields\": [\n \"icon\",\n \"product_handle\",\n \"product_handles\",\n \"subtitle\",\n \"title\"\n ],\n \"adaptive-product:card\": [\n \"density\",\n \"product\",\n \"product.attributes\",\n \"product.availability\",\n \"product.badge\",\n \"product.badge.label\",\n \"product.badge.tone\",\n \"product.brand\",\n \"product.ctas\",\n \"product.framing\",\n \"product.id\",\n \"product.identifiers\",\n \"product.identifiers.gtin\",\n \"product.identifiers.mpn\",\n \"product.identifiers.shopifyHandle\",\n \"product.identifiers.sku\",\n \"product.identifiers.wooSlug\",\n \"product.image\",\n \"product.image.alt\",\n \"product.image.bind\",\n \"product.image.src\",\n \"product.labels\",\n \"product.name\",\n \"product.price\",\n \"product.price.amount\",\n \"product.price.bind\",\n \"product.price.cadence\",\n \"product.rating\",\n \"product.rating.count\",\n \"product.rating.max\",\n \"product.rating.value\",\n \"product.salePrice\",\n \"product.salePrice.amount\",\n \"product.salePrice.bind\",\n \"product.salePrice.cadence\",\n \"product.salePrice.validUntil\",\n \"product.specs\",\n \"product.tagline\",\n \"product.variants\",\n \"product.variants.attributes\",\n \"product.variants.variants\",\n \"visibleFacts\"\n ],\n \"adaptive-product:comparison\": [\n \"heading\",\n \"products\",\n \"rows\"\n ]\n}\n", "/**\n * Adaptive Chatbot - Config Schema\n *\n * Zod schema for validating chatbot widget configuration.\n */\n\nimport { z } from 'zod';\n\nimport { SuggestionChipSchema } from './AdaptiveChipsStrip';\nimport mountToolDescriptionSpec from './generated/mount-tool-description.json';\nimport widgetPropsFieldIndex from './generated/widget-props-field-index.json';\n\n// Key `generate-widget-props-field-index.mjs` writes the merged tile-chrome /\n// hydration-handle exemption list under \u2014 see the `uiTemplates` superRefine\n// below (dangling widget-props field references) for the read side.\nconst ALWAYS_ALLOWED_FIELDS_KEY = '$alwaysAllowedFields';\n\n// The widget composes `${backendUrl}/api/adaptive/stream` (AG-UI chat turns)\n// and `${backendUrl}/api/adaptive/session` (server-push SSE: nudges, typing,\n// snapshots). backendUrl must be either:\n// - \"\" (empty string) \u2014 same-origin opt-in; resolves to /api/adaptive/*\n// - an absolute http:// or https:// URL \u2014 the chat backend's origin\n// A relative path like \"/api/chat\" produces \"/api/chat/api/adaptive/session\"\n// which 404s on the host SPA and surfaces as a generic SSE error.\n//\n// Split into a `.url()` branch + literal \"\" branch so zod-to-json-schema\n// produces an `anyOf` that AJV (used by `make sdk-validate`) enforces.\n// Refinements alone do not survive the JSON-schema translation.\nconst backendUrlSchema = z.union(\n [\n z\n .string()\n .url('backendUrl must be an absolute URL')\n .regex(/^https?:\\/\\//, 'backendUrl must use http or https'),\n z.literal(''),\n ],\n {\n errorMap: () => ({\n message:\n 'backendUrl must be either \"\" (same-origin) or an absolute http(s):// URL \u2014 relative paths are not allowed',\n }),\n }\n);\n\n// Per-customer fallback card. Rendered in place of the chat input when the\n// chat backend is unreachable for any reason (most commonly: Cloudflare\n// Turnstile bot-check failure for an end-user on a hardened browser / locked\n// network). The customer fills these in; we never show Cloudflare branding\n// to the end-user.\n//\n// `ctaHref` follows the same absolute-URL guard as `backendUrl` so a typo\n// like \"/support\" can't 404 on the host SPA \u2014 must be empty (same-origin)\n// or an absolute http(s):// URL pointing to the customer's existing support\n// path.\nconst fallbackHrefSchema = z.union(\n [\n z\n .string()\n .url('fallback.ctaHref must be an absolute URL')\n .regex(/^https?:\\/\\//, 'fallback.ctaHref must use http or https'),\n z.literal(''),\n ],\n {\n errorMap: () => ({\n message: 'fallback.ctaHref must be either \"\" (same-origin) or an absolute http(s):// URL',\n }),\n }\n);\n\n// `.strict()` so unknown keys are rejected at validation time (matches the\n// emitted JSON Schema's `additionalProperties: false`). Future fields land\n// here intentionally rather than silently slipping through and behaving\n// like feature stubs.\nconst fallbackSchema = z\n .object({\n /** Header shown on the fallback card. Defaults to a generic \"unavailable\" copy. */\n title: z.string().optional(),\n /** Body copy explaining the situation in the customer's voice. */\n message: z.string().optional(),\n /** Label for the call-to-action link. If `ctaHref` is set this should be too. */\n ctaLabel: z.string().optional(),\n /** Target of the CTA link \u2014 typically the customer's existing support path. */\n ctaHref: fallbackHrefSchema.optional(),\n })\n .strict();\n\nexport const configSchema = z.object({\n /** Backend URL for the chat API endpoint. \"\" for same-origin, or an absolute http(s):// URL. */\n backendUrl: backendUrlSchema,\n /** MLflow run ID for experiment tracking */\n mlflowRunId: z.string().optional(),\n /** Greeting message shown when the chat opens */\n greeting: z.string().default('Hi! How can I help?'),\n /** Maximum number of history messages sent to the backend */\n maxHistory: z.number().int().min(1).max(100).default(20),\n /** Quick-reply suggestions shown in the empty state */\n suggestions: z.array(z.string()).optional(),\n voiceInput: z\n .boolean()\n .optional()\n .describe(\n 'Show a mic button that dictates into the input via the browser Web Speech API where supported (vendor-cloud recognition; degrades to hidden when unsupported). Absent/false = no button.'\n ),\n /**\n * Per-customer fallback card rendered when chat can't open (Turnstile\n * failure, network error, etc.). The end-user is redirected to the\n * customer's normal support path \u2014 no Cloudflare-branded challenge is\n * ever shown.\n */\n fallback: fallbackSchema.optional(),\n});\n\nexport type ChatbotConfigSchema = z.infer<typeof configSchema>;\n\nexport function validateChatbotConfig(data: unknown) {\n return configSchema.safeParse(data);\n}\n\n// ============================================================================\n// Chat Bar Props (adaptive-chatbot:chat-bar widget)\n// ============================================================================\n\n/**\n * Props schema for the `adaptive-chatbot:chat-bar` widget. This is the\n * headless chat-input shell \u2014 no transport, no message persistence.\n * Customers wire `chat-message-sent` / `chat-interrupt` / `canvas-close`\n * to their own pipeline.\n *\n * All fields are optional: the bar renders an empty trail + send-only\n * placeholder if nothing is passed. Authors who want a stateful chat\n * use `adaptive-chatbot:assistant` instead.\n */\nexport const chatBarPropsSchema = z\n .object({\n placeholder: z\n .string()\n .optional()\n .describe('Input placeholder copy. Defaults to \"Ask, find, or navigate\u2026\".'),\n assistantName: z\n .string()\n .optional()\n .describe(\n 'Name shown in the (forceExpanded) chat header. Defaults to \"Assistant\". Per-workspace override, e.g. \"Vela Concierge\".'\n ),\n personas: z\n .array(\n z.object({\n id: z.string().min(1),\n name: z.string().min(1).max(24),\n role_title: z.string().max(48).optional(),\n pronouns: z.string().max(16).optional(),\n avatar: z\n .object({\n sm: z.string().url().optional(),\n md: z.string().url().optional(),\n lg: z.string().url().optional(),\n })\n .optional(),\n intro_line: z.string().max(160).optional(),\n })\n )\n .optional()\n .describe(\n 'Persona roster (FEAT-1784917430): human-presenting concierge identities. One is 50:50 sticky-assigned per visitor; its name/avatar render in the header, trail, and typing line, and the name enters the LLM voice. The header always carries an \"AI concierge\" disclosure.'\n ),\n // `messages` and `inFlight` are runtime state \u2014 included here so\n // authors who pre-seed a conversation (e.g. a demo or guided\n // walkthrough) can declare it. Most production deployments will\n // leave these blank and update them via the mountable's API.\n messages: z\n .array(\n z.object({\n id: z.union([z.number(), z.string()]),\n role: z.enum(['user', 'assistant']),\n text: z.string(),\n })\n )\n .optional(),\n inFlight: z.boolean().optional(),\n forceExpanded: z\n .boolean()\n .optional()\n .describe(\n 'Render the trail + input expanded immediately on mount instead of waiting for the first message. Used on canvases where the chat IS the surface (velvet, dedicated drawer).'\n ),\n backendUrl: z\n .string()\n .optional()\n .describe(\n 'Backend chat endpoint. Empty string + non-undefined enables relative-URL fetches (the host page proxies /api/* to the backend).'\n ),\n greeting: z.string().optional().describe('Greeting line shown above the input on first mount.'),\n introSuggestion: z\n .object({\n label: z.string().min(1),\n prompt: z.string().min(1),\n })\n .optional()\n .describe(\n 'Pre-conversation tap-target shown alongside the greeting when no messages exist. `label` is the button copy the visitor sees; `prompt` is the text submitted on tap, exactly as if they had typed it.'\n ),\n fallback: z\n .object({\n title: z.string().optional(),\n message: z.string().optional(),\n ctaLabel: z.string().optional(),\n })\n .passthrough()\n .optional()\n .describe('Per-customer \"chat unavailable\" card shown when the transport gives up.'),\n elementsEnabled: z\n .boolean()\n .optional()\n .describe(\n 'Opt the chat into the LLM-authored UI element pipeline. When true AND uiTemplates is set, the backend exposes mount_element / patch_element / unmount_element tools scoped to the declared templates.'\n ),\n uiTemplates: z\n .record(z.unknown())\n .superRefine((block, ctx) => {\n // ---------------------------------------------------------------------------\n // Type-homogeneity gate \u2014 mirrors Python UiTemplatesBlock._types_are_homogeneous\n //\n // All templates of the same type must share an authorable field shape.\n // Per-type mount tools assume that every template of a given widget/kind\n // exposes the same set of field names, the same required flags, the same\n // admin_pinned_fields, and the same EnumField value sets. A divergent\n // template would produce a value that is schema-valid but server-rejected.\n //\n // Groups: tiles by `widget`; items+actions by `kind`.\n // 4-dimension signature per group member:\n // 1. frozenset of field keys\n // 2. frozenset of field keys where required === true\n // 3. frozenset of admin_pinned_fields\n // 4. sorted enum values per enum field (order-independent comparison)\n //\n // The data is untyped (z.unknown()), so we read defensively: treat missing\n // arrays as [], missing fields as {}.\n // ---------------------------------------------------------------------------\n\n type TemplateRaw = {\n id?: unknown;\n description?: unknown;\n widget?: unknown;\n kind?: unknown;\n fields?: unknown;\n admin_pinned_fields?: unknown;\n default_slot?: unknown;\n default_starred?: unknown;\n allowed_slots?: unknown;\n default_parent?: unknown;\n allowed_parents?: unknown;\n placement_type?: unknown;\n allowed_targets?: unknown;\n };\n\n function asStringArray(v: unknown): string[] {\n if (!Array.isArray(v)) return [];\n return v.filter((x): x is string => typeof x === 'string');\n }\n\n function asFieldsRecord(v: unknown): Record<string, unknown> {\n if (v !== null && typeof v === 'object' && !Array.isArray(v)) {\n return v as Record<string, unknown>;\n }\n return {};\n }\n\n function templateSignature(\n t: TemplateRaw\n ): readonly [Set<string>, Set<string>, Set<string>, Array<[string, string[]]>] {\n const fields = asFieldsRecord(t.fields);\n const fieldKeys = new Set(Object.keys(fields));\n\n const requiredKeys = new Set<string>();\n for (const [k, spec] of Object.entries(fields)) {\n const s = spec as Record<string, unknown> | null | undefined;\n if (s && typeof s === 'object' && s.required === true) {\n requiredKeys.add(k);\n }\n }\n\n const pinned = new Set(asStringArray(t.admin_pinned_fields));\n\n const enumValues: Array<[string, string[]]> = [];\n for (const [k, spec] of Object.entries(fields)) {\n const s = spec as Record<string, unknown> | null | undefined;\n if (s && typeof s === 'object' && s.type === 'enum') {\n const vals = asStringArray(s.values).slice().sort();\n enumValues.push([k, vals]);\n }\n }\n enumValues.sort(([a], [b]) => a.localeCompare(b));\n\n return [fieldKeys, requiredKeys, pinned, enumValues] as const;\n }\n\n function signaturesEqual(\n a: ReturnType<typeof templateSignature>,\n b: ReturnType<typeof templateSignature>\n ): boolean {\n // 1. field keys\n if (a[0].size !== b[0].size) return false;\n for (const k of a[0]) if (!b[0].has(k)) return false;\n\n // 2. required keys\n if (a[1].size !== b[1].size) return false;\n for (const k of a[1]) if (!b[1].has(k)) return false;\n\n // 3. pinned keys\n if (a[2].size !== b[2].size) return false;\n for (const k of a[2]) if (!b[2].has(k)) return false;\n\n // 4. enum values (sorted arrays of [field, sorted-values] pairs)\n if (a[3].length !== b[3].length) return false;\n for (let i = 0; i < a[3].length; i++) {\n const [ak, av] = a[3][i];\n const [bk, bv] = b[3][i];\n if (ak !== bk) return false;\n if (av.length !== bv.length) return false;\n for (let j = 0; j < av.length; j++) {\n if (av[j] !== bv[j]) return false;\n }\n }\n\n return true;\n }\n\n const groups = new Map<string, TemplateRaw[]>();\n\n const tiles = Array.isArray(block.tiles) ? (block.tiles as TemplateRaw[]) : [];\n for (const t of tiles) {\n if (typeof t.widget === 'string') {\n const key = `widget:${t.widget}`;\n const group = groups.get(key) ?? [];\n group.push(t);\n groups.set(key, group);\n }\n }\n\n const items = Array.isArray(block.items) ? (block.items as TemplateRaw[]) : [];\n const actions = Array.isArray(block.actions) ? (block.actions as TemplateRaw[]) : [];\n for (const t of [...items, ...actions]) {\n if (typeof t.kind === 'string') {\n const key = `kind:${t.kind}`;\n const group = groups.get(key) ?? [];\n group.push(t);\n groups.set(key, group);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Per-template cross-field gates \u2014 mirror ALL five Python model validators\n // (TileTemplate/ItemTemplate/ActionTemplate in\n // syntrologie_common/sdk/templates.py). Each spans TWO fields at once, so\n // JSON Schema cannot express it and zod refinements do not survive\n // zod-to-json-schema \u2014 this refinement is the authoring-time home.\n //\n // The runtime rejects a bad block ALL-OR-NOTHING and only logs it, so every\n // mount_* tool silently vanishes for the turn (BUG-1786640934: a contact-card\n // pinned `heading`/`channels`, neither a declared field, and the whole\n // workspace lost its elements capability).\n // ---------------------------------------------------------------------------\n\n // ---------------------------------------------------------------------------\n // 5. Dangling widget-props field references.\n //\n // `widgetPropsFieldIndex` is generated (never hand-typed) by\n // packages/runtime-sdk/scripts/generate-widget-props-field-index.mjs\n // from the SAME canvas-config.schema.json that Python's\n // `syntrologie_common.sdk.schema.widget_schema_field_exists` reads \u2014\n // one data source, two per-language walkers (see that script's\n // module docstring for why the walking code itself can't be\n // shared across a browser-bundled TS file and a server-side Python\n // module). Scoped to the SAME small widget allowlist as the\n // runtime's own `_DANGLING_CHECK_WIDGETS`\n // (adaptive_tools_gen.py) \u2014 a widget not in the generated index is\n // silently exempt, matching the runtime's own scoping (several\n // widgets don't map fields 1:1 onto their props root; see that\n // script's docstring).\n //\n // This is the authoring-time half of the SAME condition the\n // runtime already detects and fail-open-drops (adaptive_tools_gen.\n // dangling_field_dropped) \u2014 that log-only drop stays, unchanged,\n // for configs published before this rule existed; this rule stops\n // a NEW dangling reference from being authored in the first place.\n // The generated file also carries a `$comment` header string and an\n // `$alwaysAllowedFields` string array (see below) alongside the\n // per-widget path arrays \u2014 cast through `unknown` since `$comment`\n // intentionally breaks a direct `Record<string, string[]>` shape;\n // `checkDanglingFieldReferences` only ever reads a widget key that\n // came from `t.widget` (a real widget const), so `$comment` is\n // never looked up as a widget.\n const widgetFieldIndex = widgetPropsFieldIndex as unknown as Record<string, string[]>;\n\n // Fields that are structurally part of a TileTemplate's authoring\n // surface but are NEVER real widget-props properties, so this check\n // must not flag them as dangling: tile chrome (title/icon/subtitle,\n // rendered by the tile shell) and search-hydration handles\n // (product_handle/product_handles, popped by the mount executor\n // BEFORE the widget ever sees its props). Read from the SAME\n // generated `widgetPropsFieldIndex` above \u2014 never hand-retyped here\n // \u2014 so this list can only ever match what `syntrologie_common.sdk.\n // schema.TILE_CHROME_FIELDS`/`HANDLE_FIELD`/`HANDLES_FIELD` load\n // from `platform/common/syntrologie_common/sdk/widget-props-always-\n // allowed-fields.json`, the single source both languages derive\n // from (see `generate-widget-props-field-index.mjs`'s module\n // docstring). A prior version of this rule hand-retyped this exact\n // list and silently drifted from Python (BUG-1786833318) \u2014 flagging\n // `title`/`icon`/`product_handle`(s) as dangling on every real\n // production config (main-peptides-demo-publish.json,\n // iglowmedspa-demo-publish.json, nei-native-demo-publish.json all\n // author them on adaptive-product:card/:comparison templates).\n // BUG-1786834379 moved the list into the generated artifact so\n // that class of drift is structurally impossible: the freshness\n // check (`make app-check-widget-props-field-index-fresh`) fails if\n // this array is ever stale relative to its JSON source.\n const alwaysAllowedRaw = widgetFieldIndex[ALWAYS_ALLOWED_FIELDS_KEY];\n if (!Array.isArray(alwaysAllowedRaw)) {\n throw new Error(\n `widget-props-field-index.json is missing \"${ALWAYS_ALLOWED_FIELDS_KEY}\" \u2014 regenerate via ` +\n 'node packages/runtime-sdk/scripts/generate-widget-props-field-index.mjs'\n );\n }\n const NEVER_DANGLING_FIELDS = new Set(alwaysAllowedRaw);\n\n function checkDanglingFieldReferences(t: TemplateRaw, where: string): void {\n if (typeof t.widget !== 'string') return; // items/actions carry `kind`, not `widget` \u2014 not in scope\n const validPaths = widgetFieldIndex[t.widget];\n if (!validPaths) return; // widget outside the checked allowlist \u2014 genuinely unchecked, not a false negative\n const validSet = new Set(validPaths);\n const fields = asFieldsRecord(t.fields);\n for (const key of Object.keys(fields)) {\n if (validSet.has(key) || NEVER_DANGLING_FIELDS.has(key)) continue;\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n `${where}: field ${JSON.stringify(key)} does not exist in the ${JSON.stringify(t.widget)} ` +\n `widget's props schema \u2014 it was removed, renamed, or never existed. Remove it from ` +\n `\\`fields\\`, or point it at the widget's current path.`,\n });\n }\n }\n\n /** Dunder / prototype-pollution names \u2014 mirrors RESERVED_FIELD_SEGMENTS. */\n const RESERVED_SEGMENTS = new Set([\n '__class__',\n '__init__',\n '__proto__',\n '__dict__',\n '__getattribute__',\n '__setattr__',\n 'constructor',\n 'prototype',\n ]);\n\n function checkTemplate(t: TemplateRaw, where: string): void {\n const fields = asFieldsRecord(t.fields);\n const fieldKeys = Object.keys(fields);\n\n // 1. admin_pinned_fields must be a subset of the declared fields.\n // Props the LLM cannot author are already un-authorable by NOT being\n // fields; pinning a non-field is a no-op the runtime treats as fatal.\n const unknownPins = asStringArray(t.admin_pinned_fields).filter(\n (name) => !(name in fields)\n );\n if (unknownPins.length > 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n `${where}: admin_pinned_fields references unknown fields: ` +\n `${JSON.stringify(unknownPins)} \u2014 every pinned name must be a key of ` +\n `\\`fields\\` (declared: ${JSON.stringify(fieldKeys)})`,\n });\n }\n\n // 2. default_slot must be one of allowed_slots (tiles only).\n if (typeof t.default_slot === 'string') {\n const slots = Array.isArray(t.allowed_slots)\n ? (t.allowed_slots as Array<Record<string, unknown>>)\n .map((s) => (s && typeof s === 'object' ? s.slot : undefined))\n .filter((s): s is string => typeof s === 'string')\n : [];\n if (!slots.includes(t.default_slot)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n `${where}: default_slot ${JSON.stringify(t.default_slot)} is not in ` +\n `allowed_slots ${JSON.stringify(slots)}`,\n });\n }\n }\n\n // 2b. ItemTemplate: default_parent must be one of allowed_parents[].tile_id.\n // Same failure class as default_slot, for items (adversarial-review find:\n // the first cut mirrored only the tile rule and left this one unchecked).\n if (typeof t.default_parent === 'string') {\n const parents = Array.isArray(t.allowed_parents)\n ? (t.allowed_parents as Array<Record<string, unknown>>)\n .map((p) => (p && typeof p === 'object' ? p.tile_id : undefined))\n .filter((p): p is string => typeof p === 'string')\n : [];\n if (!parents.includes(t.default_parent)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n `${where}: default_parent ${JSON.stringify(t.default_parent)} is not in ` +\n `allowed_parents ${JSON.stringify(parents)}`,\n });\n }\n }\n\n // 2c. ActionTemplate: placement_type and allowed_targets must agree \u2014\n // 'selector' needs targets to place against, 'none' must carry none.\n if (typeof t.placement_type === 'string') {\n const targets = Array.isArray(t.allowed_targets) ? t.allowed_targets : [];\n if (t.placement_type === 'selector' && targets.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `${where}: placement_type 'selector' requires a non-empty allowed_targets list`,\n });\n }\n if (t.placement_type === 'none' && targets.length > 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `${where}: placement_type 'none' must have empty allowed_targets`,\n });\n }\n }\n\n // 3. Field-key paths: no empty segments, no reserved segments.\n for (const key of fieldKeys) {\n const segments = key.split('.');\n if (segments.some((seg) => seg.length === 0)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n `${where}: field key ${JSON.stringify(key)} contains empty segment(s) ` +\n `(leading dot, trailing dot, or '..' are not allowed)`,\n });\n continue;\n }\n for (const seg of segments) {\n if (RESERVED_SEGMENTS.has(seg)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n `${where}: field key ${JSON.stringify(key)} uses reserved segment ` +\n `${JSON.stringify(seg)} \u2014 dunder / prototype-pollution names are blocked`,\n });\n }\n }\n }\n\n // 4. Dot-prefix overlap: declaring both `product` and `product.tagline` is\n // ambiguous \u2014 a patch on the parent would obliterate the child.\n const sortedKeys = [...fieldKeys].sort();\n for (let i = 0; i < sortedKeys.length - 1; i++) {\n const a = sortedKeys[i];\n const b = sortedKeys[i + 1];\n if (b.startsWith(`${a}.`)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n `${where}: field keys ${JSON.stringify(a)} and ${JSON.stringify(b)} claim the ` +\n `same prefix namespace \u2014 declaring both is ambiguous (a patch on the parent ` +\n `would overwrite the child)`,\n });\n }\n }\n }\n\n for (const t of tiles) {\n checkTemplate(t, `tile ${JSON.stringify(String(t.id))}`);\n checkDanglingFieldReferences(t, `tile ${JSON.stringify(String(t.id))}`);\n }\n for (const t of items) checkTemplate(t, `item ${JSON.stringify(String(t.id))}`);\n for (const t of actions) checkTemplate(t, `action ${JSON.stringify(String(t.id))}`);\n\n for (const [typeKey, members] of groups) {\n if (members.length < 2) continue;\n\n const headSig = templateSignature(members[0]);\n for (let i = 1; i < members.length; i++) {\n const other = members[i];\n if (!signaturesEqual(headSig, templateSignature(other))) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n `templates of type ${JSON.stringify(typeKey)} must share an authorable field ` +\n `shape, but ${JSON.stringify(String(members[0].id))} and ` +\n `${JSON.stringify(String(other.id))} differ ` +\n `(field names / required / admin_pinned / enum values)`,\n });\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Assembled mount-tool description cap (authoring time, PR #3873).\n //\n // The runtime builds ONE tool per widget/kind whose description is every\n // template's description plus a note the server owns. A model provider\n // silently drops a tool past the cap, so an over-long set is refused\n // here. The cap, the string pieces and the notes are generated from\n // platform/common's mount_tool_description.py (never hand-typed), so\n // this builds the exact string the runtime sends. Grouping mirrors the\n // runtime: raw widget for tiles, raw kind for items and actions.\n // ---------------------------------------------------------------------------\n const toolSpec = mountToolDescriptionSpec as {\n maxLength: number;\n base: string;\n templatesPrefix: string;\n templateItem: string;\n templateSeparator: string;\n notePrefix: string;\n notes: Record<string, string>;\n };\n const toolGroups = new Map<string, TemplateRaw[]>();\n for (const t of tiles) {\n if (typeof t.widget === 'string')\n toolGroups.set(t.widget, [...(toolGroups.get(t.widget) ?? []), t]);\n }\n for (const t of [...items, ...actions]) {\n if (typeof t.kind === 'string')\n toolGroups.set(t.kind, [...(toolGroups.get(t.kind) ?? []), t]);\n }\n for (const [typeKey, members] of toolGroups) {\n const listed = members\n .filter((t) => typeof t.description === 'string' && t.description.length > 0)\n // split/join, not .replace: same every-occurrence semantics as\n // Python's str.replace, and no `$&`-style replacement patterns.\n .map((t) =>\n toolSpec.templateItem\n .split('{id}')\n .join(String(t.id))\n .split('{description}')\n .join(t.description as string)\n )\n .join(toolSpec.templateSeparator);\n let text = toolSpec.base.split('{type_key}').join(typeKey);\n if (listed) text += toolSpec.templatesPrefix + listed;\n const note = toolSpec.notes[typeKey];\n if (note) text += toolSpec.notePrefix + note;\n if (text.length > toolSpec.maxLength) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n `the mount tool for ${JSON.stringify(typeKey)} would have a ${text.length} chars ` +\n `description (templates ${members.map((t) => JSON.stringify(String(t.id))).join(', ')} ` +\n `plus the server's note), over the ${toolSpec.maxLength}-char cap. The model ` +\n `provider silently drops an over-long tool, so these widgets could never mount: ` +\n `shorten those templates' descriptions or ids.`,\n });\n }\n }\n })\n .optional()\n .describe(\n 'Template declarations the LLM can mount via the elements pipeline. Shape mirrors syntrologie_common.sdk.templates.UiTemplatesBlock. Passed verbatim as forwardedProps.uiTemplates to the AG-UI transport.'\n ),\n voiceInput: z\n .boolean()\n .optional()\n .describe(\n 'Show a mic button that dictates into the input via the browser Web Speech API where supported (vendor-cloud recognition; degrades to hidden when unsupported). Absent/false = no button.'\n ),\n supportChat: z\n .object({\n vendor: z.string().min(1),\n suppressNative: z.boolean().optional(),\n widgetId: z\n .string()\n .min(1)\n .optional()\n .describe(\n \"LeadConnector / GoHighLevel only: the chat widget id from the site's embed script (`data-widget-id`). The bridge fetches the location id from the vendor's public widget config \u2014 never hand-type it.\"\n ),\n inbox: z\n .object({\n title: z\n .string()\n .min(1)\n .describe(\n 'Heading of the thread card the SDK opens when the visitor taps the announcement of a team message that arrived with no handoff card on the page.'\n ),\n toastTitle: z\n .string()\n .min(1)\n .describe(\n 'Title of that announcement. Its body is the message itself. Name the team in the workspace voice.'\n ),\n })\n .strict()\n .optional()\n .describe(\n \"Where a team message lands when NO adaptive-chatbot:leave-a-message card is on the page \u2014 the vendor's own proactive triggers, or a reply after navigation tore the card down. The SDK writes it into the same thread the card hydrates from, announces it through the canvas, and on tap mounts the workspace's leave-a-message template opened on the thread. Required whenever suppressNative is true: with the vendor's UI hidden, an un-announced message is a message the visitor never sees.\"\n ),\n })\n .strict()\n .superRefine((supportChat, ctx) => {\n if (supportChat.suppressNative && !supportChat.inbox) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['inbox'],\n message:\n 'supportChat.inbox is required when suppressNative is true: the vendor UI is hidden, so a team message that arrives with no handoff card mounted has nowhere to show without it',\n });\n }\n // Cross-field requirement JSON Schema cannot express on this object:\n // 'leadconnector' is the one vendor whose bridge needs per-site\n // config (every other vendor's SDK self-identifies on the page).\n // Without this, a config naming that vendor and omitting widgetId is\n // schema-VALID and fails only at runtime \u2014 bootSupportChat warns and\n // disables handoff, so the customer discovers it when a visitor\n // tries to reach a human. Caught here at authoring time instead:\n // `make sdk-validate` runs this via validate-config.mjs's per-tile\n // props pass (see runtime-sdk/scripts/lib/zod-authoring-checks.mjs).\n if (supportChat.vendor !== 'leadconnector') return;\n if (supportChat.widgetId) return;\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['widgetId'],\n message:\n 'supportChat.widgetId is required when vendor is \"leadconnector\" (the chat widget id from the site\\'s embed, data-widget-id)',\n });\n })\n .optional()\n .describe(\n 'Names the site\\'s own support-chat product (\"crisp\" or \"leadconnector\") for async human handoff via the adaptive-chatbot:leave-a-message widget. Resolved at chat-bar boot regardless of whether that widget ever mounts, so suppressNative (hide the vendor\\'s native launcher bubble) always applies. Absent vendor SDK fails soft \u2014 a console warning, never a thrown error.'\n ),\n })\n .strict();\n\nexport type ChatBarProps = z.infer<typeof chatBarPropsSchema>;\n\n// ============================================================================\n// Chips Strip Props (adaptive-chatbot:chips-strip widget)\n// ============================================================================\n\n/**\n * Props schema for the `adaptive-chatbot:chips-strip` widget. Chips\n * follow the compositional-action shape (see SuggestionChipSchema in\n * AdaptiveChipsStrip.ts) \u2014 same pattern as faq:question.\n */\nexport const chipsStripPropsSchema = z\n .object({\n chips: z\n .array(SuggestionChipSchema)\n .default([])\n .describe(\n 'Suggestion chips authored as suggestions:chip compositional actions. Each chip declares an id, a title, and a payload that mounts in the drawer when clicked. Conditional visibility via per-chip triggerWhen.'\n ),\n })\n .strict();\n\nexport type ChipsStripProps = z.infer<typeof chipsStripPropsSchema>;\n\n// ============================================================================\n// Tile Widget Props Export\n// ============================================================================\n\n/**\n * Tile widget definitions for unified JSON Schema generation.\n * Maps widget IDs to their props validation schema so the build script\n * can inject if/then constraints on tile.props.\n */\nexport const tileWidgets = [\n {\n widget: 'adaptive-chatbot:assistant',\n defName: 'chatbotAssistantProps',\n propsSchema: configSchema,\n },\n {\n widget: 'adaptive-chatbot:chat-bar',\n defName: 'chatBarProps',\n propsSchema: chatBarPropsSchema,\n },\n {\n widget: 'adaptive-chatbot:chips-strip',\n defName: 'chipsStripProps',\n propsSchema: chipsStripPropsSchema,\n },\n];\n\n// ============================================================================\n// Capabilities Documentation (injected into JSON Schema for LLM prompts)\n// ============================================================================\n\nexport const CAPABILITIES_DOCUMENTATION = {\n packageId: 'adaptive-chatbot',\n plannerSummary:\n 'Conversational assistant, always-visible chat input, and suggestion-chip surfaces. Reach for this when a strategy needs dialog, chat-triggered UI, or prompt chips that reveal richer payloads.',\n description:\n 'Chat and conversational UI adaptive. Provides a full assistant, a headless chat bar, suggestion chips, and chip payload widgets for text answers and navigation links.',\n whenToUse: [\n {\n goal: 'Mount a full AI assistant with backend streaming',\n action:\n 'Add a tile with widget: \"adaptive-chatbot:assistant\" and configure backendUrl, greeting, maxHistory, suggestions, and fallback props.',\n },\n {\n goal: 'Replace a launcher or slot lid with a chat input row',\n action:\n 'Use widget: \"adaptive-chatbot:chat-bar\" from a tile, slots.drawer.lid, or another slot lid when the host owns the transport.',\n },\n {\n goal: 'Offer suggested prompts or choices that reveal payload content',\n action:\n 'Add widget: \"adaptive-chatbot:chips-strip\" with suggestions:chip entries; each chip payload should reference a supported widget such as adaptive-chatbot:text-answer, adaptive-chatbot:nav-link, or another tile widget.',\n },\n {\n goal: 'Escalate to a human when the assistant cannot help',\n action:\n 'Mount widget: \"adaptive-chatbot:leave-a-message\" (with the chat-bar\\'s supportChat.vendor already configured) when the visitor explicitly asks for a human, when you cannot resolve after a genuine attempt, or on clear frustration \u2014 never as a first response.',\n },\n ],\n conventions: [\n {\n name: 'backendUrl is explicit',\n description:\n 'assistant backendUrl must be either \"\" for same-origin /api/adaptive/* routing or an absolute http(s) URL. Relative paths are rejected because they compose to invalid /api/adaptive/session URLs.',\n },\n {\n name: 'Chat bar is headless',\n description:\n 'adaptive-chatbot:chat-bar renders the input and trail but does not own a transport by default. Hosts should listen for chat-message-sent, chat-interrupt, and canvas-close or provide backendUrl explicitly.',\n },\n {\n name: 'Suggestion chips are compositional',\n description:\n 'suggestions:chip entries are config data rendered by adaptive-chatbot:chips-strip. Use triggerWhen for conditional visibility and use payload.widget for the content mounted after a click.',\n },\n {\n name: 'LLM-authored UI is opt-in',\n description:\n 'Set elementsEnabled and uiTemplates only when the backend is allowed to mount, patch, and unmount declared UI templates during chat turns.',\n },\n {\n name: 'Reply-toast copy is opt-in workspace configuration',\n description:\n \"adaptive-chatbot:leave-a-message announces an operator's reply with a toast ONLY when the workspace authors the words in default_widget_props.replyToast ({title, body}). No authored copy means no toast \u2014 absence is the opt-out, and the tile's own mail face remains the announcement. The bundle never supplies stand-in copy: it would be in the wrong voice and, on a non-English storefront, the wrong language.\",\n },\n {\n name: 'Leave-a-message copy is 100% workspace-authored',\n description:\n 'adaptive-chatbot:leave-a-message ships NO hardcoded visitor-facing strings across its five states (compose \u2192 email \u2192 sent \u2192 mail \u2192 flipped). Every label, framing line, prompt, and button comes from default_widget_props.copy ({framing, messageLabel, sendLabel, emailPrompt, emailLabel, emailPlaceholder, emailSubmitLabel, emailSkipLabel, sentBody, mailLabel, replyLabel, replyPlaceholder, replySendLabel}). The compose/email/reply steps use icon-only send controls whose aria-label IS the authored copy \u2014 an icon button with no accessible name is a real defect, so an unauthored sendLabel/emailSubmitLabel/replySendLabel removes the control entirely rather than shipping it mute. Every other field follows the same absence-is-the-opt-out rule as replyToast.',\n },\n {\n name: 'Human handoff is escalation-only',\n description:\n \"adaptive-chatbot:leave-a-message delivers through the site's own support-chat vendor named in the chat-bar's supportChat.vendor prop \u2014 never mount it as a first response; reach for it only after a genuine resolution attempt, an explicit request for a person, or clear frustration.\",\n },\n ],\n // Structured {name, when, props} entries \u2014 the CAPABILITIES_DOCUMENTATION\n // contract every consumer renders (`_render_capabilities_markdown` in\n // tech-core, `format_capabilities_for_prompt` in syntrologie_common).\n // Plain strings here crashed both renderers (BUG-1784941121).\n events: [\n {\n name: 'chat-message-sent',\n when: 'Visitor sends a chat message (typed, or via a suggested-reply chip)',\n props: '{ text }',\n },\n {\n name: 'chat-interrupt',\n when: 'Visitor interrupts the streaming assistant reply',\n props: '{}',\n },\n {\n name: 'canvas-close',\n when: 'Chat surface requests the host canvas to close',\n props: '{}',\n },\n {\n name: 'trail-suggested-reply',\n when: 'Visitor taps a suggest_replies chip in the chat trail',\n props: '{ text }',\n },\n {\n name: 'supportchat:reply_received',\n when: \"A human operator replies through the site's support-chat vendor while the adaptive-chatbot:leave-a-message tile is un-flipped (not yet read) \u2014 published on the runtime EventBus, not as a DOM CustomEvent, so tile notifications rules can badge it\",\n props: '{ text }',\n },\n ],\n};\n\n/**\n * Action step schemas \u2014 registered into the unified canvas-config\n * JSON Schema's action-step union so authors (and the tactician LLM)\n * can emit `suggestions:chip` items inside a chips-strip tile's\n * `props.chips` array with full validation.\n *\n * `.innerType()` strips the `.refine()` wrapper (cross-field\n * refinements don't translate to JSON Schema); runtime Zod still\n * enforces them.\n */\nexport const actionStepSchemas = [\n { defName: 'suggestionChip', schema: SuggestionChipSchema.innerType() },\n];\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["{\n \"maxLength\": 1024,\n \"base\": \"Mount a {type_key} element. Pick template_id; author the fields.\",\n \"templatesPrefix\": \" Templates: \",\n \"templateItem\": \"'{id}' \u2014 {description}\",\n \"templateSeparator\": \"; \",\n \"notePrefix\": \" \",\n \"notes\": {\n \"syntro-product-reco-carousel\": \"The store's recommendation engine picks the products in this carousel; heading and focus steer it, they do not choose which products appear.\",\n \"adaptive-chatbot:leave-a-message\": \"Mounting shows the visitor a draft card; nothing is sent until the visitor taps Send in it, so never say it was sent or is on its way: ask them to review it and tap Send.\"\n }\n}\n", "{\n \"$comment\": \"DO NOT EDIT BY HAND \u2014 generated from packages/runtime-sdk/schema/canvas-config.schema.json and platform/common/syntrologie_common/sdk/widget-props-always-allowed-fields.json. Re-run: node packages/runtime-sdk/scripts/generate-widget-props-field-index.mjs. Consumed by packages/adaptives/adaptive-chatbot/src/schema.ts (uiTemplates dangling-field-reference rule). Mirrors platform/common/syntrologie_common/sdk/schema.py:widget_schema_field_exists \u2014 same resolution semantics, same widget allowlist (_DANGLING_CHECK_WIDGETS in adaptive_tools_gen.py) \u2014 keep both in sync. The $alwaysAllowedFields key is the merged tileChromeFields/handleField/handlesField from the always-allowed-fields JSON above \u2014 fields that are NEVER real widget-props properties for ANY widget.\",\n \"$alwaysAllowedFields\": [\n \"icon\",\n \"product_handle\",\n \"product_handles\",\n \"subtitle\",\n \"title\"\n ],\n \"adaptive-product:card\": [\n \"density\",\n \"product\",\n \"product.attributes\",\n \"product.availability\",\n \"product.badge\",\n \"product.badge.label\",\n \"product.badge.tone\",\n \"product.brand\",\n \"product.ctas\",\n \"product.framing\",\n \"product.id\",\n \"product.identifiers\",\n \"product.identifiers.gtin\",\n \"product.identifiers.mpn\",\n \"product.identifiers.shopifyHandle\",\n \"product.identifiers.sku\",\n \"product.identifiers.wooSlug\",\n \"product.image\",\n \"product.image.alt\",\n \"product.image.bind\",\n \"product.image.src\",\n \"product.labels\",\n \"product.name\",\n \"product.price\",\n \"product.price.amount\",\n \"product.price.bind\",\n \"product.price.cadence\",\n \"product.rating\",\n \"product.rating.count\",\n \"product.rating.max\",\n \"product.rating.value\",\n \"product.salePrice\",\n \"product.salePrice.amount\",\n \"product.salePrice.bind\",\n \"product.salePrice.cadence\",\n \"product.salePrice.validUntil\",\n \"product.specs\",\n \"product.tagline\",\n \"product.variants\",\n \"product.variants.attributes\",\n \"product.variants.variants\",\n \"visibleFacts\"\n ],\n \"adaptive-product:comparison\": [\n \"heading\",\n \"products\",\n \"rows\"\n ]\n}\n", "/**\n * Adaptive Chatbot - Config Schema\n *\n * Zod schema for validating chatbot widget configuration.\n */\n\nimport { z } from 'zod';\n\nimport { SuggestionChipSchema } from './AdaptiveChipsStrip';\nimport mountToolDescriptionSpec from './generated/mount-tool-description.json';\nimport widgetPropsFieldIndex from './generated/widget-props-field-index.json';\n\n// Key `generate-widget-props-field-index.mjs` writes the merged tile-chrome /\n// hydration-handle exemption list under \u2014 see the `uiTemplates` superRefine\n// below (dangling widget-props field references) for the read side.\nconst ALWAYS_ALLOWED_FIELDS_KEY = '$alwaysAllowedFields';\n\n// The widget composes `${backendUrl}/api/adaptive/stream` (AG-UI chat turns)\n// and `${backendUrl}/api/adaptive/session` (server-push SSE: nudges, typing,\n// snapshots). backendUrl must be either:\n// - \"\" (empty string) \u2014 same-origin opt-in; resolves to /api/adaptive/*\n// - an absolute http:// or https:// URL \u2014 the chat backend's origin\n// A relative path like \"/api/chat\" produces \"/api/chat/api/adaptive/session\"\n// which 404s on the host SPA and surfaces as a generic SSE error.\n//\n// Split into a `.url()` branch + literal \"\" branch so zod-to-json-schema\n// produces an `anyOf` that AJV (used by `make sdk-validate`) enforces.\n// Refinements alone do not survive the JSON-schema translation.\nconst backendUrlSchema = z.union(\n [\n z\n .string()\n .url('backendUrl must be an absolute URL')\n .regex(/^https?:\\/\\//, 'backendUrl must use http or https'),\n z.literal(''),\n ],\n {\n errorMap: () => ({\n message:\n 'backendUrl must be either \"\" (same-origin) or an absolute http(s):// URL \u2014 relative paths are not allowed',\n }),\n }\n);\n\n// Per-customer fallback card. Rendered in place of the chat input when the\n// chat backend is unreachable for any reason (most commonly: Cloudflare\n// Turnstile bot-check failure for an end-user on a hardened browser / locked\n// network). The customer fills these in; we never show Cloudflare branding\n// to the end-user.\n//\n// `ctaHref` follows the same absolute-URL guard as `backendUrl` so a typo\n// like \"/support\" can't 404 on the host SPA \u2014 must be empty (same-origin)\n// or an absolute http(s):// URL pointing to the customer's existing support\n// path.\nconst fallbackHrefSchema = z.union(\n [\n z\n .string()\n .url('fallback.ctaHref must be an absolute URL')\n .regex(/^https?:\\/\\//, 'fallback.ctaHref must use http or https'),\n z.literal(''),\n ],\n {\n errorMap: () => ({\n message: 'fallback.ctaHref must be either \"\" (same-origin) or an absolute http(s):// URL',\n }),\n }\n);\n\n// `.strict()` so unknown keys are rejected at validation time (matches the\n// emitted JSON Schema's `additionalProperties: false`). Future fields land\n// here intentionally rather than silently slipping through and behaving\n// like feature stubs.\nconst fallbackSchema = z\n .object({\n /** Header shown on the fallback card. Defaults to a generic \"unavailable\" copy. */\n title: z.string().optional(),\n /** Body copy explaining the situation in the customer's voice. */\n message: z.string().optional(),\n /** Label for the call-to-action link. If `ctaHref` is set this should be too. */\n ctaLabel: z.string().optional(),\n /** Target of the CTA link \u2014 typically the customer's existing support path. */\n ctaHref: fallbackHrefSchema.optional(),\n })\n .strict();\n\nexport const configSchema = z.object({\n /** Backend URL for the chat API endpoint. \"\" for same-origin, or an absolute http(s):// URL. */\n backendUrl: backendUrlSchema,\n /** MLflow run ID for experiment tracking */\n mlflowRunId: z.string().optional(),\n /** Greeting message shown when the chat opens */\n greeting: z.string().default('Hi! How can I help?'),\n /** Maximum number of history messages sent to the backend */\n maxHistory: z.number().int().min(1).max(100).default(20),\n /** Quick-reply suggestions shown in the empty state */\n suggestions: z.array(z.string()).optional(),\n voiceInput: z\n .boolean()\n .optional()\n .describe(\n 'Show a mic button that dictates into the input via the browser Web Speech API where supported (vendor-cloud recognition; degrades to hidden when unsupported). Absent/false = no button.'\n ),\n /**\n * Per-customer fallback card rendered when chat can't open (Turnstile\n * failure, network error, etc.). The end-user is redirected to the\n * customer's normal support path \u2014 no Cloudflare-branded challenge is\n * ever shown.\n */\n fallback: fallbackSchema.optional(),\n});\n\nexport type ChatbotConfigSchema = z.infer<typeof configSchema>;\n\nexport function validateChatbotConfig(data: unknown) {\n return configSchema.safeParse(data);\n}\n\n// ============================================================================\n// Chat Bar Props (adaptive-chatbot:chat-bar widget)\n// ============================================================================\n\n/**\n * Props schema for the `adaptive-chatbot:chat-bar` widget. This is the\n * headless chat-input shell \u2014 no transport, no message persistence.\n * Customers wire `chat-message-sent` / `chat-interrupt` / `canvas-close`\n * to their own pipeline.\n *\n * All fields are optional: the bar renders an empty trail + send-only\n * placeholder if nothing is passed. Authors who want a stateful chat\n * use `adaptive-chatbot:assistant` instead.\n */\nexport const chatBarPropsSchema = z\n .object({\n placeholder: z\n .string()\n .optional()\n .describe('Input placeholder copy. Defaults to \"Ask, find, or navigate\u2026\".'),\n assistantName: z\n .string()\n .optional()\n .describe(\n 'Name shown in the (forceExpanded) chat header. Defaults to \"Assistant\". Per-workspace override, e.g. \"Vela Concierge\".'\n ),\n personas: z\n .array(\n z.object({\n id: z.string().min(1),\n name: z.string().min(1).max(24),\n role_title: z.string().max(48).optional(),\n pronouns: z.string().max(16).optional(),\n avatar: z\n .object({\n sm: z.string().url().optional(),\n md: z.string().url().optional(),\n lg: z.string().url().optional(),\n })\n .optional(),\n intro_line: z.string().max(160).optional(),\n })\n )\n .optional()\n .describe(\n 'Persona roster (FEAT-1784917430): human-presenting concierge identities. One is 50:50 sticky-assigned per visitor; its name/avatar render in the header, trail, and typing line, and the name enters the LLM voice. The header always carries an \"AI concierge\" disclosure.'\n ),\n // `messages` and `inFlight` are runtime state \u2014 included here so\n // authors who pre-seed a conversation (e.g. a demo or guided\n // walkthrough) can declare it. Most production deployments will\n // leave these blank and update them via the mountable's API.\n messages: z\n .array(\n z.object({\n id: z.union([z.number(), z.string()]),\n role: z.enum(['user', 'assistant']),\n text: z.string(),\n })\n )\n .optional(),\n inFlight: z.boolean().optional(),\n forceExpanded: z\n .boolean()\n .optional()\n .describe(\n 'Render the trail + input expanded immediately on mount instead of waiting for the first message. Used on canvases where the chat IS the surface (velvet, dedicated drawer).'\n ),\n backendUrl: z\n .string()\n .optional()\n .describe(\n 'Backend chat endpoint. Empty string + non-undefined enables relative-URL fetches (the host page proxies /api/* to the backend).'\n ),\n greeting: z.string().optional().describe('Greeting line shown above the input on first mount.'),\n introSuggestion: z\n .object({\n label: z.string().min(1),\n prompt: z.string().min(1),\n })\n .optional()\n .describe(\n 'Pre-conversation tap-target shown alongside the greeting when no messages exist. `label` is the button copy the visitor sees; `prompt` is the text submitted on tap, exactly as if they had typed it.'\n ),\n fallback: z\n .object({\n title: z.string().optional(),\n message: z.string().optional(),\n ctaLabel: z.string().optional(),\n })\n .passthrough()\n .optional()\n .describe('Per-customer \"chat unavailable\" card shown when the transport gives up.'),\n elementsEnabled: z\n .boolean()\n .optional()\n .describe(\n 'Opt the chat into the LLM-authored UI element pipeline. When true AND uiTemplates is set, the backend exposes mount_element / patch_element / unmount_element tools scoped to the declared templates.'\n ),\n uiTemplates: z\n .record(z.unknown())\n .superRefine((block, ctx) => {\n // ---------------------------------------------------------------------------\n // Type-homogeneity gate \u2014 mirrors Python UiTemplatesBlock._types_are_homogeneous\n //\n // All templates of the same type must share an authorable field shape.\n // Per-type mount tools assume that every template of a given widget/kind\n // exposes the same set of field names, the same required flags, the same\n // admin_pinned_fields, and the same EnumField value sets. A divergent\n // template would produce a value that is schema-valid but server-rejected.\n //\n // Groups: tiles by `widget`; items+actions by `kind`.\n // 4-dimension signature per group member:\n // 1. frozenset of field keys\n // 2. frozenset of field keys where required === true\n // 3. frozenset of admin_pinned_fields\n // 4. sorted enum values per enum field (order-independent comparison)\n //\n // The data is untyped (z.unknown()), so we read defensively: treat missing\n // arrays as [], missing fields as {}.\n // ---------------------------------------------------------------------------\n\n type TemplateRaw = {\n id?: unknown;\n description?: unknown;\n widget?: unknown;\n kind?: unknown;\n fields?: unknown;\n admin_pinned_fields?: unknown;\n default_slot?: unknown;\n default_starred?: unknown;\n allowed_slots?: unknown;\n default_parent?: unknown;\n allowed_parents?: unknown;\n placement_type?: unknown;\n allowed_targets?: unknown;\n };\n\n function asStringArray(v: unknown): string[] {\n if (!Array.isArray(v)) return [];\n return v.filter((x): x is string => typeof x === 'string');\n }\n\n function asFieldsRecord(v: unknown): Record<string, unknown> {\n if (v !== null && typeof v === 'object' && !Array.isArray(v)) {\n return v as Record<string, unknown>;\n }\n return {};\n }\n\n function templateSignature(\n t: TemplateRaw\n ): readonly [Set<string>, Set<string>, Set<string>, Array<[string, string[]]>] {\n const fields = asFieldsRecord(t.fields);\n const fieldKeys = new Set(Object.keys(fields));\n\n const requiredKeys = new Set<string>();\n for (const [k, spec] of Object.entries(fields)) {\n const s = spec as Record<string, unknown> | null | undefined;\n if (s && typeof s === 'object' && s.required === true) {\n requiredKeys.add(k);\n }\n }\n\n const pinned = new Set(asStringArray(t.admin_pinned_fields));\n\n const enumValues: Array<[string, string[]]> = [];\n for (const [k, spec] of Object.entries(fields)) {\n const s = spec as Record<string, unknown> | null | undefined;\n if (s && typeof s === 'object' && s.type === 'enum') {\n const vals = asStringArray(s.values).slice().sort();\n enumValues.push([k, vals]);\n }\n }\n enumValues.sort(([a], [b]) => a.localeCompare(b));\n\n return [fieldKeys, requiredKeys, pinned, enumValues] as const;\n }\n\n function signaturesEqual(\n a: ReturnType<typeof templateSignature>,\n b: ReturnType<typeof templateSignature>\n ): boolean {\n // 1. field keys\n if (a[0].size !== b[0].size) return false;\n for (const k of a[0]) if (!b[0].has(k)) return false;\n\n // 2. required keys\n if (a[1].size !== b[1].size) return false;\n for (const k of a[1]) if (!b[1].has(k)) return false;\n\n // 3. pinned keys\n if (a[2].size !== b[2].size) return false;\n for (const k of a[2]) if (!b[2].has(k)) return false;\n\n // 4. enum values (sorted arrays of [field, sorted-values] pairs)\n if (a[3].length !== b[3].length) return false;\n for (let i = 0; i < a[3].length; i++) {\n const [ak, av] = a[3][i];\n const [bk, bv] = b[3][i];\n if (ak !== bk) return false;\n if (av.length !== bv.length) return false;\n for (let j = 0; j < av.length; j++) {\n if (av[j] !== bv[j]) return false;\n }\n }\n\n return true;\n }\n\n const groups = new Map<string, TemplateRaw[]>();\n\n const tiles = Array.isArray(block.tiles) ? (block.tiles as TemplateRaw[]) : [];\n for (const t of tiles) {\n if (typeof t.widget === 'string') {\n const key = `widget:${t.widget}`;\n const group = groups.get(key) ?? [];\n group.push(t);\n groups.set(key, group);\n }\n }\n\n const items = Array.isArray(block.items) ? (block.items as TemplateRaw[]) : [];\n const actions = Array.isArray(block.actions) ? (block.actions as TemplateRaw[]) : [];\n for (const t of [...items, ...actions]) {\n if (typeof t.kind === 'string') {\n const key = `kind:${t.kind}`;\n const group = groups.get(key) ?? [];\n group.push(t);\n groups.set(key, group);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Per-template cross-field gates \u2014 mirror ALL five Python model validators\n // (TileTemplate/ItemTemplate/ActionTemplate in\n // syntrologie_common/sdk/templates.py). Each spans TWO fields at once, so\n // JSON Schema cannot express it and zod refinements do not survive\n // zod-to-json-schema \u2014 this refinement is the authoring-time home.\n //\n // The runtime rejects a bad block ALL-OR-NOTHING and only logs it, so every\n // mount_* tool silently vanishes for the turn (BUG-1786640934: a contact-card\n // pinned `heading`/`channels`, neither a declared field, and the whole\n // workspace lost its elements capability).\n // ---------------------------------------------------------------------------\n\n // ---------------------------------------------------------------------------\n // 5. Dangling widget-props field references.\n //\n // `widgetPropsFieldIndex` is generated (never hand-typed) by\n // packages/runtime-sdk/scripts/generate-widget-props-field-index.mjs\n // from the SAME canvas-config.schema.json that Python's\n // `syntrologie_common.sdk.schema.widget_schema_field_exists` reads \u2014\n // one data source, two per-language walkers (see that script's\n // module docstring for why the walking code itself can't be\n // shared across a browser-bundled TS file and a server-side Python\n // module). Scoped to the SAME small widget allowlist as the\n // runtime's own `_DANGLING_CHECK_WIDGETS`\n // (adaptive_tools_gen.py) \u2014 a widget not in the generated index is\n // silently exempt, matching the runtime's own scoping (several\n // widgets don't map fields 1:1 onto their props root; see that\n // script's docstring).\n //\n // This is the authoring-time half of the SAME condition the\n // runtime already detects and fail-open-drops (adaptive_tools_gen.\n // dangling_field_dropped) \u2014 that log-only drop stays, unchanged,\n // for configs published before this rule existed; this rule stops\n // a NEW dangling reference from being authored in the first place.\n // The generated file also carries a `$comment` header string and an\n // `$alwaysAllowedFields` string array (see below) alongside the\n // per-widget path arrays \u2014 cast through `unknown` since `$comment`\n // intentionally breaks a direct `Record<string, string[]>` shape;\n // `checkDanglingFieldReferences` only ever reads a widget key that\n // came from `t.widget` (a real widget const), so `$comment` is\n // never looked up as a widget.\n const widgetFieldIndex = widgetPropsFieldIndex as unknown as Record<string, string[]>;\n\n // Fields that are structurally part of a TileTemplate's authoring\n // surface but are NEVER real widget-props properties, so this check\n // must not flag them as dangling: tile chrome (title/icon/subtitle,\n // rendered by the tile shell) and search-hydration handles\n // (product_handle/product_handles, popped by the mount executor\n // BEFORE the widget ever sees its props). Read from the SAME\n // generated `widgetPropsFieldIndex` above \u2014 never hand-retyped here\n // \u2014 so this list can only ever match what `syntrologie_common.sdk.\n // schema.TILE_CHROME_FIELDS`/`HANDLE_FIELD`/`HANDLES_FIELD` load\n // from `platform/common/syntrologie_common/sdk/widget-props-always-\n // allowed-fields.json`, the single source both languages derive\n // from (see `generate-widget-props-field-index.mjs`'s module\n // docstring). A prior version of this rule hand-retyped this exact\n // list and silently drifted from Python (BUG-1786833318) \u2014 flagging\n // `title`/`icon`/`product_handle`(s) as dangling on every real\n // production config (main-peptides-demo-publish.json,\n // iglowmedspa-demo-publish.json, nei-native-demo-publish.json all\n // author them on adaptive-product:card/:comparison templates).\n // BUG-1786834379 moved the list into the generated artifact so\n // that class of drift is structurally impossible: the freshness\n // check (`make app-check-widget-props-field-index-fresh`) fails if\n // this array is ever stale relative to its JSON source.\n const alwaysAllowedRaw = widgetFieldIndex[ALWAYS_ALLOWED_FIELDS_KEY];\n if (!Array.isArray(alwaysAllowedRaw)) {\n throw new Error(\n `widget-props-field-index.json is missing \"${ALWAYS_ALLOWED_FIELDS_KEY}\" \u2014 regenerate via ` +\n 'node packages/runtime-sdk/scripts/generate-widget-props-field-index.mjs'\n );\n }\n const NEVER_DANGLING_FIELDS = new Set(alwaysAllowedRaw);\n\n function checkDanglingFieldReferences(t: TemplateRaw, where: string): void {\n if (typeof t.widget !== 'string') return; // items/actions carry `kind`, not `widget` \u2014 not in scope\n const validPaths = widgetFieldIndex[t.widget];\n if (!validPaths) return; // widget outside the checked allowlist \u2014 genuinely unchecked, not a false negative\n const validSet = new Set(validPaths);\n const fields = asFieldsRecord(t.fields);\n for (const key of Object.keys(fields)) {\n if (validSet.has(key) || NEVER_DANGLING_FIELDS.has(key)) continue;\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n `${where}: field ${JSON.stringify(key)} does not exist in the ${JSON.stringify(t.widget)} ` +\n `widget's props schema \u2014 it was removed, renamed, or never existed. Remove it from ` +\n `\\`fields\\`, or point it at the widget's current path.`,\n });\n }\n }\n\n /** Dunder / prototype-pollution names \u2014 mirrors RESERVED_FIELD_SEGMENTS. */\n const RESERVED_SEGMENTS = new Set([\n '__class__',\n '__init__',\n '__proto__',\n '__dict__',\n '__getattribute__',\n '__setattr__',\n 'constructor',\n 'prototype',\n ]);\n\n function checkTemplate(t: TemplateRaw, where: string): void {\n const fields = asFieldsRecord(t.fields);\n const fieldKeys = Object.keys(fields);\n\n // 1. admin_pinned_fields must be a subset of the declared fields.\n // Props the LLM cannot author are already un-authorable by NOT being\n // fields; pinning a non-field is a no-op the runtime treats as fatal.\n const unknownPins = asStringArray(t.admin_pinned_fields).filter(\n (name) => !(name in fields)\n );\n if (unknownPins.length > 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n `${where}: admin_pinned_fields references unknown fields: ` +\n `${JSON.stringify(unknownPins)} \u2014 every pinned name must be a key of ` +\n `\\`fields\\` (declared: ${JSON.stringify(fieldKeys)})`,\n });\n }\n\n // 2. default_slot must be one of allowed_slots (tiles only).\n if (typeof t.default_slot === 'string') {\n const slots = Array.isArray(t.allowed_slots)\n ? (t.allowed_slots as Array<Record<string, unknown>>)\n .map((s) => (s && typeof s === 'object' ? s.slot : undefined))\n .filter((s): s is string => typeof s === 'string')\n : [];\n if (!slots.includes(t.default_slot)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n `${where}: default_slot ${JSON.stringify(t.default_slot)} is not in ` +\n `allowed_slots ${JSON.stringify(slots)}`,\n });\n }\n }\n\n // 2b. ItemTemplate: default_parent must be one of allowed_parents[].tile_id.\n // Same failure class as default_slot, for items (adversarial-review find:\n // the first cut mirrored only the tile rule and left this one unchecked).\n if (typeof t.default_parent === 'string') {\n const parents = Array.isArray(t.allowed_parents)\n ? (t.allowed_parents as Array<Record<string, unknown>>)\n .map((p) => (p && typeof p === 'object' ? p.tile_id : undefined))\n .filter((p): p is string => typeof p === 'string')\n : [];\n if (!parents.includes(t.default_parent)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n `${where}: default_parent ${JSON.stringify(t.default_parent)} is not in ` +\n `allowed_parents ${JSON.stringify(parents)}`,\n });\n }\n }\n\n // 2c. ActionTemplate: placement_type and allowed_targets must agree \u2014\n // 'selector' needs targets to place against, 'none' must carry none.\n if (typeof t.placement_type === 'string') {\n const targets = Array.isArray(t.allowed_targets) ? t.allowed_targets : [];\n if (t.placement_type === 'selector' && targets.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `${where}: placement_type 'selector' requires a non-empty allowed_targets list`,\n });\n }\n if (t.placement_type === 'none' && targets.length > 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `${where}: placement_type 'none' must have empty allowed_targets`,\n });\n }\n }\n\n // 3. Field-key paths: no empty segments, no reserved segments.\n for (const key of fieldKeys) {\n const segments = key.split('.');\n if (segments.some((seg) => seg.length === 0)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n `${where}: field key ${JSON.stringify(key)} contains empty segment(s) ` +\n `(leading dot, trailing dot, or '..' are not allowed)`,\n });\n continue;\n }\n for (const seg of segments) {\n if (RESERVED_SEGMENTS.has(seg)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n `${where}: field key ${JSON.stringify(key)} uses reserved segment ` +\n `${JSON.stringify(seg)} \u2014 dunder / prototype-pollution names are blocked`,\n });\n }\n }\n }\n\n // 4. Dot-prefix overlap: declaring both `product` and `product.tagline` is\n // ambiguous \u2014 a patch on the parent would obliterate the child.\n const sortedKeys = [...fieldKeys].sort();\n for (let i = 0; i < sortedKeys.length - 1; i++) {\n const a = sortedKeys[i];\n const b = sortedKeys[i + 1];\n if (b.startsWith(`${a}.`)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n `${where}: field keys ${JSON.stringify(a)} and ${JSON.stringify(b)} claim the ` +\n `same prefix namespace \u2014 declaring both is ambiguous (a patch on the parent ` +\n `would overwrite the child)`,\n });\n }\n }\n }\n\n for (const t of tiles) {\n checkTemplate(t, `tile ${JSON.stringify(String(t.id))}`);\n checkDanglingFieldReferences(t, `tile ${JSON.stringify(String(t.id))}`);\n }\n for (const t of items) checkTemplate(t, `item ${JSON.stringify(String(t.id))}`);\n for (const t of actions) checkTemplate(t, `action ${JSON.stringify(String(t.id))}`);\n\n for (const [typeKey, members] of groups) {\n if (members.length < 2) continue;\n\n const headSig = templateSignature(members[0]);\n for (let i = 1; i < members.length; i++) {\n const other = members[i];\n if (!signaturesEqual(headSig, templateSignature(other))) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n `templates of type ${JSON.stringify(typeKey)} must share an authorable field ` +\n `shape, but ${JSON.stringify(String(members[0].id))} and ` +\n `${JSON.stringify(String(other.id))} differ ` +\n `(field names / required / admin_pinned / enum values)`,\n });\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Assembled mount-tool description cap (authoring time, PR #3873).\n //\n // The runtime builds ONE tool per widget/kind whose description is every\n // template's description plus a note the server owns. A model provider\n // silently drops a tool past the cap, so an over-long set is refused\n // here. The cap, the string pieces and the notes are generated from\n // platform/common's mount_tool_description.py (never hand-typed), so\n // this builds the exact string the runtime sends. Grouping mirrors the\n // runtime: raw widget for tiles, raw kind for items and actions.\n // ---------------------------------------------------------------------------\n const toolSpec = mountToolDescriptionSpec as {\n maxLength: number;\n base: string;\n templatesPrefix: string;\n templateItem: string;\n templateSeparator: string;\n notePrefix: string;\n notes: Record<string, string>;\n };\n const toolGroups = new Map<string, TemplateRaw[]>();\n for (const t of tiles) {\n if (typeof t.widget === 'string')\n toolGroups.set(t.widget, [...(toolGroups.get(t.widget) ?? []), t]);\n }\n for (const t of [...items, ...actions]) {\n if (typeof t.kind === 'string')\n toolGroups.set(t.kind, [...(toolGroups.get(t.kind) ?? []), t]);\n }\n for (const [typeKey, members] of toolGroups) {\n const listed = members\n .filter((t) => typeof t.description === 'string' && t.description.length > 0)\n // split/join, not .replace: same every-occurrence semantics as\n // Python's str.replace, and no `$&`-style replacement patterns.\n .map((t) =>\n toolSpec.templateItem\n .split('{id}')\n .join(String(t.id))\n .split('{description}')\n .join(t.description as string)\n )\n .join(toolSpec.templateSeparator);\n let text = toolSpec.base.split('{type_key}').join(typeKey);\n if (listed) text += toolSpec.templatesPrefix + listed;\n const note = toolSpec.notes[typeKey];\n if (note) text += toolSpec.notePrefix + note;\n if (text.length > toolSpec.maxLength) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n `the mount tool for ${JSON.stringify(typeKey)} would have a ${text.length} chars ` +\n `description (templates ${members.map((t) => JSON.stringify(String(t.id))).join(', ')} ` +\n `plus the server's note), over the ${toolSpec.maxLength}-char cap. The model ` +\n `provider silently drops an over-long tool, so these widgets could never mount: ` +\n `shorten those templates' descriptions or ids.`,\n });\n }\n }\n })\n .optional()\n .describe(\n 'Template declarations the LLM can mount via the elements pipeline. Shape mirrors syntrologie_common.sdk.templates.UiTemplatesBlock. Passed verbatim as forwardedProps.uiTemplates to the AG-UI transport.'\n ),\n voiceInput: z\n .boolean()\n .optional()\n .describe(\n 'Show a mic button that dictates into the input via the browser Web Speech API where supported (vendor-cloud recognition; degrades to hidden when unsupported). Absent/false = no button.'\n ),\n transcript: z\n .array(z.object({ role: z.enum(['user', 'assistant']), text: z.string().min(1) }).strict())\n .min(1)\n .max(6)\n .optional()\n .describe(\n 'Preview only: a fixed exchange the bar shows read-only. No conversation starts, nothing is sent, and the input is disabled.'\n ),\n supportChat: z\n .object({\n vendor: z.string().min(1),\n suppressNative: z.boolean().optional(),\n widgetId: z\n .string()\n .min(1)\n .optional()\n .describe(\n \"LeadConnector / GoHighLevel only: the chat widget id from the site's embed script (`data-widget-id`). The bridge fetches the location id from the vendor's public widget config \u2014 never hand-type it.\"\n ),\n inbox: z\n .object({\n title: z\n .string()\n .min(1)\n .describe(\n 'Heading of the thread card the SDK opens when the visitor taps the announcement of a team message that arrived with no handoff card on the page.'\n ),\n toastTitle: z\n .string()\n .min(1)\n .describe(\n 'Title of that announcement. Its body is the message itself. Name the team in the workspace voice.'\n ),\n })\n .strict()\n .optional()\n .describe(\n \"Where a team message lands when NO adaptive-chatbot:leave-a-message card is on the page \u2014 the vendor's own proactive triggers, or a reply after navigation tore the card down. The SDK writes it into the same thread the card hydrates from, announces it through the canvas, and on tap mounts the workspace's leave-a-message template opened on the thread. Required whenever suppressNative is true: with the vendor's UI hidden, an un-announced message is a message the visitor never sees.\"\n ),\n })\n .strict()\n .superRefine((supportChat, ctx) => {\n if (supportChat.suppressNative && !supportChat.inbox) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['inbox'],\n message:\n 'supportChat.inbox is required when suppressNative is true: the vendor UI is hidden, so a team message that arrives with no handoff card mounted has nowhere to show without it',\n });\n }\n // Cross-field requirement JSON Schema cannot express on this object:\n // 'leadconnector' is the one vendor whose bridge needs per-site\n // config (every other vendor's SDK self-identifies on the page).\n // Without this, a config naming that vendor and omitting widgetId is\n // schema-VALID and fails only at runtime \u2014 bootSupportChat warns and\n // disables handoff, so the customer discovers it when a visitor\n // tries to reach a human. Caught here at authoring time instead:\n // `make sdk-validate` runs this via validate-config.mjs's per-tile\n // props pass (see runtime-sdk/scripts/lib/zod-authoring-checks.mjs).\n if (supportChat.vendor !== 'leadconnector') return;\n if (supportChat.widgetId) return;\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['widgetId'],\n message:\n 'supportChat.widgetId is required when vendor is \"leadconnector\" (the chat widget id from the site\\'s embed, data-widget-id)',\n });\n })\n .optional()\n .describe(\n 'Names the site\\'s own support-chat product (\"crisp\" or \"leadconnector\") for async human handoff via the adaptive-chatbot:leave-a-message widget. Resolved at chat-bar boot regardless of whether that widget ever mounts, so suppressNative (hide the vendor\\'s native launcher bubble) always applies. Absent vendor SDK fails soft \u2014 a console warning, never a thrown error.'\n ),\n })\n .strict();\n\nexport type ChatBarProps = z.infer<typeof chatBarPropsSchema>;\n\n// ============================================================================\n// Chips Strip Props (adaptive-chatbot:chips-strip widget)\n// ============================================================================\n\n/**\n * Props schema for the `adaptive-chatbot:chips-strip` widget. Chips\n * follow the compositional-action shape (see SuggestionChipSchema in\n * AdaptiveChipsStrip.ts) \u2014 same pattern as faq:question.\n */\nexport const chipsStripPropsSchema = z\n .object({\n chips: z\n .array(SuggestionChipSchema)\n .default([])\n .describe(\n 'Suggestion chips authored as suggestions:chip compositional actions. Each chip declares an id, a title, and a payload that mounts in the drawer when clicked. Conditional visibility via per-chip triggerWhen.'\n ),\n })\n .strict();\n\nexport type ChipsStripProps = z.infer<typeof chipsStripPropsSchema>;\n\n// ============================================================================\n// Tile Widget Props Export\n// ============================================================================\n\n/**\n * Tile widget definitions for unified JSON Schema generation.\n * Maps widget IDs to their props validation schema so the build script\n * can inject if/then constraints on tile.props.\n */\nexport const tileWidgets = [\n {\n widget: 'adaptive-chatbot:assistant',\n defName: 'chatbotAssistantProps',\n propsSchema: configSchema,\n },\n {\n widget: 'adaptive-chatbot:chat-bar',\n defName: 'chatBarProps',\n propsSchema: chatBarPropsSchema,\n },\n {\n widget: 'adaptive-chatbot:chips-strip',\n defName: 'chipsStripProps',\n propsSchema: chipsStripPropsSchema,\n },\n];\n\n// ============================================================================\n// Capabilities Documentation (injected into JSON Schema for LLM prompts)\n// ============================================================================\n\nexport const CAPABILITIES_DOCUMENTATION = {\n packageId: 'adaptive-chatbot',\n plannerSummary:\n 'Conversational assistant, always-visible chat input, and suggestion-chip surfaces. Reach for this when a strategy needs dialog, chat-triggered UI, or prompt chips that reveal richer payloads.',\n description:\n 'Chat and conversational UI adaptive. Provides a full assistant, a headless chat bar, suggestion chips, and chip payload widgets for text answers and navigation links.',\n whenToUse: [\n {\n goal: 'Mount a full AI assistant with backend streaming',\n action:\n 'Add a tile with widget: \"adaptive-chatbot:assistant\" and configure backendUrl, greeting, maxHistory, suggestions, and fallback props.',\n },\n {\n goal: 'Replace a launcher or slot lid with a chat input row',\n action:\n 'Use widget: \"adaptive-chatbot:chat-bar\" from a tile, slots.drawer.lid, or another slot lid when the host owns the transport.',\n },\n {\n goal: 'Offer suggested prompts or choices that reveal payload content',\n action:\n 'Add widget: \"adaptive-chatbot:chips-strip\" with suggestions:chip entries; each chip payload should reference a supported widget such as adaptive-chatbot:text-answer, adaptive-chatbot:nav-link, or another tile widget.',\n },\n {\n goal: 'Escalate to a human when the assistant cannot help',\n action:\n 'Mount widget: \"adaptive-chatbot:leave-a-message\" (with the chat-bar\\'s supportChat.vendor already configured) when the visitor explicitly asks for a human, when you cannot resolve after a genuine attempt, or on clear frustration \u2014 never as a first response.',\n },\n ],\n conventions: [\n {\n name: 'backendUrl is explicit',\n description:\n 'assistant backendUrl must be either \"\" for same-origin /api/adaptive/* routing or an absolute http(s) URL. Relative paths are rejected because they compose to invalid /api/adaptive/session URLs.',\n },\n {\n name: 'Chat bar is headless',\n description:\n 'adaptive-chatbot:chat-bar renders the input and trail but does not own a transport by default. Hosts should listen for chat-message-sent, chat-interrupt, and canvas-close or provide backendUrl explicitly.',\n },\n {\n name: 'Suggestion chips are compositional',\n description:\n 'suggestions:chip entries are config data rendered by adaptive-chatbot:chips-strip. Use triggerWhen for conditional visibility and use payload.widget for the content mounted after a click.',\n },\n {\n name: 'LLM-authored UI is opt-in',\n description:\n 'Set elementsEnabled and uiTemplates only when the backend is allowed to mount, patch, and unmount declared UI templates during chat turns.',\n },\n {\n name: 'Reply-toast copy is opt-in workspace configuration',\n description:\n \"adaptive-chatbot:leave-a-message announces an operator's reply with a toast ONLY when the workspace authors the words in default_widget_props.replyToast ({title, body}). No authored copy means no toast \u2014 absence is the opt-out, and the tile's own mail face remains the announcement. The bundle never supplies stand-in copy: it would be in the wrong voice and, on a non-English storefront, the wrong language.\",\n },\n {\n name: 'Leave-a-message copy is 100% workspace-authored',\n description:\n 'adaptive-chatbot:leave-a-message ships NO hardcoded visitor-facing strings across its five states (compose \u2192 email \u2192 sent \u2192 mail \u2192 flipped). Every label, framing line, prompt, and button comes from default_widget_props.copy ({framing, messageLabel, sendLabel, emailPrompt, emailLabel, emailPlaceholder, emailSubmitLabel, emailSkipLabel, sentBody, mailLabel, replyLabel, replyPlaceholder, replySendLabel}). The compose/email/reply steps use icon-only send controls whose aria-label IS the authored copy \u2014 an icon button with no accessible name is a real defect, so an unauthored sendLabel/emailSubmitLabel/replySendLabel removes the control entirely rather than shipping it mute. Every other field follows the same absence-is-the-opt-out rule as replyToast.',\n },\n {\n name: 'Human handoff is escalation-only',\n description:\n \"adaptive-chatbot:leave-a-message delivers through the site's own support-chat vendor named in the chat-bar's supportChat.vendor prop \u2014 never mount it as a first response; reach for it only after a genuine resolution attempt, an explicit request for a person, or clear frustration.\",\n },\n ],\n // Structured {name, when, props} entries \u2014 the CAPABILITIES_DOCUMENTATION\n // contract every consumer renders (`_render_capabilities_markdown` in\n // tech-core, `format_capabilities_for_prompt` in syntrologie_common).\n // Plain strings here crashed both renderers (BUG-1784941121).\n events: [\n {\n name: 'chat-message-sent',\n when: 'Visitor sends a chat message (typed, or via a suggested-reply chip)',\n props: '{ text }',\n },\n {\n name: 'chat-interrupt',\n when: 'Visitor interrupts the streaming assistant reply',\n props: '{}',\n },\n {\n name: 'canvas-close',\n when: 'Chat surface requests the host canvas to close',\n props: '{}',\n },\n {\n name: 'trail-suggested-reply',\n when: 'Visitor taps a suggest_replies chip in the chat trail',\n props: '{ text }',\n },\n {\n name: 'supportchat:reply_received',\n when: \"A human operator replies through the site's support-chat vendor while the adaptive-chatbot:leave-a-message tile is un-flipped (not yet read) \u2014 published on the runtime EventBus, not as a DOM CustomEvent, so tile notifications rules can badge it\",\n props: '{ text }',\n },\n ],\n};\n\n/**\n * Action step schemas \u2014 registered into the unified canvas-config\n * JSON Schema's action-step union so authors (and the tactician LLM)\n * can emit `suggestions:chip` items inside a chips-strip tile's\n * `props.chips` array with full validation.\n *\n * `.innerType()` strips the `.refine()` wrapper (cross-field\n * refinements don't translate to JSON Schema); runtime Zod still\n * enforces them.\n */\nexport const actionStepSchemas = [\n { defName: 'suggestionChip', schema: SuggestionChipSchema.innerType() },\n];\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }