@helpai/elements 0.5.0 → 0.7.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/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { A as Asset, B as BlocksConfig, C as ConnectionConfig, a as ConnectionConfigPartial, L as Link, S as ServerConfig, b as SiteConfig, c as StartSessionResponse, W as WidgetConfig, d as WidgetConfigPartial, e as WidgetSettings, f as WidgetSettingsPartial } from './deployment-DKyrRSGL.js';
1
+ export { A as Asset, B as BlocksConfig, C as ConnectionConfig, a as ConnectionConfigPartial, L as Link, S as ServerConfig, b as SiteConfig, c as StartSessionResponse, W as WidgetConfig, d as WidgetConfigPartial, e as WidgetSettings, f as WidgetSettingsPartial } from './deployment-DhWwzofY.js';
2
2
  import 'zod';
3
3
 
4
4
  /**
@@ -40,7 +40,7 @@ interface ClientStorage {
40
40
  * populated {@link Strings} map. UI components then read `strings.send` as a
41
41
  * normal property access — no per-render lookup, no per-render allocation.
42
42
  */
43
- type StringKey = "launcherOpen" | "panelTitle" | "composerPlaceholder" | "send" | "stop" | "attach" | "micStart" | "micStop" | "micUnsupported" | "expand" | "collapse" | "fullscreen" | "exitFullscreen" | "resizeHandle" | "popOut" | "close" | "moreActions" | "soundOn" | "soundOff" | "language" | "theme" | "themeAuto" | "themeLight" | "themeDark" | "history" | "historyTitle" | "historyEmpty" | "historyLoading" | "historyNewChat" | "historyBack" | "messagesLoading" | "chatClosed" | "startNewConversation" | "dateToday" | "dateYesterday" | "dateLastWeek" | "dateOlder" | "newConversation" | "dropZone" | "attachmentTooLarge" | "attachmentTooMany" | "attachmentMimeRejected" | "errorRetry" | "errorGeneric" | "loading" | "thinking" | "thoughts" | "usedTool" | "collapseSidebar" | "expandSidebar" | "tabHome" | "tabMessages" | "tabHelp" | "tabNews" | "modulesEmpty" | "moduleBack" | "contentLoading" | "homeGreeting" | "homeGreetingNamed" | "homeGreetingLead" | "homeSearchPlaceholder" | "homeContentTitle" | "helpTitle" | "helpSearchPlaceholder" | "helpEmpty" | "helpLoading" | "helpSearchEmpty" | "newsTitle" | "newsEmpty" | "newsLoading" | "newsBack" | "newsPublishedAt";
43
+ type StringKey = "launcherOpen" | "panelTitle" | "composerPlaceholder" | "send" | "stop" | "attach" | "micStart" | "micStop" | "micUnsupported" | "expand" | "collapse" | "fullscreen" | "exitFullscreen" | "resizeHandle" | "popOut" | "close" | "moreActions" | "soundOn" | "soundOff" | "language" | "theme" | "themeAuto" | "themeLight" | "themeDark" | "history" | "historyTitle" | "historyEmpty" | "historyLoading" | "historyNewChat" | "historyBack" | "messagesLoading" | "chatClosed" | "startNewConversation" | "dateToday" | "dateYesterday" | "dateLastWeek" | "dateOlder" | "newConversation" | "dropZone" | "attachmentTooLarge" | "attachmentTooMany" | "attachmentMimeRejected" | "errorRetry" | "errorGeneric" | "errorRateLimited" | "loading" | "thinking" | "thoughts" | "usedTool" | "collapseSidebar" | "expandSidebar" | "tabHome" | "tabMessages" | "tabHelp" | "tabNews" | "modulesEmpty" | "moduleBack" | "contentLoading" | "homeGreeting" | "homeGreetingNamed" | "homeGreetingLead" | "homeSearchPlaceholder" | "homeContentTitle" | "helpTitle" | "helpSearchPlaceholder" | "helpEmpty" | "helpLoading" | "helpSearchEmpty" | "newsTitle" | "newsEmpty" | "newsLoading" | "newsBack" | "newsPublishedAt";
44
44
  /** A partial map for one locale — what overrides look like on the wire. */
