@flamingo-stack/openframe-frontend-core 0.0.578 → 0.0.579-1952.5335.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 (172) hide show
  1. package/dist/chat-protocol/decode.d.ts.map +1 -1
  2. package/dist/chat-protocol/events.d.ts +1 -47
  3. package/dist/chat-protocol/events.d.ts.map +1 -1
  4. package/dist/chat-protocol/index.cjs +0 -51
  5. package/dist/chat-protocol/index.cjs.map +1 -1
  6. package/dist/chat-protocol/index.js +1 -48
  7. package/dist/chat-protocol/index.js.map +1 -1
  8. package/dist/chat-protocol/leading-frames.d.ts +3 -9
  9. package/dist/chat-protocol/leading-frames.d.ts.map +1 -1
  10. package/dist/chat-protocol/nats-decoder.d.ts +0 -41
  11. package/dist/chat-protocol/nats-decoder.d.ts.map +1 -1
  12. package/dist/{chunk-IBSOYTGZ.js → chunk-2ML5QEDH.js} +3 -3
  13. package/dist/{chunk-NPNYQSCG.cjs → chunk-3B42TFEE.cjs} +21 -21
  14. package/dist/{chunk-NPNYQSCG.cjs.map → chunk-3B42TFEE.cjs.map} +1 -1
  15. package/dist/{chunk-POB6GNIR.cjs → chunk-3XFMM34I.cjs} +43 -43
  16. package/dist/{chunk-POB6GNIR.cjs.map → chunk-3XFMM34I.cjs.map} +1 -1
  17. package/dist/{chunk-R7OJZCE6.cjs → chunk-4C3MS2G6.cjs} +69 -69
  18. package/dist/{chunk-R7OJZCE6.cjs.map → chunk-4C3MS2G6.cjs.map} +1 -1
  19. package/dist/{chunk-G3AJXLKH.cjs → chunk-653A7FPP.cjs} +22 -22
  20. package/dist/{chunk-G3AJXLKH.cjs.map → chunk-653A7FPP.cjs.map} +1 -1
  21. package/dist/{chunk-KPE277X2.js → chunk-6QDW4CDG.js} +2 -2
  22. package/dist/{chunk-E5QAU63Y.cjs → chunk-7WKFLOC7.cjs} +9 -9
  23. package/dist/{chunk-E5QAU63Y.cjs.map → chunk-7WKFLOC7.cjs.map} +1 -1
  24. package/dist/{chunk-ABWA3W3M.cjs → chunk-AAHKPPGQ.cjs} +32 -32
  25. package/dist/{chunk-ABWA3W3M.cjs.map → chunk-AAHKPPGQ.cjs.map} +1 -1
  26. package/dist/{chunk-JJH4H4CJ.js → chunk-AT4WAFJO.js} +5 -5
  27. package/dist/{chunk-5IAGT5LB.js → chunk-C4KL7OQI.js} +2 -2
  28. package/dist/{chunk-SETRICAM.cjs → chunk-C7Q2PVHD.cjs} +4 -4
  29. package/dist/{chunk-SETRICAM.cjs.map → chunk-C7Q2PVHD.cjs.map} +1 -1
  30. package/dist/{chunk-AJ67T7LI.js → chunk-CGVPUA4X.js} +3 -3
  31. package/dist/{chunk-BFJBE4PQ.js → chunk-CSBNQJSI.js} +4 -4
  32. package/dist/{chunk-LPFA56WY.js → chunk-DBP7S75Q.js} +1317 -1480
  33. package/dist/chunk-DBP7S75Q.js.map +1 -0
  34. package/dist/{chunk-KQBYQBQN.cjs → chunk-DGB2FLFH.cjs} +10 -10
  35. package/dist/{chunk-KQBYQBQN.cjs.map → chunk-DGB2FLFH.cjs.map} +1 -1
  36. package/dist/{chunk-GOEBT72V.cjs → chunk-EVTRRDIH.cjs} +15 -15
  37. package/dist/{chunk-GOEBT72V.cjs.map → chunk-EVTRRDIH.cjs.map} +1 -1
  38. package/dist/{chunk-UQPA2XT7.cjs → chunk-GP2QLZIN.cjs} +24 -24
  39. package/dist/{chunk-UQPA2XT7.cjs.map → chunk-GP2QLZIN.cjs.map} +1 -1
  40. package/dist/{chunk-KLG3MGRP.js → chunk-KXLJT5U5.js} +3 -3
  41. package/dist/{chunk-SNZZ6Q6G.js → chunk-L66XBQM6.js} +2 -2
  42. package/dist/{chunk-SHJXC7A4.js → chunk-NWAUHBYH.js} +3 -3
  43. package/dist/{chunk-YOYHJQX3.cjs → chunk-OCSAB6NT.cjs} +5 -5
  44. package/dist/{chunk-YOYHJQX3.cjs.map → chunk-OCSAB6NT.cjs.map} +1 -1
  45. package/dist/{chunk-5NG2P2KI.js → chunk-PFTEG6L7.js} +5 -5
  46. package/dist/{chunk-BLPGMX2L.cjs → chunk-PITZMTGE.cjs} +159 -159
  47. package/dist/{chunk-BLPGMX2L.cjs.map → chunk-PITZMTGE.cjs.map} +1 -1
  48. package/dist/{chunk-ZBVMPVJF.js → chunk-QOPQ6BCA.js} +3 -3
  49. package/dist/{chunk-IWK2NFVR.js → chunk-RXZWUJEB.js} +2 -2
  50. package/dist/{chunk-OIJWSYKP.cjs → chunk-SY5HCZZO.cjs} +3 -3
  51. package/dist/{chunk-OIJWSYKP.cjs.map → chunk-SY5HCZZO.cjs.map} +1 -1
  52. package/dist/{chunk-ESXUEMPA.js → chunk-TYJITV3H.js} +2 -2
  53. package/dist/{chunk-M7FNT5AC.cjs → chunk-VLRXLTR4.cjs} +167 -330
  54. package/dist/chunk-VLRXLTR4.cjs.map +1 -0
  55. package/dist/{chunk-WUZQYZXI.cjs → chunk-WHSSI3S7.cjs} +3 -3
  56. package/dist/{chunk-WUZQYZXI.cjs.map → chunk-WHSSI3S7.cjs.map} +1 -1
  57. package/dist/{chunk-LEUJNBWU.js → chunk-XJ45MHWI.js} +6 -6
  58. package/dist/{chunk-NJDL7F7K.cjs → chunk-YYEVFC3K.cjs} +10 -10
  59. package/dist/{chunk-NJDL7F7K.cjs.map → chunk-YYEVFC3K.cjs.map} +1 -1
  60. package/dist/{chunk-QHGARH6P.js → chunk-ZCEQLHU3.js} +5 -5
  61. package/dist/components/case-studies/index.cjs +9 -9
  62. package/dist/components/case-studies/index.js +3 -3
  63. package/dist/components/chat/chat-message-enhanced.d.ts.map +1 -1
  64. package/dist/components/chat/index.cjs +2 -10
  65. package/dist/components/chat/index.cjs.map +1 -1
  66. package/dist/components/chat/index.d.ts +0 -1
  67. package/dist/components/chat/index.d.ts.map +1 -1
  68. package/dist/components/chat/index.js +1 -9
  69. package/dist/components/chat/stream/chat-stream-reducer.d.ts +0 -9
  70. package/dist/components/chat/stream/chat-stream-reducer.d.ts.map +1 -1
  71. package/dist/components/chat/stream/delta-batcher.d.ts +3 -3
  72. package/dist/components/chat/stream/delta-batcher.d.ts.map +1 -1
  73. package/dist/components/chat/stream/message-mutations.d.ts.map +1 -1
  74. package/dist/components/chat/types/component.types.d.ts +0 -6
  75. package/dist/components/chat/types/component.types.d.ts.map +1 -1
  76. package/dist/components/chat/types/message.types.d.ts +2 -30
  77. package/dist/components/chat/types/message.types.d.ts.map +1 -1
  78. package/dist/components/chat/types/network.types.d.ts +1 -3
  79. package/dist/components/chat/types/network.types.d.ts.map +1 -1
  80. package/dist/components/chat/types/processing.types.d.ts +1 -4
  81. package/dist/components/chat/types/processing.types.d.ts.map +1 -1
  82. package/dist/components/chat/utils/approval-display.d.ts +8 -36
  83. package/dist/components/chat/utils/approval-display.d.ts.map +1 -1
  84. package/dist/components/chat/utils/extract-incomplete-message-state.d.ts.map +1 -1
  85. package/dist/components/chat/utils/index.d.ts +1 -1
  86. package/dist/components/chat/utils/index.d.ts.map +1 -1
  87. package/dist/components/chat/utils/message-segment-accumulator.d.ts +4 -16
  88. package/dist/components/chat/utils/message-segment-accumulator.d.ts.map +1 -1
  89. package/dist/components/chat/utils/process-historical-messages.d.ts.map +1 -1
  90. package/dist/components/chat/utils/resolve-fetched-card-href.d.ts +1 -1
  91. package/dist/components/contact/index.cjs +4 -4
  92. package/dist/components/contact/index.js +3 -3
  93. package/dist/components/docs/index.cjs +7 -7
  94. package/dist/components/docs/index.js +6 -6
  95. package/dist/components/embeds/index.cjs +4 -4
  96. package/dist/components/embeds/index.js +3 -3
  97. package/dist/components/faq/index.cjs +4 -4
  98. package/dist/components/faq/index.js +3 -3
  99. package/dist/components/features/index.cjs +3 -3
  100. package/dist/components/features/index.js +2 -2
  101. package/dist/components/help-center-pages/index.cjs +23 -23
  102. package/dist/components/help-center-pages/index.js +14 -14
  103. package/dist/components/index.cjs +121 -129
  104. package/dist/components/index.cjs.map +1 -1
  105. package/dist/components/index.js +13 -21
  106. package/dist/components/index.js.map +1 -1
  107. package/dist/components/meeting-scheduler/index.cjs +21 -21
  108. package/dist/components/meeting-scheduler/index.js +2 -2
  109. package/dist/components/navigation/index.cjs +6 -6
  110. package/dist/components/navigation/index.js +5 -5
  111. package/dist/components/onboarding-guides/index.cjs +6 -6
  112. package/dist/components/onboarding-guides/index.js +5 -5
  113. package/dist/components/tickets/index.cjs +7 -7
  114. package/dist/components/tickets/index.js +6 -6
  115. package/dist/components/ui/index.cjs +3 -11
  116. package/dist/components/ui/index.cjs.map +1 -1
  117. package/dist/components/ui/index.js +2 -10
  118. package/dist/index.cjs +7 -15
  119. package/dist/index.cjs.map +1 -1
  120. package/dist/index.js +6 -14
  121. package/dist/index.js.map +1 -1
  122. package/dist/schemas/meeting-booking-schema.d.ts +2 -2
  123. package/dist/utils/index.cjs.map +1 -1
  124. package/dist/utils/index.js.map +1 -1
  125. package/package.json +1 -1
  126. package/src/chat-protocol/__tests__/__snapshots__/nats-decoder-golden.test.ts.snap +0 -80
  127. package/src/chat-protocol/__tests__/nats-decoder-golden.test.ts +1 -118
  128. package/src/chat-protocol/decode.ts +3 -4
  129. package/src/chat-protocol/events.ts +0 -51
  130. package/src/chat-protocol/leading-frames.ts +3 -9
  131. package/src/chat-protocol/nats-decoder.ts +1 -110
  132. package/src/components/chat/__tests__/chat-pending-turn.test.tsx +0 -19
  133. package/src/components/chat/chat-message-enhanced.tsx +1 -13
  134. package/src/components/chat/index.ts +0 -1
  135. package/src/components/chat/stream/__tests__/chat-stream-reducer.test.ts +0 -90
  136. package/src/components/chat/stream/chat-dialog-store.ts +1 -1
  137. package/src/components/chat/stream/chat-stream-reducer.ts +11 -49
  138. package/src/components/chat/stream/delta-batcher.ts +4 -9
  139. package/src/components/chat/stream/message-mutations.ts +0 -2
  140. package/src/components/chat/types/component.types.ts +0 -9
  141. package/src/components/chat/types/message.types.ts +0 -32
  142. package/src/components/chat/types/network.types.ts +1 -3
  143. package/src/components/chat/types/processing.types.ts +1 -4
  144. package/src/components/chat/utils/__tests__/process-historical-messages-approvals.test.ts +0 -93
  145. package/src/components/chat/utils/__tests__/process-historical-messages-golden.test.ts +1 -78
  146. package/src/components/chat/utils/approval-display.ts +8 -53
  147. package/src/components/chat/utils/extract-incomplete-message-state.ts +0 -1
  148. package/src/components/chat/utils/index.ts +1 -6
  149. package/src/components/chat/utils/message-segment-accumulator.ts +3 -37
  150. package/src/components/chat/utils/process-historical-messages.ts +7 -44
  151. package/src/components/chat/utils/resolve-fetched-card-href.ts +1 -1
  152. package/src/stories/ChatMessageEnhanced.stories.tsx +3 -7
  153. package/dist/chunk-LPFA56WY.js.map +0 -1
  154. package/dist/chunk-M7FNT5AC.cjs.map +0 -1
  155. package/dist/components/chat/guide-display.d.ts +0 -14
  156. package/dist/components/chat/guide-display.d.ts.map +0 -1
  157. package/src/components/chat/guide-display.tsx +0 -42
  158. /package/dist/{chunk-IBSOYTGZ.js.map → chunk-2ML5QEDH.js.map} +0 -0
  159. /package/dist/{chunk-KPE277X2.js.map → chunk-6QDW4CDG.js.map} +0 -0
  160. /package/dist/{chunk-JJH4H4CJ.js.map → chunk-AT4WAFJO.js.map} +0 -0
  161. /package/dist/{chunk-5IAGT5LB.js.map → chunk-C4KL7OQI.js.map} +0 -0
  162. /package/dist/{chunk-AJ67T7LI.js.map → chunk-CGVPUA4X.js.map} +0 -0
  163. /package/dist/{chunk-BFJBE4PQ.js.map → chunk-CSBNQJSI.js.map} +0 -0
  164. /package/dist/{chunk-KLG3MGRP.js.map → chunk-KXLJT5U5.js.map} +0 -0
  165. /package/dist/{chunk-SNZZ6Q6G.js.map → chunk-L66XBQM6.js.map} +0 -0
  166. /package/dist/{chunk-SHJXC7A4.js.map → chunk-NWAUHBYH.js.map} +0 -0
  167. /package/dist/{chunk-5NG2P2KI.js.map → chunk-PFTEG6L7.js.map} +0 -0
  168. /package/dist/{chunk-ZBVMPVJF.js.map → chunk-QOPQ6BCA.js.map} +0 -0
  169. /package/dist/{chunk-IWK2NFVR.js.map → chunk-RXZWUJEB.js.map} +0 -0
  170. /package/dist/{chunk-ESXUEMPA.js.map → chunk-TYJITV3H.js.map} +0 -0
  171. /package/dist/{chunk-LEUJNBWU.js.map → chunk-XJ45MHWI.js.map} +0 -0
  172. /package/dist/{chunk-QHGARH6P.js.map → chunk-ZCEQLHU3.js.map} +0 -0
