@mastra/playground-ui 60.1.0-alpha.1 → 60.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/components/LogsDataList.cjs.js +0 -2
  2. package/dist/components/LogsDataList.cjs.js.map +1 -1
  3. package/dist/components/LogsDataList.es.js +0 -2
  4. package/dist/components/LogsDataList.es.js.map +1 -1
  5. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +2 -2
  6. package/dist/domains/chat/tools/badges/workflow-badge.es.js +2 -2
  7. package/dist/domains/scores/components/trace-scores-tab.cjs.js +0 -1
  8. package/dist/domains/scores/components/trace-scores-tab.cjs.js.map +1 -1
  9. package/dist/domains/scores/components/trace-scores-tab.es.js +0 -1
  10. package/dist/domains/scores/components/trace-scores-tab.es.js.map +1 -1
  11. package/dist/domains/traces/components/thread-view-by-trace.cjs.js +0 -1
  12. package/dist/domains/traces/components/thread-view-by-trace.cjs.js.map +1 -1
  13. package/dist/domains/traces/components/thread-view-by-trace.es.js +0 -1
  14. package/dist/domains/traces/components/thread-view-by-trace.es.js.map +1 -1
  15. package/dist/domains/traces/components/trace-data-panel.cjs.js +0 -2
  16. package/dist/domains/traces/components/trace-data-panel.cjs.js.map +1 -1
  17. package/dist/domains/traces/components/trace-data-panel.es.js +0 -2
  18. package/dist/domains/traces/components/trace-data-panel.es.js.map +1 -1
  19. package/dist/domains/traces/components/traces-page-skeleton.cjs.js +0 -2
  20. package/dist/domains/traces/components/traces-page-skeleton.cjs.js.map +1 -1
  21. package/dist/domains/traces/components/traces-page-skeleton.es.js +0 -2
  22. package/dist/domains/traces/components/traces-page-skeleton.es.js.map +1 -1
  23. package/dist/domains/workflows/workflow/workflow-input-data.cjs.js +1 -0
  24. package/dist/domains/workflows/workflow/workflow-input-data.cjs.js.map +1 -1
  25. package/dist/domains/workflows/workflow/workflow-input-data.es.js +1 -0
  26. package/dist/domains/workflows/workflow/workflow-input-data.es.js.map +1 -1
  27. package/dist/ee/signals/components/entity-index-list.cjs.js +0 -2
  28. package/dist/ee/signals/components/entity-index-list.cjs.js.map +1 -1
  29. package/dist/ee/signals/components/entity-index-list.es.js +0 -2
  30. package/dist/ee/signals/components/entity-index-list.es.js.map +1 -1
  31. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +0 -1
  32. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js.map +1 -1
  33. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +0 -1
  34. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js.map +1 -1
  35. package/package.json +11 -11
@@ -4,8 +4,6 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
5
  const logsDataList = require('../logs-data-list-CtHern11.cjs');
6
6
  const dataListSkeleton = require('../data-list-skeleton-BXPfL0s7.cjs');
7
- require('react');
8
- require('../keyboard/keyboard-shortcuts-context.cjs.js');
9
7
 
10
8
 
11
9
 