45
45
  type LocaleStrings = Partial<Record<StringKey, string>>;
46
46
  /**
package/index.mjs CHANGED
@@ -46,6 +46,7 @@ var STRINGS_EN = {
46
46
  dateYesterday: "Yesterday",
47
47
  dropZone: "Drop files to attach",
48
48
  errorGeneric: "Something went wrong",
49
+ errorRateLimited: "Too many requests \u2014 please try again in a moment.",
49
50
  errorRetry: "Retry",
50
51
  expand: "Expand",
51
52
  expandSidebar: "Expand sidebar",
@@ -936,9 +937,10 @@ function fillRandom(view) {
936
937
 
937
938
  // src/stream/types.ts
938
939
  var StreamError = class extends Error {
939
- constructor(message, code, cause) {
940
+ constructor(message, code, status, cause) {
940
941
  super(message);
941
942
  __publicField(this, "code", code);
943
+ __publicField(this, "status", status);
942
944
  __publicField(this, "cause", cause);
943
945
  this.name = "StreamError";
944
946
  }
@@ -949,7 +951,7 @@ var log3 = logger.scope("parser");
949
951
  async function* parseChatStream(response, signal6) {
950
952
  if (!response.ok) {
951
953
  const text = await response.text().catch(() => "");
952
- throw new StreamError(`server responded ${response.status}: ${text.slice(0, 200)}`, "server");
954
+ throw new StreamError(`server responded ${response.status}: ${text.slice(0, 200)}`, "server", response.status);
953
955
  }
954
956
  if (!response.body) throw new StreamError("response has no body", "no-body");
955
957
  const reader = response.body.pipeThrough(new TextDecoderStream()).getReader();
@@ -1113,15 +1115,27 @@ function messageToWireParts(m) {
1113
1115
  var log4 = logger.scope("transport");
1114
1116
  var MAX_RESUME_ATTEMPTS = 3;
1115
1117
  var RESUME_BACKOFF_MS = 400;
1118
+ var MAX_REQUEST_RETRIES = 3;
1119
+ var RETRYABLE_STATUS = /* @__PURE__ */ new Set([408, 425, 429, 500, 502, 503, 504]);
1120
+ function backoffMs(attempt) {
1121
+ return RESUME_BACKOFF_MS * 2 ** attempt + Math.floor(Math.random() * 250);
1122
+ }
1123
+ function retryAfterMs(headers) {
1124
+ const raw = headers.get("retry-after");
1125
+ if (!raw) return null;
1126
+ const secs = Number(raw);
1127
+ const ms = Number.isFinite(secs) ? secs * 1e3 : Date.parse(raw) - Date.now();
1128
+ return Number.isFinite(ms) && ms >= 0 ? Math.min(ms, 3e4) : null;
1129
+ }
1116
1130
  function sleep(ms, signal6) {
1117
1131
  return new Promise((resolve) => {
1118
- if (signal6.aborted) return resolve();
1132
+ if (signal6?.aborted) return resolve();
1119
1133
  const id = setTimeout(done, ms);
1120
1134
  const onAbort = () => done();
1121
- signal6.addEventListener("abort", onAbort, { once: true });
1135
+ signal6?.addEventListener("abort", onAbort, { once: true });
1122
1136
  function done() {
1123
1137
  clearTimeout(id);
1124
- signal6.removeEventListener("abort", onAbort);
1138
+ signal6?.removeEventListener("abort", onAbort);
1125
1139
  resolve();
1126
1140
  }
1127
1141
  });
@@ -1375,6 +1389,7 @@ var AgentTransport = class {
1375
1389
  }
1376
1390
  } catch (err) {
1377
1391
  if (ctrl.signal.aborted) return true;
1392
+ if (err instanceof StreamError && err.status !== void 0) throw err;
1378
1393
  log4.debug("stream segment dropped", { err });
1379
1394
  }