@@ -155,22 +155,6 @@ export class MessageSegmentAccumulator {
155
155
  return this.getSegments();
156
156
  }
157
157
 
158
- /**
159
- * Append guide text to the current message.
160
- * If the last segment is guide, append to it; otherwise start a new guide segment.
161
- */
162
- appendGuide(text: string): MessageSegment[] {
163
- const lastSegment = this.segments[this.segments.length - 1];
164
-
165
- if (lastSegment && lastSegment.type === 'guide') {
166
- this.segments[this.segments.length - 1] = { type: 'guide', text: lastSegment.text + text };
167
- } else {
168
- this.segments.push({ type: 'guide', text });
169
- }
170
-
171
- return this.getSegments();
172
- }
173
-
174
158
  /**
175
159
  * Add a clarification (ask) card. Unlike the three delta streams an ask
176
160
  * arrives whole in one chunk, so it is always a NEW segment — never merged
@@ -325,15 +309,11 @@ export class MessageSegmentAccumulator {
325
309
  status: ChatApprovalStatus = 'pending',
326
310
  /** Structured label/value rows. The card prefers them over `explanation`
327
311
  * (see `ApprovalRequestData.fields`). Optional because the agent's own
328
- * approvals carry prose; a Product Guide card is almost entirely fields —
329
- * dropping them here left it as a bare title. */
312
+ * approvals carry prose. */
330
313
  fields?: ApprovalRequestField[],
