@helpai/elements 0.46.1 → 0.46.3

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-C_jlXJAe.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-oSJ2nv2G.js';
2
2
  import 'zod';
3
3
 
4
4
  /**
package/index.mjs CHANGED
@@ -30,7 +30,7 @@ var BRAND = {
30
30
  };
31
31
 
32
32
  // src/core/version.ts
33
- var ELEMENTS_VERSION = true ? "0.46.1" : "0.0.0-dev";
33
+ var ELEMENTS_VERSION = true ? "0.46.3" : "0.0.0-dev";
34
34
  var ELEMENTS_VERSION_PARAM = "_ev";
35
35
 
36
36
  // src/i18n/strings.ts
@@ -1653,7 +1653,10 @@ var DEFAULT_PATHS = {
1653
1653
  var CONTEXT_PARAM = "context";
1654
1654
  function buildSendMessageRequest(params) {
1655
1655
  const wire = params.messages.map((m) => ({
1656
- id: m.id,
1656
+ // Use the backend's id when known (adopted from the stream's `start` chunk)
1657
+ // so a resumed assistant message matches what the backend persisted; falls
1658
+ // back to the client id (user messages, pre-`start` shells).
1659
+ id: m.serverMessageId ?? m.id,
1657
1660
  parts: messageToWireParts(m),
1658
1661
  role: m.role,
1659
1662
  // Internal clock is epoch ms; the wire speaks ISO-8601 (Mongo ISODate).
@@ -2371,12 +2374,13 @@ function makeAssistantMessage() {
2371
2374
  };
2372
2375
  }
2373
2376
  function makeInstantWelcomeMessage(m) {
2377
+ const id = uuid7();
2374
2378
  return toReactive({
2375
- id: m.id,
2379
+ id,
2376
2380
  role: m.role,
2377
2381
  createdAt: Date.now(),
2378
2382
  status: "complete",
2379
- parts: [{ kind: "text", id: `${m.id}-t0`, text: m.text, done: true }]
2383
+ parts: [{ kind: "text", id: `${id}-t0`, text: m.text, done: true }]
2380
2384
  });
2381
2385
  }
2382
2386
  function toReactive(m) {
@@ -2387,6 +2391,7 @@ function toReactive(m) {
2387
2391
  status: m.status,
2388
2392
  errorText: m.errorText,
2389
2393
  finishReason: m.finishReason,
2394
+ serverMessageId: m.serverMessageId,
2390
2395
  attachments: m.attachments,
2391
2396
  partsSig: signal(m.parts.map(partToReactive))
2392
2397
  };
@@ -2440,6 +2445,9 @@ function fromWireMessage(w) {
2440
2445
  return {
2441
2446
  id: w.id,
2442
2447
  role: w.role,
2448
+ // On reload the wire `id` IS the backend's id — keep it as `serverMessageId`
2449
+ // too so a HITL re-POST after a reload still references the backend's message.
2450
+ serverMessageId: w.id,
2443
2451
  // Real send time when the backend provides it; otherwise fall back to now
2444
2452
  // (older backends) so the timestamp + day divider still render.
2445
2453
  createdAt: parseWireDate(w.createdAt) ?? Date.now(),
@@ -2455,6 +2463,7 @@ function fromReactive(m) {
2455
2463
  status: m.status,
2456
2464
  errorText: m.errorText,
2457
2465
  finishReason: m.finishReason,
2466
+ serverMessageId: m.serverMessageId,
2458
2467
  attachments: m.attachments,
2459
2468
  parts: m.partsSig.value.map(partFromReactive)
2460
2469
  };
@@ -2525,6 +2534,8 @@ var StreamReducer = class {
2525
2534
  if (!m) return;
2526
2535
  switch (chunk.type) {
2527
2536
  case "start":
2537
+ if (chunk.messageId) m.serverMessageId = chunk.messageId;
2538
+ return;
2528
2539
  case "finish-step":
2529
2540
  return;
2530
2541
  case "start-step":
@@ -6951,6 +6962,9 @@ var p34 = BRAND.cssPrefix;
6951
6962
  function makeLocalizedWelcome(w, strings) {
6952
6963
  return makeInstantWelcomeMessage({ ...w, text: localizeText(strings, w.text) });
6953
6964
  }
6965
+ function firstText(m) {
6966
+ return m.partsSig.value.find((p35) => p35.kind === "text")?.textSig.value ?? "";
6967
+ }
6954
6968
  function allToolPartsSettled(msg) {
6955
6969
  const tools = msg.partsSig.value.filter((p35) => p35.kind === "tool");
6956
6970
  return tools.length > 0 && tools.every((p35) => {
@@ -7144,8 +7158,9 @@ function App({ options, hostElement, bus }) {
7144
7158
  (n) => n !== void 0
7145
7159
  );
7146
7160
  const welcomeAnchor = (timelineStamps.length ? Math.min(...timelineStamps) : Date.now()) - 1;
7147
- const loadedIds = new Set(loaded.map((m) => m.id));
7148
- const welcomeRows = (welcomeRef.current?.messages ?? []).filter((w) => !loadedIds.has(w.id)).map((w) => {
7161
+ const welcomeKey = (role, text) => `${role}|${text}`;
7162
+ const loadedKeys = new Set(loaded.map((m) => welcomeKey(m.role, firstText(m))));
7163
+ const welcomeRows = (welcomeRef.current?.messages ?? []).filter((w) => !loadedKeys.has(welcomeKey(w.role, localizeText(stringsRef.current, w.text)))).map((w) => {
7149
7164
  const row = makeLocalizedWelcome(w, stringsRef.current);
7150
7165
  row.createdAt = welcomeAnchor;
7151
7166
  return row;
@@ -7434,8 +7449,10 @@ function App({ options, hostElement, bus }) {
7434
7449
  const body = buildSendMessageRequest({
7435
7450
  messages: thread.map(fromReactive),
7436
7451
  conversationId: activeConversationId,
7437
- // The assistant message being generated / resumed.
7438
- messageId: assistantMsg.id,
7452
+ // The assistant message being generated / resumed — prefer the id the
7453
+ // backend assigned (adopted from the `start` chunk) so a HITL re-POST
7454
+ // resumes the message the backend persisted, not the client-minted id.
7455
+ messageId: assistantMsg.serverMessageId ?? assistantMsg.id,
7439
7456
  // textModel + imageModel are backend-only — selected per deployment.
7440
7457
  tools: options.features.tools,
7441
7458
  // Identity + preferences ride on every message — server may need
package/package.json CHANGED
@@ -80,5 +80,5 @@
80
80
  ],
81
81
  "type": "module",
82
82
  "types": "./index.d.ts",
83
- "version": "0.46.1"
83
+ "version": "0.46.3"
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-C_jlXJAe.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-oSJ2nv2G.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
+ normal: "normal";
59
60
  expanded: "expanded";
60
61
  auto: "auto";
61
- normal: "normal";
62
62
  }>>;
63
63
  autoSizeBreakpoint: z.ZodDefault<z.ZodNumber>;
64
64
  }, z.core.$loose>>;
@@ -240,9 +240,9 @@ type LauncherOptions = z.infer<typeof launcherOptionsSchema>;
240
240
 
241
241
  declare const initialSizeSchema: z.ZodEnum<{
242
242
  fullscreen: "fullscreen";
243
+ normal: "normal";
243
244
  expanded: "expanded";
244
245
  auto: "auto";
245
- normal: "normal";
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
+ normal: "normal";
272
273
  expanded: "expanded";
273
274
  auto: "auto";
274
- normal: "normal";
275
275
  }>>;
276
276
  autoSizeBreakpoint: z.ZodDefault<z.ZodNumber>;
277
277
  }, z.core.$loose>;
@@ -323,40 +323,40 @@ type FeatureFlags = z.infer<typeof featureFlagsSchema>;
323
323
  */