1380
1395
  return false;
@@ -1419,13 +1434,23 @@ var AgentTransport = class {
1419
1434
  url.searchParams.set("resumeAt", String(resumeAt));
1420
1435
  return url.toString();
1421
1436
  }
1437
+ // JSON requests are idempotent (reads, or full-snapshot writes like
1438
+ // update-settings / mark-read / start-session), so they auto-retry transient
1439
+ // failures. The message POST is NOT in here — re-sending could duplicate the
1440
+ // reply, so it surfaces an error for the user to retry (see `openMessageStream`).
1422
1441
  async postJson(path, body, label) {
1423
- const res = await this.fetchImpl(this.url(path), {
1424
- method: "POST",
1425
- credentials: "omit",
1426
- headers: { "content-type": "application/json", ...this.opts.auth.headers() },
1427
- body: JSON.stringify(this.withEnvelope(body))
1428
- });
1442
+ const res = await this.fetchWithRetry(
1443
+ () => [
1444
+ this.url(path),
1445
+ {
1446
+ method: "POST",
1447
+ credentials: "omit",
1448
+ headers: { "content-type": "application/json", ...this.opts.auth.headers() },
1449
+ body: JSON.stringify(this.withEnvelope(body))
1450
+ }
1451
+ ],
1452
+ label
1453
+ );
1429
1454
  return this.assertOk(res, label);
1430
1455
  }
