@mastra/playground-ui 53.0.0-alpha.8 → 53.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.
- package/dist/{code-DRGJVroV.js → code-D4Vw_fYq.js} +22 -16
- package/dist/code-D4Vw_fYq.js.map +1 -0
- package/dist/{code-BJMC6T9D.cjs → code-DhrdtZce.cjs} +22 -15
- package/dist/code-DhrdtZce.cjs.map +1 -0
- package/dist/{code-block-CBJhDEeB.js → code-block-DeksY23p.js} +2 -2
- package/dist/{code-block-CBJhDEeB.js.map → code-block-DeksY23p.js.map} +1 -1
- package/dist/{code-block-fmv8bHoT.cjs → code-block-DgHrBuR8.cjs} +2 -2
- package/dist/{code-block-fmv8bHoT.cjs.map → code-block-DgHrBuR8.cjs.map} +1 -1
- package/dist/{code-diff-C-EHXZyK.cjs → code-diff-CHZ3P1ky.cjs} +51 -43
- package/dist/code-diff-CHZ3P1ky.cjs.map +1 -0
- package/dist/{code-diff-BB4sqHpq.js → code-diff-CIRbnIfl.js} +52 -44
- package/dist/code-diff-CIRbnIfl.js.map +1 -0
- package/dist/{combobox-BQrlN0eB.cjs → combobox-JNWmgC13.cjs} +8 -3
- package/dist/combobox-JNWmgC13.cjs.map +1 -0
- package/dist/{combobox-DeeAlYti.js → combobox-nxjXzRWu.js} +8 -3
- package/dist/combobox-nxjXzRWu.js.map +1 -0
- package/dist/{command-DWFd0d4c.js → command-Be-KrIAX.js} +2 -2
- package/dist/{command-DWFd0d4c.js.map → command-Be-KrIAX.js.map} +1 -1
- package/dist/{command-CUev1UxH.cjs → command-DsTBCmQq.cjs} +2 -2
- package/dist/{command-CUev1UxH.cjs.map → command-DsTBCmQq.cjs.map} +1 -1
- package/dist/components/ChatShell.cjs.js +20 -1
- package/dist/components/ChatShell.cjs.js.map +1 -1
- package/dist/components/ChatShell.es.js +20 -1
- package/dist/components/ChatShell.es.js.map +1 -1
- package/dist/components/Code.cjs.js +3 -1
- package/dist/components/Code.cjs.js.map +1 -1
- package/dist/components/Code.es.js +1 -1
- package/dist/components/CodeBlock.cjs.js +1 -1
- package/dist/components/CodeBlock.es.js +1 -1
- package/dist/components/CodeDiff.cjs.js +1 -1
- package/dist/components/CodeDiff.es.js +1 -1
- package/dist/components/CodeEditor.cjs.js +2 -1
- package/dist/components/CodeEditor.cjs.js.map +1 -1
- package/dist/components/CodeEditor.es.js +1 -1
- package/dist/components/Combobox.cjs.js +1 -1
- package/dist/components/Combobox.es.js +1 -1
- package/dist/components/Command.cjs.js +1 -1
- package/dist/components/Command.es.js +1 -1
- package/dist/components/CommandPalette.cjs.js +1 -1
- package/dist/components/CommandPalette.es.js +1 -1
- package/dist/components/Comment.cjs.js +2 -2
- package/dist/components/Comment.cjs.js.map +1 -1
- package/dist/components/Comment.es.js +2 -2
- package/dist/components/Comment.es.js.map +1 -1
- package/dist/components/DataCodeSection.cjs.js +1 -1
- package/dist/components/DataCodeSection.es.js +1 -1
- package/dist/components/DataPanel.cjs.js +1 -1
- package/dist/components/DataPanel.es.js +1 -1
- package/dist/components/Dialog.cjs.js +181 -2
- package/dist/components/Dialog.cjs.js.map +1 -1
- package/dist/components/Dialog.es.js +183 -1
- package/dist/components/Dialog.es.js.map +1 -1
- package/dist/components/HorizontalBars.cjs.js +1 -1
- package/dist/components/HorizontalBars.es.js +1 -1
- package/dist/components/IntegrationDialog.cjs.js +105 -0
- package/dist/components/IntegrationDialog.cjs.js.map +1 -0
- package/dist/components/IntegrationDialog.d.ts +2 -0
- package/dist/components/IntegrationDialog.es.js +101 -0
- package/dist/components/IntegrationDialog.es.js.map +1 -0
- package/dist/components/LogsDataList.cjs.js +0 -1
- package/dist/components/LogsDataList.cjs.js.map +1 -1
- package/dist/components/LogsDataList.es.js +0 -1
- package/dist/components/LogsDataList.es.js.map +1 -1
- package/dist/components/MainHeader.cjs.js +1 -1
- package/dist/components/MainHeader.cjs.js.map +1 -1
- package/dist/components/MainHeader.es.js +1 -1
- package/dist/components/MainHeader.es.js.map +1 -1
- package/dist/components/MarkdownRenderer.cjs.js +1 -1
- package/dist/components/MarkdownRenderer.es.js +1 -1
- package/dist/components/PropertyFilter.cjs.js +1 -1
- package/dist/components/PropertyFilter.es.js +1 -1
- package/dist/components/ThreadRail.cjs.js +19 -0
- package/dist/components/ThreadRail.cjs.js.map +1 -1
- package/dist/components/ThreadRail.es.js +19 -1
- package/dist/components/ThreadRail.es.js.map +1 -1
- package/dist/components/ai/plan.cjs.js +1 -1
- package/dist/components/ai/plan.es.js +1 -1
- package/dist/components/ai/tool-call.cjs.js +165 -0
- package/dist/components/ai/tool-call.cjs.js.map +1 -1
- package/dist/components/ai/tool-call.es.js +159 -3
- package/dist/components/ai/tool-call.es.js.map +1 -1
- package/dist/{data-code-section-Dn9smaz4.cjs → data-code-section-B_lg_J_0.cjs} +34 -5
- package/dist/data-code-section-B_lg_J_0.cjs.map +1 -0
- package/dist/{data-code-section-DN2yPgEz.js → data-code-section-Cm_W_XhO.js} +36 -7
- package/dist/data-code-section-Cm_W_XhO.js.map +1 -0
- package/dist/{data-panel-DEatwExN.cjs → data-panel-Cv9j_IGQ.cjs} +2 -2
- package/dist/{data-panel-DEatwExN.cjs.map → data-panel-Cv9j_IGQ.cjs.map} +1 -1
- package/dist/{data-panel-2Da0Utgy.js → data-panel-DXxeSnL1.js} +2 -2
- package/dist/{data-panel-2Da0Utgy.js.map → data-panel-DXxeSnL1.js.map} +1 -1
- package/dist/dialog-CZMPDVUj.js +259 -0
- package/dist/dialog-CZMPDVUj.js.map +1 -0
- package/dist/dialog-D-7Hkb3j.cjs +293 -0
- package/dist/dialog-D-7Hkb3j.cjs.map +1 -0
- package/dist/domains/memory/components/observation-detail-view.cjs.js +1 -1
- package/dist/domains/memory/components/observation-detail-view.es.js +1 -1
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js +1 -1
- package/dist/domains/metrics/components/traces-volume-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/traces-volume-card-view.es.js +1 -1
- package/dist/domains/traces/components/span-data-panel-view.cjs.js +61 -105
- package/dist/domains/traces/components/span-data-panel-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-data-panel-view.es.js +62 -106
- package/dist/domains/traces/components/span-data-panel-view.es.js.map +1 -1
- package/dist/domains/traces/components/span-summary-description.cjs.js +62 -0
- package/dist/domains/traces/components/span-summary-description.cjs.js.map +1 -0
- package/dist/domains/traces/components/span-summary-description.d.ts +2 -0
- package/dist/domains/traces/components/span-summary-description.es.js +58 -0
- package/dist/domains/traces/components/span-summary-description.es.js.map +1 -0
- package/dist/domains/traces/components/timeline-expand-col.cjs.js +1 -1
- package/dist/domains/traces/components/timeline-expand-col.cjs.js.map +1 -1
- package/dist/domains/traces/components/timeline-expand-col.es.js +1 -1
- package/dist/domains/traces/components/timeline-expand-col.es.js.map +1 -1
- package/dist/domains/traces/components/timeline-name-col.cjs.js +1 -1
- package/dist/domains/traces/components/timeline-name-col.cjs.js.map +1 -1
- package/dist/domains/traces/components/timeline-name-col.es.js +1 -1
- package/dist/domains/traces/components/timeline-name-col.es.js.map +1 -1
- package/dist/domains/traces/components/timeline-timing-col.cjs.js +1 -1
- package/dist/domains/traces/components/timeline-timing-col.cjs.js.map +1 -1
- package/dist/domains/traces/components/timeline-timing-col.es.js +1 -1
- package/dist/domains/traces/components/timeline-timing-col.es.js.map +1 -1
- package/dist/domains/traces/components/trace-columns-menu.cjs.js +1 -1
- package/dist/domains/traces/components/trace-columns-menu.es.js +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js +2 -2
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.es.js +2 -2
- package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
- package/dist/domains/traces/components/traces-toolbar.cjs.js +1 -5
- package/dist/domains/traces/components/traces-toolbar.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-toolbar.es.js +1 -5
- package/dist/domains/traces/components/traces-toolbar.es.js.map +1 -1
- package/dist/domains/traces/hooks/use-branch.cjs.js +2 -6
- package/dist/domains/traces/hooks/use-branch.cjs.js.map +1 -1
- package/dist/domains/traces/hooks/use-branch.es.js +2 -6
- package/dist/domains/traces/hooks/use-branch.es.js.map +1 -1
- package/dist/domains/traces/hooks/use-download-trace-json.cjs.js +4 -1
- package/dist/domains/traces/hooks/use-download-trace-json.cjs.js.map +1 -1
- package/dist/domains/traces/hooks/use-download-trace-json.es.js +4 -1
- package/dist/domains/traces/hooks/use-download-trace-json.es.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-filter-persistence.cjs.js +11 -18
- package/dist/domains/traces/hooks/use-trace-filter-persistence.cjs.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-filter-persistence.es.js +13 -20
- package/dist/domains/traces/hooks/use-trace-filter-persistence.es.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-spans.cjs.js +10 -7
- package/dist/domains/traces/hooks/use-trace-spans.cjs.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-spans.es.js +10 -7
- package/dist/domains/traces/hooks/use-trace-spans.es.js.map +1 -1
- package/dist/domains/traces/trace-filters.cjs.js +5 -5
- package/dist/domains/traces/trace-filters.cjs.js.map +1 -1
- package/dist/domains/traces/trace-filters.es.js +5 -5
- package/dist/domains/traces/trace-filters.es.js.map +1 -1
- package/dist/domains/traces/utils/span-utils.cjs.js +6 -0
- package/dist/domains/traces/utils/span-utils.cjs.js.map +1 -1
- package/dist/domains/traces/utils/span-utils.es.js +6 -1
- package/dist/domains/traces/utils/span-utils.es.js.map +1 -1
- package/dist/ee/signals/components/entity-index-list.cjs.js +0 -1
- package/dist/ee/signals/components/entity-index-list.cjs.js.map +1 -1
- package/dist/ee/signals/components/entity-index-list.es.js +0 -1
- package/dist/ee/signals/components/entity-index-list.es.js.map +1 -1
- package/dist/ee/signals/settings/signal-definition-form-dialog.cjs.js +1 -1
- package/dist/ee/signals/settings/signal-definition-form-dialog.es.js +1 -1
- package/dist/{highlight-CSJjjoqh.js → highlight-BmpoELR4.js} +6 -2
- package/dist/{highlight-CSJjjoqh.js.map → highlight-BmpoELR4.js.map} +1 -1
- package/dist/{highlight-CEt2vhD8.cjs → highlight-DK1dn-Fh.cjs} +6 -1
- package/dist/{highlight-CEt2vhD8.cjs.map → highlight-DK1dn-Fh.cjs.map} +1 -1
- package/dist/{horizontal-bars-DZ5J4TKv.js → horizontal-bars-CyP-B-BX.js} +37 -4
- package/dist/horizontal-bars-CyP-B-BX.js.map +1 -0
- package/dist/{horizontal-bars-CE1O-Y6G.cjs → horizontal-bars-Dgq3PYsg.cjs} +37 -4
- package/dist/horizontal-bars-Dgq3PYsg.cjs.map +1 -0
- package/dist/{markdown-renderer-DiJBbnYG.js → markdown-renderer-CaFpZTFS.js} +2 -2
- package/dist/{markdown-renderer-DiJBbnYG.js.map → markdown-renderer-CaFpZTFS.js.map} +1 -1
- package/dist/{markdown-renderer-DGIzNAQY.cjs → markdown-renderer-GVtZLunG.cjs} +2 -2
- package/dist/{markdown-renderer-DGIzNAQY.cjs.map → markdown-renderer-GVtZLunG.cjs.map} +1 -1
- package/dist/src/domains/traces/components/span-summary-description.d.ts +10 -0
- package/dist/src/domains/traces/components/traces-toolbar.d.ts +1 -5
- package/dist/src/domains/traces/hooks/index.d.ts +1 -1
- package/dist/src/domains/traces/hooks/use-trace-filter-persistence.d.ts +5 -18
- package/dist/src/domains/traces/hooks/use-trace-spans.d.ts +3 -1
- package/dist/src/domains/traces/trace-filters.d.ts +4 -3
- package/dist/src/domains/traces/utils/span-utils.d.ts +2 -0
- package/dist/src/ds/components/ChatShell/chat-shell.d.ts +19 -2
- package/dist/src/ds/components/ChatShell/index.d.ts +3 -2
- package/dist/src/ds/components/Code/index.d.ts +1 -0
- package/dist/src/ds/components/Code/use-highlight.d.ts +10 -0
- package/dist/src/ds/components/CodeDiff/code-diff.stories.d.ts +2 -0
- package/dist/src/ds/components/CodeEditor/highlight.d.ts +1 -0
- package/dist/src/ds/components/CodeEditor/index.d.ts +1 -1
- package/dist/src/ds/components/Combobox/combobox.d.ts +3 -1
- package/dist/src/ds/components/DataCodeSection/data-code-section.d.ts +9 -1
- package/dist/src/ds/components/DataCodeSection/index.d.ts +1 -1
- package/dist/src/ds/components/Dialog/dialog-action.d.ts +9 -0
- package/dist/src/ds/components/Dialog/dialog-context.d.ts +16 -0
- package/dist/src/ds/components/Dialog/dialog-new-variant.stories.d.ts +64 -0
- package/dist/src/ds/components/Dialog/dialog.d.ts +15 -6
- package/dist/src/ds/components/Dialog/index.d.ts +2 -0
- package/dist/src/ds/components/HorizontalBars/horizontal-bars.stories.d.ts +2 -0
- package/dist/src/ds/components/IntegrationDialog/__fixtures__/integrations-catalog.d.ts +2 -0
- package/dist/src/ds/components/IntegrationDialog/index.d.ts +2 -0
- package/dist/src/ds/components/IntegrationDialog/integration-dialog.d.ts +28 -0
- package/dist/src/ds/components/IntegrationDialog/integration-dialog.stories.d.ts +24 -0
- package/dist/src/ds/components/ThreadRail/index.d.ts +1 -0
- package/dist/src/ds/components/ThreadRail/turn-groups.d.ts +19 -0
- package/dist/src/ds/components/ai/tool-call/ansi.d.ts +2 -0
- package/dist/src/ds/components/ai/tool-call/group-consecutive.d.ts +17 -0
- package/dist/src/ds/components/ai/tool-call/index.d.ts +4 -0
- package/dist/src/ds/components/ai/tool-call/tool-call-edit.d.ts +4 -0
- package/dist/src/ds/components/ai/tool-call/tool-call-group.d.ts +14 -0
- package/dist/src/ds/components/ai/tool-call/tool-call.d.ts +4 -0
- package/dist/src/ds/components/ai/tool-call/tool-presentation.d.ts +10 -0
- package/dist/style.css +149 -3
- package/package.json +8 -8
- package/dist/code-BJMC6T9D.cjs.map +0 -1
- package/dist/code-DRGJVroV.js.map +0 -1
- package/dist/code-diff-BB4sqHpq.js.map +0 -1
- package/dist/code-diff-C-EHXZyK.cjs.map +0 -1
- package/dist/combobox-BQrlN0eB.cjs.map +0 -1
- package/dist/combobox-DeeAlYti.js.map +0 -1
- package/dist/data-code-section-DN2yPgEz.js.map +0 -1
- package/dist/data-code-section-Dn9smaz4.cjs.map +0 -1
- package/dist/dialog-CESxLg8S.js +0 -76
- package/dist/dialog-CESxLg8S.js.map +0 -1
- package/dist/dialog-K0q0KOOW.cjs +0 -107
- package/dist/dialog-K0q0KOOW.cjs.map +0 -1
- package/dist/horizontal-bars-CE1O-Y6G.cjs.map +0 -1
- package/dist/horizontal-bars-DZ5J4TKv.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traces-toolbar.cjs.js","sources":["../../../../src/domains/traces/components/traces-toolbar.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { PropertyFilterActions } from '@/ds/components/PropertyFilter/property-filter-actions';\nimport { PropertyFilterApplied } from '@/ds/components/PropertyFilter/property-filter-applied';\nimport type { PropertyFilterField, PropertyFilterToken } from '@/ds/components/PropertyFilter/types';\nimport { cn } from '@/lib/utils';\n\ntype TracesToolbarProps = {\n /** Keep all filter pills but reset each value to its neutral state\n * ('' for text, 'Any' for single-select, [] for multi-select). */\n onClear?: () => void;\n /** Fully remove all filter pills. */\n onRemoveAll?: () => void;\n
|
|
1
|
+
{"version":3,"file":"traces-toolbar.cjs.js","sources":["../../../../src/domains/traces/components/traces-toolbar.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { PropertyFilterActions } from '@/ds/components/PropertyFilter/property-filter-actions';\nimport { PropertyFilterApplied } from '@/ds/components/PropertyFilter/property-filter-applied';\nimport type { PropertyFilterField, PropertyFilterToken } from '@/ds/components/PropertyFilter/types';\nimport { cn } from '@/lib/utils';\n\ntype TracesToolbarProps = {\n /** Keep all filter pills but reset each value to its neutral state\n * ('' for text, 'Any' for single-select, [] for multi-select). */\n onClear?: () => void;\n /** Fully remove all filter pills. */\n onRemoveAll?: () => void;\n isLoading?: boolean;\n filterFields: PropertyFilterField[];\n filterTokens: PropertyFilterToken[];\n onFilterTokensChange: (tokens: PropertyFilterToken[]) => void;\n autoFocusFilterFieldId?: string;\n /** Field ids rendered as read-only pills (cannot be edited or removed). */\n lockedFieldIds?: readonly string[];\n lockedTooltipContent?: ReactNode;\n};\n\nexport function TracesToolbar({\n onClear,\n onRemoveAll,\n isLoading,\n filterFields,\n filterTokens,\n onFilterTokensChange,\n autoFocusFilterFieldId,\n lockedFieldIds,\n lockedTooltipContent,\n}: TracesToolbarProps) {\n const hasActiveFilters = filterTokens.length > 0;\n\n const lockedSet = new Set(lockedFieldIds ?? []);\n const editableTokens = filterTokens.filter(t => !lockedSet.has(t.fieldId));\n const hasNonDefaultFilter = editableTokens.some(token => isNonDefaultFilter(token, filterFields));\n const hasEditableFilters = editableTokens.length > 0;\n\n // Without filters the toolbar renders nothing; returning null avoids an empty\n // grid row (and its gap) in `PageLayout.TopArea`.\n if (!hasActiveFilters) return null;\n\n return (\n // 1fr | auto — pills wrap in the first column; Clear stays pinned to the\n // top of the second column regardless of how many pill rows render.\n <div className={cn('grid grid-cols-[1fr_auto] items-start gap-3 ')}>\n <PropertyFilterApplied\n fields={filterFields}\n tokens={filterTokens}\n onTokensChange={onFilterTokensChange}\n disabled={isLoading}\n autoFocusFieldId={autoFocusFilterFieldId}\n lockedFieldIds={lockedFieldIds}\n lockedTooltipContent={lockedTooltipContent}\n />\n\n {hasActiveFilters && hasEditableFilters && (\n <PropertyFilterActions\n disabled={isLoading}\n onClear={hasNonDefaultFilter ? onClear : undefined}\n onRemoveAll={onRemoveAll}\n />\n )}\n </div>\n );\n}\n\nfunction isNonDefaultFilter(token: PropertyFilterToken, fields: PropertyFilterField[]): boolean {\n const field = fields.find(f => f.id === token.fieldId);\n if (!field) return false;\n if (field.kind === 'text') {\n return typeof token.value === 'string' && token.value.trim() !== '';\n }\n if (field.kind === 'pick-multi') {\n if (field.multi) return Array.isArray(token.value) && token.value.length > 0;\n return typeof token.value === 'string' && token.value !== '' && token.value !== 'Any';\n }\n if (field.kind === 'multi-select') {\n return Array.isArray(token.value) && token.value.length > 0;\n }\n return false;\n}\n"],"names":["jsxs","cn","jsx","PropertyFilterApplied","PropertyFilterActions"],"mappings":";;;;;;;;AAsBO,SAAS,aAAA,CAAc;AAAA,EAC5B,OAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,oBAAA;AAAA,EACA,sBAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,gBAAA,GAAmB,aAAa,MAAA,GAAS,CAAA;AAE/C,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,cAAA,IAAkB,EAAE,CAAA;AAC9C,EAAA,MAAM,cAAA,GAAiB,aAAa,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,OAAO,CAAC,CAAA;AACzE,EAAA,MAAM,sBAAsB,cAAA,CAAe,IAAA,CAAK,WAAS,kBAAA,CAAmB,KAAA,EAAO,YAAY,CAAC,CAAA;AAChG,EAAA,MAAM,kBAAA,GAAqB,eAAe,MAAA,GAAS,CAAA;AAInD,EAAA,IAAI,CAAC,kBAAkB,OAAO,IAAA;AAE9B,EAAA;AAAA;AAAA;AAAA,oBAGEA,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWC,WAAA,CAAG,8CAA8C,CAAA,EAC/D,QAAA,EAAA;AAAA,sBAAAC,cAAA;AAAA,QAACC,2CAAA;AAAA,QAAA;AAAA,UACC,MAAA,EAAQ,YAAA;AAAA,UACR,MAAA,EAAQ,YAAA;AAAA,UACR,cAAA,EAAgB,oBAAA;AAAA,UAChB,QAAA,EAAU,SAAA;AAAA,UACV,gBAAA,EAAkB,sBAAA;AAAA,UAClB,cAAA;AAAA,UACA;AAAA;AAAA,OACF;AAAA,MAEC,oBAAoB,kBAAA,oBACnBD,cAAA;AAAA,QAACE,2CAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAU,SAAA;AAAA,UACV,OAAA,EAAS,sBAAsB,OAAA,GAAU,MAAA;AAAA,UACzC;AAAA;AAAA;AACF,KAAA,EAEJ;AAAA;AAEJ;AAEA,SAAS,kBAAA,CAAmB,OAA4B,MAAA,EAAwC;AAC9F,EAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,OAAK,CAAA,CAAE,EAAA,KAAO,MAAM,OAAO,CAAA;AACrD,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,EAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,IAAA,OAAO,OAAO,KAAA,CAAM,KAAA,KAAU,YAAY,KAAA,CAAM,KAAA,CAAM,MAAK,KAAM,EAAA;AAAA,EACnE;AACA,EAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC/B,IAAA,IAAI,KAAA,CAAM,KAAA,EAAO,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAM,KAAK,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA;AAC3E,IAAA,OAAO,OAAO,MAAM,KAAA,KAAU,QAAA,IAAY,MAAM,KAAA,KAAU,EAAA,IAAM,MAAM,KAAA,KAAU,KAAA;AAAA,EAClF;AACA,EAAA,IAAI,KAAA,CAAM,SAAS,cAAA,EAAgB;AACjC,IAAA,OAAO,MAAM,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,IAAK,KAAA,CAAM,MAAM,MAAA,GAAS,CAAA;AAAA,EAC5D;AACA,EAAA,OAAO,KAAA;AACT;;;;"}
|
|
@@ -5,8 +5,6 @@ import { c as cn } from '../../../cn-B4oPhFx9.js';
|
|
|
5
5
|
function TracesToolbar({
|
|
6
6
|
onClear,
|
|
7
7
|
onRemoveAll,
|
|
8
|
-
onSave,
|
|
9
|
-
onRemoveSaved,
|
|
10
8
|
isLoading,
|
|
11
9
|
filterFields,
|
|
12
10
|
filterTokens,
|
|
@@ -42,9 +40,7 @@ function TracesToolbar({
|
|
|
42
40
|
{
|
|
43
41
|
disabled: isLoading,
|
|
44
42
|
onClear: hasNonDefaultFilter ? onClear : void 0,
|
|
45
|
-
onRemoveAll
|
|
46
|
-
onSave,
|
|
47
|
-
onRemoveSaved
|
|
43
|
+
onRemoveAll
|
|
48
44
|
}
|
|
49
45
|
)
|
|
50
46
|
] })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traces-toolbar.es.js","sources":["../../../../src/domains/traces/components/traces-toolbar.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { PropertyFilterActions } from '@/ds/components/PropertyFilter/property-filter-actions';\nimport { PropertyFilterApplied } from '@/ds/components/PropertyFilter/property-filter-applied';\nimport type { PropertyFilterField, PropertyFilterToken } from '@/ds/components/PropertyFilter/types';\nimport { cn } from '@/lib/utils';\n\ntype TracesToolbarProps = {\n /** Keep all filter pills but reset each value to its neutral state\n * ('' for text, 'Any' for single-select, [] for multi-select). */\n onClear?: () => void;\n /** Fully remove all filter pills. */\n onRemoveAll?: () => void;\n
|
|
1
|
+
{"version":3,"file":"traces-toolbar.es.js","sources":["../../../../src/domains/traces/components/traces-toolbar.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { PropertyFilterActions } from '@/ds/components/PropertyFilter/property-filter-actions';\nimport { PropertyFilterApplied } from '@/ds/components/PropertyFilter/property-filter-applied';\nimport type { PropertyFilterField, PropertyFilterToken } from '@/ds/components/PropertyFilter/types';\nimport { cn } from '@/lib/utils';\n\ntype TracesToolbarProps = {\n /** Keep all filter pills but reset each value to its neutral state\n * ('' for text, 'Any' for single-select, [] for multi-select). */\n onClear?: () => void;\n /** Fully remove all filter pills. */\n onRemoveAll?: () => void;\n isLoading?: boolean;\n filterFields: PropertyFilterField[];\n filterTokens: PropertyFilterToken[];\n onFilterTokensChange: (tokens: PropertyFilterToken[]) => void;\n autoFocusFilterFieldId?: string;\n /** Field ids rendered as read-only pills (cannot be edited or removed). */\n lockedFieldIds?: readonly string[];\n lockedTooltipContent?: ReactNode;\n};\n\nexport function TracesToolbar({\n onClear,\n onRemoveAll,\n isLoading,\n filterFields,\n filterTokens,\n onFilterTokensChange,\n autoFocusFilterFieldId,\n lockedFieldIds,\n lockedTooltipContent,\n}: TracesToolbarProps) {\n const hasActiveFilters = filterTokens.length > 0;\n\n const lockedSet = new Set(lockedFieldIds ?? []);\n const editableTokens = filterTokens.filter(t => !lockedSet.has(t.fieldId));\n const hasNonDefaultFilter = editableTokens.some(token => isNonDefaultFilter(token, filterFields));\n const hasEditableFilters = editableTokens.length > 0;\n\n // Without filters the toolbar renders nothing; returning null avoids an empty\n // grid row (and its gap) in `PageLayout.TopArea`.\n if (!hasActiveFilters) return null;\n\n return (\n // 1fr | auto — pills wrap in the first column; Clear stays pinned to the\n // top of the second column regardless of how many pill rows render.\n <div className={cn('grid grid-cols-[1fr_auto] items-start gap-3 ')}>\n <PropertyFilterApplied\n fields={filterFields}\n tokens={filterTokens}\n onTokensChange={onFilterTokensChange}\n disabled={isLoading}\n autoFocusFieldId={autoFocusFilterFieldId}\n lockedFieldIds={lockedFieldIds}\n lockedTooltipContent={lockedTooltipContent}\n />\n\n {hasActiveFilters && hasEditableFilters && (\n <PropertyFilterActions\n disabled={isLoading}\n onClear={hasNonDefaultFilter ? onClear : undefined}\n onRemoveAll={onRemoveAll}\n />\n )}\n </div>\n );\n}\n\nfunction isNonDefaultFilter(token: PropertyFilterToken, fields: PropertyFilterField[]): boolean {\n const field = fields.find(f => f.id === token.fieldId);\n if (!field) return false;\n if (field.kind === 'text') {\n return typeof token.value === 'string' && token.value.trim() !== '';\n }\n if (field.kind === 'pick-multi') {\n if (field.multi) return Array.isArray(token.value) && token.value.length > 0;\n return typeof token.value === 'string' && token.value !== '' && token.value !== 'Any';\n }\n if (field.kind === 'multi-select') {\n return Array.isArray(token.value) && token.value.length > 0;\n }\n return false;\n}\n"],"names":[],"mappings":";;;;AAsBO,SAAS,aAAA,CAAc;AAAA,EAC5B,OAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,oBAAA;AAAA,EACA,sBAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,gBAAA,GAAmB,aAAa,MAAA,GAAS,CAAA;AAE/C,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,cAAA,IAAkB,EAAE,CAAA;AAC9C,EAAA,MAAM,cAAA,GAAiB,aAAa,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,OAAO,CAAC,CAAA;AACzE,EAAA,MAAM,sBAAsB,cAAA,CAAe,IAAA,CAAK,WAAS,kBAAA,CAAmB,KAAA,EAAO,YAAY,CAAC,CAAA;AAChG,EAAA,MAAM,kBAAA,GAAqB,eAAe,MAAA,GAAS,CAAA;AAInD,EAAA,IAAI,CAAC,kBAAkB,OAAO,IAAA;AAE9B,EAAA;AAAA;AAAA;AAAA,oBAGE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,8CAA8C,CAAA,EAC/D,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,qBAAA;AAAA,QAAA;AAAA,UACC,MAAA,EAAQ,YAAA;AAAA,UACR,MAAA,EAAQ,YAAA;AAAA,UACR,cAAA,EAAgB,oBAAA;AAAA,UAChB,QAAA,EAAU,SAAA;AAAA,UACV,gBAAA,EAAkB,sBAAA;AAAA,UAClB,cAAA;AAAA,UACA;AAAA;AAAA,OACF;AAAA,MAEC,oBAAoB,kBAAA,oBACnB,GAAA;AAAA,QAAC,qBAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAU,SAAA;AAAA,UACV,OAAA,EAAS,sBAAsB,OAAA,GAAU,MAAA;AAAA,UACzC;AAAA;AAAA;AACF,KAAA,EAEJ;AAAA;AAEJ;AAEA,SAAS,kBAAA,CAAmB,OAA4B,MAAA,EAAwC;AAC9F,EAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,OAAK,CAAA,CAAE,EAAA,KAAO,MAAM,OAAO,CAAA;AACrD,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,EAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,IAAA,OAAO,OAAO,KAAA,CAAM,KAAA,KAAU,YAAY,KAAA,CAAM,KAAA,CAAM,MAAK,KAAM,EAAA;AAAA,EACnE;AACA,EAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC/B,IAAA,IAAI,KAAA,CAAM,KAAA,EAAO,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAM,KAAK,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA;AAC3E,IAAA,OAAO,OAAO,MAAM,KAAA,KAAU,QAAA,IAAY,MAAM,KAAA,KAAU,EAAA,IAAM,MAAM,KAAA,KAAU,KAAA;AAAA,EAClF;AACA,EAAA,IAAI,KAAA,CAAM,SAAS,cAAA,EAAgB;AACjC,IAAA,OAAO,MAAM,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,IAAK,KAAA,CAAM,MAAM,MAAA,GAAS,CAAA;AAAA,EAC5D;AACA,EAAA,OAAO,KAAA;AACT;;;;"}
|
|
@@ -7,7 +7,6 @@ const reactQuery = require('@tanstack/react-query');
|
|
|
7
7
|
const domains_traces_utils_toSearchableSpans = require('../utils/to-searchable-spans.cjs.js');
|
|
8
8
|
require('date-fns');
|
|
9
9
|
|
|
10
|
-
const IMMUTABLE_CACHE_TIME = 1e3 * 60 * 60 * 24 * 30;
|
|
11
10
|
function useBranch({
|
|
12
11
|
traceId,
|
|
13
12
|
spanId,
|
|
@@ -25,11 +24,8 @@ function useBranch({
|
|
|
25
24
|
// Builds each span's search haystack once per fetch, cached with the query.
|
|
26
25
|
select: domains_traces_utils_toSearchableSpans.selectSearchableSpans,
|
|
27
26
|
enabled: !!traceId && !!spanId,
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const isFinished = data?.spans.every((s) => Boolean(s.endedAt));
|
|
31
|
-
return isFinished ? IMMUTABLE_CACHE_TIME : 0;
|
|
32
|
-
}
|
|
27
|
+
// A finished subtree can still gain spans from a resumed run or delayed export.
|
|
28
|
+
staleTime: 0
|
|
33
29
|
});
|
|
34
30
|
}
|
|
35
31
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-branch.cjs.js","sources":["../../../../src/domains/traces/hooks/use-branch.ts"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport type { SearchableSpan } from '../types';\nimport { selectSearchableSpans } from '../utils';\n\
|
|
1
|
+
{"version":3,"file":"use-branch.cjs.js","sources":["../../../../src/domains/traces/hooks/use-branch.ts"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport type { SearchableSpan } from '../types';\nimport { selectSearchableSpans } from '../utils';\n\nexport interface UseBranchArgs {\n traceId: string | null | undefined;\n spanId: string | null | undefined;\n depth?: number;\n}\n\nexport function useBranch({\n traceId,\n spanId,\n depth,\n}: UseBranchArgs): UseQueryResult<{ traceId: string; spans: SearchableSpan[] } | null> {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['branch', traceId, spanId, depth],\n queryFn: async () => {\n if (!traceId || !spanId) {\n throw new Error('traceId and spanId are required');\n }\n return client.getBranch({ traceId, spanId, depth });\n },\n // Builds each span's search haystack once per fetch, cached with the query.\n select: selectSearchableSpans,\n enabled: !!traceId && !!spanId,\n // A finished subtree can still gain spans from a resumed run or delayed export.\n staleTime: 0,\n });\n}\n"],"names":["useMastraClient","useQuery","selectSearchableSpans"],"mappings":";;;;;;;;;AAYO,SAAS,SAAA,CAAU;AAAA,EACxB,OAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAuF;AACrF,EAAA,MAAM,SAASA,qBAAA,EAAgB;AAE/B,EAAA,OAAOC,mBAAA,CAAS;AAAA,IACd,QAAA,EAAU,CAAC,QAAA,EAAU,OAAA,EAAS,QAAQ,KAAK,CAAA;AAAA,IAC3C,SAAS,YAAY;AACnB,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,MAAA,EAAQ;AACvB,QAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,MACnD;AACA,MAAA,OAAO,OAAO,SAAA,CAAU,EAAE,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AAAA,IACpD,CAAA;AAAA;AAAA,IAEA,MAAA,EAAQC,4DAAA;AAAA,IACR,OAAA,EAAS,CAAC,CAAC,OAAA,IAAW,CAAC,CAAC,MAAA;AAAA;AAAA,IAExB,SAAA,EAAW;AAAA,GACZ,CAAA;AACH;;;;"}
|
|
@@ -3,7 +3,6 @@ import { useQuery } from '@tanstack/react-query';
|
|
|
3
3
|
import { selectSearchableSpans } from '../utils/to-searchable-spans.es.js';
|
|
4
4
|
import 'date-fns';
|
|
5
5
|
|
|
6
|
-
const IMMUTABLE_CACHE_TIME = 1e3 * 60 * 60 * 24 * 30;
|
|
7
6
|
function useBranch({
|
|
8
7
|
traceId,
|
|
9
8
|
spanId,
|
|
@@ -21,11 +20,8 @@ function useBranch({
|
|
|
21
20
|
// Builds each span's search haystack once per fetch, cached with the query.
|
|
22
21
|
select: selectSearchableSpans,
|
|
23
22
|
enabled: !!traceId && !!spanId,
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const isFinished = data?.spans.every((s) => Boolean(s.endedAt));
|
|
27
|
-
return isFinished ? IMMUTABLE_CACHE_TIME : 0;
|
|
28
|
-
}
|
|
23
|
+
// A finished subtree can still gain spans from a resumed run or delayed export.
|
|
24
|
+
staleTime: 0
|
|
29
25
|
});
|
|
30
26
|
}
|
|
31
27
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-branch.es.js","sources":["../../../../src/domains/traces/hooks/use-branch.ts"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport type { SearchableSpan } from '../types';\nimport { selectSearchableSpans } from '../utils';\n\
|
|
1
|
+
{"version":3,"file":"use-branch.es.js","sources":["../../../../src/domains/traces/hooks/use-branch.ts"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport type { SearchableSpan } from '../types';\nimport { selectSearchableSpans } from '../utils';\n\nexport interface UseBranchArgs {\n traceId: string | null | undefined;\n spanId: string | null | undefined;\n depth?: number;\n}\n\nexport function useBranch({\n traceId,\n spanId,\n depth,\n}: UseBranchArgs): UseQueryResult<{ traceId: string; spans: SearchableSpan[] } | null> {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['branch', traceId, spanId, depth],\n queryFn: async () => {\n if (!traceId || !spanId) {\n throw new Error('traceId and spanId are required');\n }\n return client.getBranch({ traceId, spanId, depth });\n },\n // Builds each span's search haystack once per fetch, cached with the query.\n select: selectSearchableSpans,\n enabled: !!traceId && !!spanId,\n // A finished subtree can still gain spans from a resumed run or delayed export.\n staleTime: 0,\n });\n}\n"],"names":[],"mappings":";;;;;AAYO,SAAS,SAAA,CAAU;AAAA,EACxB,OAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAuF;AACrF,EAAA,MAAM,SAAS,eAAA,EAAgB;AAE/B,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU,CAAC,QAAA,EAAU,OAAA,EAAS,QAAQ,KAAK,CAAA;AAAA,IAC3C,SAAS,YAAY;AACnB,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,MAAA,EAAQ;AACvB,QAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,MACnD;AACA,MAAA,OAAO,OAAO,SAAA,CAAU,EAAE,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AAAA,IACpD,CAAA;AAAA;AAAA,IAEA,MAAA,EAAQ,qBAAA;AAAA,IACR,OAAA,EAAS,CAAC,CAAC,OAAA,IAAW,CAAC,CAAC,MAAA;AAAA;AAAA,IAExB,SAAA,EAAW;AAAA,GACZ,CAAA;AACH;;;;"}
|
|
@@ -3,17 +3,20 @@
|
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
4
|
|
|
5
5
|
const react = require('@mastra/react');
|
|
6
|
+
const reactQuery = require('@tanstack/react-query');
|
|
6
7
|
const React = require('react');
|
|
8
|
+
const domains_traces_hooks_useTraceSpans = require('./use-trace-spans.cjs.js');
|
|
7
9
|
const toast = require('../../../toast-EtbZnj9b.cjs');
|
|
8
10
|
const downloadJson = require('../../../downloadJson-PWUDbzkB.cjs');
|
|
9
11
|
|
|
10
12
|
function useDownloadTraceJson() {
|
|
11
13
|
const client = react.useMastraClient();
|
|
14
|
+
const queryClient = reactQuery.useQueryClient();
|
|
12
15
|
const [isPending, setIsPending] = React.useState(false);
|
|
13
16
|
const download = (traceId) => {
|
|
14
17
|
if (isPending) return;
|
|
15
18
|
setIsPending(true);
|
|
16
|
-
const task =
|
|
19
|
+
const task = queryClient.fetchQuery(domains_traces_hooks_useTraceSpans.traceSpansQueryOptions(client, traceId)).then((trace) => downloadJson.downloadJson(`trace-${traceId}.json`, trace)).finally(() => setIsPending(false));
|
|
17
20
|
toast.toast.promise({
|
|
18
21
|
myPromise: task,
|
|
19
22
|
loadingMessage: "Preparing trace download…",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-download-trace-json.cjs.js","sources":["../../../../src/domains/traces/hooks/use-download-trace-json.ts"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { useState } from 'react';\nimport { downloadJson } from '@/lib/file';\nimport { toast } from '@/lib/toast';\n\nexport function useDownloadTraceJson() {\n const client = useMastraClient();\n const [isPending, setIsPending] = useState(false);\n\n const download = (traceId: string) => {\n if (isPending) return;\n setIsPending(true);\n\n //
|
|
1
|
+
{"version":3,"file":"use-download-trace-json.cjs.js","sources":["../../../../src/domains/traces/hooks/use-download-trace-json.ts"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useState } from 'react';\nimport { traceSpansQueryOptions } from './use-trace-spans';\nimport { downloadJson } from '@/lib/file';\nimport { toast } from '@/lib/toast';\n\nexport function useDownloadTraceJson() {\n const client = useMastraClient();\n const queryClient = useQueryClient();\n const [isPending, setIsPending] = useState(false);\n\n const download = (traceId: string) => {\n if (isPending) return;\n setIsPending(true);\n\n // Fetch the full payload into the shared cache so the panel matches the downloaded trace.\n const task = queryClient\n .fetchQuery(traceSpansQueryOptions(client, traceId))\n .then(trace => downloadJson(`trace-${traceId}.json`, trace))\n .finally(() => setIsPending(false));\n\n toast.promise({\n myPromise: task,\n loadingMessage: 'Preparing trace download…',\n successMessage: 'Trace downloaded',\n errorMessage: 'Failed to download trace',\n });\n };\n\n return { download, isPending };\n}\n"],"names":["useMastraClient","useQueryClient","useState","traceSpansQueryOptions","downloadJson","toast"],"mappings":";;;;;;;;;;;AAOO,SAAS,oBAAA,GAAuB;AACrC,EAAA,MAAM,SAASA,qBAAA,EAAgB;AAC/B,EAAA,MAAM,cAAcC,yBAAA,EAAe;AACnC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,eAAS,KAAK,CAAA;AAEhD,EAAA,MAAM,QAAA,GAAW,CAAC,OAAA,KAAoB;AACpC,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,YAAA,CAAa,IAAI,CAAA;AAGjB,IAAA,MAAM,IAAA,GAAO,YACV,UAAA,CAAWC,yDAAA,CAAuB,QAAQ,OAAO,CAAC,EAClD,IAAA,CAAK,CAAA,KAAA,KAASC,0BAAa,CAAA,MAAA,EAAS,OAAO,SAAS,KAAK,CAAC,EAC1D,OAAA,CAAQ,MAAM,YAAA,CAAa,KAAK,CAAC,CAAA;AAEpC,IAAAC,WAAA,CAAM,OAAA,CAAQ;AAAA,MACZ,SAAA,EAAW,IAAA;AAAA,MACX,cAAA,EAAgB,2BAAA;AAAA,MAChB,cAAA,EAAgB,kBAAA;AAAA,MAChB,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,OAAO,EAAE,UAAU,SAAA,EAAU;AAC/B;;;;"}
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import { useMastraClient } from '@mastra/react';
|
|
2
|
+
import { useQueryClient } from '@tanstack/react-query';
|
|
2
3
|
import { useState } from 'react';
|
|
4
|
+
import { traceSpansQueryOptions } from './use-trace-spans.es.js';
|
|
3
5
|
import { t as toast } from '../../../toast-czUGO0aH.js';
|
|
4
6
|
import { d as downloadJson } from '../../../downloadJson-DuPoMa_6.js';
|
|
5
7
|
|
|
6
8
|
function useDownloadTraceJson() {
|
|
7
9
|
const client = useMastraClient();
|
|
10
|
+
const queryClient = useQueryClient();
|
|
8
11
|
const [isPending, setIsPending] = useState(false);
|
|
9
12
|
const download = (traceId) => {
|
|
10
13
|
if (isPending) return;
|
|
11
14
|
setIsPending(true);
|
|
12
|
-
const task =
|
|
15
|
+
const task = queryClient.fetchQuery(traceSpansQueryOptions(client, traceId)).then((trace) => downloadJson(`trace-${traceId}.json`, trace)).finally(() => setIsPending(false));
|
|
13
16
|
toast.promise({
|
|
14
17
|
myPromise: task,
|
|
15
18
|
loadingMessage: "Preparing trace download…",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-download-trace-json.es.js","sources":["../../../../src/domains/traces/hooks/use-download-trace-json.ts"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { useState } from 'react';\nimport { downloadJson } from '@/lib/file';\nimport { toast } from '@/lib/toast';\n\nexport function useDownloadTraceJson() {\n const client = useMastraClient();\n const [isPending, setIsPending] = useState(false);\n\n const download = (traceId: string) => {\n if (isPending) return;\n setIsPending(true);\n\n //
|
|
1
|
+
{"version":3,"file":"use-download-trace-json.es.js","sources":["../../../../src/domains/traces/hooks/use-download-trace-json.ts"],"sourcesContent":["import { useMastraClient } from '@mastra/react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useState } from 'react';\nimport { traceSpansQueryOptions } from './use-trace-spans';\nimport { downloadJson } from '@/lib/file';\nimport { toast } from '@/lib/toast';\n\nexport function useDownloadTraceJson() {\n const client = useMastraClient();\n const queryClient = useQueryClient();\n const [isPending, setIsPending] = useState(false);\n\n const download = (traceId: string) => {\n if (isPending) return;\n setIsPending(true);\n\n // Fetch the full payload into the shared cache so the panel matches the downloaded trace.\n const task = queryClient\n .fetchQuery(traceSpansQueryOptions(client, traceId))\n .then(trace => downloadJson(`trace-${traceId}.json`, trace))\n .finally(() => setIsPending(false));\n\n toast.promise({\n myPromise: task,\n loadingMessage: 'Preparing trace download…',\n successMessage: 'Trace downloaded',\n errorMessage: 'Failed to download trace',\n });\n };\n\n return { download, isPending };\n}\n"],"names":[],"mappings":";;;;;;;AAOO,SAAS,oBAAA,GAAuB;AACrC,EAAA,MAAM,SAAS,eAAA,EAAgB;AAC/B,EAAA,MAAM,cAAc,cAAA,EAAe;AACnC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAEhD,EAAA,MAAM,QAAA,GAAW,CAAC,OAAA,KAAoB;AACpC,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,YAAA,CAAa,IAAI,CAAA;AAGjB,IAAA,MAAM,IAAA,GAAO,YACV,UAAA,CAAW,sBAAA,CAAuB,QAAQ,OAAO,CAAC,EAClD,IAAA,CAAK,CAAA,KAAA,KAAS,aAAa,CAAA,MAAA,EAAS,OAAO,SAAS,KAAK,CAAC,EAC1D,OAAA,CAAQ,MAAM,YAAA,CAAa,KAAK,CAAC,CAAA;AAEpC,IAAA,KAAA,CAAM,OAAA,CAAQ;AAAA,MACZ,SAAA,EAAW,IAAA;AAAA,MACX,cAAA,EAAgB,2BAAA;AAAA,MAChB,cAAA,EAAgB,kBAAA;AAAA,MAChB,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,OAAO,EAAE,UAAU,SAAA,EAAU;AAC/B;;;;"}
|
|
@@ -4,25 +4,9 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
4
4
|
|
|
5
5
|
const React = require('react');
|
|
6
6
|
const domains_traces_traceFilters = require('../trace-filters.cjs.js');
|
|
7
|
-
const toast = require('../../../toast-EtbZnj9b.cjs');
|
|
8
7
|
|
|
9
|
-
const DEFAULT_SAVED_MESSAGE = "Trace filter settings saved.";
|
|
10
|
-
const DEFAULT_CLEARED_MESSAGE = "Trace filter settings cleared.";
|
|
11
8
|
function useTraceFilterPersistence(searchParams, setSearchParams, options) {
|
|
12
|
-
const { storageKey,
|
|
13
|
-
const [hasSavedFilters, setHasSavedFilters] = React.useState(() => domains_traces_traceFilters.loadTraceFiltersFromStorage(storageKey) !== null);
|
|
14
|
-
const handleSave = React.useCallback(() => {
|
|
15
|
-
domains_traces_traceFilters.saveTraceFiltersToStorage(searchParams, storageKey);
|
|
16
|
-
setHasSavedFilters(true);
|
|
17
|
-
const text = messages?.saved ?? DEFAULT_SAVED_MESSAGE;
|
|
18
|
-
if (text !== false) toast.toast.success(text);
|
|
19
|
-
}, [searchParams, storageKey, messages?.saved]);
|
|
20
|
-
const handleRemoveSaved = React.useCallback(() => {
|
|
21
|
-
domains_traces_traceFilters.clearSavedTraceFilters(storageKey);
|
|
22
|
-
setHasSavedFilters(false);
|
|
23
|
-
const text = messages?.cleared ?? DEFAULT_CLEARED_MESSAGE;
|
|
24
|
-
if (text !== false) toast.toast.success(text);
|
|
25
|
-
}, [storageKey, messages?.cleared]);
|
|
9
|
+
const { storageKey, skipHydration } = options ?? {};
|
|
26
10
|
const hydratedRef = React.useRef(false);
|
|
27
11
|
React.useEffect(() => {
|
|
28
12
|
if (skipHydration) return;
|
|
@@ -42,7 +26,16 @@ function useTraceFilterPersistence(searchParams, setSearchParams, options) {
|
|
|
42
26
|
{ replace: true }
|
|
43
27
|
);
|
|
44
28
|
}, []);
|
|
45
|
-
return
|
|
29
|
+
return React.useCallback(
|
|
30
|
+
(next, setOptions) => {
|
|
31
|
+
setSearchParams((prev) => {
|
|
32
|
+
const resolved = typeof next === "function" ? next(prev) : next;
|
|
33
|
+
domains_traces_traceFilters.saveTraceFiltersToStorage(resolved, storageKey);
|
|
34
|
+
return resolved;
|
|
35
|
+
}, setOptions);
|
|
36
|
+
},
|
|
37
|
+
[setSearchParams, storageKey]
|
|
38
|
+
);
|
|
46
39
|
}
|
|
47
40
|
|
|
48
41
|
exports.useTraceFilterPersistence = useTraceFilterPersistence;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-trace-filter-persistence.cjs.js","sources":["../../../../src/domains/traces/hooks/use-trace-filter-persistence.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef
|
|
1
|
+
{"version":3,"file":"use-trace-filter-persistence.cjs.js","sources":["../../../../src/domains/traces/hooks/use-trace-filter-persistence.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\nimport { hasAnyTraceFilterParams, loadTraceFiltersFromStorage, saveTraceFiltersToStorage } from '../trace-filters';\nimport type { SetURLSearchParamsLike } from './use-trace-url-state';\n\nexport interface TraceFilterPersistenceOptions {\n /** Override the localStorage key. Default: traces filters storage. */\n storageKey?: string;\n /** Skip the once-on-mount hydration from localStorage. Default: false (hydration runs). */\n skipHydration?: boolean;\n}\n\n/**\n * Owns the localStorage save/restore lifecycle for trace filters:\n * - hydrates the URL from saved filters once on mount, but only if the URL is filter-clean\n * (so a shared link / direct nav with explicit filters wins over the saved set)\n * - returns a `setSearchParams` wrapper that persists the resulting params as part of the\n * update itself; only relative date presets are kept (see `saveTraceFiltersToStorage`).\n * Route every filter mutation through the returned setter (e.g. hand it to `useTraceUrlState`).\n *\n * Pass `storageKey` to scope persistence (e.g. per-entity).\n */\nexport function useTraceFilterPersistence(\n searchParams: URLSearchParams,\n setSearchParams: SetURLSearchParamsLike,\n options?: TraceFilterPersistenceOptions,\n): SetURLSearchParamsLike {\n const { storageKey, skipHydration } = options ?? {};\n\n // Hydrate from the saved filter set on mount, but only when the URL is\n // filter-clean (user arrived via a plain sidebar nav). If the URL already\n // carries filters — e.g. a shared link — leave it alone.\n const hydratedRef = useRef(false);\n useEffect(() => {\n if (skipHydration) return;\n if (hydratedRef.current) return;\n hydratedRef.current = true;\n if (hasAnyTraceFilterParams(searchParams)) return;\n const saved = loadTraceFiltersFromStorage(storageKey);\n if (!saved) return;\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n for (const [key, value] of saved) {\n next.append(key, value);\n }\n return next;\n },\n { replace: true },\n );\n // Run once on mount — searchParams intentionally read at mount time.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Persist as part of the user's update rather than by observing the URL: the URL at mount\n // is either about to be hydrated (empty) or an explicit link, and neither is \"what the user\n // last chose\".\n return useCallback<SetURLSearchParamsLike>(\n (next, setOptions) => {\n setSearchParams(prev => {\n const resolved = typeof next === 'function' ? next(prev) : next;\n saveTraceFiltersToStorage(resolved, storageKey);\n return resolved;\n }, setOptions);\n },\n [setSearchParams, storageKey],\n );\n}\n"],"names":["useRef","useEffect","hasAnyTraceFilterParams","loadTraceFiltersFromStorage","useCallback","saveTraceFiltersToStorage"],"mappings":";;;;;;;AAqBO,SAAS,yBAAA,CACd,YAAA,EACA,eAAA,EACA,OAAA,EACwB;AACxB,EAAA,MAAM,EAAE,UAAA,EAAY,aAAA,EAAc,GAAI,WAAW,EAAC;AAKlD,EAAA,MAAM,WAAA,GAAcA,aAAO,KAAK,CAAA;AAChC,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,aAAA,EAAe;AACnB,IAAA,IAAI,YAAY,OAAA,EAAS;AACzB,IAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,IAAA,IAAIC,mDAAA,CAAwB,YAAY,CAAA,EAAG;AAC3C,IAAA,MAAM,KAAA,GAAQC,wDAA4B,UAAU,CAAA;AACpD,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,eAAA;AAAA,MACE,CAAA,IAAA,KAAQ;AACN,QAAA,MAAM,IAAA,GAAO,IAAI,eAAA,CAAgB,IAAI,CAAA;AACrC,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,KAAA,EAAO;AAChC,UAAA,IAAA,CAAK,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,QACxB;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MACA,EAAE,SAAS,IAAA;AAAK,KAClB;AAAA,EAGF,CAAA,EAAG,EAAE,CAAA;AAKL,EAAA,OAAOC,iBAAA;AAAA,IACL,CAAC,MAAM,UAAA,KAAe;AACpB,MAAA,eAAA,CAAgB,CAAA,IAAA,KAAQ;AACtB,QAAA,MAAM,WAAW,OAAO,IAAA,KAAS,UAAA,GAAa,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAC3D,QAAAC,qDAAA,CAA0B,UAAU,UAAU,CAAA;AAC9C,QAAA,OAAO,QAAA;AAAA,MACT,GAAG,UAAU,CAAA;AAAA,IACf,CAAA;AAAA,IACA,CAAC,iBAAiB,UAAU;AAAA,GAC9B;AACF;;;;"}
|
|
@@ -1,24 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { loadTraceFiltersFromStorage, saveTraceFiltersToStorage
|
|
3
|
-
import { t as toast } from '../../../toast-czUGO0aH.js';
|
|
1
|
+
import { useRef, useEffect, useCallback } from 'react';
|
|
2
|
+
import { hasAnyTraceFilterParams, loadTraceFiltersFromStorage, saveTraceFiltersToStorage } from '../trace-filters.es.js';
|
|
4
3
|
|
|
5
|
-
const DEFAULT_SAVED_MESSAGE = "Trace filter settings saved.";
|
|
6
|
-
const DEFAULT_CLEARED_MESSAGE = "Trace filter settings cleared.";
|
|
7
4
|
function useTraceFilterPersistence(searchParams, setSearchParams, options) {
|
|
8
|
-
const { storageKey,
|
|
9
|
-
const [hasSavedFilters, setHasSavedFilters] = useState(() => loadTraceFiltersFromStorage(storageKey) !== null);
|
|
10
|
-
const handleSave = useCallback(() => {
|
|
11
|
-
saveTraceFiltersToStorage(searchParams, storageKey);
|
|
12
|
-
setHasSavedFilters(true);
|
|
13
|
-
const text = messages?.saved ?? DEFAULT_SAVED_MESSAGE;
|
|
14
|
-
if (text !== false) toast.success(text);
|
|
15
|
-
}, [searchParams, storageKey, messages?.saved]);
|
|
16
|
-
const handleRemoveSaved = useCallback(() => {
|
|
17
|
-
clearSavedTraceFilters(storageKey);
|
|
18
|
-
setHasSavedFilters(false);
|
|
19
|
-
const text = messages?.cleared ?? DEFAULT_CLEARED_MESSAGE;
|
|
20
|
-
if (text !== false) toast.success(text);
|
|
21
|
-
}, [storageKey, messages?.cleared]);
|
|
5
|
+
const { storageKey, skipHydration } = options ?? {};
|
|
22
6
|
const hydratedRef = useRef(false);
|
|
23
7
|
useEffect(() => {
|
|
24
8
|
if (skipHydration) return;
|
|
@@ -38,7 +22,16 @@ function useTraceFilterPersistence(searchParams, setSearchParams, options) {
|
|
|
38
22
|
{ replace: true }
|
|
39
23
|
);
|
|
40
24
|
}, []);
|
|
41
|
-
return
|
|
25
|
+
return useCallback(
|
|
26
|
+
(next, setOptions) => {
|
|
27
|
+
setSearchParams((prev) => {
|
|
28
|
+
const resolved = typeof next === "function" ? next(prev) : next;
|
|
29
|
+
saveTraceFiltersToStorage(resolved, storageKey);
|
|
30
|
+
return resolved;
|
|
31
|
+
}, setOptions);
|
|
32
|
+
},
|
|
33
|
+
[setSearchParams, storageKey]
|
|
34
|
+
);
|
|
42
35
|
}
|
|
43
36
|
|
|
44
37
|
export { useTraceFilterPersistence };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-trace-filter-persistence.es.js","sources":["../../../../src/domains/traces/hooks/use-trace-filter-persistence.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef
|
|
1
|
+
{"version":3,"file":"use-trace-filter-persistence.es.js","sources":["../../../../src/domains/traces/hooks/use-trace-filter-persistence.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\nimport { hasAnyTraceFilterParams, loadTraceFiltersFromStorage, saveTraceFiltersToStorage } from '../trace-filters';\nimport type { SetURLSearchParamsLike } from './use-trace-url-state';\n\nexport interface TraceFilterPersistenceOptions {\n /** Override the localStorage key. Default: traces filters storage. */\n storageKey?: string;\n /** Skip the once-on-mount hydration from localStorage. Default: false (hydration runs). */\n skipHydration?: boolean;\n}\n\n/**\n * Owns the localStorage save/restore lifecycle for trace filters:\n * - hydrates the URL from saved filters once on mount, but only if the URL is filter-clean\n * (so a shared link / direct nav with explicit filters wins over the saved set)\n * - returns a `setSearchParams` wrapper that persists the resulting params as part of the\n * update itself; only relative date presets are kept (see `saveTraceFiltersToStorage`).\n * Route every filter mutation through the returned setter (e.g. hand it to `useTraceUrlState`).\n *\n * Pass `storageKey` to scope persistence (e.g. per-entity).\n */\nexport function useTraceFilterPersistence(\n searchParams: URLSearchParams,\n setSearchParams: SetURLSearchParamsLike,\n options?: TraceFilterPersistenceOptions,\n): SetURLSearchParamsLike {\n const { storageKey, skipHydration } = options ?? {};\n\n // Hydrate from the saved filter set on mount, but only when the URL is\n // filter-clean (user arrived via a plain sidebar nav). If the URL already\n // carries filters — e.g. a shared link — leave it alone.\n const hydratedRef = useRef(false);\n useEffect(() => {\n if (skipHydration) return;\n if (hydratedRef.current) return;\n hydratedRef.current = true;\n if (hasAnyTraceFilterParams(searchParams)) return;\n const saved = loadTraceFiltersFromStorage(storageKey);\n if (!saved) return;\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n for (const [key, value] of saved) {\n next.append(key, value);\n }\n return next;\n },\n { replace: true },\n );\n // Run once on mount — searchParams intentionally read at mount time.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Persist as part of the user's update rather than by observing the URL: the URL at mount\n // is either about to be hydrated (empty) or an explicit link, and neither is \"what the user\n // last chose\".\n return useCallback<SetURLSearchParamsLike>(\n (next, setOptions) => {\n setSearchParams(prev => {\n const resolved = typeof next === 'function' ? next(prev) : next;\n saveTraceFiltersToStorage(resolved, storageKey);\n return resolved;\n }, setOptions);\n },\n [setSearchParams, storageKey],\n );\n}\n"],"names":[],"mappings":";;;AAqBO,SAAS,yBAAA,CACd,YAAA,EACA,eAAA,EACA,OAAA,EACwB;AACxB,EAAA,MAAM,EAAE,UAAA,EAAY,aAAA,EAAc,GAAI,WAAW,EAAC;AAKlD,EAAA,MAAM,WAAA,GAAc,OAAO,KAAK,CAAA;AAChC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,aAAA,EAAe;AACnB,IAAA,IAAI,YAAY,OAAA,EAAS;AACzB,IAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,IAAA,IAAI,uBAAA,CAAwB,YAAY,CAAA,EAAG;AAC3C,IAAA,MAAM,KAAA,GAAQ,4BAA4B,UAAU,CAAA;AACpD,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,eAAA;AAAA,MACE,CAAA,IAAA,KAAQ;AACN,QAAA,MAAM,IAAA,GAAO,IAAI,eAAA,CAAgB,IAAI,CAAA;AACrC,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,KAAA,EAAO;AAChC,UAAA,IAAA,CAAK,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,QACxB;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MACA,EAAE,SAAS,IAAA;AAAK,KAClB;AAAA,EAGF,CAAA,EAAG,EAAE,CAAA;AAKL,EAAA,OAAO,WAAA;AAAA,IACL,CAAC,MAAM,UAAA,KAAe;AACpB,MAAA,eAAA,CAAgB,CAAA,IAAA,KAAQ;AACtB,QAAA,MAAM,WAAW,OAAO,IAAA,KAAS,UAAA,GAAa,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAC3D,QAAA,yBAAA,CAA0B,UAAU,UAAU,CAAA;AAC9C,QAAA,OAAO,QAAA;AAAA,MACT,GAAG,UAAU,CAAA;AAAA,IACf,CAAA;AAAA,IACA,CAAC,iBAAiB,UAAU;AAAA,GAC9B;AACF;;;;"}
|
|
@@ -7,7 +7,6 @@ const reactQuery = require('@tanstack/react-query');
|
|
|
7
7
|
const domains_traces_utils_toSearchableSpans = require('../utils/to-searchable-spans.cjs.js');
|
|
8
8
|
require('date-fns');
|
|
9
9
|
|
|
10
|
-
const IMMUTABLE_CACHE_TIME = 1e3 * 60 * 60 * 24 * 30;
|
|
11
10
|
const traceSpansQueryOptions = (client, traceId) => reactQuery.queryOptions({
|
|
12
11
|
queryKey: ["trace-spans", traceId],
|
|
13
12
|
queryFn: async () => {
|
|
@@ -18,16 +17,17 @@ const traceSpansQueryOptions = (client, traceId) => reactQuery.queryOptions({
|
|
|
18
17
|
return res;
|
|
19
18
|
},
|
|
20
19
|
enabled: !!traceId,
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const isFinished = data?.spans.every((span) => Boolean(span.endedAt));
|
|
24
|
-
return isFinished ? IMMUTABLE_CACHE_TIME : 0;
|
|
25
|
-
}
|
|
20
|
+
// Resumed runs and delayed exports can append spans even when every known span has ended.
|
|
21
|
+
staleTime: 0
|
|
26
22
|
});
|
|
27
|
-
function useTraceSpans(traceId) {
|
|
23
|
+
function useTraceSpans(traceId, { passive = false } = {}) {
|
|
28
24
|
const client = react.useMastraClient();
|
|
29
25
|
return reactQuery.useQuery({
|
|
30
26
|
...traceSpansQueryOptions(client, traceId),
|
|
27
|
+
// History rows share updates but leave automatic refreshes to the selected detail.
|
|
28
|
+
refetchOnMount: !passive,
|
|
29
|
+
refetchOnWindowFocus: !passive,
|
|
30
|
+
refetchOnReconnect: !passive,
|
|
31
31
|
// Builds each span's search haystack once per fetch, cached with the query.
|
|
32
32
|
select: domains_traces_utils_toSearchableSpans.selectSearchableSpans
|
|
33
33
|
});
|
|
@@ -37,6 +37,9 @@ function useTraceSpansQueries(traceIds, select, fallback) {
|
|
|
37
37
|
return reactQuery.useQueries({
|
|
38
38
|
queries: traceIds.map((traceId) => ({
|
|
39
39
|
...traceSpansQueryOptions(client, traceId),
|
|
40
|
+
refetchOnMount: false,
|
|
41
|
+
refetchOnWindowFocus: false,
|
|
42
|
+
refetchOnReconnect: false,
|
|
40
43
|
select: (data) => select(traceId, data)
|
|
41
44
|
})),
|
|
42
45
|
combine: (results) => results.map(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-trace-spans.cjs.js","sources":["../../../../src/domains/traces/hooks/use-trace-spans.ts"],"sourcesContent":["import type { MastraClient } from '@mastra/client-js';\nimport { useMastraClient } from '@mastra/react';\nimport { queryOptions, useQueries, useQuery } from '@tanstack/react-query';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport type { SearchableSpan } from '../types';\nimport { selectSearchableSpans } from '../utils';\n\
|
|
1
|
+
{"version":3,"file":"use-trace-spans.cjs.js","sources":["../../../../src/domains/traces/hooks/use-trace-spans.ts"],"sourcesContent":["import type { MastraClient } from '@mastra/client-js';\nimport { useMastraClient } from '@mastra/react';\nimport { queryOptions, useQueries, useQuery } from '@tanstack/react-query';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport type { SearchableSpan } from '../types';\nimport { selectSearchableSpans } from '../utils';\n\n/**\n * Key, fetcher and stale policy of the `trace-spans` query. Every observer of this key must\n * share these (rather than only the key) so one observer with a stricter `staleTime` does not\n * refetch data another one considers fresh.\n */\nexport const traceSpansQueryOptions = (client: MastraClient, traceId: string | null | undefined) =>\n queryOptions({\n queryKey: ['trace-spans', traceId],\n queryFn: async () => {\n if (!traceId) {\n throw new Error('Trace ID is required');\n }\n const res = await client.getTrace(traceId);\n return res;\n },\n enabled: !!traceId,\n // Resumed runs and delayed exports can append spans even when every known span has ended.\n staleTime: 0,\n });\n\n/**\n * Every span of a single trace, with its full payload.\n *\n * The lightweight projection exists to keep blob columns off the read path of a\n * *list*, where the cost is paid once per trace on screen. A trace that is open\n * has already narrowed that to one, and the panel both renders and searches\n * these spans -- `input`, `output` and `attributes` included -- so the\n * projection would only hide content the reader is looking at.\n */\nexport function useTraceSpans(\n traceId: string | null | undefined,\n { passive = false }: { passive?: boolean } = {},\n): UseQueryResult<{ traceId: string; spans: SearchableSpan[] } | null> {\n const client = useMastraClient();\n\n return useQuery({\n ...traceSpansQueryOptions(client, traceId),\n // History rows share updates but leave automatic refreshes to the selected detail.\n refetchOnMount: !passive,\n refetchOnWindowFocus: !passive,\n refetchOnReconnect: !passive,\n // Builds each span's search haystack once per fetch, cached with the query.\n select: selectSearchableSpans,\n });\n}\n\nexport type TraceSpansData = Awaited<ReturnType<MastraClient['getTrace']>>;\n\n/**\n * Observes the `trace-spans` query of several traces at once and projects each one with `select`.\n * Traces still loading (or failed) yield `fallback(traceId)` so the result always lines up with `traceIds`.\n */\nexport function useTraceSpansQueries<T>(\n traceIds: string[],\n select: (traceId: string, data: TraceSpansData) => T,\n fallback: (traceId: string) => T,\n): T[] {\n const client = useMastraClient();\n\n return useQueries({\n queries: traceIds.map(traceId => ({\n ...traceSpansQueryOptions(client, traceId),\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n select: (data: TraceSpansData) => select(traceId, data),\n })),\n combine: results =>\n results.map((result, index) =>\n result.data === undefined ? fallback(traceIds[index] ?? '') : (result.data as T),\n ),\n });\n}\n"],"names":["queryOptions","useMastraClient","useQuery","selectSearchableSpans","useQueries"],"mappings":";;;;;;;;;AAYO,MAAM,sBAAA,GAAyB,CAAC,MAAA,EAAsB,OAAA,KAC3DA,uBAAA,CAAa;AAAA,EACX,QAAA,EAAU,CAAC,aAAA,EAAe,OAAO,CAAA;AAAA,EACjC,SAAS,YAAY;AACnB,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,IACxC;AACA,IAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA;AACzC,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAAA,EACA,OAAA,EAAS,CAAC,CAAC,OAAA;AAAA;AAAA,EAEX,SAAA,EAAW;AACb,CAAC;AAWI,SAAS,cACd,OAAA,EACA,EAAE,UAAU,KAAA,EAAM,GAA2B,EAAC,EACuB;AACrE,EAAA,MAAM,SAASC,qBAAA,EAAgB;AAE/B,EAAA,OAAOC,mBAAA,CAAS;AAAA,IACd,GAAG,sBAAA,CAAuB,MAAA,EAAQ,OAAO,CAAA;AAAA;AAAA,IAEzC,gBAAgB,CAAC,OAAA;AAAA,IACjB,sBAAsB,CAAC,OAAA;AAAA,IACvB,oBAAoB,CAAC,OAAA;AAAA;AAAA,IAErB,MAAA,EAAQC;AAAA,GACT,CAAA;AACH;AAQO,SAAS,oBAAA,CACd,QAAA,EACA,MAAA,EACA,QAAA,EACK;AACL,EAAA,MAAM,SAASF,qBAAA,EAAgB;AAE/B,EAAA,OAAOG,qBAAA,CAAW;AAAA,IAChB,OAAA,EAAS,QAAA,CAAS,GAAA,CAAI,CAAA,OAAA,MAAY;AAAA,MAChC,GAAG,sBAAA,CAAuB,MAAA,EAAQ,OAAO,CAAA;AAAA,MACzC,cAAA,EAAgB,KAAA;AAAA,MAChB,oBAAA,EAAsB,KAAA;AAAA,MACtB,kBAAA,EAAoB,KAAA;AAAA,MACpB,MAAA,EAAQ,CAAC,IAAA,KAAyB,MAAA,CAAO,SAAS,IAAI;AAAA,KACxD,CAAE,CAAA;AAAA,IACF,OAAA,EAAS,aACP,OAAA,CAAQ,GAAA;AAAA,MAAI,CAAC,MAAA,EAAQ,KAAA,KACnB,MAAA,CAAO,IAAA,KAAS,MAAA,GAAY,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA,IAAK,EAAE,CAAA,GAAK,MAAA,CAAO;AAAA;AACxE,GACH,CAAA;AACH;;;;;;"}
|
|
@@ -3,7 +3,6 @@ import { useQuery, queryOptions, useQueries } from '@tanstack/react-query';
|
|
|
3
3
|
import { selectSearchableSpans } from '../utils/to-searchable-spans.es.js';
|
|
4
4
|
import 'date-fns';
|
|
5
5
|
|
|
6
|
-
const IMMUTABLE_CACHE_TIME = 1e3 * 60 * 60 * 24 * 30;
|
|
7
6
|
const traceSpansQueryOptions = (client, traceId) => queryOptions({
|
|
8
7
|
queryKey: ["trace-spans", traceId],
|
|
9
8
|
queryFn: async () => {
|
|
@@ -14,16 +13,17 @@ const traceSpansQueryOptions = (client, traceId) => queryOptions({
|
|
|
14
13
|
return res;
|
|
15
14
|
},
|
|
16
15
|
enabled: !!traceId,
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const isFinished = data?.spans.every((span) => Boolean(span.endedAt));
|
|
20
|
-
return isFinished ? IMMUTABLE_CACHE_TIME : 0;
|
|
21
|
-
}
|
|
16
|
+
// Resumed runs and delayed exports can append spans even when every known span has ended.
|
|
17
|
+
staleTime: 0
|
|
22
18
|
});
|
|
23
|
-
function useTraceSpans(traceId) {
|
|
19
|
+
function useTraceSpans(traceId, { passive = false } = {}) {
|
|
24
20
|
const client = useMastraClient();
|
|
25
21
|
return useQuery({
|
|
26
22
|
...traceSpansQueryOptions(client, traceId),
|
|
23
|
+
// History rows share updates but leave automatic refreshes to the selected detail.
|
|
24
|
+
refetchOnMount: !passive,
|
|
25
|
+
refetchOnWindowFocus: !passive,
|
|
26
|
+
refetchOnReconnect: !passive,
|
|
27
27
|
// Builds each span's search haystack once per fetch, cached with the query.
|
|
28
28
|
select: selectSearchableSpans
|
|
29
29
|
});
|
|
@@ -33,6 +33,9 @@ function useTraceSpansQueries(traceIds, select, fallback) {
|
|
|
33
33
|
return useQueries({
|
|
34
34
|
queries: traceIds.map((traceId) => ({
|
|
35
35
|
...traceSpansQueryOptions(client, traceId),
|
|
36
|
+
refetchOnMount: false,
|
|
37
|
+
refetchOnWindowFocus: false,
|
|
38
|
+
refetchOnReconnect: false,
|
|
36
39
|
select: (data) => select(traceId, data)
|
|
37
40
|
})),
|
|
38
41
|
combine: (results) => results.map(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-trace-spans.es.js","sources":["../../../../src/domains/traces/hooks/use-trace-spans.ts"],"sourcesContent":["import type { MastraClient } from '@mastra/client-js';\nimport { useMastraClient } from '@mastra/react';\nimport { queryOptions, useQueries, useQuery } from '@tanstack/react-query';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport type { SearchableSpan } from '../types';\nimport { selectSearchableSpans } from '../utils';\n\
|
|
1
|
+
{"version":3,"file":"use-trace-spans.es.js","sources":["../../../../src/domains/traces/hooks/use-trace-spans.ts"],"sourcesContent":["import type { MastraClient } from '@mastra/client-js';\nimport { useMastraClient } from '@mastra/react';\nimport { queryOptions, useQueries, useQuery } from '@tanstack/react-query';\nimport type { UseQueryResult } from '@tanstack/react-query';\nimport type { SearchableSpan } from '../types';\nimport { selectSearchableSpans } from '../utils';\n\n/**\n * Key, fetcher and stale policy of the `trace-spans` query. Every observer of this key must\n * share these (rather than only the key) so one observer with a stricter `staleTime` does not\n * refetch data another one considers fresh.\n */\nexport const traceSpansQueryOptions = (client: MastraClient, traceId: string | null | undefined) =>\n queryOptions({\n queryKey: ['trace-spans', traceId],\n queryFn: async () => {\n if (!traceId) {\n throw new Error('Trace ID is required');\n }\n const res = await client.getTrace(traceId);\n return res;\n },\n enabled: !!traceId,\n // Resumed runs and delayed exports can append spans even when every known span has ended.\n staleTime: 0,\n });\n\n/**\n * Every span of a single trace, with its full payload.\n *\n * The lightweight projection exists to keep blob columns off the read path of a\n * *list*, where the cost is paid once per trace on screen. A trace that is open\n * has already narrowed that to one, and the panel both renders and searches\n * these spans -- `input`, `output` and `attributes` included -- so the\n * projection would only hide content the reader is looking at.\n */\nexport function useTraceSpans(\n traceId: string | null | undefined,\n { passive = false }: { passive?: boolean } = {},\n): UseQueryResult<{ traceId: string; spans: SearchableSpan[] } | null> {\n const client = useMastraClient();\n\n return useQuery({\n ...traceSpansQueryOptions(client, traceId),\n // History rows share updates but leave automatic refreshes to the selected detail.\n refetchOnMount: !passive,\n refetchOnWindowFocus: !passive,\n refetchOnReconnect: !passive,\n // Builds each span's search haystack once per fetch, cached with the query.\n select: selectSearchableSpans,\n });\n}\n\nexport type TraceSpansData = Awaited<ReturnType<MastraClient['getTrace']>>;\n\n/**\n * Observes the `trace-spans` query of several traces at once and projects each one with `select`.\n * Traces still loading (or failed) yield `fallback(traceId)` so the result always lines up with `traceIds`.\n */\nexport function useTraceSpansQueries<T>(\n traceIds: string[],\n select: (traceId: string, data: TraceSpansData) => T,\n fallback: (traceId: string) => T,\n): T[] {\n const client = useMastraClient();\n\n return useQueries({\n queries: traceIds.map(traceId => ({\n ...traceSpansQueryOptions(client, traceId),\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n select: (data: TraceSpansData) => select(traceId, data),\n })),\n combine: results =>\n results.map((result, index) =>\n result.data === undefined ? fallback(traceIds[index] ?? '') : (result.data as T),\n ),\n });\n}\n"],"names":[],"mappings":";;;;;AAYO,MAAM,sBAAA,GAAyB,CAAC,MAAA,EAAsB,OAAA,KAC3D,YAAA,CAAa;AAAA,EACX,QAAA,EAAU,CAAC,aAAA,EAAe,OAAO,CAAA;AAAA,EACjC,SAAS,YAAY;AACnB,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,IACxC;AACA,IAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA;AACzC,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAAA,EACA,OAAA,EAAS,CAAC,CAAC,OAAA;AAAA;AAAA,EAEX,SAAA,EAAW;AACb,CAAC;AAWI,SAAS,cACd,OAAA,EACA,EAAE,UAAU,KAAA,EAAM,GAA2B,EAAC,EACuB;AACrE,EAAA,MAAM,SAAS,eAAA,EAAgB;AAE/B,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,GAAG,sBAAA,CAAuB,MAAA,EAAQ,OAAO,CAAA;AAAA;AAAA,IAEzC,gBAAgB,CAAC,OAAA;AAAA,IACjB,sBAAsB,CAAC,OAAA;AAAA,IACvB,oBAAoB,CAAC,OAAA;AAAA;AAAA,IAErB,MAAA,EAAQ;AAAA,GACT,CAAA;AACH;AAQO,SAAS,oBAAA,CACd,QAAA,EACA,MAAA,EACA,QAAA,EACK;AACL,EAAA,MAAM,SAAS,eAAA,EAAgB;AAE/B,EAAA,OAAO,UAAA,CAAW;AAAA,IAChB,OAAA,EAAS,QAAA,CAAS,GAAA,CAAI,CAAA,OAAA,MAAY;AAAA,MAChC,GAAG,sBAAA,CAAuB,MAAA,EAAQ,OAAO,CAAA;AAAA,MACzC,cAAA,EAAgB,KAAA;AAAA,MAChB,oBAAA,EAAsB,KAAA;AAAA,MACtB,kBAAA,EAAoB,KAAA;AAAA,MACpB,MAAA,EAAQ,CAAC,IAAA,KAAyB,MAAA,CAAO,SAAS,IAAI;AAAA,KACxD,CAAE,CAAA;AAAA,IACF,OAAA,EAAS,aACP,OAAA,CAAQ,GAAA;AAAA,MAAI,CAAC,MAAA,EAAQ,KAAA,KACnB,MAAA,CAAO,IAAA,KAAS,MAAA,GAAY,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA,IAAK,EAAE,CAAA,GAAK,MAAA,CAAO;AAAA;AACxE,GACH,CAAA;AACH;;;;"}
|
|
@@ -63,11 +63,11 @@ const DEFAULT_TRACE_FILTERS_STORAGE_KEY = "mastra:traces:saved-filters";
|
|
|
63
63
|
function saveTraceFiltersToStorage(params, storageKey = DEFAULT_TRACE_FILTERS_STORAGE_KEY) {
|
|
64
64
|
const serialized = getPreservedTraceFilterParams(params);
|
|
65
65
|
const preset = params.get(TRACE_DATE_PRESET_PARAM);
|
|
66
|
-
if (preset) serialized.set(TRACE_DATE_PRESET_PARAM, preset);
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
66
|
+
if (preset && preset !== "custom") serialized.set(TRACE_DATE_PRESET_PARAM, preset);
|
|
67
|
+
if (!serialized.toString()) {
|
|
68
|
+
clearSavedTraceFilters(storageKey);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
71
|
try {
|
|
72
72
|
localStorage.setItem(storageKey, serialized.toString());
|
|
73
73
|
} catch {
|