@mastra/playground-ui 52.0.0-alpha.11 → 52.0.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 -1
  2. package/dist/components/LogsDataList.cjs.js.map +1 -1
  3. package/dist/components/LogsDataList.es.js +0 -1
  4. package/dist/components/LogsDataList.es.js.map +1 -1
  5. package/dist/domains/traces/components/trace-data-panel-view.cjs.js +17 -14
  6. package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
  7. package/dist/domains/traces/components/trace-data-panel-view.es.js +17 -14
  8. package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
  9. package/dist/ee/signals/components/entity-index-list.cjs.js +0 -1
  10. package/dist/ee/signals/components/entity-index-list.cjs.js.map +1 -1
  11. package/dist/ee/signals/components/entity-index-list.es.js +0 -1
  12. package/dist/ee/signals/components/entity-index-list.es.js.map +1 -1
  13. package/dist/ee/signals/components/signals-empty-state.cjs.js +1 -1
  14. package/dist/ee/signals/components/signals-empty-state.cjs.js.map +1 -1
  15. package/dist/ee/signals/components/signals-empty-state.es.js +1 -1
  16. package/dist/ee/signals/components/signals-empty-state.es.js.map +1 -1
  17. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +11 -5
  18. package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js.map +1 -1
  19. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +11 -5
  20. package/dist/ee/signals/components/trace-intelligence-entity-index.es.js.map +1 -1
  21. package/dist/ee/signals/settings/trace-signal-settings.cjs.js +3 -25
  22. package/dist/ee/signals/settings/trace-signal-settings.cjs.js.map +1 -1
  23. package/dist/ee/signals/settings/trace-signal-settings.es.js +3 -25
  24. package/dist/ee/signals/settings/trace-signal-settings.es.js.map +1 -1
  25. package/dist/ee/signals/trace-intelligence-explainer.cjs.js +1 -1
  26. package/dist/ee/signals/trace-intelligence-explainer.cjs.js.map +1 -1
  27. package/dist/ee/signals/trace-intelligence-explainer.es.js +1 -1
  28. package/dist/ee/signals/trace-intelligence-explainer.es.js.map +1 -1
  29. package/dist/hooks/use-in-view.cjs.js +12 -9
  30. package/dist/hooks/use-in-view.cjs.js.map +1 -1
  31. package/dist/hooks/use-in-view.es.js +13 -10
  32. package/dist/hooks/use-in-view.es.js.map +1 -1
  33. package/dist/src/domains/traces/components/trace-data-panel-view.d.ts +6 -2
  34. package/dist/src/hooks/use-in-view.d.ts +15 -2
  35. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"trace-signal-settings.cjs.js","sources":["../../../../src/ee/signals/settings/trace-signal-settings.tsx"],"sourcesContent":["import type { TraceSignalDefinition } from '@mastra/client-js';\nimport { Settings } from 'lucide-react';\nimport { useState } from 'react';\n\nimport { useTraceIntelligence } from '../use-trace-intelligence';\nimport { SignalDefinitionFormDialog } from './signal-definition-form-dialog';\nimport { useSignalManagementList, useSignalManagementMutations } from './use-signal-management';\nimport { Badge } from '@/ds/components/Badge';\nimport { Button } from '@/ds/components/Button';\nimport { DataDetailsPanel } from '@/ds/components/DataDetailsPanel';\nimport { Notice } from '@/ds/components/Notice';\nimport { Skeleton } from '@/ds/components/Skeleton';\nimport { Switch } from '@/ds/components/Switch';\n\nexport function TraceSignalSettingsButton({ open, onClick }: { open: boolean; onClick: () => void }) {\n const { signalManagement } = useTraceIntelligence();\n if (!signalManagement) return null;\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-md\"\n tooltip=\"Signal settings\"\n aria-label=\"Signal settings\"\n aria-controls=\"trace-signal-settings\"\n aria-expanded={open}\n onClick={onClick}\n >\n <Settings aria-hidden=\"true\" />\n </Button>\n );\n}\n\nexport function TraceSignalSettingsPanel({ onClose }: { onClose: () => void }) {\n return (\n <aside id=\"trace-signal-settings\" aria-label=\"Trace signal settings\" className=\"min-h-0\">\n <DataDetailsPanel>\n <DataDetailsPanel.Header>\n <DataDetailsPanel.Heading className=\"text-neutral5 items-center font-medium\">\n <Settings aria-hidden=\"true\" /> Trace signal settings\n </DataDetailsPanel.Heading>\n <DataDetailsPanel.CloseButton onClick={onClose} tooltip=\"Close settings\" />\n </DataDetailsPanel.Header>\n <DataDetailsPanel.Content>\n <TraceSignalSettingsContent />\n </DataDetailsPanel.Content>\n </DataDetailsPanel>\n </aside>\n );\n}\n\nfunction TraceSignalSettingsContent() {\n const { signalCatalog, signalManagement } = useTraceIntelligence();\n const query = useSignalManagementList();\n const mutations = useSignalManagementMutations();\n const [creating, setCreating] = useState(false);\n const [editing, setEditing] = useState<TraceSignalDefinition>();\n const [actionError, setActionError] = useState<string>();\n const canManage = signalManagement?.canManage ?? false;\n\n if (query.isPending) {\n return (\n <div className=\"space-y-3\" role=\"status\" aria-label=\"Loading signal settings\">\n <Skeleton className=\"h-5 w-40\" />\n <Skeleton className=\"h-16 w-full\" />\n <Skeleton className=\"h-16 w-full\" />\n </div>\n );\n }\n if (query.error || !query.data) {\n return (\n <Notice variant=\"destructive\">\n <Notice.Message>{query.error?.message ?? 'Failed to load signal settings'}</Notice.Message>\n </Notice>\n );\n }\n\n const active = query.data.definitions.filter(definition => definition.status === 'active');\n const archived = query.data.definitions.filter(definition => definition.status === 'archived');\n const limit = query.data.limits.maxDefinitionsPerOrganization;\n const atLimit = active.length >= limit;\n const mutationPending = creating ? mutations.create.isPending : mutations.update.isPending;\n const formError = creating ? mutations.create.error?.message : editing ? mutations.update.error?.message : undefined;\n const openCreateForm = () => {\n mutations.create.reset();\n setCreating(true);\n };\n const setCreateFormOpen = (open: boolean) => {\n if (!open) mutations.create.reset();\n setCreating(open);\n };\n const openEditForm = (definition: TraceSignalDefinition) => {\n mutations.update.reset();\n setEditing(definition);\n };\n const closeEditForm = () => {\n mutations.update.reset();\n setEditing(undefined);\n };\n\n const runAction = async (action: () => Promise<unknown>) => {\n setActionError(undefined);\n try {\n await action();\n } catch (error) {\n setActionError(error instanceof Error ? error.message : 'Failed to update signal settings');\n }\n };\n\n return (\n <div className=\"space-y-6\">\n <div className=\"space-y-2\">\n <div className=\"border-border1 grid gap-2 rounded-md border p-3 sm:grid-cols-2\">\n <div>\n <p className=\"text-ui-sm text-neutral4 font-medium\">Organization signal library</p>\n <p className=\"text-ui-xs text-neutral3\">Definitions, prompts, and versions are shared by every project.</p>\n </div>\n <div>\n <p className=\"text-ui-sm text-neutral4 font-medium\">Current project</p>\n <p className=\"text-ui-xs text-neutral3\">Enable switches apply only to this project.</p>\n </div>\n </div>\n {!canManage ? (\n <Notice variant=\"info\">\n <Notice.Message>You have read-only access. An organization admin can change these settings.</Notice.Message>\n </Notice>\n ) : null}\n {actionError ? (\n <Notice variant=\"destructive\">\n <Notice.Message>{actionError}</Notice.Message>\n </Notice>\n ) : null}\n </div>\n\n <section aria-labelledby=\"built-in-signals-heading\">\n <h3 id=\"built-in-signals-heading\" className=\"text-ui-md text-neutral4 mb-2 font-medium\">\n Built-in signals\n </h3>\n <div className=\"divide-border1 border-border1 divide-y rounded-md border px-3\">\n {signalCatalog\n .filter(signal => signal.builtIn)\n .map(signal => (\n <div key={signal.name} className=\"flex min-h-12 items-center justify-between gap-3 py-2\">\n <div className=\"min-w-0\">\n <p className=\"text-ui-sm text-neutral4\">{signal.label}</p>\n <p className=\"text-ui-xs text-neutral3 truncate\">{signal.description}</p>\n </div>\n <Badge variant=\"neutral\" size=\"sm\">\n Read only\n </Badge>\n </div>\n ))}\n </div>\n </section>\n\n <section aria-labelledby=\"custom-signals-heading\">\n <div className=\"mb-2 flex flex-wrap items-center justify-between gap-3\">\n <div>\n <h3 id=\"custom-signals-heading\" className=\"text-ui-md text-neutral4 font-medium\">\n Custom signals\n </h3>\n <p className=\"text-ui-xs text-neutral3\">\n {active.length} of {limit} active organization definitions\n </p>\n </div>\n <Button size=\"sm\" variant=\"primary\" disabled={!canManage || atLimit} onClick={openCreateForm}>\n Create signal\n </Button>\n </div>\n {atLimit ? (\n <Notice variant=\"info\">\n <Notice.Message>Archive an active definition before creating or restoring another.</Notice.Message>\n </Notice>\n ) : null}\n <div className=\"divide-border1 divide-y\">\n {active.map(definition => (\n <div key={definition.id} className=\"flex min-h-16 items-center justify-between gap-4 py-2\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-ui-sm text-neutral4 truncate\">{definition.displayLabel}</span>\n <Badge variant=\"neutral\" size=\"sm\">\n v{definition.version}\n </Badge>\n </div>\n <p className=\"text-ui-xs text-neutral3 truncate\">{definition.description || definition.name}</p>\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <Button size=\"sm\" variant=\"ghost\" disabled={!canManage} onClick={() => openEditForm(definition)}>\n Edit\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={\n !canManage || (mutations.archive.isPending && mutations.archive.variables === definition.id)\n }\n onClick={() => void runAction(() => mutations.archive.mutateAsync(definition.id))}\n >\n Archive\n </Button>\n <Switch\n aria-label={`Enable ${definition.displayLabel}`}\n checked={definition.enabled ?? false}\n disabled={\n !canManage ||\n (mutations.setProjectEnabled.isPending &&\n mutations.setProjectEnabled.variables?.id === definition.id)\n }\n onCheckedChange={enabled =>\n void runAction(() => mutations.setProjectEnabled.mutateAsync({ id: definition.id, enabled }))\n }\n />\n </div>\n </div>\n ))}\n </div>\n {active.length === 0 ? <p className=\"text-ui-sm text-neutral3 py-3\">No custom signals yet.</p> : null}\n </section>\n\n {archived.length > 0 ? (\n <details>\n <summary className=\"text-ui-sm text-neutral4 cursor-pointer\">\n Archived definitions ({archived.length})\n </summary>\n <div className=\"divide-border1 mt-2 divide-y\">\n {archived.map(definition => (\n <div key={definition.id} className=\"flex min-h-12 items-center justify-between gap-3 py-2\">\n <span className=\"text-ui-sm text-neutral3\">{definition.displayLabel}</span>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={\n !canManage ||\n atLimit ||\n (mutations.restore.isPending && mutations.restore.variables === definition.id)\n }\n onClick={() => void runAction(() => mutations.restore.mutateAsync(definition.id))}\n >\n Restore\n </Button>\n </div>\n ))}\n </div>\n </details>\n ) : null}\n\n <p className=\"text-ui-xs text-neutral3\">\n Enabling a signal starts collection for new traces. Entity status shows when enough generated data has been\n processed and clustered.\n </p>\n\n {creating ? (\n <SignalDefinitionFormDialog\n open\n onOpenChange={setCreateFormOpen}\n pending={mutationPending}\n error={formError}\n onCreate={async input => {\n await mutations.create.mutateAsync(input);\n }}\n onUpdate={async () => undefined}\n />\n ) : null}\n {editing ? (\n <SignalDefinitionFormDialog\n open\n definition={editing}\n onOpenChange={open => {\n if (!open) closeEditForm();\n }}\n pending={mutationPending}\n error={formError}\n onCreate={async () => undefined}\n onUpdate={async (id, input) => {\n await mutations.update.mutateAsync({ id, input });\n }}\n />\n ) : null}\n </div>\n );\n}\n"],"names":["useTraceIntelligence","jsx","Button","Settings","jsxs","DataDetailsPanel","useSignalManagementList","useSignalManagementMutations","useState","Skeleton","Notice","Badge","Switch","SignalDefinitionFormDialog"],"mappings":"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"}