@@ -1 +1 @@
1
- {"version":3,"file":"LogsDataList.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
1
+ {"version":3,"file":"LogsDataList.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
@@ -1,5 +1,3 @@
1
1
  export { L as LogsDataList } from '../logs-data-list-ButZV-2H.js';
2
2
  export { D as LogsDataListSkeleton } from '../data-list-skeleton-Bk9LI0J0.js';
3
- import 'react';
4
- import '../keyboard/keyboard-shortcuts-context.es.js';
5
3
  //# sourceMappingURL=LogsDataList.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LogsDataList.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
1
+ {"version":3,"file":"LogsDataList.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -17,7 +17,6 @@ const domains_workflows_context_workflowRunContext = require('../../../workflows
17
17
  require('@mastra/react');
18
18
  require('@tanstack/react-query');
19
19
  const domains_workflows_hooks_useWorkflow = require('../../../workflows/hooks/use-workflow.cjs.js');
20
- require('../../../../toast-nm-fM7BR.cjs');
21
20
  const domains_workflows_context_workflowStepDetailContext = require('../../../workflows/context/workflow-step-detail-context.cjs.js');
22
21
  const domains_workflows_context_workflowStepDetailProvider = require('../../../workflows/context/workflow-step-detail-provider.cjs.js');
23
22
  const domains_workflows_context_workflowSelectedStepContext = require('../../../workflows/context/workflow-selected-step-context.cjs.js');
@@ -34,14 +33,15 @@ require('react-hook-form');
34
33
  require('../../../../lib/form/field-context.cjs.js');
35
34
  require('../../../../lib/form/utils.cjs.js');
36
35
  require('date-fns');
36
+ require('../../../../popover-lBqKiPtp.cjs');
37
37
  require('@autoform/core');
38
38
  require('@autoform/react');
39
39
  require('../../../../lib/form/components/form.cjs.js');
40
40
  require('@lukeed/uuid');
41
41
  require('../../../../lib/form/dynamic-form.cjs.js');
42
42
  const icons_WorkflowIcon = require('../../../../icons/WorkflowIcon.cjs.js');
43
+ require('../../../../scroll-area-CEuf7Omb.cjs');
43
44
  require('@mastra/client-js');
44
- require('../../../../keyboard/keyboard-shortcuts-context.cjs.js');
45
45
  const lib_framework = require('../../../../lib/framework.cjs.js');
46
46
  require('../../../workflows/components/workflow-information.cjs.js');
47
47
  require('@base-ui/react/combobox');
@@ -13,7 +13,6 @@ import { WorkflowRunContext } from '../../../workflows/context/workflow-run-cont
13
13
  import '@mastra/react';
14
14
  import '@tanstack/react-query';
15
15
  import { useWorkflow } from '../../../workflows/hooks/use-workflow.es.js';
16
- import '../../../../toast-c5kCpyWt.js';
17
16
  import { useWorkflowStepDetail } from '../../../workflows/context/workflow-step-detail-context.es.js';
18
17
  import { WorkflowStepDetailProvider } from '../../../workflows/context/workflow-step-detail-provider.es.js';
19
18
  import { WorkflowSelectedStepProvider } from '../../../workflows/context/workflow-selected-step-context.es.js';
@@ -30,14 +29,15 @@ import 'react-hook-form';
30
29
  import '../../../../lib/form/field-context.es.js';
31
30
  import '../../../../lib/form/utils.es.js';
32
31
  import 'date-fns';
32
+ import '../../../../popover-Dg70UGyn.js';
33
33
  import '@autoform/core';
34
34
  import '@autoform/react';
35
35
  import '../../../../lib/form/components/form.es.js';
36
36
  import '@lukeed/uuid';
37
37
  import '../../../../lib/form/dynamic-form.es.js';
38
38
  import { WorkflowIcon } from '../../../../icons/WorkflowIcon.es.js';
39
+ import '../../../../scroll-area-Ds-fJn5M.js';
39
40
  import '@mastra/client-js';
40
- import '../../../../keyboard/keyboard-shortcuts-context.es.js';
41
41
  import { useLinkComponent } from '../../../../lib/framework.es.js';
42
42
  import '../../../workflows/components/workflow-information.es.js';
43
43
  import '@base-ui/react/combobox';
@@ -8,7 +8,6 @@ const React = require('react');
8
8
  const domains_scores_hooks_useTraceSpanScores = require('../hooks/use-trace-span-scores.cjs.js');
9
9
  const Button = require('../../../Button-CXhSUBxN.cjs');
10
10
  const dataList = require('../../../data-list-Y42KyuI1.cjs');
11
- require('../../../keyboard/keyboard-shortcuts-context.cjs.js');
12
11
  const EmptyState = require('../../../EmptyState-CuoMGNP0.cjs');
13
12
  const metricsKpiCard = require('../../../metrics-kpi-card-1hbihR2T.cjs');
14
13
  const spinner = require('../../../spinner-BCpN7LL9.cjs');
@@ -1 +1 @@
1
- {"version":3,"file":"trace-scores-tab.cjs.js","sources":["../../../../src/domains/scores/components/trace-scores-tab.tsx"],"sourcesContent":["import type { ClientScoreRowData, ListScoresResponse } from '@mastra/client-js';\nimport { ExternalLinkIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { useTraceSpanScores } from '../hooks/use-trace-span-scores';\nimport { Button } from '@/ds/components/Button';\nimport { DataList } from '@/ds/components/DataList';\nimport { EmptyState } from '@/ds/components/EmptyState';\nimport { MetricsKpiCard } from '@/ds/components/MetricsKpiCard';\nimport { Spinner } from '@/ds/components/Spinner';\nimport { getShortId } from '@/ds/components/Text';\nimport { Txt } from '@/ds/components/Txt';\nimport { controlStateColorTransition } from '@/ds/primitives/transitions';\nimport { quietTextHover } from '@/ds/primitives/typography';\nimport { useLinkComponent } from '@/lib/framework';\nimport { cn } from '@/utils/cn';\nimport { formatDate } from '@/utils/date-format';\n\nconst REASON_PREVIEW_LENGTH = 100;\n\nexport type TraceScoresTabProps = {\n traceId: string;\n spanId: string;\n onScoreSelect: (scoreId: string) => void;\n};\n\n/**\n * Scores for the trace's anchor span, one card per scoring. Owns its own pagination:\n * mount it with a `key` on the trace/anchor pair so a page index never leaks across traces.\n */\nexport function TraceScoresTab({ traceId, spanId, onScoreSelect }: TraceScoresTabProps) {\n const [page, setPage] = useState(0);\n const { data: scoresData, isLoading } = useTraceSpanScores({ traceId, spanId, page });\n\n if (isLoading) {\n return (\n <div className=\"flex justify-center py-6\">\n <Spinner size=\"md\" variant=\"pulse\" className=\"text-placeholder\" />\n </div>\n );\n }\n\n const scores = scoresData?.scores ?? [];\n\n if (scores.length === 0) {\n return <EmptyState titleSlot=\"No scores yet\" descriptionSlot=\"Score this trace to see results here.\" />;\n }\n\n return (\n <div className=\"grid content-start gap-3\">\n {scores.map(score => (\n <TraceScoreCard key={score.id} score={score} onSelect={() => onScoreSelect(score.id)} />\n ))}\n <TraceScoresPagination pagination={scoresData?.pagination} onPageChange={setPage} />\n </div>\n );\n}\n\nfunction TraceScoreCard({ score, onSelect }: { score: ClientScoreRowData; onSelect: () => void }) {\n const createdAt = new Date(score.createdAt);\n const scorerName = String(score.scorer?.name || score.scorer?.id || 'Scorer');\n const { Link, paths } = useLinkComponent();\n const scorerHref = paths.scorerLink(score.scorerId, { scoreId: score.id });\n\n return (\n <MetricsKpiCard className=\"min-w-0\">\n <button\n type=\"button\"\n onClick={onSelect}\n aria-label={`Score ${getShortId(score.id)}`}\n className=\"grid gap-1 text-left\"\n >\n <MetricsKpiCard.Label>{scorerName}</MetricsKpiCard.Label>\n <MetricsKpiCard.Value>{String(score.score)}</MetricsKpiCard.Value>\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\" className=\"tabular-nums\">\n <Txt as=\"span\" variant=\"meta\" font=\"mono\">\n {getShortId(score.id)}\n </Txt>{' '}\n · {formatDate(createdAt, 'date-time-seconds')}\n </Txt>\n </button>\n {score.reason && <TraceScoreReason reason={score.reason} />}\n {scorerHref && (\n <Button\n render={<Link href={scorerHref} />}\n variant=\"ghost\"\n size=\"sm\"\n className=\"-ml-2 justify-self-start\"\n icon={<ExternalLinkIcon />}\n >\n Open scorer run\n </Button>\n )}\n </MetricsKpiCard>\n );\n}\n\nfunction TraceScoreReason({ reason }: { reason: string }) {\n const [expanded, setExpanded] = useState(false);\n const isLong = reason.length > REASON_PREVIEW_LENGTH;\n const text = isLong && !expanded ? `${reason.slice(0, REASON_PREVIEW_LENGTH).trimEnd()}…` : reason;\n\n return (\n <Txt variant=\"caption\" tone=\"faint\">\n {text}\n {isLong && (\n <>\n {' '}\n <button\n type=\"button\"\n onClick={() => setExpanded(value => !value)}\n className={cn(quietTextHover, controlStateColorTransition, 'underline underline-offset-2')}\n >\n {expanded ? 'Read less' : 'Read more'}\n </button>\n </>\n )}\n </Txt>\n );\n}\n\nfunction TraceScoresPagination({\n pagination,\n onPageChange,\n}: {\n pagination?: ListScoresResponse['pagination'];\n onPageChange: (page: number) => void;\n}) {\n const currentPage = pagination?.page ?? 0;\n if (currentPage === 0 && !pagination?.hasMore) return null;\n\n return (\n <DataList.Pagination\n currentPage={currentPage}\n hasMore={pagination?.hasMore}\n onNextPage={() => onPageChange(currentPage + 1)}\n onPrevPage={() => onPageChange(currentPage - 1)}\n />\n );\n}\n"],"names":["useState","useTraceSpanScores","jsx","Spinner","EmptyState","jsxs","useLinkComponent","MetricsKpiCard","getShortId","Txt","formatDate","Button","ExternalLinkIcon","Fragment","cn","quietTextHover","controlStateColorTransition","DataList"],"mappings":"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"}
1
+ {"version":3,"file":"trace-scores-tab.cjs.js","sources":["../../../../src/domains/scores/components/trace-scores-tab.tsx"],"sourcesContent":["import type { ClientScoreRowData, ListScoresResponse } from '@mastra/client-js';\nimport { ExternalLinkIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { useTraceSpanScores } from '../hooks/use-trace-span-scores';\nimport { Button } from '@/ds/components/Button';\nimport { DataList } from '@/ds/components/DataList';\nimport { EmptyState } from '@/ds/components/EmptyState';\nimport { MetricsKpiCard } from '@/ds/components/MetricsKpiCard';\nimport { Spinner } from '@/ds/components/Spinner';\nimport { getShortId } from '@/ds/components/Text';\nimport { Txt } from '@/ds/components/Txt';\nimport { controlStateColorTransition } from '@/ds/primitives/transitions';\nimport { quietTextHover } from '@/ds/primitives/typography';\nimport { useLinkComponent } from '@/lib/framework';\nimport { cn } from '@/utils/cn';\nimport { formatDate } from '@/utils/date-format';\n\nconst REASON_PREVIEW_LENGTH = 100;\n\nexport type TraceScoresTabProps = {\n traceId: string;\n spanId: string;\n onScoreSelect: (scoreId: string) => void;\n};\n\n/**\n * Scores for the trace's anchor span, one card per scoring. Owns its own pagination:\n * mount it with a `key` on the trace/anchor pair so a page index never leaks across traces.\n */\nexport function TraceScoresTab({ traceId, spanId, onScoreSelect }: TraceScoresTabProps) {\n const [page, setPage] = useState(0);\n const { data: scoresData, isLoading } = useTraceSpanScores({ traceId, spanId, page });\n\n if (isLoading) {\n return (\n <div className=\"flex justify-center py-6\">\n <Spinner size=\"md\" variant=\"pulse\" className=\"text-placeholder\" />\n </div>\n );\n }\n\n const scores = scoresData?.scores ?? [];\n\n if (scores.length === 0) {\n return <EmptyState titleSlot=\"No scores yet\" descriptionSlot=\"Score this trace to see results here.\" />;\n }\n\n return (\n <div className=\"grid content-start gap-3\">\n {scores.map(score => (\n <TraceScoreCard key={score.id} score={score} onSelect={() => onScoreSelect(score.id)} />\n ))}\n <TraceScoresPagination pagination={scoresData?.pagination} onPageChange={setPage} />\n </div>\n );\n}\n\nfunction TraceScoreCard({ score, onSelect }: { score: ClientScoreRowData; onSelect: () => void }) {\n const createdAt = new Date(score.createdAt);\n const scorerName = String(score.scorer?.name || score.scorer?.id || 'Scorer');\n const { Link, paths } = useLinkComponent();\n const scorerHref = paths.scorerLink(score.scorerId, { scoreId: score.id });\n\n return (\n <MetricsKpiCard className=\"min-w-0\">\n <button\n type=\"button\"\n onClick={onSelect}\n aria-label={`Score ${getShortId(score.id)}`}\n className=\"grid gap-1 text-left\"\n >\n <MetricsKpiCard.Label>{scorerName}</MetricsKpiCard.Label>\n <MetricsKpiCard.Value>{String(score.score)}</MetricsKpiCard.Value>\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\" className=\"tabular-nums\">\n <Txt as=\"span\" variant=\"meta\" font=\"mono\">\n {getShortId(score.id)}\n </Txt>{' '}\n · {formatDate(createdAt, 'date-time-seconds')}\n </Txt>\n </button>\n {score.reason && <TraceScoreReason reason={score.reason} />}\n {scorerHref && (\n <Button\n render={<Link href={scorerHref} />}\n variant=\"ghost\"\n size=\"sm\"\n className=\"-ml-2 justify-self-start\"\n icon={<ExternalLinkIcon />}\n >\n Open scorer run\n </Button>\n )}\n </MetricsKpiCard>\n );\n}\n\nfunction TraceScoreReason({ reason }: { reason: string }) {\n const [expanded, setExpanded] = useState(false);\n const isLong = reason.length > REASON_PREVIEW_LENGTH;\n const text = isLong && !expanded ? `${reason.slice(0, REASON_PREVIEW_LENGTH).trimEnd()}…` : reason;\n\n return (\n <Txt variant=\"caption\" tone=\"faint\">\n {text}\n {isLong && (\n <>\n {' '}\n <button\n type=\"button\"\n onClick={() => setExpanded(value => !value)}\n className={cn(quietTextHover, controlStateColorTransition, 'underline underline-offset-2')}\n >\n {expanded ? 'Read less' : 'Read more'}\n </button>\n </>\n )}\n </Txt>\n );\n}\n\nfunction TraceScoresPagination({\n pagination,\n onPageChange,\n}: {\n pagination?: ListScoresResponse['pagination'];\n onPageChange: (page: number) => void;\n}) {\n const currentPage = pagination?.page ?? 0;\n if (currentPage === 0 && !pagination?.hasMore) return null;\n\n return (\n <DataList.Pagination\n currentPage={currentPage}\n hasMore={pagination?.hasMore}\n onNextPage={() => onPageChange(currentPage + 1)}\n onPrevPage={() => onPageChange(currentPage - 1)}\n />\n );\n}\n"],"names":["useState","useTraceSpanScores","jsx","Spinner","EmptyState","jsxs","useLinkComponent","MetricsKpiCard","getShortId","Txt","formatDate","Button","ExternalLinkIcon","Fragment","cn","quietTextHover","controlStateColorTransition","DataList"],"mappings":"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"}
@@ -4,7 +4,6 @@ import { useState } from 'react';
4
4
  import { useTraceSpanScores } from '../hooks/use-trace-span-scores.es.js';
5
5
  import { B as Button } from '../../../Button-D43ghVKt.js';
6
6
  import { D as DataList } from '../../../data-list-CyeD_u-6.js';
7
- import '../../../keyboard/keyboard-shortcuts-context.es.js';
8
7
  import { E as EmptyState } from '../../../EmptyState-DyyUFpzY.js';
9
8
  import { M as MetricsKpiCard } from '../../../metrics-kpi-card-CiB88L41.js';
10
9
  import { S as Spinner } from '../../../spinner-ylbE0TJA.js';
@@ -1 +1 @@
1
- {"version":3,"file":"trace-scores-tab.es.js","sources":["../../../../src/domains/scores/components/trace-scores-tab.tsx"],"sourcesContent":["import type { ClientScoreRowData, ListScoresResponse } from '@mastra/client-js';\nimport { ExternalLinkIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { useTraceSpanScores } from '../hooks/use-trace-span-scores';\nimport { Button } from '@/ds/components/Button';\nimport { DataList } from '@/ds/components/DataList';\nimport { EmptyState } from '@/ds/components/EmptyState';\nimport { MetricsKpiCard } from '@/ds/components/MetricsKpiCard';\nimport { Spinner } from '@/ds/components/Spinner';\nimport { getShortId } from '@/ds/components/Text';\nimport { Txt } from '@/ds/components/Txt';\nimport { controlStateColorTransition } from '@/ds/primitives/transitions';\nimport { quietTextHover } from '@/ds/primitives/typography';\nimport { useLinkComponent } from '@/lib/framework';\nimport { cn } from '@/utils/cn';\nimport { formatDate } from '@/utils/date-format';\n\nconst REASON_PREVIEW_LENGTH = 100;\n\nexport type TraceScoresTabProps = {\n traceId: string;\n spanId: string;\n onScoreSelect: (scoreId: string) => void;\n};\n\n/**\n * Scores for the trace's anchor span, one card per scoring. Owns its own pagination:\n * mount it with a `key` on the trace/anchor pair so a page index never leaks across traces.\n */\nexport function TraceScoresTab({ traceId, spanId, onScoreSelect }: TraceScoresTabProps) {\n const [page, setPage] = useState(0);\n const { data: scoresData, isLoading } = useTraceSpanScores({ traceId, spanId, page });\n\n if (isLoading) {\n return (\n <div className=\"flex justify-center py-6\">\n <Spinner size=\"md\" variant=\"pulse\" className=\"text-placeholder\" />\n </div>\n );\n }\n\n const scores = scoresData?.scores ?? [];\n\n if (scores.length === 0) {\n return <EmptyState titleSlot=\"No scores yet\" descriptionSlot=\"Score this trace to see results here.\" />;\n }\n\n return (\n <div className=\"grid content-start gap-3\">\n {scores.map(score => (\n <TraceScoreCard key={score.id} score={score} onSelect={() => onScoreSelect(score.id)} />\n ))}\n <TraceScoresPagination pagination={scoresData?.pagination} onPageChange={setPage} />\n </div>\n );\n}\n\nfunction TraceScoreCard({ score, onSelect }: { score: ClientScoreRowData; onSelect: () => void }) {\n const createdAt = new Date(score.createdAt);\n const scorerName = String(score.scorer?.name || score.scorer?.id || 'Scorer');\n const { Link, paths } = useLinkComponent();\n const scorerHref = paths.scorerLink(score.scorerId, { scoreId: score.id });\n\n return (\n <MetricsKpiCard className=\"min-w-0\">\n <button\n type=\"button\"\n onClick={onSelect}\n aria-label={`Score ${getShortId(score.id)}`}\n className=\"grid gap-1 text-left\"\n >\n <MetricsKpiCard.Label>{scorerName}</MetricsKpiCard.Label>\n <MetricsKpiCard.Value>{String(score.score)}</MetricsKpiCard.Value>\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\" className=\"tabular-nums\">\n <Txt as=\"span\" variant=\"meta\" font=\"mono\">\n {getShortId(score.id)}\n </Txt>{' '}\n · {formatDate(createdAt, 'date-time-seconds')}\n </Txt>\n </button>\n {score.reason && <TraceScoreReason reason={score.reason} />}\n {scorerHref && (\n <Button\n render={<Link href={scorerHref} />}\n variant=\"ghost\"\n size=\"sm\"\n className=\"-ml-2 justify-self-start\"\n icon={<ExternalLinkIcon />}\n >\n Open scorer run\n </Button>\n )}\n </MetricsKpiCard>\n );\n}\n\nfunction TraceScoreReason({ reason }: { reason: string }) {\n const [expanded, setExpanded] = useState(false);\n const isLong = reason.length > REASON_PREVIEW_LENGTH;\n const text = isLong && !expanded ? `${reason.slice(0, REASON_PREVIEW_LENGTH).trimEnd()}…` : reason;\n\n return (\n <Txt variant=\"caption\" tone=\"faint\">\n {text}\n {isLong && (\n <>\n {' '}\n <button\n type=\"button\"\n onClick={() => setExpanded(value => !value)}\n className={cn(quietTextHover, controlStateColorTransition, 'underline underline-offset-2')}\n >\n {expanded ? 'Read less' : 'Read more'}\n </button>\n </>\n )}\n </Txt>\n );\n}\n\nfunction TraceScoresPagination({\n pagination,\n onPageChange,\n}: {\n pagination?: ListScoresResponse['pagination'];\n onPageChange: (page: number) => void;\n}) {\n const currentPage = pagination?.page ?? 0;\n if (currentPage === 0 && !pagination?.hasMore) return null;\n\n return (\n <DataList.Pagination\n currentPage={currentPage}\n hasMore={pagination?.hasMore}\n onNextPage={() => onPageChange(currentPage + 1)}\n onPrevPage={() => onPageChange(currentPage - 1)}\n />\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trace-scores-tab.es.js","sources":["../../../../src/domains/scores/components/trace-scores-tab.tsx"],"sourcesContent":["import type { ClientScoreRowData, ListScoresResponse } from '@mastra/client-js';\nimport { ExternalLinkIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { useTraceSpanScores } from '../hooks/use-trace-span-scores';\nimport { Button } from '@/ds/components/Button';\nimport { DataList } from '@/ds/components/DataList';\nimport { EmptyState } from '@/ds/components/EmptyState';\nimport { MetricsKpiCard } from '@/ds/components/MetricsKpiCard';\nimport { Spinner } from '@/ds/components/Spinner';\nimport { getShortId } from '@/ds/components/Text';\nimport { Txt } from '@/ds/components/Txt';\nimport { controlStateColorTransition } from '@/ds/primitives/transitions';\nimport { quietTextHover } from '@/ds/primitives/typography';\nimport { useLinkComponent } from '@/lib/framework';\nimport { cn } from '@/utils/cn';\nimport { formatDate } from '@/utils/date-format';\n\nconst REASON_PREVIEW_LENGTH = 100;\n\nexport type TraceScoresTabProps = {\n traceId: string;\n spanId: string;\n onScoreSelect: (scoreId: string) => void;\n};\n\n/**\n * Scores for the trace's anchor span, one card per scoring. Owns its own pagination:\n * mount it with a `key` on the trace/anchor pair so a page index never leaks across traces.\n */\nexport function TraceScoresTab({ traceId, spanId, onScoreSelect }: TraceScoresTabProps) {\n const [page, setPage] = useState(0);\n const { data: scoresData, isLoading } = useTraceSpanScores({ traceId, spanId, page });\n\n if (isLoading) {\n return (\n <div className=\"flex justify-center py-6\">\n <Spinner size=\"md\" variant=\"pulse\" className=\"text-placeholder\" />\n </div>\n );\n }\n\n const scores = scoresData?.scores ?? [];\n\n if (scores.length === 0) {\n return <EmptyState titleSlot=\"No scores yet\" descriptionSlot=\"Score this trace to see results here.\" />;\n }\n\n return (\n <div className=\"grid content-start gap-3\">\n {scores.map(score => (\n <TraceScoreCard key={score.id} score={score} onSelect={() => onScoreSelect(score.id)} />\n ))}\n <TraceScoresPagination pagination={scoresData?.pagination} onPageChange={setPage} />\n </div>\n );\n}\n\nfunction TraceScoreCard({ score, onSelect }: { score: ClientScoreRowData; onSelect: () => void }) {\n const createdAt = new Date(score.createdAt);\n const scorerName = String(score.scorer?.name || score.scorer?.id || 'Scorer');\n const { Link, paths } = useLinkComponent();\n const scorerHref = paths.scorerLink(score.scorerId, { scoreId: score.id });\n\n return (\n <MetricsKpiCard className=\"min-w-0\">\n <button\n type=\"button\"\n onClick={onSelect}\n aria-label={`Score ${getShortId(score.id)}`}\n className=\"grid gap-1 text-left\"\n >\n <MetricsKpiCard.Label>{scorerName}</MetricsKpiCard.Label>\n <MetricsKpiCard.Value>{String(score.score)}</MetricsKpiCard.Value>\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\" className=\"tabular-nums\">\n <Txt as=\"span\" variant=\"meta\" font=\"mono\">\n {getShortId(score.id)}\n </Txt>{' '}\n · {formatDate(createdAt, 'date-time-seconds')}\n </Txt>\n </button>\n {score.reason && <TraceScoreReason reason={score.reason} />}\n {scorerHref && (\n <Button\n render={<Link href={scorerHref} />}\n variant=\"ghost\"\n size=\"sm\"\n className=\"-ml-2 justify-self-start\"\n icon={<ExternalLinkIcon />}\n >\n Open scorer run\n </Button>\n )}\n </MetricsKpiCard>\n );\n}\n\nfunction TraceScoreReason({ reason }: { reason: string }) {\n const [expanded, setExpanded] = useState(false);\n const isLong = reason.length > REASON_PREVIEW_LENGTH;\n const text = isLong && !expanded ? `${reason.slice(0, REASON_PREVIEW_LENGTH).trimEnd()}…` : reason;\n\n return (\n <Txt variant=\"caption\" tone=\"faint\">\n {text}\n {isLong && (\n <>\n {' '}\n <button\n type=\"button\"\n onClick={() => setExpanded(value => !value)}\n className={cn(quietTextHover, controlStateColorTransition, 'underline underline-offset-2')}\n >\n {expanded ? 'Read less' : 'Read more'}\n </button>\n </>\n )}\n </Txt>\n );\n}\n\nfunction TraceScoresPagination({\n pagination,\n onPageChange,\n}: {\n pagination?: ListScoresResponse['pagination'];\n onPageChange: (page: number) => void;\n}) {\n const currentPage = pagination?.page ?? 0;\n if (currentPage === 0 && !pagination?.hasMore) return null;\n\n return (\n <DataList.Pagination\n currentPage={currentPage}\n hasMore={pagination?.hasMore}\n onNextPage={() => onPageChange(currentPage + 1)}\n onPrevPage={() => onPageChange(currentPage - 1)}\n />\n );\n}\n"],"names":[],"mappings":"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"}
@@ -8,7 +8,6 @@ const React = require('react');
8
8
  require('@mastra/react');
9
9
  require('@tanstack/react-query');
10
10
  require('@base-ui/react/combobox');
11
- require('../../../toast-nm-fM7BR.cjs');
12
11
  const domains_scores_components_traceScoresTab = require('../../scores/components/trace-scores-tab.cjs.js');
13
12
  require('@mastra/core/utils/safe-stringify');
14
13
  const Button = require('../../../Button-CXhSUBxN.cjs');
@@ -1 +1 @@
1
- {"version":3,"file":"thread-view-by-trace.cjs.js","sources":["../../../../src/domains/traces/components/thread-view-by-trace.tsx"],"sourcesContent":["import { ExternalLinkIcon, MessageSquareReplyIcon, MessageSquareTextIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { useTraceSpanScores, TraceScoresTab } from '@/domains/scores';\nimport { ThreadTrace, useThreadTraceRow } from '@/domains/traces/components/thread-trace';\nimport type { ThreadTraceSelectedSpan } from '@/domains/traces/components/thread-trace';\n\nimport { ThreadViewSkeleton } from '@/domains/traces/components/thread-view-skeleton';\nimport { TraceFeedbackTab } from '@/domains/traces/components/trace-feedback-tab';\nimport { TraceThreadItemView } from '@/domains/traces/components/trace-thread-item-view';\nimport { TracesErrorContent } from '@/domains/traces/components/traces-error-content';\nimport { useTraceFeedback } from '@/domains/traces/hooks/use-trace-feedback';\nimport { useTraceSpans } from '@/domains/traces/hooks/use-trace-spans';\nimport { useTracesListSource } from '@/domains/traces/hooks/use-traces-list-source';\nimport type { UseTracesListSourceArgs } from '@/domains/traces/hooks/use-traces-list-source';\nimport { Button } from '@/ds/components/Button';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { ScorersIcon } from '@/ds/icons/ScorersIcon';\nimport { useLinkComponent } from '@/lib/framework';\n\nconst THREAD_WINDOW_MS = 30 * 24 * 60 * 60 * 1000;\n\nexport interface ThreadViewByTraceProps {\n threadId: string;\n /** Lists the thread through the trace-query API; `false` falls back to `listTracesLight`. */\n withQueryTrace: boolean;\n /** Shows the per-trace Feedback tab and fetches its feedback. */\n withFeedback: boolean;\n /** Fires when a span detail opens or closes (`null`). */\n onSelectedSpanChange?: (selected: ThreadTraceSelectedSpan | null) => void;\n /** Trace to expand and scroll to on mount (first page only). */\n anchorTraceId?: string;\n /** Opens a score from a trace's Scores tab; the app owns routing. */\n onOpenScore: (traceId: string, scoreId: string) => void;\n}\n\n/**\n * A memory thread rendered as its traces: one row per agent turn (oldest first), with the\n * reconstructed messages on the left and the span tree on the right. Clicking a span opens\n * its detail panel on the side so the conversation stays readable.\n */\nexport function ThreadViewByTrace({\n threadId,\n withQueryTrace,\n withFeedback,\n onSelectedSpanChange,\n anchorTraceId,\n onOpenScore,\n}: ThreadViewByTraceProps) {\n const legacyFilters = useMemo<UseTracesListSourceArgs['legacyFilters']>(\n () => ({ threadId, startedAt: { start: new Date(Date.now() - THREAD_WINDOW_MS) } }),\n [threadId],\n );\n const { rows, isLoading, setEndOfListElement, error } = useTracesListSource({\n initialAutoRefetch: false,\n withQueryTrace,\n legacyFilters,\n query: now => ({\n timeRange: {\n from: new Date(now.getTime() - THREAD_WINDOW_MS).toISOString(),\n to: now.toISOString(),\n },\n where: { op: 'eq', left: { path: 'threadId' }, right: { literal: threadId } },\n orderBy: [{ field: 'startedAt', direction: 'asc' }],\n }),\n });\n const traceIds = rows.map(trace => trace.traceId);\n\n if (error) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <TracesErrorContent error={error} resource=\"traces\" errorTitle=\"Failed to load traces\" />\n </div>\n );\n }\n\n if (isLoading) return <ThreadViewSkeleton />;\n\n if (traceIds.length === 0) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <Txt variant=\"body\" tone=\"muted\">\n No traces found for this thread.\n </Txt>\n </div>\n );\n }\n\n return (\n <LoadedThreadViewByTrace\n key={threadId}\n traceIds={traceIds}\n setEndOfListElement={setEndOfListElement}\n withFeedback={withFeedback}\n onSelectedSpanChange={onSelectedSpanChange}\n anchorTraceId={anchorTraceId}\n onOpenScore={onOpenScore}\n />\n );\n}\n\ninterface LoadedThreadViewByTraceProps {\n traceIds: string[];\n setEndOfListElement: (node: HTMLDivElement | null) => void;\n withFeedback: boolean;\n onSelectedSpanChange?: (selected: ThreadTraceSelectedSpan | null) => void;\n anchorTraceId?: string;\n onOpenScore: (traceId: string, scoreId: string) => void;\n}\n\n/** Mounts once the first page is in, so state seeded from `traces` at mount only sees that page. */\nfunction LoadedThreadViewByTrace({\n traceIds,\n setEndOfListElement,\n withFeedback,\n onSelectedSpanChange,\n anchorTraceId: requestedAnchorTraceId,\n onOpenScore,\n}: LoadedThreadViewByTraceProps) {\n // \"Open full thread\" lands here with the originating trace: that row starts expanded and\n // scrolls into view when it mounts. Best effort on the first page only: resolved once at mount,\n // so a row that arrives on a later page is left alone.\n const [anchorTraceId] = useState(() =>\n requestedAnchorTraceId && traceIds.includes(requestedAnchorTraceId) ? requestedAnchorTraceId : null,\n );\n\n return (\n <ThreadTrace traceIds={traceIds} anchorTraceId={anchorTraceId} onSelectedSpanChange={onSelectedSpanChange}>\n <ThreadTrace.List data-testid=\"thread-view-by-trace\">\n {traceIds.map(traceId => (\n <ThreadTrace.Row key={traceId} traceId={traceId}>\n <ThreadTraceRowContent withFeedback={withFeedback} onOpenScore={onOpenScore} />\n </ThreadTrace.Row>\n ))}\n <ThreadTrace.LoadMoreSentinel ref={setEndOfListElement} />\n </ThreadTrace.List>\n <ThreadTrace.SpanPanel />\n </ThreadTrace>\n );\n}\n\nfunction ThreadTraceRowContent({\n withFeedback,\n onOpenScore,\n}: {\n withFeedback: boolean;\n onOpenScore: (traceId: string, scoreId: string) => void;\n}) {\n const { traceId, highlightSpans } = useThreadTraceRow();\n const { Link, paths } = useLinkComponent();\n const traceHref = paths.traceLink(traceId);\n // First page only, for the tab badges; the Feedback and Scores bodies own their own pagination\n // and share these queries through the React Query cache.\n const { data: feedbackData } = useTraceFeedback({ traceId, enabled: withFeedback });\n // Same query the span tree observes (passive: the tree drives refetches).\n const { data: traceData } = useTraceSpans(traceId, { passive: true });\n const rootSpanId = traceData?.spans.find(span => span.parentSpanId == null)?.spanId;\n const { data: spanScoresData } = useTraceSpanScores({ traceId, spanId: rootSpanId });\n const feedbackTotal = feedbackData?.pagination?.total;\n const scoresTotal = spanScoresData?.pagination?.total;\n\n return (\n <>\n <ThreadTrace.Messages>\n <ThreadTrace.MessagesHeader>\n <ThreadTrace.TabList>\n <ThreadTrace.Tab value=\"messages\">\n <Icon size=\"xs\">\n <MessageSquareTextIcon />\n </Icon>\n Messages\n </ThreadTrace.Tab>\n {withFeedback && (\n <ThreadTrace.Tab value=\"feedback\">\n <Icon size=\"xs\">\n <MessageSquareReplyIcon />\n </Icon>\n Feedback{feedbackTotal != null && <> ({feedbackTotal})</>}\n </ThreadTrace.Tab>\n )}\n <ThreadTrace.Tab value=\"scores\">\n <Icon size=\"xs\">\n <ScorersIcon />\n </Icon>\n Scores{scoresTotal != null && <> ({scoresTotal})</>}\n </ThreadTrace.Tab>\n </ThreadTrace.TabList>\n </ThreadTrace.MessagesHeader>\n <ThreadTrace.TabContent value=\"messages\" flush>\n <TraceThreadItemView traceId={traceId} onHighlightSpans={highlightSpans} />\n </ThreadTrace.TabContent>\n {withFeedback && (\n <ThreadTrace.TabContent value=\"feedback\" className=\"min-h-0 py-3\">\n <TraceFeedbackTab key={traceId} traceId={traceId} variant=\"thread\" />\n </ThreadTrace.TabContent>\n )}\n <ThreadTrace.TabContent value=\"scores\" className=\"min-h-0 py-3\">\n {rootSpanId ? (\n <TraceScoresTab\n key={traceId}\n traceId={traceId}\n spanId={rootSpanId}\n onScoreSelect={scoreId => onOpenScore(traceId, scoreId)}\n />\n ) : null}\n </ThreadTrace.TabContent>\n </ThreadTrace.Messages>\n <ThreadTrace.Details>\n <ThreadTrace.DetailsHeader>\n {traceHref && (\n <ThreadTrace.DetailsActions>\n <Button render={<Link href={traceHref} />} variant=\"ghost\" size=\"sm\" icon={<ExternalLinkIcon />}>\n Go to trace\n </Button>\n </ThreadTrace.DetailsActions>\n )}\n </ThreadTrace.DetailsHeader>\n <ThreadTrace.Spans />\n </ThreadTrace.Details>\n </>\n );\n}\n"],"names":["useMemo","useTracesListSource","jsx","TracesErrorContent","ThreadViewSkeleton","Txt","useState","jsxs","ThreadTrace","useThreadTraceRow","useLinkComponent","useTraceFeedback","useTraceSpans","useTraceSpanScores","Fragment","Icon","MessageSquareTextIcon","MessageSquareReplyIcon","ScorersIcon","TraceThreadItemView","TraceFeedbackTab","TraceScoresTab","Button","ExternalLinkIcon"],"mappings":"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"}
1
+ {"version":3,"file":"thread-view-by-trace.cjs.js","sources":["../../../../src/domains/traces/components/thread-view-by-trace.tsx"],"sourcesContent":["import { ExternalLinkIcon, MessageSquareReplyIcon, MessageSquareTextIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { useTraceSpanScores, TraceScoresTab } from '@/domains/scores';\nimport { ThreadTrace, useThreadTraceRow } from '@/domains/traces/components/thread-trace';\nimport type { ThreadTraceSelectedSpan } from '@/domains/traces/components/thread-trace';\n\nimport { ThreadViewSkeleton } from '@/domains/traces/components/thread-view-skeleton';\nimport { TraceFeedbackTab } from '@/domains/traces/components/trace-feedback-tab';\nimport { TraceThreadItemView } from '@/domains/traces/components/trace-thread-item-view';\nimport { TracesErrorContent } from '@/domains/traces/components/traces-error-content';\nimport { useTraceFeedback } from '@/domains/traces/hooks/use-trace-feedback';\nimport { useTraceSpans } from '@/domains/traces/hooks/use-trace-spans';\nimport { useTracesListSource } from '@/domains/traces/hooks/use-traces-list-source';\nimport type { UseTracesListSourceArgs } from '@/domains/traces/hooks/use-traces-list-source';\nimport { Button } from '@/ds/components/Button';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { ScorersIcon } from '@/ds/icons/ScorersIcon';\nimport { useLinkComponent } from '@/lib/framework';\n\nconst THREAD_WINDOW_MS = 30 * 24 * 60 * 60 * 1000;\n\nexport interface ThreadViewByTraceProps {\n threadId: string;\n /** Lists the thread through the trace-query API; `false` falls back to `listTracesLight`. */\n withQueryTrace: boolean;\n /** Shows the per-trace Feedback tab and fetches its feedback. */\n withFeedback: boolean;\n /** Fires when a span detail opens or closes (`null`). */\n onSelectedSpanChange?: (selected: ThreadTraceSelectedSpan | null) => void;\n /** Trace to expand and scroll to on mount (first page only). */\n anchorTraceId?: string;\n /** Opens a score from a trace's Scores tab; the app owns routing. */\n onOpenScore: (traceId: string, scoreId: string) => void;\n}\n\n/**\n * A memory thread rendered as its traces: one row per agent turn (oldest first), with the\n * reconstructed messages on the left and the span tree on the right. Clicking a span opens\n * its detail panel on the side so the conversation stays readable.\n */\nexport function ThreadViewByTrace({\n threadId,\n withQueryTrace,\n withFeedback,\n onSelectedSpanChange,\n anchorTraceId,\n onOpenScore,\n}: ThreadViewByTraceProps) {\n const legacyFilters = useMemo<UseTracesListSourceArgs['legacyFilters']>(\n () => ({ threadId, startedAt: { start: new Date(Date.now() - THREAD_WINDOW_MS) } }),\n [threadId],\n );\n const { rows, isLoading, setEndOfListElement, error } = useTracesListSource({\n initialAutoRefetch: false,\n withQueryTrace,\n legacyFilters,\n query: now => ({\n timeRange: {\n from: new Date(now.getTime() - THREAD_WINDOW_MS).toISOString(),\n to: now.toISOString(),\n },\n where: { op: 'eq', left: { path: 'threadId' }, right: { literal: threadId } },\n orderBy: [{ field: 'startedAt', direction: 'asc' }],\n }),\n });\n const traceIds = rows.map(trace => trace.traceId);\n\n if (error) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <TracesErrorContent error={error} resource=\"traces\" errorTitle=\"Failed to load traces\" />\n </div>\n );\n }\n\n if (isLoading) return <ThreadViewSkeleton />;\n\n if (traceIds.length === 0) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <Txt variant=\"body\" tone=\"muted\">\n No traces found for this thread.\n </Txt>\n </div>\n );\n }\n\n return (\n <LoadedThreadViewByTrace\n key={threadId}\n traceIds={traceIds}\n setEndOfListElement={setEndOfListElement}\n withFeedback={withFeedback}\n onSelectedSpanChange={onSelectedSpanChange}\n anchorTraceId={anchorTraceId}\n onOpenScore={onOpenScore}\n />\n );\n}\n\ninterface LoadedThreadViewByTraceProps {\n traceIds: string[];\n setEndOfListElement: (node: HTMLDivElement | null) => void;\n withFeedback: boolean;\n onSelectedSpanChange?: (selected: ThreadTraceSelectedSpan | null) => void;\n anchorTraceId?: string;\n onOpenScore: (traceId: string, scoreId: string) => void;\n}\n\n/** Mounts once the first page is in, so state seeded from `traces` at mount only sees that page. */\nfunction LoadedThreadViewByTrace({\n traceIds,\n setEndOfListElement,\n withFeedback,\n onSelectedSpanChange,\n anchorTraceId: requestedAnchorTraceId,\n onOpenScore,\n}: LoadedThreadViewByTraceProps) {\n // \"Open full thread\" lands here with the originating trace: that row starts expanded and\n // scrolls into view when it mounts. Best effort on the first page only: resolved once at mount,\n // so a row that arrives on a later page is left alone.\n const [anchorTraceId] = useState(() =>\n requestedAnchorTraceId && traceIds.includes(requestedAnchorTraceId) ? requestedAnchorTraceId : null,\n );\n\n return (\n <ThreadTrace traceIds={traceIds} anchorTraceId={anchorTraceId} onSelectedSpanChange={onSelectedSpanChange}>\n <ThreadTrace.List data-testid=\"thread-view-by-trace\">\n {traceIds.map(traceId => (\n <ThreadTrace.Row key={traceId} traceId={traceId}>\n <ThreadTraceRowContent withFeedback={withFeedback} onOpenScore={onOpenScore} />\n </ThreadTrace.Row>\n ))}\n <ThreadTrace.LoadMoreSentinel ref={setEndOfListElement} />\n </ThreadTrace.List>\n <ThreadTrace.SpanPanel />\n </ThreadTrace>\n );\n}\n\nfunction ThreadTraceRowContent({\n withFeedback,\n onOpenScore,\n}: {\n withFeedback: boolean;\n onOpenScore: (traceId: string, scoreId: string) => void;\n}) {\n const { traceId, highlightSpans } = useThreadTraceRow();\n const { Link, paths } = useLinkComponent();\n const traceHref = paths.traceLink(traceId);\n // First page only, for the tab badges; the Feedback and Scores bodies own their own pagination\n // and share these queries through the React Query cache.\n const { data: feedbackData } = useTraceFeedback({ traceId, enabled: withFeedback });\n // Same query the span tree observes (passive: the tree drives refetches).\n const { data: traceData } = useTraceSpans(traceId, { passive: true });\n const rootSpanId = traceData?.spans.find(span => span.parentSpanId == null)?.spanId;\n const { data: spanScoresData } = useTraceSpanScores({ traceId, spanId: rootSpanId });\n const feedbackTotal = feedbackData?.pagination?.total;\n const scoresTotal = spanScoresData?.pagination?.total;\n\n return (\n <>\n <ThreadTrace.Messages>\n <ThreadTrace.MessagesHeader>\n <ThreadTrace.TabList>\n <ThreadTrace.Tab value=\"messages\">\n <Icon size=\"xs\">\n <MessageSquareTextIcon />\n </Icon>\n Messages\n </ThreadTrace.Tab>\n {withFeedback && (\n <ThreadTrace.Tab value=\"feedback\">\n <Icon size=\"xs\">\n <MessageSquareReplyIcon />\n </Icon>\n Feedback{feedbackTotal != null && <> ({feedbackTotal})</>}\n </ThreadTrace.Tab>\n )}\n <ThreadTrace.Tab value=\"scores\">\n <Icon size=\"xs\">\n <ScorersIcon />\n </Icon>\n Scores{scoresTotal != null && <> ({scoresTotal})</>}\n </ThreadTrace.Tab>\n </ThreadTrace.TabList>\n </ThreadTrace.MessagesHeader>\n <ThreadTrace.TabContent value=\"messages\" flush>\n <TraceThreadItemView traceId={traceId} onHighlightSpans={highlightSpans} />\n </ThreadTrace.TabContent>\n {withFeedback && (\n <ThreadTrace.TabContent value=\"feedback\" className=\"min-h-0 py-3\">\n <TraceFeedbackTab key={traceId} traceId={traceId} variant=\"thread\" />\n </ThreadTrace.TabContent>\n )}\n <ThreadTrace.TabContent value=\"scores\" className=\"min-h-0 py-3\">\n {rootSpanId ? (\n <TraceScoresTab\n key={traceId}\n traceId={traceId}\n spanId={rootSpanId}\n onScoreSelect={scoreId => onOpenScore(traceId, scoreId)}\n />\n ) : null}\n </ThreadTrace.TabContent>\n </ThreadTrace.Messages>\n <ThreadTrace.Details>\n <ThreadTrace.DetailsHeader>\n {traceHref && (\n <ThreadTrace.DetailsActions>\n <Button render={<Link href={traceHref} />} variant=\"ghost\" size=\"sm\" icon={<ExternalLinkIcon />}>\n Go to trace\n </Button>\n </ThreadTrace.DetailsActions>\n )}\n </ThreadTrace.DetailsHeader>\n <ThreadTrace.Spans />\n </ThreadTrace.Details>\n </>\n );\n}\n"],"names":["useMemo","useTracesListSource","jsx","TracesErrorContent","ThreadViewSkeleton","Txt","useState","jsxs","ThreadTrace","useThreadTraceRow","useLinkComponent","useTraceFeedback","useTraceSpans","useTraceSpanScores","Fragment","Icon","MessageSquareTextIcon","MessageSquareReplyIcon","ScorersIcon","TraceThreadItemView","TraceFeedbackTab","TraceScoresTab","Button","ExternalLinkIcon"],"mappings":"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"}
@@ -4,7 +4,6 @@ import { useMemo, useState } from 'react';
4
4
  import '@mastra/react';
5
5
  import '@tanstack/react-query';
6
6
  import '@base-ui/react/combobox';
7
- import '../../../toast-c5kCpyWt.js';
8
7
  import { TraceScoresTab } from '../../scores/components/trace-scores-tab.es.js';
9
8
  import '@mastra/core/utils/safe-stringify';
10
9
  import { B as Button } from '../../../Button-D43ghVKt.js';
@@ -1 +1 @@
1
- {"version":3,"file":"thread-view-by-trace.es.js","sources":["../../../../src/domains/traces/components/thread-view-by-trace.tsx"],"sourcesContent":["import { ExternalLinkIcon, MessageSquareReplyIcon, MessageSquareTextIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { useTraceSpanScores, TraceScoresTab } from '@/domains/scores';\nimport { ThreadTrace, useThreadTraceRow } from '@/domains/traces/components/thread-trace';\nimport type { ThreadTraceSelectedSpan } from '@/domains/traces/components/thread-trace';\n\nimport { ThreadViewSkeleton } from '@/domains/traces/components/thread-view-skeleton';\nimport { TraceFeedbackTab } from '@/domains/traces/components/trace-feedback-tab';\nimport { TraceThreadItemView } from '@/domains/traces/components/trace-thread-item-view';\nimport { TracesErrorContent } from '@/domains/traces/components/traces-error-content';\nimport { useTraceFeedback } from '@/domains/traces/hooks/use-trace-feedback';\nimport { useTraceSpans } from '@/domains/traces/hooks/use-trace-spans';\nimport { useTracesListSource } from '@/domains/traces/hooks/use-traces-list-source';\nimport type { UseTracesListSourceArgs } from '@/domains/traces/hooks/use-traces-list-source';\nimport { Button } from '@/ds/components/Button';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { ScorersIcon } from '@/ds/icons/ScorersIcon';\nimport { useLinkComponent } from '@/lib/framework';\n\nconst THREAD_WINDOW_MS = 30 * 24 * 60 * 60 * 1000;\n\nexport interface ThreadViewByTraceProps {\n threadId: string;\n /** Lists the thread through the trace-query API; `false` falls back to `listTracesLight`. */\n withQueryTrace: boolean;\n /** Shows the per-trace Feedback tab and fetches its feedback. */\n withFeedback: boolean;\n /** Fires when a span detail opens or closes (`null`). */\n onSelectedSpanChange?: (selected: ThreadTraceSelectedSpan | null) => void;\n /** Trace to expand and scroll to on mount (first page only). */\n anchorTraceId?: string;\n /** Opens a score from a trace's Scores tab; the app owns routing. */\n onOpenScore: (traceId: string, scoreId: string) => void;\n}\n\n/**\n * A memory thread rendered as its traces: one row per agent turn (oldest first), with the\n * reconstructed messages on the left and the span tree on the right. Clicking a span opens\n * its detail panel on the side so the conversation stays readable.\n */\nexport function ThreadViewByTrace({\n threadId,\n withQueryTrace,\n withFeedback,\n onSelectedSpanChange,\n anchorTraceId,\n onOpenScore,\n}: ThreadViewByTraceProps) {\n const legacyFilters = useMemo<UseTracesListSourceArgs['legacyFilters']>(\n () => ({ threadId, startedAt: { start: new Date(Date.now() - THREAD_WINDOW_MS) } }),\n [threadId],\n );\n const { rows, isLoading, setEndOfListElement, error } = useTracesListSource({\n initialAutoRefetch: false,\n withQueryTrace,\n legacyFilters,\n query: now => ({\n timeRange: {\n from: new Date(now.getTime() - THREAD_WINDOW_MS).toISOString(),\n to: now.toISOString(),\n },\n where: { op: 'eq', left: { path: 'threadId' }, right: { literal: threadId } },\n orderBy: [{ field: 'startedAt', direction: 'asc' }],\n }),\n });\n const traceIds = rows.map(trace => trace.traceId);\n\n if (error) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <TracesErrorContent error={error} resource=\"traces\" errorTitle=\"Failed to load traces\" />\n </div>\n );\n }\n\n if (isLoading) return <ThreadViewSkeleton />;\n\n if (traceIds.length === 0) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <Txt variant=\"body\" tone=\"muted\">\n No traces found for this thread.\n </Txt>\n </div>\n );\n }\n\n return (\n <LoadedThreadViewByTrace\n key={threadId}\n traceIds={traceIds}\n setEndOfListElement={setEndOfListElement}\n withFeedback={withFeedback}\n onSelectedSpanChange={onSelectedSpanChange}\n anchorTraceId={anchorTraceId}\n onOpenScore={onOpenScore}\n />\n );\n}\n\ninterface LoadedThreadViewByTraceProps {\n traceIds: string[];\n setEndOfListElement: (node: HTMLDivElement | null) => void;\n withFeedback: boolean;\n onSelectedSpanChange?: (selected: ThreadTraceSelectedSpan | null) => void;\n anchorTraceId?: string;\n onOpenScore: (traceId: string, scoreId: string) => void;\n}\n\n/** Mounts once the first page is in, so state seeded from `traces` at mount only sees that page. */\nfunction LoadedThreadViewByTrace({\n traceIds,\n setEndOfListElement,\n withFeedback,\n onSelectedSpanChange,\n anchorTraceId: requestedAnchorTraceId,\n onOpenScore,\n}: LoadedThreadViewByTraceProps) {\n // \"Open full thread\" lands here with the originating trace: that row starts expanded and\n // scrolls into view when it mounts. Best effort on the first page only: resolved once at mount,\n // so a row that arrives on a later page is left alone.\n const [anchorTraceId] = useState(() =>\n requestedAnchorTraceId && traceIds.includes(requestedAnchorTraceId) ? requestedAnchorTraceId : null,\n );\n\n return (\n <ThreadTrace traceIds={traceIds} anchorTraceId={anchorTraceId} onSelectedSpanChange={onSelectedSpanChange}>\n <ThreadTrace.List data-testid=\"thread-view-by-trace\">\n {traceIds.map(traceId => (\n <ThreadTrace.Row key={traceId} traceId={traceId}>\n <ThreadTraceRowContent withFeedback={withFeedback} onOpenScore={onOpenScore} />\n </ThreadTrace.Row>\n ))}\n <ThreadTrace.LoadMoreSentinel ref={setEndOfListElement} />\n </ThreadTrace.List>\n <ThreadTrace.SpanPanel />\n </ThreadTrace>\n );\n}\n\nfunction ThreadTraceRowContent({\n withFeedback,\n onOpenScore,\n}: {\n withFeedback: boolean;\n onOpenScore: (traceId: string, scoreId: string) => void;\n}) {\n const { traceId, highlightSpans } = useThreadTraceRow();\n const { Link, paths } = useLinkComponent();\n const traceHref = paths.traceLink(traceId);\n // First page only, for the tab badges; the Feedback and Scores bodies own their own pagination\n // and share these queries through the React Query cache.\n const { data: feedbackData } = useTraceFeedback({ traceId, enabled: withFeedback });\n // Same query the span tree observes (passive: the tree drives refetches).\n const { data: traceData } = useTraceSpans(traceId, { passive: true });\n const rootSpanId = traceData?.spans.find(span => span.parentSpanId == null)?.spanId;\n const { data: spanScoresData } = useTraceSpanScores({ traceId, spanId: rootSpanId });\n const feedbackTotal = feedbackData?.pagination?.total;\n const scoresTotal = spanScoresData?.pagination?.total;\n\n return (\n <>\n <ThreadTrace.Messages>\n <ThreadTrace.MessagesHeader>\n <ThreadTrace.TabList>\n <ThreadTrace.Tab value=\"messages\">\n <Icon size=\"xs\">\n <MessageSquareTextIcon />\n </Icon>\n Messages\n </ThreadTrace.Tab>\n {withFeedback && (\n <ThreadTrace.Tab value=\"feedback\">\n <Icon size=\"xs\">\n <MessageSquareReplyIcon />\n </Icon>\n Feedback{feedbackTotal != null && <> ({feedbackTotal})</>}\n </ThreadTrace.Tab>\n )}\n <ThreadTrace.Tab value=\"scores\">\n <Icon size=\"xs\">\n <ScorersIcon />\n </Icon>\n Scores{scoresTotal != null && <> ({scoresTotal})</>}\n </ThreadTrace.Tab>\n </ThreadTrace.TabList>\n </ThreadTrace.MessagesHeader>\n <ThreadTrace.TabContent value=\"messages\" flush>\n <TraceThreadItemView traceId={traceId} onHighlightSpans={highlightSpans} />\n </ThreadTrace.TabContent>\n {withFeedback && (\n <ThreadTrace.TabContent value=\"feedback\" className=\"min-h-0 py-3\">\n <TraceFeedbackTab key={traceId} traceId={traceId} variant=\"thread\" />\n </ThreadTrace.TabContent>\n )}\n <ThreadTrace.TabContent value=\"scores\" className=\"min-h-0 py-3\">\n {rootSpanId ? (\n <TraceScoresTab\n key={traceId}\n traceId={traceId}\n spanId={rootSpanId}\n onScoreSelect={scoreId => onOpenScore(traceId, scoreId)}\n />\n ) : null}\n </ThreadTrace.TabContent>\n </ThreadTrace.Messages>\n <ThreadTrace.Details>\n <ThreadTrace.DetailsHeader>\n {traceHref && (\n <ThreadTrace.DetailsActions>\n <Button render={<Link href={traceHref} />} variant=\"ghost\" size=\"sm\" icon={<ExternalLinkIcon />}>\n Go to trace\n </Button>\n </ThreadTrace.DetailsActions>\n )}\n </ThreadTrace.DetailsHeader>\n <ThreadTrace.Spans />\n </ThreadTrace.Details>\n </>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"thread-view-by-trace.es.js","sources":["../../../../src/domains/traces/components/thread-view-by-trace.tsx"],"sourcesContent":["import { ExternalLinkIcon, MessageSquareReplyIcon, MessageSquareTextIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { useTraceSpanScores, TraceScoresTab } from '@/domains/scores';\nimport { ThreadTrace, useThreadTraceRow } from '@/domains/traces/components/thread-trace';\nimport type { ThreadTraceSelectedSpan } from '@/domains/traces/components/thread-trace';\n\nimport { ThreadViewSkeleton } from '@/domains/traces/components/thread-view-skeleton';\nimport { TraceFeedbackTab } from '@/domains/traces/components/trace-feedback-tab';\nimport { TraceThreadItemView } from '@/domains/traces/components/trace-thread-item-view';\nimport { TracesErrorContent } from '@/domains/traces/components/traces-error-content';\nimport { useTraceFeedback } from '@/domains/traces/hooks/use-trace-feedback';\nimport { useTraceSpans } from '@/domains/traces/hooks/use-trace-spans';\nimport { useTracesListSource } from '@/domains/traces/hooks/use-traces-list-source';\nimport type { UseTracesListSourceArgs } from '@/domains/traces/hooks/use-traces-list-source';\nimport { Button } from '@/ds/components/Button';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { ScorersIcon } from '@/ds/icons/ScorersIcon';\nimport { useLinkComponent } from '@/lib/framework';\n\nconst THREAD_WINDOW_MS = 30 * 24 * 60 * 60 * 1000;\n\nexport interface ThreadViewByTraceProps {\n threadId: string;\n /** Lists the thread through the trace-query API; `false` falls back to `listTracesLight`. */\n withQueryTrace: boolean;\n /** Shows the per-trace Feedback tab and fetches its feedback. */\n withFeedback: boolean;\n /** Fires when a span detail opens or closes (`null`). */\n onSelectedSpanChange?: (selected: ThreadTraceSelectedSpan | null) => void;\n /** Trace to expand and scroll to on mount (first page only). */\n anchorTraceId?: string;\n /** Opens a score from a trace's Scores tab; the app owns routing. */\n onOpenScore: (traceId: string, scoreId: string) => void;\n}\n\n/**\n * A memory thread rendered as its traces: one row per agent turn (oldest first), with the\n * reconstructed messages on the left and the span tree on the right. Clicking a span opens\n * its detail panel on the side so the conversation stays readable.\n */\nexport function ThreadViewByTrace({\n threadId,\n withQueryTrace,\n withFeedback,\n onSelectedSpanChange,\n anchorTraceId,\n onOpenScore,\n}: ThreadViewByTraceProps) {\n const legacyFilters = useMemo<UseTracesListSourceArgs['legacyFilters']>(\n () => ({ threadId, startedAt: { start: new Date(Date.now() - THREAD_WINDOW_MS) } }),\n [threadId],\n );\n const { rows, isLoading, setEndOfListElement, error } = useTracesListSource({\n initialAutoRefetch: false,\n withQueryTrace,\n legacyFilters,\n query: now => ({\n timeRange: {\n from: new Date(now.getTime() - THREAD_WINDOW_MS).toISOString(),\n to: now.toISOString(),\n },\n where: { op: 'eq', left: { path: 'threadId' }, right: { literal: threadId } },\n orderBy: [{ field: 'startedAt', direction: 'asc' }],\n }),\n });\n const traceIds = rows.map(trace => trace.traceId);\n\n if (error) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <TracesErrorContent error={error} resource=\"traces\" errorTitle=\"Failed to load traces\" />\n </div>\n );\n }\n\n if (isLoading) return <ThreadViewSkeleton />;\n\n if (traceIds.length === 0) {\n return (\n <div className=\"flex h-full items-center justify-center p-4\">\n <Txt variant=\"body\" tone=\"muted\">\n No traces found for this thread.\n </Txt>\n </div>\n );\n }\n\n return (\n <LoadedThreadViewByTrace\n key={threadId}\n traceIds={traceIds}\n setEndOfListElement={setEndOfListElement}\n withFeedback={withFeedback}\n onSelectedSpanChange={onSelectedSpanChange}\n anchorTraceId={anchorTraceId}\n onOpenScore={onOpenScore}\n />\n );\n}\n\ninterface LoadedThreadViewByTraceProps {\n traceIds: string[];\n setEndOfListElement: (node: HTMLDivElement | null) => void;\n withFeedback: boolean;\n onSelectedSpanChange?: (selected: ThreadTraceSelectedSpan | null) => void;\n anchorTraceId?: string;\n onOpenScore: (traceId: string, scoreId: string) => void;\n}\n\n/** Mounts once the first page is in, so state seeded from `traces` at mount only sees that page. */\nfunction LoadedThreadViewByTrace({\n traceIds,\n setEndOfListElement,\n withFeedback,\n onSelectedSpanChange,\n anchorTraceId: requestedAnchorTraceId,\n onOpenScore,\n}: LoadedThreadViewByTraceProps) {\n // \"Open full thread\" lands here with the originating trace: that row starts expanded and\n // scrolls into view when it mounts. Best effort on the first page only: resolved once at mount,\n // so a row that arrives on a later page is left alone.\n const [anchorTraceId] = useState(() =>\n requestedAnchorTraceId && traceIds.includes(requestedAnchorTraceId) ? requestedAnchorTraceId : null,\n );\n\n return (\n <ThreadTrace traceIds={traceIds} anchorTraceId={anchorTraceId} onSelectedSpanChange={onSelectedSpanChange}>\n <ThreadTrace.List data-testid=\"thread-view-by-trace\">\n {traceIds.map(traceId => (\n <ThreadTrace.Row key={traceId} traceId={traceId}>\n <ThreadTraceRowContent withFeedback={withFeedback} onOpenScore={onOpenScore} />\n </ThreadTrace.Row>\n ))}\n <ThreadTrace.LoadMoreSentinel ref={setEndOfListElement} />\n </ThreadTrace.List>\n <ThreadTrace.SpanPanel />\n </ThreadTrace>\n );\n}\n\nfunction ThreadTraceRowContent({\n withFeedback,\n onOpenScore,\n}: {\n withFeedback: boolean;\n onOpenScore: (traceId: string, scoreId: string) => void;\n}) {\n const { traceId, highlightSpans } = useThreadTraceRow();\n const { Link, paths } = useLinkComponent();\n const traceHref = paths.traceLink(traceId);\n // First page only, for the tab badges; the Feedback and Scores bodies own their own pagination\n // and share these queries through the React Query cache.\n const { data: feedbackData } = useTraceFeedback({ traceId, enabled: withFeedback });\n // Same query the span tree observes (passive: the tree drives refetches).\n const { data: traceData } = useTraceSpans(traceId, { passive: true });\n const rootSpanId = traceData?.spans.find(span => span.parentSpanId == null)?.spanId;\n const { data: spanScoresData } = useTraceSpanScores({ traceId, spanId: rootSpanId });\n const feedbackTotal = feedbackData?.pagination?.total;\n const scoresTotal = spanScoresData?.pagination?.total;\n\n return (\n <>\n <ThreadTrace.Messages>\n <ThreadTrace.MessagesHeader>\n <ThreadTrace.TabList>\n <ThreadTrace.Tab value=\"messages\">\n <Icon size=\"xs\">\n <MessageSquareTextIcon />\n </Icon>\n Messages\n </ThreadTrace.Tab>\n {withFeedback && (\n <ThreadTrace.Tab value=\"feedback\">\n <Icon size=\"xs\">\n <MessageSquareReplyIcon />\n </Icon>\n Feedback{feedbackTotal != null && <> ({feedbackTotal})</>}\n </ThreadTrace.Tab>\n )}\n <ThreadTrace.Tab value=\"scores\">\n <Icon size=\"xs\">\n <ScorersIcon />\n </Icon>\n Scores{scoresTotal != null && <> ({scoresTotal})</>}\n </ThreadTrace.Tab>\n </ThreadTrace.TabList>\n </ThreadTrace.MessagesHeader>\n <ThreadTrace.TabContent value=\"messages\" flush>\n <TraceThreadItemView traceId={traceId} onHighlightSpans={highlightSpans} />\n </ThreadTrace.TabContent>\n {withFeedback && (\n <ThreadTrace.TabContent value=\"feedback\" className=\"min-h-0 py-3\">\n <TraceFeedbackTab key={traceId} traceId={traceId} variant=\"thread\" />\n </ThreadTrace.TabContent>\n )}\n <ThreadTrace.TabContent value=\"scores\" className=\"min-h-0 py-3\">\n {rootSpanId ? (\n <TraceScoresTab\n key={traceId}\n traceId={traceId}\n spanId={rootSpanId}\n onScoreSelect={scoreId => onOpenScore(traceId, scoreId)}\n />\n ) : null}\n </ThreadTrace.TabContent>\n </ThreadTrace.Messages>\n <ThreadTrace.Details>\n <ThreadTrace.DetailsHeader>\n {traceHref && (\n <ThreadTrace.DetailsActions>\n <Button render={<Link href={traceHref} />} variant=\"ghost\" size=\"sm\" icon={<ExternalLinkIcon />}>\n Go to trace\n </Button>\n </ThreadTrace.DetailsActions>\n )}\n </ThreadTrace.DetailsHeader>\n <ThreadTrace.Spans />\n </ThreadTrace.Details>\n </>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -9,10 +9,8 @@ require('lucide-react');
9
9
  require('@mastra/react');
10
10
  require('@tanstack/react-query');
11
11
  require('../../../Button-CXhSUBxN.cjs');
12
- require('../../../keyboard/keyboard-shortcuts-context.cjs.js');
13
12
  require('../../../lib/framework.cjs.js');
14
13
  require('@mastra/core/utils/safe-stringify');
15
- require('../../../toast-nm-fM7BR.cjs');
16
14
  const domains_scores_hooks_useScorers = require('../../scores/hooks/use-scorers.cjs.js');
17
15
  const domains_traces_components_traceDataPanelView = require('./trace-data-panel-view.cjs.js');
18
16
  const dialog = require('../../../dialog-d_AK1NQD.cjs');
@@ -1 +1 @@
1
- {"version":3,"file":"trace-data-panel.cjs.js","sources":["../../../../src/domains/traces/components/trace-data-panel.tsx"],"sourcesContent":["import { useState, type ComponentProps } from 'react';\nimport { SpanScoring } from '@/domains/scores';\nimport { useScorers } from '@/domains/scores/hooks/use-scorers';\nimport { TraceDataPanelView, type TraceSideView } from '@/domains/traces/components/trace-data-panel-view';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/ds/components/Dialog';\n\ntype TraceDataPanelProps = Omit<\n ComponentProps<typeof TraceDataPanelView>,\n 'sideView' | 'onSideViewChange' | 'onEvaluateTrace'\n>;\n\n/**\n * Owns the trace panel's side column view so scoring can land on \"Scores\". Mount it with a\n * `key` on the trace (and anchor span) so a view picked on a previous trace never leaks into the next one.\n */\nexport function TraceDataPanel(props: TraceDataPanelProps) {\n const [sideView, setSideView] = useState<TraceSideView>();\n const [isScoringOpen, setIsScoringOpen] = useState(false);\n const { data: scorers, isLoading: isLoadingScorers } = useScorers();\n const rootSpan = props.anchorSpanId\n ? props.spans?.find(span => span.spanId === props.anchorSpanId)\n : props.spans?.find(span => span.parentSpanId == null);\n\n return (\n <>\n <TraceDataPanelView\n {...props}\n onEvaluateTrace={() => setIsScoringOpen(true)}\n sideView={sideView}\n onSideViewChange={setSideView}\n />\n <Dialog open={isScoringOpen} onOpenChange={setIsScoringOpen}>\n <DialogContent size=\"lg\">\n <DialogHeader>\n <DialogTitle>Score trace</DialogTitle>\n </DialogHeader>\n\n {isScoringOpen && rootSpan && (\n <SpanScoring\n traceId={props.traceId}\n spanId={rootSpan.spanId}\n entityType={rootSpan.entityType === 'agent' ? 'Agent' : 'Workflow'}\n isTopLevelSpan={!rootSpan.parentSpanId}\n scorers={scorers}\n isLoadingScorers={isLoadingScorers}\n onSuccess={() => {\n setIsScoringOpen(false);\n setSideView('scores');\n }}\n />\n )}\n </DialogContent>\n </Dialog>\n </>\n );\n}\n"],"names":["useState","useScorers","jsxs","Fragment","jsx","TraceDataPanelView","Dialog","DialogContent","DialogHeader","DialogTitle","SpanScoring"],"mappings":";;;;;;;;;;;;;;;;;;;AAeO,SAAS,eAAe,KAAA,EAA4B;AACzD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,cAAA,EAAwB;AACxD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAS,KAAK,CAAA;AACxD,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,gBAAA,KAAqBC,0CAAA,EAAW;AAClE,EAAA,MAAM,WAAW,KAAA,CAAM,YAAA,GACnB,MAAM,KAAA,EAAO,IAAA,CAAK,UAAQ,IAAA,CAAK,MAAA,KAAW,KAAA,CAAM,YAAY,IAC5D,KAAA,CAAM,KAAA,EAAO,KAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,gBAAgB,IAAI,CAAA;AAEvD,EAAA,uBACEC,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAC,cAAA;AAAA,MAACC,+DAAA;AAAA,MAAA;AAAA,QACE,GAAG,KAAA;AAAA,QACJ,eAAA,EAAiB,MAAM,gBAAA,CAAiB,IAAI,CAAA;AAAA,QAC5C,QAAA;AAAA,QACA,gBAAA,EAAkB;AAAA;AAAA,KACpB;AAAA,oBACAD,cAAA,CAACE,iBAAO,IAAA,EAAM,aAAA,EAAe,cAAc,gBAAA,EACzC,QAAA,kBAAAJ,eAAA,CAACK,oBAAA,EAAA,EAAc,IAAA,EAAK,IAAA,EAClB,QAAA,EAAA;AAAA,sBAAAH,cAAA,CAACI,mBAAA,EAAA,EACC,QAAA,kBAAAJ,cAAA,CAACK,kBAAA,EAAA,EAAY,QAAA,EAAA,aAAA,EAAW,CAAA,EAC1B,CAAA;AAAA,MAEC,iBAAiB,QAAA,oBAChBL,cAAA;AAAA,QAACM,iDAAA;AAAA,QAAA;AAAA,UACC,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,QAAQ,QAAA,CAAS,MAAA;AAAA,UACjB,UAAA,EAAY,QAAA,CAAS,UAAA,KAAe,OAAA,GAAU,OAAA,GAAU,UAAA;AAAA,UACxD,cAAA,EAAgB,CAAC,QAAA,CAAS,YAAA;AAAA,UAC1B,OAAA;AAAA,UACA,gBAAA;AAAA,UACA,WAAW,MAAM;AACf,YAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,YAAA,WAAA,CAAY,QAAQ,CAAA;AAAA,UACtB;AAAA;AAAA;AACF,KAAA,EAEJ,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"trace-data-panel.cjs.js","sources":["../../../../src/domains/traces/components/trace-data-panel.tsx"],"sourcesContent":["import { useState, type ComponentProps } from 'react';\nimport { SpanScoring } from '@/domains/scores';\nimport { useScorers } from '@/domains/scores/hooks/use-scorers';\nimport { TraceDataPanelView, type TraceSideView } from '@/domains/traces/components/trace-data-panel-view';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/ds/components/Dialog';\n\ntype TraceDataPanelProps = Omit<\n ComponentProps<typeof TraceDataPanelView>,\n 'sideView' | 'onSideViewChange' | 'onEvaluateTrace'\n>;\n\n/**\n * Owns the trace panel's side column view so scoring can land on \"Scores\". Mount it with a\n * `key` on the trace (and anchor span) so a view picked on a previous trace never leaks into the next one.\n */\nexport function TraceDataPanel(props: TraceDataPanelProps) {\n const [sideView, setSideView] = useState<TraceSideView>();\n const [isScoringOpen, setIsScoringOpen] = useState(false);\n const { data: scorers, isLoading: isLoadingScorers } = useScorers();\n const rootSpan = props.anchorSpanId\n ? props.spans?.find(span => span.spanId === props.anchorSpanId)\n : props.spans?.find(span => span.parentSpanId == null);\n\n return (\n <>\n <TraceDataPanelView\n {...props}\n onEvaluateTrace={() => setIsScoringOpen(true)}\n sideView={sideView}\n onSideViewChange={setSideView}\n />\n <Dialog open={isScoringOpen} onOpenChange={setIsScoringOpen}>\n <DialogContent size=\"lg\">\n <DialogHeader>\n <DialogTitle>Score trace</DialogTitle>\n </DialogHeader>\n\n {isScoringOpen && rootSpan && (\n <SpanScoring\n traceId={props.traceId}\n spanId={rootSpan.spanId}\n entityType={rootSpan.entityType === 'agent' ? 'Agent' : 'Workflow'}\n isTopLevelSpan={!rootSpan.parentSpanId}\n scorers={scorers}\n isLoadingScorers={isLoadingScorers}\n onSuccess={() => {\n setIsScoringOpen(false);\n setSideView('scores');\n }}\n />\n )}\n </DialogContent>\n </Dialog>\n </>\n );\n}\n"],"names":["useState","useScorers","jsxs","Fragment","jsx","TraceDataPanelView","Dialog","DialogContent","DialogHeader","DialogTitle","SpanScoring"],"mappings":";;;;;;;;;;;;;;;;;AAeO,SAAS,eAAe,KAAA,EAA4B;AACzD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,cAAA,EAAwB;AACxD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAS,KAAK,CAAA;AACxD,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,gBAAA,KAAqBC,0CAAA,EAAW;AAClE,EAAA,MAAM,WAAW,KAAA,CAAM,YAAA,GACnB,MAAM,KAAA,EAAO,IAAA,CAAK,UAAQ,IAAA,CAAK,MAAA,KAAW,KAAA,CAAM,YAAY,IAC5D,KAAA,CAAM,KAAA,EAAO,KAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,gBAAgB,IAAI,CAAA;AAEvD,EAAA,uBACEC,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAC,cAAA;AAAA,MAACC,+DAAA;AAAA,MAAA;AAAA,QACE,GAAG,KAAA;AAAA,QACJ,eAAA,EAAiB,MAAM,gBAAA,CAAiB,IAAI,CAAA;AAAA,QAC5C,QAAA;AAAA,QACA,gBAAA,EAAkB;AAAA;AAAA,KACpB;AAAA,oBACAD,cAAA,CAACE,iBAAO,IAAA,EAAM,aAAA,EAAe,cAAc,gBAAA,EACzC,QAAA,kBAAAJ,eAAA,CAACK,oBAAA,EAAA,EAAc,IAAA,EAAK,IAAA,EAClB,QAAA,EAAA;AAAA,sBAAAH,cAAA,CAACI,mBAAA,EAAA,EACC,QAAA,kBAAAJ,cAAA,CAACK,kBAAA,EAAA,EAAY,QAAA,EAAA,aAAA,EAAW,CAAA,EAC1B,CAAA;AAAA,MAEC,iBAAiB,QAAA,oBAChBL,cAAA;AAAA,QAACM,iDAAA;AAAA,QAAA;AAAA,UACC,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,QAAQ,QAAA,CAAS,MAAA;AAAA,UACjB,UAAA,EAAY,QAAA,CAAS,UAAA,KAAe,OAAA,GAAU,OAAA,GAAU,UAAA;AAAA,UACxD,cAAA,EAAgB,CAAC,QAAA,CAAS,YAAA;AAAA,UAC1B,OAAA;AAAA,UACA,gBAAA;AAAA,UACA,WAAW,MAAM;AACf,YAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,YAAA,WAAA,CAAY,QAAQ,CAAA;AAAA,UACtB;AAAA;AAAA;AACF,KAAA,EAEJ,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -5,10 +5,8 @@ import 'lucide-react';
5
5
  import '@mastra/react';
6
6
  import '@tanstack/react-query';
7
7
  import '../../../Button-D43ghVKt.js';
8
- import '../../../keyboard/keyboard-shortcuts-context.es.js';
9
8
  import '../../../lib/framework.es.js';
10
9
  import '@mastra/core/utils/safe-stringify';
11
- import '../../../toast-c5kCpyWt.js';
12
10
  import { useScorers } from '../../scores/hooks/use-scorers.es.js';
13
11
  import { TraceDataPanelView } from './trace-data-panel-view.es.js';
14
12
  import { D as Dialog, d as DialogContent, g as DialogHeader, j as DialogTitle } from '../../../dialog-Dt5kASkl.js';
@@ -1 +1 @@
1
- {"version":3,"file":"trace-data-panel.es.js","sources":["../../../../src/domains/traces/components/trace-data-panel.tsx"],"sourcesContent":["import { useState, type ComponentProps } from 'react';\nimport { SpanScoring } from '@/domains/scores';\nimport { useScorers } from '@/domains/scores/hooks/use-scorers';\nimport { TraceDataPanelView, type TraceSideView } from '@/domains/traces/components/trace-data-panel-view';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/ds/components/Dialog';\n\ntype TraceDataPanelProps = Omit<\n ComponentProps<typeof TraceDataPanelView>,\n 'sideView' | 'onSideViewChange' | 'onEvaluateTrace'\n>;\n\n/**\n * Owns the trace panel's side column view so scoring can land on \"Scores\". Mount it with a\n * `key` on the trace (and anchor span) so a view picked on a previous trace never leaks into the next one.\n */\nexport function TraceDataPanel(props: TraceDataPanelProps) {\n const [sideView, setSideView] = useState<TraceSideView>();\n const [isScoringOpen, setIsScoringOpen] = useState(false);\n const { data: scorers, isLoading: isLoadingScorers } = useScorers();\n const rootSpan = props.anchorSpanId\n ? props.spans?.find(span => span.spanId === props.anchorSpanId)\n : props.spans?.find(span => span.parentSpanId == null);\n\n return (\n <>\n <TraceDataPanelView\n {...props}\n onEvaluateTrace={() => setIsScoringOpen(true)}\n sideView={sideView}\n onSideViewChange={setSideView}\n />\n <Dialog open={isScoringOpen} onOpenChange={setIsScoringOpen}>\n <DialogContent size=\"lg\">\n <DialogHeader>\n <DialogTitle>Score trace</DialogTitle>\n </DialogHeader>\n\n {isScoringOpen && rootSpan && (\n <SpanScoring\n traceId={props.traceId}\n spanId={rootSpan.spanId}\n entityType={rootSpan.entityType === 'agent' ? 'Agent' : 'Workflow'}\n isTopLevelSpan={!rootSpan.parentSpanId}\n scorers={scorers}\n isLoadingScorers={isLoadingScorers}\n onSuccess={() => {\n setIsScoringOpen(false);\n setSideView('scores');\n }}\n />\n )}\n </DialogContent>\n </Dialog>\n </>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAeO,SAAS,eAAe,KAAA,EAA4B;AACzD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAA,EAAwB;AACxD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,KAAK,CAAA;AACxD,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,gBAAA,KAAqB,UAAA,EAAW;AAClE,EAAA,MAAM,WAAW,KAAA,CAAM,YAAA,GACnB,MAAM,KAAA,EAAO,IAAA,CAAK,UAAQ,IAAA,CAAK,MAAA,KAAW,KAAA,CAAM,YAAY,IAC5D,KAAA,CAAM,KAAA,EAAO,KAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,gBAAgB,IAAI,CAAA;AAEvD,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACE,GAAG,KAAA;AAAA,QACJ,eAAA,EAAiB,MAAM,gBAAA,CAAiB,IAAI,CAAA;AAAA,QAC5C,QAAA;AAAA,QACA,gBAAA,EAAkB;AAAA;AAAA,KACpB;AAAA,oBACA,GAAA,CAAC,UAAO,IAAA,EAAM,aAAA,EAAe,cAAc,gBAAA,EACzC,QAAA,kBAAA,IAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAK,IAAA,EAClB,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,YAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,QAAA,EAAA,aAAA,EAAW,CAAA,EAC1B,CAAA;AAAA,MAEC,iBAAiB,QAAA,oBAChB,GAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,QAAQ,QAAA,CAAS,MAAA;AAAA,UACjB,UAAA,EAAY,QAAA,CAAS,UAAA,KAAe,OAAA,GAAU,OAAA,GAAU,UAAA;AAAA,UACxD,cAAA,EAAgB,CAAC,QAAA,CAAS,YAAA;AAAA,UAC1B,OAAA;AAAA,UACA,gBAAA;AAAA,UACA,WAAW,MAAM;AACf,YAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,YAAA,WAAA,CAAY,QAAQ,CAAA;AAAA,UACtB;AAAA;AAAA;AACF,KAAA,EAEJ,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"trace-data-panel.es.js","sources":["../../../../src/domains/traces/components/trace-data-panel.tsx"],"sourcesContent":["import { useState, type ComponentProps } from 'react';\nimport { SpanScoring } from '@/domains/scores';\nimport { useScorers } from '@/domains/scores/hooks/use-scorers';\nimport { TraceDataPanelView, type TraceSideView } from '@/domains/traces/components/trace-data-panel-view';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/ds/components/Dialog';\n\ntype TraceDataPanelProps = Omit<\n ComponentProps<typeof TraceDataPanelView>,\n 'sideView' | 'onSideViewChange' | 'onEvaluateTrace'\n>;\n\n/**\n * Owns the trace panel's side column view so scoring can land on \"Scores\". Mount it with a\n * `key` on the trace (and anchor span) so a view picked on a previous trace never leaks into the next one.\n */\nexport function TraceDataPanel(props: TraceDataPanelProps) {\n const [sideView, setSideView] = useState<TraceSideView>();\n const [isScoringOpen, setIsScoringOpen] = useState(false);\n const { data: scorers, isLoading: isLoadingScorers } = useScorers();\n const rootSpan = props.anchorSpanId\n ? props.spans?.find(span => span.spanId === props.anchorSpanId)\n : props.spans?.find(span => span.parentSpanId == null);\n\n return (\n <>\n <TraceDataPanelView\n {...props}\n onEvaluateTrace={() => setIsScoringOpen(true)}\n sideView={sideView}\n onSideViewChange={setSideView}\n />\n <Dialog open={isScoringOpen} onOpenChange={setIsScoringOpen}>\n <DialogContent size=\"lg\">\n <DialogHeader>\n <DialogTitle>Score trace</DialogTitle>\n </DialogHeader>\n\n {isScoringOpen && rootSpan && (\n <SpanScoring\n traceId={props.traceId}\n spanId={rootSpan.spanId}\n entityType={rootSpan.entityType === 'agent' ? 'Agent' : 'Workflow'}\n isTopLevelSpan={!rootSpan.parentSpanId}\n scorers={scorers}\n isLoadingScorers={isLoadingScorers}\n onSuccess={() => {\n setIsScoringOpen(false);\n setSideView('scores');\n }}\n />\n )}\n </DialogContent>\n </Dialog>\n </>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;AAeO,SAAS,eAAe,KAAA,EAA4B;AACzD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAA,EAAwB;AACxD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,KAAK,CAAA;AACxD,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,gBAAA,KAAqB,UAAA,EAAW;AAClE,EAAA,MAAM,WAAW,KAAA,CAAM,YAAA,GACnB,MAAM,KAAA,EAAO,IAAA,CAAK,UAAQ,IAAA,CAAK,MAAA,KAAW,KAAA,CAAM,YAAY,IAC5D,KAAA,CAAM,KAAA,EAAO,KAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,gBAAgB,IAAI,CAAA;AAEvD,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACE,GAAG,KAAA;AAAA,QACJ,eAAA,EAAiB,MAAM,gBAAA,CAAiB,IAAI,CAAA;AAAA,QAC5C,QAAA;AAAA,QACA,gBAAA,EAAkB;AAAA;AAAA,KACpB;AAAA,oBACA,GAAA,CAAC,UAAO,IAAA,EAAM,aAAA,EAAe,cAAc,gBAAA,EACzC,QAAA,kBAAA,IAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAK,IAAA,EAClB,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,YAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,QAAA,EAAA,aAAA,EAAW,CAAA,EAC1B,CAAA;AAAA,MAEC,iBAAiB,QAAA,oBAChB,GAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,QAAQ,QAAA,CAAS,MAAA;AAAA,UACjB,UAAA,EAAY,QAAA,CAAS,UAAA,KAAe,OAAA,GAAU,OAAA,GAAU,UAAA;AAAA,UACxD,cAAA,EAAgB,CAAC,QAAA,CAAS,YAAA;AAAA,UAC1B,OAAA;AAAA,UACA,gBAAA;AAAA,UACA,WAAW,MAAM;AACf,YAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,YAAA,WAAA,CAAY,QAAQ,CAAA;AAAA,UACtB;AAAA;AAAA;AACF,KAAA,EAEJ,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -5,8 +5,6 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
5
5
  const jsxRuntime = require('react/jsx-runtime');
6
6
  const domains_traces_traceListColumns = require('../trace-list-columns.cjs.js');
7
7
  const dataListSkeleton = require('../../../data-list-skeleton-BXPfL0s7.cjs');
8
- require('react');
9
- require('../../../keyboard/keyboard-shortcuts-context.cjs.js');
10
8
  const skeleton = require('../../../skeleton-cXUjPrq9.cjs');
11
9
 
12
10
  function TracesPageSkeleton({ columnPreferences = domains_traces_traceListColumns.DEFAULT_TRACE_COLUMN_PREFERENCES }) {
@@ -1 +1 @@
1
- {"version":3,"file":"traces-page-skeleton.cjs.js","sources":["../../../../src/domains/traces/components/traces-page-skeleton.tsx"],"sourcesContent":["import { buildTraceListColumns, DEFAULT_TRACE_COLUMN_PREFERENCES } from '../trace-list-columns';\nimport type { TraceColumnPreferences } from '../trace-list-columns';\nimport { DataListSkeleton } from '@/ds/components/DataList';\nimport { Skeleton } from '@/ds/components/Skeleton';\n\nexport type TracesPageSkeletonProps = {\n columnPreferences?: TraceColumnPreferences;\n};\n\n/**\n * Page-level placeholder shown while filter-field discovery is pending: a toolbar-height\n * bar stands in for the FilterBar and the usual list skeleton for the trace rows.\n */\nexport function TracesPageSkeleton({ columnPreferences = DEFAULT_TRACE_COLUMN_PREFERENCES }: TracesPageSkeletonProps) {\n const columns = buildTraceListColumns(columnPreferences);\n return (\n <div\n className=\"flex h-full min-h-0 flex-col gap-2\"\n role=\"status\"\n aria-label=\"Loading traces\"\n data-testid=\"traces-page-skeleton\"\n >\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-control-md min-w-64 flex-1\" />\n <Skeleton className=\"h-control-md w-28\" />\n </div>\n <DataListSkeleton columns={columns} fit=\"container\" />\n </div>\n );\n}\n"],"names":["DEFAULT_TRACE_COLUMN_PREFERENCES","buildTraceListColumns","jsxs","jsx","Skeleton","DataListSkeleton"],"mappings":";;;;;;;;;;;AAaO,SAAS,kBAAA,CAAmB,EAAE,iBAAA,GAAoBA,gEAAA,EAAiC,EAA4B;AACpH,EAAA,MAAM,OAAA,GAAUC,sDAAsB,iBAAiB,CAAA;AACvD,EAAA,uBACEC,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,oCAAA;AAAA,MACV,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAW,gBAAA;AAAA,MACX,aAAA,EAAY,sBAAA;AAAA,MAEZ,QAAA,EAAA;AAAA,wBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,cAAA,CAACC,iBAAA,EAAA,EAAS,WAAU,8BAAA,EAA+B,CAAA;AAAA,0BACnDD,cAAA,CAACC,iBAAA,EAAA,EAAS,SAAA,EAAU,mBAAA,EAAoB;AAAA,SAAA,EAC1C,CAAA;AAAA,wBACAD,cAAA,CAACE,iCAAA,EAAA,EAAiB,OAAA,EAAkB,GAAA,EAAI,WAAA,EAAY;AAAA;AAAA;AAAA,GACtD;AAEJ;;;;"}
1
+ {"version":3,"file":"traces-page-skeleton.cjs.js","sources":["../../../../src/domains/traces/components/traces-page-skeleton.tsx"],"sourcesContent":["import { buildTraceListColumns, DEFAULT_TRACE_COLUMN_PREFERENCES } from '../trace-list-columns';\nimport type { TraceColumnPreferences } from '../trace-list-columns';\nimport { DataListSkeleton } from '@/ds/components/DataList';\nimport { Skeleton } from '@/ds/components/Skeleton';\n\nexport type TracesPageSkeletonProps = {\n columnPreferences?: TraceColumnPreferences;\n};\n\n/**\n * Page-level placeholder shown while filter-field discovery is pending: a toolbar-height\n * bar stands in for the FilterBar and the usual list skeleton for the trace rows.\n */\nexport function TracesPageSkeleton({ columnPreferences = DEFAULT_TRACE_COLUMN_PREFERENCES }: TracesPageSkeletonProps) {\n const columns = buildTraceListColumns(columnPreferences);\n return (\n <div\n className=\"flex h-full min-h-0 flex-col gap-2\"\n role=\"status\"\n aria-label=\"Loading traces\"\n data-testid=\"traces-page-skeleton\"\n >\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-control-md min-w-64 flex-1\" />\n <Skeleton className=\"h-control-md w-28\" />\n </div>\n <DataListSkeleton columns={columns} fit=\"container\" />\n </div>\n );\n}\n"],"names":["DEFAULT_TRACE_COLUMN_PREFERENCES","buildTraceListColumns","jsxs","jsx","Skeleton","DataListSkeleton"],"mappings":";;;;;;;;;AAaO,SAAS,kBAAA,CAAmB,EAAE,iBAAA,GAAoBA,gEAAA,EAAiC,EAA4B;AACpH,EAAA,MAAM,OAAA,GAAUC,sDAAsB,iBAAiB,CAAA;AACvD,EAAA,uBACEC,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,oCAAA;AAAA,MACV,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAW,gBAAA;AAAA,MACX,aAAA,EAAY,sBAAA;AAAA,MAEZ,QAAA,EAAA;AAAA,wBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,cAAA,CAACC,iBAAA,EAAA,EAAS,WAAU,8BAAA,EAA+B,CAAA;AAAA,0BACnDD,cAAA,CAACC,iBAAA,EAAA,EAAS,SAAA,EAAU,mBAAA,EAAoB;AAAA,SAAA,EAC1C,CAAA;AAAA,wBACAD,cAAA,CAACE,iCAAA,EAAA,EAAiB,OAAA,EAAkB,GAAA,EAAI,WAAA,EAAY;AAAA;AAAA;AAAA,GACtD;AAEJ;;;;"}
@@ -1,8 +1,6 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { buildTraceListColumns, DEFAULT_TRACE_COLUMN_PREFERENCES } from '../trace-list-columns.es.js';
3
3
  import { D as DataListSkeleton } from '../../../data-list-skeleton-Bk9LI0J0.js';
4
- import 'react';
5
- import '../../../keyboard/keyboard-shortcuts-context.es.js';
6
4
  import { S as Skeleton } from '../../../skeleton-BsRAXyh5.js';
7
5
 
8
6
  function TracesPageSkeleton({ columnPreferences = DEFAULT_TRACE_COLUMN_PREFERENCES }) {
@@ -1 +1 @@
1
- {"version":3,"file":"traces-page-skeleton.es.js","sources":["../../../../src/domains/traces/components/traces-page-skeleton.tsx"],"sourcesContent":["import { buildTraceListColumns, DEFAULT_TRACE_COLUMN_PREFERENCES } from '../trace-list-columns';\nimport type { TraceColumnPreferences } from '../trace-list-columns';\nimport { DataListSkeleton } from '@/ds/components/DataList';\nimport { Skeleton } from '@/ds/components/Skeleton';\n\nexport type TracesPageSkeletonProps = {\n columnPreferences?: TraceColumnPreferences;\n};\n\n/**\n * Page-level placeholder shown while filter-field discovery is pending: a toolbar-height\n * bar stands in for the FilterBar and the usual list skeleton for the trace rows.\n */\nexport function TracesPageSkeleton({ columnPreferences = DEFAULT_TRACE_COLUMN_PREFERENCES }: TracesPageSkeletonProps) {\n const columns = buildTraceListColumns(columnPreferences);\n return (\n <div\n className=\"flex h-full min-h-0 flex-col gap-2\"\n role=\"status\"\n aria-label=\"Loading traces\"\n data-testid=\"traces-page-skeleton\"\n >\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-control-md min-w-64 flex-1\" />\n <Skeleton className=\"h-control-md w-28\" />\n </div>\n <DataListSkeleton columns={columns} fit=\"container\" />\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAaO,SAAS,kBAAA,CAAmB,EAAE,iBAAA,GAAoB,gCAAA,EAAiC,EAA4B;AACpH,EAAA,MAAM,OAAA,GAAU,sBAAsB,iBAAiB,CAAA;AACvD,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,oCAAA;AAAA,MACV,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAW,gBAAA;AAAA,MACX,aAAA,EAAY,sBAAA;AAAA,MAEZ,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,QAAA,EAAA,EAAS,WAAU,8BAAA,EAA+B,CAAA;AAAA,0BACnD,GAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,mBAAA,EAAoB;AAAA,SAAA,EAC1C,CAAA;AAAA,wBACA,GAAA,CAAC,gBAAA,EAAA,EAAiB,OAAA,EAAkB,GAAA,EAAI,WAAA,EAAY;AAAA;AAAA;AAAA,GACtD;AAEJ;;;;"}
1
+ {"version":3,"file":"traces-page-skeleton.es.js","sources":["../../../../src/domains/traces/components/traces-page-skeleton.tsx"],"sourcesContent":["import { buildTraceListColumns, DEFAULT_TRACE_COLUMN_PREFERENCES } from '../trace-list-columns';\nimport type { TraceColumnPreferences } from '../trace-list-columns';\nimport { DataListSkeleton } from '@/ds/components/DataList';\nimport { Skeleton } from '@/ds/components/Skeleton';\n\nexport type TracesPageSkeletonProps = {\n columnPreferences?: TraceColumnPreferences;\n};\n\n/**\n * Page-level placeholder shown while filter-field discovery is pending: a toolbar-height\n * bar stands in for the FilterBar and the usual list skeleton for the trace rows.\n */\nexport function TracesPageSkeleton({ columnPreferences = DEFAULT_TRACE_COLUMN_PREFERENCES }: TracesPageSkeletonProps) {\n const columns = buildTraceListColumns(columnPreferences);\n return (\n <div\n className=\"flex h-full min-h-0 flex-col gap-2\"\n role=\"status\"\n aria-label=\"Loading traces\"\n data-testid=\"traces-page-skeleton\"\n >\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-control-md min-w-64 flex-1\" />\n <Skeleton className=\"h-control-md w-28\" />\n </div>\n <DataListSkeleton columns={columns} fit=\"container\" />\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;AAaO,SAAS,kBAAA,CAAmB,EAAE,iBAAA,GAAoB,gCAAA,EAAiC,EAA4B;AACpH,EAAA,MAAM,OAAA,GAAU,sBAAsB,iBAAiB,CAAA;AACvD,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,oCAAA;AAAA,MACV,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAW,gBAAA;AAAA,MACX,aAAA,EAAY,sBAAA;AAAA,MAEZ,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,QAAA,EAAA,EAAS,WAAU,8BAAA,EAA+B,CAAA;AAAA,0BACnD,GAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,mBAAA,EAAoB;AAAA,SAAA,EAC1C,CAAA;AAAA,wBACA,GAAA,CAAC,gBAAA,EAAA,EAAiB,OAAA,EAAkB,GAAA,EAAI,WAAA,EAAY;AAAA;AAAA;AAAA,GACtD;AAEJ;;;;"}
@@ -17,6 +17,7 @@ require('../../../lib/form/field-context.cjs.js');
17
17
  const lib_form_utils = require('../../../lib/form/utils.cjs.js');
18
18
  require('../../../Button-CXhSUBxN.cjs');
19
19
  require('date-fns');
20
+ require('../../../popover-lBqKiPtp.cjs');
20
21
  const utils_cn = require('../../../cn-DG0X1KEP.cjs');
21
22
  require('@autoform/core');
22
23
  require('@autoform/react');
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-input-data.cjs.js","sources":["../../../../src/domains/workflows/workflow/workflow-input-data.tsx"],"sourcesContent":["import { ChevronRight, Play } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { useRef, useState } from 'react';\nimport type { ZodSchema } from 'zod';\n\nimport { createProcessorInput, parseProcessorDraft } from './input/processor-input';\nimport type { ProcessorDraft } from './input/processor-input';\nimport { WorkflowJsonInput } from './input/workflow-json-input';\nimport { WorkflowProcessorInput } from './input/workflow-processor-input';\nimport { WorkflowInputTypeToggle } from './workflow-input-type-toggle';\nimport type { WorkflowInputType } from './workflow-input-type-toggle';\nimport { Button } from '@/ds/components/Button';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/ds/components/Collapsible';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { DynamicForm } from '@/lib/form';\nimport { isPlainObject } from '@/lib/form/utils';\nimport { getBaseSchema } from '@/lib/form/zod-provider/compat';\nimport { inferFieldType } from '@/lib/form/zod-provider/field-type-inference';\nimport { cn } from '@/utils/cn';\n\nexport interface WorkflowInputDataProps {\n schema: ZodSchema;\n defaultValues?: unknown;\n isSubmitLoading: boolean;\n submitButtonLabel: string;\n onSubmit: (data: any) => void;\n children?: React.ReactNode;\n isProcessorWorkflow?: boolean;\n submitActions?: React.ReactNode;\n leftActions?: React.ReactNode;\n headingSlot?: ReactNode;\n collapsible?: boolean;\n submitButtonIcon?: ReactNode;\n submitButtonVariant?: React.ComponentProps<typeof Button>['variant'];\n submitButtonFullWidth?: boolean;\n hideInputTypeLabel?: boolean;\n inputTypeLabel?: string;\n hideHeading?: boolean;\n}\n\ntype InputDraft =\n | { type: 'json'; value: string }\n | { type: 'form'; value: unknown }\n | { type: 'simple'; value: ProcessorDraft };\n\ntype DraftValue = { ok: true; value: unknown } | { ok: false; error: string };\n\nconst defaultSubmitIcon = (\n <Icon>\n <Play />\n </Icon>\n);\n\nfunction createInitialDraft(defaultValues: unknown, isProcessorWorkflow: boolean | undefined): InputDraft {\n if (!isProcessorWorkflow) return { type: 'form', value: defaultValues };\n const input = defaultValues ?? createProcessorInput();\n const draft = parseProcessorDraft(input);\n return draft ? { type: 'simple', value: draft } : { type: 'json', value: JSON.stringify(input, null, 2) };\n}\n\nfunction parseJsonDraft(text: string): DraftValue {\n try {\n return { ok: true, value: JSON.parse(text) };\n } catch (error) {\n return { ok: false, error: error instanceof Error ? `Invalid JSON: ${error.message}` : 'Invalid JSON' };\n }\n}\n\nfunction getFormShapeError(schema: ZodSchema, value: unknown) {\n const fieldType = inferFieldType(getBaseSchema(schema));\n if (fieldType === 'object' && !isPlainObject(value))\n return 'Form input requires a JSON object. Correct the JSON first.';\n if (fieldType === 'array' && !Array.isArray(value))\n return 'Form input requires a JSON array. Correct the JSON first.';\n return undefined;\n}\n\nexport const WorkflowInputData = ({\n schema,\n defaultValues,\n isSubmitLoading,\n submitButtonLabel,\n onSubmit,\n children,\n isProcessorWorkflow,\n submitActions,\n leftActions,\n headingSlot,\n collapsible = true,\n submitButtonIcon = defaultSubmitIcon,\n submitButtonVariant = 'primary',\n submitButtonFullWidth,\n hideInputTypeLabel,\n inputTypeLabel = 'Run input',\n hideHeading,\n}: WorkflowInputDataProps) => {\n const [draft, setDraft] = useState(() => createInitialDraft(defaultValues, isProcessorWorkflow));\n // The Form view is uncontrolled: state here would only re-render this tree on every keystroke.\n const formValues = useRef<unknown>(defaultValues);\n const [errors, setErrors] = useState<string[]>([]);\n\n function readDraftValue(): DraftValue {\n if (draft.type === 'json') return parseJsonDraft(draft.value);\n return { ok: true, value: draft.type === 'form' ? formValues.current : draft.value };\n }\n\n function submitJsonDraft(text: string) {\n const json = parseJsonDraft(text);\n if (!json.ok) return setErrors([json.error]);\n const result = schema.safeParse(json.value);\n if (result.success) onSubmit(result.data);\n else setErrors(result.error.issues.map(issue => `${issue.path.join('.') || 'Input'}: ${issue.message}`));\n }\n\n function changeInputType(type: WorkflowInputType) {\n if (type === draft.type) return;\n setErrors([]);\n const current = readDraftValue();\n if (!current.ok) return setErrors([current.error]);\n if (type === 'json') {\n return setDraft({ type, value: JSON.stringify(current.value === undefined ? {} : current.value, null, 2) });\n }\n if (type === 'simple') {\n const processorDraft = parseProcessorDraft(current.value);\n if (processorDraft) return setDraft({ type, value: processorDraft });\n return setErrors([\n 'Simple input requires a messages array with text parts and a string phase. Correct the JSON first.',\n ]);\n }\n const formShapeError = getFormShapeError(schema, current.value);\n return formShapeError ? setErrors([formShapeError]) : setDraft({ type, value: current.value });\n }\n\n const defaultHeading = (\n <Txt as=\"span\" variant=\"subheading\" tone=\"ink\">\n Trigger a run\n </Txt>\n );\n const toggleSitsInLabelRow = !collapsible && !hideHeading;\n const toggleSitsAboveInput = collapsible || hideHeading || hideInputTypeLabel;\n const inputTypeToggle = (\n <WorkflowInputTypeToggle\n value={draft.type}\n onChange={changeInputType}\n disabled={isSubmitLoading}\n includeSimple={isProcessorWorkflow}\n compact={toggleSitsInLabelRow}\n />\n );\n\n const body = (\n <>\n {!hideInputTypeLabel && (\n <div className=\"flex justify-between gap-3 px-5 py-3\">\n <Txt as=\"p\" variant=\"caption\" tone=\"muted\">\n {inputTypeLabel}\n </Txt>\n {toggleSitsInLabelRow && <div className=\"shrink-0\">{inputTypeToggle}</div>}\n </div>\n )}\n\n <div className=\"px-5\">\n {toggleSitsAboveInput && <div className=\"pb-4\">{inputTypeToggle}</div>}\n\n <div\n className={cn('pb-4', {\n 'pointer-events-none opacity-50': isSubmitLoading,\n })}\n >\n {draft.type === 'json' ? (\n <WorkflowJsonInput\n value={draft.value}\n onChange={value => {\n setDraft({ type: 'json', value });\n setErrors([]);\n }}\n errors={errors}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={() => submitJsonDraft(draft.value)}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </WorkflowJsonInput>\n ) : draft.type === 'simple' && isProcessorWorkflow ? (\n <WorkflowProcessorInput\n schema={schema}\n value={draft.value}\n onChange={value => setDraft({ type: 'simple', value })}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={onSubmit}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </WorkflowProcessorInput>\n ) : (\n <WorkflowFormInput\n schema={schema}\n onValuesChange={value => {\n formValues.current = value;\n }}\n defaultValues={draft.value}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={onSubmit}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </WorkflowFormInput>\n )}\n </div>\n </div>\n </>\n );\n\n if (!collapsible) {\n return (\n <>\n {!hideHeading && <div className=\"border-b border-border/50 pb-3\">{headingSlot ?? defaultHeading}</div>}\n <div>{body}</div>\n </>\n );\n }\n\n return (\n <Collapsible defaultOpen>\n <CollapsibleTrigger className=\"flex w-full items-center gap-2 pb-3 text-left\">\n <ChevronRight className=\"size-4 shrink-0 text-muted-foreground\" />\n {headingSlot ?? defaultHeading}\n </CollapsibleTrigger>\n\n <CollapsibleContent keepMounted>{body}</CollapsibleContent>\n </Collapsible>\n );\n};\n\nconst WorkflowFormInput = ({\n schema,\n defaultValues,\n isSubmitLoading,\n submitButtonLabel,\n onSubmit,\n children,\n submitActions,\n leftActions,\n submitButtonIcon,\n submitButtonVariant,\n submitButtonFullWidth,\n onValuesChange,\n}: WorkflowInputDataProps & { onValuesChange: (value: unknown) => void }) => (\n <DynamicForm\n schema={schema}\n defaultValues={defaultValues}\n onValuesChange={onValuesChange}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={onSubmit}\n readOnly={isSubmitLoading}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </DynamicForm>\n);\n"],"names":["jsx","Icon","Play","createProcessorInput","parseProcessorDraft","inferFieldType","getBaseSchema","isPlainObject","collapsible","useState","useRef","Txt","WorkflowInputTypeToggle","jsxs","Fragment","cn","WorkflowJsonInput","WorkflowProcessorInput","Collapsible","CollapsibleTrigger","ChevronRight","CollapsibleContent","DynamicForm"],"mappings":"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"}
1
+ {"version":3,"file":"workflow-input-data.cjs.js","sources":["../../../../src/domains/workflows/workflow/workflow-input-data.tsx"],"sourcesContent":["import { ChevronRight, Play } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { useRef, useState } from 'react';\nimport type { ZodSchema } from 'zod';\n\nimport { createProcessorInput, parseProcessorDraft } from './input/processor-input';\nimport type { ProcessorDraft } from './input/processor-input';\nimport { WorkflowJsonInput } from './input/workflow-json-input';\nimport { WorkflowProcessorInput } from './input/workflow-processor-input';\nimport { WorkflowInputTypeToggle } from './workflow-input-type-toggle';\nimport type { WorkflowInputType } from './workflow-input-type-toggle';\nimport { Button } from '@/ds/components/Button';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/ds/components/Collapsible';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { DynamicForm } from '@/lib/form';\nimport { isPlainObject } from '@/lib/form/utils';\nimport { getBaseSchema } from '@/lib/form/zod-provider/compat';\nimport { inferFieldType } from '@/lib/form/zod-provider/field-type-inference';\nimport { cn } from '@/utils/cn';\n\nexport interface WorkflowInputDataProps {\n schema: ZodSchema;\n defaultValues?: unknown;\n isSubmitLoading: boolean;\n submitButtonLabel: string;\n onSubmit: (data: any) => void;\n children?: React.ReactNode;\n isProcessorWorkflow?: boolean;\n submitActions?: React.ReactNode;\n leftActions?: React.ReactNode;\n headingSlot?: ReactNode;\n collapsible?: boolean;\n submitButtonIcon?: ReactNode;\n submitButtonVariant?: React.ComponentProps<typeof Button>['variant'];\n submitButtonFullWidth?: boolean;\n hideInputTypeLabel?: boolean;\n inputTypeLabel?: string;\n hideHeading?: boolean;\n}\n\ntype InputDraft =\n | { type: 'json'; value: string }\n | { type: 'form'; value: unknown }\n | { type: 'simple'; value: ProcessorDraft };\n\ntype DraftValue = { ok: true; value: unknown } | { ok: false; error: string };\n\nconst defaultSubmitIcon = (\n <Icon>\n <Play />\n </Icon>\n);\n\nfunction createInitialDraft(defaultValues: unknown, isProcessorWorkflow: boolean | undefined): InputDraft {\n if (!isProcessorWorkflow) return { type: 'form', value: defaultValues };\n const input = defaultValues ?? createProcessorInput();\n const draft = parseProcessorDraft(input);\n return draft ? { type: 'simple', value: draft } : { type: 'json', value: JSON.stringify(input, null, 2) };\n}\n\nfunction parseJsonDraft(text: string): DraftValue {\n try {\n return { ok: true, value: JSON.parse(text) };\n } catch (error) {\n return { ok: false, error: error instanceof Error ? `Invalid JSON: ${error.message}` : 'Invalid JSON' };\n }\n}\n\nfunction getFormShapeError(schema: ZodSchema, value: unknown) {\n const fieldType = inferFieldType(getBaseSchema(schema));\n if (fieldType === 'object' && !isPlainObject(value))\n return 'Form input requires a JSON object. Correct the JSON first.';\n if (fieldType === 'array' && !Array.isArray(value))\n return 'Form input requires a JSON array. Correct the JSON first.';\n return undefined;\n}\n\nexport const WorkflowInputData = ({\n schema,\n defaultValues,\n isSubmitLoading,\n submitButtonLabel,\n onSubmit,\n children,\n isProcessorWorkflow,\n submitActions,\n leftActions,\n headingSlot,\n collapsible = true,\n submitButtonIcon = defaultSubmitIcon,\n submitButtonVariant = 'primary',\n submitButtonFullWidth,\n hideInputTypeLabel,\n inputTypeLabel = 'Run input',\n hideHeading,\n}: WorkflowInputDataProps) => {\n const [draft, setDraft] = useState(() => createInitialDraft(defaultValues, isProcessorWorkflow));\n // The Form view is uncontrolled: state here would only re-render this tree on every keystroke.\n const formValues = useRef<unknown>(defaultValues);\n const [errors, setErrors] = useState<string[]>([]);\n\n function readDraftValue(): DraftValue {\n if (draft.type === 'json') return parseJsonDraft(draft.value);\n return { ok: true, value: draft.type === 'form' ? formValues.current : draft.value };\n }\n\n function submitJsonDraft(text: string) {\n const json = parseJsonDraft(text);\n if (!json.ok) return setErrors([json.error]);\n const result = schema.safeParse(json.value);\n if (result.success) onSubmit(result.data);\n else setErrors(result.error.issues.map(issue => `${issue.path.join('.') || 'Input'}: ${issue.message}`));\n }\n\n function changeInputType(type: WorkflowInputType) {\n if (type === draft.type) return;\n setErrors([]);\n const current = readDraftValue();\n if (!current.ok) return setErrors([current.error]);\n if (type === 'json') {\n return setDraft({ type, value: JSON.stringify(current.value === undefined ? {} : current.value, null, 2) });\n }\n if (type === 'simple') {\n const processorDraft = parseProcessorDraft(current.value);\n if (processorDraft) return setDraft({ type, value: processorDraft });\n return setErrors([\n 'Simple input requires a messages array with text parts and a string phase. Correct the JSON first.',\n ]);\n }\n const formShapeError = getFormShapeError(schema, current.value);\n return formShapeError ? setErrors([formShapeError]) : setDraft({ type, value: current.value });\n }\n\n const defaultHeading = (\n <Txt as=\"span\" variant=\"subheading\" tone=\"ink\">\n Trigger a run\n </Txt>\n );\n const toggleSitsInLabelRow = !collapsible && !hideHeading;\n const toggleSitsAboveInput = collapsible || hideHeading || hideInputTypeLabel;\n const inputTypeToggle = (\n <WorkflowInputTypeToggle\n value={draft.type}\n onChange={changeInputType}\n disabled={isSubmitLoading}\n includeSimple={isProcessorWorkflow}\n compact={toggleSitsInLabelRow}\n />\n );\n\n const body = (\n <>\n {!hideInputTypeLabel && (\n <div className=\"flex justify-between gap-3 px-5 py-3\">\n <Txt as=\"p\" variant=\"caption\" tone=\"muted\">\n {inputTypeLabel}\n </Txt>\n {toggleSitsInLabelRow && <div className=\"shrink-0\">{inputTypeToggle}</div>}\n </div>\n )}\n\n <div className=\"px-5\">\n {toggleSitsAboveInput && <div className=\"pb-4\">{inputTypeToggle}</div>}\n\n <div\n className={cn('pb-4', {\n 'pointer-events-none opacity-50': isSubmitLoading,\n })}\n >\n {draft.type === 'json' ? (\n <WorkflowJsonInput\n value={draft.value}\n onChange={value => {\n setDraft({ type: 'json', value });\n setErrors([]);\n }}\n errors={errors}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={() => submitJsonDraft(draft.value)}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </WorkflowJsonInput>\n ) : draft.type === 'simple' && isProcessorWorkflow ? (\n <WorkflowProcessorInput\n schema={schema}\n value={draft.value}\n onChange={value => setDraft({ type: 'simple', value })}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={onSubmit}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </WorkflowProcessorInput>\n ) : (\n <WorkflowFormInput\n schema={schema}\n onValuesChange={value => {\n formValues.current = value;\n }}\n defaultValues={draft.value}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={onSubmit}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </WorkflowFormInput>\n )}\n </div>\n </div>\n </>\n );\n\n if (!collapsible) {\n return (\n <>\n {!hideHeading && <div className=\"border-b border-border/50 pb-3\">{headingSlot ?? defaultHeading}</div>}\n <div>{body}</div>\n </>\n );\n }\n\n return (\n <Collapsible defaultOpen>\n <CollapsibleTrigger className=\"flex w-full items-center gap-2 pb-3 text-left\">\n <ChevronRight className=\"size-4 shrink-0 text-muted-foreground\" />\n {headingSlot ?? defaultHeading}\n </CollapsibleTrigger>\n\n <CollapsibleContent keepMounted>{body}</CollapsibleContent>\n </Collapsible>\n );\n};\n\nconst WorkflowFormInput = ({\n schema,\n defaultValues,\n isSubmitLoading,\n submitButtonLabel,\n onSubmit,\n children,\n submitActions,\n leftActions,\n submitButtonIcon,\n submitButtonVariant,\n submitButtonFullWidth,\n onValuesChange,\n}: WorkflowInputDataProps & { onValuesChange: (value: unknown) => void }) => (\n <DynamicForm\n schema={schema}\n defaultValues={defaultValues}\n onValuesChange={onValuesChange}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={onSubmit}\n readOnly={isSubmitLoading}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </DynamicForm>\n);\n"],"names":["jsx","Icon","Play","createProcessorInput","parseProcessorDraft","inferFieldType","getBaseSchema","isPlainObject","collapsible","useState","useRef","Txt","WorkflowInputTypeToggle","jsxs","Fragment","cn","WorkflowJsonInput","WorkflowProcessorInput","Collapsible","CollapsibleTrigger","ChevronRight","CollapsibleContent","DynamicForm"],"mappings":"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"}
@@ -13,6 +13,7 @@ import '../../../lib/form/field-context.es.js';
13
13
  import { isPlainObject } from '../../../lib/form/utils.es.js';
14
14
  import '../../../Button-D43ghVKt.js';
15
15
  import 'date-fns';
16
+ import '../../../popover-Dg70UGyn.js';
16
17
  import { c as cn } from '../../../cn-65Adrsfj.js';
17
18
  import '@autoform/core';
18
19
  import '@autoform/react';
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-input-data.es.js","sources":["../../../../src/domains/workflows/workflow/workflow-input-data.tsx"],"sourcesContent":["import { ChevronRight, Play } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { useRef, useState } from 'react';\nimport type { ZodSchema } from 'zod';\n\nimport { createProcessorInput, parseProcessorDraft } from './input/processor-input';\nimport type { ProcessorDraft } from './input/processor-input';\nimport { WorkflowJsonInput } from './input/workflow-json-input';\nimport { WorkflowProcessorInput } from './input/workflow-processor-input';\nimport { WorkflowInputTypeToggle } from './workflow-input-type-toggle';\nimport type { WorkflowInputType } from './workflow-input-type-toggle';\nimport { Button } from '@/ds/components/Button';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/ds/components/Collapsible';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { DynamicForm } from '@/lib/form';\nimport { isPlainObject } from '@/lib/form/utils';\nimport { getBaseSchema } from '@/lib/form/zod-provider/compat';\nimport { inferFieldType } from '@/lib/form/zod-provider/field-type-inference';\nimport { cn } from '@/utils/cn';\n\nexport interface WorkflowInputDataProps {\n schema: ZodSchema;\n defaultValues?: unknown;\n isSubmitLoading: boolean;\n submitButtonLabel: string;\n onSubmit: (data: any) => void;\n children?: React.ReactNode;\n isProcessorWorkflow?: boolean;\n submitActions?: React.ReactNode;\n leftActions?: React.ReactNode;\n headingSlot?: ReactNode;\n collapsible?: boolean;\n submitButtonIcon?: ReactNode;\n submitButtonVariant?: React.ComponentProps<typeof Button>['variant'];\n submitButtonFullWidth?: boolean;\n hideInputTypeLabel?: boolean;\n inputTypeLabel?: string;\n hideHeading?: boolean;\n}\n\ntype InputDraft =\n | { type: 'json'; value: string }\n | { type: 'form'; value: unknown }\n | { type: 'simple'; value: ProcessorDraft };\n\ntype DraftValue = { ok: true; value: unknown } | { ok: false; error: string };\n\nconst defaultSubmitIcon = (\n <Icon>\n <Play />\n </Icon>\n);\n\nfunction createInitialDraft(defaultValues: unknown, isProcessorWorkflow: boolean | undefined): InputDraft {\n if (!isProcessorWorkflow) return { type: 'form', value: defaultValues };\n const input = defaultValues ?? createProcessorInput();\n const draft = parseProcessorDraft(input);\n return draft ? { type: 'simple', value: draft } : { type: 'json', value: JSON.stringify(input, null, 2) };\n}\n\nfunction parseJsonDraft(text: string): DraftValue {\n try {\n return { ok: true, value: JSON.parse(text) };\n } catch (error) {\n return { ok: false, error: error instanceof Error ? `Invalid JSON: ${error.message}` : 'Invalid JSON' };\n }\n}\n\nfunction getFormShapeError(schema: ZodSchema, value: unknown) {\n const fieldType = inferFieldType(getBaseSchema(schema));\n if (fieldType === 'object' && !isPlainObject(value))\n return 'Form input requires a JSON object. Correct the JSON first.';\n if (fieldType === 'array' && !Array.isArray(value))\n return 'Form input requires a JSON array. Correct the JSON first.';\n return undefined;\n}\n\nexport const WorkflowInputData = ({\n schema,\n defaultValues,\n isSubmitLoading,\n submitButtonLabel,\n onSubmit,\n children,\n isProcessorWorkflow,\n submitActions,\n leftActions,\n headingSlot,\n collapsible = true,\n submitButtonIcon = defaultSubmitIcon,\n submitButtonVariant = 'primary',\n submitButtonFullWidth,\n hideInputTypeLabel,\n inputTypeLabel = 'Run input',\n hideHeading,\n}: WorkflowInputDataProps) => {\n const [draft, setDraft] = useState(() => createInitialDraft(defaultValues, isProcessorWorkflow));\n // The Form view is uncontrolled: state here would only re-render this tree on every keystroke.\n const formValues = useRef<unknown>(defaultValues);\n const [errors, setErrors] = useState<string[]>([]);\n\n function readDraftValue(): DraftValue {\n if (draft.type === 'json') return parseJsonDraft(draft.value);\n return { ok: true, value: draft.type === 'form' ? formValues.current : draft.value };\n }\n\n function submitJsonDraft(text: string) {\n const json = parseJsonDraft(text);\n if (!json.ok) return setErrors([json.error]);\n const result = schema.safeParse(json.value);\n if (result.success) onSubmit(result.data);\n else setErrors(result.error.issues.map(issue => `${issue.path.join('.') || 'Input'}: ${issue.message}`));\n }\n\n function changeInputType(type: WorkflowInputType) {\n if (type === draft.type) return;\n setErrors([]);\n const current = readDraftValue();\n if (!current.ok) return setErrors([current.error]);\n if (type === 'json') {\n return setDraft({ type, value: JSON.stringify(current.value === undefined ? {} : current.value, null, 2) });\n }\n if (type === 'simple') {\n const processorDraft = parseProcessorDraft(current.value);\n if (processorDraft) return setDraft({ type, value: processorDraft });\n return setErrors([\n 'Simple input requires a messages array with text parts and a string phase. Correct the JSON first.',\n ]);\n }\n const formShapeError = getFormShapeError(schema, current.value);\n return formShapeError ? setErrors([formShapeError]) : setDraft({ type, value: current.value });\n }\n\n const defaultHeading = (\n <Txt as=\"span\" variant=\"subheading\" tone=\"ink\">\n Trigger a run\n </Txt>\n );\n const toggleSitsInLabelRow = !collapsible && !hideHeading;\n const toggleSitsAboveInput = collapsible || hideHeading || hideInputTypeLabel;\n const inputTypeToggle = (\n <WorkflowInputTypeToggle\n value={draft.type}\n onChange={changeInputType}\n disabled={isSubmitLoading}\n includeSimple={isProcessorWorkflow}\n compact={toggleSitsInLabelRow}\n />\n );\n\n const body = (\n <>\n {!hideInputTypeLabel && (\n <div className=\"flex justify-between gap-3 px-5 py-3\">\n <Txt as=\"p\" variant=\"caption\" tone=\"muted\">\n {inputTypeLabel}\n </Txt>\n {toggleSitsInLabelRow && <div className=\"shrink-0\">{inputTypeToggle}</div>}\n </div>\n )}\n\n <div className=\"px-5\">\n {toggleSitsAboveInput && <div className=\"pb-4\">{inputTypeToggle}</div>}\n\n <div\n className={cn('pb-4', {\n 'pointer-events-none opacity-50': isSubmitLoading,\n })}\n >\n {draft.type === 'json' ? (\n <WorkflowJsonInput\n value={draft.value}\n onChange={value => {\n setDraft({ type: 'json', value });\n setErrors([]);\n }}\n errors={errors}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={() => submitJsonDraft(draft.value)}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </WorkflowJsonInput>\n ) : draft.type === 'simple' && isProcessorWorkflow ? (\n <WorkflowProcessorInput\n schema={schema}\n value={draft.value}\n onChange={value => setDraft({ type: 'simple', value })}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={onSubmit}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </WorkflowProcessorInput>\n ) : (\n <WorkflowFormInput\n schema={schema}\n onValuesChange={value => {\n formValues.current = value;\n }}\n defaultValues={draft.value}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={onSubmit}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </WorkflowFormInput>\n )}\n </div>\n </div>\n </>\n );\n\n if (!collapsible) {\n return (\n <>\n {!hideHeading && <div className=\"border-b border-border/50 pb-3\">{headingSlot ?? defaultHeading}</div>}\n <div>{body}</div>\n </>\n );\n }\n\n return (\n <Collapsible defaultOpen>\n <CollapsibleTrigger className=\"flex w-full items-center gap-2 pb-3 text-left\">\n <ChevronRight className=\"size-4 shrink-0 text-muted-foreground\" />\n {headingSlot ?? defaultHeading}\n </CollapsibleTrigger>\n\n <CollapsibleContent keepMounted>{body}</CollapsibleContent>\n </Collapsible>\n );\n};\n\nconst WorkflowFormInput = ({\n schema,\n defaultValues,\n isSubmitLoading,\n submitButtonLabel,\n onSubmit,\n children,\n submitActions,\n leftActions,\n submitButtonIcon,\n submitButtonVariant,\n submitButtonFullWidth,\n onValuesChange,\n}: WorkflowInputDataProps & { onValuesChange: (value: unknown) => void }) => (\n <DynamicForm\n schema={schema}\n defaultValues={defaultValues}\n onValuesChange={onValuesChange}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={onSubmit}\n readOnly={isSubmitLoading}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </DynamicForm>\n);\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflow-input-data.es.js","sources":["../../../../src/domains/workflows/workflow/workflow-input-data.tsx"],"sourcesContent":["import { ChevronRight, Play } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { useRef, useState } from 'react';\nimport type { ZodSchema } from 'zod';\n\nimport { createProcessorInput, parseProcessorDraft } from './input/processor-input';\nimport type { ProcessorDraft } from './input/processor-input';\nimport { WorkflowJsonInput } from './input/workflow-json-input';\nimport { WorkflowProcessorInput } from './input/workflow-processor-input';\nimport { WorkflowInputTypeToggle } from './workflow-input-type-toggle';\nimport type { WorkflowInputType } from './workflow-input-type-toggle';\nimport { Button } from '@/ds/components/Button';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/ds/components/Collapsible';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { DynamicForm } from '@/lib/form';\nimport { isPlainObject } from '@/lib/form/utils';\nimport { getBaseSchema } from '@/lib/form/zod-provider/compat';\nimport { inferFieldType } from '@/lib/form/zod-provider/field-type-inference';\nimport { cn } from '@/utils/cn';\n\nexport interface WorkflowInputDataProps {\n schema: ZodSchema;\n defaultValues?: unknown;\n isSubmitLoading: boolean;\n submitButtonLabel: string;\n onSubmit: (data: any) => void;\n children?: React.ReactNode;\n isProcessorWorkflow?: boolean;\n submitActions?: React.ReactNode;\n leftActions?: React.ReactNode;\n headingSlot?: ReactNode;\n collapsible?: boolean;\n submitButtonIcon?: ReactNode;\n submitButtonVariant?: React.ComponentProps<typeof Button>['variant'];\n submitButtonFullWidth?: boolean;\n hideInputTypeLabel?: boolean;\n inputTypeLabel?: string;\n hideHeading?: boolean;\n}\n\ntype InputDraft =\n | { type: 'json'; value: string }\n | { type: 'form'; value: unknown }\n | { type: 'simple'; value: ProcessorDraft };\n\ntype DraftValue = { ok: true; value: unknown } | { ok: false; error: string };\n\nconst defaultSubmitIcon = (\n <Icon>\n <Play />\n </Icon>\n);\n\nfunction createInitialDraft(defaultValues: unknown, isProcessorWorkflow: boolean | undefined): InputDraft {\n if (!isProcessorWorkflow) return { type: 'form', value: defaultValues };\n const input = defaultValues ?? createProcessorInput();\n const draft = parseProcessorDraft(input);\n return draft ? { type: 'simple', value: draft } : { type: 'json', value: JSON.stringify(input, null, 2) };\n}\n\nfunction parseJsonDraft(text: string): DraftValue {\n try {\n return { ok: true, value: JSON.parse(text) };\n } catch (error) {\n return { ok: false, error: error instanceof Error ? `Invalid JSON: ${error.message}` : 'Invalid JSON' };\n }\n}\n\nfunction getFormShapeError(schema: ZodSchema, value: unknown) {\n const fieldType = inferFieldType(getBaseSchema(schema));\n if (fieldType === 'object' && !isPlainObject(value))\n return 'Form input requires a JSON object. Correct the JSON first.';\n if (fieldType === 'array' && !Array.isArray(value))\n return 'Form input requires a JSON array. Correct the JSON first.';\n return undefined;\n}\n\nexport const WorkflowInputData = ({\n schema,\n defaultValues,\n isSubmitLoading,\n submitButtonLabel,\n onSubmit,\n children,\n isProcessorWorkflow,\n submitActions,\n leftActions,\n headingSlot,\n collapsible = true,\n submitButtonIcon = defaultSubmitIcon,\n submitButtonVariant = 'primary',\n submitButtonFullWidth,\n hideInputTypeLabel,\n inputTypeLabel = 'Run input',\n hideHeading,\n}: WorkflowInputDataProps) => {\n const [draft, setDraft] = useState(() => createInitialDraft(defaultValues, isProcessorWorkflow));\n // The Form view is uncontrolled: state here would only re-render this tree on every keystroke.\n const formValues = useRef<unknown>(defaultValues);\n const [errors, setErrors] = useState<string[]>([]);\n\n function readDraftValue(): DraftValue {\n if (draft.type === 'json') return parseJsonDraft(draft.value);\n return { ok: true, value: draft.type === 'form' ? formValues.current : draft.value };\n }\n\n function submitJsonDraft(text: string) {\n const json = parseJsonDraft(text);\n if (!json.ok) return setErrors([json.error]);\n const result = schema.safeParse(json.value);\n if (result.success) onSubmit(result.data);\n else setErrors(result.error.issues.map(issue => `${issue.path.join('.') || 'Input'}: ${issue.message}`));\n }\n\n function changeInputType(type: WorkflowInputType) {\n if (type === draft.type) return;\n setErrors([]);\n const current = readDraftValue();\n if (!current.ok) return setErrors([current.error]);\n if (type === 'json') {\n return setDraft({ type, value: JSON.stringify(current.value === undefined ? {} : current.value, null, 2) });\n }\n if (type === 'simple') {\n const processorDraft = parseProcessorDraft(current.value);\n if (processorDraft) return setDraft({ type, value: processorDraft });\n return setErrors([\n 'Simple input requires a messages array with text parts and a string phase. Correct the JSON first.',\n ]);\n }\n const formShapeError = getFormShapeError(schema, current.value);\n return formShapeError ? setErrors([formShapeError]) : setDraft({ type, value: current.value });\n }\n\n const defaultHeading = (\n <Txt as=\"span\" variant=\"subheading\" tone=\"ink\">\n Trigger a run\n </Txt>\n );\n const toggleSitsInLabelRow = !collapsible && !hideHeading;\n const toggleSitsAboveInput = collapsible || hideHeading || hideInputTypeLabel;\n const inputTypeToggle = (\n <WorkflowInputTypeToggle\n value={draft.type}\n onChange={changeInputType}\n disabled={isSubmitLoading}\n includeSimple={isProcessorWorkflow}\n compact={toggleSitsInLabelRow}\n />\n );\n\n const body = (\n <>\n {!hideInputTypeLabel && (\n <div className=\"flex justify-between gap-3 px-5 py-3\">\n <Txt as=\"p\" variant=\"caption\" tone=\"muted\">\n {inputTypeLabel}\n </Txt>\n {toggleSitsInLabelRow && <div className=\"shrink-0\">{inputTypeToggle}</div>}\n </div>\n )}\n\n <div className=\"px-5\">\n {toggleSitsAboveInput && <div className=\"pb-4\">{inputTypeToggle}</div>}\n\n <div\n className={cn('pb-4', {\n 'pointer-events-none opacity-50': isSubmitLoading,\n })}\n >\n {draft.type === 'json' ? (\n <WorkflowJsonInput\n value={draft.value}\n onChange={value => {\n setDraft({ type: 'json', value });\n setErrors([]);\n }}\n errors={errors}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={() => submitJsonDraft(draft.value)}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </WorkflowJsonInput>\n ) : draft.type === 'simple' && isProcessorWorkflow ? (\n <WorkflowProcessorInput\n schema={schema}\n value={draft.value}\n onChange={value => setDraft({ type: 'simple', value })}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={onSubmit}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </WorkflowProcessorInput>\n ) : (\n <WorkflowFormInput\n schema={schema}\n onValuesChange={value => {\n formValues.current = value;\n }}\n defaultValues={draft.value}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={onSubmit}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </WorkflowFormInput>\n )}\n </div>\n </div>\n </>\n );\n\n if (!collapsible) {\n return (\n <>\n {!hideHeading && <div className=\"border-b border-border/50 pb-3\">{headingSlot ?? defaultHeading}</div>}\n <div>{body}</div>\n </>\n );\n }\n\n return (\n <Collapsible defaultOpen>\n <CollapsibleTrigger className=\"flex w-full items-center gap-2 pb-3 text-left\">\n <ChevronRight className=\"size-4 shrink-0 text-muted-foreground\" />\n {headingSlot ?? defaultHeading}\n </CollapsibleTrigger>\n\n <CollapsibleContent keepMounted>{body}</CollapsibleContent>\n </Collapsible>\n );\n};\n\nconst WorkflowFormInput = ({\n schema,\n defaultValues,\n isSubmitLoading,\n submitButtonLabel,\n onSubmit,\n children,\n submitActions,\n leftActions,\n submitButtonIcon,\n submitButtonVariant,\n submitButtonFullWidth,\n onValuesChange,\n}: WorkflowInputDataProps & { onValuesChange: (value: unknown) => void }) => (\n <DynamicForm\n schema={schema}\n defaultValues={defaultValues}\n onValuesChange={onValuesChange}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={onSubmit}\n readOnly={isSubmitLoading}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </DynamicForm>\n);\n"],"names":[],"mappings":"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"}
@@ -6,8 +6,6 @@ const jsxRuntime = require('react/jsx-runtime');
6
6
  const ee_signals_components_entityIndexModel = require('./entity-index-model.cjs.js');
7
7
  const Badge = require('../../../Badge-D3EctKQo.cjs');
8
8
  const dataList = require('../../../data-list-Y42KyuI1.cjs');
9
- require('react');
10
- require('../../../keyboard/keyboard-shortcuts-context.cjs.js');
11
9
 
12
10
  const columns = "minmax(12rem,1.5fr) minmax(7rem,0.6fr) minmax(8rem,0.7fr) minmax(8rem,0.7fr) minmax(12rem,1fr)";
13
11
  function Status({ entity }) {
@@ -1 +1 @@
1
- {"version":3,"file":"entity-index-list.cjs.js","sources":["../../../../src/ee/signals/components/entity-index-list.tsx"],"sourcesContent":["import type { ThemeLearningEntity } from '@mastra/client-js';\n\nimport { entityIndexMetadata, entityStatusLabel } from './entity-index-model';\nimport { Badge } from '@/ds/components/Badge';\nimport { DataList } from '@/ds/components/DataList';\nimport type { LinkComponent } from '@/ds/types/link-component';\n\nconst columns = 'minmax(12rem,1.5fr) minmax(7rem,0.6fr) minmax(8rem,0.7fr) minmax(8rem,0.7fr) minmax(12rem,1fr)';\n\nexport interface EntityIndexListProps {\n entities: readonly ThemeLearningEntity[];\n hasSearch: boolean;\n getEntityHref: (entity: ThemeLearningEntity) => string;\n LinkComponent: LinkComponent;\n}\n\nfunction Status({ entity }: { entity: ThemeLearningEntity }) {\n const label = entityStatusLabel(entity.status);\n const variant = entity.status === 'ready' ? 'success' : entity.status === 'processing' ? 'info' : 'neutral';\n return (\n <Badge variant={variant} size=\"sm\" indicator={entity.status === undefined ? undefined : 'dot'}>\n {label}\n </Badge>\n );\n}\n\nexport function EntityIndexList({ entities, hasSearch, getEntityHref, LinkComponent }: EntityIndexListProps) {\n return (\n <section aria-label=\"Trace Intelligence entities\" className=\"min-h-0\">\n <DataList columns={columns} fit=\"container\">\n <DataList.Top>\n <DataList.TopCell>Entity</DataList.TopCell>\n <DataList.TopCell>Traces</DataList.TopCell>\n <DataList.TopCell>Signals set</DataList.TopCell>\n <DataList.TopCell>Status</DataList.TopCell>\n <DataList.TopCell>Updated</DataList.TopCell>\n </DataList.Top>\n {entities.length === 0 && hasSearch ? <DataList.NoMatch message=\"No entities match your search\" /> : null}\n {entities.map(entity => {\n const metadata = entityIndexMetadata(entity);\n return (\n <DataList.RowLink\n key={`${entity.entityType}:${entity.entityId}`}\n to={getEntityHref(entity)}\n LinkComponent={LinkComponent}\n className=\"min-w-0\"\n >\n <DataList.Cell className=\"min-w-0 overflow-visible text-left\">\n <span className=\"sr-only\">Open entity {entity.entityId}</span>\n <span aria-hidden=\"true\" className=\"block overflow-clip text-ellipsis whitespace-nowrap\">\n {entity.entityId}\n </span>\n </DataList.Cell>\n <DataList.NumberCell>{metadata.traceCount}</DataList.NumberCell>\n <DataList.Cell>{metadata.signalsSet}</DataList.Cell>\n <DataList.Cell>\n <Status entity={entity} />\n </DataList.Cell>\n <DataList.Cell title={entity.updatedAt}>{metadata.updatedAt}</DataList.Cell>\n </DataList.RowLink>\n );\n })}\n </DataList>\n </section>\n );\n}\n"],"names":["entityStatusLabel","jsx","Badge","jsxs","DataList","entityIndexMetadata"],"mappings":"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"}
1
+ {"version":3,"file":"entity-index-list.cjs.js","sources":["../../../../src/ee/signals/components/entity-index-list.tsx"],"sourcesContent":["import type { ThemeLearningEntity } from '@mastra/client-js';\n\nimport { entityIndexMetadata, entityStatusLabel } from './entity-index-model';\nimport { Badge } from '@/ds/components/Badge';\nimport { DataList } from '@/ds/components/DataList';\nimport type { LinkComponent } from '@/ds/types/link-component';\n\nconst columns = 'minmax(12rem,1.5fr) minmax(7rem,0.6fr) minmax(8rem,0.7fr) minmax(8rem,0.7fr) minmax(12rem,1fr)';\n\nexport interface EntityIndexListProps {\n entities: readonly ThemeLearningEntity[];\n hasSearch: boolean;\n getEntityHref: (entity: ThemeLearningEntity) => string;\n LinkComponent: LinkComponent;\n}\n\nfunction Status({ entity }: { entity: ThemeLearningEntity }) {\n const label = entityStatusLabel(entity.status);\n const variant = entity.status === 'ready' ? 'success' : entity.status === 'processing' ? 'info' : 'neutral';\n return (\n <Badge variant={variant} size=\"sm\" indicator={entity.status === undefined ? undefined : 'dot'}>\n {label}\n </Badge>\n );\n}\n\nexport function EntityIndexList({ entities, hasSearch, getEntityHref, LinkComponent }: EntityIndexListProps) {\n return (\n <section aria-label=\"Trace Intelligence entities\" className=\"min-h-0\">\n <DataList columns={columns} fit=\"container\">\n <DataList.Top>\n <DataList.TopCell>Entity</DataList.TopCell>\n <DataList.TopCell>Traces</DataList.TopCell>\n <DataList.TopCell>Signals set</DataList.TopCell>\n <DataList.TopCell>Status</DataList.TopCell>\n <DataList.TopCell>Updated</DataList.TopCell>\n </DataList.Top>\n {entities.length === 0 && hasSearch ? <DataList.NoMatch message=\"No entities match your search\" /> : null}\n {entities.map(entity => {\n const metadata = entityIndexMetadata(entity);\n return (\n <DataList.RowLink\n key={`${entity.entityType}:${entity.entityId}`}\n to={getEntityHref(entity)}\n LinkComponent={LinkComponent}\n className=\"min-w-0\"\n >\n <DataList.Cell className=\"min-w-0 overflow-visible text-left\">\n <span className=\"sr-only\">Open entity {entity.entityId}</span>\n <span aria-hidden=\"true\" className=\"block overflow-clip text-ellipsis whitespace-nowrap\">\n {entity.entityId}\n </span>\n </DataList.Cell>\n <DataList.NumberCell>{metadata.traceCount}</DataList.NumberCell>\n <DataList.Cell>{metadata.signalsSet}</DataList.Cell>\n <DataList.Cell>\n <Status entity={entity} />\n </DataList.Cell>\n <DataList.Cell title={entity.updatedAt}>{metadata.updatedAt}</DataList.Cell>\n </DataList.RowLink>\n );\n })}\n </DataList>\n </section>\n );\n}\n"],"names":["entityStatusLabel","jsx","Badge","jsxs","DataList","entityIndexMetadata"],"mappings":"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"}
@@ -2,8 +2,6 @@ import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { entityIndexMetadata, entityStatusLabel } from './entity-index-model.es.js';
3
3
  import { B as Badge } from '../../../Badge-DmOqFpXW.js';
4
4
  import { D as DataList } from '../../../data-list-CyeD_u-6.js';
5
- import 'react';
6
- import '../../../keyboard/keyboard-shortcuts-context.es.js';
7
5
 
8
6
  const columns = "minmax(12rem,1.5fr) minmax(7rem,0.6fr) minmax(8rem,0.7fr) minmax(8rem,0.7fr) minmax(12rem,1fr)";
9
7
  function Status({ entity }) {
@@ -1 +1 @@
1
- {"version":3,"file":"entity-index-list.es.js","sources":["../../../../src/ee/signals/components/entity-index-list.tsx"],"sourcesContent":["import type { ThemeLearningEntity } from '@mastra/client-js';\n\nimport { entityIndexMetadata, entityStatusLabel } from './entity-index-model';\nimport { Badge } from '@/ds/components/Badge';\nimport { DataList } from '@/ds/components/DataList';\nimport type { LinkComponent } from '@/ds/types/link-component';\n\nconst columns = 'minmax(12rem,1.5fr) minmax(7rem,0.6fr) minmax(8rem,0.7fr) minmax(8rem,0.7fr) minmax(12rem,1fr)';\n\nexport interface EntityIndexListProps {\n entities: readonly ThemeLearningEntity[];\n hasSearch: boolean;\n getEntityHref: (entity: ThemeLearningEntity) => string;\n LinkComponent: LinkComponent;\n}\n\nfunction Status({ entity }: { entity: ThemeLearningEntity }) {\n const label = entityStatusLabel(entity.status);\n const variant = entity.status === 'ready' ? 'success' : entity.status === 'processing' ? 'info' : 'neutral';\n return (\n <Badge variant={variant} size=\"sm\" indicator={entity.status === undefined ? undefined : 'dot'}>\n {label}\n </Badge>\n );\n}\n\nexport function EntityIndexList({ entities, hasSearch, getEntityHref, LinkComponent }: EntityIndexListProps) {\n return (\n <section aria-label=\"Trace Intelligence entities\" className=\"min-h-0\">\n <DataList columns={columns} fit=\"container\">\n <DataList.Top>\n <DataList.TopCell>Entity</DataList.TopCell>\n <DataList.TopCell>Traces</DataList.TopCell>\n <DataList.TopCell>Signals set</DataList.TopCell>\n <DataList.TopCell>Status</DataList.TopCell>\n <DataList.TopCell>Updated</DataList.TopCell>\n </DataList.Top>\n {entities.length === 0 && hasSearch ? <DataList.NoMatch message=\"No entities match your search\" /> : null}\n {entities.map(entity => {\n const metadata = entityIndexMetadata(entity);\n return (\n <DataList.RowLink\n key={`${entity.entityType}:${entity.entityId}`}\n to={getEntityHref(entity)}\n LinkComponent={LinkComponent}\n className=\"min-w-0\"\n >\n <DataList.Cell className=\"min-w-0 overflow-visible text-left\">\n <span className=\"sr-only\">Open entity {entity.entityId}</span>\n <span aria-hidden=\"true\" className=\"block overflow-clip text-ellipsis whitespace-nowrap\">\n {entity.entityId}\n </span>\n </DataList.Cell>\n <DataList.NumberCell>{metadata.traceCount}</DataList.NumberCell>\n <DataList.Cell>{metadata.signalsSet}</DataList.Cell>\n <DataList.Cell>\n <Status entity={entity} />\n </DataList.Cell>\n <DataList.Cell title={entity.updatedAt}>{metadata.updatedAt}</DataList.Cell>\n </DataList.RowLink>\n );\n })}\n </DataList>\n </section>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"entity-index-list.es.js","sources":["../../../../src/ee/signals/components/entity-index-list.tsx"],"sourcesContent":["import type { ThemeLearningEntity } from '@mastra/client-js';\n\nimport { entityIndexMetadata, entityStatusLabel } from './entity-index-model';\nimport { Badge } from '@/ds/components/Badge';\nimport { DataList } from '@/ds/components/DataList';\nimport type { LinkComponent } from '@/ds/types/link-component';\n\nconst columns = 'minmax(12rem,1.5fr) minmax(7rem,0.6fr) minmax(8rem,0.7fr) minmax(8rem,0.7fr) minmax(12rem,1fr)';\n\nexport interface EntityIndexListProps {\n entities: readonly ThemeLearningEntity[];\n hasSearch: boolean;\n getEntityHref: (entity: ThemeLearningEntity) => string;\n LinkComponent: LinkComponent;\n}\n\nfunction Status({ entity }: { entity: ThemeLearningEntity }) {\n const label = entityStatusLabel(entity.status);\n const variant = entity.status === 'ready' ? 'success' : entity.status === 'processing' ? 'info' : 'neutral';\n return (\n <Badge variant={variant} size=\"sm\" indicator={entity.status === undefined ? undefined : 'dot'}>\n {label}\n </Badge>\n );\n}\n\nexport function EntityIndexList({ entities, hasSearch, getEntityHref, LinkComponent }: EntityIndexListProps) {\n return (\n <section aria-label=\"Trace Intelligence entities\" className=\"min-h-0\">\n <DataList columns={columns} fit=\"container\">\n <DataList.Top>\n <DataList.TopCell>Entity</DataList.TopCell>\n <DataList.TopCell>Traces</DataList.TopCell>\n <DataList.TopCell>Signals set</DataList.TopCell>\n <DataList.TopCell>Status</DataList.TopCell>\n <DataList.TopCell>Updated</DataList.TopCell>\n </DataList.Top>\n {entities.length === 0 && hasSearch ? <DataList.NoMatch message=\"No entities match your search\" /> : null}\n {entities.map(entity => {\n const metadata = entityIndexMetadata(entity);\n return (\n <DataList.RowLink\n key={`${entity.entityType}:${entity.entityId}`}\n to={getEntityHref(entity)}\n LinkComponent={LinkComponent}\n className=\"min-w-0\"\n >\n <DataList.Cell className=\"min-w-0 overflow-visible text-left\">\n <span className=\"sr-only\">Open entity {entity.entityId}</span>\n <span aria-hidden=\"true\" className=\"block overflow-clip text-ellipsis whitespace-nowrap\">\n {entity.entityId}\n </span>\n </DataList.Cell>\n <DataList.NumberCell>{metadata.traceCount}</DataList.NumberCell>\n <DataList.Cell>{metadata.signalsSet}</DataList.Cell>\n <DataList.Cell>\n <Status entity={entity} />\n </DataList.Cell>\n <DataList.Cell title={entity.updatedAt}>{metadata.updatedAt}</DataList.Cell>\n </DataList.RowLink>\n );\n })}\n </DataList>\n </section>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -18,7 +18,6 @@ const domains_auth_components_sessionExpired = require('../../../domains/auth/co
18
18
  const Button = require('../../../Button-CXhSUBxN.cjs');
19
19
  const buttonsGroup = require('../../../buttons-group-CoZP3lJt.cjs');
20
20
  const dataListSkeleton = require('../../../data-list-skeleton-BXPfL0s7.cjs');
21
- require('../../../keyboard/keyboard-shortcuts-context.cjs.js');
22
21
  const EmptyState = require('../../../EmptyState-CuoMGNP0.cjs');
23
22
  const listSearch = require('../../../list-search-BzAIj0DB.cjs');
24
23
  const select = require('../../../select-DBY9LQFQ.cjs');
@@ -1 +1 @@
1
- {"version":3,"file":"trace-intelligence-entity-index.cjs.js","sources":["../../../../src/ee/signals/components/trace-intelligence-entity-index.tsx"],"sourcesContent":["import type { SignalCatalogEntry, ThemeLearningEntity } from '@mastra/client-js';\nimport { Columns2, List } from 'lucide-react';\nimport { useState, type ReactNode } from 'react';\n\nimport { useThemeEntities } from '../hooks';\nimport { TraceSignalSettingsButton, TraceSignalSettingsPanel } from '../settings/trace-signal-settings';\nimport { TraceIntelligenceExplainer } from '../trace-intelligence-explainer';\nimport { useTraceIntelligence } from '../use-trace-intelligence';\nimport { EntityIndexCompactGrid } from './entity-index-compact-grid';\nimport { EntityIndexList } from './entity-index-list';\nimport { filterAndSortEntities } from './entity-index-model';\nimport type { TraceIntelligenceEntitySort, TraceIntelligenceEntityView } from './entity-index-model';\nimport { PermissionDenied } from '@/domains/auth/components/permission-denied';\nimport { SessionExpired } from '@/domains/auth/components/session-expired';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { DataListSkeleton } from '@/ds/components/DataList';\nimport { EmptyState } from '@/ds/components/EmptyState';\nimport { ListSearch } from '@/ds/components/ListSearch';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/ds/components/Select';\nimport { is401UnauthorizedError, is403ForbiddenError } from '@/utils/errors';\n\nexport type { TraceIntelligenceEntitySort, TraceIntelligenceEntityView } from './entity-index-model';\n\nconst listColumns = 'minmax(12rem,1.5fr) minmax(7rem,0.6fr) minmax(8rem,0.7fr) minmax(8rem,0.7fr) minmax(12rem,1fr)';\n\nexport interface TraceIntelligenceEntityIndexProps {\n entityType: string;\n search: string;\n sort: TraceIntelligenceEntitySort;\n view: TraceIntelligenceEntityView;\n onSearchChange: (search: string) => void;\n onSortChange: (sort: TraceIntelligenceEntitySort) => void;\n onViewChange: (view: TraceIntelligenceEntityView) => void;\n getEntityHref: (entity: ThemeLearningEntity) => string;\n headerAction?: ReactNode;\n}\n\nfunction EntityIndexError({ error }: { error: Error }) {\n if (is401UnauthorizedError(error)) {\n return (\n <div className=\"flex h-full items-center justify-center\">\n <SessionExpired />\n </div>\n );\n }\n if (is403ForbiddenError(error)) {\n return (\n <div className=\"flex h-full items-center justify-center\">\n <PermissionDenied resource=\"Trace Intelligence\" />\n </div>\n );\n }\n return (\n <div className=\"flex h-full items-center justify-center\">\n <EmptyState tone=\"error\" titleSlot=\"Failed to load Trace Intelligence\" descriptionSlot={error.message} />\n </div>\n );\n}\n\nfunction EntityIndexControls({\n search,\n sort,\n view,\n onSearchChange,\n onSortChange,\n onViewChange,\n headerAction,\n signalCatalog,\n}: Pick<\n TraceIntelligenceEntityIndexProps,\n 'search' | 'sort' | 'view' | 'onSearchChange' | 'onSortChange' | 'onViewChange' | 'headerAction'\n> & { signalCatalog: readonly SignalCatalogEntry[] }) {\n return (\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center\">\n <div className=\"max-w-120 flex-1\">\n <ListSearch\n value={search}\n onSearch={onSearchChange}\n label=\"Filter entities\"\n placeholder=\"Filter by entity identifier\"\n />\n </div>\n <div className=\"flex items-center justify-between gap-2 sm:ml-auto sm:justify-end\">\n <TraceIntelligenceExplainer signalCatalog={signalCatalog} />\n <Select<TraceIntelligenceEntitySort> value={sort} onValueChange={onSortChange}>\n <SelectTrigger aria-label=\"Sort entities\" size=\"md\" variant=\"ghost\" className=\"w-auto\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent align=\"end\">\n <SelectItem value=\"default\">Default order</SelectItem>\n <SelectItem value=\"entity-asc\">Entity: A–Z</SelectItem>\n <SelectItem value=\"entity-desc\">Entity: Z–A</SelectItem>\n </SelectContent>\n </Select>\n {headerAction}\n <ButtonsGroup aria-label=\"Entities view\">\n <Button\n type=\"button\"\n variant={view === 'list' ? 'primary' : 'default'}\n size=\"icon-md\"\n tooltip=\"List view\"\n aria-pressed={view === 'list'}\n onClick={() => onViewChange('list')}\n >\n <List />\n </Button>\n <Button\n type=\"button\"\n variant={view === 'compact' ? 'primary' : 'default'}\n size=\"icon-md\"\n tooltip=\"Compact view\"\n aria-pressed={view === 'compact'}\n onClick={() => onViewChange('compact')}\n >\n <Columns2 />\n </Button>\n </ButtonsGroup>\n </div>\n </div>\n );\n}\n\nexport function TraceIntelligenceEntityIndex({\n entityType,\n search,\n sort,\n view,\n onSearchChange,\n onSortChange,\n onViewChange,\n getEntityHref,\n headerAction,\n}: TraceIntelligenceEntityIndexProps) {\n const entitiesQuery = useThemeEntities(entityType);\n const { LinkComponent, signalCatalog: contextSignalCatalog, signalManagement } = useTraceIntelligence();\n const [settingsOpen, setSettingsOpen] = useState(false);\n\n if (entitiesQuery.error) return <EntityIndexError error={entitiesQuery.error} />;\n\n const sourceEntities = entitiesQuery.data?.entities ?? [];\n const signalCatalog =\n sourceEntities.find(entity => entity.signalCatalog?.length)?.signalCatalog ?? contextSignalCatalog;\n const entities = filterAndSortEntities(sourceEntities, search, sort);\n const hasSearch = search.trim().length > 0;\n let body = (\n <EntityIndexList\n entities={entities}\n hasSearch={hasSearch}\n getEntityHref={getEntityHref}\n LinkComponent={LinkComponent}\n />\n );\n if (entitiesQuery.isPending) {\n body = (\n <div role=\"status\" aria-label=\"Loading Trace Intelligence entities\">\n <DataListSkeleton columns={listColumns} />\n </div>\n );\n } else if (entitiesQuery.data.entities.length === 0 && !hasSearch) {\n body = (\n <EmptyState\n titleSlot=\"No Trace Intelligence entities yet\"\n descriptionSlot=\"Entities appear after Trace Intelligence begins collecting generated signal data.\"\n />\n );\n } else if (view === 'compact') {\n body = (\n <EntityIndexCompactGrid\n entities={entities}\n hasSearch={hasSearch}\n getEntityHref={getEntityHref}\n LinkComponent={LinkComponent}\n />\n );\n }\n\n return (\n <div className=\"mx-auto grid size-full min-h-0 max-w-7xl grid-rows-[auto_minmax(0,1fr)]\">\n <div className=\"pb-3\">\n <EntityIndexControls\n search={search}\n sort={sort}\n view={view}\n onSearchChange={onSearchChange}\n onSortChange={onSortChange}\n onViewChange={onViewChange}\n signalCatalog={signalCatalog}\n headerAction={\n headerAction || signalManagement ? (\n <>\n {headerAction}\n {signalManagement ? (\n <TraceSignalSettingsButton open={settingsOpen} onClick={() => setSettingsOpen(open => !open)} />\n ) : null}\n </>\n ) : undefined\n }\n />\n </div>\n <div\n className={\n settingsOpen\n ? 'grid max-h-full min-h-0 grid-cols-1 items-start gap-4 lg:grid-cols-[1fr_1fr]'\n : 'grid min-h-0 grid-cols-1'\n }\n >\n <div className=\"min-h-0 min-w-0\">{body}</div>\n {settingsOpen ? <TraceSignalSettingsPanel onClose={() => setSettingsOpen(false)} /> : null}\n </div>\n </div>\n );\n}\n"],"names":["is401UnauthorizedError","jsx","SessionExpired","is403ForbiddenError","PermissionDenied","EmptyState","jsxs","ListSearch","TraceIntelligenceExplainer","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","ButtonsGroup","Button","List","Columns2","useThemeEntities","useTraceIntelligence","useState","filterAndSortEntities","EntityIndexList","DataListSkeleton","EntityIndexCompactGrid","Fragment","TraceSignalSettingsButton","TraceSignalSettingsPanel"],"mappings":"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"}
1
+ {"version":3,"file":"trace-intelligence-entity-index.cjs.js","sources":["../../../../src/ee/signals/components/trace-intelligence-entity-index.tsx"],"sourcesContent":["import type { SignalCatalogEntry, ThemeLearningEntity } from '@mastra/client-js';\nimport { Columns2, List } from 'lucide-react';\nimport { useState, type ReactNode } from 'react';\n\nimport { useThemeEntities } from '../hooks';\nimport { TraceSignalSettingsButton, TraceSignalSettingsPanel } from '../settings/trace-signal-settings';\nimport { TraceIntelligenceExplainer } from '../trace-intelligence-explainer';\nimport { useTraceIntelligence } from '../use-trace-intelligence';\nimport { EntityIndexCompactGrid } from './entity-index-compact-grid';\nimport { EntityIndexList } from './entity-index-list';\nimport { filterAndSortEntities } from './entity-index-model';\nimport type { TraceIntelligenceEntitySort, TraceIntelligenceEntityView } from './entity-index-model';\nimport { PermissionDenied } from '@/domains/auth/components/permission-denied';\nimport { SessionExpired } from '@/domains/auth/components/session-expired';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { DataListSkeleton } from '@/ds/components/DataList';\nimport { EmptyState } from '@/ds/components/EmptyState';\nimport { ListSearch } from '@/ds/components/ListSearch';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/ds/components/Select';\nimport { is401UnauthorizedError, is403ForbiddenError } from '@/utils/errors';\n\nexport type { TraceIntelligenceEntitySort, TraceIntelligenceEntityView } from './entity-index-model';\n\nconst listColumns = 'minmax(12rem,1.5fr) minmax(7rem,0.6fr) minmax(8rem,0.7fr) minmax(8rem,0.7fr) minmax(12rem,1fr)';\n\nexport interface TraceIntelligenceEntityIndexProps {\n entityType: string;\n search: string;\n sort: TraceIntelligenceEntitySort;\n view: TraceIntelligenceEntityView;\n onSearchChange: (search: string) => void;\n onSortChange: (sort: TraceIntelligenceEntitySort) => void;\n onViewChange: (view: TraceIntelligenceEntityView) => void;\n getEntityHref: (entity: ThemeLearningEntity) => string;\n headerAction?: ReactNode;\n}\n\nfunction EntityIndexError({ error }: { error: Error }) {\n if (is401UnauthorizedError(error)) {\n return (\n <div className=\"flex h-full items-center justify-center\">\n <SessionExpired />\n </div>\n );\n }\n if (is403ForbiddenError(error)) {\n return (\n <div className=\"flex h-full items-center justify-center\">\n <PermissionDenied resource=\"Trace Intelligence\" />\n </div>\n );\n }\n return (\n <div className=\"flex h-full items-center justify-center\">\n <EmptyState tone=\"error\" titleSlot=\"Failed to load Trace Intelligence\" descriptionSlot={error.message} />\n </div>\n );\n}\n\nfunction EntityIndexControls({\n search,\n sort,\n view,\n onSearchChange,\n onSortChange,\n onViewChange,\n headerAction,\n signalCatalog,\n}: Pick<\n TraceIntelligenceEntityIndexProps,\n 'search' | 'sort' | 'view' | 'onSearchChange' | 'onSortChange' | 'onViewChange' | 'headerAction'\n> & { signalCatalog: readonly SignalCatalogEntry[] }) {\n return (\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center\">\n <div className=\"max-w-120 flex-1\">\n <ListSearch\n value={search}\n onSearch={onSearchChange}\n label=\"Filter entities\"\n placeholder=\"Filter by entity identifier\"\n />\n </div>\n <div className=\"flex items-center justify-between gap-2 sm:ml-auto sm:justify-end\">\n <TraceIntelligenceExplainer signalCatalog={signalCatalog} />\n <Select<TraceIntelligenceEntitySort> value={sort} onValueChange={onSortChange}>\n <SelectTrigger aria-label=\"Sort entities\" size=\"md\" variant=\"ghost\" className=\"w-auto\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent align=\"end\">\n <SelectItem value=\"default\">Default order</SelectItem>\n <SelectItem value=\"entity-asc\">Entity: A–Z</SelectItem>\n <SelectItem value=\"entity-desc\">Entity: Z–A</SelectItem>\n </SelectContent>\n </Select>\n {headerAction}\n <ButtonsGroup aria-label=\"Entities view\">\n <Button\n type=\"button\"\n variant={view === 'list' ? 'primary' : 'default'}\n size=\"icon-md\"\n tooltip=\"List view\"\n aria-pressed={view === 'list'}\n onClick={() => onViewChange('list')}\n >\n <List />\n </Button>\n <Button\n type=\"button\"\n variant={view === 'compact' ? 'primary' : 'default'}\n size=\"icon-md\"\n tooltip=\"Compact view\"\n aria-pressed={view === 'compact'}\n onClick={() => onViewChange('compact')}\n >\n <Columns2 />\n </Button>\n </ButtonsGroup>\n </div>\n </div>\n );\n}\n\nexport function TraceIntelligenceEntityIndex({\n entityType,\n search,\n sort,\n view,\n onSearchChange,\n onSortChange,\n onViewChange,\n getEntityHref,\n headerAction,\n}: TraceIntelligenceEntityIndexProps) {\n const entitiesQuery = useThemeEntities(entityType);\n const { LinkComponent, signalCatalog: contextSignalCatalog, signalManagement } = useTraceIntelligence();\n const [settingsOpen, setSettingsOpen] = useState(false);\n\n if (entitiesQuery.error) return <EntityIndexError error={entitiesQuery.error} />;\n\n const sourceEntities = entitiesQuery.data?.entities ?? [];\n const signalCatalog =\n sourceEntities.find(entity => entity.signalCatalog?.length)?.signalCatalog ?? contextSignalCatalog;\n const entities = filterAndSortEntities(sourceEntities, search, sort);\n const hasSearch = search.trim().length > 0;\n let body = (\n <EntityIndexList\n entities={entities}\n hasSearch={hasSearch}\n getEntityHref={getEntityHref}\n LinkComponent={LinkComponent}\n />\n );\n if (entitiesQuery.isPending) {\n body = (\n <div role=\"status\" aria-label=\"Loading Trace Intelligence entities\">\n <DataListSkeleton columns={listColumns} />\n </div>\n );\n } else if (entitiesQuery.data.entities.length === 0 && !hasSearch) {\n body = (\n <EmptyState\n titleSlot=\"No Trace Intelligence entities yet\"\n descriptionSlot=\"Entities appear after Trace Intelligence begins collecting generated signal data.\"\n />\n );\n } else if (view === 'compact') {\n body = (\n <EntityIndexCompactGrid\n entities={entities}\n hasSearch={hasSearch}\n getEntityHref={getEntityHref}\n LinkComponent={LinkComponent}\n />\n );\n }\n\n return (\n <div className=\"mx-auto grid size-full min-h-0 max-w-7xl grid-rows-[auto_minmax(0,1fr)]\">\n <div className=\"pb-3\">\n <EntityIndexControls\n search={search}\n sort={sort}\n view={view}\n onSearchChange={onSearchChange}\n onSortChange={onSortChange}\n onViewChange={onViewChange}\n signalCatalog={signalCatalog}\n headerAction={\n headerAction || signalManagement ? (\n <>\n {headerAction}\n {signalManagement ? (\n <TraceSignalSettingsButton open={settingsOpen} onClick={() => setSettingsOpen(open => !open)} />\n ) : null}\n </>\n ) : undefined\n }\n />\n </div>\n <div\n className={\n settingsOpen\n ? 'grid max-h-full min-h-0 grid-cols-1 items-start gap-4 lg:grid-cols-[1fr_1fr]'\n : 'grid min-h-0 grid-cols-1'\n }\n >\n <div className=\"min-h-0 min-w-0\">{body}</div>\n {settingsOpen ? <TraceSignalSettingsPanel onClose={() => setSettingsOpen(false)} /> : null}\n </div>\n </div>\n );\n}\n"],"names":["is401UnauthorizedError","jsx","SessionExpired","is403ForbiddenError","PermissionDenied","EmptyState","jsxs","ListSearch","TraceIntelligenceExplainer","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","ButtonsGroup","Button","List","Columns2","useThemeEntities","useTraceIntelligence","useState","filterAndSortEntities","EntityIndexList","DataListSkeleton","EntityIndexCompactGrid","Fragment","TraceSignalSettingsButton","TraceSignalSettingsPanel"],"mappings":"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"}
@@ -14,7 +14,6 @@ import { SessionExpired } from '../../../domains/auth/components/session-expired
14
14
  import { B as Button } from '../../../Button-D43ghVKt.js';
15
15
  import { B as ButtonsGroup } from '../../../buttons-group-DsZgrZBZ.js';
16
16
  import { D as DataListSkeleton } from '../../../data-list-skeleton-Bk9LI0J0.js';
17
- import '../../../keyboard/keyboard-shortcuts-context.es.js';
18
17
  import { E as EmptyState } from '../../../EmptyState-DyyUFpzY.js';
19
18
  import { L as ListSearch } from '../../../list-search-DI1DH7vU.js';
20
19
  import { S as Select, d as SelectTrigger, e as SelectValue, a as SelectContent, c as SelectItem } from '../../../select-DZeNf-kI.js';
@@ -1 +1 @@
1
- {"version":3,"file":"trace-intelligence-entity-index.es.js","sources":["../../../../src/ee/signals/components/trace-intelligence-entity-index.tsx"],"sourcesContent":["import type { SignalCatalogEntry, ThemeLearningEntity } from '@mastra/client-js';\nimport { Columns2, List } from 'lucide-react';\nimport { useState, type ReactNode } from 'react';\n\nimport { useThemeEntities } from '../hooks';\nimport { TraceSignalSettingsButton, TraceSignalSettingsPanel } from '../settings/trace-signal-settings';\nimport { TraceIntelligenceExplainer } from '../trace-intelligence-explainer';\nimport { useTraceIntelligence } from '../use-trace-intelligence';\nimport { EntityIndexCompactGrid } from './entity-index-compact-grid';\nimport { EntityIndexList } from './entity-index-list';\nimport { filterAndSortEntities } from './entity-index-model';\nimport type { TraceIntelligenceEntitySort, TraceIntelligenceEntityView } from './entity-index-model';\nimport { PermissionDenied } from '@/domains/auth/components/permission-denied';\nimport { SessionExpired } from '@/domains/auth/components/session-expired';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { DataListSkeleton } from '@/ds/components/DataList';\nimport { EmptyState } from '@/ds/components/EmptyState';\nimport { ListSearch } from '@/ds/components/ListSearch';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/ds/components/Select';\nimport { is401UnauthorizedError, is403ForbiddenError } from '@/utils/errors';\n\nexport type { TraceIntelligenceEntitySort, TraceIntelligenceEntityView } from './entity-index-model';\n\nconst listColumns = 'minmax(12rem,1.5fr) minmax(7rem,0.6fr) minmax(8rem,0.7fr) minmax(8rem,0.7fr) minmax(12rem,1fr)';\n\nexport interface TraceIntelligenceEntityIndexProps {\n entityType: string;\n search: string;\n sort: TraceIntelligenceEntitySort;\n view: TraceIntelligenceEntityView;\n onSearchChange: (search: string) => void;\n onSortChange: (sort: TraceIntelligenceEntitySort) => void;\n onViewChange: (view: TraceIntelligenceEntityView) => void;\n getEntityHref: (entity: ThemeLearningEntity) => string;\n headerAction?: ReactNode;\n}\n\nfunction EntityIndexError({ error }: { error: Error }) {\n if (is401UnauthorizedError(error)) {\n return (\n <div className=\"flex h-full items-center justify-center\">\n <SessionExpired />\n </div>\n );\n }\n if (is403ForbiddenError(error)) {\n return (\n <div className=\"flex h-full items-center justify-center\">\n <PermissionDenied resource=\"Trace Intelligence\" />\n </div>\n );\n }\n return (\n <div className=\"flex h-full items-center justify-center\">\n <EmptyState tone=\"error\" titleSlot=\"Failed to load Trace Intelligence\" descriptionSlot={error.message} />\n </div>\n );\n}\n\nfunction EntityIndexControls({\n search,\n sort,\n view,\n onSearchChange,\n onSortChange,\n onViewChange,\n headerAction,\n signalCatalog,\n}: Pick<\n TraceIntelligenceEntityIndexProps,\n 'search' | 'sort' | 'view' | 'onSearchChange' | 'onSortChange' | 'onViewChange' | 'headerAction'\n> & { signalCatalog: readonly SignalCatalogEntry[] }) {\n return (\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center\">\n <div className=\"max-w-120 flex-1\">\n <ListSearch\n value={search}\n onSearch={onSearchChange}\n label=\"Filter entities\"\n placeholder=\"Filter by entity identifier\"\n />\n </div>\n <div className=\"flex items-center justify-between gap-2 sm:ml-auto sm:justify-end\">\n <TraceIntelligenceExplainer signalCatalog={signalCatalog} />\n <Select<TraceIntelligenceEntitySort> value={sort} onValueChange={onSortChange}>\n <SelectTrigger aria-label=\"Sort entities\" size=\"md\" variant=\"ghost\" className=\"w-auto\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent align=\"end\">\n <SelectItem value=\"default\">Default order</SelectItem>\n <SelectItem value=\"entity-asc\">Entity: A–Z</SelectItem>\n <SelectItem value=\"entity-desc\">Entity: Z–A</SelectItem>\n </SelectContent>\n </Select>\n {headerAction}\n <ButtonsGroup aria-label=\"Entities view\">\n <Button\n type=\"button\"\n variant={view === 'list' ? 'primary' : 'default'}\n size=\"icon-md\"\n tooltip=\"List view\"\n aria-pressed={view === 'list'}\n onClick={() => onViewChange('list')}\n >\n <List />\n </Button>\n <Button\n type=\"button\"\n variant={view === 'compact' ? 'primary' : 'default'}\n size=\"icon-md\"\n tooltip=\"Compact view\"\n aria-pressed={view === 'compact'}\n onClick={() => onViewChange('compact')}\n >\n <Columns2 />\n </Button>\n </ButtonsGroup>\n </div>\n </div>\n );\n}\n\nexport function TraceIntelligenceEntityIndex({\n entityType,\n search,\n sort,\n view,\n onSearchChange,\n onSortChange,\n onViewChange,\n getEntityHref,\n headerAction,\n}: TraceIntelligenceEntityIndexProps) {\n const entitiesQuery = useThemeEntities(entityType);\n const { LinkComponent, signalCatalog: contextSignalCatalog, signalManagement } = useTraceIntelligence();\n const [settingsOpen, setSettingsOpen] = useState(false);\n\n if (entitiesQuery.error) return <EntityIndexError error={entitiesQuery.error} />;\n\n const sourceEntities = entitiesQuery.data?.entities ?? [];\n const signalCatalog =\n sourceEntities.find(entity => entity.signalCatalog?.length)?.signalCatalog ?? contextSignalCatalog;\n const entities = filterAndSortEntities(sourceEntities, search, sort);\n const hasSearch = search.trim().length > 0;\n let body = (\n <EntityIndexList\n entities={entities}\n hasSearch={hasSearch}\n getEntityHref={getEntityHref}\n LinkComponent={LinkComponent}\n />\n );\n if (entitiesQuery.isPending) {\n body = (\n <div role=\"status\" aria-label=\"Loading Trace Intelligence entities\">\n <DataListSkeleton columns={listColumns} />\n </div>\n );\n } else if (entitiesQuery.data.entities.length === 0 && !hasSearch) {\n body = (\n <EmptyState\n titleSlot=\"No Trace Intelligence entities yet\"\n descriptionSlot=\"Entities appear after Trace Intelligence begins collecting generated signal data.\"\n />\n );\n } else if (view === 'compact') {\n body = (\n <EntityIndexCompactGrid\n entities={entities}\n hasSearch={hasSearch}\n getEntityHref={getEntityHref}\n LinkComponent={LinkComponent}\n />\n );\n }\n\n return (\n <div className=\"mx-auto grid size-full min-h-0 max-w-7xl grid-rows-[auto_minmax(0,1fr)]\">\n <div className=\"pb-3\">\n <EntityIndexControls\n search={search}\n sort={sort}\n view={view}\n onSearchChange={onSearchChange}\n onSortChange={onSortChange}\n onViewChange={onViewChange}\n signalCatalog={signalCatalog}\n headerAction={\n headerAction || signalManagement ? (\n <>\n {headerAction}\n {signalManagement ? (\n <TraceSignalSettingsButton open={settingsOpen} onClick={() => setSettingsOpen(open => !open)} />\n ) : null}\n </>\n ) : undefined\n }\n />\n </div>\n <div\n className={\n settingsOpen\n ? 'grid max-h-full min-h-0 grid-cols-1 items-start gap-4 lg:grid-cols-[1fr_1fr]'\n : 'grid min-h-0 grid-cols-1'\n }\n >\n <div className=\"min-h-0 min-w-0\">{body}</div>\n {settingsOpen ? <TraceSignalSettingsPanel onClose={() => setSettingsOpen(false)} /> : null}\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAwBA,MAAM,WAAA,GAAc,gGAAA;AAcpB,SAAS,gBAAA,CAAiB,EAAE,KAAA,EAAM,EAAqB;AACrD,EAAA,IAAI,sBAAA,CAAuB,KAAK,CAAA,EAAG;AACjC,IAAA,2BACG,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACb,QAAA,kBAAA,GAAA,CAAC,kBAAe,CAAA,EAClB,CAAA;AAAA,EAEJ;AACA,EAAA,IAAI,mBAAA,CAAoB,KAAK,CAAA,EAAG;AAC9B,IAAA,uBACE,GAAA,CAAC,SAAI,SAAA,EAAU,yCAAA,EACb,8BAAC,gBAAA,EAAA,EAAiB,QAAA,EAAS,sBAAqB,CAAA,EAClD,CAAA;AAAA,EAEJ;AACA,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACb,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAK,OAAA,EAAQ,SAAA,EAAU,mCAAA,EAAoC,eAAA,EAAiB,KAAA,CAAM,SAAS,CAAA,EACzG,CAAA;AAEJ;AAEA,SAAS,mBAAA,CAAoB;AAAA,EAC3B,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAGsD;AACpD,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kBAAA,EACb,QAAA,kBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,MAAA;AAAA,QACP,QAAA,EAAU,cAAA;AAAA,QACV,KAAA,EAAM,iBAAA;AAAA,QACN,WAAA,EAAY;AAAA;AAAA,KACd,EACF,CAAA;AAAA,oBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mEAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,8BAA2B,aAAA,EAA8B,CAAA;AAAA,sBAC1D,IAAA,CAAC,MAAA,EAAA,EAAoC,KAAA,EAAO,IAAA,EAAM,eAAe,YAAA,EAC/D,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,YAAA,EAAW,eAAA,EAAgB,IAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,OAAA,EAAQ,SAAA,EAAU,QAAA,EAC5E,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,CAAA,EACf,CAAA;AAAA,wBACA,IAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAM,KAAA,EACnB,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAM,SAAA,EAAU,QAAA,EAAA,eAAA,EAAa,CAAA;AAAA,0BACzC,GAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAM,YAAA,EAAa,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,0BAC1C,GAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAM,aAAA,EAAc,QAAA,EAAA,aAAA,EAAW;AAAA,SAAA,EAC7C;AAAA,OAAA,EACF,CAAA;AAAA,MACC,YAAA;AAAA,sBACD,IAAA,CAAC,YAAA,EAAA,EAAa,YAAA,EAAW,eAAA,EACvB,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,IAAA,KAAS,MAAA,GAAS,SAAA,GAAY,SAAA;AAAA,YACvC,IAAA,EAAK,SAAA;AAAA,YACL,OAAA,EAAQ,WAAA;AAAA,YACR,gBAAc,IAAA,KAAS,MAAA;AAAA,YACvB,OAAA,EAAS,MAAM,YAAA,CAAa,MAAM,CAAA;AAAA,YAElC,8BAAC,IAAA,EAAA,EAAK;AAAA;AAAA,SACR;AAAA,wBACA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,IAAA,KAAS,SAAA,GAAY,SAAA,GAAY,SAAA;AAAA,YAC1C,IAAA,EAAK,SAAA;AAAA,YACL,OAAA,EAAQ,cAAA;AAAA,YACR,gBAAc,IAAA,KAAS,SAAA;AAAA,YACvB,OAAA,EAAS,MAAM,YAAA,CAAa,SAAS,CAAA;AAAA,YAErC,8BAAC,QAAA,EAAA,EAAS;AAAA;AAAA;AACZ,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,SAAS,4BAAA,CAA6B;AAAA,EAC3C,UAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAAsC;AACpC,EAAA,MAAM,aAAA,GAAgB,iBAAiB,UAAU,CAAA;AACjD,EAAA,MAAM,EAAE,aAAA,EAAe,aAAA,EAAe,oBAAA,EAAsB,gBAAA,KAAqB,oBAAA,EAAqB;AACtG,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,KAAK,CAAA;AAEtD,EAAA,IAAI,cAAc,KAAA,EAAO,2BAAQ,gBAAA,EAAA,EAAiB,KAAA,EAAO,cAAc,KAAA,EAAO,CAAA;AAE9E,EAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,IAAA,EAAM,QAAA,IAAY,EAAC;AACxD,EAAA,MAAM,aAAA,GACJ,eAAe,IAAA,CAAK,CAAA,MAAA,KAAU,OAAO,aAAA,EAAe,MAAM,GAAG,aAAA,IAAiB,oBAAA;AAChF,EAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,cAAA,EAAgB,MAAA,EAAQ,IAAI,CAAA;AACnE,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA;AACzC,EAAA,IAAI,IAAA,mBACF,GAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,QAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEF,EAAA,IAAI,cAAc,SAAA,EAAW;AAC3B,IAAA,IAAA,mBACE,GAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,QAAA,EAAS,YAAA,EAAW,uCAC5B,QAAA,kBAAA,GAAA,CAAC,gBAAA,EAAA,EAAiB,OAAA,EAAS,WAAA,EAAa,CAAA,EAC1C,CAAA;AAAA,EAEJ,WAAW,aAAA,CAAc,IAAA,CAAK,SAAS,MAAA,KAAW,CAAA,IAAK,CAAC,SAAA,EAAW;AACjE,IAAA,IAAA,mBACE,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,oCAAA;AAAA,QACV,eAAA,EAAgB;AAAA;AAAA,KAClB;AAAA,EAEJ,CAAA,MAAA,IAAW,SAAS,SAAA,EAAW;AAC7B,IAAA,IAAA,mBACE,GAAA;AAAA,MAAC,sBAAA;AAAA,MAAA;AAAA,QACC,QAAA;AAAA,QACA,SAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yEAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,MAAA,EACb,QAAA,kBAAA,GAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,IAAA;AAAA,QACA,IAAA;AAAA,QACA,cAAA;AAAA,QACA,YAAA;AAAA,QACA,YAAA;AAAA,QACA,aAAA;AAAA,QACA,YAAA,EACE,YAAA,IAAgB,gBAAA,mBACd,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,UAAA,YAAA;AAAA,UACA,gBAAA,mBACC,GAAA,CAAC,yBAAA,EAAA,EAA0B,IAAA,EAAM,YAAA,EAAc,OAAA,EAAS,MAAM,eAAA,CAAgB,CAAA,IAAA,KAAQ,CAAC,IAAI,CAAA,EAAG,CAAA,GAC5F;AAAA,SAAA,EACN,CAAA,GACE;AAAA;AAAA,KAER,EACF,CAAA;AAAA,oBACA,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EACE,eACI,8EAAA,GACA,0BAAA;AAAA,QAGN,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EAAmB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,UACtC,YAAA,uBAAgB,wBAAA,EAAA,EAAyB,OAAA,EAAS,MAAM,eAAA,CAAgB,KAAK,GAAG,CAAA,GAAK;AAAA;AAAA;AAAA;AACxF,GAAA,EACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"trace-intelligence-entity-index.es.js","sources":["../../../../src/ee/signals/components/trace-intelligence-entity-index.tsx"],"sourcesContent":["import type { SignalCatalogEntry, ThemeLearningEntity } from '@mastra/client-js';\nimport { Columns2, List } from 'lucide-react';\nimport { useState, type ReactNode } from 'react';\n\nimport { useThemeEntities } from '../hooks';\nimport { TraceSignalSettingsButton, TraceSignalSettingsPanel } from '../settings/trace-signal-settings';\nimport { TraceIntelligenceExplainer } from '../trace-intelligence-explainer';\nimport { useTraceIntelligence } from '../use-trace-intelligence';\nimport { EntityIndexCompactGrid } from './entity-index-compact-grid';\nimport { EntityIndexList } from './entity-index-list';\nimport { filterAndSortEntities } from './entity-index-model';\nimport type { TraceIntelligenceEntitySort, TraceIntelligenceEntityView } from './entity-index-model';\nimport { PermissionDenied } from '@/domains/auth/components/permission-denied';\nimport { SessionExpired } from '@/domains/auth/components/session-expired';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { DataListSkeleton } from '@/ds/components/DataList';\nimport { EmptyState } from '@/ds/components/EmptyState';\nimport { ListSearch } from '@/ds/components/ListSearch';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/ds/components/Select';\nimport { is401UnauthorizedError, is403ForbiddenError } from '@/utils/errors';\n\nexport type { TraceIntelligenceEntitySort, TraceIntelligenceEntityView } from './entity-index-model';\n\nconst listColumns = 'minmax(12rem,1.5fr) minmax(7rem,0.6fr) minmax(8rem,0.7fr) minmax(8rem,0.7fr) minmax(12rem,1fr)';\n\nexport interface TraceIntelligenceEntityIndexProps {\n entityType: string;\n search: string;\n sort: TraceIntelligenceEntitySort;\n view: TraceIntelligenceEntityView;\n onSearchChange: (search: string) => void;\n onSortChange: (sort: TraceIntelligenceEntitySort) => void;\n onViewChange: (view: TraceIntelligenceEntityView) => void;\n getEntityHref: (entity: ThemeLearningEntity) => string;\n headerAction?: ReactNode;\n}\n\nfunction EntityIndexError({ error }: { error: Error }) {\n if (is401UnauthorizedError(error)) {\n return (\n <div className=\"flex h-full items-center justify-center\">\n <SessionExpired />\n </div>\n );\n }\n if (is403ForbiddenError(error)) {\n return (\n <div className=\"flex h-full items-center justify-center\">\n <PermissionDenied resource=\"Trace Intelligence\" />\n </div>\n );\n }\n return (\n <div className=\"flex h-full items-center justify-center\">\n <EmptyState tone=\"error\" titleSlot=\"Failed to load Trace Intelligence\" descriptionSlot={error.message} />\n </div>\n );\n}\n\nfunction EntityIndexControls({\n search,\n sort,\n view,\n onSearchChange,\n onSortChange,\n onViewChange,\n headerAction,\n signalCatalog,\n}: Pick<\n TraceIntelligenceEntityIndexProps,\n 'search' | 'sort' | 'view' | 'onSearchChange' | 'onSortChange' | 'onViewChange' | 'headerAction'\n> & { signalCatalog: readonly SignalCatalogEntry[] }) {\n return (\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center\">\n <div className=\"max-w-120 flex-1\">\n <ListSearch\n value={search}\n onSearch={onSearchChange}\n label=\"Filter entities\"\n placeholder=\"Filter by entity identifier\"\n />\n </div>\n <div className=\"flex items-center justify-between gap-2 sm:ml-auto sm:justify-end\">\n <TraceIntelligenceExplainer signalCatalog={signalCatalog} />\n <Select<TraceIntelligenceEntitySort> value={sort} onValueChange={onSortChange}>\n <SelectTrigger aria-label=\"Sort entities\" size=\"md\" variant=\"ghost\" className=\"w-auto\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent align=\"end\">\n <SelectItem value=\"default\">Default order</SelectItem>\n <SelectItem value=\"entity-asc\">Entity: A–Z</SelectItem>\n <SelectItem value=\"entity-desc\">Entity: Z–A</SelectItem>\n </SelectContent>\n </Select>\n {headerAction}\n <ButtonsGroup aria-label=\"Entities view\">\n <Button\n type=\"button\"\n variant={view === 'list' ? 'primary' : 'default'}\n size=\"icon-md\"\n tooltip=\"List view\"\n aria-pressed={view === 'list'}\n onClick={() => onViewChange('list')}\n >\n <List />\n </Button>\n <Button\n type=\"button\"\n variant={view === 'compact' ? 'primary' : 'default'}\n size=\"icon-md\"\n tooltip=\"Compact view\"\n aria-pressed={view === 'compact'}\n onClick={() => onViewChange('compact')}\n >\n <Columns2 />\n </Button>\n </ButtonsGroup>\n </div>\n </div>\n );\n}\n\nexport function TraceIntelligenceEntityIndex({\n entityType,\n search,\n sort,\n view,\n onSearchChange,\n onSortChange,\n onViewChange,\n getEntityHref,\n headerAction,\n}: TraceIntelligenceEntityIndexProps) {\n const entitiesQuery = useThemeEntities(entityType);\n const { LinkComponent, signalCatalog: contextSignalCatalog, signalManagement } = useTraceIntelligence();\n const [settingsOpen, setSettingsOpen] = useState(false);\n\n if (entitiesQuery.error) return <EntityIndexError error={entitiesQuery.error} />;\n\n const sourceEntities = entitiesQuery.data?.entities ?? [];\n const signalCatalog =\n sourceEntities.find(entity => entity.signalCatalog?.length)?.signalCatalog ?? contextSignalCatalog;\n const entities = filterAndSortEntities(sourceEntities, search, sort);\n const hasSearch = search.trim().length > 0;\n let body = (\n <EntityIndexList\n entities={entities}\n hasSearch={hasSearch}\n getEntityHref={getEntityHref}\n LinkComponent={LinkComponent}\n />\n );\n if (entitiesQuery.isPending) {\n body = (\n <div role=\"status\" aria-label=\"Loading Trace Intelligence entities\">\n <DataListSkeleton columns={listColumns} />\n </div>\n );\n } else if (entitiesQuery.data.entities.length === 0 && !hasSearch) {\n body = (\n <EmptyState\n titleSlot=\"No Trace Intelligence entities yet\"\n descriptionSlot=\"Entities appear after Trace Intelligence begins collecting generated signal data.\"\n />\n );\n } else if (view === 'compact') {\n body = (\n <EntityIndexCompactGrid\n entities={entities}\n hasSearch={hasSearch}\n getEntityHref={getEntityHref}\n LinkComponent={LinkComponent}\n />\n );\n }\n\n return (\n <div className=\"mx-auto grid size-full min-h-0 max-w-7xl grid-rows-[auto_minmax(0,1fr)]\">\n <div className=\"pb-3\">\n <EntityIndexControls\n search={search}\n sort={sort}\n view={view}\n onSearchChange={onSearchChange}\n onSortChange={onSortChange}\n onViewChange={onViewChange}\n signalCatalog={signalCatalog}\n headerAction={\n headerAction || signalManagement ? (\n <>\n {headerAction}\n {signalManagement ? (\n <TraceSignalSettingsButton open={settingsOpen} onClick={() => setSettingsOpen(open => !open)} />\n ) : null}\n </>\n ) : undefined\n }\n />\n </div>\n <div\n className={\n settingsOpen\n ? 'grid max-h-full min-h-0 grid-cols-1 items-start gap-4 lg:grid-cols-[1fr_1fr]'\n : 'grid min-h-0 grid-cols-1'\n }\n >\n <div className=\"min-h-0 min-w-0\">{body}</div>\n {settingsOpen ? <TraceSignalSettingsPanel onClose={() => setSettingsOpen(false)} /> : null}\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mastra/playground-ui",
3
3
  "type": "module",
4
- "version": "60.1.0-alpha.1",
4
+ "version": "60.1.0",
5
5
  "description": "Mastra Playground components",
6
6
  "sideEffects": [
7
7
  "**/*.css"
@@ -208,9 +208,9 @@
208
208
  "react": ">=19.0.0",
209
209
  "react-dom": ">=19.0.0",
210
210
  "tailwindcss": "^4.0.0",
211
- "@mastra/ai-sdk": "^1.10.6-alpha.0",
212
- "@mastra/client-js": "^1.51.1-alpha.1",
213
- "@mastra/react": "1.7.1-alpha.1"
211
+ "@mastra/ai-sdk": "^1.10.6",
212
+ "@mastra/client-js": "^1.51.1",
213
+ "@mastra/react": "1.7.1"
214
214
  },
215
215
  "devDependencies": {
216
216
  "@modelcontextprotocol/sdk": "^1.29.0",
@@ -254,13 +254,13 @@
254
254
  "vite-plugin-dts": "^4.5.4",
255
255
  "vite-plugin-lib-inject-css": "^2.2.2",
256
256
  "vitest": "4.1.11",
257
- "@mastra/ai-sdk": "1.10.6-alpha.0",
258
- "@mastra/client-js": "^1.51.1-alpha.1",
259
- "@internal/lint": "0.0.138",
260
- "@mastra/memory": "1.34.0-alpha.1",
261
- "@mastra/core": "1.73.0-alpha.1",
262
- "@mastra/react": "1.7.1-alpha.1",
263
- "@mastra/schema-compat": "1.3.13-alpha.0"
257
+ "@internal/lint": "0.0.139",
258
+ "@mastra/ai-sdk": "1.10.6",
259
+ "@mastra/core": "1.73.0",
260
+ "@mastra/schema-compat": "1.3.13",
261
+ "@mastra/react": "1.7.1",
262
+ "@mastra/memory": "1.34.0",
263
+ "@mastra/client-js": "^1.51.1"
264
264
  },
265
265
  "homepage": "https://mastra.ai",
266
266
  "repository": {