324
324
 
325
325
  declare const actionNameSchema: z.ZodEnum<{
326
- close: "close";
327
326
  expand: "expand";
328
327
  fullscreen: "fullscreen";
329
- clear: "clear";
330
- theme: "theme";
328
+ close: "close";
331
329
  language: "language";
330
+ theme: "theme";
332
331
  textSize: "textSize";
333
332
  history: "history";
333
+ clear: "clear";
334
334
  sound: "sound";
335
335
  }>;
336
336
  type ActionName = z.infer<typeof actionNameSchema>;
337
337
  declare const headerActionsSchema: z.ZodArray<z.ZodEnum<{
338
- close: "close";
339
338
  expand: "expand";
340
339
  fullscreen: "fullscreen";
341
- clear: "clear";
342
- theme: "theme";
340
+ close: "close";
343
341
  language: "language";
342
+ theme: "theme";
344
343
  textSize: "textSize";
345
344
  history: "history";
345
+ clear: "clear";
346
346
  sound: "sound";
347
347
  }>>;
348
348
  type HeaderActions = z.infer<typeof headerActionsSchema>;
349
349
  /** Section wrapper — `actions` list wrapped under `header` in the dashboard form. */
350
350
  declare const headerSchema: z.ZodObject<{
351
351
  actions: z.ZodOptional<z.ZodArray<z.ZodEnum<{
352
- close: "close";
353
352
  expand: "expand";
354
353
  fullscreen: "fullscreen";
355
- clear: "clear";
356
- theme: "theme";
354
+ close: "close";
357
355
  language: "language";
356
+ theme: "theme";
358
357
  textSize: "textSize";
359
358
  history: "history";
359
+ clear: "clear";
360
360
  sound: "sound";
361
361
  }>>>;
362
362
  }, z.core.$loose>;