1
+ {"version":3,"file":"trace-signal-settings.cjs.js","sources":["../../../../src/ee/signals/settings/trace-signal-settings.tsx"],"sourcesContent":["import type { TraceSignalDefinition } from '@mastra/client-js';\nimport { Settings } from 'lucide-react';\nimport { useState } from 'react';\n\nimport { useTraceIntelligence } from '../use-trace-intelligence';\nimport { SignalDefinitionFormDialog } from './signal-definition-form-dialog';\nimport { useSignalManagementList, useSignalManagementMutations } from './use-signal-management';\nimport { Badge } from '@/ds/components/Badge';\nimport { Button } from '@/ds/components/Button';\nimport { DataDetailsPanel } from '@/ds/components/DataDetailsPanel';\nimport { Notice } from '@/ds/components/Notice';\nimport { Skeleton } from '@/ds/components/Skeleton';\nimport { Switch } from '@/ds/components/Switch';\n\nexport function TraceSignalSettingsButton({ open, onClick }: { open: boolean; onClick: () => void }) {\n const { signalManagement } = useTraceIntelligence();\n if (!signalManagement) return null;\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-md\"\n tooltip=\"Signal settings\"\n aria-label=\"Signal settings\"\n aria-controls=\"trace-signal-settings\"\n aria-expanded={open}\n onClick={onClick}\n >\n <Settings aria-hidden=\"true\" />\n </Button>\n );\n}\n\nexport function TraceSignalSettingsPanel({ onClose }: { onClose: () => void }) {\n return (\n <aside id=\"trace-signal-settings\" aria-label=\"Trace signal settings\" className=\"min-h-0\">\n <DataDetailsPanel>\n <DataDetailsPanel.Header>\n <DataDetailsPanel.Heading className=\"text-neutral5 items-center font-medium\">\n <Settings aria-hidden=\"true\" /> Trace signal settings\n </DataDetailsPanel.Heading>\n <DataDetailsPanel.CloseButton onClick={onClose} tooltip=\"Close settings\" />\n </DataDetailsPanel.Header>\n <DataDetailsPanel.Content>\n <TraceSignalSettingsContent />\n </DataDetailsPanel.Content>\n </DataDetailsPanel>\n </aside>\n );\n}\n\nfunction TraceSignalSettingsContent() {\n const { signalManagement } = useTraceIntelligence();\n const query = useSignalManagementList();\n const mutations = useSignalManagementMutations();\n const [creating, setCreating] = useState(false);\n const [editing, setEditing] = useState<TraceSignalDefinition>();\n const [actionError, setActionError] = useState<string>();\n const canManage = signalManagement?.canManage ?? false;\n\n if (query.isPending) {\n return (\n <div className=\"space-y-3\" role=\"status\" aria-label=\"Loading signal settings\">\n <Skeleton className=\"h-5 w-40\" />\n <Skeleton className=\"h-16 w-full\" />\n <Skeleton className=\"h-16 w-full\" />\n </div>\n );\n }\n if (query.error || !query.data) {\n return (\n <Notice variant=\"destructive\">\n <Notice.Message>{query.error?.message ?? 'Failed to load signal settings'}</Notice.Message>\n </Notice>\n );\n }\n\n const active = query.data.definitions.filter(definition => definition.status === 'active');\n const archived = query.data.definitions.filter(definition => definition.status === 'archived');\n const limit = query.data.limits.maxDefinitionsPerOrganization;\n const atLimit = active.length >= limit;\n const mutationPending = creating ? mutations.create.isPending : mutations.update.isPending;\n const formError = creating ? mutations.create.error?.message : editing ? mutations.update.error?.message : undefined;\n const openCreateForm = () => {\n mutations.create.reset();\n setCreating(true);\n };\n const setCreateFormOpen = (open: boolean) => {\n if (!open) mutations.create.reset();\n setCreating(open);\n };\n const openEditForm = (definition: TraceSignalDefinition) => {\n mutations.update.reset();\n setEditing(definition);\n };\n const closeEditForm = () => {\n mutations.update.reset();\n setEditing(undefined);\n };\n\n const runAction = async (action: () => Promise<unknown>) => {\n setActionError(undefined);\n try {\n await action();\n } catch (error) {\n setActionError(error instanceof Error ? error.message : 'Failed to update signal settings');\n }\n };\n\n return (\n <div className=\"space-y-6\">\n {!canManage ? (\n <Notice variant=\"info\">\n <Notice.Message>You have read-only access. An organization admin can change these settings.</Notice.Message>\n </Notice>\n ) : null}\n {actionError ? (\n <Notice variant=\"destructive\">\n <Notice.Message>{actionError}</Notice.Message>\n </Notice>\n ) : null}\n\n <section aria-labelledby=\"custom-signals-heading\">\n <div className=\"mb-2 flex flex-wrap items-center justify-between gap-3\">\n <div>\n <h3 id=\"custom-signals-heading\" className=\"text-ui-md text-neutral4 font-medium\">\n Custom signals\n </h3>\n <p className=\"text-ui-xs text-neutral3\">\n {active.length} of {limit} active organization definitions\n </p>\n </div>\n <Button size=\"sm\" variant=\"primary\" disabled={!canManage || atLimit} onClick={openCreateForm}>\n Create signal\n </Button>\n </div>\n {atLimit ? (\n <Notice variant=\"info\">\n <Notice.Message>Archive an active definition before creating or restoring another.</Notice.Message>\n </Notice>\n ) : null}\n <div className=\"divide-border1 divide-y\">\n {active.map(definition => (\n <div key={definition.id} className=\"flex min-h-16 items-center justify-between gap-4 py-2\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-ui-sm text-neutral4 truncate\">{definition.displayLabel}</span>\n <Badge variant=\"neutral\" size=\"sm\">\n v{definition.version}\n </Badge>\n </div>\n <p className=\"text-ui-xs text-neutral3 truncate\">{definition.description || definition.name}</p>\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <Button size=\"sm\" variant=\"ghost\" disabled={!canManage} onClick={() => openEditForm(definition)}>\n Edit\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={\n !canManage || (mutations.archive.isPending && mutations.archive.variables === definition.id)\n }\n onClick={() => void runAction(() => mutations.archive.mutateAsync(definition.id))}\n >\n Archive\n </Button>\n <Switch\n aria-label={`Enable ${definition.displayLabel}`}\n checked={definition.enabled ?? false}\n disabled={\n !canManage ||\n (mutations.setProjectEnabled.isPending &&\n mutations.setProjectEnabled.variables?.id === definition.id)\n }\n onCheckedChange={enabled =>\n void runAction(() => mutations.setProjectEnabled.mutateAsync({ id: definition.id, enabled }))\n }\n />\n </div>\n </div>\n ))}\n </div>\n {active.length === 0 ? <p className=\"text-ui-sm text-neutral3 py-3\">No custom signals yet.</p> : null}\n </section>\n\n {archived.length > 0 ? (\n <details>\n <summary className=\"text-ui-sm text-neutral4 cursor-pointer\">\n Archived definitions ({archived.length})\n </summary>\n <div className=\"divide-border1 mt-2 divide-y\">\n {archived.map(definition => (\n <div key={definition.id} className=\"flex min-h-12 items-center justify-between gap-3 py-2\">\n <span className=\"text-ui-sm text-neutral3\">{definition.displayLabel}</span>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={\n !canManage ||\n atLimit ||\n (mutations.restore.isPending && mutations.restore.variables === definition.id)\n }\n onClick={() => void runAction(() => mutations.restore.mutateAsync(definition.id))}\n >\n Restore\n </Button>\n </div>\n ))}\n </div>\n </details>\n ) : null}\n\n <p className=\"text-ui-xs text-neutral3\">\n Enabling a signal starts collection for new traces. Entity status shows when enough generated data has been\n processed and clustered.\n </p>\n\n {creating ? (\n <SignalDefinitionFormDialog\n open\n onOpenChange={setCreateFormOpen}\n pending={mutationPending}\n error={formError}\n onCreate={async input => {\n await mutations.create.mutateAsync(input);\n }}\n onUpdate={async () => undefined}\n />\n ) : null}\n {editing ? (\n <SignalDefinitionFormDialog\n open\n definition={editing}\n onOpenChange={open => {\n if (!open) closeEditForm();\n }}\n pending={mutationPending}\n error={formError}\n onCreate={async () => undefined}\n onUpdate={async (id, input) => {\n await mutations.update.mutateAsync({ id, input });\n }}\n />\n ) : null}\n </div>\n );\n}\n"],"names":["useTraceIntelligence","jsx","Button","Settings","jsxs","DataDetailsPanel","useSignalManagementList","useSignalManagementMutations","useState","Skeleton","Notice","Badge","Switch","SignalDefinitionFormDialog"],"mappings":"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"}
@@ -42,7 +42,7 @@ function TraceSignalSettingsPanel({ onClose }) {
42
42
  ] }) });
