@helpai/elements 0.59.3 → 0.59.5

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/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { A as Asset, B as BlocksConfig, C as ConnectionConfig, a as ConnectionConfigPartial, H as HandshakeResponse, L as Link, S as ServerConfig, b as SiteConfig, W as WidgetConfig, c as WidgetConfigPartial, d as WidgetSettings, e as WidgetSettingsPartial } from './deployment-Crtq-vQg.js';
1
+ export { A as Asset, B as BlocksConfig, C as ConnectionConfig, a as ConnectionConfigPartial, H as HandshakeResponse, L as Link, S as ServerConfig, b as SiteConfig, W as WidgetConfig, c as WidgetConfigPartial, d as WidgetSettings, e as WidgetSettingsPartial } from './deployment-Bqqyxer1.js';
2
2
  import 'zod';
3
3
 
4
4
  /**
@@ -304,8 +304,6 @@ type ActionList = ActionName[];
304
304
  type VoiceMode = "local" | "server" | "disabled";
305
305
  /** Capability flags. Any field left `undefined` uses its default. */
306
306
  interface FeatureFlags {
307
- /** Show the paperclip button + accept drag/drop/paste. Default: `true`. */
308
- files?: boolean;
309
307
  /** Voice input behaviour (see {@link VoiceMode}). Default: `'local'`. */
310
308
  voice?: VoiceMode;
311
309
  /**
@@ -315,11 +313,26 @@ interface FeatureFlags {
315
313
  */
316
314
  tools?: Array<string | ToolRef>;
317
315
  /**
318
- * Render human-in-the-loop tool UI — the inline ask-questions form and the
319
- * approve/reject controls for gated tools. Default `true`. Set `false` to
320
- * suppress them (the wire still carries the signals; they just won't show).
316
+ * Turn OFF the human-in-the-loop tool UI — the inline ask-questions form and the
317
+ * approve/reject controls for gated tools. Unset/`false` = shown (default); `true`
318
+ * suppresses the UI (the wire still carries the signals; they just won't show).
321
319
  */
322
320
  disableHumanInLoop?: boolean;
321
+ /**
322
+ * Turn OFF file uploads — hide the paperclip button + reject drag/drop/paste.
323
+ * Unset/`false` = enabled (default); `true` disables them.
324
+ */
325
+ disableFileUpload?: boolean;
326
+ }
327
+ /**
328
+ * Features after resolution. The UI reads a POSITIVE `humanInLoop` — `resolveOptions`
329
+ * inverts the wire-input `disableHumanInLoop` once here, so no render site does `!disable…`.
330
+ */
331
+ interface ResolvedFeatures {
332
+ fileUpload: boolean;
333
+ voice: VoiceMode;
334
+ humanInLoop: boolean;
335
+ tools?: Array<string | ToolRef>;
323
336
  }
324
337
  /**
325
338
  * Client-side attachment limits. Server enforcement is still required —
@@ -715,8 +728,12 @@ interface ModuleOptions extends HomeConfig {
715
728
  }
716
729
  /** The `modules` block is an ordered list of tabs (max 4). */
717
730
  type ModulesOptions = ModuleOptions[];
