@vinaverse/react-native 0.1.0-alpha.10 → 0.1.0-alpha.11

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.
@@ -0,0 +1,618 @@
1
+ import { Button, ChatContextProvider, DefaultHeader, DisclosureBar, carousels, Row, itemType } from './chunk-KSHDF3MG.js';
2
+ export { CardCarousel } from './chunk-KSHDF3MG.js';
3
+ import { ThemeProvider, useTheme, useAgentSweep, useReducedMotion } from './chunk-EFEXTVIT.js';
4
+ export { ThemeProvider, useTheme } from './chunk-EFEXTVIT.js';
5
+ import { useAgentRuntime, useAgentProfile } from '@vinaverse/react/agent';
6
+ export { AgentRuntimeProvider, useAgentConversation, useAgentFeatures, useAgentName, useAgentProfile, useAgentRuntime, useAgentStatus, useAgentStatusState } from '@vinaverse/react/agent';
7
+ import { useAgentHistory, useAgentTranscript } from '@vinaverse/react/history';
8
+ export { useAgentHistory, useAgentTranscript } from '@vinaverse/react/history';
9
+ import { FlashList } from '@shopify/flash-list';
10
+ import { CopyProvider, useCopy, formatDateTime } from '@vinaverse/react';
11
+ import { useMemo, useState, useCallback, useRef } from 'react';
12
+ import { View, ActivityIndicator, Pressable, Text, Alert } from 'react-native';
13
+ import { jsx, jsxs } from 'react/jsx-runtime';
14
+
15
+ function AgentHistoryList(props) {
16
+ const copy = useMemo(
17
+ () => props.agentName ? { ...props.copy, agentFallbackName: props.agentName } : props.copy,
18
+ [props.agentName, props.copy]
19
+ );
20
+ return /* @__PURE__ */ jsx(CopyProvider, { locale: props.locale, copy, children: /* @__PURE__ */ jsx(ThemeProvider, { theme: props.theme, colorScheme: props.colorScheme, children: /* @__PURE__ */ jsx(HistoryList, { ...props }) }) });
21
+ }
22
+ function alertConfirm(t) {
23
+ return () => new Promise((resolve) => {
24
+ Alert.alert(
25
+ t("historyDeleteTitle"),
26
+ t("historyDeleteBody"),
27
+ [
28
+ { text: t("cancel"), style: "cancel", onPress: () => resolve(false) },
29
+ {
30
+ text: t("historyDelete"),
31
+ style: "destructive",
32
+ onPress: () => resolve(true)
33
+ }
34
+ ],
35
+ { cancelable: true, onDismiss: () => resolve(false) }
36
+ );
37
+ });
38
+ }
39
+ function HistoryList(props) {
40
+ const { t, locale, direction } = useCopy();
41
+ const { colors, space } = useTheme();
42
+ const runtime = useAgentRuntime();
43
+ useAgentSweep(runtime);
44
+ const { name } = useAgentProfile(t("agentFallbackName"));
45
+ const history = useAgentHistory({
46
+ subject: props.subject,
47
+ mode: props.mode,
48
+ scope: props.scope ?? null,
49
+ agent: props.agent ?? null,
50
+ ...props.thread === void 0 ? {} : { thread: props.thread },
51
+ ...props.pageSize === void 0 ? {} : { pageSize: props.pageSize }
52
+ });
53
+ const { state } = history;
54
+ const [deleting, setDeleting] = useState(/* @__PURE__ */ new Set());
55
+ const [failed, setFailed] = useState(/* @__PURE__ */ new Set());
56
+ const { onOpen, onContinue, onWarning, confirmDelete, timeZone } = props;
57
+ const confirm = useMemo(
58
+ () => confirmDelete ?? alertConfirm(t),
59
+ [confirmDelete, t]
60
+ );
61
+ const remove = useCallback(
62
+ async (conversation) => {
63
+ if (!await confirm(conversation)) return;
64
+ mark(setDeleting, conversation.id, true);
65
+ mark(setFailed, conversation.id, false);
66
+ try {
67
+ await history.remove(conversation);
68
+ } catch (error) {
69
+ mark(setFailed, conversation.id, true);
70
+ onWarning?.(`Vinaverse history: delete failed: ${String(error)}`, {
71
+ code: "delete_failed"
72
+ });
73
+ } finally {
74
+ mark(setDeleting, conversation.id, false);
75
+ }
76
+ },
77
+ [confirm, history, onWarning]
78
+ );
79
+ const slots = props.components ?? {};
80
+ const { Row: Row2, Empty, Failure, ListComponent } = slots;
81
+ const renderItem = useCallback(
82
+ ({ item }) => {
83
+ const own = {
84
+ conversation: item,
85
+ when: formatDateTime(item.last_activity_at, locale, timeZone),
86
+ messages: t("historyMessages", { count: item.message_count }),
87
+ ended: item.state === "ended",
88
+ onOpen: onOpen ? () => onOpen(item) : void 0,
89
+ onContinue: onContinue && item.state === "open" ? () => onContinue(item, history.continue(item)) : void 0,
90
+ onDelete: () => void remove(item),
91
+ deleting: deleting.has(item.id),
92
+ deleteFailed: failed.has(item.id)
93
+ };
94
+ return Row2 ? /* @__PURE__ */ jsx(Row2, { ...own, Default: DefaultHistoryRow }) : /* @__PURE__ */ jsx(DefaultHistoryRow, { ...own });
95
+ },
96
+ [
97
+ Row2,
98
+ locale,
99
+ timeZone,
100
+ t,
101
+ onOpen,
102
+ onContinue,
103
+ history,
104
+ remove,
105
+ deleting,
106
+ failed
107
+ ]
108
+ );
109
+ const empty = state.failure && state.conversations.length === 0 ? /* @__PURE__ */ jsx(Centered, { children: Failure ? /* @__PURE__ */ jsx(
110
+ Failure,
111
+ {
112
+ reason: state.failure,
113
+ onRetry: history.refresh,
114
+ Default: DefaultHistoryFailure
115
+ }
116
+ ) : /* @__PURE__ */ jsx(
117
+ DefaultHistoryFailure,
118
+ {
119
+ reason: state.failure,
120
+ onRetry: history.refresh
121
+ }
122
+ ) }) : state.started && !state.loading ? /* @__PURE__ */ jsx(Centered, { children: Empty ? /* @__PURE__ */ jsx(Empty, { agentName: name, Default: DefaultHistoryEmpty }) : /* @__PURE__ */ jsx(DefaultHistoryEmpty, { agentName: name }) }) : null;
123
+ const footer = state.loading && state.conversations.length > 0 ? /* @__PURE__ */ jsx(View, { style: { padding: space.md, alignItems: "center" }, children: /* @__PURE__ */ jsx(
124
+ ActivityIndicator,
125
+ {
126
+ color: colors.textMuted,
127
+ accessibilityLabel: t("loading")
128
+ }
129
+ ) }) : state.failure && state.conversations.length > 0 ? /* @__PURE__ */ jsx(View, { style: { padding: space.sm, alignItems: "center" }, children: /* @__PURE__ */ jsx(Button, { label: t("tryAgain"), variant: "text", onPress: history.retry }) }) : null;
130
+ const list = useMemo(
131
+ () => ({
132
+ data: state.conversations,
133
+ renderItem,
134
+ keyExtractor: (item) => item.id,
135
+ onEndReached: history.loadMore,
136
+ onRefresh: history.refresh,
137
+ refreshing: state.loading && state.conversations.length === 0,
138
+ ListFooterComponent: footer,
139
+ ListEmptyComponent: empty,
140
+ contentContainerStyle: { paddingVertical: space.sm }
141
+ }),
142
+ [state, renderItem, history, footer, empty, space.sm]
143
+ );
144
+ const List = ListComponent;
145
+ return /* @__PURE__ */ jsx(
146
+ View,
147
+ {
148
+ testID: props.testID ?? "vinaverse-history",
149
+ style: [
150
+ { flex: 1, backgroundColor: colors.background, direction },
151
+ props.style
152
+ ],
153
+ children: List ? /* @__PURE__ */ jsx(List, { ...list }) : /* @__PURE__ */ jsx(FlashList, { ...list })
154
+ }
155
+ );
156
+ }
157
+ var mark = (set, id, on) => set((s) => {
158
+ const next = new Set(s);
159
+ if (on) next.add(id);
160
+ else next.delete(id);
161
+ return next;
162
+ });
163
+ function Centered(props) {
164
+ const { space } = useTheme();
165
+ return /* @__PURE__ */ jsx(
166
+ View,
167
+ {
168
+ style: {
169
+ alignItems: "center",
170
+ justifyContent: "center",
171
+ padding: space.xl
172
+ },
173
+ children: props.children
174
+ }
175
+ );
176
+ }
177
+ function DefaultHistoryRow(props) {
178
+ const { t } = useCopy();
179
+ const { colors, space, font, radius } = useTheme();
180
+ const { conversation } = props;
181
+ const detail = [
182
+ props.when,
183
+ props.messages,
184
+ props.ended ? t("historyEnded") : null
185
+ ].filter(Boolean).join(" \xB7 ");
186
+ return /* @__PURE__ */ jsxs(
187
+ View,
188
+ {
189
+ style: {
190
+ marginHorizontal: space.lg,
191
+ marginVertical: space.xs,
192
+ borderRadius: radius.lg,
193
+ backgroundColor: colors.surface,
194
+ opacity: props.deleting ? 0.6 : 1
195
+ },
196
+ testID: `vinaverse-history-${conversation.id}`,
197
+ children: [
198
+ /* @__PURE__ */ jsxs(
199
+ Pressable,
200
+ {
201
+ accessibilityRole: "button",
202
+ accessibilityLabel: `${conversation.title}. ${detail}`,
203
+ accessibilityState: { disabled: !props.onOpen || props.deleting },
204
+ disabled: !props.onOpen || props.deleting,
205
+ onPress: props.onOpen,
206
+ style: { paddingHorizontal: space.md, paddingTop: space.md },
207
+ children: [
208
+ /* @__PURE__ */ jsx(
209
+ Text,
210
+ {
211
+ numberOfLines: 2,
212
+ style: {
213
+ color: colors.text,
214
+ fontSize: font.size.md,
215
+ fontWeight: "600",
216
+ ...font.family ? { fontFamily: font.family } : {}
217
+ },
218
+ children: conversation.title
219
+ }
220
+ ),
221
+ /* @__PURE__ */ jsx(
222
+ Text,
223
+ {
224
+ style: {
225
+ color: colors.textMuted,
226
+ fontSize: font.size.sm,
227
+ marginTop: space.xxs
228
+ },
229
+ children: detail
230
+ }
231
+ )
232
+ ]
233
+ }
234
+ ),
235
+ /* @__PURE__ */ jsxs(
236
+ View,
237
+ {
238
+ style: {
239
+ flexDirection: "row",
240
+ alignItems: "center",
241
+ gap: space.xs,
242
+ paddingHorizontal: space.xs
243
+ },
244
+ children: [
245
+ props.onContinue ? /* @__PURE__ */ jsx(
246
+ Button,
247
+ {
248
+ label: t("historyContinue"),
249
+ variant: "text",
250
+ disabled: props.deleting,
251
+ onPress: props.onContinue
252
+ }
253
+ ) : null,
254
+ /* @__PURE__ */ jsx(
255
+ Button,
256
+ {
257
+ label: t("historyDelete"),
258
+ variant: "text",
259
+ busy: props.deleting,
260
+ onPress: props.onDelete
261
+ }
262
+ ),
263
+ props.deleteFailed ? /* @__PURE__ */ jsx(Text, { style: { color: colors.danger, fontSize: font.size.xs }, children: t("historyDeleteFailed") }) : null
264
+ ]
265
+ }
266
+ )
267
+ ]
268
+ }
269
+ );
270
+ }
271
+ function DefaultHistoryEmpty(props) {
272
+ const { t } = useCopy();
273
+ const { colors, space, font } = useTheme();
274
+ return /* @__PURE__ */ jsxs(View, { style: { alignItems: "center", gap: space.sm }, children: [
275
+ /* @__PURE__ */ jsx(
276
+ Text,
277
+ {
278
+ style: {
279
+ color: colors.text,
280
+ fontSize: font.size.lg,
281
+ fontWeight: "600",
282
+ textAlign: "center"
283
+ },
284
+ children: t("historyEmpty")
285
+ }
286
+ ),
287
+ /* @__PURE__ */ jsx(
288
+ Text,
289
+ {
290
+ style: {
291
+ color: colors.textMuted,
292
+ fontSize: font.size.md,
293
+ textAlign: "center"
294
+ },
295
+ children: t("historyEmptyBody", { agent: props.agentName })
296
+ }
297
+ )
298
+ ] });
299
+ }
300
+ function DefaultHistoryFailure(props) {
301
+ const { t } = useCopy();
302
+ const { colors, space, font } = useTheme();
303
+ const off = props.reason === "off";
304
+ return /* @__PURE__ */ jsxs(
305
+ View,
306
+ {
307
+ accessibilityRole: "alert",
308
+ style: { alignItems: "center", gap: space.md },
309
+ children: [
310
+ /* @__PURE__ */ jsx(
311
+ Text,
312
+ {
313
+ style: {
314
+ color: colors.text,
315
+ fontSize: font.size.md,
316
+ textAlign: "center"
317
+ },
318
+ children: t(off ? "historyOff" : "historyFailed")
319
+ }
320
+ ),
321
+ off ? null : /* @__PURE__ */ jsx(
322
+ Button,
323
+ {
324
+ label: t("tryAgain"),
325
+ variant: "primary",
326
+ onPress: props.onRetry
327
+ }
328
+ )
329
+ ]
330
+ }
331
+ );
332
+ }
333
+
334
+ // src/components/readOnlyStore.ts
335
+ var none = () => () => void 0;
336
+ function readOnlyStore(view) {
337
+ const snapshot = {
338
+ status: "ready",
339
+ conversationId: view.conversationId,
340
+ banner: null,
341
+ next: null,
342
+ agent: { name: view.agentName, avatarUrl: view.agentAvatar },
343
+ welcome: null,
344
+ disclosure: null,
345
+ takeover: null,
346
+ items: view.items,
347
+ activity: [],
348
+ responding: false,
349
+ openQuestion: null,
350
+ answersNeedWebSocket: false,
351
+ turnsLeft: null,
352
+ history: "restored"
353
+ };
354
+ return {
355
+ getSnapshot: () => snapshot,
356
+ subscribe: none,
357
+ getStreaming: () => null,
358
+ subscribeStreaming: none,
359
+ send: () => "",
360
+ retry: () => null,
361
+ retryTurn: () => null,
362
+ cancel: () => void 0,
363
+ answer: () => "",
364
+ cardAction: () => "",
365
+ decideProposal: () => Promise.resolve(null),
366
+ checkLink: () => false,
367
+ continueHere: () => Promise.resolve(),
368
+ setForeground: () => void 0,
369
+ start: () => void 0
370
+ };
371
+ }
372
+ function AgentTranscript(props) {
373
+ const copy = useMemo(
374
+ () => props.agentName ? { ...props.copy, agentFallbackName: props.agentName } : props.copy,
375
+ [props.agentName, props.copy]
376
+ );
377
+ return /* @__PURE__ */ jsx(CopyProvider, { locale: props.locale, copy, children: /* @__PURE__ */ jsx(ThemeProvider, { theme: props.theme, colorScheme: props.colorScheme, children: /* @__PURE__ */ jsx(Transcript, { ...props }) }) });
378
+ }
379
+ var EMPTY_SLOTS = {};
380
+ function Transcript(props) {
381
+ const { t, direction } = useCopy();
382
+ const { colors, space } = useTheme();
383
+ const runtime = useAgentRuntime();
384
+ const profile = useAgentProfile(t("agentFallbackName"));
385
+ const name = profile.name;
386
+ const avatar = props.agentAvatar ?? profile.avatarUrl;
387
+ const transcript = useAgentTranscript(props.conversationId, {
388
+ ...props.pageSize === void 0 ? {} : { pageSize: props.pageSize }
389
+ });
390
+ const { state } = transcript;
391
+ const slots = props.components ?? EMPTY_SLOTS;
392
+ const { Header, Failure, ListComponent } = slots;
393
+ const chatSlots = useMemo(() => {
394
+ const { Header: _h, Failure: _f, ListComponent: _l, ...rest } = slots;
395
+ return rest;
396
+ }, [slots]);
397
+ const store = useMemo(
398
+ () => readOnlyStore({
399
+ items: state.items,
400
+ conversationId: props.conversationId,
401
+ agentName: name,
402
+ agentAvatar: avatar
403
+ }),
404
+ [state.items, props.conversationId, name, avatar]
405
+ );
406
+ const handlers = useRef({});
407
+ handlers.current = {
408
+ ...props.prefetchImage ? { prefetchImage: props.prefetchImage } : {}
409
+ };
410
+ const value = useMemo(
411
+ () => ({
412
+ store,
413
+ handlers,
414
+ slots: chatSlots,
415
+ agentAvatar: props.agentAvatar,
416
+ timeZone: props.timeZone,
417
+ failureAction: null,
418
+ starters: void 0,
419
+ imagePolicy: props.imagePolicy
420
+ }),
421
+ [store, chatSlots, props.agentAvatar, props.timeZone, props.imagePolicy]
422
+ );
423
+ const header = { name, avatarUrl: avatar, takeoverBy: null };
424
+ const gone = state.failure === "not_found" || state.failure === "expired" || state.failure === "ended";
425
+ const onContinue = props.onContinue;
426
+ const agentKey = props.agentKey;
427
+ return /* @__PURE__ */ jsx(ChatContextProvider, { value, children: /* @__PURE__ */ jsxs(
428
+ View,
429
+ {
430
+ testID: props.testID ?? "vinaverse-transcript",
431
+ style: [
432
+ { flex: 1, backgroundColor: colors.background, direction },
433
+ props.style
434
+ ],
435
+ children: [
436
+ props.hideHeader ? null : Header ? /* @__PURE__ */ jsx(Header, { ...header, Default: DefaultHeader }) : /* @__PURE__ */ jsx(DefaultHeader, { ...header }),
437
+ /* @__PURE__ */ jsx(DisclosureBar, {}),
438
+ /* @__PURE__ */ jsx(View, { style: { flex: 1 }, children: state.failure && state.items.length === 0 ? /* @__PURE__ */ jsx(Centered2, { children: Failure ? /* @__PURE__ */ jsx(
439
+ Failure,
440
+ {
441
+ reason: state.failure,
442
+ gone,
443
+ onRetry: transcript.load,
444
+ Default: DefaultTranscriptFailure
445
+ }
446
+ ) : /* @__PURE__ */ jsx(
447
+ DefaultTranscriptFailure,
448
+ {
449
+ reason: state.failure,
450
+ gone,
451
+ onRetry: transcript.load
452
+ }
453
+ ) }) : /* @__PURE__ */ jsx(
454
+ TranscriptList,
455
+ {
456
+ items: state.items,
457
+ loading: state.loading,
458
+ more: !state.done && state.started && !state.loading,
459
+ failed: state.failure !== null,
460
+ onEarlier: transcript.loadEarlier,
461
+ onRetry: transcript.retry,
462
+ ListComponent,
463
+ grouped: chatSlots.CardGroup !== void 0
464
+ }
465
+ ) }),
466
+ onContinue && agentKey && !gone && props.ended !== true ? /* @__PURE__ */ jsx(View, { style: { padding: space.lg }, children: /* @__PURE__ */ jsx(
467
+ Button,
468
+ {
469
+ label: t("historyContinue"),
470
+ variant: "primary",
471
+ onPress: () => onContinue(runtime.continue(agentKey, props.conversationId))
472
+ }
473
+ ) }) : null
474
+ ]
475
+ }
476
+ ) });
477
+ }
478
+ function authorOf(item) {
479
+ return item?.type === "message" ? item.role : null;
480
+ }
481
+ function TranscriptList(props) {
482
+ const { t } = useCopy();
483
+ const { colors, space, font } = useTheme();
484
+ const reducedMotion = useReducedMotion();
485
+ const { items, grouped } = props;
486
+ const runsRef = useRef(/* @__PURE__ */ new Map());
487
+ const grouping = useMemo(
488
+ () => grouped ? carousels(items, runsRef.current) : null,
489
+ [items, grouped]
490
+ );
491
+ runsRef.current = grouping?.runs ?? /* @__PURE__ */ new Map();
492
+ const itemsRef = useRef(items);
493
+ itemsRef.current = items;
494
+ const groupingRef = useRef(grouping);
495
+ groupingRef.current = grouping;
496
+ const renderItem = useCallback(
497
+ ({ item, index }) => /* @__PURE__ */ jsx(
498
+ Row,
499
+ {
500
+ item,
501
+ showAuthor: authorOf(item) !== authorOf(itemsRef.current[index - 1]),
502
+ run: groupingRef.current?.runs.get(item.key),
503
+ inside: groupingRef.current?.inside.has(item.key) === true
504
+ }
505
+ ),
506
+ []
507
+ );
508
+ const header = props.loading ? /* @__PURE__ */ jsx(View, { style: { padding: space.md, alignItems: "center" }, children: /* @__PURE__ */ jsx(
509
+ ActivityIndicator,
510
+ {
511
+ color: colors.textMuted,
512
+ accessibilityLabel: t("loading")
513
+ }
514
+ ) }) : props.failed ? (
515
+ // Said where the earlier messages would be, with a way to ask again (the same cursor, or the newest page).
516
+ /* @__PURE__ */ jsxs(
517
+ View,
518
+ {
519
+ accessibilityRole: "alert",
520
+ style: {
521
+ padding: space.sm,
522
+ flexDirection: "row",
523
+ justifyContent: "center",
524
+ alignItems: "center",
525
+ gap: space.sm
526
+ },
527
+ children: [
528
+ /* @__PURE__ */ jsx(Text, { style: { color: colors.textMuted, fontSize: font.size.sm }, children: t("transcriptEarlier") }),
529
+ /* @__PURE__ */ jsx(
530
+ Button,
531
+ {
532
+ label: t("tryAgain"),
533
+ hint: t("transcriptEarlier"),
534
+ variant: "text",
535
+ onPress: props.onRetry
536
+ }
537
+ )
538
+ ]
539
+ }
540
+ )
541
+ ) : props.more ? /* @__PURE__ */ jsx(View, { style: { padding: space.sm, alignItems: "center" }, children: /* @__PURE__ */ jsx(
542
+ Button,
543
+ {
544
+ label: t("transcriptEarlier"),
545
+ variant: "text",
546
+ onPress: props.onEarlier
547
+ }
548
+ ) }) : null;
549
+ const list = useMemo(
550
+ () => ({
551
+ data: items,
552
+ renderItem,
553
+ keyExtractor: (item) => item.key,
554
+ getItemType: itemType,
555
+ maintainVisibleContentPosition: {
556
+ startRenderingFromBottom: true,
557
+ animateAutoScrollToBottom: !reducedMotion
558
+ },
559
+ onStartReached: props.onEarlier,
560
+ ListHeaderComponent: header,
561
+ contentContainerStyle: { paddingVertical: space.sm }
562
+ }),
563
+ [items, renderItem, reducedMotion, props.onEarlier, header, space.sm]
564
+ );
565
+ const List = props.ListComponent;
566
+ return List ? /* @__PURE__ */ jsx(List, { ...list }) : /* @__PURE__ */ jsx(FlashList, { ...list });
567
+ }
568
+ function Centered2(props) {
569
+ const { space } = useTheme();
570
+ return /* @__PURE__ */ jsx(
571
+ View,
572
+ {
573
+ style: {
574
+ flex: 1,
575
+ alignItems: "center",
576
+ justifyContent: "center",
577
+ padding: space.xl
578
+ },
579
+ children: props.children
580
+ }
581
+ );
582
+ }
583
+ function DefaultTranscriptFailure(props) {
584
+ const { t } = useCopy();
585
+ const { colors, space, font } = useTheme();
586
+ return /* @__PURE__ */ jsxs(
587
+ View,
588
+ {
589
+ accessibilityRole: "alert",
590
+ style: { alignItems: "center", gap: space.md },
591
+ children: [
592
+ /* @__PURE__ */ jsx(
593
+ Text,
594
+ {
595
+ style: {
596
+ color: colors.text,
597
+ fontSize: font.size.md,
598
+ textAlign: "center"
599
+ },
600
+ children: t(props.gone ? "transcriptGone" : "transcriptFailed")
601
+ }
602
+ ),
603
+ props.gone ? null : /* @__PURE__ */ jsx(
604
+ Button,
605
+ {
606
+ label: t("tryAgain"),
607
+ variant: "primary",
608
+ onPress: props.onRetry
609
+ }
610
+ )
611
+ ]
612
+ }
613
+ );
614
+ }
615
+
616
+ export { AgentHistoryList, AgentTranscript, DefaultHistoryEmpty, DefaultHistoryFailure, DefaultHistoryRow, DefaultTranscriptFailure };
617
+ //# sourceMappingURL=history.js.map
618
+ //# sourceMappingURL=history.js.map