@flamingo-stack/openframe-frontend-core 0.0.583 → 0.0.584-1973.5420.1

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.
Files changed (149) hide show
  1. package/dist/chat-protocol/events.d.ts +8 -2
  2. package/dist/chat-protocol/events.d.ts.map +1 -1
  3. package/dist/chat-protocol/index.cjs +177 -0
  4. package/dist/chat-protocol/index.cjs.map +1 -1
  5. package/dist/chat-protocol/index.js +177 -0
  6. package/dist/chat-protocol/index.js.map +1 -1
  7. package/dist/chat-protocol/nats-decoder.d.ts.map +1 -1
  8. package/dist/chat-protocol/source-metadata.d.ts +3 -0
  9. package/dist/chat-protocol/source-metadata.d.ts.map +1 -0
  10. package/dist/{chunk-EATPU5EF.cjs → chunk-3MAG3EG4.cjs} +9 -9
  11. package/dist/{chunk-EATPU5EF.cjs.map → chunk-3MAG3EG4.cjs.map} +1 -1
  12. package/dist/{chunk-IKUSKKFZ.cjs → chunk-4TZOFXPH.cjs} +712 -432
  13. package/dist/chunk-4TZOFXPH.cjs.map +1 -0
  14. package/dist/{chunk-WMRXB6RS.js → chunk-54WRMPCY.js} +3 -3
  15. package/dist/{chunk-WTC6QQNX.cjs → chunk-7IVT56YY.cjs} +3 -3
  16. package/dist/{chunk-WTC6QQNX.cjs.map → chunk-7IVT56YY.cjs.map} +1 -1
  17. package/dist/{chunk-PFKWJ6PJ.js → chunk-AQW2PDRS.js} +2 -2
  18. package/dist/{chunk-DROXHJVZ.js → chunk-AVVKXNGI.js} +2 -2
  19. package/dist/{chunk-YNLIXABT.cjs → chunk-CE6CA6EM.cjs} +43 -43
  20. package/dist/{chunk-YNLIXABT.cjs.map → chunk-CE6CA6EM.cjs.map} +1 -1
  21. package/dist/{chunk-TRD2YICZ.cjs → chunk-CGLQLBMQ.cjs} +21 -21
  22. package/dist/{chunk-TRD2YICZ.cjs.map → chunk-CGLQLBMQ.cjs.map} +1 -1
  23. package/dist/{chunk-XWBND4G5.js → chunk-CO4WRST6.js} +301 -21
  24. package/dist/chunk-CO4WRST6.js.map +1 -0
  25. package/dist/{chunk-IJVWKLJK.cjs → chunk-DHLD3JXN.cjs} +69 -69
  26. package/dist/{chunk-IJVWKLJK.cjs.map → chunk-DHLD3JXN.cjs.map} +1 -1
  27. package/dist/{chunk-M6ZUEBDK.cjs → chunk-F2EN6MXN.cjs} +159 -159
  28. package/dist/{chunk-M6ZUEBDK.cjs.map → chunk-F2EN6MXN.cjs.map} +1 -1
  29. package/dist/{chunk-J3EEL6YC.js → chunk-FH2FH337.js} +5 -5
  30. package/dist/{chunk-L26MD32B.js → chunk-GDHI3JN5.js} +3 -3
  31. package/dist/{chunk-VWHEXQ64.js → chunk-GFIH73Q3.js} +3 -3
  32. package/dist/{chunk-R5A3MGMY.js → chunk-H6GYY5CB.js} +3 -3
  33. package/dist/{chunk-FCLM2RXI.js → chunk-HGJAUYHW.js} +2 -2
  34. package/dist/{chunk-RBDVHLT5.cjs → chunk-HKKQCVVY.cjs} +22 -22
  35. package/dist/{chunk-RBDVHLT5.cjs.map → chunk-HKKQCVVY.cjs.map} +1 -1
  36. package/dist/{chunk-KDWNMFX4.cjs → chunk-JEMGFSC2.cjs} +24 -24
  37. package/dist/{chunk-KDWNMFX4.cjs.map → chunk-JEMGFSC2.cjs.map} +1 -1
  38. package/dist/{chunk-BTBW4L2W.cjs → chunk-JX6RSSZP.cjs} +33 -33
  39. package/dist/{chunk-BTBW4L2W.cjs.map → chunk-JX6RSSZP.cjs.map} +1 -1
  40. package/dist/{chunk-WHNC7C76.js → chunk-KN2ZCZQ7.js} +5 -5
  41. package/dist/{chunk-WBTKXNKZ.cjs → chunk-MYVHYVQM.cjs} +10 -10
  42. package/dist/{chunk-WBTKXNKZ.cjs.map → chunk-MYVHYVQM.cjs.map} +1 -1
  43. package/dist/{chunk-3TNM6SDP.cjs → chunk-PI3BNDCW.cjs} +15 -15
  44. package/dist/{chunk-3TNM6SDP.cjs.map → chunk-PI3BNDCW.cjs.map} +1 -1
  45. package/dist/{chunk-XZ3MKTJZ.js → chunk-PWI66GZF.js} +2 -2
  46. package/dist/{chunk-IFPGXSMZ.cjs → chunk-RTI3TYMX.cjs} +3 -3
  47. package/dist/{chunk-IFPGXSMZ.cjs.map → chunk-RTI3TYMX.cjs.map} +1 -1
  48. package/dist/{chunk-6BI3AYBY.cjs → chunk-SS2TCIKA.cjs} +4 -4
  49. package/dist/{chunk-6BI3AYBY.cjs.map → chunk-SS2TCIKA.cjs.map} +1 -1
  50. package/dist/{chunk-HIHPWVKP.js → chunk-T35JA5XV.js} +5 -5
  51. package/dist/{chunk-EZ5VU5WS.js → chunk-TLZ7HTXP.js} +2 -2
  52. package/dist/{chunk-OCXFFGFA.cjs → chunk-UZUG7QZ3.cjs} +10 -10
  53. package/dist/{chunk-OCXFFGFA.cjs.map → chunk-UZUG7QZ3.cjs.map} +1 -1
  54. package/dist/{chunk-3RR67XC2.cjs → chunk-W46U5J3H.cjs} +5 -5
  55. package/dist/{chunk-3RR67XC2.cjs.map → chunk-W46U5J3H.cjs.map} +1 -1
  56. package/dist/{chunk-IOP7BCRQ.js → chunk-WFF5JMQ2.js} +6 -6
  57. package/dist/{chunk-AJLF6MBD.js → chunk-X4HLHN36.js} +3 -3
  58. package/dist/{chunk-PMA7DVQR.js → chunk-ZWB64HOD.js} +4 -4
  59. package/dist/components/case-studies/index.cjs +9 -9
  60. package/dist/components/case-studies/index.js +3 -3
  61. package/dist/components/chat/chat-message-enhanced.d.ts.map +1 -1
  62. package/dist/components/chat/chat-message-list.d.ts.map +1 -1
  63. package/dist/components/chat/entity-cards/dispatch.d.ts.map +1 -1
  64. package/dist/components/chat/hooks/use-nats-chat-adapter.d.ts +4 -1
  65. package/dist/components/chat/hooks/use-nats-chat-adapter.d.ts.map +1 -1
  66. package/dist/components/chat/hooks/use-sse-chat-adapter.d.ts +2 -28
  67. package/dist/components/chat/hooks/use-sse-chat-adapter.d.ts.map +1 -1
  68. package/dist/components/chat/index.cjs +2 -2
  69. package/dist/components/chat/index.js +1 -1
  70. package/dist/components/chat/stream/chat-stream-reducer.d.ts.map +1 -1
  71. package/dist/components/chat/tool-execution-display.d.ts.map +1 -1
  72. package/dist/components/chat/types/component.types.d.ts +2 -0
  73. package/dist/components/chat/types/component.types.d.ts.map +1 -1
  74. package/dist/components/chat/types/message.types.d.ts +35 -1
  75. package/dist/components/chat/types/message.types.d.ts.map +1 -1
  76. package/dist/components/chat/types/unified-chat-state.types.d.ts +3 -3
  77. package/dist/components/chat/types/unified-chat-state.types.d.ts.map +1 -1
  78. package/dist/components/chat/utils/chat-source-metadata.d.ts +5 -0
  79. package/dist/components/chat/utils/chat-source-metadata.d.ts.map +1 -0
  80. package/dist/components/chat/utils/process-historical-messages.d.ts.map +1 -1
  81. package/dist/components/contact/index.cjs +4 -4
  82. package/dist/components/contact/index.js +3 -3
  83. package/dist/components/docs/index.cjs +7 -7
  84. package/dist/components/docs/index.js +6 -6
  85. package/dist/components/embeds/index.cjs +4 -4
  86. package/dist/components/embeds/index.js +3 -3
  87. package/dist/components/faq/index.cjs +4 -4
  88. package/dist/components/faq/index.js +3 -3
  89. package/dist/components/features/index.cjs +3 -3
  90. package/dist/components/features/index.js +2 -2
  91. package/dist/components/help-center-pages/index.cjs +23 -23
  92. package/dist/components/help-center-pages/index.js +14 -14
  93. package/dist/components/index.cjs +36 -36
  94. package/dist/components/index.js +13 -13
  95. package/dist/components/meeting-scheduler/index.cjs +21 -21
  96. package/dist/components/meeting-scheduler/index.js +2 -2
  97. package/dist/components/navigation/index.cjs +6 -6
  98. package/dist/components/navigation/index.js +5 -5
  99. package/dist/components/onboarding-guides/index.cjs +6 -6
  100. package/dist/components/onboarding-guides/index.js +5 -5
  101. package/dist/components/tickets/index.cjs +7 -7
  102. package/dist/components/tickets/index.js +6 -6
  103. package/dist/components/ui/index.cjs +3 -3
  104. package/dist/components/ui/index.js +2 -2
  105. package/dist/index.cjs +7 -7
  106. package/dist/index.js +6 -6
  107. package/dist/utils/index.cjs.map +1 -1
  108. package/dist/utils/index.js.map +1 -1
  109. package/package.json +1 -1
  110. package/src/chat-protocol/__tests__/nats-decoder-golden.test.ts +130 -0
  111. package/src/chat-protocol/events.ts +9 -1
  112. package/src/chat-protocol/nats-decoder.ts +7 -0
  113. package/src/chat-protocol/source-metadata.ts +187 -0
  114. package/src/components/chat/__tests__/chat-message-streaming-memo.test.tsx +86 -0
  115. package/src/components/chat/__tests__/embeddable-chat-sources.test.tsx +171 -0
  116. package/src/components/chat/__tests__/tool-execution-display.test.tsx +93 -0
  117. package/src/components/chat/chat-message-enhanced.tsx +28 -13
  118. package/src/components/chat/chat-message-list.tsx +1 -0
  119. package/src/components/chat/embeddable-chat.tsx +10 -1
  120. package/src/components/chat/entity-cards/__tests__/dispatch-video-refs.test.tsx +74 -0
  121. package/src/components/chat/entity-cards/dispatch.tsx +48 -11
  122. package/src/components/chat/hooks/use-nats-chat-adapter.ts +7 -0
  123. package/src/components/chat/hooks/use-sse-chat-adapter.ts +2 -29
  124. package/src/components/chat/stream/__tests__/chat-stream-reducer.test.ts +56 -0
  125. package/src/components/chat/stream/chat-stream-reducer.ts +31 -0
  126. package/src/components/chat/tool-execution-display.tsx +5 -2
  127. package/src/components/chat/types/component.types.ts +2 -0
  128. package/src/components/chat/types/message.types.ts +39 -0
  129. package/src/components/chat/types/unified-chat-state.types.ts +4 -3
  130. package/src/components/chat/utils/__tests__/process-historical-messages-golden.test.ts +57 -0
  131. package/src/components/chat/utils/chat-source-metadata.ts +19 -0
  132. package/src/components/chat/utils/process-historical-messages.ts +19 -1
  133. package/dist/chunk-IKUSKKFZ.cjs.map +0 -1
  134. package/dist/chunk-XWBND4G5.js.map +0 -1
  135. /package/dist/{chunk-WMRXB6RS.js.map → chunk-54WRMPCY.js.map} +0 -0
  136. /package/dist/{chunk-PFKWJ6PJ.js.map → chunk-AQW2PDRS.js.map} +0 -0
  137. /package/dist/{chunk-DROXHJVZ.js.map → chunk-AVVKXNGI.js.map} +0 -0
  138. /package/dist/{chunk-J3EEL6YC.js.map → chunk-FH2FH337.js.map} +0 -0
  139. /package/dist/{chunk-L26MD32B.js.map → chunk-GDHI3JN5.js.map} +0 -0
  140. /package/dist/{chunk-VWHEXQ64.js.map → chunk-GFIH73Q3.js.map} +0 -0
  141. /package/dist/{chunk-R5A3MGMY.js.map → chunk-H6GYY5CB.js.map} +0 -0
  142. /package/dist/{chunk-FCLM2RXI.js.map → chunk-HGJAUYHW.js.map} +0 -0
  143. /package/dist/{chunk-WHNC7C76.js.map → chunk-KN2ZCZQ7.js.map} +0 -0
  144. /package/dist/{chunk-XZ3MKTJZ.js.map → chunk-PWI66GZF.js.map} +0 -0
  145. /package/dist/{chunk-HIHPWVKP.js.map → chunk-T35JA5XV.js.map} +0 -0
  146. /package/dist/{chunk-EZ5VU5WS.js.map → chunk-TLZ7HTXP.js.map} +0 -0
  147. /package/dist/{chunk-IOP7BCRQ.js.map → chunk-WFF5JMQ2.js.map} +0 -0
  148. /package/dist/{chunk-AJLF6MBD.js.map → chunk-X4HLHN36.js.map} +0 -0
  149. /package/dist/{chunk-PMA7DVQR.js.map → chunk-ZWB64HOD.js.map} +0 -0