@@ -372,33 +372,33 @@ type HeaderOptions = z.infer<typeof headerSchema>;
372
372
  */
373
373
 
374
374
  declare const feedbackEventSchema: z.ZodEnum<{
375
- voiceStart: "voiceStart";
376
- voiceStop: "voiceStop";
377
375
  error: "error";
378
376
  messageReceived: "messageReceived";
379
377
  messageSent: "messageSent";
378
+ voiceStart: "voiceStart";
379
+ voiceStop: "voiceStop";
380
380
  }>;
381
381
  type FeedbackEvent = z.infer<typeof feedbackEventSchema>;
382
382
  declare const soundOptionsSchema: z.ZodObject<{
383
383
  enabled: z.ZodDefault<z.ZodBoolean>;
384
384
  volume: z.ZodDefault<z.ZodNumber>;
385
385
  events: z.ZodOptional<z.ZodRecord<z.ZodEnum<{
386
- voiceStart: "voiceStart";
387
- voiceStop: "voiceStop";
388
386
  error: "error";
389
387
  messageReceived: "messageReceived";
390
388
  messageSent: "messageSent";
389
+ voiceStart: "voiceStart";
390
+ voiceStop: "voiceStop";
391
391
  }> & z.core.$partial, z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>>;
392
392
  }, z.core.$loose>;
393
393
  type SoundOptions = z.infer<typeof soundOptionsSchema>;
394
394
  declare const hapticsOptionsSchema: z.ZodObject<{
395
395
  enabled: z.ZodDefault<z.ZodBoolean>;
396
396
  events: z.ZodOptional<z.ZodRecord<z.ZodEnum<{
397
- voiceStart: "voiceStart";
398
- voiceStop: "voiceStop";
399
397
  error: "error";
400
398
  messageReceived: "messageReceived";
401
399
  messageSent: "messageSent";
400
+ voiceStart: "voiceStart";
401
+ voiceStop: "voiceStop";
402
402
  }> & z.core.$partial, z.ZodUnion<readonly [z.ZodBoolean, z.ZodNumber, z.ZodArray<z.ZodNumber>]>>>;
403
403
  }, z.core.$loose>;
404
404
  type HapticsOptions = z.infer<typeof hapticsOptionsSchema>;
@@ -407,21 +407,21 @@ declare const feedbackSchema: 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";
412
410
  error: "error";
413
411
  messageReceived: "messageReceived";
