@helpai/elements 0.59.3 → 0.59.4

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.4" : "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))
@@ -4557,7 +4553,7 @@ function Composer({ options, transport, feedback, bus, isStreaming, onSend, onSt
4557
4553
  "input, textarea, [contenteditable]:not([contenteditable='false'])"
4558
4554
  );
4559
4555
  if (editable && editable !== ta) return;
4560
- if (filesEnabled) {
4556
+ if (fileUploadEnabled) {
4561
4557
  const result = ingest(data.items, attsRef.current, options.attachments);
4562
4558
  if (result.accepted.length > 0) {
4563
4559
  e.preventDefault();
@@ -4576,7 +4572,7 @@ function Composer({ options, transport, feedback, bus, isStreaming, onSend, onSt
4576
4572
  };
4577
4573
  panel.addEventListener("paste", onPaste);
4578
4574
  return () => panel.removeEventListener("paste", onPaste);
4579
- }, [filesEnabled, options.attachments, p7]);
4575
+ }, [fileUploadEnabled, options.attachments, p7]);
4580
4576
  const send = () => {
4581
4577
  const trimmed = text.trim();
4582
4578
  if (!trimmed && atts.length === 0) return;
@@ -4646,7 +4642,7 @@ function Composer({ options, transport, feedback, bus, isStreaming, onSend, onSt
4646
4642
  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
4643
  /* @__PURE__ */ jsxs5("div", { class: `${p7}-composer-row`, children: [
4648
4644
  /* @__PURE__ */ jsxs5("div", { class: `${p7}-composer-actions`, children: [
4649
- filesEnabled ? /* @__PURE__ */ jsx6(
4645
+ fileUploadEnabled ? /* @__PURE__ */ jsx6(
4650
4646
  "button",
4651
4647
  {
4652
4648
  type: "button",
@@ -6403,7 +6399,6 @@ function MessageList({
6403
6399
  showReasoning,
6404
6400
  showToolCalls,
6405
6401
  showSources,
6406
- scrollFade,
6407
6402
  enableMessageFeedback,
6408
6403
  onFeedback,
6409
6404
  loading,
@@ -6424,7 +6419,6 @@ function MessageList({
6424
6419
  const inInteractionGrace = () => interactingRef.current || performance.now() - interactionEndedAtRef.current < INTERACTION_GRACE_MS;
6425
6420
  const autoPinAtRef = useRef5(0);
6426
6421
  const syncFade = (el) => {
6427
- if (!scrollFade) return;
6428
6422
  const overflowing = el.scrollHeight - el.clientHeight > 1;
6429
6423
  el.dataset.fadeTop = overflowing && el.scrollTop > 1 ? "true" : "false";
6430
6424
  el.dataset.fadeBottom = overflowing && el.scrollHeight - el.scrollTop - el.clientHeight > 1 ? "true" : "false";
@@ -6670,21 +6664,11 @@ function MessageList({
6670
6664
  rows.push(markerRow(marker));
6671
6665
  }
6672
6666
  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
- ),
6667
+ /* @__PURE__ */ jsxs16("div", { ref, class: `${p18}-list ${p18}-list--fade`, role: "log", "aria-live": "polite", "aria-relevant": "additions text", children: [
6668
+ loading && messages.value.length === 0 ? /* @__PURE__ */ jsx20("div", { class: `${p18}-list-loading`, role: "status", children: strings.conversationLoading }) : null,
6669
+ rows,
6670
+ form && !inlineForm ? /* @__PURE__ */ jsx20(FormGate, { form: form.form, strings, onSubmit: form.onSubmit, onSkip: form.onSkip }) : null
6671
+ ] }),
6688
6672
  showJump ? /* @__PURE__ */ jsx20(
6689
6673
  "button",
6690
6674
  {
@@ -7053,7 +7037,6 @@ function PanelContent(props2) {
7053
7037
  showReasoning: options.showReasoning,
7054
7038
  showToolCalls: options.showToolCalls,
7055
7039
  showSources: options.showSources,
7056
- scrollFade: options.scrollFade,
7057
7040
  enableMessageFeedback: options.enableMessageFeedback,
7058
7041
  onFeedback: onMessageFeedback,
7059
7042
  loading: loadingMessages,
@@ -7600,13 +7583,13 @@ function HomeRoot(props2) {
7600
7583
  const [content, setContent] = useState12([]);
7601
7584
  const tagsKey = config.contentTags?.join(",");
7602
7585
  useEffect11(() => {
7603
- if (config.hideRecentConversations) return;
7586
+ if (config.showRecentConversations === false) return;
7604
7587
  let cancelled = false;
7605
7588
  transport.listConversations({ limit: 1 }).then((res) => !cancelled && setRecent(res.conversations?.[0] ?? null)).catch((err) => !cancelled && log14.warn("listConversations (home) failed", { err }));
7606
7589
  return () => {
7607
7590
  cancelled = true;
7608
7591
  };
7609
- }, [transport, config.hideRecentConversations]);
7592
+ }, [transport, config.showRecentConversations]);
7610
7593
  useEffect11(() => {
7611
7594
  if (!config.contentTags?.length) return;
7612
7595
  let cancelled = false;
@@ -7634,13 +7617,13 @@ function HomeRoot(props2) {
7634
7617
  /* @__PURE__ */ jsx32(HeaderActions, { panelProps, variant: "plain" })
7635
7618
  ] })
7636
7619
  ] }),
7637
- !config.hideGreeting ? /* @__PURE__ */ jsxs26(Fragment7, { children: [
7620
+ config.showGreeting !== false ? /* @__PURE__ */ jsxs26(Fragment7, { children: [
7638
7621
  /* @__PURE__ */ jsx32("h1", { class: `${p28}-home-greeting`, "data-testid": TID.homeGreeting, children: greeting.title }),
7639
7622
  greeting.subtitle ? /* @__PURE__ */ jsx32("p", { class: `${p28}-home-lead`, children: greeting.subtitle }) : null
7640
7623
  ] }) : null
7641
7624
  ] }),
7642
7625
  /* @__PURE__ */ jsxs26("div", { class: `${p28}-home-cards`, children: [
7643
- !config.hideSearchBar ? /* @__PURE__ */ jsx32(
7626
+ config.showSearchBar !== false ? /* @__PURE__ */ jsx32(
7644
7627
  HomeSearchButton,
7645
7628
  {
7646
7629
  placeholder: strings.homeSearchPlaceholder,
@@ -8793,12 +8776,12 @@ function App({ options, hostElement, bus }) {
8793
8776
  );
8794
8777
  const toolInteraction = useMemo3(
8795
8778
  () => ({
8796
- humanInLoop: !options.features.disableHumanInLoop,
8779
+ humanInLoop: options.features.humanInLoop,
8797
8780
  onResult: handleToolResult,
8798
8781
  onDecision: handleToolDecision,
8799
8782
  onEdit: handleToolEdit
8800
8783
  }),
8801
- [options.features.disableHumanInLoop, handleToolResult, handleToolDecision, handleToolEdit]
8784
+ [options.features.humanInLoop, handleToolResult, handleToolDecision, handleToolEdit]
8802
8785
  );
8803
8786
  const userMessageCount = () => messagesSig.value.reduce((n, m) => n + (m.role === "user" ? 1 : 0), 0);
8804
8787
  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.4"
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
  });