@helpai/elements 0.8.0 → 0.9.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-Clv1qhOa.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-B4_b3Sjy.js';
2
2
  import 'zod';
3
3
 
4
4
  /**
package/index.mjs CHANGED
@@ -1390,10 +1390,19 @@ var AgentTransport = class {
1390
1390
  * parallel with start-session, so a reply that was streaming when the
1391
1391
  * user reloaded keeps flowing).
1392
1392
  *
1393
- * Returns (no throw) on 204 / non-OK nothing in flight (or a backend
1394
- * without the endpoint graceful no-op) or once a terminal chunk is
1395
- * drained. Throws only when every attempt produced a 200 that dropped before
1396
- * finishing: a genuinely incomplete reply the UI should flag with a retry.
1393
+ * The endpoint ALWAYS opens a 200 SSE stream (mirrors the AI SDK
1394
+ * resumable-stream lib): it replays the in-flight reply from the buffer, or
1395
+ * when nothing is in flight (reply finished + the buffer was flushed, or
1396
+ * nothing ever started) closes an EMPTY stream. So "nothing to resume" is
1397
+ * signalled by a segment that ends without a terminal chunk AND surfaced no
1398
+ * NEW events — not by a status code. We stop gracefully there; the completed
1399
+ * turn comes from the DB via start-session / list-messages.
1400
+ *
1401
+ * Returns (no throw) on a terminal chunk, an empty/no-new-events segment, or
1402
+ * a 204 / non-OK (a backend that signals "nothing" by status, or lacks the
1403
+ * endpoint). Retries only a segment that yielded new events but no finish — a
1404
+ * real mid-reply drop. Throws only if every attempt kept yielding new events
1405
+ * yet never finished: a genuinely stuck, incomplete reply.
1397
1406
  */
1398
1407
  async *resumeStreamGen(ctrl, seenIds, immediate) {
1399
1408
  for (let attempt = 1; attempt <= MAX_RESUME_ATTEMPTS && !ctrl.signal.aborted; attempt++) {
@@ -1418,7 +1427,12 @@ var AgentTransport = class {
1418
1427
  log4.debug("resume \u2192 no in-flight stream", { status: res.status });
1419
1428
  return;
1420
1429
  }
1430
+ const before = seenIds.size;
1421
1431
  if (yield* this.drain(parseChatStream(res, ctrl.signal), seenIds, ctrl)) return;
1432
+ if (seenIds.size === before) {
1433
+ log4.debug("resume \u2192 stream closed with no new events; nothing to resume");
1434
+ return;
1435
+ }
1422
1436
  }
1423
1437
  if (ctrl.signal.aborted) return;
1424
1438
  throw new StreamError("stream incomplete after resume attempts", "server");
@@ -5494,6 +5508,8 @@ function App({ options, hostElement, bus }) {
5494
5508
  messagesSig.value = [...messagesSig.value, bubble];
5495
5509
  setStreaming(true);
5496
5510
  setActiveCancel(() => handle.cancel);
5511
+ const chatTab = chatTabId();
5512
+ if (chatTab) homeNav.switchTab(chatTab);
5497
5513
  log16.info("resumed in-flight reply on mount");
5498
5514
  }
5499
5515
  reducer.apply(evt.chunk);
@@ -5520,7 +5536,7 @@ function App({ options, hostElement, bus }) {
5520
5536
  }
5521
5537
  }
5522
5538
  },
5523
- [reducer, messagesSig, feedback, bus, options]
5539
+ [reducer, messagesSig, feedback, bus, options, homeNav]
5524
5540
  );