331
- /** Where the card came from; `'guide'` keeps it inline (see
332
- * `ApprovalRequestData.origin`). */
333
- origin?: 'guide',
334
314
  ): MessageSegment[] {
335
315
  this.segments.push(
336
- this.buildApprovalRequestSegment(requestId, { command, explanation, approvalType, fields, origin }, status),
316
+ this.buildApprovalRequestSegment(requestId, { command, explanation, approvalType, fields }, status),
337
317
  );
338
318
  return this.getSegments();
339
319
  }
@@ -344,7 +324,7 @@ export class MessageSegmentAccumulator {
344
324
  * Three paths produce these: `addApprovalRequest` (live stream and replay),
345
325
  * `flushPendingApprovals` (tracked-but-unresolved after a history replay) and
346
326
  * `processApprovalResult` (a result arriving for a tracked request). They used
347
- * to hand-write the object each, which is how `fields` and `origin` reached
327
+ * to hand-write the object each, which is how `fields` reached
348
328
  * the card down one path and not the others — the same proposal rendering as a
349
329
  * bare title, or losing the marker that routes its buttons to the hub.
350
330
  */
@@ -361,7 +341,6 @@ export class MessageSegmentAccumulator {
361
341
  requestId,
362
342
  approvalType: approval.approvalType,
363
343
  ...(approval.fields && approval.fields.length > 0 ? { fields: approval.fields } : {}),
364
- ...(approval.origin ? { origin: approval.origin } : {}),
365
344
  },
366
345
  status,
367
346
  onApprove: this.callbacks.onApprove,
@@ -389,9 +368,6 @@ export class MessageSegmentAccumulator {
389
368
  status: ChatApprovalStatus = 'pending',
390
369
  executions?: Record<string, ApprovalBatchExecutionState>,
391
370
  resolvedByName?: string | null,
392
- /** Where the batch came from; `'guide'` keeps it inline and routes it to
393
- * the hub, exactly as for a single card (see `ApprovalBatchData.origin`). */
394
- origin?: 'guide',
395
371
  ): MessageSegment[] {
396
372
  const existingIndex = this.segments.findIndex(
397
373
  (s): s is ApprovalBatchSegment => s.type === 'approval_batch' && s.data.approvalRequestId === approvalRequestId,
@@ -400,9 +376,6 @@ export class MessageSegmentAccumulator {
400
376
  if (existingIndex !== -1) {
401
377
  const existing = this.segments[existingIndex] as ApprovalBatchSegment;
402
378
  const mergedExecutions = executions ?? existing.data.executions;
403
- // An upsert must not strip the marker: the flip to `approved` comes from
404
- // a later event that carries no origin of its own.
405
- const mergedOrigin = origin ?? existing.data.origin;
406
379
  this.segments[existingIndex] = {
407
380
  ...existing,
408
381
  data: {
@@ -410,7 +383,6 @@ export class MessageSegmentAccumulator {
410
383
  approvalType,
411
384
  toolCalls,
412
385
  ...(mergedExecutions ? { executions: mergedExecutions } : {}),
413
- ...(mergedOrigin ? { origin: mergedOrigin } : {}),
414
386
  },
415
387
  status,
416
388
  resolvedByName: resolvedByName ?? existing.resolvedByName,
@@ -427,7 +399,6 @@ export class MessageSegmentAccumulator {
427
399
  approvalType,
428
400
  toolCalls,
429
401
  ...(executions ? { executions } : {}),
430
- ...(origin ? { origin } : {}),
431
402
  },
432
403
  status,
433
404
  resolvedByName,
@@ -685,9 +656,6 @@ export class MessageSegmentAccumulator {
685
656
  case 'thinking':
686
657
  if (segment.text) this.appendThinking(segment.text);
687
658
  break;
688
- case 'guide':
689
- if (segment.text) this.appendGuide(segment.text);
690
- break;
691
659
  case 'ask':
692
660
  this.addAsk(segment.question, segment.options);
693
661
  break;
@@ -703,7 +671,6 @@ export class MessageSegmentAccumulator {
703
671
  data.approvalType || '',
704
672
  status,
705
673
  data.fields,
706
- data.origin,
707
674
  );
708
675
  break;
709
676
  }
@@ -716,7 +683,6 @@ export class MessageSegmentAccumulator {
716
683
  status,
717
684
  data.executions,
718
685
  resolvedByName,
719
- data.origin,
720
686
  );
721
687
  break;
722
688
  }
@@ -33,7 +33,7 @@ import {
33
33
  } from '../../../chat-protocol/events';
34
34
  // One normalizer for ask rows, shared with the live decoder — history and the
35
35
  // stream must agree on which options are usable.
36
- import { guideFrameEvent, normalizeAskOptions } from '../../../chat-protocol/nats-decoder';
36
+ import { normalizeAskOptions } from '../../../chat-protocol/nats-decoder';
37
37
  import { applyApprovalStatusToSegment } from '../stream/message-mutations';
38
38
  import {
39
39
  MESSAGE_TYPE,
@@ -47,7 +47,7 @@ import {
47
47
  type MessageData,
48
48
  type MessageOwner,
49
49
  } from '../types';
50
- import { approvalDisplaysInline, guideApprovalOrigin } from './approval-display';
50
+ import { approvalDisplaysInline } from './approval-display';
51
51
  import { type MessageSegmentAccumulator, createMessageSegmentAccumulator } from './message-segment-accumulator';
52
52
  import { getCommandText } from './tool-call-helpers';
53
53
 
@@ -121,22 +121,6 @@ export function decodeHistoricalMessageData(data: MessageData): ChatStreamEvent
121
121
  }
122
122
  return null;
123
123
 
124
- // Two persisted shapes, mirroring the live `GUIDE` chunk: the answer body
125
- // (`text`) and a Product Guide frame the agent re-streamed (`payload`,
126
- // persisted so a card survives a reload). Decoded through the SAME
127
- // `guideFrameEvent` the live path uses — a second mapping here would let
128
- // history and realtime disagree about the same bytes.
129
- case MESSAGE_TYPE.GUIDE: {
130
- if ('text' in data && data.text) {
131
- return { type: 'guide-delta', text: data.text };
132
- }
133
- const payload = 'payload' in data ? data.payload : undefined;
134
- if (payload && typeof payload === 'object' && !Array.isArray(payload)) {
135
- return guideFrameEvent(payload);
136
- }
137
- return null;
138
- }
139
-
140
124
  // Same completeness gate as the live decoder (`decodeNatsChunk`): a
141
125
  // persisted row without a question or without options is not a card the
142
126
  // user can answer, so it replays as nothing rather than as empty chrome.
@@ -397,10 +381,6 @@ function applyHistoryEvent(
397
381
  accumulator.appendThinking(event.text);
398
382
  break;
399
383
 
400
- case 'guide-delta':
401
- accumulator.appendGuide(event.text);
402
- break;
403
-
404
384
  // Mirror of the live path: the intro sentence replays as answer text in
405
385
  // front of the card, so a reloaded thread reads exactly like the stream did.
406
386
  case 'ask':
@@ -417,23 +397,13 @@ function applyHistoryEvent(
417
397
  const toolCalls = event.toolCalls;
418
398
  const isBatch = !!toolCalls && toolCalls.length > 0;
419
399
  // Same rule the live kernels use — a card must not change where it
420
- // renders (or which backend its buttons hit) just because the page was
421
- // reloaded and it came back through history instead of the stream.
422
- const guideOrigin = guideApprovalOrigin(event);
423
-
424
- if (approvalDisplaysInline(event, approvalType, displayApprovalTypes)) {
400
+ // renders just because the page was reloaded and it came back through
401
+ // history instead of the stream.
402
+ if (approvalDisplaysInline(approvalType, displayApprovalTypes)) {
425
403
  if (isBatch) {
426
404
  const status = (approvalStatuses[event.requestId] as ChatApprovalStatus) || 'pending';
427
405
  if (batchApprovalsEnabled) {
428
- accumulator.addApprovalBatch(
429
- event.requestId,
430
- approvalType,
431
- toolCalls,
432
- status,
433
- undefined,
434
- undefined,
435
- guideOrigin,
436
- );
406
+ accumulator.addApprovalBatch(event.requestId, approvalType, toolCalls, status, undefined, undefined);
437
407
  } else {
438
408
  // Flag OFF — unfold batch into N legacy approval cards (same id).
439
409
  for (const call of toolCalls) {
@@ -445,7 +415,6 @@ function applyHistoryEvent(
445
415
  approvalType,
446
416
  status,
447
417
  undefined,
448
- guideOrigin,
449
418
  );
450
419
  }
451
420
  }
@@ -459,12 +428,7 @@ function applyHistoryEvent(
459
428
  // and honor `approvalStatuses`.
460
429
  const resolvedStatus = approvalStatuses[event.requestId] as ChatApprovalStatus | undefined;
461
430
  const isResolved = resolvedStatus === 'approved' || resolvedStatus === 'rejected';
462
- // A guide card is added inline even while pending. The tracked path
463
- // below ends in `flushPendingApprovals`, whose segments the consumer
464
- // lifts into a sticky footer — that is the treatment for the
465
- // consumer's OWN approvals, and it is not how the hub's chat renders
466
- // a proposal (nor where its preamble expects it).
467
- if (guideOrigin || isResolved) {
431
+ if (isResolved) {
468
432
  accumulator.addApprovalRequest(
469
433
  event.requestId,
470
434
  event.command || '',
@@ -472,7 +436,6 @@ function applyHistoryEvent(
472
436
  approvalType,
473
437
  resolvedStatus ?? 'pending',
474
438
  event.fields,
475
- guideOrigin,
476
439
  );
477
440
  } else {
478
441
  accumulator.trackApprovalRequest(event.requestId, {
@@ -11,7 +11,7 @@
11
11
  * (`title` / `url` / `targetPlatform` / `sourceRepo`). `resolveSourceRowCTA`
12
12
  * then routes that `externalUrl` through the host's `composeContentUrl`
13
13
  * seam and the card is clickable.
14
- * - **Mingo / NATS transport** (`messageData: [{ type: 'GUIDE' | 'TEXT', text }]`)
14
+ * - **Mingo / NATS transport** (`messageData: [{ type: 'TEXT', text }]`)
15
15
  * — the body carries bare `[card://type:id]` markers and NOTHING else.
16
16
  * `chat-message-enhanced.tsx` synthesizes a minimal `{ type, id, title: id,
17
17
  * url: null }` ref so fetch-mode cards can still self-fetch their row, but
@@ -210,18 +210,18 @@ export const GuideWithEntityCards: Story = {
210
210
  ) : null,
211
211
  content: [
212
212
  {
213
- type: 'guide',
213
+ type: 'text',
214
214
  text: "Here's how to create a monitoring policy (check) in OpenFrame:\n\n[card://onboarding_guide:first-check]\n\nStep-by-step:\n\n1. Go to Monitoring → Policies → Add Policy\n2. Write your osquery SQL query\n3. Save the policy",
215
215
  },
216
216
  {
217
217
  type: 'text',
218
- text: 'A plain text segment renders its own marker identically:\n\n[card://onboarding_guide:add-devices]',
218
+ text: 'A second text segment renders its own marker identically:\n\n[card://onboarding_guide:add-devices]',
219
219
  },
220
220
  ] satisfies MessageSegment[],
221
221
  },
222
222
  };
223
223
 
224
- /** Every remaining segment type in one message — thinking, guide, tool execution, context compaction, error. */
224
+ /** Every remaining segment type in one message — thinking, tool execution, context compaction, error. */
225
225
  export const AllSegmentTypes: Story = {
226
226
  args: {
227
227
  role: 'assistant',
@@ -233,10 +233,6 @@ export const AllSegmentTypes: Story = {
233
233
  text: 'The user wants Slack installed. Homebrew is present on the endpoint, so `brew install --cask slack` is the cleanest path.',
234
234
  },
235
235
  { type: 'text', text: 'Installing Slack now.' },
236
- {
237
- type: 'guide',
238
- text: "Here's how to create a monitoring policy (check) in OpenFrame:\n\nStep-by-step:\n\n1. Go to Monitoring → Policies → Add Policy\n2. Give it a Name (something descriptive)\n3. Write your osquery SQL query — the query should return rows for devices that fail the check\n4. Set the interval — how often each device runs the check\n5. Save the policy",
239
- },
240
236
  {
241
237
  type: 'tool_execution',
242
238
  data: {