@@ -7,7 +7,8 @@
7
7
  *
8
8
  * Server-safe: no React, no browser APIs.
9
9
  */
10
- import type { AskOptionData } from '../components/chat/types/message.types';
10
+ import type { ChatRef } from '../components/chat/chat-ref.types';
11
+ import type { AskOptionData, ChatSource } from '../components/chat/types/message.types';
11
12
  import type { ApprovalRequestField, DecisionResolvedFrame, UsageTelemetry } from './frames';
12
13
  /** Optional envelope on every event. `seq` carries the transport's
13
14
  * stream sequence (JetStream `streamSeq` on NATS; unused on SSE). */
@@ -203,6 +204,11 @@ export interface ChatMetadataEvent extends ChatStreamEventBase {
203
204
  routedThinkingBudget: number | null;
204
205
  };
205
206
  }
207
+ export interface SourcesEvent extends ChatStreamEventBase {
208
+ type: 'sources';
209
+ sources: ChatSource[];
210
+ refs?: ChatRef[];
211
+ }
206
212
  /** SSE usage frames — raw wire keys (snake_case) preserved. */
207
213
  export interface UsageEvent extends ChatStreamEventBase {
208
214
  type: 'usage';
@@ -292,6 +298,6 @@ export interface ParticipantEvent extends ChatStreamEventBase {
292
298
  export interface DialogClosedEvent extends ChatStreamEventBase {
293
299
  type: 'dialog-closed';
294
300
  }
295
- export type ChatStreamEvent = TurnStartEvent | TurnEndEvent | TextDeltaEvent | ThinkingDeltaEvent | AskEvent | StatusEvent | ToolExecutionEvent | ApprovalRequestEvent | ApprovalResolvedEvent | EscalationOfferEvent | EscalationOfferResolvedEvent | TicketEscalatedEvent | TicketEventEvent | ChatMetadataEvent | UsageEvent | TokenUsageEvent | CompactionEvent | ErrorEvent | ParticipantEvent | DialogClosedEvent;
301
+ export type ChatStreamEvent = TurnStartEvent | TurnEndEvent | TextDeltaEvent | ThinkingDeltaEvent | AskEvent | StatusEvent | ToolExecutionEvent | ApprovalRequestEvent | ApprovalResolvedEvent | EscalationOfferEvent | EscalationOfferResolvedEvent | TicketEscalatedEvent | TicketEventEvent | ChatMetadataEvent | SourcesEvent | UsageEvent | TokenUsageEvent | CompactionEvent | ErrorEvent | ParticipantEvent | DialogClosedEvent;
296
302
  export {};
297
303
  //# sourceMappingURL=events.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/chat-protocol/events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/chat-protocol/events.ts"],"names":[],"mappings":"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"}
@@ -286,6 +286,8 @@ function createSseFrameDecoder() {
286
286
  var MESSAGE_TYPE = {
287
287
  TEXT: "TEXT",
288
288
  THINKING: "THINKING",
289
+ GUIDE: "GUIDE",
290
+ SOURCES: "SOURCES",
289
291
  ASK: "ASK",
290
292
  EXECUTING_TOOL: "EXECUTING_TOOL",
291
293
  EXECUTED_TOOL: "EXECUTED_TOOL",
@@ -307,6 +309,176 @@ var MESSAGE_TYPE = {
307
309
  DIALOG_CLOSED: "DIALOG_CLOSED"
308
310
  };
309
311
 
312
+ // src/chat-protocol/source-metadata.ts
313
+ var CARD_REFERENCE = /^\[card:\/\/([a-zA-Z0-9_-]+):([a-zA-Z0-9_-]+)\]$/;
314
+ function requiredString(value) {
315
+ if (typeof value !== "string") return null;
316
+ const normalized = value.trim();
317
+ return normalized ? normalized : null;
318
+ }
319
+ function optionalString(value) {
320
+ return requiredString(value) ?? void 0;
321
+ }
322
+ function httpsUrl(value) {
323
+ const candidate = optionalString(value);
324
+ if (!candidate) return void 0;
325
+ try {
326
+ return new URL(candidate).protocol === "https:" ? candidate : void 0;
327
+ } catch {
328
+ return void 0;
329
+ }
330
+ }
331
+ function youtubeId(value) {
332
+ const candidate = optionalString(value);
333
+ if (!candidate) return void 0;
334
+ if (/^[A-Za-z0-9_-]{11}$/.test(candidate)) return candidate;
335
+ const url = httpsUrl(candidate);
336
+ if (!url) return void 0;
337
+ const parsed = new URL(url);
338
+ const hostname = parsed.hostname.toLowerCase();
339
+ const youtubeHost = hostname === "youtu.be" || hostname === "youtube.com" || hostname.endsWith(".youtube.com");
340
+ if (!youtubeHost) return void 0;
341
+ const pathId = hostname === "youtu.be" ? parsed.pathname.split("/").filter(Boolean)[0] : parsed.pathname.match(/^\/(?:embed|v|shorts)\/([A-Za-z0-9_-]{11})(?:\/|$)/)?.[1];
342
+ const id = pathId ?? parsed.searchParams.get("v") ?? void 0;
343
+ return id && /^[A-Za-z0-9_-]{11}$/.test(id) ? id : void 0;
344
+ }
345
+ function nullableString(value) {
346
+ return value === null ? null : optionalString(value);
347
+ }
348
+ function normalizeSourceItems(value) {
349
+ if (!Array.isArray(value)) return void 0;
350
+ const items = value.flatMap((candidate) => {
351
+ if (!candidate || typeof candidate !== "object" || Array.isArray(candidate)) return [];
352
+ const item = candidate;
353
+ const id = requiredString(item.id);
354
+ const documentType = requiredString(item.documentType);
355
+ const name = requiredString(item.name);
356
+ if (!id || !documentType || !name) return [];
357
+ const externalUrl = httpsUrl(item.externalUrl);
358
+ const targetPlatform = nullableString(item.targetPlatform);
359
+ const path = nullableString(item.path);
360
+ return [
361
+ {
362
+ id,
363
+ documentType,
364
+ name,
365
+ ...externalUrl ? { externalUrl } : {},
366
+ ...targetPlatform !== void 0 ? { targetPlatform } : {},
367
+ ...path !== void 0 ? { path } : {}
368
+ }
369
+ ];
370
+ });
371
+ return items.length > 0 ? items : void 0;
372
+ }
373
+ function normalizeSources(value) {
374
+ if (!Array.isArray(value)) return [];
375
+ const seen = /* @__PURE__ */ new Set();
376
+ const sources = [];
377
+ for (const candidate of value) {
378
+ if (!candidate || typeof candidate !== "object" || Array.isArray(candidate)) continue;
379
+ const source = candidate;
380
+ const index = source.index;
381
+ const name = requiredString(source.name);
382
+ const path = requiredString(source.path);
383
+ const documentType = requiredString(source.documentType);
384
+ const validIndex = typeof index === "number" && Number.isFinite(index) && Number.isInteger(index) && index > 0 && !seen.has(index);
385
+ if (!validIndex || !name || !path || !documentType) continue;
386
+ seen.add(index);
387
+ const externalUrl = httpsUrl(source.externalUrl);
388
+ const targetPlatform = nullableString(source.targetPlatform);
389
+ const id = optionalString(source.id);
390
+ const sourceRepo = optionalString(source.sourceRepo);
391
+ const label = optionalString(source.label);
392
+ const items = normalizeSourceItems(source.items);
393
+ sources.push({
394
+ index,
395
+ name,
396
+ path,
397
+ documentType,
398
+ ...externalUrl ? { externalUrl } : {},
399
+ ...targetPlatform !== void 0 ? { targetPlatform } : {},
400
+ ...id ? { id } : {},
401
+ ...sourceRepo ? { sourceRepo } : {},
402
+ ...label ? { label } : {},
403
+ ...items ? { items } : {}
404
+ });
405
+ }
406
+ return sources;
407
+ }
408
+ function normalizeVideoMetadata(value) {
409
+ if (!value || typeof value !== "object" || Array.isArray(value)) return {};
410
+ const input = value;
411
+ const metadata = {};
412
+ for (const key of ["videoUrl", "highlightVideoUrl", "videoPoster", "highlightVideoPoster"]) {
413
+ const url = httpsUrl(input[key]);
414
+ if (url) metadata[key] = url;
415
+ }
416
+ const id = youtubeId(input.youtubeUrl);
417
+ if (id) metadata.youtubeUrl = id;
418
+ return metadata;
419
+ }
420
+ function normalizeVideos(value) {
421
+ if (!Array.isArray(value)) return [];
422
+ return value.flatMap((candidate) => {
423
+ if (!candidate || typeof candidate !== "object" || Array.isArray(candidate)) return [];
424
+ const video = candidate;
425
+ const match = typeof video.ref === "string" ? CARD_REFERENCE.exec(video.ref) : null;
426
+ if (!match || match[1] !== "video") return [];
427
+ const id = match[2];
428
+ const title = optionalString(video.title) ?? id;
429
+ const url = httpsUrl(video.url) ?? null;
430
+ const sourceRepo = optionalString(video.sourceRepo);
431
+ const metadata = normalizeVideoMetadata(video.metadata);
432
+ if (url) {
433
+ const idFromUrl = youtubeId(url);
434
+ if (idFromUrl) {
435
+ metadata.youtubeUrl = idFromUrl;
436
+ delete metadata.videoUrl;
437
+ } else {
438
+ metadata.videoUrl = url;
439
+ delete metadata.youtubeUrl;
440
+ }
441
+ }
442
+ return [
443
+ {
444
+ type: "video",
445
+ id,
446
+ title,
447
+ url,
448
+ ...sourceRepo ? { sourceRepo } : {},
449
+ ...Object.keys(metadata).length > 0 ? { metadata } : {}
450
+ }
451
+ ];
452
+ });
453
+ }
454
+ function normalizeCards(value) {
455
+ if (!Array.isArray(value)) return [];
456
+ return value.flatMap((candidate) => {
457
+ if (!candidate || typeof candidate !== "object" || Array.isArray(candidate)) return [];
458
+ const card = candidate;
459
+ const match = typeof card.ref === "string" ? CARD_REFERENCE.exec(card.ref) : null;
460
+ if (!match || match[1] === "video") return [];
461
+ const type = requiredString(card.entityType);
462
+ const id = requiredString(card.entityId);
463
+ if (!type || !id || type !== match[1] || id !== match[2]) return [];
464
+ return [{ type, id, title: id, url: null }];
465
+ });
466
+ }
467
+ function sourceMetadataEvent(payload) {
468
+ if (!payload || typeof payload !== "object" || Array.isArray(payload)) return null;
469
+ const metadata = payload;
470
+ const sources = normalizeSources(metadata.sources);
471
+ const refs = [...normalizeVideos(metadata.videos), ...normalizeCards(metadata.cards)];
472
+ const refsByIdentity = /* @__PURE__ */ new Map();
473
+ refs.forEach((ref) => {
474
+ const identity = `${ref.type}:${ref.id}`;
475
+ if (!refsByIdentity.has(identity)) refsByIdentity.set(identity, ref);
476
+ });
477
+ const uniqueRefs = Array.from(refsByIdentity.values());
478
+ if (sources.length === 0 && uniqueRefs.length === 0) return null;
479
+ return { type: "sources", sources, ...uniqueRefs.length > 0 ? { refs: uniqueRefs } : {} };
480
+ }
481
+
310
482
  // src/chat-protocol/nats-decoder.ts
311
483
  function isRecord(value) {
312
484
  return typeof value === "object" && value !== null;
@@ -375,6 +547,11 @@ function decodeNatsChunk(chunk) {
375
547
  return { type: "thinking-delta", text: data.text, ...seq };
376
548
  }
377
549
  return null;
550
+ case MESSAGE_TYPE.GUIDE:
551
+ case MESSAGE_TYPE.SOURCES: {
552
+ const event = sourceMetadataEvent(data.payload);
553
+ return event ? { ...event, ...seq } : null;
554
+ }
378
555
  // An ask card is only an ask card with something to pick: a question and at
379
556
  // least one option. Anything less is dropped rather than rendered as an
380
557
  // empty card the user can't answer — the backend already falls back to a