43
43
  }
44
44
  function TraceSignalSettingsContent() {
45
- const { signalCatalog, signalManagement } = useTraceIntelligence();
45
+ const { signalManagement } = useTraceIntelligence();
46
46
  const query = useSignalManagementList();
47
47
  const mutations = useSignalManagementMutations();
48
48
  const [creating, setCreating] = useState(false);
@@ -90,30 +90,8 @@ function TraceSignalSettingsContent() {
90
90
  }
91
91
  };
92
92
  return /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
93
- /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
94
- /* @__PURE__ */ jsxs("div", { className: "border-border1 grid gap-2 rounded-md border p-3 sm:grid-cols-2", children: [
95
- /* @__PURE__ */ jsxs("div", { children: [
96
- /* @__PURE__ */ jsx("p", { className: "text-ui-sm text-neutral4 font-medium", children: "Organization signal library" }),
97
- /* @__PURE__ */ jsx("p", { className: "text-ui-xs text-neutral3", children: "Definitions, prompts, and versions are shared by every project." })
98
- ] }),
99
- /* @__PURE__ */ jsxs("div", { children: [
100
- /* @__PURE__ */ jsx("p", { className: "text-ui-sm text-neutral4 font-medium", children: "Current project" }),
101
- /* @__PURE__ */ jsx("p", { className: "text-ui-xs text-neutral3", children: "Enable switches apply only to this project." })
102
- ] })
103
- ] }),
104
- !canManage ? /* @__PURE__ */ jsx(Notice, { variant: "info", children: /* @__PURE__ */ jsx(Notice.Message, { children: "You have read-only access. An organization admin can change these settings." }) }) : null,
105
- actionError ? /* @__PURE__ */ jsx(Notice, { variant: "destructive", children: /* @__PURE__ */ jsx(Notice.Message, { children: actionError }) }) : null
106
- ] }),
107
- /* @__PURE__ */ jsxs("section", { "aria-labelledby": "built-in-signals-heading", children: [
108
- /* @__PURE__ */ jsx("h3", { id: "built-in-signals-heading", className: "text-ui-md text-neutral4 mb-2 font-medium", children: "Built-in signals" }),
109
- /* @__PURE__ */ jsx("div", { className: "divide-border1 border-border1 divide-y rounded-md border px-3", children: signalCatalog.filter((signal) => signal.builtIn).map((signal) => /* @__PURE__ */ jsxs("div", { className: "flex min-h-12 items-center justify-between gap-3 py-2", children: [
110
- /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
111
- /* @__PURE__ */ jsx("p", { className: "text-ui-sm text-neutral4", children: signal.label }),
112
- /* @__PURE__ */ jsx("p", { className: "text-ui-xs text-neutral3 truncate", children: signal.description })
113
- ] }),
114
- /* @__PURE__ */ jsx(Badge, { variant: "neutral", size: "sm", children: "Read only" })
115
- ] }, signal.name)) })
116
- ] }),
93
+ !canManage ? /* @__PURE__ */ jsx(Notice, { variant: "info", children: /* @__PURE__ */ jsx(Notice.Message, { children: "You have read-only access. An organization admin can change these settings." }) }) : null,
94
+ actionError ? /* @__PURE__ */ jsx(Notice, { variant: "destructive", children: /* @__PURE__ */ jsx(Notice.Message, { children: actionError }) }) : null,
117
95
  /* @__PURE__ */ jsxs("section", { "aria-labelledby": "custom-signals-heading", children: [
118
96
  /* @__PURE__ */ jsxs("div", { className: "mb-2 flex flex-wrap items-center justify-between gap-3", children: [
119
97
  /* @__PURE__ */ jsxs("div", { children: [
@@ -1 +1 @@
1
- {"version":3,"file":"trace-signal-settings.es.js","sources":["../../../../src/ee/signals/settings/trace-signal-settings.tsx"],"sourcesContent":["import type { TraceSignalDefinition } from '@mastra/client-js';\nimport { Settings } from 'lucide-react';\nimport { useState } from 'react';\n\nimport { useTraceIntelligence } from '../use-trace-intelligence';\nimport { SignalDefinitionFormDialog } from './signal-definition-form-dialog';\nimport { useSignalManagementList, useSignalManagementMutations } from './use-signal-management';\nimport { Badge } from '@/ds/components/Badge';\nimport { Button } from '@/ds/components/Button';\nimport { DataDetailsPanel } from '@/ds/components/DataDetailsPanel';\nimport { Notice } from '@/ds/components/Notice';\nimport { Skeleton } from '@/ds/components/Skeleton';\nimport { Switch } from '@/ds/components/Switch';\n\nexport function TraceSignalSettingsButton({ open, onClick }: { open: boolean; onClick: () => void }) {\n const { signalManagement } = useTraceIntelligence();\n if (!signalManagement) return null;\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-md\"\n tooltip=\"Signal settings\"\n aria-label=\"Signal settings\"\n aria-controls=\"trace-signal-settings\"\n aria-expanded={open}\n onClick={onClick}\n >\n <Settings aria-hidden=\"true\" />\n </Button>\n );\n}\n\nexport function TraceSignalSettingsPanel({ onClose }: { onClose: () => void }) {\n return (\n <aside id=\"trace-signal-settings\" aria-label=\"Trace signal settings\" className=\"min-h-0\">\n <DataDetailsPanel>\n <DataDetailsPanel.Header>\n <DataDetailsPanel.Heading className=\"text-neutral5 items-center font-medium\">\n <Settings aria-hidden=\"true\" /> Trace signal settings\n </DataDetailsPanel.Heading>\n <DataDetailsPanel.CloseButton onClick={onClose} tooltip=\"Close settings\" />\n </DataDetailsPanel.Header>\n <DataDetailsPanel.Content>\n <TraceSignalSettingsContent />\n </DataDetailsPanel.Content>\n </DataDetailsPanel>\n </aside>\n );\n}\n\nfunction TraceSignalSettingsContent() {\n const { signalCatalog, signalManagement } = useTraceIntelligence();\n const query = useSignalManagementList();\n const mutations = useSignalManagementMutations();\n const [creating, setCreating] = useState(false);\n const [editing, setEditing] = useState<TraceSignalDefinition>();\n const [actionError, setActionError] = useState<string>();\n const canManage = signalManagement?.canManage ?? false;\n\n if (query.isPending) {\n return (\n <div className=\"space-y-3\" role=\"status\" aria-label=\"Loading signal settings\">\n <Skeleton className=\"h-5 w-40\" />\n <Skeleton className=\"h-16 w-full\" />\n <Skeleton className=\"h-16 w-full\" />\n </div>\n );\n }\n if (query.error || !query.data) {\n return (\n <Notice variant=\"destructive\">\n <Notice.Message>{query.error?.message ?? 'Failed to load signal settings'}</Notice.Message>\n </Notice>\n );\n }\n\n const active = query.data.definitions.filter(definition => definition.status === 'active');\n const archived = query.data.definitions.filter(definition => definition.status === 'archived');\n const limit = query.data.limits.maxDefinitionsPerOrganization;\n const atLimit = active.length >= limit;\n const mutationPending = creating ? mutations.create.isPending : mutations.update.isPending;\n const formError = creating ? mutations.create.error?.message : editing ? mutations.update.error?.message : undefined;\n const openCreateForm = () => {\n mutations.create.reset();\n setCreating(true);\n };\n const setCreateFormOpen = (open: boolean) => {\n if (!open) mutations.create.reset();\n setCreating(open);\n };\n const openEditForm = (definition: TraceSignalDefinition) => {\n mutations.update.reset();\n setEditing(definition);\n };\n const closeEditForm = () => {\n mutations.update.reset();\n setEditing(undefined);\n };\n\n const runAction = async (action: () => Promise<unknown>) => {\n setActionError(undefined);\n try {\n await action();\n } catch (error) {\n setActionError(error instanceof Error ? error.message : 'Failed to update signal settings');\n }\n };\n\n return (\n <div className=\"space-y-6\">\n <div className=\"space-y-2\">\n <div className=\"border-border1 grid gap-2 rounded-md border p-3 sm:grid-cols-2\">\n <div>\n <p className=\"text-ui-sm text-neutral4 font-medium\">Organization signal library</p>\n <p className=\"text-ui-xs text-neutral3\">Definitions, prompts, and versions are shared by every project.</p>\n </div>\n <div>\n <p className=\"text-ui-sm text-neutral4 font-medium\">Current project</p>\n <p className=\"text-ui-xs text-neutral3\">Enable switches apply only to this project.</p>\n </div>\n </div>\n {!canManage ? (\n <Notice variant=\"info\">\n <Notice.Message>You have read-only access. An organization admin can change these settings.</Notice.Message>\n </Notice>\n ) : null}\n {actionError ? (\n <Notice variant=\"destructive\">\n <Notice.Message>{actionError}</Notice.Message>\n </Notice>\n ) : null}\n </div>\n\n <section aria-labelledby=\"built-in-signals-heading\">\n <h3 id=\"built-in-signals-heading\" className=\"text-ui-md text-neutral4 mb-2 font-medium\">\n Built-in signals\n </h3>\n <div className=\"divide-border1 border-border1 divide-y rounded-md border px-3\">\n {signalCatalog\n .filter(signal => signal.builtIn)\n .map(signal => (\n <div key={signal.name} className=\"flex min-h-12 items-center justify-between gap-3 py-2\">\n <div className=\"min-w-0\">\n <p className=\"text-ui-sm text-neutral4\">{signal.label}</p>\n <p className=\"text-ui-xs text-neutral3 truncate\">{signal.description}</p>\n </div>\n <Badge variant=\"neutral\" size=\"sm\">\n Read only\n </Badge>\n </div>\n ))}\n </div>\n </section>\n\n <section aria-labelledby=\"custom-signals-heading\">\n <div className=\"mb-2 flex flex-wrap items-center justify-between gap-3\">\n <div>\n <h3 id=\"custom-signals-heading\" className=\"text-ui-md text-neutral4 font-medium\">\n Custom signals\n </h3>\n <p className=\"text-ui-xs text-neutral3\">\n {active.length} of {limit} active organization definitions\n </p>\n </div>\n <Button size=\"sm\" variant=\"primary\" disabled={!canManage || atLimit} onClick={openCreateForm}>\n Create signal\n </Button>\n </div>\n {atLimit ? (\n <Notice variant=\"info\">\n <Notice.Message>Archive an active definition before creating or restoring another.</Notice.Message>\n </Notice>\n ) : null}\n <div className=\"divide-border1 divide-y\">\n {active.map(definition => (\n <div key={definition.id} className=\"flex min-h-16 items-center justify-between gap-4 py-2\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-ui-sm text-neutral4 truncate\">{definition.displayLabel}</span>\n <Badge variant=\"neutral\" size=\"sm\">\n v{definition.version}\n </Badge>\n </div>\n <p className=\"text-ui-xs text-neutral3 truncate\">{definition.description || definition.name}</p>\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <Button size=\"sm\" variant=\"ghost\" disabled={!canManage} onClick={() => openEditForm(definition)}>\n Edit\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={\n !canManage || (mutations.archive.isPending && mutations.archive.variables === definition.id)\n }\n onClick={() => void runAction(() => mutations.archive.mutateAsync(definition.id))}\n >\n Archive\n </Button>\n <Switch\n aria-label={`Enable ${definition.displayLabel}`}\n checked={definition.enabled ?? false}\n disabled={\n !canManage ||\n (mutations.setProjectEnabled.isPending &&\n mutations.setProjectEnabled.variables?.id === definition.id)\n }\n onCheckedChange={enabled =>\n void runAction(() => mutations.setProjectEnabled.mutateAsync({ id: definition.id, enabled }))\n }\n />\n </div>\n </div>\n ))}\n </div>\n {active.length === 0 ? <p className=\"text-ui-sm text-neutral3 py-3\">No custom signals yet.</p> : null}\n </section>\n\n {archived.length > 0 ? (\n <details>\n <summary className=\"text-ui-sm text-neutral4 cursor-pointer\">\n Archived definitions ({archived.length})\n </summary>\n <div className=\"divide-border1 mt-2 divide-y\">\n {archived.map(definition => (\n <div key={definition.id} className=\"flex min-h-12 items-center justify-between gap-3 py-2\">\n <span className=\"text-ui-sm text-neutral3\">{definition.displayLabel}</span>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={\n !canManage ||\n atLimit ||\n (mutations.restore.isPending && mutations.restore.variables === definition.id)\n }\n onClick={() => void runAction(() => mutations.restore.mutateAsync(definition.id))}\n >\n Restore\n </Button>\n </div>\n ))}\n </div>\n </details>\n ) : null}\n\n <p className=\"text-ui-xs text-neutral3\">\n Enabling a signal starts collection for new traces. Entity status shows when enough generated data has been\n processed and clustered.\n </p>\n\n {creating ? (\n <SignalDefinitionFormDialog\n open\n onOpenChange={setCreateFormOpen}\n pending={mutationPending}\n error={formError}\n onCreate={async input => {\n await mutations.create.mutateAsync(input);\n }}\n onUpdate={async () => undefined}\n />\n ) : null}\n {editing ? (\n <SignalDefinitionFormDialog\n open\n definition={editing}\n onOpenChange={open => {\n if (!open) closeEditForm();\n }}\n pending={mutationPending}\n error={formError}\n onCreate={async () => undefined}\n onUpdate={async (id, input) => {\n await mutations.update.mutateAsync({ id, input });\n }}\n />\n ) : null}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trace-signal-settings.es.js","sources":["../../../../src/ee/signals/settings/trace-signal-settings.tsx"],"sourcesContent":["import type { TraceSignalDefinition } from '@mastra/client-js';\nimport { Settings } from 'lucide-react';\nimport { useState } from 'react';\n\nimport { useTraceIntelligence } from '../use-trace-intelligence';\nimport { SignalDefinitionFormDialog } from './signal-definition-form-dialog';\nimport { useSignalManagementList, useSignalManagementMutations } from './use-signal-management';\nimport { Badge } from '@/ds/components/Badge';\nimport { Button } from '@/ds/components/Button';\nimport { DataDetailsPanel } from '@/ds/components/DataDetailsPanel';\nimport { Notice } from '@/ds/components/Notice';\nimport { Skeleton } from '@/ds/components/Skeleton';\nimport { Switch } from '@/ds/components/Switch';\n\nexport function TraceSignalSettingsButton({ open, onClick }: { open: boolean; onClick: () => void }) {\n const { signalManagement } = useTraceIntelligence();\n if (!signalManagement) return null;\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-md\"\n tooltip=\"Signal settings\"\n aria-label=\"Signal settings\"\n aria-controls=\"trace-signal-settings\"\n aria-expanded={open}\n onClick={onClick}\n >\n <Settings aria-hidden=\"true\" />\n </Button>\n );\n}\n\nexport function TraceSignalSettingsPanel({ onClose }: { onClose: () => void }) {\n return (\n <aside id=\"trace-signal-settings\" aria-label=\"Trace signal settings\" className=\"min-h-0\">\n <DataDetailsPanel>\n <DataDetailsPanel.Header>\n <DataDetailsPanel.Heading className=\"text-neutral5 items-center font-medium\">\n <Settings aria-hidden=\"true\" /> Trace signal settings\n </DataDetailsPanel.Heading>\n <DataDetailsPanel.CloseButton onClick={onClose} tooltip=\"Close settings\" />\n </DataDetailsPanel.Header>\n <DataDetailsPanel.Content>\n <TraceSignalSettingsContent />\n </DataDetailsPanel.Content>\n </DataDetailsPanel>\n </aside>\n );\n}\n\nfunction TraceSignalSettingsContent() {\n const { signalManagement } = useTraceIntelligence();\n const query = useSignalManagementList();\n const mutations = useSignalManagementMutations();\n const [creating, setCreating] = useState(false);\n const [editing, setEditing] = useState<TraceSignalDefinition>();\n const [actionError, setActionError] = useState<string>();\n const canManage = signalManagement?.canManage ?? false;\n\n if (query.isPending) {\n return (\n <div className=\"space-y-3\" role=\"status\" aria-label=\"Loading signal settings\">\n <Skeleton className=\"h-5 w-40\" />\n <Skeleton className=\"h-16 w-full\" />\n <Skeleton className=\"h-16 w-full\" />\n </div>\n );\n }\n if (query.error || !query.data) {\n return (\n <Notice variant=\"destructive\">\n <Notice.Message>{query.error?.message ?? 'Failed to load signal settings'}</Notice.Message>\n </Notice>\n );\n }\n\n const active = query.data.definitions.filter(definition => definition.status === 'active');\n const archived = query.data.definitions.filter(definition => definition.status === 'archived');\n const limit = query.data.limits.maxDefinitionsPerOrganization;\n const atLimit = active.length >= limit;\n const mutationPending = creating ? mutations.create.isPending : mutations.update.isPending;\n const formError = creating ? mutations.create.error?.message : editing ? mutations.update.error?.message : undefined;\n const openCreateForm = () => {\n mutations.create.reset();\n setCreating(true);\n };\n const setCreateFormOpen = (open: boolean) => {\n if (!open) mutations.create.reset();\n setCreating(open);\n };\n const openEditForm = (definition: TraceSignalDefinition) => {\n mutations.update.reset();\n setEditing(definition);\n };\n const closeEditForm = () => {\n mutations.update.reset();\n setEditing(undefined);\n };\n\n const runAction = async (action: () => Promise<unknown>) => {\n setActionError(undefined);\n try {\n await action();\n } catch (error) {\n setActionError(error instanceof Error ? error.message : 'Failed to update signal settings');\n }\n };\n\n return (\n <div className=\"space-y-6\">\n {!canManage ? (\n <Notice variant=\"info\">\n <Notice.Message>You have read-only access. An organization admin can change these settings.</Notice.Message>\n </Notice>\n ) : null}\n {actionError ? (\n <Notice variant=\"destructive\">\n <Notice.Message>{actionError}</Notice.Message>\n </Notice>\n ) : null}\n\n <section aria-labelledby=\"custom-signals-heading\">\n <div className=\"mb-2 flex flex-wrap items-center justify-between gap-3\">\n <div>\n <h3 id=\"custom-signals-heading\" className=\"text-ui-md text-neutral4 font-medium\">\n Custom signals\n </h3>\n <p className=\"text-ui-xs text-neutral3\">\n {active.length} of {limit} active organization definitions\n </p>\n </div>\n <Button size=\"sm\" variant=\"primary\" disabled={!canManage || atLimit} onClick={openCreateForm}>\n Create signal\n </Button>\n </div>\n {atLimit ? (\n <Notice variant=\"info\">\n <Notice.Message>Archive an active definition before creating or restoring another.</Notice.Message>\n </Notice>\n ) : null}\n <div className=\"divide-border1 divide-y\">\n {active.map(definition => (\n <div key={definition.id} className=\"flex min-h-16 items-center justify-between gap-4 py-2\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-ui-sm text-neutral4 truncate\">{definition.displayLabel}</span>\n <Badge variant=\"neutral\" size=\"sm\">\n v{definition.version}\n </Badge>\n </div>\n <p className=\"text-ui-xs text-neutral3 truncate\">{definition.description || definition.name}</p>\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <Button size=\"sm\" variant=\"ghost\" disabled={!canManage} onClick={() => openEditForm(definition)}>\n Edit\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={\n !canManage || (mutations.archive.isPending && mutations.archive.variables === definition.id)\n }\n onClick={() => void runAction(() => mutations.archive.mutateAsync(definition.id))}\n >\n Archive\n </Button>\n <Switch\n aria-label={`Enable ${definition.displayLabel}`}\n checked={definition.enabled ?? false}\n disabled={\n !canManage ||\n (mutations.setProjectEnabled.isPending &&\n mutations.setProjectEnabled.variables?.id === definition.id)\n }\n onCheckedChange={enabled =>\n void runAction(() => mutations.setProjectEnabled.mutateAsync({ id: definition.id, enabled }))\n }\n />\n </div>\n </div>\n ))}\n </div>\n {active.length === 0 ? <p className=\"text-ui-sm text-neutral3 py-3\">No custom signals yet.</p> : null}\n </section>\n\n {archived.length > 0 ? (\n <details>\n <summary className=\"text-ui-sm text-neutral4 cursor-pointer\">\n Archived definitions ({archived.length})\n </summary>\n <div className=\"divide-border1 mt-2 divide-y\">\n {archived.map(definition => (\n <div key={definition.id} className=\"flex min-h-12 items-center justify-between gap-3 py-2\">\n <span className=\"text-ui-sm text-neutral3\">{definition.displayLabel}</span>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={\n !canManage ||\n atLimit ||\n (mutations.restore.isPending && mutations.restore.variables === definition.id)\n }\n onClick={() => void runAction(() => mutations.restore.mutateAsync(definition.id))}\n >\n Restore\n </Button>\n </div>\n ))}\n </div>\n </details>\n ) : null}\n\n <p className=\"text-ui-xs text-neutral3\">\n Enabling a signal starts collection for new traces. Entity status shows when enough generated data has been\n processed and clustered.\n </p>\n\n {creating ? (\n <SignalDefinitionFormDialog\n open\n onOpenChange={setCreateFormOpen}\n pending={mutationPending}\n error={formError}\n onCreate={async input => {\n await mutations.create.mutateAsync(input);\n }}\n onUpdate={async () => undefined}\n />\n ) : null}\n {editing ? (\n <SignalDefinitionFormDialog\n open\n definition={editing}\n onOpenChange={open => {\n if (!open) closeEditForm();\n }}\n pending={mutationPending}\n error={formError}\n onCreate={async () => undefined}\n onUpdate={async (id, input) => {\n await mutations.update.mutateAsync({ id, input });\n }}\n />\n ) : null}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -27,7 +27,7 @@ function TraceIntelligenceExplainer({ signalCatalog }) {
27
27
  ),
28
28
  /* @__PURE__ */ jsxRuntime.jsxs(tooltip.TooltipContent, { className: "max-w-sm space-y-3 p-4 text-xs", children: [
29
29
  /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-neutral5", children: [
30
- "Every trace from this agent is analyzed for ",
30
+ "Every trace is analyzed for ",
31
31
  enabledSignals.length === 4 ? "four" : enabledSignals.length,
32
32
  " ",
33
33
  enabledSignals.length === 1 ? "signal" : "signals",
@@ -1 +1 @@
1
- {"version":3,"file":"trace-intelligence-explainer.cjs.js","sources":["../../../src/ee/signals/trace-intelligence-explainer.tsx"],"sourcesContent":["import type { SignalCatalogEntry } from '@mastra/client-js';\nimport { Info } from 'lucide-react';\nimport { getSignalHue } from './signal-colors';\nimport { orderedSignals, signalDescription, signalLabel } from './signal-formatting';\nimport { nodeColor } from '@/ds/components/SankeyChart';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/ds/components/Tooltip';\nimport { Icon } from '@/ds/icons/Icon';\n\n/** Info tooltip for first-time viewers: signals → themes → snapshots. */\nexport function TraceIntelligenceExplainer({ signalCatalog }: { signalCatalog: readonly SignalCatalogEntry[] }) {\n const enabledSignals = orderedSignals(\n signalCatalog,\n signalCatalog.filter(signal => signal.enabled).map(signal => signal.name),\n );\n return (\n <Tooltip>\n <TooltipTrigger\n aria-label=\"What is trace intelligence?\"\n className=\"text-neutral3 hover:text-neutral6 flex cursor-help items-center transition-colors\"\n type=\"button\"\n >\n <Icon size=\"sm\">\n <Info />\n </Icon>\n </TooltipTrigger>\n <TooltipContent className=\"max-w-sm space-y-3 p-4 text-xs\">\n <p className=\"text-neutral5\">\n Every trace from this agent is analyzed for {enabledSignals.length === 4 ? 'four' : enabledSignals.length}{' '}\n {enabledSignals.length === 1 ? 'signal' : 'signals'}, and traces with similar signals are clustered into named\n themes.\n </p>\n <ul className=\"space-y-1.5\">\n {enabledSignals.map(signalName => (\n <li key={signalName} className=\"text-neutral4\">\n <span\n className=\"font-mono text-[10px] font-semibold tracking-widest uppercase\"\n style={{ color: nodeColor(getSignalHue(signalName)) }}\n >\n {signalLabel(signalCatalog, signalName)}\n </span>{' '}\n — {signalDescription(signalCatalog, signalName)}\n </li>\n ))}\n </ul>\n <p className=\"text-neutral4\">\n Snapshots capture the themes at points in time, so the views show how they appear, grow, and fade.\n </p>\n </TooltipContent>\n </Tooltip>\n );\n}\n"],"names":["orderedSignals","Tooltip","jsx","TooltipTrigger","Icon","Info","jsxs","TooltipContent","nodeColor","getSignalHue","signalLabel","signalDescription"],"mappings":";;;;;;;;;;;;AASO,SAAS,0BAAA,CAA2B,EAAE,aAAA,EAAc,EAAqD;AAC9G,EAAA,MAAM,cAAA,GAAiBA,0CAAA;AAAA,IACrB,aAAA;AAAA,IACA,aAAA,CAAc,OAAO,CAAA,MAAA,KAAU,MAAA,CAAO,OAAO,CAAA,CAAE,GAAA,CAAI,CAAA,MAAA,KAAU,MAAA,CAAO,IAAI;AAAA,GAC1E;AACA,EAAA,uCACGC,eAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAC,cAAA;AAAA,MAACC,sBAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,6BAAA;AAAA,QACX,SAAA,EAAU,mFAAA;AAAA,QACV,IAAA,EAAK,QAAA;AAAA,QAEL,yCAACC,eAAA,EAAA,EAAK,IAAA,EAAK,IAAA,EACT,QAAA,kBAAAF,cAAA,CAACG,oBAAK,CAAA,EACR;AAAA;AAAA,KACF;AAAA,oBACAC,eAAA,CAACC,sBAAA,EAAA,EAAe,SAAA,EAAU,gCAAA,EACxB,QAAA,EAAA;AAAA,sBAAAD,eAAA,CAAC,GAAA,EAAA,EAAE,WAAU,eAAA,EAAgB,QAAA,EAAA;AAAA,QAAA,8CAAA;AAAA,QACkB,cAAA,CAAe,MAAA,KAAW,CAAA,GAAI,MAAA,GAAS,cAAA,CAAe,MAAA;AAAA,QAAQ,GAAA;AAAA,QAC1G,cAAA,CAAe,MAAA,KAAW,CAAA,GAAI,QAAA,GAAW,SAAA;AAAA,QAAU;AAAA,OAAA,EAEtD,CAAA;AAAA,sBACAJ,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,aAAA,EACX,QAAA,EAAA,cAAA,CAAe,IAAI,CAAA,UAAA,qBAClBI,eAAA,CAAC,IAAA,EAAA,EAAoB,SAAA,EAAU,eAAA,EAC7B,QAAA,EAAA;AAAA,wBAAAJ,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,+DAAA;AAAA,YACV,OAAO,EAAE,KAAA,EAAOM,sBAAUC,oCAAA,CAAa,UAAU,CAAC,CAAA,EAAE;AAAA,YAEnD,QAAA,EAAAC,uCAAA,CAAY,eAAe,UAAU;AAAA;AAAA,SACxC;AAAA,QAAQ,GAAA;AAAA,QAAI,IAAA;AAAA,QACTC,6CAAA,CAAkB,eAAe,UAAU;AAAA,OAAA,EAAA,EAPvC,UAQT,CACD,CAAA,EACH,CAAA;AAAA,sBACAT,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,eAAA,EAAgB,QAAA,EAAA,oGAAA,EAE7B;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"trace-intelligence-explainer.cjs.js","sources":["../../../src/ee/signals/trace-intelligence-explainer.tsx"],"sourcesContent":["import type { SignalCatalogEntry } from '@mastra/client-js';\nimport { Info } from 'lucide-react';\nimport { getSignalHue } from './signal-colors';\nimport { orderedSignals, signalDescription, signalLabel } from './signal-formatting';\nimport { nodeColor } from '@/ds/components/SankeyChart';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/ds/components/Tooltip';\nimport { Icon } from '@/ds/icons/Icon';\n\n/** Info tooltip for first-time viewers: signals → themes → snapshots. */\nexport function TraceIntelligenceExplainer({ signalCatalog }: { signalCatalog: readonly SignalCatalogEntry[] }) {\n const enabledSignals = orderedSignals(\n signalCatalog,\n signalCatalog.filter(signal => signal.enabled).map(signal => signal.name),\n );\n return (\n <Tooltip>\n <TooltipTrigger\n aria-label=\"What is trace intelligence?\"\n className=\"text-neutral3 hover:text-neutral6 flex cursor-help items-center transition-colors\"\n type=\"button\"\n >\n <Icon size=\"sm\">\n <Info />\n </Icon>\n </TooltipTrigger>\n <TooltipContent className=\"max-w-sm space-y-3 p-4 text-xs\">\n <p className=\"text-neutral5\">\n Every trace is analyzed for {enabledSignals.length === 4 ? 'four' : enabledSignals.length}{' '}\n {enabledSignals.length === 1 ? 'signal' : 'signals'}, and traces with similar signals are clustered into named\n themes.\n </p>\n <ul className=\"space-y-1.5\">\n {enabledSignals.map(signalName => (\n <li key={signalName} className=\"text-neutral4\">\n <span\n className=\"font-mono text-[10px] font-semibold tracking-widest uppercase\"\n style={{ color: nodeColor(getSignalHue(signalName)) }}\n >\n {signalLabel(signalCatalog, signalName)}\n </span>{' '}\n — {signalDescription(signalCatalog, signalName)}\n </li>\n ))}\n </ul>\n <p className=\"text-neutral4\">\n Snapshots capture the themes at points in time, so the views show how they appear, grow, and fade.\n </p>\n </TooltipContent>\n </Tooltip>\n );\n}\n"],"names":["orderedSignals","Tooltip","jsx","TooltipTrigger","Icon","Info","jsxs","TooltipContent","nodeColor","getSignalHue","signalLabel","signalDescription"],"mappings":";;;;;;;;;;;;AASO,SAAS,0BAAA,CAA2B,EAAE,aAAA,EAAc,EAAqD;AAC9G,EAAA,MAAM,cAAA,GAAiBA,0CAAA;AAAA,IACrB,aAAA;AAAA,IACA,aAAA,CAAc,OAAO,CAAA,MAAA,KAAU,MAAA,CAAO,OAAO,CAAA,CAAE,GAAA,CAAI,CAAA,MAAA,KAAU,MAAA,CAAO,IAAI;AAAA,GAC1E;AACA,EAAA,uCACGC,eAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAC,cAAA;AAAA,MAACC,sBAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,6BAAA;AAAA,QACX,SAAA,EAAU,mFAAA;AAAA,QACV,IAAA,EAAK,QAAA;AAAA,QAEL,yCAACC,eAAA,EAAA,EAAK,IAAA,EAAK,IAAA,EACT,QAAA,kBAAAF,cAAA,CAACG,oBAAK,CAAA,EACR;AAAA;AAAA,KACF;AAAA,oBACAC,eAAA,CAACC,sBAAA,EAAA,EAAe,SAAA,EAAU,gCAAA,EACxB,QAAA,EAAA;AAAA,sBAAAD,eAAA,CAAC,GAAA,EAAA,EAAE,WAAU,eAAA,EAAgB,QAAA,EAAA;AAAA,QAAA,8BAAA;AAAA,QACE,cAAA,CAAe,MAAA,KAAW,CAAA,GAAI,MAAA,GAAS,cAAA,CAAe,MAAA;AAAA,QAAQ,GAAA;AAAA,QAC1F,cAAA,CAAe,MAAA,KAAW,CAAA,GAAI,QAAA,GAAW,SAAA;AAAA,QAAU;AAAA,OAAA,EAEtD,CAAA;AAAA,sBACAJ,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,aAAA,EACX,QAAA,EAAA,cAAA,CAAe,IAAI,CAAA,UAAA,qBAClBI,eAAA,CAAC,IAAA,EAAA,EAAoB,SAAA,EAAU,eAAA,EAC7B,QAAA,EAAA;AAAA,wBAAAJ,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,+DAAA;AAAA,YACV,OAAO,EAAE,KAAA,EAAOM,sBAAUC,oCAAA,CAAa,UAAU,CAAC,CAAA,EAAE;AAAA,YAEnD,QAAA,EAAAC,uCAAA,CAAY,eAAe,UAAU;AAAA;AAAA,SACxC;AAAA,QAAQ,GAAA;AAAA,QAAI,IAAA;AAAA,QACTC,6CAAA,CAAkB,eAAe,UAAU;AAAA,OAAA,EAAA,EAPvC,UAQT,CACD,CAAA,EACH,CAAA;AAAA,sBACAT,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,eAAA,EAAgB,QAAA,EAAA,oGAAA,EAE7B;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -23,7 +23,7 @@ function TraceIntelligenceExplainer({ signalCatalog }) {
23
23
  ),
24
24
  /* @__PURE__ */ jsxs(TooltipContent, { className: "max-w-sm space-y-3 p-4 text-xs", children: [
25
25
  /* @__PURE__ */ jsxs("p", { className: "text-neutral5", children: [
26
- "Every trace from this agent is analyzed for ",
26
+ "Every trace is analyzed for ",
27
27
  enabledSignals.length === 4 ? "four" : enabledSignals.length,
28
28
  " ",
29
29
  enabledSignals.length === 1 ? "signal" : "signals",
@@ -1 +1 @@
1
- {"version":3,"file":"trace-intelligence-explainer.es.js","sources":["../../../src/ee/signals/trace-intelligence-explainer.tsx"],"sourcesContent":["import type { SignalCatalogEntry } from '@mastra/client-js';\nimport { Info } from 'lucide-react';\nimport { getSignalHue } from './signal-colors';\nimport { orderedSignals, signalDescription, signalLabel } from './signal-formatting';\nimport { nodeColor } from '@/ds/components/SankeyChart';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/ds/components/Tooltip';\nimport { Icon } from '@/ds/icons/Icon';\n\n/** Info tooltip for first-time viewers: signals → themes → snapshots. */\nexport function TraceIntelligenceExplainer({ signalCatalog }: { signalCatalog: readonly SignalCatalogEntry[] }) {\n const enabledSignals = orderedSignals(\n signalCatalog,\n signalCatalog.filter(signal => signal.enabled).map(signal => signal.name),\n );\n return (\n <Tooltip>\n <TooltipTrigger\n aria-label=\"What is trace intelligence?\"\n className=\"text-neutral3 hover:text-neutral6 flex cursor-help items-center transition-colors\"\n type=\"button\"\n >\n <Icon size=\"sm\">\n <Info />\n </Icon>\n </TooltipTrigger>\n <TooltipContent className=\"max-w-sm space-y-3 p-4 text-xs\">\n <p className=\"text-neutral5\">\n Every trace from this agent is analyzed for {enabledSignals.length === 4 ? 'four' : enabledSignals.length}{' '}\n {enabledSignals.length === 1 ? 'signal' : 'signals'}, and traces with similar signals are clustered into named\n themes.\n </p>\n <ul className=\"space-y-1.5\">\n {enabledSignals.map(signalName => (\n <li key={signalName} className=\"text-neutral4\">\n <span\n className=\"font-mono text-[10px] font-semibold tracking-widest uppercase\"\n style={{ color: nodeColor(getSignalHue(signalName)) }}\n >\n {signalLabel(signalCatalog, signalName)}\n </span>{' '}\n — {signalDescription(signalCatalog, signalName)}\n </li>\n ))}\n </ul>\n <p className=\"text-neutral4\">\n Snapshots capture the themes at points in time, so the views show how they appear, grow, and fade.\n </p>\n </TooltipContent>\n </Tooltip>\n );\n}\n"],"names":[],"mappings":";;;;;;;;AASO,SAAS,0BAAA,CAA2B,EAAE,aAAA,EAAc,EAAqD;AAC9G,EAAA,MAAM,cAAA,GAAiB,cAAA;AAAA,IACrB,aAAA;AAAA,IACA,aAAA,CAAc,OAAO,CAAA,MAAA,KAAU,MAAA,CAAO,OAAO,CAAA,CAAE,GAAA,CAAI,CAAA,MAAA,KAAU,MAAA,CAAO,IAAI;AAAA,GAC1E;AACA,EAAA,4BACG,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,6BAAA;AAAA,QACX,SAAA,EAAU,mFAAA;AAAA,QACV,IAAA,EAAK,QAAA;AAAA,QAEL,8BAAC,IAAA,EAAA,EAAK,IAAA,EAAK,IAAA,EACT,QAAA,kBAAA,GAAA,CAAC,QAAK,CAAA,EACR;AAAA;AAAA,KACF;AAAA,oBACA,IAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,gCAAA,EACxB,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,GAAA,EAAA,EAAE,WAAU,eAAA,EAAgB,QAAA,EAAA;AAAA,QAAA,8CAAA;AAAA,QACkB,cAAA,CAAe,MAAA,KAAW,CAAA,GAAI,MAAA,GAAS,cAAA,CAAe,MAAA;AAAA,QAAQ,GAAA;AAAA,QAC1G,cAAA,CAAe,MAAA,KAAW,CAAA,GAAI,QAAA,GAAW,SAAA;AAAA,QAAU;AAAA,OAAA,EAEtD,CAAA;AAAA,sBACA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,aAAA,EACX,QAAA,EAAA,cAAA,CAAe,IAAI,CAAA,UAAA,qBAClB,IAAA,CAAC,IAAA,EAAA,EAAoB,SAAA,EAAU,eAAA,EAC7B,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,+DAAA;AAAA,YACV,OAAO,EAAE,KAAA,EAAO,UAAU,YAAA,CAAa,UAAU,CAAC,CAAA,EAAE;AAAA,YAEnD,QAAA,EAAA,WAAA,CAAY,eAAe,UAAU;AAAA;AAAA,SACxC;AAAA,QAAQ,GAAA;AAAA,QAAI,IAAA;AAAA,QACT,iBAAA,CAAkB,eAAe,UAAU;AAAA,OAAA,EAAA,EAPvC,UAQT,CACD,CAAA,EACH,CAAA;AAAA,sBACA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,eAAA,EAAgB,QAAA,EAAA,oGAAA,EAE7B;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"trace-intelligence-explainer.es.js","sources":["../../../src/ee/signals/trace-intelligence-explainer.tsx"],"sourcesContent":["import type { SignalCatalogEntry } from '@mastra/client-js';\nimport { Info } from 'lucide-react';\nimport { getSignalHue } from './signal-colors';\nimport { orderedSignals, signalDescription, signalLabel } from './signal-formatting';\nimport { nodeColor } from '@/ds/components/SankeyChart';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/ds/components/Tooltip';\nimport { Icon } from '@/ds/icons/Icon';\n\n/** Info tooltip for first-time viewers: signals → themes → snapshots. */\nexport function TraceIntelligenceExplainer({ signalCatalog }: { signalCatalog: readonly SignalCatalogEntry[] }) {\n const enabledSignals = orderedSignals(\n signalCatalog,\n signalCatalog.filter(signal => signal.enabled).map(signal => signal.name),\n );\n return (\n <Tooltip>\n <TooltipTrigger\n aria-label=\"What is trace intelligence?\"\n className=\"text-neutral3 hover:text-neutral6 flex cursor-help items-center transition-colors\"\n type=\"button\"\n >\n <Icon size=\"sm\">\n <Info />\n </Icon>\n </TooltipTrigger>\n <TooltipContent className=\"max-w-sm space-y-3 p-4 text-xs\">\n <p className=\"text-neutral5\">\n Every trace is analyzed for {enabledSignals.length === 4 ? 'four' : enabledSignals.length}{' '}\n {enabledSignals.length === 1 ? 'signal' : 'signals'}, and traces with similar signals are clustered into named\n themes.\n </p>\n <ul className=\"space-y-1.5\">\n {enabledSignals.map(signalName => (\n <li key={signalName} className=\"text-neutral4\">\n <span\n className=\"font-mono text-[10px] font-semibold tracking-widest uppercase\"\n style={{ color: nodeColor(getSignalHue(signalName)) }}\n >\n {signalLabel(signalCatalog, signalName)}\n </span>{' '}\n — {signalDescription(signalCatalog, signalName)}\n </li>\n ))}\n </ul>\n <p className=\"text-neutral4\">\n Snapshots capture the themes at points in time, so the views show how they appear, grow, and fade.\n </p>\n </TooltipContent>\n </Tooltip>\n );\n}\n"],"names":[],"mappings":";;;;;;;;AASO,SAAS,0BAAA,CAA2B,EAAE,aAAA,EAAc,EAAqD;AAC9G,EAAA,MAAM,cAAA,GAAiB,cAAA;AAAA,IACrB,aAAA;AAAA,IACA,aAAA,CAAc,OAAO,CAAA,MAAA,KAAU,MAAA,CAAO,OAAO,CAAA,CAAE,GAAA,CAAI,CAAA,MAAA,KAAU,MAAA,CAAO,IAAI;AAAA,GAC1E;AACA,EAAA,4BACG,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,6BAAA;AAAA,QACX,SAAA,EAAU,mFAAA;AAAA,QACV,IAAA,EAAK,QAAA;AAAA,QAEL,8BAAC,IAAA,EAAA,EAAK,IAAA,EAAK,IAAA,EACT,QAAA,kBAAA,GAAA,CAAC,QAAK,CAAA,EACR;AAAA;AAAA,KACF;AAAA,oBACA,IAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,gCAAA,EACxB,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,GAAA,EAAA,EAAE,WAAU,eAAA,EAAgB,QAAA,EAAA;AAAA,QAAA,8BAAA;AAAA,QACE,cAAA,CAAe,MAAA,KAAW,CAAA,GAAI,MAAA,GAAS,cAAA,CAAe,MAAA;AAAA,QAAQ,GAAA;AAAA,QAC1F,cAAA,CAAe,MAAA,KAAW,CAAA,GAAI,QAAA,GAAW,SAAA;AAAA,QAAU;AAAA,OAAA,EAEtD,CAAA;AAAA,sBACA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,aAAA,EACX,QAAA,EAAA,cAAA,CAAe,IAAI,CAAA,UAAA,qBAClB,IAAA,CAAC,IAAA,EAAA,EAAoB,SAAA,EAAU,eAAA,EAC7B,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,+DAAA;AAAA,YACV,OAAO,EAAE,KAAA,EAAO,UAAU,YAAA,CAAa,UAAU,CAAC,CAAA,EAAE;AAAA,YAEnD,QAAA,EAAA,WAAA,CAAY,eAAe,UAAU;AAAA;AAAA,SACxC;AAAA,QAAQ,GAAA;AAAA,QAAI,IAAA;AAAA,QACT,iBAAA,CAAkB,eAAe,UAAU;AAAA,OAAA,EAAA,EAPvC,UAQT,CACD,CAAA,EACH,CAAA;AAAA,sBACA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,eAAA,EAAgB,QAAA,EAAA,oGAAA,EAE7B;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -4,18 +4,21 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
5
  const React = require('react');
6
6
 
7
- const useInView = () => {
7
+ const useInView = ({ root } = {}) => {
8
8
  const [inView, setInView] = React.useState(false);
9
- const setRef = React.useCallback((node) => {
10
- if (node) {
11
- const observer = new IntersectionObserver(([entry]) => {
9
+ const [node, setRef] = React.useState(null);
10
+ React.useEffect(() => {
11
+ if (!node) return;
12
+ const observer = new IntersectionObserver(
13
+ ([entry]) => {
12
14
  if (!entry) return;
13
15
  setInView(entry.isIntersecting);
14
- });
15
- observer.observe(node);
16
- return () => observer.disconnect();
17
- }
18
- }, []);
16
+ },
17
+ { root: root?.current ?? null }
18
+ );
19
+ observer.observe(node);
20
+ return () => observer.disconnect();
21
+ }, [node, root]);
19
22
  return { inView, setRef };
20
23
  };
21
24
 
@@ -1 +1 @@
1
- {"version":3,"file":"use-in-view.cjs.js","sources":["../../src/hooks/use-in-view.ts"],"sourcesContent":["import { useCallback, useState } from 'react';\n\n/**\n * Tracks whether or not the given element is currently in view.\n * This is to replace framer-motion's `useInView` which has issues\n * tracking a ref that is set at a time other than mount.\n */\nexport const useInView = () => {\n const [inView, setInView] = useState(false);\n\n const setRef = useCallback((node: HTMLDivElement | null) => {\n if (node) {\n const observer = new IntersectionObserver(([entry]) => {\n if (!entry) return;\n setInView(entry.isIntersecting);\n });\n observer.observe(node);\n return () => observer.disconnect();\n }\n }, []);\n\n return { inView, setRef };\n};\n"],"names":["useState","useCallback"],"mappings":";;;;;;AAOO,MAAM,YAAY,MAAM;AAC7B,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,KAAK,CAAA;AAE1C,EAAA,MAAM,MAAA,GAASC,iBAAA,CAAY,CAAC,IAAA,KAAgC;AAC1D,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,WAAW,IAAI,oBAAA,CAAqB,CAAC,CAAC,KAAK,CAAA,KAAM;AACrD,QAAA,IAAI,CAAC,KAAA,EAAO;AACZ,QAAA,SAAA,CAAU,MAAM,cAAc,CAAA;AAAA,MAChC,CAAC,CAAA;AACD,MAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AACrB,MAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,IACnC;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,QAAQ,MAAA,EAAO;AAC1B;;;;"}
1
+ {"version":3,"file":"use-in-view.cjs.js","sources":["../../src/hooks/use-in-view.ts"],"sourcesContent":["import type { RefObject } from 'react';\nimport { useEffect, useState } from 'react';\n\nexport type UseInViewOptions = {\n /**\n * Scroll container to observe against. When omitted, the browser viewport is used.\n * Pass the list's own scroll viewport so the sentinel only fires when scrolled\n * into view inside that container.\n */\n root?: RefObject<HTMLElement | null>;\n};\n\n/**\n * Tracks whether or not the given element is currently in view.\n * This is to replace framer-motion's `useInView` which has issues\n * tracking a ref that is set at a time other than mount.\n *\n * The observer is created in an effect (not in the callback ref) so that an\n * ancestor `root` ref, which React assigns after descendant refs, is already\n * populated when the observer is constructed.\n */\nexport const useInView = ({ root }: UseInViewOptions = {}) => {\n const [inView, setInView] = useState(false);\n const [node, setRef] = useState<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!node) return;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (!entry) return;\n setInView(entry.isIntersecting);\n },\n { root: root?.current ?? null },\n );\n observer.observe(node);\n return () => observer.disconnect();\n }, [node, root]);\n\n return { inView, setRef };\n};\n"],"names":["useState","useEffect"],"mappings":";;;;;;AAqBO,MAAM,YAAY,CAAC,EAAE,IAAA,EAAK,GAAsB,EAAC,KAAM;AAC5D,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,IAAA,EAAM,MAAM,CAAA,GAAIA,eAAgC,IAAI,CAAA;AAE3D,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,WAAW,IAAI,oBAAA;AAAA,MACnB,CAAC,CAAC,KAAK,CAAA,KAAM;AACX,QAAA,IAAI,CAAC,KAAA,EAAO;AACZ,QAAA,SAAA,CAAU,MAAM,cAAc,CAAA;AAAA,MAChC,CAAA;AAAA,MACA,EAAE,IAAA,EAAM,IAAA,EAAM,OAAA,IAAW,IAAA;AAAK,KAChC;AACA,IAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AACrB,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EACnC,CAAA,EAAG,CAAC,IAAA,EAAM,IAAI,CAAC,CAAA;AAEf,EAAA,OAAO,EAAE,QAAQ,MAAA,EAAO;AAC1B;;;;"}
@@ -1,17 +1,20 @@
1
- import { useState, useCallback } from 'react';
1
+ import { useState, useEffect } from 'react';
2
2
 
3
- const useInView = () => {
3
+ const useInView = ({ root } = {}) => {
4
4
  const [inView, setInView] = useState(false);
5
- const setRef = useCallback((node) => {
6
- if (node) {
7
- const observer = new IntersectionObserver(([entry]) => {
5
+ const [node, setRef] = useState(null);
6
+ useEffect(() => {
7
+ if (!node) return;
8
+ const observer = new IntersectionObserver(
9
+ ([entry]) => {
8
10
  if (!entry) return;
9
11
  setInView(entry.isIntersecting);
10
- });
11
- observer.observe(node);
12
- return () => observer.disconnect();
13
- }
14
- }, []);
12
+ },
13
+ { root: root?.current ?? null }
14
+ );
15
+ observer.observe(node);
16
+ return () => observer.disconnect();
17
+ }, [node, root]);
15
18
  return { inView, setRef };
16
19
  };
17
20
 
@@ -1 +1 @@
1
- {"version":3,"file":"use-in-view.es.js","sources":["../../src/hooks/use-in-view.ts"],"sourcesContent":["import { useCallback, useState } from 'react';\n\n/**\n * Tracks whether or not the given element is currently in view.\n * This is to replace framer-motion's `useInView` which has issues\n * tracking a ref that is set at a time other than mount.\n */\nexport const useInView = () => {\n const [inView, setInView] = useState(false);\n\n const setRef = useCallback((node: HTMLDivElement | null) => {\n if (node) {\n const observer = new IntersectionObserver(([entry]) => {\n if (!entry) return;\n setInView(entry.isIntersecting);\n });\n observer.observe(node);\n return () => observer.disconnect();\n }\n }, []);\n\n return { inView, setRef };\n};\n"],"names":[],"mappings":";;AAOO,MAAM,YAAY,MAAM;AAC7B,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAE1C,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,CAAC,IAAA,KAAgC;AAC1D,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,WAAW,IAAI,oBAAA,CAAqB,CAAC,CAAC,KAAK,CAAA,KAAM;AACrD,QAAA,IAAI,CAAC,KAAA,EAAO;AACZ,QAAA,SAAA,CAAU,MAAM,cAAc,CAAA;AAAA,MAChC,CAAC,CAAA;AACD,MAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AACrB,MAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,IACnC;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,QAAQ,MAAA,EAAO;AAC1B;;;;"}
1
+ {"version":3,"file":"use-in-view.es.js","sources":["../../src/hooks/use-in-view.ts"],"sourcesContent":["import type { RefObject } from 'react';\nimport { useEffect, useState } from 'react';\n\nexport type UseInViewOptions = {\n /**\n * Scroll container to observe against. When omitted, the browser viewport is used.\n * Pass the list's own scroll viewport so the sentinel only fires when scrolled\n * into view inside that container.\n */\n root?: RefObject<HTMLElement | null>;\n};\n\n/**\n * Tracks whether or not the given element is currently in view.\n * This is to replace framer-motion's `useInView` which has issues\n * tracking a ref that is set at a time other than mount.\n *\n * The observer is created in an effect (not in the callback ref) so that an\n * ancestor `root` ref, which React assigns after descendant refs, is already\n * populated when the observer is constructed.\n */\nexport const useInView = ({ root }: UseInViewOptions = {}) => {\n const [inView, setInView] = useState(false);\n const [node, setRef] = useState<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!node) return;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (!entry) return;\n setInView(entry.isIntersecting);\n },\n { root: root?.current ?? null },\n );\n observer.observe(node);\n return () => observer.disconnect();\n }, [node, root]);\n\n return { inView, setRef };\n};\n"],"names":[],"mappings":";;AAqBO,MAAM,YAAY,CAAC,EAAE,IAAA,EAAK,GAAsB,EAAC,KAAM;AAC5D,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,IAAA,EAAM,MAAM,CAAA,GAAI,SAAgC,IAAI,CAAA;AAE3D,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,WAAW,IAAI,oBAAA;AAAA,MACnB,CAAC,CAAC,KAAK,CAAA,KAAM;AACX,QAAA,IAAI,CAAC,KAAA,EAAO;AACZ,QAAA,SAAA,CAAU,MAAM,cAAc,CAAA;AAAA,MAChC,CAAA;AAAA,MACA,EAAE,IAAA,EAAM,IAAA,EAAM,OAAA,IAAW,IAAA;AAAK,KAChC;AACA,IAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AACrB,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EACnC,CAAA,EAAG,CAAC,IAAA,EAAM,IAAI,CAAC,CAAA;AAEf,EAAA,OAAO,EAAE,QAAQ,MAAA,EAAO;AAC1B;;;;"}
@@ -3,7 +3,7 @@ import { TraceUsageSummary } from '../trace-list-columns';
3
3
  import { SearchableSpan } from '../types';
4
4
  import { LinkComponent } from '../../../ds/types/link-component';
5
5
  export type TraceDataPanelPlacement = 'traces-list' | 'trace-page';
6
- export type TraceDataPanelTab = 'details' | 'scores' | 'feedback';
6
+ export type TraceDataPanelTab = 'details' | 'partial-thread' | 'scores' | 'feedback';
7
7
  export interface TraceDataPanelViewProps {
8
8
  traceId: string;
9
9
  /** Lightweight spans for the trace. Caller fetches via useTraceLightSpans. */
@@ -68,6 +68,10 @@ export interface TraceDataPanelViewProps {
68
68
  }) => ReactNode;
69
69
  /** Optional count shown in the "Feedback" tab label. */
70
70
  feedbackTabBadge?: ReactNode;
71
+ /** When provided, a "Messages" tab renders the trace as one reconstructed agent turn. */
72
+ partialThreadTabSlot?: (args: {
73
+ traceId: string;
74
+ }) => ReactNode;
71
75
  activeTab?: TraceDataPanelTab;
72
76
  onTabChange?: (tab: TraceDataPanelTab) => void;
73
77
  /**
@@ -78,4 +82,4 @@ export interface TraceDataPanelViewProps {
78
82
  /** Extra classes applied to the panel root (e.g. `h-full` on the trace page). */
79
83
  className?: string;
80
84
  }
81
- export declare function TraceDataPanelView({ traceId, spans, isLoading, onClose, onSpanSelect, onEvaluateTrace, onSaveAsDatasetItem, onAddTraceMocksToItem, initialSpanId, onPrevious, onNext, collapsed: controlledCollapsed, onCollapsedChange, placement, timelineChartWidth, LinkComponent, traceHref, entityHref, usage, anchorSpanId, showUnavailableFeaturesMsg, scoresTabSlot, scoresTabBadge, feedbackTabSlot, feedbackTabBadge, activeTab, onTabChange, spanPanelSlot, className, }: TraceDataPanelViewProps): import("react").JSX.Element;
85
+ export declare function TraceDataPanelView({ traceId, spans, isLoading, onClose, onSpanSelect, onEvaluateTrace, onSaveAsDatasetItem, onAddTraceMocksToItem, initialSpanId, onPrevious, onNext, collapsed: controlledCollapsed, onCollapsedChange, placement, timelineChartWidth, LinkComponent, traceHref, entityHref, usage, anchorSpanId, showUnavailableFeaturesMsg, scoresTabSlot, scoresTabBadge, feedbackTabSlot, feedbackTabBadge, partialThreadTabSlot, activeTab, onTabChange, spanPanelSlot, className, }: TraceDataPanelViewProps): import("react").JSX.Element;
@@ -1,9 +1,22 @@
1
+ import { RefObject } from 'react';
2
+ export type UseInViewOptions = {
3
+ /**
4
+ * Scroll container to observe against. When omitted, the browser viewport is used.
5
+ * Pass the list's own scroll viewport so the sentinel only fires when scrolled
6
+ * into view inside that container.
7
+ */
8
+ root?: RefObject<HTMLElement | null>;
9
+ };
1
10
  /**
2
11
  * Tracks whether or not the given element is currently in view.
3
12
  * This is to replace framer-motion's `useInView` which has issues
4
13
  * tracking a ref that is set at a time other than mount.
14
+ *
15
+ * The observer is created in an effect (not in the callback ref) so that an
16
+ * ancestor `root` ref, which React assigns after descendant refs, is already
17
+ * populated when the observer is constructed.
5
18
  */
6
- export declare const useInView: () => {
19
+ export declare const useInView: ({ root }?: UseInViewOptions) => {
7
20
  inView: boolean;
8
- setRef: (node: HTMLDivElement | null) => (() => void) | undefined;
21
+ setRef: import('react').Dispatch<import('react').SetStateAction<HTMLDivElement | null>>;
9
22
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mastra/playground-ui",
3
3
  "type": "module",
4
- "version": "52.0.0-alpha.11",
4
+ "version": "52.0.0",
5
5
  "description": "Mastra Playground components",
6
6
  "sideEffects": [
7
7
  "**/*.css"
@@ -160,8 +160,8 @@
160
160
  "react": ">=19.0.0",
161
161
  "react-dom": ">=19.0.0",
162
162
  "tailwindcss": "^4.0.0",
163
- "@mastra/client-js": "^1.43.0-alpha.8",
164
- "@mastra/react": "1.4.10-alpha.9"
163
+ "@mastra/client-js": "^1.43.0",
164
+ "@mastra/react": "1.4.10"
165
165
  },
166
166
  "devDependencies": {
167
167
  "@storybook/addon-a11y": "^10.4.1",
@@ -202,11 +202,11 @@
202
202
  "vite-plugin-dts": "^4.5.4",
203
203
  "vite-plugin-lib-inject-css": "^2.2.2",
204
204
  "vitest": "4.1.10",
205
- "@mastra/client-js": "^1.43.0-alpha.8",
206
- "@internal/lint": "0.0.129",
207
- "@mastra/react": "1.4.10-alpha.9",
208
- "@mastra/memory": "1.28.2-alpha.3",
209
- "@mastra/core": "1.64.0-alpha.8"
205
+ "@internal/lint": "0.0.130",
206
+ "@mastra/memory": "1.28.2",
207
+ "@mastra/client-js": "^1.43.0",
208
+ "@mastra/react": "1.4.10",
209
+ "@mastra/core": "1.64.0"
210
210
  },
211
211
  "homepage": "https://mastra.ai",
212
212
  "repository": {