@mastra/playground-ui 66.0.0-alpha.5 → 66.0.0-alpha.7
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/AttachmentCard-CciBqu7E.cjs +66 -0
- package/dist/AttachmentCard-CciBqu7E.cjs.map +1 -0
- package/dist/AttachmentCard-DbGp7TYl.js +61 -0
- package/dist/AttachmentCard-DbGp7TYl.js.map +1 -0
- package/dist/components/AttachmentCard.cjs.js +1 -1
- package/dist/components/AttachmentCard.es.js +1 -1
- package/dist/domains/chat/attachments/message-attachment.cjs.js +1 -1
- package/dist/domains/chat/attachments/message-attachment.es.js +1 -1
- package/dist/domains/chat/attachments/message-image-attachment.cjs.js +1 -1
- package/dist/domains/chat/attachments/message-image-attachment.es.js +1 -1
- package/dist/domains/threads/components/threads-explorer-body.cjs.js +2 -0
- package/dist/domains/threads/components/threads-explorer-body.cjs.js.map +1 -1
- package/dist/domains/threads/components/threads-explorer-body.es.js +2 -0
- package/dist/domains/threads/components/threads-explorer-body.es.js.map +1 -1
- package/dist/domains/threads/thread-filters.cjs.js +5 -3
- package/dist/domains/threads/thread-filters.cjs.js.map +1 -1
- package/dist/domains/threads/thread-filters.es.js +5 -3
- package/dist/domains/threads/thread-filters.es.js.map +1 -1
- package/dist/domains/threads/thread-list-row.cjs.js +1 -0
- package/dist/domains/threads/thread-list-row.cjs.js.map +1 -1
- package/dist/domains/threads/thread-list-row.es.js +1 -0
- package/dist/domains/threads/thread-list-row.es.js.map +1 -1
- package/dist/domains/traces/components/trace-columns-menu.cjs.js +1 -0
- package/dist/domains/traces/components/trace-columns-menu.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-columns-menu.es.js +1 -0
- package/dist/domains/traces/components/trace-columns-menu.es.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view.cjs.js +6 -0
- package/dist/domains/traces/components/traces-list-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view.es.js +6 -0
- package/dist/domains/traces/components/traces-list-view.es.js.map +1 -1
- package/dist/domains/traces/trace-list-columns.cjs.js +9 -0
- package/dist/domains/traces/trace-list-columns.cjs.js.map +1 -1
- package/dist/domains/traces/trace-list-columns.es.js +9 -1
- package/dist/domains/traces/trace-list-columns.es.js.map +1 -1
- package/dist/src/domains/traces/components/traces-list-view.d.ts +2 -0
- package/dist/src/domains/traces/trace-list-columns.d.ts +3 -1
- package/dist/style.css +0 -99
- package/package.json +8 -8
- package/dist/AttachmentCard-B1fhYov_.cjs +0 -81
- package/dist/AttachmentCard-B1fhYov_.cjs.map +0 -1
- package/dist/AttachmentCard-lKP83CZ-.js +0 -76
- package/dist/AttachmentCard-lKP83CZ-.js.map +0 -1
- package/dist/src/ds/components/AttachmentCard/attachment-preview.d.ts +0 -5
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
const require_utils = require("./utils-uDc1ofX1.cjs");
|
|
2
|
+
const require_Txt = require("./Txt-BnoSqxKE.cjs");
|
|
3
|
+
const require_primitives_message_surface = require("./primitives/message-surface.cjs.js");
|
|
4
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
5
|
+
// src/ds/components/AttachmentCard/attachment-card.tsx
|
|
6
|
+
/** Sent-file presentation. Upload state and removal controls belong to the composer. */
|
|
7
|
+
function AttachmentCard({ name, typeLabel, icon, preview, onClick, href, buttonRef }) {
|
|
8
|
+
const className = require_utils.cn(require_primitives_message_surface.messageSurfaceStyle, "relative isolate block w-64 max-w-full min-w-0 overflow-hidden text-left", (onClick || href) && "cursor-pointer hover:bg-fill-hover focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-border-focus motion-safe:transition-colors");
|
|
9
|
+
const content = /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [preview && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
10
|
+
className: "block h-44 overflow-hidden border-b border-border bg-fill",
|
|
11
|
+
children: preview
|
|
12
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
13
|
+
className: "flex min-w-0 items-center gap-2.5 px-3 py-2.5",
|
|
14
|
+
children: [!preview && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
15
|
+
className: "flex size-5 shrink-0 items-center justify-center text-muted-foreground",
|
|
16
|
+
"aria-hidden": "true",
|
|
17
|
+
children: icon
|
|
18
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
19
|
+
className: "min-w-0 flex-1",
|
|
20
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Txt.Txt, {
|
|
21
|
+
as: "span",
|
|
22
|
+
variant: "body-sm",
|
|
23
|
+
className: "block truncate",
|
|
24
|
+
title: name,
|
|
25
|
+
children: name
|
|
26
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Txt.Txt, {
|
|
27
|
+
as: "span",
|
|
28
|
+
variant: "meta",
|
|
29
|
+
tone: "muted",
|
|
30
|
+
className: "block truncate",
|
|
31
|
+
children: typeLabel
|
|
32
|
+
})]
|
|
33
|
+
})]
|
|
34
|
+
})] });
|
|
35
|
+
if (onClick) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
36
|
+
ref: buttonRef,
|
|
37
|
+
type: "button",
|
|
38
|
+
className,
|
|
39
|
+
onClick,
|
|
40
|
+
"aria-label": `Preview ${name}`,
|
|
41
|
+
title: name,
|
|
42
|
+
children: content
|
|
43
|
+
});
|
|
44
|
+
if (href) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
|
|
45
|
+
className,
|
|
46
|
+
href,
|
|
47
|
+
target: "_blank",
|
|
48
|
+
rel: "noreferrer noopener",
|
|
49
|
+
"aria-label": `Open ${name}`,
|
|
50
|
+
title: name,
|
|
51
|
+
children: content
|
|
52
|
+
});
|
|
53
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
54
|
+
className,
|
|
55
|
+
title: name,
|
|
56
|
+
children: content
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
Object.defineProperty(exports, "AttachmentCard", {
|
|
60
|
+
enumerable: true,
|
|
61
|
+
get: function() {
|
|
62
|
+
return AttachmentCard;
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
//# sourceMappingURL=AttachmentCard-CciBqu7E.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AttachmentCard-CciBqu7E.cjs","names":["cn","messageSurfaceStyle","_Fragment","Txt"],"sources":["../src/ds/components/AttachmentCard/attachment-card.tsx"],"sourcesContent":["import type { ReactNode, Ref } from 'react';\nimport { Txt } from '../Txt';\nimport { messageSurfaceStyle } from '@/ds/primitives/message-surface';\nimport { cn } from '@/lib/utils';\n\nexport interface AttachmentCardProps {\n name: string;\n buttonRef?: Ref<HTMLButtonElement>;\n typeLabel: string;\n icon: ReactNode;\n preview?: ReactNode;\n onClick?: () => void;\n href?: string;\n}\n\n/** Sent-file presentation. Upload state and removal controls belong to the composer. */\nexport function AttachmentCard({ name, typeLabel, icon, preview, onClick, href, buttonRef }: AttachmentCardProps) {\n const className = cn(\n messageSurfaceStyle,\n 'relative isolate block w-64 max-w-full min-w-0 overflow-hidden text-left',\n (onClick || href) &&\n 'cursor-pointer hover:bg-fill-hover focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-border-focus motion-safe:transition-colors',\n );\n const content = (\n <>\n {preview && <span className=\"block h-44 overflow-hidden border-b border-border bg-fill\">{preview}</span>}\n <span className=\"flex min-w-0 items-center gap-2.5 px-3 py-2.5\">\n {!preview && (\n <span className=\"flex size-5 shrink-0 items-center justify-center text-muted-foreground\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span className=\"min-w-0 flex-1\">\n <Txt as=\"span\" variant=\"body-sm\" className=\"block truncate\" title={name}>\n {name}\n </Txt>\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\" className=\"block truncate\">\n {typeLabel}\n </Txt>\n </span>\n </span>\n </>\n );\n\n if (onClick) {\n return (\n <button\n ref={buttonRef}\n type=\"button\"\n className={className}\n onClick={onClick}\n aria-label={`Preview ${name}`}\n title={name}\n >\n {content}\n </button>\n );\n }\n if (href) {\n return (\n <a\n className={className}\n href={href}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n aria-label={`Open ${name}`}\n title={name}\n >\n {content}\n </a>\n );\n }\n return (\n <div className={className} title={name}>\n {content}\n </div>\n );\n}\n"],"mappings":";;;;;;AAgBA,SAAgB,eAAe,EAAE,MAAM,WAAW,MAAM,SAAS,SAAS,MAAM,aAAkC;CAChH,MAAM,YAAYA,cAAAA,GAChBC,mCAAAA,qBACA,6EACC,WAAW,SACV,4JACJ;CACA,MAAM,UACJ,iBAAA,GAAA,kBAAA,KAAA,CAAAC,kBAAAA,UAAA,EAAA,UAAA,CACG,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;EAAM,WAAU;EAA6D,UAAA;CAAc,CAAA,GACvG,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;EAAM,WAAU;EAAhB,UAAA,CACG,CAAC,WACA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;GAAM,WAAU;GAAyE,eAAY;GAClG,UAAA;EACG,CAAA,GAER,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;GAAM,WAAU;GAAhB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,YAAAA,KAAD;IAAK,IAAG;IAAO,SAAQ;IAAU,WAAU;IAAiB,OAAO;IAChE,UAAA;GACE,CAAA,GACL,iBAAA,GAAA,kBAAA,IAAA,CAACA,YAAAA,KAAD;IAAK,IAAG;IAAO,SAAQ;IAAO,MAAK;IAAQ,WAAU;IAClD,UAAA;GACE,CAAA,CACD;EACF,CAAA,CAAA;CACN,CAAA,CAAA,EAAA,CAAA;CAGJ,IAAI,SACF,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;EACE,KAAK;EACL,MAAK;EACM;EACF;EACT,cAAY,WAAW;EACvB,OAAO;EAEN,UAAA;CACK,CAAA;CAGZ,IAAI,MACF,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;EACa;EACL;EACN,QAAO;EACP,KAAI;EACJ,cAAY,QAAQ;EACpB,OAAO;EAEN,UAAA;CACA,CAAA;CAGP,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAgB;EAAW,OAAO;EAC/B,UAAA;CACE,CAAA;AAET"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { t as cn } from "./utils-DQx8TpNT.js";
|
|
2
|
+
import { t as Txt } from "./Txt-BM6TVV_c.js";
|
|
3
|
+
import { messageSurfaceStyle } from "./primitives/message-surface.es.js";
|
|
4
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
// src/ds/components/AttachmentCard/attachment-card.tsx
|
|
6
|
+
/** Sent-file presentation. Upload state and removal controls belong to the composer. */
|
|
7
|
+
function AttachmentCard({ name, typeLabel, icon, preview, onClick, href, buttonRef }) {
|
|
8
|
+
const className = cn(messageSurfaceStyle, "relative isolate block w-64 max-w-full min-w-0 overflow-hidden text-left", (onClick || href) && "cursor-pointer hover:bg-fill-hover focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-border-focus motion-safe:transition-colors");
|
|
9
|
+
const content = /* @__PURE__ */ jsxs(Fragment, { children: [preview && /* @__PURE__ */ jsx("span", {
|
|
10
|
+
className: "block h-44 overflow-hidden border-b border-border bg-fill",
|
|
11
|
+
children: preview
|
|
12
|
+
}), /* @__PURE__ */ jsxs("span", {
|
|
13
|
+
className: "flex min-w-0 items-center gap-2.5 px-3 py-2.5",
|
|
14
|
+
children: [!preview && /* @__PURE__ */ jsx("span", {
|
|
15
|
+
className: "flex size-5 shrink-0 items-center justify-center text-muted-foreground",
|
|
16
|
+
"aria-hidden": "true",
|
|
17
|
+
children: icon
|
|
18
|
+
}), /* @__PURE__ */ jsxs("span", {
|
|
19
|
+
className: "min-w-0 flex-1",
|
|
20
|
+
children: [/* @__PURE__ */ jsx(Txt, {
|
|
21
|
+
as: "span",
|
|
22
|
+
variant: "body-sm",
|
|
23
|
+
className: "block truncate",
|
|
24
|
+
title: name,
|
|
25
|
+
children: name
|
|
26
|
+
}), /* @__PURE__ */ jsx(Txt, {
|
|
27
|
+
as: "span",
|
|
28
|
+
variant: "meta",
|
|
29
|
+
tone: "muted",
|
|
30
|
+
className: "block truncate",
|
|
31
|
+
children: typeLabel
|
|
32
|
+
})]
|
|
33
|
+
})]
|
|
34
|
+
})] });
|
|
35
|
+
if (onClick) return /* @__PURE__ */ jsx("button", {
|
|
36
|
+
ref: buttonRef,
|
|
37
|
+
type: "button",
|
|
38
|
+
className,
|
|
39
|
+
onClick,
|
|
40
|
+
"aria-label": `Preview ${name}`,
|
|
41
|
+
title: name,
|
|
42
|
+
children: content
|
|
43
|
+
});
|
|
44
|
+
if (href) return /* @__PURE__ */ jsx("a", {
|
|
45
|
+
className,
|
|
46
|
+
href,
|
|
47
|
+
target: "_blank",
|
|
48
|
+
rel: "noreferrer noopener",
|
|
49
|
+
"aria-label": `Open ${name}`,
|
|
50
|
+
title: name,
|
|
51
|
+
children: content
|
|
52
|
+
});
|
|
53
|
+
return /* @__PURE__ */ jsx("div", {
|
|
54
|
+
className,
|
|
55
|
+
title: name,
|
|
56
|
+
children: content
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
export { AttachmentCard as t };
|
|
60
|
+
|
|
61
|
+
//# sourceMappingURL=AttachmentCard-DbGp7TYl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AttachmentCard-DbGp7TYl.js","names":["_Fragment"],"sources":["../src/ds/components/AttachmentCard/attachment-card.tsx"],"sourcesContent":["import type { ReactNode, Ref } from 'react';\nimport { Txt } from '../Txt';\nimport { messageSurfaceStyle } from '@/ds/primitives/message-surface';\nimport { cn } from '@/lib/utils';\n\nexport interface AttachmentCardProps {\n name: string;\n buttonRef?: Ref<HTMLButtonElement>;\n typeLabel: string;\n icon: ReactNode;\n preview?: ReactNode;\n onClick?: () => void;\n href?: string;\n}\n\n/** Sent-file presentation. Upload state and removal controls belong to the composer. */\nexport function AttachmentCard({ name, typeLabel, icon, preview, onClick, href, buttonRef }: AttachmentCardProps) {\n const className = cn(\n messageSurfaceStyle,\n 'relative isolate block w-64 max-w-full min-w-0 overflow-hidden text-left',\n (onClick || href) &&\n 'cursor-pointer hover:bg-fill-hover focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-border-focus motion-safe:transition-colors',\n );\n const content = (\n <>\n {preview && <span className=\"block h-44 overflow-hidden border-b border-border bg-fill\">{preview}</span>}\n <span className=\"flex min-w-0 items-center gap-2.5 px-3 py-2.5\">\n {!preview && (\n <span className=\"flex size-5 shrink-0 items-center justify-center text-muted-foreground\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span className=\"min-w-0 flex-1\">\n <Txt as=\"span\" variant=\"body-sm\" className=\"block truncate\" title={name}>\n {name}\n </Txt>\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\" className=\"block truncate\">\n {typeLabel}\n </Txt>\n </span>\n </span>\n </>\n );\n\n if (onClick) {\n return (\n <button\n ref={buttonRef}\n type=\"button\"\n className={className}\n onClick={onClick}\n aria-label={`Preview ${name}`}\n title={name}\n >\n {content}\n </button>\n );\n }\n if (href) {\n return (\n <a\n className={className}\n href={href}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n aria-label={`Open ${name}`}\n title={name}\n >\n {content}\n </a>\n );\n }\n return (\n <div className={className} title={name}>\n {content}\n </div>\n );\n}\n"],"mappings":";;;;;;AAgBA,SAAgB,eAAe,EAAE,MAAM,WAAW,MAAM,SAAS,SAAS,MAAM,aAAkC;CAChH,MAAM,YAAY,GAChB,qBACA,6EACC,WAAW,SACV,4JACJ;CACA,MAAM,UACJ,qBAAAA,UAAA,EAAA,UAAA,CACG,WAAW,oBAAC,QAAD;EAAM,WAAU;EAA6D,UAAA;CAAc,CAAA,GACvG,qBAAC,QAAD;EAAM,WAAU;EAAhB,UAAA,CACG,CAAC,WACA,oBAAC,QAAD;GAAM,WAAU;GAAyE,eAAY;GAClG,UAAA;EACG,CAAA,GAER,qBAAC,QAAD;GAAM,WAAU;GAAhB,UAAA,CACE,oBAAC,KAAD;IAAK,IAAG;IAAO,SAAQ;IAAU,WAAU;IAAiB,OAAO;IAChE,UAAA;GACE,CAAA,GACL,oBAAC,KAAD;IAAK,IAAG;IAAO,SAAQ;IAAO,MAAK;IAAQ,WAAU;IAClD,UAAA;GACE,CAAA,CACD;EACF,CAAA,CAAA;CACN,CAAA,CAAA,EAAA,CAAA;CAGJ,IAAI,SACF,OACE,oBAAC,UAAD;EACE,KAAK;EACL,MAAK;EACM;EACF;EACT,cAAY,WAAW;EACvB,OAAO;EAEN,UAAA;CACK,CAAA;CAGZ,IAAI,MACF,OACE,oBAAC,KAAD;EACa;EACL;EACN,QAAO;EACP,KAAI;EACJ,cAAY,QAAQ;EACpB,OAAO;EAEN,UAAA;CACA,CAAA;CAGP,OACE,oBAAC,OAAD;EAAgB;EAAW,OAAO;EAC/B,UAAA;CACE,CAAA;AAET"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_AttachmentCard = require("../AttachmentCard-
|
|
2
|
+
const require_AttachmentCard = require("../AttachmentCard-CciBqu7E.cjs");
|
|
3
3
|
exports.AttachmentCard = require_AttachmentCard.AttachmentCard;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { t as AttachmentCard } from "../AttachmentCard-
|
|
1
|
+
export { t as AttachmentCard } from "../AttachmentCard-DbGp7TYl.js";
|
|
@@ -2,7 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
2
2
|
const require_schemes = require("../../../schemes-CW9-2h2z.cjs");
|
|
3
3
|
const require_domains_chat_attachments_attachment_preview_dialog = require("./attachment-preview-dialog.cjs.js");
|
|
4
4
|
const require_domains_chat_attachments_message_attachment_info = require("./message-attachment-info.cjs.js");
|
|
5
|
-
const require_AttachmentCard = require("../../../AttachmentCard-
|
|
5
|
+
const require_AttachmentCard = require("../../../AttachmentCard-CciBqu7E.cjs");
|
|
6
6
|
const require_domains_chat_attachments_message_image_attachment = require("./message-image-attachment.cjs.js");
|
|
7
7
|
let react = require("react");
|
|
8
8
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { i as isBrowserFetchableUrl } from "../../../schemes-DXZtPeV_.js";
|
|
2
2
|
import { PdfPreviewDialog, TxtPreviewDialog } from "./attachment-preview-dialog.es.js";
|
|
3
3
|
import { attachmentInfo, attachmentName, textAttachment } from "./message-attachment-info.es.js";
|
|
4
|
-
import { t as AttachmentCard } from "../../../AttachmentCard-
|
|
4
|
+
import { t as AttachmentCard } from "../../../AttachmentCard-DbGp7TYl.js";
|
|
5
5
|
import { MessageImageAttachment } from "./message-image-attachment.es.js";
|
|
6
6
|
import { useRef, useState } from "react";
|
|
7
7
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
const require_domains_chat_attachments_attachment_preview_dialog = require("./attachment-preview-dialog.cjs.js");
|
|
3
|
-
const require_AttachmentCard = require("../../../AttachmentCard-
|
|
3
|
+
const require_AttachmentCard = require("../../../AttachmentCard-CciBqu7E.cjs");
|
|
4
4
|
let react = require("react");
|
|
5
5
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
6
6
|
let lucide_react = require("lucide-react");
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ImagePreviewDialog } from "./attachment-preview-dialog.es.js";
|
|
2
|
-
import { t as AttachmentCard } from "../../../AttachmentCard-
|
|
2
|
+
import { t as AttachmentCard } from "../../../AttachmentCard-DbGp7TYl.js";
|
|
3
3
|
import { useRef, useState } from "react";
|
|
4
4
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
5
5
|
import { FileImage } from "lucide-react";
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
const require_domains_observability_components_observability_list_body = require("../../observability/components/observability-list-body.cjs.js");
|
|
3
3
|
const require_domains_observability_hooks_use_observability_list_filters = require("../../observability/hooks/use-observability-list-filters.cjs.js");
|
|
4
|
+
const require_domains_traces_trace_list_columns = require("../../traces/trace-list-columns.cjs.js");
|
|
4
5
|
const require_domains_traces_components_no_traces_info = require("../../traces/components/no-traces-info.cjs.js");
|
|
5
6
|
const require_domains_traces_components_traces_error_content = require("../../traces/components/traces-error-content.cjs.js");
|
|
6
7
|
const require_domains_traces_components_traces_list_view = require("../../traces/components/traces-list-view.cjs.js");
|
|
@@ -77,6 +78,7 @@ function ThreadsExplorerBody({ selectedThreadId, onSelectedThreadChange, onOpenS
|
|
|
77
78
|
}) : void 0,
|
|
78
79
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_domains_traces_components_traces_list_view.TracesListView, {
|
|
79
80
|
listId: "all-threads",
|
|
81
|
+
columnPreferences: require_domains_traces_trace_list_columns.THREAD_LIST_COLUMN_PREFERENCES,
|
|
80
82
|
traces: rows,
|
|
81
83
|
isLoading,
|
|
82
84
|
isFetchingNextPage,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"threads-explorer-body.cjs.js","names":["useObservabilityListFilters","useTraceQueryAvailable","useFeedbackAvailable","useMemo","buildThreadQueryWhere","useThreadsListSource","threadToListRow","_Fragment","ObservabilityListBody","ActionRow","ThreadsFilterBar","TracesErrorContent","NoTracesInfo","TracesListView","TraceThreadPanel"],"sources":["../../../../src/domains/threads/components/threads-explorer-body.tsx"],"sourcesContent":["import type { ThreadQueryArgs } from '@mastra/react/hooks/traces';\nimport { useMemo } from 'react';\nimport { useThreadsListSource } from '../hooks/use-threads-list-source';\nimport { buildThreadQueryWhere } from '../thread-filters';\nimport { threadToListRow } from '../thread-list-row';\nimport { ThreadsFilterBar } from './threads-filter-bar';\nimport { useFeedbackAvailable, useTraceQueryAvailable } from '@/domains/capabilities';\nimport { ObservabilityListBody } from '@/domains/observability/components/observability-list-body';\nimport { useObservabilityListFilters } from '@/domains/observability/hooks/use-observability-list-filters';\nimport { NoTracesInfo } from '@/domains/traces/components/no-traces-info';\nimport { TraceThreadPanel } from '@/domains/traces/components/trace-thread-panel';\nimport { TracesErrorContent } from '@/domains/traces/components/traces-error-content';\nimport { TracesListView } from '@/domains/traces/components/traces-list-view';\nimport type { TracesListViewTrace } from '@/domains/traces/components/traces-list-view';\nimport { ActionRow } from '@/ds/components/ActionRow';\n\nexport type ThreadsExplorerBodyProps = {\n /** The open thread. The host keeps it (e.g. in the URL) so it survives a reload. */\n selectedThreadId: string | undefined;\n onSelectedThreadChange: (threadId: string | undefined) => void;\n /** Opens a score from the thread drawer; scores live on host routes. */\n onOpenScore: (traceId: string, scoreId: string) => void;\n};\n\n/** The threads page body: filter bar, thread list and the thread drawer. Router-agnostic. */\nexport function ThreadsExplorerBody({\n selectedThreadId,\n onSelectedThreadChange,\n onOpenScore,\n}: ThreadsExplorerBodyProps) {\n const filters = useObservabilityListFilters();\n const { timeRange, tokens, groups, sort } = filters;\n const withQueryTrace = useTraceQueryAvailable().enabled;\n const withFeedback = useFeedbackAvailable().enabled;\n\n // Threads with trace activity in the window, like the traces list for the same chip.\n const query = useMemo<ThreadQueryArgs>(() => {\n const where = buildThreadQueryWhere(tokens, groups);\n return {\n timeRange: { traces: timeRange },\n orderBy: [{ field: 'startedAt', direction: sort }],\n ...(where ? { where } : {}),\n };\n }, [timeRange, sort, tokens, groups]);\n\n const { threads, hasNextPage, isFetchingNextPage, setEndOfListElement, isLoading, isError, error } =\n useThreadsListSource({ query, rolling: filters.rolling });\n\n const rows = useMemo(() => (threads ?? []).map(threadToListRow), [threads]);\n const selectedRow = rows.find(row => row.threadId === selectedThreadId);\n\n // The drawer is modal, so the list behind it cannot be clicked while a thread is open.\n const handleThreadClick = (row: TracesListViewTrace) => {\n if (row.threadId) onSelectedThreadChange(row.threadId);\n };\n\n // Same rule as /traces: an empty window without filters gets the full-page empty state.\n const showEmptyState =\n !isLoading && !isError && rows.length === 0 && !filters.contentFiltersApplied && !selectedThreadId;\n\n return (\n <>\n <h1 className=\"sr-only\">Threads</h1>\n <ObservabilityListBody\n toolbar={\n <ActionRow>\n <ActionRow.Start>\n <ThreadsFilterBar\n datePreset={filters.datePreset}\n dateFrom={filters.dateFrom}\n dateTo={filters.dateTo}\n tokens={tokens}\n groups={groups}\n onDatePresetChange={filters.onDatePresetChange}\n onDateChange={filters.onDateChange}\n onDateRangeChange={filters.onDateRangeChange}\n onFiltersChange={filters.onFiltersChange}\n disabled={isLoading}\n />\n </ActionRow.Start>\n </ActionRow>\n }\n error={\n isError ? (\n <TracesErrorContent error={error} resource=\"threads\" errorTitle=\"Failed to load threads\" />\n ) : undefined\n }\n empty={\n showEmptyState ? (\n <NoTracesInfo\n resource=\"threads\"\n datePreset={filters.datePreset}\n dateFrom={filters.dateFrom}\n dateTo={filters.dateTo}\n />\n ) : undefined\n }\n >\n <TracesListView\n listId=\"all-threads\"\n traces={rows}\n isLoading={isLoading}\n isFetchingNextPage={isFetchingNextPage}\n hasNextPage={hasNextPage}\n setEndOfListElement={setEndOfListElement}\n filtersApplied={filters.filtersApplied}\n resource=\"threads\"\n createdSort={sort}\n onSortChange={filters.setSort}\n featuredTraceId={selectedRow?.traceId}\n onTraceClick={handleThreadClick}\n />\n </ObservabilityListBody>\n <TraceThreadPanel\n open={!!selectedThreadId}\n threadId={selectedThreadId ?? ''}\n depth={1}\n closeLabel=\"Close\"\n withQueryTrace={withQueryTrace}\n withFeedback={withFeedback}\n onOpenScore={onOpenScore}\n onClose={() => onSelectedThreadChange(undefined)}\n />\n </>\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"threads-explorer-body.cjs.js","names":["useObservabilityListFilters","useTraceQueryAvailable","useFeedbackAvailable","useMemo","buildThreadQueryWhere","useThreadsListSource","threadToListRow","_Fragment","ObservabilityListBody","ActionRow","ThreadsFilterBar","TracesErrorContent","NoTracesInfo","TracesListView","THREAD_LIST_COLUMN_PREFERENCES","TraceThreadPanel"],"sources":["../../../../src/domains/threads/components/threads-explorer-body.tsx"],"sourcesContent":["import type { ThreadQueryArgs } from '@mastra/react/hooks/traces';\nimport { useMemo } from 'react';\nimport { useThreadsListSource } from '../hooks/use-threads-list-source';\nimport { buildThreadQueryWhere } from '../thread-filters';\nimport { threadToListRow } from '../thread-list-row';\nimport { ThreadsFilterBar } from './threads-filter-bar';\nimport { useFeedbackAvailable, useTraceQueryAvailable } from '@/domains/capabilities';\nimport { ObservabilityListBody } from '@/domains/observability/components/observability-list-body';\nimport { useObservabilityListFilters } from '@/domains/observability/hooks/use-observability-list-filters';\nimport { NoTracesInfo } from '@/domains/traces/components/no-traces-info';\nimport { TraceThreadPanel } from '@/domains/traces/components/trace-thread-panel';\nimport { TracesErrorContent } from '@/domains/traces/components/traces-error-content';\nimport { TracesListView } from '@/domains/traces/components/traces-list-view';\nimport type { TracesListViewTrace } from '@/domains/traces/components/traces-list-view';\nimport { THREAD_LIST_COLUMN_PREFERENCES } from '@/domains/traces/trace-list-columns';\nimport { ActionRow } from '@/ds/components/ActionRow';\n\nexport type ThreadsExplorerBodyProps = {\n /** The open thread. The host keeps it (e.g. in the URL) so it survives a reload. */\n selectedThreadId: string | undefined;\n onSelectedThreadChange: (threadId: string | undefined) => void;\n /** Opens a score from the thread drawer; scores live on host routes. */\n onOpenScore: (traceId: string, scoreId: string) => void;\n};\n\n/** The threads page body: filter bar, thread list and the thread drawer. Router-agnostic. */\nexport function ThreadsExplorerBody({\n selectedThreadId,\n onSelectedThreadChange,\n onOpenScore,\n}: ThreadsExplorerBodyProps) {\n const filters = useObservabilityListFilters();\n const { timeRange, tokens, groups, sort } = filters;\n const withQueryTrace = useTraceQueryAvailable().enabled;\n const withFeedback = useFeedbackAvailable().enabled;\n\n // Threads with trace activity in the window, like the traces list for the same chip.\n const query = useMemo<ThreadQueryArgs>(() => {\n const where = buildThreadQueryWhere(tokens, groups);\n return {\n timeRange: { traces: timeRange },\n orderBy: [{ field: 'startedAt', direction: sort }],\n ...(where ? { where } : {}),\n };\n }, [timeRange, sort, tokens, groups]);\n\n const { threads, hasNextPage, isFetchingNextPage, setEndOfListElement, isLoading, isError, error } =\n useThreadsListSource({ query, rolling: filters.rolling });\n\n const rows = useMemo(() => (threads ?? []).map(threadToListRow), [threads]);\n const selectedRow = rows.find(row => row.threadId === selectedThreadId);\n\n // The drawer is modal, so the list behind it cannot be clicked while a thread is open.\n const handleThreadClick = (row: TracesListViewTrace) => {\n if (row.threadId) onSelectedThreadChange(row.threadId);\n };\n\n // Same rule as /traces: an empty window without filters gets the full-page empty state.\n const showEmptyState =\n !isLoading && !isError && rows.length === 0 && !filters.contentFiltersApplied && !selectedThreadId;\n\n return (\n <>\n <h1 className=\"sr-only\">Threads</h1>\n <ObservabilityListBody\n toolbar={\n <ActionRow>\n <ActionRow.Start>\n <ThreadsFilterBar\n datePreset={filters.datePreset}\n dateFrom={filters.dateFrom}\n dateTo={filters.dateTo}\n tokens={tokens}\n groups={groups}\n onDatePresetChange={filters.onDatePresetChange}\n onDateChange={filters.onDateChange}\n onDateRangeChange={filters.onDateRangeChange}\n onFiltersChange={filters.onFiltersChange}\n disabled={isLoading}\n />\n </ActionRow.Start>\n </ActionRow>\n }\n error={\n isError ? (\n <TracesErrorContent error={error} resource=\"threads\" errorTitle=\"Failed to load threads\" />\n ) : undefined\n }\n empty={\n showEmptyState ? (\n <NoTracesInfo\n resource=\"threads\"\n datePreset={filters.datePreset}\n dateFrom={filters.dateFrom}\n dateTo={filters.dateTo}\n />\n ) : undefined\n }\n >\n <TracesListView\n listId=\"all-threads\"\n columnPreferences={THREAD_LIST_COLUMN_PREFERENCES}\n traces={rows}\n isLoading={isLoading}\n isFetchingNextPage={isFetchingNextPage}\n hasNextPage={hasNextPage}\n setEndOfListElement={setEndOfListElement}\n filtersApplied={filters.filtersApplied}\n resource=\"threads\"\n createdSort={sort}\n onSortChange={filters.setSort}\n featuredTraceId={selectedRow?.traceId}\n onTraceClick={handleThreadClick}\n />\n </ObservabilityListBody>\n <TraceThreadPanel\n open={!!selectedThreadId}\n threadId={selectedThreadId ?? ''}\n depth={1}\n closeLabel=\"Close\"\n withQueryTrace={withQueryTrace}\n withFeedback={withFeedback}\n onOpenScore={onOpenScore}\n onClose={() => onSelectedThreadChange(undefined)}\n />\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AA0BA,SAAgB,oBAAoB,EAClC,kBACA,wBACA,eAC2B;CAC3B,MAAM,UAAUA,mEAAAA,4BAA4B;CAC5C,MAAM,EAAE,WAAW,QAAQ,QAAQ,SAAS;CAC5C,MAAM,kBAAA,GAAiBC,iCAAAA,uBAAAA,CAAuB,CAAC,CAAC;CAChD,MAAM,gBAAA,GAAeC,iCAAAA,qBAAAA,CAAqB,CAAC,CAAC;CAG5C,MAAM,SAAA,GAAQC,MAAAA,QAAAA,OAA+B;EAC3C,MAAM,QAAQC,uCAAAA,sBAAsB,QAAQ,MAAM;EAClD,OAAO;GACL,WAAW,EAAE,QAAQ,UAAU;GAC/B,SAAS,CAAC;IAAE,OAAO;IAAa,WAAW;GAAK,CAAC;GACjD,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;EAC3B;CACF,GAAG;EAAC;EAAW;EAAM;EAAQ;CAAM,CAAC;CAEpC,MAAM,EAAE,SAAS,aAAa,oBAAoB,qBAAqB,WAAW,SAAS,UACzFC,sDAAAA,qBAAqB;EAAE;EAAO,SAAS,QAAQ;CAAQ,CAAC;CAE1D,MAAM,QAAA,GAAOF,MAAAA,QAAAA,QAAe,WAAW,CAAC,EAAA,CAAG,IAAIG,wCAAAA,eAAe,GAAG,CAAC,OAAO,CAAC;CAC1E,MAAM,cAAc,KAAK,MAAK,QAAO,IAAI,aAAa,gBAAgB;CAGtE,MAAM,qBAAqB,QAA6B;EACtD,IAAI,IAAI,UAAU,uBAAuB,IAAI,QAAQ;CACvD;CAGA,MAAM,iBACJ,CAAC,aAAa,CAAC,WAAW,KAAK,WAAW,KAAK,CAAC,QAAQ,yBAAyB,CAAC;CAEpF,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAAC,kBAAAA,UAAA,EAAA,UAAA;EACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;GAAI,WAAU;GAAU,UAAA;EAAW,CAAA;EACnC,iBAAA,GAAA,kBAAA,IAAA,CAACC,iEAAAA,uBAAD;GACE,SACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,kBAAAA,WAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,kBAAAA,UAAU,OAAX,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sDAAAA,kBAAD;IACE,YAAY,QAAQ;IACpB,UAAU,QAAQ;IAClB,QAAQ,QAAQ;IACR;IACA;IACR,oBAAoB,QAAQ;IAC5B,cAAc,QAAQ;IACtB,mBAAmB,QAAQ;IAC3B,iBAAiB,QAAQ;IACzB,UAAU;GACX,CAAA,EACc,CAAA,EACR,CAAA;GAEb,OACE,UACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,uDAAAA,oBAAD;IAA2B;IAAO,UAAS;IAAU,YAAW;GAA0B,CAAA,IACxF,KAAA;GAEN,OACE,iBACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,iDAAAA,cAAD;IACE,UAAS;IACT,YAAY,QAAQ;IACpB,UAAU,QAAQ;IAClB,QAAQ,QAAQ;GACjB,CAAA,IACC,KAAA;GAGN,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,mDAAAA,gBAAD;IACE,QAAO;IACP,mBAAmBC,0CAAAA;IACnB,QAAQ;IACG;IACS;IACP;IACQ;IACrB,gBAAgB,QAAQ;IACxB,UAAS;IACT,aAAa;IACb,cAAc,QAAQ;IACtB,iBAAiB,aAAa;IAC9B,cAAc;GACf,CAAA;EACoB,CAAA;EACvB,iBAAA,GAAA,kBAAA,IAAA,CAACC,qDAAAA,kBAAD;GACE,MAAM,CAAC,CAAC;GACR,UAAU,oBAAoB;GAC9B,OAAO;GACP,YAAW;GACK;GACF;GACD;GACb,eAAe,uBAAuB,KAAA,CAAS;EAChD,CAAA;CACD,EAAA,CAAA;AAEN"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { useFeedbackAvailable, useTraceQueryAvailable } from "../../capabilities.es.js";
|
|
2
2
|
import { ObservabilityListBody } from "../../observability/components/observability-list-body.es.js";
|
|
3
3
|
import { useObservabilityListFilters } from "../../observability/hooks/use-observability-list-filters.es.js";
|
|
4
|
+
import { THREAD_LIST_COLUMN_PREFERENCES } from "../../traces/trace-list-columns.es.js";
|
|
4
5
|
import { NoTracesInfo } from "../../traces/components/no-traces-info.es.js";
|
|
5
6
|
import { TracesErrorContent } from "../../traces/components/traces-error-content.es.js";
|
|
6
7
|
import { TracesListView } from "../../traces/components/traces-list-view.es.js";
|
|
@@ -76,6 +77,7 @@ function ThreadsExplorerBody({ selectedThreadId, onSelectedThreadChange, onOpenS
|
|
|
76
77
|
}) : void 0,
|
|
77
78
|
children: /* @__PURE__ */ jsx(TracesListView, {
|
|
78
79
|
listId: "all-threads",
|
|
80
|
+
columnPreferences: THREAD_LIST_COLUMN_PREFERENCES,
|
|
79
81
|
traces: rows,
|
|
80
82
|
isLoading,
|
|
81
83
|
isFetchingNextPage,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"threads-explorer-body.es.js","names":["_Fragment"],"sources":["../../../../src/domains/threads/components/threads-explorer-body.tsx"],"sourcesContent":["import type { ThreadQueryArgs } from '@mastra/react/hooks/traces';\nimport { useMemo } from 'react';\nimport { useThreadsListSource } from '../hooks/use-threads-list-source';\nimport { buildThreadQueryWhere } from '../thread-filters';\nimport { threadToListRow } from '../thread-list-row';\nimport { ThreadsFilterBar } from './threads-filter-bar';\nimport { useFeedbackAvailable, useTraceQueryAvailable } from '@/domains/capabilities';\nimport { ObservabilityListBody } from '@/domains/observability/components/observability-list-body';\nimport { useObservabilityListFilters } from '@/domains/observability/hooks/use-observability-list-filters';\nimport { NoTracesInfo } from '@/domains/traces/components/no-traces-info';\nimport { TraceThreadPanel } from '@/domains/traces/components/trace-thread-panel';\nimport { TracesErrorContent } from '@/domains/traces/components/traces-error-content';\nimport { TracesListView } from '@/domains/traces/components/traces-list-view';\nimport type { TracesListViewTrace } from '@/domains/traces/components/traces-list-view';\nimport { ActionRow } from '@/ds/components/ActionRow';\n\nexport type ThreadsExplorerBodyProps = {\n /** The open thread. The host keeps it (e.g. in the URL) so it survives a reload. */\n selectedThreadId: string | undefined;\n onSelectedThreadChange: (threadId: string | undefined) => void;\n /** Opens a score from the thread drawer; scores live on host routes. */\n onOpenScore: (traceId: string, scoreId: string) => void;\n};\n\n/** The threads page body: filter bar, thread list and the thread drawer. Router-agnostic. */\nexport function ThreadsExplorerBody({\n selectedThreadId,\n onSelectedThreadChange,\n onOpenScore,\n}: ThreadsExplorerBodyProps) {\n const filters = useObservabilityListFilters();\n const { timeRange, tokens, groups, sort } = filters;\n const withQueryTrace = useTraceQueryAvailable().enabled;\n const withFeedback = useFeedbackAvailable().enabled;\n\n // Threads with trace activity in the window, like the traces list for the same chip.\n const query = useMemo<ThreadQueryArgs>(() => {\n const where = buildThreadQueryWhere(tokens, groups);\n return {\n timeRange: { traces: timeRange },\n orderBy: [{ field: 'startedAt', direction: sort }],\n ...(where ? { where } : {}),\n };\n }, [timeRange, sort, tokens, groups]);\n\n const { threads, hasNextPage, isFetchingNextPage, setEndOfListElement, isLoading, isError, error } =\n useThreadsListSource({ query, rolling: filters.rolling });\n\n const rows = useMemo(() => (threads ?? []).map(threadToListRow), [threads]);\n const selectedRow = rows.find(row => row.threadId === selectedThreadId);\n\n // The drawer is modal, so the list behind it cannot be clicked while a thread is open.\n const handleThreadClick = (row: TracesListViewTrace) => {\n if (row.threadId) onSelectedThreadChange(row.threadId);\n };\n\n // Same rule as /traces: an empty window without filters gets the full-page empty state.\n const showEmptyState =\n !isLoading && !isError && rows.length === 0 && !filters.contentFiltersApplied && !selectedThreadId;\n\n return (\n <>\n <h1 className=\"sr-only\">Threads</h1>\n <ObservabilityListBody\n toolbar={\n <ActionRow>\n <ActionRow.Start>\n <ThreadsFilterBar\n datePreset={filters.datePreset}\n dateFrom={filters.dateFrom}\n dateTo={filters.dateTo}\n tokens={tokens}\n groups={groups}\n onDatePresetChange={filters.onDatePresetChange}\n onDateChange={filters.onDateChange}\n onDateRangeChange={filters.onDateRangeChange}\n onFiltersChange={filters.onFiltersChange}\n disabled={isLoading}\n />\n </ActionRow.Start>\n </ActionRow>\n }\n error={\n isError ? (\n <TracesErrorContent error={error} resource=\"threads\" errorTitle=\"Failed to load threads\" />\n ) : undefined\n }\n empty={\n showEmptyState ? (\n <NoTracesInfo\n resource=\"threads\"\n datePreset={filters.datePreset}\n dateFrom={filters.dateFrom}\n dateTo={filters.dateTo}\n />\n ) : undefined\n }\n >\n <TracesListView\n listId=\"all-threads\"\n traces={rows}\n isLoading={isLoading}\n isFetchingNextPage={isFetchingNextPage}\n hasNextPage={hasNextPage}\n setEndOfListElement={setEndOfListElement}\n filtersApplied={filters.filtersApplied}\n resource=\"threads\"\n createdSort={sort}\n onSortChange={filters.setSort}\n featuredTraceId={selectedRow?.traceId}\n onTraceClick={handleThreadClick}\n />\n </ObservabilityListBody>\n <TraceThreadPanel\n open={!!selectedThreadId}\n threadId={selectedThreadId ?? ''}\n depth={1}\n closeLabel=\"Close\"\n withQueryTrace={withQueryTrace}\n withFeedback={withFeedback}\n onOpenScore={onOpenScore}\n onClose={() => onSelectedThreadChange(undefined)}\n />\n </>\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"threads-explorer-body.es.js","names":["_Fragment"],"sources":["../../../../src/domains/threads/components/threads-explorer-body.tsx"],"sourcesContent":["import type { ThreadQueryArgs } from '@mastra/react/hooks/traces';\nimport { useMemo } from 'react';\nimport { useThreadsListSource } from '../hooks/use-threads-list-source';\nimport { buildThreadQueryWhere } from '../thread-filters';\nimport { threadToListRow } from '../thread-list-row';\nimport { ThreadsFilterBar } from './threads-filter-bar';\nimport { useFeedbackAvailable, useTraceQueryAvailable } from '@/domains/capabilities';\nimport { ObservabilityListBody } from '@/domains/observability/components/observability-list-body';\nimport { useObservabilityListFilters } from '@/domains/observability/hooks/use-observability-list-filters';\nimport { NoTracesInfo } from '@/domains/traces/components/no-traces-info';\nimport { TraceThreadPanel } from '@/domains/traces/components/trace-thread-panel';\nimport { TracesErrorContent } from '@/domains/traces/components/traces-error-content';\nimport { TracesListView } from '@/domains/traces/components/traces-list-view';\nimport type { TracesListViewTrace } from '@/domains/traces/components/traces-list-view';\nimport { THREAD_LIST_COLUMN_PREFERENCES } from '@/domains/traces/trace-list-columns';\nimport { ActionRow } from '@/ds/components/ActionRow';\n\nexport type ThreadsExplorerBodyProps = {\n /** The open thread. The host keeps it (e.g. in the URL) so it survives a reload. */\n selectedThreadId: string | undefined;\n onSelectedThreadChange: (threadId: string | undefined) => void;\n /** Opens a score from the thread drawer; scores live on host routes. */\n onOpenScore: (traceId: string, scoreId: string) => void;\n};\n\n/** The threads page body: filter bar, thread list and the thread drawer. Router-agnostic. */\nexport function ThreadsExplorerBody({\n selectedThreadId,\n onSelectedThreadChange,\n onOpenScore,\n}: ThreadsExplorerBodyProps) {\n const filters = useObservabilityListFilters();\n const { timeRange, tokens, groups, sort } = filters;\n const withQueryTrace = useTraceQueryAvailable().enabled;\n const withFeedback = useFeedbackAvailable().enabled;\n\n // Threads with trace activity in the window, like the traces list for the same chip.\n const query = useMemo<ThreadQueryArgs>(() => {\n const where = buildThreadQueryWhere(tokens, groups);\n return {\n timeRange: { traces: timeRange },\n orderBy: [{ field: 'startedAt', direction: sort }],\n ...(where ? { where } : {}),\n };\n }, [timeRange, sort, tokens, groups]);\n\n const { threads, hasNextPage, isFetchingNextPage, setEndOfListElement, isLoading, isError, error } =\n useThreadsListSource({ query, rolling: filters.rolling });\n\n const rows = useMemo(() => (threads ?? []).map(threadToListRow), [threads]);\n const selectedRow = rows.find(row => row.threadId === selectedThreadId);\n\n // The drawer is modal, so the list behind it cannot be clicked while a thread is open.\n const handleThreadClick = (row: TracesListViewTrace) => {\n if (row.threadId) onSelectedThreadChange(row.threadId);\n };\n\n // Same rule as /traces: an empty window without filters gets the full-page empty state.\n const showEmptyState =\n !isLoading && !isError && rows.length === 0 && !filters.contentFiltersApplied && !selectedThreadId;\n\n return (\n <>\n <h1 className=\"sr-only\">Threads</h1>\n <ObservabilityListBody\n toolbar={\n <ActionRow>\n <ActionRow.Start>\n <ThreadsFilterBar\n datePreset={filters.datePreset}\n dateFrom={filters.dateFrom}\n dateTo={filters.dateTo}\n tokens={tokens}\n groups={groups}\n onDatePresetChange={filters.onDatePresetChange}\n onDateChange={filters.onDateChange}\n onDateRangeChange={filters.onDateRangeChange}\n onFiltersChange={filters.onFiltersChange}\n disabled={isLoading}\n />\n </ActionRow.Start>\n </ActionRow>\n }\n error={\n isError ? (\n <TracesErrorContent error={error} resource=\"threads\" errorTitle=\"Failed to load threads\" />\n ) : undefined\n }\n empty={\n showEmptyState ? (\n <NoTracesInfo\n resource=\"threads\"\n datePreset={filters.datePreset}\n dateFrom={filters.dateFrom}\n dateTo={filters.dateTo}\n />\n ) : undefined\n }\n >\n <TracesListView\n listId=\"all-threads\"\n columnPreferences={THREAD_LIST_COLUMN_PREFERENCES}\n traces={rows}\n isLoading={isLoading}\n isFetchingNextPage={isFetchingNextPage}\n hasNextPage={hasNextPage}\n setEndOfListElement={setEndOfListElement}\n filtersApplied={filters.filtersApplied}\n resource=\"threads\"\n createdSort={sort}\n onSortChange={filters.setSort}\n featuredTraceId={selectedRow?.traceId}\n onTraceClick={handleThreadClick}\n />\n </ObservabilityListBody>\n <TraceThreadPanel\n open={!!selectedThreadId}\n threadId={selectedThreadId ?? ''}\n depth={1}\n closeLabel=\"Close\"\n withQueryTrace={withQueryTrace}\n withFeedback={withFeedback}\n onOpenScore={onOpenScore}\n onClose={() => onSelectedThreadChange(undefined)}\n />\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA0BA,SAAgB,oBAAoB,EAClC,kBACA,wBACA,eAC2B;CAC3B,MAAM,UAAU,4BAA4B;CAC5C,MAAM,EAAE,WAAW,QAAQ,QAAQ,SAAS;CAC5C,MAAM,iBAAiB,uBAAuB,CAAC,CAAC;CAChD,MAAM,eAAe,qBAAqB,CAAC,CAAC;CAG5C,MAAM,QAAQ,cAA+B;EAC3C,MAAM,QAAQ,sBAAsB,QAAQ,MAAM;EAClD,OAAO;GACL,WAAW,EAAE,QAAQ,UAAU;GAC/B,SAAS,CAAC;IAAE,OAAO;IAAa,WAAW;GAAK,CAAC;GACjD,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;EAC3B;CACF,GAAG;EAAC;EAAW;EAAM;EAAQ;CAAM,CAAC;CAEpC,MAAM,EAAE,SAAS,aAAa,oBAAoB,qBAAqB,WAAW,SAAS,UACzF,qBAAqB;EAAE;EAAO,SAAS,QAAQ;CAAQ,CAAC;CAE1D,MAAM,OAAO,eAAe,WAAW,CAAC,EAAA,CAAG,IAAI,eAAe,GAAG,CAAC,OAAO,CAAC;CAC1E,MAAM,cAAc,KAAK,MAAK,QAAO,IAAI,aAAa,gBAAgB;CAGtE,MAAM,qBAAqB,QAA6B;EACtD,IAAI,IAAI,UAAU,uBAAuB,IAAI,QAAQ;CACvD;CAGA,MAAM,iBACJ,CAAC,aAAa,CAAC,WAAW,KAAK,WAAW,KAAK,CAAC,QAAQ,yBAAyB,CAAC;CAEpF,OACE,qBAAAA,YAAA,EAAA,UAAA;EACE,oBAAC,MAAD;GAAI,WAAU;GAAU,UAAA;EAAW,CAAA;EACnC,oBAAC,uBAAD;GACE,SACE,oBAAC,WAAD,EAAA,UACE,oBAAC,UAAU,OAAX,EAAA,UACE,oBAAC,kBAAD;IACE,YAAY,QAAQ;IACpB,UAAU,QAAQ;IAClB,QAAQ,QAAQ;IACR;IACA;IACR,oBAAoB,QAAQ;IAC5B,cAAc,QAAQ;IACtB,mBAAmB,QAAQ;IAC3B,iBAAiB,QAAQ;IACzB,UAAU;GACX,CAAA,EACc,CAAA,EACR,CAAA;GAEb,OACE,UACE,oBAAC,oBAAD;IAA2B;IAAO,UAAS;IAAU,YAAW;GAA0B,CAAA,IACxF,KAAA;GAEN,OACE,iBACE,oBAAC,cAAD;IACE,UAAS;IACT,YAAY,QAAQ;IACpB,UAAU,QAAQ;IAClB,QAAQ,QAAQ;GACjB,CAAA,IACC,KAAA;GAGN,UAAA,oBAAC,gBAAD;IACE,QAAO;IACP,mBAAmB;IACnB,QAAQ;IACG;IACS;IACP;IACQ;IACrB,gBAAgB,QAAQ;IACxB,UAAS;IACT,aAAa;IACb,cAAc,QAAQ;IACtB,iBAAiB,aAAa;IAC9B,cAAc;GACf,CAAA;EACoB,CAAA;EACvB,oBAAC,kBAAD;GACE,MAAM,CAAC,CAAC;GACR,UAAU,oBAAoB;GAC9B,OAAO;GACP,YAAW;GACK;GACF;GACD;GACb,eAAe,uBAAuB,KAAA,CAAS;EAChD,CAAA;CACD,EAAA,CAAA;AAEN"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
const require_trace_filters = require("../../trace-filters-HWOGfVqx.cjs");
|
|
3
|
+
let lucide_react = require("lucide-react");
|
|
3
4
|
let _mastra_core_observability = require("@mastra/core/observability");
|
|
4
5
|
// src/domains/threads/thread-filters.ts
|
|
5
6
|
/** Thread query fields the filter bar offers. `startedAt`/`endedAt` are left to the time-range chip. */
|
|
@@ -42,7 +43,7 @@ var TRACE_COUNT_OPERATORS = [
|
|
|
42
43
|
];
|
|
43
44
|
var THREAD_FILTER_BAR_LABELS = {
|
|
44
45
|
...require_trace_filters.TRACE_FILTER_BAR_LABELS,
|
|
45
|
-
traceCount: "
|
|
46
|
+
traceCount: "Messages",
|
|
46
47
|
timeToFirstChunkMs: "Time to first chunk (ms)",
|
|
47
48
|
executionSource: "Execution source",
|
|
48
49
|
entityType: "Primitive type",
|
|
@@ -50,16 +51,17 @@ var THREAD_FILTER_BAR_LABELS = {
|
|
|
50
51
|
};
|
|
51
52
|
/** Thread fields without their own trace icon borrow the icon of the closest trace field. */
|
|
52
53
|
var THREAD_ICON_FIELD_ALIASES = {
|
|
53
|
-
traceCount: "traceId",
|
|
54
54
|
timeToFirstChunkMs: "durationMs",
|
|
55
55
|
executionSource: "runId",
|
|
56
56
|
entityType: "rootEntityType",
|
|
57
57
|
entityVersionId: "entityId"
|
|
58
58
|
};
|
|
59
|
+
/** Thread fields with an icon of their own: Messages uses the Threads tab's icon. */
|
|
60
|
+
var THREAD_FILTER_BAR_ICONS = { traceCount: lucide_react.MessagesSquareIcon };
|
|
59
61
|
var threadFieldBase = (id) => ({
|
|
60
62
|
id,
|
|
61
63
|
label: THREAD_FILTER_BAR_LABELS[id] ?? id,
|
|
62
|
-
icon: require_trace_filters.traceFilterFieldIcon(THREAD_ICON_FIELD_ALIASES[id] ?? id),
|
|
64
|
+
icon: THREAD_FILTER_BAR_ICONS[id] ?? require_trace_filters.traceFilterFieldIcon(THREAD_ICON_FIELD_ALIASES[id] ?? id),
|
|
63
65
|
color: require_trace_filters.traceFilterFieldColor(id)
|
|
64
66
|
});
|
|
65
67
|
var humanize = (value) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-filters.cjs.js","names":["TRACE_FILTER_BAR_LABELS","traceFilterFieldIcon","traceFilterFieldColor","ROOT_ENTITY_TYPE_OPTIONS","EntityType","TRACE_STATUS_OPTIONS","TRACE_STRING_OPERATORS","TRACE_REQUIRED_STRING_OPERATORS","TRACE_NUMBER_OPERATORS","isLegacyAnyValue","scalarPredicate","isTraceFilterGroup"],"sources":["../../../src/domains/threads/thread-filters.ts"],"sourcesContent":["import { EntityType } from '@mastra/core/observability';\nimport type { TraceQueryScalarPredicate } from '@mastra/core/storage';\nimport {\n isLegacyAnyValue,\n ROOT_ENTITY_TYPE_OPTIONS,\n TRACE_FILTER_BAR_LABELS,\n TRACE_NUMBER_OPERATORS,\n TRACE_REQUIRED_STRING_OPERATORS,\n TRACE_STATUS_OPTIONS,\n TRACE_STRING_OPERATORS,\n traceFilterFieldColor,\n traceFilterFieldIcon,\n} from '../traces/trace-filters';\nimport { isTraceFilterGroup, scalarPredicate } from '../traces/trace-query-filters';\nimport type { TraceFilterGroup, TraceFilterOperatorId, TraceFilterToken } from '../traces/trace-query-filters';\nimport type { FilterBarField, FilterBarOption } from '@/ds/components/FilterBar/types';\n\n/** Thread query fields the filter bar offers. `startedAt`/`endedAt` are left to the time-range chip. */\nexport const THREAD_FILTER_FIELD_IDS = [\n 'status',\n 'traceCount',\n 'timeToFirstChunkMs',\n 'entityType',\n 'entityId',\n 'entityName',\n 'entityVersionId',\n 'threadId',\n 'resourceId',\n 'userId',\n 'organizationId',\n 'runId',\n 'sessionId',\n 'requestId',\n 'serviceName',\n 'experimentId',\n 'environment',\n 'executionSource',\n] as const;\n\nconst FIELD_IDS: ReadonlySet<string> = new Set(THREAD_FILTER_FIELD_IDS);\nconst NUMBER_FIELD_IDS: ReadonlySet<string> = new Set(['traceCount', 'timeToFirstChunkMs']);\n/** Fields every thread row carries. On any other field, \"is not X\" must also keep threads where it is missing. */\nconst REQUIRED_FIELD_IDS: ReadonlySet<string> = new Set(['threadId', 'status', 'traceCount']);\n/** The thread query compares `traceCount` but has no set membership or presence check for it. */\nconst TRACE_COUNT_OPERATORS: TraceFilterOperatorId[] = ['is', 'isNot', 'gt', 'gte', 'lt', 'lte'];\n\nconst THREAD_FILTER_BAR_LABELS: Record<string, string> = {\n ...TRACE_FILTER_BAR_LABELS,\n traceCount: 'Trace count',\n timeToFirstChunkMs: 'Time to first chunk (ms)',\n executionSource: 'Execution source',\n entityType: 'Primitive type',\n entityVersionId: 'Primitive version ID',\n};\n\n/** Thread fields without their own trace icon borrow the icon of the closest trace field. */\nconst THREAD_ICON_FIELD_ALIASES: Record<string, string> = {\n traceCount: 'traceId',\n timeToFirstChunkMs: 'durationMs',\n executionSource: 'runId',\n entityType: 'rootEntityType',\n entityVersionId: 'entityId',\n};\n\nconst threadFieldBase = (id: string) => ({\n id,\n label: THREAD_FILTER_BAR_LABELS[id] ?? id,\n icon: traceFilterFieldIcon(THREAD_ICON_FIELD_ALIASES[id] ?? id),\n color: traceFilterFieldColor(id),\n});\n\nconst humanize = (value: string) => {\n const words = value.replace(/_/g, ' ');\n return words.charAt(0).toUpperCase() + words.slice(1);\n};\n\nconst ENTITY_TYPE_LABELS: Record<string, string> = Object.fromEntries(\n ROOT_ENTITY_TYPE_OPTIONS.map(option => [option.entityType, option.label]),\n);\n\nconst ENTITY_TYPE_OPTIONS: FilterBarOption[] = Object.values(EntityType)\n .map(value => ({ value, label: ENTITY_TYPE_LABELS[value] ?? humanize(value) }))\n .sort((a, b) => a.label.localeCompare(b.label));\n\nconst STATUS_OPTIONS: FilterBarOption[] = TRACE_STATUS_OPTIONS.filter(option => option.value !== 'running').map(\n option => ({ value: option.value, label: option.label }),\n);\n\n/** FilterBar fields for the threads page: only paths and operators `queryTraceThreads()` accepts. */\nexport function createThreadFilterBarFields({\n entityNames,\n environments,\n}: {\n entityNames: readonly string[];\n environments: readonly string[];\n}): FilterBarField[] {\n const pick = (\n id: string,\n suggestions: FilterBarOption[],\n operators: TraceFilterOperatorId[] = TRACE_STRING_OPERATORS,\n ): FilterBarField => ({ ...threadFieldBase(id), operators, strict: true, suggestions });\n\n const field = (id: string): FilterBarField => {\n switch (id) {\n case 'status':\n return pick(id, STATUS_OPTIONS, TRACE_REQUIRED_STRING_OPERATORS);\n case 'entityType':\n return pick(id, ENTITY_TYPE_OPTIONS);\n case 'entityName':\n return pick(\n id,\n entityNames.map(value => ({ value })),\n );\n case 'environment':\n return pick(\n id,\n environments.map(value => ({ value })),\n );\n case 'traceCount':\n return { ...threadFieldBase(id), type: 'number', operators: TRACE_COUNT_OPERATORS };\n case 'timeToFirstChunkMs':\n return { ...threadFieldBase(id), type: 'number', operators: TRACE_NUMBER_OPERATORS };\n case 'threadId':\n return { ...threadFieldBase(id), operators: TRACE_REQUIRED_STRING_OPERATORS };\n default:\n return { ...threadFieldBase(id), operators: TRACE_STRING_OPERATORS };\n }\n };\n\n return THREAD_FILTER_FIELD_IDS.map(field).sort((a, b) => a.label.localeCompare(b.label));\n}\n\nfunction tokenToThreadQueryPredicate(token: TraceFilterToken): TraceQueryScalarPredicate | undefined {\n const { fieldId } = token;\n if (!FIELD_IDS.has(fieldId)) return undefined;\n const operatorId = token.operatorId ?? 'is';\n const isPresence = operatorId === 'exists' || operatorId === 'notExists';\n\n const rawValues = (Array.isArray(token.value) ? token.value : [token.value]).filter(\n (value): value is string =>\n typeof value === 'string' && Boolean(value.trim()) && !isLegacyAnyValue(value, operatorId),\n );\n if (!rawValues.length && !isPresence) return undefined;\n\n let values: (string | number)[] = rawValues;\n if (NUMBER_FIELD_IDS.has(fieldId)) {\n values = rawValues.map(Number).filter(value => !Number.isNaN(value));\n if (!values.length && !isPresence) return undefined;\n }\n if (fieldId === 'traceCount' && (isPresence || values.length > 1 || !TRACE_COUNT_OPERATORS.includes(operatorId))) {\n return undefined;\n }\n\n const predicate = scalarPredicate(operatorId, fieldId, values);\n if (!predicate) return undefined;\n if ((operatorId === 'isNot' || operatorId === 'notIn') && !REQUIRED_FIELD_IDS.has(fieldId)) {\n return { op: 'or', args: [predicate, { op: 'notExists', path: fieldId }] };\n }\n return predicate;\n}\n\nfunction groupToThreadQueryPredicate(group: TraceFilterGroup): TraceQueryScalarPredicate | undefined {\n const args = group.nodes\n .map(node => (isTraceFilterGroup(node) ? groupToThreadQueryPredicate(node) : tokenToThreadQueryPredicate(node)))\n .filter((predicate): predicate is TraceQueryScalarPredicate => Boolean(predicate));\n if (args.length === 0) return undefined;\n return args.length === 1 ? args[0] : { op: group.logic, args };\n}\n\n/**\n * The thread query `where` for the filter bar's tokens and groups, or `undefined` when nothing applies.\n * Conditions the thread query can't run (unknown fields, unusable values) are left out instead of\n * failing the request.\n */\nexport function buildThreadQueryWhere(\n tokens: TraceFilterToken[],\n groups: TraceFilterGroup[],\n): TraceQueryScalarPredicate | undefined {\n const args = [...tokens.map(tokenToThreadQueryPredicate), ...groups.map(groupToThreadQueryPredicate)].filter(\n (predicate): predicate is TraceQueryScalarPredicate => Boolean(predicate),\n );\n return args.length ? { op: 'and', args } : undefined;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"thread-filters.cjs.js","names":["TRACE_FILTER_BAR_LABELS","MessagesSquareIcon","traceFilterFieldIcon","traceFilterFieldColor","ROOT_ENTITY_TYPE_OPTIONS","EntityType","TRACE_STATUS_OPTIONS","TRACE_STRING_OPERATORS","TRACE_REQUIRED_STRING_OPERATORS","TRACE_NUMBER_OPERATORS","isLegacyAnyValue","scalarPredicate","isTraceFilterGroup"],"sources":["../../../src/domains/threads/thread-filters.ts"],"sourcesContent":["import { EntityType } from '@mastra/core/observability';\nimport type { TraceQueryScalarPredicate } from '@mastra/core/storage';\nimport { MessagesSquareIcon } from 'lucide-react';\nimport type { LucideIcon } from 'lucide-react';\nimport {\n isLegacyAnyValue,\n ROOT_ENTITY_TYPE_OPTIONS,\n TRACE_FILTER_BAR_LABELS,\n TRACE_NUMBER_OPERATORS,\n TRACE_REQUIRED_STRING_OPERATORS,\n TRACE_STATUS_OPTIONS,\n TRACE_STRING_OPERATORS,\n traceFilterFieldColor,\n traceFilterFieldIcon,\n} from '../traces/trace-filters';\nimport { isTraceFilterGroup, scalarPredicate } from '../traces/trace-query-filters';\nimport type { TraceFilterGroup, TraceFilterOperatorId, TraceFilterToken } from '../traces/trace-query-filters';\nimport type { FilterBarField, FilterBarOption } from '@/ds/components/FilterBar/types';\n\n/** Thread query fields the filter bar offers. `startedAt`/`endedAt` are left to the time-range chip. */\nexport const THREAD_FILTER_FIELD_IDS = [\n 'status',\n 'traceCount',\n 'timeToFirstChunkMs',\n 'entityType',\n 'entityId',\n 'entityName',\n 'entityVersionId',\n 'threadId',\n 'resourceId',\n 'userId',\n 'organizationId',\n 'runId',\n 'sessionId',\n 'requestId',\n 'serviceName',\n 'experimentId',\n 'environment',\n 'executionSource',\n] as const;\n\nconst FIELD_IDS: ReadonlySet<string> = new Set(THREAD_FILTER_FIELD_IDS);\nconst NUMBER_FIELD_IDS: ReadonlySet<string> = new Set(['traceCount', 'timeToFirstChunkMs']);\n/** Fields every thread row carries. On any other field, \"is not X\" must also keep threads where it is missing. */\nconst REQUIRED_FIELD_IDS: ReadonlySet<string> = new Set(['threadId', 'status', 'traceCount']);\n/** The thread query compares `traceCount` but has no set membership or presence check for it. */\nconst TRACE_COUNT_OPERATORS: TraceFilterOperatorId[] = ['is', 'isNot', 'gt', 'gte', 'lt', 'lte'];\n\nconst THREAD_FILTER_BAR_LABELS: Record<string, string> = {\n ...TRACE_FILTER_BAR_LABELS,\n traceCount: 'Messages',\n timeToFirstChunkMs: 'Time to first chunk (ms)',\n executionSource: 'Execution source',\n entityType: 'Primitive type',\n entityVersionId: 'Primitive version ID',\n};\n\n/** Thread fields without their own trace icon borrow the icon of the closest trace field. */\nconst THREAD_ICON_FIELD_ALIASES: Record<string, string> = {\n timeToFirstChunkMs: 'durationMs',\n executionSource: 'runId',\n entityType: 'rootEntityType',\n entityVersionId: 'entityId',\n};\n\n/** Thread fields with an icon of their own: Messages uses the Threads tab's icon. */\nconst THREAD_FILTER_BAR_ICONS: Record<string, LucideIcon> = {\n traceCount: MessagesSquareIcon,\n};\n\nconst threadFieldBase = (id: string) => ({\n id,\n label: THREAD_FILTER_BAR_LABELS[id] ?? id,\n icon: THREAD_FILTER_BAR_ICONS[id] ?? traceFilterFieldIcon(THREAD_ICON_FIELD_ALIASES[id] ?? id),\n color: traceFilterFieldColor(id),\n});\n\nconst humanize = (value: string) => {\n const words = value.replace(/_/g, ' ');\n return words.charAt(0).toUpperCase() + words.slice(1);\n};\n\nconst ENTITY_TYPE_LABELS: Record<string, string> = Object.fromEntries(\n ROOT_ENTITY_TYPE_OPTIONS.map(option => [option.entityType, option.label]),\n);\n\nconst ENTITY_TYPE_OPTIONS: FilterBarOption[] = Object.values(EntityType)\n .map(value => ({ value, label: ENTITY_TYPE_LABELS[value] ?? humanize(value) }))\n .sort((a, b) => a.label.localeCompare(b.label));\n\nconst STATUS_OPTIONS: FilterBarOption[] = TRACE_STATUS_OPTIONS.filter(option => option.value !== 'running').map(\n option => ({ value: option.value, label: option.label }),\n);\n\n/** FilterBar fields for the threads page: only paths and operators `queryTraceThreads()` accepts. */\nexport function createThreadFilterBarFields({\n entityNames,\n environments,\n}: {\n entityNames: readonly string[];\n environments: readonly string[];\n}): FilterBarField[] {\n const pick = (\n id: string,\n suggestions: FilterBarOption[],\n operators: TraceFilterOperatorId[] = TRACE_STRING_OPERATORS,\n ): FilterBarField => ({ ...threadFieldBase(id), operators, strict: true, suggestions });\n\n const field = (id: string): FilterBarField => {\n switch (id) {\n case 'status':\n return pick(id, STATUS_OPTIONS, TRACE_REQUIRED_STRING_OPERATORS);\n case 'entityType':\n return pick(id, ENTITY_TYPE_OPTIONS);\n case 'entityName':\n return pick(\n id,\n entityNames.map(value => ({ value })),\n );\n case 'environment':\n return pick(\n id,\n environments.map(value => ({ value })),\n );\n case 'traceCount':\n return { ...threadFieldBase(id), type: 'number', operators: TRACE_COUNT_OPERATORS };\n case 'timeToFirstChunkMs':\n return { ...threadFieldBase(id), type: 'number', operators: TRACE_NUMBER_OPERATORS };\n case 'threadId':\n return { ...threadFieldBase(id), operators: TRACE_REQUIRED_STRING_OPERATORS };\n default:\n return { ...threadFieldBase(id), operators: TRACE_STRING_OPERATORS };\n }\n };\n\n return THREAD_FILTER_FIELD_IDS.map(field).sort((a, b) => a.label.localeCompare(b.label));\n}\n\nfunction tokenToThreadQueryPredicate(token: TraceFilterToken): TraceQueryScalarPredicate | undefined {\n const { fieldId } = token;\n if (!FIELD_IDS.has(fieldId)) return undefined;\n const operatorId = token.operatorId ?? 'is';\n const isPresence = operatorId === 'exists' || operatorId === 'notExists';\n\n const rawValues = (Array.isArray(token.value) ? token.value : [token.value]).filter(\n (value): value is string =>\n typeof value === 'string' && Boolean(value.trim()) && !isLegacyAnyValue(value, operatorId),\n );\n if (!rawValues.length && !isPresence) return undefined;\n\n let values: (string | number)[] = rawValues;\n if (NUMBER_FIELD_IDS.has(fieldId)) {\n values = rawValues.map(Number).filter(value => !Number.isNaN(value));\n if (!values.length && !isPresence) return undefined;\n }\n if (fieldId === 'traceCount' && (isPresence || values.length > 1 || !TRACE_COUNT_OPERATORS.includes(operatorId))) {\n return undefined;\n }\n\n const predicate = scalarPredicate(operatorId, fieldId, values);\n if (!predicate) return undefined;\n if ((operatorId === 'isNot' || operatorId === 'notIn') && !REQUIRED_FIELD_IDS.has(fieldId)) {\n return { op: 'or', args: [predicate, { op: 'notExists', path: fieldId }] };\n }\n return predicate;\n}\n\nfunction groupToThreadQueryPredicate(group: TraceFilterGroup): TraceQueryScalarPredicate | undefined {\n const args = group.nodes\n .map(node => (isTraceFilterGroup(node) ? groupToThreadQueryPredicate(node) : tokenToThreadQueryPredicate(node)))\n .filter((predicate): predicate is TraceQueryScalarPredicate => Boolean(predicate));\n if (args.length === 0) return undefined;\n return args.length === 1 ? args[0] : { op: group.logic, args };\n}\n\n/**\n * The thread query `where` for the filter bar's tokens and groups, or `undefined` when nothing applies.\n * Conditions the thread query can't run (unknown fields, unusable values) are left out instead of\n * failing the request.\n */\nexport function buildThreadQueryWhere(\n tokens: TraceFilterToken[],\n groups: TraceFilterGroup[],\n): TraceQueryScalarPredicate | undefined {\n const args = [...tokens.map(tokenToThreadQueryPredicate), ...groups.map(groupToThreadQueryPredicate)].filter(\n (predicate): predicate is TraceQueryScalarPredicate => Boolean(predicate),\n );\n return args.length ? { op: 'and', args } : undefined;\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { D as TRACE_STRING_OPERATORS, S as TRACE_REQUIRED_STRING_OPERATORS, V as isLegacyAnyValue, X as traceFilterFieldIcon, Y as traceFilterFieldColor, l as TRACE_FILTER_BAR_LABELS, lt as scalarPredicate, ot as isTraceFilterGroup, r as ROOT_ENTITY_TYPE_OPTIONS, v as TRACE_NUMBER_OPERATORS, w as TRACE_STATUS_OPTIONS } from "../../trace-filters-BpIMoLTk.js";
|
|
2
|
+
import { MessagesSquareIcon } from "lucide-react";
|
|
2
3
|
import { EntityType } from "@mastra/core/observability";
|
|
3
4
|
// src/domains/threads/thread-filters.ts
|
|
4
5
|
/** Thread query fields the filter bar offers. `startedAt`/`endedAt` are left to the time-range chip. */
|
|
@@ -41,7 +42,7 @@ var TRACE_COUNT_OPERATORS = [
|
|
|
41
42
|
];
|
|
42
43
|
var THREAD_FILTER_BAR_LABELS = {
|
|
43
44
|
...TRACE_FILTER_BAR_LABELS,
|
|
44
|
-
traceCount: "
|
|
45
|
+
traceCount: "Messages",
|
|
45
46
|
timeToFirstChunkMs: "Time to first chunk (ms)",
|
|
46
47
|
executionSource: "Execution source",
|
|
47
48
|
entityType: "Primitive type",
|
|
@@ -49,16 +50,17 @@ var THREAD_FILTER_BAR_LABELS = {
|
|
|
49
50
|
};
|
|
50
51
|
/** Thread fields without their own trace icon borrow the icon of the closest trace field. */
|
|
51
52
|
var THREAD_ICON_FIELD_ALIASES = {
|
|
52
|
-
traceCount: "traceId",
|
|
53
53
|
timeToFirstChunkMs: "durationMs",
|
|
54
54
|
executionSource: "runId",
|
|
55
55
|
entityType: "rootEntityType",
|
|
56
56
|
entityVersionId: "entityId"
|
|
57
57
|
};
|
|
58
|
+
/** Thread fields with an icon of their own: Messages uses the Threads tab's icon. */
|
|
59
|
+
var THREAD_FILTER_BAR_ICONS = { traceCount: MessagesSquareIcon };
|
|
58
60
|
var threadFieldBase = (id) => ({
|
|
59
61
|
id,
|
|
60
62
|
label: THREAD_FILTER_BAR_LABELS[id] ?? id,
|
|
61
|
-
icon: traceFilterFieldIcon(THREAD_ICON_FIELD_ALIASES[id] ?? id),
|
|
63
|
+
icon: THREAD_FILTER_BAR_ICONS[id] ?? traceFilterFieldIcon(THREAD_ICON_FIELD_ALIASES[id] ?? id),
|
|
62
64
|
color: traceFilterFieldColor(id)
|
|
63
65
|
});
|
|
64
66
|
var humanize = (value) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-filters.es.js","names":[],"sources":["../../../src/domains/threads/thread-filters.ts"],"sourcesContent":["import { EntityType } from '@mastra/core/observability';\nimport type { TraceQueryScalarPredicate } from '@mastra/core/storage';\nimport {\n isLegacyAnyValue,\n ROOT_ENTITY_TYPE_OPTIONS,\n TRACE_FILTER_BAR_LABELS,\n TRACE_NUMBER_OPERATORS,\n TRACE_REQUIRED_STRING_OPERATORS,\n TRACE_STATUS_OPTIONS,\n TRACE_STRING_OPERATORS,\n traceFilterFieldColor,\n traceFilterFieldIcon,\n} from '../traces/trace-filters';\nimport { isTraceFilterGroup, scalarPredicate } from '../traces/trace-query-filters';\nimport type { TraceFilterGroup, TraceFilterOperatorId, TraceFilterToken } from '../traces/trace-query-filters';\nimport type { FilterBarField, FilterBarOption } from '@/ds/components/FilterBar/types';\n\n/** Thread query fields the filter bar offers. `startedAt`/`endedAt` are left to the time-range chip. */\nexport const THREAD_FILTER_FIELD_IDS = [\n 'status',\n 'traceCount',\n 'timeToFirstChunkMs',\n 'entityType',\n 'entityId',\n 'entityName',\n 'entityVersionId',\n 'threadId',\n 'resourceId',\n 'userId',\n 'organizationId',\n 'runId',\n 'sessionId',\n 'requestId',\n 'serviceName',\n 'experimentId',\n 'environment',\n 'executionSource',\n] as const;\n\nconst FIELD_IDS: ReadonlySet<string> = new Set(THREAD_FILTER_FIELD_IDS);\nconst NUMBER_FIELD_IDS: ReadonlySet<string> = new Set(['traceCount', 'timeToFirstChunkMs']);\n/** Fields every thread row carries. On any other field, \"is not X\" must also keep threads where it is missing. */\nconst REQUIRED_FIELD_IDS: ReadonlySet<string> = new Set(['threadId', 'status', 'traceCount']);\n/** The thread query compares `traceCount` but has no set membership or presence check for it. */\nconst TRACE_COUNT_OPERATORS: TraceFilterOperatorId[] = ['is', 'isNot', 'gt', 'gte', 'lt', 'lte'];\n\nconst THREAD_FILTER_BAR_LABELS: Record<string, string> = {\n ...TRACE_FILTER_BAR_LABELS,\n traceCount: 'Trace count',\n timeToFirstChunkMs: 'Time to first chunk (ms)',\n executionSource: 'Execution source',\n entityType: 'Primitive type',\n entityVersionId: 'Primitive version ID',\n};\n\n/** Thread fields without their own trace icon borrow the icon of the closest trace field. */\nconst THREAD_ICON_FIELD_ALIASES: Record<string, string> = {\n traceCount: 'traceId',\n timeToFirstChunkMs: 'durationMs',\n executionSource: 'runId',\n entityType: 'rootEntityType',\n entityVersionId: 'entityId',\n};\n\nconst threadFieldBase = (id: string) => ({\n id,\n label: THREAD_FILTER_BAR_LABELS[id] ?? id,\n icon: traceFilterFieldIcon(THREAD_ICON_FIELD_ALIASES[id] ?? id),\n color: traceFilterFieldColor(id),\n});\n\nconst humanize = (value: string) => {\n const words = value.replace(/_/g, ' ');\n return words.charAt(0).toUpperCase() + words.slice(1);\n};\n\nconst ENTITY_TYPE_LABELS: Record<string, string> = Object.fromEntries(\n ROOT_ENTITY_TYPE_OPTIONS.map(option => [option.entityType, option.label]),\n);\n\nconst ENTITY_TYPE_OPTIONS: FilterBarOption[] = Object.values(EntityType)\n .map(value => ({ value, label: ENTITY_TYPE_LABELS[value] ?? humanize(value) }))\n .sort((a, b) => a.label.localeCompare(b.label));\n\nconst STATUS_OPTIONS: FilterBarOption[] = TRACE_STATUS_OPTIONS.filter(option => option.value !== 'running').map(\n option => ({ value: option.value, label: option.label }),\n);\n\n/** FilterBar fields for the threads page: only paths and operators `queryTraceThreads()` accepts. */\nexport function createThreadFilterBarFields({\n entityNames,\n environments,\n}: {\n entityNames: readonly string[];\n environments: readonly string[];\n}): FilterBarField[] {\n const pick = (\n id: string,\n suggestions: FilterBarOption[],\n operators: TraceFilterOperatorId[] = TRACE_STRING_OPERATORS,\n ): FilterBarField => ({ ...threadFieldBase(id), operators, strict: true, suggestions });\n\n const field = (id: string): FilterBarField => {\n switch (id) {\n case 'status':\n return pick(id, STATUS_OPTIONS, TRACE_REQUIRED_STRING_OPERATORS);\n case 'entityType':\n return pick(id, ENTITY_TYPE_OPTIONS);\n case 'entityName':\n return pick(\n id,\n entityNames.map(value => ({ value })),\n );\n case 'environment':\n return pick(\n id,\n environments.map(value => ({ value })),\n );\n case 'traceCount':\n return { ...threadFieldBase(id), type: 'number', operators: TRACE_COUNT_OPERATORS };\n case 'timeToFirstChunkMs':\n return { ...threadFieldBase(id), type: 'number', operators: TRACE_NUMBER_OPERATORS };\n case 'threadId':\n return { ...threadFieldBase(id), operators: TRACE_REQUIRED_STRING_OPERATORS };\n default:\n return { ...threadFieldBase(id), operators: TRACE_STRING_OPERATORS };\n }\n };\n\n return THREAD_FILTER_FIELD_IDS.map(field).sort((a, b) => a.label.localeCompare(b.label));\n}\n\nfunction tokenToThreadQueryPredicate(token: TraceFilterToken): TraceQueryScalarPredicate | undefined {\n const { fieldId } = token;\n if (!FIELD_IDS.has(fieldId)) return undefined;\n const operatorId = token.operatorId ?? 'is';\n const isPresence = operatorId === 'exists' || operatorId === 'notExists';\n\n const rawValues = (Array.isArray(token.value) ? token.value : [token.value]).filter(\n (value): value is string =>\n typeof value === 'string' && Boolean(value.trim()) && !isLegacyAnyValue(value, operatorId),\n );\n if (!rawValues.length && !isPresence) return undefined;\n\n let values: (string | number)[] = rawValues;\n if (NUMBER_FIELD_IDS.has(fieldId)) {\n values = rawValues.map(Number).filter(value => !Number.isNaN(value));\n if (!values.length && !isPresence) return undefined;\n }\n if (fieldId === 'traceCount' && (isPresence || values.length > 1 || !TRACE_COUNT_OPERATORS.includes(operatorId))) {\n return undefined;\n }\n\n const predicate = scalarPredicate(operatorId, fieldId, values);\n if (!predicate) return undefined;\n if ((operatorId === 'isNot' || operatorId === 'notIn') && !REQUIRED_FIELD_IDS.has(fieldId)) {\n return { op: 'or', args: [predicate, { op: 'notExists', path: fieldId }] };\n }\n return predicate;\n}\n\nfunction groupToThreadQueryPredicate(group: TraceFilterGroup): TraceQueryScalarPredicate | undefined {\n const args = group.nodes\n .map(node => (isTraceFilterGroup(node) ? groupToThreadQueryPredicate(node) : tokenToThreadQueryPredicate(node)))\n .filter((predicate): predicate is TraceQueryScalarPredicate => Boolean(predicate));\n if (args.length === 0) return undefined;\n return args.length === 1 ? args[0] : { op: group.logic, args };\n}\n\n/**\n * The thread query `where` for the filter bar's tokens and groups, or `undefined` when nothing applies.\n * Conditions the thread query can't run (unknown fields, unusable values) are left out instead of\n * failing the request.\n */\nexport function buildThreadQueryWhere(\n tokens: TraceFilterToken[],\n groups: TraceFilterGroup[],\n): TraceQueryScalarPredicate | undefined {\n const args = [...tokens.map(tokenToThreadQueryPredicate), ...groups.map(groupToThreadQueryPredicate)].filter(\n (predicate): predicate is TraceQueryScalarPredicate => Boolean(predicate),\n );\n return args.length ? { op: 'and', args } : undefined;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"thread-filters.es.js","names":[],"sources":["../../../src/domains/threads/thread-filters.ts"],"sourcesContent":["import { EntityType } from '@mastra/core/observability';\nimport type { TraceQueryScalarPredicate } from '@mastra/core/storage';\nimport { MessagesSquareIcon } from 'lucide-react';\nimport type { LucideIcon } from 'lucide-react';\nimport {\n isLegacyAnyValue,\n ROOT_ENTITY_TYPE_OPTIONS,\n TRACE_FILTER_BAR_LABELS,\n TRACE_NUMBER_OPERATORS,\n TRACE_REQUIRED_STRING_OPERATORS,\n TRACE_STATUS_OPTIONS,\n TRACE_STRING_OPERATORS,\n traceFilterFieldColor,\n traceFilterFieldIcon,\n} from '../traces/trace-filters';\nimport { isTraceFilterGroup, scalarPredicate } from '../traces/trace-query-filters';\nimport type { TraceFilterGroup, TraceFilterOperatorId, TraceFilterToken } from '../traces/trace-query-filters';\nimport type { FilterBarField, FilterBarOption } from '@/ds/components/FilterBar/types';\n\n/** Thread query fields the filter bar offers. `startedAt`/`endedAt` are left to the time-range chip. */\nexport const THREAD_FILTER_FIELD_IDS = [\n 'status',\n 'traceCount',\n 'timeToFirstChunkMs',\n 'entityType',\n 'entityId',\n 'entityName',\n 'entityVersionId',\n 'threadId',\n 'resourceId',\n 'userId',\n 'organizationId',\n 'runId',\n 'sessionId',\n 'requestId',\n 'serviceName',\n 'experimentId',\n 'environment',\n 'executionSource',\n] as const;\n\nconst FIELD_IDS: ReadonlySet<string> = new Set(THREAD_FILTER_FIELD_IDS);\nconst NUMBER_FIELD_IDS: ReadonlySet<string> = new Set(['traceCount', 'timeToFirstChunkMs']);\n/** Fields every thread row carries. On any other field, \"is not X\" must also keep threads where it is missing. */\nconst REQUIRED_FIELD_IDS: ReadonlySet<string> = new Set(['threadId', 'status', 'traceCount']);\n/** The thread query compares `traceCount` but has no set membership or presence check for it. */\nconst TRACE_COUNT_OPERATORS: TraceFilterOperatorId[] = ['is', 'isNot', 'gt', 'gte', 'lt', 'lte'];\n\nconst THREAD_FILTER_BAR_LABELS: Record<string, string> = {\n ...TRACE_FILTER_BAR_LABELS,\n traceCount: 'Messages',\n timeToFirstChunkMs: 'Time to first chunk (ms)',\n executionSource: 'Execution source',\n entityType: 'Primitive type',\n entityVersionId: 'Primitive version ID',\n};\n\n/** Thread fields without their own trace icon borrow the icon of the closest trace field. */\nconst THREAD_ICON_FIELD_ALIASES: Record<string, string> = {\n timeToFirstChunkMs: 'durationMs',\n executionSource: 'runId',\n entityType: 'rootEntityType',\n entityVersionId: 'entityId',\n};\n\n/** Thread fields with an icon of their own: Messages uses the Threads tab's icon. */\nconst THREAD_FILTER_BAR_ICONS: Record<string, LucideIcon> = {\n traceCount: MessagesSquareIcon,\n};\n\nconst threadFieldBase = (id: string) => ({\n id,\n label: THREAD_FILTER_BAR_LABELS[id] ?? id,\n icon: THREAD_FILTER_BAR_ICONS[id] ?? traceFilterFieldIcon(THREAD_ICON_FIELD_ALIASES[id] ?? id),\n color: traceFilterFieldColor(id),\n});\n\nconst humanize = (value: string) => {\n const words = value.replace(/_/g, ' ');\n return words.charAt(0).toUpperCase() + words.slice(1);\n};\n\nconst ENTITY_TYPE_LABELS: Record<string, string> = Object.fromEntries(\n ROOT_ENTITY_TYPE_OPTIONS.map(option => [option.entityType, option.label]),\n);\n\nconst ENTITY_TYPE_OPTIONS: FilterBarOption[] = Object.values(EntityType)\n .map(value => ({ value, label: ENTITY_TYPE_LABELS[value] ?? humanize(value) }))\n .sort((a, b) => a.label.localeCompare(b.label));\n\nconst STATUS_OPTIONS: FilterBarOption[] = TRACE_STATUS_OPTIONS.filter(option => option.value !== 'running').map(\n option => ({ value: option.value, label: option.label }),\n);\n\n/** FilterBar fields for the threads page: only paths and operators `queryTraceThreads()` accepts. */\nexport function createThreadFilterBarFields({\n entityNames,\n environments,\n}: {\n entityNames: readonly string[];\n environments: readonly string[];\n}): FilterBarField[] {\n const pick = (\n id: string,\n suggestions: FilterBarOption[],\n operators: TraceFilterOperatorId[] = TRACE_STRING_OPERATORS,\n ): FilterBarField => ({ ...threadFieldBase(id), operators, strict: true, suggestions });\n\n const field = (id: string): FilterBarField => {\n switch (id) {\n case 'status':\n return pick(id, STATUS_OPTIONS, TRACE_REQUIRED_STRING_OPERATORS);\n case 'entityType':\n return pick(id, ENTITY_TYPE_OPTIONS);\n case 'entityName':\n return pick(\n id,\n entityNames.map(value => ({ value })),\n );\n case 'environment':\n return pick(\n id,\n environments.map(value => ({ value })),\n );\n case 'traceCount':\n return { ...threadFieldBase(id), type: 'number', operators: TRACE_COUNT_OPERATORS };\n case 'timeToFirstChunkMs':\n return { ...threadFieldBase(id), type: 'number', operators: TRACE_NUMBER_OPERATORS };\n case 'threadId':\n return { ...threadFieldBase(id), operators: TRACE_REQUIRED_STRING_OPERATORS };\n default:\n return { ...threadFieldBase(id), operators: TRACE_STRING_OPERATORS };\n }\n };\n\n return THREAD_FILTER_FIELD_IDS.map(field).sort((a, b) => a.label.localeCompare(b.label));\n}\n\nfunction tokenToThreadQueryPredicate(token: TraceFilterToken): TraceQueryScalarPredicate | undefined {\n const { fieldId } = token;\n if (!FIELD_IDS.has(fieldId)) return undefined;\n const operatorId = token.operatorId ?? 'is';\n const isPresence = operatorId === 'exists' || operatorId === 'notExists';\n\n const rawValues = (Array.isArray(token.value) ? token.value : [token.value]).filter(\n (value): value is string =>\n typeof value === 'string' && Boolean(value.trim()) && !isLegacyAnyValue(value, operatorId),\n );\n if (!rawValues.length && !isPresence) return undefined;\n\n let values: (string | number)[] = rawValues;\n if (NUMBER_FIELD_IDS.has(fieldId)) {\n values = rawValues.map(Number).filter(value => !Number.isNaN(value));\n if (!values.length && !isPresence) return undefined;\n }\n if (fieldId === 'traceCount' && (isPresence || values.length > 1 || !TRACE_COUNT_OPERATORS.includes(operatorId))) {\n return undefined;\n }\n\n const predicate = scalarPredicate(operatorId, fieldId, values);\n if (!predicate) return undefined;\n if ((operatorId === 'isNot' || operatorId === 'notIn') && !REQUIRED_FIELD_IDS.has(fieldId)) {\n return { op: 'or', args: [predicate, { op: 'notExists', path: fieldId }] };\n }\n return predicate;\n}\n\nfunction groupToThreadQueryPredicate(group: TraceFilterGroup): TraceQueryScalarPredicate | undefined {\n const args = group.nodes\n .map(node => (isTraceFilterGroup(node) ? groupToThreadQueryPredicate(node) : tokenToThreadQueryPredicate(node)))\n .filter((predicate): predicate is TraceQueryScalarPredicate => Boolean(predicate));\n if (args.length === 0) return undefined;\n return args.length === 1 ? args[0] : { op: group.logic, args };\n}\n\n/**\n * The thread query `where` for the filter bar's tokens and groups, or `undefined` when nothing applies.\n * Conditions the thread query can't run (unknown fields, unusable values) are left out instead of\n * failing the request.\n */\nexport function buildThreadQueryWhere(\n tokens: TraceFilterToken[],\n groups: TraceFilterGroup[],\n): TraceQueryScalarPredicate | undefined {\n const args = [...tokens.map(tokenToThreadQueryPredicate), ...groups.map(groupToThreadQueryPredicate)].filter(\n (predicate): predicate is TraceQueryScalarPredicate => Boolean(predicate),\n );\n return args.length ? { op: 'and', args } : undefined;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-list-row.cjs.js","names":[],"sources":["../../../src/domains/threads/thread-list-row.ts"],"sourcesContent":["import type { ThreadRow } from '@mastra/react/hooks/traces';\nimport type { TracesListViewTrace } from '@/domains/traces/components/traces-list-view';\n\n// A thread spans several traces; its latest one keys the row, since it is unique per thread.\nexport function threadToListRow(thread: ThreadRow): TracesListViewTrace {\n return {\n traceId: thread.lastTraceId,\n name: thread.entityName ?? thread.threadId,\n entityType: thread.entityType,\n entityId: thread.entityId,\n entityName: thread.entityName,\n threadId: thread.threadId,\n resourceId: thread.resourceId,\n environment: thread.environment,\n status: thread.status,\n inputPreview: thread.inputPreview,\n outputPreview: thread.outputPreview ?? undefined,\n errorPreview: thread.errorPreview ?? undefined,\n startedAt: thread.startedAt,\n endedAt: thread.endedAt,\n createdAt: thread.startedAt,\n };\n}\n"],"mappings":";;AAIA,SAAgB,gBAAgB,QAAwC;CACtE,OAAO;EACL,SAAS,OAAO;EAChB,MAAM,OAAO,cAAc,OAAO;EAClC,YAAY,OAAO;EACnB,UAAU,OAAO;EACjB,YAAY,OAAO;EACnB,UAAU,OAAO;EACjB,YAAY,OAAO;EACnB,aAAa,OAAO;EACpB,QAAQ,OAAO;EACf,cAAc,OAAO;EACrB,eAAe,OAAO,iBAAiB,KAAA;EACvC,cAAc,OAAO,gBAAgB,KAAA;EACrC,WAAW,OAAO;EAClB,SAAS,OAAO;EAChB,WAAW,OAAO;CACpB;AACF"}
|
|
1
|
+
{"version":3,"file":"thread-list-row.cjs.js","names":[],"sources":["../../../src/domains/threads/thread-list-row.ts"],"sourcesContent":["import type { ThreadRow } from '@mastra/react/hooks/traces';\nimport type { TracesListViewTrace } from '@/domains/traces/components/traces-list-view';\n\n// A thread spans several traces; its latest one keys the row, since it is unique per thread.\nexport function threadToListRow(thread: ThreadRow): TracesListViewTrace {\n return {\n traceId: thread.lastTraceId,\n name: thread.entityName ?? thread.threadId,\n entityType: thread.entityType,\n entityId: thread.entityId,\n entityName: thread.entityName,\n threadId: thread.threadId,\n resourceId: thread.resourceId,\n environment: thread.environment,\n status: thread.status,\n inputPreview: thread.inputPreview,\n outputPreview: thread.outputPreview ?? undefined,\n errorPreview: thread.errorPreview ?? undefined,\n startedAt: thread.startedAt,\n endedAt: thread.endedAt,\n traceCount: thread.traceCount,\n createdAt: thread.startedAt,\n };\n}\n"],"mappings":";;AAIA,SAAgB,gBAAgB,QAAwC;CACtE,OAAO;EACL,SAAS,OAAO;EAChB,MAAM,OAAO,cAAc,OAAO;EAClC,YAAY,OAAO;EACnB,UAAU,OAAO;EACjB,YAAY,OAAO;EACnB,UAAU,OAAO;EACjB,YAAY,OAAO;EACnB,aAAa,OAAO;EACpB,QAAQ,OAAO;EACf,cAAc,OAAO;EACrB,eAAe,OAAO,iBAAiB,KAAA;EACvC,cAAc,OAAO,gBAAgB,KAAA;EACrC,WAAW,OAAO;EAClB,SAAS,OAAO;EAChB,YAAY,OAAO;EACnB,WAAW,OAAO;CACpB;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-list-row.es.js","names":[],"sources":["../../../src/domains/threads/thread-list-row.ts"],"sourcesContent":["import type { ThreadRow } from '@mastra/react/hooks/traces';\nimport type { TracesListViewTrace } from '@/domains/traces/components/traces-list-view';\n\n// A thread spans several traces; its latest one keys the row, since it is unique per thread.\nexport function threadToListRow(thread: ThreadRow): TracesListViewTrace {\n return {\n traceId: thread.lastTraceId,\n name: thread.entityName ?? thread.threadId,\n entityType: thread.entityType,\n entityId: thread.entityId,\n entityName: thread.entityName,\n threadId: thread.threadId,\n resourceId: thread.resourceId,\n environment: thread.environment,\n status: thread.status,\n inputPreview: thread.inputPreview,\n outputPreview: thread.outputPreview ?? undefined,\n errorPreview: thread.errorPreview ?? undefined,\n startedAt: thread.startedAt,\n endedAt: thread.endedAt,\n createdAt: thread.startedAt,\n };\n}\n"],"mappings":";AAIA,SAAgB,gBAAgB,QAAwC;CACtE,OAAO;EACL,SAAS,OAAO;EAChB,MAAM,OAAO,cAAc,OAAO;EAClC,YAAY,OAAO;EACnB,UAAU,OAAO;EACjB,YAAY,OAAO;EACnB,UAAU,OAAO;EACjB,YAAY,OAAO;EACnB,aAAa,OAAO;EACpB,QAAQ,OAAO;EACf,cAAc,OAAO;EACrB,eAAe,OAAO,iBAAiB,KAAA;EACvC,cAAc,OAAO,gBAAgB,KAAA;EACrC,WAAW,OAAO;EAClB,SAAS,OAAO;EAChB,WAAW,OAAO;CACpB;AACF"}
|
|
1
|
+
{"version":3,"file":"thread-list-row.es.js","names":[],"sources":["../../../src/domains/threads/thread-list-row.ts"],"sourcesContent":["import type { ThreadRow } from '@mastra/react/hooks/traces';\nimport type { TracesListViewTrace } from '@/domains/traces/components/traces-list-view';\n\n// A thread spans several traces; its latest one keys the row, since it is unique per thread.\nexport function threadToListRow(thread: ThreadRow): TracesListViewTrace {\n return {\n traceId: thread.lastTraceId,\n name: thread.entityName ?? thread.threadId,\n entityType: thread.entityType,\n entityId: thread.entityId,\n entityName: thread.entityName,\n threadId: thread.threadId,\n resourceId: thread.resourceId,\n environment: thread.environment,\n status: thread.status,\n inputPreview: thread.inputPreview,\n outputPreview: thread.outputPreview ?? undefined,\n errorPreview: thread.errorPreview ?? undefined,\n startedAt: thread.startedAt,\n endedAt: thread.endedAt,\n traceCount: thread.traceCount,\n createdAt: thread.startedAt,\n };\n}\n"],"mappings":";AAIA,SAAgB,gBAAgB,QAAwC;CACtE,OAAO;EACL,SAAS,OAAO;EAChB,MAAM,OAAO,cAAc,OAAO;EAClC,YAAY,OAAO;EACnB,UAAU,OAAO;EACjB,YAAY,OAAO;EACnB,UAAU,OAAO;EACjB,YAAY,OAAO;EACnB,aAAa,OAAO;EACpB,QAAQ,OAAO;EACf,cAAc,OAAO;EACrB,eAAe,OAAO,iBAAiB,KAAA;EACvC,cAAc,OAAO,gBAAgB,KAAA;EACrC,WAAW,OAAO;EAClB,SAAS,OAAO;EAChB,YAAY,OAAO;EACnB,WAAW,OAAO;CACpB;AACF"}
|