@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.
- package/dist/chat-protocol/decode.d.ts.map +1 -1
- package/dist/chat-protocol/events.d.ts +1 -47
- package/dist/chat-protocol/events.d.ts.map +1 -1
- package/dist/chat-protocol/index.cjs +0 -51
- package/dist/chat-protocol/index.cjs.map +1 -1
- package/dist/chat-protocol/index.js +1 -48
- package/dist/chat-protocol/index.js.map +1 -1
- package/dist/chat-protocol/leading-frames.d.ts +3 -9
- package/dist/chat-protocol/leading-frames.d.ts.map +1 -1
- package/dist/chat-protocol/nats-decoder.d.ts +0 -41
- package/dist/chat-protocol/nats-decoder.d.ts.map +1 -1
- package/dist/{chunk-IBSOYTGZ.js → chunk-2ML5QEDH.js} +3 -3
- package/dist/{chunk-NPNYQSCG.cjs → chunk-3B42TFEE.cjs} +21 -21
- package/dist/{chunk-NPNYQSCG.cjs.map → chunk-3B42TFEE.cjs.map} +1 -1
- package/dist/{chunk-POB6GNIR.cjs → chunk-3XFMM34I.cjs} +43 -43
- package/dist/{chunk-POB6GNIR.cjs.map → chunk-3XFMM34I.cjs.map} +1 -1
- package/dist/{chunk-R7OJZCE6.cjs → chunk-4C3MS2G6.cjs} +69 -69
- package/dist/{chunk-R7OJZCE6.cjs.map → chunk-4C3MS2G6.cjs.map} +1 -1
- package/dist/{chunk-G3AJXLKH.cjs → chunk-653A7FPP.cjs} +22 -22
- package/dist/{chunk-G3AJXLKH.cjs.map → chunk-653A7FPP.cjs.map} +1 -1
- package/dist/{chunk-KPE277X2.js → chunk-6QDW4CDG.js} +2 -2
- package/dist/{chunk-E5QAU63Y.cjs → chunk-7WKFLOC7.cjs} +9 -9
- package/dist/{chunk-E5QAU63Y.cjs.map → chunk-7WKFLOC7.cjs.map} +1 -1
- package/dist/{chunk-ABWA3W3M.cjs → chunk-AAHKPPGQ.cjs} +32 -32
- package/dist/{chunk-ABWA3W3M.cjs.map → chunk-AAHKPPGQ.cjs.map} +1 -1
- package/dist/{chunk-JJH4H4CJ.js → chunk-AT4WAFJO.js} +5 -5
- package/dist/{chunk-5IAGT5LB.js → chunk-C4KL7OQI.js} +2 -2
- package/dist/{chunk-SETRICAM.cjs → chunk-C7Q2PVHD.cjs} +4 -4
- package/dist/{chunk-SETRICAM.cjs.map → chunk-C7Q2PVHD.cjs.map} +1 -1
- package/dist/{chunk-AJ67T7LI.js → chunk-CGVPUA4X.js} +3 -3
- package/dist/{chunk-BFJBE4PQ.js → chunk-CSBNQJSI.js} +4 -4
- package/dist/{chunk-LPFA56WY.js → chunk-DBP7S75Q.js} +1317 -1480
- package/dist/chunk-DBP7S75Q.js.map +1 -0
- package/dist/{chunk-KQBYQBQN.cjs → chunk-DGB2FLFH.cjs} +10 -10
- package/dist/{chunk-KQBYQBQN.cjs.map → chunk-DGB2FLFH.cjs.map} +1 -1
- package/dist/{chunk-GOEBT72V.cjs → chunk-EVTRRDIH.cjs} +15 -15
- package/dist/{chunk-GOEBT72V.cjs.map → chunk-EVTRRDIH.cjs.map} +1 -1
- package/dist/{chunk-UQPA2XT7.cjs → chunk-GP2QLZIN.cjs} +24 -24
- package/dist/{chunk-UQPA2XT7.cjs.map → chunk-GP2QLZIN.cjs.map} +1 -1
- package/dist/{chunk-KLG3MGRP.js → chunk-KXLJT5U5.js} +3 -3
- package/dist/{chunk-SNZZ6Q6G.js → chunk-L66XBQM6.js} +2 -2
- package/dist/{chunk-SHJXC7A4.js → chunk-NWAUHBYH.js} +3 -3
- package/dist/{chunk-YOYHJQX3.cjs → chunk-OCSAB6NT.cjs} +5 -5
- package/dist/{chunk-YOYHJQX3.cjs.map → chunk-OCSAB6NT.cjs.map} +1 -1
- package/dist/{chunk-5NG2P2KI.js → chunk-PFTEG6L7.js} +5 -5
- package/dist/{chunk-BLPGMX2L.cjs → chunk-PITZMTGE.cjs} +159 -159
- package/dist/{chunk-BLPGMX2L.cjs.map → chunk-PITZMTGE.cjs.map} +1 -1
- package/dist/{chunk-ZBVMPVJF.js → chunk-QOPQ6BCA.js} +3 -3
- package/dist/{chunk-IWK2NFVR.js → chunk-RXZWUJEB.js} +2 -2
- package/dist/{chunk-OIJWSYKP.cjs → chunk-SY5HCZZO.cjs} +3 -3
- package/dist/{chunk-OIJWSYKP.cjs.map → chunk-SY5HCZZO.cjs.map} +1 -1
- package/dist/{chunk-ESXUEMPA.js → chunk-TYJITV3H.js} +2 -2
- package/dist/{chunk-M7FNT5AC.cjs → chunk-VLRXLTR4.cjs} +167 -330
- package/dist/chunk-VLRXLTR4.cjs.map +1 -0
- package/dist/{chunk-WUZQYZXI.cjs → chunk-WHSSI3S7.cjs} +3 -3
- package/dist/{chunk-WUZQYZXI.cjs.map → chunk-WHSSI3S7.cjs.map} +1 -1
- package/dist/{chunk-LEUJNBWU.js → chunk-XJ45MHWI.js} +6 -6
- package/dist/{chunk-NJDL7F7K.cjs → chunk-YYEVFC3K.cjs} +10 -10
- package/dist/{chunk-NJDL7F7K.cjs.map → chunk-YYEVFC3K.cjs.map} +1 -1
- package/dist/{chunk-QHGARH6P.js → chunk-ZCEQLHU3.js} +5 -5
- package/dist/components/case-studies/index.cjs +9 -9
- package/dist/components/case-studies/index.js +3 -3
- package/dist/components/chat/chat-message-enhanced.d.ts.map +1 -1
- package/dist/components/chat/index.cjs +2 -10
- package/dist/components/chat/index.cjs.map +1 -1
- package/dist/components/chat/index.d.ts +0 -1
- package/dist/components/chat/index.d.ts.map +1 -1
- package/dist/components/chat/index.js +1 -9
- package/dist/components/chat/stream/chat-stream-reducer.d.ts +0 -9
- package/dist/components/chat/stream/chat-stream-reducer.d.ts.map +1 -1
- package/dist/components/chat/stream/delta-batcher.d.ts +3 -3
- package/dist/components/chat/stream/delta-batcher.d.ts.map +1 -1
- package/dist/components/chat/stream/message-mutations.d.ts.map +1 -1
- package/dist/components/chat/types/component.types.d.ts +0 -6
- package/dist/components/chat/types/component.types.d.ts.map +1 -1
- package/dist/components/chat/types/message.types.d.ts +2 -30
- package/dist/components/chat/types/message.types.d.ts.map +1 -1
- package/dist/components/chat/types/network.types.d.ts +1 -3
- package/dist/components/chat/types/network.types.d.ts.map +1 -1
- package/dist/components/chat/types/processing.types.d.ts +1 -4
- package/dist/components/chat/types/processing.types.d.ts.map +1 -1
- package/dist/components/chat/utils/approval-display.d.ts +8 -36
- package/dist/components/chat/utils/approval-display.d.ts.map +1 -1
- package/dist/components/chat/utils/extract-incomplete-message-state.d.ts.map +1 -1
- package/dist/components/chat/utils/index.d.ts +1 -1
- package/dist/components/chat/utils/index.d.ts.map +1 -1
- package/dist/components/chat/utils/message-segment-accumulator.d.ts +4 -16
- package/dist/components/chat/utils/message-segment-accumulator.d.ts.map +1 -1
- package/dist/components/chat/utils/process-historical-messages.d.ts.map +1 -1
- package/dist/components/chat/utils/resolve-fetched-card-href.d.ts +1 -1
- package/dist/components/contact/index.cjs +4 -4
- package/dist/components/contact/index.js +3 -3
- package/dist/components/docs/index.cjs +7 -7
- package/dist/components/docs/index.js +6 -6
- package/dist/components/embeds/index.cjs +4 -4
- package/dist/components/embeds/index.js +3 -3
- package/dist/components/faq/index.cjs +4 -4
- package/dist/components/faq/index.js +3 -3
- package/dist/components/features/index.cjs +3 -3
- package/dist/components/features/index.js +2 -2
- package/dist/components/help-center-pages/index.cjs +23 -23
- package/dist/components/help-center-pages/index.js +14 -14
- package/dist/components/index.cjs +121 -129
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.js +13 -21
- package/dist/components/index.js.map +1 -1
- package/dist/components/meeting-scheduler/index.cjs +21 -21
- package/dist/components/meeting-scheduler/index.js +2 -2
- package/dist/components/navigation/index.cjs +6 -6
- package/dist/components/navigation/index.js +5 -5
- package/dist/components/onboarding-guides/index.cjs +6 -6
- package/dist/components/onboarding-guides/index.js +5 -5
- package/dist/components/tickets/index.cjs +7 -7
- package/dist/components/tickets/index.js +6 -6
- package/dist/components/ui/index.cjs +3 -11
- package/dist/components/ui/index.cjs.map +1 -1
- package/dist/components/ui/index.js +2 -10
- package/dist/index.cjs +7 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +6 -14
- package/dist/index.js.map +1 -1
- package/dist/schemas/meeting-booking-schema.d.ts +2 -2
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.js.map +1 -1
- package/package.json +1 -1
- package/src/chat-protocol/__tests__/__snapshots__/nats-decoder-golden.test.ts.snap +0 -80
- package/src/chat-protocol/__tests__/nats-decoder-golden.test.ts +1 -118
- package/src/chat-protocol/decode.ts +3 -4
- package/src/chat-protocol/events.ts +0 -51
- package/src/chat-protocol/leading-frames.ts +3 -9
- package/src/chat-protocol/nats-decoder.ts +1 -110
- package/src/components/chat/__tests__/chat-pending-turn.test.tsx +0 -19
- package/src/components/chat/chat-message-enhanced.tsx +1 -13
- package/src/components/chat/index.ts +0 -1
- package/src/components/chat/stream/__tests__/chat-stream-reducer.test.ts +0 -90
- package/src/components/chat/stream/chat-dialog-store.ts +1 -1
- package/src/components/chat/stream/chat-stream-reducer.ts +11 -49
- package/src/components/chat/stream/delta-batcher.ts +4 -9
- package/src/components/chat/stream/message-mutations.ts +0 -2
- package/src/components/chat/types/component.types.ts +0 -9
- package/src/components/chat/types/message.types.ts +0 -32
- package/src/components/chat/types/network.types.ts +1 -3
- package/src/components/chat/types/processing.types.ts +1 -4
- package/src/components/chat/utils/__tests__/process-historical-messages-approvals.test.ts +0 -93
- package/src/components/chat/utils/__tests__/process-historical-messages-golden.test.ts +1 -78
- package/src/components/chat/utils/approval-display.ts +8 -53
- package/src/components/chat/utils/extract-incomplete-message-state.ts +0 -1
- package/src/components/chat/utils/index.ts +1 -6
- package/src/components/chat/utils/message-segment-accumulator.ts +3 -37
- package/src/components/chat/utils/process-historical-messages.ts +7 -44
- package/src/components/chat/utils/resolve-fetched-card-href.ts +1 -1
- package/src/stories/ChatMessageEnhanced.stories.tsx +3 -7
- package/dist/chunk-LPFA56WY.js.map +0 -1
- package/dist/chunk-M7FNT5AC.cjs.map +0 -1
- package/dist/components/chat/guide-display.d.ts +0 -14
- package/dist/components/chat/guide-display.d.ts.map +0 -1
- package/src/components/chat/guide-display.tsx +0 -42
- /package/dist/{chunk-IBSOYTGZ.js.map → chunk-2ML5QEDH.js.map} +0 -0
- /package/dist/{chunk-KPE277X2.js.map → chunk-6QDW4CDG.js.map} +0 -0
- /package/dist/{chunk-JJH4H4CJ.js.map → chunk-AT4WAFJO.js.map} +0 -0
- /package/dist/{chunk-5IAGT5LB.js.map → chunk-C4KL7OQI.js.map} +0 -0
- /package/dist/{chunk-AJ67T7LI.js.map → chunk-CGVPUA4X.js.map} +0 -0
- /package/dist/{chunk-BFJBE4PQ.js.map → chunk-CSBNQJSI.js.map} +0 -0
- /package/dist/{chunk-KLG3MGRP.js.map → chunk-KXLJT5U5.js.map} +0 -0
- /package/dist/{chunk-SNZZ6Q6G.js.map → chunk-L66XBQM6.js.map} +0 -0
- /package/dist/{chunk-SHJXC7A4.js.map → chunk-NWAUHBYH.js.map} +0 -0
- /package/dist/{chunk-5NG2P2KI.js.map → chunk-PFTEG6L7.js.map} +0 -0
- /package/dist/{chunk-ZBVMPVJF.js.map → chunk-QOPQ6BCA.js.map} +0 -0
- /package/dist/{chunk-IWK2NFVR.js.map → chunk-RXZWUJEB.js.map} +0 -0
- /package/dist/{chunk-ESXUEMPA.js.map → chunk-TYJITV3H.js.map} +0 -0
- /package/dist/{chunk-LEUJNBWU.js.map → chunk-XJ45MHWI.js.map} +0 -0
- /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
|
|
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
|
|
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`
|
|
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 {
|
|
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
|
|
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
|
|
421
|
-
//
|
|
422
|
-
|
|
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
|
-
|
|
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: '
|
|
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: '
|
|
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
|
|
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,
|
|
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: {
|