5525
5541
  useEffect17(() => {
5526
5542
  void runStartSession({ newConversation: false });
package/package.json CHANGED
@@ -80,5 +80,5 @@
80
80
  ],
81
81
  "type": "module",
82
82
  "types": "./index.d.ts",
83
- "version": "0.8.0"
83
+ "version": "0.9.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-Clv1qhOa.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-B4_b3Sjy.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";
60
59
  expanded: "expanded";
61
60
  auto: "auto";
61
+ normal: "normal";
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
- normal: "normal";
244
243
  expanded: "expanded";
245
244
  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";
273
272
  expanded: "expanded";
274
273
  auto: "auto";
274
+ normal: "normal";
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>>;
package/web-component.mjs CHANGED
@@ -1454,10 +1454,19 @@ var AgentTransport = class {
1454
1454
  * parallel with start-session, so a reply that was streaming when the
1455
1455
  * user reloaded keeps flowing).
1456
1456
  *
1457
- * Returns (no throw) on 204 / non-OK nothing in flight (or a backend
1458
- * without the endpoint graceful no-op) or once a terminal chunk is
1459
- * drained. Throws only when every attempt produced a 200 that dropped before
1460
- * finishing: a genuinely incomplete reply the UI should flag with a retry.
1457
+ * The endpoint ALWAYS opens a 200 SSE stream (mirrors the AI SDK
1458
+ * resumable-stream lib): it replays the in-flight reply from the buffer, or
1459
+ * when nothing is in flight (reply finished + the buffer was flushed, or
1460
+ * nothing ever started) closes an EMPTY stream. So "nothing to resume" is
1461
+ * signalled by a segment that ends without a terminal chunk AND surfaced no
1462
+ * NEW events — not by a status code. We stop gracefully there; the completed
1463
+ * turn comes from the DB via start-session / list-messages.
1464
+ *
1465
+ * Returns (no throw) on a terminal chunk, an empty/no-new-events segment, or
1466
+ * a 204 / non-OK (a backend that signals "nothing" by status, or lacks the
1467
+ * endpoint). Retries only a segment that yielded new events but no finish — a
1468
+ * real mid-reply drop. Throws only if every attempt kept yielding new events
1469
+ * yet never finished: a genuinely stuck, incomplete reply.
1461
1470
  */
1462
1471
  async *resumeStreamGen(ctrl, seenIds, immediate) {
1463
1472
  for (let attempt = 1; attempt <= MAX_RESUME_ATTEMPTS && !ctrl.signal.aborted; attempt++) {
@@ -1482,7 +1491,12 @@ var AgentTransport = class {
1482
1491
  log4.debug("resume \u2192 no in-flight stream", { status: res.status });
1483
1492
  return;
1484
1493
  }
1494
+ const before = seenIds.size;
1485
1495
  if (yield* this.drain(parseChatStream(res, ctrl.signal), seenIds, ctrl)) return;
1496
+ if (seenIds.size === before) {
1497
+ log4.debug("resume \u2192 stream closed with no new events; nothing to resume");
1498
+ return;
1499
+ }
1486
1500
  }
1487
1501
  if (ctrl.signal.aborted) return;
1488
1502
  throw new StreamError("stream incomplete after resume attempts", "server");
@@ -5558,6 +5572,8 @@ function App({ options, hostElement, bus }) {
5558
5572
  messagesSig.value = [...messagesSig.value, bubble];
5559
5573
  setStreaming(true);
5560
5574
  setActiveCancel(() => handle.cancel);
5575
+ const chatTab = chatTabId();
5576
+ if (chatTab) homeNav.switchTab(chatTab);
5561
5577
  log16.info("resumed in-flight reply on mount");
5562
5578
  }
5563
5579
  reducer.apply(evt.chunk);
@@ -5584,7 +5600,7 @@ function App({ options, hostElement, bus }) {
5584
5600
  }
5585
5601
  }
5586
5602
  },
5587
- [reducer, messagesSig, feedback, bus, options]
5603
+ [reducer, messagesSig, feedback, bus, options, homeNav]
5588
5604
  );
5589
5605
  useEffect17(() => {
5590
5606
  void runStartSession({ newConversation: false });