718
- /** A resolved tab (stable `id` filled, defaults applied). */
719
- interface ResolvedModule extends HomeConfig {
731
+ /**
732
+ * A resolved tab (stable `id` filled, defaults applied). The `home` boolean flags are POSITIVE
733
+ * (`showGreeting`/`showSearchBar`/`showRecentConversations`) — `resolveModules` inverts the wire-input
734
+ * `hide*` once, so no render site does `!hide…`. Present only for `home` tabs.
735
+ */
736
+ interface ResolvedModule extends Omit<HomeConfig, "hideGreeting" | "hideSearchBar" | "hideRecentConversations"> {
720
737
  /** Stable id for nav + last-tab persistence (`id` ?? first `contentTags` ?? `layout`, deduped). */
721
738
  id: string;
722
739
  /** i18n key or literal — resolved at render via the i18n strings. */
@@ -724,6 +741,9 @@ interface ResolvedModule extends HomeConfig {
724
741
  layout: ModuleLayout;
725
742
  /** Content tag scope — the `tags` filter (omitted for `chat`). */
726
743
  contentTags?: string[];
744
+ showGreeting?: boolean;
745
+ showSearchBar?: boolean;
746
+ showRecentConversations?: boolean;
727
747
  }
728
748
  /** Fully-resolved modules block exposed on {@link ResolvedOptions}. */
729
749
  interface ResolvedModules {
@@ -847,8 +867,6 @@ interface BehaviorOptions {
847
867
  showToolCalls?: boolean;
848
868
  /** Show citation sources (web links + document references) in the transcript. Default `false`. */
849
869
  showSources?: boolean;
850
- /** Fade the message list at its scroll edges (gradient mask). Default `true`. */
851
- scrollFade?: boolean;
852
870
  /** Turn OFF the 👍/👎 feedback controls on assistant replies. Unset/`false` = shown (default). */
853
871
  disableMessageFeedback?: boolean;
854
872
  }
@@ -1165,13 +1183,9 @@ interface ResolvedOptions {
1165
1183
  showToolCalls: boolean;
1166
1184
  /** Show citation sources (web links + document references) in the transcript. Default `false`. */
1167
1185
  showSources: boolean;
1168
- /** Fade the message list at its scroll edges (gradient mask). Default `true`. */
1169
- scrollFade: boolean;
1170
1186
  /** Show 👍/👎 feedback controls on assistant replies. Default `true`. */
1171
1187
  enableMessageFeedback: boolean;
1172
- features: Required<Omit<FeatureFlags, "tools">> & {
1173
- tools?: Array<string | ToolRef>;
1174
- };
1188
+ features: ResolvedFeatures;
1175
1189
  /** Resolved event-driven forms — ordered list + trigger index. */
1176
1190
  forms: ResolvedForms;
1177
1191
  endpoints: Required<Endpoints>;
package/index.mjs CHANGED
@@ -29,7 +29,7 @@ var BRAND = {
29
29
  };
30
30
 
31
31
  // src/core/version.ts
32
- var ELEMENTS_VERSION = true ? "0.59.3" : "0.0.0-dev";
32
+ var ELEMENTS_VERSION = true ? "0.59.5" : "0.0.0-dev";
33
33
  var ELEMENTS_VERSION_PARAM = "_ev";
34
34
 
35
35
  // src/i18n/strings.ts
@@ -1029,9 +1029,7 @@ var DEFAULT_ATTACHMENTS = {
1029
1029
  accept: "*/*"
1030
1030
  };
1031
1031
  var DEFAULT_FEATURES = {
1032
- files: true,
1033
- voice: "local",
1034
- disableHumanInLoop: false
1032
+ voice: "local"
1035
1033
  };
1036
1034
  var DEFAULT_FORMS = { list: [], byTrigger: {} };
1037
1035
  var DEFAULT_TRACKING = {
@@ -1106,12 +1104,11 @@ function resolveOptions(rawOpts) {
1106
1104
  showReasoning: behavior.showReasoning ?? false,
1107
1105
  showToolCalls: behavior.showToolCalls ?? false,
1108
1106
  showSources: behavior.showSources ?? false,
1109
- scrollFade: behavior.scrollFade ?? true,
1110
1107
  enableMessageFeedback: !(behavior.disableMessageFeedback ?? false),
1111
1108
  features: {
1112
- files: opts.features?.files ?? DEFAULT_FEATURES.files,
1113
1109
  voice: opts.features?.voice ?? DEFAULT_FEATURES.voice,
1114
- disableHumanInLoop: opts.features?.disableHumanInLoop ?? false,
1110
+ fileUpload: !(opts.features?.disableFileUpload ?? false),
1111
+ humanInLoop: !(opts.features?.disableHumanInLoop ?? false),
1115
1112
  tools: opts.features?.tools
1116
1113
  },
1117
1114
  forms: resolveForms(opts.forms, locale),
@@ -1225,9 +1222,9 @@ function resolveModules(overrides) {
1225
1222
  if (m.layout === "home") {
1226
1223
  resolved.brandName = m.brandName;
1227
1224
  resolved.greetingText = m.greetingText;
1228
- resolved.hideGreeting = m.hideGreeting ?? false;
1229
- resolved.hideSearchBar = m.hideSearchBar ?? false;
1230
- resolved.hideRecentConversations = m.hideRecentConversations ?? false;
1225
+ resolved.showGreeting = !(m.hideGreeting ?? false);
1226
+ resolved.showSearchBar = !(m.hideSearchBar ?? false);
1227
+ resolved.showRecentConversations = !(m.hideRecentConversations ?? false);
1231
1228
  if (m.userAvatars && m.userAvatars.length > 0) resolved.userAvatars = m.userAvatars;
1232
1229
  if (m.status) resolved.status = m.status;
1233
1230
  resolved.contentBlockTitle = m.contentBlockTitle;
@@ -1436,7 +1433,6 @@ var BEHAVIOR_ATTRS = [
1436
1433
  ["show-reasoning", "showReasoning", boolAttr],
1437
1434
  ["show-tool-calls", "showToolCalls", boolAttr],
1438
1435
  ["show-sources", "showSources", boolAttr],
1439
- ["scroll-fade", "scrollFade", boolAttr],
1440
1436
  ["disable-message-feedback", "disableMessageFeedback", boolAttr]
1441
1437
  ];
1442
1438
  var I18N_ATTRS = [["locale", "locale"]];
@@ -1448,7 +1444,7 @@ var LAUNCHER_ATTRS = [
1448
1444
  ["launcher-hidden", "hidden", boolAttr]
1449
1445
  ];
1450
1446
  var FEATURE_ATTRS = [
1451
- ["features-files", "files", boolAttr],
1447
+ ["features-disable-file-upload", "disableFileUpload", boolAttr],
1452
1448
  ["features-voice", "voice", (v) => v],
1453
1449
  ["features-tools", "tools", csv]
1454
1450
  ];
@@ -4500,7 +4496,7 @@ function Composer({ options, transport, feedback, bus, isStreaming, onSend, onSt
4500
4496
  const [voiceOn, setVoiceOn] = useState2(false);
4501
4497
  const taRef = useRef2(null);
4502
4498
  const fileRef = useRef2(null);
4503
- const filesEnabled = options.features.files;
4499
+ const fileUploadEnabled = options.features.fileUpload;
4504
4500
  const voiceMode = options.features.voice;
4505
4501
  const [voice, setVoice] = useState2(
4506
4502
  () => createVoice(voiceMode, options.locale, (blob, type) => transport.transcribe(blob, type))
@@ -4525,7 +4521,9 @@ function Composer({ options, transport, feedback, bus, isStreaming, onSend, onSt
4525
4521
  return;
4526
4522
  }
4527
4523
  el.style.height = "auto";
4528
- el.style.height = `${Math.min(Math.max(el.scrollHeight, 40), 160)}px`;
4524
+ const halfLine = parseFloat(getComputedStyle(el).fontSize) * 0.7;
4525
+ const measured = Math.min(el.scrollHeight, 160);
4526
+ el.style.height = `${measured < 40 + halfLine ? 40 : measured}px`;
4529
4527
  }, [text]);
4530
4528
  const attsRef = useRef2(atts);
4531
4529
  attsRef.current = atts;
@@ -4557,7 +4555,7 @@ function Composer({ options, transport, feedback, bus, isStreaming, onSend, onSt
4557
4555
  "input, textarea, [contenteditable]:not([contenteditable='false'])"
4558
4556
  );
4559
4557
  if (editable && editable !== ta) return;
4560
- if (filesEnabled) {
4558
+ if (fileUploadEnabled) {
4561
4559
  const result = ingest(data.items, attsRef.current, options.attachments);
4562
4560
  if (result.accepted.length > 0) {
4563
4561
  e.preventDefault();
@@ -4576,7 +4574,7 @@ function Composer({ options, transport, feedback, bus, isStreaming, onSend, onSt
4576
4574
  };
4577
4575
  panel.addEventListener("paste", onPaste);
4578
4576
  return () => panel.removeEventListener("paste", onPaste);
4579
- }, [filesEnabled, options.attachments, p7]);
4577
+ }, [fileUploadEnabled, options.attachments, p7]);
4580
4578
  const send = () => {
4581
4579
  const trimmed = text.trim();
4582
4580
  if (!trimmed && atts.length === 0) return;
@@ -4646,7 +4644,7 @@ function Composer({ options, transport, feedback, bus, isStreaming, onSend, onSt
4646
4644
  atts.length > 0 ? /* @__PURE__ */ jsx6("div", { class: `${p7}-attachments`, children: atts.map((a) => /* @__PURE__ */ jsx6(AttachmentChip, { attachment: a, onRemove: () => removeAtt(a.id) }, a.id)) }) : null,
4647
4645
  /* @__PURE__ */ jsxs5("div", { class: `${p7}-composer-row`, children: [
4648
4646
  /* @__PURE__ */ jsxs5("div", { class: `${p7}-composer-actions`, children: [
4649
- filesEnabled ? /* @__PURE__ */ jsx6(
4647
+ fileUploadEnabled ? /* @__PURE__ */ jsx6(
4650
4648
  "button",
4651
4649
  {
4652
4650
  type: "button",
@@ -6403,7 +6401,6 @@ function MessageList({
6403
6401
  showReasoning,
6404
6402
  showToolCalls,
6405
6403
  showSources,
6406
- scrollFade,
6407
6404
  enableMessageFeedback,
6408
6405
  onFeedback,
6409
6406
  loading,
@@ -6424,7 +6421,6 @@ function MessageList({
6424
6421
  const inInteractionGrace = () => interactingRef.current || performance.now() - interactionEndedAtRef.current < INTERACTION_GRACE_MS;
6425
6422
  const autoPinAtRef = useRef5(0);
6426
6423
  const syncFade = (el) => {
6427
- if (!scrollFade) return;
6428
6424
  const overflowing = el.scrollHeight - el.clientHeight > 1;
6429
6425
  el.dataset.fadeTop = overflowing && el.scrollTop > 1 ? "true" : "false";
6430
6426
  el.dataset.fadeBottom = overflowing && el.scrollHeight - el.scrollTop - el.clientHeight > 1 ? "true" : "false";
@@ -6670,21 +6666,11 @@ function MessageList({
6670
6666
  rows.push(markerRow(marker));
6671
6667
  }
6672
6668
  return /* @__PURE__ */ jsxs16("div", { class: `${p18}-list-wrap`, children: [
6673
- /* @__PURE__ */ jsxs16(
6674
- "div",
6675
- {
6676
- ref,
6677
- class: `${p18}-list${scrollFade ? ` ${p18}-list--fade` : ""}`,
6678
- role: "log",
6679
- "aria-live": "polite",
6680
- "aria-relevant": "additions text",
6681
- children: [
6682
- loading && messages.value.length === 0 ? /* @__PURE__ */ jsx20("div", { class: `${p18}-list-loading`, role: "status", children: strings.conversationLoading }) : null,
6683
- rows,
6684
- form && !inlineForm ? /* @__PURE__ */ jsx20(FormGate, { form: form.form, strings, onSubmit: form.onSubmit, onSkip: form.onSkip }) : null
6685
- ]
6686
- }
6687
- ),
6669
+ /* @__PURE__ */ jsxs16("div", { ref, class: `${p18}-list ${p18}-list--fade`, role: "log", "aria-live": "polite", "aria-relevant": "additions text", children: [
6670
+ loading && messages.value.length === 0 ? /* @__PURE__ */ jsx20("div", { class: `${p18}-list-loading`, role: "status", children: strings.conversationLoading }) : null,
6671
+ rows,
6672
+ form && !inlineForm ? /* @__PURE__ */ jsx20(FormGate, { form: form.form, strings, onSubmit: form.onSubmit, onSkip: form.onSkip }) : null
6673
+ ] }),
6688
6674
  showJump ? /* @__PURE__ */ jsx20(
6689
6675
  "button",
6690
6676
  {
@@ -7053,7 +7039,6 @@ function PanelContent(props2) {
7053
7039
  showReasoning: options.showReasoning,
7054
7040
  showToolCalls: options.showToolCalls,
7055
7041
  showSources: options.showSources,
7056
- scrollFade: options.scrollFade,
7057
7042
  enableMessageFeedback: options.enableMessageFeedback,
7058
7043
  onFeedback: onMessageFeedback,
7059
7044
  loading: loadingMessages,
@@ -7600,13 +7585,13 @@ function HomeRoot(props2) {
7600
7585
  const [content, setContent] = useState12([]);
7601
7586
  const tagsKey = config.contentTags?.join(",");
7602
7587
  useEffect11(() => {
7603
- if (config.hideRecentConversations) return;
7588
+ if (config.showRecentConversations === false) return;
7604
7589
  let cancelled = false;
7605
7590
  transport.listConversations({ limit: 1 }).then((res) => !cancelled && setRecent(res.conversations?.[0] ?? null)).catch((err) => !cancelled && log14.warn("listConversations (home) failed", { err }));
7606
7591
  return () => {
7607
7592
  cancelled = true;
7608
7593
  };
7609
- }, [transport, config.hideRecentConversations]);
7594
+ }, [transport, config.showRecentConversations]);
7610
7595
  useEffect11(() => {
7611
7596
  if (!config.contentTags?.length) return;
7612
7597
  let cancelled = false;
@@ -7634,13 +7619,13 @@ function HomeRoot(props2) {
7634
7619
  /* @__PURE__ */ jsx32(HeaderActions, { panelProps, variant: "plain" })
7635
7620
  ] })
7636
7621
  ] }),
7637
- !config.hideGreeting ? /* @__PURE__ */ jsxs26(Fragment7, { children: [
7622
+ config.showGreeting !== false ? /* @__PURE__ */ jsxs26(Fragment7, { children: [
7638
7623
  /* @__PURE__ */ jsx32("h1", { class: `${p28}-home-greeting`, "data-testid": TID.homeGreeting, children: greeting.title }),
7639
7624
  greeting.subtitle ? /* @__PURE__ */ jsx32("p", { class: `${p28}-home-lead`, children: greeting.subtitle }) : null
7640
7625
  ] }) : null
7641
7626
  ] }),
7642
7627
  /* @__PURE__ */ jsxs26("div", { class: `${p28}-home-cards`, children: [
7643
- !config.hideSearchBar ? /* @__PURE__ */ jsx32(
7628
+ config.showSearchBar !== false ? /* @__PURE__ */ jsx32(
7644
7629
  HomeSearchButton,
7645
7630
  {
7646
7631
  placeholder: strings.homeSearchPlaceholder,
@@ -8793,12 +8778,12 @@ function App({ options, hostElement, bus }) {
8793
8778
  );
8794
8779
  const toolInteraction = useMemo3(
8795
8780
  () => ({
8796
- humanInLoop: !options.features.disableHumanInLoop,
8781
+ humanInLoop: options.features.humanInLoop,
8797
8782
  onResult: handleToolResult,
8798
8783
  onDecision: handleToolDecision,
8799
8784
  onEdit: handleToolEdit
8800
8785
  }),
8801
- [options.features.disableHumanInLoop, handleToolResult, handleToolDecision, handleToolEdit]
8786
+ [options.features.humanInLoop, handleToolResult, handleToolDecision, handleToolEdit]
8802
8787
  );
8803
8788
  const userMessageCount = () => messagesSig.value.reduce((n, m) => n + (m.role === "user" ? 1 : 0), 0);
8804
8789
  const effectiveForms = options.forms.list.length > 0 ? options.forms : remoteForms ?? options.forms;
package/package.json CHANGED
@@ -80,5 +80,5 @@
80
80
  ],
81
81
  "type": "module",
82
82
  "types": "./index.d.ts",
83
- "version": "0.59.3"
83
+ "version": "0.59.5"
84
84
  }
package/schema.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { A as Asset, B as BlocksConfig, C as ConnectionConfig, a as ConnectionConfigPartial, E as Endpoints, H as HandshakeResponse, L as Link, P as PAGE_AREA_SUGGESTIONS, f as PageContext, S as ServerConfig, b as SiteConfig, U as UserContext, W as WidgetConfig, c as WidgetConfigPartial, d as WidgetSettings, e as WidgetSettingsPartial, g as assetSchema, h as blocksConfigSchema, i as connectionConfigPartialSchema, j as connectionConfigSchema, k as cssColorSchema, l as cssLengthSchema, m as endpointsSchema, n as handshakeResponseSchema, o as linkSchema, p as localeSchema, q as pageContextSchema, s as serverConfigSchema, r as siteConfigSchema, u as userContextSchema, t as uuid7Schema, w as widgetConfigPartialSchema, v as widgetConfigSchema, x as widgetSettingsPartialSchema, y as widgetSettingsSchema } from './deployment-Crtq-vQg.js';
1
+ export { A as Asset, B as BlocksConfig, C as ConnectionConfig, a as ConnectionConfigPartial, E as Endpoints, H as HandshakeResponse, L as Link, P as PAGE_AREA_SUGGESTIONS, f as PageContext, S as ServerConfig, b as SiteConfig, U as UserContext, W as WidgetConfig, c as WidgetConfigPartial, d as WidgetSettings, e as WidgetSettingsPartial, g as assetSchema, h as blocksConfigSchema, i as connectionConfigPartialSchema, j as connectionConfigSchema, k as cssColorSchema, l as cssLengthSchema, m as endpointsSchema, n as handshakeResponseSchema, o as linkSchema, p as localeSchema, q as pageContextSchema, s as serverConfigSchema, r as siteConfigSchema, u as userContextSchema, t as uuid7Schema, w as widgetConfigPartialSchema, v as widgetConfigSchema, x as widgetSettingsPartialSchema, y as widgetSettingsSchema } from './deployment-Bqqyxer1.js';
2
2
  import { z } from 'zod';
3
3
 
4
4
  /**
@@ -84,7 +84,6 @@ declare const behaviorSchema: z.ZodObject<{
84
84
  showReasoning: z.ZodDefault<z.ZodBoolean>;
85
85
  showToolCalls: z.ZodDefault<z.ZodBoolean>;
86
86
  showSources: z.ZodDefault<z.ZodBoolean>;
87
- scrollFade: z.ZodDefault<z.ZodBoolean>;
88
87
  disableMessageFeedback: z.ZodDefault<z.ZodBoolean>;
89
88
  }, z.core.$loose>;
90
89
  type Behavior = z.infer<typeof behaviorSchema>;
@@ -298,7 +297,7 @@ declare const toolRefSchema: z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
298
297
  config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
299
298
  }, z.core.$loose>]>;
300
299
  declare const featureFlagsSchema: z.ZodObject<{
301
- files: z.ZodDefault<z.ZodBoolean>;
300
+ disableFileUpload: z.ZodDefault<z.ZodBoolean>;
302
301
  voice: z.ZodDefault<z.ZodEnum<{
303
302
  server: "server";
304
303
  local: "local";
package/schema.json CHANGED
@@ -485,11 +485,6 @@
485
485
  "description": "Show the citation sources behind an answer (web links + document/file references) in the transcript. `false` (default) hides them.",
486
486
  "type": "boolean"
487
487
  },
488
- "scrollFade": {
489
- "default": true,
490
- "description": "Fade the message list at its scroll edges with a soft gradient mask (the fade lifts at the very top/bottom). `true` (default) enables it; `false` shows hard edges.",
491
- "type": "boolean"
492
- },
493
488
  "disableMessageFeedback": {
494
489
  "default": false,
495
490
  "description": "Turn OFF the 👍/👎 feedback controls under each assistant reply. Unset/`false` = shown (default), `true` = hidden. A choice fires the `messageFeedback` event and is POSTed best-effort to `/pai/message-feedback`.",
@@ -502,7 +497,6 @@
502
497
  "showReasoning",
503
498
  "showToolCalls",
504
499
  "showSources",
505
- "scrollFade",
506
500
  "disableMessageFeedback"
507
501
  ],
508
502
  "additionalProperties": {},
@@ -515,7 +509,6 @@
515
509
  {
516
510
  "startMinimized": false,
517
511
  "responseMode": "buffered",
518
- "scrollFade": false,
519
512
  "disableMessageFeedback": true
520
513
  }
521
514
  ]
@@ -1259,9 +1252,9 @@
1259
1252
  "features": {
1260
1253
  "type": "object",
1261
1254
  "properties": {
1262
- "files": {
1263
- "default": true,
1264
- "description": "Show the paperclip button + accept drag/drop/paste for file attachments.",
1255
+ "disableFileUpload": {
1256
+ "default": false,
1257
+ "description": "Turn OFF file uploads — hide the paperclip button + reject drag/drop/paste. Unset/`false` = enabled (default), `true` = disabled.",
1265
1258
  "type": "boolean"
1266
1259
  },
1267
1260
  "voice": {
@@ -1316,7 +1309,7 @@
1316
1309
  }
1317
1310
  },
1318
1311
  "required": [
1319
- "files",
1312
+ "disableFileUpload",
1320
1313
  "voice",
1321
1314
  "disableHumanInLoop"
1322
1315
  ],
@@ -1324,15 +1317,13 @@
1324
1317
  "description": "Capability flags — file upload, voice mode, and the tools the assistant may invoke.",
1325
1318
  "examples": [
1326
1319
  {
1327
- "files": true,
1328
1320
  "voice": "local"
1329
1321
  },
1330
1322
  {
1331
- "files": false,
1323
+ "disableFileUpload": true,
1332
1324
  "voice": "disabled"
1333
1325
  },
1334
1326
  {
1335
- "files": true,
1336
1327
  "voice": "server",
1337
1328
  "tools": [
1338
1329
  "tool:send-money"
@@ -2355,11 +2346,6 @@
2355
2346
  "description": "Show the citation sources behind an answer (web links + document/file references) in the transcript. `false` (default) hides them.",
2356
2347
  "type": "boolean"
2357
2348
  },
2358
- "scrollFade": {
2359
- "default": true,
2360
- "description": "Fade the message list at its scroll edges with a soft gradient mask (the fade lifts at the very top/bottom). `true` (default) enables it; `false` shows hard edges.",
2361
- "type": "boolean"
2362
- },
2363
2349
  "disableMessageFeedback": {
2364
2350
  "default": false,
2365
2351
  "description": "Turn OFF the 👍/👎 feedback controls under each assistant reply. Unset/`false` = shown (default), `true` = hidden. A choice fires the `messageFeedback` event and is POSTed best-effort to `/pai/message-feedback`.",
@@ -2372,7 +2358,6 @@
2372
2358
  "showReasoning",
2373
2359
  "showToolCalls",
2374
2360
  "showSources",
2375
- "scrollFade",
2376
2361
  "disableMessageFeedback"
2377
2362
  ],
2378
2363
  "additionalProperties": {},
@@ -2385,7 +2370,6 @@
2385
2370
  {
2386
2371
  "startMinimized": false,
2387
2372
  "responseMode": "buffered",
2388
- "scrollFade": false,
2389
2373
  "disableMessageFeedback": true
2390
2374
  }
2391
2375
  ]
@@ -3129,9 +3113,9 @@
3129
3113
  "features": {
3130
3114
  "type": "object",
3131
3115
  "properties": {
3132
- "files": {
3133
- "default": true,
3134
- "description": "Show the paperclip button + accept drag/drop/paste for file attachments.",
3116
+ "disableFileUpload": {
3117
+ "default": false,
3118
+ "description": "Turn OFF file uploads — hide the paperclip button + reject drag/drop/paste. Unset/`false` = enabled (default), `true` = disabled.",
3135
3119
  "type": "boolean"
3136
3120
  },
3137
3121
  "voice": {
@@ -3186,7 +3170,7 @@
3186
3170
  }
3187
3171
  },
3188
3172
  "required": [
3189
- "files",
3173
+ "disableFileUpload",
3190
3174
  "voice",
3191
3175
  "disableHumanInLoop"
3192
3176
  ],
@@ -3194,15 +3178,13 @@
3194
3178
  "description": "Capability flags — file upload, voice mode, and the tools the assistant may invoke.",
3195
3179
  "examples": [
3196
3180
  {
3197
- "files": true,
3198
3181
  "voice": "local"
3199
3182
  },
3200
3183
  {
3201
- "files": false,
3184
+ "disableFileUpload": true,
3202
3185
  "voice": "disabled"
3203
3186
  },
3204
3187
  {
3205
- "files": true,
3206
3188
  "voice": "server",
3207
3189
  "tools": [
3208
3190
  "tool:send-money"
package/schema.mjs CHANGED
@@ -131,16 +131,13 @@ var behaviorSchema = z4.object({
131
131
  showSources: z4.boolean().default(false).describe(
132
132
  "Show the citation sources behind an answer (web links + document/file references) in the transcript. `false` (default) hides them."
133
133
  ),
134
- scrollFade: z4.boolean().default(true).describe(
135
- "Fade the message list at its scroll edges with a soft gradient mask (the fade lifts at the very top/bottom). `true` (default) enables it; `false` shows hard edges."
136
- ),
137
134
  disableMessageFeedback: z4.boolean().default(false).describe(
138
135
  "Turn OFF the \u{1F44D}/\u{1F44E} feedback controls under each assistant reply. Unset/`false` = shown (default), `true` = hidden. A choice fires the `messageFeedback` event and is POSTed best-effort to `/pai/message-feedback`."
139
136
  )
140
137
  }).loose().describe("Conversation behaviour \u2014 lifecycle, streaming, and the transcript surface (scroll, feedback).").meta({
141
138
  examples: [
142
139
  { startMinimized: true, responseMode: "streaming" },
143
- { startMinimized: false, responseMode: "buffered", scrollFade: false, disableMessageFeedback: true }
140
+ { startMinimized: false, responseMode: "buffered", disableMessageFeedback: true }
144
141
  ]
145
142
  });
146
143
 
@@ -224,7 +221,9 @@ var toolRefSchema = z7.union([
224
221
  }).loose()
225
222
  ]);
226
223
  var featureFlagsSchema = z7.object({
227
- files: z7.boolean().default(true).describe("Show the paperclip button + accept drag/drop/paste for file attachments."),
224
+ disableFileUpload: z7.boolean().default(false).describe(
225
+ "Turn OFF file uploads \u2014 hide the paperclip button + reject drag/drop/paste. Unset/`false` = enabled (default), `true` = disabled."
226
+ ),
228
227
  voice: voiceModeSchema.default("local").describe(
229
228
  "Voice input mode. `local` \u2014 Web Speech API in the browser (free, runs on-device). `server` \u2014 record audio + upload to the transcribe endpoint. `disabled` \u2014 hide the mic button."
230
229
  ),
@@ -236,9 +235,9 @@ var featureFlagsSchema = z7.object({
236
235
  )
237
236
  }).loose().describe("Capability flags \u2014 file upload, voice mode, and the tools the assistant may invoke.").meta({
238
237
  examples: [
239
- { files: true, voice: "local" },
240
- { files: false, voice: "disabled" },
241
- { files: true, voice: "server", tools: ["tool:send-money"] }
238
+ { voice: "local" },
239
+ { disableFileUpload: true, voice: "disabled" },
240
+ { voice: "server", tools: ["tool:send-money"] }
242
241
  ]
243
242
  });
244
243
 
@@ -730,7 +729,7 @@ var widgetSettingsSchema = z16.object({
730
729
  {
731
730
  presentation: { mode: "inline" },
732
731
  behavior: { responseMode: "streaming" },
733
- features: { files: true, voice: "local" }
732
+ features: { voice: "local" }
734
733
  }
735
734
  ]
736
735
  });