@flamingo-stack/openframe-frontend-core 0.0.429 → 0.0.430-snapshot.20260715230743
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/{chunk-Y2TW664W.js → chunk-2CMR3GZI.js} +4 -4
- package/dist/{chunk-CRGH6TV6.cjs → chunk-363MFN2A.cjs} +26 -26
- package/dist/{chunk-CRGH6TV6.cjs.map → chunk-363MFN2A.cjs.map} +1 -1
- package/dist/{chunk-E4PKZNR7.cjs → chunk-4MYZKPVF.cjs} +11 -11
- package/dist/{chunk-E4PKZNR7.cjs.map → chunk-4MYZKPVF.cjs.map} +1 -1
- package/dist/{chunk-GMR5AA3C.js → chunk-7IDETI3Q.js} +2 -2
- package/dist/{chunk-BN3V465H.cjs → chunk-BKIBU5AJ.cjs} +15 -15
- package/dist/{chunk-BN3V465H.cjs.map → chunk-BKIBU5AJ.cjs.map} +1 -1
- package/dist/{chunk-B3FBMRHQ.js → chunk-DCVREFCV.js} +2 -2
- package/dist/{chunk-TJ4HJ3KX.js → chunk-E3TNEXSD.js} +2 -2
- package/dist/{chunk-62L7S7HQ.js → chunk-EHOMVEUE.js} +273 -166
- package/dist/chunk-EHOMVEUE.js.map +1 -0
- package/dist/{chunk-4VODJPTB.js → chunk-EIGAJ5RW.js} +2 -2
- package/dist/{chunk-7PA4B6SD.js → chunk-GNJ3AJW5.js} +4 -4
- package/dist/{chunk-YGITDP6O.cjs → chunk-HKBKABAN.cjs} +31 -31
- package/dist/{chunk-YGITDP6O.cjs.map → chunk-HKBKABAN.cjs.map} +1 -1
- package/dist/{chunk-B3Y47C2U.cjs → chunk-J7WOVSD3.cjs} +59 -59
- package/dist/{chunk-B3Y47C2U.cjs.map → chunk-J7WOVSD3.cjs.map} +1 -1
- package/dist/{chunk-XDBD6BJN.cjs → chunk-MKQ3M6KW.cjs} +322 -215
- package/dist/chunk-MKQ3M6KW.cjs.map +1 -0
- package/dist/{chunk-2WJ25MTA.js → chunk-NN5PACBO.js} +4 -4
- package/dist/{chunk-KHKB5RY2.js → chunk-QESOR5AJ.js} +2 -2
- package/dist/{chunk-OLGFIDZY.cjs → chunk-QJX3BF3K.cjs} +26 -26
- package/dist/{chunk-OLGFIDZY.cjs.map → chunk-QJX3BF3K.cjs.map} +1 -1
- package/dist/{chunk-RTOVYU4D.js → chunk-QVDO5M43.js} +4 -4
- package/dist/{chunk-GGJUXN6Z.cjs → chunk-RAYN22CP.cjs} +9 -9
- package/dist/{chunk-GGJUXN6Z.cjs.map → chunk-RAYN22CP.cjs.map} +1 -1
- package/dist/{chunk-NYISC4Z3.js → chunk-SKLGUMGJ.js} +2 -2
- package/dist/{chunk-WXKFFVGC.cjs → chunk-TDB5RDEU.cjs} +5 -5
- package/dist/{chunk-WXKFFVGC.cjs.map → chunk-TDB5RDEU.cjs.map} +1 -1
- package/dist/{chunk-MAYEJ3NY.js → chunk-V7U6GMOJ.js} +2 -2
- package/dist/{chunk-7MJTM6QT.cjs → chunk-W724RQMP.cjs} +7 -7
- package/dist/{chunk-7MJTM6QT.cjs.map → chunk-W724RQMP.cjs.map} +1 -1
- package/dist/{chunk-CCL6JEMS.cjs → chunk-XSFMDCB6.cjs} +62 -62
- package/dist/{chunk-CCL6JEMS.cjs.map → chunk-XSFMDCB6.cjs.map} +1 -1
- package/dist/{chunk-2LJA3ABH.cjs → chunk-ZSHMCFTI.cjs} +37 -37
- package/dist/{chunk-2LJA3ABH.cjs.map → chunk-ZSHMCFTI.cjs.map} +1 -1
- package/dist/components/case-studies/index.cjs +8 -8
- package/dist/components/case-studies/index.js +2 -2
- package/dist/components/chat/hooks/index.d.ts +1 -0
- package/dist/components/chat/hooks/index.d.ts.map +1 -1
- package/dist/components/chat/hooks/use-nats-chat-adapter.d.ts +10 -1
- package/dist/components/chat/hooks/use-nats-chat-adapter.d.ts.map +1 -1
- package/dist/components/chat/hooks/use-scripted-stream.d.ts +3 -0
- package/dist/components/chat/hooks/use-scripted-stream.d.ts.map +1 -0
- package/dist/components/chat/index.cjs +12 -2
- package/dist/components/chat/index.cjs.map +1 -1
- package/dist/components/chat/index.js +11 -1
- package/dist/components/chat/utils/index.d.ts +1 -0
- package/dist/components/chat/utils/index.d.ts.map +1 -1
- package/dist/components/chat/utils/scripted-stream.d.ts +38 -0
- package/dist/components/chat/utils/scripted-stream.d.ts.map +1 -0
- package/dist/components/contact/index.cjs +3 -3
- package/dist/components/contact/index.js +2 -2
- package/dist/components/docs/index.cjs +5 -5
- package/dist/components/docs/index.js +4 -4
- package/dist/components/embeds/index.cjs +3 -3
- package/dist/components/embeds/index.js +2 -2
- package/dist/components/faq/index.cjs +3 -3
- package/dist/components/faq/index.js +2 -2
- package/dist/components/features/board/index.d.ts +2 -2
- package/dist/components/features/board/index.d.ts.map +1 -1
- package/dist/components/features/board/ticket-card.d.ts +22 -2
- package/dist/components/features/board/ticket-card.d.ts.map +1 -1
- package/dist/components/features/index.cjs +6 -2
- package/dist/components/features/index.cjs.map +1 -1
- package/dist/components/features/index.js +5 -1
- package/dist/components/help-center-pages/index.cjs +20 -20
- package/dist/components/help-center-pages/index.js +11 -11
- package/dist/components/index.cjs +142 -128
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.js +23 -9
- package/dist/components/index.js.map +1 -1
- package/dist/components/navigation/index.cjs +2 -2
- package/dist/components/navigation/index.js +1 -1
- package/dist/components/onboarding-guides/index.cjs +5 -5
- package/dist/components/onboarding-guides/index.js +4 -4
- package/dist/components/related-content/index.cjs +3 -3
- package/dist/components/related-content/index.js +2 -2
- package/dist/components/tickets/index.cjs +5 -5
- package/dist/components/tickets/index.js +4 -4
- package/dist/components/ui/index.cjs +12 -2
- package/dist/components/ui/index.cjs.map +1 -1
- package/dist/components/ui/index.js +11 -1
- package/dist/index.cjs +16 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +15 -1
- package/package.json +1 -1
- package/src/components/chat/hooks/index.ts +1 -0
- package/src/components/chat/hooks/use-nats-chat-adapter.ts +23 -0
- package/src/components/chat/hooks/use-scripted-stream.ts +69 -0
- package/src/components/chat/utils/index.ts +2 -0
- package/src/components/chat/utils/scripted-stream.ts +122 -0
- package/src/components/features/board/index.ts +2 -2
- package/src/components/features/board/ticket-card.tsx +108 -64
- package/dist/chunk-62L7S7HQ.js.map +0 -1
- package/dist/chunk-XDBD6BJN.cjs.map +0 -1
- /package/dist/{chunk-Y2TW664W.js.map → chunk-2CMR3GZI.js.map} +0 -0
- /package/dist/{chunk-GMR5AA3C.js.map → chunk-7IDETI3Q.js.map} +0 -0
- /package/dist/{chunk-B3FBMRHQ.js.map → chunk-DCVREFCV.js.map} +0 -0
- /package/dist/{chunk-TJ4HJ3KX.js.map → chunk-E3TNEXSD.js.map} +0 -0
- /package/dist/{chunk-4VODJPTB.js.map → chunk-EIGAJ5RW.js.map} +0 -0
- /package/dist/{chunk-7PA4B6SD.js.map → chunk-GNJ3AJW5.js.map} +0 -0
- /package/dist/{chunk-2WJ25MTA.js.map → chunk-NN5PACBO.js.map} +0 -0
- /package/dist/{chunk-KHKB5RY2.js.map → chunk-QESOR5AJ.js.map} +0 -0
- /package/dist/{chunk-RTOVYU4D.js.map → chunk-QVDO5M43.js.map} +0 -0
- /package/dist/{chunk-NYISC4Z3.js.map → chunk-SKLGUMGJ.js.map} +0 -0
- /package/dist/{chunk-MAYEJ3NY.js.map → chunk-V7U6GMOJ.js.map} +0 -0
|
@@ -34607,43 +34607,13 @@ var PRIORITY_COLOR_CLASS = {
|
|
|
34607
34607
|
};
|
|
34608
34608
|
var MAX_VISIBLE_TAGS = 2;
|
|
34609
34609
|
var MAX_VISIBLE_ASSIGNEES = 3;
|
|
34610
|
-
|
|
34611
|
-
|
|
34612
|
-
columnId,
|
|
34613
|
-
columnColor,
|
|
34614
|
-
href,
|
|
34615
|
-
isOverlay = false,
|
|
34616
|
-
dragDisabled,
|
|
34617
|
-
approved = false,
|
|
34618
|
-
renderAssignSlot,
|
|
34619
|
-
onApprove,
|
|
34620
|
-
onReject
|
|
34621
|
-
}) {
|
|
34622
|
-
const sortableData = React103.useMemo(
|
|
34623
|
-
() => ({ columnId, type: "ticket" }),
|
|
34624
|
-
[columnId]
|
|
34625
|
-
);
|
|
34626
|
-
const sortable = useSortable({
|
|
34627
|
-
id: ticket.id,
|
|
34628
|
-
data: sortableData,
|
|
34629
|
-
disabled: dragDisabled
|
|
34630
|
-
});
|
|
34610
|
+
var TICKET_CARD_SHELL = "relative flex flex-col gap-[var(--spacing-system-sf)] rounded-md border border-ods-border bg-ods-bg p-[var(--spacing-system-sf)] select-none text-left";
|
|
34611
|
+
function TicketCardBody({ ticket, columnColor, renderAssignSlot, onApprove, onReject }) {
|
|
34631
34612
|
const showNewMessage = !!ticket.hasNewMessage && !!columnColor;
|
|
34632
34613
|
const newMessageTextColor = columnColor ? getReadableTextColor(columnColor) : void 0;
|
|
34633
|
-
const style = isOverlay ? {} : {
|
|
34634
|
-
transform: CSS.Transform.toString(sortable.transform),
|
|
34635
|
-
transition: sortable.transition
|
|
34636
|
-
};
|
|
34637
|
-
if (showNewMessage) style.borderColor = columnColor;
|
|
34638
34614
|
const showDeviceRow = !!(ticket.deviceHostnames?.length || ticket.organizationName);
|
|
34639
|
-
const deviceText = [
|
|
34640
|
-
|
|
34641
|
-
ticket.organizationName
|
|
34642
|
-
].filter(Boolean).join(", ");
|
|
34643
|
-
const handleClick = (e) => {
|
|
34644
|
-
if (sortable.isDragging) e.preventDefault();
|
|
34645
|
-
};
|
|
34646
|
-
const hasRightSection = !!(approved || ticket.priority || ticket.assignees?.length || renderAssignSlot);
|
|
34615
|
+
const deviceText = [ticket.deviceHostnames?.join(", "), ticket.organizationName].filter(Boolean).join(", ");
|
|
34616
|
+
const hasRightSection = !!(ticket.priority || ticket.assignees?.length || renderAssignSlot);
|
|
34647
34617
|
const rightSection = hasRightSection ? /* @__PURE__ */ jsxs206("div", { className: "pointer-events-auto flex shrink-0 items-center gap-[var(--spacing-system-xsf)]", children: [
|
|
34648
34618
|
ticket.priority && /* @__PURE__ */ jsx267(
|
|
34649
34619
|
Flag02Icon,
|
|
@@ -34652,15 +34622,6 @@ function TicketCard({
|
|
|
34652
34622
|
"aria-label": `Priority: ${ticket.priority}`
|
|
34653
34623
|
}
|
|
34654
34624
|
),
|
|
34655
|
-
approved && /* @__PURE__ */ jsx267(
|
|
34656
|
-
CheckCircleIcon,
|
|
34657
|
-
{
|
|
34658
|
-
size: 20,
|
|
34659
|
-
color: "var(--ods-attention-green-success)",
|
|
34660
|
-
className: "shrink-0",
|
|
34661
|
-
"aria-label": "Approved"
|
|
34662
|
-
}
|
|
34663
|
-
),
|
|
34664
34625
|
renderAssignSlot ? renderAssignSlot(ticket) : ticket.assignees?.length ? /* @__PURE__ */ jsxs206("div", { className: "flex -space-x-2", children: [
|
|
34665
34626
|
ticket.assignees.slice(0, MAX_VISIBLE_ASSIGNEES).map((a) => /* @__PURE__ */ jsx267(
|
|
34666
34627
|
SquareAvatar,
|
|
@@ -34681,7 +34642,7 @@ function TicketCard({
|
|
|
34681
34642
|
] }) : null;
|
|
34682
34643
|
const timestampLabel = ticket.createdAt ? formatTicketRelativeTime(ticket.createdAt) : null;
|
|
34683
34644
|
const tooltipLabel = ticket.createdAt ? formatTicketFullTimestamp(ticket.createdAt) : null;
|
|
34684
|
-
|
|
34645
|
+
return /* @__PURE__ */ jsxs206(Fragment47, { children: [
|
|
34685
34646
|
/* @__PURE__ */ jsxs206("div", { className: "flex items-start gap-[var(--spacing-system-sf)]", children: [
|
|
34686
34647
|
/* @__PURE__ */ jsxs206("div", { className: "flex min-w-0 flex-1 flex-col gap-[var(--spacing-system-zero)]", title: ticket.title, children: [
|
|
34687
34648
|
/* @__PURE__ */ jsx267("p", { className: "text-h3 truncate text-ods-text-primary", children: ticket.title }),
|
|
@@ -34706,17 +34667,55 @@ function TicketCard({
|
|
|
34706
34667
|
style: { backgroundColor: columnColor, color: newMessageTextColor }
|
|
34707
34668
|
}
|
|
34708
34669
|
),
|
|
34709
|
-
ticket.pendingApproval && /* @__PURE__ */ jsx267(
|
|
34710
|
-
BoardTicketApproval,
|
|
34711
|
-
{
|
|
34712
|
-
pendingApproval: ticket.pendingApproval,
|
|
34713
|
-
onApprove: onApprove ? (requestId) => onApprove(ticket.id, requestId) : void 0,
|
|
34714
|
-
onReject: onReject ? (requestId) => onReject(ticket.id, requestId) : void 0
|
|
34715
|
-
}
|
|
34716
|
-
)
|
|
34670
|
+
ticket.pendingApproval && /* @__PURE__ */ jsx267(BoardTicketApproval, { pendingApproval: ticket.pendingApproval, onApprove, onReject })
|
|
34717
34671
|
] });
|
|
34672
|
+
}
|
|
34673
|
+
function TicketCardView({ className, ...bodyProps }) {
|
|
34674
|
+
const { ticket, columnColor } = bodyProps;
|
|
34675
|
+
const showNewMessage = !!ticket.hasNewMessage && !!columnColor;
|
|
34676
|
+
return /* @__PURE__ */ jsx267(
|
|
34677
|
+
"div",
|
|
34678
|
+
{
|
|
34679
|
+
className: cn(TICKET_CARD_SHELL, className),
|
|
34680
|
+
style: showNewMessage ? { borderColor: columnColor } : void 0,
|
|
34681
|
+
children: /* @__PURE__ */ jsx267("div", { className: "relative z-10 flex flex-col gap-[var(--spacing-system-sf)]", children: /* @__PURE__ */ jsx267(TicketCardBody, { ...bodyProps }) })
|
|
34682
|
+
}
|
|
34683
|
+
);
|
|
34684
|
+
}
|
|
34685
|
+
function TicketCard({
|
|
34686
|
+
ticket,
|
|
34687
|
+
columnId,
|
|
34688
|
+
columnColor,
|
|
34689
|
+
href,
|
|
34690
|
+
isOverlay = false,
|
|
34691
|
+
dragDisabled,
|
|
34692
|
+
renderAssignSlot,
|
|
34693
|
+
onApprove,
|
|
34694
|
+
onReject
|
|
34695
|
+
}) {
|
|
34696
|
+
const sortableData = React103.useMemo(() => ({ columnId, type: "ticket" }), [columnId]);
|
|
34697
|
+
const sortable = useSortable({ id: ticket.id, data: sortableData, disabled: dragDisabled });
|
|
34698
|
+
const showNewMessage = !!ticket.hasNewMessage && !!columnColor;
|
|
34699
|
+
const style = isOverlay ? {} : {
|
|
34700
|
+
transform: CSS.Transform.toString(sortable.transform),
|
|
34701
|
+
transition: sortable.transition
|
|
34702
|
+
};
|
|
34703
|
+
if (showNewMessage) style.borderColor = columnColor;
|
|
34704
|
+
const handleClick = (e) => {
|
|
34705
|
+
if (sortable.isDragging) e.preventDefault();
|
|
34706
|
+
};
|
|
34707
|
+
const body = /* @__PURE__ */ jsx267(
|
|
34708
|
+
TicketCardBody,
|
|
34709
|
+
{
|
|
34710
|
+
ticket,
|
|
34711
|
+
columnColor,
|
|
34712
|
+
renderAssignSlot,
|
|
34713
|
+
onApprove: onApprove ? (requestId) => onApprove(ticket.id, requestId) : void 0,
|
|
34714
|
+
onReject: onReject ? (requestId) => onReject(ticket.id, requestId) : void 0
|
|
34715
|
+
}
|
|
34716
|
+
);
|
|
34718
34717
|
const cardClasses = cn(
|
|
34719
|
-
|
|
34718
|
+
TICKET_CARD_SHELL,
|
|
34720
34719
|
!dragDisabled && "cursor-pointer",
|
|
34721
34720
|
sortable.isDragging && !isOverlay && "opacity-40",
|
|
34722
34721
|
isOverlay && "rotate-1 shadow-card-hover"
|
|
@@ -35860,7 +35859,7 @@ function SlidingSidebar({ config }) {
|
|
|
35860
35859
|
const [mounted, setMounted] = useState85(false);
|
|
35861
35860
|
const headerHeight = useHeaderHeight();
|
|
35862
35861
|
const asideRef = useRef46(null);
|
|
35863
|
-
const
|
|
35862
|
+
const prefersReducedMotion2 = useReducedMotion();
|
|
35864
35863
|
usePreventScroll4({ isDisabled: !config.isOpen });
|
|
35865
35864
|
useFocusTrap(asideRef, config.isOpen, { onEscape: config.onClose, contain: false });
|
|
35866
35865
|
useEffect65(() => {
|
|
@@ -36003,7 +36002,7 @@ function SlidingSidebar({ config }) {
|
|
|
36003
36002
|
animate: {
|
|
36004
36003
|
x: config.isOpen ? 0 : config.position === "right" ? "100%" : "-100%"
|
|
36005
36004
|
},
|
|
36006
|
-
transition:
|
|
36005
|
+
transition: prefersReducedMotion2 ? { duration: 0 } : {
|
|
36007
36006
|
type: "spring",
|
|
36008
36007
|
damping: 25,
|
|
36009
36008
|
stiffness: 300,
|
|
@@ -47087,8 +47086,43 @@ function useChunkCatchup({
|
|
|
47087
47086
|
};
|
|
47088
47087
|
}
|
|
47089
47088
|
|
|
47089
|
+
// src/components/chat/hooks/use-scripted-stream.ts
|
|
47090
|
+
import { useEffect as useEffect77, useState as useState105 } from "react";
|
|
47091
|
+
var EMPTY_FRAME = { messages: [], phase: "idle", typing: false, delayMs: 0 };
|
|
47092
|
+
function prefersReducedMotion() {
|
|
47093
|
+
return typeof window !== "undefined" && window.matchMedia?.("(prefers-reduced-motion: reduce)").matches === true;
|
|
47094
|
+
}
|
|
47095
|
+
function useScriptedStream(frames, resetKey, enabled = true) {
|
|
47096
|
+
const [index, setIndex] = useState105(0);
|
|
47097
|
+
const [reducedMotion, setReducedMotion] = useState105(false);
|
|
47098
|
+
const [prevKey, setPrevKey] = useState105(resetKey);
|
|
47099
|
+
if (resetKey !== prevKey) {
|
|
47100
|
+
setPrevKey(resetKey);
|
|
47101
|
+
setIndex(0);
|
|
47102
|
+
}
|
|
47103
|
+
useEffect77(() => {
|
|
47104
|
+
setReducedMotion(prefersReducedMotion());
|
|
47105
|
+
const mq = window.matchMedia?.("(prefers-reduced-motion: reduce)");
|
|
47106
|
+
if (!mq) return;
|
|
47107
|
+
const onChange = () => setReducedMotion(mq.matches);
|
|
47108
|
+
mq.addEventListener("change", onChange);
|
|
47109
|
+
return () => mq.removeEventListener("change", onChange);
|
|
47110
|
+
}, []);
|
|
47111
|
+
const playing = enabled && !reducedMotion && frames.length > 0;
|
|
47112
|
+
const lastIndex = Math.max(0, frames.length - 1);
|
|
47113
|
+
useEffect77(() => {
|
|
47114
|
+
if (!playing || index >= lastIndex) return;
|
|
47115
|
+
const current = frames[Math.min(index, lastIndex)] ?? EMPTY_FRAME;
|
|
47116
|
+
const t = setTimeout(() => setIndex((i) => Math.min(i + 1, lastIndex)), current.delayMs);
|
|
47117
|
+
return () => clearTimeout(t);
|
|
47118
|
+
}, [index, frames, playing, lastIndex]);
|
|
47119
|
+
if (frames.length === 0) return EMPTY_FRAME;
|
|
47120
|
+
if (!playing) return frames[lastIndex];
|
|
47121
|
+
return frames[Math.min(index, lastIndex)] ?? EMPTY_FRAME;
|
|
47122
|
+
}
|
|
47123
|
+
|
|
47090
47124
|
// src/components/chat/hooks/use-jetstream-dialog-subscription.ts
|
|
47091
|
-
import { useEffect as
|
|
47125
|
+
import { useEffect as useEffect78, useRef as useRef64, useState as useState106 } from "react";
|
|
47092
47126
|
var DEFAULT_INACTIVE_THRESHOLD_MS = 5 * 6e4;
|
|
47093
47127
|
var DEFAULT_STREAM_NAME = "CHAT_CHUNKS";
|
|
47094
47128
|
function useJetStreamDialogSubscription({
|
|
@@ -47107,57 +47141,57 @@ function useJetStreamDialogSubscription({
|
|
|
47107
47141
|
reconnectionBackoff,
|
|
47108
47142
|
inactiveThresholdMs
|
|
47109
47143
|
}) {
|
|
47110
|
-
const [isConnected, setIsConnected] =
|
|
47111
|
-
const [isSubscribed, setIsSubscribed] =
|
|
47112
|
-
const [reconnectionCount, setReconnectionCount] =
|
|
47113
|
-
const [currentStreamSeq, setCurrentStreamSeq] =
|
|
47144
|
+
const [isConnected, setIsConnected] = useState106(false);
|
|
47145
|
+
const [isSubscribed, setIsSubscribed] = useState106(false);
|
|
47146
|
+
const [reconnectionCount, setReconnectionCount] = useState106(0);
|
|
47147
|
+
const [currentStreamSeq, setCurrentStreamSeq] = useState106(null);
|
|
47114
47148
|
const clientRef = useRef64(null);
|
|
47115
47149
|
const subscriptionRef = useRef64(null);
|
|
47116
47150
|
const highestStreamSeqRef = useRef64(null);
|
|
47117
47151
|
const onEventRef = useRef64(onEvent);
|
|
47118
|
-
|
|
47152
|
+
useEffect78(() => {
|
|
47119
47153
|
onEventRef.current = onEvent;
|
|
47120
47154
|
}, [onEvent]);
|
|
47121
47155
|
const onConnectRef = useRef64(onConnect);
|
|
47122
|
-
|
|
47156
|
+
useEffect78(() => {
|
|
47123
47157
|
onConnectRef.current = onConnect;
|
|
47124
47158
|
}, [onConnect]);
|
|
47125
47159
|
const onDisconnectRef = useRef64(onDisconnect);
|
|
47126
|
-
|
|
47160
|
+
useEffect78(() => {
|
|
47127
47161
|
onDisconnectRef.current = onDisconnect;
|
|
47128
47162
|
}, [onDisconnect]);
|
|
47129
47163
|
const onSubscribedRef = useRef64(onSubscribed);
|
|
47130
|
-
|
|
47164
|
+
useEffect78(() => {
|
|
47131
47165
|
onSubscribedRef.current = onSubscribed;
|
|
47132
47166
|
}, [onSubscribed]);
|
|
47133
47167
|
const onBeforeReconnectRef = useRef64(onBeforeReconnect);
|
|
47134
|
-
|
|
47168
|
+
useEffect78(() => {
|
|
47135
47169
|
onBeforeReconnectRef.current = onBeforeReconnect;
|
|
47136
47170
|
}, [onBeforeReconnect]);
|
|
47137
47171
|
const getNatsWsUrlRef = useRef64(getNatsWsUrl);
|
|
47138
|
-
|
|
47172
|
+
useEffect78(() => {
|
|
47139
47173
|
getNatsWsUrlRef.current = getNatsWsUrl;
|
|
47140
47174
|
}, [getNatsWsUrl]);
|
|
47141
47175
|
const reconnectionBackoffRef = useRef64(reconnectionBackoff);
|
|
47142
|
-
|
|
47176
|
+
useEffect78(() => {
|
|
47143
47177
|
reconnectionBackoffRef.current = reconnectionBackoff;
|
|
47144
47178
|
}, [reconnectionBackoff]);
|
|
47145
47179
|
const optStartSeqRef = useRef64(optStartSeq);
|
|
47146
|
-
|
|
47180
|
+
useEffect78(() => {
|
|
47147
47181
|
optStartSeqRef.current = optStartSeq;
|
|
47148
47182
|
}, [optStartSeq]);
|
|
47149
47183
|
const inactiveThresholdRef = useRef64(inactiveThresholdMs);
|
|
47150
|
-
|
|
47184
|
+
useEffect78(() => {
|
|
47151
47185
|
inactiveThresholdRef.current = inactiveThresholdMs;
|
|
47152
47186
|
}, [inactiveThresholdMs]);
|
|
47153
47187
|
const hadConnectionBeforeRef = useRef64(false);
|
|
47154
47188
|
const clientConfigRef = useRef64(clientConfig);
|
|
47155
|
-
|
|
47189
|
+
useEffect78(() => {
|
|
47156
47190
|
clientConfigRef.current = clientConfig;
|
|
47157
47191
|
}, [clientConfig]);
|
|
47158
47192
|
const currentWsUrlRef = useRef64("");
|
|
47159
47193
|
const wsUrl = getNatsWsUrl();
|
|
47160
|
-
|
|
47194
|
+
useEffect78(() => {
|
|
47161
47195
|
if (!enabled || !wsUrl) {
|
|
47162
47196
|
if (currentWsUrlRef.current && clientRef.current) {
|
|
47163
47197
|
releaseClient(currentWsUrlRef.current);
|
|
@@ -47238,7 +47272,7 @@ function useJetStreamDialogSubscription({
|
|
|
47238
47272
|
}
|
|
47239
47273
|
};
|
|
47240
47274
|
}, [enabled, wsUrl]);
|
|
47241
|
-
|
|
47275
|
+
useEffect78(() => {
|
|
47242
47276
|
if (!enabled || !dialogId || !isConnected) {
|
|
47243
47277
|
if (subscriptionRef.current) {
|
|
47244
47278
|
try {
|
|
@@ -47321,7 +47355,7 @@ function useJetStreamDialogSubscription({
|
|
|
47321
47355
|
setIsSubscribed(false);
|
|
47322
47356
|
};
|
|
47323
47357
|
}, [enabled, dialogId, isConnected, streamName, topic, reconnectionCount]);
|
|
47324
|
-
|
|
47358
|
+
useEffect78(() => {
|
|
47325
47359
|
highestStreamSeqRef.current = null;
|
|
47326
47360
|
setCurrentStreamSeq(null);
|
|
47327
47361
|
}, [dialogId]);
|
|
@@ -47329,7 +47363,7 @@ function useJetStreamDialogSubscription({
|
|
|
47329
47363
|
}
|
|
47330
47364
|
|
|
47331
47365
|
// src/components/chat/hooks/use-nats-dialog-subscription.ts
|
|
47332
|
-
import { useEffect as
|
|
47366
|
+
import { useEffect as useEffect79, useRef as useRef65, useState as useState107 } from "react";
|
|
47333
47367
|
function useNatsDialogSubscription({
|
|
47334
47368
|
enabled,
|
|
47335
47369
|
dialogId,
|
|
@@ -47343,47 +47377,47 @@ function useNatsDialogSubscription({
|
|
|
47343
47377
|
clientConfig = {},
|
|
47344
47378
|
reconnectionBackoff
|
|
47345
47379
|
}) {
|
|
47346
|
-
const [isConnected, setIsConnected] =
|
|
47347
|
-
const [isSubscribed, setIsSubscribed] =
|
|
47348
|
-
const [reconnectionCount, setReconnectionCount] =
|
|
47380
|
+
const [isConnected, setIsConnected] = useState107(false);
|
|
47381
|
+
const [isSubscribed, setIsSubscribed] = useState107(false);
|
|
47382
|
+
const [reconnectionCount, setReconnectionCount] = useState107(0);
|
|
47349
47383
|
const clientRef = useRef65(null);
|
|
47350
47384
|
const subscriptionRefs = useRef65(/* @__PURE__ */ new Map());
|
|
47351
47385
|
const onEventRef = useRef65(onEvent);
|
|
47352
|
-
|
|
47386
|
+
useEffect79(() => {
|
|
47353
47387
|
onEventRef.current = onEvent;
|
|
47354
47388
|
}, [onEvent]);
|
|
47355
47389
|
const onConnectRef = useRef65(onConnect);
|
|
47356
|
-
|
|
47390
|
+
useEffect79(() => {
|
|
47357
47391
|
onConnectRef.current = onConnect;
|
|
47358
47392
|
}, [onConnect]);
|
|
47359
47393
|
const onDisconnectRef = useRef65(onDisconnect);
|
|
47360
|
-
|
|
47394
|
+
useEffect79(() => {
|
|
47361
47395
|
onDisconnectRef.current = onDisconnect;
|
|
47362
47396
|
}, [onDisconnect]);
|
|
47363
47397
|
const onSubscribedRef = useRef65(onSubscribed);
|
|
47364
|
-
|
|
47398
|
+
useEffect79(() => {
|
|
47365
47399
|
onSubscribedRef.current = onSubscribed;
|
|
47366
47400
|
}, [onSubscribed]);
|
|
47367
47401
|
const onBeforeReconnectRef = useRef65(onBeforeReconnect);
|
|
47368
|
-
|
|
47402
|
+
useEffect79(() => {
|
|
47369
47403
|
onBeforeReconnectRef.current = onBeforeReconnect;
|
|
47370
47404
|
}, [onBeforeReconnect]);
|
|
47371
47405
|
const hadConnectionBeforeRef = useRef65(false);
|
|
47372
47406
|
const getNatsWsUrlRef = useRef65(getNatsWsUrl);
|
|
47373
|
-
|
|
47407
|
+
useEffect79(() => {
|
|
47374
47408
|
getNatsWsUrlRef.current = getNatsWsUrl;
|
|
47375
47409
|
}, [getNatsWsUrl]);
|
|
47376
47410
|
const reconnectionBackoffRef = useRef65(reconnectionBackoff);
|
|
47377
|
-
|
|
47411
|
+
useEffect79(() => {
|
|
47378
47412
|
reconnectionBackoffRef.current = reconnectionBackoff;
|
|
47379
47413
|
}, [reconnectionBackoff]);
|
|
47380
47414
|
const clientConfigRef = useRef65(clientConfig);
|
|
47381
|
-
|
|
47415
|
+
useEffect79(() => {
|
|
47382
47416
|
clientConfigRef.current = clientConfig;
|
|
47383
47417
|
}, [clientConfig]);
|
|
47384
47418
|
const currentWsUrlRef = useRef65("");
|
|
47385
47419
|
const wsUrl = getNatsWsUrl();
|
|
47386
|
-
|
|
47420
|
+
useEffect79(() => {
|
|
47387
47421
|
if (!enabled || !wsUrl) {
|
|
47388
47422
|
if (currentWsUrlRef.current && clientRef.current) {
|
|
47389
47423
|
releaseClient(currentWsUrlRef.current);
|
|
@@ -47467,12 +47501,12 @@ function useNatsDialogSubscription({
|
|
|
47467
47501
|
const topicsKey = topics.join(",");
|
|
47468
47502
|
const lastSubscribedDialogIdRef = useRef65(null);
|
|
47469
47503
|
const isConnectedRef = useRef65(isConnected);
|
|
47470
|
-
|
|
47504
|
+
useEffect79(() => {
|
|
47471
47505
|
isConnectedRef.current = isConnected;
|
|
47472
47506
|
}, [isConnected]);
|
|
47473
47507
|
const currentDialogIdRef = useRef65(null);
|
|
47474
47508
|
const abortControllerRef = useRef65(null);
|
|
47475
|
-
|
|
47509
|
+
useEffect79(() => {
|
|
47476
47510
|
currentDialogIdRef.current = dialogId;
|
|
47477
47511
|
if (!enabled || !dialogId) {
|
|
47478
47512
|
if (subscriptionRefs.current.size > 0) {
|
|
@@ -47553,7 +47587,7 @@ function useNatsDialogSubscription({
|
|
|
47553
47587
|
abortControllerRef.current = null;
|
|
47554
47588
|
};
|
|
47555
47589
|
}, [enabled, dialogId, topicsKey, topics]);
|
|
47556
|
-
|
|
47590
|
+
useEffect79(() => {
|
|
47557
47591
|
if (!enabled || !currentDialogIdRef.current || !isConnected) {
|
|
47558
47592
|
return;
|
|
47559
47593
|
}
|
|
@@ -47603,7 +47637,7 @@ function buildNatsWsUrl(apiBaseUrl, options) {
|
|
|
47603
47637
|
}
|
|
47604
47638
|
|
|
47605
47639
|
// src/components/chat/hooks/use-realtime-chunk-processor.ts
|
|
47606
|
-
import { useCallback as useCallback46, useRef as useRef66, useEffect as
|
|
47640
|
+
import { useCallback as useCallback46, useRef as useRef66, useEffect as useEffect80 } from "react";
|
|
47607
47641
|
|
|
47608
47642
|
// src/components/chat/utils/chunk-parser.ts
|
|
47609
47643
|
function normalizeToolCalls(raw) {
|
|
@@ -48261,7 +48295,7 @@ function useRealtimeChunkProcessor(options) {
|
|
|
48261
48295
|
})
|
|
48262
48296
|
);
|
|
48263
48297
|
const hasInitializedWithData = useRef66(false);
|
|
48264
|
-
|
|
48298
|
+
useEffect80(() => {
|
|
48265
48299
|
if (initialState && !hasInitializedWithData.current) {
|
|
48266
48300
|
accumulatorRef.current.initializeWithState(initialState);
|
|
48267
48301
|
if (initialState.escalatedApprovals) {
|
|
@@ -48279,7 +48313,7 @@ function useRealtimeChunkProcessor(options) {
|
|
|
48279
48313
|
const directModeFlagRef = useRef66(isDirectMode);
|
|
48280
48314
|
const sawDirectMessageRef = useRef66(false);
|
|
48281
48315
|
const directTeardownFiredRef = useRef66(false);
|
|
48282
|
-
|
|
48316
|
+
useEffect80(() => {
|
|
48283
48317
|
directModeFlagRef.current = isDirectMode;
|
|
48284
48318
|
}, [isDirectMode]);
|
|
48285
48319
|
const pendingEscalatedRef = useRef66(/* @__PURE__ */ new Map());
|
|
@@ -48546,7 +48580,7 @@ function useRealtimeChunkProcessor(options) {
|
|
|
48546
48580
|
}
|
|
48547
48581
|
|
|
48548
48582
|
// src/components/chat/hooks/use-slash-commands.ts
|
|
48549
|
-
import { useEffect as
|
|
48583
|
+
import { useEffect as useEffect81, useState as useState108 } from "react";
|
|
48550
48584
|
import { useQuery as useQuery2 } from "@tanstack/react-query";
|
|
48551
48585
|
async function fetchSlashCommands(prefix, signal, commandsUrl) {
|
|
48552
48586
|
try {
|
|
@@ -48563,9 +48597,9 @@ async function fetchSlashCommands(prefix, signal, commandsUrl) {
|
|
|
48563
48597
|
}
|
|
48564
48598
|
}
|
|
48565
48599
|
function useSlashCommands(prefix, commandsUrl) {
|
|
48566
|
-
const [commands, setCommands] =
|
|
48567
|
-
const [loading, setLoading] =
|
|
48568
|
-
|
|
48600
|
+
const [commands, setCommands] = useState108([]);
|
|
48601
|
+
const [loading, setLoading] = useState108(false);
|
|
48602
|
+
useEffect81(() => {
|
|
48569
48603
|
if (prefix == null) {
|
|
48570
48604
|
setCommands([]);
|
|
48571
48605
|
return;
|
|
@@ -48671,7 +48705,7 @@ function useEmptyStateConfig(emptyStateUrl, options) {
|
|
|
48671
48705
|
}
|
|
48672
48706
|
|
|
48673
48707
|
// src/components/chat/hooks/use-chat-attachments.ts
|
|
48674
|
-
import { useCallback as useCallback47, useMemo as useMemo41, useRef as useRef67, useState as
|
|
48708
|
+
import { useCallback as useCallback47, useMemo as useMemo41, useRef as useRef67, useState as useState109 } from "react";
|
|
48675
48709
|
import { fileTypeFromBlob } from "file-type";
|
|
48676
48710
|
var CHAT_ATTACHMENTS_BUCKET = "chat-attachments";
|
|
48677
48711
|
var CHAT_ATTACHMENTS_FOLDER = "chat";
|
|
@@ -48747,7 +48781,7 @@ function uploadWithProgress(url, file, token, onProgress, signal) {
|
|
|
48747
48781
|
function useChatAttachments() {
|
|
48748
48782
|
const runtime = useRequiredChatRuntime();
|
|
48749
48783
|
const uploadUrlEndpoint = runtime.endpoints.attachmentUploadUrl;
|
|
48750
|
-
const [attachments, setAttachments] =
|
|
48784
|
+
const [attachments, setAttachments] = useState109([]);
|
|
48751
48785
|
const controllersRef = useRef67(/* @__PURE__ */ new Map());
|
|
48752
48786
|
const updateOne = useCallback47((id, patch) => {
|
|
48753
48787
|
setAttachments((prev) => prev.map((a) => a.id === id ? { ...a, ...patch } : a));
|
|
@@ -48914,16 +48948,16 @@ function useChatAttachments() {
|
|
|
48914
48948
|
}
|
|
48915
48949
|
|
|
48916
48950
|
// src/components/chat/hooks/use-chat-attachment-image-gallery.tsx
|
|
48917
|
-
import { useCallback as useCallback48, useEffect as
|
|
48951
|
+
import { useCallback as useCallback48, useEffect as useEffect82, useRef as useRef68, useState as useState110 } from "react";
|
|
48918
48952
|
import { jsx as jsx358 } from "react/jsx-runtime";
|
|
48919
48953
|
var CLOSED = { isOpen: false, images: [], initialIndex: 0 };
|
|
48920
48954
|
function useChatAttachmentImageGallery() {
|
|
48921
48955
|
const runtime = useRequiredChatRuntime();
|
|
48922
48956
|
const viewUrlPrefix = runtime.endpoints.attachmentViewUrlPrefix;
|
|
48923
48957
|
const panelRef = useRef68(null);
|
|
48924
|
-
const [state, setState] =
|
|
48958
|
+
const [state, setState] = useState110(CLOSED);
|
|
48925
48959
|
const handleClose = useCallback48(() => setState(CLOSED), []);
|
|
48926
|
-
|
|
48960
|
+
useEffect82(() => {
|
|
48927
48961
|
const root = panelRef.current;
|
|
48928
48962
|
if (!root) return;
|
|
48929
48963
|
const onClick = (ev) => {
|
|
@@ -48969,7 +49003,7 @@ function absolutize(prefix) {
|
|
|
48969
49003
|
}
|
|
48970
49004
|
|
|
48971
49005
|
// src/components/chat/hooks/use-chat-identity.ts
|
|
48972
|
-
import { createContext as createContext12, createElement as createElement2, useContext as useContext12, useEffect as
|
|
49006
|
+
import { createContext as createContext12, createElement as createElement2, useContext as useContext12, useEffect as useEffect83, useState as useState111 } from "react";
|
|
48973
49007
|
var ANON_DEFAULTS = {
|
|
48974
49008
|
authTier: "anon",
|
|
48975
49009
|
source: null,
|
|
@@ -48980,9 +49014,9 @@ function useResolveChatIdentity(enabled) {
|
|
|
48980
49014
|
const runtime = useRequiredChatRuntime();
|
|
48981
49015
|
const url = runtime.endpoints.identityUrl;
|
|
48982
49016
|
const proxyEmail = getEmbedProxyAuth()?.email ?? null;
|
|
48983
|
-
const [data, setData] =
|
|
48984
|
-
const [isLoading, setIsLoading] =
|
|
48985
|
-
|
|
49017
|
+
const [data, setData] = useState111(ANON_DEFAULTS);
|
|
49018
|
+
const [isLoading, setIsLoading] = useState111(enabled);
|
|
49019
|
+
useEffect83(() => {
|
|
48986
49020
|
if (!enabled) return;
|
|
48987
49021
|
let cancelled = false;
|
|
48988
49022
|
const ctrl = new AbortController();
|
|
@@ -49024,11 +49058,11 @@ function useChatIdentity() {
|
|
|
49024
49058
|
}
|
|
49025
49059
|
|
|
49026
49060
|
// src/components/chat/hooks/use-close-on-navigation.ts
|
|
49027
|
-
import { useEffect as
|
|
49061
|
+
import { useEffect as useEffect84, useRef as useRef69 } from "react";
|
|
49028
49062
|
function useCloseOnNavigation(close, pathname) {
|
|
49029
49063
|
const prevPathnameRef = useRef69(null);
|
|
49030
49064
|
const initializedRef = useRef69(false);
|
|
49031
|
-
|
|
49065
|
+
useEffect84(() => {
|
|
49032
49066
|
if (!initializedRef.current) {
|
|
49033
49067
|
initializedRef.current = true;
|
|
49034
49068
|
prevPathnameRef.current = pathname;
|
|
@@ -49042,13 +49076,13 @@ function useCloseOnNavigation(close, pathname) {
|
|
|
49042
49076
|
}
|
|
49043
49077
|
|
|
49044
49078
|
// src/components/chat/hooks/use-chat.ts
|
|
49045
|
-
import { useState as
|
|
49079
|
+
import { useState as useState113, useCallback as useCallback50, useEffect as useEffect85, useRef as useRef71 } from "react";
|
|
49046
49080
|
|
|
49047
49081
|
// src/components/chat/hooks/use-sse.ts
|
|
49048
|
-
import { useState as
|
|
49082
|
+
import { useState as useState112, useCallback as useCallback49, useRef as useRef70 } from "react";
|
|
49049
49083
|
function useSSE({ useMock = true, debugMode = false, streamFn } = {}) {
|
|
49050
|
-
const [isStreaming, setIsStreaming] =
|
|
49051
|
-
const [error, setError] =
|
|
49084
|
+
const [isStreaming, setIsStreaming] = useState112(false);
|
|
49085
|
+
const [error, setError] = useState112(null);
|
|
49052
49086
|
const abortControllerRef = useRef70(null);
|
|
49053
49087
|
const fallbackStream = useCallback49(async function* () {
|
|
49054
49088
|
throw new Error(
|
|
@@ -49115,12 +49149,12 @@ function useChat({
|
|
|
49115
49149
|
initialMessages,
|
|
49116
49150
|
onMessagesChange
|
|
49117
49151
|
} = {}) {
|
|
49118
|
-
const [messages, setMessages] =
|
|
49119
|
-
const [isTyping, setIsTyping] =
|
|
49152
|
+
const [messages, setMessages] = useState113(() => initialMessages ?? []);
|
|
49153
|
+
const [isTyping, setIsTyping] = useState113(false);
|
|
49120
49154
|
const currentAssistantSegmentsRef = useRef71([]);
|
|
49121
49155
|
const onMessagesChangeRef = useRef71(onMessagesChange);
|
|
49122
49156
|
onMessagesChangeRef.current = onMessagesChange;
|
|
49123
|
-
|
|
49157
|
+
useEffect85(() => {
|
|
49124
49158
|
onMessagesChangeRef.current?.(messages);
|
|
49125
49159
|
}, [messages]);
|
|
49126
49160
|
const {
|
|
@@ -49409,7 +49443,7 @@ function useChat({
|
|
|
49409
49443
|
}
|
|
49410
49444
|
|
|
49411
49445
|
// src/components/chat/hooks/use-sse-chat-adapter.ts
|
|
49412
|
-
import { useState as
|
|
49446
|
+
import { useState as useState114, useEffect as useEffect86, useCallback as useCallback51, useMemo as useMemo42, useRef as useRef72 } from "react";
|
|
49413
49447
|
function createEmptyTurnMeta() {
|
|
49414
49448
|
return {
|
|
49415
49449
|
provider: null,
|
|
@@ -49744,8 +49778,8 @@ function useSseChatAdapter(options, runtimeOptions = {}) {
|
|
|
49744
49778
|
const metaMapRef = useRef72(/* @__PURE__ */ new Map());
|
|
49745
49779
|
const messagesRef = useRef72(persistedRef.current.messages);
|
|
49746
49780
|
const sendCountRef = useRef72(persistedRef.current.sendCount);
|
|
49747
|
-
const [streamingPhase, setStreamingPhase] =
|
|
49748
|
-
const [metaTick, setMetaTick] =
|
|
49781
|
+
const [streamingPhase, setStreamingPhase] = useState114("idle");
|
|
49782
|
+
const [metaTick, setMetaTick] = useState114(0);
|
|
49749
49783
|
const bumpMetaTick = useCallback51(() => setMetaTick((t) => t + 1), []);
|
|
49750
49784
|
const streamFn = useMemo42(
|
|
49751
49785
|
() => createDocStreamFn(
|
|
@@ -49933,7 +49967,7 @@ function useSseChatAdapter(options, runtimeOptions = {}) {
|
|
|
49933
49967
|
}
|
|
49934
49968
|
}
|
|
49935
49969
|
}, [chatClearMessages, source, bumpMetaTick]);
|
|
49936
|
-
|
|
49970
|
+
useEffect86(() => {
|
|
49937
49971
|
if (!isTyping && !isStreaming && streamingPhase !== "idle") {
|
|
49938
49972
|
setStreamingPhase("idle");
|
|
49939
49973
|
}
|
|
@@ -50015,10 +50049,10 @@ var noopRejectRequest = async (_id, _reason) => {
|
|
|
50015
50049
|
// src/components/chat/hooks/use-nats-chat-adapter.ts
|
|
50016
50050
|
import {
|
|
50017
50051
|
useCallback as useCallback52,
|
|
50018
|
-
useEffect as
|
|
50052
|
+
useEffect as useEffect87,
|
|
50019
50053
|
useMemo as useMemo43,
|
|
50020
50054
|
useRef as useRef73,
|
|
50021
|
-
useState as
|
|
50055
|
+
useState as useState115
|
|
50022
50056
|
} from "react";
|
|
50023
50057
|
|
|
50024
50058
|
// src/components/chat/utils/process-historical-messages.ts
|
|
@@ -50481,6 +50515,14 @@ function mapProcessedToUnified(processed) {
|
|
|
50481
50515
|
}
|
|
50482
50516
|
return out;
|
|
50483
50517
|
}
|
|
50518
|
+
function historicalToUnified(messages, options = {}) {
|
|
50519
|
+
const { messages: processed } = processHistoricalMessagesWithErrors(messages, options);
|
|
50520
|
+
const byId = new Map(processed.map((p) => [p.id, p]));
|
|
50521
|
+
return mapProcessedToUnified(processed).map((u) => {
|
|
50522
|
+
const p = byId.get(u.id);
|
|
50523
|
+
return p ? { ...u, name: p.name, avatar: p.avatar ?? null, authorType: p.authorType, timestamp: p.timestamp } : u;
|
|
50524
|
+
});
|
|
50525
|
+
}
|
|
50484
50526
|
function useNatsChatAdapter(config, options = {}) {
|
|
50485
50527
|
const { active = true } = options;
|
|
50486
50528
|
const {
|
|
@@ -50508,26 +50550,26 @@ function useNatsChatAdapter(config, options = {}) {
|
|
|
50508
50550
|
modelLabel = null
|
|
50509
50551
|
} = config;
|
|
50510
50552
|
const isManagedMode = fetchDialogs !== void 0;
|
|
50511
|
-
const [internalDialogId, setInternalDialogId] =
|
|
50553
|
+
const [internalDialogId, setInternalDialogId] = useState115(null);
|
|
50512
50554
|
const dialogId = isManagedMode ? internalDialogId : controlledDialogId !== void 0 ? controlledDialogId : null;
|
|
50513
|
-
const [messages, setMessages] =
|
|
50514
|
-
const [streamingPhase, setStreamingPhase] =
|
|
50555
|
+
const [messages, setMessages] = useState115([]);
|
|
50556
|
+
const [streamingPhase, setStreamingPhase] = useState115("idle");
|
|
50515
50557
|
const streamingPhaseRef = useRef73(streamingPhase);
|
|
50516
50558
|
streamingPhaseRef.current = streamingPhase;
|
|
50517
50559
|
const suppressAgentBusyRef = useRef73(false);
|
|
50518
|
-
const [approvalStatuses, setApprovalStatuses] =
|
|
50519
|
-
const [dialogs, setDialogs] =
|
|
50520
|
-
const [dialogsNextCursor, setDialogsNextCursor] =
|
|
50521
|
-
const [isDialogsLoading, setIsDialogsLoading] =
|
|
50522
|
-
const [dialogsError, setDialogsError] =
|
|
50523
|
-
const [isCreatingDialog, setIsCreatingDialog] =
|
|
50524
|
-
const [messagesNextCursor, setMessagesNextCursor] =
|
|
50525
|
-
const [isMessagesLoading, setIsMessagesLoading] =
|
|
50526
|
-
const [dialogTokenUsage, setDialogTokenUsage] =
|
|
50560
|
+
const [approvalStatuses, setApprovalStatuses] = useState115({});
|
|
50561
|
+
const [dialogs, setDialogs] = useState115([]);
|
|
50562
|
+
const [dialogsNextCursor, setDialogsNextCursor] = useState115(null);
|
|
50563
|
+
const [isDialogsLoading, setIsDialogsLoading] = useState115(false);
|
|
50564
|
+
const [dialogsError, setDialogsError] = useState115(false);
|
|
50565
|
+
const [isCreatingDialog, setIsCreatingDialog] = useState115(false);
|
|
50566
|
+
const [messagesNextCursor, setMessagesNextCursor] = useState115(null);
|
|
50567
|
+
const [isMessagesLoading, setIsMessagesLoading] = useState115(false);
|
|
50568
|
+
const [dialogTokenUsage, setDialogTokenUsage] = useState115(
|
|
50527
50569
|
null
|
|
50528
50570
|
);
|
|
50529
|
-
const [liveModel, setLiveModel] =
|
|
50530
|
-
const [connectionState, setConnectionState] =
|
|
50571
|
+
const [liveModel, setLiveModel] = useState115(null);
|
|
50572
|
+
const [connectionState, setConnectionState] = useState115("connecting");
|
|
50531
50573
|
const handleApprove = useCallback52(
|
|
50532
50574
|
async (requestId) => {
|
|
50533
50575
|
if (!approveRequestCallback) return;
|
|
@@ -50687,7 +50729,7 @@ function useNatsChatAdapter(config, options = {}) {
|
|
|
50687
50729
|
]
|
|
50688
50730
|
);
|
|
50689
50731
|
const prevDialogIdRef = useRef73(void 0);
|
|
50690
|
-
|
|
50732
|
+
useEffect87(() => {
|
|
50691
50733
|
if (prevDialogIdRef.current === dialogId) return;
|
|
50692
50734
|
prevDialogIdRef.current = dialogId;
|
|
50693
50735
|
historyLoadSeqRef.current += 1;
|
|
@@ -50701,7 +50743,7 @@ function useNatsChatAdapter(config, options = {}) {
|
|
|
50701
50743
|
if (!active || !dialogId) return;
|
|
50702
50744
|
void loadDialogHistory(dialogId);
|
|
50703
50745
|
}, [active, dialogId, loadDialogHistory, resetAccumulator]);
|
|
50704
|
-
|
|
50746
|
+
useEffect87(() => {
|
|
50705
50747
|
if (!active || !dialogId) return;
|
|
50706
50748
|
suppressAgentBusyRef.current = true;
|
|
50707
50749
|
resetChunkTracking();
|
|
@@ -50726,7 +50768,7 @@ function useNatsChatAdapter(config, options = {}) {
|
|
|
50726
50768
|
setConnectionState("connected");
|
|
50727
50769
|
}
|
|
50728
50770
|
});
|
|
50729
|
-
|
|
50771
|
+
useEffect87(() => {
|
|
50730
50772
|
if (!active || !dialogId) {
|
|
50731
50773
|
setConnectionState("connected");
|
|
50732
50774
|
return;
|
|
@@ -50765,7 +50807,7 @@ function useNatsChatAdapter(config, options = {}) {
|
|
|
50765
50807
|
const reloadDialogs = useCallback52(() => {
|
|
50766
50808
|
void loadDialogsPage();
|
|
50767
50809
|
}, [loadDialogsPage]);
|
|
50768
|
-
|
|
50810
|
+
useEffect87(() => {
|
|
50769
50811
|
if (!fetchDialogs) return;
|
|
50770
50812
|
if (!active) return;
|
|
50771
50813
|
if (initialDialogsLoadedRef.current) return;
|
|
@@ -51344,8 +51386,66 @@ function chatChipClass({ tone, density = "chip", extra }) {
|
|
|
51344
51386
|
return extra ? `${base} ${extra}` : base;
|
|
51345
51387
|
}
|
|
51346
51388
|
|
|
51389
|
+
// src/components/chat/utils/scripted-stream.ts
|
|
51390
|
+
function normalizeHistoricalMessageData(md) {
|
|
51391
|
+
return Array.isArray(md) ? md : md ? [md] : [];
|
|
51392
|
+
}
|
|
51393
|
+
function isHistoricalUserTurn(m) {
|
|
51394
|
+
return !!m.owner;
|
|
51395
|
+
}
|
|
51396
|
+
var isTextSegment = (d) => d?.type === "TEXT" && typeof d.text === "string";
|
|
51397
|
+
var THINK_MS = 550;
|
|
51398
|
+
var TOKEN_MS = 55;
|
|
51399
|
+
var USER_MS = 480;
|
|
51400
|
+
var SEGMENT_MS = 340;
|
|
51401
|
+
var POST_MS = 240;
|
|
51402
|
+
function tokenize(text) {
|
|
51403
|
+
return text.match(/\s*\S+\s*/g) ?? (text ? [text] : []);
|
|
51404
|
+
}
|
|
51405
|
+
function buildStreamFrames(messages) {
|
|
51406
|
+
const frames = [];
|
|
51407
|
+
const revealed = [];
|
|
51408
|
+
const push = (msgs, phase, typing, delayMs) => frames.push({ messages: msgs.slice(), phase, typing, delayMs });
|
|
51409
|
+
messages.forEach((msg) => {
|
|
51410
|
+
if (isHistoricalUserTurn(msg)) {
|
|
51411
|
+
revealed.push(msg);
|
|
51412
|
+
push(revealed, "idle", false, USER_MS);
|
|
51413
|
+
return;
|
|
51414
|
+
}
|
|
51415
|
+
if (revealed.length > 0) push(revealed, "thinking", true, THINK_MS);
|
|
51416
|
+
const segs = normalizeHistoricalMessageData(msg.messageData);
|
|
51417
|
+
const built = [];
|
|
51418
|
+
const emit = () => push([...revealed, { ...msg, messageData: [...built] }], "streaming", false, 0);
|
|
51419
|
+
segs.forEach((seg) => {
|
|
51420
|
+
if (isTextSegment(seg)) {
|
|
51421
|
+
const tokens = tokenize(seg.text);
|
|
51422
|
+
let acc = "";
|
|
51423
|
+
built.push({ ...seg, text: "" });
|
|
51424
|
+
tokens.forEach((tok) => {
|
|
51425
|
+
acc += tok;
|
|
51426
|
+
built[built.length - 1] = { ...seg, text: acc };
|
|
51427
|
+
push([...revealed, { ...msg, messageData: [...built] }], "streaming", false, TOKEN_MS);
|
|
51428
|
+
});
|
|
51429
|
+
built[built.length - 1] = { ...seg };
|
|
51430
|
+
} else {
|
|
51431
|
+
built.push(seg);
|
|
51432
|
+
emit();
|
|
51433
|
+
frames[frames.length - 1].delayMs = SEGMENT_MS;
|
|
51434
|
+
}
|
|
51435
|
+
});
|
|
51436
|
+
revealed.push(msg);
|
|
51437
|
+
push(revealed, "idle", false, POST_MS);
|
|
51438
|
+
});
|
|
51439
|
+
if (frames.length === 0) push(revealed, "idle", false, 0);
|
|
51440
|
+
const lastIdx = frames.length - 1;
|
|
51441
|
+
frames.forEach((f, i) => {
|
|
51442
|
+
f.typing = i < lastIdx;
|
|
51443
|
+
});
|
|
51444
|
+
return frames;
|
|
51445
|
+
}
|
|
51446
|
+
|
|
51347
51447
|
// src/components/chat/embeddable-chat.tsx
|
|
51348
|
-
import { useCallback as useCallback55, useEffect as
|
|
51448
|
+
import { useCallback as useCallback55, useEffect as useEffect88, useMemo as useMemo46, useRef as useRef75, useState as useState117 } from "react";
|
|
51349
51449
|
import * as DialogPrimitive4 from "@radix-ui/react-dialog";
|
|
51350
51450
|
import { usePreventScroll as usePreventScroll6 } from "@react-aria/overlays";
|
|
51351
51451
|
import { isIOS } from "@react-aria/utils";
|
|
@@ -51426,7 +51526,7 @@ init_button2();
|
|
|
51426
51526
|
import { FileText as FileText8, MessageSquare as MessageSquare3 } from "lucide-react";
|
|
51427
51527
|
|
|
51428
51528
|
// src/components/chat/hooks/use-chat-dialog-manager.ts
|
|
51429
|
-
import { useCallback as useCallback54, useMemo as useMemo45, useState as
|
|
51529
|
+
import { useCallback as useCallback54, useMemo as useMemo45, useState as useState116 } from "react";
|
|
51430
51530
|
function useChatDialogManager({
|
|
51431
51531
|
dialogs,
|
|
51432
51532
|
activeDialogId,
|
|
@@ -51437,8 +51537,8 @@ function useChatDialogManager({
|
|
|
51437
51537
|
fetchArchivedDialogs,
|
|
51438
51538
|
unarchiveDialog
|
|
51439
51539
|
}) {
|
|
51440
|
-
const [renameTarget, setRenameTarget] =
|
|
51441
|
-
const [archiveTarget, setArchiveTarget] =
|
|
51540
|
+
const [renameTarget, setRenameTarget] = useState116(null);
|
|
51541
|
+
const [archiveTarget, setArchiveTarget] = useState116(null);
|
|
51442
51542
|
const handleConfirmRename = useCallback54(
|
|
51443
51543
|
(name) => {
|
|
51444
51544
|
if (renameTarget) void renameDialog(renameTarget.id, name);
|
|
@@ -51461,10 +51561,10 @@ function useChatDialogManager({
|
|
|
51461
51561
|
}
|
|
51462
51562
|
setArchiveTarget(null);
|
|
51463
51563
|
}, [archiveTarget, archiveDialog, activeDialogId, clearMessages]);
|
|
51464
|
-
const [archiveOpen, setArchiveOpen] =
|
|
51465
|
-
const [archivedDialogs, setArchivedDialogs] =
|
|
51466
|
-
const [archivedCursor, setArchivedCursor] =
|
|
51467
|
-
const [archivedLoading, setArchivedLoading] =
|
|
51564
|
+
const [archiveOpen, setArchiveOpen] = useState116(false);
|
|
51565
|
+
const [archivedDialogs, setArchivedDialogs] = useState116([]);
|
|
51566
|
+
const [archivedCursor, setArchivedCursor] = useState116(null);
|
|
51567
|
+
const [archivedLoading, setArchivedLoading] = useState116(false);
|
|
51468
51568
|
const loadArchivedPage = useCallback54(
|
|
51469
51569
|
async (cursor) => {
|
|
51470
51570
|
if (!fetchArchivedDialogs) return;
|
|
@@ -51490,10 +51590,10 @@ function useChatDialogManager({
|
|
|
51490
51590
|
void loadArchivedPage();
|
|
51491
51591
|
}, [loadArchivedPage]);
|
|
51492
51592
|
const closeArchive = useCallback54(() => setArchiveOpen(false), []);
|
|
51493
|
-
const [viewingArchivedId, setViewingArchivedId] =
|
|
51593
|
+
const [viewingArchivedId, setViewingArchivedId] = useState116(
|
|
51494
51594
|
null
|
|
51495
51595
|
);
|
|
51496
|
-
const [openingDialogId, setOpeningDialogId] =
|
|
51596
|
+
const [openingDialogId, setOpeningDialogId] = useState116(null);
|
|
51497
51597
|
const handleSelectDialog = useCallback54(
|
|
51498
51598
|
(id) => {
|
|
51499
51599
|
setViewingArchivedId(null);
|
|
@@ -51512,7 +51612,7 @@ function useChatDialogManager({
|
|
|
51512
51612
|
},
|
|
51513
51613
|
[selectDialog]
|
|
51514
51614
|
);
|
|
51515
|
-
const [restoreTarget, setRestoreTarget] =
|
|
51615
|
+
const [restoreTarget, setRestoreTarget] = useState116(null);
|
|
51516
51616
|
const handleConfirmRestore = useCallback54(async () => {
|
|
51517
51617
|
if (restoreTarget) {
|
|
51518
51618
|
try {
|
|
@@ -51764,7 +51864,7 @@ function SourceChips({
|
|
|
51764
51864
|
onClose,
|
|
51765
51865
|
onDiscuss
|
|
51766
51866
|
}) {
|
|
51767
|
-
const [expanded, setExpanded] =
|
|
51867
|
+
const [expanded, setExpanded] = useState117(false);
|
|
51768
51868
|
if (cited.length === 0) {
|
|
51769
51869
|
const fallback = uncited.slice(0, FALLBACK_TOP_RETRIEVED);
|
|
51770
51870
|
if (fallback.length === 0) return null;
|
|
@@ -51870,7 +51970,7 @@ function EmbeddableChatInner({
|
|
|
51870
51970
|
const commandsUrl = runtime.endpoints.commandsUrl;
|
|
51871
51971
|
const { attachmentsEnabled, user: identityUser } = useChatIdentity();
|
|
51872
51972
|
const viewUrlPrefix = runtime.endpoints.attachmentViewUrlPrefix;
|
|
51873
|
-
|
|
51973
|
+
useEffect88(() => {
|
|
51874
51974
|
if (process.env.NODE_ENV !== "production") {
|
|
51875
51975
|
const hasOpen = open !== void 0;
|
|
51876
51976
|
const hasHandler = onOpenChange !== void 0;
|
|
@@ -51886,13 +51986,13 @@ function EmbeddableChatInner({
|
|
|
51886
51986
|
defaultProp: defaultOpen ?? false,
|
|
51887
51987
|
onChange: onOpenChange
|
|
51888
51988
|
});
|
|
51889
|
-
const [autoFocusInput] =
|
|
51989
|
+
const [autoFocusInput] = useState117(() => {
|
|
51890
51990
|
if (typeof window === "undefined") return false;
|
|
51891
51991
|
return !window.matchMedia("(pointer: coarse)").matches;
|
|
51892
51992
|
});
|
|
51893
51993
|
usePreventScroll6({ isDisabled: !isOpen || shellLess });
|
|
51894
51994
|
const navigatingAwayRef = useRef75(false);
|
|
51895
|
-
|
|
51995
|
+
useEffect88(() => {
|
|
51896
51996
|
if (!isOpen) return;
|
|
51897
51997
|
if (shellLess) return;
|
|
51898
51998
|
if (typeof window === "undefined") return;
|
|
@@ -51919,7 +52019,7 @@ function EmbeddableChatInner({
|
|
|
51919
52019
|
};
|
|
51920
52020
|
}, [isOpen, shellLess]);
|
|
51921
52021
|
const chatInputRef = useRef75(null);
|
|
51922
|
-
const [quickActionPreview, setQuickActionPreview] =
|
|
52022
|
+
const [quickActionPreview, setQuickActionPreview] = useState117(null);
|
|
51923
52023
|
const slashCommandsProp = useMemo46(
|
|
51924
52024
|
() => ({
|
|
51925
52025
|
fetchCommands: (prefix, signal) => fetchSlashCommands(prefix, signal, commandsUrl),
|
|
@@ -51962,7 +52062,7 @@ function EmbeddableChatInner({
|
|
|
51962
52062
|
}, [mingoState, mingoDialogCapabilities, effectiveModes]);
|
|
51963
52063
|
const hasMingoMode = !!effectiveModes.mingo || !!mingoState;
|
|
51964
52064
|
const initialActiveMode = controlledActiveMode ?? defaultActiveMode ?? (effectiveModes.guide ? "guide" : "mingo");
|
|
51965
|
-
const [uncontrolledActiveMode, setUncontrolledActiveMode] =
|
|
52065
|
+
const [uncontrolledActiveMode, setUncontrolledActiveMode] = useState117(initialActiveMode);
|
|
51966
52066
|
const activeMode = controlledActiveMode ?? uncontrolledActiveMode;
|
|
51967
52067
|
const handleActiveModeChange = useCallback55(
|
|
51968
52068
|
(next) => {
|
|
@@ -52023,7 +52123,7 @@ function EmbeddableChatInner({
|
|
|
52023
52123
|
loadMoreMessages
|
|
52024
52124
|
} = useUnifiedChat({ modes: effectiveModes, activeMode, mingoStateOverride: mingoState });
|
|
52025
52125
|
const guidePromptSentRef = useRef75(false);
|
|
52026
|
-
|
|
52126
|
+
useEffect88(() => {
|
|
52027
52127
|
if (!guidePendingPrompt) {
|
|
52028
52128
|
guidePromptSentRef.current = false;
|
|
52029
52129
|
return;
|
|
@@ -52044,15 +52144,15 @@ function EmbeddableChatInner({
|
|
|
52044
52144
|
const { panelRef: galleryPanelRef, modal: galleryModal } = useChatAttachmentImageGallery();
|
|
52045
52145
|
const contextMaxItems = contextPicker?.maxItems ?? 10;
|
|
52046
52146
|
const contextPickerForMode = activeMode === "mingo" ? contextPicker : void 0;
|
|
52047
|
-
const [contextItems, setContextItems] =
|
|
52048
|
-
const [contextPickerOpen, setContextPickerOpen] =
|
|
52049
|
-
const [mentionQuery, setMentionQuery] =
|
|
52147
|
+
const [contextItems, setContextItems] = useState117([]);
|
|
52148
|
+
const [contextPickerOpen, setContextPickerOpen] = useState117(false);
|
|
52149
|
+
const [mentionQuery, setMentionQuery] = useState117(null);
|
|
52050
52150
|
const mentionActiveRef = useRef75(false);
|
|
52051
|
-
|
|
52151
|
+
useEffect88(() => {
|
|
52052
52152
|
mentionActiveRef.current = mentionQuery !== null;
|
|
52053
52153
|
}, [mentionQuery]);
|
|
52054
52154
|
const mentionKeysRef = useRef75(/* @__PURE__ */ new Set());
|
|
52055
|
-
|
|
52155
|
+
useEffect88(() => {
|
|
52056
52156
|
setContextItems([]);
|
|
52057
52157
|
setMentionQuery(null);
|
|
52058
52158
|
mentionKeysRef.current.clear();
|
|
@@ -52273,7 +52373,7 @@ function EmbeddableChatInner({
|
|
|
52273
52373
|
});
|
|
52274
52374
|
const handleOpen = useCallback55(() => setIsOpen(true), [setIsOpen]);
|
|
52275
52375
|
useCloseOnNavigation(handleNavigationClose, null);
|
|
52276
|
-
|
|
52376
|
+
useEffect88(() => {
|
|
52277
52377
|
const handler = (e) => {
|
|
52278
52378
|
const detail = e.detail;
|
|
52279
52379
|
if (!detail || detail.source !== source) return;
|
|
@@ -52283,7 +52383,7 @@ function EmbeddableChatInner({
|
|
|
52283
52383
|
window.addEventListener("ask-ai:open-with-ref", handler);
|
|
52284
52384
|
return () => window.removeEventListener("ask-ai:open-with-ref", handler);
|
|
52285
52385
|
}, [source, discussRef, setIsOpen]);
|
|
52286
|
-
|
|
52386
|
+
useEffect88(() => {
|
|
52287
52387
|
const handler = (e) => {
|
|
52288
52388
|
const detail = e.detail;
|
|
52289
52389
|
if (!detail || detail.source !== source) return;
|
|
@@ -52300,7 +52400,7 @@ function EmbeddableChatInner({
|
|
|
52300
52400
|
const contentViewKey = hasConversation ? "conversation" : activeMode;
|
|
52301
52401
|
const isGuideEmpty = !hasConversation && activeMode === "guide";
|
|
52302
52402
|
const isQuickActionEmpty = !hasConversation && (activeMode === "guide" || activeMode === "mingo");
|
|
52303
|
-
|
|
52403
|
+
useEffect88(() => {
|
|
52304
52404
|
if (!isQuickActionEmpty) setQuickActionPreview(null);
|
|
52305
52405
|
}, [isQuickActionEmpty]);
|
|
52306
52406
|
const guideCanReturnToMingo = isGuideEmpty && hasMingoMode;
|
|
@@ -52342,7 +52442,7 @@ function EmbeddableChatInner({
|
|
|
52342
52442
|
const uncited = sources.filter((s) => !seenOrder.has(s.index));
|
|
52343
52443
|
return { cited, uncited };
|
|
52344
52444
|
}, [lastAssistantMsg, chatLoading]);
|
|
52345
|
-
const [portalHost, setPortalHost] =
|
|
52445
|
+
const [portalHost, setPortalHost] = useState117(null);
|
|
52346
52446
|
const body = /* @__PURE__ */ jsxs286(PortalContainerContext.Provider, { value: portalHost, children: [
|
|
52347
52447
|
/* @__PURE__ */ jsx361(
|
|
52348
52448
|
"div",
|
|
@@ -53198,6 +53298,7 @@ export {
|
|
|
53198
53298
|
normalizeContent2 as normalizeContent,
|
|
53199
53299
|
NETWORK_CONFIG,
|
|
53200
53300
|
useChunkCatchup,
|
|
53301
|
+
useScriptedStream,
|
|
53201
53302
|
useJetStreamDialogSubscription,
|
|
53202
53303
|
useNatsDialogSubscription,
|
|
53203
53304
|
buildNatsWsUrl,
|
|
@@ -53236,6 +53337,7 @@ export {
|
|
|
53236
53337
|
extractErrorMessages,
|
|
53237
53338
|
processHistoricalMessagesWithErrors,
|
|
53238
53339
|
mapProcessedToUnified,
|
|
53340
|
+
historicalToUnified,
|
|
53239
53341
|
useNatsChatAdapter,
|
|
53240
53342
|
useUnifiedChat,
|
|
53241
53343
|
extractIncompleteMessageState,
|
|
@@ -53247,6 +53349,9 @@ export {
|
|
|
53247
53349
|
CHIP_ACTION_BUTTON_CLASS,
|
|
53248
53350
|
chatChipClass,
|
|
53249
53351
|
clickupTaskUrl,
|
|
53352
|
+
normalizeHistoricalMessageData,
|
|
53353
|
+
isHistoricalUserTurn,
|
|
53354
|
+
buildStreamFrames,
|
|
53250
53355
|
EmbeddableChat,
|
|
53251
53356
|
FilterCheckboxItem,
|
|
53252
53357
|
TagKeyValueFilter,
|
|
@@ -53546,6 +53651,8 @@ export {
|
|
|
53546
53651
|
BoardColumnHeader,
|
|
53547
53652
|
tintOnDark,
|
|
53548
53653
|
BoardTicketApproval,
|
|
53654
|
+
TicketCardBody,
|
|
53655
|
+
TicketCardView,
|
|
53549
53656
|
TicketCard,
|
|
53550
53657
|
TicketCardSkeleton,
|
|
53551
53658
|
BoardColumn,
|
|
@@ -53646,4 +53753,4 @@ export {
|
|
|
53646
53753
|
LogsList,
|
|
53647
53754
|
assets
|
|
53648
53755
|
};
|
|
53649
|
-
//# sourceMappingURL=chunk-
|
|
53756
|
+
//# sourceMappingURL=chunk-EHOMVEUE.js.map
|