414
412
  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
  haptics: z.ZodOptional<z.ZodObject<{
418
418
  enabled: z.ZodDefault<z.ZodBoolean>;
419
419
  events: z.ZodOptional<z.ZodRecord<z.ZodEnum<{
420
- voiceStart: "voiceStart";
421
- voiceStop: "voiceStop";
422
420
  error: "error";
423
421
  messageReceived: "messageReceived";
424
422
  messageSent: "messageSent";
423
+ voiceStart: "voiceStart";
424
+ voiceStop: "voiceStop";
425
425
  }> & z.core.$partial, z.ZodUnion<readonly [z.ZodBoolean, z.ZodNumber, z.ZodArray<z.ZodNumber>]>>>;
426
426
  }, z.core.$loose>>;
427
427
  }, z.core.$loose>;
@@ -856,18 +856,18 @@ type I18nOptions = z.infer<typeof i18nSchema>;
856
856
  */
857
857
 
858
858
  declare const moduleLayoutSchema: z.ZodEnum<{
859
- home: "home";
860
859
  chat: "chat";
861
860
  help: "help";
861
+ home: "home";
862
862
  news: "news";
863
863
  }>;
864
864
  type ModuleLayout = z.infer<typeof moduleLayoutSchema>;
865
865
  declare const moduleSchema: z.ZodObject<{
866
866
  label: z.ZodString;
867
867
  layout: z.ZodEnum<{
868
- home: "home";
869
868
  chat: "chat";
870
869
  help: "help";
870
+ home: "home";
871
871
  news: "news";
872
872
  }>;
873
873
  contentTags: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -893,9 +893,9 @@ type ModuleOptions = z.infer<typeof moduleSchema>;
893
893
  declare const modulesSchema: z.ZodArray<z.ZodObject<{
894
894
  label: z.ZodString;
895
895
  layout: z.ZodEnum<{
896
- home: "home";
897
896
  chat: "chat";
898
897
  help: "help";
898
+ home: "home";
899
899
  news: "news";
900
900
  }>;
901
901
  contentTags: z.ZodOptional<z.ZodArray<z.ZodString>>;
package/web-component.mjs CHANGED
@@ -1445,7 +1445,7 @@ function createAuth(opts) {
1445
1445
  }
1446
1446
 
1447
1447
  // src/core/version.ts
1448
- var ELEMENTS_VERSION = true ? "0.46.1" : "0.0.0-dev";
1448
+ var ELEMENTS_VERSION = true ? "0.46.3" : "0.0.0-dev";
1449
1449
  var ELEMENTS_VERSION_PARAM = "_ev";
1450
1450
 
1451
1451
  // src/stream/types.ts
@@ -1612,7 +1612,10 @@ var DEFAULT_PATHS = {
1612
1612
  var CONTEXT_PARAM = "context";
1613
1613
  function buildSendMessageRequest(params) {
1614
1614
  const wire = params.messages.map((m) => ({
1615
- id: m.id,
1615
+ // Use the backend's id when known (adopted from the stream's `start` chunk)
1616
+ // so a resumed assistant message matches what the backend persisted; falls
1617
+ // back to the client id (user messages, pre-`start` shells).
1618
+ id: m.serverMessageId ?? m.id,
1616
1619
  parts: messageToWireParts(m),
1617
1620
  role: m.role,
1618
1621
  // Internal clock is epoch ms; the wire speaks ISO-8601 (Mongo ISODate).
@@ -2330,12 +2333,13 @@ function makeAssistantMessage() {
2330
2333
  };
2331
2334
  }
2332
2335
  function makeInstantWelcomeMessage(m) {
2336
+ const id = uuid7();
2333
2337
  return toReactive({
2334
- id: m.id,
2338
+ id,
2335
2339
  role: m.role,
2336
2340
  createdAt: Date.now(),
2337
2341
  status: "complete",
2338
- parts: [{ kind: "text", id: `${m.id}-t0`, text: m.text, done: true }]
2342
+ parts: [{ kind: "text", id: `${id}-t0`, text: m.text, done: true }]
2339
2343
  });
2340
2344
  }
2341
2345
  function toReactive(m) {
@@ -2346,6 +2350,7 @@ function toReactive(m) {
2346
2350
  status: m.status,
2347
2351
  errorText: m.errorText,
2348
2352
  finishReason: m.finishReason,
2353
+ serverMessageId: m.serverMessageId,
2349
2354
  attachments: m.attachments,
2350
2355
  partsSig: signal(m.parts.map(partToReactive))
2351
2356
  };
@@ -2399,6 +2404,9 @@ function fromWireMessage(w) {
2399
2404
  return {
2400
2405
  id: w.id,
2401
2406
  role: w.role,
2407
+ // On reload the wire `id` IS the backend's id — keep it as `serverMessageId`
2408
+ // too so a HITL re-POST after a reload still references the backend's message.
2409
+ serverMessageId: w.id,
2402
2410
  // Real send time when the backend provides it; otherwise fall back to now
2403
2411
  // (older backends) so the timestamp + day divider still render.
2404
2412
  createdAt: parseWireDate(w.createdAt) ?? Date.now(),
@@ -2414,6 +2422,7 @@ function fromReactive(m) {
2414
2422
  status: m.status,
2415
2423
  errorText: m.errorText,
2416
2424
  finishReason: m.finishReason,
2425
+ serverMessageId: m.serverMessageId,
2417
2426
  attachments: m.attachments,
2418
2427
  parts: m.partsSig.value.map(partFromReactive)
2419
2428
  };
@@ -2484,6 +2493,8 @@ var StreamReducer = class {
2484
2493
  if (!m) return;
2485
2494
  switch (chunk.type) {
2486
2495
  case "start":
2496
+ if (chunk.messageId) m.serverMessageId = chunk.messageId;
2497
+ return;
2487
2498
  case "finish-step":
2488
2499
  return;
2489
2500
  case "start-step":
@@ -6910,6 +6921,9 @@ var p34 = BRAND.cssPrefix;
6910
6921
  function makeLocalizedWelcome(w, strings) {
6911
6922
  return makeInstantWelcomeMessage({ ...w, text: localizeText(strings, w.text) });
6912
6923
  }
6924
+ function firstText(m) {
6925
+ return m.partsSig.value.find((p35) => p35.kind === "text")?.textSig.value ?? "";
6926
+ }
6913
6927
  function allToolPartsSettled(msg) {
6914
6928
  const tools = msg.partsSig.value.filter((p35) => p35.kind === "tool");
6915
6929
  return tools.length > 0 && tools.every((p35) => {
@@ -7103,8 +7117,9 @@ function App({ options, hostElement, bus }) {
7103
7117
  (n) => n !== void 0
7104
7118
  );
7105
7119
  const welcomeAnchor = (timelineStamps.length ? Math.min(...timelineStamps) : Date.now()) - 1;
7106
- const loadedIds = new Set(loaded.map((m) => m.id));
7107
- const welcomeRows = (welcomeRef.current?.messages ?? []).filter((w) => !loadedIds.has(w.id)).map((w) => {
7120
+ const welcomeKey = (role, text) => `${role}|${text}`;
7121
+ const loadedKeys = new Set(loaded.map((m) => welcomeKey(m.role, firstText(m))));
7122
+ const welcomeRows = (welcomeRef.current?.messages ?? []).filter((w) => !loadedKeys.has(welcomeKey(w.role, localizeText(stringsRef.current, w.text)))).map((w) => {
7108
7123
  const row = makeLocalizedWelcome(w, stringsRef.current);
7109
7124
  row.createdAt = welcomeAnchor;
7110
7125
  return row;
@@ -7393,8 +7408,10 @@ function App({ options, hostElement, bus }) {
7393
7408
  const body = buildSendMessageRequest({
7394
7409
  messages: thread.map(fromReactive),
7395
7410
  conversationId: activeConversationId,
7396
- // The assistant message being generated / resumed.
7397
- messageId: assistantMsg.id,
7411
+ // The assistant message being generated / resumed — prefer the id the
7412
+ // backend assigned (adopted from the `start` chunk) so a HITL re-POST
7413
+ // resumes the message the backend persisted, not the client-minted id.
7414
+ messageId: assistantMsg.serverMessageId ?? assistantMsg.id,
7398
7415
  // textModel + imageModel are backend-only — selected per deployment.
7399
7416
  tools: options.features.tools,
7400
7417
  // Identity + preferences ride on every message — server may need