1431
1456
  async postForm(path, body, label) {
@@ -1438,16 +1463,44 @@ var AgentTransport = class {
1438
1463
  return this.assertOk(res, label);
1439
1464
  }
1440
1465
  async getJson(urlOrPath, label) {
1441
- const res = await this.fetchImpl(this.withEnvelopeQuery(urlOrPath), {
1442
- method: "GET",
1443
- credentials: "omit",
1444
- headers: { accept: "application/json", ...this.opts.auth.headers() }
1445
- });
1466
+ const res = await this.fetchWithRetry(
1467
+ () => [
1468
+ this.withEnvelopeQuery(urlOrPath),
1469
+ { method: "GET", credentials: "omit", headers: { accept: "application/json", ...this.opts.auth.headers() } }
1470
+ ],
1471
+ label
1472
+ );
1446
1473
  return this.assertOk(res, label);
1447
1474
  }
1448
- /** Throw on non-2xx, otherwise return the parsed JSON body. */
1475
+ /**
1476
+ * Fetch with bounded retries for *transient* failures: retryable statuses
1477
+ * (429 / 5xx / …) and network errors, honoring `Retry-After` (else backoff +
1478
+ * jitter). Terminal statuses (4xx) return immediately for the caller to throw.
1479
+ * Use only for idempotent requests.
1480
+ */
1481
+ async fetchWithRetry(build, label) {
1482
+ for (let attempt = 0; ; attempt++) {
1483
+ const [reqUrl, init2] = build();
1484
+ let res;
1485
+ try {
1486
+ res = await this.fetchImpl(reqUrl, init2);
1487
+ } catch (err) {
1488
+ if (attempt >= MAX_REQUEST_RETRIES) {
1489
+ throw new StreamError(`${label} failed: network error`, "network", void 0, err);
1490
+ }
1491
+ log4.debug("request network error \u2014 retrying", { label, attempt });
1492
+ await sleep(backoffMs(attempt));
1493
+ continue;
1494
+ }
1495
+ if (res.ok || !RETRYABLE_STATUS.has(res.status) || attempt >= MAX_REQUEST_RETRIES) return res;
1496
+ const wait = retryAfterMs(res.headers) ?? backoffMs(attempt);
1497
+ log4.debug("request retryable status \u2014 retrying", { label, status: res.status, attempt, wait });
1498
+ await sleep(wait);
1499
+ }
1500
+ }
1501
+ /** Throw on non-2xx (with the status attached), otherwise parse the JSON body. */
1449
1502
  async assertOk(res, label) {
1450
- if (!res.ok) throw new StreamError(`${label} failed: ${res.status}`, "server");
1503
+ if (!res.ok) throw new StreamError(`${label} failed: ${res.status}`, "server", res.status);
1451
1504
  return await res.json();
1452
1505
  }
1453
1506
  url(pathOrUrl) {
@@ -2116,6 +2169,12 @@ var FeedbackBus = class {
2116
2169
  }
2117
2170
  };
2118
2171
 
2172
+ // src/ui/error-message.ts
2173
+ function errorMessageFor(error, strings) {
2174
+ if (error instanceof StreamError && error.status === 429) return strings.errorRateLimited;
2175
+ return strings.errorGeneric;
2176
+ }
2177
+
2119
2178
  // src/ui/launcher.tsx
2120
2179
  import { useEffect, useState } from "preact/hooks";
2121
2180
 
@@ -4532,6 +4591,7 @@ function ArticleRow({ article, nav }) {
4532
4591
  function HelpRoot({ transport, strings, config, nav, panelProps }) {
4533
4592
  const tags = config.contentTags;
4534
4593
  const [state, setState] = useState6("loading");
4594
+ const [errorMsg, setErrorMsg] = useState6(strings.errorGeneric);
4535
4595
  const [items, setItems] = useState6([]);
4536
4596
  const [query, setQuery] = useState6("");
4537
4597
  const [reloadKey, setReloadKey] = useState6(0);
@@ -4545,6 +4605,7 @@ function HelpRoot({ transport, strings, config, nav, panelProps }) {
4545
4605
  }).catch((err) => {
4546
4606
  if (cancelled) return;
4547
4607
  log12.warn("listContent (help) failed", { err });
4608
+ setErrorMsg(errorMessageFor(err, strings));
4548
4609
  setState("error");
4549
4610
  });
4550
4611
  return () => {
@@ -4559,15 +4620,7 @@ function HelpRoot({ transport, strings, config, nav, panelProps }) {
4559
4620
  }
4560
4621
  if (state === "loading") return /* @__PURE__ */ jsx25(ModuleState, { message: strings.helpLoading, strings });
4561
4622
  if (state === "error") {
4562
- return /* @__PURE__ */ jsx25(
4563
- ModuleState,
4564
- {
4565
- tone: "error",
4566
- message: strings.errorGeneric,
4567
- onRetry: () => setReloadKey((k) => k + 1),
4568
- strings
4569
- }
4570
- );
4623
+ return /* @__PURE__ */ jsx25(ModuleState, { tone: "error", message: errorMsg, onRetry: () => setReloadKey((k) => k + 1), strings });
4571
4624
  }
4572
4625
  if (items.length === 0) return /* @__PURE__ */ jsx25(ModuleState, { message: strings.helpEmpty, strings });
4573
4626
  return groupByCategory(items).map(([category, rows]) => /* @__PURE__ */ jsxs20("section", { class: `${p18}-help-group`, children: [
@@ -4717,6 +4770,7 @@ var log14 = logger.scope("news");
4717
4770
  function NewsRoot({ transport, strings, config, nav, panelProps }) {
4718
4771
  const tags = config.contentTags;
4719
4772
  const [state, setState] = useState8("loading");
4773
+ const [errorMsg, setErrorMsg] = useState8(strings.errorGeneric);
4720
4774
  const [items, setItems] = useState8([]);
4721
4775
  const [reloadKey, setReloadKey] = useState8(0);
4722
4776
  useEffect13(() => {
@@ -4729,6 +4783,7 @@ function NewsRoot({ transport, strings, config, nav, panelProps }) {
4729
4783
  }).catch((err) => {
4730
4784
  if (cancelled) return;
4731
4785
  log14.warn("listContent (news) failed", { err });
4786
+ setErrorMsg(errorMessageFor(err, strings));
4732
4787
  setState("error");
4733
4788
  });
4734
4789
  return () => {
@@ -4738,15 +4793,7 @@ function NewsRoot({ transport, strings, config, nav, panelProps }) {
4738
4793
  function renderBody() {
4739
4794
  if (state === "loading") return /* @__PURE__ */ jsx28(ModuleState, { message: strings.newsLoading, strings });
4740
4795
  if (state === "error") {
4741
- return /* @__PURE__ */ jsx28(
4742
- ModuleState,
4743
- {
4744
- tone: "error",
4745
- message: strings.errorGeneric,
4746
- onRetry: () => setReloadKey((k) => k + 1),
4747
- strings
4748
- }
4749
- );
4796
+ return /* @__PURE__ */ jsx28(ModuleState, { tone: "error", message: errorMsg, onRetry: () => setReloadKey((k) => k + 1), strings });
4750
4797
  }
4751
4798
  if (items.length === 0) return /* @__PURE__ */ jsx28(ModuleState, { message: strings.newsEmpty, strings });
4752
4799
  return /* @__PURE__ */ jsx28("div", { class: `${p21}-news-list`, children: items.map((item) => /* @__PURE__ */ jsxs22(
@@ -5453,7 +5500,7 @@ function App({ options, hostElement, bus }) {
5453
5500
  emitMessage(bus, options, "assistant", assistantText(assistantMsg));
5454
5501
  } catch (error) {
5455
5502
  assistantMsg.status = "error";
5456
- assistantMsg.errorText = error instanceof Error ? error.message : "Unknown error";
5503
+ assistantMsg.errorText = errorMessageFor(error, options.strings);
5457
5504
  feedback.play("error");
5458
5505
  bus.emit("error", error);
5459
5506
  options.onError?.(error);
package/package.json CHANGED
@@ -80,5 +80,5 @@
80
80
  ],
81
81
  "type": "module",
82
82
  "types": "./index.d.ts",
83
- "version": "0.5.0"
83
+ "version": "0.7.0"
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, L as Link, P as PAGE_AREA_SUGGESTIONS, g as PageContext, S as ServerConfig, b as SiteConfig, c as StartSessionResponse, U as UserContext, W as WidgetConfig, d as WidgetConfigPartial, e as WidgetSettings, f as WidgetSettingsPartial, h as assetSchema, i as blocksConfigSchema, j as connectionConfigPartialSchema, k as connectionConfigSchema, l as cssColorSchema, m as cssLengthSchema, n as endpointsSchema, o as linkSchema, p as localeSchema, q as pageContextSchema, s as serverConfigSchema, r as siteConfigSchema, t as startSessionResponseSchema, u as userContextSchema, v as uuid7Schema, w as widgetConfigPartialSchema, x as widgetConfigSchema, y as widgetSettingsPartialSchema, z as widgetSettingsSchema } from './deployment-DKyrRSGL.js';
1
+ export { A as Asset, B as BlocksConfig, C as ConnectionConfig, a as ConnectionConfigPartial, E as Endpoints, L as Link, P as PAGE_AREA_SUGGESTIONS, g as PageContext, S as ServerConfig, b as SiteConfig, c as StartSessionResponse, U as UserContext, W as WidgetConfig, d as WidgetConfigPartial, e as WidgetSettings, f as WidgetSettingsPartial, h as assetSchema, i as blocksConfigSchema, j as connectionConfigPartialSchema, k as connectionConfigSchema, l as cssColorSchema, m as cssLengthSchema, n as endpointsSchema, o as linkSchema, p as localeSchema, q as pageContextSchema, s as serverConfigSchema, r as siteConfigSchema, t as startSessionResponseSchema, u as userContextSchema, v as uuid7Schema, w as widgetConfigPartialSchema, x as widgetConfigSchema, y as widgetSettingsPartialSchema, z as widgetSettingsSchema } from './deployment-DhWwzofY.js';
2
2
  import { z } from 'zod';
3
3
 
4
4
  /**
@@ -56,9 +56,9 @@ declare const presentationSchema: z.ZodObject<{
56
56
  inset: z.ZodOptional<z.ZodString>;
57
57
  initialSize: z.ZodDefault<z.ZodEnum<{
58
58
  fullscreen: "fullscreen";
59
+ expanded: "expanded";
59
60
  auto: "auto";
60
61
  normal: "normal";
61
- expanded: "expanded";
62
62
  }>>;
63
63
  autoSizeBreakpoint: z.ZodDefault<z.ZodNumber>;
64
64
  }, z.core.$loose>>;
@@ -148,9 +148,9 @@ declare const launcherSizeSchema: z.ZodEnum<{
148
148
  }>;
149
149
  type LauncherSize = z.infer<typeof launcherSizeSchema>;
150
150
  declare const calloutShapeSchema: z.ZodEnum<{
151
+ callout: "callout";
151
152
  pill: "pill";
152
153
  bubble: "bubble";
153
- callout: "callout";
154
154
  }>;
155
155
  type CalloutShape = z.infer<typeof calloutShapeSchema>;
156
156
  declare const calloutPositionSchema: z.ZodEnum<{
@@ -162,9 +162,9 @@ type CalloutPosition = z.infer<typeof calloutPositionSchema>;
162
162
  declare const launcherCalloutSchema: z.ZodObject<{
163
163
  text: z.ZodDefault<z.ZodString>;
164
164
  shape: z.ZodDefault<z.ZodEnum<{
165
+ callout: "callout";
165
166
  pill: "pill";
166
167
  bubble: "bubble";
167
- callout: "callout";
168
168
  }>>;
169
169
  position: z.ZodDefault<z.ZodEnum<{
170
170
  auto: "auto";
@@ -195,9 +195,9 @@ declare const launcherOptionsSchema: z.ZodObject<{
195
195
  callout: z.ZodOptional<z.ZodObject<{
196
196
  text: z.ZodDefault<z.ZodString>;
197
197
  shape: z.ZodDefault<z.ZodEnum<{
198
+ callout: "callout";
198
199
  pill: "pill";
199
200
  bubble: "bubble";
200
- callout: "callout";
201
201
  }>>;
202
202
  position: z.ZodDefault<z.ZodEnum<{
203
203
  auto: "auto";
@@ -240,9 +240,9 @@ type LauncherOptions = z.infer<typeof launcherOptionsSchema>;
240
240
 
241
241
  declare const initialSizeSchema: z.ZodEnum<{
242
242
  fullscreen: "fullscreen";
243
+ expanded: "expanded";
243
244
  auto: "auto";
244
245
  normal: "normal";
245
- expanded: "expanded";
246
246
  }>;
247
247
  declare const resizeOptionsSchema: z.ZodObject<{
248
248
  enabled: z.ZodDefault<z.ZodBoolean>;
@@ -269,9 +269,9 @@ declare const sizeOptionsSchema: z.ZodObject<{
269
269
  inset: z.ZodOptional<z.ZodString>;
270
270
  initialSize: z.ZodDefault<z.ZodEnum<{
271
271
  fullscreen: "fullscreen";
272
+ expanded: "expanded";
272
273
  auto: "auto";
273
274
  normal: "normal";
274
- expanded: "expanded";
275
275
  }>>;
276
276
  autoSizeBreakpoint: z.ZodDefault<z.ZodNumber>;
277
277
  }, z.core.$loose>;
@@ -321,38 +321,38 @@ type FeatureFlags = z.infer<typeof featureFlagsSchema>;
321
321
  */
322
322
 
323
323
  declare const actionNameSchema: z.ZodEnum<{
324
+ close: "close";
324
325
  expand: "expand";
325
326
  fullscreen: "fullscreen";
326
327
  popOut: "popOut";
327
- close: "close";
328
- language: "language";
328
+ clear: "clear";
329
329
  theme: "theme";
330
+ language: "language";
330
331
  history: "history";
331
- clear: "clear";
332
332
  sound: "sound";
333
333
  }>;
334
334
  type ActionName = z.infer<typeof actionNameSchema>;
335
335
  declare const headerActionsSchema: z.ZodObject<{
336
336
  main: z.ZodDefault<z.ZodArray<z.ZodEnum<{
337
+ close: "close";
337
338
  expand: "expand";
338
339
  fullscreen: "fullscreen";
339
340
  popOut: "popOut";
340
- close: "close";
341
- language: "language";
341
+ clear: "clear";
342
342
  theme: "theme";
343
+ language: "language";
343
344
  history: "history";
344
- clear: "clear";
345
345
  sound: "sound";
346
346
  }>>>;
347
347
  overflow: z.ZodDefault<z.ZodArray<z.ZodEnum<{
348
+ close: "close";
348
349
  expand: "expand";
349
350
  fullscreen: "fullscreen";
350
351
  popOut: "popOut";
351
- close: "close";
352
- language: "language";
352
+ clear: "clear";
353
353
  theme: "theme";
354
+ language: "language";
354
355
  history: "history";
355
- clear: "clear";
356
356
  sound: "sound";
357
357
  }>>>;
358
358
  }, z.core.$loose>;
@@ -361,25 +361,25 @@ type HeaderActions = z.infer<typeof headerActionsSchema>;
361
361
  declare const headerSchema: z.ZodObject<{
362
362
  actions: z.ZodOptional<z.ZodObject<{
363
363
  main: z.ZodDefault<z.ZodArray<z.ZodEnum<{
364
+ close: "close";
364
365
  expand: "expand";
365
366
  fullscreen: "fullscreen";
366
367
  popOut: "popOut";
367
- close: "close";
368
- language: "language";
368
+ clear: "clear";
369
369
  theme: "theme";
370
+ language: "language";
370
371
  history: "history";
371
- clear: "clear";
372
372
  sound: "sound";
373
373
  }>>>;
374
374
  overflow: z.ZodDefault<z.ZodArray<z.ZodEnum<{
375
+ close: "close";
375
376
  expand: "expand";
376
377
  fullscreen: "fullscreen";
377
378
  popOut: "popOut";
378
- close: "close";
379
- language: "language";
379
+ clear: "clear";
380
380
  theme: "theme";
381
+ language: "language";
381
382
  history: "history";
382
- clear: "clear";
383
383
  sound: "sound";
384
384
  }>>>;
385
385
  }, z.core.$loose>>;
@@ -396,33 +396,33 @@ type HeaderOptions = z.infer<typeof headerSchema>;
396
396
  */
397
397
 
398
398
  declare const feedbackEventSchema: z.ZodEnum<{
399
+ voiceStart: "voiceStart";
400
+ voiceStop: "voiceStop";
399
401
  error: "error";
400
402
  messageReceived: "messageReceived";
401
403
  messageSent: "messageSent";
402
- voiceStart: "voiceStart";
403
- voiceStop: "voiceStop";
404
404
  }>;
405
405
  type FeedbackEvent = z.infer<typeof feedbackEventSchema>;
406
406
  declare const soundOptionsSchema: z.ZodObject<{
407
407
  enabled: z.ZodDefault<z.ZodBoolean>;
408
408
  volume: z.ZodDefault<z.ZodNumber>;
409
409
  events: z.ZodOptional<z.ZodRecord<z.ZodEnum<{
410
+ voiceStart: "voiceStart";
411
+ voiceStop: "voiceStop";
410
412
  error: "error";
411
413
  messageReceived: "messageReceived";
412
414
  messageSent: "messageSent";
413
- voiceStart: "voiceStart";
414
- voiceStop: "voiceStop";
415
415
  }> & z.core.$partial, z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>>;
416
416
  }, z.core.$loose>;
417
417
  type SoundOptions = z.infer<typeof soundOptionsSchema>;
418
418
  declare const hapticsOptionsSchema: z.ZodObject<{
419
419
  enabled: z.ZodDefault<z.ZodBoolean>;
420
420
  events: z.ZodOptional<z.ZodRecord<z.ZodEnum<{
421
+ voiceStart: "voiceStart";
422
+ voiceStop: "voiceStop";
421
423
  error: "error";
422
424
  messageReceived: "messageReceived";
423
425
  messageSent: "messageSent";
424
- voiceStart: "voiceStart";
425
- voiceStop: "voiceStop";
426
426
  }> & z.core.$partial, z.ZodUnion<readonly [z.ZodBoolean, z.ZodNumber, z.ZodArray<z.ZodNumber>]>>>;
427
427
  }, z.core.$loose>;
428
428
  type HapticsOptions = z.infer<typeof hapticsOptionsSchema>;
@@ -431,21 +431,21 @@ declare const feedbackSchema: z.ZodObject<{
431
431
  enabled: z.ZodDefault<z.ZodBoolean>;
432
432
  volume: z.ZodDefault<z.ZodNumber>;
433
433
  events: z.ZodOptional<z.ZodRecord<z.ZodEnum<{
434
+ voiceStart: "voiceStart";
435
+ voiceStop: "voiceStop";
434
436
  error: "error";
435
437
  messageReceived: "messageReceived";
436
438
  messageSent: "messageSent";
437
- voiceStart: "voiceStart";
438
- voiceStop: "voiceStop";
439
439
  }> & z.core.$partial, z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>>;
440
440
  }, z.core.$loose>>;
441
441
  haptics: z.ZodOptional<z.ZodObject<{
442
442
  enabled: z.ZodDefault<z.ZodBoolean>;
443
443
  events: z.ZodOptional<z.ZodRecord<z.ZodEnum<{
444
+ voiceStart: "voiceStart";
445
+ voiceStop: "voiceStop";
444
446
  error: "error";
445
447
  messageReceived: "messageReceived";
446
448
  messageSent: "messageSent";
447
- voiceStart: "voiceStart";
448
- voiceStop: "voiceStop";
449
449
  }> & z.core.$partial, z.ZodUnion<readonly [z.ZodBoolean, z.ZodNumber, z.ZodArray<z.ZodNumber>]>>>;
450
450
  }, z.core.$loose>>;
451
451
  }, z.core.$loose>;
@@ -607,18 +607,18 @@ type I18nOptions = z.infer<typeof i18nSchema>;
607
607
  */
608
608
 
609
609
  declare const moduleLayoutSchema: z.ZodEnum<{
610
+ home: "home";
610
611
  chat: "chat";
611
612
  help: "help";
612
- home: "home";
613
613
  news: "news";
614
614
  }>;
615
615
  type ModuleLayout = z.infer<typeof moduleLayoutSchema>;
616
616
  declare const moduleSchema: z.ZodObject<{
617
617
  label: z.ZodString;
618
618
  layout: z.ZodEnum<{
619
+ home: "home";
619
620
  chat: "chat";
620
621
  help: "help";
621
- home: "home";
622
622
  news: "news";
623
623
  }>;
624
624
  contentTags: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -644,9 +644,9 @@ type ModuleOptions = z.infer<typeof moduleSchema>;
644
644
  declare const modulesSchema: z.ZodArray<z.ZodObject<{
645
645
  label: z.ZodString;
646
646
  layout: z.ZodEnum<{
647
+ home: "home";
647
648
  chat: "chat";
648
649
  help: "help";
649
- home: "home";
650
650
  news: "news";
651
651
  }>;
652
652
  contentTags: z.ZodOptional<z.ZodArray<z.ZodString>>;