@mastra/playground-ui 37.0.0-alpha.5 → 37.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 (82) hide show
  1. package/CHANGELOG.md +127 -0
  2. package/dist/components/Columns.cjs.js +1 -1
  3. package/dist/components/Columns.es.js +1 -1
  4. package/dist/components/RuleBuilder.cjs.js +10 -0
  5. package/dist/components/RuleBuilder.cjs.js.map +1 -0
  6. package/dist/components/RuleBuilder.d.ts +2 -0
  7. package/dist/components/RuleBuilder.es.js +2 -0
  8. package/dist/components/RuleBuilder.es.js.map +1 -0
  9. package/dist/index.cjs.js +65 -908
  10. package/dist/index.cjs.js.map +1 -1
  11. package/dist/index.es.js +18 -842
  12. package/dist/index.es.js.map +1 -1
  13. package/dist/{multi-column-B9TVKcLl.cjs → multi-column-BLp7eL6P.cjs} +1 -2
  14. package/dist/{multi-column-B9TVKcLl.cjs.map → multi-column-BLp7eL6P.cjs.map} +1 -1
  15. package/dist/{multi-column-p8sEagdM.js → multi-column-DeSb1YDE.js} +1 -2
  16. package/dist/{multi-column-p8sEagdM.js.map → multi-column-DeSb1YDE.js.map} +1 -1
  17. package/dist/rule-builder-Zs6Ywp5-.js +563 -0
  18. package/dist/rule-builder-Zs6Ywp5-.js.map +1 -0
  19. package/dist/rule-builder-vwKEUlZU.cjs +594 -0
  20. package/dist/rule-builder-vwKEUlZU.cjs.map +1 -0
  21. package/dist/src/ds/components/RuleBuilder/index.d.ts +2 -0
  22. package/dist/src/utils/colors.d.ts +1 -0
  23. package/dist/src/utils/errors.d.ts +2 -0
  24. package/dist/src/utils/file.d.ts +1 -0
  25. package/dist/src/utils/formatting.d.ts +1 -0
  26. package/dist/src/utils/json-schema.d.ts +1 -0
  27. package/dist/src/utils/number.d.ts +1 -0
  28. package/dist/src/utils/query-utils.d.ts +1 -0
  29. package/dist/src/utils/rule-engine.d.ts +2 -0
  30. package/dist/src/utils/string.d.ts +1 -0
  31. package/dist/src/utils/truncate-string.d.ts +1 -0
  32. package/dist/utils/colors.cjs.js +15 -0
  33. package/dist/utils/colors.cjs.js.map +1 -0
  34. package/dist/utils/colors.d.ts +2 -0
  35. package/dist/utils/colors.es.js +11 -0
  36. package/dist/utils/colors.es.js.map +1 -0
  37. package/dist/utils/errors.cjs.js +33 -0
  38. package/dist/utils/errors.cjs.js.map +1 -0
  39. package/dist/utils/errors.d.ts +2 -0
  40. package/dist/utils/errors.es.js +22 -0
  41. package/dist/utils/errors.es.js.map +1 -0
  42. package/dist/utils/file.cjs.js +113 -0
  43. package/dist/utils/file.cjs.js.map +1 -0
  44. package/dist/utils/file.d.ts +2 -0
  45. package/dist/utils/file.es.js +100 -0
  46. package/dist/utils/file.es.js.map +1 -0
  47. package/dist/utils/formatting.cjs.js +47 -0
  48. package/dist/utils/formatting.cjs.js.map +1 -0
  49. package/dist/utils/formatting.d.ts +2 -0
  50. package/dist/utils/formatting.es.js +41 -0
  51. package/dist/utils/formatting.es.js.map +1 -0
  52. package/dist/utils/json-schema.cjs.js +3 -0
  53. package/dist/utils/json-schema.cjs.js.map +1 -0
  54. package/dist/utils/json-schema.d.ts +2 -0
  55. package/dist/utils/json-schema.es.js +2 -0
  56. package/dist/utils/json-schema.es.js.map +1 -0
  57. package/dist/utils/number.cjs.js +10 -0
  58. package/dist/utils/number.cjs.js.map +1 -0
  59. package/dist/utils/number.d.ts +2 -0
  60. package/dist/utils/number.es.js +6 -0
  61. package/dist/utils/number.es.js.map +1 -0
  62. package/dist/utils/query-utils.cjs.js +98 -0
  63. package/dist/utils/query-utils.cjs.js.map +1 -0
  64. package/dist/utils/query-utils.d.ts +2 -0
  65. package/dist/utils/query-utils.es.js +88 -0
  66. package/dist/utils/query-utils.es.js.map +1 -0
  67. package/dist/utils/rule-engine.cjs.js +29 -0
  68. package/dist/utils/rule-engine.cjs.js.map +1 -0
  69. package/dist/utils/rule-engine.d.ts +2 -0
  70. package/dist/utils/rule-engine.es.js +21 -0
  71. package/dist/utils/rule-engine.es.js.map +1 -0
  72. package/dist/utils/string.cjs.js +11 -0
  73. package/dist/utils/string.cjs.js.map +1 -0
  74. package/dist/utils/string.d.ts +2 -0
  75. package/dist/utils/string.es.js +7 -0
  76. package/dist/utils/string.es.js.map +1 -0
  77. package/dist/utils/truncate-string.cjs.js +11 -0
  78. package/dist/utils/truncate-string.cjs.js.map +1 -0
  79. package/dist/utils/truncate-string.d.ts +2 -0
  80. package/dist/utils/truncate-string.es.js +7 -0
  81. package/dist/utils/truncate-string.es.js.map +1 -0
  82. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/lib/string.ts","../src/lib/number.ts","../src/lib/object.ts","../src/lib/formatting.ts","../src/lib/colors.ts","../src/lib/truncate-string.ts","../src/lib/errors.ts","../src/lib/query-utils.ts","../src/lib/rule-engine/utils/index.ts","../src/lib/rule-engine/components/schema-utils.ts","../src/lib/rule-engine/components/rule-field-select.tsx","../src/lib/rule-engine/components/types.ts","../src/lib/rule-engine/components/rule-operator-select.tsx","../src/lib/rule-engine/components/rule-value-input.tsx","../src/lib/rule-engine/components/rule-row.tsx","../src/lib/rule-engine/components/rule-builder.tsx","../src/lib/resize/panel-edge-icon.tsx","../src/lib/resize/panel-icon-button.ts","../src/lib/resize/use-clamped-element-cursor.ts","../src/lib/resize/collapsible-panel.tsx","../src/lib/resize/separator.tsx","../src/lib/resize/panel-drawer.tsx","../src/lib/file/constants.ts","../src/lib/file/schemes.ts","../src/lib/file/contentTypeFromUrl.ts","../src/lib/file/downloadJson.ts","../src/lib/file/toBase64.ts","../src/lib/template/generate-default-values.ts","../src/store/playground-store.ts","../src/domains/metrics/metrics-filters.ts","../src/domains/metrics/hooks/use-metrics.tsx","../src/domains/metrics/components/date-range-selector.tsx","../src/domains/metrics/components/metrics-utils.ts","../src/domains/metrics/components/bar-list.tsx","../src/domains/metrics/components/card-action-buttons.tsx","../src/domains/metrics/components/kpi-card-view.tsx","../src/domains/metrics/components/latency-card-view.tsx","../src/domains/metrics/components/memory-card-view.tsx","../src/domains/metrics/components/model-usage-cost-card-view.tsx","../src/domains/metrics/components/scores-card-view.tsx","../src/domains/metrics/components/token-usage-by-agent-card-view.tsx","../src/domains/metrics/components/token-usage-timeline-card-view.tsx","../src/domains/metrics/components/traces-volume-card-view.tsx","../src/domains/metrics/hooks/use-metrics-filters.tsx","../src/domains/metrics/hooks/use-agent-runs-kpi-metrics.tsx","../src/domains/metrics/hooks/use-model-cost-kpi-metrics.tsx","../src/domains/metrics/hooks/use-total-tokens-kpi-metrics.tsx","../src/domains/metrics/hooks/use-model-usage-cost-metrics.tsx","../src/domains/metrics/hooks/use-latency-metrics.tsx","../src/domains/metrics/hooks/use-trace-volume-metrics.tsx","../src/domains/metrics/hooks/use-scores-metrics.tsx","../src/domains/metrics/hooks/use-token-usage-by-agent-metrics.tsx","../src/domains/metrics/hooks/use-token-usage-timeseries.tsx","../src/domains/metrics/hooks/use-active-threads-kpi-metrics.tsx","../src/domains/metrics/hooks/use-active-resources-kpi-metrics.tsx","../src/domains/metrics/hooks/use-top-active-threads-metrics.tsx","../src/domains/metrics/hooks/use-top-resources-by-threads-metrics.tsx","../src/domains/logs/log-filters.ts","../src/domains/traces/trace-filters.ts","../src/domains/metrics/drilldown.ts","../src/domains/metrics/hooks/use-drilldown.tsx","../src/domains/traces/components/format-hierarchical-spans.ts","../src/domains/traces/components/shared.tsx","../src/domains/traces/components/span-token-usage.utils.ts","../src/domains/traces/components/span-token-usage.tsx","../src/domains/traces/components/timeline-expand-col.tsx","../src/domains/traces/components/timeline-structure-sign.tsx","../src/domains/traces/components/timeline-name-col.tsx","../src/domains/traces/components/timeline-timing-col.tsx","../src/domains/traces/components/trace-keys-and-values.tsx","../src/domains/traces/hooks/get-all-span-ids.ts","../src/domains/traces/components/trace-timeline-span.tsx","../src/domains/traces/components/trace-timeline.tsx","../src/domains/traces/components/traces-toolbar.tsx","../src/domains/traces/hooks/use-download-trace-json.ts","../src/domains/traces/components/trace-data-panel-view.tsx","../src/domains/traces/utils/span-utils.ts","../src/domains/traces/components/span-data-panel-view.tsx","../src/domains/traces/components/span-details-view.tsx","../src/domains/traces/components/trace-details-view.tsx","../src/domains/traces/components/traces-layout.tsx","../src/domains/traces/components/traces-list-view.tsx","../src/domains/traces/components/traces-list-mode-toggle.tsx","../src/domains/traces/components/traces-error-content.tsx","../src/domains/traces/components/no-traces-info.tsx","../src/domains/traces/hooks/use-branch.ts","../src/domains/traces/hooks/use-span-detail.ts","../src/domains/traces/hooks/use-trace-light-spans.ts","../src/domains/traces/hooks/use-trace-or-branch-spans.ts","../src/domains/traces/hooks/use-trace-spans.ts","../src/domains/traces/hooks/use-traces.tsx","../src/domains/traces/hooks/use-tags.ts","../src/domains/traces/hooks/use-entity-names.ts","../src/domains/traces/hooks/use-environments.ts","../src/domains/traces/hooks/use-service-names.ts","../src/domains/traces/hooks/use-trace-span-navigation.tsx","../src/domains/traces/hooks/use-trace-list-navigation.tsx","../src/domains/traces/hooks/use-trace-url-state.tsx","../src/domains/traces/hooks/use-trace-filter-persistence.tsx","../src/domains/traces/types.ts","../src/domains/logs/components/log-details-view.tsx","../src/domains/logs/components/logs-error-content.tsx","../src/domains/logs/components/logs-layout.tsx","../src/domains/logs/components/logs-list-view.tsx","../src/domains/logs/components/logs-toolbar.tsx","../src/domains/logs/components/no-logs-info.tsx","../src/domains/logs/hooks/use-logs.ts","../src/domains/logs/hooks/use-logs-url-state.tsx","../src/domains/logs/hooks/use-logs-filter-persistence.tsx","../src/domains/logs/hooks/use-logs-list-navigation.tsx","../src/domains/memory/components/observation-detail-view.tsx","../src/domains/memory/components/thread-context-progress-utils.ts","../src/domains/memory/components/thread-context-progress.tsx","../src/domains/memory/lib/timeline.ts","../src/domains/memory/lib/replay-selection.ts","../src/domains/memory/components/flame-graph.tsx","../src/domains/memory/lib/extract-markers.ts","../src/domains/memory/lib/thread-context-window-state.ts","../src/domains/memory/components/memory-studio-panel.tsx","../src/domains/memory/hooks/use-memory-thread-messages.ts","../src/domains/memory/hooks/use-observational-memory.ts","../src/domains/memory/hooks/use-memory-status.ts","../src/ee/topics/components/topics-layout.tsx","../src/ee/topics/utils.ts","../src/ee/topics/components/topic-trace-summary-list.tsx","../src/ee/topics/components/topic-trace-details-panel.tsx","../src/ee/signals/signals-chart-data.ts","../src/ee/signals/signals-data.ts","../src/ee/signals/components/signal-details-page.tsx","../src/ee/signals/components/signal-details-utils.ts","../src/ee/signals/components/signals-overview-page.tsx"],"sourcesContent":["export const lodashTitleCase = (str: string): string => {\n // First convert to camel case (handles various separators like spaces, hyphens, underscores)\n const camelCased = str\n .replace(/[-_\\s]+(.)?/g, (_, char) => (char ? char.toUpperCase() : ''))\n .replace(/^(.)/, char => char.toLowerCase());\n\n // Then convert to start case (capitalize first letter of each word)\n return camelCased\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, str => str.toUpperCase())\n .trim();\n};\n","export const toSigFigs = (num: number, sigFigs: number) => {\n // toPrecision returns significant digits formatted with potentially exponential notation\n // Number() converts the exponential notation to a regular number\n return Number(num.toPrecision(sigFigs));\n};\n","/**\n * Checks if object is empty\n * @param objectName\n * @returns boolean\n */\nexport const isObjectEmpty = (objectName: Object) => {\n return objectName && Object.keys(objectName).length === 0 && objectName.constructor === Object;\n};\n","/* eslint-disable @typescript-eslint/consistent-type-imports */\n\nlet prettierModules:\n | Promise<\n [\n typeof import('prettier/standalone'),\n typeof import('prettier/plugins/babel'),\n typeof import('prettier/plugins/estree'),\n ]\n >\n | undefined;\n\nconst loadPrettier = () =>\n (prettierModules ??= Promise.all([\n import('prettier/standalone'),\n import('prettier/plugins/babel'),\n import('prettier/plugins/estree'),\n ]).catch(error => {\n prettierModules = undefined;\n throw error;\n }));\n\nexport const formatJSON = async (code: string) => {\n const [prettier, prettierPluginBabel, prettierPluginEstree] = await loadPrettier();\n\n const formatted = await prettier.format(code, {\n semi: false,\n parser: 'json',\n printWidth: 80,\n tabWidth: 2,\n plugins: [prettierPluginBabel, prettierPluginEstree],\n });\n\n return formatted;\n};\n\nexport const formatTypeScript = async (code: string) => {\n const [prettier, prettierPluginBabel, prettierPluginEstree] = await loadPrettier();\n\n const formatted = await prettier.format(code, {\n parser: 'babel-ts',\n printWidth: 80,\n tabWidth: 2,\n plugins: [prettierPluginBabel, prettierPluginEstree],\n });\n\n return formatted;\n};\n\nexport const isValidJson = (str: string) => {\n try {\n // Attempt to parse the string as JSON\n const obj = JSON.parse(str);\n\n // Additionally check if the parsed result is an object\n return !!obj && typeof obj === 'object';\n } catch {\n // If parsing throws an error, it's not valid JSON\n return false;\n }\n};\n","export const stringToColor = (str: string, lightness: number = 90, saturation = 100) => {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\n hash = hash & hash;\n }\n return `hsl(${hash % 360}, ${saturation}%, ${lightness}%)`;\n};\n","export function truncateString(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength) + '…';\n}\n","const errorFallback = 'Something went wrong while fetching the data.';\nexport const parseError = (error: Error) => {\n try {\n const httpErrorPattern = /^HTTP error! status:\\s*\\d+\\s*- \\s*/;\n const errorMessage = error?.message.replace(httpErrorPattern, '');\n const jsonError = JSON.parse(errorMessage || '{}');\n return {\n error: jsonError?.error || errorFallback,\n stack: jsonError?.stack || error?.stack,\n };\n } catch {\n return {\n error: error?.message || errorFallback,\n stack: undefined,\n };\n }\n};\n","/**\n * HTTP status codes that should not be retried.\n * - 400: Bad Request (client error, won't change)\n * - 401: Unauthorized (needs re-auth, not retry)\n * - 403: Forbidden (RBAC permission denied)\n * - 404: Not Found (resource doesn't exist)\n */\nconst HTTP_NO_RETRY_STATUSES = [400, 401, 403, 404];\n\n/**\n * Check if error is a 401 Unauthorized response.\n * Indicates the user's session has expired or token is invalid.\n * Handles both direct status property and client-js error message format.\n */\nexport function is401UnauthorizedError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n // Check for status property (direct response or wrapped)\n if ('status' in error && (error as { status: number }).status === 401) {\n return true;\n }\n\n // Check for statusCode property (some HTTP clients)\n if ('statusCode' in error && (error as { statusCode: number }).statusCode === 401) {\n return true;\n }\n\n // Check error message for client-js pattern: \"HTTP error! status: 401\"\n if ('message' in error) {\n const message = (error as { message: unknown }).message;\n if (typeof message === 'string') {\n return /\\bstatus:\\s*401\\b/.test(message);\n }\n }\n\n return false;\n}\n\n/**\n * Check if error is a 403 Forbidden response.\n * Handles both direct status property and client-js error message format.\n */\nexport function is403ForbiddenError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n // Check for status property (direct response or wrapped)\n if ('status' in error && (error as { status: number }).status === 403) {\n return true;\n }\n\n // Check for statusCode property (some HTTP clients)\n if ('statusCode' in error && (error as { statusCode: number }).statusCode === 403) {\n return true;\n }\n\n // Check error message for client-js pattern: \"HTTP error! status: 403\"\n if ('message' in error) {\n const message = (error as { message: unknown }).message;\n if (typeof message === 'string') {\n return /\\bstatus:\\s*403\\b/.test(message);\n }\n }\n\n return false;\n}\n\n/**\n * Check if error is a 404 Not Found response.\n * Handles both direct status property and client-js error message format.\n */\nexport function is404NotFoundError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n if ('status' in error && (error as { status: number }).status === 404) {\n return true;\n }\n\n if ('statusCode' in error && (error as { statusCode: number }).statusCode === 404) {\n return true;\n }\n\n if ('message' in error) {\n const message = (error as { message: unknown }).message;\n if (typeof message === 'string') {\n return /\\bstatus:\\s*404\\b/.test(message);\n }\n }\n\n return false;\n}\n\n/**\n * Check if an error came from a storage provider that does not implement `listBranches`.\n *\n * The server's `handleError` strips the original MastraError's `code`/`id` before serializing,\n * so we can't match on the ID `OBSERVABILITY_STORAGE_LIST_BRANCHES_NOT_IMPLEMENTED` directly —\n * we match on the message text from `core/.../observability/base.ts` instead.\n */\nexport function isBranchesNotSupportedError(error: unknown): boolean {\n if (!error || typeof error !== 'object' || !('message' in error)) return false;\n const message = (error as { message: unknown }).message;\n if (typeof message !== 'string') return false;\n return message.includes('does not support listing trace branches');\n}\n\nexport type UnsupportedObservabilityOperation = 'logs' | 'metrics' | 'scores' | 'feedback';\n\n/**\n * Check if an error came from an observability storage provider that does not\n * implement a list operation. These are capability gaps, not transient failures.\n *\n * The server serializes these as plain HTTP errors, so the original MastraError\n * ID is not available in the browser. Match the stable base-storage message text\n * instead, like the trace branch support check above.\n */\nexport function isUnsupportedObservabilityOperationError(\n error: unknown,\n operation: UnsupportedObservabilityOperation,\n): boolean {\n if (!error || typeof error !== 'object' || !('message' in error)) return false;\n const message = (error as { message: unknown }).message;\n if (typeof message !== 'string') return false;\n return message.includes(`does not support listing ${operation}`);\n}\n\n/**\n * Check if error has a status code that shouldn't be retried.\n * Used to prevent retrying client errors that won't resolve.\n */\nexport function isNonRetryableError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n\n // Check for status property\n if ('status' in error) {\n const status = (error as { status: number }).status;\n return HTTP_NO_RETRY_STATUSES.includes(status);\n }\n\n // Check for statusCode property\n if ('statusCode' in error) {\n const statusCode = (error as { statusCode: number }).statusCode;\n return HTTP_NO_RETRY_STATUSES.includes(statusCode);\n }\n\n // Check error message for client-js pattern\n if ('message' in error) {\n const message = (error as { message: unknown }).message;\n if (typeof message === 'string') {\n return HTTP_NO_RETRY_STATUSES.some(code => new RegExp(`\\\\bstatus:\\\\s*${code}\\\\b`).test(message));\n }\n }\n\n return false;\n}\n\n/**\n * Default retry function for TanStack Query.\n * Does not retry 4xx client errors (400, 401, 403, 404).\n * Retries other errors up to 3 times.\n */\nexport function shouldRetryQuery(failureCount: number, error: unknown): boolean {\n // Don't retry client errors - they won't resolve with retries\n if (isNonRetryableError(error)) {\n return false;\n }\n // Default: retry up to 3 times for transient errors\n return failureCount < 3;\n}\n","import type { Rule, RuleGroup } from '../types';\n\n/**\n * Type guard: checks if a condition is a leaf Rule\n */\nexport const isRule = (condition: Rule | RuleGroup): condition is Rule => 'field' in condition;\n\n/**\n * Type guard: checks if a condition is a nested RuleGroup\n */\nexport const isRuleGroup = (condition: Rule | RuleGroup): condition is RuleGroup => 'conditions' in condition;\n\n/**\n * Recursively counts the number of leaf Rule nodes in a RuleGroup\n */\nexport const countLeafRules = (group: RuleGroup | undefined): number => {\n if (!group) return 0;\n return group.conditions.reduce((count, condition) => {\n if (isRule(condition)) return count + 1;\n return count + countLeafRules(condition);\n }, 0);\n};\n\n/**\n * Creates a default empty rule\n */\nexport const createDefaultRule = (): Rule => ({\n field: '',\n operator: 'equals',\n value: '',\n});\n\n/**\n * Creates a default empty rule group\n */\nexport const createDefaultRuleGroup = (operator: 'AND' | 'OR' = 'AND'): RuleGroup => ({\n operator,\n conditions: [createDefaultRule()],\n});\n","import type { FieldOption, JsonSchema, JsonSchemaProperty } from './types';\n\n/**\n * Gets the primary type from a JSON Schema property\n */\nexport const getPropertyType = (property: JsonSchemaProperty): string => {\n if (Array.isArray(property.type)) {\n // Return the first non-null type\n return property.type.find(t => t !== 'null') || 'string';\n }\n return property.type || 'string';\n};\n\n/**\n * Checks if a property has nested children (object or array of objects)\n */\nexport const hasNestedChildren = (property: JsonSchemaProperty): boolean => {\n const type = getPropertyType(property);\n\n if (type === 'object' && property.properties) {\n return Object.keys(property.properties).length > 0;\n }\n\n if (type === 'array' && property.items) {\n const itemType = getPropertyType(property.items);\n return itemType === 'object' && !!property.items.properties;\n }\n\n return false;\n};\n\n/**\n * Extracts field options from JSON Schema properties at a given level\n */\nexport const getFieldOptionsFromProperties = (\n properties: Record<string, JsonSchemaProperty> | undefined,\n parentPath: string = '',\n): FieldOption[] => {\n if (!properties) return [];\n\n return Object.entries(properties).map(([key, property]) => {\n const path = parentPath ? `${parentPath}.${key}` : key;\n const type = getPropertyType(property);\n const hasChildren = hasNestedChildren(property);\n\n return {\n path,\n label: property.title || key,\n type,\n hasChildren,\n children: type === 'object' ? property.properties : undefined,\n items: type === 'array' ? property.items : undefined,\n };\n });\n};\n\n/**\n * Gets field options from the root schema\n */\nexport const getFieldOptionsFromSchema = (schema: JsonSchema): FieldOption[] => {\n return getFieldOptionsFromProperties(schema.properties);\n};\n\n/**\n * Gets child field options for a given field option\n */\nexport const getChildFieldOptions = (fieldOption: FieldOption, currentPath: string): FieldOption[] => {\n if (fieldOption.type === 'object' && fieldOption.children) {\n return getFieldOptionsFromProperties(fieldOption.children, currentPath);\n }\n\n if (fieldOption.type === 'array' && fieldOption.items) {\n const itemType = getPropertyType(fieldOption.items);\n if (itemType === 'object' && fieldOption.items.properties) {\n // For arrays, we use the current path directly (user will access via index or iteration)\n return getFieldOptionsFromProperties(fieldOption.items.properties, currentPath);\n }\n }\n\n return [];\n};\n\n/**\n * Parses a field path into segments\n */\nexport const parseFieldPath = (path: string): string[] => {\n return path.split('.').filter(Boolean);\n};\n\n/**\n * Gets the field option at a specific path in the schema\n */\nexport const getFieldOptionAtPath = (schema: JsonSchema, path: string): FieldOption | undefined => {\n const segments = parseFieldPath(path);\n if (segments.length === 0) return undefined;\n\n let currentProperties = schema.properties;\n let currentPath = '';\n let result: FieldOption | undefined;\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n if (!currentProperties || !currentProperties[segment]) {\n return undefined;\n }\n\n const property = currentProperties[segment];\n currentPath = currentPath ? `${currentPath}.${segment}` : segment;\n const type = getPropertyType(property);\n const hasChildren = hasNestedChildren(property);\n\n result = {\n path: currentPath,\n label: property.title || segment,\n type,\n hasChildren,\n children: type === 'object' ? property.properties : undefined,\n items: type === 'array' ? property.items : undefined,\n };\n\n // Navigate deeper\n if (type === 'object' && property.properties) {\n currentProperties = property.properties;\n } else if (type === 'array' && property.items?.properties) {\n currentProperties = property.items.properties;\n } else {\n currentProperties = undefined;\n }\n }\n\n return result;\n};\n","import { Braces, Hash, List, ToggleLeft, Type } from 'lucide-react';\nimport * as React from 'react';\n\nimport { getFieldOptionsFromSchema, getFieldOptionAtPath, getChildFieldOptions, parseFieldPath } from './schema-utils';\nimport type { FieldOption, RuleFieldSelectProps } from './types';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/ds/components/Select/select';\nimport { Icon } from '@/ds/icons';\nimport { cn } from '@/lib/utils';\n\n/**\n * Get icon for a field type\n */\nconst getFieldTypeIcon = (type: string): React.ReactNode => {\n switch (type) {\n case 'object':\n return <Braces />;\n case 'array':\n return <List />;\n case 'number':\n case 'integer':\n return <Hash />;\n case 'boolean':\n return <ToggleLeft />;\n case 'string':\n default:\n return <Type />;\n }\n};\n\n/**\n * A single level of field selection\n */\ntype FieldLevelSelectProps = {\n options: FieldOption[];\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n className?: string;\n};\n\nconst FieldLevelSelect: React.FC<FieldLevelSelectProps> = ({\n options,\n value,\n onChange,\n placeholder = 'Select field',\n className,\n}) => {\n return (\n <div className={cn('relative', className)}>\n <Select value={value} onValueChange={onChange}>\n <SelectTrigger className=\"min-w-[140px] text-neutral6 bg-surface4\" size=\"sm\">\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options.map(option => (\n <SelectItem key={option.path} value={option.path}>\n <span className=\"flex items-center gap-2\">\n <Icon size=\"sm\" className=\"text-neutral3\">\n {getFieldTypeIcon(option.type)}\n </Icon>\n {option.label}\n {option.hasChildren && <span className=\"text-neutral3\">...</span>}\n </span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n );\n};\n\n/**\n * Recursive field selector that shows additional dropdowns for nested objects/arrays\n */\nexport const RuleFieldSelect: React.FC<RuleFieldSelectProps> = ({ schema, value, onChange, className }) => {\n // Parse the current path into segments\n const pathSegments = React.useMemo(() => parseFieldPath(value), [value]);\n\n // Build the list of selectors needed based on the current value\n const selectors = React.useMemo(() => {\n const result: Array<{\n options: FieldOption[];\n value: string;\n basePath: string;\n }> = [];\n\n // First level: root schema properties\n const rootOptions = getFieldOptionsFromSchema(schema);\n if (rootOptions.length === 0) return result;\n\n result.push({\n options: rootOptions,\n value: pathSegments[0] || '',\n basePath: '',\n });\n\n // For each segment, check if we need to add more selectors\n let currentPath = '';\n for (let i = 0; i < pathSegments.length; i++) {\n const segment = pathSegments[i];\n currentPath = currentPath ? `${currentPath}.${segment}` : segment;\n\n const fieldOption = getFieldOptionAtPath(schema, currentPath);\n if (!fieldOption || !fieldOption.hasChildren) break;\n\n // Get child options for the next level\n const childOptions = getChildFieldOptions(fieldOption, currentPath);\n if (childOptions.length === 0) break;\n\n // Check if there's a next segment selected\n const nextSegment = pathSegments[i + 1];\n const nextPath = nextSegment ? `${currentPath}.${nextSegment}` : '';\n\n result.push({\n options: childOptions,\n value: nextPath,\n basePath: currentPath,\n });\n }\n\n return result;\n }, [schema, pathSegments]);\n\n // Handle change at a specific level\n const handleChange = React.useCallback(\n (levelIndex: number, newValue: string) => {\n // When changing a level, we truncate any deeper selections\n onChange(newValue);\n },\n [onChange],\n );\n\n if (selectors.length === 0) {\n return <div className={cn('text-sm text-neutral3', className)}>No fields available</div>;\n }\n\n return (\n <div className={cn('flex items-center gap-1', className)}>\n {selectors.map((selector, index) => (\n <React.Fragment key={`${selector.basePath}-${index}`}>\n {index > 0 && <span className=\"text-neutral3\">.</span>}\n <FieldLevelSelect\n options={selector.options}\n value={selector.value}\n onChange={newValue => handleChange(index, newValue)}\n placeholder={index === 0 ? 'Select field' : 'Select property'}\n />\n </React.Fragment>\n ))}\n </div>\n );\n};\n","import type { ConditionOperator, Rule, RuleGroup } from '../types';\nimport type { JsonSchema, JsonSchemaProperty } from '@/lib/json-schema';\n\nexport type { JsonSchema, JsonSchemaProperty };\n\n/**\n * Represents a field option extracted from JSON Schema\n */\nexport type FieldOption = {\n /** The field path (e.g., \"user.email\") */\n path: string;\n /** Display label */\n label: string;\n /** The JSON Schema type of the field */\n type: string;\n /** Whether this field has nested properties */\n hasChildren: boolean;\n /** Child properties if type is object */\n children?: Record<string, JsonSchemaProperty>;\n /** Item schema if type is array */\n items?: JsonSchemaProperty;\n};\n\n/**\n * Props for the RuleBuilder root component\n */\nexport type RuleBuilderProps = {\n /** JSON Schema defining available fields */\n schema: JsonSchema;\n /** Current rule group (recursive, supports nested groups) */\n ruleGroup: RuleGroup | undefined;\n /** Callback when rule group changes */\n onChange: (ruleGroup: RuleGroup | undefined) => void;\n /** Maximum nesting depth (default: 3) */\n maxDepth?: number;\n /** Optional class name */\n className?: string;\n};\n\n/**\n * Internal props for the recursive RuleGroupView component\n */\nexport type RuleGroupViewProps = {\n /** JSON Schema defining available fields */\n schema: JsonSchema;\n /** The rule group to render */\n group: RuleGroup;\n /** Callback when this group changes */\n onChange: (group: RuleGroup) => void;\n /** Callback to remove this group (undefined for root) */\n onRemove?: () => void;\n /** Current nesting depth (0 = root) */\n depth: number;\n /** Maximum nesting depth */\n maxDepth: number;\n};\n\n/**\n * Props for a single rule row\n */\nexport type RuleRowProps = {\n /** JSON Schema defining available fields */\n schema: JsonSchema;\n /** Current rule */\n rule: Rule;\n /** Callback when rule changes */\n onChange: (rule: Rule) => void;\n /** Callback to remove this rule */\n onRemove: () => void;\n /** Optional class name */\n className?: string;\n};\n\n/**\n * Props for the field selector\n */\nexport type RuleFieldSelectProps = {\n /** JSON Schema defining available fields */\n schema: JsonSchema;\n /** Current selected field path */\n value: string;\n /** Callback when field changes */\n onChange: (field: string) => void;\n /** Optional class name */\n className?: string;\n};\n\n/**\n * Props for the operator selector\n */\nexport type RuleOperatorSelectProps = {\n /** Current selected operator */\n value: ConditionOperator;\n /** Callback when operator changes */\n onChange: (operator: ConditionOperator) => void;\n /** Subset of operators to show. Defaults to all operators. */\n operators?: readonly ConditionOperator[];\n /** Optional class name */\n className?: string;\n};\n\n/**\n * Props for the value input\n */\nexport type RuleValueInputProps = {\n /** Current value */\n value: unknown;\n /** Callback when value changes */\n onChange: (value: unknown) => void;\n /** The operator (affects input behavior for \"in\" and \"not_in\") */\n operator: ConditionOperator;\n /** The field type from JSON Schema (string, number, boolean, etc.) */\n fieldType?: string;\n /** Optional placeholder */\n placeholder?: string;\n /** Optional class name */\n className?: string;\n};\n\n/**\n * Operator labels for display\n */\nexport const OPERATOR_LABELS: Record<ConditionOperator, string> = {\n equals: 'equals',\n not_equals: 'not equals',\n contains: 'contains',\n not_contains: 'not contains',\n greater_than: 'greater than',\n less_than: 'less than',\n greater_than_or_equal: 'greater than or equal',\n less_than_or_equal: 'less than or equal',\n in: 'in',\n not_in: 'not in',\n exists: 'exists',\n not_exists: 'not exists',\n};\n\n/**\n * All available operators\n */\nexport const OPERATORS: ConditionOperator[] = [\n 'equals',\n 'not_equals',\n 'contains',\n 'not_contains',\n 'greater_than',\n 'less_than',\n 'greater_than_or_equal',\n 'less_than_or_equal',\n 'in',\n 'not_in',\n 'exists',\n 'not_exists',\n];\n","import {\n Equal,\n EqualNot,\n Text,\n TextSearch,\n ChevronRight,\n ChevronLeft,\n ChevronsRight,\n ChevronsLeft,\n List,\n ListX,\n Check,\n Ban,\n} from 'lucide-react';\nimport * as React from 'react';\n\nimport type { ConditionOperator } from '../types';\nimport type { RuleOperatorSelectProps } from './types';\nimport { OPERATOR_LABELS, OPERATORS } from './types';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/ds/components/Select/select';\nimport { Icon } from '@/ds/icons';\nimport { cn } from '@/lib/utils';\n\n/**\n * Icons for each operator type\n */\nconst OPERATOR_ICONS: Record<ConditionOperator, React.ReactNode> = {\n equals: <Equal />,\n not_equals: <EqualNot />,\n contains: <TextSearch />,\n not_contains: <Text />,\n greater_than: <ChevronRight />,\n less_than: <ChevronLeft />,\n greater_than_or_equal: <ChevronsRight />,\n less_than_or_equal: <ChevronsLeft />,\n in: <List />,\n not_in: <ListX />,\n exists: <Check />,\n not_exists: <Ban />,\n};\n\n/**\n * Select component for choosing a rule operator\n */\nexport const RuleOperatorSelect: React.FC<RuleOperatorSelectProps> = ({ value, onChange, operators, className }) => {\n const operatorList = operators ?? OPERATORS;\n\n return (\n <div className={cn('relative', className)}>\n <Select value={value} onValueChange={onChange}>\n <SelectTrigger className=\"min-w-[150px] text-neutral6 bg-surface4\" size=\"sm\">\n <SelectValue placeholder=\"Select operator\" />\n </SelectTrigger>\n <SelectContent>\n {operatorList.map(operator => (\n <SelectItem key={operator} value={operator}>\n <span className=\"flex items-center gap-2\">\n <Icon size=\"sm\" className=\"text-neutral3\">\n {OPERATOR_ICONS[operator]}\n </Icon>\n {OPERATOR_LABELS[operator]}\n </span>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n );\n};\n","import { Hash, ToggleLeft, Type } from 'lucide-react';\nimport * as React from 'react';\n\nimport type { RuleValueInputProps } from './types';\nimport { Input } from '@/ds/components/Input/input';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/ds/components/Select/select';\nimport { Icon } from '@/ds/icons';\nimport { cn } from '@/lib/utils';\n\n/**\n * Parses a string value to the appropriate type\n */\nconst parseValue = (stringValue: string): unknown => {\n const trimmed = stringValue.trim();\n\n // Empty string\n if (trimmed === '') return '';\n\n // Boolean\n if (trimmed === 'true') return true;\n if (trimmed === 'false') return false;\n\n // Null\n if (trimmed === 'null') return null;\n\n // Reject special number strings - keep as strings\n const lowerTrimmed = trimmed.toLowerCase();\n if (lowerTrimmed === 'infinity' || lowerTrimmed === '-infinity' || lowerTrimmed === 'nan') {\n return trimmed;\n }\n\n // Number\n const num = Number(trimmed);\n if (!Number.isNaN(num)) return num;\n\n // String (default)\n return stringValue;\n};\n\n/**\n * Parses a comma-separated string into an array of values\n */\nconst parseArrayValue = (stringValue: string): unknown[] => {\n if (stringValue.trim() === '') return [];\n\n return stringValue.split(',').map(item => parseValue(item.trim()));\n};\n\n/**\n * Converts a value to a display string\n */\nconst valueToString = (value: unknown): string => {\n if (value === null) return 'null';\n if (value === undefined) return '';\n if (Array.isArray(value)) return value.map(valueToString).join(', ');\n return String(value);\n};\n\n/**\n * Converts a boolean value to a string for the select\n */\nconst booleanToString = (value: unknown): string => {\n if (value === true) return 'true';\n if (value === false) return 'false';\n return '';\n};\n\ntype BaseInputProps = {\n value: unknown;\n onChange: (value: unknown) => void;\n placeholder?: string;\n className?: string;\n};\n\n/**\n * Boolean value input using a Select dropdown with icon inside\n */\nconst BooleanValueInput: React.FC<BaseInputProps> = ({ value, onChange, className }) => {\n const stringValue = booleanToString(value);\n\n const handleChange = React.useCallback(\n (newValue: string) => {\n onChange(newValue === 'true');\n },\n [onChange],\n );\n\n return (\n <div className={cn('relative', className)}>\n <Icon size=\"sm\" className=\"absolute left-2 top-1/2 -translate-y-1/2 text-neutral3 pointer-events-none z-10\">\n <ToggleLeft />\n </Icon>\n <Select value={stringValue} onValueChange={handleChange}>\n <SelectTrigger className=\"min-w-[140px] bg-surface4 pl-7\" size=\"sm\">\n <SelectValue placeholder=\"Select value\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"true\">true</SelectItem>\n <SelectItem value=\"false\">false</SelectItem>\n </SelectContent>\n </Select>\n </div>\n );\n};\n\n/**\n * Number value input with icon inside\n */\nconst NumberValueInput: React.FC<BaseInputProps> = ({ value, onChange, placeholder, className }) => {\n const displayValue = value === undefined || value === '' ? '' : String(value);\n\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const inputValue = e.target.value;\n if (inputValue === '') {\n onChange('');\n } else {\n const num = Number(inputValue);\n onChange(Number.isNaN(num) ? inputValue : num);\n }\n },\n [onChange],\n );\n\n return (\n <div className={cn('relative', className)}>\n <Icon size=\"sm\" className=\"absolute left-2 top-1/2 -translate-y-1/2 text-neutral3 pointer-events-none\">\n <Hash />\n </Icon>\n <Input\n type=\"number\"\n value={displayValue}\n onChange={handleChange}\n placeholder={placeholder || 'Enter number'}\n className=\"min-w-[140px] bg-surface4 pl-7\"\n size=\"sm\"\n />\n </div>\n );\n};\n\n/**\n * Text value input with icon inside\n */\nconst TextValueInput: React.FC<BaseInputProps> = ({ value, onChange, placeholder, className }) => {\n const displayValue = valueToString(value);\n\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(parseValue(e.target.value));\n },\n [onChange],\n );\n\n return (\n <div className={cn('relative', className)}>\n <Icon size=\"sm\" className=\"absolute left-2 top-1/2 -translate-y-1/2 text-neutral3 pointer-events-none\">\n <Type />\n </Icon>\n <Input\n value={displayValue}\n onChange={handleChange}\n placeholder={placeholder || 'Enter value'}\n className=\"min-w-[140px] bg-surface4 pl-7\"\n size=\"sm\"\n />\n </div>\n );\n};\n\n/**\n * Array value input (for \"in\" and \"not_in\" operators)\n */\nconst ArrayValueInput: React.FC<BaseInputProps> = ({ value, onChange, placeholder, className }) => {\n const displayValue = React.useMemo(() => {\n if (Array.isArray(value)) {\n return value.map(valueToString).join(', ');\n }\n return valueToString(value);\n }, [value]);\n\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(parseArrayValue(e.target.value));\n },\n [onChange],\n );\n\n return (\n <Input\n value={displayValue}\n onChange={handleChange}\n placeholder={placeholder || 'Enter values (comma-separated)'}\n className={cn('min-w-[160px] bg-surface4', className)}\n size=\"sm\"\n />\n );\n};\n\n/**\n * Input component for entering rule values\n * Supports different modes based on the operator and field type:\n * - \"in\" and \"not_in\": Comma-separated values (parsed as array)\n * - Boolean fields: Select dropdown with true/false\n * - Number fields: Number input\n * - Other: Text input\n */\nexport const RuleValueInput: React.FC<RuleValueInputProps> = ({\n value,\n onChange,\n operator,\n fieldType,\n placeholder,\n className,\n}) => {\n const isArrayOperator = operator === 'in' || operator === 'not_in';\n\n // Array operators always use text input for comma-separated values\n if (isArrayOperator) {\n return <ArrayValueInput value={value} onChange={onChange} placeholder={placeholder} className={className} />;\n }\n\n // Boolean fields use Select dropdown\n if (fieldType === 'boolean') {\n return <BooleanValueInput value={value} onChange={onChange} placeholder={placeholder} className={className} />;\n }\n\n // Number fields use number input\n if (fieldType === 'number' || fieldType === 'integer') {\n return <NumberValueInput value={value} onChange={onChange} placeholder={placeholder} className={className} />;\n }\n\n // Default to text input\n return <TextValueInput value={value} onChange={onChange} placeholder={placeholder} className={className} />;\n};\n","import { X } from 'lucide-react';\nimport * as React from 'react';\n\nimport type { ConditionOperator } from '../types';\n\nimport { RuleFieldSelect } from './rule-field-select';\nimport { RuleOperatorSelect } from './rule-operator-select';\nimport { RuleValueInput } from './rule-value-input';\nimport { getFieldOptionAtPath } from './schema-utils';\nimport type { RuleRowProps } from './types';\n\nimport { Button } from '@/ds/components/Button';\nimport { cn } from '@/lib/utils';\n\nconst PRIMITIVE_TYPES = new Set(['string', 'number', 'boolean', 'integer']);\n\n/**\n * A single rule row with field selector, operator selector, and value input\n */\nexport const RuleRow: React.FC<RuleRowProps> = ({ schema, rule, onChange, onRemove, className }) => {\n const fieldType = React.useMemo(() => {\n return getFieldOptionAtPath(schema, rule.field)?.type;\n }, [schema, rule.field]);\n\n const isPrimitive = fieldType !== undefined && PRIMITIVE_TYPES.has(fieldType);\n const isArray = fieldType === 'array';\n const isArrayOperator = rule.operator === 'in' || rule.operator === 'not_in';\n const isExistenceOperator = rule.operator === 'exists' || rule.operator === 'not_exists';\n\n // Show operator + value for primitive types, or for array types (restricted to in/not_in)\n const showComparator = isPrimitive || isArray;\n const showValueInput = !isExistenceOperator && (isPrimitive || (isArray && isArrayOperator));\n\n const handleFieldChange = React.useCallback(\n (field: string) => {\n onChange({ ...rule, field });\n },\n [rule, onChange],\n );\n\n const handleOperatorChange = React.useCallback(\n (operator: ConditionOperator) => {\n const isNewExistence = operator === 'exists' || operator === 'not_exists';\n\n // Existence operators don't need a value\n if (isNewExistence) {\n onChange({ ...rule, operator, value: undefined });\n return;\n }\n\n // Reset value when changing to/from array operators\n const isArrayOperator = operator === 'in' || operator === 'not_in';\n const wasArrayOperator = rule.operator === 'in' || rule.operator === 'not_in';\n\n let newValue = rule.value;\n if (isArrayOperator && !wasArrayOperator) {\n // Converting to array operator: wrap value in array\n newValue = rule.value !== undefined ? [rule.value] : [];\n } else if (!isArrayOperator && wasArrayOperator) {\n // Converting from array operator: take first value\n newValue = Array.isArray(rule.value) ? rule.value[0] : rule.value;\n }\n\n onChange({ ...rule, operator, value: newValue });\n },\n [rule, onChange],\n );\n\n const handleValueChange = React.useCallback(\n (value: unknown) => {\n onChange({ ...rule, value });\n },\n [rule, onChange],\n );\n\n return (\n <div className=\"flex justify-between gap-2\">\n <div className={cn('flex flex-wrap items-center gap-2', className)}>\n <RuleFieldSelect schema={schema} value={rule.field} onChange={handleFieldChange} />\n\n {showComparator && (\n <>\n <RuleOperatorSelect\n value={rule.operator}\n onChange={handleOperatorChange}\n operators={isArray ? (['in', 'not_in'] as const) : undefined}\n />\n\n {showValueInput && (\n <RuleValueInput\n value={rule.value}\n onChange={handleValueChange}\n operator={rule.operator}\n fieldType={fieldType}\n />\n )}\n </>\n )}\n </div>\n\n <Button type=\"button\" onClick={onRemove} tooltip=\"Remove rule\" size=\"icon-sm\" variant=\"ghost\">\n <X />\n </Button>\n </div>\n );\n};\n","import { Plus, X, Component } from 'lucide-react';\nimport * as React from 'react';\n\nimport type { Rule, RuleGroup, RuleGroupDepth1 } from '../types';\nimport { isRule, createDefaultRule, createDefaultRuleGroup } from '../utils';\n\nimport { RuleRow } from './rule-row';\nimport type { RuleBuilderProps, RuleGroupViewProps } from './types';\nimport { Button } from '@/ds/components/Button';\nimport { Icon } from '@/ds/icons';\nimport { cn } from '@/lib/utils';\n\nconst DEFAULT_MAX_DEPTH = 3;\n\n/**\n * Internal recursive component that renders one level of a rule group.\n */\nconst RuleGroupView: React.FC<RuleGroupViewProps> = ({ schema, group, onChange, onRemove, depth, maxDepth }) => {\n const isRoot = depth === 0;\n\n const handleToggleOperator = () => {\n onChange({ ...group, operator: group.operator === 'AND' ? 'OR' : 'AND' });\n };\n\n const handleConditionChange = (index: number, condition: Rule | RuleGroup) => {\n onChange({\n ...group,\n conditions: group.conditions.map((c, i) => (i === index ? (condition as Rule | RuleGroupDepth1) : c)),\n });\n };\n\n const handleRemoveCondition = (index: number) => {\n const newConditions = group.conditions.filter((_, i) => i !== index);\n if (newConditions.length === 0 && onRemove) {\n onRemove();\n } else {\n onChange({ ...group, conditions: newConditions });\n }\n };\n\n const handleAddRule = () => {\n onChange({ ...group, conditions: [...group.conditions, createDefaultRule()] });\n };\n\n const handleAddGroup = () => {\n onChange({\n ...group,\n conditions: [\n ...group.conditions,\n createDefaultRuleGroup(group.operator === 'AND' ? 'OR' : 'AND') as RuleGroupDepth1,\n ],\n });\n };\n\n return (\n <div className={cn(isRoot ? 'bg-surface2' : 'pl-6 bg-surface3')}>\n {/* Non-root group header */}\n {!isRoot && (\n <div className=\"flex items-center justify-between pl-3 pr-4 py-1.5 border-b border-border1 border-dashed\">\n <span className=\"text-ui-xs text-neutral3\">Group</span>\n {onRemove && (\n <Button type=\"button\" onClick={onRemove} tooltip=\"Remove group\" size=\"icon-sm\" variant=\"ghost\">\n <X />\n </Button>\n )}\n </div>\n )}\n\n {group.conditions.map((condition, index) => (\n <div key={index} className=\"border-b border-border1 border-dashed last:border-b-0\">\n <div className={cn('relative', isRule(condition) && 'p-4 border-l-4 border-border1')}>\n {index > 0 && (\n <button\n type=\"button\"\n onClick={handleToggleOperator}\n className={cn(\n 'absolute left-1/2 -translate-x-1/2 z-10 -translate-y-1/2 top-0 text-ui-xs px-3 py-0.5 rounded-full cursor-pointer',\n group.operator === 'OR'\n ? 'bg-accent6Dark text-accent6 hover:bg-accent6Dark/70'\n : 'bg-accent3Dark text-accent3 hover:bg-accent3Dark/70',\n )}\n >\n {group.operator.toLowerCase()}\n </button>\n )}\n\n {isRule(condition) ? (\n <RuleRow\n schema={schema}\n rule={condition}\n onChange={updatedRule => handleConditionChange(index, updatedRule)}\n onRemove={() => handleRemoveCondition(index)}\n />\n ) : (\n <RuleGroupView\n schema={schema}\n group={condition}\n onChange={updatedGroup => handleConditionChange(index, updatedGroup)}\n onRemove={() => handleRemoveCondition(index)}\n depth={depth + 1}\n maxDepth={maxDepth}\n />\n )}\n </div>\n </div>\n ))}\n\n <div className=\"p-2 flex gap-1\">\n <Button type=\"button\" onClick={handleAddRule} variant=\"ghost\" size=\"sm\">\n <Icon>\n <Plus />\n </Icon>\n Add rule\n </Button>\n {depth < maxDepth - 1 && (\n <Button type=\"button\" onClick={handleAddGroup} variant=\"ghost\" size=\"sm\">\n <Icon>\n <Component />\n </Icon>\n Add group\n </Button>\n )}\n </div>\n </div>\n );\n};\n\n/**\n * Rule builder component for creating and managing a recursive set of rules\n * based on a JSON Schema defining available fields.\n *\n * Supports nested rule groups with AND/OR operators at each level.\n */\nexport const RuleBuilder: React.FC<RuleBuilderProps> = ({\n schema,\n ruleGroup,\n onChange,\n maxDepth = DEFAULT_MAX_DEPTH,\n className,\n}) => {\n const handleGroupChange = React.useCallback(\n (group: RuleGroup) => {\n onChange(group);\n },\n [onChange],\n );\n\n const handleAddFirstRule = React.useCallback(() => {\n onChange({ operator: 'AND', conditions: [createDefaultRule()] });\n }, [onChange]);\n\n if (!ruleGroup) {\n return (\n <button\n type=\"button\"\n onClick={handleAddFirstRule}\n className=\"flex items-center justify-center gap-2 text-ui-sm text-neutral3 hover:text-neutral6 w-full border border-dashed border-border1 p-2 rounded-md\"\n >\n <Icon>\n <Plus />\n </Icon>\n Add conditional rule\n </button>\n );\n }\n\n return (\n <div className={className}>\n <RuleGroupView schema={schema} group={ruleGroup} onChange={handleGroupChange} depth={0} maxDepth={maxDepth} />\n </div>\n );\n};\n","export interface PanelEdgeIconProps {\n side: 'left' | 'right';\n}\n\n// Single-tone panel glyph that reads clearly at 16px where lucide's\n// PanelLeftOpen arrow turns to mush. Same 24px grid / stroke 2 as lucide,\n// with a softer corner radius.\nexport const PanelEdgeIcon = ({ side }: PanelEdgeIconProps) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"5\" />\n <path d={side === 'left' ? 'M9 3v18' : 'M15 3v18'} />\n </svg>\n);\n","import { cn } from '@/lib/utils';\n\n// Ghost icon button shared by the collapsed-panel hint (desktop) and the\n// panel drawer trigger (mobile), so both edges read as the same affordance.\nexport const panelIconButtonClass = cn(\n 'flex size-8 cursor-pointer items-center justify-center rounded-full',\n 'border border-transparent bg-transparent text-neutral5 hover:bg-neutral6/5 hover:text-neutral6 active:bg-neutral6/10',\n 'transition-colors duration-150 ease-out-custom motion-reduce:transition-none',\n 'focus-visible:outline-hidden focus-visible:border-accent1',\n);\n","import { useCallback, useRef } from 'react';\n\nexport interface ClientPoint {\n clientX: number;\n clientY: number;\n}\n\nexport interface UseClampedElementCursorOptions {\n axis: 'x' | 'y';\n margin?: number;\n variableName: `--${string}`;\n}\n\nconst clamp = (value: number, min: number, max: number) => Math.min(max, Math.max(min, value));\n\nconst readAxis = (point: ClientPoint, rect: DOMRect, axis: 'x' | 'y') => {\n if (axis === 'x') {\n return { client: point.clientX, start: rect.left, size: rect.width };\n }\n\n return { client: point.clientY, start: rect.top, size: rect.height };\n};\n\nexport const getClampedElementCursorOffset = (point: ClientPoint, rect: DOMRect, axis: 'x' | 'y', margin = 0) => {\n const { client, start, size } = readAxis(point, rect, axis);\n return clamp(client - start, margin, Math.max(margin, size - margin));\n};\n\nexport const useClampedElementCursor = <TElement extends HTMLElement>({\n axis,\n margin = 0,\n variableName,\n}: UseClampedElementCursorOptions) => {\n const elementRef = useRef<TElement | null>(null);\n const rectRef = useRef<DOMRect | null>(null);\n\n const writePosition = useCallback(\n (point: ClientPoint, refreshRect = false) => {\n const element = elementRef.current;\n if (!element) return;\n\n const rect = refreshRect || !rectRef.current ? element.getBoundingClientRect() : rectRef.current;\n rectRef.current = rect;\n\n const offset = getClampedElementCursorOffset(point, rect, axis, margin);\n element.style.setProperty(variableName, `${offset}px`);\n },\n [axis, margin, variableName],\n );\n\n const beginTracking = useCallback(\n (point: ClientPoint) => {\n writePosition(point, true);\n },\n [writePosition],\n );\n\n const updateTracking = useCallback(\n (point: ClientPoint) => {\n writePosition(point);\n },\n [writePosition],\n );\n\n const endTracking = useCallback(() => {\n rectRef.current = null;\n }, []);\n\n return { beginTracking, elementRef, endTracking, updateTracking };\n};\n","import { ChevronLeft, ChevronRight } from 'lucide-react';\nimport type { CSSProperties, RefObject } from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { PanelProps } from 'react-resizable-panels';\nimport { Panel, usePanelRef } from 'react-resizable-panels';\nimport { PanelEdgeIcon } from './panel-edge-icon';\nimport { panelIconButtonClass } from './panel-icon-button';\nimport { useClampedElementCursor } from './use-clamped-element-cursor';\nimport { Icon } from '@/ds/icons';\nimport { cn } from '@/lib/utils';\n\nexport interface CollapsiblePanelProps extends PanelProps {\n direction: 'left' | 'right';\n}\n\n// The expand pill follows the pointer vertically along the edge, clamped so\n// it never bleeds past the strip's ends.\nconst PILL_EDGE_MARGIN = 22;\n\ntype PanelElementRef = RefObject<HTMLDivElement | null>;\n\nconst usePanelSizeTransitions = (elementRef: PanelElementRef) => {\n const [booted, setBooted] = useState(false);\n const bootedRef = useRef(false);\n const bootScheduled = useRef(false);\n const enableSizeTransitionsRef = useRef<() => void>(() => {});\n\n const enableSizeTransitions = useCallback(() => {\n enableSizeTransitionsRef.current();\n }, []);\n\n const boot = useCallback(() => {\n if (bootScheduled.current) return;\n bootScheduled.current = true;\n requestAnimationFrame(() => {\n bootedRef.current = true;\n setBooted(true);\n enableSizeTransitionsRef.current();\n });\n }, []);\n\n useEffect(() => {\n if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;\n const group = elementRef.current?.parentElement;\n if (!group) return;\n const panels = Array.from(group.children).filter(\n (child): child is HTMLElement => child instanceof HTMLElement && child.hasAttribute('data-panel'),\n );\n const separators = Array.from(group.children).filter(\n (child): child is HTMLElement => child instanceof HTMLElement && child.hasAttribute('data-separator'),\n );\n\n const enable = () => {\n if (!bootedRef.current) return;\n panels.forEach(\n panel =>\n (panel.style.transition =\n 'flex-grow 300ms var(--ease-out-custom, ease), flex-basis 300ms var(--ease-out-custom, ease)'),\n );\n };\n const disable = () => panels.forEach(panel => (panel.style.transition = 'none'));\n\n enable();\n enableSizeTransitionsRef.current = enable;\n separators.forEach(separator => separator.addEventListener('pointerdown', disable));\n window.addEventListener('pointerup', enable);\n window.addEventListener('pointercancel', enable);\n return () => {\n enableSizeTransitionsRef.current = () => {};\n separators.forEach(separator => separator.removeEventListener('pointerdown', disable));\n window.removeEventListener('pointerup', enable);\n window.removeEventListener('pointercancel', enable);\n panels.forEach(panel => (panel.style.transition = ''));\n };\n }, [elementRef]);\n\n return { booted, boot, enableSizeTransitions };\n};\n\nconst useCollapsedEdgePill = ({\n collapsed,\n direction,\n elementRef,\n}: {\n collapsed: boolean;\n direction: CollapsiblePanelProps['direction'];\n elementRef: PanelElementRef;\n}) => {\n const expandButtonRef = useRef<HTMLButtonElement | null>(null);\n const pillRef = useRef<HTMLSpanElement | null>(null);\n const {\n beginTracking: beginPillTracking,\n elementRef: stripRef,\n endTracking: endPillTracking,\n updateTracking: updatePillTracking,\n } = useClampedElementCursor<HTMLButtonElement>({\n axis: 'y',\n margin: PILL_EDGE_MARGIN,\n variableName: '--pill-y',\n });\n\n const setEdgeHovered = useCallback((hovered: boolean) => {\n const expandButton = expandButtonRef.current;\n const pill = pillRef.current;\n if (expandButton) expandButton.dataset.edgeHovered = hovered ? 'true' : 'false';\n if (pill) pill.dataset.edgeHovered = hovered ? 'true' : 'false';\n }, []);\n\n const spawnPill = useCallback(\n (point: { clientX: number; clientY: number }) => {\n const pill = pillRef.current;\n if (!pill) return;\n beginPillTracking(point);\n pill.style.transitionProperty = 'opacity, translate';\n requestAnimationFrame(() => {\n pill.style.transitionProperty = '';\n });\n },\n [beginPillTracking],\n );\n\n const trackPillPosition = useCallback(\n (point: { clientX: number; clientY: number }) => {\n updatePillTracking(point);\n },\n [updatePillTracking],\n );\n\n useEffect(() => {\n if (!collapsed) return;\n const panelElement = elementRef.current;\n const separator = direction === 'left' ? panelElement?.nextElementSibling : panelElement?.previousElementSibling;\n if (!(separator instanceof HTMLElement) || !separator.hasAttribute('data-separator')) return;\n\n const show = (event: PointerEvent) => {\n setEdgeHovered(true);\n spawnPill(event);\n };\n const hide = () => {\n setEdgeHovered(false);\n endPillTracking();\n };\n const follow = (event: PointerEvent) => trackPillPosition(event);\n separator.addEventListener('pointerenter', show);\n separator.addEventListener('pointerleave', hide);\n separator.addEventListener('pointermove', follow);\n return () => {\n separator.removeEventListener('pointerenter', show);\n separator.removeEventListener('pointerleave', hide);\n separator.removeEventListener('pointermove', follow);\n setEdgeHovered(false);\n endPillTracking();\n };\n }, [collapsed, direction, elementRef, endPillTracking, setEdgeHovered, spawnPill, trackPillPosition]);\n\n return { endPillTracking, expandButtonRef, stripRef, pillRef, spawnPill, trackPillPosition };\n};\n\nexport const CollapsiblePanel = ({\n collapsedSize,\n children,\n direction,\n className,\n onResize,\n style,\n minSize,\n ...props\n}: CollapsiblePanelProps) => {\n const [collapsed, setCollapsed] = useState(false);\n const panelRef = usePanelRef();\n const elementRef = useRef<HTMLDivElement | null>(null);\n const { booted, boot, enableSizeTransitions } = usePanelSizeTransitions(elementRef);\n const { endPillTracking, expandButtonRef, stripRef, pillRef, spawnPill, trackPillPosition } = useCollapsedEdgePill({\n collapsed,\n direction,\n elementRef,\n });\n\n const expand = useCallback(() => {\n enableSizeTransitions();\n if (!panelRef.current) return;\n panelRef.current.expand();\n }, [enableSizeTransitions, panelRef]);\n\n const numericMinSize = typeof minSize === 'number' ? minSize : null;\n\n return (\n <Panel\n panelRef={panelRef}\n elementRef={elementRef}\n collapsedSize={collapsedSize}\n minSize={minSize}\n className={cn('relative', className)}\n style={\n {\n overflow: collapsed ? 'visible' : 'hidden',\n '--panel-min-w': numericMinSize ? `${numericMinSize}px` : undefined,\n ...style,\n } as CSSProperties\n }\n {...props}\n onResize={(size, previousSize, panel) => {\n onResize?.(size, previousSize, panel);\n if (typeof collapsedSize !== 'number') return;\n setCollapsed(size.inPixels <= collapsedSize);\n boot();\n }}\n >\n <div\n inert={collapsed}\n data-state={collapsed ? 'collapsed' : 'open'}\n data-direction={direction}\n style={{\n minWidth: 'var(--panel-min-w)',\n opacity: collapsed ? 0 : undefined,\n translate: collapsed ? (direction === 'left' ? '-100% 0' : '100% 0') : undefined,\n }}\n className={cn(\n 'absolute inset-y-0 w-full overflow-hidden',\n 'transition-[opacity,translate] duration-300 ease-out-custom motion-reduce:transition-none',\n 'data-[direction=left]:left-0 data-[direction=right]:right-0',\n 'data-[state=collapsed]:z-10',\n !booted && 'transition-none',\n )}\n >\n {children}\n </div>\n\n {collapsed && (\n <>\n <button\n ref={expandButtonRef}\n type=\"button\"\n aria-label=\"Expand panel\"\n onClick={expand}\n className={cn(\n panelIconButtonClass,\n 'absolute top-2 z-10',\n 'transition-[color,background-color,opacity] duration-300 starting:opacity-0',\n direction === 'left' ? 'left-2' : 'right-2',\n 'data-[edge-hovered=true]:text-neutral6',\n )}\n >\n <Icon>\n <PanelEdgeIcon side={direction} />\n </Icon>\n </button>\n\n <button\n ref={stripRef}\n type=\"button\"\n tabIndex={-1}\n aria-hidden=\"true\"\n onClick={expand}\n onPointerEnter={event => spawnPill(event)}\n onPointerLeave={endPillTracking}\n onPointerMove={event => trackPillPosition(event)}\n style={{ '--pill-y': '50%' } as CSSProperties}\n className={cn(\n 'group/expand absolute inset-y-0 z-10 w-4 cursor-pointer focus-visible:outline-hidden',\n direction === 'left' ? 'left-1' : 'right-1',\n )}\n >\n <span\n ref={pillRef}\n style={{ top: 'var(--pill-y)' }}\n className={cn(\n 'absolute flex size-7 -translate-y-1/2 items-center justify-center rounded-full bg-neutral6 text-surface1 shadow-dialog',\n 'pointer-events-none opacity-0 transition-[opacity,translate,top] duration-150 ease-out-custom motion-reduce:transition-none',\n direction === 'left' ? 'left-0.5 -translate-x-1' : 'right-0.5 translate-x-1',\n 'group-hover/expand:pointer-events-auto group-hover/expand:translate-x-0 group-hover/expand:opacity-100',\n 'group-active/expand:bg-neutral6/80',\n 'data-[edge-hovered=true]:pointer-events-auto data-[edge-hovered=true]:translate-x-0 data-[edge-hovered=true]:opacity-100',\n )}\n >\n <Icon>{direction === 'left' ? <ChevronRight /> : <ChevronLeft />}</Icon>\n </span>\n </button>\n </>\n )}\n </Panel>\n );\n};\n","import { Separator } from 'react-resizable-panels';\nimport { ResizeHandleIndicator } from '@/ds/primitives/resize-handle-indicator';\nimport { cn } from '@/lib/utils';\n\nexport type PanelSeparatorProps = {\n /** `line` fits a visible container edge; `pill` floats when there is none. */\n variant?: 'line' | 'pill';\n};\n\nconst stateClasses = {\n line: cn(\n 'group-hover/separator:opacity-100',\n \"group-data-[separator='hover']/separator:opacity-100\",\n \"group-data-[separator='active']/separator:opacity-100 group-data-[separator='active']/separator:via-neutral6/45\",\n 'group-focus-visible/separator:opacity-100 group-focus-visible/separator:via-accent1',\n ),\n pill: cn(\n 'group-hover/separator:h-12 group-hover/separator:w-1',\n \"group-data-[separator='hover']/separator:h-12 group-data-[separator='hover']/separator:w-1\",\n \"group-data-[separator='active']/separator:h-12 group-data-[separator='active']/separator:w-1 group-data-[separator='active']/separator:bg-accent1\",\n 'group-focus-visible/separator:bg-accent1',\n ),\n};\n\nexport const PanelSeparator = ({ variant = 'line' }: PanelSeparatorProps) => {\n return (\n <Separator\n className={cn(\n 'group/separator relative w-0 bg-transparent z-10',\n 'focus:outline-hidden focus-visible:outline-hidden',\n )}\n >\n {/* Hit zone wider than the 0px separator; indicator centered inside. */}\n <span\n aria-hidden\n className=\"absolute inset-y-0 -left-1 -right-1 flex items-center justify-center cursor-col-resize touch-none\"\n >\n <ResizeHandleIndicator variant={variant} className={stateClasses[variant]} />\n </span>\n </Separator>\n );\n};\n","import type { ReactNode } from 'react';\nimport { PanelEdgeIcon } from './panel-edge-icon';\nimport { panelIconButtonClass } from './panel-icon-button';\nimport {\n Drawer,\n DrawerBackdrop,\n DrawerPopup,\n DrawerPortal,\n DrawerTitle,\n DrawerTrigger,\n DrawerViewport,\n} from '@/ds/components/Drawer';\nimport { Icon } from '@/ds/icons';\nimport { cn } from '@/lib/utils';\n\nexport interface PanelDrawerProps {\n direction: 'left' | 'right';\n /** Accessible name for the trigger button and the drawer. */\n label: string;\n children: ReactNode;\n}\n\nexport const PanelDrawer = ({ direction, label, children }: PanelDrawerProps) => {\n return (\n <Drawer side={direction}>\n <DrawerTrigger asChild>\n <button\n type=\"button\"\n aria-label={label}\n className={cn(panelIconButtonClass, 'absolute top-2 z-10', direction === 'left' ? 'left-2' : 'right-2')}\n >\n <Icon>\n <PanelEdgeIcon side={direction} />\n </Icon>\n </button>\n </DrawerTrigger>\n\n <DrawerPortal keepMounted>\n <DrawerBackdrop />\n <DrawerViewport>\n <DrawerPopup className=\"w-[calc(100vw-2.5rem)] max-w-[28rem]\">\n <DrawerTitle className=\"sr-only\">{label}</DrawerTitle>\n <div className=\"flex min-h-0 flex-1 flex-col\">{children}</div>\n </DrawerPopup>\n </DrawerViewport>\n </DrawerPortal>\n </Drawer>\n );\n};\n","export const EXTENSION_TO_MIME: Record<string, string> = {\n jpg: 'image/jpg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n svg: 'image/svg+xml',\n bmp: 'image/bmp',\n ico: 'image/x-icon',\n pdf: 'application/pdf',\n // Video\n mp4: 'video/mp4',\n mov: 'video/quicktime',\n webm: 'video/webm',\n mkv: 'video/x-matroska',\n avi: 'video/x-msvideo',\n mpeg: 'video/mpeg',\n mpg: 'video/mpeg',\n // Audio\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n ogg: 'audio/ogg',\n oga: 'audio/ogg',\n m4a: 'audio/mp4',\n aac: 'audio/aac',\n flac: 'audio/flac',\n};\n","/**\n * Single source of truth for the URL schemes the attachment pipeline understands.\n *\n * These MUST stay aligned with the protocols Mastra core accepts in\n * `packages/core/src/agent/message-list/prompt/attachments-to-parts.ts` (its\n * `switch (url.protocol)` whitelists exactly `http:`, `https:`, `gs:`, `s3:`\n * and throws `Unsupported URL protocol` for anything else). Forwarding a scheme\n * the UI accepts but core rejects would surface as a runtime error, so the sets\n * are kept in lockstep — see `schemes.parity.test.ts`.\n */\n\n/** Schemes the browser can fetch directly (for inline previews and HEAD lookups). */\nexport const BROWSER_FETCHABLE_SCHEMES = ['https://', 'http://'] as const;\n\n/**\n * Cloud-storage schemes that are forwarded to the model provider and resolved\n * server-side (e.g. Vertex AI for `gs://`, Bedrock for `s3://`). The browser\n * cannot fetch these, so they are never HEAD-ed or previewed inline.\n */\nexport const NON_FETCHABLE_REMOTE_SCHEMES = ['gs://', 's3://'] as const;\n\n/** Every remote scheme an attachment URL may use (fetchable + cloud-storage). */\nexport const REMOTE_URL_SCHEMES = [...BROWSER_FETCHABLE_SCHEMES, ...NON_FETCHABLE_REMOTE_SCHEMES] as const;\n\n/** True when the value starts with any supported remote scheme. */\nexport const isRemoteUrl = (value: string): boolean => REMOTE_URL_SCHEMES.some(scheme => value.startsWith(scheme));\n\n/** True when the browser can fetch the value directly (http/https). */\nexport const isBrowserFetchableUrl = (value: string): boolean =>\n BROWSER_FETCHABLE_SCHEMES.some(scheme => value.startsWith(scheme));\n\n/** True when the value is a cloud-storage URI the browser cannot fetch (gs/s3). */\nexport const isNonFetchableRemoteUrl = (value: string): boolean =>\n NON_FETCHABLE_REMOTE_SCHEMES.some(scheme => value.startsWith(scheme));\n","import { EXTENSION_TO_MIME } from './constants';\nimport { NON_FETCHABLE_REMOTE_SCHEMES } from './schemes';\n\n/** Infer a MIME type from a URL/path's file extension. */\nconst contentTypeFromExtension = (url: string): string | undefined => {\n try {\n const { pathname } = new URL(url);\n const extension = pathname.split('.').pop();\n if (!extension) return undefined;\n return EXTENSION_TO_MIME[extension.toLowerCase()];\n } catch {\n // url is not a valid absolute URL (e.g. a relative path) — extract the\n // extension from the raw string so we still return a useful MIME type.\n const extension = url.split('.').pop()?.split(/[?#]/)[0];\n if (!extension) return undefined;\n return EXTENSION_TO_MIME[extension.toLowerCase()];\n }\n};\n\nexport const getFileContentType = async (url: string) => {\n // Cloud-storage URIs are fetched server-side by the model provider (e.g. Vertex\n // AI for `gs://`, Bedrock for `s3://`); the browser cannot HEAD them, so infer\n // the content type from the extension directly.\n if (NON_FETCHABLE_REMOTE_SCHEMES.some(scheme => url.startsWith(scheme))) {\n return contentTypeFromExtension(url);\n }\n\n try {\n const response = await fetch(url, {\n method: 'HEAD',\n });\n\n if (!response.ok) {\n throw new Error('Failed to get file content type');\n }\n\n const contentType = response.headers.get('content-type');\n\n if (!contentType) {\n throw new Error('Failed to get file content type');\n }\n\n return contentType;\n } catch {\n // fetch failed — try to infer content type from the file extension\n return contentTypeFromExtension(url);\n }\n};\n","// Serialize data to pretty-printed JSON and trigger a browser file download.\nexport const downloadJson = (filename: string, data: unknown): void => {\n const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n\n anchor.href = url;\n anchor.download = filename;\n document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n\n URL.revokeObjectURL(url);\n};\n","export const fileToBase64 = async (file: File): Promise<string> => {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n const result = reader.result;\n if (typeof result === 'string') {\n resolve(result);\n } else {\n reject(new Error('Failed to convert file to base64.'));\n }\n };\n\n reader.onerror = error => {\n reject(error);\n };\n\n reader.readAsDataURL(file);\n });\n};\n","import type { JsonSchema, JsonSchemaProperty } from '@/lib/json-schema';\n\nconst MAX_DEPTH = 10;\n\n/**\n * Generates a default value for a single property based on its type\n */\nfunction generatePropertyDefault(property: JsonSchemaProperty, depth: number): unknown {\n // Return explicit default if provided\n if (property.default !== undefined) {\n return property.default;\n }\n\n // Guard against circular references\n if (depth >= MAX_DEPTH) {\n return undefined;\n }\n\n const type = Array.isArray(property.type) ? property.type[0] : property.type;\n\n switch (type) {\n case 'string':\n return '';\n case 'number':\n case 'integer':\n return 0;\n case 'boolean':\n return false;\n case 'array':\n return [];\n case 'object':\n if (property.properties) {\n return generateObjectDefaults(property.properties, depth + 1);\n }\n return {};\n case 'null':\n return null;\n default:\n return '';\n }\n}\n\n/**\n * Generates default values for an object's properties\n */\nfunction generateObjectDefaults(\n properties: Record<string, JsonSchemaProperty>,\n depth: number,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, property] of Object.entries(properties)) {\n result[key] = generatePropertyDefault(property, depth);\n }\n\n return result;\n}\n\n/**\n * Generates default values from a JSON Schema.\n *\n * For each property:\n * - Uses `default` value if specified in schema\n * - Otherwise generates a placeholder based on type:\n * - string → \"\"\n * - number/integer → 0\n * - boolean → false\n * - array → []\n * - object → recurses into nested properties\n * - null → null\n *\n * @param schema - JSON Schema definition\n * @returns Object with default values for all properties\n */\nexport function generateDefaultValues(schema: JsonSchema | undefined): Record<string, unknown> {\n if (!schema || !schema.properties) {\n return {};\n }\n\n return generateObjectDefaults(schema.properties, 0);\n}\n","import { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\n\ninterface PlaygroundStore {\n requestContext: Record<string, any>;\n setRequestContext: (requestContext: Record<string, any>) => void;\n}\n\nexport const usePlaygroundStore = create<PlaygroundStore>()(\n persist(\n set => ({\n requestContext: {},\n setRequestContext: requestContext => set({ requestContext }),\n }),\n {\n name: 'mastra-playground-store',\n },\n ),\n);\n","import { EntityType } from '@mastra/core/observability';\nimport type { PropertyFilterField, PropertyFilterToken } from '@/ds/components/PropertyFilter/types';\n\n/** Primitive type options — matches the traces filter vocabulary. */\nexport const METRICS_ROOT_ENTITY_TYPE_OPTIONS = [\n { label: 'Agent', entityType: EntityType.AGENT },\n { label: 'Workflow', entityType: EntityType.WORKFLOW_RUN },\n { label: 'Scorer', entityType: EntityType.SCORER },\n { label: 'Ingest', entityType: EntityType.RAG_INGESTION },\n] as const;\n\n/** Field IDs that live in dedicated URL params (not the generic `filterX` set). */\nexport const METRICS_SYNTHETIC_FILTER_FIELD_IDS = ['rootEntityType'] as const;\n\nexport const METRICS_ROOT_ENTITY_TYPE_PARAM = 'rootEntityType';\n\n/** URL param name for each generic property filter field. Mirrors traces for\n * cross-page URL consistency (user can copy a trace's filter URL and paste\n * equivalent dimensions into metrics). */\nexport const METRICS_PROPERTY_FILTER_PARAM_BY_FIELD = {\n tags: 'filterTags',\n entityId: 'filterEntityId',\n entityName: 'filterEntityName',\n runId: 'filterRunId',\n threadId: 'filterThreadId',\n sessionId: 'filterSessionId',\n requestId: 'filterRequestId',\n resourceId: 'filterResourceId',\n userId: 'filterUserId',\n organizationId: 'filterOrganizationId',\n serviceName: 'filterServiceName',\n environment: 'filterEnvironment',\n experimentId: 'filterExperimentId',\n provider: 'filterProvider',\n model: 'filterModel',\n} as const;\n\nexport type MetricsPropertyFilterFieldId = keyof typeof METRICS_PROPERTY_FILTER_PARAM_BY_FIELD;\n\nexport const METRICS_PROPERTY_FILTER_FIELD_IDS = Object.keys(\n METRICS_PROPERTY_FILTER_PARAM_BY_FIELD,\n) as Array<MetricsPropertyFilterFieldId>;\n\nconst METRICS_FILTERS_STORAGE_KEY = 'mastra:metrics:saved-filters';\n\n/** Save the current metrics filter URL params so the metrics page can restore\n * them on next visit (same pattern as traces/logs). */\nexport function saveMetricsFiltersToStorage(params: URLSearchParams): void {\n const serialized = getPreservedMetricsFilterParams(params);\n try {\n localStorage.setItem(METRICS_FILTERS_STORAGE_KEY, serialized.toString());\n } catch {\n // localStorage may be unavailable — silently skip.\n }\n}\n\nexport function clearSavedMetricsFilters(): void {\n try {\n localStorage.removeItem(METRICS_FILTERS_STORAGE_KEY);\n } catch {\n // ignore\n }\n}\n\nexport function loadMetricsFiltersFromStorage(): URLSearchParams | null {\n try {\n const raw = localStorage.getItem(METRICS_FILTERS_STORAGE_KEY);\n if (!raw) return null;\n const parsed = new URLSearchParams(raw);\n return parsed.toString() ? parsed : null;\n } catch {\n return null;\n }\n}\n\nexport function hasAnyMetricsFilterParams(params: URLSearchParams): boolean {\n if (params.has(METRICS_ROOT_ENTITY_TYPE_PARAM)) return true;\n for (const fieldId of METRICS_PROPERTY_FILTER_FIELD_IDS) {\n if (params.has(METRICS_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId])) return true;\n }\n return false;\n}\n\n/** Build the PropertyFilterField list shown in the metrics filter popover.\n *\n * The field order is curated for OLAP efficiency: columnar/LowCardinality\n * dimensions first, then bloom_filter-indexed high-cardinality IDs as\n * free-text. Fields that are expensive to filter without an index are\n * intentionally omitted from this dashboard surface. */\nexport function createMetricsPropertyFilterFields({\n availableTags,\n availableEntityNames,\n availableServiceNames,\n availableEnvironments,\n loading,\n}: {\n availableTags: string[];\n availableEntityNames: string[];\n availableServiceNames: string[];\n availableEnvironments: string[];\n loading?: {\n tags?: boolean;\n entityNames?: boolean;\n serviceNames?: boolean;\n environments?: boolean;\n };\n}): PropertyFilterField[] {\n const fields: PropertyFilterField[] = [\n {\n id: 'rootEntityType',\n label: 'Primitive Type',\n kind: 'pick-multi',\n searchable: false,\n options: METRICS_ROOT_ENTITY_TYPE_OPTIONS.map(o => ({ label: o.label, value: o.entityType })),\n placeholder: 'Choose entity type',\n emptyText: 'No entity types.',\n },\n {\n id: 'entityName',\n label: 'Primitive Name',\n kind: 'pick-multi',\n options: availableEntityNames.map(name => ({ label: name, value: name })),\n placeholder: 'Choose entity names',\n emptyText: 'No entity names found.',\n isLoading: loading?.entityNames,\n },\n { id: 'entityId', label: 'Primitive ID', kind: 'text' },\n {\n id: 'tags',\n label: 'Tags',\n kind: 'pick-multi',\n multi: true,\n options: availableTags.map(tag => ({ label: tag, value: tag })),\n placeholder: 'Choose tags',\n emptyText: 'No tags found.',\n isLoading: loading?.tags,\n },\n {\n id: 'serviceName',\n label: 'Service Name',\n kind: 'pick-multi',\n options: availableServiceNames.map(name => ({ label: name, value: name })),\n placeholder: 'Choose service names',\n emptyText: 'No service names found.',\n isLoading: loading?.serviceNames,\n },\n {\n id: 'environment',\n label: 'Environment',\n kind: 'pick-multi',\n options: availableEnvironments.map(env => ({ label: env, value: env })),\n placeholder: 'Choose environments',\n emptyText: 'No environments found.',\n isLoading: loading?.environments,\n },\n // Provider / model are filterable by URL (filterProvider / filterModel) but\n // are omitted from the popover until we expose a discovery endpoint.\n // High-cardinality IDs — free-text. Backed by bloom_filter skip indexes on\n // ClickHouse, narrow timestamp range pruning on DuckDB.\n { id: 'threadId', label: 'Thread ID', kind: 'text' },\n { id: 'resourceId', label: 'Resource ID', kind: 'text' },\n { id: 'userId', label: 'User ID', kind: 'text' },\n { id: 'organizationId', label: 'Organization ID', kind: 'text' },\n { id: 'runId', label: 'Run ID', kind: 'text' },\n { id: 'sessionId', label: 'Session ID', kind: 'text' },\n { id: 'requestId', label: 'Request ID', kind: 'text' },\n { id: 'experimentId', label: 'Experiment ID', kind: 'text' },\n ];\n const byLabel = (a: PropertyFilterField, b: PropertyFilterField) => a.label.localeCompare(b.label);\n const pickMulti = fields.filter(f => f.kind === 'pick-multi').sort(byLabel);\n const text = fields.filter(f => f.kind === 'text').sort(byLabel);\n return [...pickMulti, ...text];\n}\n\n/** Parse filter tokens from URL params, preserving insertion order. */\nexport function getMetricsPropertyFilterTokens(searchParams: URLSearchParams): PropertyFilterToken[] {\n const tokens: PropertyFilterToken[] = [];\n\n const paramToFieldId = new Map<string, string>([[METRICS_ROOT_ENTITY_TYPE_PARAM, 'rootEntityType']]);\n for (const fieldId of METRICS_PROPERTY_FILTER_FIELD_IDS) {\n paramToFieldId.set(METRICS_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId], fieldId);\n }\n\n const seen = new Set<string>();\n for (const [paramName] of searchParams.entries()) {\n const fieldId = paramToFieldId.get(paramName);\n if (!fieldId || seen.has(fieldId)) continue;\n seen.add(fieldId);\n\n if (fieldId === 'tags') {\n const raw = searchParams.getAll(paramName);\n if (raw.length === 0) continue;\n tokens.push({ fieldId, value: raw.filter(Boolean) });\n continue;\n }\n\n // Multi-value pick-multi fields: collect all occurrences.\n if (\n fieldId === 'rootEntityType' ||\n fieldId === 'entityName' ||\n fieldId === 'serviceName' ||\n fieldId === 'environment' ||\n fieldId === 'provider' ||\n fieldId === 'model'\n ) {\n const raw = searchParams.getAll(paramName);\n if (raw.length > 1) {\n tokens.push({ fieldId, value: raw });\n continue;\n }\n }\n\n const value = searchParams.get(paramName);\n if (value !== null) tokens.push({ fieldId, value });\n }\n\n return tokens;\n}\n\n/** Return a fresh URLSearchParams containing only metrics filter params. */\nexport function getPreservedMetricsFilterParams(searchParams: URLSearchParams): URLSearchParams {\n const next = new URLSearchParams();\n const rootEntityValues = searchParams.getAll(METRICS_ROOT_ENTITY_TYPE_PARAM);\n for (const v of rootEntityValues) next.append(METRICS_ROOT_ENTITY_TYPE_PARAM, v);\n\n for (const fieldId of METRICS_PROPERTY_FILTER_FIELD_IDS) {\n const param = METRICS_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId];\n const values = searchParams.getAll(param);\n for (const v of values) next.append(param, v);\n }\n return next;\n}\n\n/** Mutate `params` in place: strip every metrics filter param, then re-write\n * them from `tokens` in order. Token insertion order drives URL order so\n * filter pill order is stable across reloads. */\nexport function applyMetricsPropertyFilterTokens(params: URLSearchParams, tokens: PropertyFilterToken[]): void {\n params.delete(METRICS_ROOT_ENTITY_TYPE_PARAM);\n for (const fieldId of METRICS_PROPERTY_FILTER_FIELD_IDS) {\n params.delete(METRICS_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId]);\n }\n\n for (const token of tokens) {\n const paramName =\n token.fieldId === 'rootEntityType'\n ? METRICS_ROOT_ENTITY_TYPE_PARAM\n : METRICS_PROPERTY_FILTER_PARAM_BY_FIELD[token.fieldId as MetricsPropertyFilterFieldId];\n if (!paramName) continue;\n\n if (Array.isArray(token.value)) {\n const values = token.value.filter(v => typeof v === 'string' && v !== '');\n if (values.length === 0) {\n // Keep an empty sentinel for `tags` so the pill survives a Reset.\n if (token.fieldId === 'tags') params.append(paramName, '');\n continue;\n }\n for (const v of values) params.append(paramName, v);\n } else if (typeof token.value === 'string') {\n // Persist even empty / 'Any' strings so newly-created pills (and\n // neutralized-but-still-visible pills after a Reset) survive URL\n // round-trips. `buildMetricsDimensionalFilter` drops these on the API\n // query side so neutrals never reach the backend.\n params.set(paramName, token.value.trim());\n }\n }\n}\n\n/** Shape of the dimensional filter object fed into `MetricsFilter` on client\n * calls. Kept compatible with `metricsFilterSchema` in @internal/core — every\n * scalar field maps to a single-string column filter, and `tags` is the only\n * array field (matched via `has()` / equivalent on backends). */\nexport type MetricsDimensionalFilter = {\n rootEntityType?: EntityType;\n entityName?: string;\n entityId?: string;\n tags?: string[];\n serviceName?: string;\n environment?: string;\n provider?: string;\n model?: string;\n threadId?: string;\n resourceId?: string;\n userId?: string;\n organizationId?: string;\n runId?: string;\n sessionId?: string;\n requestId?: string;\n experimentId?: string;\n};\n\n/** Convert the active token list into a `MetricsFilter`-compatible object.\n *\n * Single-value text fields are assigned as strings; `pick-multi` fields are\n * assigned as string arrays. Empty/neutral values are dropped. */\n/** \"Neutral\" sentinel for single-select pick-multi fields. Emitted by the\n * toolbar's Clear action so pills stay visible after reset; must be stripped\n * before the filter object is sent to the backend (it is not a valid enum\n * option for fields like `rootEntityType`). */\nconst NEUTRAL_PICK_VALUE = 'Any';\n\nfunction isNeutralValue(v: string): boolean {\n const trimmed = v.trim();\n return trimmed === '' || trimmed === NEUTRAL_PICK_VALUE;\n}\n\n/** `rootEntityType` is enum-valued at the backend; URL-supplied or stale stored\n * values can be arbitrary strings, so we validate against the allowed set\n * before letting them reach the filter object. Returns `undefined` if the\n * value isn't a known enum option. */\nconst VALID_ROOT_ENTITY_TYPES: ReadonlySet<EntityType> = new Set(\n METRICS_ROOT_ENTITY_TYPE_OPTIONS.map(o => o.entityType),\n);\nfunction toValidRootEntityType(v: string): EntityType | undefined {\n const trimmed = v.trim();\n return VALID_ROOT_ENTITY_TYPES.has(trimmed as EntityType) ? (trimmed as EntityType) : undefined;\n}\n\nexport function buildMetricsDimensionalFilter(tokens: PropertyFilterToken[]): MetricsDimensionalFilter {\n const result: MetricsDimensionalFilter = {};\n for (const token of tokens) {\n const fieldId = token.fieldId as keyof MetricsDimensionalFilter;\n if (Array.isArray(token.value)) {\n const values = token.value\n .filter((v): v is string => typeof v === 'string')\n .map(v => v.trim())\n .filter(v => !isNeutralValue(v));\n if (values.length === 0) continue;\n if (fieldId === 'tags') {\n result.tags = values;\n } else if (fieldId === 'rootEntityType') {\n const validated = toValidRootEntityType(values[0]);\n if (validated) result.rootEntityType = validated;\n } else {\n // Backend accepts a single string per dimension; take the first selection.\n (result as Record<string, unknown>)[fieldId] = values[0];\n }\n } else if (typeof token.value === 'string') {\n if (isNeutralValue(token.value)) continue;\n const trimmed = token.value.trim();\n if (fieldId === 'rootEntityType') {\n const validated = toValidRootEntityType(trimmed);\n if (validated) result.rootEntityType = validated;\n } else {\n (result as Record<string, unknown>)[fieldId] = trimmed;\n }\n }\n }\n return result;\n}\n","/* eslint-disable react-refresh/only-export-components */\nimport { format } from 'date-fns';\nimport { createContext, useContext, useMemo } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { buildMetricsDimensionalFilter } from '../metrics-filters';\nimport type { MetricsDimensionalFilter } from '../metrics-filters';\nimport type { PropertyFilterToken } from '@/ds/components/PropertyFilter/types';\n\nconst DATE_PRESETS = [\n { label: 'Last 24 hours', value: '24h' },\n { label: 'Last 3 days', value: '3d' },\n { label: 'Last 7 days', value: '7d' },\n { label: 'Last 14 days', value: '14d' },\n { label: 'Last 30 days', value: '30d' },\n] as const;\n\nexport type DatePreset = (typeof DATE_PRESETS)[number]['value'] | 'custom';\n\nexport { DATE_PRESETS };\n\nconst VALID_PRESETS = new Set<string>(DATE_PRESETS.map(p => p.value));\n\nexport function isValidPreset(value: string | null | undefined): value is DatePreset {\n return typeof value === 'string' && (VALID_PRESETS.has(value) || value === 'custom');\n}\n\nexport type DateRange = { from?: Date; to?: Date };\n\n/** Internal — all state is derived from the URL-backed props the owner passes.\n * There is intentionally no local mirror; keeping a mirror caused URL ↔ state\n * feedback loops that re-rendered the entire metrics tree on every keystroke.\n */\ntype MetricsContextValue = {\n datePreset: DatePreset;\n setDatePreset: (v: DatePreset) => void;\n customRange: DateRange | undefined;\n setCustomRange: (v: DateRange | undefined) => void;\n dateRangeLabel: string;\n filterTokens: PropertyFilterToken[];\n setFilterTokens: (tokens: PropertyFilterToken[]) => void;\n dimensionalFilter: MetricsDimensionalFilter;\n /** Stable JSON representation of `dimensionalFilter`, safe for query keys. */\n dimensionalFilterKey: string;\n /** Base path drilldown links should target for the Traces page. */\n tracesBasePath: string | undefined;\n /** Base path drilldown links should target for the Logs page. */\n logsBasePath: string | undefined;\n};\n\nexport const MetricsContext = createContext<MetricsContextValue>({\n datePreset: '24h',\n setDatePreset: () => {},\n customRange: undefined,\n setCustomRange: () => {},\n dateRangeLabel: 'Last 24 hours',\n filterTokens: [],\n setFilterTokens: () => {},\n dimensionalFilter: {},\n dimensionalFilterKey: '{}',\n tracesBasePath: undefined,\n logsBasePath: undefined,\n});\n\nexport function useMetrics() {\n return useContext(MetricsContext);\n}\n\nfunction getDateRangeLabel(preset: DatePreset, customRange: DateRange | undefined) {\n if (preset !== 'custom') {\n return DATE_PRESETS.find(p => p.value === preset)!.label;\n }\n if (customRange?.from) {\n if (customRange.to) {\n return `${format(customRange.from, 'MMM d, yyyy')} – ${format(customRange.to, 'MMM d, yyyy')}`;\n }\n return format(customRange.from, 'MMM d, yyyy');\n }\n return 'Custom range';\n}\n\n/**\n * URL-driven metrics provider.\n *\n * The owner (page) is expected to:\n * - pass the current `preset` / `filterTokens` derived from `useSearchParams`\n * - pass `onPresetChange` / `onFilterTokensChange` that update the URL\n *\n * The provider never stores its own copies — changes round-trip through the URL\n * exactly once, which keeps re-renders bounded no matter how much data is on\n * screen.\n */\nexport function MetricsProvider({\n children,\n preset,\n filterTokens,\n onPresetChange,\n onFilterTokensChange,\n customRange,\n onCustomRangeChange,\n tracesBasePath,\n logsBasePath,\n}: {\n children: ReactNode;\n preset: DatePreset;\n filterTokens: PropertyFilterToken[];\n onPresetChange: (preset: DatePreset) => void;\n onFilterTokensChange: (tokens: PropertyFilterToken[]) => void;\n customRange?: DateRange;\n onCustomRangeChange?: (range: DateRange | undefined) => void;\n /** Base path for drilldown links to the Traces page. Defaults to `/observability` when omitted. */\n tracesBasePath?: string;\n /** Base path for drilldown links to the Logs page. Defaults to `/logs` when omitted. */\n logsBasePath?: string;\n}) {\n // Stable key for memo dependencies — the parent may re-create the tokens\n // array on every render (e.g. from `useMemo(... , [searchParams])`), but the\n // *content* usually doesn't change.\n const filterTokensKey = useMemo(() => JSON.stringify(filterTokens), [filterTokens]);\n\n // Intentional: re-pin only when the serialized content changes, not on every\n // parent render that allocates a new array.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const stableFilterTokens = useMemo(() => filterTokens, [filterTokensKey]);\n\n const dimensionalFilter = useMemo(() => buildMetricsDimensionalFilter(stableFilterTokens), [stableFilterTokens]);\n\n const dimensionalFilterKey = useMemo(() => JSON.stringify(dimensionalFilter), [dimensionalFilter]);\n\n const dateRangeLabel = getDateRangeLabel(preset, customRange);\n\n const value = useMemo<MetricsContextValue>(\n () => ({\n datePreset: preset,\n setDatePreset: onPresetChange,\n customRange,\n setCustomRange: onCustomRangeChange ?? (() => {}),\n dateRangeLabel,\n filterTokens: stableFilterTokens,\n setFilterTokens: onFilterTokensChange,\n dimensionalFilter,\n dimensionalFilterKey,\n tracesBasePath,\n logsBasePath,\n }),\n [\n preset,\n onPresetChange,\n customRange,\n onCustomRangeChange,\n dateRangeLabel,\n stableFilterTokens,\n onFilterTokensChange,\n dimensionalFilter,\n dimensionalFilterKey,\n tracesBasePath,\n logsBasePath,\n ],\n );\n\n return <MetricsContext.Provider value={value}>{children}</MetricsContext.Provider>;\n}\n","import { useRef } from 'react';\nimport { DateTimeRangePicker } from '../../../ds/components/DateTimeRangePicker';\nimport type { DateRangePreset } from '../../../ds/components/DateTimeRangePicker';\nimport { useMetrics } from '../hooks/use-metrics';\nimport type { DatePreset } from '../hooks/use-metrics';\n\nconst METRICS_PRESETS: readonly DateRangePreset[] = [\n 'last-24h',\n 'last-3d',\n 'last-7d',\n 'last-14d',\n 'last-30d',\n 'custom',\n];\n\nfunction toPickerPreset(preset: DatePreset): DateRangePreset {\n switch (preset) {\n case '3d':\n return 'last-3d';\n case '7d':\n return 'last-7d';\n case '14d':\n return 'last-14d';\n case '30d':\n return 'last-30d';\n case 'custom':\n return 'custom';\n default:\n return 'last-24h';\n }\n}\n\nfunction fromPickerPreset(preset: DateRangePreset): DatePreset {\n switch (preset) {\n case 'last-3d':\n return '3d';\n case 'last-7d':\n return '7d';\n case 'last-14d':\n return '14d';\n case 'last-30d':\n return '30d';\n case 'custom':\n return 'custom';\n default:\n return '24h';\n }\n}\n\nexport function DateRangeSelector() {\n const { datePreset, setDatePreset, customRange, setCustomRange } = useMetrics();\n\n // The picker reports each field separately and also fires onDateChange right\n // after a non-custom preset switch. Track the latest preset and range\n // synchronously so the guard below skips those calls and the second field\n // change still sees the first one.\n const presetRef = useRef(datePreset);\n presetRef.current = datePreset;\n const customRangeRef = useRef(customRange);\n customRangeRef.current = customRange;\n\n return (\n <DateTimeRangePicker\n preset={toPickerPreset(datePreset)}\n onPresetChange={next => {\n const mapped = fromPickerPreset(next);\n presetRef.current = mapped;\n setDatePreset(mapped);\n }}\n dateFrom={customRange?.from}\n dateTo={customRange?.to}\n onDateChange={(value, type) => {\n if (presetRef.current !== 'custom') return;\n const next = { ...customRangeRef.current, [type]: value };\n customRangeRef.current = next;\n setCustomRange(next);\n }}\n presets={METRICS_PRESETS}\n />\n );\n}\n","import type { DataListRootProps } from '@/ds/components/DataList';\n\nexport function formatCompact(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toLocaleString();\n}\n\nexport function formatCost(value: number, unit?: string | null): string {\n if (unit?.toLowerCase() === 'usd' || !unit) {\n return `$${value < 0.01 && value > 0 ? value.toFixed(4) : value.toFixed(2)}`;\n }\n return `${value.toFixed(4)} ${unit}`;\n}\n\nexport const METRICS_DATA_LIST_PROPS = {\n className: 'max-h-80',\n mask: { left: false },\n stickyHeaderBackground: 'tinted',\n} satisfies Pick<DataListRootProps, 'className' | 'mask' | 'stickyHeaderBackground'>;\n\nexport const CHART_COLORS = {\n green: '#22c55e',\n orange: '#fb923c',\n pink: '#f472b6',\n purple: '#8b5cf6',\n blue: '#4f83f1',\n blueDark: '#2b5cd9',\n blueLight: '#6b8fe5',\n red: '#f87171',\n greenDark: '#15613a',\n redDark: '#991b1b',\n yellow: '#facc15',\n} as const;\n","import { Tooltip, TooltipContent, TooltipTrigger } from '../../../ds/components/Tooltip';\nimport { CHART_COLORS } from './metrics-utils';\n\nexport function BarListContent({\n data,\n maxVal,\n fmt,\n color,\n valueLabel,\n legend,\n}: {\n data: Array<{ name: string; value: number }>;\n maxVal: number;\n fmt: (v: number) => string;\n color: string;\n valueLabel?: string;\n legend?: Array<{ color: string; label: string }>;\n}) {\n const sorted = [...data].sort((a, b) => b.value - a.value);\n return (\n <div>\n <div className=\"flex items-center gap-3 mb-2\">\n <div className=\"flex-1 flex items-center gap-4\">\n {legend?.map(l => (\n <div key={l.label} className=\"flex items-center gap-1.5\">\n <div className=\"size-2 rounded-full\" style={{ backgroundColor: l.color }} />\n <span className=\"text-xs text-icon2\">{l.label}</span>\n </div>\n ))}\n </div>\n {valueLabel && <span className=\"shrink-0 text-xs text-icon2\">{valueLabel}</span>}\n </div>\n <div className=\"space-y-2.5\">\n {sorted.map(d => {\n const pct = Math.min(Math.max(maxVal > 0 ? (d.value / maxVal) * 100 : 0, 0), 100);\n return (\n <div key={d.name} className=\"group flex items-center gap-3\">\n <div className=\"relative flex-1 h-7\">\n <div\n className=\"absolute inset-y-0 left-0 rounded\"\n style={{ width: `${pct}%`, backgroundColor: color }}\n />\n <span className=\"absolute inset-y-0 left-2 flex items-center text-xs text-white whitespace-nowrap\">\n {d.name}\n </span>\n </div>\n <span className=\"shrink-0 text-xs font-mono text-icon6 tabular-nums\">{fmt(d.value)}</span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport function StackedRunsBars({ data }: { data: Array<{ name: string; completed: number; errors: number }> }) {\n const sorted = [...data].sort((a, b) => b.completed + b.errors - (a.completed + a.errors));\n const maxTotal = Math.max(...sorted.map(d => d.completed + d.errors));\n return (\n <div>\n <div className=\"flex items-center gap-3 mb-2\">\n <div className=\"flex-1 flex items-center gap-4\">\n <div className=\"flex items-center gap-1.5\">\n <div className=\"size-2 rounded-full\" style={{ backgroundColor: CHART_COLORS.blue }} />\n <span className=\"text-xs text-icon2\">Completed</span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <div className=\"size-2 rounded-full\" style={{ backgroundColor: CHART_COLORS.red }} />\n <span className=\"text-xs text-icon2\">Errors</span>\n </div>\n </div>\n <span className=\"shrink-0 text-xs text-icon2\">Total (Success)</span>\n </div>\n <div className=\"space-y-2.5\">\n {sorted.map(d => {\n const total = d.completed + d.errors;\n const successPct = total > 0 ? ((d.completed / total) * 100).toFixed(1) : '0.0';\n const completedWidth = Math.min(Math.max(maxTotal > 0 ? (d.completed / maxTotal) * 100 : 0, 0), 100);\n const errorsWidth = Math.min(Math.max(maxTotal > 0 ? (d.errors / maxTotal) * 100 : 0, 0), 100);\n return (\n <div key={d.name} className=\"group flex items-center gap-3\">\n <div className=\"relative flex-1 h-7\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div\n role=\"img\"\n aria-label={`${d.completed.toLocaleString()} completed`}\n tabIndex={0}\n className=\"absolute inset-y-0 left-0 rounded-l cursor-default\"\n style={{ width: `${completedWidth}%`, backgroundColor: CHART_COLORS.blue }}\n />\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"font-mono\">\n {d.completed.toLocaleString()} completed\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <div\n role=\"img\"\n aria-label={`${d.errors.toLocaleString()} errors`}\n tabIndex={0}\n className=\"absolute inset-y-0 rounded-r cursor-default\"\n style={{\n left: `${completedWidth}%`,\n width: `${errorsWidth}%`,\n backgroundColor: CHART_COLORS.red,\n }}\n />\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"font-mono\">\n {d.errors.toLocaleString()} errors\n </TooltipContent>\n </Tooltip>\n <span className=\"absolute inset-y-0 left-2 flex items-center text-xs text-white whitespace-nowrap pointer-events-none\">\n {d.name}\n </span>\n </div>\n <span className=\"shrink-0 text-xs font-mono text-icon6 tabular-nums\">\n {total.toLocaleString()} ({successPct}%)\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { EyeIcon, LogsIcon } from 'lucide-react';\nimport { Button } from '../../../ds/components/Button/Button';\nimport type { LinkComponent } from '../../../ds/types/link-component';\n\ntype CardActionButtonProps = {\n /** Pre-built drilldown URL (typically from `useDrilldown().getTracesHref(...)`). */\n href: string;\n /** Override how the underlying anchor is rendered — pass a router-aware Link\n * to keep navigation in-app. Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n};\n\n/** Icon link in a MetricsCard top bar that opens the Traces page pre-filtered\n * to whatever dimensions the card knows about. */\nexport function OpenInTracesButton({ href, LinkComponent = 'a' }: CardActionButtonProps) {\n return (\n <Button\n as={LinkComponent}\n href={href}\n variant=\"ghost\"\n size=\"icon-md\"\n tooltip=\"View in Traces\"\n aria-label=\"View in Traces\"\n >\n <EyeIcon />\n </Button>\n );\n}\n\n/** Icon link in a MetricsCard top bar that opens the Logs page scoped to\n * errors for the card's current dimensions. */\nexport function OpenErrorsInLogsButton({ href, LinkComponent = 'a' }: CardActionButtonProps) {\n return (\n <Button\n as={LinkComponent}\n href={href}\n variant=\"ghost\"\n size=\"icon-md\"\n tooltip=\"View errors in Logs\"\n aria-label=\"View errors in Logs\"\n >\n <LogsIcon />\n </Button>\n );\n}\n","import { MetricsKpiCard } from '../../../ds/components/MetricsKpiCard';\n\nexport interface KpiCardViewProps {\n label: string;\n value: string | null;\n prevValue?: string;\n changePct?: number | null;\n isLoading: boolean;\n isError: boolean;\n}\n\nexport function KpiCardView({ label, value, prevValue, changePct, isLoading, isError }: KpiCardViewProps) {\n const hasData = value != null;\n return (\n <MetricsKpiCard>\n <MetricsKpiCard.Label>{label}</MetricsKpiCard.Label>\n <MetricsKpiCard.Value className={hasData ? undefined : 'invisible'}>{hasData ? value : '—'}</MetricsKpiCard.Value>\n {isError ? (\n <MetricsKpiCard.Error />\n ) : isLoading ? (\n <MetricsKpiCard.Loading />\n ) : hasData ? (\n changePct != null ? (\n <MetricsKpiCard.Change changePct={changePct} prevValue={prevValue} />\n ) : (\n <MetricsKpiCard.NoChange />\n )\n ) : (\n <MetricsKpiCard.NoData />\n )}\n </MetricsKpiCard>\n );\n}\n","import { useEffect, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { MetricsCard } from '../../../ds/components/MetricsCard';\nimport { MetricsLineChart } from '../../../ds/components/MetricsLineChart';\nimport { Tab, TabContent, TabList, Tabs } from '../../../ds/components/Tabs';\nimport type { LatencyPoint } from '../hooks/use-latency-metrics';\nimport { CHART_COLORS } from './metrics-utils';\n\nconst latencySeries = [\n {\n dataKey: 'p50',\n label: 'p50',\n color: CHART_COLORS.blue,\n aggregate: (data: Record<string, unknown>[]) => ({\n value: data.length > 0 ? `${Math.round(data.reduce((s, d) => s + (d.p50 as number), 0) / data.length)}` : '0',\n suffix: 'avg ms',\n }),\n },\n {\n dataKey: 'p95',\n label: 'p95',\n color: CHART_COLORS.yellow,\n aggregate: (data: Record<string, unknown>[]) => ({\n value: data.length > 0 ? `${Math.round(data.reduce((s, d) => s + (d.p95 as number), 0) / data.length)}` : '0',\n suffix: 'avg ms',\n }),\n },\n];\n\nexport type LatencyTab = 'agents' | 'workflows' | 'tools';\n\nfunction LatencyChart({ data, onPointClick }: { data: LatencyPoint[]; onPointClick?: (point: LatencyPoint) => void }) {\n if (data.length === 0) {\n return <MetricsCard.NoData message=\"No latency data yet\" />;\n }\n return (\n <MetricsLineChart\n data={data}\n series={latencySeries}\n onPointClick={\n onPointClick\n ? point => {\n const p = point as LatencyPoint;\n if (typeof p?.tsMs === 'number' && Number.isFinite(p.tsMs)) onPointClick(p);\n }\n : undefined\n }\n />\n );\n}\n\nexport interface LatencyCardViewProps {\n data: { agentData: LatencyPoint[]; workflowData: LatencyPoint[]; toolData: LatencyPoint[] } | undefined;\n isLoading: boolean;\n isError: boolean;\n /** Optional drilldown: invoked when a chart node is clicked. Container provides the navigation. */\n onPointClick?: (tab: LatencyTab, point: LatencyPoint) => void;\n /**\n * Optional slot for top-bar action buttons (e.g. \"View in Traces\").\n * Pass a function to receive the active tab so the action can scope itself to the current entity type.\n */\n actions?: ReactNode | ((tab: LatencyTab) => ReactNode);\n}\n\nexport function LatencyCardView({ data, isLoading, isError, onPointClick, actions }: LatencyCardViewProps) {\n const initialTab: LatencyTab = !data\n ? 'agents'\n : data.agentData.length > 0\n ? 'agents'\n : data.workflowData.length > 0\n ? 'workflows'\n : data.toolData.length > 0\n ? 'tools'\n : 'agents';\n const [activeTab, setActiveTab] = useState<LatencyTab>(initialTab);\n // Resync to a non-empty tab when async data finishes loading. Without this,\n // a card that mounts before data arrives stays stuck on `agents` even when\n // only workflow/tool data exists.\n useEffect(() => {\n if (!data) return;\n const tabHasData = {\n agents: data.agentData.length > 0,\n workflows: data.workflowData.length > 0,\n tools: data.toolData.length > 0,\n } as const;\n if (!tabHasData[activeTab] && tabHasData[initialTab]) {\n setActiveTab(initialTab);\n }\n }, [data, activeTab, initialTab]);\n const renderedActions = typeof actions === 'function' ? actions(activeTab) : actions;\n const hasData = !!data && (data.agentData.length > 0 || data.workflowData.length > 0 || data.toolData.length > 0);\n const p50Values = data\n ? Object.values(data)\n .filter(Array.isArray)\n .flat()\n .map(d => d.p50)\n .filter((v): v is number => typeof v === 'number')\n : [];\n const avgP50 =\n p50Values.length > 0 ? `${Math.round(p50Values.reduce((s, v) => s + v, 0) / p50Values.length)}ms` : '—';\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Latency\" description=\"Hourly p50 and p95 latency.\" />\n {hasData && <MetricsCard.Summary value={avgP50} label=\"Avg p50\" />}\n {renderedActions ? <MetricsCard.Actions>{renderedActions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load latency data\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No latency data yet\" />\n ) : (\n <Tabs value={activeTab} onValueChange={setActiveTab} defaultTab={initialTab} className=\"overflow-visible\">\n <TabList>\n <Tab value=\"agents\">Agents</Tab>\n <Tab value=\"workflows\">Workflows</Tab>\n <Tab value=\"tools\">Tools</Tab>\n </TabList>\n <TabContent value=\"agents\">\n <LatencyChart\n data={data.agentData}\n onPointClick={onPointClick ? p => onPointClick('agents', p) : undefined}\n />\n </TabContent>\n <TabContent value=\"workflows\">\n <LatencyChart\n data={data.workflowData}\n onPointClick={onPointClick ? p => onPointClick('workflows', p) : undefined}\n />\n </TabContent>\n <TabContent value=\"tools\">\n <LatencyChart\n data={data.toolData}\n onPointClick={onPointClick ? p => onPointClick('tools', p) : undefined}\n />\n </TabContent>\n </Tabs>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n","import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { DataList } from '../../../ds/components/DataList/data-list';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport { TabContent } from '../../../ds/components/Tabs/tabs-content';\nimport { TabList } from '../../../ds/components/Tabs/tabs-list';\nimport { Tabs } from '../../../ds/components/Tabs/tabs-root';\nimport { Tab } from '../../../ds/components/Tabs/tabs-tab';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { ActiveThreadRow } from '../hooks/use-top-active-threads-metrics';\nimport type { ResourceThreadsRow } from '../hooks/use-top-resources-by-threads-metrics';\nimport { formatCompact, formatCost, METRICS_DATA_LIST_PROPS } from './metrics-utils';\n\nexport type MemoryTab = 'threads' | 'resources';\n\n/** Per-tab query state. Memory has two independent server queries (top\n * threads + top resources) so loading/error are scoped to the active tab. */\ntype MemoryTabState<T> = {\n data: T[] | undefined;\n isLoading: boolean;\n isError: boolean;\n};\n\nexport interface MemoryCardViewProps {\n threads: MemoryTabState<ActiveThreadRow>;\n resources: MemoryTabState<ResourceThreadsRow>;\n /** Optional drilldown for a thread row. Receives the raw hook row. */\n getThreadRowHref?: (row: ActiveThreadRow) => string | undefined;\n /** Optional drilldown for a resource row. Receives the raw hook row. */\n getResourceRowHref?: (row: ResourceThreadsRow) => string | undefined;\n /** Optional slot for top-bar action buttons. Function form receives the active tab. */\n actions?: ReactNode | ((tab: MemoryTab) => ReactNode);\n /** Override how drilldown links are rendered. Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n}\n\nfunction isMemoryTab(value: string): value is MemoryTab {\n return value === 'threads' || value === 'resources';\n}\n\n// IDs are usually 32+ char UUIDs; the table is too narrow to show the full\n// value without horizontal scroll, so we elide the middle.\nfunction shortId(id: string): string {\n if (id.length <= 12) return id;\n return `${id.slice(0, 6)}…${id.slice(-4)}`;\n}\n\ntype ThreadTableRow = ActiveThreadRow & { key: string };\ntype ResourceTableRow = ResourceThreadsRow & { key: string };\n\nexport function MemoryCardView({\n threads,\n resources,\n getThreadRowHref,\n getResourceRowHref,\n actions,\n LinkComponent,\n}: MemoryCardViewProps) {\n const [activeTab, setActiveTab] = useState<MemoryTab>('threads');\n\n const threadRows: ThreadTableRow[] = threads.data?.map(r => ({ ...r, key: r.threadId })) ?? [];\n const resourceRows: ResourceTableRow[] = resources.data?.map(r => ({ ...r, key: r.resourceId })) ?? [];\n\n const hasThreadData = threadRows.length > 0;\n const hasResourceData = resourceRows.length > 0;\n\n const threadTotal = threads.data?.reduce((s, r) => s + r.runs, 0) ?? 0;\n const resourceTotal = resources.data?.reduce((s, r) => s + r.threadCount, 0) ?? 0;\n\n const active = activeTab === 'threads' ? threads : resources;\n const renderedActions = typeof actions === 'function' ? actions(activeTab) : actions;\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Memory\" description=\"Resource and Thread consumption\" />\n {activeTab === 'threads' && hasThreadData && (\n <MetricsCard.Summary value={threadTotal.toLocaleString()} label=\"Total runs\" />\n )}\n {activeTab === 'resources' && hasResourceData && (\n <MetricsCard.Summary value={resourceTotal.toLocaleString()} label=\"Total threads\" />\n )}\n {renderedActions ? <MetricsCard.Actions>{renderedActions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {active.isLoading ? (\n <MetricsCard.Loading />\n ) : active.isError ? (\n <MetricsCard.Error message=\"Failed to load memory data\" />\n ) : (\n <MetricsCard.Content>\n <Tabs\n defaultTab=\"threads\"\n value={activeTab}\n onValueChange={v => {\n if (isMemoryTab(v)) setActiveTab(v);\n }}\n className=\"grid grid-rows-[auto_1fr] overflow-y-auto h-full\"\n >\n <TabList>\n <Tab value=\"threads\">Threads</Tab>\n <Tab value=\"resources\">Resources</Tab>\n </TabList>\n <TabContent value=\"threads\">\n {hasThreadData ? (\n <DataList columns=\"auto auto auto auto auto\" {...METRICS_DATA_LIST_PROPS}>\n <DataList.Top>\n <DataList.TopCell sticky=\"start\">Thread ID</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Resource ID</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Runs</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Tokens</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cost</DataList.TopCell>\n </DataList.Top>\n {threadRows.map(row => {\n const href = getThreadRowHref?.(row);\n const rowCells = (\n <>\n <DataList.RowHeaderCell height=\"compact\" className=\"text-ui-sm\">\n {shortId(row.threadId)}\n </DataList.RowHeaderCell>\n <DataList.NumberCell>{row.resourceId ? shortId(row.resourceId) : '—'}</DataList.NumberCell>\n <DataList.NumberCell highlight>{row.runs.toLocaleString()}</DataList.NumberCell>\n <DataList.NumberCell>{row.tokens > 0 ? formatCompact(row.tokens) : '—'}</DataList.NumberCell>\n <DataList.NumberCell>\n {row.cost != null ? formatCost(row.cost, row.costUnit) : '—'}\n </DataList.NumberCell>\n </>\n );\n\n return href ? (\n <DataList.RowLink key={row.key} to={href} LinkComponent={LinkComponent}>\n {rowCells}\n </DataList.RowLink>\n ) : (\n <DataList.RowStatic key={row.key}>{rowCells}</DataList.RowStatic>\n );\n })}\n </DataList>\n ) : (\n <MetricsCard.NoData message=\"No thread activity yet\" />\n )}\n </TabContent>\n <TabContent value=\"resources\">\n {hasResourceData ? (\n <DataList columns=\"auto auto auto auto\" {...METRICS_DATA_LIST_PROPS}>\n <DataList.Top>\n <DataList.TopCell sticky=\"start\">Resource ID</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Threads</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Tokens</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cost</DataList.TopCell>\n </DataList.Top>\n {resourceRows.map(row => {\n const href = getResourceRowHref?.(row);\n const rowCells = (\n <>\n <DataList.RowHeaderCell height=\"compact\" className=\"text-ui-sm\">\n {shortId(row.resourceId)}\n </DataList.RowHeaderCell>\n <DataList.NumberCell highlight>{row.threadCount.toLocaleString()}</DataList.NumberCell>\n <DataList.NumberCell>{row.tokens > 0 ? formatCompact(row.tokens) : '—'}</DataList.NumberCell>\n <DataList.NumberCell>\n {row.cost != null ? formatCost(row.cost, row.costUnit) : '—'}\n </DataList.NumberCell>\n </>\n );\n\n return href ? (\n <DataList.RowLink key={row.key} to={href} LinkComponent={LinkComponent}>\n {rowCells}\n </DataList.RowLink>\n ) : (\n <DataList.RowStatic key={row.key}>{rowCells}</DataList.RowStatic>\n );\n })}\n </DataList>\n ) : (\n <MetricsCard.NoData message=\"No resource activity yet\" />\n )}\n </TabContent>\n </Tabs>\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n","import type { ReactNode } from 'react';\nimport { DataList } from '../../../ds/components/DataList/data-list';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { ModelUsageRow } from '../hooks/use-model-usage-cost-metrics';\nimport { formatCost, METRICS_DATA_LIST_PROPS } from './metrics-utils';\n\nexport interface ModelUsageCostCardViewProps {\n rows: ModelUsageRow[] | undefined;\n isLoading: boolean;\n isError: boolean;\n /** Optional drilldown for a row in the table. */\n getRowHref?: (row: ModelUsageRow) => string | undefined;\n /** Optional slot for top-bar action buttons. */\n actions?: ReactNode;\n /** Override how drilldown links are rendered. Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n}\n\nexport function ModelUsageCostCardView({\n rows,\n isLoading,\n isError,\n getRowHref,\n actions,\n LinkComponent,\n}: ModelUsageCostCardViewProps) {\n const hasData = !!rows && rows.length > 0;\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Model Usage & Cost\" description=\"Token consumption by model.\" />\n {hasData &&\n (() => {\n const totalCost = rows.reduce((sum, r) => sum + (r.cost ?? 0), 0);\n const units = new Set<string>();\n for (const row of rows) {\n if (row.cost != null && row.costUnit) {\n units.add(row.costUnit);\n }\n }\n let value: string;\n if (units.size === 0) {\n value = totalCost > 0 ? formatCost(totalCost) : '—';\n } else if (units.size === 1) {\n value = totalCost > 0 ? formatCost(totalCost, [...units][0]) : '—';\n } else {\n value = 'Mixed';\n }\n return <MetricsCard.Summary value={value} label=\"Total cost\" />;\n })()}\n {actions ? <MetricsCard.Actions>{actions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load model usage data\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No model usage data yet\" />\n ) : (\n <DataList columns=\"auto auto auto auto auto auto\" {...METRICS_DATA_LIST_PROPS}>\n <DataList.Top>\n <DataList.TopCell sticky=\"start\">Model</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Input</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Output</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cache Read</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cache Write</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cost</DataList.TopCell>\n </DataList.Top>\n {rows.map(row => {\n const href = getRowHref?.(row);\n const rowCells = (\n <>\n <DataList.RowHeaderCell height=\"compact\" className=\"text-ui-sm\">\n {row.model}\n </DataList.RowHeaderCell>\n <DataList.NumberCell>{row.input}</DataList.NumberCell>\n <DataList.NumberCell>{row.output}</DataList.NumberCell>\n <DataList.NumberCell>{row.cacheRead}</DataList.NumberCell>\n <DataList.NumberCell>{row.cacheWrite}</DataList.NumberCell>\n <DataList.NumberCell highlight>\n {row.cost != null ? formatCost(row.cost, row.costUnit) : '—'}\n </DataList.NumberCell>\n </>\n );\n\n return href ? (\n <DataList.RowLink key={row.model} to={href} LinkComponent={LinkComponent}>\n {rowCells}\n </DataList.RowLink>\n ) : (\n <DataList.RowStatic key={row.model}>{rowCells}</DataList.RowStatic>\n );\n })}\n </DataList>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n","import { useMemo } from 'react';\nimport { DataList } from '../../../ds/components/DataList/data-list';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport { MetricsLineChart } from '../../../ds/components/MetricsLineChart/metrics-line-chart';\nimport { TabContent } from '../../../ds/components/Tabs/tabs-content';\nimport { TabList } from '../../../ds/components/Tabs/tabs-list';\nimport { Tabs } from '../../../ds/components/Tabs/tabs-root';\nimport { Tab } from '../../../ds/components/Tabs/tabs-tab';\nimport type { ScorerSummary, ScoresOverTimePoint } from '../hooks/use-scores-metrics';\nimport { CHART_COLORS, METRICS_DATA_LIST_PROPS } from './metrics-utils';\n\nconst SERIES_COLORS = [\n CHART_COLORS.green,\n CHART_COLORS.blue,\n CHART_COLORS.purple,\n CHART_COLORS.orange,\n CHART_COLORS.pink,\n CHART_COLORS.yellow,\n];\n\nexport interface ScoresCardViewProps {\n data:\n | {\n summaryData: ScorerSummary[];\n overTimeData: ScoresOverTimePoint[];\n scorerNames: string[];\n avgScore: number | null;\n }\n | undefined;\n isLoading: boolean;\n isError: boolean;\n}\n\nexport function ScoresCardView({ data, isLoading, isError }: ScoresCardViewProps) {\n const hasData = !!data && (data.summaryData.length > 0 || data.overTimeData.length > 0);\n\n const series = useMemo(() => {\n if (!data?.scorerNames) return [];\n return data.scorerNames.map((name, i) => ({\n dataKey: name,\n label: name,\n color: SERIES_COLORS[i % SERIES_COLORS.length],\n aggregate: (points: Record<string, unknown>[]) => ({\n value:\n points.length > 0\n ? (points.reduce((s, d) => s + ((d[name] as number) ?? 0), 0) / points.length).toFixed(2)\n : '0',\n suffix: 'avg',\n }),\n }));\n }, [data?.scorerNames]);\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Scores\" description=\"Evaluation scorer performance.\" />\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load scores data\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No scores data yet\" />\n ) : (\n <Tabs defaultTab=\"over-time\" className=\"overflow-visible\">\n <TabList>\n <Tab value=\"over-time\">Over Time</Tab>\n <Tab value=\"summary\">Summary</Tab>\n </TabList>\n <TabContent value=\"over-time\" className=\"pb-0\">\n {data.overTimeData.length > 0 ? (\n <MetricsLineChart data={data.overTimeData} series={series} yDomain={[0, 1]} />\n ) : (\n <MetricsCard.NoData message=\"No time series data yet\" />\n )}\n </TabContent>\n <TabContent value=\"summary\">\n <DataList columns=\"auto auto auto auto auto\" {...METRICS_DATA_LIST_PROPS}>\n <DataList.Top>\n <DataList.TopCell sticky=\"start\">Scorer</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Avg</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Min</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Max</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Count</DataList.TopCell>\n </DataList.Top>\n {data.summaryData.map(row => (\n <DataList.RowStatic key={row.scorer}>\n <DataList.RowHeaderCell height=\"compact\" className=\"text-ui-sm\">\n {row.scorer}\n </DataList.RowHeaderCell>\n <DataList.NumberCell highlight>{row.avg.toFixed(2)}</DataList.NumberCell>\n <DataList.NumberCell>{row.min.toFixed(2)}</DataList.NumberCell>\n <DataList.NumberCell>{row.max.toFixed(2)}</DataList.NumberCell>\n <DataList.NumberCell>{row.count.toLocaleString()}</DataList.NumberCell>\n </DataList.RowStatic>\n ))}\n </DataList>\n </TabContent>\n </Tabs>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n","import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { HorizontalBars } from '../../../ds/components/HorizontalBars/horizontal-bars';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport { TabContent } from '../../../ds/components/Tabs/tabs-content';\nimport { TabList } from '../../../ds/components/Tabs/tabs-list';\nimport { Tabs } from '../../../ds/components/Tabs/tabs-root';\nimport { Tab } from '../../../ds/components/Tabs/tabs-tab';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { TokenUsageByAgentRow } from '../hooks/use-token-usage-by-agent-metrics';\nimport { CHART_COLORS, formatCompact, formatCost } from './metrics-utils';\n\nexport interface TokenUsageByAgentCardViewProps {\n data: TokenUsageByAgentRow[] | undefined;\n isLoading: boolean;\n isError: boolean;\n /** Optional drilldown: returns an href for a single row in either tab. */\n getRowHref?: (row: TokenUsageByAgentRow) => string | undefined;\n /** Optional slot for top-bar action buttons. */\n actions?: ReactNode;\n /** Override how drilldown links are rendered. Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n}\n\ntype TokenUsageTab = 'tokens' | 'cost';\n\nfunction isTokenUsageTab(value: string): value is TokenUsageTab {\n return value === 'tokens' || value === 'cost';\n}\n\nexport function TokenUsageByAgentCardView({\n data,\n isLoading,\n isError,\n getRowHref,\n actions,\n LinkComponent,\n}: TokenUsageByAgentCardViewProps) {\n const [activeTab, setActiveTab] = useState<TokenUsageTab>('tokens');\n\n const rows = data ?? [];\n const hasData = rows.length > 0;\n const totalTokens = rows.reduce((s, d) => s + d.total, 0);\n const costRows = rows.filter(d => d.cost != null && d.cost > 0);\n const uniqueCostUnits = new Set(costRows.map(d => d.costUnit ?? 'usd'));\n const hasSingleCostUnit = uniqueCostUnits.size <= 1;\n const costUnit = hasSingleCostUnit ? ([...uniqueCostUnits][0] ?? 'usd') : null;\n const totalCost = hasSingleCostUnit ? costRows.reduce((s, d) => s + (d.cost ?? 0), 0) : 0;\n const hasCostData = hasSingleCostUnit && totalCost > 0;\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription\n title=\"Token Usage by Agent\"\n description=\"Token consumption grouped by agent.\"\n />\n {hasData &&\n (activeTab === 'cost' && hasCostData ? (\n <MetricsCard.Summary value={formatCost(totalCost, costUnit)} label=\"Total cost\" />\n ) : (\n <MetricsCard.Summary value={formatCompact(totalTokens)} label=\"Total tokens\" />\n ))}\n {hasData && actions ? <MetricsCard.Actions>{actions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load token usage data\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No token usage data yet\" />\n ) : (\n <Tabs\n defaultTab=\"tokens\"\n value={activeTab}\n onValueChange={v => {\n if (isTokenUsageTab(v)) setActiveTab(v);\n }}\n className=\"grid grid-rows-[auto_1fr] overflow-y-auto h-full\"\n >\n <TabList>\n <Tab value=\"tokens\">Tokens</Tab>\n <Tab value=\"cost\">Cost</Tab>\n </TabList>\n <TabContent value=\"tokens\">\n <HorizontalBars\n LinkComponent={LinkComponent}\n data={rows.map(d => ({\n name: d.name,\n values: [d.input, d.output],\n href: getRowHref?.(d),\n }))}\n segments={[\n { label: 'Input', color: CHART_COLORS.blueDark },\n { label: 'Output', color: CHART_COLORS.blue },\n ]}\n maxVal={Math.max(...rows.map(d => d.input + d.output))}\n fmt={formatCompact}\n />\n </TabContent>\n <TabContent value=\"cost\">\n {hasCostData ? (\n <HorizontalBars\n LinkComponent={LinkComponent}\n data={costRows\n .slice()\n .sort((a, b) => (b.cost ?? 0) - (a.cost ?? 0))\n .map(d => ({ name: d.name, values: [d.cost!], href: getRowHref?.(d) }))}\n segments={[{ label: 'Cost', color: CHART_COLORS.purple }]}\n maxVal={Math.max(...costRows.map(d => d.cost ?? 0))}\n fmt={v => formatCost(v, costUnit)}\n />\n ) : (\n <MetricsCard.NoData message=\"No cost data yet\" />\n )}\n </TabContent>\n </Tabs>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n","import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { MetricsCard } from '../../../ds/components/MetricsCard';\nimport { MetricsLineChart } from '../../../ds/components/MetricsLineChart';\nimport { Tab, TabContent, TabList, Tabs } from '../../../ds/components/Tabs';\nimport type { TokenTimelinePoint, TokenUsageTimeSeriesInterval } from '../hooks/use-token-usage-timeseries';\nimport { CHART_COLORS, formatCompact, formatCost } from './metrics-utils';\n\ntype TokenUsageTimelineTab = 'tokens' | 'cost';\n\nfunction sumMetric(dataKey: 'input' | 'output' | 'cost', formatter: (value: number) => string = formatCompact) {\n return (data: Record<string, unknown>[]) => ({\n value: formatter(data.reduce((sum, point) => sum + (typeof point[dataKey] === 'number' ? point[dataKey] : 0), 0)),\n });\n}\n\nconst tokenSeries = [\n {\n dataKey: 'input',\n label: 'Input tokens',\n color: CHART_COLORS.blue,\n aggregate: sumMetric('input'),\n },\n {\n dataKey: 'output',\n label: 'Output tokens',\n color: CHART_COLORS.yellow,\n aggregate: sumMetric('output'),\n },\n];\n\nfunction isTokenUsageTimelineTab(value: string): value is TokenUsageTimelineTab {\n return value === 'tokens' || value === 'cost';\n}\n\nexport interface TokenUsageTimelineCardViewProps {\n data: TokenTimelinePoint[] | undefined;\n interval: TokenUsageTimeSeriesInterval | undefined;\n isLoading: boolean;\n isError: boolean;\n actions?: ReactNode;\n}\n\nexport function TokenUsageTimelineCardView({\n data,\n interval = '1d',\n isLoading,\n isError,\n actions,\n}: TokenUsageTimelineCardViewProps) {\n const [activeTab, setActiveTab] = useState<TokenUsageTimelineTab>('tokens');\n\n const points = data ?? [];\n const chartPoints = points.map(point => ({ ...point }));\n const hasData = points.length > 0;\n const totalTokens = points.reduce((sum, point) => sum + point.total, 0);\n const costPoints = points.filter(point => point.cost != null && point.cost > 0);\n const costChartPoints = costPoints.map(point => ({ ...point }));\n const uniqueCostUnits = new Set(costPoints.map(point => point.costUnit).filter((unit): unit is string => !!unit));\n const hasSingleCostUnit = uniqueCostUnits.size === 1 && costPoints.every(point => point.costUnit != null);\n const costUnit = hasSingleCostUnit ? ([...uniqueCostUnits][0] ?? null) : null;\n const totalCost = hasSingleCostUnit ? costPoints.reduce((sum, point) => sum + (point.cost ?? 0), 0) : 0;\n const hasCostData = hasSingleCostUnit && totalCost > 0;\n const description = interval === '1h' ? 'Input and output tokens per hour.' : 'Input and output tokens per day.';\n\n const costSeries = [\n {\n dataKey: 'cost',\n label: 'Cost',\n color: CHART_COLORS.purple,\n aggregate: sumMetric('cost', value => formatCost(value, costUnit)),\n },\n ];\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Token usage over time\" description={description} />\n {hasData &&\n (activeTab === 'cost' && hasCostData ? (\n <MetricsCard.Summary value={formatCost(totalCost, costUnit)} label=\"Total cost\" />\n ) : (\n <MetricsCard.Summary value={formatCompact(totalTokens)} label=\"Total tokens\" />\n ))}\n {hasData && actions ? <MetricsCard.Actions>{actions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load token usage timeline\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No token usage data yet\" />\n ) : (\n <Tabs\n defaultTab=\"tokens\"\n value={activeTab}\n onValueChange={value => {\n if (isTokenUsageTimelineTab(value)) setActiveTab(value);\n }}\n className=\"overflow-visible\"\n >\n <TabList>\n <Tab value=\"tokens\">Tokens</Tab>\n <Tab value=\"cost\">Cost</Tab>\n </TabList>\n <TabContent value=\"tokens\">\n <MetricsLineChart data={chartPoints} series={tokenSeries} />\n </TabContent>\n <TabContent value=\"cost\">\n {hasCostData ? (\n <MetricsLineChart data={costChartPoints} series={costSeries} />\n ) : (\n <MetricsCard.NoData message=\"No cost data yet\" />\n )}\n </TabContent>\n </Tabs>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n","import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { HorizontalBars } from '../../../ds/components/HorizontalBars/horizontal-bars';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport { TabContent } from '../../../ds/components/Tabs/tabs-content';\nimport { TabList } from '../../../ds/components/Tabs/tabs-list';\nimport { Tabs } from '../../../ds/components/Tabs/tabs-root';\nimport { Tab } from '../../../ds/components/Tabs/tabs-tab';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { VolumeRow } from '../hooks/use-trace-volume-metrics';\nimport { CHART_COLORS, formatCompact } from './metrics-utils';\n\nexport type VolumeTab = 'agents' | 'workflows' | 'tools';\n\nfunction VolumeBars({\n data,\n rowHrefs,\n errorHrefs,\n LinkComponent,\n}: {\n data: VolumeRow[];\n rowHrefs?: (row: VolumeRow) => string | undefined;\n errorHrefs?: (row: VolumeRow) => string | undefined;\n LinkComponent?: LinkComponent;\n}) {\n return (\n <HorizontalBars\n LinkComponent={LinkComponent}\n data={data.map(d => {\n const errorHref = errorHrefs?.(d);\n const rowHref = rowHrefs?.(d);\n // HorizontalBars ignores per-segment `hrefs` whenever a row-level\n // `href` is set (to avoid nested anchors). When we want the Errors\n // segment to drill somewhere different from the rest of the row,\n // drop the row-level link and split navigation across segments\n // instead so each target is reachable.\n if (errorHref) {\n return {\n name: d.name,\n values: [d.completed, d.errors],\n hrefs: [rowHref, errorHref],\n };\n }\n return {\n name: d.name,\n values: [d.completed, d.errors],\n href: rowHref,\n };\n })}\n segments={[\n { label: 'Completed', color: CHART_COLORS.blueDark },\n { label: 'Errors', color: CHART_COLORS.pink },\n ]}\n maxVal={Math.max(...data.map(d => d.completed + d.errors))}\n fmt={formatCompact}\n />\n );\n}\n\nexport interface TracesVolumeCardViewProps {\n data: { agentData: VolumeRow[]; workflowData: VolumeRow[]; toolData: VolumeRow[] } | undefined;\n isLoading: boolean;\n isError: boolean;\n /** Optional drilldown: returns href for clicking a whole bar row. */\n getRowHref?: (tab: VolumeTab, row: VolumeRow) => string | undefined;\n /** Optional drilldown: returns href for clicking the \"Errors\" segment of a bar. */\n getErrorSegmentHref?: (tab: VolumeTab, row: VolumeRow) => string | undefined;\n /**\n * Optional slot for top-bar action buttons.\n * Pass a function to receive the active tab so actions can scope themselves to the current entity type.\n */\n actions?: ReactNode | ((tab: VolumeTab) => ReactNode);\n /** Override how drilldown links are rendered (e.g. router-aware adapter). Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n}\n\nexport function TracesVolumeCardView({\n data,\n isLoading,\n isError,\n getRowHref,\n getErrorSegmentHref,\n actions,\n LinkComponent,\n}: TracesVolumeCardViewProps) {\n const [activeTab, setActiveTab] = useState<VolumeTab>('agents');\n const renderedActions = typeof actions === 'function' ? actions(activeTab) : actions;\n const hasData = !!data && (data.agentData.length > 0 || data.workflowData.length > 0 || data.toolData.length > 0);\n const total = data\n ? [...data.agentData, ...data.workflowData, ...data.toolData].reduce((s, d) => s + d.completed + d.errors, 0)\n : 0;\n\n const tabRowHrefs = (tab: VolumeTab) => (getRowHref ? (row: VolumeRow) => getRowHref(tab, row) : undefined);\n const tabErrorHrefs = (tab: VolumeTab) =>\n getErrorSegmentHref ? (row: VolumeRow) => getErrorSegmentHref(tab, row) : undefined;\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Trace Volume\" description=\"Runs and call counts.\" />\n {hasData && <MetricsCard.Summary value={formatCompact(total)} label=\"Total runs\" />}\n {renderedActions ? <MetricsCard.Actions>{renderedActions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load trace volume data\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No trace volume data yet\" />\n ) : (\n <Tabs\n value={activeTab}\n onValueChange={setActiveTab}\n defaultTab=\"agents\"\n className=\"grid grid-rows-[auto_1fr] overflow-y-auto h-full\"\n >\n <TabList>\n <Tab value=\"agents\">Agents</Tab>\n <Tab value=\"workflows\">Workflows</Tab>\n <Tab value=\"tools\">Tools</Tab>\n </TabList>\n <TabContent value=\"agents\">\n {data.agentData.length > 0 ? (\n <VolumeBars\n data={data.agentData}\n rowHrefs={tabRowHrefs('agents')}\n errorHrefs={tabErrorHrefs('agents')}\n LinkComponent={LinkComponent}\n />\n ) : (\n <MetricsCard.NoData message=\"No agent data yet\" />\n )}\n </TabContent>\n <TabContent value=\"workflows\">\n {data.workflowData.length > 0 ? (\n <VolumeBars\n data={data.workflowData}\n rowHrefs={tabRowHrefs('workflows')}\n errorHrefs={tabErrorHrefs('workflows')}\n LinkComponent={LinkComponent}\n />\n ) : (\n <MetricsCard.NoData message=\"No workflow data yet\" />\n )}\n </TabContent>\n <TabContent value=\"tools\">\n {data.toolData.length > 0 ? (\n <VolumeBars\n data={data.toolData}\n rowHrefs={tabRowHrefs('tools')}\n errorHrefs={tabErrorHrefs('tools')}\n LinkComponent={LinkComponent}\n />\n ) : (\n <MetricsCard.NoData message=\"No tool data yet\" />\n )}\n </TabContent>\n </Tabs>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n","import { useMemo, useRef } from 'react';\n\nimport { useMetrics } from './use-metrics';\nimport type { DatePreset, DateRange } from './use-metrics';\n\nconst PRESET_MS: Record<string, number> = {\n '24h': 24 * 60 * 60 * 1000,\n '3d': 3 * 24 * 60 * 60 * 1000,\n '7d': 7 * 24 * 60 * 60 * 1000,\n '14d': 14 * 24 * 60 * 60 * 1000,\n '30d': 30 * 24 * 60 * 60 * 1000,\n};\n\ntype Timestamp = { start: Date; end: Date };\n\nfunction buildTimestamp(preset: DatePreset, customRange: DateRange | undefined, anchor: number): Timestamp {\n if (preset !== 'custom') {\n const ms = PRESET_MS[preset] ?? PRESET_MS['24h'];\n return { start: new Date(anchor - ms), end: new Date(anchor) };\n }\n return {\n start: customRange?.from ?? new Date(anchor - PRESET_MS['24h']),\n end: customRange?.to ?? new Date(anchor),\n };\n}\n\n/**\n * Compose a ready-to-use metrics filter object: merges the active date range\n * with the dimensional filter pulled from the provider (sourced from URL +\n * toolbar).\n *\n * Hooks should spread `filters` directly into their backend call — do not pass\n * only `timestamp` or filters set via the toolbar will be silently ignored.\n *\n * Stability guarantees (important for react-query):\n * - `timestamp` is frozen at the moment the inputs change and does NOT update\n * on every render. Otherwise each render would mint a new `new Date()` and\n * every metrics query would re-fetch on every keystroke.\n * - `filters` and `filterKey` are referentially stable while inputs are\n * unchanged, so `queryKey` hashing is cheap and caches hit.\n */\nexport function useMetricsFilters() {\n const { datePreset, customRange, dimensionalFilter, dimensionalFilterKey } = useMetrics();\n\n // Anchor the \"now\" used for preset windows. We only recompute when the\n // preset or custom range changes — this gives a stable timestamp per query\n // boundary rather than a new Date on every render.\n const anchorRef = useRef<{ key: string; anchor: number } | null>(null);\n const windowKey =\n datePreset === 'custom'\n ? `custom:${customRange?.from?.getTime() ?? ''}:${customRange?.to?.getTime() ?? ''}`\n : `preset:${datePreset}`;\n if (!anchorRef.current || anchorRef.current.key !== windowKey) {\n anchorRef.current = { key: windowKey, anchor: Date.now() };\n }\n const anchor = anchorRef.current.anchor;\n\n const timestamp = useMemo(() => buildTimestamp(datePreset, customRange, anchor), [datePreset, customRange, anchor]);\n\n const filters = useMemo(\n () => ({ timestamp, ...dimensionalFilter }),\n // dimensionalFilterKey is a stringified digest, so this dep set gives a\n // stable ref while content is unchanged.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [timestamp, dimensionalFilterKey],\n );\n\n // filterKey combines window + dimensions so react-query keys are cheap.\n const filterKey = useMemo(() => `${windowKey}|${dimensionalFilterKey}`, [windowKey, dimensionalFilterKey]);\n\n return { datePreset, customRange, timestamp, filters, dimensionalFilter, filterKey };\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMetricsFilters } from './use-metrics-filters';\n\n/** Total Agent Runs — count of agent duration metric observations */\nexport function useAgentRunsKpiMetrics() {\n const client = useMastraClient();\n const { filters, filterKey } = useMetricsFilters();\n\n return useQuery({\n queryKey: ['metrics', 'agent-runs-kpi', filterKey],\n queryFn: () =>\n client.getMetricAggregate({\n name: ['mastra_agent_duration_ms'],\n aggregation: 'count',\n filters,\n comparePeriod: 'previous_period',\n }),\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMetricsFilters } from './use-metrics-filters';\n\n/** Total Model Cost — sum of estimatedCost across input and output token metrics */\nexport function useModelCostKpiMetrics() {\n const client = useMastraClient();\n const { filters, filterKey } = useMetricsFilters();\n\n return useQuery({\n queryKey: ['metrics', 'model-cost-kpi', filterKey],\n queryFn: async () => {\n const res = await client.getMetricAggregate({\n name: ['mastra_model_total_input_tokens', 'mastra_model_total_output_tokens'],\n aggregation: 'sum',\n filters,\n comparePeriod: 'previous_period',\n });\n\n return {\n cost: res.estimatedCost ?? null,\n costUnit: res.costUnit ?? null,\n previousCost: res.previousEstimatedCost ?? null,\n costChangePercent: res.costChangePercent ?? null,\n };\n },\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMetricsFilters } from './use-metrics-filters';\n\n/** Total Tokens — sum of all input + output tokens */\nexport function useTotalTokensKpiMetrics() {\n const client = useMastraClient();\n const { filters, filterKey } = useMetricsFilters();\n\n return useQuery({\n queryKey: ['metrics', 'total-tokens-kpi', filterKey],\n queryFn: async () => {\n const [input, output] = await Promise.all([\n client.getMetricAggregate({\n name: ['mastra_model_total_input_tokens'],\n aggregation: 'sum',\n filters,\n comparePeriod: 'previous_period',\n }),\n client.getMetricAggregate({\n name: ['mastra_model_total_output_tokens'],\n aggregation: 'sum',\n filters,\n comparePeriod: 'previous_period',\n }),\n ]);\n\n const hasCurrent = input.value != null || output.value != null;\n const hasPrevious = input.previousValue != null || output.previousValue != null;\n const value = (input.value ?? 0) + (output.value ?? 0);\n const previousValue = (input.previousValue ?? 0) + (output.previousValue ?? 0);\n const changePercent = hasPrevious && previousValue > 0 ? ((value - previousValue) / previousValue) * 100 : null;\n\n return {\n value: hasCurrent ? value : null,\n previousValue: hasPrevious ? previousValue : null,\n changePercent,\n };\n },\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { formatCompact } from '../components/metrics-utils';\nimport { useMetricsFilters } from './use-metrics-filters';\n\nexport interface ModelUsageRow {\n model: string;\n input: string;\n output: string;\n cacheRead: string;\n cacheWrite: string;\n cost: number | null;\n costUnit: string | null;\n}\n\nexport function useModelUsageCostMetrics() {\n const client = useMastraClient();\n const { filters, filterKey } = useMetricsFilters();\n\n return useQuery({\n queryKey: ['metrics', 'model-usage-cost', filterKey],\n queryFn: async (): Promise<ModelUsageRow[]> => {\n const [inputRes, outputRes, cacheReadRes, cacheWriteRes] = await Promise.all(\n (\n [\n 'mastra_model_total_input_tokens',\n 'mastra_model_total_output_tokens',\n 'mastra_model_input_cache_read_tokens',\n 'mastra_model_input_cache_write_tokens',\n ] as const\n ).map(name =>\n client.getMetricBreakdown({\n name: [name],\n groupBy: ['model'],\n aggregation: 'sum',\n orderDirection: 'DESC',\n filters,\n }),\n ),\n );\n\n type ModelEntry = {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: number | null;\n costUnit: string | null;\n };\n\n const modelMap = new Map<string, ModelEntry>();\n\n const ensureModel = (model: string): ModelEntry => {\n if (!modelMap.has(model)) {\n modelMap.set(model, { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: null, costUnit: null });\n }\n return modelMap.get(model)!;\n };\n\n // total_input/total_output estimatedCost already rolls up cache + other detail\n // costs. The cache breakdowns are kept for their token counts only.\n const addCost = (entry: ModelEntry, group: { estimatedCost?: number | null; costUnit?: string | null }) => {\n if (group.estimatedCost != null) {\n entry.cost = (entry.cost ?? 0) + group.estimatedCost;\n if (group.costUnit) entry.costUnit = group.costUnit;\n }\n };\n\n for (const group of inputRes.groups) {\n const m = group.dimensions.model ?? 'unknown';\n const entry = ensureModel(m);\n entry.input = group.value;\n addCost(entry, group);\n }\n for (const group of outputRes.groups) {\n const m = group.dimensions.model ?? 'unknown';\n const entry = ensureModel(m);\n entry.output = group.value;\n addCost(entry, group);\n }\n for (const group of cacheReadRes.groups) {\n const m = group.dimensions.model ?? 'unknown';\n const entry = ensureModel(m);\n entry.cacheRead = group.value;\n }\n for (const group of cacheWriteRes.groups) {\n const m = group.dimensions.model ?? 'unknown';\n const entry = ensureModel(m);\n entry.cacheWrite = group.value;\n }\n\n return Array.from(modelMap.entries())\n .map(([model, vals]) => ({\n model,\n input: formatCompact(vals.input),\n output: formatCompact(vals.output),\n cacheRead: formatCompact(vals.cacheRead),\n cacheWrite: formatCompact(vals.cacheWrite),\n cost: vals.cost,\n costUnit: vals.costUnit,\n }))\n .sort((a, b) => a.model.localeCompare(b.model));\n },\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMetricsFilters } from './use-metrics-filters';\n\nexport interface LatencyPoint {\n [key: string]: unknown;\n time: string;\n /** Raw timestamp (ms since epoch) for the bucket this point represents.\n * Used by drilldown clicks to compute a narrow time window. */\n tsMs: number;\n p50: number;\n p95: number;\n}\n\nexport const LATENCY_INTERVAL: '1h' = '1h';\n\nasync function fetchPercentiles(\n client: ReturnType<typeof useMastraClient>,\n metricName: string,\n filters: Record<string, unknown>,\n): Promise<LatencyPoint[]> {\n const res = await client.getMetricPercentiles({\n name: metricName,\n percentiles: [0.5, 0.95],\n interval: LATENCY_INTERVAL,\n filters,\n });\n\n const p50Series = res.series.find(s => s.percentile === 0.5);\n const p95Series = res.series.find(s => s.percentile === 0.95);\n\n if (!p50Series || !p95Series) return [];\n\n const p95Map = new Map(p95Series.points.map(p => [new Date(p.timestamp).getTime(), p.value]));\n\n return p50Series.points.map(p => {\n const ts = new Date(p.timestamp);\n const tsMs = ts.getTime();\n return {\n time: ts.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', hour12: false }),\n tsMs,\n p50: Math.round(p.value),\n p95: Math.round(p95Map.get(tsMs) ?? 0),\n };\n });\n}\n\nexport function useLatencyMetrics() {\n const client = useMastraClient();\n const { filters, filterKey } = useMetricsFilters();\n\n return useQuery({\n queryKey: ['metrics', 'latency', filterKey],\n queryFn: async () => {\n const [agentData, workflowData, toolData] = await Promise.all([\n fetchPercentiles(client, 'mastra_agent_duration_ms', filters),\n fetchPercentiles(client, 'mastra_workflow_duration_ms', filters),\n fetchPercentiles(client, 'mastra_tool_duration_ms', filters),\n ]);\n return { agentData, workflowData, toolData, interval: LATENCY_INTERVAL };\n },\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMetricsFilters } from './use-metrics-filters';\n\nexport interface VolumeRow {\n name: string;\n completed: number;\n errors: number;\n}\n\nasync function fetchVolume(\n client: ReturnType<typeof useMastraClient>,\n metricName: string,\n filters: Record<string, unknown>,\n): Promise<VolumeRow[]> {\n const res = await client.getMetricBreakdown({\n name: [metricName],\n groupBy: ['entityName', 'status'],\n aggregation: 'count',\n orderDirection: 'DESC',\n filters,\n });\n\n const map = new Map<string, { completed: number; errors: number }>();\n\n for (const group of res.groups) {\n const name = group.dimensions.entityName ?? 'unknown';\n const status = group.dimensions.status ?? 'ok';\n if (!map.has(name)) {\n map.set(name, { completed: 0, errors: 0 });\n }\n const entry = map.get(name)!;\n if (status === 'error') {\n entry.errors += group.value;\n } else {\n entry.completed += group.value;\n }\n }\n\n return Array.from(map.entries())\n .map(([name, vals]) => ({ name, ...vals }))\n .sort((a, b) => b.completed + b.errors - (a.completed + a.errors));\n}\n\nexport function useTraceVolumeMetrics() {\n const client = useMastraClient();\n const { filters, filterKey } = useMetricsFilters();\n\n return useQuery({\n queryKey: ['metrics', 'trace-volume', filterKey],\n queryFn: async () => {\n const [agentData, workflowData, toolData] = await Promise.all([\n fetchVolume(client, 'mastra_agent_duration_ms', filters),\n fetchVolume(client, 'mastra_workflow_duration_ms', filters),\n fetchVolume(client, 'mastra_tool_duration_ms', filters),\n ]);\n return { agentData, workflowData, toolData };\n },\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMetricsFilters } from './use-metrics-filters';\n\nexport interface ScorerSummary {\n scorer: string;\n avg: number;\n min: number;\n max: number;\n count: number;\n}\n\nexport interface ScoresOverTimePoint {\n time: string;\n [scorer: string]: string | number;\n}\n\nexport function useScoresMetrics() {\n const client = useMastraClient();\n const { datePreset, customRange, timestamp } = useMetricsFilters();\n\n return useQuery({\n queryKey: ['metrics', 'scores-card', datePreset, customRange],\n queryFn: async () => {\n const filters = {\n timestamp: { start: timestamp.start, end: timestamp.end },\n };\n\n const scorersMap = await client.listScorers();\n const scorerIds = Object.keys(scorersMap ?? {});\n\n if (scorerIds.length === 0) {\n return { summaryData: [], overTimeData: [], scorerNames: [], avgScore: null };\n }\n\n // Fetch summary stats first to determine which scorers have data\n const summaryResults = await Promise.all(\n scorerIds.map(async scorerId => {\n const [avg, min, max, count] = await Promise.all([\n client.getScoreAggregate({ scorerId, aggregation: 'avg', filters }),\n client.getScoreAggregate({ scorerId, aggregation: 'min', filters }),\n client.getScoreAggregate({ scorerId, aggregation: 'max', filters }),\n client.getScoreAggregate({ scorerId, aggregation: 'count', filters }),\n ]);\n return {\n scorer: scorerId,\n avg: avg.value ?? 0,\n min: min.value ?? 0,\n max: max.value ?? 0,\n count: count.value ?? 0,\n };\n }),\n );\n\n const summaryData: ScorerSummary[] = summaryResults.filter(s => s.count > 0);\n const scorerNames = summaryData.map(s => s.scorer);\n\n if (summaryData.length === 0) {\n return { summaryData: [], overTimeData: [], scorerNames: [], avgScore: null };\n }\n\n const totalWeighted = summaryData.reduce((s, d) => s + d.avg * d.count, 0);\n const totalCount = summaryData.reduce((s, d) => s + d.count, 0);\n const avgScore = totalCount ? Math.round((totalWeighted / totalCount) * 100) / 100 : 0;\n\n const interval = '1h';\n\n // Fetch hourly time series from the full period for active scorers\n const timeSeriesResults = await Promise.all(\n scorerNames.map(scorerId =>\n client.getScoreTimeSeries({\n scorerId,\n interval,\n aggregation: 'avg',\n filters,\n }),\n ),\n );\n\n // Collapse all days into a single 24-hour view (00:00–23:00).\n // For each hour-of-day, average the values across all days in the range.\n const hourBuckets = new Map<string, Map<string, { sum: number; count: number }>>();\n\n for (let i = 0; i < scorerNames.length; i++) {\n const scorerId = scorerNames[i];\n const series = timeSeriesResults[i]?.series ?? [];\n for (const s of series) {\n for (const point of s.points) {\n const ts = new Date(point.timestamp);\n const hourKey = ts.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n });\n if (!hourBuckets.has(hourKey)) {\n hourBuckets.set(hourKey, new Map());\n }\n const scorerMap = hourBuckets.get(hourKey)!;\n if (!scorerMap.has(scorerId)) {\n scorerMap.set(scorerId, { sum: 0, count: 0 });\n }\n const acc = scorerMap.get(scorerId)!;\n acc.sum += point.value;\n acc.count += 1;\n }\n }\n }\n\n // Build sorted 24h chart data\n const overTimeData: ScoresOverTimePoint[] = Array.from(hourBuckets.entries())\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([hourKey, scorerMap]) => {\n const point: ScoresOverTimePoint = { time: hourKey };\n for (const [scorerId, acc] of scorerMap) {\n point[scorerId] = +(acc.sum / acc.count).toFixed(2);\n }\n return point;\n });\n\n return {\n summaryData,\n overTimeData,\n scorerNames,\n avgScore,\n };\n },\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMetricsFilters } from './use-metrics-filters';\n\nexport interface TokenUsageByAgentRow {\n name: string;\n total: number;\n input: number;\n output: number;\n cost: number | null;\n costUnit: string | null;\n}\n\nexport function useTokenUsageByAgentMetrics() {\n const client = useMastraClient();\n const { filters, filterKey } = useMetricsFilters();\n\n return useQuery({\n queryKey: ['metrics', 'token-usage-by-agent', filterKey],\n queryFn: async (): Promise<TokenUsageByAgentRow[]> => {\n const breakdownBase = {\n groupBy: ['entityName'],\n aggregation: 'sum' as const,\n orderDirection: 'DESC' as const,\n filters,\n };\n // total_input/total_output estimatedCost already rolls up cache + other detail costs.\n const [inputRes, outputRes] = await Promise.all([\n client.getMetricBreakdown({ ...breakdownBase, name: ['mastra_model_total_input_tokens'] }),\n client.getMetricBreakdown({ ...breakdownBase, name: ['mastra_model_total_output_tokens'] }),\n ]);\n\n type AgentEntry = { input: number; output: number; cost: number | null; costUnit: string | null };\n\n const agentMap = new Map<string, AgentEntry>();\n\n const ensure = (name: string): AgentEntry => {\n if (!agentMap.has(name)) {\n agentMap.set(name, { input: 0, output: 0, cost: null, costUnit: null });\n }\n return agentMap.get(name)!;\n };\n\n const addCost = (entry: AgentEntry, group: { estimatedCost?: number | null; costUnit?: string | null }) => {\n if (group.estimatedCost != null) {\n entry.cost = (entry.cost ?? 0) + group.estimatedCost;\n if (group.costUnit) entry.costUnit = group.costUnit;\n }\n };\n\n for (const group of inputRes.groups) {\n const name = group.dimensions.entityName ?? 'unknown';\n const entry = ensure(name);\n entry.input = group.value;\n addCost(entry, group);\n }\n for (const group of outputRes.groups) {\n const name = group.dimensions.entityName ?? 'unknown';\n const entry = ensure(name);\n entry.output = group.value;\n addCost(entry, group);\n }\n\n return Array.from(agentMap.entries())\n .map(([name, vals]) => ({\n name,\n input: vals.input,\n output: vals.output,\n total: vals.input + vals.output,\n cost: vals.cost,\n costUnit: vals.costUnit,\n }))\n .sort((a, b) => b.total - a.total);\n },\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMetricsFilters } from './use-metrics-filters';\n\nexport type TokenUsageTimeSeriesInterval = '1h' | '1d';\n\nexport interface TokenTimelinePoint {\n time: string;\n tsMs: number;\n input: number;\n output: number;\n total: number;\n cost: number | null;\n costUnit: string | null;\n}\n\nexport interface TokenUsageTimeSeriesData {\n data: TokenTimelinePoint[];\n interval: TokenUsageTimeSeriesInterval;\n}\n\ntype TimeSeriesPoint = {\n timestamp: string | Date;\n value: number;\n estimatedCost?: number | null;\n};\n\ntype SeriesWithCost = {\n costUnit?: string | null;\n points: TimeSeriesPoint[];\n};\n\ntype TokenTimelineAccumulator = {\n tsMs: number;\n input: number;\n output: number;\n cost: number | null;\n costUnits: Set<string>;\n hasUnknownCostUnit: boolean;\n};\n\nfunction chooseTokenUsageInterval(\n datePreset: ReturnType<typeof useMetricsFilters>['datePreset'],\n): TokenUsageTimeSeriesInterval {\n return datePreset === '24h' ? '1h' : '1d';\n}\n\nfunction formatTime(ts: Date, interval: TokenUsageTimeSeriesInterval): string {\n if (interval === '1h') {\n return ts.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', hour12: false });\n }\n return ts.toLocaleDateString('en-US', { month: 'short', day: '2-digit' });\n}\n\nfunction addSeriesPoints(\n pointMap: Map<number, TokenTimelineAccumulator>,\n series: SeriesWithCost | undefined,\n key: 'input' | 'output',\n) {\n for (const point of series?.points ?? []) {\n const tsMs = new Date(point.timestamp).getTime();\n if (!Number.isFinite(tsMs)) continue;\n\n const existing = pointMap.get(tsMs) ?? {\n tsMs,\n input: 0,\n output: 0,\n cost: null,\n costUnits: new Set<string>(),\n hasUnknownCostUnit: false,\n };\n\n existing[key] += point.value;\n\n if (point.estimatedCost != null) {\n existing.cost = (existing.cost ?? 0) + point.estimatedCost;\n if (series?.costUnit) {\n existing.costUnits.add(series.costUnit);\n } else {\n existing.hasUnknownCostUnit = true;\n }\n }\n\n pointMap.set(tsMs, existing);\n }\n}\n\nfunction toCostUnit(entry: TokenTimelineAccumulator): string | null {\n if (entry.cost == null || entry.hasUnknownCostUnit || entry.costUnits.size !== 1) return null;\n return [...entry.costUnits][0] ?? null;\n}\n\nexport function useTokenUsageTimeSeries() {\n const client = useMastraClient();\n const { datePreset, filters, filterKey } = useMetricsFilters();\n const interval = chooseTokenUsageInterval(datePreset);\n\n return useQuery({\n queryKey: ['metrics', 'token-usage-timeseries', filterKey, interval],\n queryFn: async (): Promise<TokenUsageTimeSeriesData> => {\n const [inputRes, outputRes] = await Promise.all([\n client.getMetricTimeSeries({\n name: ['mastra_model_total_input_tokens'],\n interval,\n aggregation: 'sum',\n filters,\n }),\n client.getMetricTimeSeries({\n name: ['mastra_model_total_output_tokens'],\n interval,\n aggregation: 'sum',\n filters,\n }),\n ]);\n\n const pointMap = new Map<number, TokenTimelineAccumulator>();\n addSeriesPoints(pointMap, inputRes.series[0], 'input');\n addSeriesPoints(pointMap, outputRes.series[0], 'output');\n\n const data = Array.from(pointMap.values())\n .sort((a, b) => a.tsMs - b.tsMs)\n .map(point => {\n const ts = new Date(point.tsMs);\n return {\n time: formatTime(ts, interval),\n tsMs: point.tsMs,\n input: point.input,\n output: point.output,\n total: point.input + point.output,\n cost: point.cost,\n costUnit: toCostUnit(point),\n };\n });\n\n return { data, interval };\n },\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\n\nimport { useMetricsFilters } from './use-metrics-filters';\n\n/** Active Threads — number of distinct thread IDs observed in agent runs.\n * Uses approximate `count_distinct` (HyperLogLog on ClickHouse,\n * `approx_count_distinct` on DuckDB) so the query stays fast even on\n * tens of millions of rows. */\nexport function useActiveThreadsKpiMetrics() {\n const client = useMastraClient();\n const { filters, filterKey } = useMetricsFilters();\n\n return useQuery({\n queryKey: ['metrics', 'active-threads-kpi', filterKey],\n queryFn: () =>\n client.getMetricAggregate({\n name: ['mastra_agent_duration_ms'],\n aggregation: 'count_distinct',\n distinctColumn: 'threadId' as never,\n filters,\n comparePeriod: 'previous_period',\n }),\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\n\nimport { useMetricsFilters } from './use-metrics-filters';\n\n/** Active Resources — number of distinct resource IDs observed in agent runs.\n * Uses approximate `count_distinct` (HyperLogLog on ClickHouse,\n * `approx_count_distinct` on DuckDB) so the query stays fast even on\n * tens of millions of rows. */\nexport function useActiveResourcesKpiMetrics() {\n const client = useMastraClient();\n const { filters, filterKey } = useMetricsFilters();\n\n return useQuery({\n queryKey: ['metrics', 'active-resources-kpi', filterKey],\n queryFn: () =>\n client.getMetricAggregate({\n name: ['mastra_agent_duration_ms'],\n aggregation: 'count_distinct',\n distinctColumn: 'resourceId' as never,\n filters,\n comparePeriod: 'previous_period',\n }),\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\n\nimport { useMetricsFilters } from './use-metrics-filters';\n\nexport interface ActiveThreadRow {\n threadId: string;\n resourceId: string | null;\n runs: number;\n tokens: number;\n cost: number | null;\n costUnit: string | null;\n}\n\nconst TOP_N = 20;\n\n/** Top Active Threads — the threads with the most agent runs in the selected\n * range. Server-side TopK (`ORDER BY value DESC LIMIT 20`) is required so the\n * query never returns the full thread set when cardinality is in the millions.\n *\n * Tokens + cost are joined in from parallel breakdowns on the same `threadId`\n * grouping so we don't need any new backend aggregation support. */\nexport function useTopActiveThreadsMetrics() {\n const client = useMastraClient();\n const { filters, filterKey } = useMetricsFilters();\n\n return useQuery({\n queryKey: ['metrics', 'top-active-threads', filterKey],\n queryFn: async (): Promise<ActiveThreadRow[]> => {\n const breakdownBase = {\n groupBy: ['threadId', 'resourceId'],\n orderDirection: 'DESC' as const,\n filters,\n };\n\n const [runsRes, inputRes, outputRes] = await Promise.all([\n client.getMetricBreakdown({\n ...breakdownBase,\n name: ['mastra_agent_duration_ms'],\n aggregation: 'count',\n limit: TOP_N,\n }),\n // Token breakdowns use the same groupBy and a server-side TopK so the\n // response stays bounded even when the underlying thread set has very\n // high cardinality. Threads that are top-N by runs but not by tokens\n // will display 0 tokens (an acceptable approximation in exchange for\n // a bounded query).\n client.getMetricBreakdown({\n ...breakdownBase,\n name: ['mastra_model_total_input_tokens'],\n aggregation: 'sum',\n limit: TOP_N,\n }),\n client.getMetricBreakdown({\n ...breakdownBase,\n name: ['mastra_model_total_output_tokens'],\n aggregation: 'sum',\n limit: TOP_N,\n }),\n ]);\n\n type Entry = { tokens: number; cost: number | null; costUnit: string | null };\n const byThread = new Map<string, Entry>();\n\n const ensure = (threadId: string): Entry => {\n if (!byThread.has(threadId)) byThread.set(threadId, { tokens: 0, cost: null, costUnit: null });\n return byThread.get(threadId)!;\n };\n\n const foldTokens = (groups: typeof inputRes.groups) => {\n for (const group of groups) {\n const threadId = group.dimensions.threadId;\n if (!threadId) continue;\n const entry = ensure(threadId as string);\n entry.tokens += group.value;\n if (group.estimatedCost != null) {\n entry.cost = (entry.cost ?? 0) + group.estimatedCost;\n if (group.costUnit) entry.costUnit = group.costUnit;\n }\n }\n };\n foldTokens(inputRes.groups);\n foldTokens(outputRes.groups);\n\n return runsRes.groups\n .filter(group => !!group.dimensions.threadId)\n .map(group => {\n const threadId = group.dimensions.threadId as string;\n const extra = byThread.get(threadId);\n return {\n threadId,\n resourceId: (group.dimensions.resourceId as string | undefined) ?? null,\n runs: group.value,\n tokens: extra?.tokens ?? 0,\n cost: extra?.cost ?? null,\n costUnit: extra?.costUnit ?? null,\n };\n });\n },\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\n\nimport { useMetricsFilters } from './use-metrics-filters';\n\nexport interface ResourceThreadsRow {\n resourceId: string;\n threadCount: number;\n tokens: number;\n cost: number | null;\n costUnit: string | null;\n}\n\nconst TOP_N = 20;\n\n/** Top Resources by Thread Count — the resources with the most distinct threads\n * in the selected range. Uses `count_distinct(threadId)` per `resourceId`,\n * with server-side TopK (`ORDER BY value DESC LIMIT 20`).\n *\n * Tokens + cost are joined in from parallel breakdowns on `resourceId` so the\n * table can show cost/usage without a separate backend aggregation. */\nexport function useTopResourcesByThreadsMetrics() {\n const client = useMastraClient();\n const { filters, filterKey } = useMetricsFilters();\n\n return useQuery({\n queryKey: ['metrics', 'top-resources-by-threads', filterKey],\n queryFn: async (): Promise<ResourceThreadsRow[]> => {\n const breakdownBase = {\n groupBy: ['resourceId'],\n orderDirection: 'DESC' as const,\n filters,\n };\n\n const [threadsRes, inputRes, outputRes] = await Promise.all([\n client.getMetricBreakdown({\n ...breakdownBase,\n name: ['mastra_agent_duration_ms'],\n aggregation: 'count_distinct',\n distinctColumn: 'threadId' as never,\n limit: TOP_N,\n }),\n // Token breakdowns use the same groupBy and a server-side TopK so the\n // response stays bounded even when the underlying resource set has very\n // high cardinality. Resources that are top-N by thread count but not by\n // tokens will display 0 tokens (an acceptable approximation in exchange\n // for a bounded query).\n client.getMetricBreakdown({\n ...breakdownBase,\n name: ['mastra_model_total_input_tokens'],\n aggregation: 'sum',\n limit: TOP_N,\n }),\n client.getMetricBreakdown({\n ...breakdownBase,\n name: ['mastra_model_total_output_tokens'],\n aggregation: 'sum',\n limit: TOP_N,\n }),\n ]);\n\n type Entry = { tokens: number; cost: number | null; costUnit: string | null };\n const byResource = new Map<string, Entry>();\n\n const ensure = (resourceId: string): Entry => {\n if (!byResource.has(resourceId)) byResource.set(resourceId, { tokens: 0, cost: null, costUnit: null });\n return byResource.get(resourceId)!;\n };\n\n const foldTokens = (groups: typeof inputRes.groups) => {\n for (const group of groups) {\n const resourceId = group.dimensions.resourceId;\n if (!resourceId) continue;\n const entry = ensure(resourceId as string);\n entry.tokens += group.value;\n if (group.estimatedCost != null) {\n entry.cost = (entry.cost ?? 0) + group.estimatedCost;\n if (group.costUnit) entry.costUnit = group.costUnit;\n }\n }\n };\n foldTokens(inputRes.groups);\n foldTokens(outputRes.groups);\n\n return threadsRes.groups\n .filter(group => !!group.dimensions.resourceId)\n .map(group => {\n const resourceId = group.dimensions.resourceId as string;\n const extra = byResource.get(resourceId);\n return {\n resourceId,\n threadCount: group.value,\n tokens: extra?.tokens ?? 0,\n cost: extra?.cost ?? null,\n costUnit: extra?.costUnit ?? null,\n };\n });\n },\n });\n}\n","import { EntityType } from '@mastra/core/observability';\nimport type { ListLogsArgs } from '@mastra/core/storage';\nimport type { LogLevel } from './types';\nimport type { PropertyFilterField, PropertyFilterToken } from '@/ds/components/PropertyFilter/types';\n\nexport type LogsDatePreset = 'all' | 'last-24h' | 'last-3d' | 'last-7d' | 'last-14d' | 'last-30d' | 'custom';\n\nexport type LogsEntityOptions = { label: string; entityType: EntityType };\n\nexport const LOGS_ROOT_ENTITY_TYPES = {\n AGENT: EntityType.AGENT,\n WORKFLOW: EntityType.WORKFLOW_RUN,\n SCORER: EntityType.SCORER,\n INGEST: EntityType.RAG_INGESTION,\n} as const;\n\nexport const LOGS_ROOT_ENTITY_TYPE_OPTIONS = [\n { label: 'Agent', entityType: LOGS_ROOT_ENTITY_TYPES.AGENT },\n { label: 'Workflow', entityType: LOGS_ROOT_ENTITY_TYPES.WORKFLOW },\n { label: 'Scorer', entityType: LOGS_ROOT_ENTITY_TYPES.SCORER },\n { label: 'Ingest', entityType: LOGS_ROOT_ENTITY_TYPES.INGEST },\n] as const satisfies readonly LogsEntityOptions[];\n\nexport const LOG_LEVEL_VALUES: readonly LogLevel[] = ['debug', 'info', 'warn', 'error', 'fatal'] as const;\n\nexport const LOG_LEVEL_OPTIONS = [\n { label: 'Debug', value: 'debug' },\n { label: 'Info', value: 'info' },\n { label: 'Warn', value: 'warn' },\n { label: 'Error', value: 'error' },\n { label: 'Fatal', value: 'fatal' },\n] as const satisfies readonly { label: string; value: LogLevel }[];\n\nexport const LOGS_ROOT_ENTITY_TYPE_PARAM = 'rootEntityType';\nexport const LOGS_DATE_PRESET_PARAM = 'datePreset';\nexport const LOGS_DATE_FROM_PARAM = 'dateFrom';\nexport const LOGS_DATE_TO_PARAM = 'dateTo';\n\nexport const LOGS_DATE_PRESET_VALUES = new Set<LogsDatePreset>([\n 'all',\n 'last-24h',\n 'last-3d',\n 'last-7d',\n 'last-14d',\n 'last-30d',\n 'custom',\n]);\n\n/**\n * Generic filter URL params (filterX keys). Fields that carry multiple values\n * (tags, level) use repeated params; everything else is a single string.\n */\nexport const LOGS_PROPERTY_FILTER_PARAM_BY_FIELD = {\n level: 'filterLevel',\n tags: 'filterTags',\n entityName: 'filterEntityName',\n traceId: 'filterTraceId',\n spanId: 'filterSpanId',\n runId: 'filterRunId',\n threadId: 'filterThreadId',\n sessionId: 'filterSessionId',\n requestId: 'filterRequestId',\n resourceId: 'filterResourceId',\n userId: 'filterUserId',\n organizationId: 'filterOrganizationId',\n serviceName: 'filterServiceName',\n environment: 'filterEnvironment',\n experimentId: 'filterExperimentId',\n} as const;\n\nexport const LOGS_PROPERTY_FILTER_FIELD_IDS = Object.keys(LOGS_PROPERTY_FILTER_PARAM_BY_FIELD) as Array<\n keyof typeof LOGS_PROPERTY_FILTER_PARAM_BY_FIELD\n>;\n\n/** Fields stored as repeated URL params (value is string[]). */\nconst LOGS_ARRAY_FIELD_IDS = new Set<string>(['tags']);\n\nexport const DEFAULT_LOGS_FILTERS_STORAGE_KEY = 'mastra:logs:saved-filters';\n\nexport function saveLogsFiltersToStorage(\n params: URLSearchParams,\n storageKey: string = DEFAULT_LOGS_FILTERS_STORAGE_KEY,\n): void {\n const serialized = getPreservedLogsFilterParams(params);\n const preset = params.get(LOGS_DATE_PRESET_PARAM);\n if (preset) serialized.set(LOGS_DATE_PRESET_PARAM, preset);\n const from = params.get(LOGS_DATE_FROM_PARAM);\n if (from) serialized.set(LOGS_DATE_FROM_PARAM, from);\n const to = params.get(LOGS_DATE_TO_PARAM);\n if (to) serialized.set(LOGS_DATE_TO_PARAM, to);\n\n try {\n localStorage.setItem(storageKey, serialized.toString());\n } catch {\n // localStorage may be unavailable (private mode / quota) — silently skip.\n }\n}\n\nexport function clearSavedLogsFilters(storageKey: string = DEFAULT_LOGS_FILTERS_STORAGE_KEY): void {\n try {\n localStorage.removeItem(storageKey);\n } catch {\n // ignore\n }\n}\n\nexport function loadLogsFiltersFromStorage(\n storageKey: string = DEFAULT_LOGS_FILTERS_STORAGE_KEY,\n): URLSearchParams | null {\n try {\n const raw = localStorage.getItem(storageKey);\n if (!raw) return null;\n const parsed = new URLSearchParams(raw);\n return parsed.toString() ? parsed : null;\n } catch {\n return null;\n }\n}\n\nexport function hasAnyLogsFilterParams(params: URLSearchParams): boolean {\n if (params.has(LOGS_DATE_PRESET_PARAM)) return true;\n if (params.has(LOGS_DATE_FROM_PARAM)) return true;\n if (params.has(LOGS_DATE_TO_PARAM)) return true;\n if (params.has(LOGS_ROOT_ENTITY_TYPE_PARAM)) return true;\n for (const fieldId of LOGS_PROPERTY_FILTER_FIELD_IDS) {\n if (params.has(LOGS_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId])) return true;\n }\n return false;\n}\n\nexport function createLogsPropertyFilterFields({\n availableTags,\n availableRootEntityNames,\n availableServiceNames,\n availableEnvironments,\n loading,\n}: {\n availableTags: string[];\n availableRootEntityNames: string[];\n availableServiceNames: string[];\n availableEnvironments: string[];\n loading?: {\n tags?: boolean;\n entityNames?: boolean;\n serviceNames?: boolean;\n environments?: boolean;\n };\n}): PropertyFilterField[] {\n const fields: PropertyFilterField[] = [\n {\n id: 'rootEntityType',\n label: 'Primitive Type',\n kind: 'pick-multi',\n searchable: false,\n options: LOGS_ROOT_ENTITY_TYPE_OPTIONS.map(o => ({ label: o.label, value: o.entityType })),\n placeholder: 'Choose entity type',\n emptyText: 'No entity types.',\n },\n {\n id: 'entityName',\n label: 'Primitive Name',\n kind: 'pick-multi',\n options: availableRootEntityNames.map(name => ({ label: name, value: name })),\n placeholder: 'Choose entity names',\n emptyText: 'No entity names found.',\n isLoading: loading?.entityNames,\n },\n {\n id: 'level',\n label: 'Level',\n kind: 'pick-multi',\n searchable: false,\n options: LOG_LEVEL_OPTIONS.map(o => ({ label: o.label, value: o.value })),\n placeholder: 'Choose level',\n emptyText: 'No levels.',\n },\n {\n id: 'tags',\n label: 'Tags',\n kind: 'pick-multi',\n multi: true,\n options: availableTags.map(tag => ({ label: tag, value: tag })),\n placeholder: 'Choose tags',\n emptyText: 'No tags found.',\n isLoading: loading?.tags,\n },\n {\n id: 'serviceName',\n label: 'Service Name',\n kind: 'pick-multi',\n options: availableServiceNames.map(name => ({ label: name, value: name })),\n placeholder: 'Choose service names',\n emptyText: 'No service names found.',\n isLoading: loading?.serviceNames,\n },\n {\n id: 'environment',\n label: 'Environment',\n kind: 'pick-multi',\n options: availableEnvironments.map(env => ({ label: env, value: env })),\n placeholder: 'Choose environments',\n emptyText: 'No environments found.',\n isLoading: loading?.environments,\n },\n { id: 'traceId', label: 'Trace ID', kind: 'text' },\n { id: 'spanId', label: 'Span ID', kind: 'text' },\n { id: 'runId', label: 'Run ID', kind: 'text' },\n { id: 'threadId', label: 'Thread ID', kind: 'text' },\n { id: 'sessionId', label: 'Session ID', kind: 'text' },\n { id: 'requestId', label: 'Request ID', kind: 'text' },\n { id: 'resourceId', label: 'Resource ID', kind: 'text' },\n { id: 'userId', label: 'User ID', kind: 'text' },\n { id: 'organizationId', label: 'Organization ID', kind: 'text' },\n { id: 'experimentId', label: 'Experiment ID', kind: 'text' },\n ];\n const byLabel = (a: PropertyFilterField, b: PropertyFilterField) => a.label.localeCompare(b.label);\n const pickMulti = fields.filter(f => f.kind === 'pick-multi').sort(byLabel);\n const text = fields.filter(f => f.kind === 'text').sort(byLabel);\n return [...pickMulti, ...text];\n}\n\n/**\n * Read filter tokens from URL search params preserving the order in which\n * each filter was first added. Fields in LOGS_ARRAY_FIELD_IDS are read as\n * string[]; an empty sentinel (`filterX=`) keeps the pill alive post-Reset.\n */\nexport function getLogsPropertyFilterTokens(searchParams: URLSearchParams): PropertyFilterToken[] {\n const tokens: PropertyFilterToken[] = [];\n\n const paramToFieldId = new Map<string, string>([[LOGS_ROOT_ENTITY_TYPE_PARAM, 'rootEntityType']]);\n for (const fieldId of LOGS_PROPERTY_FILTER_FIELD_IDS) {\n paramToFieldId.set(LOGS_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId], fieldId);\n }\n\n const seen = new Set<string>();\n for (const [paramName] of searchParams.entries()) {\n const fieldId = paramToFieldId.get(paramName);\n if (!fieldId || seen.has(fieldId)) continue;\n seen.add(fieldId);\n\n if (LOGS_ARRAY_FIELD_IDS.has(fieldId)) {\n const raw = searchParams.getAll(paramName);\n if (raw.length === 0) continue;\n tokens.push({ fieldId, value: raw.filter(Boolean) });\n continue;\n }\n\n const value = searchParams.get(paramName);\n if (value !== null) tokens.push({ fieldId, value });\n }\n\n return tokens;\n}\n\nexport function getPreservedLogsFilterParams(searchParams: URLSearchParams) {\n const next = new URLSearchParams();\n\n const rootEntityType = searchParams.get(LOGS_ROOT_ENTITY_TYPE_PARAM);\n if (rootEntityType) next.set(LOGS_ROOT_ENTITY_TYPE_PARAM, rootEntityType);\n\n for (const fieldId of LOGS_PROPERTY_FILTER_FIELD_IDS) {\n const param = LOGS_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId];\n if (LOGS_ARRAY_FIELD_IDS.has(fieldId)) {\n for (const value of searchParams.getAll(param)) {\n next.append(param, value);\n }\n continue;\n }\n\n const value = searchParams.get(param);\n if (value) next.set(param, value);\n }\n\n return next;\n}\n\nexport function applyLogsPropertyFilterTokens(params: URLSearchParams, tokens: PropertyFilterToken[]) {\n params.delete(LOGS_ROOT_ENTITY_TYPE_PARAM);\n for (const fieldId of LOGS_PROPERTY_FILTER_FIELD_IDS) {\n params.delete(LOGS_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId]);\n }\n\n for (const token of tokens) {\n if (token.fieldId === 'rootEntityType' && typeof token.value === 'string') {\n params.set(LOGS_ROOT_ENTITY_TYPE_PARAM, token.value);\n continue;\n }\n\n const param =\n LOGS_PROPERTY_FILTER_PARAM_BY_FIELD[token.fieldId as keyof typeof LOGS_PROPERTY_FILTER_PARAM_BY_FIELD];\n if (!param) continue;\n\n if (LOGS_ARRAY_FIELD_IDS.has(token.fieldId) && Array.isArray(token.value)) {\n if (token.value.length === 0) {\n // Empty sentinel — keeps the pill visible after Reset.\n params.append(param, '');\n } else {\n for (const value of token.value) {\n params.append(param, value);\n }\n }\n continue;\n }\n\n if (typeof token.value === 'string') {\n // Persist empty / 'Any' values too so neutralized-but-still-visible pills\n // survive URL round-trips. buildLogsListFilters skips these on the API\n // query side so neutrals never reach the backend.\n params.set(param, token.value.trim());\n }\n }\n}\n\nexport function buildLogsListFilters({\n rootEntityType,\n dateFrom,\n dateTo,\n tokens,\n}: {\n rootEntityType?: string;\n dateFrom?: Date;\n dateTo?: Date;\n tokens: PropertyFilterToken[];\n}): ListLogsArgs['filters'] {\n const filters: NonNullable<ListLogsArgs['filters']> = {};\n\n if (rootEntityType) {\n filters.rootEntityType = rootEntityType as NonNullable<ListLogsArgs['filters']>['rootEntityType'];\n }\n\n if (dateFrom || dateTo) {\n filters.timestamp = {\n ...(dateFrom ? { start: dateFrom } : {}),\n ...(dateTo ? { end: dateTo } : {}),\n };\n }\n\n for (const token of tokens) {\n if (token.fieldId === 'tags') {\n if (Array.isArray(token.value) && token.value.length > 0) {\n filters.tags = token.value;\n } else if (typeof token.value === 'string' && token.value.trim()) {\n filters.tags = [token.value.trim()];\n }\n continue;\n }\n\n if (token.fieldId === 'level') {\n // Single-select only — the server's `level` union (single LogLevel or\n // array) can't round-trip as a JSON-string array through the query-param\n // schema wrapper, so we send a single enum value. \"Any\" = no filter.\n if (typeof token.value === 'string' && token.value.trim() && token.value !== 'Any') {\n filters.level = token.value as LogLevel;\n }\n continue;\n }\n\n if (typeof token.value !== 'string') continue;\n // Skip empty-string tokens (unfilled pending filters) and 'Any'\n // (pick-multi single-select neutral state) so neutrals never reach the\n // backend.\n if (!token.value.trim()) continue;\n if (token.value === 'Any') continue;\n\n switch (token.fieldId) {\n case 'entityName':\n filters.rootEntityName = token.value;\n break;\n case 'traceId':\n filters.traceId = token.value;\n break;\n case 'spanId':\n filters.spanId = token.value;\n break;\n case 'runId':\n filters.runId = token.value;\n break;\n case 'threadId':\n filters.threadId = token.value;\n break;\n case 'sessionId':\n filters.sessionId = token.value;\n break;\n case 'requestId':\n filters.requestId = token.value;\n break;\n case 'resourceId':\n filters.resourceId = token.value;\n break;\n case 'userId':\n filters.userId = token.value;\n break;\n case 'organizationId':\n filters.organizationId = token.value;\n break;\n case 'serviceName':\n filters.serviceName = token.value;\n break;\n case 'environment':\n filters.environment = token.value;\n break;\n case 'experimentId':\n filters.experimentId = token.value;\n break;\n default:\n break;\n }\n }\n\n return filters;\n}\n\n/**\n * \"Clear\" semantics for the logs toolbar: keep all filter pills but neutralize each value.\n * '' for text fields, 'Any' for single-select pick-multi, [] for multi-select pick-multi.\n * Date range is intentionally NOT touched here — that's a separate concern.\n */\nexport function neutralizeLogsFilterTokens(\n filterFields: PropertyFilterField[],\n filterTokens: PropertyFilterToken[],\n): PropertyFilterToken[] {\n return filterTokens.map(token => {\n const field = filterFields.find(f => f.id === token.fieldId);\n if (!field) return token;\n if (field.kind === 'text') return { fieldId: token.fieldId, value: '' };\n if (field.kind === 'pick-multi') {\n return field.multi ? { fieldId: token.fieldId, value: [] } : { fieldId: token.fieldId, value: 'Any' };\n }\n return token;\n });\n}\n","import { EntityType } from '@mastra/core/observability';\nimport type { ListTracesArgs } from '@mastra/core/storage';\nimport type { TraceDatePreset } from './types';\nimport type { PropertyFilterField, PropertyFilterToken } from '@/ds/components/PropertyFilter/types';\n\nexport type EntityOptions = { label: string; entityType: EntityType };\n\nexport const ROOT_ENTITY_TYPES = {\n AGENT: EntityType.AGENT,\n WORKFLOW: EntityType.WORKFLOW_RUN,\n SCORER: EntityType.SCORER,\n INGEST: EntityType.RAG_INGESTION,\n} as const;\n\nexport const ROOT_ENTITY_TYPE_OPTIONS = [\n { label: 'Agent', entityType: ROOT_ENTITY_TYPES.AGENT },\n { label: 'Workflow', entityType: ROOT_ENTITY_TYPES.WORKFLOW },\n { label: 'Scorer', entityType: ROOT_ENTITY_TYPES.SCORER },\n { label: 'Ingest', entityType: ROOT_ENTITY_TYPES.INGEST },\n] as const satisfies readonly EntityOptions[];\n\nexport type TraceStatusFilter = 'running' | 'success' | 'error';\n\nexport const TRACE_STATUS_OPTIONS = [\n { label: 'Running', value: 'running' },\n { label: 'Success', value: 'success' },\n { label: 'Error', value: 'error' },\n] as const satisfies readonly { label: string; value: TraceStatusFilter }[];\n\n/** Field ids for \"synthetic\" filter entries — they live in dedicated URL params\n * rather than the generic `filter*` set, but appear as rows in the Filter\n * popover so users can manage all filters from one place. */\nexport const TRACE_SYNTHETIC_FILTER_FIELD_IDS = ['rootEntityType', 'status'] as const;\n\nexport const TRACE_ROOT_ENTITY_TYPE_PARAM = 'rootEntityType';\nexport const TRACE_STATUS_PARAM = 'status';\nexport const TRACE_LIST_MODE_PARAM = 'listMode';\n/** Branch-mode only: identifies the anchor span that defines the displayed subtree.\n * Stable across intra-panel span navigation (which only changes `spanId`). */\nexport const TRACE_ANCHOR_SPAN_ID_PARAM = 'anchorSpanId';\nexport const TRACE_LIST_MODE_VALUES = new Set(['traces', 'branches'] as const);\nexport type TraceListMode = 'traces' | 'branches';\n\nexport const TRACE_LIST_MODE_OPTIONS = [\n { label: 'Traces (default)', value: 'traces' },\n { label: 'Branches', value: 'branches' },\n] as const satisfies readonly { label: string; value: TraceListMode }[];\nexport const TRACE_DATE_PRESET_PARAM = 'datePreset';\nexport const TRACE_DATE_FROM_PARAM = 'dateFrom';\nexport const TRACE_DATE_TO_PARAM = 'dateTo';\n\nexport const TRACE_DATE_PRESET_VALUES = new Set<TraceDatePreset>([\n 'all',\n 'last-24h',\n 'last-3d',\n 'last-7d',\n 'last-14d',\n 'last-30d',\n 'custom',\n]);\n\nexport const TRACE_PROPERTY_FILTER_PARAM_BY_FIELD = {\n tags: 'filterTags',\n entityId: 'filterEntityId',\n entityName: 'filterEntityName',\n traceId: 'filterTraceId',\n runId: 'filterRunId',\n threadId: 'filterThreadId',\n sessionId: 'filterSessionId',\n requestId: 'filterRequestId',\n resourceId: 'filterResourceId',\n userId: 'filterUserId',\n organizationId: 'filterOrganizationId',\n serviceName: 'filterServiceName',\n environment: 'filterEnvironment',\n experimentId: 'filterExperimentId',\n} as const;\n\nexport const TRACE_PROPERTY_FILTER_FIELD_IDS = Object.keys(TRACE_PROPERTY_FILTER_PARAM_BY_FIELD) as Array<\n keyof typeof TRACE_PROPERTY_FILTER_PARAM_BY_FIELD\n>;\n\nexport const TRACE_STATUS_VALUES = new Set<TraceStatusFilter>(['running', 'success', 'error']);\n\nexport const DEFAULT_TRACE_FILTERS_STORAGE_KEY = 'mastra:traces:saved-filters';\n\n/** Serialize the filter-related URL params (date + rootEntityType + status +\n * generic filterX set) to localStorage so the user can restore them on next\n * visit. Throws no errors — storage being unavailable is fine. */\nexport function saveTraceFiltersToStorage(\n params: URLSearchParams,\n storageKey: string = DEFAULT_TRACE_FILTERS_STORAGE_KEY,\n): void {\n const serialized = getPreservedTraceFilterParams(params);\n const preset = params.get(TRACE_DATE_PRESET_PARAM);\n if (preset) serialized.set(TRACE_DATE_PRESET_PARAM, preset);\n const from = params.get(TRACE_DATE_FROM_PARAM);\n if (from) serialized.set(TRACE_DATE_FROM_PARAM, from);\n const to = params.get(TRACE_DATE_TO_PARAM);\n if (to) serialized.set(TRACE_DATE_TO_PARAM, to);\n\n try {\n localStorage.setItem(storageKey, serialized.toString());\n } catch {\n // localStorage may be unavailable (private mode / quota) — silently skip.\n }\n}\n\n/** Forget any previously saved filter set. Called from the \"Remove filters\"\n * action so the next plain sidebar nav lands on an empty page. */\nexport function clearSavedTraceFilters(storageKey: string = DEFAULT_TRACE_FILTERS_STORAGE_KEY): void {\n try {\n localStorage.removeItem(storageKey);\n } catch {\n // ignore — storage may be unavailable\n }\n}\n\n/** Read a previously saved filter set and return it as URLSearchParams, or\n * null if nothing is saved or storage is unavailable. */\nexport function loadTraceFiltersFromStorage(\n storageKey: string = DEFAULT_TRACE_FILTERS_STORAGE_KEY,\n): URLSearchParams | null {\n try {\n const raw = localStorage.getItem(storageKey);\n if (!raw) return null;\n const parsed = new URLSearchParams(raw);\n return parsed.toString() ? parsed : null;\n } catch {\n return null;\n }\n}\n\n/** True when `params` carries any filter-related key — used to decide whether\n * to hydrate from localStorage on page mount (we only hydrate when the URL is\n * filter-clean, i.e. the user landed here via a plain sidebar nav). */\nexport function hasAnyTraceFilterParams(params: URLSearchParams): boolean {\n if (params.has(TRACE_DATE_PRESET_PARAM)) return true;\n if (params.has(TRACE_DATE_FROM_PARAM)) return true;\n if (params.has(TRACE_DATE_TO_PARAM)) return true;\n if (params.has(TRACE_ROOT_ENTITY_TYPE_PARAM)) return true;\n if (params.has(TRACE_STATUS_PARAM)) return true;\n if (params.has(TRACE_LIST_MODE_PARAM)) return true;\n for (const fieldId of TRACE_PROPERTY_FILTER_FIELD_IDS) {\n if (params.has(TRACE_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId])) return true;\n }\n return false;\n}\n\nexport function createTracePropertyFilterFields({\n availableTags,\n availableRootEntityNames,\n availableServiceNames,\n availableEnvironments,\n loading,\n}: {\n availableTags: string[];\n availableRootEntityNames: string[];\n availableServiceNames: string[];\n availableEnvironments: string[];\n loading?: {\n tags?: boolean;\n entityNames?: boolean;\n serviceNames?: boolean;\n environments?: boolean;\n };\n}): PropertyFilterField[] {\n const fields: PropertyFilterField[] = [\n {\n id: 'rootEntityType',\n label: 'Primitive Type',\n kind: 'pick-multi',\n searchable: false,\n options: ROOT_ENTITY_TYPE_OPTIONS.map(o => ({ label: o.label, value: o.entityType })),\n placeholder: 'Choose entity type',\n emptyText: 'No entity types.',\n },\n {\n id: 'entityName',\n label: 'Primitive Name',\n kind: 'pick-multi',\n options: availableRootEntityNames.map(name => ({ label: name, value: name })),\n placeholder: 'Choose entity names',\n emptyText: 'No entity names found.',\n isLoading: loading?.entityNames,\n },\n { id: 'entityId', label: 'Primitive ID', kind: 'text' },\n {\n id: 'status',\n label: 'Status',\n kind: 'pick-multi',\n searchable: false,\n options: TRACE_STATUS_OPTIONS.map(o => ({ label: o.label, value: o.value })),\n placeholder: 'Choose status',\n emptyText: 'No statuses.',\n },\n {\n id: 'tags',\n label: 'Tags',\n kind: 'pick-multi',\n multi: true,\n options: availableTags.map(tag => ({ label: tag, value: tag })),\n placeholder: 'Choose tags',\n emptyText: 'No tags found.',\n isLoading: loading?.tags,\n },\n {\n id: 'serviceName',\n label: 'Service Name',\n kind: 'pick-multi',\n options: availableServiceNames.map(name => ({ label: name, value: name })),\n placeholder: 'Choose service names',\n emptyText: 'No service names found.',\n isLoading: loading?.serviceNames,\n },\n {\n id: 'environment',\n label: 'Environment',\n kind: 'pick-multi',\n options: availableEnvironments.map(env => ({ label: env, value: env })),\n placeholder: 'Choose environments',\n emptyText: 'No environments found.',\n isLoading: loading?.environments,\n },\n { id: 'traceId', label: 'Trace ID', kind: 'text' },\n { id: 'runId', label: 'Run ID', kind: 'text' },\n { id: 'threadId', label: 'Thread ID', kind: 'text' },\n { id: 'sessionId', label: 'Session ID', kind: 'text' },\n { id: 'requestId', label: 'Request ID', kind: 'text' },\n { id: 'resourceId', label: 'Resource ID', kind: 'text' },\n { id: 'userId', label: 'User ID', kind: 'text' },\n { id: 'organizationId', label: 'Organization ID', kind: 'text' },\n { id: 'experimentId', label: 'Experiment ID', kind: 'text' },\n ];\n const byLabel = (a: PropertyFilterField, b: PropertyFilterField) => a.label.localeCompare(b.label);\n const pickMulti = fields.filter(f => f.kind === 'pick-multi').sort(byLabel);\n const text = fields.filter(f => f.kind === 'text').sort(byLabel);\n return [...pickMulti, ...text];\n}\n\n/**\n * Read filter tokens from URL search params preserving the order in which each\n * filter was first added (URLSearchParams iterates in insertion order). This\n * is used by the Filter popover + PropertyFilterApplied pills so the UI reflects the\n * order the user created the filters in.\n */\nexport function getTracePropertyFilterTokens(searchParams: URLSearchParams): PropertyFilterToken[] {\n const tokens: PropertyFilterToken[] = [];\n\n // Map URL param name → fieldId for both generic filterX params and the\n // dedicated synthetic params (rootEntityType, status).\n const paramToFieldId = new Map<string, string>([\n [TRACE_ROOT_ENTITY_TYPE_PARAM, 'rootEntityType'],\n [TRACE_STATUS_PARAM, 'status'],\n ]);\n for (const fieldId of TRACE_PROPERTY_FILTER_FIELD_IDS) {\n paramToFieldId.set(TRACE_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId], fieldId);\n }\n\n const seen = new Set<string>();\n for (const [paramName] of searchParams.entries()) {\n const fieldId = paramToFieldId.get(paramName);\n if (!fieldId || seen.has(fieldId)) continue;\n seen.add(fieldId);\n\n if (fieldId === 'tags') {\n const raw = searchParams.getAll(paramName);\n if (raw.length === 0) continue;\n // An empty `filterTags=` sentinel keeps the pill alive after a Reset\n // (neutral state = no selections) so users can re-pick without losing\n // the pill's position. Non-empty entries are the actual selected tags.\n tokens.push({ fieldId, value: raw.filter(Boolean) });\n continue;\n }\n\n // Text and synthetic single-value fields: include empty strings so\n // pending-but-not-yet-filled filters survive URL round-trips.\n const value = searchParams.get(paramName);\n if (value !== null) tokens.push({ fieldId, value });\n }\n\n return tokens;\n}\n\nexport function getPreservedTraceFilterParams(searchParams: URLSearchParams) {\n const next = new URLSearchParams();\n\n const rootEntityType = searchParams.get(TRACE_ROOT_ENTITY_TYPE_PARAM);\n if (rootEntityType) next.set(TRACE_ROOT_ENTITY_TYPE_PARAM, rootEntityType);\n\n const status = searchParams.get(TRACE_STATUS_PARAM);\n if (status) next.set(TRACE_STATUS_PARAM, status);\n\n const listMode = searchParams.get(TRACE_LIST_MODE_PARAM);\n if (listMode) next.set(TRACE_LIST_MODE_PARAM, listMode);\n\n for (const fieldId of TRACE_PROPERTY_FILTER_FIELD_IDS) {\n const param = TRACE_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId];\n if (fieldId === 'tags') {\n for (const value of searchParams.getAll(param)) {\n next.append(param, value);\n }\n continue;\n }\n\n const value = searchParams.get(param);\n if (value) {\n next.set(param, value);\n }\n }\n\n return next;\n}\n\n/**\n * Clear all filter params from `params` and re-add them in the given `tokens`\n * order so the URL (and therefore the PropertyFilterApplied pills) reflects the\n * creation order of filters. Handles the generic `filterX` params plus the\n * dedicated synthetic params (rootEntityType, status).\n */\nexport function applyTracePropertyFilterTokens(params: URLSearchParams, tokens: PropertyFilterToken[]) {\n params.delete(TRACE_ROOT_ENTITY_TYPE_PARAM);\n params.delete(TRACE_STATUS_PARAM);\n for (const fieldId of TRACE_PROPERTY_FILTER_FIELD_IDS) {\n params.delete(TRACE_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId]);\n }\n\n for (const token of tokens) {\n if (token.fieldId === 'rootEntityType' && typeof token.value === 'string') {\n params.set(TRACE_ROOT_ENTITY_TYPE_PARAM, token.value);\n continue;\n }\n if (token.fieldId === 'status' && typeof token.value === 'string') {\n params.set(TRACE_STATUS_PARAM, token.value);\n continue;\n }\n\n const param =\n TRACE_PROPERTY_FILTER_PARAM_BY_FIELD[token.fieldId as keyof typeof TRACE_PROPERTY_FILTER_PARAM_BY_FIELD];\n if (!param) continue;\n\n if (token.fieldId === 'tags' && Array.isArray(token.value)) {\n if (token.value.length === 0) {\n // Empty sentinel — keeps the pill visible after Reset.\n params.append(param, '');\n } else {\n for (const value of token.value) {\n params.append(param, value);\n }\n }\n continue;\n }\n\n if (typeof token.value === 'string') {\n // Persist empty / 'Any' values too so neutralized-but-still-visible pills\n // survive URL round-trips. buildTraceListFilters skips these on the API\n // query side so neutrals never reach the backend.\n params.set(param, token.value.trim());\n }\n }\n}\n\nexport function buildTraceListFilters({\n rootEntityType,\n status,\n dateFrom,\n dateTo,\n tokens,\n}: {\n rootEntityType?: string;\n status?: TraceStatusFilter;\n dateFrom?: Date;\n dateTo?: Date;\n tokens: PropertyFilterToken[];\n}): ListTracesArgs['filters'] {\n const filters: NonNullable<ListTracesArgs['filters']> = {};\n\n if (rootEntityType) {\n filters.entityType = rootEntityType as NonNullable<ListTracesArgs['filters']>['entityType'];\n }\n\n if (status) {\n filters.status = status as NonNullable<ListTracesArgs['filters']>['status'];\n }\n\n if (dateFrom) {\n filters.startedAt = { start: dateFrom };\n }\n\n if (dateTo) {\n filters.endedAt = { end: dateTo };\n }\n\n for (const token of tokens) {\n if (token.fieldId === 'tags') {\n if (Array.isArray(token.value) && token.value.length > 0) {\n filters.tags = token.value;\n } else if (typeof token.value === 'string' && token.value.trim()) {\n // pick-multi tags: single-string token → wrap for the server's array schema.\n filters.tags = [token.value.trim()];\n }\n continue;\n }\n\n if (typeof token.value !== 'string') continue;\n // Skip empty-string tokens (unfilled pending filters) and 'Any'\n // (pick-multi single-select neutral state) so neutrals never reach the\n // backend.\n if (!token.value.trim()) continue;\n if (token.value === 'Any') continue;\n\n switch (token.fieldId) {\n case 'entityId':\n filters.entityId = token.value;\n break;\n case 'entityName':\n filters.entityName = token.value;\n break;\n case 'traceId':\n filters.traceId = token.value;\n break;\n case 'runId':\n filters.runId = token.value;\n break;\n case 'threadId':\n filters.threadId = token.value;\n break;\n case 'sessionId':\n filters.sessionId = token.value;\n break;\n case 'requestId':\n filters.requestId = token.value;\n break;\n case 'resourceId':\n filters.resourceId = token.value;\n break;\n case 'userId':\n filters.userId = token.value;\n break;\n case 'organizationId':\n filters.organizationId = token.value;\n break;\n case 'serviceName':\n filters.serviceName = token.value;\n break;\n case 'environment':\n filters.environment = token.value;\n break;\n case 'experimentId':\n filters.experimentId = token.value;\n break;\n default:\n break;\n }\n }\n\n return filters;\n}\n\n/**\n * \"Clear\" semantics: keep all filter pills but neutralize each value.\n * '' for text fields, 'Any' for single-select pick-multi, [] for multi-select pick-multi.\n * Date range is intentionally NOT touched here — that's a separate concern.\n */\nexport function neutralizeFilterTokens(\n filterFields: PropertyFilterField[],\n filterTokens: PropertyFilterToken[],\n): PropertyFilterToken[] {\n return filterTokens.map(token => {\n const field = filterFields.find(f => f.id === token.fieldId);\n if (!field) return token;\n if (field.kind === 'text') return { fieldId: token.fieldId, value: '' };\n if (field.kind === 'pick-multi') {\n if (field.omitAnyOption) return token;\n return field.multi ? { fieldId: token.fieldId, value: [] } : { fieldId: token.fieldId, value: 'Any' };\n }\n return token;\n });\n}\n","import type { EntityType } from '@mastra/core/observability';\nimport {\n LOGS_DATE_FROM_PARAM,\n LOGS_DATE_PRESET_PARAM,\n LOGS_DATE_TO_PARAM,\n LOGS_PROPERTY_FILTER_PARAM_BY_FIELD,\n LOGS_ROOT_ENTITY_TYPE_PARAM,\n} from '../logs/log-filters';\nimport type { LogsDatePreset } from '../logs/log-filters';\nimport {\n TRACE_DATE_FROM_PARAM,\n TRACE_DATE_PRESET_PARAM,\n TRACE_DATE_TO_PARAM,\n TRACE_LIST_MODE_PARAM,\n TRACE_PROPERTY_FILTER_PARAM_BY_FIELD,\n TRACE_ROOT_ENTITY_TYPE_PARAM,\n TRACE_STATUS_PARAM,\n} from '../traces/trace-filters';\nimport type { TraceDatePreset } from '../traces/types';\nimport type { DatePreset, DateRange } from './hooks/use-metrics';\nimport type { MetricsDimensionalFilter } from './metrics-filters';\n\n/** Map the metrics date preset (`24h`, `3d`, …) to the equivalent traces /\n * logs preset (`last-24h`, `last-3d`, …). `'custom'` is passed through and\n * explicit from/to dates are serialized separately. Returns `undefined` for\n * presets we can't translate — in that case we omit the date preset and rely\n * on concrete `from`/`to` timestamps. */\nfunction mapPreset(preset: DatePreset): TraceDatePreset | LogsDatePreset | undefined {\n switch (preset) {\n case '24h':\n return 'last-24h';\n case '3d':\n return 'last-3d';\n case '7d':\n return 'last-7d';\n case '14d':\n return 'last-14d';\n case '30d':\n return 'last-30d';\n case 'custom':\n return 'custom';\n default:\n return undefined;\n }\n}\n\n/** Narrow time window for a single chart node. Callers pass concrete start/end\n * Dates (typically bucket boundaries); these bypass the preset. */\nexport type DrilldownWindow = {\n from: Date;\n to: Date;\n};\n\n/** Narrow a raw timestamp into the time-series bucket window that surrounds\n * it. For a chart with `interval = 1h`, clicking a node at 14:37Z drills into\n * 14:00Z → 15:00Z. For `1d`, the corresponding UTC day. */\nexport function narrowWindowToBucket(tsMs: number, interval: '1h' | '1d'): DrilldownWindow {\n if (interval === '1h') {\n const from = new Date(tsMs);\n from.setUTCMinutes(0, 0, 0);\n const to = new Date(from.getTime() + 60 * 60 * 1000);\n return { from, to };\n }\n const from = new Date(tsMs);\n from.setUTCHours(0, 0, 0, 0);\n const to = new Date(from.getTime() + 24 * 60 * 60 * 1000);\n return { from, to };\n}\n\n/** Fields a card may use to scope the drilldown. Only the pieces the caller\n * knows are attached; everything else falls through to the current dashboard\n * filters. `status` is only valid for traces. */\nexport type DrilldownScope = {\n rootEntityType?: EntityType;\n entityName?: string;\n threadId?: string;\n resourceId?: string;\n model?: string;\n provider?: string;\n /** Trace-only. Valid for drill-downs from \"errors\" segments. */\n status?: 'running' | 'success' | 'error';\n /** Overrides date preset with explicit window bounds. */\n window?: DrilldownWindow;\n};\n\ntype BuildArgs = {\n /** Current metrics dashboard preset. */\n preset: DatePreset;\n /** Current metrics dashboard custom range (only honoured when preset === 'custom'). */\n customRange?: DateRange;\n /** Dashboard-level dimensional filters (environment, serviceName, tags, etc.). */\n dashboardFilter: MetricsDimensionalFilter;\n /** Per-card scoping applied on top of dashboard filters. */\n scope: DrilldownScope;\n /** Override the Traces page base path. Defaults to `/observability` (mastra Studio). */\n tracesBasePath?: string;\n /** Override the Logs page base path. Defaults to `/logs` (mastra Studio). */\n logsBasePath?: string;\n};\n\nfunction applyDate(\n params: URLSearchParams,\n presetKey: string,\n fromKey: string,\n toKey: string,\n preset: DatePreset,\n customRange: DateRange | undefined,\n window: DrilldownWindow | undefined,\n): void {\n // A concrete window always wins — it's a precise node-level drilldown.\n if (window) {\n params.set(presetKey, 'custom');\n params.set(fromKey, window.from.toISOString());\n params.set(toKey, window.to.toISOString());\n return;\n }\n if (preset === 'custom') {\n params.set(presetKey, 'custom');\n if (customRange?.from) params.set(fromKey, customRange.from.toISOString());\n if (customRange?.to) params.set(toKey, customRange.to.toISOString());\n return;\n }\n const mapped = mapPreset(preset);\n if (mapped) params.set(presetKey, mapped);\n}\n\nfunction setIfDefined(params: URLSearchParams, key: string, value: string | undefined | null): void {\n if (typeof value === 'string' && value.length > 0) {\n params.set(key, value);\n }\n}\n\nfunction appendArray(params: URLSearchParams, key: string, values: string[] | undefined): void {\n if (!Array.isArray(values) || values.length === 0) return;\n for (const v of values) if (v) params.append(key, v);\n}\n\n/** Build a relative URL to the Traces page pre-filtered by the dashboard\n * filters + per-card scope. */\nexport function buildTracesDrilldownUrl({\n preset,\n customRange,\n dashboardFilter,\n scope,\n tracesBasePath = '/observability',\n}: BuildArgs): string {\n const params = new URLSearchParams();\n params.set(TRACE_LIST_MODE_PARAM, 'branches');\n\n applyDate(\n params,\n TRACE_DATE_PRESET_PARAM,\n TRACE_DATE_FROM_PARAM,\n TRACE_DATE_TO_PARAM,\n preset,\n customRange,\n scope.window,\n );\n\n // Scope overrides dashboard filter when both are present.\n const rootEntityType = scope.rootEntityType ?? dashboardFilter.rootEntityType;\n if (rootEntityType) params.set(TRACE_ROOT_ENTITY_TYPE_PARAM, rootEntityType);\n\n if (scope.status) params.set(TRACE_STATUS_PARAM, scope.status);\n\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.entityName, scope.entityName ?? dashboardFilter.entityName);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.threadId, scope.threadId ?? dashboardFilter.threadId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.resourceId, scope.resourceId ?? dashboardFilter.resourceId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.entityId, dashboardFilter.entityId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.runId, dashboardFilter.runId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.sessionId, dashboardFilter.sessionId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.requestId, dashboardFilter.requestId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.userId, dashboardFilter.userId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.organizationId, dashboardFilter.organizationId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.experimentId, dashboardFilter.experimentId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.serviceName, dashboardFilter.serviceName);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.environment, dashboardFilter.environment);\n appendArray(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.tags, dashboardFilter.tags);\n\n const query = params.toString();\n return query ? `${tracesBasePath}?${query}` : tracesBasePath;\n}\n\n/** Build a relative URL to the Logs page pre-filtered by the dashboard filters\n * + per-card scope. Useful for \"View errors in logs\" affordances. */\nexport function buildLogsDrilldownUrl({\n preset,\n customRange,\n dashboardFilter,\n scope,\n logsBasePath = '/logs',\n}: BuildArgs): string {\n const params = new URLSearchParams();\n\n applyDate(\n params,\n LOGS_DATE_PRESET_PARAM,\n LOGS_DATE_FROM_PARAM,\n LOGS_DATE_TO_PARAM,\n preset,\n customRange,\n scope.window,\n );\n\n const rootEntityType = scope.rootEntityType ?? dashboardFilter.rootEntityType;\n if (rootEntityType) params.set(LOGS_ROOT_ENTITY_TYPE_PARAM, rootEntityType);\n\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.entityName, scope.entityName ?? dashboardFilter.entityName);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.threadId, scope.threadId ?? dashboardFilter.threadId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.resourceId, scope.resourceId ?? dashboardFilter.resourceId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.runId, dashboardFilter.runId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.sessionId, dashboardFilter.sessionId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.requestId, dashboardFilter.requestId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.userId, dashboardFilter.userId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.organizationId, dashboardFilter.organizationId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.experimentId, dashboardFilter.experimentId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.serviceName, dashboardFilter.serviceName);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.environment, dashboardFilter.environment);\n appendArray(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.tags, dashboardFilter.tags);\n\n // Error drill-ins always target log level=error. Status filter isn't valid\n // for logs, so we translate `status: 'error'` to `filterLevel=error`.\n if (scope.status === 'error') {\n params.append(LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.level, 'error');\n }\n\n const query = params.toString();\n return query ? `${logsBasePath}?${query}` : logsBasePath;\n}\n","import { useCallback } from 'react';\n\nimport { buildLogsDrilldownUrl, buildTracesDrilldownUrl, narrowWindowToBucket } from '../drilldown';\nimport type { DrilldownScope, DrilldownWindow } from '../drilldown';\nimport { useMetrics } from './use-metrics';\n\n/** Consolidates the current metrics dashboard's date + dimensional context so\n * each card only has to supply its own scope (`{ rootEntityType, entityName,\n * ... }`) to produce a full drilldown URL. */\nexport function useDrilldown() {\n const { datePreset, customRange, dimensionalFilter, tracesBasePath, logsBasePath } = useMetrics();\n\n const getTracesHref = useCallback(\n (scope: DrilldownScope = {}): string =>\n buildTracesDrilldownUrl({\n preset: datePreset,\n customRange,\n dashboardFilter: dimensionalFilter,\n scope,\n tracesBasePath,\n }),\n [datePreset, customRange, dimensionalFilter, tracesBasePath],\n );\n\n const getLogsHref = useCallback(\n (scope: DrilldownScope = {}): string =>\n buildLogsDrilldownUrl({\n preset: datePreset,\n customRange,\n dashboardFilter: dimensionalFilter,\n scope,\n logsBasePath,\n }),\n [datePreset, customRange, dimensionalFilter, logsBasePath],\n );\n\n const getBucketTracesHref = useCallback(\n (scope: Omit<DrilldownScope, 'window'>, tsMs: number, interval: '1h' | '1d'): string => {\n const window: DrilldownWindow = narrowWindowToBucket(tsMs, interval);\n return buildTracesDrilldownUrl({\n preset: datePreset,\n customRange,\n dashboardFilter: dimensionalFilter,\n scope: { ...scope, window },\n tracesBasePath,\n });\n },\n [datePreset, customRange, dimensionalFilter, tracesBasePath],\n );\n\n return { getTracesHref, getLogsHref, getBucketTracesHref };\n}\n","import type { UISpan } from '../types';\n\n/** Minimal span fields required for building the hierarchical timeline tree. */\ntype TimelineSpan = {\n spanId: string;\n name: string;\n spanType: string;\n startedAt: Date | string;\n endedAt?: Date | string | null;\n parentSpanId?: string | null;\n};\n\n/**\n * When `anchorSpanId` is provided, that span is treated as the displayed root\n * regardless of its `parentSpanId` -- the branch-subtree case from `getBranch`,\n * where the anchor has a real parent that's outside the returned set. Without\n * it, the displayed roots are the spans with no parent (the trace case).\n */\nexport const formatHierarchicalSpans = (spans: TimelineSpan[], anchorSpanId?: string): UISpan[] => {\n if (!spans || spans.length === 0) {\n return [];\n }\n\n const overallEndDate = spans.reduce(\n (latest, span) => {\n const endDate = span?.endedAt ? new Date(span.endedAt) : undefined;\n return endDate && (!latest || endDate > latest) ? endDate : latest;\n },\n null as Date | null,\n );\n\n const spanMap = new Map<string, UISpan>();\n const rootSpans: UISpan[] = [];\n\n spans.forEach(spanRecord => {\n const startDate = new Date(spanRecord.startedAt);\n const endDate = spanRecord.endedAt ? new Date(spanRecord.endedAt) : undefined;\n\n const uiSpan: UISpan = {\n id: spanRecord.spanId,\n name: spanRecord.name,\n type: spanRecord.spanType,\n latency: endDate ? endDate.getTime() - startDate.getTime() : 0,\n startTime: startDate.toISOString(),\n endTime: endDate ? endDate.toISOString() : undefined,\n spans: [],\n parentSpanId: spanRecord.parentSpanId,\n };\n\n spanMap.set(spanRecord.spanId, uiSpan);\n });\n\n const isAnchor = (spanRecord: TimelineSpan) =>\n anchorSpanId ? spanRecord.spanId === anchorSpanId : spanRecord?.parentSpanId == null;\n\n spans.forEach(spanRecord => {\n const uiSpan = spanMap.get(spanRecord.spanId)!;\n\n if (isAnchor(spanRecord)) {\n if (overallEndDate && uiSpan.endTime && overallEndDate > new Date(uiSpan.endTime)) {\n uiSpan.endTime = overallEndDate.toISOString();\n const overallEndTime = new Date(overallEndDate).getTime();\n const spanStartTime = new Date(uiSpan.startTime).getTime();\n uiSpan.latency = overallEndTime - spanStartTime;\n }\n rootSpans.push(uiSpan);\n } else {\n const parent = spanRecord.parentSpanId ? spanMap.get(spanRecord.parentSpanId) : undefined;\n if (parent) {\n parent.spans!.push(uiSpan);\n } else {\n // Orphan: either the parent isn't in the supplied set (branch subtree boundary), or\n // the span has no parent yet wasn't picked as the anchor (rare when `anchorSpanId`\n // is specified). Surface it at the displayed root rather than dropping it.\n rootSpans.push(uiSpan);\n }\n }\n });\n\n const sortSpansByStartTime = (spans: UISpan[]): UISpan[] => {\n return spans.sort((a, b) => new Date(a.startTime).getTime() - new Date(b.startTime).getTime());\n };\n\n const sortedRootSpans = sortSpansByStartTime(rootSpans);\n\n const sortNestedSpans = (spans: UISpan[]): void => {\n spans.forEach(span => {\n if (span.spans && span.spans.length > 0) {\n span.spans = sortSpansByStartTime(span.spans);\n sortNestedSpans(span.spans);\n }\n });\n };\n\n sortNestedSpans(sortedRootSpans);\n\n return sortedRootSpans;\n};\n","import { BrainIcon, GaugeIcon } from 'lucide-react';\nimport type { UISpanStyle } from '../types';\nimport { AgentIcon } from '@/ds/icons/AgentIcon';\nimport { FolderIcon } from '@/ds/icons/FolderIcon';\nimport { McpServerIcon } from '@/ds/icons/McpServerIcon';\nimport { MemoryIcon } from '@/ds/icons/MemoryIcon';\nimport { ToolsIcon } from '@/ds/icons/ToolsIcon';\nimport { WorkflowIcon } from '@/ds/icons/WorkflowIcon';\n\nexport const spanTypePrefixes = ['agent', 'workflow', 'model', 'mcp', 'tool', 'memory', 'workspace', 'scorer', 'other'];\n\nconst spanTypeToUiElements: Record<string, UISpanStyle> = {\n agent: {\n icon: <AgentIcon />,\n color: 'oklch(0.75 0.15 250)',\n label: 'Agent',\n typePrefix: 'agent',\n },\n workflow: {\n icon: <WorkflowIcon />,\n color: 'oklch(0.75 0.15 200)',\n label: 'Workflow',\n typePrefix: 'workflow',\n },\n model: {\n icon: <BrainIcon />,\n color: 'oklch(0.75 0.15 320)',\n label: 'Model',\n typePrefix: 'model',\n },\n mcp: {\n icon: <McpServerIcon />,\n color: 'oklch(0.75 0.15 160)',\n label: 'MCP',\n typePrefix: 'mcp',\n },\n tool: {\n icon: <ToolsIcon />,\n color: 'oklch(0.75 0.15 100)',\n label: 'Tool',\n typePrefix: 'tool',\n },\n memory: {\n icon: <MemoryIcon />,\n color: 'oklch(0.75 0.15 60)',\n label: 'Memory',\n typePrefix: 'memory',\n },\n workspace: {\n icon: <FolderIcon />,\n color: 'oklch(0.75 0.15 40)',\n label: 'Workspace',\n typePrefix: 'workspace',\n },\n scorer: {\n icon: <GaugeIcon />,\n color: 'oklch(0.75 0.15 280)',\n label: 'Scorer',\n typePrefix: 'scorer',\n },\n};\n\nconst otherSpanType: UISpanStyle = {\n color: 'oklch(0.65 0 0)',\n label: 'Other',\n typePrefix: 'other',\n};\n\nexport function getSpanTypeUi(type: string) {\n const typePrefix = type?.toLowerCase().split('_')[0];\n return spanTypeToUiElements[typePrefix] ?? otherSpanType;\n}\n","import type { InputTokenDetails, OutputTokenDetails, UsageStats } from '@mastra/core/observability';\n\ntype TokenDetailsObject = InputTokenDetails | OutputTokenDetails;\n\nexport type TokenUsageView = {\n inputValue: number;\n outputValue: number;\n total: number;\n showSplit: boolean;\n inputPct: number;\n outputPct: number;\n inputDetails: TokenDetailsObject | undefined;\n outputDetails: TokenDetailsObject | undefined;\n};\n\nfunction hasNumericDetails(details: TokenDetailsObject | undefined): details is TokenDetailsObject {\n return !!details && Object.values(details).some(v => typeof v === 'number');\n}\n\nexport function getTokenUsageView(usage: UsageStats | undefined | null): TokenUsageView | null {\n if (!usage) return null;\n\n const hasInput = typeof usage.inputTokens === 'number';\n const hasOutput = typeof usage.outputTokens === 'number';\n\n if (!hasInput && !hasOutput) return null;\n\n const inputValue = usage.inputTokens ?? 0;\n const outputValue = usage.outputTokens ?? 0;\n const total = inputValue + outputValue;\n const showSplit = total > 0;\n\n return {\n inputValue,\n outputValue,\n total,\n showSplit,\n inputPct: showSplit ? (inputValue / total) * 100 : 0,\n outputPct: showSplit ? (outputValue / total) * 100 : 0,\n inputDetails: hasInput && hasNumericDetails(usage.inputDetails) ? usage.inputDetails : undefined,\n outputDetails: hasOutput && hasNumericDetails(usage.outputDetails) ? usage.outputDetails : undefined,\n };\n}\n","import type { InputTokenDetails, OutputTokenDetails, UsageStats } from '@mastra/core/observability';\nimport { Fragment } from 'react';\nimport { getTokenUsageView } from './span-token-usage.utils';\nimport { DataKeysAndValues } from '@/ds/components/DataKeysAndValues';\nimport { cn } from '@/lib/utils';\n\nexport type TokenUsage = UsageStats;\n\ntype TokenDetailsObject = InputTokenDetails | OutputTokenDetails;\n\nconst detailKeyLabels: Record<string, string> = {\n text: 'Text',\n cacheRead: 'Cache read',\n cacheWrite: 'Cache write',\n audio: 'Audio',\n image: 'Image',\n reasoning: 'Reasoning',\n};\n\ntype SpanTokenUsageProps = {\n usage: UsageStats;\n className?: string;\n};\n\nconst INPUT_COLOR = 'oklch(0.78 0.16 320)';\nconst OUTPUT_COLOR = 'oklch(0.55 0.18 320)';\n\nexport function SpanTokenUsage({ usage, className }: SpanTokenUsageProps) {\n const view = getTokenUsageView(usage);\n if (!view) return null;\n\n const { inputValue, outputValue, total, showSplit, inputPct, outputPct, inputDetails, outputDetails } = view;\n\n return (\n <div\n className={cn('border-b border-border1 mt-2 mb-8 pb-3 grid grid-cols-1 4xl:grid-cols-2 4xl:gap-12', className)}\n >\n {showSplit && (\n <div className=\"mb-2\">\n <div className=\"flex items-baseline text-neutral2 gap-3\">\n <span className=\"text-ui-md\">Tokens Used</span>\n <span className=\"text-neutral4 text-ui-md font-semibold\">{total.toLocaleString()}</span>\n <span className=\"ml-auto text-ui-sm\">\n {Math.round(inputPct)}% Input vs {Math.round(outputPct)}% Output\n </span>\n </div>\n <div className=\"p-1.5 rounded-md bg-surface4 mt-2\">\n <div className=\"relative w-full h-1.5 rounded-sm overflow-hidden\">\n <div\n className=\"absolute h-1.5 top-0 left-0\"\n style={{ width: `${inputPct}%`, backgroundColor: INPUT_COLOR }}\n />\n <div\n className=\"absolute h-1.5 top-0\"\n style={{ left: `${inputPct}%`, width: `${outputPct}%`, backgroundColor: OUTPUT_COLOR }}\n />\n </div>\n </div>\n </div>\n )}\n\n <div className=\"grid gap-6 grid-cols-2\">\n <UsageColumn label=\"Input\" color={INPUT_COLOR} value={inputValue} details={inputDetails} />\n <UsageColumn label=\"Output\" color={OUTPUT_COLOR} value={outputValue} details={outputDetails} />\n </div>\n </div>\n );\n}\n\nfunction UsageColumn({\n label,\n color,\n value,\n details,\n}: {\n label: string;\n color: string;\n value?: number;\n details?: TokenDetailsObject;\n}) {\n return (\n <div>\n <div className=\"flex items-baseline text-neutral2 gap-3 mb-2\">\n <span className=\"text-ui-md\">{label}</span>\n {typeof value === 'number' && (\n <span className=\"flex items-baseline gap-1.5\">\n <span className=\"text-neutral4 text-ui-md font-semibold\">{value.toLocaleString()}</span>\n <span className=\"size-2 rounded-full self-center\" style={{ backgroundColor: color }} />\n </span>\n )}\n </div>\n {details && <DetailsList details={details} />}\n </div>\n );\n}\n\nfunction DetailsList({ details }: { details: TokenDetailsObject }) {\n return (\n <DataKeysAndValues density=\"dense\">\n {Object.entries(details).map(([detailKey, detailValue]) => {\n if (typeof detailValue !== 'number') return null;\n return (\n <Fragment key={detailKey}>\n <DataKeysAndValues.Key>{detailKeyLabels[detailKey] || detailKey}</DataKeysAndValues.Key>\n <DataKeysAndValues.Value className=\"text-right\">{detailValue.toLocaleString()}</DataKeysAndValues.Value>\n </Fragment>\n );\n })}\n </DataKeysAndValues>\n );\n}\n","import {\n ChevronDownIcon,\n ChevronsDownIcon,\n ChevronsDownUpIcon,\n ChevronsUpDownIcon,\n ChevronsUpIcon,\n ChevronUpIcon,\n FoldVerticalIcon,\n UnfoldVerticalIcon,\n} from 'lucide-react';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/ds/components/Tooltip';\nimport { cn } from '@/lib/utils';\n\ntype TimelineExpandColProps = {\n isSelected?: boolean;\n isFaded?: boolean;\n isExpanded?: boolean;\n isRootSpan?: boolean;\n toggleChildren?: () => void;\n expandAllDescendants?: () => void;\n collapseAllDescendants?: () => void;\n collapseAll?: () => void;\n totalDescendants?: number;\n allDescendantsExpanded?: boolean;\n numOfChildren?: number;\n toggleSiblings?: () => void;\n siblingsAllExpanded?: boolean;\n siblingsWithChildrenCount?: number;\n};\n\nexport function TimelineExpandCol({\n isSelected,\n isFaded,\n isExpanded,\n isRootSpan,\n toggleChildren,\n expandAllDescendants,\n collapseAllDescendants,\n collapseAll,\n totalDescendants = 0,\n allDescendantsExpanded,\n numOfChildren = 0,\n toggleSiblings,\n siblingsAllExpanded,\n siblingsWithChildrenCount = 0,\n}: TimelineExpandColProps) {\n const toggleTooltip = isExpanded ? `Collapse children (${numOfChildren})` : `Expand children (${numOfChildren})`;\n\n const showToggleChildren = !isRootSpan && !!numOfChildren && numOfChildren > 0;\n const showDescendantsButton = !isRootSpan && showToggleChildren && totalDescendants > numOfChildren;\n const showToggleSiblings = !isRootSpan && siblingsWithChildrenCount >= 2;\n const showRootToggleAll = !!isRootSpan && !!numOfChildren && numOfChildren > 0;\n const fullyExpanded = !!isExpanded && !!allDescendantsExpanded;\n\n return (\n <div\n className={cn('flex items-center justify-end h-full px-1.5', {\n 'opacity-30 [&:hover]:opacity-60': isFaded,\n 'bg-surface4': isSelected,\n })}\n >\n <div className=\"grid grid-cols-[1.625rem_1.625rem_1.625rem] gap-1\">\n <div>\n {showToggleChildren && (\n <ExpandButton onClick={() => toggleChildren?.()} tooltip={toggleTooltip}>\n {isExpanded ? <ChevronUpIcon /> : <ChevronDownIcon />}\n </ExpandButton>\n )}\n </div>\n\n <div>\n {showDescendantsButton && (\n <ExpandButton\n onClick={() => (allDescendantsExpanded ? collapseAllDescendants?.() : expandAllDescendants?.())}\n tooltip={\n allDescendantsExpanded\n ? `Collapse all descendants (${totalDescendants})`\n : `Expand all descendants (${totalDescendants})`\n }\n >\n {allDescendantsExpanded ? <ChevronsUpIcon /> : <ChevronsDownIcon />}\n </ExpandButton>\n )}\n </div>\n\n <div>\n {showToggleSiblings && (\n <ExpandButton\n onClick={() => toggleSiblings?.()}\n tooltip={siblingsAllExpanded ? 'Collapse at this level' : 'Expand at this level'}\n >\n {siblingsAllExpanded ? <FoldVerticalIcon /> : <UnfoldVerticalIcon />}\n </ExpandButton>\n )}\n\n {showRootToggleAll && (\n <ExpandButton\n onClick={() => (fullyExpanded ? collapseAll?.() : expandAllDescendants?.())}\n tooltip={fullyExpanded ? 'Collapse all' : 'Expand all'}\n >\n {fullyExpanded ? <ChevronsDownUpIcon /> : <ChevronsUpDownIcon />}\n </ExpandButton>\n )}\n </div>\n </div>\n </div>\n );\n}\n\ntype ExpandButtonProps = {\n onClick?: () => void;\n children?: React.ReactNode;\n className?: string;\n tooltip?: string;\n};\n\nfunction ExpandButton({ onClick, children, className, tooltip }: ExpandButtonProps) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button onClick={onClick} className={cn('h-full shrink-0 cursor-pointer', className)} aria-label={tooltip}>\n <div\n className={cn(\n 'flex items-center gap-[0.1rem] rounded-md transition-all p-1',\n 'hover:bg-surface5',\n '[&>svg]:shrink-0 [&>svg]:opacity-50 [&:hover>svg]:opacity-100 [&>svg]:w-4 [&>svg]:h-4 [&>svg]:transition-all',\n )}\n >\n {children}\n </div>\n </button>\n </TooltipTrigger>\n {tooltip && <TooltipContent>{tooltip}</TooltipContent>}\n </Tooltip>\n );\n}\n","import { cn } from '@/lib/utils';\n\ntype TimelineStructureSignProps = {\n isLastChild?: boolean;\n};\n\nexport function TimelineStructureSign({ isLastChild }: TimelineStructureSignProps) {\n return (\n <div\n className={cn(\n 'w-[0.5rem] h-[1.8rem] relative opacity-100 shrink-0',\n 'after:content-[\"\"] after:absolute after:left-[-1px] after:top-0 after:bottom-0 after:w-[0px] after:border-l-[1px] after:border-neutral3 after:border-dashed ',\n 'before:content-[\"\"] before:absolute before:left-0 before:top-[50%] before:w-full before:h-[0px] before:border-b-[1px] before:border-neutral3 before:border-dashed',\n {\n 'after:bottom-[50%]': isLastChild,\n },\n )}\n />\n );\n}\n","import type { UISpan, UISpanStyle } from '../types';\nimport { TimelineStructureSign } from './timeline-structure-sign';\nimport { cn } from '@/lib/utils';\n\ntype TimelineNameColProps = {\n span: UISpan;\n spanUI?: UISpanStyle | null;\n isFaded?: boolean;\n depth?: number;\n onSpanClick?: (id: string) => void;\n selectedSpanId?: string;\n isLastChild?: boolean;\n hasChildren?: boolean;\n isRootSpan?: boolean;\n isExpanded?: boolean;\n};\n\nexport function TimelineNameCol({\n span,\n spanUI,\n isFaded,\n depth = 0,\n onSpanClick,\n selectedSpanId,\n isLastChild,\n hasChildren: _hasChildren,\n isRootSpan,\n isExpanded: _isExpanded,\n}: TimelineNameColProps) {\n return (\n <div\n data-span-id={span.id}\n aria-label={`View details for span ${span.name}`}\n className={cn('rounded-md flex opacity-80 min-h-8 items-center rounded-l-lg', {\n 'opacity-30 [&:hover]:opacity-60': isFaded,\n 'bg-surface4': selectedSpanId === span.id,\n })}\n style={{ paddingLeft: `${depth * 1}rem` }}\n >\n {!isRootSpan && <TimelineStructureSign isLastChild={isLastChild} />}\n\n <button\n onClick={() => onSpanClick?.(span.id)}\n className={cn(\n 'text-ui-smd flex items-center text-left gap-1.5 text-neutral6 w-full min-w-0 rounded-md h-full px-2 py-1 transition-colors',\n '[&>svg]:transition-all [&>svg]:shrink-0 [&>svg]:opacity-0 [&>svg]:w-[1em] [&>svg]:h-[1em] [&>svg]:ml-auto',\n 'hover:bg-surface4 [&:hover>svg]:opacity-60',\n 'focus:outline-none focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-accent1',\n )}\n >\n {spanUI?.color && (\n <span\n aria-hidden\n title={spanUI.label}\n className=\"inline-block w-2 h-2 shrink-0 rounded-full\"\n style={{ backgroundColor: spanUI.color }}\n />\n )}\n <span className=\"min-w-0 truncate\">{span.name}</span>\n </button>\n </div>\n );\n}\n","import { format } from 'date-fns/format';\nimport type { UISpan } from '../types';\nimport { DataKeysAndValues } from '@/ds/components/DataKeysAndValues';\nimport { HoverCard, HoverCardContent, HoverCardTrigger } from '@/ds/components/HoverCard';\nimport { cn } from '@/lib/utils';\n\ntype TimelineTimingColProps = {\n span: UISpan;\n selectedSpanId?: string;\n isFaded?: boolean;\n overallLatency?: number;\n overallStartTime?: string;\n color?: string;\n chartWidth?: 'wide' | 'default';\n};\n\nexport function TimelineTimingCol({\n span,\n selectedSpanId,\n isFaded,\n overallLatency,\n overallStartTime,\n color,\n chartWidth = 'default',\n}: TimelineTimingColProps) {\n const percentageSpanLatency = overallLatency ? Math.ceil((span.latency / overallLatency) * 100) : 0;\n const overallStartTimeDate = overallStartTime ? new Date(overallStartTime) : null;\n const spanStartTimeDate = span.startTime ? new Date(span.startTime) : null;\n const spanStartTimeShift =\n spanStartTimeDate && overallStartTimeDate ? spanStartTimeDate.getTime() - overallStartTimeDate.getTime() : 0;\n\n const percentageSpanStartTime = overallLatency && Math.floor((spanStartTimeShift / overallLatency) * 100);\n\n return (\n <HoverCard>\n <HoverCardTrigger\n className={cn(\n 'h-8 p-1 grid grid-cols-[1fr_auto] gap-2 items-center cursor-help pr-2 rounded-r-md',\n chartWidth === 'wide' ? 'min-w-72' : 'min-w-32',\n '[&:hover>div]:bg-surface5',\n {\n 'opacity-30 [&:hover]:opacity-60': isFaded,\n 'bg-surface4': selectedSpanId === span.id,\n },\n )}\n >\n <div className={cn('w-full p-1.5 rounded-md bg-surface4 transition-colors duration-1000')}>\n <div className=\"relative w-full h-1.5 rounded-sm overflow-hidden\">\n <div\n className={cn('bg-neutral1 absolute rounded-sm h-1.5 top-0')}\n style={{\n width: percentageSpanLatency ? `${percentageSpanLatency}%` : '2px',\n left: `${percentageSpanStartTime || 0}%`,\n backgroundColor: color,\n }}\n ></div>\n </div>\n </div>\n\n <div className={cn('flex justify-end text-neutral3 text-ui-xs')}>{(span.latency / 1000).toFixed(3)}&nbsp;s</div>\n </HoverCardTrigger>\n <HoverCardContent className=\"bg-surface4 pr-6\">\n <div className={cn('text-ui-sm flex items-center gap-2 mb-2 mt-1')}>Span Timing</div>\n <DataKeysAndValues>\n <DataKeysAndValues.Key>Latency</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{span.latency} ms</DataKeysAndValues.Value>\n <DataKeysAndValues.Key>Started at</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>\n {span.startTime ? format(new Date(span.startTime), 'hh:mm:ss:SSS a') : '-'}\n </DataKeysAndValues.Value>\n <DataKeysAndValues.Key>Ended at</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>\n {span.endTime ? format(new Date(span.endTime), 'hh:mm:ss:SSS a') : '-'}\n </DataKeysAndValues.Value>\n <DataKeysAndValues.Key>Start Shift</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{spanStartTimeShift}ms</DataKeysAndValues.Value>\n </DataKeysAndValues>\n </HoverCardContent>\n </HoverCard>\n );\n}\n","import { format } from 'date-fns';\nimport { DataKeysAndValues } from '@/ds/components/DataKeysAndValues';\n\nenum TraceStatus {\n SUCCESS = 'success',\n ERROR = 'error',\n RUNNING = 'running',\n}\n\nfunction computeTraceStatus(span: { error?: unknown; endedAt?: Date | string | null }): TraceStatus {\n if (span.error != null) return TraceStatus.ERROR;\n if (span.endedAt == null) return TraceStatus.RUNNING;\n return TraceStatus.SUCCESS;\n}\n\n/** Lightweight root-span fields available from `useTraceLightSpans`. */\ntype RootSpanSummary = {\n entityId?: string | null;\n entityName?: string | null;\n entityType?: string | null;\n startedAt: Date | string;\n endedAt?: Date | string | null;\n error?: unknown;\n};\n\nexport interface TraceKeysAndValuesProps {\n rootSpan: RootSpanSummary;\n numOfCol?: 1 | 2 | 3;\n className?: string;\n}\n\nexport function TraceKeysAndValues({ rootSpan, numOfCol = 2, className }: TraceKeysAndValuesProps) {\n const startedAt = rootSpan.startedAt ? new Date(rootSpan.startedAt) : null;\n const endedAt = rootSpan.endedAt ? new Date(rootSpan.endedAt) : null;\n const status = computeTraceStatus(rootSpan);\n const statusLabel = status === TraceStatus.ERROR ? 'ERROR' : status === TraceStatus.RUNNING ? 'RUNNING' : 'SUCCESS';\n\n return (\n <DataKeysAndValues numOfCol={numOfCol} className={className}>\n {rootSpan.entityId && (\n <>\n <DataKeysAndValues.Key>Entity Id</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{rootSpan.entityName || rootSpan.entityId}</DataKeysAndValues.Value>\n </>\n )}\n {rootSpan.entityType && (\n <>\n <DataKeysAndValues.Key>Entity Type</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{rootSpan.entityType}</DataKeysAndValues.Value>\n </>\n )}\n <DataKeysAndValues.Key>Status</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{statusLabel}</DataKeysAndValues.Value>\n {startedAt && endedAt && (\n <>\n <DataKeysAndValues.Key>Duration</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>\n {`${(endedAt.getTime() - startedAt.getTime()).toLocaleString()}ms`}\n </DataKeysAndValues.Value>\n </>\n )}\n {startedAt && (\n <>\n <DataKeysAndValues.Key>Started at</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{format(startedAt, 'MMM dd, h:mm:ss.SSS aaa')}</DataKeysAndValues.Value>\n </>\n )}\n {endedAt && (\n <>\n <DataKeysAndValues.Key>Ended at</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{format(endedAt, 'MMM dd, h:mm:ss.SSS aaa')}</DataKeysAndValues.Value>\n </>\n )}\n </DataKeysAndValues>\n );\n}\n","import type { UISpan } from '../types';\n\nexport function getSpanDescendantIds(span: UISpan): string[] {\n if (!span.spans || span.spans.length === 0) {\n return [];\n }\n\n const descendantIds: string[] = [];\n\n span.spans.forEach(childSpan => {\n descendantIds.push(childSpan.id);\n descendantIds.push(...getSpanDescendantIds(childSpan));\n });\n\n return descendantIds;\n}\n\nexport function getAllSpanIds(spans: UISpan[]): string[] {\n const ids: string[] = [];\n for (const span of spans) {\n ids.push(span.id);\n ids.push(...getSpanDescendantIds(span));\n }\n return ids;\n}\n","import { useEffect } from 'react';\nimport { getSpanDescendantIds } from '../hooks/get-all-span-ids';\nimport type { UISpan } from '../types';\nimport { getSpanTypeUi } from './shared';\nimport { TimelineExpandCol } from './timeline-expand-col';\nimport { TimelineNameCol } from './timeline-name-col';\nimport { TimelineTimingCol } from './timeline-timing-col';\n\ntype TraceTimelineSpanProps = {\n span: UISpan;\n siblings?: UISpan[];\n depth?: number;\n onSpanClick?: (id: string) => void;\n selectedSpanId?: string;\n isLastChild?: boolean;\n overallLatency?: number;\n overallStartTime?: string;\n fadedTypes?: string[];\n searchPhrase?: string;\n featuredSpanIds?: string[];\n expandedSpanIds?: string[];\n setExpandedSpanIds?: React.Dispatch<React.SetStateAction<string[]>>;\n chartWidth?: 'wide' | 'default';\n};\n\nexport function TraceTimelineSpan({\n span,\n siblings,\n depth = 0,\n onSpanClick,\n selectedSpanId,\n isLastChild,\n overallLatency,\n overallStartTime,\n fadedTypes,\n searchPhrase,\n featuredSpanIds,\n expandedSpanIds,\n setExpandedSpanIds,\n chartWidth,\n}: TraceTimelineSpanProps) {\n const hasChildren = span.spans && span.spans.length > 0;\n const numOfChildren = span.spans ? span.spans.length : 0;\n const allDescendantIds = getSpanDescendantIds(span);\n const totalDescendants = allDescendantIds.length;\n const isRootSpan = depth === 0;\n const spanUI = getSpanTypeUi(span?.type);\n const isExpanded = expandedSpanIds ? expandedSpanIds.includes(span.id) : false;\n const isFadedBySearch = featuredSpanIds && featuredSpanIds.length > 0 ? !featuredSpanIds.includes(span.id) : false;\n const isFadedByType = fadedTypes && fadedTypes.length > 0 ? fadedTypes.includes(spanUI?.typePrefix || '') : false;\n const isFaded = isFadedByType || isFadedBySearch;\n\n useEffect(() => {\n if (!featuredSpanIds || allDescendantIds.length === 0) return;\n if (isExpanded) return;\n const hasFeaturedDescendant = allDescendantIds.some(id => featuredSpanIds.includes(id));\n if (hasFeaturedDescendant && setExpandedSpanIds) {\n setExpandedSpanIds(prev => (!prev || prev.includes(span.id) ? (prev ?? [span.id]) : [...prev, span.id]));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [featuredSpanIds, allDescendantIds]);\n\n const toggleChildren = () => {\n if (!setExpandedSpanIds) return;\n setExpandedSpanIds(prev => {\n if (!prev) return prev;\n return isExpanded ? prev.filter(id => id !== span.id) : [...prev, span.id];\n });\n };\n\n const expandAllDescendants = () => {\n if (!setExpandedSpanIds) return;\n setExpandedSpanIds(prev => {\n if (!prev) return prev;\n return Array.from(new Set([...prev, span.id, ...allDescendantIds]));\n });\n };\n\n const collapseAllDescendants = () => {\n if (!setExpandedSpanIds) return;\n setExpandedSpanIds(prev => {\n if (!prev) return prev;\n const idsToRemove = new Set(allDescendantIds);\n return prev.filter(id => !idsToRemove.has(id));\n });\n };\n\n const collapseAll = () => {\n if (!setExpandedSpanIds) return;\n setExpandedSpanIds(prev => {\n if (!prev) return prev;\n const idsToRemove = new Set([span.id, ...allDescendantIds]);\n return prev.filter(id => !idsToRemove.has(id));\n });\n };\n\n const allDescendantsExpanded = allDescendantIds.every(id => expandedSpanIds?.includes(id));\n\n const siblingsWithChildren = (siblings ?? []).filter(s => s.spans && s.spans.length > 0);\n const siblingsWithChildrenCount = siblingsWithChildren.length;\n const siblingsAllExpanded =\n siblingsWithChildrenCount > 0 && siblingsWithChildren.every(s => expandedSpanIds?.includes(s.id));\n\n const toggleSiblings = () => {\n if (!setExpandedSpanIds || siblingsWithChildrenCount === 0) return;\n setExpandedSpanIds(prev => {\n if (!prev) return prev;\n if (siblingsAllExpanded) {\n const idsToRemove = new Set<string>();\n siblingsWithChildren.forEach(s => {\n idsToRemove.add(s.id);\n getSpanDescendantIds(s).forEach(id => idsToRemove.add(id));\n });\n return prev.filter(id => !idsToRemove.has(id));\n }\n return Array.from(new Set([...prev, ...siblingsWithChildren.map(s => s.id)]));\n });\n };\n\n return (\n <>\n <TimelineNameCol\n span={span}\n spanUI={spanUI}\n isFaded={isFaded}\n depth={depth}\n onSpanClick={onSpanClick}\n selectedSpanId={selectedSpanId}\n isLastChild={isLastChild}\n hasChildren={hasChildren}\n isRootSpan={isRootSpan}\n isExpanded={isExpanded}\n />\n\n <TimelineExpandCol\n isSelected={selectedSpanId === span.id}\n isFaded={isFaded}\n isExpanded={isExpanded}\n isRootSpan={isRootSpan}\n toggleChildren={toggleChildren}\n expandAllDescendants={expandAllDescendants}\n collapseAllDescendants={collapseAllDescendants}\n collapseAll={collapseAll}\n totalDescendants={totalDescendants}\n allDescendantsExpanded={allDescendantsExpanded}\n numOfChildren={numOfChildren}\n toggleSiblings={toggleSiblings}\n siblingsAllExpanded={siblingsAllExpanded}\n siblingsWithChildrenCount={siblingsWithChildrenCount}\n />\n\n <TimelineTimingCol\n span={span}\n selectedSpanId={selectedSpanId}\n isFaded={isFaded}\n overallLatency={overallLatency}\n overallStartTime={overallStartTime}\n color={spanUI?.color}\n chartWidth={chartWidth}\n />\n\n {hasChildren &&\n isExpanded &&\n span.spans?.map((childSpan: UISpan, idx: number, array: UISpan[]) => {\n const isLast = idx === array.length - 1;\n\n return (\n <TraceTimelineSpan\n key={childSpan.id}\n span={childSpan}\n siblings={array}\n depth={depth + 1}\n onSpanClick={onSpanClick}\n selectedSpanId={selectedSpanId}\n isLastChild={isLast}\n overallLatency={overallLatency}\n overallStartTime={overallStartTime}\n fadedTypes={fadedTypes}\n searchPhrase={searchPhrase}\n expandedSpanIds={expandedSpanIds}\n setExpandedSpanIds={setExpandedSpanIds}\n featuredSpanIds={featuredSpanIds}\n chartWidth={chartWidth}\n />\n );\n })}\n </>\n );\n}\n","import type { Dispatch, SetStateAction } from 'react';\nimport { useMemo } from 'react';\nimport type { UISpan } from '../types';\nimport { spanTypePrefixes, getSpanTypeUi } from './shared';\nimport { TraceTimelineSpan } from './trace-timeline-span';\nimport { Spinner } from '@/ds/components/Spinner';\nimport { cn } from '@/lib/utils';\n\ntype TraceTimelineProps = {\n hierarchicalSpans: UISpan[];\n onSpanClick: (id: string) => void;\n selectedSpanId?: string;\n isLoading?: boolean;\n fadedTypes?: string[];\n expandedSpanIds?: string[];\n setExpandedSpanIds?: Dispatch<SetStateAction<string[]>>;\n featuredSpanIds?: string[];\n chartWidth?: 'wide' | 'default';\n};\n\nexport function TraceTimeline({\n hierarchicalSpans = [],\n onSpanClick,\n selectedSpanId,\n isLoading,\n fadedTypes,\n expandedSpanIds,\n setExpandedSpanIds,\n featuredSpanIds,\n chartWidth = 'default',\n}: TraceTimelineProps) {\n const overallLatency = hierarchicalSpans?.[0]?.latency || 0;\n const overallStartTime = hierarchicalSpans?.[0]?.startTime || '';\n\n const usedSpanTypes = useMemo(() => {\n const collectTypes = (spans: UISpan[]): Set<string> => {\n const types = new Set<string>();\n for (const span of spans) {\n const prefix = span.type?.toLowerCase().split('_')[0];\n if (prefix) types.add(prefix);\n if (span.spans) {\n for (const t of collectTypes(span.spans)) types.add(t);\n }\n }\n return types;\n };\n const types = collectTypes(hierarchicalSpans);\n const hasOther = [...types].some(t => !spanTypePrefixes.includes(t));\n const known = spanTypePrefixes.filter(p => p !== 'other' && types.has(p));\n if (hasOther) known.push('other');\n return known;\n }, [hierarchicalSpans]);\n\n return (\n <>\n {isLoading ? (\n <div\n className={cn(\n 'flex items-center text-ui-sm gap-3 bg-surface3/50 rounded-md p-3 justify-center text-neutral3',\n '[&_svg]:w-[1.25em] [&_svg]:h-[1.25em] [&_svg]:opacity-50',\n )}\n >\n <Spinner /> Loading Trace Timeline ...\n </div>\n ) : (\n <>\n {usedSpanTypes.length > 0 && (\n <div className=\"flex flex-wrap gap-3 px-2 py-1.5 justify-end\">\n {usedSpanTypes.map(type => {\n const spanUI = getSpanTypeUi(type);\n return (\n <div key={type} className=\"flex items-center gap-1 text-ui-sm text-neutral3\">\n <span\n className=\"inline-block w-1.5 h-1.5 rounded-full shrink-0\"\n style={{ backgroundColor: spanUI?.color }}\n />\n {spanUI?.label || type}\n </div>\n );\n })}\n </div>\n )}\n <div className=\"grid grid-cols-[minmax(0,1fr)_auto_auto] items-start content-start gap-y-px overflow-hidden py-1\">\n {hierarchicalSpans?.map(span => (\n <TraceTimelineSpan\n key={span.id}\n span={span}\n siblings={hierarchicalSpans}\n onSpanClick={onSpanClick}\n selectedSpanId={selectedSpanId}\n overallLatency={overallLatency}\n overallStartTime={overallStartTime}\n fadedTypes={fadedTypes}\n featuredSpanIds={featuredSpanIds}\n expandedSpanIds={expandedSpanIds}\n setExpandedSpanIds={setExpandedSpanIds}\n chartWidth={chartWidth}\n />\n ))}\n </div>\n </>\n )}\n </>\n );\n}\n","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 onSave?: () => void;\n /** When provided, an extra \"Remove saved filters\" option is shown —\n * wire it up only when there is actually a saved set to remove. */\n onRemoveSaved?: () => 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 onSave,\n onRemoveSaved,\n isLoading,\n filterFields,\n filterTokens,\n onFilterTokensChange,\n autoFocusFilterFieldId,\n lockedFieldIds,\n lockedTooltipContent,\n}: TracesToolbarProps) {\n const hasActiveFilters = filterTokens.length > 0;\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 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] gap-3 items-start ')}>\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 onSave={onSave}\n onRemoveSaved={onRemoveSaved}\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","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 // getTrace returns the full payload (heavy input/output), unlike the light spans the panel renders.\n const task = client\n .getTrace(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","import type { LightSpanRecord } from '@mastra/core/storage';\nimport {\n CircleGaugeIcon,\n ChevronsDownUpIcon,\n ChevronsUpDownIcon,\n DownloadIcon,\n Link2Icon,\n Loader2Icon,\n SaveIcon,\n WrenchIcon,\n} from 'lucide-react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { getAllSpanIds } from '../hooks/get-all-span-ids';\nimport { useDownloadTraceJson } from '../hooks/use-download-trace-json';\nimport { formatHierarchicalSpans } from './format-hierarchical-spans';\nimport { TraceKeysAndValues } from './trace-keys-and-values';\nimport { TraceTimeline } from './trace-timeline';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport { Notice } from '@/ds/components/Notice';\nimport { Icon } from '@/ds/icons/Icon';\nimport type { LinkComponent } from '@/ds/types/link-component';\nimport { truncateString } from '@/lib/truncate-string';\n\nexport type TraceDataPanelPlacement = 'traces-list' | 'trace-page';\n\nexport interface TraceDataPanelViewProps {\n traceId: string;\n /** Lightweight spans for the trace. Caller fetches via useTraceLightSpans. */\n spans: LightSpanRecord[] | undefined;\n isLoading?: boolean;\n onClose: () => void;\n onSpanSelect?: (spanId: string | undefined) => void;\n onEvaluateTrace?: () => void;\n /** When set, a \"Save as Dataset Item\" button appears; the consumer owns the dialog. */\n onSaveAsDatasetItem?: (args: { traceId: string; rootSpanId: string | undefined }) => void;\n /** When set, an \"Add tool mocks to item\" button appears; the consumer owns the dialog. */\n onAddTraceMocksToItem?: (args: { traceId: string }) => void;\n initialSpanId?: string | null;\n onPrevious?: () => void;\n onNext?: () => void;\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n placement: TraceDataPanelPlacement;\n timelineChartWidth?: 'wide' | 'default';\n /** When both are provided, renders an \"Open trace page\" button. */\n LinkComponent?: LinkComponent;\n traceHref?: string;\n /**\n * Span treated as the displayed root of the timeline. Required for branch\n * subtrees from `getBranch` where the anchor has a real parent that's outside\n * `spans`. When omitted, the span with no parent is used (trace case).\n */\n anchorSpanId?: string;\n /**\n * Whether to render the \"Evaluating traces and saving them as dataset items is\n * available in Mastra Studio\" info notice when neither `onEvaluateTrace` nor\n * `onSaveAsDatasetItem` is provided. Defaults to `true`. Pass `false` when this\n * panel is rendered inside Studio in a context that intentionally omits those\n * handlers (e.g. inline below an experiment result).\n */\n showUnavailableFeaturesMsg?: boolean;\n}\n\nexport function TraceDataPanelView({\n traceId,\n spans,\n isLoading,\n onClose,\n onSpanSelect,\n onEvaluateTrace,\n onSaveAsDatasetItem,\n onAddTraceMocksToItem,\n initialSpanId,\n onPrevious,\n onNext,\n collapsed: controlledCollapsed,\n onCollapsedChange,\n placement,\n timelineChartWidth = 'default',\n LinkComponent,\n traceHref,\n anchorSpanId,\n showUnavailableFeaturesMsg = true,\n}: TraceDataPanelViewProps) {\n const isOnTracePage = placement === 'trace-page';\n const [internalCollapsed, setInternalCollapsed] = useState(false);\n const collapsed = controlledCollapsed ?? internalCollapsed;\n const setCollapsed = onCollapsedChange ?? setInternalCollapsed;\n\n const { download: downloadTraceJson, isPending: isDownloadingTrace } = useDownloadTraceJson();\n\n const contentRef = useRef<HTMLDivElement>(null);\n const [selectedSpanId, setSelectedSpanId] = useState<string | undefined>(initialSpanId ?? undefined);\n\n // Sync selected span when initialSpanId or trace data changes\n useEffect(() => {\n // No span requested: clear immediately.\n if (!initialSpanId) {\n setSelectedSpanId(undefined);\n onSpanSelect?.(undefined);\n return;\n }\n // Span requested: wait for trace data before deciding so an in-flight\n // fetch doesn't wipe a URL-provided selection.\n if (!spans) return;\n\n const found = spans.find(s => s.spanId === initialSpanId);\n if (found) {\n setSelectedSpanId(initialSpanId);\n onSpanSelect?.(initialSpanId);\n } else {\n setSelectedSpanId(undefined);\n onSpanSelect?.(undefined);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialSpanId, spans]);\n\n // Scroll the selected span into view within the timeline\n useEffect(() => {\n if (!selectedSpanId || !contentRef.current) return;\n const el = contentRef.current.querySelector(`[data-span-id=\"${selectedSpanId}\"]`);\n el?.scrollIntoView({ block: 'nearest' });\n }, [selectedSpanId]);\n\n const hierarchicalSpans = useMemo(() => formatHierarchicalSpans(spans ?? [], anchorSpanId), [spans, anchorSpanId]);\n\n const [expandedSpanIds, setExpandedSpanIds] = useState<string[]>([]);\n\n useEffect(() => {\n if (hierarchicalSpans.length > 0) {\n setExpandedSpanIds(getAllSpanIds(hierarchicalSpans));\n }\n }, [hierarchicalSpans]);\n\n const rootSpan = useMemo(\n () => (anchorSpanId ? spans?.find(s => s.spanId === anchorSpanId) : spans?.find(s => s.parentSpanId == null)),\n [spans, anchorSpanId],\n );\n\n const handleSpanClick = (id: string) => {\n const newId = selectedSpanId === id ? undefined : id;\n setSelectedSpanId(newId);\n onSpanSelect?.(newId);\n };\n\n const showOpenTracePageLink = !isOnTracePage && LinkComponent && traceHref;\n\n // Shared across both header layouts (list side panel and full trace page) so a trace can be\n // downloaded from wherever it's being inspected.\n const downloadTraceButton = (\n <Button\n size=\"md\"\n tooltip=\"Download trace JSON\"\n aria-label=\"Download trace JSON\"\n disabled={isDownloadingTrace}\n onClick={() => downloadTraceJson(traceId)}\n >\n {isDownloadingTrace ? <Loader2Icon className=\"animate-spin\" /> : <DownloadIcon />}\n </Button>\n );\n\n return (\n <DataPanel collapsed={collapsed}>\n <DataPanel.Header>\n {isOnTracePage ? (\n <>\n <DataPanel.Heading>Trace Timeline</DataPanel.Heading>\n <ButtonsGroup className=\"ml-auto shrink-0\">{downloadTraceButton}</ButtonsGroup>\n </>\n ) : (\n <>\n <DataPanel.Heading>\n Trace <b># {truncateString(traceId, 12)}</b>\n </DataPanel.Heading>\n <ButtonsGroup className=\"ml-auto shrink-0\">\n {onCollapsedChange && (\n <Button\n size=\"md\"\n tooltip={collapsed ? 'Expand panel' : 'Collapse panel'}\n onClick={() => setCollapsed(!collapsed)}\n >\n {collapsed ? <ChevronsUpDownIcon /> : <ChevronsDownUpIcon />}\n </Button>\n )}\n {(onPrevious || onNext) && (\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Previous trace\"\n nextLabel=\"Next trace\"\n />\n )}\n {showOpenTracePageLink && (\n <Button\n as={LinkComponent}\n href={traceHref}\n size=\"md\"\n tooltip=\"Open trace page\"\n aria-label=\"Open trace page\"\n >\n <Link2Icon />\n </Button>\n )}\n {downloadTraceButton}\n <DataPanel.CloseButton onClick={onClose} />\n </ButtonsGroup>\n </>\n )}\n </DataPanel.Header>\n\n {!collapsed &&\n (isLoading ? (\n <DataPanel.LoadingData>Loading trace...</DataPanel.LoadingData>\n ) : hierarchicalSpans.length === 0 ? (\n <DataPanel.NoData>No spans found for this trace.</DataPanel.NoData>\n ) : (\n <DataPanel.Content ref={contentRef}>\n {!isOnTracePage && rootSpan && <TraceKeysAndValues rootSpan={rootSpan} className=\"mb-6\" />}\n\n {!isOnTracePage && (onEvaluateTrace || onSaveAsDatasetItem || onAddTraceMocksToItem) && (\n <div className=\"mb-6 flex flex-wrap justify-between items-center gap-4\">\n {onEvaluateTrace && (\n <Button size=\"sm\" onClick={onEvaluateTrace}>\n <Icon>\n <CircleGaugeIcon />\n </Icon>\n Evaluate Trace\n </Button>\n )}\n {onSaveAsDatasetItem && (\n <Button size=\"sm\" onClick={() => onSaveAsDatasetItem({ traceId, rootSpanId: rootSpan?.spanId })}>\n <Icon>\n <SaveIcon />\n </Icon>\n Save as Dataset Item\n </Button>\n )}\n {onAddTraceMocksToItem && (\n <Button size=\"sm\" onClick={() => onAddTraceMocksToItem({ traceId })}>\n <Icon>\n <WrenchIcon />\n </Icon>\n Add tool mocks to item\n </Button>\n )}\n </div>\n )}\n\n {!isOnTracePage &&\n !onEvaluateTrace &&\n !onSaveAsDatasetItem &&\n !onAddTraceMocksToItem &&\n showUnavailableFeaturesMsg && (\n <Notice variant=\"info\" className=\"mb-6\">\n <Notice.Message>\n Evaluating traces and saving them as dataset items is available in Mastra Studio (local or\n deployed).\n </Notice.Message>\n </Notice>\n )}\n\n <TraceTimeline\n hierarchicalSpans={hierarchicalSpans}\n onSpanClick={handleSpanClick}\n selectedSpanId={selectedSpanId}\n expandedSpanIds={expandedSpanIds}\n setExpandedSpanIds={setExpandedSpanIds}\n chartWidth={timelineChartWidth}\n />\n </DataPanel.Content>\n ))}\n </DataPanel>\n );\n}\n","import type { SpanRecord } from '@mastra/core/storage';\n\ntype MessageLike = { role?: string; content?: unknown };\n\n/**\n * Extract a truncated text preview from a span's input field.\n * Agent traces store `input` as an array of message objects.\n * Returns the text content of all user messages joined, truncated to maxLength.\n */\nexport function getInputPreview(input: unknown, maxLength = 100): string {\n if (input == null) return '';\n\n // Unwrap legacy { messages: [...] } wrapper from agent_run spans\n const messageArray = Array.isArray(input)\n ? input\n : input && typeof input === 'object' && !Array.isArray(input) && Array.isArray((input as any).messages)\n ? (input as any).messages\n : null;\n\n if (messageArray) {\n const messages = messageArray as MessageLike[];\n const userMessages = messages\n .filter(m => m?.role === 'user')\n .map(m => {\n if (typeof m.content === 'string') return m.content;\n if (Array.isArray(m.content)) {\n return m.content\n .map((part: any) => {\n if (typeof part === 'string') return part;\n if (part?.type === 'text' && typeof part.text === 'string') return part.text;\n return '';\n })\n .filter(Boolean)\n .join(' ');\n }\n return '';\n })\n .filter(Boolean);\n\n const joined = userMessages.join(' | ');\n if (joined.length > maxLength) {\n return joined.slice(0, maxLength) + '…';\n }\n return joined;\n }\n\n if (typeof input === 'string') {\n if (input.length > maxLength) {\n return input.slice(0, maxLength) + '…';\n }\n return input;\n }\n\n const str = JSON.stringify(input);\n if (str.length > maxLength) {\n return str.slice(0, maxLength) + '…';\n }\n return str;\n}\n\ntype TokenUsage = {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n};\n\n/**\n * Check if a span indicates that the token limit was exceeded\n */\nexport function isTokenLimitExceeded(span?: SpanRecord): boolean {\n return span?.attributes?.finishReason === 'length';\n}\n\n/**\n * Get a human-readable message for token limit exceeded\n */\nexport function getTokenLimitMessage(span?: SpanRecord): string {\n const usage = span?.attributes?.usage as TokenUsage | undefined;\n\n if (!usage) {\n return `The model stopped generating because it reached the maximum token limit. The response was truncated and may be incomplete.`;\n }\n\n const inputTokens = usage.inputTokens ?? 0;\n const outputTokens = usage.outputTokens ?? 0;\n const totalTokens = usage.totalTokens ?? inputTokens + outputTokens;\n\n // Show breakdown if we have detailed info\n if (inputTokens > 0 || outputTokens > 0) {\n return `The model stopped generating because it reached the maximum token limit. The response was truncated and may be incomplete.\\n\\nToken usage: ${inputTokens} input + ${outputTokens} output = ${totalTokens} total`;\n }\n\n return `The model stopped generating because it reached the maximum token limit (${totalTokens} tokens). The response was truncated and may be incomplete.`;\n}\n","import type { SpanRecord } from '@mastra/core/storage';\nimport { format } from 'date-fns';\nimport { BracesIcon, FileInputIcon, FileOutputIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { getTokenLimitMessage, isTokenLimitExceeded } from '../utils/span-utils';\nimport { SpanTokenUsage } from './span-token-usage';\nimport type { TokenUsage } from './span-token-usage';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { DataKeysAndValues } from '@/ds/components/DataKeysAndValues';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport { Notice } from '@/ds/components/Notice';\nimport { Tab, TabContent, TabList, Tabs } from '@/ds/components/Tabs';\n\nfunction buildDialogTitle(sectionTitle: string, icon: ReactNode, span: { spanId: string; traceId: string }) {\n return (\n <>\n <span className=\"flex items-center gap-1.5 text-neutral2 uppercase tracking-widest [&>svg]:size-3.5\">\n {icon}\n {sectionTitle}\n </span>\n <span>\n › Span <b className=\"text-neutral3\">#{span.spanId}</b>\n </span>\n <span>\n › Trace <b className=\"text-neutral3\">#{span.traceId}</b>\n </span>\n </>\n );\n}\n\nexport interface SpanDataPanelViewProps {\n traceId: string;\n spanId: string;\n /** Full span record. Caller fetches via useSpanDetail. */\n span: SpanRecord | undefined;\n isLoading?: boolean;\n onClose: () => void;\n onPrevious?: () => void;\n onNext?: () => void;\n activeTab?: string;\n onTabChange?: (tab: string) => void;\n /**\n * When provided, a \"Scoring\" tab appears; the slot receives the loaded span and renders\n * whatever scoring UI the consumer wants. When undefined, only the \"Details\" tab renders.\n */\n scoringTabSlot?: (args: { span: SpanRecord; traceId: string; spanId: string }) => ReactNode;\n /** Optional count shown in the \"Scoring\" tab label (e.g. number of scores). */\n scoringTabBadge?: ReactNode;\n /**\n * When provided, a \"Feedback\" tab appears; the slot receives the loaded span and renders\n * whatever feedback UI the consumer wants.\n */\n feedbackTabSlot?: (args: { span: SpanRecord; traceId: string; spanId: string }) => ReactNode;\n /** Optional count shown in the \"Feedback\" tab label. */\n feedbackTabBadge?: ReactNode;\n /**\n * Whether this span is the displayed root of the current view (trace root or\n * branch anchor). Controls visibility of trace-level metadata fields. Defaults\n * to `span.parentSpanId == null` (trace case) when omitted.\n */\n isAnchor?: boolean;\n}\n\nexport function SpanDataPanelView({\n traceId,\n spanId,\n span,\n isLoading,\n onClose,\n onPrevious,\n onNext,\n activeTab,\n onTabChange,\n scoringTabSlot,\n scoringTabBadge,\n feedbackTabSlot,\n feedbackTabBadge,\n isAnchor,\n}: SpanDataPanelViewProps) {\n return (\n <DataPanel>\n <DataPanel.Header>\n <DataPanel.Heading>\n Span <b># {spanId}</b>\n </DataPanel.Heading>\n <ButtonsGroup className=\"ml-auto shrink-0\">\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Previous span\"\n nextLabel=\"Next span\"\n />\n <DataPanel.CloseButton onClick={onClose} />\n </ButtonsGroup>\n </DataPanel.Header>\n\n {isLoading ? (\n <DataPanel.LoadingData>Loading span details...</DataPanel.LoadingData>\n ) : !span ? (\n <DataPanel.NoData>Span not found.</DataPanel.NoData>\n ) : (\n <SpanDataPanelContent\n span={span}\n traceId={traceId}\n spanId={spanId}\n activeTab={activeTab}\n onTabChange={onTabChange}\n scoringTabSlot={scoringTabSlot}\n scoringTabBadge={scoringTabBadge}\n feedbackTabSlot={feedbackTabSlot}\n feedbackTabBadge={feedbackTabBadge}\n isAnchor={isAnchor}\n />\n )}\n </DataPanel>\n );\n}\n\nfunction SpanDataPanelContent({\n span,\n traceId,\n spanId,\n activeTab,\n onTabChange,\n scoringTabSlot,\n scoringTabBadge,\n feedbackTabSlot,\n feedbackTabBadge,\n isAnchor,\n}: {\n span: SpanRecord;\n traceId: string;\n spanId: string;\n activeTab?: string;\n onTabChange?: (tab: string) => void;\n scoringTabSlot?: (args: { span: SpanRecord; traceId: string; spanId: string }) => ReactNode;\n scoringTabBadge?: ReactNode;\n feedbackTabSlot?: (args: { span: SpanRecord; traceId: string; spanId: string }) => ReactNode;\n feedbackTabBadge?: ReactNode;\n isAnchor?: boolean;\n}) {\n const durationMs =\n span.startedAt && span.endedAt ? new Date(span.endedAt).getTime() - new Date(span.startedAt).getTime() : null;\n const usage = span.attributes?.usage as TokenUsage | undefined;\n\n const detailsBody = (\n <>\n {isTokenLimitExceeded(span) && (\n <div className=\"mb-3\">\n <Notice variant=\"warning\" title=\"Token Limit Exceeded\">\n <Notice.Message>{getTokenLimitMessage(span)}</Notice.Message>\n </Notice>\n </div>\n )}\n\n {usage && <SpanTokenUsage usage={usage} className=\"mb-3\" />}\n\n <DataKeysAndValues>\n {/* Anchor-only: rich trace-context fields. Live on the full SpanRecord, not on the\n * lightweight payload, so they only have values once the full span is loaded. */}\n {(isAnchor ?? span.parentSpanId == null) && (\n <>\n {span.traceId && (\n <>\n <DataKeysAndValues.Key>Trace Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn copyTooltip=\"Copy Trace Id to clipboard\" copyValue={span.traceId}>\n {span.traceId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n {span.tags && span.tags.length > 0 && (\n <>\n <DataKeysAndValues.Key>Tags</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{span.tags.join(', ')}</DataKeysAndValues.Value>\n </>\n )}\n {span.runId && (\n <>\n <DataKeysAndValues.Key>Run Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn copyTooltip=\"Copy Run Id to clipboard\" copyValue={span.runId}>\n {span.runId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n {span.threadId && (\n <>\n <DataKeysAndValues.Key>Thread Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn copyTooltip=\"Copy Thread Id to clipboard\" copyValue={span.threadId}>\n {span.threadId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n {span.sessionId && (\n <>\n <DataKeysAndValues.Key>Session Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn\n copyTooltip=\"Copy Session Id to clipboard\"\n copyValue={span.sessionId}\n >\n {span.sessionId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n {span.requestId && (\n <>\n <DataKeysAndValues.Key>Request Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn\n copyTooltip=\"Copy Request Id to clipboard\"\n copyValue={span.requestId}\n >\n {span.requestId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n {span.resourceId && (\n <>\n <DataKeysAndValues.Key>Resource Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn\n copyTooltip=\"Copy Resource Id to clipboard\"\n copyValue={span.resourceId}\n >\n {span.resourceId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n {span.userId && (\n <>\n <DataKeysAndValues.Key>User Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn copyTooltip=\"Copy User Id to clipboard\" copyValue={span.userId}>\n {span.userId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n {span.organizationId && (\n <>\n <DataKeysAndValues.Key>Organization Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn\n copyTooltip=\"Copy Organization Id to clipboard\"\n copyValue={span.organizationId}\n >\n {span.organizationId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n {span.experimentId && (\n <>\n <DataKeysAndValues.Key>Experiment Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn\n copyTooltip=\"Copy Experiment Id to clipboard\"\n copyValue={span.experimentId}\n >\n {span.experimentId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n </>\n )}\n {span.name && (\n <>\n <DataKeysAndValues.Key>Name</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{span.name}</DataKeysAndValues.Value>\n </>\n )}\n {span.spanType && (\n <>\n <DataKeysAndValues.Key>Type</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{span.spanType}</DataKeysAndValues.Value>\n </>\n )}\n {span.startedAt && (\n <>\n <DataKeysAndValues.Key>Started</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>\n {format(new Date(span.startedAt), 'MMM dd, HH:mm:ss.SSS')}\n </DataKeysAndValues.Value>\n </>\n )}\n {span.endedAt && (\n <>\n <DataKeysAndValues.Key>Ended</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{format(new Date(span.endedAt), 'MMM dd, HH:mm:ss.SSS')}</DataKeysAndValues.Value>\n </>\n )}\n {durationMs != null && (\n <>\n <DataKeysAndValues.Key>Duration</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>\n {durationMs < 1000 ? `${durationMs}ms` : `${(durationMs / 1000).toFixed(2)}s`}\n </DataKeysAndValues.Value>\n </>\n )}\n </DataKeysAndValues>\n\n <div className=\"grid gap-3 mt-3\">\n <DataPanel.CodeSection\n title=\"Input\"\n dialogTitle={buildDialogTitle('Input', <FileInputIcon />, { spanId, traceId })}\n icon={<FileInputIcon />}\n codeStr={JSON.stringify(span.input ?? null, null, 2)}\n />\n <DataPanel.CodeSection\n title=\"Output\"\n dialogTitle={buildDialogTitle('Output', <FileOutputIcon />, { spanId, traceId })}\n icon={<FileOutputIcon />}\n codeStr={JSON.stringify(span.output ?? null, null, 2)}\n />\n <DataPanel.CodeSection\n title=\"Metadata\"\n dialogTitle={buildDialogTitle('Metadata', <BracesIcon />, { spanId, traceId })}\n icon={<BracesIcon />}\n codeStr={JSON.stringify(span.metadata ?? null, null, 2)}\n />\n <DataPanel.CodeSection\n title=\"Attributes\"\n dialogTitle={buildDialogTitle('Attributes', <BracesIcon />, { spanId, traceId })}\n icon={<BracesIcon />}\n codeStr={JSON.stringify(span.attributes ?? null, null, 2)}\n />\n </div>\n </>\n );\n\n // No extra tab slots → render details directly without the Tabs/TabList wrapper.\n if (!scoringTabSlot && !feedbackTabSlot) {\n return <DataPanel.Content>{detailsBody}</DataPanel.Content>;\n }\n\n return (\n <DataPanel.Content>\n <Tabs defaultTab=\"details\" value={activeTab} onValueChange={onTabChange}>\n <TabList>\n <Tab value=\"details\">Details</Tab>\n {scoringTabSlot && <Tab value=\"scoring\">Scoring {scoringTabBadge != null && <>({scoringTabBadge})</>}</Tab>}\n {feedbackTabSlot && (\n <Tab value=\"feedback\">Feedback {feedbackTabBadge != null && <>({feedbackTabBadge})</>}</Tab>\n )}\n </TabList>\n\n <TabContent value=\"details\">{detailsBody}</TabContent>\n {scoringTabSlot && <TabContent value=\"scoring\">{scoringTabSlot({ span, traceId, spanId })}</TabContent>}\n {feedbackTabSlot && <TabContent value=\"feedback\">{feedbackTabSlot({ span, traceId, spanId })}</TabContent>}\n </Tabs>\n </DataPanel.Content>\n );\n}\n","import type { SpanRecord } from '@mastra/core/storage';\nimport { format } from 'date-fns';\nimport { BracesIcon, FileInputIcon, FileOutputIcon } from 'lucide-react';\nimport { DataDetailsPanel } from '@/ds/components/DataDetailsPanel';\n\nconst KV = DataDetailsPanel.KeyValueList;\n\nexport interface SpanDetailsViewProps {\n spanId: string;\n /** Full span record. Caller fetches via useSpanDetail. */\n span: SpanRecord | undefined;\n isLoading?: boolean;\n onClose: () => void;\n}\n\n/**\n * Compact span panel using `DataDetailsPanel` (popover-style). Shows basic span metadata +\n * input/output/metadata/attributes code sections. Use this for inline span inspection; for the\n * full-width span view with scoring tab + prev/next nav, use `SpanDataPanelView`.\n */\nexport function SpanDetailsView({ spanId, span, isLoading, onClose }: SpanDetailsViewProps) {\n const durationMs =\n span?.startedAt && span?.endedAt ? new Date(span.endedAt).getTime() - new Date(span.startedAt).getTime() : null;\n\n return (\n <DataDetailsPanel>\n <DataDetailsPanel.Header>\n <DataDetailsPanel.Heading>\n Span <b># {spanId}</b>\n </DataDetailsPanel.Heading>\n <DataDetailsPanel.CloseButton onClick={onClose} />\n </DataDetailsPanel.Header>\n\n {isLoading ? (\n <DataDetailsPanel.LoadingData>Loading span...</DataDetailsPanel.LoadingData>\n ) : !span ? (\n <DataDetailsPanel.NoData>Span not found.</DataDetailsPanel.NoData>\n ) : (\n <DataDetailsPanel.Content>\n <KV>\n {span.spanType && (\n <>\n <KV.Key>Type</KV.Key>\n <KV.Value>{span.spanType}</KV.Value>\n </>\n )}\n {span.startedAt && (\n <>\n <KV.Key>Started</KV.Key>\n <KV.Value>{format(new Date(span.startedAt), 'MMM dd, HH:mm:ss.SSS')}</KV.Value>\n </>\n )}\n {span.endedAt && (\n <>\n <KV.Key>Ended</KV.Key>\n <KV.Value>{format(new Date(span.endedAt), 'MMM dd, HH:mm:ss.SSS')}</KV.Value>\n </>\n )}\n {durationMs != null && (\n <>\n <KV.Key>Duration</KV.Key>\n <KV.Value>{durationMs < 1000 ? `${durationMs}ms` : `${(durationMs / 1000).toFixed(2)}s`}</KV.Value>\n </>\n )}\n </KV>\n\n <br />\n\n <DataDetailsPanel.CodeSection\n title=\"Input\"\n icon={<FileInputIcon />}\n codeStr={JSON.stringify(span.input ?? null, null, 2)}\n />\n <DataDetailsPanel.CodeSection\n title=\"Output\"\n icon={<FileOutputIcon />}\n codeStr={JSON.stringify(span.output ?? null, null, 2)}\n />\n <DataDetailsPanel.CodeSection\n title=\"Metadata\"\n icon={<BracesIcon />}\n codeStr={JSON.stringify(span.metadata ?? null, null, 2)}\n />\n <DataDetailsPanel.CodeSection\n title=\"Attributes\"\n icon={<BracesIcon />}\n codeStr={JSON.stringify(span.attributes ?? null, null, 2)}\n />\n </DataDetailsPanel.Content>\n )}\n </DataDetailsPanel>\n );\n}\n","import type { LightSpanRecord } from '@mastra/core/storage';\nimport { useEffect, useMemo, useState } from 'react';\nimport { getAllSpanIds } from '../hooks/get-all-span-ids';\nimport { formatHierarchicalSpans } from './format-hierarchical-spans';\nimport { TraceTimeline } from './trace-timeline';\nimport { DataDetailsPanel } from '@/ds/components/DataDetailsPanel';\n\nexport interface TraceDetailsViewProps {\n traceId: string;\n /** Lightweight spans for the trace. Caller fetches via useTraceLightSpans. */\n spans: LightSpanRecord[] | undefined;\n isLoading?: boolean;\n onClose: () => void;\n /** Called when the user clicks a span in the timeline. Toggling a selected span off passes undefined. */\n onSpanSelect?: (spanId: string | undefined) => void;\n /** Fully controlled selection — the span to highlight. Pass whatever the parent's source of truth is. */\n selectedSpanId?: string | null;\n}\n\n/**\n * Compact trace panel using `DataDetailsPanel` (popover-style). Renders the timeline only —\n * no trace header KV, no evaluate/save actions. Use this for inline trace inspection from a\n * list page (e.g. the Logs page). For the full-width trace view, use `TraceDataPanelView`.\n */\nexport function TraceDetailsView({\n traceId,\n spans,\n isLoading,\n onClose,\n onSpanSelect,\n selectedSpanId,\n}: TraceDetailsViewProps) {\n const hierarchicalSpans = useMemo(() => formatHierarchicalSpans(spans ?? []), [spans]);\n\n const [expandedSpanIds, setExpandedSpanIds] = useState<string[]>([]);\n\n useEffect(() => {\n if (hierarchicalSpans.length > 0) {\n setExpandedSpanIds(getAllSpanIds(hierarchicalSpans));\n }\n }, [hierarchicalSpans]);\n\n const handleSpanClick = (id: string) => {\n onSpanSelect?.(selectedSpanId === id ? undefined : id);\n };\n\n return (\n <DataDetailsPanel>\n <DataDetailsPanel.Header>\n <DataDetailsPanel.Heading>\n Trace <b># {traceId}</b>\n </DataDetailsPanel.Heading>\n <DataDetailsPanel.CloseButton onClick={onClose} />\n </DataDetailsPanel.Header>\n\n {isLoading ? (\n <DataDetailsPanel.LoadingData>Loading trace...</DataDetailsPanel.LoadingData>\n ) : hierarchicalSpans.length === 0 ? (\n <DataDetailsPanel.NoData>No spans found for this trace.</DataDetailsPanel.NoData>\n ) : (\n <DataDetailsPanel.Content>\n <TraceTimeline\n hierarchicalSpans={hierarchicalSpans}\n onSpanClick={handleSpanClick}\n selectedSpanId={selectedSpanId ?? undefined}\n expandedSpanIds={expandedSpanIds}\n setExpandedSpanIds={setExpandedSpanIds}\n />\n </DataDetailsPanel.Content>\n )}\n </DataDetailsPanel>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface TracesLayoutProps {\n /** The trace list (left column). */\n listSlot: ReactNode;\n /** The trace data panel (right column, top). When null/undefined, the whole right column collapses. */\n tracePanelSlot?: ReactNode;\n /** The span data panel (right column, middle). Only rendered when truthy. */\n spanPanelSlot?: ReactNode;\n /** The score data panel (right column, bottom). Only rendered when truthy. */\n scorePanelSlot?: ReactNode;\n /** When the trace panel is collapsed, the right column's grid-rows squash the trace row to `auto`. */\n traceCollapsed?: boolean;\n}\n\n/**\n * Pure 2-column layout shell for the traces page. Owns no state and fetches no data — pass slots in.\n * Right-column row template adapts based on which panels are present.\n */\nexport function TracesLayout({\n listSlot,\n tracePanelSlot,\n spanPanelSlot,\n scorePanelSlot,\n traceCollapsed,\n}: TracesLayoutProps) {\n const hasSidePanel = !!tracePanelSlot;\n\n return (\n <div\n className={cn(\n 'grid max-h-full min-h-0 gap-4 items-start ',\n hasSidePanel ? 'grid-cols-[1fr_1fr]' : 'grid-cols-[1fr]',\n )}\n >\n {listSlot}\n\n {hasSidePanel && (\n <div\n className={cn(\n 'grid gap-4 max-h-full overflow-auto',\n scorePanelSlot\n ? traceCollapsed\n ? 'grid-rows-[auto_3fr_3fr]'\n : 'grid-rows-[2fr_3fr_3fr]'\n : spanPanelSlot\n ? traceCollapsed\n ? 'grid-rows-[auto_3fr]'\n : 'grid-rows-[2fr_3fr]'\n : traceCollapsed\n ? 'grid-rows-[auto]'\n : 'grid-rows-[1fr]',\n )}\n >\n {tracePanelSlot}\n {spanPanelSlot}\n {scorePanelSlot}\n </div>\n )}\n </div>\n );\n}\n","import { useVirtualizer } from '@tanstack/react-virtual';\nimport { useEffect, useRef } from 'react';\nimport { getInputPreview } from '../utils/span-utils';\nimport { DataListSkeleton, TracesDataList } from '@/ds/components/DataList';\nimport { cn } from '@/lib/utils';\n\n/** Span attributes fields the list view reads directly. Extra unknown keys are allowed so callers\n * can pass the full attributes record from @mastra/core/storage without mapping. */\nexport type TraceAttributes = {\n status?: string | null;\n agentId?: string | null;\n workflowId?: string | null;\n [key: string]: unknown;\n};\n\nexport type TracesListViewTrace = {\n traceId: string;\n /** Required for branch rows; absent on plain trace rows (which are root-rooted). */\n spanId?: string | null;\n /** `null`/missing → root span. Drives the Kind column's icon (top-level trace vs nested branch). */\n parentSpanId?: string | null;\n name: string;\n entityType?: string | null;\n entityId?: string | null;\n entityName?: string | null;\n attributes?: TraceAttributes | null;\n input?: unknown;\n startedAt?: Date | string | null;\n createdAt: Date | string;\n};\n\n// Fixed widths on non-flex columns prevent track shifts as the virtualizer swaps rows in/out.\nconst COLUMNS = '6rem 9rem 14rem minmax(8rem,1fr) 14rem 6rem';\n\nconst ROW_HEIGHT = 36;\nconst OVERSCAN = 8;\n\nexport type TracesListViewProps = {\n traces: TracesListViewTrace[];\n isLoading?: boolean;\n isFetchingNextPage?: boolean;\n hasNextPage?: boolean;\n setEndOfListElement?: (element: HTMLDivElement | null) => void;\n filtersApplied?: boolean;\n /** Currently featured/selected trace — its row gets the highlighted background. */\n featuredTraceId?: string | null;\n /**\n * Required in branches mode to disambiguate rows sharing a `traceId`. When set,\n * a row is featured only when both `traceId` and `spanId` match.\n */\n featuredSpanId?: string | null;\n /** Branches mode mixes root traces with subtraces — enables the Trace/Subtrace tooltip on the\n * level icon in the Name column, which is meaningless when every row is a root. */\n isBranchesMode?: boolean;\n /** Keys (`traceId:spanId`) of rows that just arrived via delta polling. Rows whose key is in\n * this set get a temporary tint to distinguish them from rows present since the last page-mode\n * fetch. Auto-expires upstream (in useTraces) after a short window. */\n recentlyAddedKeys?: Set<string>;\n /** Called when a row is clicked. The current selection logic (toggle on same id) is the consumer's call. */\n onTraceClick: (trace: TracesListViewTrace) => void;\n};\n\n/**\n * Virtualized presentational list. Renders only the visible window via TanStack Virtual, and\n * uses DataList primitives for layout (CSS Grid with subgrid rows).\n */\nexport function TracesListView({\n traces,\n isLoading,\n isFetchingNextPage,\n hasNextPage,\n setEndOfListElement,\n filtersApplied,\n featuredTraceId,\n featuredSpanId,\n isBranchesMode,\n recentlyAddedKeys,\n onTraceClick,\n}: TracesListViewProps) {\n const scrollRef = useRef<HTMLDivElement | null>(null);\n\n const virtualizer = useVirtualizer({\n count: traces.length,\n getScrollElement: () => scrollRef.current,\n estimateSize: () => ROW_HEIGHT,\n overscan: OVERSCAN,\n });\n\n // Reset scroll to top whenever a fresh query resolves (filter / date range change).\n // `isLoading` only flips on initial fetches — `fetchNextPage` keeps it `false`, so this\n // effect doesn't fire during pagination.\n //\n // Why the manual scroll event: when the skeleton-vs-list branch swaps in the new scroll\n // container, it mounts at `scrollTop = 0`. The virtualizer rebinds its listener but\n // doesn't re-read `scrollTop`, so it keeps the stale `scrollOffset` from the previous\n // element. `scrollToOffset(0)` no-ops because the new element is already at 0 (no scroll\n // event fires). Dispatching a synthetic `scroll` forces the virtualizer's handler to\n // read the fresh `scrollTop` and recompute `virtualItems` with `paddingTop = 0`.\n const wasLoadingRef = useRef(isLoading);\n useEffect(() => {\n if (wasLoadingRef.current && !isLoading) {\n scrollRef.current?.dispatchEvent(new Event('scroll'));\n }\n wasLoadingRef.current = isLoading;\n }, [isLoading]);\n\n if (isLoading) {\n return <DataListSkeleton columns={COLUMNS} />;\n }\n\n const virtualItems = virtualizer.getVirtualItems();\n const totalSize = virtualizer.getTotalSize();\n const paddingTop = virtualItems[0]?.start ?? 0;\n const paddingBottom =\n virtualItems.length > 0 ? Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0)) : 0;\n\n return (\n <TracesDataList columns={COLUMNS} variant=\"striped\" scrollRef={scrollRef} className=\"min-w-0\">\n <TracesDataList.Top>\n <TracesDataList.TopCell>Date</TracesDataList.TopCell>\n <TracesDataList.TopCell>Time</TracesDataList.TopCell>\n <TracesDataList.TopCell>Name</TracesDataList.TopCell>\n <TracesDataList.TopCell>Input</TracesDataList.TopCell>\n <TracesDataList.TopCell>Entity</TracesDataList.TopCell>\n <TracesDataList.TopCell>Status</TracesDataList.TopCell>\n </TracesDataList.Top>\n\n {traces.length === 0 ? (\n <TracesDataList.NoMatch\n message={filtersApplied ? 'No traces found for applied filters' : 'No traces found yet'}\n />\n ) : (\n <>\n <TracesDataList.Spacer height={paddingTop} />\n {virtualItems.map(vi => {\n const trace = traces[vi.index];\n if (!trace) return null;\n\n const isFeatured =\n trace.traceId === featuredTraceId && (featuredSpanId == null || trace.spanId === featuredSpanId);\n const rowKey = `${trace.traceId}:${trace.spanId ?? ''}`;\n const isRecentlyAdded = recentlyAddedKeys?.has(rowKey) ?? false;\n const displayDate = trace.startedAt ?? trace.createdAt;\n const entityName =\n trace.entityName || trace.entityId || trace.attributes?.agentId || trace.attributes?.workflowId;\n\n return (\n <TracesDataList.RowButton\n key={rowKey}\n ref={virtualizer.measureElement}\n data-index={vi.index}\n onClick={() => onTraceClick(trace)}\n featured={isFeatured}\n className={cn(isRecentlyAdded && 'animate-row-highlight')}\n >\n <TracesDataList.DateCell timestamp={displayDate} />\n <TracesDataList.TimeCell timestamp={displayDate} />\n <TracesDataList.NameCell\n name={trace.name}\n parentSpanId={trace.parentSpanId}\n showLevelTooltip={isBranchesMode}\n />\n <TracesDataList.InputCell input={getInputPreview(trace.input)} />\n <TracesDataList.EntityCell entityType={trace.entityType} entityName={entityName} />\n <TracesDataList.StatusCell status={trace.attributes?.status} />\n </TracesDataList.RowButton>\n );\n })}\n <TracesDataList.Spacer height={paddingBottom} />\n <TracesDataList.NextPageLoading\n isLoading={isFetchingNextPage}\n hasMore={hasNextPage}\n setEndOfListElement={setEndOfListElement}\n />\n </>\n )}\n </TracesDataList>\n );\n}\n","import { ChevronDownIcon } from 'lucide-react';\nimport type { TraceListMode } from '../trace-filters';\nimport { Button } from '@/ds/components/Button';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu';\n\nconst TRACES_LIST_MODE_LABELS: Record<TraceListMode, string> = {\n traces: 'Top-level traces only',\n branches: 'All traces, nested too',\n};\n\nexport interface TracesListModeToggleProps {\n value: TraceListMode;\n onChange: (mode: TraceListMode) => void;\n disabled?: boolean;\n}\n\n/**\n * Dropdown switcher between the two list modes on the Observability traces page:\n * - `traces` — one row per top-level run (each trace's root anchor).\n * - `branches` — one row per anchor span, including ones nested inside other runs.\n */\nexport function TracesListModeToggle({ value, onChange, disabled }: TracesListModeToggleProps) {\n return (\n <DropdownMenu>\n <DropdownMenu.Trigger asChild>\n <Button size=\"md\" variant=\"default\" disabled={disabled}>\n {TRACES_LIST_MODE_LABELS[value]}\n <ChevronDownIcon />\n </Button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"start\">\n <DropdownMenu.RadioGroup value={value} onValueChange={v => onChange(v as TraceListMode)}>\n <DropdownMenu.RadioItem value=\"traces\">{TRACES_LIST_MODE_LABELS.traces}</DropdownMenu.RadioItem>\n <DropdownMenu.RadioItem value=\"branches\">{TRACES_LIST_MODE_LABELS.branches}</DropdownMenu.RadioItem>\n </DropdownMenu.RadioGroup>\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n}\n","import { ErrorState } from '@/ds/components/ErrorState';\nimport { PermissionDenied } from '@/ds/components/PermissionDenied';\nimport { SessionExpired } from '@/ds/components/SessionExpired';\nimport { parseError } from '@/lib/errors';\nimport { is401UnauthorizedError, is403ForbiddenError } from '@/lib/query-utils';\n\nexport interface TracesErrorContentProps {\n /** The error from a useTraces / useTraceLightSpans / etc. query. */\n error: unknown;\n /** Passed to PermissionDenied (e.g. 'traces' / 'trace'). */\n resource: string;\n /** Title shown on the generic ErrorState fallback. */\n errorTitle: string;\n}\n\n/**\n * Renders the appropriate fallback content for a traces-related query error:\n * `<SessionExpired />` for 401, `<PermissionDenied />` for 403, otherwise `<ErrorState />`.\n *\n * The consumer wraps it in whatever layout they want (NoDataPageLayout for the list page,\n * PageLayout.MainArea for the detail page, etc.) — this component only owns the 3-branch decision.\n */\nexport function TracesErrorContent({ error, resource, errorTitle }: TracesErrorContentProps) {\n if (is401UnauthorizedError(error)) return <SessionExpired />;\n if (is403ForbiddenError(error)) return <PermissionDenied resource={resource} />;\n const parsed = error instanceof Error ? parseError(error) : undefined;\n return <ErrorState title={errorTitle} message={parsed?.error ?? 'Unknown error'} />;\n}\n","import { format } from 'date-fns';\nimport { CircleSlashIcon, ExternalLinkIcon } from 'lucide-react';\nimport type { TraceDatePreset } from '../types';\nimport { Button } from '@/ds/components/Button';\nimport { EmptyState } from '@/ds/components/EmptyState';\n\nconst PRESET_LABELS: Record<Exclude<TraceDatePreset, 'all' | 'custom'>, string> = {\n 'last-24h': 'the last 24 hours',\n 'last-3d': 'the last 3 days',\n 'last-7d': 'the last 7 days',\n 'last-14d': 'the last 14 days',\n 'last-30d': 'the last 30 days',\n};\n\nexport interface NoTracesInfoProps {\n datePreset?: TraceDatePreset;\n dateFrom?: Date;\n dateTo?: Date;\n}\n\nconst DATE_FORMAT = 'MMM d, yyyy HH:mm';\n\nconst RANGE_TIP = 'Pick a wider time range — older traces may fall outside the current window.';\n\nfunction describeRange({ datePreset, dateFrom, dateTo }: NoTracesInfoProps): { title: string; description: string } {\n if (datePreset && datePreset !== 'all' && datePreset !== 'custom') {\n return {\n title: `No traces for ${PRESET_LABELS[datePreset]}`,\n description: RANGE_TIP,\n };\n }\n if (dateFrom && dateTo) {\n return {\n title: `No traces between ${format(dateFrom, DATE_FORMAT)} and ${format(dateTo, DATE_FORMAT)}`,\n description: RANGE_TIP,\n };\n }\n if (dateFrom) {\n return {\n title: `No traces since ${format(dateFrom, DATE_FORMAT)}`,\n description: RANGE_TIP,\n };\n }\n return {\n title: 'No traces yet',\n description: 'Traces will appear here once agents, workflows, or tools are executed.',\n };\n}\n\nexport const NoTracesInfo = ({ datePreset, dateFrom, dateTo }: NoTracesInfoProps = {}) => {\n const { title, description } = describeRange({ datePreset, dateFrom, dateTo });\n return (\n <div className=\"flex h-full items-center justify-center\">\n <EmptyState\n iconSlot={<CircleSlashIcon />}\n titleSlot={title}\n descriptionSlot={description}\n actionSlot={\n <Button\n variant=\"ghost\"\n as=\"a\"\n href=\"https://mastra.ai/en/docs/observability/tracing/overview\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Tracing Documentation <ExternalLinkIcon />\n </Button>\n }\n />\n </div>\n );\n};\n","import type { LightSpanRecord } from '@mastra/core/storage';\nimport { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport type { UseQueryResult } from '@tanstack/react-query';\n\nconst IMMUTABLE_CACHE_TIME = 1000 * 60 * 60 * 24 * 30; // 30 days, massive cache, span data is immutable\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: LightSpanRecord[] } | 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 enabled: !!traceId && !!spanId,\n staleTime: query => {\n const data = query.state.data;\n const isFinished = data?.spans.every(s => Boolean(s.endedAt));\n return isFinished ? IMMUTABLE_CACHE_TIME : 0;\n },\n });\n}\n","import type { LightSpanRecord } from '@mastra/core/storage';\nimport { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport type { UseQueryResult } from '@tanstack/react-query';\n\nconst IMMUTABLE_CACHE_TIME = 1000 * 60 * 60 * 24 * 30; // 30 days, massive cache, span data is immutable\n\nexport function useSpanDetail(\n traceId: string | null | undefined,\n spanId: string | null | undefined,\n): UseQueryResult<{ span: LightSpanRecord & { output?: unknown; result?: unknown } } | null> {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['span-detail', traceId, spanId],\n queryFn: async () => {\n if (!traceId || !spanId) {\n throw new Error('Trace ID and Span ID are required');\n }\n return client.getSpan(traceId, spanId);\n },\n enabled: !!traceId && !!spanId,\n staleTime: query => {\n const data = query.state.data;\n\n if (data?.span?.endedAt) {\n return IMMUTABLE_CACHE_TIME;\n }\n\n return 0;\n },\n });\n}\n","import type { LightSpanRecord } from '@mastra/core/storage';\nimport { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport type { UseQueryResult } from '@tanstack/react-query';\n\nconst IMMUTABLE_CACHE_TIME = 1000 * 60 * 60 * 24 * 30; // 30 days, massive cache, span data is immutable\n\nexport function useTraceLightSpans(\n traceId: string | null | undefined,\n): UseQueryResult<{ traceId: string; spans: LightSpanRecord[] } | null> {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['trace-light-spans', traceId],\n queryFn: async () => {\n if (!traceId) {\n throw new Error('Trace ID is required');\n }\n const res = await client.getTraceLight(traceId);\n return res;\n },\n enabled: !!traceId,\n staleTime: query => {\n const data = query.state.data;\n\n const isFinished = data?.spans.every(d => Boolean(d.endedAt));\n\n if (isFinished) {\n return IMMUTABLE_CACHE_TIME;\n }\n\n return 0;\n },\n });\n}\n","import type { LightSpanRecord } from '@mastra/core/storage';\nimport type { TraceListMode } from '../trace-filters';\nimport { useBranch } from './use-branch';\nimport { useTraceLightSpans } from './use-trace-light-spans';\n\nexport interface UseTraceOrBranchSpansArgs {\n traceId: string | null | undefined;\n /** Required when `listMode === 'branches'` — the anchor span identifying the displayed\n * subtree. The hook fetches `getBranch(traceId, anchorSpanId)`. Intra-panel span selection\n * is separate (the caller's `spanIdParam`); the anchor stays put while it changes. */\n anchorSpanId?: string | null;\n listMode: TraceListMode;\n depth?: number;\n}\n\nexport interface UseTraceOrBranchSpansResult {\n spans: LightSpanRecord[] | undefined;\n /** Set in branches mode; undefined in traces mode (which uses parentSpanId == null). */\n anchorSpanId: string | undefined;\n isLoading: boolean;\n isError: boolean;\n error: unknown;\n}\n\n/**\n * Unified data source for the trace/span detail panel. Returns trace spans (full tree from the\n * root) in traces mode, or branch spans (subtree rooted at `anchorSpanId`) in branches mode.\n * Only the active query fires; the inactive one is disabled via its `enabled` flag.\n */\nexport function useTraceOrBranchSpans({\n traceId,\n anchorSpanId,\n listMode,\n depth,\n}: UseTraceOrBranchSpansArgs): UseTraceOrBranchSpansResult {\n const isBranches = listMode === 'branches';\n\n const traceQuery = useTraceLightSpans(isBranches ? null : traceId);\n const branchQuery = useBranch({\n traceId: isBranches ? traceId : null,\n spanId: isBranches ? anchorSpanId : null,\n depth,\n });\n\n if (isBranches) {\n return {\n spans: branchQuery.data?.spans,\n anchorSpanId: anchorSpanId ?? undefined,\n isLoading: branchQuery.isLoading,\n isError: branchQuery.isError,\n error: branchQuery.error,\n };\n }\n\n return {\n spans: traceQuery.data?.spans,\n anchorSpanId: undefined,\n isLoading: traceQuery.isLoading,\n isError: traceQuery.isError,\n error: traceQuery.error,\n };\n}\n","import type { LightSpanRecord } from '@mastra/core/storage';\nimport { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport type { UseQueryResult } from '@tanstack/react-query';\n\nexport function useTraceSpans(\n traceId: string | null | undefined,\n): UseQueryResult<{ traceId: string; spans: LightSpanRecord[] } | null> {\n const client = useMastraClient();\n\n return useQuery({\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 });\n}\n","import type {\n LightSpanRecord,\n ListBranchesArgs,\n ListBranchesResponse,\n ListTracesArgs,\n ListTracesResponse,\n} from '@mastra/core/storage';\nimport { useMastraClient } from '@mastra/react';\nimport type { InfiniteData } from '@tanstack/react-query';\nimport { useInfiniteQuery, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { useEffect, useRef, useState } from 'react';\nimport type { TraceListMode } from '../trace-filters';\nimport { useInView } from '@/hooks/use-in-view';\nimport { is403ForbiddenError } from '@/lib/query-utils';\n\n/**\n * Per-MastraClient delta-polling support cache. Sticks once we observe a 501\n * or a page-0 response without `deltaCursor` (legacy server or store without\n * delta capability), so we don't re-probe on every mount.\n */\ntype DeltaSupport = 'unknown' | 'unsupported';\nconst deltaSupportByClient = new WeakMap<ReturnType<typeof useMastraClient>, DeltaSupport>();\n\n/** Tunables for live-tail polling. All fields optional — defaults below.\n * Platform consumers override individual fields to throttle traffic or\n * reshape the freshness/visibility trade-offs. */\nexport interface TracesPollingConfig {\n /** Interval between delta polls. Default 5_000ms. */\n deltaPollIntervalMs?: number;\n /** Refetch delay when the server signals `delta.hasMore` (chase remaining updates immediately). Default 100ms. */\n deltaChaseIntervalMs?: number;\n /** Max rows per delta poll. Server caps at 100. Default 100. */\n deltaLimit?: number;\n /** Page-mode refetch interval used when the configured store does not support delta polling. Default 10_000ms. */\n pageModeRefetchIntervalMs?: number;\n /** Periodic page-0 refetch interval while delta is active. Delta only delivers new rows, so this\n * is how we surface status flips (running → success/error) on rows already visible. Default 60_000ms. */\n page0StatusRefreshIntervalMs?: number;\n /** When the tab returns from being hidden and the last successful poll was older than this, the\n * cursor is treated as stale (ClickHouse delta tables TTL after 2 days; other stores may be more\n * aggressive). The infinite query is reset so page 0 refetches and delta resumes from a fresh\n * cursor. Default 900_000ms (15 min). */\n idleGuardThresholdMs?: number;\n /** Minimum visible duration for `isRefetching` after any query completes. On localhost a delta\n * poll can resolve in tens of ms — too brief for the spinner's 1s rotation to register visually,\n * and quick enough that React may batch the start/finish transitions. Pulsing for this duration\n * on completion (~144° of rotation at 400ms) makes each poll perceptible as a heartbeat.\n * Default 400ms. */\n minRefetchSpinMs?: number;\n /** Window during which a delta-arrived row's key stays in `recentlyAddedKeys` so the list view\n * can apply its `animate-row-highlight` class. Should match the CSS animation duration\n * (currently 1_000ms — see `index.css`). Default 1_000ms. */\n deltaHighlightMs?: number;\n}\n\nconst DEFAULT_POLLING_CONFIG: Required<TracesPollingConfig> = {\n deltaPollIntervalMs: 5_000,\n deltaChaseIntervalMs: 100,\n deltaLimit: 100,\n pageModeRefetchIntervalMs: 10_000,\n page0StatusRefreshIntervalMs: 60_000,\n idleGuardThresholdMs: 15 * 60_000,\n minRefetchSpinMs: 400,\n deltaHighlightMs: 1_000,\n};\n\n/** Returns true when the cursor should be considered stale and re-seeded.\n * Exported for testing — pure function of timestamps. */\nexport function shouldResetAfterIdle(lastSuccessAt: number, now: number, thresholdMs: number): boolean {\n if (lastSuccessAt === 0) return false;\n return now - lastSuccessAt > thresholdMs;\n}\n\nfunction isHttp501(error: unknown): boolean {\n return (error as { status?: number } | null)?.status === 501;\n}\n\ntype FetchTracesFnArgs = TracesFilters & {\n client: ReturnType<typeof useMastraClient>;\n mode?: 'page' | 'delta';\n page?: number;\n perPage?: number;\n after?: string;\n limit?: number;\n};\n\nconst fetchTracesFn = async ({\n client,\n mode,\n page,\n perPage,\n after,\n limit,\n filters,\n listMode = 'traces',\n}: FetchTracesFnArgs) => {\n const params =\n mode === 'delta'\n ? { mode: 'delta' as const, after, limit, filters }\n : { pagination: { page: page!, perPage: perPage! }, filters };\n\n if (listMode === 'branches') {\n return client.listBranches(params as ListBranchesArgs);\n }\n\n return client.listTraces(params as ListTracesArgs);\n};\n\nexport const TRACES_PER_PAGE = 25;\n\nexport interface TracesFilters {\n filters?: ListTracesArgs['filters'] | ListBranchesArgs['filters'];\n listMode?: TraceListMode;\n}\n\n/** Returns the next page number if the server indicates more pages are available. */\nexport function getTracesNextPageParam(\n lastPage: ListTracesResponse | ListBranchesResponse | undefined,\n _allPages: unknown,\n lastPageParam: number,\n) {\n if (lastPage?.pagination?.hasMore) {\n return lastPageParam + 1;\n }\n return undefined;\n}\n\ntype TracesPageResponse = ListTracesResponse | ListBranchesResponse;\n\nfunction getPageSpans(page: TracesPageResponse) {\n if ('branches' in page) return page.branches ?? [];\n return page.spans ?? [];\n}\n\n/** Deduplicates trace/branch rows by traceId + spanId across all loaded pages.\n * Also surfaces page 0's deltaCursor so the live-tail query can read it reactively. */\nexport function selectUniqueTraces(data: { pages: TracesPageResponse[] }): {\n spans: LightSpanRecord[];\n deltaCursor: string | undefined;\n} {\n const seen = new Set<string>();\n const spans = data.pages\n .flatMap(page => getPageSpans(page))\n .filter(span => {\n const key = `${span.traceId}:${span.spanId}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n\n return { spans, deltaCursor: data.pages[0]?.deltaCursor };\n}\n\n/** Replaces existing page-0 rows in place (keyed by traceId:spanId) with\n * refreshed copies from the server. Rows the server doesn't return are kept\n * as-is so delta-accumulated rows that have aged off the server's page 0\n * aren't dropped from the UI. New rows aren't added here — delta polling\n * delivers those. */\nexport function refreshPage0Rows(\n old: InfiniteData<TracesPageResponse> | undefined,\n refreshed: ListTracesResponse | ListBranchesResponse,\n listMode: TraceListMode,\n): InfiniteData<TracesPageResponse> | undefined {\n if (!old || old.pages.length === 0) return old;\n const [firstPage, ...rest] = old.pages;\n\n const refreshedRows =\n listMode === 'branches' && 'branches' in refreshed\n ? (refreshed.branches ?? [])\n : 'spans' in refreshed\n ? (refreshed.spans ?? [])\n : [];\n\n if (refreshedRows.length === 0) return old;\n\n const refreshedByKey = new Map<string, (typeof refreshedRows)[number]>();\n for (const row of refreshedRows) {\n refreshedByKey.set(`${row.traceId}:${row.spanId}`, row);\n }\n\n let updatedFirst: TracesPageResponse;\n if (listMode === 'branches' && 'branches' in firstPage) {\n const updated = (firstPage.branches ?? []).map(existing => {\n const fresh = refreshedByKey.get(`${existing.traceId}:${existing.spanId}`);\n return fresh ?? existing;\n });\n updatedFirst = { ...firstPage, branches: updated };\n } else if ('spans' in firstPage) {\n const updated = (firstPage.spans ?? []).map(existing => {\n const fresh = refreshedByKey.get(`${existing.traceId}:${existing.spanId}`);\n return fresh ?? existing;\n });\n updatedFirst = { ...firstPage, spans: updated };\n } else {\n return old;\n }\n\n return { ...old, pages: [updatedFirst, ...rest] };\n}\n\n/** Stable `startedAt DESC` sort matching the server's default page-mode\n * ordering for both list endpoints. Rows missing `startedAt` sink to the\n * bottom (compared as time 0). */\nfunction sortRowsByStartedAtDesc<T extends { startedAt?: unknown }>(rows: T[]): T[] {\n return [...rows].sort((a, b) => {\n const aTime = a.startedAt ? new Date(a.startedAt as string | number | Date).getTime() : 0;\n const bTime = b.startedAt ? new Date(b.startedAt as string | number | Date).getTime() : 0;\n return bTime - aTime;\n });\n}\n\n/** Prepends delta-mode rows into page 0 and advances its deltaCursor.\n * Delta responses come back in server cursor order (insertion order into\n * the per-store delta index), not the `startedAt DESC` order page-mode\n * uses — so we re-sort the merged page 0 to match what the user sees on\n * a fresh page-mode load. Cross-page duplication is handled later by\n * selectUniqueTraces. */\nexport function mergeDeltaIntoPage0(\n old: InfiniteData<TracesPageResponse> | undefined,\n delta: ListTracesResponse | ListBranchesResponse,\n listMode: TraceListMode,\n): InfiniteData<TracesPageResponse> | undefined {\n if (!old || old.pages.length === 0) return old;\n const [firstPage, ...rest] = old.pages;\n const nextCursor = delta.deltaCursor ?? firstPage.deltaCursor;\n\n let updatedFirst: TracesPageResponse;\n if (listMode === 'branches' && 'branches' in firstPage) {\n const newRows = (delta as ListBranchesResponse).branches ?? [];\n updatedFirst = {\n ...firstPage,\n branches: sortRowsByStartedAtDesc([...newRows, ...(firstPage.branches ?? [])]),\n deltaCursor: nextCursor,\n };\n } else if ('spans' in firstPage) {\n const newRows = (delta as ListTracesResponse).spans ?? [];\n updatedFirst = {\n ...firstPage,\n spans: sortRowsByStartedAtDesc([...newRows, ...(firstPage.spans ?? [])]),\n deltaCursor: nextCursor,\n };\n } else {\n return old;\n }\n\n return { ...old, pages: [updatedFirst, ...rest] };\n}\n\nexport interface UseTracesArgs extends TracesFilters {\n /** Optional overrides for the live-tail polling tunables. Any omitted fields fall back to the\n * built-in defaults; pass only what you want to change. */\n polling?: TracesPollingConfig;\n}\n\ninterface UseTracesReturn {\n data: { spans: LightSpanRecord[]; deltaCursor: string | undefined } | undefined;\n hasNextPage: boolean;\n isFetchingNextPage: boolean;\n fetchNextPage: () => void;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n setEndOfListElement: (node: HTMLDivElement | null) => void;\n isRefetching: boolean;\n autoRefetch: boolean;\n setAutoRefetch: (v: boolean) => void;\n recentlyAddedKeys: Set<string>;\n dataUpdatedAt: number;\n errorUpdatedAt: number;\n isFetching: boolean;\n isSuccess: boolean;\n fetchStatus: 'idle' | 'fetching' | 'paused';\n refetch: () => void;\n}\n\nexport const useTraces: (args: UseTracesArgs) => UseTracesReturn = ({\n filters,\n listMode = 'traces',\n polling = {},\n}: UseTracesArgs) => {\n const {\n deltaPollIntervalMs = DEFAULT_POLLING_CONFIG.deltaPollIntervalMs,\n deltaChaseIntervalMs = DEFAULT_POLLING_CONFIG.deltaChaseIntervalMs,\n deltaLimit = DEFAULT_POLLING_CONFIG.deltaLimit,\n pageModeRefetchIntervalMs = DEFAULT_POLLING_CONFIG.pageModeRefetchIntervalMs,\n page0StatusRefreshIntervalMs = DEFAULT_POLLING_CONFIG.page0StatusRefreshIntervalMs,\n idleGuardThresholdMs = DEFAULT_POLLING_CONFIG.idleGuardThresholdMs,\n minRefetchSpinMs = DEFAULT_POLLING_CONFIG.minRefetchSpinMs,\n deltaHighlightMs = DEFAULT_POLLING_CONFIG.deltaHighlightMs,\n } = polling;\n const client = useMastraClient();\n const queryClient = useQueryClient();\n const { inView: isEndOfListInView, setRef: setEndOfListElement } = useInView();\n\n const [deltaSupport, setDeltaSupport] = useState<DeltaSupport>(() => deltaSupportByClient.get(client) ?? 'unknown');\n const deltaUnsupported = deltaSupport === 'unsupported';\n\n // When false, all automatic polling stops: delta polls, status refresh,\n // idle-guard resets, and the page-mode fallback interval. Manual `resync`\n // still works. Session-scoped (no persistence across mounts).\n const [autoRefetch, setAutoRefetch] = useState(true);\n\n // Keys (`traceId:spanId`) of rows that arrived via the most recent delta\n // poll(s). The list view reads this to apply a temporary highlight class\n // for deltaHighlightMs, then they auto-expire. Resets on filter/listMode\n // change since a new query key spawns a fresh list.\n const [recentlyAddedKeys, setRecentlyAddedKeys] = useState<Set<string>>(() => new Set());\n useEffect(() => {\n setRecentlyAddedKeys(new Set());\n }, [listMode, filters]);\n\n const tracesQueryKey = ['traces', listMode, filters] as const;\n\n const query = useInfiniteQuery({\n queryKey: tracesQueryKey,\n queryFn: ({ pageParam }) =>\n fetchTracesFn({\n client,\n page: pageParam,\n perPage: TRACES_PER_PAGE,\n filters,\n listMode,\n }),\n initialPageParam: 0,\n getNextPageParam: getTracesNextPageParam,\n select: selectUniqueTraces,\n retry: false,\n // Disable polling on 403 to prevent flickering.\n // Fall back to page-mode polling only when delta isn't running.\n refetchInterval: q => {\n if (is403ForbiddenError(q.state.error)) return false;\n if (!autoRefetch) return false;\n return deltaUnsupported ? pageModeRefetchIntervalMs : false;\n },\n });\n\n const cursor = query.data?.deltaCursor;\n\n // If page 0 came back without a deltaCursor, the server/store doesn't\n // support delta polling. Pin the client to 'unsupported' so the infinite\n // query resumes page-mode polling and we stop probing.\n useEffect(() => {\n if (query.isSuccess && cursor === undefined && deltaSupport === 'unknown') {\n deltaSupportByClient.set(client, 'unsupported');\n setDeltaSupport('unsupported');\n }\n }, [query.isSuccess, cursor, deltaSupport, client]);\n\n const deltaQuery = useQuery({\n queryKey: ['traces-delta', listMode, filters] as const,\n queryFn: () => {\n const current = queryClient.getQueryData<InfiniteData<TracesPageResponse>>(tracesQueryKey)?.pages[0]?.deltaCursor;\n if (!current) return null;\n return fetchTracesFn({\n client,\n mode: 'delta',\n after: current,\n limit: deltaLimit,\n filters,\n listMode,\n });\n },\n enabled: !!cursor && !deltaUnsupported && autoRefetch,\n retry: false,\n refetchInterval: q => {\n if (q.state.error) return false;\n const data = q.state.data as ListTracesResponse | ListBranchesResponse | null | undefined;\n if (data?.delta?.hasMore) return deltaChaseIntervalMs;\n return deltaPollIntervalMs;\n },\n });\n\n // Merge new delta rows into the infinite-query cache. Also captures the\n // arrived keys into `recentlyAddedKeys` for deltaHighlightMs so the UI\n // can briefly distinguish them. The cleanup timer is intentionally NOT\n // tied to the effect lifecycle — if a newer delta arrives first, we still\n // want each prior batch to expire on its own schedule.\n useEffect(() => {\n const result = deltaQuery.data;\n if (!result) return;\n queryClient.setQueryData<InfiniteData<TracesPageResponse>>(tracesQueryKey, old =>\n mergeDeltaIntoPage0(old, result, listMode),\n );\n\n const newRows =\n listMode === 'branches' && 'branches' in result\n ? (result.branches ?? [])\n : 'spans' in result\n ? (result.spans ?? [])\n : [];\n if (newRows.length === 0) return;\n const keys = newRows.map(r => `${r.traceId}:${r.spanId ?? ''}`);\n setRecentlyAddedKeys(prev => {\n const next = new Set(prev);\n for (const k of keys) next.add(k);\n return next;\n });\n setTimeout(() => {\n setRecentlyAddedKeys(prev => {\n const next = new Set(prev);\n for (const k of keys) next.delete(k);\n return next;\n });\n }, deltaHighlightMs);\n // tracesQueryKey is a new array each render but its contents drive cache keying;\n // depending on its members (listMode/filters) is enough.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [deltaQuery.data, queryClient, listMode, filters, deltaHighlightMs]);\n\n // A 501 means the server is too old (or store doesn't support delta) — pin\n // 'unsupported' so the delta query disables and page-mode polling resumes.\n useEffect(() => {\n if (isHttp501(deltaQuery.error)) {\n deltaSupportByClient.set(client, 'unsupported');\n setDeltaSupport('unsupported');\n }\n }, [deltaQuery.error, client]);\n\n // Periodic page-0 refresh to surface status updates on visible rows\n // (running → success/error). Only runs while delta is the primary polling\n // mechanism; otherwise the infinite query's own refetchInterval covers it.\n const statusRefreshQuery = useQuery({\n queryKey: ['traces-status-refresh', listMode, filters] as const,\n queryFn: () =>\n fetchTracesFn({\n client,\n page: 0,\n perPage: TRACES_PER_PAGE,\n filters,\n listMode,\n }),\n enabled: !!cursor && !deltaUnsupported && autoRefetch,\n refetchInterval: page0StatusRefreshIntervalMs,\n refetchOnMount: false,\n retry: false,\n });\n\n useEffect(() => {\n const result = statusRefreshQuery.data;\n if (!result) return;\n queryClient.setQueryData<InfiniteData<TracesPageResponse>>(tracesQueryKey, old =>\n refreshPage0Rows(old, result, listMode),\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [statusRefreshQuery.data, queryClient, listMode, filters]);\n\n // Idle guard: when the tab returns from being hidden, check how long it's\n // been since the last successful poll. If past the threshold, reset the\n // infinite query so page 0 refetches and the cursor is re-seeded.\n const lastSuccessAtRef = useRef(0);\n useEffect(() => {\n const ts = Math.max(query.dataUpdatedAt, deltaQuery.dataUpdatedAt, statusRefreshQuery.dataUpdatedAt);\n if (ts > lastSuccessAtRef.current) {\n lastSuccessAtRef.current = ts;\n }\n }, [query.dataUpdatedAt, deltaQuery.dataUpdatedAt, statusRefreshQuery.dataUpdatedAt]);\n\n // Track autoRefetch in a ref so the visibility listener (attached once)\n // reads the current value without needing to re-attach.\n const autoRefetchRef = useRef(autoRefetch);\n useEffect(() => {\n autoRefetchRef.current = autoRefetch;\n }, [autoRefetch]);\n\n useEffect(() => {\n const handler = () => {\n if (document.visibilityState !== 'visible') return;\n if (!autoRefetchRef.current) return;\n if (!shouldResetAfterIdle(lastSuccessAtRef.current, Date.now(), idleGuardThresholdMs)) return;\n void queryClient.resetQueries({ queryKey: ['traces', listMode, filters] });\n };\n document.addEventListener('visibilitychange', handler);\n return () => document.removeEventListener('visibilitychange', handler);\n }, [queryClient, listMode, filters, idleGuardThresholdMs]);\n\n const { hasNextPage, isFetchingNextPage, fetchNextPage } = query;\n\n useEffect(() => {\n if (isEndOfListInView && hasNextPage && !isFetchingNextPage) {\n void fetchNextPage();\n }\n }, [isEndOfListInView, hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n // `isRefetching` aggregates every active fetch — page-mode (initial, next\n // page, manual resync, idle reset), the 60s page-0 status refresh, AND the\n // delta polls — so a spinner bound to it acts as a heartbeat indicator.\n //\n // Short polls (e.g. delta on localhost) can resolve in tens of ms — too\n // brief for `animate-spin` (1s/rotation) to register visually, and quick\n // enough that React may batch the start/finish transitions so we never\n // even observe `isFetching: true`. So we also watch every query's\n // data/errorUpdatedAt; any advance pulses `isRefetching` true for at least\n // minRefetchSpinMs, which is ~144° of rotation — clearly perceptible.\n const isFetchingAny = query.isFetching || statusRefreshQuery.isFetching || deltaQuery.isFetching;\n const lastActivityAt = Math.max(\n query.dataUpdatedAt,\n query.errorUpdatedAt,\n deltaQuery.dataUpdatedAt,\n deltaQuery.errorUpdatedAt,\n statusRefreshQuery.dataUpdatedAt,\n statusRefreshQuery.errorUpdatedAt,\n );\n const [pulse, setPulse] = useState(false);\n const prevActivityAtRef = useRef(lastActivityAt);\n useEffect(() => {\n if (lastActivityAt > prevActivityAtRef.current) {\n prevActivityAtRef.current = lastActivityAt;\n setPulse(true);\n const t = setTimeout(() => setPulse(false), minRefetchSpinMs);\n return () => clearTimeout(t);\n }\n }, [lastActivityAt, minRefetchSpinMs]);\n const isRefetching = isFetchingAny || pulse;\n\n return {\n ...query,\n setEndOfListElement,\n isRefetching,\n autoRefetch,\n setAutoRefetch,\n recentlyAddedKeys,\n };\n};\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\n\nexport const useTags = () => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['observability-tags'],\n queryFn: async () => {\n try {\n return await client.getTags();\n } catch {\n // Storage provider may not support tag discovery (e.g. LibSQL)\n return { tags: [] };\n }\n },\n select: data => data?.tags ?? [],\n retry: false,\n });\n};\n","import type { EntityType } from '@mastra/core/observability';\nimport { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { ROOT_ENTITY_TYPE_OPTIONS } from '@/domains/traces/trace-filters';\n\ntype UseEntityNamesOptions = {\n entityType?: EntityType;\n rootOnly?: boolean;\n};\n\nexport const useEntityNames = ({ entityType, rootOnly = false }: UseEntityNamesOptions = {}) => {\n const client = useMastraClient();\n\n // Mirror the queryFn branches so the cache key reflects what the server\n // actually returns. rootOnly only matters when entityType is not set; when\n // entityType is set, the query ignores rootOnly entirely.\n const queryKey = entityType\n ? ['observability-entity-names', 'by-type', entityType]\n : ['observability-entity-names', 'all', rootOnly ? 'root-only' : 'all-types'];\n\n return useQuery({\n queryKey,\n queryFn: async () => {\n try {\n if (entityType) {\n return await client.getEntityNames({ entityType });\n }\n\n if (!rootOnly) {\n return await client.getEntityNames();\n }\n\n const responses = await Promise.all(\n ROOT_ENTITY_TYPE_OPTIONS.map(option => client.getEntityNames({ entityType: option.entityType })),\n );\n\n return {\n names: Array.from(new Set(responses.flatMap(response => response?.names ?? []))).sort(),\n };\n } catch {\n return { names: [] };\n }\n },\n select: data => data?.names ?? [],\n retry: false,\n });\n};\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\n\nexport const useEnvironments = () => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['observability-environments'],\n queryFn: async () => {\n try {\n return await client.getEnvironments();\n } catch {\n return { environments: [] };\n }\n },\n select: data => data?.environments ?? [],\n retry: false,\n });\n};\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\n\nexport const useServiceNames = () => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['observability-service-names'],\n queryFn: async () => {\n try {\n return await client.getServiceNames();\n } catch {\n return { serviceNames: [] };\n }\n },\n select: data => data?.serviceNames ?? [],\n retry: false,\n });\n};\n","import type { LightSpanRecord } from '@mastra/core/storage';\nimport { useMemo } from 'react';\nimport { formatHierarchicalSpans } from '../components/format-hierarchical-spans';\nimport { getAllSpanIds } from './get-all-span-ids';\n\n/**\n * Derives previous/next span navigation handlers from a trace's lightweight spans.\n * Returns undefined for handlers that are out of bounds so the consumer can render disabled UI.\n */\nexport function useTraceSpanNavigation(\n lightSpans: LightSpanRecord[] | undefined,\n featuredSpanId: string | null | undefined,\n onSpanChange: (spanId: string) => void,\n) {\n const timelineSpanIds = useMemo(() => getAllSpanIds(formatHierarchicalSpans(lightSpans ?? [])), [lightSpans]);\n\n const featuredSpanIdx = featuredSpanId ? timelineSpanIds.indexOf(featuredSpanId) : -1;\n\n const handlePreviousSpan = featuredSpanIdx > 0 ? () => onSpanChange(timelineSpanIds[featuredSpanIdx - 1]) : undefined;\n\n const handleNextSpan =\n featuredSpanIdx >= 0 && featuredSpanIdx < timelineSpanIds.length - 1\n ? () => onSpanChange(timelineSpanIds[featuredSpanIdx + 1])\n : undefined;\n\n return { handlePreviousSpan, handleNextSpan, timelineSpanIds };\n}\n","import { useMemo } from 'react';\n\n/**\n * Derives previous/next *trace* navigation handlers from the current traces list and the featured\n * row. Returns undefined for handlers that are out of bounds so the consumer can render\n * disabled UI. Mirrors the shape of `useTraceSpanNavigation`.\n *\n * In branches mode rows share a `traceId`, so the consumer can pass a `featuredSpanId` to\n * disambiguate the active row (and receive the new row's `spanId` on prev/next). In traces\n * mode `featuredSpanId` should be null/undefined; only the `traceId` is used.\n */\nexport function useTraceListNavigation<T extends { traceId: string; spanId?: string | null }>(\n traces: T[],\n featuredTraceId: string | undefined,\n featuredSpanId: string | null | undefined,\n onTraceChange: (traceId: string, spanId?: string) => void,\n): {\n featuredTraceIdx: number;\n handlePreviousTrace: (() => void) | undefined;\n handleNextTrace: (() => void) | undefined;\n} {\n const featuredTraceIdx = useMemo(\n () =>\n featuredTraceId\n ? traces.findIndex(\n t => t.traceId === featuredTraceId && (featuredSpanId == null || t.spanId === featuredSpanId),\n )\n : -1,\n [traces, featuredTraceId, featuredSpanId],\n );\n\n // Only forward a spanId on nav when the consumer indicated it's part of the row identity\n // (branches mode). In traces mode `featuredSpanId` is null, so prev/next just sets the new\n // `traceId` and the consumer's handler clears any stale spanId from the URL.\n const passSpanId = featuredSpanId != null;\n const navigateTo = (row: T) => onTraceChange(row.traceId, passSpanId ? (row.spanId ?? undefined) : undefined);\n\n const handlePreviousTrace = featuredTraceIdx > 0 ? () => navigateTo(traces[featuredTraceIdx - 1]) : undefined;\n\n const handleNextTrace =\n featuredTraceIdx >= 0 && featuredTraceIdx < traces.length - 1\n ? () => navigateTo(traces[featuredTraceIdx + 1])\n : undefined;\n\n return { featuredTraceIdx, handlePreviousTrace, handleNextTrace };\n}\n","import { useCallback, useMemo, useRef } from 'react';\nimport type { SpanTab, TraceDatePreset } from '../index';\nimport {\n ROOT_ENTITY_TYPE_OPTIONS,\n TRACE_ANCHOR_SPAN_ID_PARAM,\n TRACE_DATE_FROM_PARAM,\n TRACE_DATE_PRESET_PARAM,\n TRACE_DATE_PRESET_VALUES,\n TRACE_DATE_TO_PARAM,\n TRACE_PROPERTY_FILTER_FIELD_IDS,\n TRACE_LIST_MODE_PARAM,\n TRACE_LIST_MODE_VALUES,\n TRACE_PROPERTY_FILTER_PARAM_BY_FIELD,\n TRACE_ROOT_ENTITY_TYPE_PARAM,\n TRACE_STATUS_PARAM,\n TRACE_STATUS_VALUES,\n applyTracePropertyFilterTokens,\n getTracePropertyFilterTokens,\n} from '../trace-filters';\nimport type { EntityOptions, TraceListMode, TraceStatusFilter } from '../trace-filters';\nimport type { PropertyFilterToken } from '@/ds/components/PropertyFilter/types';\n\nconst TRACE_ID_PARAM = 'traceId';\nconst SPAN_ID_PARAM = 'spanId';\nconst TAB_PARAM = 'tab';\nconst SCORE_ID_PARAM = 'scoreId';\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\nconst PRESET_MS: Partial<Record<TraceDatePreset, number>> = {\n 'last-24h': DAY_MS,\n 'last-3d': 3 * DAY_MS,\n 'last-7d': 7 * DAY_MS,\n 'last-14d': 14 * DAY_MS,\n 'last-30d': 30 * DAY_MS,\n};\n\n/** Mutates `params` in place to drop the featured trace/span/tab/score selection.\n * Used whenever a filter changes — selection no longer makes sense in the new result set. */\nfunction clearSelectionParams(params: URLSearchParams) {\n params.delete(TRACE_ID_PARAM);\n params.delete(SPAN_ID_PARAM);\n params.delete(TRACE_ANCHOR_SPAN_ID_PARAM);\n params.delete(TAB_PARAM);\n params.delete(SCORE_ID_PARAM);\n}\n\n/** Minimal interface compatible with react-router's `setSearchParams`. */\nexport type SetURLSearchParamsLike = (\n next: URLSearchParams | ((prev: URLSearchParams) => URLSearchParams),\n options?: { replace?: boolean; preventScrollReset?: boolean; state?: unknown },\n) => void;\n\nexport interface UseTraceUrlStateOptions {\n /** Called after `handleRemoveAll` clears all filter URL params. Use this to reset page-local\n * UI state (e.g. a \"group by thread\" toggle) without wrapping the handler. */\n onRemoveAll?: () => void;\n}\n\nexport interface UseTraceUrlStateResult {\n // Raw search params passed through for convenience\n searchParams: URLSearchParams;\n setSearchParams: SetURLSearchParamsLike;\n\n // Date state (derived from URL)\n datePreset: TraceDatePreset;\n selectedDateFrom: Date | undefined;\n selectedDateTo: Date | undefined;\n /** Synchronously-updated ref of the latest preset. Used to ignore onDateChange callbacks\n * the date picker fires after a non-custom preset switch. */\n datePresetRef: React.MutableRefObject<TraceDatePreset>;\n\n // Selection state (derived from URL)\n traceIdParam: string | undefined;\n spanIdParam: string | undefined;\n /** Branch-mode only: the anchor span that defines the displayed subtree. Stable while the\n * user navigates between spans inside the panel (which only changes `spanIdParam`). */\n anchorSpanIdParam: string | undefined;\n spanTabParam: SpanTab | undefined;\n scoreIdParam: string | undefined;\n\n // Filter state (derived from URL)\n listMode: TraceListMode;\n selectedEntityOption: EntityOptions | undefined;\n selectedStatus: TraceStatusFilter | undefined;\n filterTokens: PropertyFilterToken[];\n\n // URL-modifying handlers\n /**\n * Selects a row. In traces mode pass just `traceId` (and optionally a `spanId` for an\n * initial span selection in the panel). In branches mode also pass `anchorSpanId` — the\n * branch identity, kept stable while the user navigates between spans inside the panel.\n * Branch rows are identified by (traceId, anchorSpanId); trace rows by traceId alone.\n */\n handleTraceClick: (traceId: string, spanId?: string, anchorSpanId?: string) => void;\n /** Convenience: clears the featured trace selection. Equivalent to `handleTraceClick('')`. */\n handleTraceClose: () => void;\n handleSpanChange: (spanId: string | null) => void;\n /** Convenience: clears the featured span selection. Equivalent to `handleSpanChange(null)`. */\n handleSpanClose: () => void;\n handleSpanTabChange: (tab: SpanTab) => void;\n /** Selects a span AND switches its panel tab in a single URL update. Use when both must change\n * from one interaction (e.g. \"Evaluate Trace\"). Calling `handleSpanChange` + `handleSpanTabChange`\n * separately races: each functional `setSearchParams` updater reads the same pre-update\n * `searchParams` snapshot, so the second navigation overwrites the first (last write wins) and one\n * of the two changes is lost on the first click. */\n handleSpanChangeWithTab: (spanId: string, tab: SpanTab) => void;\n handleScoreChange: (scoreId: string | null) => void;\n /** Switches the list view between traces and branches. Clears the current selection. */\n handleListModeChange: (mode: TraceListMode) => void;\n handleFilterTokensChange: (nextTokens: PropertyFilterToken[]) => void;\n handleDateChange: (value: Date | undefined, type: 'from' | 'to') => void;\n handleDatePresetChange: (preset: TraceDatePreset) => void;\n handleRemoveAll: () => void;\n\n /** Lower-level helper used by `handleClear`: writes a token set and clears the trace/span selection. */\n applyFilterTokens: (tokens: PropertyFilterToken[]) => void;\n}\n\n/**\n * Owns all URL-derived state and URL-modifying handlers for the traces page. Routing-agnostic —\n * pass `searchParams` and `setSearchParams` from whichever router the consumer uses.\n *\n * Stays focused on URL state: localStorage save/restore, filter discovery, and the error-view\n * short-circuit are intentionally NOT part of this hook so consumers can swap them independently.\n */\nexport function useTraceUrlState(\n searchParams: URLSearchParams,\n setSearchParams: SetURLSearchParamsLike,\n options?: UseTraceUrlStateOptions,\n): UseTraceUrlStateResult {\n const { onRemoveAll } = options ?? {};\n const datePreset = useMemo<TraceDatePreset>(() => {\n const value = searchParams.get(TRACE_DATE_PRESET_PARAM);\n return value && TRACE_DATE_PRESET_VALUES.has(value as TraceDatePreset) ? (value as TraceDatePreset) : 'last-24h';\n }, [searchParams]);\n\n const dateFromParamRaw = searchParams.get(TRACE_DATE_FROM_PARAM);\n const dateToParamRaw = searchParams.get(TRACE_DATE_TO_PARAM);\n\n const selectedDateFrom = useMemo(() => {\n if (datePreset === 'custom') {\n if (!dateFromParamRaw) return undefined;\n const parsed = new Date(dateFromParamRaw);\n return Number.isNaN(parsed.getTime()) ? undefined : parsed;\n }\n if (datePreset === 'all') return undefined;\n const ms = PRESET_MS[datePreset];\n return ms ? new Date(Date.now() - ms) : undefined;\n }, [datePreset, dateFromParamRaw]);\n\n const selectedDateTo = useMemo(() => {\n if (datePreset !== 'custom' || !dateToParamRaw) return undefined;\n const parsed = new Date(dateToParamRaw);\n return Number.isNaN(parsed.getTime()) ? undefined : parsed;\n }, [datePreset, dateToParamRaw]);\n\n // Track the latest preset synchronously so onDateChange callbacks that follow\n // a non-custom preset switch can be ignored (router setSearchParams captures\n // searchParams in its closure, so multiple synchronous calls would otherwise\n // clobber each other).\n const datePresetRef = useRef(datePreset);\n datePresetRef.current = datePreset;\n\n const traceIdParam = searchParams.get(TRACE_ID_PARAM) || undefined;\n const spanIdParam = searchParams.get(SPAN_ID_PARAM) || undefined;\n /** Branch-mode only: identifies which branch (anchor span) the panel is viewing. Stays put\n * while the user navigates between spans inside the panel (which only changes spanIdParam). */\n const anchorSpanIdParam = searchParams.get(TRACE_ANCHOR_SPAN_ID_PARAM) || undefined;\n const tabParam = searchParams.get(TAB_PARAM);\n const spanTabParam: SpanTab | undefined =\n tabParam === 'scoring'\n ? 'scoring'\n : tabParam === 'feedback'\n ? 'feedback'\n : tabParam === 'details'\n ? 'details'\n : undefined;\n const scoreIdParam = searchParams.get(SCORE_ID_PARAM) || undefined;\n\n const listMode = useMemo<TraceListMode>(() => {\n const value = searchParams.get(TRACE_LIST_MODE_PARAM);\n return value && TRACE_LIST_MODE_VALUES.has(value as TraceListMode) ? (value as TraceListMode) : 'traces';\n }, [searchParams]);\n const selectedEntityOption = useMemo(\n () => ROOT_ENTITY_TYPE_OPTIONS.find(option => option.entityType === searchParams.get(TRACE_ROOT_ENTITY_TYPE_PARAM)),\n [searchParams],\n );\n const selectedStatus = useMemo<TraceStatusFilter | undefined>(() => {\n const value = searchParams.get(TRACE_STATUS_PARAM);\n return value && TRACE_STATUS_VALUES.has(value as TraceStatusFilter) ? (value as TraceStatusFilter) : undefined;\n }, [searchParams]);\n const filterTokens = useMemo(() => getTracePropertyFilterTokens(searchParams), [searchParams]);\n\n const handleTraceClick = useCallback(\n (traceId: string, spanId?: string, anchorSpanId?: string) => {\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n if (traceId) {\n next.set(TRACE_ID_PARAM, traceId);\n } else {\n next.delete(TRACE_ID_PARAM);\n }\n if (spanId) {\n next.set(SPAN_ID_PARAM, spanId);\n } else {\n next.delete(SPAN_ID_PARAM);\n }\n if (anchorSpanId) {\n next.set(TRACE_ANCHOR_SPAN_ID_PARAM, anchorSpanId);\n } else {\n next.delete(TRACE_ANCHOR_SPAN_ID_PARAM);\n }\n next.delete(TAB_PARAM);\n next.delete(SCORE_ID_PARAM);\n return next;\n },\n { replace: true },\n );\n },\n [setSearchParams],\n );\n\n const handleTraceClose = useCallback(() => handleTraceClick(''), [handleTraceClick]);\n\n const handleSpanChange = useCallback(\n (spanId: string | null) => {\n const currentSpanId = searchParams.get(SPAN_ID_PARAM) || null;\n if (spanId === currentSpanId) return;\n\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n if (spanId) {\n next.set(SPAN_ID_PARAM, spanId);\n } else {\n next.delete(SPAN_ID_PARAM);\n }\n // Tab + score are per-span; they'd point at the previous span's context otherwise.\n next.delete(TAB_PARAM);\n next.delete(SCORE_ID_PARAM);\n return next;\n },\n { replace: true },\n );\n },\n [searchParams, setSearchParams],\n );\n\n const handleSpanClose = useCallback(() => handleSpanChange(null), [handleSpanChange]);\n\n const handleSpanTabChange = useCallback(\n (tab: SpanTab) => {\n const currentTab = searchParams.get(TAB_PARAM) || null;\n if (tab === currentTab) return;\n\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n if (tab && tab !== 'details') {\n next.set(TAB_PARAM, tab);\n } else {\n next.delete(TAB_PARAM);\n }\n next.delete(SCORE_ID_PARAM);\n return next;\n },\n { replace: true },\n );\n },\n [searchParams, setSearchParams],\n );\n\n const handleSpanChangeWithTab = useCallback(\n (spanId: string, tab: SpanTab) => {\n const nextTab = tab && tab !== 'details' ? tab : null;\n // No-op guard (same pattern as the sibling handlers): skip the navigation only when span,\n // tab AND score are already exactly what this call would produce.\n const isNoOp =\n spanId === (searchParams.get(SPAN_ID_PARAM) || null) &&\n nextTab === (searchParams.get(TAB_PARAM) || null) &&\n !searchParams.get(SCORE_ID_PARAM);\n if (isNoOp) return;\n\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n next.set(SPAN_ID_PARAM, spanId);\n if (nextTab) {\n next.set(TAB_PARAM, nextTab);\n } else {\n next.delete(TAB_PARAM);\n }\n next.delete(SCORE_ID_PARAM);\n return next;\n },\n { replace: true },\n );\n },\n [searchParams, setSearchParams],\n );\n\n const handleScoreChange = useCallback(\n (scoreId: string | null) => {\n const currentScoreId = searchParams.get(SCORE_ID_PARAM) || null;\n if (scoreId === currentScoreId) return;\n\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n if (scoreId) {\n next.set(SCORE_ID_PARAM, scoreId);\n } else {\n next.delete(SCORE_ID_PARAM);\n }\n return next;\n },\n { replace: true },\n );\n },\n [searchParams, setSearchParams],\n );\n\n const applyFilterTokens = useCallback(\n (tokens: PropertyFilterToken[]) => {\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n // applyTracePropertyFilterTokens wipes all filter params (including\n // rootEntityType / status) and re-adds them in `nextTokens` order so\n // URL insertion order == filter creation order.\n applyTracePropertyFilterTokens(next, tokens);\n clearSelectionParams(next);\n return next;\n },\n { replace: true },\n );\n },\n [setSearchParams],\n );\n\n const handleFilterTokensChange = applyFilterTokens;\n\n // Only relevant for 'custom' — the picker also fires onDateChange after a\n // non-custom preset switch, which we ignore to avoid racing URL updates.\n const handleDateChange = useCallback(\n (value: Date | undefined, type: 'from' | 'to') => {\n if (datePresetRef.current !== 'custom') return;\n const param = type === 'from' ? TRACE_DATE_FROM_PARAM : TRACE_DATE_TO_PARAM;\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n if (value) {\n next.set(param, value.toISOString());\n } else {\n next.delete(param);\n }\n clearSelectionParams(next);\n return next;\n },\n { replace: true },\n );\n },\n [setSearchParams],\n );\n\n const handleDatePresetChange = useCallback(\n (preset: TraceDatePreset) => {\n // Update ref synchronously so any onDateChange fired by the picker in the\n // same tick (for non-custom presets) sees the new value and skips.\n datePresetRef.current = preset;\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n if (preset === 'last-24h') {\n // Default — clear all date params.\n next.delete(TRACE_DATE_PRESET_PARAM);\n next.delete(TRACE_DATE_FROM_PARAM);\n next.delete(TRACE_DATE_TO_PARAM);\n } else if (preset === 'custom') {\n next.set(TRACE_DATE_PRESET_PARAM, 'custom');\n // Keep existing dateFrom/dateTo for the user to adjust.\n } else {\n // `last-*` or 'all' — only the preset is stored; dates are derived.\n next.set(TRACE_DATE_PRESET_PARAM, preset);\n next.delete(TRACE_DATE_FROM_PARAM);\n next.delete(TRACE_DATE_TO_PARAM);\n }\n clearSelectionParams(next);\n return next;\n },\n { replace: true },\n );\n },\n [setSearchParams],\n );\n\n const handleListModeChange = useCallback(\n (mode: TraceListMode) => {\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n if (mode === 'traces') {\n next.delete(TRACE_LIST_MODE_PARAM);\n } else {\n next.set(TRACE_LIST_MODE_PARAM, mode);\n }\n // Clear selection: rows from the previous mode don't map cleanly to the new mode.\n clearSelectionParams(next);\n return next;\n },\n { replace: true },\n );\n },\n [setSearchParams],\n );\n\n const handleRemoveAll = useCallback(() => {\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n next.delete(TRACE_LIST_MODE_PARAM);\n next.delete(TRACE_ROOT_ENTITY_TYPE_PARAM);\n next.delete(TRACE_STATUS_PARAM);\n for (const fieldId of TRACE_PROPERTY_FILTER_FIELD_IDS) {\n next.delete(TRACE_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId]);\n }\n clearSelectionParams(next);\n return next;\n },\n { replace: true },\n );\n onRemoveAll?.();\n }, [setSearchParams, onRemoveAll]);\n\n return {\n searchParams,\n setSearchParams,\n datePreset,\n selectedDateFrom,\n selectedDateTo,\n datePresetRef,\n traceIdParam,\n spanIdParam,\n anchorSpanIdParam,\n spanTabParam,\n scoreIdParam,\n listMode,\n selectedEntityOption,\n selectedStatus,\n filterTokens,\n handleTraceClick,\n handleTraceClose,\n handleSpanChange,\n handleSpanClose,\n handleSpanTabChange,\n handleSpanChangeWithTab,\n handleScoreChange,\n handleListModeChange,\n handleFilterTokensChange,\n handleDateChange,\n handleDatePresetChange,\n handleRemoveAll,\n applyFilterTokens,\n };\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n clearSavedTraceFilters,\n hasAnyTraceFilterParams,\n loadTraceFiltersFromStorage,\n saveTraceFiltersToStorage,\n} from '../trace-filters';\nimport type { SetURLSearchParamsLike } from './use-trace-url-state';\nimport { toast } from '@/lib/toast';\n\nconst DEFAULT_SAVED_MESSAGE = 'Trace filter settings saved.';\nconst DEFAULT_CLEARED_MESSAGE = 'Trace filter settings cleared.';\n\nexport interface TraceFilterPersistenceOptions {\n /** Override the localStorage key. Default: traces filters storage. */\n storageKey?: string;\n /** Toast text overrides; pass `false` to suppress the toast entirely. */\n messages?: {\n saved?: string | false;\n cleared?: string | false;\n };\n /** Skip the once-on-mount hydration from localStorage. Default: false (hydration runs). */\n skipHydration?: boolean;\n}\n\nexport interface UseTraceFilterPersistenceResult {\n /** True when localStorage has a previously saved filter set. */\n hasSavedFilters: boolean;\n /** Persist the current URL filter params to localStorage. */\n handleSave: () => void;\n /** Forget the saved filter set. */\n handleRemoveSaved: () => void;\n}\n\n/**\n * Owns the localStorage save/restore lifecycle for trace filters:\n * - tracks `hasSavedFilters`\n * - exposes `handleSave` / `handleRemoveSaved` (with toast feedback)\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 *\n * Pass `storageKey` to scope persistence (e.g. per-project). Pass `messages.{saved,cleared} = false`\n * to suppress the toast.\n */\nexport function useTraceFilterPersistence(\n searchParams: URLSearchParams,\n setSearchParams: SetURLSearchParamsLike,\n options?: TraceFilterPersistenceOptions,\n): UseTraceFilterPersistenceResult {\n const { storageKey, messages, skipHydration } = options ?? {};\n\n const [hasSavedFilters, setHasSavedFilters] = useState(() => loadTraceFiltersFromStorage(storageKey) !== null);\n\n const handleSave = useCallback(() => {\n saveTraceFiltersToStorage(searchParams, storageKey);\n setHasSavedFilters(true);\n const text = messages?.saved ?? DEFAULT_SAVED_MESSAGE;\n if (text !== false) toast.success(text);\n }, [searchParams, storageKey, messages?.saved]);\n\n const handleRemoveSaved = useCallback(() => {\n clearSavedTraceFilters(storageKey);\n setHasSavedFilters(false);\n const text = messages?.cleared ?? DEFAULT_CLEARED_MESSAGE;\n if (text !== false) toast.success(text);\n }, [storageKey, messages?.cleared]);\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 return { hasSavedFilters, handleSave, handleRemoveSaved };\n}\n","import type { EntityType } from '@mastra/core/observability';\nimport type { ReactNode } from 'react';\n\nexport type UISpan = {\n id: string;\n name: string;\n type: string;\n latency: number;\n startTime: string;\n endTime?: string;\n spans?: UISpan[];\n parentSpanId?: string | null;\n};\n\nexport type UISpanStyle = {\n icon?: ReactNode;\n color?: string;\n label?: string;\n typePrefix: string;\n};\n\n// -- Trace filtering types ----------------------------------------------------\n\nexport type EntityOptions =\n | { value: string; label: string; type: EntityType.AGENT }\n | { value: string; label: string; type: EntityType.WORKFLOW_RUN }\n | { value: string; label: string; type: 'all' };\n\nexport type TraceDatePreset = 'all' | 'last-24h' | 'last-3d' | 'last-7d' | 'last-14d' | 'last-30d' | 'custom';\n\n/** Canonical list of context field IDs used for trace filtering and value extraction */\nexport const CONTEXT_FIELD_IDS = [\n 'environment',\n 'serviceName',\n 'source',\n 'scope',\n 'userId',\n 'organizationId',\n 'resourceId',\n 'runId',\n 'sessionId',\n 'threadId',\n 'requestId',\n 'experimentId',\n 'spanType',\n 'entityName',\n 'parentEntityType',\n 'parentEntityId',\n 'parentEntityName',\n 'rootEntityType',\n 'rootEntityId',\n 'rootEntityName',\n] as const;\n","import { format } from 'date-fns';\nimport { ArrowDownIcon, ArrowRightIcon, ArrowUpIcon, ChevronsDownUpIcon, ChevronsUpDownIcon } from 'lucide-react';\nimport { Fragment, useState } from 'react';\nimport type { LogRecord } from '../types';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { DataDetailsPanel } from '@/ds/components/DataDetailsPanel';\nimport { cn } from '@/lib/utils';\n\nconst KV = DataDetailsPanel.KeyValueList;\n\nfunction toDate(value: Date | string): Date {\n return value instanceof Date ? value : new Date(value);\n}\n\nexport interface LogDetailsViewProps {\n log: LogRecord;\n onClose: () => void;\n onTraceClick?: (traceId: string) => void;\n onSpanClick?: (traceId: string, spanId: string) => void;\n onPrevious?: () => void;\n onNext?: () => void;\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n}\n\nexport function LogDetailsView({\n log,\n onClose,\n onTraceClick,\n onSpanClick,\n onPrevious,\n onNext,\n collapsed: controlledCollapsed,\n onCollapsedChange,\n}: LogDetailsViewProps) {\n const [internalCollapsed, setInternalCollapsed] = useState(false);\n const collapsed = controlledCollapsed ?? internalCollapsed;\n const setCollapsed = onCollapsedChange ?? setInternalCollapsed;\n const date = toDate(log.timestamp);\n\n return (\n <DataDetailsPanel collapsed={collapsed}>\n <DataDetailsPanel.Header>\n <DataDetailsPanel.Heading>\n Log <b>{format(date, 'MMM dd, HH:mm:ss.SSS')}</b>\n </DataDetailsPanel.Heading>\n <ButtonsGroup className=\"ml-auto shrink-0\">\n {onCollapsedChange && (\n <Button\n size=\"md\"\n tooltip={collapsed ? 'Expand panel' : 'Collapse panel'}\n onClick={() => setCollapsed(!collapsed)}\n >\n {collapsed ? <ChevronsUpDownIcon /> : <ChevronsDownUpIcon />}\n </Button>\n )}\n\n <ButtonsGroup spacing=\"close\">\n <Button size=\"md\" tooltip=\"Previous log\" onClick={onPrevious} disabled={!onPrevious}>\n <ArrowUpIcon />\n </Button>\n <Button size=\"md\" tooltip=\"Next log\" onClick={onNext} disabled={!onNext}>\n <ArrowDownIcon />\n </Button>\n </ButtonsGroup>\n\n <DataDetailsPanel.CloseButton onClick={onClose} />\n </ButtonsGroup>\n </DataDetailsPanel.Header>\n\n {!collapsed && (\n <DataDetailsPanel.Content>\n <p className=\"text-ui-md text-neutral4 font-mono wrap-break-word whitespace-pre-wrap\">{log.message}</p>\n\n {(log.traceId || log.spanId) && (\n <div className={cn('grid gap-2 my-8', '[&>button]:justify-between [&>button]:overflow-hidden')}>\n {log.traceId && (\n <ButtonsGroup spacing=\"close\" className=\"min-w-0 w-full\">\n <Button\n size=\"md\"\n className=\"min-w-0 flex-1 overflow-hidden\"\n onClick={() => onTraceClick?.(log.traceId!)}\n >\n <ArrowRightIcon />\n <span>Trace</span>\n <span className=\" ml-auto text-ui-sm text-neutral2 min-w-0 truncate\"># {log.traceId}</span>\n </Button>\n <CopyButton content={log.traceId!} size=\"md\" tooltip=\"Copy Trace ID to clipboard\" />\n </ButtonsGroup>\n )}\n {log.spanId && (\n <ButtonsGroup spacing=\"close\" className=\"min-w-0 w-full\">\n <Button\n size=\"md\"\n className=\"min-w-0 flex-1 overflow-hidden\"\n disabled={!log.traceId || !onSpanClick}\n onClick={() => log.traceId && onSpanClick?.(log.traceId, log.spanId!)}\n >\n <ArrowRightIcon />\n <span>Span</span>\n <span className=\" ml-auto text-ui-sm text-neutral2 min-w-0 truncate\"># {log.spanId}</span>\n </Button>\n <CopyButton content={log.spanId!} size=\"md\" tooltip=\"Copy Span ID to clipboard\" />\n </ButtonsGroup>\n )}\n </div>\n )}\n\n <KV className=\"mb-6\">\n {log.entityType && (\n <>\n <KV.Key>Entity Type</KV.Key>\n <KV.Value>{log.entityType}</KV.Value>\n </>\n )}\n {log.entityName && (\n <>\n <KV.Key>Entity Name</KV.Key>\n <KV.Value>{log.entityName}</KV.Value>\n </>\n )}\n {log.serviceName && (\n <>\n <KV.Key>Service</KV.Key>\n <KV.Value>{log.serviceName}</KV.Value>\n </>\n )}\n {log.environment && (\n <>\n <KV.Key>Environment</KV.Key>\n <KV.Value>{log.environment}</KV.Value>\n </>\n )}\n {log.source && (\n <>\n <KV.Key>Source</KV.Key>\n <KV.Value>{log.source}</KV.Value>\n </>\n )}\n {log.metadata && Object.keys(log.metadata).length > 0 && (\n <>\n {Object.entries(log.metadata).map(([key, value]) => (\n <Fragment key={key}>\n <KV.Key>{key}</KV.Key>\n <KV.Value>{String(value)}</KV.Value>\n </Fragment>\n ))}\n </>\n )}\n </KV>\n\n {log.data && Object.keys(log.data).length > 0 && (\n <DataDetailsPanel.CodeSection title=\"Data\" codeStr={JSON.stringify(log.data, null, 2)} className=\"mt-6\" />\n )}\n </DataDetailsPanel.Content>\n )}\n </DataDetailsPanel>\n );\n}\n","import { CircleSlashIcon } from 'lucide-react';\nimport { EmptyState } from '@/ds/components/EmptyState';\nimport { ErrorState } from '@/ds/components/ErrorState';\nimport { PermissionDenied } from '@/ds/components/PermissionDenied';\nimport { SessionExpired } from '@/ds/components/SessionExpired';\nimport {\n is401UnauthorizedError,\n is403ForbiddenError,\n isUnsupportedObservabilityOperationError,\n} from '@/lib/query-utils';\n\nexport interface LogsErrorContentProps {\n /** The error from a useLogs query. */\n error: unknown;\n /** Passed to PermissionDenied (usually 'logs'). */\n resource: string;\n /** Title shown on the generic ErrorState fallback. */\n errorTitle: string;\n}\n\n/**\n * Renders the appropriate fallback content for a logs-related query error:\n * `<SessionExpired />` for 401, `<PermissionDenied />` for 403, otherwise `<ErrorState />`.\n * Mirror of `TracesErrorContent` for the logs domain.\n */\nexport function LogsErrorContent({ error, resource, errorTitle }: LogsErrorContentProps) {\n if (is401UnauthorizedError(error)) return <SessionExpired />;\n if (is403ForbiddenError(error)) return <PermissionDenied resource={resource} />;\n if (isUnsupportedObservabilityOperationError(error, 'logs')) {\n return (\n <EmptyState\n iconSlot={<CircleSlashIcon />}\n titleSlot=\"Logs are not available with your current storage\"\n descriptionSlot=\"The configured observability storage provider does not support listing logs. Switch to a storage provider with logs support to view runtime logs in Studio.\"\n />\n );\n }\n const message = error instanceof Error ? error.message : undefined;\n return <ErrorState title={errorTitle} message={message ?? 'Unknown error'} />;\n}\n","import type { ReactNode } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface LogsLayoutProps {\n /** The logs list (left column). */\n listSlot: ReactNode;\n /** The log data panel (right column, top). When null/undefined, the whole right column collapses. */\n logPanelSlot?: ReactNode;\n /** The trace data panel (right column, middle). Only rendered when truthy. */\n tracePanelSlot?: ReactNode;\n /** The span data panel (right column, bottom). Only rendered when truthy. */\n spanPanelSlot?: ReactNode;\n /** When the log panel is collapsed, the right column's grid-rows squash the log row to `auto`. */\n logCollapsed?: boolean;\n}\n\n/**\n * Pure 2-column layout shell for the logs page. Owns no state and fetches no data — pass slots in.\n * Right-column row template adapts based on which panels are present and whether the log panel is\n * collapsed.\n */\nexport function LogsLayout({ listSlot, logPanelSlot, tracePanelSlot, spanPanelSlot, logCollapsed }: LogsLayoutProps) {\n const hasSidePanel = !!logPanelSlot;\n\n return (\n <div\n className={cn('grid h-full min-h-0 gap-4 items-start', hasSidePanel ? 'grid-cols-[1fr_1fr]' : 'grid-cols-[1fr]')}\n >\n {listSlot}\n\n {hasSidePanel && (\n <div\n className={cn(\n 'grid gap-4 h-full overflow-auto',\n tracePanelSlot && spanPanelSlot\n ? logCollapsed\n ? 'grid-rows-[auto_1fr_1fr]'\n : 'grid-rows-[1fr_1fr_1fr]'\n : tracePanelSlot\n ? logCollapsed\n ? 'grid-rows-[auto_1fr]'\n : 'grid-rows-[1fr_1fr]'\n : logCollapsed\n ? 'grid-rows-[auto]'\n : 'grid-rows-[1fr]',\n )}\n >\n {logPanelSlot}\n {tracePanelSlot}\n {spanPanelSlot}\n </div>\n )}\n </div>\n );\n}\n","import { useVirtualizer } from '@tanstack/react-virtual';\nimport { useEffect, useRef } from 'react';\nimport type { LogRecord } from '../types';\nimport { LogsDataList, LogsDataListSkeleton } from '@/ds/components/LogsDataList';\n\n// Fixed widths on non-flex columns prevent track shifts as the virtualizer swaps rows in/out.\nconst COLUMNS = '6rem 9rem 5rem 10rem minmax(8rem,1fr) minmax(8rem,1fr)';\n\nconst ROW_HEIGHT = 36;\nconst OVERSCAN = 8;\n\nexport interface LogsListViewProps {\n logs: LogRecord[];\n isLoading?: boolean;\n isFetchingNextPage?: boolean;\n hasNextPage?: boolean;\n setEndOfListElement?: (element: HTMLDivElement | null) => void;\n /** Stable per-render id for each log — used for React keys and for matching against `featuredLogId`.\n * Build with `useLogsListNavigation`. */\n logIdMap: Map<LogRecord, string>;\n /** Currently featured/selected log — its row gets the highlighted background. */\n featuredLogId?: string | null;\n /** Called when a row is clicked. The current toggle + trace-sync logic is the consumer's call. */\n onLogClick: (log: LogRecord) => void;\n}\n\n/**\n * Virtualized presentational list. Renders only the visible window of logs via\n * TanStack Virtual, sandwiched between top/bottom Spacers that preserve total\n * scroll height. Owns no state and fetches no data.\n */\nexport function LogsListView({\n logs,\n isLoading,\n isFetchingNextPage,\n hasNextPage,\n setEndOfListElement,\n logIdMap,\n featuredLogId,\n onLogClick,\n}: LogsListViewProps) {\n const scrollRef = useRef<HTMLDivElement | null>(null);\n\n const virtualizer = useVirtualizer({\n count: logs.length,\n getScrollElement: () => scrollRef.current,\n estimateSize: () => ROW_HEIGHT,\n overscan: OVERSCAN,\n });\n\n // Reset scroll to top whenever a fresh query resolves (filter / date range change).\n // `isLoading` only flips on initial fetches — `fetchNextPage` keeps it `false`, so this\n // effect doesn't fire during pagination.\n //\n // Why the manual scroll event: when the skeleton-vs-list branch swaps in the new scroll\n // container, it mounts at `scrollTop = 0`. The virtualizer rebinds its listener but\n // doesn't re-read `scrollTop`, so it keeps the stale `scrollOffset` from the previous\n // element. `scrollToOffset(0)` no-ops because the new element is already at 0 (no scroll\n // event fires). Dispatching a synthetic `scroll` forces the virtualizer's handler to\n // read the fresh `scrollTop` and recompute `virtualItems` with `paddingTop = 0`.\n const wasLoadingRef = useRef(isLoading);\n useEffect(() => {\n if (wasLoadingRef.current && !isLoading) {\n scrollRef.current?.dispatchEvent(new Event('scroll'));\n }\n wasLoadingRef.current = isLoading;\n }, [isLoading]);\n\n if (isLoading) {\n return <LogsDataListSkeleton columns={COLUMNS} />;\n }\n\n const virtualItems = virtualizer.getVirtualItems();\n const totalSize = virtualizer.getTotalSize();\n const paddingTop = virtualItems[0]?.start ?? 0;\n const paddingBottom =\n virtualItems.length > 0 ? Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0)) : 0;\n\n return (\n <LogsDataList columns={COLUMNS} variant=\"striped\" scrollRef={scrollRef} className=\"min-w-0\">\n <LogsDataList.Top>\n <LogsDataList.TopCell>Date</LogsDataList.TopCell>\n <LogsDataList.TopCell>Time</LogsDataList.TopCell>\n <LogsDataList.TopCell>Level</LogsDataList.TopCell>\n <LogsDataList.TopCell>Entity</LogsDataList.TopCell>\n <LogsDataList.TopCell>Message</LogsDataList.TopCell>\n <LogsDataList.TopCell>Data</LogsDataList.TopCell>\n </LogsDataList.Top>\n\n {logs.length === 0 ? (\n <LogsDataList.NoMatch message=\"No logs match your search\" />\n ) : (\n <>\n <LogsDataList.Spacer height={paddingTop} />\n {virtualItems.map(vi => {\n const log = logs[vi.index];\n if (!log) return null;\n const id = logIdMap.get(log);\n // Defensive: consumer is expected to build `logIdMap` from the same `logs` list\n // (via `useLogsListNavigation`), but if they drift we'd rather drop the row than\n // ship a missing-key warning and broken selection highlighting.\n if (!id) return null;\n const isFeatured = id === featuredLogId;\n\n return (\n <LogsDataList.RowButton\n key={id}\n ref={virtualizer.measureElement}\n data-index={vi.index}\n onClick={() => onLogClick(log)}\n featured={isFeatured}\n variant={log.level === 'error' || log.level === 'fatal' ? 'error' : 'default'}\n >\n <LogsDataList.DateCell timestamp={log.timestamp} />\n <LogsDataList.TimeCell timestamp={log.timestamp} />\n <LogsDataList.LevelCell level={log.level} />\n <LogsDataList.EntityCell entityType={log.entityType} entityName={log.entityName} />\n <LogsDataList.MessageCell message={log.message} />\n <LogsDataList.DataCell data={log.data} />\n </LogsDataList.RowButton>\n );\n })}\n <LogsDataList.Spacer height={paddingBottom} />\n </>\n )}\n <LogsDataList.NextPageLoading\n isLoading={isFetchingNextPage}\n hasMore={hasNextPage}\n setEndOfListElement={setEndOfListElement}\n />\n </LogsDataList>\n );\n}\n","import { 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\nexport interface LogsToolbarProps {\n onClear?: () => void;\n onRemoveAll?: () => void;\n onSave?: () => void;\n onRemoveSaved?: () => void;\n isLoading?: boolean;\n filterFields: PropertyFilterField[];\n filterTokens: PropertyFilterToken[];\n onFilterTokensChange: (tokens: PropertyFilterToken[]) => void;\n autoFocusFilterFieldId?: string;\n}\n\nexport function LogsToolbar({\n onClear,\n onRemoveAll,\n onSave,\n onRemoveSaved,\n isLoading,\n filterFields,\n filterTokens,\n onFilterTokensChange,\n autoFocusFilterFieldId,\n}: LogsToolbarProps) {\n const hasActiveFilters = filterTokens.length > 0;\n const hasNonDefaultFilter = filterTokens.some(token => isNonDefaultFilter(token, filterFields));\n\n return (\n <div className={cn('grid grid-cols-[1fr_auto] gap-3 items-start')}>\n <PropertyFilterApplied\n fields={filterFields}\n tokens={filterTokens}\n onTokensChange={onFilterTokensChange}\n disabled={isLoading}\n autoFocusFieldId={autoFocusFilterFieldId}\n />\n\n {hasActiveFilters && (\n <PropertyFilterActions\n disabled={isLoading}\n onClear={hasNonDefaultFilter ? onClear : undefined}\n onRemoveAll={onRemoveAll}\n onSave={onSave}\n onRemoveSaved={onRemoveSaved}\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","import { format } from 'date-fns';\nimport { CircleSlashIcon, ExternalLinkIcon } from 'lucide-react';\nimport type { LogsDatePreset } from '../log-filters';\nimport { Button } from '@/ds/components/Button';\nimport { EmptyState } from '@/ds/components/EmptyState';\n\nconst PRESET_LABELS: Record<Exclude<LogsDatePreset, 'all' | 'custom'>, string> = {\n 'last-24h': 'the last 24 hours',\n 'last-3d': 'the last 3 days',\n 'last-7d': 'the last 7 days',\n 'last-14d': 'the last 14 days',\n 'last-30d': 'the last 30 days',\n};\n\nexport interface NoLogsInfoProps {\n datePreset?: LogsDatePreset;\n dateFrom?: Date;\n dateTo?: Date;\n}\n\nconst DATE_FORMAT = 'MMM d, yyyy HH:mm';\n\nconst LEVEL_TIP = 'Pick a wider range or lower the logging level — verbose entries (debug, info) may be filtered out.';\n\nfunction describeRange({ datePreset, dateFrom, dateTo }: NoLogsInfoProps): { title: string; description: string } {\n if (datePreset && datePreset !== 'all' && datePreset !== 'custom') {\n return {\n title: `No logs for ${PRESET_LABELS[datePreset]}`,\n description: LEVEL_TIP,\n };\n }\n if (dateFrom && dateTo) {\n return {\n title: `No logs between ${format(dateFrom, DATE_FORMAT)} and ${format(dateTo, DATE_FORMAT)}`,\n description: LEVEL_TIP,\n };\n }\n if (dateFrom) {\n return {\n title: `No logs since ${format(dateFrom, DATE_FORMAT)}`,\n description: LEVEL_TIP,\n };\n }\n return {\n title: 'No logs yet',\n description: 'Logs will appear here once agents, workflows, or tools are executed.',\n };\n}\n\nexport const NoLogsInfo = ({ datePreset, dateFrom, dateTo }: NoLogsInfoProps = {}) => {\n const { title, description } = describeRange({ datePreset, dateFrom, dateTo });\n return (\n <div className=\"flex h-full items-center justify-center\">\n <EmptyState\n iconSlot={<CircleSlashIcon />}\n titleSlot={title}\n descriptionSlot={description}\n actionSlot={\n <Button\n variant=\"ghost\"\n as=\"a\"\n href=\"https://mastra.ai/en/docs/observability/logging\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Logging Documentation <ExternalLinkIcon />\n </Button>\n }\n />\n </div>\n );\n};\n","import type { ListLogsArgs, ListLogsResponse } from '@mastra/core/storage';\nimport { useMastraClient } from '@mastra/react';\nimport { useInfiniteQuery } from '@tanstack/react-query';\nimport { useEffect } from 'react';\n\nimport type { LogRecord } from '../types';\nimport { useInView } from '@/hooks/use-in-view';\nimport { isUnsupportedObservabilityOperationError } from '@/lib/query-utils';\n\ninterface UseLogsReturn {\n data: LogRecord[] | undefined;\n hasNextPage: boolean;\n isFetchingNextPage: boolean;\n fetchNextPage: () => void;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n setEndOfListElement: (node: HTMLDivElement | null) => void;\n}\n\nconst LOGS_PER_PAGE = 20;\nconst LOGS_REFETCH_INTERVAL_MS = 10000;\n\nexport interface LogsFilters {\n filters?: ListLogsArgs['filters'];\n}\n\nfunction getNextPageParam(lastPage: ListLogsResponse | undefined, _allPages: unknown, lastPageParam: number) {\n if (lastPage?.pagination?.hasMore) {\n return lastPageParam + 1;\n }\n return undefined;\n}\n\n/** Deduplicates logs across loaded pages. Offset-based pagination duplicates rows at the page\n * boundary whenever new logs are inserted between sequential `fetchNextPage` calls — without\n * this filter the duplicates produce duplicate React keys and chaotic virtualizer offsets.\n * Falls back to the full serialized record when `logId` is absent so logs that happen to\n * share `(timestamp, message, data)` but differ in other fields aren't collapsed. */\nfunction selectLogs(data: { pages: ListLogsResponse[] }) {\n const seen = new Set<string>();\n const result = [];\n for (const page of data.pages) {\n for (const log of page.logs ?? []) {\n const key = log.logId ?? JSON.stringify(log);\n if (seen.has(key)) continue;\n seen.add(key);\n result.push(log);\n }\n }\n return result;\n}\n\nexport function getLogsRefetchInterval(query: { state: { error: unknown } }) {\n if (isUnsupportedObservabilityOperationError(query.state.error, 'logs')) {\n return false;\n }\n return LOGS_REFETCH_INTERVAL_MS;\n}\n\nexport const useLogs: (props?: LogsFilters) => UseLogsReturn = ({ filters }: LogsFilters = {}) => {\n const client = useMastraClient();\n const { inView: isEndOfListInView, setRef: setEndOfListElement } = useInView();\n\n const query = useInfiniteQuery<ListLogsResponse, Error, ReturnType<typeof selectLogs>, readonly unknown[], number>({\n queryKey: ['logs', filters],\n queryFn: ({ pageParam }) =>\n client.listLogsVNext({\n pagination: { page: pageParam, perPage: LOGS_PER_PAGE },\n filters,\n orderBy: { field: 'timestamp', direction: 'DESC' },\n }),\n initialPageParam: 0,\n getNextPageParam,\n select: selectLogs,\n retry: false,\n refetchInterval: getLogsRefetchInterval,\n });\n\n const { hasNextPage, isFetchingNextPage, fetchNextPage, data, isLoading, isError, error } = query;\n\n useEffect(() => {\n if (isEndOfListInView && hasNextPage && !isFetchingNextPage) {\n void fetchNextPage();\n }\n }, [isEndOfListInView, hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n return { data, hasNextPage, isFetchingNextPage, fetchNextPage, isLoading, isError, error, setEndOfListElement };\n};\n","import { useCallback, useMemo, useRef } from 'react';\nimport type { SetURLSearchParamsLike } from '../../traces/hooks/use-trace-url-state';\nimport {\n LOGS_DATE_FROM_PARAM,\n LOGS_DATE_PRESET_PARAM,\n LOGS_DATE_PRESET_VALUES,\n LOGS_DATE_TO_PARAM,\n LOGS_PROPERTY_FILTER_FIELD_IDS,\n LOGS_PROPERTY_FILTER_PARAM_BY_FIELD,\n LOGS_ROOT_ENTITY_TYPE_OPTIONS,\n LOGS_ROOT_ENTITY_TYPE_PARAM,\n applyLogsPropertyFilterTokens,\n getLogsPropertyFilterTokens,\n} from '../log-filters';\nimport type { LogsDatePreset, LogsEntityOptions } from '../log-filters';\nimport type { PropertyFilterToken } from '@/ds/components/PropertyFilter/types';\n\nconst LOG_PARAM = 'logId';\nconst TRACE_PARAM = 'traceId';\nconst SPAN_PARAM = 'spanId';\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\nconst PRESET_MS: Partial<Record<LogsDatePreset, number>> = {\n 'last-24h': DAY_MS,\n 'last-3d': 3 * DAY_MS,\n 'last-7d': 7 * DAY_MS,\n 'last-14d': 14 * DAY_MS,\n 'last-30d': 30 * DAY_MS,\n};\n\n/** Mutates `params` in place to drop the featured log/trace/span selection.\n * Used whenever a filter changes — selection no longer makes sense in the new result set. */\nfunction clearSelectionParams(params: URLSearchParams) {\n params.delete(LOG_PARAM);\n params.delete(TRACE_PARAM);\n params.delete(SPAN_PARAM);\n}\n\nexport interface LogsFeaturedIds {\n logId?: string | null;\n traceId?: string | null;\n spanId?: string | null;\n}\n\nexport interface UseLogsUrlStateOptions {\n /** Called after `handleRemoveAll` clears all filter URL params. */\n onRemoveAll?: () => void;\n}\n\nexport interface UseLogsUrlStateResult {\n searchParams: URLSearchParams;\n setSearchParams: SetURLSearchParamsLike;\n\n datePreset: LogsDatePreset;\n selectedDateFrom: Date | undefined;\n selectedDateTo: Date | undefined;\n datePresetRef: React.MutableRefObject<LogsDatePreset>;\n\n featuredLogId: string | null;\n featuredTraceId: string | null;\n featuredSpanId: string | null;\n\n selectedEntityOption: LogsEntityOptions | undefined;\n filterTokens: PropertyFilterToken[];\n\n /** Partial update of the featured log/trace/span selection. Omitted keys are left as-is. */\n handleFeaturedChange: (ids: LogsFeaturedIds) => void;\n handleFilterTokensChange: (nextTokens: PropertyFilterToken[]) => void;\n handleDateChange: (value: Date | undefined, type: 'from' | 'to') => void;\n handleDatePresetChange: (preset: LogsDatePreset) => void;\n handleRemoveAll: () => void;\n\n /** Lower-level helper used by `handleClear`: writes a token set and clears the log/trace/span selection. */\n applyFilterTokens: (tokens: PropertyFilterToken[]) => void;\n}\n\n/**\n * Owns all URL-derived state and URL-modifying handlers for the logs page. Routing-agnostic —\n * pass `searchParams` and `setSearchParams` from whichever router the consumer uses.\n */\nexport function useLogsUrlState(\n searchParams: URLSearchParams,\n setSearchParams: SetURLSearchParamsLike,\n options?: UseLogsUrlStateOptions,\n): UseLogsUrlStateResult {\n const { onRemoveAll } = options ?? {};\n\n const datePreset = useMemo<LogsDatePreset>(() => {\n const value = searchParams.get(LOGS_DATE_PRESET_PARAM);\n return value && LOGS_DATE_PRESET_VALUES.has(value as LogsDatePreset) ? (value as LogsDatePreset) : 'last-24h';\n }, [searchParams]);\n\n const dateFromParamRaw = searchParams.get(LOGS_DATE_FROM_PARAM);\n const dateToParamRaw = searchParams.get(LOGS_DATE_TO_PARAM);\n\n const selectedDateFrom = useMemo(() => {\n if (datePreset === 'custom') {\n if (!dateFromParamRaw) return undefined;\n const parsed = new Date(dateFromParamRaw);\n return Number.isNaN(parsed.getTime()) ? undefined : parsed;\n }\n if (datePreset === 'all') return undefined;\n const ms = PRESET_MS[datePreset];\n return ms ? new Date(Date.now() - ms) : undefined;\n }, [datePreset, dateFromParamRaw]);\n\n const selectedDateTo = useMemo(() => {\n if (datePreset !== 'custom' || !dateToParamRaw) return undefined;\n const parsed = new Date(dateToParamRaw);\n return Number.isNaN(parsed.getTime()) ? undefined : parsed;\n }, [datePreset, dateToParamRaw]);\n\n const datePresetRef = useRef(datePreset);\n datePresetRef.current = datePreset;\n\n const featuredLogId = searchParams.get(LOG_PARAM);\n const featuredTraceId = searchParams.get(TRACE_PARAM);\n const featuredSpanId = searchParams.get(SPAN_PARAM);\n\n const selectedEntityOption = useMemo(\n () =>\n LOGS_ROOT_ENTITY_TYPE_OPTIONS.find(option => option.entityType === searchParams.get(LOGS_ROOT_ENTITY_TYPE_PARAM)),\n [searchParams],\n );\n\n const filterTokens = useMemo(() => getLogsPropertyFilterTokens(searchParams), [searchParams]);\n\n const handleFeaturedChange = useCallback(\n (ids: LogsFeaturedIds) => {\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n for (const [field, value] of Object.entries(ids)) {\n const param = field === 'logId' ? LOG_PARAM : field === 'traceId' ? TRACE_PARAM : SPAN_PARAM;\n if (value) {\n next.set(param, value);\n } else {\n next.delete(param);\n }\n }\n return next;\n },\n { replace: true },\n );\n },\n [setSearchParams],\n );\n\n const applyFilterTokens = useCallback(\n (tokens: PropertyFilterToken[]) => {\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n applyLogsPropertyFilterTokens(next, tokens);\n clearSelectionParams(next);\n return next;\n },\n { replace: true },\n );\n },\n [setSearchParams],\n );\n\n const handleFilterTokensChange = applyFilterTokens;\n\n const handleDateChange = useCallback(\n (value: Date | undefined, type: 'from' | 'to') => {\n if (datePresetRef.current !== 'custom') return;\n const param = type === 'from' ? LOGS_DATE_FROM_PARAM : LOGS_DATE_TO_PARAM;\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n if (value) {\n next.set(param, value.toISOString());\n } else {\n next.delete(param);\n }\n clearSelectionParams(next);\n return next;\n },\n { replace: true },\n );\n },\n [setSearchParams],\n );\n\n const handleDatePresetChange = useCallback(\n (preset: LogsDatePreset) => {\n datePresetRef.current = preset;\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n if (preset === 'last-24h') {\n next.delete(LOGS_DATE_PRESET_PARAM);\n next.delete(LOGS_DATE_FROM_PARAM);\n next.delete(LOGS_DATE_TO_PARAM);\n } else if (preset === 'custom') {\n next.set(LOGS_DATE_PRESET_PARAM, 'custom');\n } else {\n next.set(LOGS_DATE_PRESET_PARAM, preset);\n next.delete(LOGS_DATE_FROM_PARAM);\n next.delete(LOGS_DATE_TO_PARAM);\n }\n clearSelectionParams(next);\n return next;\n },\n { replace: true },\n );\n },\n [setSearchParams],\n );\n\n const handleRemoveAll = useCallback(() => {\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n next.delete(LOGS_ROOT_ENTITY_TYPE_PARAM);\n for (const fieldId of LOGS_PROPERTY_FILTER_FIELD_IDS) {\n next.delete(LOGS_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId]);\n }\n next.delete(LOGS_DATE_PRESET_PARAM);\n next.delete(LOGS_DATE_FROM_PARAM);\n next.delete(LOGS_DATE_TO_PARAM);\n clearSelectionParams(next);\n return next;\n },\n { replace: true },\n );\n onRemoveAll?.();\n }, [setSearchParams, onRemoveAll]);\n\n return useMemo(\n () => ({\n searchParams,\n setSearchParams,\n datePreset,\n selectedDateFrom,\n selectedDateTo,\n datePresetRef,\n featuredLogId,\n featuredTraceId,\n featuredSpanId,\n selectedEntityOption,\n filterTokens,\n handleFeaturedChange,\n handleFilterTokensChange,\n handleDateChange,\n handleDatePresetChange,\n handleRemoveAll,\n applyFilterTokens,\n }),\n [\n searchParams,\n setSearchParams,\n datePreset,\n selectedDateFrom,\n selectedDateTo,\n datePresetRef,\n featuredLogId,\n featuredTraceId,\n featuredSpanId,\n selectedEntityOption,\n filterTokens,\n handleFeaturedChange,\n handleFilterTokensChange,\n handleDateChange,\n handleDatePresetChange,\n handleRemoveAll,\n applyFilterTokens,\n ],\n );\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { SetURLSearchParamsLike } from '../../traces/hooks/use-trace-url-state';\nimport {\n clearSavedLogsFilters,\n hasAnyLogsFilterParams,\n loadLogsFiltersFromStorage,\n saveLogsFiltersToStorage,\n} from '../log-filters';\nimport { toast } from '@/lib/toast';\n\nconst DEFAULT_SAVED_MESSAGE = 'Filters setting for Logs saved';\nconst DEFAULT_CLEARED_MESSAGE = 'Filters setting for Logs cleared up';\n\nexport interface LogsFilterPersistenceOptions {\n /** Override the localStorage key. Default: logs filters storage. */\n storageKey?: string;\n /** Toast text overrides; pass `false` to suppress the toast entirely. */\n messages?: {\n saved?: string | false;\n cleared?: string | false;\n };\n /** Skip the once-on-mount hydration from localStorage. Default: false. */\n skipHydration?: boolean;\n}\n\nexport interface UseLogsFilterPersistenceResult {\n hasSavedFilters: boolean;\n handleSave: () => void;\n handleRemoveSaved: () => void;\n}\n\n/**\n * Owns the localStorage save/restore lifecycle for logs filters. Mirrors\n * `useTraceFilterPersistence` — same pattern, different storage key default.\n */\nexport function useLogsFilterPersistence(\n searchParams: URLSearchParams,\n setSearchParams: SetURLSearchParamsLike,\n options?: LogsFilterPersistenceOptions,\n): UseLogsFilterPersistenceResult {\n const { storageKey, messages, skipHydration } = options ?? {};\n\n const [hasSavedFilters, setHasSavedFilters] = useState(() => loadLogsFiltersFromStorage(storageKey) !== null);\n\n const handleSave = useCallback(() => {\n saveLogsFiltersToStorage(searchParams, storageKey);\n setHasSavedFilters(true);\n const text = messages?.saved ?? DEFAULT_SAVED_MESSAGE;\n if (text !== false) toast.success(text);\n }, [searchParams, storageKey, messages?.saved]);\n\n const handleRemoveSaved = useCallback(() => {\n clearSavedLogsFilters(storageKey);\n setHasSavedFilters(false);\n const text = messages?.cleared ?? DEFAULT_CLEARED_MESSAGE;\n if (text !== false) toast.success(text);\n }, [storageKey, messages?.cleared]);\n\n const hydratedRef = useRef(false);\n useEffect(() => {\n if (skipHydration) return;\n if (hydratedRef.current) return;\n hydratedRef.current = true;\n if (hasAnyLogsFilterParams(searchParams)) return;\n const saved = loadLogsFiltersFromStorage(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 return { hasSavedFilters, handleSave, handleRemoveSaved };\n}\n","import { useCallback, useMemo } from 'react';\nimport type { LogRecord } from '../types';\nimport type { LogsFeaturedIds } from './use-logs-url-state';\n\nfunction hashCode(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) - hash + str.charCodeAt(i)) | 0;\n }\n return (hash >>> 0).toString(36);\n}\n\n/** Prefer the storage-assigned `logId`. When absent, derive an id from immutable content fields\n * (`timestamp + message + data`) so the same log lands on the same id across polls regardless\n * of list order or insertions. Two logs without `logId` that hash identically share an id —\n * acceptable because the URL-driven selection still resolves deterministically. */\nfunction buildLogIds(logs: LogRecord[]): Map<LogRecord, string> {\n const ids = new Map<LogRecord, string>();\n for (const log of logs) {\n if (log.logId) {\n ids.set(log, log.logId);\n continue;\n }\n const ts = log.timestamp instanceof Date ? log.timestamp.toISOString() : log.timestamp;\n ids.set(log, hashCode(`${ts}${log.message ?? ''}${log.data ? JSON.stringify(log.data) : ''}`));\n }\n return ids;\n}\n\nexport interface UseLogsListNavigationResult {\n /** Map each log in the list to its derived id. Pass to `<LogsListView logIdMap={...}>`. */\n logIdMap: Map<LogRecord, string>;\n /** Look up a log's id (undefined if not in the list). */\n getLogId: (log: LogRecord) => string | undefined;\n /** The currently featured log resolved from `featuredLogId`, or null. */\n featuredLog: LogRecord | null;\n /** Click handler that flips featured selection with toggle behavior, and — when a trace panel is\n * open — syncs the trace panel to the new log's trace. Pass to `<LogsListView onLogClick={...}>`. */\n handleLogClick: (log: LogRecord) => void;\n /** Undefined when at the start of the list (disable the prev button). */\n handlePreviousLog: (() => void) | undefined;\n /** Undefined when at the end of the list (disable the next button). */\n handleNextLog: (() => void) | undefined;\n}\n\n/**\n * Derives id mapping + featured log + prev/next/click handlers for a logs list. Stateless — only\n * reads from the inputs and calls `onFeaturedChange` on selection changes.\n */\nexport function useLogsListNavigation(\n logs: LogRecord[],\n featuredLogId: string | null,\n onFeaturedChange: (ids: LogsFeaturedIds) => void,\n featuredTraceId?: string | null,\n): UseLogsListNavigationResult {\n const logIdMap = useMemo(() => buildLogIds(logs), [logs]);\n\n const idToLog = useMemo(() => {\n const m = new Map<string, { log: LogRecord; idx: number }>();\n for (let i = 0; i < logs.length; i++) {\n const id = logIdMap.get(logs[i]);\n if (id) m.set(id, { log: logs[i], idx: i });\n }\n return m;\n }, [logs, logIdMap]);\n\n const entry = featuredLogId ? idToLog.get(featuredLogId) : undefined;\n const featuredLogIdx = entry?.idx ?? -1;\n const featuredLog = featuredLogIdx >= 0 ? logs[featuredLogIdx] : null;\n\n const getLogId = useCallback((log: LogRecord) => logIdMap.get(log), [logIdMap]);\n\n const handleLogClick = useCallback(\n (log: LogRecord) => {\n const id = logIdMap.get(log);\n if (!id) return;\n if (featuredLogId === id) {\n onFeaturedChange({ logId: null });\n return;\n }\n if (featuredTraceId) {\n onFeaturedChange({ logId: id, traceId: log.traceId ?? null, spanId: null });\n } else {\n onFeaturedChange({ logId: id });\n }\n },\n [logIdMap, featuredLogId, featuredTraceId, onFeaturedChange],\n );\n\n const handlePreviousLog =\n featuredLogIdx > 0\n ? () => {\n const prevLog = logs[featuredLogIdx - 1];\n const id = logIdMap.get(prevLog)!;\n if (featuredTraceId) {\n onFeaturedChange({ logId: id, traceId: prevLog.traceId ?? null, spanId: null });\n } else {\n onFeaturedChange({ logId: id });\n }\n }\n : undefined;\n\n const handleNextLog =\n featuredLogIdx >= 0 && featuredLogIdx < logs.length - 1\n ? () => {\n const nextLog = logs[featuredLogIdx + 1];\n const id = logIdMap.get(nextLog)!;\n if (featuredTraceId) {\n onFeaturedChange({ logId: id, traceId: nextLog.traceId ?? null, spanId: null });\n } else {\n onFeaturedChange({ logId: id });\n }\n }\n : undefined;\n\n return {\n logIdMap,\n getLogId,\n featuredLog,\n handleLogClick,\n handlePreviousLog,\n handleNextLog,\n };\n}\n","import { BrainIcon } from 'lucide-react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { Checkbox } from '../../../ds/components/Checkbox';\nimport { CodeDiff } from '../../../ds/components/CodeDiff';\nimport { EmptyState } from '../../../ds/components/EmptyState';\nimport { Skeleton } from '../../../ds/components/Skeleton';\nimport { cn } from '../../../lib/utils';\nimport type { OMHistoryRecord } from '../types';\n\ntype ParsedItem = {\n text: string;\n time: string | null;\n priority: 'high' | 'medium' | 'low' | 'complete' | null;\n children: ParsedItem[];\n};\n\ntype ParsedSection = {\n title: string;\n relativeTime: string | null;\n items: ParsedItem[];\n};\n\nfunction formatObservationTime(time: string | null) {\n if (!time) return null;\n const match = time.match(/^(\\d{1,2}):(\\d{2})$/);\n if (!match) return time;\n const [, hours, minutes] = match;\n const hour = Number(hours);\n const suffix = hour >= 12 ? 'PM' : 'AM';\n const normalizedHour = hour % 12 || 12;\n return `${normalizedHour}:${minutes} ${suffix}`;\n}\n\nfunction getPriorityFromEmoji(emoji?: string): ParsedItem['priority'] {\n if (emoji === '🔴') return 'high';\n if (emoji === '🟡') return 'medium';\n if (emoji === '🟢') return 'low';\n if (emoji === '✅') return 'complete';\n return null;\n}\n\nfunction priorityClasses(priority: ParsedItem['priority'], nested: boolean) {\n if (nested) {\n return {\n card: 'bg-transparent border-transparent',\n text: 'text-neutral3',\n time: 'text-icon3',\n };\n }\n switch (priority) {\n case 'high':\n return {\n card: 'border-purple-400/30 bg-purple-500/10',\n text: 'text-neutral6',\n time: 'text-purple-200/80',\n };\n case 'medium':\n return {\n card: 'border-blue-400/30 bg-blue-500/10',\n text: 'text-neutral6',\n time: 'text-blue-200/80',\n };\n case 'low':\n return {\n card: 'border-emerald-400/30 bg-emerald-500/10',\n text: 'text-neutral6',\n time: 'text-emerald-200/80',\n };\n case 'complete':\n return {\n card: 'border-green-400/30 bg-green-500/10',\n text: 'text-neutral6',\n time: 'text-green-200/80',\n };\n default:\n return {\n card: 'border-border1 bg-surface2',\n text: 'text-neutral6',\n time: 'text-icon3',\n };\n }\n}\n\nfunction parseItem(line: string): ParsedItem | null {\n const trimmed = line.trim();\n if (!trimmed) return null;\n if (trimmed.startsWith('* ->') || trimmed.startsWith('->')) {\n const text = trimmed.replace(/^\\*?\\s*->\\s*/, '').trim();\n return text ? { text, time: null, priority: null, children: [] } : null;\n }\n if (trimmed.startsWith('-')) {\n const text = trimmed.replace(/^-\\s*/, '').trim();\n return text ? { text, time: null, priority: null, children: [] } : null;\n }\n const match = trimmed.match(/^\\*\\s*(🔴|🟡|🟢|✅)?\\s*(?:\\((\\d{1,2}:\\d{2})\\))?\\s*(.+)$/);\n if (match) {\n const [, p, t, text] = match;\n return { text: text.trim(), time: t ?? null, priority: getPriorityFromEmoji(p), children: [] };\n }\n return { text: trimmed, time: null, priority: null, children: [] };\n}\n\nfunction parseObservations(raw: string): ParsedSection[] {\n const obsMatch = raw.match(/<observations>\\s*([\\s\\S]*?)\\s*<\\/observations>/);\n const content = (obsMatch ? obsMatch[1] : raw).trim();\n if (!content) return [];\n const lines = content.split('\\n');\n const sections: ParsedSection[] = [];\n let current: ParsedSection | null = null;\n let lastRoot: ParsedItem | null = null;\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n const dateMatch = trimmed.match(/^Date:\\s*(.+?)(?:\\s*\\(([^)]+)\\))?$/);\n if (dateMatch) {\n current = { title: dateMatch[1].trim(), relativeTime: dateMatch[2]?.trim() ?? null, items: [] };\n sections.push(current);\n lastRoot = null;\n continue;\n }\n if (!current) {\n current = { title: 'Recent', relativeTime: null, items: [] };\n sections.push(current);\n }\n const indent = line.match(/^(\\s*)/)?.[1].length ?? 0;\n const isNested = indent >= 2 && (trimmed.startsWith('* ->') || trimmed.startsWith('->') || trimmed.startsWith('-'));\n const item = parseItem(line);\n if (!item) continue;\n if (isNested && lastRoot) {\n lastRoot.children.push(item);\n continue;\n }\n current.items.push(item);\n lastRoot = item;\n }\n return sections;\n}\n\nfunction ObservationItems({ items, nested = false }: { items: ParsedItem[]; nested?: boolean }) {\n return (\n <div className={nested ? 'space-y-2 border-l border-border1 pl-4' : 'space-y-3'}>\n {items.map((item, i) => {\n const styles = priorityClasses(item.priority, nested);\n return (\n <div key={`${item.text.slice(0, 20)}-${i}`} className=\"space-y-2\">\n <div className=\"flex items-start gap-3\">\n <div className=\"w-12 shrink-0 pt-2 text-right\">\n {item.time && (\n <span className={`font-mono text-ui-xs ${styles.time}`}>{formatObservationTime(item.time)}</span>\n )}\n </div>\n <div className={cn('min-w-0 flex-1 rounded-md border px-3 py-2', styles.card)}>\n <p className={cn('whitespace-pre-wrap break-words text-sm leading-6', styles.text)}>{item.text}</p>\n {item.children.length > 0 && (\n <div className=\"mt-3\">\n <ObservationItems items={item.children} nested />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction ObservationContent({ observations }: { observations: string }) {\n const sections = useMemo(() => parseObservations(observations), [observations]);\n if (sections.length === 0) {\n return <p className=\"italic text-xs text-icon3\">Initialized</p>;\n }\n return (\n <div className=\"space-y-5\">\n {sections.map((section, i) => (\n <section key={`${section.title}-${i}`} className=\"space-y-3\">\n <div className=\"flex items-baseline justify-between gap-3 border-b border-border1 pb-2\">\n <div className=\"min-w-0\">\n <h3 className=\"text-xs font-medium text-neutral6\">{section.title}</h3>\n {section.relativeTime && <p className=\"text-ui-xs text-icon3\">{section.relativeTime}</p>}\n </div>\n </div>\n <ObservationItems items={section.items} />\n </section>\n ))}\n </div>\n );\n}\n\nfunction ObservationHistoryPanel({\n records,\n selectedRecordId,\n onSelectRecord,\n}: {\n records: OMHistoryRecord[];\n selectedRecordId: string | null;\n onSelectRecord: (id: string | null) => void;\n}) {\n if (records.length <= 1) return null;\n\n return (\n <div className=\"border-l border-border1 min-w-[180px] w-[200px] flex flex-col overflow-hidden\">\n <div className=\"border-b border-border1 px-4 py-2\">\n <p className=\"text-sm font-normal text-neutral6\">History</p>\n </div>\n <div className=\"flex-1 overflow-y-auto\">\n {records.map(record => {\n const isSelected = record.id === selectedRecordId;\n return (\n <button\n key={record.id}\n type=\"button\"\n className={cn(\n 'w-full cursor-pointer border-l-2 border-l-transparent px-3 py-2 text-left truncate text-xs text-icon3 transition-all hover:bg-surface3/50',\n isSelected && 'bg-surface3/50 border-l-accent1',\n )}\n onClick={() => onSelectRecord(record.id)}\n >\n {record.activeObservations || (\n <span className=\"italic text-icon3\">\n {record.isObserving || record.isReflecting ? 'Processing\\u2026' : 'Initialized'}\n </span>\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport interface ObservationDetailViewProps {\n records: OMHistoryRecord[];\n selectedRecordId: string | null;\n onSelectRecord: (id: string | null) => void;\n isLoading?: boolean;\n}\n\nexport function ObservationDetailView({\n records,\n selectedRecordId,\n onSelectRecord,\n isLoading,\n}: ObservationDetailViewProps) {\n const [showDiff, setShowDiff] = useState(false);\n\n const sorted = useMemo(\n () => [...records].sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()),\n [records],\n );\n\n const selected = selectedRecordId ? sorted.find(r => r.id === selectedRecordId) : sorted[sorted.length - 1];\n const selectedIndex = selected ? sorted.findIndex(r => r.id === selected.id) : -1;\n const previousRecord = selectedIndex > 0 ? sorted[selectedIndex - 1] : null;\n\n useEffect(() => {\n if (!selectedRecordId && sorted.length > 0) {\n onSelectRecord(sorted[sorted.length - 1].id);\n }\n }, [selectedRecordId, sorted, onSelectRecord]);\n\n if (isLoading) {\n return (\n <div className=\"p-4 space-y-4\">\n <Skeleton className=\"h-6 w-40\" />\n <Skeleton className=\"h-32 w-full\" />\n <Skeleton className=\"h-32 w-full\" />\n </div>\n );\n }\n\n if (!selected) {\n return (\n <div className=\"flex h-full items-center justify-center\">\n <EmptyState\n iconSlot={<BrainIcon className=\"size-4\" />}\n titleSlot=\"No observations\"\n descriptionSlot=\"No observational memory snapshots available for this thread.\"\n />\n </div>\n );\n }\n\n const activeObservations = typeof selected.activeObservations === 'string' ? selected.activeObservations : '';\n\n return (\n <div className=\"flex h-full w-full overflow-hidden\">\n {/* Main observation content */}\n <div className=\"flex min-w-0 flex-1 flex-col overflow-hidden\">\n {previousRecord && (\n <div className=\"border-b border-border1 px-4 py-2\">\n <div className=\"flex items-start justify-end gap-3\">\n <label className=\"flex cursor-pointer items-center gap-1.5\">\n <Checkbox checked={showDiff} onCheckedChange={v => setShowDiff(v === true)} />\n <span className=\"text-xs text-icon3\">Show diff</span>\n </label>\n </div>\n </div>\n )}\n\n <div data-testid=\"observation-detail-body\" className=\"flex-1 overflow-y-auto p-4\">\n {showDiff && previousRecord ? (\n <CodeDiff\n codeA={typeof previousRecord.activeObservations === 'string' ? previousRecord.activeObservations : ''}\n codeB={activeObservations}\n />\n ) : activeObservations ? (\n <ObservationContent observations={activeObservations} />\n ) : (\n <p className=\"italic text-xs text-icon3\">\n {selected.isObserving || selected.isReflecting ? 'Processing…' : 'Initialized'}\n </p>\n )}\n </div>\n </div>\n\n {/* History sidebar */}\n <ObservationHistoryPanel records={sorted} selectedRecordId={selected.id} onSelectRecord={onSelectRecord} />\n </div>\n );\n}\n","export function formatCompactTokens(value: number): string {\n if (value === 0) return '0';\n const k = value / 1000;\n const decimals = k < 0.1 ? 2 : 1;\n const formatted = k.toFixed(decimals);\n return formatted.replace(/\\.0+$/, '').replace(/(\\.\\d*[1-9])0$/, '$1');\n}\n","import { formatCompactTokens } from './thread-context-progress-utils';\n\ninterface ThreadContextProgressProps {\n messageTokens?: number;\n messageThreshold?: number;\n memoryTokens?: number;\n memoryThreshold?: number;\n /** Label for the second (memory-toned) bar. Defaults to \"Memory\". */\n memoryLabel?: string;\n}\n\nfunction ProgressBar({\n label,\n value,\n max,\n tone,\n}: {\n label: string;\n value: number;\n max: number;\n tone: 'message' | 'memory';\n}) {\n const percent = Math.max(0, Math.min(100, (value / max) * 100));\n const toneClass = tone === 'message' ? 'bg-blue-500/80' : 'bg-violet-500/80';\n\n return (\n <div className=\"min-w-0 flex-1\">\n <div className=\"mb-1 flex items-center justify-between gap-2 font-mono text-ui-xs text-icon3\">\n <span className=\"uppercase tracking-wide text-icon6\">{label}</span>\n <span className=\"tabular-nums text-icon3\">\n {formatCompactTokens(value)}/{formatCompactTokens(max)}k\n </span>\n </div>\n <div className=\"h-1.5 overflow-hidden rounded-full bg-white/[0.08]\">\n <div className={`h-full rounded-full ${toneClass}`} style={{ width: `${percent}%` }} />\n </div>\n </div>\n );\n}\n\nexport function ThreadContextProgress({\n messageTokens,\n messageThreshold,\n memoryTokens,\n memoryThreshold,\n memoryLabel = 'Memory',\n}: ThreadContextProgressProps) {\n const showMessages = messageTokens != null && messageThreshold != null;\n const showMemory = memoryTokens != null && memoryThreshold != null;\n\n if (!showMessages && !showMemory) {\n return null;\n }\n\n return (\n <div className=\"border-b border-border1 px-3 py-2\">\n <div className=\"flex flex-col gap-2 sm:flex-row\">\n {showMessages ? (\n <ProgressBar label=\"Messages\" value={messageTokens} max={messageThreshold} tone=\"message\" />\n ) : null}\n {showMemory ? (\n <ProgressBar label={memoryLabel} value={memoryTokens} max={memoryThreshold} tone=\"memory\" />\n ) : null}\n </div>\n </div>\n );\n}\n","export interface TDomain {\n tMin: number;\n tMax: number;\n}\n\nexport function parseUTC(ts: string): number {\n if (/[Zz+-]\\d{0,4}$/.test(ts.trim())) return new Date(ts).getTime();\n return new Date(ts.trim().replace(' ', 'T') + 'Z').getTime();\n}\n\nexport function timestampsToTDomain(timestamps: string[]): TDomain {\n if (timestamps.length === 0) return { tMin: 0, tMax: 1 };\n\n let min = Infinity;\n let max = -Infinity;\n\n for (const ts of timestamps) {\n const t = parseUTC(ts);\n if (t < min) min = t;\n if (t > max) max = t;\n }\n\n if (min === max) return { tMin: min, tMax: min + 1 };\n\n return { tMin: min, tMax: max };\n}\n\nexport function toT(isoString: string, domain: TDomain): number {\n const t = parseUTC(isoString);\n return (t - domain.tMin) / (domain.tMax - domain.tMin);\n}\n\nexport function tToTimestamp(t: number, domain: TDomain): Date {\n return new Date(domain.tMin + t * (domain.tMax - domain.tMin));\n}\n\nexport function formatTimeDisplay(date: Date): string {\n const day = String(date.getUTCDate()).padStart(2, '0');\n const month = String(date.getUTCMonth() + 1).padStart(2, '0');\n const h = String(date.getUTCHours()).padStart(2, '0');\n const m = String(date.getUTCMinutes()).padStart(2, '0');\n const s = String(date.getUTCSeconds()).padStart(2, '0');\n return `${day}/${month} ${h}:${m}:${s}`;\n}\n","import type { OMHistoryRecord } from '../types';\nimport type { TDomain } from './timeline';\nimport { parseUTC, tToTimestamp } from './timeline';\n\n/** Converts a normalized timeline coordinate (0–1) into an epoch ms cursor. */\nexport function tToTimestampMs(t: number, domain: TDomain): number {\n return tToTimestamp(t, domain).getTime();\n}\n\nexport function getObservationTimestamp(record: OMHistoryRecord): string {\n const d = record.lastObservedAt ?? record.updatedAt;\n return typeof d === 'string' ? d : new Date(d).toISOString();\n}\n\n/** Epoch-ms timeline position of an OM record (lastObservedAt ?? updatedAt). */\nexport function getObservationTimestampMs(record: OMHistoryRecord): number {\n return parseUTC(getObservationTimestamp(record));\n}\n\n/**\n * Returns the id of the OM record whose observation time is at or just before\n * the replay cursor (ms epoch). Returns null when there is no such record.\n */\nexport function findRecordIdAtOrBefore(records: OMHistoryRecord[], cursorMs: number | null): string | null {\n if (cursorMs == null || records.length === 0) return null;\n\n const sorted = records\n .map(record => ({ id: record.id, t: parseUTC(getObservationTimestamp(record)) }))\n .toSorted((a, b) => a.t - b.t);\n\n let matchId: string | null = null;\n for (const entry of sorted) {\n if (entry.t <= cursorMs) {\n matchId = entry.id;\n } else {\n break;\n }\n }\n\n return matchId;\n}\n","import { RotateCcw } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Area,\n AreaChart,\n ComposedChart,\n ReferenceLine,\n ResponsiveContainer,\n Scatter,\n ScatterChart,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\n\nimport { Button } from '../../../ds/components/Button';\nimport type { ExtractedOmMarker } from '../lib/extract-markers';\nimport { tToTimestampMs } from '../lib/replay-selection';\nimport type { TDomain } from '../lib/timeline';\nimport { formatTimeDisplay, toT, tToTimestamp } from '../lib/timeline';\nimport type { MemoryMessage, OMHistoryRecord } from '../types';\n\nexport interface ZoomRange {\n left: number;\n right: number;\n}\n\ninterface FlameGraphProps {\n omRecords: OMHistoryRecord[];\n markers: ExtractedOmMarker[];\n messages: MemoryMessage[];\n tDomain: TDomain;\n observationThreshold?: number;\n reflectionThreshold?: number;\n onSelectTimestamp?: (timestamp: number | null) => void;\n /**\n * Controlled zoom range (epoch ms). When provided together with\n * `onZoomRangeChange`, the caller owns the range and the graph becomes a\n * controlled component; otherwise the range is managed internally.\n */\n zoomRange?: ZoomRange;\n onZoomRangeChange?: (range: ZoomRange) => void;\n}\n\ntype RechartsClickState = { activeLabel?: string | number } | null | undefined;\n\nconst MSG_COLOR = 'var(--color-green-500, #22c55e)';\nconst OBS_COLOR = '#f59e0b';\nconst REFLECT_COLOR = '#ec4899';\n\nfunction getObservationTimestamp(record: OMHistoryRecord): string {\n const d = record.lastObservedAt ?? record.updatedAt;\n return typeof d === 'string' ? d : new Date(d).toISOString();\n}\n\nfunction toContextData(records: OMHistoryRecord[], markers: ExtractedOmMarker[], domain: TDomain) {\n const fromRecords = records.map(r => ({\n ts: String(getObservationTimestamp(r)),\n pendingMessageTokens: r.pendingMessageTokens,\n }));\n const fromMarkers = markers\n .filter(m => m.pendingTokens != null)\n .map(m => ({\n ts: m.timestamp,\n pendingMessageTokens: m.pendingTokens!,\n }));\n return [...fromRecords, ...fromMarkers]\n .sort((a, b) => a.ts.localeCompare(b.ts))\n .map(d => ({ t: toT(d.ts, domain), pendingMessageTokens: d.pendingMessageTokens }));\n}\n\nfunction toActiveObservationData(records: OMHistoryRecord[], markers: ExtractedOmMarker[], domain: TDomain) {\n const points = [\n ...records.map(record => ({\n ts: String(getObservationTimestamp(record)),\n observationTokenCount: record.observationTokenCount,\n })),\n ...markers\n .filter(marker => marker.type === 'status' && marker.observationTokens != null)\n .map(marker => ({\n ts: marker.timestamp,\n observationTokenCount: marker.observationTokens!,\n })),\n ].sort((a, b) => a.ts.localeCompare(b.ts));\n\n let runningTotal = 0;\n return points.map(point => {\n runningTotal = Math.max(runningTotal, point.observationTokenCount);\n return { t: toT(point.ts, domain), observationTokenCount: runningTotal };\n });\n}\n\nfunction toBufferedObservationData(markers: ExtractedOmMarker[], domain: TDomain) {\n const points = markers\n .filter(\n marker => marker.observationTokens != null && (marker.type === 'buffering-end' || marker.type === 'activation'),\n )\n .map(marker => ({\n ts: marker.timestamp,\n bufferedObservationTokenCount:\n marker.type === 'activation' ? -marker.observationTokens! : marker.observationTokens!,\n }))\n .sort((a, b) => a.ts.localeCompare(b.ts));\n\n let runningTotal = 0;\n return points.map(point => {\n runningTotal = Math.max(0, runningTotal + point.bufferedObservationTokenCount);\n return { t: toT(point.ts, domain), bufferedObservationTokenCount: runningTotal };\n });\n}\n\nfunction toEventData(records: OMHistoryRecord[], domain: TDomain) {\n return [...records]\n .sort((a, b) => String(getObservationTimestamp(a)).localeCompare(String(getObservationTimestamp(b))))\n .map(r => ({ t: toT(String(getObservationTimestamp(r)), domain), event: 1 }));\n}\n\nfunction toMessageData(messages: MemoryMessage[], domain: TDomain) {\n return [...messages]\n .sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime())\n .map(m => ({\n t: toT(new Date(m.createdAt).toISOString(), domain),\n event: 1,\n role: m.role,\n }));\n}\n\nfunction TimeAxis({ domain }: { domain: TDomain }) {\n const ticks = [0, 0.25, 0.5, 0.75, 1];\n return (\n <div className=\"grid grid-cols-[6rem_1fr] items-center\">\n <p className=\"flex items-center self-stretch border-r border-border1/50 pl-3 text-ui-xs font-medium text-icon3\">\n Time\n </p>\n <div className=\"flex justify-between px-1 py-1.5 font-mono text-ui-xs text-icon3\">\n {ticks.map(t => (\n <span key={t}>{formatTimeDisplay(tToTimestamp(t, domain))}</span>\n ))}\n </div>\n </div>\n );\n}\n\nfunction FlameTooltip({\n active,\n payload,\n domain,\n showValue,\n}: {\n active?: boolean;\n payload?: Array<{ value: unknown; name: string; payload?: { t?: number } }>;\n domain?: TDomain;\n showValue?: boolean;\n}) {\n if (!active || !payload?.length) return null;\n const t = payload[0]?.payload?.t;\n const time = domain != null && t != null ? formatTimeDisplay(tToTimestamp(t, domain)) : null;\n const visibleEntries = payload.filter(entry => entry.name !== 't' && entry.name !== 'time' && entry.value != null);\n\n if (showValue) {\n return (\n <div className=\"flex flex-col gap-0.5 rounded border border-border1 bg-surface3 px-2 py-1.5 font-mono text-ui-xs shadow\">\n {time && (\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-icon3\">time</span>\n <span className=\"text-neutral6\">{time}</span>\n </div>\n )}\n {visibleEntries.map(entry => (\n <div key={entry.name} className=\"flex items-center justify-between gap-3\">\n <span className=\"text-icon3\">{entry.name}</span>\n <span className=\"text-neutral6\">\n {typeof entry.value === 'number' ? Math.round(entry.value).toLocaleString() : String(entry.value)}\n </span>\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div className=\"rounded border border-border1 bg-surface3 px-2 py-1 font-mono text-ui-xs shadow\">\n {time && <span className=\"text-neutral6\">{time}</span>}\n </div>\n );\n}\n\ninterface AreaRowProps {\n label: string;\n data: Array<{ t: number; [k: string]: unknown }>;\n dataKey: string;\n color: string;\n gradientId: string;\n domain: TDomain;\n zoomDomain: [number, number];\n threshold?: number;\n}\n\nfunction AreaRow({ label, data, dataKey, color, gradientId, domain, zoomDomain, threshold }: AreaRowProps) {\n const maxValue = Math.max(0, ...data.map(d => Number(d[dataKey]) || 0));\n const yMax = threshold != null ? Math.max(maxValue, threshold) : undefined;\n\n return (\n <div className=\"relative grid grid-cols-[6rem_1fr] items-center border-b border-border1/50 hover:z-10\">\n <p className=\"flex items-center self-stretch border-r border-border1/50 pl-3 text-ui-xs font-medium text-icon3\">\n {label}\n </p>\n <div>\n <ResponsiveContainer width=\"100%\" height={32}>\n <AreaChart data={data} margin={{ top: 0, right: 0, bottom: 0, left: 0 }}>\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity={0.35} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0.03} />\n </linearGradient>\n </defs>\n <XAxis dataKey=\"t\" type=\"number\" domain={zoomDomain} allowDataOverflow hide />\n <YAxis type=\"number\" domain={yMax != null ? [0, yMax] : undefined} hide />\n <Tooltip\n content={<FlameTooltip domain={domain} showValue />}\n cursor={{ stroke: 'rgba(255,255,255,0.08)' }}\n />\n <Area\n type=\"linear\"\n dataKey={dataKey}\n stroke={color}\n strokeWidth={1}\n strokeOpacity={0.6}\n fill={`url(#${gradientId})`}\n isAnimationActive={false}\n />\n {threshold != null && (\n <ReferenceLine y={threshold} stroke={color} strokeDasharray=\"4 3\" strokeOpacity={0.4} />\n )}\n </AreaChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\ninterface EventRowProps {\n label: string;\n data: Array<{ t: number; event: number; [k: string]: unknown }>;\n color: string;\n height?: number;\n domain: TDomain;\n zoomDomain: [number, number];\n}\n\nfunction EventRow({ label, data, color, height = 32, domain, zoomDomain }: EventRowProps) {\n return (\n <div className=\"relative grid grid-cols-[6rem_1fr] items-center border-b border-border1/50 hover:z-10\">\n <p className=\"flex items-center self-stretch border-r border-border1/50 pl-3 text-ui-xs font-medium text-icon3\">\n {label}\n </p>\n <div>\n <ResponsiveContainer width=\"100%\" height={height}>\n <ScatterChart margin={{ top: 0, right: 0, bottom: 0, left: 0 }}>\n <XAxis dataKey=\"t\" type=\"number\" domain={zoomDomain} allowDataOverflow hide />\n <YAxis dataKey=\"event\" type=\"number\" domain={[0, 2]} hide />\n <Tooltip content={<FlameTooltip domain={domain} />} cursor={false} />\n <Scatter\n data={data}\n fill={color}\n isAnimationActive={false}\n shape={(props: Record<string, unknown>) => {\n const cx = props.cx as number;\n return (\n <g>\n <rect x={cx - 6} y={0} width={12} height={height} fill=\"transparent\" />\n <rect x={cx - 1.5} y={0} width={3} height={height} fill={color} />\n </g>\n );\n }}\n />\n </ScatterChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\ninterface CombinedRowProps {\n label: string;\n areaData: Array<Record<string, number>>;\n areaDataKey: string;\n eventData: Array<{ t: number; event: number; [k: string]: unknown }>;\n color: string;\n gradientId: string;\n domain: TDomain;\n zoomDomain: [number, number];\n threshold?: number;\n height?: number;\n onSelectT?: (t: number) => void;\n}\n\nfunction CombinedRow({\n label,\n areaData,\n areaDataKey,\n eventData,\n color,\n gradientId,\n domain,\n zoomDomain,\n threshold,\n height = 44,\n onSelectT,\n}: CombinedRowProps) {\n const areaValueByTime = new Map(areaData.map(point => [point.t, Number(point[areaDataKey] ?? 0)]));\n const eventsByTime = eventData.reduce<Map<number, Array<(typeof eventData)[number]>>>((acc, event) => {\n const bucket = acc.get(event.t);\n if (bucket) {\n bucket.push(event);\n } else {\n acc.set(event.t, [event]);\n }\n return acc;\n }, new Map());\n const allTimes = Array.from(new Set([...areaValueByTime.keys(), ...eventsByTime.keys()])).sort((a, b) => a - b);\n\n let lastAreaValue = 0;\n const combinedData: Array<Record<string, unknown> & { t: number }> = [];\n for (const time of allTimes) {\n const nextAreaValue = areaValueByTime.get(time);\n if (nextAreaValue != null) {\n lastAreaValue = nextAreaValue;\n }\n\n const bucket = eventsByTime.get(time);\n if (bucket && bucket.length > 0) {\n for (const event of bucket) {\n combinedData.push({ ...event, t: time, [areaDataKey]: lastAreaValue });\n }\n } else {\n combinedData.push({ t: time, [areaDataKey]: lastAreaValue });\n }\n }\n\n return (\n <div className=\"relative grid grid-cols-[6rem_1fr] items-center border-b border-border1/50 hover:z-10\">\n <p className=\"flex items-center self-stretch border-r border-border1/50 pl-3 text-ui-xs font-medium text-icon3\">\n {label}\n </p>\n <div>\n <ResponsiveContainer width=\"100%\" height={height}>\n <ComposedChart\n margin={{ top: 0, right: 0, bottom: 0, left: 0 }}\n onClick={(state: RechartsClickState) => {\n const label = state?.activeLabel;\n if (label != null && onSelectT) onSelectT(Number(label));\n }}\n className={onSelectT ? 'cursor-pointer' : undefined}\n >\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity={0.35} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0.06} />\n </linearGradient>\n </defs>\n <XAxis dataKey=\"t\" type=\"number\" domain={zoomDomain} allowDataOverflow hide />\n <YAxis yAxisId=\"area\" dataKey={areaDataKey} type=\"number\" hide domain={[0, 'dataMax']} />\n <Tooltip content={<FlameTooltip domain={domain} showValue />} cursor={false} />\n <Area\n yAxisId=\"area\"\n data={combinedData}\n type=\"linear\"\n dataKey={areaDataKey}\n stroke={color}\n strokeWidth={1}\n strokeOpacity={0.6}\n fill={`url(#${gradientId})`}\n isAnimationActive={false}\n activeDot={{ r: 5, stroke: color, strokeWidth: 2, fill: '#0a0a0a' }}\n dot={(props: Record<string, unknown>) => {\n const dotPayload = props.payload as { event?: number } | undefined;\n if (!dotPayload?.event) return <></>;\n return <circle cx={props.cx as number} cy={props.cy as number} r={4} fill={color} />;\n }}\n />\n {threshold != null && (\n <ReferenceLine yAxisId=\"area\" y={threshold} stroke={color} strokeDasharray=\"4 3\" strokeOpacity={0.4} />\n )}\n </ComposedChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\nfunction ZoomTrack({\n tDomain,\n zoomLeft,\n zoomRight,\n onZoomLeftChange,\n onZoomRightChange,\n onReset,\n}: {\n tDomain: TDomain;\n zoomLeft: number;\n zoomRight: number;\n onZoomLeftChange: (ts: number) => void;\n onZoomRightChange: (ts: number) => void;\n onReset: () => void;\n}) {\n const trackRef = useRef<HTMLDivElement>(null);\n const dragging = useRef<'left' | 'right' | null>(null);\n\n const range = tDomain.tMax - tDomain.tMin;\n const leftPercent = range > 0 ? ((zoomLeft - tDomain.tMin) / range) * 100 : 0;\n const rightPercent = range > 0 ? ((zoomRight - tDomain.tMin) / range) * 100 : 100;\n\n const toTimestamp = useCallback(\n (clientX: number) => {\n const track = trackRef.current;\n if (!track) return null;\n const rect = track.getBoundingClientRect();\n const frac = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n return tDomain.tMin + frac * (tDomain.tMax - tDomain.tMin);\n },\n [tDomain.tMin, tDomain.tMax],\n );\n\n useEffect(() => {\n const onMouseMove = (e: MouseEvent) => {\n if (!dragging.current) return;\n const ts = toTimestamp(e.clientX);\n if (ts == null) return;\n if (dragging.current === 'left') {\n onZoomLeftChange(Math.min(ts, zoomRight));\n } else {\n onZoomRightChange(Math.max(ts, zoomLeft));\n }\n };\n const onMouseUp = () => {\n dragging.current = null;\n };\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n return () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n };\n }, [toTimestamp, zoomLeft, zoomRight, onZoomLeftChange, onZoomRightChange]);\n\n return (\n <div className=\"grid grid-cols-[6rem_1fr] items-center border-b border-border1/50\">\n <div className=\"flex items-center gap-1 self-stretch border-r border-border1/50 pl-3\">\n <p className=\"text-ui-xs font-medium text-icon3\">Zoom</p>\n <Button variant=\"ghost\" size=\"icon-sm\" aria-label=\"Reset zoom\" onClick={onReset}>\n <RotateCcw className=\"size-3\" />\n </Button>\n </div>\n <div\n ref={trackRef}\n className=\"relative h-6 cursor-pointer select-none\"\n onMouseDown={e => {\n const ts = toTimestamp(e.clientX);\n if (ts == null) return;\n e.preventDefault();\n const distLeft = Math.abs(ts - zoomLeft);\n const distRight = Math.abs(ts - zoomRight);\n if (distLeft <= distRight) {\n onZoomLeftChange(Math.min(ts, zoomRight));\n dragging.current = 'left';\n } else {\n onZoomRightChange(Math.max(ts, zoomLeft));\n dragging.current = 'right';\n }\n }}\n >\n <div className=\"absolute inset-y-0 left-0 bg-surface2/60\" style={{ width: `${leftPercent}%` }} />\n <div\n className=\"absolute inset-y-0 border-y border-border1/30 bg-neutral6/5\"\n style={{ left: `${leftPercent}%`, right: `${100 - rightPercent}%` }}\n />\n <div className=\"absolute inset-y-0 right-0 bg-surface2/60\" style={{ width: `${100 - rightPercent}%` }} />\n <div\n className=\"absolute inset-y-0 w-1 cursor-col-resize bg-neutral6/50 hover:bg-neutral6\"\n style={{ left: `${leftPercent}%`, transform: 'translateX(-50%)' }}\n onMouseDown={e => {\n e.preventDefault();\n e.stopPropagation();\n dragging.current = 'left';\n }}\n />\n <div\n className=\"absolute inset-y-0 w-1 cursor-col-resize bg-neutral6/50 hover:bg-neutral6\"\n style={{ left: `${rightPercent}%`, transform: 'translateX(-50%)' }}\n onMouseDown={e => {\n e.preventDefault();\n e.stopPropagation();\n dragging.current = 'right';\n }}\n />\n </div>\n </div>\n );\n}\n\nconst FALLBACK_DOMAIN: TDomain = { tMin: 0, tMax: 1 };\n\nexport function FlameGraph({\n omRecords,\n markers,\n messages,\n tDomain: tDomainProp,\n observationThreshold,\n reflectionThreshold,\n onSelectTimestamp,\n zoomRange,\n onZoomRangeChange,\n}: FlameGraphProps) {\n const domain = tDomainProp ?? FALLBACK_DOMAIN;\n\n const handleSelectT = useCallback(\n (t: number) => {\n onSelectTimestamp?.(tToTimestampMs(t, domain));\n },\n [onSelectTimestamp, domain],\n );\n\n const isControlled = zoomRange != null && onZoomRangeChange != null;\n const [internalZoomLeft, setInternalZoomLeft] = useState<number>(domain.tMin);\n const [internalZoomRight, setInternalZoomRight] = useState<number>(domain.tMax);\n\n // Reset the internal (uncontrolled) range whenever the domain changes.\n // Controlled callers own resetting via `onZoomRangeChange`.\n useEffect(() => {\n if (isControlled) return;\n setInternalZoomLeft(domain.tMin);\n setInternalZoomRight(domain.tMax);\n }, [domain.tMin, domain.tMax, isControlled]);\n\n const zoomLeft = isControlled ? zoomRange.left : internalZoomLeft;\n const zoomRight = isControlled ? zoomRange.right : internalZoomRight;\n\n const setZoomLeft = useCallback(\n (ts: number) => {\n if (isControlled) onZoomRangeChange({ left: ts, right: zoomRight });\n else setInternalZoomLeft(ts);\n },\n [isControlled, onZoomRangeChange, zoomRight],\n );\n const setZoomRight = useCallback(\n (ts: number) => {\n if (isControlled) onZoomRangeChange({ left: zoomLeft, right: ts });\n else setInternalZoomRight(ts);\n },\n [isControlled, onZoomRangeChange, zoomLeft],\n );\n\n const resetZoom = useCallback(() => {\n if (isControlled) onZoomRangeChange({ left: domain.tMin, right: domain.tMax });\n else {\n setInternalZoomLeft(domain.tMin);\n setInternalZoomRight(domain.tMax);\n }\n }, [isControlled, onZoomRangeChange, domain.tMin, domain.tMax]);\n\n const range = domain.tMax - domain.tMin;\n const zoomTLeft = range > 0 ? (zoomLeft - domain.tMin) / range : 0;\n const zoomTRight = range > 0 ? (zoomRight - domain.tMin) / range : 1;\n const zoomDomain: [number, number] = [zoomTLeft, zoomTRight];\n\n const messageData = useMemo(() => toMessageData(messages, domain), [messages, domain]);\n const contextData = useMemo(() => toContextData(omRecords, markers, domain), [omRecords, markers, domain]);\n const activeObservationData = useMemo(\n () => toActiveObservationData(omRecords, markers, domain),\n [omRecords, markers, domain],\n );\n const bufferedObservationData = useMemo(() => toBufferedObservationData(markers, domain), [markers, domain]);\n const eventData = useMemo(() => toEventData(omRecords, domain), [omRecords, domain]);\n\n const hasData =\n messageData.length > 0 || contextData.length > 0 || activeObservationData.length > 0 || eventData.length > 0;\n\n if (!hasData) return null;\n\n return (\n <div className=\"flex flex-col pb-2 pr-2 [&_.recharts-surface]:outline-none\">\n <CombinedRow\n label=\"Messages\"\n areaData={contextData}\n areaDataKey=\"pendingMessageTokens\"\n eventData={messageData}\n color={MSG_COLOR}\n gradientId=\"grad-messages\"\n domain={domain}\n zoomDomain={zoomDomain}\n threshold={observationThreshold}\n onSelectT={onSelectTimestamp ? handleSelectT : undefined}\n />\n\n <CombinedRow\n label=\"Observations\"\n areaData={activeObservationData}\n areaDataKey=\"observationTokenCount\"\n eventData={eventData}\n color={OBS_COLOR}\n gradientId=\"grad-observations\"\n domain={domain}\n zoomDomain={zoomDomain}\n threshold={reflectionThreshold}\n onSelectT={onSelectTimestamp ? handleSelectT : undefined}\n />\n\n {bufferedObservationData.length > 0 && (\n <AreaRow\n label=\"Buffered obs\"\n data={bufferedObservationData}\n dataKey=\"bufferedObservationTokenCount\"\n color={REFLECT_COLOR}\n gradientId=\"grad-buffered-obs\"\n domain={domain}\n zoomDomain={zoomDomain}\n threshold={reflectionThreshold}\n />\n )}\n\n {eventData.length > 0 && (\n <EventRow label=\"Events\" data={eventData} color={REFLECT_COLOR} domain={domain} zoomDomain={zoomDomain} />\n )}\n\n <TimeAxis domain={domain} />\n\n <ZoomTrack\n tDomain={domain}\n zoomLeft={zoomLeft}\n zoomRight={zoomRight}\n onZoomLeftChange={setZoomLeft}\n onZoomRightChange={setZoomRight}\n onReset={resetZoom}\n />\n </div>\n );\n}\n","import type { DataOmPart } from '@mastra/memory/processors';\nimport type { MemoryMessage } from '../types';\n\nexport interface ExtractedOmMarker {\n type: 'status' | 'observation-start' | 'observation-end' | 'buffering-start' | 'buffering-end' | 'activation';\n timestamp: string;\n pendingTokens?: number;\n observationTokens?: number;\n observationThreshold?: number;\n reflectionThreshold?: number;\n generationCount?: number;\n}\n\ninterface MastraV2Content {\n format?: number;\n parts: Array<{ type: string; [key: string]: unknown }>;\n}\n\nfunction parseContent(content: unknown): unknown {\n let value = content;\n for (let i = 0; i < 3 && typeof value === 'string'; i++) {\n try {\n const parsed = JSON.parse(value);\n if (typeof parsed === 'object' && parsed !== null) return parsed;\n if (typeof parsed === 'string' && parsed !== value) {\n value = parsed;\n continue;\n }\n break;\n } catch {\n break;\n }\n }\n return value;\n}\n\nfunction isMastraV2(content: unknown): content is MastraV2Content {\n return (\n typeof content === 'object' &&\n content !== null &&\n 'parts' in content &&\n Array.isArray((content as { parts?: unknown }).parts)\n );\n}\n\ntype OmMarkerPart = Extract<\n DataOmPart,\n {\n type:\n | 'data-om-status'\n | 'data-om-observation-start'\n | 'data-om-observation-end'\n | 'data-om-buffering-start'\n | 'data-om-buffering-end'\n | 'data-om-activation';\n }\n>;\n\nfunction isOmMarkerPart(part: { type: string }): part is OmMarkerPart {\n const t = part.type;\n return (\n t === 'data-om-status' ||\n t === 'data-om-observation-start' ||\n t === 'data-om-observation-end' ||\n t === 'data-om-buffering-start' ||\n t === 'data-om-buffering-end' ||\n t === 'data-om-activation'\n );\n}\n\nfunction mapMarker(part: OmMarkerPart, messageCreatedAt: string): ExtractedOmMarker {\n switch (part.type) {\n case 'data-om-status':\n return {\n type: 'status',\n timestamp: messageCreatedAt,\n pendingTokens: part.data.windows?.active?.messages?.tokens,\n observationTokens: part.data.windows?.active?.observations?.tokens,\n observationThreshold: part.data.windows?.active?.messages?.threshold,\n reflectionThreshold: part.data.windows?.active?.observations?.threshold,\n };\n case 'data-om-observation-start':\n return {\n type: 'observation-start',\n timestamp: part.data.startedAt,\n pendingTokens: part.data.tokensToObserve,\n observationThreshold: part.data.config?.messageTokens,\n reflectionThreshold: part.data.config?.observationTokens,\n };\n case 'data-om-observation-end':\n return {\n type: 'observation-end',\n timestamp: part.data.completedAt,\n observationTokens: part.data.observationTokens,\n };\n case 'data-om-buffering-start':\n return {\n type: 'buffering-start',\n timestamp: part.data.startedAt,\n pendingTokens: part.data.tokensToBuffer,\n observationThreshold: part.data.config?.messageTokens,\n reflectionThreshold: part.data.config?.observationTokens,\n };\n case 'data-om-buffering-end':\n return {\n type: 'buffering-end',\n timestamp: part.data.completedAt,\n observationTokens: part.data.bufferedTokens,\n };\n case 'data-om-activation':\n return {\n type: 'activation',\n timestamp: part.data.activatedAt,\n pendingTokens: part.data.tokensActivated,\n observationTokens: part.data.observationTokens,\n observationThreshold: part.data.config?.messageTokens,\n reflectionThreshold: part.data.config?.observationTokens,\n generationCount: part.data.generationCount,\n };\n }\n}\n\nexport function extractOmMarkers(messages: MemoryMessage[]): ExtractedOmMarker[] {\n const markers: ExtractedOmMarker[] = [];\n\n for (const msg of messages) {\n const content = parseContent(msg.content);\n if (!isMastraV2(content)) continue;\n\n for (const part of content.parts) {\n if (isOmMarkerPart(part)) {\n markers.push(mapMarker(part, new Date(msg.createdAt).toISOString()));\n }\n }\n }\n\n markers.sort((a, b) => a.timestamp.localeCompare(b.timestamp));\n return markers;\n}\n","import type { OMHistoryRecord } from '../types';\nimport type { ExtractedOmMarker } from './extract-markers';\nimport { parseUTC } from './timeline';\n\nexport interface ThreadContextWindowState {\n messageTokens?: number;\n messageThreshold?: number;\n memoryTokens?: number;\n memoryThreshold?: number;\n}\n\nfunction getObservationTimestamp(record: OMHistoryRecord): string {\n const d = record.lastObservedAt ?? record.updatedAt;\n return typeof d === 'string' ? d : new Date(d).toISOString();\n}\n\nfunction sortObservationRecords(records: OMHistoryRecord[]) {\n return [...records].sort((a, b) => parseUTC(getObservationTimestamp(a)) - parseUTC(getObservationTimestamp(b)));\n}\n\nexport function getLatestThreadContextWindowState({\n markers,\n omRecords,\n observationThreshold,\n reflectionThreshold,\n}: {\n markers: ExtractedOmMarker[];\n omRecords: OMHistoryRecord[];\n observationThreshold?: number;\n reflectionThreshold?: number;\n}): ThreadContextWindowState {\n const latestStatusMarker = [...markers]\n .filter(marker => marker.type === 'status' && (marker.pendingTokens != null || marker.observationTokens != null))\n .sort((a, b) => a.timestamp.localeCompare(b.timestamp))\n .at(-1);\n\n const latestObservationRecord = sortObservationRecords(omRecords).at(-1);\n\n return {\n messageTokens: latestStatusMarker?.pendingTokens ?? latestObservationRecord?.pendingMessageTokens,\n messageThreshold: latestStatusMarker?.observationThreshold ?? observationThreshold,\n memoryTokens: latestStatusMarker?.observationTokens ?? latestObservationRecord?.observationTokenCount,\n memoryThreshold: latestStatusMarker?.reflectionThreshold ?? reflectionThreshold,\n };\n}\n","import { ArrowLeftIcon } from 'lucide-react';\nimport { useEffect, useMemo, useState } from 'react';\n\nimport { Button } from '../../../ds/components/Button';\nimport { Skeleton } from '../../../ds/components/Skeleton';\nimport { Txt } from '../../../ds/components/Txt';\nimport { MemoryIcon } from '../../../ds/icons/MemoryIcon';\nimport { extractOmMarkers } from '../lib/extract-markers';\nimport { findRecordIdAtOrBefore, getObservationTimestampMs } from '../lib/replay-selection';\nimport { getLatestThreadContextWindowState } from '../lib/thread-context-window-state';\nimport { timestampsToTDomain } from '../lib/timeline';\nimport type { MemoryMessage, OMHistoryRecord } from '../types';\nimport { FlameGraph } from './flame-graph';\nimport type { ZoomRange } from './flame-graph';\nimport { ObservationDetailView } from './observation-detail-view';\nimport { ThreadContextProgress } from './thread-context-progress';\n\nexport interface MemoryStudioPanelProps {\n messages: MemoryMessage[];\n omRecords: OMHistoryRecord[];\n isLoading?: boolean;\n onClose?: () => void;\n /** Replay cursor (ms epoch) driven by the timeline; selects the matching observation. */\n selectedTimestamp?: number | null;\n /** Fired when the flame graph timeline is clicked, surfacing the replay cursor. */\n onSelectTimestamp?: (timestamp: number | null) => void;\n /**\n * Authoritative context-window token counts/thresholds supplied by the caller\n * (e.g. derived from the OM record + live stream progress). When provided these\n * take precedence over the values re-derived from message markers, keeping this\n * panel aligned with the OM sidebar. Marker-derived values remain the fallback\n * for standalone usage.\n */\n contextWindow?: {\n messageTokens?: number;\n messageThreshold?: number;\n memoryTokens?: number;\n memoryThreshold?: number;\n };\n}\n\nexport function MemoryStudioPanel({\n messages,\n omRecords,\n isLoading = false,\n onClose,\n selectedTimestamp,\n onSelectTimestamp,\n contextWindow,\n}: MemoryStudioPanelProps) {\n const [manualOMRecordId, setManualOMRecordId] = useState<string | null>(null);\n\n const markers = useMemo(() => extractOmMarkers(messages), [messages]);\n const tDomain = useMemo(() => {\n if (messages.length === 0) return { tMin: 0, tMax: 1 };\n return timestampsToTDomain(messages.map(m => new Date(m.createdAt).toISOString()));\n }, [messages]);\n const windowState = useMemo(() => getLatestThreadContextWindowState({ markers, omRecords }), [markers, omRecords]);\n\n const memoryTokens = contextWindow?.memoryTokens ?? windowState?.memoryTokens;\n const memoryThreshold = contextWindow?.memoryThreshold ?? windowState?.memoryThreshold;\n\n // Zoom range (epoch ms) is owned here so it can both scope the FlameGraph\n // charts and filter the observation list. It resets to the full domain\n // whenever the domain changes (mirrors the FlameGraph's own reset behaviour).\n const [zoomRange, setZoomRange] = useState<ZoomRange>({ left: tDomain.tMin, right: tDomain.tMax });\n useEffect(() => {\n setZoomRange({ left: tDomain.tMin, right: tDomain.tMax });\n }, [tDomain.tMin, tDomain.tMax]);\n\n // The full-domain case is a strict pass-through so an untouched range never\n // hides records (e.g. observations outside the message-derived domain).\n const isFullRange = zoomRange.left <= tDomain.tMin && zoomRange.right >= tDomain.tMax;\n const visibleRecords = useMemo(() => {\n if (isFullRange) return omRecords;\n return omRecords.filter(record => {\n const t = getObservationTimestampMs(record);\n return t >= zoomRange.left && t <= zoomRange.right;\n });\n }, [omRecords, isFullRange, zoomRange.left, zoomRange.right]);\n\n // Replay cursor (controlled) overrides manual history selection. Resolve it\n // against the visible records so selection stays consistent with the list.\n const replayRecordId = useMemo(\n () => (selectedTimestamp != null ? findRecordIdAtOrBefore(visibleRecords, selectedTimestamp) : null),\n [visibleRecords, selectedTimestamp],\n );\n // Ignore a manual selection that the range has filtered out, so the detail\n // view falls back to a record that is actually visible instead of an empty state.\n const manualSelectionInRange =\n manualOMRecordId != null && visibleRecords.some(r => r.id === manualOMRecordId) ? manualOMRecordId : null;\n const selectedOMRecordId = replayRecordId ?? manualSelectionInRange;\n\n return (\n <div className=\"flex h-full w-full flex-col overflow-hidden\">\n <div className=\"flex shrink-0 items-center gap-2 border-b border-border1 px-3 py-2.5\">\n <Button type=\"button\" variant=\"ghost\" size=\"icon-sm\" tooltip=\"Back to memory\" onClick={() => onClose?.()}>\n <ArrowLeftIcon />\n </Button>\n <span className=\"flex min-w-0 items-center gap-1.5 text-neutral6\">\n <MemoryIcon className=\"h-4 w-4 shrink-0\" />\n <Txt as=\"span\" variant=\"ui-sm\" className=\"font-medium\">\n Observational memory\n </Txt>\n </span>\n </div>\n\n {isLoading ? (\n <div data-testid=\"memory-studio-loading\" className=\"flex flex-1 flex-col gap-3 p-4\">\n <Skeleton className=\"h-6 w-40\" />\n <Skeleton className=\"h-32 w-full\" />\n <Skeleton className=\"h-16 w-full\" />\n </div>\n ) : (\n <div className=\"grid min-h-0 flex-1 grid-rows-[1fr_auto] overflow-hidden\">\n <div className=\"min-h-0 flex flex-col overflow-hidden\">\n <ObservationDetailView\n records={visibleRecords}\n selectedRecordId={selectedOMRecordId}\n onSelectRecord={setManualOMRecordId}\n isLoading={isLoading}\n />\n </div>\n <div className=\"border-t border-border1\">\n <ThreadContextProgress\n messageTokens={contextWindow?.messageTokens ?? windowState?.messageTokens}\n messageThreshold={contextWindow?.messageThreshold ?? windowState?.messageThreshold}\n memoryTokens={memoryTokens}\n memoryThreshold={memoryThreshold}\n memoryLabel=\"Observations\"\n />\n <FlameGraph\n omRecords={omRecords}\n markers={markers}\n messages={messages}\n tDomain={tDomain}\n onSelectTimestamp={onSelectTimestamp}\n zoomRange={zoomRange}\n onZoomRangeChange={setZoomRange}\n />\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\n\nexport const memoryThreadMessagesQueryKey = (threadId: string, page?: number) =>\n ['memory', 'thread', threadId, 'messages', page ?? 0] as const;\n\nexport function useMemoryThreadMessages(threadId: string | undefined, opts?: { page?: number; perPage?: number }) {\n const client = useMastraClient();\n const page = opts?.page ?? 0;\n const perPage = opts?.perPage ?? 100;\n\n return useQuery({\n queryKey: memoryThreadMessagesQueryKey(threadId!, page),\n queryFn: () => client.getMemoryThread({ threadId: threadId! }).listMessages({ page, perPage }),\n enabled: !!threadId,\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\n\nexport const observationalMemoryQueryKey = (agentId: string, threadId: string) =>\n ['memory', 'observational-memory', agentId, threadId] as const;\n\nexport function useObservationalMemory(agentId: string | undefined, threadId: string | undefined, resourceId?: string) {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: observationalMemoryQueryKey(agentId!, threadId!),\n queryFn: () =>\n client.getObservationalMemory({\n agentId: agentId!,\n threadId: threadId!,\n resourceId,\n }),\n enabled: !!agentId && !!threadId,\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\n\nexport const memoryStatusQueryKey = (agentId: string, threadId?: string) =>\n ['memory', 'status', agentId, threadId ?? ''] as const;\n\nexport function useMemoryStatus(agentId: string | undefined, threadId?: string) {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: memoryStatusQueryKey(agentId!, threadId),\n queryFn: () =>\n client.getMemoryStatus(agentId!, undefined, {\n threadId,\n }),\n enabled: !!agentId,\n });\n}\n","import { Panel, Group } from 'react-resizable-panels';\nimport { CollapsiblePanel } from '@/lib/resize/collapsible-panel';\nimport { PanelSeparator } from '@/lib/resize/separator';\n\nexport interface TopicsLayoutProps {\n sidebar?: React.ReactNode;\n children?: React.ReactNode;\n tracePanel?: React.ReactNode;\n contentPadding?: boolean;\n}\n\nexport function TopicsLayout({ sidebar, children, tracePanel, contentPadding = true }: TopicsLayoutProps) {\n const hasContent = Boolean(children || tracePanel);\n\n return (\n <div className=\"flex h-full min-h-0 bg-surface2 text-neutral4\">\n {sidebar ? <aside className=\"min-h-0 w-[22rem] shrink-0 border-r border-border1\">{sidebar}</aside> : null}\n {hasContent ? (\n <main className={contentPadding ? 'min-w-0 flex-1 p-4' : 'min-w-0 flex-1'}>\n <Group className=\"h-full min-h-0 w-full min-w-0\" direction=\"horizontal\">\n {children ? (\n <Panel id=\"topic-main\" className=\"min-w-0 pr-2\" minSize={35}>\n {children}\n </Panel>\n ) : null}\n {tracePanel ? (\n <>\n {children ? <PanelSeparator /> : null}\n <CollapsiblePanel\n direction=\"right\"\n id=\"topic-trace-details\"\n minSize={300}\n maxSize=\"70%\"\n defaultSize={children ? '40%' : '100%'}\n collapsedSize={60}\n collapsible\n className=\"min-w-0 pl-2\"\n >\n {tracePanel}\n </CollapsiblePanel>\n </>\n ) : null}\n </Group>\n </main>\n ) : null}\n </div>\n );\n}\n","import type {\n Topic,\n TopicSubtopic,\n TopicSubtopicWithCounts,\n TopicTraceShare,\n TopicTraceSort,\n TopicTraceSummary,\n TopicWithCounts,\n} from './types';\n\nconst TOPIC_COLORS = ['#7C3AED', '#2563EB', '#0891B2', '#059669', '#CA8A04', '#EA580C', '#DC2626', '#DB2777'];\n\nfunction hashString(value: string): number {\n let hash = 0;\n for (let index = 0; index < value.length; index += 1) {\n hash = (hash << 5) - hash + value.charCodeAt(index);\n hash |= 0;\n }\n return Math.abs(hash);\n}\n\nexport function getTopicColor(id: string): string {\n return TOPIC_COLORS[hashString(id) % TOPIC_COLORS.length];\n}\n\nexport function getTraceCount(subtopic: Pick<TopicSubtopic, 'traceSummaries'>): number {\n return subtopic.traceSummaries.length;\n}\n\nexport function getTopicTraceCount(topic: Pick<Topic, 'subtopics'>): number {\n return topic.subtopics.reduce((total, subtopic) => total + getTraceCount(subtopic), 0);\n}\n\nexport function getTraceShare(count: number, total: number): TopicTraceShare {\n return {\n count,\n total,\n percentage: total > 0 ? Math.round((count / total) * 100) : 0,\n };\n}\n\nexport function aggregateTopics(topics: Topic[]): TopicWithCounts[] {\n const totalTraceCount = topics.reduce((total, topic) => total + getTopicTraceCount(topic), 0);\n\n return topics.map(topic => ({\n ...topic,\n color: topic.color ?? getTopicColor(topic.id),\n traceCount: getTopicTraceCount(topic),\n subtopics: topic.subtopics.map<TopicSubtopicWithCounts>(subtopic => {\n const traceCount = getTraceCount(subtopic);\n return {\n ...subtopic,\n color: subtopic.color ?? topic.color ?? getTopicColor(subtopic.id),\n traceCount,\n traceShare: getTraceShare(traceCount, totalTraceCount),\n };\n }),\n }));\n}\n\nfunction toTime(value: string | Date | undefined): number {\n if (!value) return 0;\n const time = value instanceof Date ? value.getTime() : new Date(value).getTime();\n return Number.isNaN(time) ? 0 : time;\n}\n\nexport function filterTraceSummaries(traces: TopicTraceSummary[], search: string): TopicTraceSummary[] {\n const normalizedSearch = search.trim().toLowerCase();\n if (!normalizedSearch) return traces;\n\n return traces.filter(trace =>\n [trace.id, trace.name, trace.entityName, trace.status].some(value =>\n value?.toLowerCase().includes(normalizedSearch),\n ),\n );\n}\n\nexport function sortTraceSummaries(traces: TopicTraceSummary[], sort: TopicTraceSort): TopicTraceSummary[] {\n return traces.toSorted((left, right) => {\n switch (sort) {\n case 'oldest':\n return toTime(left.startedAt) - toTime(right.startedAt);\n case 'duration-desc':\n return (right.durationMs ?? 0) - (left.durationMs ?? 0);\n case 'duration-asc':\n return (left.durationMs ?? 0) - (right.durationMs ?? 0);\n case 'newest':\n default:\n return toTime(right.startedAt) - toTime(left.startedAt);\n }\n });\n}\n\nexport function getVisibleTraceSummaries(\n traces: TopicTraceSummary[],\n options: { search: string; sort: TopicTraceSort; page: number; pageSize: number },\n): { traces: TopicTraceSummary[]; total: number; hasMore: boolean } {\n const filtered = filterTraceSummaries(traces, options.search);\n const sorted = sortTraceSummaries(filtered, options.sort);\n const end = options.page * options.pageSize;\n\n return {\n traces: sorted.slice(0, end),\n total: sorted.length,\n hasMore: end < sorted.length,\n };\n}\n","import { useMemo, useState } from 'react';\nimport type { TopicTraceSummary } from '../types';\nimport { getVisibleTraceSummaries } from '../utils';\nimport { Button } from '@/ds/components/Button';\nimport { DataList } from '@/ds/components/DataList/data-list';\nimport { Searchbar } from '@/ds/components/Searchbar';\n\nexport interface TopicTraceSummaryListProps {\n traces: TopicTraceSummary[];\n selectedTraceId?: string | null;\n onTraceSelect: (trace: TopicTraceSummary) => void;\n pageSize?: number;\n}\n\nexport function TopicTraceSummaryList({\n traces,\n selectedTraceId,\n onTraceSelect,\n pageSize = 25,\n}: TopicTraceSummaryListProps) {\n const [search, setSearch] = useState('');\n const [page, setPage] = useState(1);\n\n const visible = useMemo(\n () => getVisibleTraceSummaries(traces, { search, sort: 'newest', page, pageSize }),\n [page, pageSize, search, traces],\n );\n\n return (\n <section className=\"flex min-h-0 flex-1 flex-col gap-4\" aria-label=\"Topic trace summaries\">\n <Searchbar\n label=\"Search traces\"\n placeholder=\"Search traces\"\n onSearch={value => {\n setSearch(value);\n setPage(1);\n }}\n />\n\n <DataList columns=\"minmax(12rem,1fr)\" className=\"min-h-0 flex-1\">\n <DataList.Top>\n <DataList.TopCells>\n <DataList.TopCell>Trace summary</DataList.TopCell>\n </DataList.TopCells>\n </DataList.Top>\n\n {visible.traces.length === 0 ? (\n <DataList.NoMatch message=\"No traces match this subtopic.\" />\n ) : (\n visible.traces.map(trace => (\n <DataList.RowButton\n key={trace.id}\n featured={selectedTraceId === trace.id}\n onClick={() => onTraceSelect(trace)}\n aria-pressed={selectedTraceId === trace.id}\n >\n <DataList.TextCell>{trace.name ?? trace.id}</DataList.TextCell>\n </DataList.RowButton>\n ))\n )}\n </DataList>\n\n {visible.hasMore ? (\n <Button variant=\"outline\" size=\"sm\" onClick={() => setPage(currentPage => currentPage + 1)}>\n Load more traces ({visible.traces.length} of {visible.total})\n </Button>\n ) : null}\n </section>\n );\n}\n","import { SpanDataPanelView } from '@/domains/traces/components/span-data-panel-view';\nimport { TraceDetailsView } from '@/domains/traces/components/trace-details-view';\nimport { useSpanDetail } from '@/domains/traces/hooks/use-span-detail';\nimport { useTraceLightSpans } from '@/domains/traces/hooks/use-trace-light-spans';\nimport { useTraceSpanNavigation } from '@/domains/traces/hooks/use-trace-span-navigation';\nimport { cn } from '@/lib/utils';\n\nexport interface TopicTraceDetailsPanelProps {\n traceId: string | null;\n selectedSpanId?: string | null;\n onSpanSelect?: (spanId: string | undefined) => void;\n onClose: () => void;\n}\n\nexport function TopicTraceDetailsPanel({\n traceId,\n selectedSpanId,\n onSpanSelect,\n onClose,\n}: TopicTraceDetailsPanelProps) {\n const traceSpans = useTraceLightSpans(traceId);\n const spanDetail = useSpanDetail(traceId, selectedSpanId);\n const { handlePreviousSpan, handleNextSpan } = useTraceSpanNavigation(\n traceSpans.data?.spans,\n selectedSpanId,\n spanId => onSpanSelect?.(spanId),\n );\n\n if (!traceId) return null;\n\n return (\n <div\n className={cn(\n 'grid h-full min-h-0 overflow-auto',\n selectedSpanId ? 'grid-rows-[minmax(0,1fr)_minmax(0,1fr)] gap-4' : 'grid-rows-[minmax(0,1fr)]',\n )}\n >\n <TraceDetailsView\n traceId={traceId}\n spans={traceSpans.data?.spans}\n isLoading={traceSpans.isLoading}\n selectedSpanId={selectedSpanId}\n onSpanSelect={onSpanSelect}\n onClose={onClose}\n />\n {selectedSpanId ? (\n <SpanDataPanelView\n traceId={traceId}\n spanId={selectedSpanId}\n span={spanDetail.data?.span}\n isLoading={spanDetail.isLoading}\n onClose={() => onSpanSelect?.(undefined)}\n onPrevious={handlePreviousSpan}\n onNext={handleNextSpan}\n />\n ) : null}\n </div>\n );\n}\n","import { stringToColor } from '../../lib/colors';\nimport type { SignalCluster } from './types';\n\nconst SIGNAL_CHART_CLUSTERS = [\n { label: 'Fast paths', count: 27, duration: 120, spans: 5 },\n { label: 'Standard paths', count: 27, duration: 620, spans: 14 },\n { label: 'Complex paths', count: 26, duration: 1280, spans: 28 },\n];\n\nexport type SignalChartPoint = {\n id: string;\n name: string;\n cluster: string;\n duration: number;\n spans: number;\n color: string;\n};\n\nexport function getSignalChartData(clusters: SignalCluster[]): SignalChartPoint[] {\n return clusters.flatMap((cluster, clusterIndex) =>\n SIGNAL_CHART_CLUSTERS.flatMap(path =>\n Array.from({ length: path.count }, (_, index) => {\n const offset = index - (path.count - 1) / 2;\n const durationJitter = ((index * 37 + clusterIndex * 19) % 90) - 45;\n const durationScatter = Math.sin((index + 1 + clusterIndex) * 1.7) * 34 + Math.cos((index + 3) * 0.9) * 21;\n const spanJitter = ((index * 11 + clusterIndex * 3) % 7) - 3;\n\n return {\n id: `${cluster.id}-${path.label.toLowerCase().replaceAll(' ', '-')}-${index + 1}`,\n name: `${cluster.name} · ${path.label} ${index + 1}`,\n cluster: path.label,\n duration: Math.max(0, Math.round(path.duration + offset * 8 + durationJitter + durationScatter)),\n spans: Math.max(1, path.spans + spanJitter),\n color: stringToColor(`${cluster.name}-${path.label}`),\n };\n }),\n ),\n );\n}\n","import type { Signal } from './types';\n\nexport const signals: Signal[] = [\n {\n id: 'tasks',\n name: 'Tasks',\n description: 'Operational work patterns inferred from agent traces and user requests.',\n clusters: [\n {\n id: 'refunds',\n name: 'Refunds',\n description: 'Refund requests, policy checks, and payment reversals.',\n traceSummaries: [\n {\n id: 'trace-refund-1',\n name: 'Refund eligibility check',\n status: 'success',\n startedAt: '2026-06-15T10:00:00.000Z',\n durationMs: 1240,\n entityName: 'support-agent',\n spanCount: 8,\n },\n {\n id: 'trace-refund-2',\n name: 'Refund escalation',\n status: 'error',\n startedAt: '2026-06-15T09:40:00.000Z',\n durationMs: 3180,\n entityName: 'support-agent',\n spanCount: 12,\n },\n ],\n },\n {\n id: 'shipping',\n name: 'Shipping',\n description: 'Shipment lookup, carrier updates, and delivery exceptions.',\n traceSummaries: [\n {\n id: 'trace-shipping-1',\n name: 'Track delayed package',\n status: 'success',\n startedAt: '2026-06-15T08:30:00.000Z',\n durationMs: 980,\n entityName: 'support-agent',\n spanCount: 6,\n },\n ],\n },\n {\n id: 'account-updates',\n name: 'Account updates',\n description: 'Profile edits, plan changes, and account recovery requests.',\n traceSummaries: [\n {\n id: 'trace-account-1',\n name: 'Update billing contact',\n status: 'success',\n startedAt: '2026-06-15T07:45:00.000Z',\n durationMs: 1420,\n entityName: 'support-agent',\n spanCount: 7,\n },\n {\n id: 'trace-account-2',\n name: 'Recover locked account',\n status: 'success',\n startedAt: '2026-06-15T07:10:00.000Z',\n durationMs: 2640,\n entityName: 'support-agent',\n spanCount: 11,\n },\n ],\n },\n {\n id: 'subscription-changes',\n name: 'Subscription changes',\n description: 'Upgrade, downgrade, pause, and renewal intent across plans.',\n traceSummaries: [\n {\n id: 'trace-subscription-1',\n name: 'Downgrade plan request',\n status: 'success',\n startedAt: '2026-06-15T06:50:00.000Z',\n durationMs: 1880,\n entityName: 'support-agent',\n spanCount: 9,\n },\n ],\n },\n ],\n },\n {\n id: 'sentiment',\n name: 'Sentiment',\n description: 'Conversation tone and confidence shifts that affect user outcomes.',\n clusters: [\n {\n id: 'negative-feedback',\n name: 'Negative feedback',\n description: 'Escalations, frustration signals, and unresolved customer intent.',\n traceSummaries: [\n {\n id: 'trace-sentiment-1',\n name: 'De-escalate frustrated customer',\n status: 'success',\n startedAt: '2026-06-15T12:30:00.000Z',\n durationMs: 2150,\n entityName: 'support-agent',\n spanCount: 10,\n },\n ],\n },\n {\n id: 'positive-feedback',\n name: 'Positive feedback',\n description: 'Gratitude, satisfaction, and confirmation that the user outcome was met.',\n traceSummaries: [\n {\n id: 'trace-sentiment-2',\n name: 'Capture satisfied customer outcome',\n status: 'success',\n startedAt: '2026-06-15T12:05:00.000Z',\n durationMs: 1320,\n entityName: 'support-agent',\n spanCount: 5,\n },\n ],\n },\n {\n id: 'uncertain-feedback',\n name: 'Uncertain feedback',\n description: 'Ambiguous responses where sentiment or next best action needs clarification.',\n traceSummaries: [\n {\n id: 'trace-sentiment-3',\n name: 'Clarify ambiguous response',\n status: 'running',\n startedAt: '2026-06-15T11:35:00.000Z',\n durationMs: 1760,\n entityName: 'support-agent',\n spanCount: 8,\n },\n ],\n },\n ],\n },\n {\n id: 'issue',\n name: 'Issue',\n description: 'Recurring issue families found across support, research, and workflow traces.',\n clusters: [\n {\n id: 'revenue-analysis',\n name: 'Revenue analysis',\n description: 'Revenue-impacting requests, market scans, and financial summaries.',\n traceSummaries: [\n {\n id: 'trace-revenue-1',\n name: 'Summarize revenue movement',\n status: 'running',\n startedAt: '2026-06-15T11:05:00.000Z',\n durationMs: 4520,\n entityName: 'research-agent',\n spanCount: 15,\n },\n ],\n },\n ],\n },\n {\n id: 'severity',\n name: 'Severity',\n description: 'Risk and urgency bands inferred from trace paths and intervention needs.',\n clusters: [\n {\n id: 'urgent-escalations',\n name: 'Urgent escalations',\n description: 'High-priority paths that require faster handoff or deeper inspection.',\n traceSummaries: [\n {\n id: 'trace-severity-1',\n name: 'Escalate urgent account issue',\n status: 'error',\n startedAt: '2026-06-15T13:10:00.000Z',\n durationMs: 3880,\n entityName: 'support-agent',\n spanCount: 18,\n },\n ],\n },\n ],\n },\n];\n","import { useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { useTraces } from '../../../domains/traces/hooks';\nimport { ScatterPlotChart } from '../../../ds/components/ScatterPlotChart';\nimport { Tab, TabContent, TabList, Tabs } from '../../../ds/components/Tabs';\nimport { stringToColor } from '../../../lib/colors';\nimport { cn } from '../../../lib/utils';\nimport { TopicTraceDetailsPanel, TopicTraceSummaryList, TopicsLayout } from '../../topics';\nimport { getSignalChartData } from '../signals-chart-data';\nimport { signals } from '../signals-data';\nimport type { Signal, SignalCluster } from '../types';\n\nconst SignalTraceSummaryList = TopicTraceSummaryList;\nexport const SignalTraceDetailsPanel = TopicTraceDetailsPanel;\nconst SignalsLayout = TopicsLayout;\n\ntype SignalTab = 'trace-list' | 'chart';\n\nfunction findClusterByTraceId(signal: Signal | undefined, traceId: string | undefined) {\n if (!signal || !traceId) return undefined;\n return signal.clusters.find(cluster => cluster.traceSummaries.some(trace => trace.id === traceId));\n}\n\ninterface SignalClusterSidebarProps {\n signal: Signal;\n selectedClusterIds: string[];\n onClusterSelect: (clusterId: string) => void;\n multiple?: boolean;\n ariaLabel?: string;\n}\n\nexport function SignalClusterSidebar({\n signal,\n selectedClusterIds,\n onClusterSelect,\n multiple = false,\n ariaLabel = 'Signal clusters',\n}: SignalClusterSidebarProps) {\n return (\n <aside\n className=\"min-h-0 w-72 shrink-0 overflow-y-auto border-r border-border1/60 pr-4 py-4\"\n aria-label={ariaLabel}\n >\n <ul className=\"space-y-1\" role={multiple ? 'group' : undefined}>\n {signal.clusters.map(cluster => {\n const selected = selectedClusterIds.includes(cluster.id);\n return (\n <li key={cluster.id}>\n <button\n type=\"button\"\n role={multiple ? 'checkbox' : undefined}\n aria-checked={multiple ? selected : undefined}\n aria-pressed={multiple ? undefined : selected}\n className=\"group cursor-pointer w-full rounded-xl px-3 py-2 text-left transition-colors hover:bg-surface3 aria-pressed:bg-surface3 aria-checked:bg-surface3 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent1\"\n onClick={() => onClusterSelect(cluster.id)}\n >\n <span className=\"flex items-start gap-2\">\n <span\n className={cn('mt-1.5 h-2 w-2 shrink-0 rounded-full', multiple && !selected && 'invisible')}\n style={{ backgroundColor: stringToColor(cluster.name) }}\n />\n <span className=\"min-w-0 space-y-1\">\n <span\n className={cn(\n 'block text-sm font-medium',\n multiple && !selected ? 'text-neutral3' : 'text-neutral5',\n )}\n >\n {cluster.name}\n </span>\n <span\n className={cn(\n 'line-clamp-2 block text-sm',\n multiple && !selected ? 'text-neutral1' : 'text-neutral2',\n )}\n >\n {cluster.description}\n </span>\n </span>\n </span>\n </button>\n </li>\n );\n })}\n </ul>\n </aside>\n );\n}\n\nexport function SignalTraceListTab({\n cluster,\n selectedTraceId,\n onTraceSelect,\n}: {\n cluster: SignalCluster;\n selectedTraceId: string | null;\n onTraceSelect: () => void;\n}) {\n return (\n <SignalTraceSummaryList\n traces={cluster.traceSummaries}\n selectedTraceId={selectedTraceId}\n onTraceSelect={onTraceSelect}\n />\n );\n}\n\ninterface SignalChartTabProps {\n signal: Signal;\n selectedClusterIds: string[];\n onClusterToggle: (clusterId: string) => void;\n}\n\nexport function SignalChartTab({ signal, selectedClusterIds, onClusterToggle }: SignalChartTabProps) {\n const selectedClusters = useMemo(\n () => signal.clusters.filter(cluster => selectedClusterIds.includes(cluster.id)),\n [signal.clusters, selectedClusterIds],\n );\n const chartData = useMemo(() => getSignalChartData(selectedClusters), [selectedClusters]);\n\n return (\n <div className=\"flex h-full min-w-0 gap-6\">\n <SignalClusterSidebar\n signal={signal}\n selectedClusterIds={selectedClusterIds}\n onClusterSelect={onClusterToggle}\n multiple\n ariaLabel=\"Chart cluster filters\"\n />\n <div className=\"min-h-0 min-w-0 flex-1 py-4\">\n <ScatterPlotChart\n data={chartData}\n xKey=\"duration\"\n yKey=\"spans\"\n nameKey=\"name\"\n colorKey=\"color\"\n height=\"100%\"\n className=\"h-full\"\n xLabel=\"Duration\"\n yLabel=\"Spans\"\n formatX={value => `${value}ms`}\n formatY={value => `${value} spans`}\n />\n </div>\n </div>\n );\n}\n\ninterface SignalClusterTabsProps {\n signal: Signal;\n selectedCluster: SignalCluster;\n selectedTraceId: string | null;\n selectedChartClusterIds: string[];\n activeTab: SignalTab;\n onActiveTabChange: (tab: SignalTab) => void;\n onClusterSelect: (clusterId: string) => void;\n onChartClusterToggle: (clusterId: string) => void;\n onTraceSelect: () => void;\n}\n\nexport function SignalClusterTabs({\n signal,\n selectedCluster,\n selectedTraceId,\n selectedChartClusterIds,\n activeTab,\n onActiveTabChange,\n onClusterSelect,\n onChartClusterToggle,\n onTraceSelect,\n}: SignalClusterTabsProps) {\n return (\n <Tabs<SignalTab>\n defaultTab=\"trace-list\"\n value={activeTab}\n onValueChange={onActiveTabChange}\n className=\"flex h-full min-h-0 flex-col overflow-hidden\"\n >\n <TabList variant=\"line\">\n <Tab value=\"trace-list\">Trace list</Tab>\n <Tab value=\"chart\">Chart</Tab>\n </TabList>\n <TabContent value=\"trace-list\" className=\"min-h-0 flex-1 overflow-hidden py-0\">\n <div className=\"flex h-full min-w-0 gap-6\">\n <SignalClusterSidebar\n signal={signal}\n selectedClusterIds={[selectedCluster.id]}\n onClusterSelect={onClusterSelect}\n />\n <div className=\"min-w-0 flex-1 overflow-hidden py-4\">\n <SignalTraceListTab\n cluster={selectedCluster}\n selectedTraceId={selectedTraceId}\n onTraceSelect={onTraceSelect}\n />\n </div>\n </div>\n </TabContent>\n <TabContent value=\"chart\" className=\"min-h-0 flex-1 overflow-hidden py-0\">\n <SignalChartTab\n signal={signal}\n selectedClusterIds={selectedChartClusterIds}\n onClusterToggle={onChartClusterToggle}\n />\n </TabContent>\n </Tabs>\n );\n}\n\nexport interface SignalDetailsPageProps {\n signalId?: string;\n selectedTraceId: string | null;\n tracePanel?: ReactNode;\n onTraceSelect: (signalId: string, traceId: string) => void;\n}\n\nexport function SignalDetailsPage({ signalId, selectedTraceId, tracePanel, onTraceSelect }: SignalDetailsPageProps) {\n const selectedSignal = useMemo(() => signals.find(signal => signal.id === signalId), [signalId]);\n const initialCluster =\n findClusterByTraceId(selectedSignal, selectedTraceId ?? undefined) ?? selectedSignal?.clusters[0];\n const [selectedClusterId, setSelectedClusterId] = useState<string | null>(() => initialCluster?.id ?? null);\n const [selectedChartClusterIds, setSelectedChartClusterIds] = useState<string[]>(\n () => selectedSignal?.clusters.map(cluster => cluster.id) ?? [],\n );\n const [activeTab, setActiveTab] = useState<SignalTab>('trace-list');\n const selectedCluster = selectedSignal?.clusters.find(cluster => cluster.id === selectedClusterId) ?? initialCluster;\n const { data: tracesData } = useTraces({});\n const resolvedTraceId = tracesData?.spans[0]?.traceId ?? null;\n\n const handleTraceSelect = () => {\n if (!selectedSignal || !resolvedTraceId) return;\n\n onTraceSelect(selectedSignal.id, resolvedTraceId);\n };\n\n const handleChartClusterToggle = (clusterId: string) => {\n setSelectedChartClusterIds(current =>\n current.includes(clusterId) ? current.filter(id => id !== clusterId) : [...current, clusterId],\n );\n };\n\n if (!selectedSignal || !selectedCluster) {\n return <SignalsLayout sidebar={null}>Signal not found</SignalsLayout>;\n }\n\n return (\n <SignalsLayout sidebar={null} tracePanel={activeTab === 'trace-list' ? tracePanel : undefined}>\n <section className=\"flex h-full min-w-0 flex-col gap-4\">\n <header className=\"space-y-1\">\n <h1 className=\"text-icon-xl font-semibold text-neutral6\">{selectedSignal.name}</h1>\n <p className=\"text-ui-sm text-neutral3\">Explore trace patterns by cluster.</p>\n </header>\n <div className=\"min-h-0 flex-1 overflow-hidden\">\n <SignalClusterTabs\n signal={selectedSignal}\n selectedCluster={selectedCluster}\n selectedTraceId={selectedTraceId}\n selectedChartClusterIds={selectedChartClusterIds}\n activeTab={activeTab}\n onActiveTabChange={setActiveTab}\n onClusterSelect={setSelectedClusterId}\n onChartClusterToggle={handleChartClusterToggle}\n onTraceSelect={handleTraceSelect}\n />\n </div>\n </section>\n </SignalsLayout>\n );\n}\n","import { signals } from '../signals-data';\n\nexport function getSignalName(signalId: string) {\n return signals.find(signal => signal.id === signalId)?.name ?? signalId;\n}\n","import { ArrowUpRight } from 'lucide-react';\nimport { useMemo } from 'react';\nimport { Badge } from '../../../ds/components/Badge';\nimport { Button } from '../../../ds/components/Button';\nimport { stringToColor } from '../../../lib/colors';\nimport { TopicsLayout } from '../../topics';\nimport { signals } from '../signals-data';\nimport type { Signal, SignalCluster } from '../types';\n\ninterface SignalClusterCardProps {\n cluster: SignalCluster;\n totalTraceCount: number;\n}\n\nconst getTraceShare = (traceCount: number, totalTraceCount: number) => {\n if (totalTraceCount === 0) return 0;\n\n return Math.round((traceCount / totalTraceCount) * 100);\n};\n\nexport function SignalClusterCard({ cluster, totalTraceCount }: SignalClusterCardProps) {\n const traceCount = cluster.traceSummaries.length;\n const traceShare = getTraceShare(traceCount, totalTraceCount);\n const traceLabel = traceCount === 1 ? 'trace' : 'traces';\n const clusterColor = stringToColor(cluster.name);\n\n return (\n <article className=\"rounded-2xl border border-border1/70 bg-surface2 p-5 shadow-sm\">\n <div className=\"flex h-full min-w-0 flex-col\">\n <div className=\"flex min-w-0 items-start gap-2\">\n <span className=\"mt-2 h-2.5 w-2.5 shrink-0 rounded-full\" style={{ backgroundColor: clusterColor }} />\n\n <div>\n <h3 className=\"text-md font-semibold text-neutral6\">{cluster.name}</h3>\n <p className=\"line-clamp-2 text-sm text-neutral3\">{cluster.description}</p>\n </div>\n </div>\n\n <div className=\"space-y-1 pt-4 pl-4\">\n <div className=\"flex items-center justify-between\">\n <p className=\"font-mono text-xs uppercase text-neutral3\">Trace share</p>\n <p className=\"font-mono text-xs text-neutral3\">\n {traceCount} {traceLabel}\n </p>\n </div>\n\n <div className=\"grid grid-cols-[minmax(0,1fr)_4rem] items-center gap-4\">\n <div\n className=\"h-3 overflow-hidden rounded-full bg-surface4\"\n role=\"progressbar\"\n aria-label={`${cluster.name} trace share`}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={traceShare}\n >\n <div className=\"h-full rounded-full\" style={{ width: `${traceShare}%`, backgroundColor: clusterColor }} />\n </div>\n <p className=\"text-right text-ui-md font-semibold text-neutral6\">{traceShare}%</p>\n </div>\n </div>\n </div>\n </article>\n );\n}\n\ninterface SignalSectionProps {\n signal: Signal;\n onSeeDetails: (signal: Signal) => void;\n}\n\nexport function SignalSection({ signal, onSeeDetails }: SignalSectionProps) {\n const totalTraceCount = useMemo(\n () => signal.clusters.reduce((total, cluster) => total + cluster.traceSummaries.length, 0),\n [signal.clusters],\n );\n\n return (\n <section className=\"space-y-4\">\n <header className=\"flex items-start justify-between gap-6 px-1\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-3\">\n <h2 className=\"text-ui-2xl font-semibold text-neutral6\">{signal.name}</h2>\n <Badge variant=\"default\">\n {signal.clusters.length} {signal.clusters.length === 1 ? 'cluster' : 'clusters'}\n </Badge>\n </div>\n <p className=\"text-ui-lg text-neutral3\">{signal.description}</p>\n </div>\n\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"lg\"\n className=\"shrink-0 gap-2 rounded-xl px-5\"\n onClick={() => onSeeDetails(signal)}\n >\n See details\n <ArrowUpRight className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n </header>\n <div className=\"grid gap-6 md:grid-cols-2\">\n {signal.clusters.map(cluster => (\n <SignalClusterCard key={cluster.id} cluster={cluster} totalTraceCount={totalTraceCount} />\n ))}\n </div>\n </section>\n );\n}\n\nexport interface SignalsOverviewPageProps {\n onSignalSelect: (signal: Signal) => void;\n}\n\nexport function SignalsOverviewPage({ onSignalSelect }: SignalsOverviewPageProps) {\n return (\n <TopicsLayout sidebar={null} contentPadding={false}>\n <nav className=\"h-full min-w-0 overflow-y-auto p-6\" aria-label=\"Signals\">\n <div className=\"mx-auto flex max-w-6xl flex-col gap-12\">\n {signals.map(signal => (\n <SignalSection key={signal.id} signal={signal} onSeeDetails={onSignalSelect} />\n ))}\n </div>\n </nav>\n </TopicsLayout>\n );\n}\n"],"names":["str","Braces","List","Hash","ToggleLeft","Type","jsx","cn","jsxs","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Icon","React","Equal","EqualNot","TextSearch","Text","ChevronRight","ChevronLeft","ChevronsRight","ChevronsLeft","ListX","Check","Ban","Input","isArrayOperator","Fragment","Button","X","Plus","Component","useRef","useCallback","useState","useEffect","usePanelRef","Panel","Separator","ResizeHandleIndicator","Drawer","DrawerTrigger","DrawerPortal","DrawerBackdrop","DrawerViewport","DrawerPopup","DrawerTitle","create","persist","EntityType","createContext","useContext","format","useMemo","DateTimeRangePicker","Tooltip","TooltipTrigger","TooltipContent","EyeIcon","LogsIcon","MetricsKpiCard","MetricsCard","MetricsLineChart","Tabs","TabList","Tab","TabContent","DataList","HorizontalBars","PRESET_MS","useMastraClient","useQuery","TOP_N","value","from","to","spans","AgentIcon","WorkflowIcon","BrainIcon","McpServerIcon","ToolsIcon","MemoryIcon","FolderIcon","GaugeIcon","DataKeysAndValues","ChevronUpIcon","ChevronDownIcon","ChevronsUpIcon","ChevronsDownIcon","FoldVerticalIcon","UnfoldVerticalIcon","ChevronsDownUpIcon","ChevronsUpDownIcon","tooltip","HoverCard","HoverCardTrigger","HoverCardContent","types","Spinner","isNonDefaultFilter","PropertyFilterApplied","PropertyFilterActions","toast","Loader2Icon","DownloadIcon","DataPanel","ButtonsGroup","Link2Icon","CircleGaugeIcon","SaveIcon","WrenchIcon","Notice","FileInputIcon","FileOutputIcon","BracesIcon","KV","DataDetailsPanel","COLUMNS","ROW_HEIGHT","OVERSCAN","useVirtualizer","DataListSkeleton","TracesDataList","DropdownMenu","SessionExpired","PermissionDenied","ErrorState","PRESET_LABELS","DATE_FORMAT","describeRange","EmptyState","CircleSlashIcon","ExternalLinkIcon","IMMUTABLE_CACHE_TIME","useQueryClient","useInView","useInfiniteQuery","DAY_MS","clearSelectionParams","DEFAULT_SAVED_MESSAGE","DEFAULT_CLEARED_MESSAGE","ArrowUpIcon","ArrowDownIcon","ArrowRightIcon","CopyButton","LogsDataListSkeleton","LogsDataList","Skeleton","Checkbox","CodeDiff","getObservationTimestamp","ResponsiveContainer","AreaChart","XAxis","YAxis","Area","ReferenceLine","ScatterChart","Scatter","ComposedChart","label","RotateCcw","ArrowLeftIcon","Txt","Group","getTraceShare","Searchbar","ScatterPlotChart","Badge","ArrowUpRight"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/lib/object.ts","../src/lib/resize/panel-edge-icon.tsx","../src/lib/resize/panel-icon-button.ts","../src/lib/resize/use-clamped-element-cursor.ts","../src/lib/resize/collapsible-panel.tsx","../src/lib/resize/separator.tsx","../src/lib/resize/panel-drawer.tsx","../src/lib/template/generate-default-values.ts","../src/store/playground-store.ts","../src/domains/metrics/metrics-filters.ts","../src/domains/metrics/hooks/use-metrics.tsx","../src/domains/metrics/components/date-range-selector.tsx","../src/domains/metrics/components/metrics-utils.ts","../src/domains/metrics/components/bar-list.tsx","../src/domains/metrics/components/card-action-buttons.tsx","../src/domains/metrics/components/kpi-card-view.tsx","../src/domains/metrics/components/latency-card-view.tsx","../src/domains/metrics/components/memory-card-view.tsx","../src/domains/metrics/components/model-usage-cost-card-view.tsx","../src/domains/metrics/components/scores-card-view.tsx","../src/domains/metrics/components/token-usage-by-agent-card-view.tsx","../src/domains/metrics/components/token-usage-timeline-card-view.tsx","../src/domains/metrics/components/traces-volume-card-view.tsx","../src/domains/metrics/hooks/use-metrics-filters.tsx","../src/domains/metrics/hooks/use-agent-runs-kpi-metrics.tsx","../src/domains/metrics/hooks/use-model-cost-kpi-metrics.tsx","../src/domains/metrics/hooks/use-total-tokens-kpi-metrics.tsx","../src/domains/metrics/hooks/use-model-usage-cost-metrics.tsx","../src/domains/metrics/hooks/use-latency-metrics.tsx","../src/domains/metrics/hooks/use-trace-volume-metrics.tsx","../src/domains/metrics/hooks/use-scores-metrics.tsx","../src/domains/metrics/hooks/use-token-usage-by-agent-metrics.tsx","../src/domains/metrics/hooks/use-token-usage-timeseries.tsx","../src/domains/metrics/hooks/use-active-threads-kpi-metrics.tsx","../src/domains/metrics/hooks/use-active-resources-kpi-metrics.tsx","../src/domains/metrics/hooks/use-top-active-threads-metrics.tsx","../src/domains/metrics/hooks/use-top-resources-by-threads-metrics.tsx","../src/domains/logs/log-filters.ts","../src/domains/traces/trace-filters.ts","../src/domains/metrics/drilldown.ts","../src/domains/metrics/hooks/use-drilldown.tsx","../src/domains/traces/components/format-hierarchical-spans.ts","../src/domains/traces/components/shared.tsx","../src/domains/traces/components/span-token-usage.utils.ts","../src/domains/traces/components/span-token-usage.tsx","../src/domains/traces/components/timeline-expand-col.tsx","../src/domains/traces/components/timeline-structure-sign.tsx","../src/domains/traces/components/timeline-name-col.tsx","../src/domains/traces/components/timeline-timing-col.tsx","../src/domains/traces/components/trace-keys-and-values.tsx","../src/domains/traces/hooks/get-all-span-ids.ts","../src/domains/traces/components/trace-timeline-span.tsx","../src/domains/traces/components/trace-timeline.tsx","../src/domains/traces/components/traces-toolbar.tsx","../src/domains/traces/hooks/use-download-trace-json.ts","../src/domains/traces/components/trace-data-panel-view.tsx","../src/domains/traces/utils/span-utils.ts","../src/domains/traces/components/span-data-panel-view.tsx","../src/domains/traces/components/span-details-view.tsx","../src/domains/traces/components/trace-details-view.tsx","../src/domains/traces/components/traces-layout.tsx","../src/domains/traces/components/traces-list-view.tsx","../src/domains/traces/components/traces-list-mode-toggle.tsx","../src/domains/traces/components/traces-error-content.tsx","../src/domains/traces/components/no-traces-info.tsx","../src/domains/traces/hooks/use-branch.ts","../src/domains/traces/hooks/use-span-detail.ts","../src/domains/traces/hooks/use-trace-light-spans.ts","../src/domains/traces/hooks/use-trace-or-branch-spans.ts","../src/domains/traces/hooks/use-trace-spans.ts","../src/domains/traces/hooks/use-traces.tsx","../src/domains/traces/hooks/use-tags.ts","../src/domains/traces/hooks/use-entity-names.ts","../src/domains/traces/hooks/use-environments.ts","../src/domains/traces/hooks/use-service-names.ts","../src/domains/traces/hooks/use-trace-span-navigation.tsx","../src/domains/traces/hooks/use-trace-list-navigation.tsx","../src/domains/traces/hooks/use-trace-url-state.tsx","../src/domains/traces/hooks/use-trace-filter-persistence.tsx","../src/domains/traces/types.ts","../src/domains/logs/components/log-details-view.tsx","../src/domains/logs/components/logs-error-content.tsx","../src/domains/logs/components/logs-layout.tsx","../src/domains/logs/components/logs-list-view.tsx","../src/domains/logs/components/logs-toolbar.tsx","../src/domains/logs/components/no-logs-info.tsx","../src/domains/logs/hooks/use-logs.ts","../src/domains/logs/hooks/use-logs-url-state.tsx","../src/domains/logs/hooks/use-logs-filter-persistence.tsx","../src/domains/logs/hooks/use-logs-list-navigation.tsx","../src/domains/memory/components/observation-detail-view.tsx","../src/domains/memory/components/thread-context-progress-utils.ts","../src/domains/memory/components/thread-context-progress.tsx","../src/domains/memory/lib/timeline.ts","../src/domains/memory/lib/replay-selection.ts","../src/domains/memory/components/flame-graph.tsx","../src/domains/memory/lib/extract-markers.ts","../src/domains/memory/lib/thread-context-window-state.ts","../src/domains/memory/components/memory-studio-panel.tsx","../src/domains/memory/hooks/use-memory-thread-messages.ts","../src/domains/memory/hooks/use-observational-memory.ts","../src/domains/memory/hooks/use-memory-status.ts","../src/ee/topics/components/topics-layout.tsx","../src/ee/topics/utils.ts","../src/ee/topics/components/topic-trace-summary-list.tsx","../src/ee/topics/components/topic-trace-details-panel.tsx","../src/ee/signals/signals-chart-data.ts","../src/ee/signals/signals-data.ts","../src/ee/signals/components/signal-details-page.tsx","../src/ee/signals/components/signal-details-utils.ts","../src/ee/signals/components/signals-overview-page.tsx"],"sourcesContent":["/**\n * Checks if object is empty\n * @param objectName\n * @returns boolean\n */\nexport const isObjectEmpty = (objectName: Object) => {\n return objectName && Object.keys(objectName).length === 0 && objectName.constructor === Object;\n};\n","export interface PanelEdgeIconProps {\n side: 'left' | 'right';\n}\n\n// Single-tone panel glyph that reads clearly at 16px where lucide's\n// PanelLeftOpen arrow turns to mush. Same 24px grid / stroke 2 as lucide,\n// with a softer corner radius.\nexport const PanelEdgeIcon = ({ side }: PanelEdgeIconProps) => (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"5\" />\n <path d={side === 'left' ? 'M9 3v18' : 'M15 3v18'} />\n </svg>\n);\n","import { cn } from '@/lib/utils';\n\n// Ghost icon button shared by the collapsed-panel hint (desktop) and the\n// panel drawer trigger (mobile), so both edges read as the same affordance.\nexport const panelIconButtonClass = cn(\n 'flex size-8 cursor-pointer items-center justify-center rounded-full',\n 'border border-transparent bg-transparent text-neutral5 hover:bg-neutral6/5 hover:text-neutral6 active:bg-neutral6/10',\n 'transition-colors duration-150 ease-out-custom motion-reduce:transition-none',\n 'focus-visible:outline-hidden focus-visible:border-accent1',\n);\n","import { useCallback, useRef } from 'react';\n\nexport interface ClientPoint {\n clientX: number;\n clientY: number;\n}\n\nexport interface UseClampedElementCursorOptions {\n axis: 'x' | 'y';\n margin?: number;\n variableName: `--${string}`;\n}\n\nconst clamp = (value: number, min: number, max: number) => Math.min(max, Math.max(min, value));\n\nconst readAxis = (point: ClientPoint, rect: DOMRect, axis: 'x' | 'y') => {\n if (axis === 'x') {\n return { client: point.clientX, start: rect.left, size: rect.width };\n }\n\n return { client: point.clientY, start: rect.top, size: rect.height };\n};\n\nexport const getClampedElementCursorOffset = (point: ClientPoint, rect: DOMRect, axis: 'x' | 'y', margin = 0) => {\n const { client, start, size } = readAxis(point, rect, axis);\n return clamp(client - start, margin, Math.max(margin, size - margin));\n};\n\nexport const useClampedElementCursor = <TElement extends HTMLElement>({\n axis,\n margin = 0,\n variableName,\n}: UseClampedElementCursorOptions) => {\n const elementRef = useRef<TElement | null>(null);\n const rectRef = useRef<DOMRect | null>(null);\n\n const writePosition = useCallback(\n (point: ClientPoint, refreshRect = false) => {\n const element = elementRef.current;\n if (!element) return;\n\n const rect = refreshRect || !rectRef.current ? element.getBoundingClientRect() : rectRef.current;\n rectRef.current = rect;\n\n const offset = getClampedElementCursorOffset(point, rect, axis, margin);\n element.style.setProperty(variableName, `${offset}px`);\n },\n [axis, margin, variableName],\n );\n\n const beginTracking = useCallback(\n (point: ClientPoint) => {\n writePosition(point, true);\n },\n [writePosition],\n );\n\n const updateTracking = useCallback(\n (point: ClientPoint) => {\n writePosition(point);\n },\n [writePosition],\n );\n\n const endTracking = useCallback(() => {\n rectRef.current = null;\n }, []);\n\n return { beginTracking, elementRef, endTracking, updateTracking };\n};\n","import { ChevronLeft, ChevronRight } from 'lucide-react';\nimport type { CSSProperties, RefObject } from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { PanelProps } from 'react-resizable-panels';\nimport { Panel, usePanelRef } from 'react-resizable-panels';\nimport { PanelEdgeIcon } from './panel-edge-icon';\nimport { panelIconButtonClass } from './panel-icon-button';\nimport { useClampedElementCursor } from './use-clamped-element-cursor';\nimport { Icon } from '@/ds/icons';\nimport { cn } from '@/lib/utils';\n\nexport interface CollapsiblePanelProps extends PanelProps {\n direction: 'left' | 'right';\n}\n\n// The expand pill follows the pointer vertically along the edge, clamped so\n// it never bleeds past the strip's ends.\nconst PILL_EDGE_MARGIN = 22;\n\ntype PanelElementRef = RefObject<HTMLDivElement | null>;\n\nconst usePanelSizeTransitions = (elementRef: PanelElementRef) => {\n const [booted, setBooted] = useState(false);\n const bootedRef = useRef(false);\n const bootScheduled = useRef(false);\n const enableSizeTransitionsRef = useRef<() => void>(() => {});\n\n const enableSizeTransitions = useCallback(() => {\n enableSizeTransitionsRef.current();\n }, []);\n\n const boot = useCallback(() => {\n if (bootScheduled.current) return;\n bootScheduled.current = true;\n requestAnimationFrame(() => {\n bootedRef.current = true;\n setBooted(true);\n enableSizeTransitionsRef.current();\n });\n }, []);\n\n useEffect(() => {\n if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;\n const group = elementRef.current?.parentElement;\n if (!group) return;\n const panels = Array.from(group.children).filter(\n (child): child is HTMLElement => child instanceof HTMLElement && child.hasAttribute('data-panel'),\n );\n const separators = Array.from(group.children).filter(\n (child): child is HTMLElement => child instanceof HTMLElement && child.hasAttribute('data-separator'),\n );\n\n const enable = () => {\n if (!bootedRef.current) return;\n panels.forEach(\n panel =>\n (panel.style.transition =\n 'flex-grow 300ms var(--ease-out-custom, ease), flex-basis 300ms var(--ease-out-custom, ease)'),\n );\n };\n const disable = () => panels.forEach(panel => (panel.style.transition = 'none'));\n\n enable();\n enableSizeTransitionsRef.current = enable;\n separators.forEach(separator => separator.addEventListener('pointerdown', disable));\n window.addEventListener('pointerup', enable);\n window.addEventListener('pointercancel', enable);\n return () => {\n enableSizeTransitionsRef.current = () => {};\n separators.forEach(separator => separator.removeEventListener('pointerdown', disable));\n window.removeEventListener('pointerup', enable);\n window.removeEventListener('pointercancel', enable);\n panels.forEach(panel => (panel.style.transition = ''));\n };\n }, [elementRef]);\n\n return { booted, boot, enableSizeTransitions };\n};\n\nconst useCollapsedEdgePill = ({\n collapsed,\n direction,\n elementRef,\n}: {\n collapsed: boolean;\n direction: CollapsiblePanelProps['direction'];\n elementRef: PanelElementRef;\n}) => {\n const expandButtonRef = useRef<HTMLButtonElement | null>(null);\n const pillRef = useRef<HTMLSpanElement | null>(null);\n const {\n beginTracking: beginPillTracking,\n elementRef: stripRef,\n endTracking: endPillTracking,\n updateTracking: updatePillTracking,\n } = useClampedElementCursor<HTMLButtonElement>({\n axis: 'y',\n margin: PILL_EDGE_MARGIN,\n variableName: '--pill-y',\n });\n\n const setEdgeHovered = useCallback((hovered: boolean) => {\n const expandButton = expandButtonRef.current;\n const pill = pillRef.current;\n if (expandButton) expandButton.dataset.edgeHovered = hovered ? 'true' : 'false';\n if (pill) pill.dataset.edgeHovered = hovered ? 'true' : 'false';\n }, []);\n\n const spawnPill = useCallback(\n (point: { clientX: number; clientY: number }) => {\n const pill = pillRef.current;\n if (!pill) return;\n beginPillTracking(point);\n pill.style.transitionProperty = 'opacity, translate';\n requestAnimationFrame(() => {\n pill.style.transitionProperty = '';\n });\n },\n [beginPillTracking],\n );\n\n const trackPillPosition = useCallback(\n (point: { clientX: number; clientY: number }) => {\n updatePillTracking(point);\n },\n [updatePillTracking],\n );\n\n useEffect(() => {\n if (!collapsed) return;\n const panelElement = elementRef.current;\n const separator = direction === 'left' ? panelElement?.nextElementSibling : panelElement?.previousElementSibling;\n if (!(separator instanceof HTMLElement) || !separator.hasAttribute('data-separator')) return;\n\n const show = (event: PointerEvent) => {\n setEdgeHovered(true);\n spawnPill(event);\n };\n const hide = () => {\n setEdgeHovered(false);\n endPillTracking();\n };\n const follow = (event: PointerEvent) => trackPillPosition(event);\n separator.addEventListener('pointerenter', show);\n separator.addEventListener('pointerleave', hide);\n separator.addEventListener('pointermove', follow);\n return () => {\n separator.removeEventListener('pointerenter', show);\n separator.removeEventListener('pointerleave', hide);\n separator.removeEventListener('pointermove', follow);\n setEdgeHovered(false);\n endPillTracking();\n };\n }, [collapsed, direction, elementRef, endPillTracking, setEdgeHovered, spawnPill, trackPillPosition]);\n\n return { endPillTracking, expandButtonRef, stripRef, pillRef, spawnPill, trackPillPosition };\n};\n\nexport const CollapsiblePanel = ({\n collapsedSize,\n children,\n direction,\n className,\n onResize,\n style,\n minSize,\n ...props\n}: CollapsiblePanelProps) => {\n const [collapsed, setCollapsed] = useState(false);\n const panelRef = usePanelRef();\n const elementRef = useRef<HTMLDivElement | null>(null);\n const { booted, boot, enableSizeTransitions } = usePanelSizeTransitions(elementRef);\n const { endPillTracking, expandButtonRef, stripRef, pillRef, spawnPill, trackPillPosition } = useCollapsedEdgePill({\n collapsed,\n direction,\n elementRef,\n });\n\n const expand = useCallback(() => {\n enableSizeTransitions();\n if (!panelRef.current) return;\n panelRef.current.expand();\n }, [enableSizeTransitions, panelRef]);\n\n const numericMinSize = typeof minSize === 'number' ? minSize : null;\n\n return (\n <Panel\n panelRef={panelRef}\n elementRef={elementRef}\n collapsedSize={collapsedSize}\n minSize={minSize}\n className={cn('relative', className)}\n style={\n {\n overflow: collapsed ? 'visible' : 'hidden',\n '--panel-min-w': numericMinSize ? `${numericMinSize}px` : undefined,\n ...style,\n } as CSSProperties\n }\n {...props}\n onResize={(size, previousSize, panel) => {\n onResize?.(size, previousSize, panel);\n if (typeof collapsedSize !== 'number') return;\n setCollapsed(size.inPixels <= collapsedSize);\n boot();\n }}\n >\n <div\n inert={collapsed}\n data-state={collapsed ? 'collapsed' : 'open'}\n data-direction={direction}\n style={{\n minWidth: 'var(--panel-min-w)',\n opacity: collapsed ? 0 : undefined,\n translate: collapsed ? (direction === 'left' ? '-100% 0' : '100% 0') : undefined,\n }}\n className={cn(\n 'absolute inset-y-0 w-full overflow-hidden',\n 'transition-[opacity,translate] duration-300 ease-out-custom motion-reduce:transition-none',\n 'data-[direction=left]:left-0 data-[direction=right]:right-0',\n 'data-[state=collapsed]:z-10',\n !booted && 'transition-none',\n )}\n >\n {children}\n </div>\n\n {collapsed && (\n <>\n <button\n ref={expandButtonRef}\n type=\"button\"\n aria-label=\"Expand panel\"\n onClick={expand}\n className={cn(\n panelIconButtonClass,\n 'absolute top-2 z-10',\n 'transition-[color,background-color,opacity] duration-300 starting:opacity-0',\n direction === 'left' ? 'left-2' : 'right-2',\n 'data-[edge-hovered=true]:text-neutral6',\n )}\n >\n <Icon>\n <PanelEdgeIcon side={direction} />\n </Icon>\n </button>\n\n <button\n ref={stripRef}\n type=\"button\"\n tabIndex={-1}\n aria-hidden=\"true\"\n onClick={expand}\n onPointerEnter={event => spawnPill(event)}\n onPointerLeave={endPillTracking}\n onPointerMove={event => trackPillPosition(event)}\n style={{ '--pill-y': '50%' } as CSSProperties}\n className={cn(\n 'group/expand absolute inset-y-0 z-10 w-4 cursor-pointer focus-visible:outline-hidden',\n direction === 'left' ? 'left-1' : 'right-1',\n )}\n >\n <span\n ref={pillRef}\n style={{ top: 'var(--pill-y)' }}\n className={cn(\n 'absolute flex size-7 -translate-y-1/2 items-center justify-center rounded-full bg-neutral6 text-surface1 shadow-dialog',\n 'pointer-events-none opacity-0 transition-[opacity,translate,top] duration-150 ease-out-custom motion-reduce:transition-none',\n direction === 'left' ? 'left-0.5 -translate-x-1' : 'right-0.5 translate-x-1',\n 'group-hover/expand:pointer-events-auto group-hover/expand:translate-x-0 group-hover/expand:opacity-100',\n 'group-active/expand:bg-neutral6/80',\n 'data-[edge-hovered=true]:pointer-events-auto data-[edge-hovered=true]:translate-x-0 data-[edge-hovered=true]:opacity-100',\n )}\n >\n <Icon>{direction === 'left' ? <ChevronRight /> : <ChevronLeft />}</Icon>\n </span>\n </button>\n </>\n )}\n </Panel>\n );\n};\n","import { Separator } from 'react-resizable-panels';\nimport { ResizeHandleIndicator } from '@/ds/primitives/resize-handle-indicator';\nimport { cn } from '@/lib/utils';\n\nexport type PanelSeparatorProps = {\n /** `line` fits a visible container edge; `pill` floats when there is none. */\n variant?: 'line' | 'pill';\n};\n\nconst stateClasses = {\n line: cn(\n 'group-hover/separator:opacity-100',\n \"group-data-[separator='hover']/separator:opacity-100\",\n \"group-data-[separator='active']/separator:opacity-100 group-data-[separator='active']/separator:via-neutral6/45\",\n 'group-focus-visible/separator:opacity-100 group-focus-visible/separator:via-accent1',\n ),\n pill: cn(\n 'group-hover/separator:h-12 group-hover/separator:w-1',\n \"group-data-[separator='hover']/separator:h-12 group-data-[separator='hover']/separator:w-1\",\n \"group-data-[separator='active']/separator:h-12 group-data-[separator='active']/separator:w-1 group-data-[separator='active']/separator:bg-accent1\",\n 'group-focus-visible/separator:bg-accent1',\n ),\n};\n\nexport const PanelSeparator = ({ variant = 'line' }: PanelSeparatorProps) => {\n return (\n <Separator\n className={cn(\n 'group/separator relative w-0 bg-transparent z-10',\n 'focus:outline-hidden focus-visible:outline-hidden',\n )}\n >\n {/* Hit zone wider than the 0px separator; indicator centered inside. */}\n <span\n aria-hidden\n className=\"absolute inset-y-0 -left-1 -right-1 flex items-center justify-center cursor-col-resize touch-none\"\n >\n <ResizeHandleIndicator variant={variant} className={stateClasses[variant]} />\n </span>\n </Separator>\n );\n};\n","import type { ReactNode } from 'react';\nimport { PanelEdgeIcon } from './panel-edge-icon';\nimport { panelIconButtonClass } from './panel-icon-button';\nimport {\n Drawer,\n DrawerBackdrop,\n DrawerPopup,\n DrawerPortal,\n DrawerTitle,\n DrawerTrigger,\n DrawerViewport,\n} from '@/ds/components/Drawer';\nimport { Icon } from '@/ds/icons';\nimport { cn } from '@/lib/utils';\n\nexport interface PanelDrawerProps {\n direction: 'left' | 'right';\n /** Accessible name for the trigger button and the drawer. */\n label: string;\n children: ReactNode;\n}\n\nexport const PanelDrawer = ({ direction, label, children }: PanelDrawerProps) => {\n return (\n <Drawer side={direction}>\n <DrawerTrigger asChild>\n <button\n type=\"button\"\n aria-label={label}\n className={cn(panelIconButtonClass, 'absolute top-2 z-10', direction === 'left' ? 'left-2' : 'right-2')}\n >\n <Icon>\n <PanelEdgeIcon side={direction} />\n </Icon>\n </button>\n </DrawerTrigger>\n\n <DrawerPortal keepMounted>\n <DrawerBackdrop />\n <DrawerViewport>\n <DrawerPopup className=\"w-[calc(100vw-2.5rem)] max-w-[28rem]\">\n <DrawerTitle className=\"sr-only\">{label}</DrawerTitle>\n <div className=\"flex min-h-0 flex-1 flex-col\">{children}</div>\n </DrawerPopup>\n </DrawerViewport>\n </DrawerPortal>\n </Drawer>\n );\n};\n","import type { JsonSchema, JsonSchemaProperty } from '@/lib/json-schema';\n\nconst MAX_DEPTH = 10;\n\n/**\n * Generates a default value for a single property based on its type\n */\nfunction generatePropertyDefault(property: JsonSchemaProperty, depth: number): unknown {\n // Return explicit default if provided\n if (property.default !== undefined) {\n return property.default;\n }\n\n // Guard against circular references\n if (depth >= MAX_DEPTH) {\n return undefined;\n }\n\n const type = Array.isArray(property.type) ? property.type[0] : property.type;\n\n switch (type) {\n case 'string':\n return '';\n case 'number':\n case 'integer':\n return 0;\n case 'boolean':\n return false;\n case 'array':\n return [];\n case 'object':\n if (property.properties) {\n return generateObjectDefaults(property.properties, depth + 1);\n }\n return {};\n case 'null':\n return null;\n default:\n return '';\n }\n}\n\n/**\n * Generates default values for an object's properties\n */\nfunction generateObjectDefaults(\n properties: Record<string, JsonSchemaProperty>,\n depth: number,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, property] of Object.entries(properties)) {\n result[key] = generatePropertyDefault(property, depth);\n }\n\n return result;\n}\n\n/**\n * Generates default values from a JSON Schema.\n *\n * For each property:\n * - Uses `default` value if specified in schema\n * - Otherwise generates a placeholder based on type:\n * - string → \"\"\n * - number/integer → 0\n * - boolean → false\n * - array → []\n * - object → recurses into nested properties\n * - null → null\n *\n * @param schema - JSON Schema definition\n * @returns Object with default values for all properties\n */\nexport function generateDefaultValues(schema: JsonSchema | undefined): Record<string, unknown> {\n if (!schema || !schema.properties) {\n return {};\n }\n\n return generateObjectDefaults(schema.properties, 0);\n}\n","import { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\n\ninterface PlaygroundStore {\n requestContext: Record<string, any>;\n setRequestContext: (requestContext: Record<string, any>) => void;\n}\n\nexport const usePlaygroundStore = create<PlaygroundStore>()(\n persist(\n set => ({\n requestContext: {},\n setRequestContext: requestContext => set({ requestContext }),\n }),\n {\n name: 'mastra-playground-store',\n },\n ),\n);\n","import { EntityType } from '@mastra/core/observability';\nimport type { PropertyFilterField, PropertyFilterToken } from '@/ds/components/PropertyFilter/types';\n\n/** Primitive type options — matches the traces filter vocabulary. */\nexport const METRICS_ROOT_ENTITY_TYPE_OPTIONS = [\n { label: 'Agent', entityType: EntityType.AGENT },\n { label: 'Workflow', entityType: EntityType.WORKFLOW_RUN },\n { label: 'Scorer', entityType: EntityType.SCORER },\n { label: 'Ingest', entityType: EntityType.RAG_INGESTION },\n] as const;\n\n/** Field IDs that live in dedicated URL params (not the generic `filterX` set). */\nexport const METRICS_SYNTHETIC_FILTER_FIELD_IDS = ['rootEntityType'] as const;\n\nexport const METRICS_ROOT_ENTITY_TYPE_PARAM = 'rootEntityType';\n\n/** URL param name for each generic property filter field. Mirrors traces for\n * cross-page URL consistency (user can copy a trace's filter URL and paste\n * equivalent dimensions into metrics). */\nexport const METRICS_PROPERTY_FILTER_PARAM_BY_FIELD = {\n tags: 'filterTags',\n entityId: 'filterEntityId',\n entityName: 'filterEntityName',\n runId: 'filterRunId',\n threadId: 'filterThreadId',\n sessionId: 'filterSessionId',\n requestId: 'filterRequestId',\n resourceId: 'filterResourceId',\n userId: 'filterUserId',\n organizationId: 'filterOrganizationId',\n serviceName: 'filterServiceName',\n environment: 'filterEnvironment',\n experimentId: 'filterExperimentId',\n provider: 'filterProvider',\n model: 'filterModel',\n} as const;\n\nexport type MetricsPropertyFilterFieldId = keyof typeof METRICS_PROPERTY_FILTER_PARAM_BY_FIELD;\n\nexport const METRICS_PROPERTY_FILTER_FIELD_IDS = Object.keys(\n METRICS_PROPERTY_FILTER_PARAM_BY_FIELD,\n) as Array<MetricsPropertyFilterFieldId>;\n\nconst METRICS_FILTERS_STORAGE_KEY = 'mastra:metrics:saved-filters';\n\n/** Save the current metrics filter URL params so the metrics page can restore\n * them on next visit (same pattern as traces/logs). */\nexport function saveMetricsFiltersToStorage(params: URLSearchParams): void {\n const serialized = getPreservedMetricsFilterParams(params);\n try {\n localStorage.setItem(METRICS_FILTERS_STORAGE_KEY, serialized.toString());\n } catch {\n // localStorage may be unavailable — silently skip.\n }\n}\n\nexport function clearSavedMetricsFilters(): void {\n try {\n localStorage.removeItem(METRICS_FILTERS_STORAGE_KEY);\n } catch {\n // ignore\n }\n}\n\nexport function loadMetricsFiltersFromStorage(): URLSearchParams | null {\n try {\n const raw = localStorage.getItem(METRICS_FILTERS_STORAGE_KEY);\n if (!raw) return null;\n const parsed = new URLSearchParams(raw);\n return parsed.toString() ? parsed : null;\n } catch {\n return null;\n }\n}\n\nexport function hasAnyMetricsFilterParams(params: URLSearchParams): boolean {\n if (params.has(METRICS_ROOT_ENTITY_TYPE_PARAM)) return true;\n for (const fieldId of METRICS_PROPERTY_FILTER_FIELD_IDS) {\n if (params.has(METRICS_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId])) return true;\n }\n return false;\n}\n\n/** Build the PropertyFilterField list shown in the metrics filter popover.\n *\n * The field order is curated for OLAP efficiency: columnar/LowCardinality\n * dimensions first, then bloom_filter-indexed high-cardinality IDs as\n * free-text. Fields that are expensive to filter without an index are\n * intentionally omitted from this dashboard surface. */\nexport function createMetricsPropertyFilterFields({\n availableTags,\n availableEntityNames,\n availableServiceNames,\n availableEnvironments,\n loading,\n}: {\n availableTags: string[];\n availableEntityNames: string[];\n availableServiceNames: string[];\n availableEnvironments: string[];\n loading?: {\n tags?: boolean;\n entityNames?: boolean;\n serviceNames?: boolean;\n environments?: boolean;\n };\n}): PropertyFilterField[] {\n const fields: PropertyFilterField[] = [\n {\n id: 'rootEntityType',\n label: 'Primitive Type',\n kind: 'pick-multi',\n searchable: false,\n options: METRICS_ROOT_ENTITY_TYPE_OPTIONS.map(o => ({ label: o.label, value: o.entityType })),\n placeholder: 'Choose entity type',\n emptyText: 'No entity types.',\n },\n {\n id: 'entityName',\n label: 'Primitive Name',\n kind: 'pick-multi',\n options: availableEntityNames.map(name => ({ label: name, value: name })),\n placeholder: 'Choose entity names',\n emptyText: 'No entity names found.',\n isLoading: loading?.entityNames,\n },\n { id: 'entityId', label: 'Primitive ID', kind: 'text' },\n {\n id: 'tags',\n label: 'Tags',\n kind: 'pick-multi',\n multi: true,\n options: availableTags.map(tag => ({ label: tag, value: tag })),\n placeholder: 'Choose tags',\n emptyText: 'No tags found.',\n isLoading: loading?.tags,\n },\n {\n id: 'serviceName',\n label: 'Service Name',\n kind: 'pick-multi',\n options: availableServiceNames.map(name => ({ label: name, value: name })),\n placeholder: 'Choose service names',\n emptyText: 'No service names found.',\n isLoading: loading?.serviceNames,\n },\n {\n id: 'environment',\n label: 'Environment',\n kind: 'pick-multi',\n options: availableEnvironments.map(env => ({ label: env, value: env })),\n placeholder: 'Choose environments',\n emptyText: 'No environments found.',\n isLoading: loading?.environments,\n },\n // Provider / model are filterable by URL (filterProvider / filterModel) but\n // are omitted from the popover until we expose a discovery endpoint.\n // High-cardinality IDs — free-text. Backed by bloom_filter skip indexes on\n // ClickHouse, narrow timestamp range pruning on DuckDB.\n { id: 'threadId', label: 'Thread ID', kind: 'text' },\n { id: 'resourceId', label: 'Resource ID', kind: 'text' },\n { id: 'userId', label: 'User ID', kind: 'text' },\n { id: 'organizationId', label: 'Organization ID', kind: 'text' },\n { id: 'runId', label: 'Run ID', kind: 'text' },\n { id: 'sessionId', label: 'Session ID', kind: 'text' },\n { id: 'requestId', label: 'Request ID', kind: 'text' },\n { id: 'experimentId', label: 'Experiment ID', kind: 'text' },\n ];\n const byLabel = (a: PropertyFilterField, b: PropertyFilterField) => a.label.localeCompare(b.label);\n const pickMulti = fields.filter(f => f.kind === 'pick-multi').sort(byLabel);\n const text = fields.filter(f => f.kind === 'text').sort(byLabel);\n return [...pickMulti, ...text];\n}\n\n/** Parse filter tokens from URL params, preserving insertion order. */\nexport function getMetricsPropertyFilterTokens(searchParams: URLSearchParams): PropertyFilterToken[] {\n const tokens: PropertyFilterToken[] = [];\n\n const paramToFieldId = new Map<string, string>([[METRICS_ROOT_ENTITY_TYPE_PARAM, 'rootEntityType']]);\n for (const fieldId of METRICS_PROPERTY_FILTER_FIELD_IDS) {\n paramToFieldId.set(METRICS_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId], fieldId);\n }\n\n const seen = new Set<string>();\n for (const [paramName] of searchParams.entries()) {\n const fieldId = paramToFieldId.get(paramName);\n if (!fieldId || seen.has(fieldId)) continue;\n seen.add(fieldId);\n\n if (fieldId === 'tags') {\n const raw = searchParams.getAll(paramName);\n if (raw.length === 0) continue;\n tokens.push({ fieldId, value: raw.filter(Boolean) });\n continue;\n }\n\n // Multi-value pick-multi fields: collect all occurrences.\n if (\n fieldId === 'rootEntityType' ||\n fieldId === 'entityName' ||\n fieldId === 'serviceName' ||\n fieldId === 'environment' ||\n fieldId === 'provider' ||\n fieldId === 'model'\n ) {\n const raw = searchParams.getAll(paramName);\n if (raw.length > 1) {\n tokens.push({ fieldId, value: raw });\n continue;\n }\n }\n\n const value = searchParams.get(paramName);\n if (value !== null) tokens.push({ fieldId, value });\n }\n\n return tokens;\n}\n\n/** Return a fresh URLSearchParams containing only metrics filter params. */\nexport function getPreservedMetricsFilterParams(searchParams: URLSearchParams): URLSearchParams {\n const next = new URLSearchParams();\n const rootEntityValues = searchParams.getAll(METRICS_ROOT_ENTITY_TYPE_PARAM);\n for (const v of rootEntityValues) next.append(METRICS_ROOT_ENTITY_TYPE_PARAM, v);\n\n for (const fieldId of METRICS_PROPERTY_FILTER_FIELD_IDS) {\n const param = METRICS_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId];\n const values = searchParams.getAll(param);\n for (const v of values) next.append(param, v);\n }\n return next;\n}\n\n/** Mutate `params` in place: strip every metrics filter param, then re-write\n * them from `tokens` in order. Token insertion order drives URL order so\n * filter pill order is stable across reloads. */\nexport function applyMetricsPropertyFilterTokens(params: URLSearchParams, tokens: PropertyFilterToken[]): void {\n params.delete(METRICS_ROOT_ENTITY_TYPE_PARAM);\n for (const fieldId of METRICS_PROPERTY_FILTER_FIELD_IDS) {\n params.delete(METRICS_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId]);\n }\n\n for (const token of tokens) {\n const paramName =\n token.fieldId === 'rootEntityType'\n ? METRICS_ROOT_ENTITY_TYPE_PARAM\n : METRICS_PROPERTY_FILTER_PARAM_BY_FIELD[token.fieldId as MetricsPropertyFilterFieldId];\n if (!paramName) continue;\n\n if (Array.isArray(token.value)) {\n const values = token.value.filter(v => typeof v === 'string' && v !== '');\n if (values.length === 0) {\n // Keep an empty sentinel for `tags` so the pill survives a Reset.\n if (token.fieldId === 'tags') params.append(paramName, '');\n continue;\n }\n for (const v of values) params.append(paramName, v);\n } else if (typeof token.value === 'string') {\n // Persist even empty / 'Any' strings so newly-created pills (and\n // neutralized-but-still-visible pills after a Reset) survive URL\n // round-trips. `buildMetricsDimensionalFilter` drops these on the API\n // query side so neutrals never reach the backend.\n params.set(paramName, token.value.trim());\n }\n }\n}\n\n/** Shape of the dimensional filter object fed into `MetricsFilter` on client\n * calls. Kept compatible with `metricsFilterSchema` in @internal/core — every\n * scalar field maps to a single-string column filter, and `tags` is the only\n * array field (matched via `has()` / equivalent on backends). */\nexport type MetricsDimensionalFilter = {\n rootEntityType?: EntityType;\n entityName?: string;\n entityId?: string;\n tags?: string[];\n serviceName?: string;\n environment?: string;\n provider?: string;\n model?: string;\n threadId?: string;\n resourceId?: string;\n userId?: string;\n organizationId?: string;\n runId?: string;\n sessionId?: string;\n requestId?: string;\n experimentId?: string;\n};\n\n/** Convert the active token list into a `MetricsFilter`-compatible object.\n *\n * Single-value text fields are assigned as strings; `pick-multi` fields are\n * assigned as string arrays. Empty/neutral values are dropped. */\n/** \"Neutral\" sentinel for single-select pick-multi fields. Emitted by the\n * toolbar's Clear action so pills stay visible after reset; must be stripped\n * before the filter object is sent to the backend (it is not a valid enum\n * option for fields like `rootEntityType`). */\nconst NEUTRAL_PICK_VALUE = 'Any';\n\nfunction isNeutralValue(v: string): boolean {\n const trimmed = v.trim();\n return trimmed === '' || trimmed === NEUTRAL_PICK_VALUE;\n}\n\n/** `rootEntityType` is enum-valued at the backend; URL-supplied or stale stored\n * values can be arbitrary strings, so we validate against the allowed set\n * before letting them reach the filter object. Returns `undefined` if the\n * value isn't a known enum option. */\nconst VALID_ROOT_ENTITY_TYPES: ReadonlySet<EntityType> = new Set(\n METRICS_ROOT_ENTITY_TYPE_OPTIONS.map(o => o.entityType),\n);\nfunction toValidRootEntityType(v: string): EntityType | undefined {\n const trimmed = v.trim();\n return VALID_ROOT_ENTITY_TYPES.has(trimmed as EntityType) ? (trimmed as EntityType) : undefined;\n}\n\nexport function buildMetricsDimensionalFilter(tokens: PropertyFilterToken[]): MetricsDimensionalFilter {\n const result: MetricsDimensionalFilter = {};\n for (const token of tokens) {\n const fieldId = token.fieldId as keyof MetricsDimensionalFilter;\n if (Array.isArray(token.value)) {\n const values = token.value\n .filter((v): v is string => typeof v === 'string')\n .map(v => v.trim())\n .filter(v => !isNeutralValue(v));\n if (values.length === 0) continue;\n if (fieldId === 'tags') {\n result.tags = values;\n } else if (fieldId === 'rootEntityType') {\n const validated = toValidRootEntityType(values[0]);\n if (validated) result.rootEntityType = validated;\n } else {\n // Backend accepts a single string per dimension; take the first selection.\n (result as Record<string, unknown>)[fieldId] = values[0];\n }\n } else if (typeof token.value === 'string') {\n if (isNeutralValue(token.value)) continue;\n const trimmed = token.value.trim();\n if (fieldId === 'rootEntityType') {\n const validated = toValidRootEntityType(trimmed);\n if (validated) result.rootEntityType = validated;\n } else {\n (result as Record<string, unknown>)[fieldId] = trimmed;\n }\n }\n }\n return result;\n}\n","/* eslint-disable react-refresh/only-export-components */\nimport { format } from 'date-fns';\nimport { createContext, useContext, useMemo } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { buildMetricsDimensionalFilter } from '../metrics-filters';\nimport type { MetricsDimensionalFilter } from '../metrics-filters';\nimport type { PropertyFilterToken } from '@/ds/components/PropertyFilter/types';\n\nconst DATE_PRESETS = [\n { label: 'Last 24 hours', value: '24h' },\n { label: 'Last 3 days', value: '3d' },\n { label: 'Last 7 days', value: '7d' },\n { label: 'Last 14 days', value: '14d' },\n { label: 'Last 30 days', value: '30d' },\n] as const;\n\nexport type DatePreset = (typeof DATE_PRESETS)[number]['value'] | 'custom';\n\nexport { DATE_PRESETS };\n\nconst VALID_PRESETS = new Set<string>(DATE_PRESETS.map(p => p.value));\n\nexport function isValidPreset(value: string | null | undefined): value is DatePreset {\n return typeof value === 'string' && (VALID_PRESETS.has(value) || value === 'custom');\n}\n\nexport type DateRange = { from?: Date; to?: Date };\n\n/** Internal — all state is derived from the URL-backed props the owner passes.\n * There is intentionally no local mirror; keeping a mirror caused URL ↔ state\n * feedback loops that re-rendered the entire metrics tree on every keystroke.\n */\ntype MetricsContextValue = {\n datePreset: DatePreset;\n setDatePreset: (v: DatePreset) => void;\n customRange: DateRange | undefined;\n setCustomRange: (v: DateRange | undefined) => void;\n dateRangeLabel: string;\n filterTokens: PropertyFilterToken[];\n setFilterTokens: (tokens: PropertyFilterToken[]) => void;\n dimensionalFilter: MetricsDimensionalFilter;\n /** Stable JSON representation of `dimensionalFilter`, safe for query keys. */\n dimensionalFilterKey: string;\n /** Base path drilldown links should target for the Traces page. */\n tracesBasePath: string | undefined;\n /** Base path drilldown links should target for the Logs page. */\n logsBasePath: string | undefined;\n};\n\nexport const MetricsContext = createContext<MetricsContextValue>({\n datePreset: '24h',\n setDatePreset: () => {},\n customRange: undefined,\n setCustomRange: () => {},\n dateRangeLabel: 'Last 24 hours',\n filterTokens: [],\n setFilterTokens: () => {},\n dimensionalFilter: {},\n dimensionalFilterKey: '{}',\n tracesBasePath: undefined,\n logsBasePath: undefined,\n});\n\nexport function useMetrics() {\n return useContext(MetricsContext);\n}\n\nfunction getDateRangeLabel(preset: DatePreset, customRange: DateRange | undefined) {\n if (preset !== 'custom') {\n return DATE_PRESETS.find(p => p.value === preset)!.label;\n }\n if (customRange?.from) {\n if (customRange.to) {\n return `${format(customRange.from, 'MMM d, yyyy')} – ${format(customRange.to, 'MMM d, yyyy')}`;\n }\n return format(customRange.from, 'MMM d, yyyy');\n }\n return 'Custom range';\n}\n\n/**\n * URL-driven metrics provider.\n *\n * The owner (page) is expected to:\n * - pass the current `preset` / `filterTokens` derived from `useSearchParams`\n * - pass `onPresetChange` / `onFilterTokensChange` that update the URL\n *\n * The provider never stores its own copies — changes round-trip through the URL\n * exactly once, which keeps re-renders bounded no matter how much data is on\n * screen.\n */\nexport function MetricsProvider({\n children,\n preset,\n filterTokens,\n onPresetChange,\n onFilterTokensChange,\n customRange,\n onCustomRangeChange,\n tracesBasePath,\n logsBasePath,\n}: {\n children: ReactNode;\n preset: DatePreset;\n filterTokens: PropertyFilterToken[];\n onPresetChange: (preset: DatePreset) => void;\n onFilterTokensChange: (tokens: PropertyFilterToken[]) => void;\n customRange?: DateRange;\n onCustomRangeChange?: (range: DateRange | undefined) => void;\n /** Base path for drilldown links to the Traces page. Defaults to `/observability` when omitted. */\n tracesBasePath?: string;\n /** Base path for drilldown links to the Logs page. Defaults to `/logs` when omitted. */\n logsBasePath?: string;\n}) {\n // Stable key for memo dependencies — the parent may re-create the tokens\n // array on every render (e.g. from `useMemo(... , [searchParams])`), but the\n // *content* usually doesn't change.\n const filterTokensKey = useMemo(() => JSON.stringify(filterTokens), [filterTokens]);\n\n // Intentional: re-pin only when the serialized content changes, not on every\n // parent render that allocates a new array.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const stableFilterTokens = useMemo(() => filterTokens, [filterTokensKey]);\n\n const dimensionalFilter = useMemo(() => buildMetricsDimensionalFilter(stableFilterTokens), [stableFilterTokens]);\n\n const dimensionalFilterKey = useMemo(() => JSON.stringify(dimensionalFilter), [dimensionalFilter]);\n\n const dateRangeLabel = getDateRangeLabel(preset, customRange);\n\n const value = useMemo<MetricsContextValue>(\n () => ({\n datePreset: preset,\n setDatePreset: onPresetChange,\n customRange,\n setCustomRange: onCustomRangeChange ?? (() => {}),\n dateRangeLabel,\n filterTokens: stableFilterTokens,\n setFilterTokens: onFilterTokensChange,\n dimensionalFilter,\n dimensionalFilterKey,\n tracesBasePath,\n logsBasePath,\n }),\n [\n preset,\n onPresetChange,\n customRange,\n onCustomRangeChange,\n dateRangeLabel,\n stableFilterTokens,\n onFilterTokensChange,\n dimensionalFilter,\n dimensionalFilterKey,\n tracesBasePath,\n logsBasePath,\n ],\n );\n\n return <MetricsContext.Provider value={value}>{children}</MetricsContext.Provider>;\n}\n","import { useRef } from 'react';\nimport { DateTimeRangePicker } from '../../../ds/components/DateTimeRangePicker';\nimport type { DateRangePreset } from '../../../ds/components/DateTimeRangePicker';\nimport { useMetrics } from '../hooks/use-metrics';\nimport type { DatePreset } from '../hooks/use-metrics';\n\nconst METRICS_PRESETS: readonly DateRangePreset[] = [\n 'last-24h',\n 'last-3d',\n 'last-7d',\n 'last-14d',\n 'last-30d',\n 'custom',\n];\n\nfunction toPickerPreset(preset: DatePreset): DateRangePreset {\n switch (preset) {\n case '3d':\n return 'last-3d';\n case '7d':\n return 'last-7d';\n case '14d':\n return 'last-14d';\n case '30d':\n return 'last-30d';\n case 'custom':\n return 'custom';\n default:\n return 'last-24h';\n }\n}\n\nfunction fromPickerPreset(preset: DateRangePreset): DatePreset {\n switch (preset) {\n case 'last-3d':\n return '3d';\n case 'last-7d':\n return '7d';\n case 'last-14d':\n return '14d';\n case 'last-30d':\n return '30d';\n case 'custom':\n return 'custom';\n default:\n return '24h';\n }\n}\n\nexport function DateRangeSelector() {\n const { datePreset, setDatePreset, customRange, setCustomRange } = useMetrics();\n\n // The picker reports each field separately and also fires onDateChange right\n // after a non-custom preset switch. Track the latest preset and range\n // synchronously so the guard below skips those calls and the second field\n // change still sees the first one.\n const presetRef = useRef(datePreset);\n presetRef.current = datePreset;\n const customRangeRef = useRef(customRange);\n customRangeRef.current = customRange;\n\n return (\n <DateTimeRangePicker\n preset={toPickerPreset(datePreset)}\n onPresetChange={next => {\n const mapped = fromPickerPreset(next);\n presetRef.current = mapped;\n setDatePreset(mapped);\n }}\n dateFrom={customRange?.from}\n dateTo={customRange?.to}\n onDateChange={(value, type) => {\n if (presetRef.current !== 'custom') return;\n const next = { ...customRangeRef.current, [type]: value };\n customRangeRef.current = next;\n setCustomRange(next);\n }}\n presets={METRICS_PRESETS}\n />\n );\n}\n","import type { DataListRootProps } from '@/ds/components/DataList';\n\nexport function formatCompact(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toLocaleString();\n}\n\nexport function formatCost(value: number, unit?: string | null): string {\n if (unit?.toLowerCase() === 'usd' || !unit) {\n return `$${value < 0.01 && value > 0 ? value.toFixed(4) : value.toFixed(2)}`;\n }\n return `${value.toFixed(4)} ${unit}`;\n}\n\nexport const METRICS_DATA_LIST_PROPS = {\n className: 'max-h-80',\n mask: { left: false },\n stickyHeaderBackground: 'tinted',\n} satisfies Pick<DataListRootProps, 'className' | 'mask' | 'stickyHeaderBackground'>;\n\nexport const CHART_COLORS = {\n green: '#22c55e',\n orange: '#fb923c',\n pink: '#f472b6',\n purple: '#8b5cf6',\n blue: '#4f83f1',\n blueDark: '#2b5cd9',\n blueLight: '#6b8fe5',\n red: '#f87171',\n greenDark: '#15613a',\n redDark: '#991b1b',\n yellow: '#facc15',\n} as const;\n","import { Tooltip, TooltipContent, TooltipTrigger } from '../../../ds/components/Tooltip';\nimport { CHART_COLORS } from './metrics-utils';\n\nexport function BarListContent({\n data,\n maxVal,\n fmt,\n color,\n valueLabel,\n legend,\n}: {\n data: Array<{ name: string; value: number }>;\n maxVal: number;\n fmt: (v: number) => string;\n color: string;\n valueLabel?: string;\n legend?: Array<{ color: string; label: string }>;\n}) {\n const sorted = [...data].sort((a, b) => b.value - a.value);\n return (\n <div>\n <div className=\"flex items-center gap-3 mb-2\">\n <div className=\"flex-1 flex items-center gap-4\">\n {legend?.map(l => (\n <div key={l.label} className=\"flex items-center gap-1.5\">\n <div className=\"size-2 rounded-full\" style={{ backgroundColor: l.color }} />\n <span className=\"text-xs text-icon2\">{l.label}</span>\n </div>\n ))}\n </div>\n {valueLabel && <span className=\"shrink-0 text-xs text-icon2\">{valueLabel}</span>}\n </div>\n <div className=\"space-y-2.5\">\n {sorted.map(d => {\n const pct = Math.min(Math.max(maxVal > 0 ? (d.value / maxVal) * 100 : 0, 0), 100);\n return (\n <div key={d.name} className=\"group flex items-center gap-3\">\n <div className=\"relative flex-1 h-7\">\n <div\n className=\"absolute inset-y-0 left-0 rounded\"\n style={{ width: `${pct}%`, backgroundColor: color }}\n />\n <span className=\"absolute inset-y-0 left-2 flex items-center text-xs text-white whitespace-nowrap\">\n {d.name}\n </span>\n </div>\n <span className=\"shrink-0 text-xs font-mono text-icon6 tabular-nums\">{fmt(d.value)}</span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport function StackedRunsBars({ data }: { data: Array<{ name: string; completed: number; errors: number }> }) {\n const sorted = [...data].sort((a, b) => b.completed + b.errors - (a.completed + a.errors));\n const maxTotal = Math.max(...sorted.map(d => d.completed + d.errors));\n return (\n <div>\n <div className=\"flex items-center gap-3 mb-2\">\n <div className=\"flex-1 flex items-center gap-4\">\n <div className=\"flex items-center gap-1.5\">\n <div className=\"size-2 rounded-full\" style={{ backgroundColor: CHART_COLORS.blue }} />\n <span className=\"text-xs text-icon2\">Completed</span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <div className=\"size-2 rounded-full\" style={{ backgroundColor: CHART_COLORS.red }} />\n <span className=\"text-xs text-icon2\">Errors</span>\n </div>\n </div>\n <span className=\"shrink-0 text-xs text-icon2\">Total (Success)</span>\n </div>\n <div className=\"space-y-2.5\">\n {sorted.map(d => {\n const total = d.completed + d.errors;\n const successPct = total > 0 ? ((d.completed / total) * 100).toFixed(1) : '0.0';\n const completedWidth = Math.min(Math.max(maxTotal > 0 ? (d.completed / maxTotal) * 100 : 0, 0), 100);\n const errorsWidth = Math.min(Math.max(maxTotal > 0 ? (d.errors / maxTotal) * 100 : 0, 0), 100);\n return (\n <div key={d.name} className=\"group flex items-center gap-3\">\n <div className=\"relative flex-1 h-7\">\n <Tooltip>\n <TooltipTrigger asChild>\n <div\n role=\"img\"\n aria-label={`${d.completed.toLocaleString()} completed`}\n tabIndex={0}\n className=\"absolute inset-y-0 left-0 rounded-l cursor-default\"\n style={{ width: `${completedWidth}%`, backgroundColor: CHART_COLORS.blue }}\n />\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"font-mono\">\n {d.completed.toLocaleString()} completed\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <div\n role=\"img\"\n aria-label={`${d.errors.toLocaleString()} errors`}\n tabIndex={0}\n className=\"absolute inset-y-0 rounded-r cursor-default\"\n style={{\n left: `${completedWidth}%`,\n width: `${errorsWidth}%`,\n backgroundColor: CHART_COLORS.red,\n }}\n />\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"font-mono\">\n {d.errors.toLocaleString()} errors\n </TooltipContent>\n </Tooltip>\n <span className=\"absolute inset-y-0 left-2 flex items-center text-xs text-white whitespace-nowrap pointer-events-none\">\n {d.name}\n </span>\n </div>\n <span className=\"shrink-0 text-xs font-mono text-icon6 tabular-nums\">\n {total.toLocaleString()} ({successPct}%)\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { EyeIcon, LogsIcon } from 'lucide-react';\nimport { Button } from '../../../ds/components/Button/Button';\nimport type { LinkComponent } from '../../../ds/types/link-component';\n\ntype CardActionButtonProps = {\n /** Pre-built drilldown URL (typically from `useDrilldown().getTracesHref(...)`). */\n href: string;\n /** Override how the underlying anchor is rendered — pass a router-aware Link\n * to keep navigation in-app. Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n};\n\n/** Icon link in a MetricsCard top bar that opens the Traces page pre-filtered\n * to whatever dimensions the card knows about. */\nexport function OpenInTracesButton({ href, LinkComponent = 'a' }: CardActionButtonProps) {\n return (\n <Button\n as={LinkComponent}\n href={href}\n variant=\"ghost\"\n size=\"icon-md\"\n tooltip=\"View in Traces\"\n aria-label=\"View in Traces\"\n >\n <EyeIcon />\n </Button>\n );\n}\n\n/** Icon link in a MetricsCard top bar that opens the Logs page scoped to\n * errors for the card's current dimensions. */\nexport function OpenErrorsInLogsButton({ href, LinkComponent = 'a' }: CardActionButtonProps) {\n return (\n <Button\n as={LinkComponent}\n href={href}\n variant=\"ghost\"\n size=\"icon-md\"\n tooltip=\"View errors in Logs\"\n aria-label=\"View errors in Logs\"\n >\n <LogsIcon />\n </Button>\n );\n}\n","import { MetricsKpiCard } from '../../../ds/components/MetricsKpiCard';\n\nexport interface KpiCardViewProps {\n label: string;\n value: string | null;\n prevValue?: string;\n changePct?: number | null;\n isLoading: boolean;\n isError: boolean;\n}\n\nexport function KpiCardView({ label, value, prevValue, changePct, isLoading, isError }: KpiCardViewProps) {\n const hasData = value != null;\n return (\n <MetricsKpiCard>\n <MetricsKpiCard.Label>{label}</MetricsKpiCard.Label>\n <MetricsKpiCard.Value className={hasData ? undefined : 'invisible'}>{hasData ? value : '—'}</MetricsKpiCard.Value>\n {isError ? (\n <MetricsKpiCard.Error />\n ) : isLoading ? (\n <MetricsKpiCard.Loading />\n ) : hasData ? (\n changePct != null ? (\n <MetricsKpiCard.Change changePct={changePct} prevValue={prevValue} />\n ) : (\n <MetricsKpiCard.NoChange />\n )\n ) : (\n <MetricsKpiCard.NoData />\n )}\n </MetricsKpiCard>\n );\n}\n","import { useEffect, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { MetricsCard } from '../../../ds/components/MetricsCard';\nimport { MetricsLineChart } from '../../../ds/components/MetricsLineChart';\nimport { Tab, TabContent, TabList, Tabs } from '../../../ds/components/Tabs';\nimport type { LatencyPoint } from '../hooks/use-latency-metrics';\nimport { CHART_COLORS } from './metrics-utils';\n\nconst latencySeries = [\n {\n dataKey: 'p50',\n label: 'p50',\n color: CHART_COLORS.blue,\n aggregate: (data: Record<string, unknown>[]) => ({\n value: data.length > 0 ? `${Math.round(data.reduce((s, d) => s + (d.p50 as number), 0) / data.length)}` : '0',\n suffix: 'avg ms',\n }),\n },\n {\n dataKey: 'p95',\n label: 'p95',\n color: CHART_COLORS.yellow,\n aggregate: (data: Record<string, unknown>[]) => ({\n value: data.length > 0 ? `${Math.round(data.reduce((s, d) => s + (d.p95 as number), 0) / data.length)}` : '0',\n suffix: 'avg ms',\n }),\n },\n];\n\nexport type LatencyTab = 'agents' | 'workflows' | 'tools';\n\nfunction LatencyChart({ data, onPointClick }: { data: LatencyPoint[]; onPointClick?: (point: LatencyPoint) => void }) {\n if (data.length === 0) {\n return <MetricsCard.NoData message=\"No latency data yet\" />;\n }\n return (\n <MetricsLineChart\n data={data}\n series={latencySeries}\n onPointClick={\n onPointClick\n ? point => {\n const p = point as LatencyPoint;\n if (typeof p?.tsMs === 'number' && Number.isFinite(p.tsMs)) onPointClick(p);\n }\n : undefined\n }\n />\n );\n}\n\nexport interface LatencyCardViewProps {\n data: { agentData: LatencyPoint[]; workflowData: LatencyPoint[]; toolData: LatencyPoint[] } | undefined;\n isLoading: boolean;\n isError: boolean;\n /** Optional drilldown: invoked when a chart node is clicked. Container provides the navigation. */\n onPointClick?: (tab: LatencyTab, point: LatencyPoint) => void;\n /**\n * Optional slot for top-bar action buttons (e.g. \"View in Traces\").\n * Pass a function to receive the active tab so the action can scope itself to the current entity type.\n */\n actions?: ReactNode | ((tab: LatencyTab) => ReactNode);\n}\n\nexport function LatencyCardView({ data, isLoading, isError, onPointClick, actions }: LatencyCardViewProps) {\n const initialTab: LatencyTab = !data\n ? 'agents'\n : data.agentData.length > 0\n ? 'agents'\n : data.workflowData.length > 0\n ? 'workflows'\n : data.toolData.length > 0\n ? 'tools'\n : 'agents';\n const [activeTab, setActiveTab] = useState<LatencyTab>(initialTab);\n // Resync to a non-empty tab when async data finishes loading. Without this,\n // a card that mounts before data arrives stays stuck on `agents` even when\n // only workflow/tool data exists.\n useEffect(() => {\n if (!data) return;\n const tabHasData = {\n agents: data.agentData.length > 0,\n workflows: data.workflowData.length > 0,\n tools: data.toolData.length > 0,\n } as const;\n if (!tabHasData[activeTab] && tabHasData[initialTab]) {\n setActiveTab(initialTab);\n }\n }, [data, activeTab, initialTab]);\n const renderedActions = typeof actions === 'function' ? actions(activeTab) : actions;\n const hasData = !!data && (data.agentData.length > 0 || data.workflowData.length > 0 || data.toolData.length > 0);\n const p50Values = data\n ? Object.values(data)\n .filter(Array.isArray)\n .flat()\n .map(d => d.p50)\n .filter((v): v is number => typeof v === 'number')\n : [];\n const avgP50 =\n p50Values.length > 0 ? `${Math.round(p50Values.reduce((s, v) => s + v, 0) / p50Values.length)}ms` : '—';\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Latency\" description=\"Hourly p50 and p95 latency.\" />\n {hasData && <MetricsCard.Summary value={avgP50} label=\"Avg p50\" />}\n {renderedActions ? <MetricsCard.Actions>{renderedActions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load latency data\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No latency data yet\" />\n ) : (\n <Tabs value={activeTab} onValueChange={setActiveTab} defaultTab={initialTab} className=\"overflow-visible\">\n <TabList>\n <Tab value=\"agents\">Agents</Tab>\n <Tab value=\"workflows\">Workflows</Tab>\n <Tab value=\"tools\">Tools</Tab>\n </TabList>\n <TabContent value=\"agents\">\n <LatencyChart\n data={data.agentData}\n onPointClick={onPointClick ? p => onPointClick('agents', p) : undefined}\n />\n </TabContent>\n <TabContent value=\"workflows\">\n <LatencyChart\n data={data.workflowData}\n onPointClick={onPointClick ? p => onPointClick('workflows', p) : undefined}\n />\n </TabContent>\n <TabContent value=\"tools\">\n <LatencyChart\n data={data.toolData}\n onPointClick={onPointClick ? p => onPointClick('tools', p) : undefined}\n />\n </TabContent>\n </Tabs>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n","import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { DataList } from '../../../ds/components/DataList/data-list';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport { TabContent } from '../../../ds/components/Tabs/tabs-content';\nimport { TabList } from '../../../ds/components/Tabs/tabs-list';\nimport { Tabs } from '../../../ds/components/Tabs/tabs-root';\nimport { Tab } from '../../../ds/components/Tabs/tabs-tab';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { ActiveThreadRow } from '../hooks/use-top-active-threads-metrics';\nimport type { ResourceThreadsRow } from '../hooks/use-top-resources-by-threads-metrics';\nimport { formatCompact, formatCost, METRICS_DATA_LIST_PROPS } from './metrics-utils';\n\nexport type MemoryTab = 'threads' | 'resources';\n\n/** Per-tab query state. Memory has two independent server queries (top\n * threads + top resources) so loading/error are scoped to the active tab. */\ntype MemoryTabState<T> = {\n data: T[] | undefined;\n isLoading: boolean;\n isError: boolean;\n};\n\nexport interface MemoryCardViewProps {\n threads: MemoryTabState<ActiveThreadRow>;\n resources: MemoryTabState<ResourceThreadsRow>;\n /** Optional drilldown for a thread row. Receives the raw hook row. */\n getThreadRowHref?: (row: ActiveThreadRow) => string | undefined;\n /** Optional drilldown for a resource row. Receives the raw hook row. */\n getResourceRowHref?: (row: ResourceThreadsRow) => string | undefined;\n /** Optional slot for top-bar action buttons. Function form receives the active tab. */\n actions?: ReactNode | ((tab: MemoryTab) => ReactNode);\n /** Override how drilldown links are rendered. Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n}\n\nfunction isMemoryTab(value: string): value is MemoryTab {\n return value === 'threads' || value === 'resources';\n}\n\n// IDs are usually 32+ char UUIDs; the table is too narrow to show the full\n// value without horizontal scroll, so we elide the middle.\nfunction shortId(id: string): string {\n if (id.length <= 12) return id;\n return `${id.slice(0, 6)}…${id.slice(-4)}`;\n}\n\ntype ThreadTableRow = ActiveThreadRow & { key: string };\ntype ResourceTableRow = ResourceThreadsRow & { key: string };\n\nexport function MemoryCardView({\n threads,\n resources,\n getThreadRowHref,\n getResourceRowHref,\n actions,\n LinkComponent,\n}: MemoryCardViewProps) {\n const [activeTab, setActiveTab] = useState<MemoryTab>('threads');\n\n const threadRows: ThreadTableRow[] = threads.data?.map(r => ({ ...r, key: r.threadId })) ?? [];\n const resourceRows: ResourceTableRow[] = resources.data?.map(r => ({ ...r, key: r.resourceId })) ?? [];\n\n const hasThreadData = threadRows.length > 0;\n const hasResourceData = resourceRows.length > 0;\n\n const threadTotal = threads.data?.reduce((s, r) => s + r.runs, 0) ?? 0;\n const resourceTotal = resources.data?.reduce((s, r) => s + r.threadCount, 0) ?? 0;\n\n const active = activeTab === 'threads' ? threads : resources;\n const renderedActions = typeof actions === 'function' ? actions(activeTab) : actions;\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Memory\" description=\"Resource and Thread consumption\" />\n {activeTab === 'threads' && hasThreadData && (\n <MetricsCard.Summary value={threadTotal.toLocaleString()} label=\"Total runs\" />\n )}\n {activeTab === 'resources' && hasResourceData && (\n <MetricsCard.Summary value={resourceTotal.toLocaleString()} label=\"Total threads\" />\n )}\n {renderedActions ? <MetricsCard.Actions>{renderedActions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {active.isLoading ? (\n <MetricsCard.Loading />\n ) : active.isError ? (\n <MetricsCard.Error message=\"Failed to load memory data\" />\n ) : (\n <MetricsCard.Content>\n <Tabs\n defaultTab=\"threads\"\n value={activeTab}\n onValueChange={v => {\n if (isMemoryTab(v)) setActiveTab(v);\n }}\n className=\"grid grid-rows-[auto_1fr] overflow-y-auto h-full\"\n >\n <TabList>\n <Tab value=\"threads\">Threads</Tab>\n <Tab value=\"resources\">Resources</Tab>\n </TabList>\n <TabContent value=\"threads\">\n {hasThreadData ? (\n <DataList columns=\"auto auto auto auto auto\" {...METRICS_DATA_LIST_PROPS}>\n <DataList.Top>\n <DataList.TopCell sticky=\"start\">Thread ID</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Resource ID</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Runs</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Tokens</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cost</DataList.TopCell>\n </DataList.Top>\n {threadRows.map(row => {\n const href = getThreadRowHref?.(row);\n const rowCells = (\n <>\n <DataList.RowHeaderCell height=\"compact\" className=\"text-ui-sm\">\n {shortId(row.threadId)}\n </DataList.RowHeaderCell>\n <DataList.NumberCell>{row.resourceId ? shortId(row.resourceId) : '—'}</DataList.NumberCell>\n <DataList.NumberCell highlight>{row.runs.toLocaleString()}</DataList.NumberCell>\n <DataList.NumberCell>{row.tokens > 0 ? formatCompact(row.tokens) : '—'}</DataList.NumberCell>\n <DataList.NumberCell>\n {row.cost != null ? formatCost(row.cost, row.costUnit) : '—'}\n </DataList.NumberCell>\n </>\n );\n\n return href ? (\n <DataList.RowLink key={row.key} to={href} LinkComponent={LinkComponent}>\n {rowCells}\n </DataList.RowLink>\n ) : (\n <DataList.RowStatic key={row.key}>{rowCells}</DataList.RowStatic>\n );\n })}\n </DataList>\n ) : (\n <MetricsCard.NoData message=\"No thread activity yet\" />\n )}\n </TabContent>\n <TabContent value=\"resources\">\n {hasResourceData ? (\n <DataList columns=\"auto auto auto auto\" {...METRICS_DATA_LIST_PROPS}>\n <DataList.Top>\n <DataList.TopCell sticky=\"start\">Resource ID</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Threads</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Tokens</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cost</DataList.TopCell>\n </DataList.Top>\n {resourceRows.map(row => {\n const href = getResourceRowHref?.(row);\n const rowCells = (\n <>\n <DataList.RowHeaderCell height=\"compact\" className=\"text-ui-sm\">\n {shortId(row.resourceId)}\n </DataList.RowHeaderCell>\n <DataList.NumberCell highlight>{row.threadCount.toLocaleString()}</DataList.NumberCell>\n <DataList.NumberCell>{row.tokens > 0 ? formatCompact(row.tokens) : '—'}</DataList.NumberCell>\n <DataList.NumberCell>\n {row.cost != null ? formatCost(row.cost, row.costUnit) : '—'}\n </DataList.NumberCell>\n </>\n );\n\n return href ? (\n <DataList.RowLink key={row.key} to={href} LinkComponent={LinkComponent}>\n {rowCells}\n </DataList.RowLink>\n ) : (\n <DataList.RowStatic key={row.key}>{rowCells}</DataList.RowStatic>\n );\n })}\n </DataList>\n ) : (\n <MetricsCard.NoData message=\"No resource activity yet\" />\n )}\n </TabContent>\n </Tabs>\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n","import type { ReactNode } from 'react';\nimport { DataList } from '../../../ds/components/DataList/data-list';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { ModelUsageRow } from '../hooks/use-model-usage-cost-metrics';\nimport { formatCost, METRICS_DATA_LIST_PROPS } from './metrics-utils';\n\nexport interface ModelUsageCostCardViewProps {\n rows: ModelUsageRow[] | undefined;\n isLoading: boolean;\n isError: boolean;\n /** Optional drilldown for a row in the table. */\n getRowHref?: (row: ModelUsageRow) => string | undefined;\n /** Optional slot for top-bar action buttons. */\n actions?: ReactNode;\n /** Override how drilldown links are rendered. Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n}\n\nexport function ModelUsageCostCardView({\n rows,\n isLoading,\n isError,\n getRowHref,\n actions,\n LinkComponent,\n}: ModelUsageCostCardViewProps) {\n const hasData = !!rows && rows.length > 0;\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Model Usage & Cost\" description=\"Token consumption by model.\" />\n {hasData &&\n (() => {\n const totalCost = rows.reduce((sum, r) => sum + (r.cost ?? 0), 0);\n const units = new Set<string>();\n for (const row of rows) {\n if (row.cost != null && row.costUnit) {\n units.add(row.costUnit);\n }\n }\n let value: string;\n if (units.size === 0) {\n value = totalCost > 0 ? formatCost(totalCost) : '—';\n } else if (units.size === 1) {\n value = totalCost > 0 ? formatCost(totalCost, [...units][0]) : '—';\n } else {\n value = 'Mixed';\n }\n return <MetricsCard.Summary value={value} label=\"Total cost\" />;\n })()}\n {actions ? <MetricsCard.Actions>{actions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load model usage data\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No model usage data yet\" />\n ) : (\n <DataList columns=\"auto auto auto auto auto auto\" {...METRICS_DATA_LIST_PROPS}>\n <DataList.Top>\n <DataList.TopCell sticky=\"start\">Model</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Input</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Output</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cache Read</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cache Write</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Cost</DataList.TopCell>\n </DataList.Top>\n {rows.map(row => {\n const href = getRowHref?.(row);\n const rowCells = (\n <>\n <DataList.RowHeaderCell height=\"compact\" className=\"text-ui-sm\">\n {row.model}\n </DataList.RowHeaderCell>\n <DataList.NumberCell>{row.input}</DataList.NumberCell>\n <DataList.NumberCell>{row.output}</DataList.NumberCell>\n <DataList.NumberCell>{row.cacheRead}</DataList.NumberCell>\n <DataList.NumberCell>{row.cacheWrite}</DataList.NumberCell>\n <DataList.NumberCell highlight>\n {row.cost != null ? formatCost(row.cost, row.costUnit) : '—'}\n </DataList.NumberCell>\n </>\n );\n\n return href ? (\n <DataList.RowLink key={row.model} to={href} LinkComponent={LinkComponent}>\n {rowCells}\n </DataList.RowLink>\n ) : (\n <DataList.RowStatic key={row.model}>{rowCells}</DataList.RowStatic>\n );\n })}\n </DataList>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n","import { useMemo } from 'react';\nimport { DataList } from '../../../ds/components/DataList/data-list';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport { MetricsLineChart } from '../../../ds/components/MetricsLineChart/metrics-line-chart';\nimport { TabContent } from '../../../ds/components/Tabs/tabs-content';\nimport { TabList } from '../../../ds/components/Tabs/tabs-list';\nimport { Tabs } from '../../../ds/components/Tabs/tabs-root';\nimport { Tab } from '../../../ds/components/Tabs/tabs-tab';\nimport type { ScorerSummary, ScoresOverTimePoint } from '../hooks/use-scores-metrics';\nimport { CHART_COLORS, METRICS_DATA_LIST_PROPS } from './metrics-utils';\n\nconst SERIES_COLORS = [\n CHART_COLORS.green,\n CHART_COLORS.blue,\n CHART_COLORS.purple,\n CHART_COLORS.orange,\n CHART_COLORS.pink,\n CHART_COLORS.yellow,\n];\n\nexport interface ScoresCardViewProps {\n data:\n | {\n summaryData: ScorerSummary[];\n overTimeData: ScoresOverTimePoint[];\n scorerNames: string[];\n avgScore: number | null;\n }\n | undefined;\n isLoading: boolean;\n isError: boolean;\n}\n\nexport function ScoresCardView({ data, isLoading, isError }: ScoresCardViewProps) {\n const hasData = !!data && (data.summaryData.length > 0 || data.overTimeData.length > 0);\n\n const series = useMemo(() => {\n if (!data?.scorerNames) return [];\n return data.scorerNames.map((name, i) => ({\n dataKey: name,\n label: name,\n color: SERIES_COLORS[i % SERIES_COLORS.length],\n aggregate: (points: Record<string, unknown>[]) => ({\n value:\n points.length > 0\n ? (points.reduce((s, d) => s + ((d[name] as number) ?? 0), 0) / points.length).toFixed(2)\n : '0',\n suffix: 'avg',\n }),\n }));\n }, [data?.scorerNames]);\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Scores\" description=\"Evaluation scorer performance.\" />\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load scores data\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No scores data yet\" />\n ) : (\n <Tabs defaultTab=\"over-time\" className=\"overflow-visible\">\n <TabList>\n <Tab value=\"over-time\">Over Time</Tab>\n <Tab value=\"summary\">Summary</Tab>\n </TabList>\n <TabContent value=\"over-time\" className=\"pb-0\">\n {data.overTimeData.length > 0 ? (\n <MetricsLineChart data={data.overTimeData} series={series} yDomain={[0, 1]} />\n ) : (\n <MetricsCard.NoData message=\"No time series data yet\" />\n )}\n </TabContent>\n <TabContent value=\"summary\">\n <DataList columns=\"auto auto auto auto auto\" {...METRICS_DATA_LIST_PROPS}>\n <DataList.Top>\n <DataList.TopCell sticky=\"start\">Scorer</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Avg</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Min</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Max</DataList.TopCell>\n <DataList.TopCell className=\"justify-end text-right\">Count</DataList.TopCell>\n </DataList.Top>\n {data.summaryData.map(row => (\n <DataList.RowStatic key={row.scorer}>\n <DataList.RowHeaderCell height=\"compact\" className=\"text-ui-sm\">\n {row.scorer}\n </DataList.RowHeaderCell>\n <DataList.NumberCell highlight>{row.avg.toFixed(2)}</DataList.NumberCell>\n <DataList.NumberCell>{row.min.toFixed(2)}</DataList.NumberCell>\n <DataList.NumberCell>{row.max.toFixed(2)}</DataList.NumberCell>\n <DataList.NumberCell>{row.count.toLocaleString()}</DataList.NumberCell>\n </DataList.RowStatic>\n ))}\n </DataList>\n </TabContent>\n </Tabs>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n","import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { HorizontalBars } from '../../../ds/components/HorizontalBars/horizontal-bars';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport { TabContent } from '../../../ds/components/Tabs/tabs-content';\nimport { TabList } from '../../../ds/components/Tabs/tabs-list';\nimport { Tabs } from '../../../ds/components/Tabs/tabs-root';\nimport { Tab } from '../../../ds/components/Tabs/tabs-tab';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { TokenUsageByAgentRow } from '../hooks/use-token-usage-by-agent-metrics';\nimport { CHART_COLORS, formatCompact, formatCost } from './metrics-utils';\n\nexport interface TokenUsageByAgentCardViewProps {\n data: TokenUsageByAgentRow[] | undefined;\n isLoading: boolean;\n isError: boolean;\n /** Optional drilldown: returns an href for a single row in either tab. */\n getRowHref?: (row: TokenUsageByAgentRow) => string | undefined;\n /** Optional slot for top-bar action buttons. */\n actions?: ReactNode;\n /** Override how drilldown links are rendered. Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n}\n\ntype TokenUsageTab = 'tokens' | 'cost';\n\nfunction isTokenUsageTab(value: string): value is TokenUsageTab {\n return value === 'tokens' || value === 'cost';\n}\n\nexport function TokenUsageByAgentCardView({\n data,\n isLoading,\n isError,\n getRowHref,\n actions,\n LinkComponent,\n}: TokenUsageByAgentCardViewProps) {\n const [activeTab, setActiveTab] = useState<TokenUsageTab>('tokens');\n\n const rows = data ?? [];\n const hasData = rows.length > 0;\n const totalTokens = rows.reduce((s, d) => s + d.total, 0);\n const costRows = rows.filter(d => d.cost != null && d.cost > 0);\n const uniqueCostUnits = new Set(costRows.map(d => d.costUnit ?? 'usd'));\n const hasSingleCostUnit = uniqueCostUnits.size <= 1;\n const costUnit = hasSingleCostUnit ? ([...uniqueCostUnits][0] ?? 'usd') : null;\n const totalCost = hasSingleCostUnit ? costRows.reduce((s, d) => s + (d.cost ?? 0), 0) : 0;\n const hasCostData = hasSingleCostUnit && totalCost > 0;\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription\n title=\"Token Usage by Agent\"\n description=\"Token consumption grouped by agent.\"\n />\n {hasData &&\n (activeTab === 'cost' && hasCostData ? (\n <MetricsCard.Summary value={formatCost(totalCost, costUnit)} label=\"Total cost\" />\n ) : (\n <MetricsCard.Summary value={formatCompact(totalTokens)} label=\"Total tokens\" />\n ))}\n {hasData && actions ? <MetricsCard.Actions>{actions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load token usage data\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No token usage data yet\" />\n ) : (\n <Tabs\n defaultTab=\"tokens\"\n value={activeTab}\n onValueChange={v => {\n if (isTokenUsageTab(v)) setActiveTab(v);\n }}\n className=\"grid grid-rows-[auto_1fr] overflow-y-auto h-full\"\n >\n <TabList>\n <Tab value=\"tokens\">Tokens</Tab>\n <Tab value=\"cost\">Cost</Tab>\n </TabList>\n <TabContent value=\"tokens\">\n <HorizontalBars\n LinkComponent={LinkComponent}\n data={rows.map(d => ({\n name: d.name,\n values: [d.input, d.output],\n href: getRowHref?.(d),\n }))}\n segments={[\n { label: 'Input', color: CHART_COLORS.blueDark },\n { label: 'Output', color: CHART_COLORS.blue },\n ]}\n maxVal={Math.max(...rows.map(d => d.input + d.output))}\n fmt={formatCompact}\n />\n </TabContent>\n <TabContent value=\"cost\">\n {hasCostData ? (\n <HorizontalBars\n LinkComponent={LinkComponent}\n data={costRows\n .slice()\n .sort((a, b) => (b.cost ?? 0) - (a.cost ?? 0))\n .map(d => ({ name: d.name, values: [d.cost!], href: getRowHref?.(d) }))}\n segments={[{ label: 'Cost', color: CHART_COLORS.purple }]}\n maxVal={Math.max(...costRows.map(d => d.cost ?? 0))}\n fmt={v => formatCost(v, costUnit)}\n />\n ) : (\n <MetricsCard.NoData message=\"No cost data yet\" />\n )}\n </TabContent>\n </Tabs>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n","import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { MetricsCard } from '../../../ds/components/MetricsCard';\nimport { MetricsLineChart } from '../../../ds/components/MetricsLineChart';\nimport { Tab, TabContent, TabList, Tabs } from '../../../ds/components/Tabs';\nimport type { TokenTimelinePoint, TokenUsageTimeSeriesInterval } from '../hooks/use-token-usage-timeseries';\nimport { CHART_COLORS, formatCompact, formatCost } from './metrics-utils';\n\ntype TokenUsageTimelineTab = 'tokens' | 'cost';\n\nfunction sumMetric(dataKey: 'input' | 'output' | 'cost', formatter: (value: number) => string = formatCompact) {\n return (data: Record<string, unknown>[]) => ({\n value: formatter(data.reduce((sum, point) => sum + (typeof point[dataKey] === 'number' ? point[dataKey] : 0), 0)),\n });\n}\n\nconst tokenSeries = [\n {\n dataKey: 'input',\n label: 'Input tokens',\n color: CHART_COLORS.blue,\n aggregate: sumMetric('input'),\n },\n {\n dataKey: 'output',\n label: 'Output tokens',\n color: CHART_COLORS.yellow,\n aggregate: sumMetric('output'),\n },\n];\n\nfunction isTokenUsageTimelineTab(value: string): value is TokenUsageTimelineTab {\n return value === 'tokens' || value === 'cost';\n}\n\nexport interface TokenUsageTimelineCardViewProps {\n data: TokenTimelinePoint[] | undefined;\n interval: TokenUsageTimeSeriesInterval | undefined;\n isLoading: boolean;\n isError: boolean;\n actions?: ReactNode;\n}\n\nexport function TokenUsageTimelineCardView({\n data,\n interval = '1d',\n isLoading,\n isError,\n actions,\n}: TokenUsageTimelineCardViewProps) {\n const [activeTab, setActiveTab] = useState<TokenUsageTimelineTab>('tokens');\n\n const points = data ?? [];\n const chartPoints = points.map(point => ({ ...point }));\n const hasData = points.length > 0;\n const totalTokens = points.reduce((sum, point) => sum + point.total, 0);\n const costPoints = points.filter(point => point.cost != null && point.cost > 0);\n const costChartPoints = costPoints.map(point => ({ ...point }));\n const uniqueCostUnits = new Set(costPoints.map(point => point.costUnit).filter((unit): unit is string => !!unit));\n const hasSingleCostUnit = uniqueCostUnits.size === 1 && costPoints.every(point => point.costUnit != null);\n const costUnit = hasSingleCostUnit ? ([...uniqueCostUnits][0] ?? null) : null;\n const totalCost = hasSingleCostUnit ? costPoints.reduce((sum, point) => sum + (point.cost ?? 0), 0) : 0;\n const hasCostData = hasSingleCostUnit && totalCost > 0;\n const description = interval === '1h' ? 'Input and output tokens per hour.' : 'Input and output tokens per day.';\n\n const costSeries = [\n {\n dataKey: 'cost',\n label: 'Cost',\n color: CHART_COLORS.purple,\n aggregate: sumMetric('cost', value => formatCost(value, costUnit)),\n },\n ];\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Token usage over time\" description={description} />\n {hasData &&\n (activeTab === 'cost' && hasCostData ? (\n <MetricsCard.Summary value={formatCost(totalCost, costUnit)} label=\"Total cost\" />\n ) : (\n <MetricsCard.Summary value={formatCompact(totalTokens)} label=\"Total tokens\" />\n ))}\n {hasData && actions ? <MetricsCard.Actions>{actions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load token usage timeline\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No token usage data yet\" />\n ) : (\n <Tabs\n defaultTab=\"tokens\"\n value={activeTab}\n onValueChange={value => {\n if (isTokenUsageTimelineTab(value)) setActiveTab(value);\n }}\n className=\"overflow-visible\"\n >\n <TabList>\n <Tab value=\"tokens\">Tokens</Tab>\n <Tab value=\"cost\">Cost</Tab>\n </TabList>\n <TabContent value=\"tokens\">\n <MetricsLineChart data={chartPoints} series={tokenSeries} />\n </TabContent>\n <TabContent value=\"cost\">\n {hasCostData ? (\n <MetricsLineChart data={costChartPoints} series={costSeries} />\n ) : (\n <MetricsCard.NoData message=\"No cost data yet\" />\n )}\n </TabContent>\n </Tabs>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n","import { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { HorizontalBars } from '../../../ds/components/HorizontalBars/horizontal-bars';\nimport { MetricsCard } from '../../../ds/components/MetricsCard/metrics-card';\nimport { TabContent } from '../../../ds/components/Tabs/tabs-content';\nimport { TabList } from '../../../ds/components/Tabs/tabs-list';\nimport { Tabs } from '../../../ds/components/Tabs/tabs-root';\nimport { Tab } from '../../../ds/components/Tabs/tabs-tab';\nimport type { LinkComponent } from '../../../ds/types/link-component';\nimport type { VolumeRow } from '../hooks/use-trace-volume-metrics';\nimport { CHART_COLORS, formatCompact } from './metrics-utils';\n\nexport type VolumeTab = 'agents' | 'workflows' | 'tools';\n\nfunction VolumeBars({\n data,\n rowHrefs,\n errorHrefs,\n LinkComponent,\n}: {\n data: VolumeRow[];\n rowHrefs?: (row: VolumeRow) => string | undefined;\n errorHrefs?: (row: VolumeRow) => string | undefined;\n LinkComponent?: LinkComponent;\n}) {\n return (\n <HorizontalBars\n LinkComponent={LinkComponent}\n data={data.map(d => {\n const errorHref = errorHrefs?.(d);\n const rowHref = rowHrefs?.(d);\n // HorizontalBars ignores per-segment `hrefs` whenever a row-level\n // `href` is set (to avoid nested anchors). When we want the Errors\n // segment to drill somewhere different from the rest of the row,\n // drop the row-level link and split navigation across segments\n // instead so each target is reachable.\n if (errorHref) {\n return {\n name: d.name,\n values: [d.completed, d.errors],\n hrefs: [rowHref, errorHref],\n };\n }\n return {\n name: d.name,\n values: [d.completed, d.errors],\n href: rowHref,\n };\n })}\n segments={[\n { label: 'Completed', color: CHART_COLORS.blueDark },\n { label: 'Errors', color: CHART_COLORS.pink },\n ]}\n maxVal={Math.max(...data.map(d => d.completed + d.errors))}\n fmt={formatCompact}\n />\n );\n}\n\nexport interface TracesVolumeCardViewProps {\n data: { agentData: VolumeRow[]; workflowData: VolumeRow[]; toolData: VolumeRow[] } | undefined;\n isLoading: boolean;\n isError: boolean;\n /** Optional drilldown: returns href for clicking a whole bar row. */\n getRowHref?: (tab: VolumeTab, row: VolumeRow) => string | undefined;\n /** Optional drilldown: returns href for clicking the \"Errors\" segment of a bar. */\n getErrorSegmentHref?: (tab: VolumeTab, row: VolumeRow) => string | undefined;\n /**\n * Optional slot for top-bar action buttons.\n * Pass a function to receive the active tab so actions can scope themselves to the current entity type.\n */\n actions?: ReactNode | ((tab: VolumeTab) => ReactNode);\n /** Override how drilldown links are rendered (e.g. router-aware adapter). Defaults to `<a>`. */\n LinkComponent?: LinkComponent;\n}\n\nexport function TracesVolumeCardView({\n data,\n isLoading,\n isError,\n getRowHref,\n getErrorSegmentHref,\n actions,\n LinkComponent,\n}: TracesVolumeCardViewProps) {\n const [activeTab, setActiveTab] = useState<VolumeTab>('agents');\n const renderedActions = typeof actions === 'function' ? actions(activeTab) : actions;\n const hasData = !!data && (data.agentData.length > 0 || data.workflowData.length > 0 || data.toolData.length > 0);\n const total = data\n ? [...data.agentData, ...data.workflowData, ...data.toolData].reduce((s, d) => s + d.completed + d.errors, 0)\n : 0;\n\n const tabRowHrefs = (tab: VolumeTab) => (getRowHref ? (row: VolumeRow) => getRowHref(tab, row) : undefined);\n const tabErrorHrefs = (tab: VolumeTab) =>\n getErrorSegmentHref ? (row: VolumeRow) => getErrorSegmentHref(tab, row) : undefined;\n\n return (\n <MetricsCard>\n <MetricsCard.TopBar>\n <MetricsCard.TitleAndDescription title=\"Trace Volume\" description=\"Runs and call counts.\" />\n {hasData && <MetricsCard.Summary value={formatCompact(total)} label=\"Total runs\" />}\n {renderedActions ? <MetricsCard.Actions>{renderedActions}</MetricsCard.Actions> : null}\n </MetricsCard.TopBar>\n {isLoading ? (\n <MetricsCard.Loading />\n ) : isError ? (\n <MetricsCard.Error message=\"Failed to load trace volume data\" />\n ) : (\n <MetricsCard.Content>\n {!hasData ? (\n <MetricsCard.NoData message=\"No trace volume data yet\" />\n ) : (\n <Tabs\n value={activeTab}\n onValueChange={setActiveTab}\n defaultTab=\"agents\"\n className=\"grid grid-rows-[auto_1fr] overflow-y-auto h-full\"\n >\n <TabList>\n <Tab value=\"agents\">Agents</Tab>\n <Tab value=\"workflows\">Workflows</Tab>\n <Tab value=\"tools\">Tools</Tab>\n </TabList>\n <TabContent value=\"agents\">\n {data.agentData.length > 0 ? (\n <VolumeBars\n data={data.agentData}\n rowHrefs={tabRowHrefs('agents')}\n errorHrefs={tabErrorHrefs('agents')}\n LinkComponent={LinkComponent}\n />\n ) : (\n <MetricsCard.NoData message=\"No agent data yet\" />\n )}\n </TabContent>\n <TabContent value=\"workflows\">\n {data.workflowData.length > 0 ? (\n <VolumeBars\n data={data.workflowData}\n rowHrefs={tabRowHrefs('workflows')}\n errorHrefs={tabErrorHrefs('workflows')}\n LinkComponent={LinkComponent}\n />\n ) : (\n <MetricsCard.NoData message=\"No workflow data yet\" />\n )}\n </TabContent>\n <TabContent value=\"tools\">\n {data.toolData.length > 0 ? (\n <VolumeBars\n data={data.toolData}\n rowHrefs={tabRowHrefs('tools')}\n errorHrefs={tabErrorHrefs('tools')}\n LinkComponent={LinkComponent}\n />\n ) : (\n <MetricsCard.NoData message=\"No tool data yet\" />\n )}\n </TabContent>\n </Tabs>\n )}\n </MetricsCard.Content>\n )}\n </MetricsCard>\n );\n}\n","import { useMemo, useRef } from 'react';\n\nimport { useMetrics } from './use-metrics';\nimport type { DatePreset, DateRange } from './use-metrics';\n\nconst PRESET_MS: Record<string, number> = {\n '24h': 24 * 60 * 60 * 1000,\n '3d': 3 * 24 * 60 * 60 * 1000,\n '7d': 7 * 24 * 60 * 60 * 1000,\n '14d': 14 * 24 * 60 * 60 * 1000,\n '30d': 30 * 24 * 60 * 60 * 1000,\n};\n\ntype Timestamp = { start: Date; end: Date };\n\nfunction buildTimestamp(preset: DatePreset, customRange: DateRange | undefined, anchor: number): Timestamp {\n if (preset !== 'custom') {\n const ms = PRESET_MS[preset] ?? PRESET_MS['24h'];\n return { start: new Date(anchor - ms), end: new Date(anchor) };\n }\n return {\n start: customRange?.from ?? new Date(anchor - PRESET_MS['24h']),\n end: customRange?.to ?? new Date(anchor),\n };\n}\n\n/**\n * Compose a ready-to-use metrics filter object: merges the active date range\n * with the dimensional filter pulled from the provider (sourced from URL +\n * toolbar).\n *\n * Hooks should spread `filters` directly into their backend call — do not pass\n * only `timestamp` or filters set via the toolbar will be silently ignored.\n *\n * Stability guarantees (important for react-query):\n * - `timestamp` is frozen at the moment the inputs change and does NOT update\n * on every render. Otherwise each render would mint a new `new Date()` and\n * every metrics query would re-fetch on every keystroke.\n * - `filters` and `filterKey` are referentially stable while inputs are\n * unchanged, so `queryKey` hashing is cheap and caches hit.\n */\nexport function useMetricsFilters() {\n const { datePreset, customRange, dimensionalFilter, dimensionalFilterKey } = useMetrics();\n\n // Anchor the \"now\" used for preset windows. We only recompute when the\n // preset or custom range changes — this gives a stable timestamp per query\n // boundary rather than a new Date on every render.\n const anchorRef = useRef<{ key: string; anchor: number } | null>(null);\n const windowKey =\n datePreset === 'custom'\n ? `custom:${customRange?.from?.getTime() ?? ''}:${customRange?.to?.getTime() ?? ''}`\n : `preset:${datePreset}`;\n if (!anchorRef.current || anchorRef.current.key !== windowKey) {\n anchorRef.current = { key: windowKey, anchor: Date.now() };\n }\n const anchor = anchorRef.current.anchor;\n\n const timestamp = useMemo(() => buildTimestamp(datePreset, customRange, anchor), [datePreset, customRange, anchor]);\n\n const filters = useMemo(\n () => ({ timestamp, ...dimensionalFilter }),\n // dimensionalFilterKey is a stringified digest, so this dep set gives a\n // stable ref while content is unchanged.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [timestamp, dimensionalFilterKey],\n );\n\n // filterKey combines window + dimensions so react-query keys are cheap.\n const filterKey = useMemo(() => `${windowKey}|${dimensionalFilterKey}`, [windowKey, dimensionalFilterKey]);\n\n return { datePreset, customRange, timestamp, filters, dimensionalFilter, filterKey };\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMetricsFilters } from './use-metrics-filters';\n\n/** Total Agent Runs — count of agent duration metric observations */\nexport function useAgentRunsKpiMetrics() {\n const client = useMastraClient();\n const { filters, filterKey } = useMetricsFilters();\n\n return useQuery({\n queryKey: ['metrics', 'agent-runs-kpi', filterKey],\n queryFn: () =>\n client.getMetricAggregate({\n name: ['mastra_agent_duration_ms'],\n aggregation: 'count',\n filters,\n comparePeriod: 'previous_period',\n }),\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMetricsFilters } from './use-metrics-filters';\n\n/** Total Model Cost — sum of estimatedCost across input and output token metrics */\nexport function useModelCostKpiMetrics() {\n const client = useMastraClient();\n const { filters, filterKey } = useMetricsFilters();\n\n return useQuery({\n queryKey: ['metrics', 'model-cost-kpi', filterKey],\n queryFn: async () => {\n const res = await client.getMetricAggregate({\n name: ['mastra_model_total_input_tokens', 'mastra_model_total_output_tokens'],\n aggregation: 'sum',\n filters,\n comparePeriod: 'previous_period',\n });\n\n return {\n cost: res.estimatedCost ?? null,\n costUnit: res.costUnit ?? null,\n previousCost: res.previousEstimatedCost ?? null,\n costChangePercent: res.costChangePercent ?? null,\n };\n },\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMetricsFilters } from './use-metrics-filters';\n\n/** Total Tokens — sum of all input + output tokens */\nexport function useTotalTokensKpiMetrics() {\n const client = useMastraClient();\n const { filters, filterKey } = useMetricsFilters();\n\n return useQuery({\n queryKey: ['metrics', 'total-tokens-kpi', filterKey],\n queryFn: async () => {\n const [input, output] = await Promise.all([\n client.getMetricAggregate({\n name: ['mastra_model_total_input_tokens'],\n aggregation: 'sum',\n filters,\n comparePeriod: 'previous_period',\n }),\n client.getMetricAggregate({\n name: ['mastra_model_total_output_tokens'],\n aggregation: 'sum',\n filters,\n comparePeriod: 'previous_period',\n }),\n ]);\n\n const hasCurrent = input.value != null || output.value != null;\n const hasPrevious = input.previousValue != null || output.previousValue != null;\n const value = (input.value ?? 0) + (output.value ?? 0);\n const previousValue = (input.previousValue ?? 0) + (output.previousValue ?? 0);\n const changePercent = hasPrevious && previousValue > 0 ? ((value - previousValue) / previousValue) * 100 : null;\n\n return {\n value: hasCurrent ? value : null,\n previousValue: hasPrevious ? previousValue : null,\n changePercent,\n };\n },\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { formatCompact } from '../components/metrics-utils';\nimport { useMetricsFilters } from './use-metrics-filters';\n\nexport interface ModelUsageRow {\n model: string;\n input: string;\n output: string;\n cacheRead: string;\n cacheWrite: string;\n cost: number | null;\n costUnit: string | null;\n}\n\nexport function useModelUsageCostMetrics() {\n const client = useMastraClient();\n const { filters, filterKey } = useMetricsFilters();\n\n return useQuery({\n queryKey: ['metrics', 'model-usage-cost', filterKey],\n queryFn: async (): Promise<ModelUsageRow[]> => {\n const [inputRes, outputRes, cacheReadRes, cacheWriteRes] = await Promise.all(\n (\n [\n 'mastra_model_total_input_tokens',\n 'mastra_model_total_output_tokens',\n 'mastra_model_input_cache_read_tokens',\n 'mastra_model_input_cache_write_tokens',\n ] as const\n ).map(name =>\n client.getMetricBreakdown({\n name: [name],\n groupBy: ['model'],\n aggregation: 'sum',\n orderDirection: 'DESC',\n filters,\n }),\n ),\n );\n\n type ModelEntry = {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: number | null;\n costUnit: string | null;\n };\n\n const modelMap = new Map<string, ModelEntry>();\n\n const ensureModel = (model: string): ModelEntry => {\n if (!modelMap.has(model)) {\n modelMap.set(model, { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: null, costUnit: null });\n }\n return modelMap.get(model)!;\n };\n\n // total_input/total_output estimatedCost already rolls up cache + other detail\n // costs. The cache breakdowns are kept for their token counts only.\n const addCost = (entry: ModelEntry, group: { estimatedCost?: number | null; costUnit?: string | null }) => {\n if (group.estimatedCost != null) {\n entry.cost = (entry.cost ?? 0) + group.estimatedCost;\n if (group.costUnit) entry.costUnit = group.costUnit;\n }\n };\n\n for (const group of inputRes.groups) {\n const m = group.dimensions.model ?? 'unknown';\n const entry = ensureModel(m);\n entry.input = group.value;\n addCost(entry, group);\n }\n for (const group of outputRes.groups) {\n const m = group.dimensions.model ?? 'unknown';\n const entry = ensureModel(m);\n entry.output = group.value;\n addCost(entry, group);\n }\n for (const group of cacheReadRes.groups) {\n const m = group.dimensions.model ?? 'unknown';\n const entry = ensureModel(m);\n entry.cacheRead = group.value;\n }\n for (const group of cacheWriteRes.groups) {\n const m = group.dimensions.model ?? 'unknown';\n const entry = ensureModel(m);\n entry.cacheWrite = group.value;\n }\n\n return Array.from(modelMap.entries())\n .map(([model, vals]) => ({\n model,\n input: formatCompact(vals.input),\n output: formatCompact(vals.output),\n cacheRead: formatCompact(vals.cacheRead),\n cacheWrite: formatCompact(vals.cacheWrite),\n cost: vals.cost,\n costUnit: vals.costUnit,\n }))\n .sort((a, b) => a.model.localeCompare(b.model));\n },\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMetricsFilters } from './use-metrics-filters';\n\nexport interface LatencyPoint {\n [key: string]: unknown;\n time: string;\n /** Raw timestamp (ms since epoch) for the bucket this point represents.\n * Used by drilldown clicks to compute a narrow time window. */\n tsMs: number;\n p50: number;\n p95: number;\n}\n\nexport const LATENCY_INTERVAL: '1h' = '1h';\n\nasync function fetchPercentiles(\n client: ReturnType<typeof useMastraClient>,\n metricName: string,\n filters: Record<string, unknown>,\n): Promise<LatencyPoint[]> {\n const res = await client.getMetricPercentiles({\n name: metricName,\n percentiles: [0.5, 0.95],\n interval: LATENCY_INTERVAL,\n filters,\n });\n\n const p50Series = res.series.find(s => s.percentile === 0.5);\n const p95Series = res.series.find(s => s.percentile === 0.95);\n\n if (!p50Series || !p95Series) return [];\n\n const p95Map = new Map(p95Series.points.map(p => [new Date(p.timestamp).getTime(), p.value]));\n\n return p50Series.points.map(p => {\n const ts = new Date(p.timestamp);\n const tsMs = ts.getTime();\n return {\n time: ts.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', hour12: false }),\n tsMs,\n p50: Math.round(p.value),\n p95: Math.round(p95Map.get(tsMs) ?? 0),\n };\n });\n}\n\nexport function useLatencyMetrics() {\n const client = useMastraClient();\n const { filters, filterKey } = useMetricsFilters();\n\n return useQuery({\n queryKey: ['metrics', 'latency', filterKey],\n queryFn: async () => {\n const [agentData, workflowData, toolData] = await Promise.all([\n fetchPercentiles(client, 'mastra_agent_duration_ms', filters),\n fetchPercentiles(client, 'mastra_workflow_duration_ms', filters),\n fetchPercentiles(client, 'mastra_tool_duration_ms', filters),\n ]);\n return { agentData, workflowData, toolData, interval: LATENCY_INTERVAL };\n },\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMetricsFilters } from './use-metrics-filters';\n\nexport interface VolumeRow {\n name: string;\n completed: number;\n errors: number;\n}\n\nasync function fetchVolume(\n client: ReturnType<typeof useMastraClient>,\n metricName: string,\n filters: Record<string, unknown>,\n): Promise<VolumeRow[]> {\n const res = await client.getMetricBreakdown({\n name: [metricName],\n groupBy: ['entityName', 'status'],\n aggregation: 'count',\n orderDirection: 'DESC',\n filters,\n });\n\n const map = new Map<string, { completed: number; errors: number }>();\n\n for (const group of res.groups) {\n const name = group.dimensions.entityName ?? 'unknown';\n const status = group.dimensions.status ?? 'ok';\n if (!map.has(name)) {\n map.set(name, { completed: 0, errors: 0 });\n }\n const entry = map.get(name)!;\n if (status === 'error') {\n entry.errors += group.value;\n } else {\n entry.completed += group.value;\n }\n }\n\n return Array.from(map.entries())\n .map(([name, vals]) => ({ name, ...vals }))\n .sort((a, b) => b.completed + b.errors - (a.completed + a.errors));\n}\n\nexport function useTraceVolumeMetrics() {\n const client = useMastraClient();\n const { filters, filterKey } = useMetricsFilters();\n\n return useQuery({\n queryKey: ['metrics', 'trace-volume', filterKey],\n queryFn: async () => {\n const [agentData, workflowData, toolData] = await Promise.all([\n fetchVolume(client, 'mastra_agent_duration_ms', filters),\n fetchVolume(client, 'mastra_workflow_duration_ms', filters),\n fetchVolume(client, 'mastra_tool_duration_ms', filters),\n ]);\n return { agentData, workflowData, toolData };\n },\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMetricsFilters } from './use-metrics-filters';\n\nexport interface ScorerSummary {\n scorer: string;\n avg: number;\n min: number;\n max: number;\n count: number;\n}\n\nexport interface ScoresOverTimePoint {\n time: string;\n [scorer: string]: string | number;\n}\n\nexport function useScoresMetrics() {\n const client = useMastraClient();\n const { datePreset, customRange, timestamp } = useMetricsFilters();\n\n return useQuery({\n queryKey: ['metrics', 'scores-card', datePreset, customRange],\n queryFn: async () => {\n const filters = {\n timestamp: { start: timestamp.start, end: timestamp.end },\n };\n\n const scorersMap = await client.listScorers();\n const scorerIds = Object.keys(scorersMap ?? {});\n\n if (scorerIds.length === 0) {\n return { summaryData: [], overTimeData: [], scorerNames: [], avgScore: null };\n }\n\n // Fetch summary stats first to determine which scorers have data\n const summaryResults = await Promise.all(\n scorerIds.map(async scorerId => {\n const [avg, min, max, count] = await Promise.all([\n client.getScoreAggregate({ scorerId, aggregation: 'avg', filters }),\n client.getScoreAggregate({ scorerId, aggregation: 'min', filters }),\n client.getScoreAggregate({ scorerId, aggregation: 'max', filters }),\n client.getScoreAggregate({ scorerId, aggregation: 'count', filters }),\n ]);\n return {\n scorer: scorerId,\n avg: avg.value ?? 0,\n min: min.value ?? 0,\n max: max.value ?? 0,\n count: count.value ?? 0,\n };\n }),\n );\n\n const summaryData: ScorerSummary[] = summaryResults.filter(s => s.count > 0);\n const scorerNames = summaryData.map(s => s.scorer);\n\n if (summaryData.length === 0) {\n return { summaryData: [], overTimeData: [], scorerNames: [], avgScore: null };\n }\n\n const totalWeighted = summaryData.reduce((s, d) => s + d.avg * d.count, 0);\n const totalCount = summaryData.reduce((s, d) => s + d.count, 0);\n const avgScore = totalCount ? Math.round((totalWeighted / totalCount) * 100) / 100 : 0;\n\n const interval = '1h';\n\n // Fetch hourly time series from the full period for active scorers\n const timeSeriesResults = await Promise.all(\n scorerNames.map(scorerId =>\n client.getScoreTimeSeries({\n scorerId,\n interval,\n aggregation: 'avg',\n filters,\n }),\n ),\n );\n\n // Collapse all days into a single 24-hour view (00:00–23:00).\n // For each hour-of-day, average the values across all days in the range.\n const hourBuckets = new Map<string, Map<string, { sum: number; count: number }>>();\n\n for (let i = 0; i < scorerNames.length; i++) {\n const scorerId = scorerNames[i];\n const series = timeSeriesResults[i]?.series ?? [];\n for (const s of series) {\n for (const point of s.points) {\n const ts = new Date(point.timestamp);\n const hourKey = ts.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n });\n if (!hourBuckets.has(hourKey)) {\n hourBuckets.set(hourKey, new Map());\n }\n const scorerMap = hourBuckets.get(hourKey)!;\n if (!scorerMap.has(scorerId)) {\n scorerMap.set(scorerId, { sum: 0, count: 0 });\n }\n const acc = scorerMap.get(scorerId)!;\n acc.sum += point.value;\n acc.count += 1;\n }\n }\n }\n\n // Build sorted 24h chart data\n const overTimeData: ScoresOverTimePoint[] = Array.from(hourBuckets.entries())\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([hourKey, scorerMap]) => {\n const point: ScoresOverTimePoint = { time: hourKey };\n for (const [scorerId, acc] of scorerMap) {\n point[scorerId] = +(acc.sum / acc.count).toFixed(2);\n }\n return point;\n });\n\n return {\n summaryData,\n overTimeData,\n scorerNames,\n avgScore,\n };\n },\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMetricsFilters } from './use-metrics-filters';\n\nexport interface TokenUsageByAgentRow {\n name: string;\n total: number;\n input: number;\n output: number;\n cost: number | null;\n costUnit: string | null;\n}\n\nexport function useTokenUsageByAgentMetrics() {\n const client = useMastraClient();\n const { filters, filterKey } = useMetricsFilters();\n\n return useQuery({\n queryKey: ['metrics', 'token-usage-by-agent', filterKey],\n queryFn: async (): Promise<TokenUsageByAgentRow[]> => {\n const breakdownBase = {\n groupBy: ['entityName'],\n aggregation: 'sum' as const,\n orderDirection: 'DESC' as const,\n filters,\n };\n // total_input/total_output estimatedCost already rolls up cache + other detail costs.\n const [inputRes, outputRes] = await Promise.all([\n client.getMetricBreakdown({ ...breakdownBase, name: ['mastra_model_total_input_tokens'] }),\n client.getMetricBreakdown({ ...breakdownBase, name: ['mastra_model_total_output_tokens'] }),\n ]);\n\n type AgentEntry = { input: number; output: number; cost: number | null; costUnit: string | null };\n\n const agentMap = new Map<string, AgentEntry>();\n\n const ensure = (name: string): AgentEntry => {\n if (!agentMap.has(name)) {\n agentMap.set(name, { input: 0, output: 0, cost: null, costUnit: null });\n }\n return agentMap.get(name)!;\n };\n\n const addCost = (entry: AgentEntry, group: { estimatedCost?: number | null; costUnit?: string | null }) => {\n if (group.estimatedCost != null) {\n entry.cost = (entry.cost ?? 0) + group.estimatedCost;\n if (group.costUnit) entry.costUnit = group.costUnit;\n }\n };\n\n for (const group of inputRes.groups) {\n const name = group.dimensions.entityName ?? 'unknown';\n const entry = ensure(name);\n entry.input = group.value;\n addCost(entry, group);\n }\n for (const group of outputRes.groups) {\n const name = group.dimensions.entityName ?? 'unknown';\n const entry = ensure(name);\n entry.output = group.value;\n addCost(entry, group);\n }\n\n return Array.from(agentMap.entries())\n .map(([name, vals]) => ({\n name,\n input: vals.input,\n output: vals.output,\n total: vals.input + vals.output,\n cost: vals.cost,\n costUnit: vals.costUnit,\n }))\n .sort((a, b) => b.total - a.total);\n },\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMetricsFilters } from './use-metrics-filters';\n\nexport type TokenUsageTimeSeriesInterval = '1h' | '1d';\n\nexport interface TokenTimelinePoint {\n time: string;\n tsMs: number;\n input: number;\n output: number;\n total: number;\n cost: number | null;\n costUnit: string | null;\n}\n\nexport interface TokenUsageTimeSeriesData {\n data: TokenTimelinePoint[];\n interval: TokenUsageTimeSeriesInterval;\n}\n\ntype TimeSeriesPoint = {\n timestamp: string | Date;\n value: number;\n estimatedCost?: number | null;\n};\n\ntype SeriesWithCost = {\n costUnit?: string | null;\n points: TimeSeriesPoint[];\n};\n\ntype TokenTimelineAccumulator = {\n tsMs: number;\n input: number;\n output: number;\n cost: number | null;\n costUnits: Set<string>;\n hasUnknownCostUnit: boolean;\n};\n\nfunction chooseTokenUsageInterval(\n datePreset: ReturnType<typeof useMetricsFilters>['datePreset'],\n): TokenUsageTimeSeriesInterval {\n return datePreset === '24h' ? '1h' : '1d';\n}\n\nfunction formatTime(ts: Date, interval: TokenUsageTimeSeriesInterval): string {\n if (interval === '1h') {\n return ts.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', hour12: false });\n }\n return ts.toLocaleDateString('en-US', { month: 'short', day: '2-digit' });\n}\n\nfunction addSeriesPoints(\n pointMap: Map<number, TokenTimelineAccumulator>,\n series: SeriesWithCost | undefined,\n key: 'input' | 'output',\n) {\n for (const point of series?.points ?? []) {\n const tsMs = new Date(point.timestamp).getTime();\n if (!Number.isFinite(tsMs)) continue;\n\n const existing = pointMap.get(tsMs) ?? {\n tsMs,\n input: 0,\n output: 0,\n cost: null,\n costUnits: new Set<string>(),\n hasUnknownCostUnit: false,\n };\n\n existing[key] += point.value;\n\n if (point.estimatedCost != null) {\n existing.cost = (existing.cost ?? 0) + point.estimatedCost;\n if (series?.costUnit) {\n existing.costUnits.add(series.costUnit);\n } else {\n existing.hasUnknownCostUnit = true;\n }\n }\n\n pointMap.set(tsMs, existing);\n }\n}\n\nfunction toCostUnit(entry: TokenTimelineAccumulator): string | null {\n if (entry.cost == null || entry.hasUnknownCostUnit || entry.costUnits.size !== 1) return null;\n return [...entry.costUnits][0] ?? null;\n}\n\nexport function useTokenUsageTimeSeries() {\n const client = useMastraClient();\n const { datePreset, filters, filterKey } = useMetricsFilters();\n const interval = chooseTokenUsageInterval(datePreset);\n\n return useQuery({\n queryKey: ['metrics', 'token-usage-timeseries', filterKey, interval],\n queryFn: async (): Promise<TokenUsageTimeSeriesData> => {\n const [inputRes, outputRes] = await Promise.all([\n client.getMetricTimeSeries({\n name: ['mastra_model_total_input_tokens'],\n interval,\n aggregation: 'sum',\n filters,\n }),\n client.getMetricTimeSeries({\n name: ['mastra_model_total_output_tokens'],\n interval,\n aggregation: 'sum',\n filters,\n }),\n ]);\n\n const pointMap = new Map<number, TokenTimelineAccumulator>();\n addSeriesPoints(pointMap, inputRes.series[0], 'input');\n addSeriesPoints(pointMap, outputRes.series[0], 'output');\n\n const data = Array.from(pointMap.values())\n .sort((a, b) => a.tsMs - b.tsMs)\n .map(point => {\n const ts = new Date(point.tsMs);\n return {\n time: formatTime(ts, interval),\n tsMs: point.tsMs,\n input: point.input,\n output: point.output,\n total: point.input + point.output,\n cost: point.cost,\n costUnit: toCostUnit(point),\n };\n });\n\n return { data, interval };\n },\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\n\nimport { useMetricsFilters } from './use-metrics-filters';\n\n/** Active Threads — number of distinct thread IDs observed in agent runs.\n * Uses approximate `count_distinct` (HyperLogLog on ClickHouse,\n * `approx_count_distinct` on DuckDB) so the query stays fast even on\n * tens of millions of rows. */\nexport function useActiveThreadsKpiMetrics() {\n const client = useMastraClient();\n const { filters, filterKey } = useMetricsFilters();\n\n return useQuery({\n queryKey: ['metrics', 'active-threads-kpi', filterKey],\n queryFn: () =>\n client.getMetricAggregate({\n name: ['mastra_agent_duration_ms'],\n aggregation: 'count_distinct',\n distinctColumn: 'threadId' as never,\n filters,\n comparePeriod: 'previous_period',\n }),\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\n\nimport { useMetricsFilters } from './use-metrics-filters';\n\n/** Active Resources — number of distinct resource IDs observed in agent runs.\n * Uses approximate `count_distinct` (HyperLogLog on ClickHouse,\n * `approx_count_distinct` on DuckDB) so the query stays fast even on\n * tens of millions of rows. */\nexport function useActiveResourcesKpiMetrics() {\n const client = useMastraClient();\n const { filters, filterKey } = useMetricsFilters();\n\n return useQuery({\n queryKey: ['metrics', 'active-resources-kpi', filterKey],\n queryFn: () =>\n client.getMetricAggregate({\n name: ['mastra_agent_duration_ms'],\n aggregation: 'count_distinct',\n distinctColumn: 'resourceId' as never,\n filters,\n comparePeriod: 'previous_period',\n }),\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\n\nimport { useMetricsFilters } from './use-metrics-filters';\n\nexport interface ActiveThreadRow {\n threadId: string;\n resourceId: string | null;\n runs: number;\n tokens: number;\n cost: number | null;\n costUnit: string | null;\n}\n\nconst TOP_N = 20;\n\n/** Top Active Threads — the threads with the most agent runs in the selected\n * range. Server-side TopK (`ORDER BY value DESC LIMIT 20`) is required so the\n * query never returns the full thread set when cardinality is in the millions.\n *\n * Tokens + cost are joined in from parallel breakdowns on the same `threadId`\n * grouping so we don't need any new backend aggregation support. */\nexport function useTopActiveThreadsMetrics() {\n const client = useMastraClient();\n const { filters, filterKey } = useMetricsFilters();\n\n return useQuery({\n queryKey: ['metrics', 'top-active-threads', filterKey],\n queryFn: async (): Promise<ActiveThreadRow[]> => {\n const breakdownBase = {\n groupBy: ['threadId', 'resourceId'],\n orderDirection: 'DESC' as const,\n filters,\n };\n\n const [runsRes, inputRes, outputRes] = await Promise.all([\n client.getMetricBreakdown({\n ...breakdownBase,\n name: ['mastra_agent_duration_ms'],\n aggregation: 'count',\n limit: TOP_N,\n }),\n // Token breakdowns use the same groupBy and a server-side TopK so the\n // response stays bounded even when the underlying thread set has very\n // high cardinality. Threads that are top-N by runs but not by tokens\n // will display 0 tokens (an acceptable approximation in exchange for\n // a bounded query).\n client.getMetricBreakdown({\n ...breakdownBase,\n name: ['mastra_model_total_input_tokens'],\n aggregation: 'sum',\n limit: TOP_N,\n }),\n client.getMetricBreakdown({\n ...breakdownBase,\n name: ['mastra_model_total_output_tokens'],\n aggregation: 'sum',\n limit: TOP_N,\n }),\n ]);\n\n type Entry = { tokens: number; cost: number | null; costUnit: string | null };\n const byThread = new Map<string, Entry>();\n\n const ensure = (threadId: string): Entry => {\n if (!byThread.has(threadId)) byThread.set(threadId, { tokens: 0, cost: null, costUnit: null });\n return byThread.get(threadId)!;\n };\n\n const foldTokens = (groups: typeof inputRes.groups) => {\n for (const group of groups) {\n const threadId = group.dimensions.threadId;\n if (!threadId) continue;\n const entry = ensure(threadId as string);\n entry.tokens += group.value;\n if (group.estimatedCost != null) {\n entry.cost = (entry.cost ?? 0) + group.estimatedCost;\n if (group.costUnit) entry.costUnit = group.costUnit;\n }\n }\n };\n foldTokens(inputRes.groups);\n foldTokens(outputRes.groups);\n\n return runsRes.groups\n .filter(group => !!group.dimensions.threadId)\n .map(group => {\n const threadId = group.dimensions.threadId as string;\n const extra = byThread.get(threadId);\n return {\n threadId,\n resourceId: (group.dimensions.resourceId as string | undefined) ?? null,\n runs: group.value,\n tokens: extra?.tokens ?? 0,\n cost: extra?.cost ?? null,\n costUnit: extra?.costUnit ?? null,\n };\n });\n },\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\n\nimport { useMetricsFilters } from './use-metrics-filters';\n\nexport interface ResourceThreadsRow {\n resourceId: string;\n threadCount: number;\n tokens: number;\n cost: number | null;\n costUnit: string | null;\n}\n\nconst TOP_N = 20;\n\n/** Top Resources by Thread Count — the resources with the most distinct threads\n * in the selected range. Uses `count_distinct(threadId)` per `resourceId`,\n * with server-side TopK (`ORDER BY value DESC LIMIT 20`).\n *\n * Tokens + cost are joined in from parallel breakdowns on `resourceId` so the\n * table can show cost/usage without a separate backend aggregation. */\nexport function useTopResourcesByThreadsMetrics() {\n const client = useMastraClient();\n const { filters, filterKey } = useMetricsFilters();\n\n return useQuery({\n queryKey: ['metrics', 'top-resources-by-threads', filterKey],\n queryFn: async (): Promise<ResourceThreadsRow[]> => {\n const breakdownBase = {\n groupBy: ['resourceId'],\n orderDirection: 'DESC' as const,\n filters,\n };\n\n const [threadsRes, inputRes, outputRes] = await Promise.all([\n client.getMetricBreakdown({\n ...breakdownBase,\n name: ['mastra_agent_duration_ms'],\n aggregation: 'count_distinct',\n distinctColumn: 'threadId' as never,\n limit: TOP_N,\n }),\n // Token breakdowns use the same groupBy and a server-side TopK so the\n // response stays bounded even when the underlying resource set has very\n // high cardinality. Resources that are top-N by thread count but not by\n // tokens will display 0 tokens (an acceptable approximation in exchange\n // for a bounded query).\n client.getMetricBreakdown({\n ...breakdownBase,\n name: ['mastra_model_total_input_tokens'],\n aggregation: 'sum',\n limit: TOP_N,\n }),\n client.getMetricBreakdown({\n ...breakdownBase,\n name: ['mastra_model_total_output_tokens'],\n aggregation: 'sum',\n limit: TOP_N,\n }),\n ]);\n\n type Entry = { tokens: number; cost: number | null; costUnit: string | null };\n const byResource = new Map<string, Entry>();\n\n const ensure = (resourceId: string): Entry => {\n if (!byResource.has(resourceId)) byResource.set(resourceId, { tokens: 0, cost: null, costUnit: null });\n return byResource.get(resourceId)!;\n };\n\n const foldTokens = (groups: typeof inputRes.groups) => {\n for (const group of groups) {\n const resourceId = group.dimensions.resourceId;\n if (!resourceId) continue;\n const entry = ensure(resourceId as string);\n entry.tokens += group.value;\n if (group.estimatedCost != null) {\n entry.cost = (entry.cost ?? 0) + group.estimatedCost;\n if (group.costUnit) entry.costUnit = group.costUnit;\n }\n }\n };\n foldTokens(inputRes.groups);\n foldTokens(outputRes.groups);\n\n return threadsRes.groups\n .filter(group => !!group.dimensions.resourceId)\n .map(group => {\n const resourceId = group.dimensions.resourceId as string;\n const extra = byResource.get(resourceId);\n return {\n resourceId,\n threadCount: group.value,\n tokens: extra?.tokens ?? 0,\n cost: extra?.cost ?? null,\n costUnit: extra?.costUnit ?? null,\n };\n });\n },\n });\n}\n","import { EntityType } from '@mastra/core/observability';\nimport type { ListLogsArgs } from '@mastra/core/storage';\nimport type { LogLevel } from './types';\nimport type { PropertyFilterField, PropertyFilterToken } from '@/ds/components/PropertyFilter/types';\n\nexport type LogsDatePreset = 'all' | 'last-24h' | 'last-3d' | 'last-7d' | 'last-14d' | 'last-30d' | 'custom';\n\nexport type LogsEntityOptions = { label: string; entityType: EntityType };\n\nexport const LOGS_ROOT_ENTITY_TYPES = {\n AGENT: EntityType.AGENT,\n WORKFLOW: EntityType.WORKFLOW_RUN,\n SCORER: EntityType.SCORER,\n INGEST: EntityType.RAG_INGESTION,\n} as const;\n\nexport const LOGS_ROOT_ENTITY_TYPE_OPTIONS = [\n { label: 'Agent', entityType: LOGS_ROOT_ENTITY_TYPES.AGENT },\n { label: 'Workflow', entityType: LOGS_ROOT_ENTITY_TYPES.WORKFLOW },\n { label: 'Scorer', entityType: LOGS_ROOT_ENTITY_TYPES.SCORER },\n { label: 'Ingest', entityType: LOGS_ROOT_ENTITY_TYPES.INGEST },\n] as const satisfies readonly LogsEntityOptions[];\n\nexport const LOG_LEVEL_VALUES: readonly LogLevel[] = ['debug', 'info', 'warn', 'error', 'fatal'] as const;\n\nexport const LOG_LEVEL_OPTIONS = [\n { label: 'Debug', value: 'debug' },\n { label: 'Info', value: 'info' },\n { label: 'Warn', value: 'warn' },\n { label: 'Error', value: 'error' },\n { label: 'Fatal', value: 'fatal' },\n] as const satisfies readonly { label: string; value: LogLevel }[];\n\nexport const LOGS_ROOT_ENTITY_TYPE_PARAM = 'rootEntityType';\nexport const LOGS_DATE_PRESET_PARAM = 'datePreset';\nexport const LOGS_DATE_FROM_PARAM = 'dateFrom';\nexport const LOGS_DATE_TO_PARAM = 'dateTo';\n\nexport const LOGS_DATE_PRESET_VALUES = new Set<LogsDatePreset>([\n 'all',\n 'last-24h',\n 'last-3d',\n 'last-7d',\n 'last-14d',\n 'last-30d',\n 'custom',\n]);\n\n/**\n * Generic filter URL params (filterX keys). Fields that carry multiple values\n * (tags, level) use repeated params; everything else is a single string.\n */\nexport const LOGS_PROPERTY_FILTER_PARAM_BY_FIELD = {\n level: 'filterLevel',\n tags: 'filterTags',\n entityName: 'filterEntityName',\n traceId: 'filterTraceId',\n spanId: 'filterSpanId',\n runId: 'filterRunId',\n threadId: 'filterThreadId',\n sessionId: 'filterSessionId',\n requestId: 'filterRequestId',\n resourceId: 'filterResourceId',\n userId: 'filterUserId',\n organizationId: 'filterOrganizationId',\n serviceName: 'filterServiceName',\n environment: 'filterEnvironment',\n experimentId: 'filterExperimentId',\n} as const;\n\nexport const LOGS_PROPERTY_FILTER_FIELD_IDS = Object.keys(LOGS_PROPERTY_FILTER_PARAM_BY_FIELD) as Array<\n keyof typeof LOGS_PROPERTY_FILTER_PARAM_BY_FIELD\n>;\n\n/** Fields stored as repeated URL params (value is string[]). */\nconst LOGS_ARRAY_FIELD_IDS = new Set<string>(['tags']);\n\nexport const DEFAULT_LOGS_FILTERS_STORAGE_KEY = 'mastra:logs:saved-filters';\n\nexport function saveLogsFiltersToStorage(\n params: URLSearchParams,\n storageKey: string = DEFAULT_LOGS_FILTERS_STORAGE_KEY,\n): void {\n const serialized = getPreservedLogsFilterParams(params);\n const preset = params.get(LOGS_DATE_PRESET_PARAM);\n if (preset) serialized.set(LOGS_DATE_PRESET_PARAM, preset);\n const from = params.get(LOGS_DATE_FROM_PARAM);\n if (from) serialized.set(LOGS_DATE_FROM_PARAM, from);\n const to = params.get(LOGS_DATE_TO_PARAM);\n if (to) serialized.set(LOGS_DATE_TO_PARAM, to);\n\n try {\n localStorage.setItem(storageKey, serialized.toString());\n } catch {\n // localStorage may be unavailable (private mode / quota) — silently skip.\n }\n}\n\nexport function clearSavedLogsFilters(storageKey: string = DEFAULT_LOGS_FILTERS_STORAGE_KEY): void {\n try {\n localStorage.removeItem(storageKey);\n } catch {\n // ignore\n }\n}\n\nexport function loadLogsFiltersFromStorage(\n storageKey: string = DEFAULT_LOGS_FILTERS_STORAGE_KEY,\n): URLSearchParams | null {\n try {\n const raw = localStorage.getItem(storageKey);\n if (!raw) return null;\n const parsed = new URLSearchParams(raw);\n return parsed.toString() ? parsed : null;\n } catch {\n return null;\n }\n}\n\nexport function hasAnyLogsFilterParams(params: URLSearchParams): boolean {\n if (params.has(LOGS_DATE_PRESET_PARAM)) return true;\n if (params.has(LOGS_DATE_FROM_PARAM)) return true;\n if (params.has(LOGS_DATE_TO_PARAM)) return true;\n if (params.has(LOGS_ROOT_ENTITY_TYPE_PARAM)) return true;\n for (const fieldId of LOGS_PROPERTY_FILTER_FIELD_IDS) {\n if (params.has(LOGS_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId])) return true;\n }\n return false;\n}\n\nexport function createLogsPropertyFilterFields({\n availableTags,\n availableRootEntityNames,\n availableServiceNames,\n availableEnvironments,\n loading,\n}: {\n availableTags: string[];\n availableRootEntityNames: string[];\n availableServiceNames: string[];\n availableEnvironments: string[];\n loading?: {\n tags?: boolean;\n entityNames?: boolean;\n serviceNames?: boolean;\n environments?: boolean;\n };\n}): PropertyFilterField[] {\n const fields: PropertyFilterField[] = [\n {\n id: 'rootEntityType',\n label: 'Primitive Type',\n kind: 'pick-multi',\n searchable: false,\n options: LOGS_ROOT_ENTITY_TYPE_OPTIONS.map(o => ({ label: o.label, value: o.entityType })),\n placeholder: 'Choose entity type',\n emptyText: 'No entity types.',\n },\n {\n id: 'entityName',\n label: 'Primitive Name',\n kind: 'pick-multi',\n options: availableRootEntityNames.map(name => ({ label: name, value: name })),\n placeholder: 'Choose entity names',\n emptyText: 'No entity names found.',\n isLoading: loading?.entityNames,\n },\n {\n id: 'level',\n label: 'Level',\n kind: 'pick-multi',\n searchable: false,\n options: LOG_LEVEL_OPTIONS.map(o => ({ label: o.label, value: o.value })),\n placeholder: 'Choose level',\n emptyText: 'No levels.',\n },\n {\n id: 'tags',\n label: 'Tags',\n kind: 'pick-multi',\n multi: true,\n options: availableTags.map(tag => ({ label: tag, value: tag })),\n placeholder: 'Choose tags',\n emptyText: 'No tags found.',\n isLoading: loading?.tags,\n },\n {\n id: 'serviceName',\n label: 'Service Name',\n kind: 'pick-multi',\n options: availableServiceNames.map(name => ({ label: name, value: name })),\n placeholder: 'Choose service names',\n emptyText: 'No service names found.',\n isLoading: loading?.serviceNames,\n },\n {\n id: 'environment',\n label: 'Environment',\n kind: 'pick-multi',\n options: availableEnvironments.map(env => ({ label: env, value: env })),\n placeholder: 'Choose environments',\n emptyText: 'No environments found.',\n isLoading: loading?.environments,\n },\n { id: 'traceId', label: 'Trace ID', kind: 'text' },\n { id: 'spanId', label: 'Span ID', kind: 'text' },\n { id: 'runId', label: 'Run ID', kind: 'text' },\n { id: 'threadId', label: 'Thread ID', kind: 'text' },\n { id: 'sessionId', label: 'Session ID', kind: 'text' },\n { id: 'requestId', label: 'Request ID', kind: 'text' },\n { id: 'resourceId', label: 'Resource ID', kind: 'text' },\n { id: 'userId', label: 'User ID', kind: 'text' },\n { id: 'organizationId', label: 'Organization ID', kind: 'text' },\n { id: 'experimentId', label: 'Experiment ID', kind: 'text' },\n ];\n const byLabel = (a: PropertyFilterField, b: PropertyFilterField) => a.label.localeCompare(b.label);\n const pickMulti = fields.filter(f => f.kind === 'pick-multi').sort(byLabel);\n const text = fields.filter(f => f.kind === 'text').sort(byLabel);\n return [...pickMulti, ...text];\n}\n\n/**\n * Read filter tokens from URL search params preserving the order in which\n * each filter was first added. Fields in LOGS_ARRAY_FIELD_IDS are read as\n * string[]; an empty sentinel (`filterX=`) keeps the pill alive post-Reset.\n */\nexport function getLogsPropertyFilterTokens(searchParams: URLSearchParams): PropertyFilterToken[] {\n const tokens: PropertyFilterToken[] = [];\n\n const paramToFieldId = new Map<string, string>([[LOGS_ROOT_ENTITY_TYPE_PARAM, 'rootEntityType']]);\n for (const fieldId of LOGS_PROPERTY_FILTER_FIELD_IDS) {\n paramToFieldId.set(LOGS_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId], fieldId);\n }\n\n const seen = new Set<string>();\n for (const [paramName] of searchParams.entries()) {\n const fieldId = paramToFieldId.get(paramName);\n if (!fieldId || seen.has(fieldId)) continue;\n seen.add(fieldId);\n\n if (LOGS_ARRAY_FIELD_IDS.has(fieldId)) {\n const raw = searchParams.getAll(paramName);\n if (raw.length === 0) continue;\n tokens.push({ fieldId, value: raw.filter(Boolean) });\n continue;\n }\n\n const value = searchParams.get(paramName);\n if (value !== null) tokens.push({ fieldId, value });\n }\n\n return tokens;\n}\n\nexport function getPreservedLogsFilterParams(searchParams: URLSearchParams) {\n const next = new URLSearchParams();\n\n const rootEntityType = searchParams.get(LOGS_ROOT_ENTITY_TYPE_PARAM);\n if (rootEntityType) next.set(LOGS_ROOT_ENTITY_TYPE_PARAM, rootEntityType);\n\n for (const fieldId of LOGS_PROPERTY_FILTER_FIELD_IDS) {\n const param = LOGS_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId];\n if (LOGS_ARRAY_FIELD_IDS.has(fieldId)) {\n for (const value of searchParams.getAll(param)) {\n next.append(param, value);\n }\n continue;\n }\n\n const value = searchParams.get(param);\n if (value) next.set(param, value);\n }\n\n return next;\n}\n\nexport function applyLogsPropertyFilterTokens(params: URLSearchParams, tokens: PropertyFilterToken[]) {\n params.delete(LOGS_ROOT_ENTITY_TYPE_PARAM);\n for (const fieldId of LOGS_PROPERTY_FILTER_FIELD_IDS) {\n params.delete(LOGS_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId]);\n }\n\n for (const token of tokens) {\n if (token.fieldId === 'rootEntityType' && typeof token.value === 'string') {\n params.set(LOGS_ROOT_ENTITY_TYPE_PARAM, token.value);\n continue;\n }\n\n const param =\n LOGS_PROPERTY_FILTER_PARAM_BY_FIELD[token.fieldId as keyof typeof LOGS_PROPERTY_FILTER_PARAM_BY_FIELD];\n if (!param) continue;\n\n if (LOGS_ARRAY_FIELD_IDS.has(token.fieldId) && Array.isArray(token.value)) {\n if (token.value.length === 0) {\n // Empty sentinel — keeps the pill visible after Reset.\n params.append(param, '');\n } else {\n for (const value of token.value) {\n params.append(param, value);\n }\n }\n continue;\n }\n\n if (typeof token.value === 'string') {\n // Persist empty / 'Any' values too so neutralized-but-still-visible pills\n // survive URL round-trips. buildLogsListFilters skips these on the API\n // query side so neutrals never reach the backend.\n params.set(param, token.value.trim());\n }\n }\n}\n\nexport function buildLogsListFilters({\n rootEntityType,\n dateFrom,\n dateTo,\n tokens,\n}: {\n rootEntityType?: string;\n dateFrom?: Date;\n dateTo?: Date;\n tokens: PropertyFilterToken[];\n}): ListLogsArgs['filters'] {\n const filters: NonNullable<ListLogsArgs['filters']> = {};\n\n if (rootEntityType) {\n filters.rootEntityType = rootEntityType as NonNullable<ListLogsArgs['filters']>['rootEntityType'];\n }\n\n if (dateFrom || dateTo) {\n filters.timestamp = {\n ...(dateFrom ? { start: dateFrom } : {}),\n ...(dateTo ? { end: dateTo } : {}),\n };\n }\n\n for (const token of tokens) {\n if (token.fieldId === 'tags') {\n if (Array.isArray(token.value) && token.value.length > 0) {\n filters.tags = token.value;\n } else if (typeof token.value === 'string' && token.value.trim()) {\n filters.tags = [token.value.trim()];\n }\n continue;\n }\n\n if (token.fieldId === 'level') {\n // Single-select only — the server's `level` union (single LogLevel or\n // array) can't round-trip as a JSON-string array through the query-param\n // schema wrapper, so we send a single enum value. \"Any\" = no filter.\n if (typeof token.value === 'string' && token.value.trim() && token.value !== 'Any') {\n filters.level = token.value as LogLevel;\n }\n continue;\n }\n\n if (typeof token.value !== 'string') continue;\n // Skip empty-string tokens (unfilled pending filters) and 'Any'\n // (pick-multi single-select neutral state) so neutrals never reach the\n // backend.\n if (!token.value.trim()) continue;\n if (token.value === 'Any') continue;\n\n switch (token.fieldId) {\n case 'entityName':\n filters.rootEntityName = token.value;\n break;\n case 'traceId':\n filters.traceId = token.value;\n break;\n case 'spanId':\n filters.spanId = token.value;\n break;\n case 'runId':\n filters.runId = token.value;\n break;\n case 'threadId':\n filters.threadId = token.value;\n break;\n case 'sessionId':\n filters.sessionId = token.value;\n break;\n case 'requestId':\n filters.requestId = token.value;\n break;\n case 'resourceId':\n filters.resourceId = token.value;\n break;\n case 'userId':\n filters.userId = token.value;\n break;\n case 'organizationId':\n filters.organizationId = token.value;\n break;\n case 'serviceName':\n filters.serviceName = token.value;\n break;\n case 'environment':\n filters.environment = token.value;\n break;\n case 'experimentId':\n filters.experimentId = token.value;\n break;\n default:\n break;\n }\n }\n\n return filters;\n}\n\n/**\n * \"Clear\" semantics for the logs toolbar: keep all filter pills but neutralize each value.\n * '' for text fields, 'Any' for single-select pick-multi, [] for multi-select pick-multi.\n * Date range is intentionally NOT touched here — that's a separate concern.\n */\nexport function neutralizeLogsFilterTokens(\n filterFields: PropertyFilterField[],\n filterTokens: PropertyFilterToken[],\n): PropertyFilterToken[] {\n return filterTokens.map(token => {\n const field = filterFields.find(f => f.id === token.fieldId);\n if (!field) return token;\n if (field.kind === 'text') return { fieldId: token.fieldId, value: '' };\n if (field.kind === 'pick-multi') {\n return field.multi ? { fieldId: token.fieldId, value: [] } : { fieldId: token.fieldId, value: 'Any' };\n }\n return token;\n });\n}\n","import { EntityType } from '@mastra/core/observability';\nimport type { ListTracesArgs } from '@mastra/core/storage';\nimport type { TraceDatePreset } from './types';\nimport type { PropertyFilterField, PropertyFilterToken } from '@/ds/components/PropertyFilter/types';\n\nexport type EntityOptions = { label: string; entityType: EntityType };\n\nexport const ROOT_ENTITY_TYPES = {\n AGENT: EntityType.AGENT,\n WORKFLOW: EntityType.WORKFLOW_RUN,\n SCORER: EntityType.SCORER,\n INGEST: EntityType.RAG_INGESTION,\n} as const;\n\nexport const ROOT_ENTITY_TYPE_OPTIONS = [\n { label: 'Agent', entityType: ROOT_ENTITY_TYPES.AGENT },\n { label: 'Workflow', entityType: ROOT_ENTITY_TYPES.WORKFLOW },\n { label: 'Scorer', entityType: ROOT_ENTITY_TYPES.SCORER },\n { label: 'Ingest', entityType: ROOT_ENTITY_TYPES.INGEST },\n] as const satisfies readonly EntityOptions[];\n\nexport type TraceStatusFilter = 'running' | 'success' | 'error';\n\nexport const TRACE_STATUS_OPTIONS = [\n { label: 'Running', value: 'running' },\n { label: 'Success', value: 'success' },\n { label: 'Error', value: 'error' },\n] as const satisfies readonly { label: string; value: TraceStatusFilter }[];\n\n/** Field ids for \"synthetic\" filter entries — they live in dedicated URL params\n * rather than the generic `filter*` set, but appear as rows in the Filter\n * popover so users can manage all filters from one place. */\nexport const TRACE_SYNTHETIC_FILTER_FIELD_IDS = ['rootEntityType', 'status'] as const;\n\nexport const TRACE_ROOT_ENTITY_TYPE_PARAM = 'rootEntityType';\nexport const TRACE_STATUS_PARAM = 'status';\nexport const TRACE_LIST_MODE_PARAM = 'listMode';\n/** Branch-mode only: identifies the anchor span that defines the displayed subtree.\n * Stable across intra-panel span navigation (which only changes `spanId`). */\nexport const TRACE_ANCHOR_SPAN_ID_PARAM = 'anchorSpanId';\nexport const TRACE_LIST_MODE_VALUES = new Set(['traces', 'branches'] as const);\nexport type TraceListMode = 'traces' | 'branches';\n\nexport const TRACE_LIST_MODE_OPTIONS = [\n { label: 'Traces (default)', value: 'traces' },\n { label: 'Branches', value: 'branches' },\n] as const satisfies readonly { label: string; value: TraceListMode }[];\nexport const TRACE_DATE_PRESET_PARAM = 'datePreset';\nexport const TRACE_DATE_FROM_PARAM = 'dateFrom';\nexport const TRACE_DATE_TO_PARAM = 'dateTo';\n\nexport const TRACE_DATE_PRESET_VALUES = new Set<TraceDatePreset>([\n 'all',\n 'last-24h',\n 'last-3d',\n 'last-7d',\n 'last-14d',\n 'last-30d',\n 'custom',\n]);\n\nexport const TRACE_PROPERTY_FILTER_PARAM_BY_FIELD = {\n tags: 'filterTags',\n entityId: 'filterEntityId',\n entityName: 'filterEntityName',\n traceId: 'filterTraceId',\n runId: 'filterRunId',\n threadId: 'filterThreadId',\n sessionId: 'filterSessionId',\n requestId: 'filterRequestId',\n resourceId: 'filterResourceId',\n userId: 'filterUserId',\n organizationId: 'filterOrganizationId',\n serviceName: 'filterServiceName',\n environment: 'filterEnvironment',\n experimentId: 'filterExperimentId',\n} as const;\n\nexport const TRACE_PROPERTY_FILTER_FIELD_IDS = Object.keys(TRACE_PROPERTY_FILTER_PARAM_BY_FIELD) as Array<\n keyof typeof TRACE_PROPERTY_FILTER_PARAM_BY_FIELD\n>;\n\nexport const TRACE_STATUS_VALUES = new Set<TraceStatusFilter>(['running', 'success', 'error']);\n\nexport const DEFAULT_TRACE_FILTERS_STORAGE_KEY = 'mastra:traces:saved-filters';\n\n/** Serialize the filter-related URL params (date + rootEntityType + status +\n * generic filterX set) to localStorage so the user can restore them on next\n * visit. Throws no errors — storage being unavailable is fine. */\nexport function saveTraceFiltersToStorage(\n params: URLSearchParams,\n storageKey: string = DEFAULT_TRACE_FILTERS_STORAGE_KEY,\n): void {\n const serialized = getPreservedTraceFilterParams(params);\n const preset = params.get(TRACE_DATE_PRESET_PARAM);\n if (preset) serialized.set(TRACE_DATE_PRESET_PARAM, preset);\n const from = params.get(TRACE_DATE_FROM_PARAM);\n if (from) serialized.set(TRACE_DATE_FROM_PARAM, from);\n const to = params.get(TRACE_DATE_TO_PARAM);\n if (to) serialized.set(TRACE_DATE_TO_PARAM, to);\n\n try {\n localStorage.setItem(storageKey, serialized.toString());\n } catch {\n // localStorage may be unavailable (private mode / quota) — silently skip.\n }\n}\n\n/** Forget any previously saved filter set. Called from the \"Remove filters\"\n * action so the next plain sidebar nav lands on an empty page. */\nexport function clearSavedTraceFilters(storageKey: string = DEFAULT_TRACE_FILTERS_STORAGE_KEY): void {\n try {\n localStorage.removeItem(storageKey);\n } catch {\n // ignore — storage may be unavailable\n }\n}\n\n/** Read a previously saved filter set and return it as URLSearchParams, or\n * null if nothing is saved or storage is unavailable. */\nexport function loadTraceFiltersFromStorage(\n storageKey: string = DEFAULT_TRACE_FILTERS_STORAGE_KEY,\n): URLSearchParams | null {\n try {\n const raw = localStorage.getItem(storageKey);\n if (!raw) return null;\n const parsed = new URLSearchParams(raw);\n return parsed.toString() ? parsed : null;\n } catch {\n return null;\n }\n}\n\n/** True when `params` carries any filter-related key — used to decide whether\n * to hydrate from localStorage on page mount (we only hydrate when the URL is\n * filter-clean, i.e. the user landed here via a plain sidebar nav). */\nexport function hasAnyTraceFilterParams(params: URLSearchParams): boolean {\n if (params.has(TRACE_DATE_PRESET_PARAM)) return true;\n if (params.has(TRACE_DATE_FROM_PARAM)) return true;\n if (params.has(TRACE_DATE_TO_PARAM)) return true;\n if (params.has(TRACE_ROOT_ENTITY_TYPE_PARAM)) return true;\n if (params.has(TRACE_STATUS_PARAM)) return true;\n if (params.has(TRACE_LIST_MODE_PARAM)) return true;\n for (const fieldId of TRACE_PROPERTY_FILTER_FIELD_IDS) {\n if (params.has(TRACE_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId])) return true;\n }\n return false;\n}\n\nexport function createTracePropertyFilterFields({\n availableTags,\n availableRootEntityNames,\n availableServiceNames,\n availableEnvironments,\n loading,\n}: {\n availableTags: string[];\n availableRootEntityNames: string[];\n availableServiceNames: string[];\n availableEnvironments: string[];\n loading?: {\n tags?: boolean;\n entityNames?: boolean;\n serviceNames?: boolean;\n environments?: boolean;\n };\n}): PropertyFilterField[] {\n const fields: PropertyFilterField[] = [\n {\n id: 'rootEntityType',\n label: 'Primitive Type',\n kind: 'pick-multi',\n searchable: false,\n options: ROOT_ENTITY_TYPE_OPTIONS.map(o => ({ label: o.label, value: o.entityType })),\n placeholder: 'Choose entity type',\n emptyText: 'No entity types.',\n },\n {\n id: 'entityName',\n label: 'Primitive Name',\n kind: 'pick-multi',\n options: availableRootEntityNames.map(name => ({ label: name, value: name })),\n placeholder: 'Choose entity names',\n emptyText: 'No entity names found.',\n isLoading: loading?.entityNames,\n },\n { id: 'entityId', label: 'Primitive ID', kind: 'text' },\n {\n id: 'status',\n label: 'Status',\n kind: 'pick-multi',\n searchable: false,\n options: TRACE_STATUS_OPTIONS.map(o => ({ label: o.label, value: o.value })),\n placeholder: 'Choose status',\n emptyText: 'No statuses.',\n },\n {\n id: 'tags',\n label: 'Tags',\n kind: 'pick-multi',\n multi: true,\n options: availableTags.map(tag => ({ label: tag, value: tag })),\n placeholder: 'Choose tags',\n emptyText: 'No tags found.',\n isLoading: loading?.tags,\n },\n {\n id: 'serviceName',\n label: 'Service Name',\n kind: 'pick-multi',\n options: availableServiceNames.map(name => ({ label: name, value: name })),\n placeholder: 'Choose service names',\n emptyText: 'No service names found.',\n isLoading: loading?.serviceNames,\n },\n {\n id: 'environment',\n label: 'Environment',\n kind: 'pick-multi',\n options: availableEnvironments.map(env => ({ label: env, value: env })),\n placeholder: 'Choose environments',\n emptyText: 'No environments found.',\n isLoading: loading?.environments,\n },\n { id: 'traceId', label: 'Trace ID', kind: 'text' },\n { id: 'runId', label: 'Run ID', kind: 'text' },\n { id: 'threadId', label: 'Thread ID', kind: 'text' },\n { id: 'sessionId', label: 'Session ID', kind: 'text' },\n { id: 'requestId', label: 'Request ID', kind: 'text' },\n { id: 'resourceId', label: 'Resource ID', kind: 'text' },\n { id: 'userId', label: 'User ID', kind: 'text' },\n { id: 'organizationId', label: 'Organization ID', kind: 'text' },\n { id: 'experimentId', label: 'Experiment ID', kind: 'text' },\n ];\n const byLabel = (a: PropertyFilterField, b: PropertyFilterField) => a.label.localeCompare(b.label);\n const pickMulti = fields.filter(f => f.kind === 'pick-multi').sort(byLabel);\n const text = fields.filter(f => f.kind === 'text').sort(byLabel);\n return [...pickMulti, ...text];\n}\n\n/**\n * Read filter tokens from URL search params preserving the order in which each\n * filter was first added (URLSearchParams iterates in insertion order). This\n * is used by the Filter popover + PropertyFilterApplied pills so the UI reflects the\n * order the user created the filters in.\n */\nexport function getTracePropertyFilterTokens(searchParams: URLSearchParams): PropertyFilterToken[] {\n const tokens: PropertyFilterToken[] = [];\n\n // Map URL param name → fieldId for both generic filterX params and the\n // dedicated synthetic params (rootEntityType, status).\n const paramToFieldId = new Map<string, string>([\n [TRACE_ROOT_ENTITY_TYPE_PARAM, 'rootEntityType'],\n [TRACE_STATUS_PARAM, 'status'],\n ]);\n for (const fieldId of TRACE_PROPERTY_FILTER_FIELD_IDS) {\n paramToFieldId.set(TRACE_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId], fieldId);\n }\n\n const seen = new Set<string>();\n for (const [paramName] of searchParams.entries()) {\n const fieldId = paramToFieldId.get(paramName);\n if (!fieldId || seen.has(fieldId)) continue;\n seen.add(fieldId);\n\n if (fieldId === 'tags') {\n const raw = searchParams.getAll(paramName);\n if (raw.length === 0) continue;\n // An empty `filterTags=` sentinel keeps the pill alive after a Reset\n // (neutral state = no selections) so users can re-pick without losing\n // the pill's position. Non-empty entries are the actual selected tags.\n tokens.push({ fieldId, value: raw.filter(Boolean) });\n continue;\n }\n\n // Text and synthetic single-value fields: include empty strings so\n // pending-but-not-yet-filled filters survive URL round-trips.\n const value = searchParams.get(paramName);\n if (value !== null) tokens.push({ fieldId, value });\n }\n\n return tokens;\n}\n\nexport function getPreservedTraceFilterParams(searchParams: URLSearchParams) {\n const next = new URLSearchParams();\n\n const rootEntityType = searchParams.get(TRACE_ROOT_ENTITY_TYPE_PARAM);\n if (rootEntityType) next.set(TRACE_ROOT_ENTITY_TYPE_PARAM, rootEntityType);\n\n const status = searchParams.get(TRACE_STATUS_PARAM);\n if (status) next.set(TRACE_STATUS_PARAM, status);\n\n const listMode = searchParams.get(TRACE_LIST_MODE_PARAM);\n if (listMode) next.set(TRACE_LIST_MODE_PARAM, listMode);\n\n for (const fieldId of TRACE_PROPERTY_FILTER_FIELD_IDS) {\n const param = TRACE_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId];\n if (fieldId === 'tags') {\n for (const value of searchParams.getAll(param)) {\n next.append(param, value);\n }\n continue;\n }\n\n const value = searchParams.get(param);\n if (value) {\n next.set(param, value);\n }\n }\n\n return next;\n}\n\n/**\n * Clear all filter params from `params` and re-add them in the given `tokens`\n * order so the URL (and therefore the PropertyFilterApplied pills) reflects the\n * creation order of filters. Handles the generic `filterX` params plus the\n * dedicated synthetic params (rootEntityType, status).\n */\nexport function applyTracePropertyFilterTokens(params: URLSearchParams, tokens: PropertyFilterToken[]) {\n params.delete(TRACE_ROOT_ENTITY_TYPE_PARAM);\n params.delete(TRACE_STATUS_PARAM);\n for (const fieldId of TRACE_PROPERTY_FILTER_FIELD_IDS) {\n params.delete(TRACE_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId]);\n }\n\n for (const token of tokens) {\n if (token.fieldId === 'rootEntityType' && typeof token.value === 'string') {\n params.set(TRACE_ROOT_ENTITY_TYPE_PARAM, token.value);\n continue;\n }\n if (token.fieldId === 'status' && typeof token.value === 'string') {\n params.set(TRACE_STATUS_PARAM, token.value);\n continue;\n }\n\n const param =\n TRACE_PROPERTY_FILTER_PARAM_BY_FIELD[token.fieldId as keyof typeof TRACE_PROPERTY_FILTER_PARAM_BY_FIELD];\n if (!param) continue;\n\n if (token.fieldId === 'tags' && Array.isArray(token.value)) {\n if (token.value.length === 0) {\n // Empty sentinel — keeps the pill visible after Reset.\n params.append(param, '');\n } else {\n for (const value of token.value) {\n params.append(param, value);\n }\n }\n continue;\n }\n\n if (typeof token.value === 'string') {\n // Persist empty / 'Any' values too so neutralized-but-still-visible pills\n // survive URL round-trips. buildTraceListFilters skips these on the API\n // query side so neutrals never reach the backend.\n params.set(param, token.value.trim());\n }\n }\n}\n\nexport function buildTraceListFilters({\n rootEntityType,\n status,\n dateFrom,\n dateTo,\n tokens,\n}: {\n rootEntityType?: string;\n status?: TraceStatusFilter;\n dateFrom?: Date;\n dateTo?: Date;\n tokens: PropertyFilterToken[];\n}): ListTracesArgs['filters'] {\n const filters: NonNullable<ListTracesArgs['filters']> = {};\n\n if (rootEntityType) {\n filters.entityType = rootEntityType as NonNullable<ListTracesArgs['filters']>['entityType'];\n }\n\n if (status) {\n filters.status = status as NonNullable<ListTracesArgs['filters']>['status'];\n }\n\n if (dateFrom) {\n filters.startedAt = { start: dateFrom };\n }\n\n if (dateTo) {\n filters.endedAt = { end: dateTo };\n }\n\n for (const token of tokens) {\n if (token.fieldId === 'tags') {\n if (Array.isArray(token.value) && token.value.length > 0) {\n filters.tags = token.value;\n } else if (typeof token.value === 'string' && token.value.trim()) {\n // pick-multi tags: single-string token → wrap for the server's array schema.\n filters.tags = [token.value.trim()];\n }\n continue;\n }\n\n if (typeof token.value !== 'string') continue;\n // Skip empty-string tokens (unfilled pending filters) and 'Any'\n // (pick-multi single-select neutral state) so neutrals never reach the\n // backend.\n if (!token.value.trim()) continue;\n if (token.value === 'Any') continue;\n\n switch (token.fieldId) {\n case 'entityId':\n filters.entityId = token.value;\n break;\n case 'entityName':\n filters.entityName = token.value;\n break;\n case 'traceId':\n filters.traceId = token.value;\n break;\n case 'runId':\n filters.runId = token.value;\n break;\n case 'threadId':\n filters.threadId = token.value;\n break;\n case 'sessionId':\n filters.sessionId = token.value;\n break;\n case 'requestId':\n filters.requestId = token.value;\n break;\n case 'resourceId':\n filters.resourceId = token.value;\n break;\n case 'userId':\n filters.userId = token.value;\n break;\n case 'organizationId':\n filters.organizationId = token.value;\n break;\n case 'serviceName':\n filters.serviceName = token.value;\n break;\n case 'environment':\n filters.environment = token.value;\n break;\n case 'experimentId':\n filters.experimentId = token.value;\n break;\n default:\n break;\n }\n }\n\n return filters;\n}\n\n/**\n * \"Clear\" semantics: keep all filter pills but neutralize each value.\n * '' for text fields, 'Any' for single-select pick-multi, [] for multi-select pick-multi.\n * Date range is intentionally NOT touched here — that's a separate concern.\n */\nexport function neutralizeFilterTokens(\n filterFields: PropertyFilterField[],\n filterTokens: PropertyFilterToken[],\n): PropertyFilterToken[] {\n return filterTokens.map(token => {\n const field = filterFields.find(f => f.id === token.fieldId);\n if (!field) return token;\n if (field.kind === 'text') return { fieldId: token.fieldId, value: '' };\n if (field.kind === 'pick-multi') {\n if (field.omitAnyOption) return token;\n return field.multi ? { fieldId: token.fieldId, value: [] } : { fieldId: token.fieldId, value: 'Any' };\n }\n return token;\n });\n}\n","import type { EntityType } from '@mastra/core/observability';\nimport {\n LOGS_DATE_FROM_PARAM,\n LOGS_DATE_PRESET_PARAM,\n LOGS_DATE_TO_PARAM,\n LOGS_PROPERTY_FILTER_PARAM_BY_FIELD,\n LOGS_ROOT_ENTITY_TYPE_PARAM,\n} from '../logs/log-filters';\nimport type { LogsDatePreset } from '../logs/log-filters';\nimport {\n TRACE_DATE_FROM_PARAM,\n TRACE_DATE_PRESET_PARAM,\n TRACE_DATE_TO_PARAM,\n TRACE_LIST_MODE_PARAM,\n TRACE_PROPERTY_FILTER_PARAM_BY_FIELD,\n TRACE_ROOT_ENTITY_TYPE_PARAM,\n TRACE_STATUS_PARAM,\n} from '../traces/trace-filters';\nimport type { TraceDatePreset } from '../traces/types';\nimport type { DatePreset, DateRange } from './hooks/use-metrics';\nimport type { MetricsDimensionalFilter } from './metrics-filters';\n\n/** Map the metrics date preset (`24h`, `3d`, …) to the equivalent traces /\n * logs preset (`last-24h`, `last-3d`, …). `'custom'` is passed through and\n * explicit from/to dates are serialized separately. Returns `undefined` for\n * presets we can't translate — in that case we omit the date preset and rely\n * on concrete `from`/`to` timestamps. */\nfunction mapPreset(preset: DatePreset): TraceDatePreset | LogsDatePreset | undefined {\n switch (preset) {\n case '24h':\n return 'last-24h';\n case '3d':\n return 'last-3d';\n case '7d':\n return 'last-7d';\n case '14d':\n return 'last-14d';\n case '30d':\n return 'last-30d';\n case 'custom':\n return 'custom';\n default:\n return undefined;\n }\n}\n\n/** Narrow time window for a single chart node. Callers pass concrete start/end\n * Dates (typically bucket boundaries); these bypass the preset. */\nexport type DrilldownWindow = {\n from: Date;\n to: Date;\n};\n\n/** Narrow a raw timestamp into the time-series bucket window that surrounds\n * it. For a chart with `interval = 1h`, clicking a node at 14:37Z drills into\n * 14:00Z → 15:00Z. For `1d`, the corresponding UTC day. */\nexport function narrowWindowToBucket(tsMs: number, interval: '1h' | '1d'): DrilldownWindow {\n if (interval === '1h') {\n const from = new Date(tsMs);\n from.setUTCMinutes(0, 0, 0);\n const to = new Date(from.getTime() + 60 * 60 * 1000);\n return { from, to };\n }\n const from = new Date(tsMs);\n from.setUTCHours(0, 0, 0, 0);\n const to = new Date(from.getTime() + 24 * 60 * 60 * 1000);\n return { from, to };\n}\n\n/** Fields a card may use to scope the drilldown. Only the pieces the caller\n * knows are attached; everything else falls through to the current dashboard\n * filters. `status` is only valid for traces. */\nexport type DrilldownScope = {\n rootEntityType?: EntityType;\n entityName?: string;\n threadId?: string;\n resourceId?: string;\n model?: string;\n provider?: string;\n /** Trace-only. Valid for drill-downs from \"errors\" segments. */\n status?: 'running' | 'success' | 'error';\n /** Overrides date preset with explicit window bounds. */\n window?: DrilldownWindow;\n};\n\ntype BuildArgs = {\n /** Current metrics dashboard preset. */\n preset: DatePreset;\n /** Current metrics dashboard custom range (only honoured when preset === 'custom'). */\n customRange?: DateRange;\n /** Dashboard-level dimensional filters (environment, serviceName, tags, etc.). */\n dashboardFilter: MetricsDimensionalFilter;\n /** Per-card scoping applied on top of dashboard filters. */\n scope: DrilldownScope;\n /** Override the Traces page base path. Defaults to `/observability` (mastra Studio). */\n tracesBasePath?: string;\n /** Override the Logs page base path. Defaults to `/logs` (mastra Studio). */\n logsBasePath?: string;\n};\n\nfunction applyDate(\n params: URLSearchParams,\n presetKey: string,\n fromKey: string,\n toKey: string,\n preset: DatePreset,\n customRange: DateRange | undefined,\n window: DrilldownWindow | undefined,\n): void {\n // A concrete window always wins — it's a precise node-level drilldown.\n if (window) {\n params.set(presetKey, 'custom');\n params.set(fromKey, window.from.toISOString());\n params.set(toKey, window.to.toISOString());\n return;\n }\n if (preset === 'custom') {\n params.set(presetKey, 'custom');\n if (customRange?.from) params.set(fromKey, customRange.from.toISOString());\n if (customRange?.to) params.set(toKey, customRange.to.toISOString());\n return;\n }\n const mapped = mapPreset(preset);\n if (mapped) params.set(presetKey, mapped);\n}\n\nfunction setIfDefined(params: URLSearchParams, key: string, value: string | undefined | null): void {\n if (typeof value === 'string' && value.length > 0) {\n params.set(key, value);\n }\n}\n\nfunction appendArray(params: URLSearchParams, key: string, values: string[] | undefined): void {\n if (!Array.isArray(values) || values.length === 0) return;\n for (const v of values) if (v) params.append(key, v);\n}\n\n/** Build a relative URL to the Traces page pre-filtered by the dashboard\n * filters + per-card scope. */\nexport function buildTracesDrilldownUrl({\n preset,\n customRange,\n dashboardFilter,\n scope,\n tracesBasePath = '/observability',\n}: BuildArgs): string {\n const params = new URLSearchParams();\n params.set(TRACE_LIST_MODE_PARAM, 'branches');\n\n applyDate(\n params,\n TRACE_DATE_PRESET_PARAM,\n TRACE_DATE_FROM_PARAM,\n TRACE_DATE_TO_PARAM,\n preset,\n customRange,\n scope.window,\n );\n\n // Scope overrides dashboard filter when both are present.\n const rootEntityType = scope.rootEntityType ?? dashboardFilter.rootEntityType;\n if (rootEntityType) params.set(TRACE_ROOT_ENTITY_TYPE_PARAM, rootEntityType);\n\n if (scope.status) params.set(TRACE_STATUS_PARAM, scope.status);\n\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.entityName, scope.entityName ?? dashboardFilter.entityName);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.threadId, scope.threadId ?? dashboardFilter.threadId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.resourceId, scope.resourceId ?? dashboardFilter.resourceId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.entityId, dashboardFilter.entityId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.runId, dashboardFilter.runId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.sessionId, dashboardFilter.sessionId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.requestId, dashboardFilter.requestId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.userId, dashboardFilter.userId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.organizationId, dashboardFilter.organizationId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.experimentId, dashboardFilter.experimentId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.serviceName, dashboardFilter.serviceName);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.environment, dashboardFilter.environment);\n appendArray(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.tags, dashboardFilter.tags);\n\n const query = params.toString();\n return query ? `${tracesBasePath}?${query}` : tracesBasePath;\n}\n\n/** Build a relative URL to the Logs page pre-filtered by the dashboard filters\n * + per-card scope. Useful for \"View errors in logs\" affordances. */\nexport function buildLogsDrilldownUrl({\n preset,\n customRange,\n dashboardFilter,\n scope,\n logsBasePath = '/logs',\n}: BuildArgs): string {\n const params = new URLSearchParams();\n\n applyDate(\n params,\n LOGS_DATE_PRESET_PARAM,\n LOGS_DATE_FROM_PARAM,\n LOGS_DATE_TO_PARAM,\n preset,\n customRange,\n scope.window,\n );\n\n const rootEntityType = scope.rootEntityType ?? dashboardFilter.rootEntityType;\n if (rootEntityType) params.set(LOGS_ROOT_ENTITY_TYPE_PARAM, rootEntityType);\n\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.entityName, scope.entityName ?? dashboardFilter.entityName);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.threadId, scope.threadId ?? dashboardFilter.threadId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.resourceId, scope.resourceId ?? dashboardFilter.resourceId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.runId, dashboardFilter.runId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.sessionId, dashboardFilter.sessionId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.requestId, dashboardFilter.requestId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.userId, dashboardFilter.userId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.organizationId, dashboardFilter.organizationId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.experimentId, dashboardFilter.experimentId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.serviceName, dashboardFilter.serviceName);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.environment, dashboardFilter.environment);\n appendArray(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.tags, dashboardFilter.tags);\n\n // Error drill-ins always target log level=error. Status filter isn't valid\n // for logs, so we translate `status: 'error'` to `filterLevel=error`.\n if (scope.status === 'error') {\n params.append(LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.level, 'error');\n }\n\n const query = params.toString();\n return query ? `${logsBasePath}?${query}` : logsBasePath;\n}\n","import { useCallback } from 'react';\n\nimport { buildLogsDrilldownUrl, buildTracesDrilldownUrl, narrowWindowToBucket } from '../drilldown';\nimport type { DrilldownScope, DrilldownWindow } from '../drilldown';\nimport { useMetrics } from './use-metrics';\n\n/** Consolidates the current metrics dashboard's date + dimensional context so\n * each card only has to supply its own scope (`{ rootEntityType, entityName,\n * ... }`) to produce a full drilldown URL. */\nexport function useDrilldown() {\n const { datePreset, customRange, dimensionalFilter, tracesBasePath, logsBasePath } = useMetrics();\n\n const getTracesHref = useCallback(\n (scope: DrilldownScope = {}): string =>\n buildTracesDrilldownUrl({\n preset: datePreset,\n customRange,\n dashboardFilter: dimensionalFilter,\n scope,\n tracesBasePath,\n }),\n [datePreset, customRange, dimensionalFilter, tracesBasePath],\n );\n\n const getLogsHref = useCallback(\n (scope: DrilldownScope = {}): string =>\n buildLogsDrilldownUrl({\n preset: datePreset,\n customRange,\n dashboardFilter: dimensionalFilter,\n scope,\n logsBasePath,\n }),\n [datePreset, customRange, dimensionalFilter, logsBasePath],\n );\n\n const getBucketTracesHref = useCallback(\n (scope: Omit<DrilldownScope, 'window'>, tsMs: number, interval: '1h' | '1d'): string => {\n const window: DrilldownWindow = narrowWindowToBucket(tsMs, interval);\n return buildTracesDrilldownUrl({\n preset: datePreset,\n customRange,\n dashboardFilter: dimensionalFilter,\n scope: { ...scope, window },\n tracesBasePath,\n });\n },\n [datePreset, customRange, dimensionalFilter, tracesBasePath],\n );\n\n return { getTracesHref, getLogsHref, getBucketTracesHref };\n}\n","import type { UISpan } from '../types';\n\n/** Minimal span fields required for building the hierarchical timeline tree. */\ntype TimelineSpan = {\n spanId: string;\n name: string;\n spanType: string;\n startedAt: Date | string;\n endedAt?: Date | string | null;\n parentSpanId?: string | null;\n};\n\n/**\n * When `anchorSpanId` is provided, that span is treated as the displayed root\n * regardless of its `parentSpanId` -- the branch-subtree case from `getBranch`,\n * where the anchor has a real parent that's outside the returned set. Without\n * it, the displayed roots are the spans with no parent (the trace case).\n */\nexport const formatHierarchicalSpans = (spans: TimelineSpan[], anchorSpanId?: string): UISpan[] => {\n if (!spans || spans.length === 0) {\n return [];\n }\n\n const overallEndDate = spans.reduce(\n (latest, span) => {\n const endDate = span?.endedAt ? new Date(span.endedAt) : undefined;\n return endDate && (!latest || endDate > latest) ? endDate : latest;\n },\n null as Date | null,\n );\n\n const spanMap = new Map<string, UISpan>();\n const rootSpans: UISpan[] = [];\n\n spans.forEach(spanRecord => {\n const startDate = new Date(spanRecord.startedAt);\n const endDate = spanRecord.endedAt ? new Date(spanRecord.endedAt) : undefined;\n\n const uiSpan: UISpan = {\n id: spanRecord.spanId,\n name: spanRecord.name,\n type: spanRecord.spanType,\n latency: endDate ? endDate.getTime() - startDate.getTime() : 0,\n startTime: startDate.toISOString(),\n endTime: endDate ? endDate.toISOString() : undefined,\n spans: [],\n parentSpanId: spanRecord.parentSpanId,\n };\n\n spanMap.set(spanRecord.spanId, uiSpan);\n });\n\n const isAnchor = (spanRecord: TimelineSpan) =>\n anchorSpanId ? spanRecord.spanId === anchorSpanId : spanRecord?.parentSpanId == null;\n\n spans.forEach(spanRecord => {\n const uiSpan = spanMap.get(spanRecord.spanId)!;\n\n if (isAnchor(spanRecord)) {\n if (overallEndDate && uiSpan.endTime && overallEndDate > new Date(uiSpan.endTime)) {\n uiSpan.endTime = overallEndDate.toISOString();\n const overallEndTime = new Date(overallEndDate).getTime();\n const spanStartTime = new Date(uiSpan.startTime).getTime();\n uiSpan.latency = overallEndTime - spanStartTime;\n }\n rootSpans.push(uiSpan);\n } else {\n const parent = spanRecord.parentSpanId ? spanMap.get(spanRecord.parentSpanId) : undefined;\n if (parent) {\n parent.spans!.push(uiSpan);\n } else {\n // Orphan: either the parent isn't in the supplied set (branch subtree boundary), or\n // the span has no parent yet wasn't picked as the anchor (rare when `anchorSpanId`\n // is specified). Surface it at the displayed root rather than dropping it.\n rootSpans.push(uiSpan);\n }\n }\n });\n\n const sortSpansByStartTime = (spans: UISpan[]): UISpan[] => {\n return spans.sort((a, b) => new Date(a.startTime).getTime() - new Date(b.startTime).getTime());\n };\n\n const sortedRootSpans = sortSpansByStartTime(rootSpans);\n\n const sortNestedSpans = (spans: UISpan[]): void => {\n spans.forEach(span => {\n if (span.spans && span.spans.length > 0) {\n span.spans = sortSpansByStartTime(span.spans);\n sortNestedSpans(span.spans);\n }\n });\n };\n\n sortNestedSpans(sortedRootSpans);\n\n return sortedRootSpans;\n};\n","import { BrainIcon, GaugeIcon } from 'lucide-react';\nimport type { UISpanStyle } from '../types';\nimport { AgentIcon } from '@/ds/icons/AgentIcon';\nimport { FolderIcon } from '@/ds/icons/FolderIcon';\nimport { McpServerIcon } from '@/ds/icons/McpServerIcon';\nimport { MemoryIcon } from '@/ds/icons/MemoryIcon';\nimport { ToolsIcon } from '@/ds/icons/ToolsIcon';\nimport { WorkflowIcon } from '@/ds/icons/WorkflowIcon';\n\nexport const spanTypePrefixes = ['agent', 'workflow', 'model', 'mcp', 'tool', 'memory', 'workspace', 'scorer', 'other'];\n\nconst spanTypeToUiElements: Record<string, UISpanStyle> = {\n agent: {\n icon: <AgentIcon />,\n color: 'oklch(0.75 0.15 250)',\n label: 'Agent',\n typePrefix: 'agent',\n },\n workflow: {\n icon: <WorkflowIcon />,\n color: 'oklch(0.75 0.15 200)',\n label: 'Workflow',\n typePrefix: 'workflow',\n },\n model: {\n icon: <BrainIcon />,\n color: 'oklch(0.75 0.15 320)',\n label: 'Model',\n typePrefix: 'model',\n },\n mcp: {\n icon: <McpServerIcon />,\n color: 'oklch(0.75 0.15 160)',\n label: 'MCP',\n typePrefix: 'mcp',\n },\n tool: {\n icon: <ToolsIcon />,\n color: 'oklch(0.75 0.15 100)',\n label: 'Tool',\n typePrefix: 'tool',\n },\n memory: {\n icon: <MemoryIcon />,\n color: 'oklch(0.75 0.15 60)',\n label: 'Memory',\n typePrefix: 'memory',\n },\n workspace: {\n icon: <FolderIcon />,\n color: 'oklch(0.75 0.15 40)',\n label: 'Workspace',\n typePrefix: 'workspace',\n },\n scorer: {\n icon: <GaugeIcon />,\n color: 'oklch(0.75 0.15 280)',\n label: 'Scorer',\n typePrefix: 'scorer',\n },\n};\n\nconst otherSpanType: UISpanStyle = {\n color: 'oklch(0.65 0 0)',\n label: 'Other',\n typePrefix: 'other',\n};\n\nexport function getSpanTypeUi(type: string) {\n const typePrefix = type?.toLowerCase().split('_')[0];\n return spanTypeToUiElements[typePrefix] ?? otherSpanType;\n}\n","import type { InputTokenDetails, OutputTokenDetails, UsageStats } from '@mastra/core/observability';\n\ntype TokenDetailsObject = InputTokenDetails | OutputTokenDetails;\n\nexport type TokenUsageView = {\n inputValue: number;\n outputValue: number;\n total: number;\n showSplit: boolean;\n inputPct: number;\n outputPct: number;\n inputDetails: TokenDetailsObject | undefined;\n outputDetails: TokenDetailsObject | undefined;\n};\n\nfunction hasNumericDetails(details: TokenDetailsObject | undefined): details is TokenDetailsObject {\n return !!details && Object.values(details).some(v => typeof v === 'number');\n}\n\nexport function getTokenUsageView(usage: UsageStats | undefined | null): TokenUsageView | null {\n if (!usage) return null;\n\n const hasInput = typeof usage.inputTokens === 'number';\n const hasOutput = typeof usage.outputTokens === 'number';\n\n if (!hasInput && !hasOutput) return null;\n\n const inputValue = usage.inputTokens ?? 0;\n const outputValue = usage.outputTokens ?? 0;\n const total = inputValue + outputValue;\n const showSplit = total > 0;\n\n return {\n inputValue,\n outputValue,\n total,\n showSplit,\n inputPct: showSplit ? (inputValue / total) * 100 : 0,\n outputPct: showSplit ? (outputValue / total) * 100 : 0,\n inputDetails: hasInput && hasNumericDetails(usage.inputDetails) ? usage.inputDetails : undefined,\n outputDetails: hasOutput && hasNumericDetails(usage.outputDetails) ? usage.outputDetails : undefined,\n };\n}\n","import type { InputTokenDetails, OutputTokenDetails, UsageStats } from '@mastra/core/observability';\nimport { Fragment } from 'react';\nimport { getTokenUsageView } from './span-token-usage.utils';\nimport { DataKeysAndValues } from '@/ds/components/DataKeysAndValues';\nimport { cn } from '@/lib/utils';\n\nexport type TokenUsage = UsageStats;\n\ntype TokenDetailsObject = InputTokenDetails | OutputTokenDetails;\n\nconst detailKeyLabels: Record<string, string> = {\n text: 'Text',\n cacheRead: 'Cache read',\n cacheWrite: 'Cache write',\n audio: 'Audio',\n image: 'Image',\n reasoning: 'Reasoning',\n};\n\ntype SpanTokenUsageProps = {\n usage: UsageStats;\n className?: string;\n};\n\nconst INPUT_COLOR = 'oklch(0.78 0.16 320)';\nconst OUTPUT_COLOR = 'oklch(0.55 0.18 320)';\n\nexport function SpanTokenUsage({ usage, className }: SpanTokenUsageProps) {\n const view = getTokenUsageView(usage);\n if (!view) return null;\n\n const { inputValue, outputValue, total, showSplit, inputPct, outputPct, inputDetails, outputDetails } = view;\n\n return (\n <div\n className={cn('border-b border-border1 mt-2 mb-8 pb-3 grid grid-cols-1 4xl:grid-cols-2 4xl:gap-12', className)}\n >\n {showSplit && (\n <div className=\"mb-2\">\n <div className=\"flex items-baseline text-neutral2 gap-3\">\n <span className=\"text-ui-md\">Tokens Used</span>\n <span className=\"text-neutral4 text-ui-md font-semibold\">{total.toLocaleString()}</span>\n <span className=\"ml-auto text-ui-sm\">\n {Math.round(inputPct)}% Input vs {Math.round(outputPct)}% Output\n </span>\n </div>\n <div className=\"p-1.5 rounded-md bg-surface4 mt-2\">\n <div className=\"relative w-full h-1.5 rounded-sm overflow-hidden\">\n <div\n className=\"absolute h-1.5 top-0 left-0\"\n style={{ width: `${inputPct}%`, backgroundColor: INPUT_COLOR }}\n />\n <div\n className=\"absolute h-1.5 top-0\"\n style={{ left: `${inputPct}%`, width: `${outputPct}%`, backgroundColor: OUTPUT_COLOR }}\n />\n </div>\n </div>\n </div>\n )}\n\n <div className=\"grid gap-6 grid-cols-2\">\n <UsageColumn label=\"Input\" color={INPUT_COLOR} value={inputValue} details={inputDetails} />\n <UsageColumn label=\"Output\" color={OUTPUT_COLOR} value={outputValue} details={outputDetails} />\n </div>\n </div>\n );\n}\n\nfunction UsageColumn({\n label,\n color,\n value,\n details,\n}: {\n label: string;\n color: string;\n value?: number;\n details?: TokenDetailsObject;\n}) {\n return (\n <div>\n <div className=\"flex items-baseline text-neutral2 gap-3 mb-2\">\n <span className=\"text-ui-md\">{label}</span>\n {typeof value === 'number' && (\n <span className=\"flex items-baseline gap-1.5\">\n <span className=\"text-neutral4 text-ui-md font-semibold\">{value.toLocaleString()}</span>\n <span className=\"size-2 rounded-full self-center\" style={{ backgroundColor: color }} />\n </span>\n )}\n </div>\n {details && <DetailsList details={details} />}\n </div>\n );\n}\n\nfunction DetailsList({ details }: { details: TokenDetailsObject }) {\n return (\n <DataKeysAndValues density=\"dense\">\n {Object.entries(details).map(([detailKey, detailValue]) => {\n if (typeof detailValue !== 'number') return null;\n return (\n <Fragment key={detailKey}>\n <DataKeysAndValues.Key>{detailKeyLabels[detailKey] || detailKey}</DataKeysAndValues.Key>\n <DataKeysAndValues.Value className=\"text-right\">{detailValue.toLocaleString()}</DataKeysAndValues.Value>\n </Fragment>\n );\n })}\n </DataKeysAndValues>\n );\n}\n","import {\n ChevronDownIcon,\n ChevronsDownIcon,\n ChevronsDownUpIcon,\n ChevronsUpDownIcon,\n ChevronsUpIcon,\n ChevronUpIcon,\n FoldVerticalIcon,\n UnfoldVerticalIcon,\n} from 'lucide-react';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/ds/components/Tooltip';\nimport { cn } from '@/lib/utils';\n\ntype TimelineExpandColProps = {\n isSelected?: boolean;\n isFaded?: boolean;\n isExpanded?: boolean;\n isRootSpan?: boolean;\n toggleChildren?: () => void;\n expandAllDescendants?: () => void;\n collapseAllDescendants?: () => void;\n collapseAll?: () => void;\n totalDescendants?: number;\n allDescendantsExpanded?: boolean;\n numOfChildren?: number;\n toggleSiblings?: () => void;\n siblingsAllExpanded?: boolean;\n siblingsWithChildrenCount?: number;\n};\n\nexport function TimelineExpandCol({\n isSelected,\n isFaded,\n isExpanded,\n isRootSpan,\n toggleChildren,\n expandAllDescendants,\n collapseAllDescendants,\n collapseAll,\n totalDescendants = 0,\n allDescendantsExpanded,\n numOfChildren = 0,\n toggleSiblings,\n siblingsAllExpanded,\n siblingsWithChildrenCount = 0,\n}: TimelineExpandColProps) {\n const toggleTooltip = isExpanded ? `Collapse children (${numOfChildren})` : `Expand children (${numOfChildren})`;\n\n const showToggleChildren = !isRootSpan && !!numOfChildren && numOfChildren > 0;\n const showDescendantsButton = !isRootSpan && showToggleChildren && totalDescendants > numOfChildren;\n const showToggleSiblings = !isRootSpan && siblingsWithChildrenCount >= 2;\n const showRootToggleAll = !!isRootSpan && !!numOfChildren && numOfChildren > 0;\n const fullyExpanded = !!isExpanded && !!allDescendantsExpanded;\n\n return (\n <div\n className={cn('flex items-center justify-end h-full px-1.5', {\n 'opacity-30 [&:hover]:opacity-60': isFaded,\n 'bg-surface4': isSelected,\n })}\n >\n <div className=\"grid grid-cols-[1.625rem_1.625rem_1.625rem] gap-1\">\n <div>\n {showToggleChildren && (\n <ExpandButton onClick={() => toggleChildren?.()} tooltip={toggleTooltip}>\n {isExpanded ? <ChevronUpIcon /> : <ChevronDownIcon />}\n </ExpandButton>\n )}\n </div>\n\n <div>\n {showDescendantsButton && (\n <ExpandButton\n onClick={() => (allDescendantsExpanded ? collapseAllDescendants?.() : expandAllDescendants?.())}\n tooltip={\n allDescendantsExpanded\n ? `Collapse all descendants (${totalDescendants})`\n : `Expand all descendants (${totalDescendants})`\n }\n >\n {allDescendantsExpanded ? <ChevronsUpIcon /> : <ChevronsDownIcon />}\n </ExpandButton>\n )}\n </div>\n\n <div>\n {showToggleSiblings && (\n <ExpandButton\n onClick={() => toggleSiblings?.()}\n tooltip={siblingsAllExpanded ? 'Collapse at this level' : 'Expand at this level'}\n >\n {siblingsAllExpanded ? <FoldVerticalIcon /> : <UnfoldVerticalIcon />}\n </ExpandButton>\n )}\n\n {showRootToggleAll && (\n <ExpandButton\n onClick={() => (fullyExpanded ? collapseAll?.() : expandAllDescendants?.())}\n tooltip={fullyExpanded ? 'Collapse all' : 'Expand all'}\n >\n {fullyExpanded ? <ChevronsDownUpIcon /> : <ChevronsUpDownIcon />}\n </ExpandButton>\n )}\n </div>\n </div>\n </div>\n );\n}\n\ntype ExpandButtonProps = {\n onClick?: () => void;\n children?: React.ReactNode;\n className?: string;\n tooltip?: string;\n};\n\nfunction ExpandButton({ onClick, children, className, tooltip }: ExpandButtonProps) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button onClick={onClick} className={cn('h-full shrink-0 cursor-pointer', className)} aria-label={tooltip}>\n <div\n className={cn(\n 'flex items-center gap-[0.1rem] rounded-md transition-all p-1',\n 'hover:bg-surface5',\n '[&>svg]:shrink-0 [&>svg]:opacity-50 [&:hover>svg]:opacity-100 [&>svg]:w-4 [&>svg]:h-4 [&>svg]:transition-all',\n )}\n >\n {children}\n </div>\n </button>\n </TooltipTrigger>\n {tooltip && <TooltipContent>{tooltip}</TooltipContent>}\n </Tooltip>\n );\n}\n","import { cn } from '@/lib/utils';\n\ntype TimelineStructureSignProps = {\n isLastChild?: boolean;\n};\n\nexport function TimelineStructureSign({ isLastChild }: TimelineStructureSignProps) {\n return (\n <div\n className={cn(\n 'w-[0.5rem] h-[1.8rem] relative opacity-100 shrink-0',\n 'after:content-[\"\"] after:absolute after:left-[-1px] after:top-0 after:bottom-0 after:w-[0px] after:border-l-[1px] after:border-neutral3 after:border-dashed ',\n 'before:content-[\"\"] before:absolute before:left-0 before:top-[50%] before:w-full before:h-[0px] before:border-b-[1px] before:border-neutral3 before:border-dashed',\n {\n 'after:bottom-[50%]': isLastChild,\n },\n )}\n />\n );\n}\n","import type { UISpan, UISpanStyle } from '../types';\nimport { TimelineStructureSign } from './timeline-structure-sign';\nimport { cn } from '@/lib/utils';\n\ntype TimelineNameColProps = {\n span: UISpan;\n spanUI?: UISpanStyle | null;\n isFaded?: boolean;\n depth?: number;\n onSpanClick?: (id: string) => void;\n selectedSpanId?: string;\n isLastChild?: boolean;\n hasChildren?: boolean;\n isRootSpan?: boolean;\n isExpanded?: boolean;\n};\n\nexport function TimelineNameCol({\n span,\n spanUI,\n isFaded,\n depth = 0,\n onSpanClick,\n selectedSpanId,\n isLastChild,\n hasChildren: _hasChildren,\n isRootSpan,\n isExpanded: _isExpanded,\n}: TimelineNameColProps) {\n return (\n <div\n data-span-id={span.id}\n aria-label={`View details for span ${span.name}`}\n className={cn('rounded-md flex opacity-80 min-h-8 items-center rounded-l-lg', {\n 'opacity-30 [&:hover]:opacity-60': isFaded,\n 'bg-surface4': selectedSpanId === span.id,\n })}\n style={{ paddingLeft: `${depth * 1}rem` }}\n >\n {!isRootSpan && <TimelineStructureSign isLastChild={isLastChild} />}\n\n <button\n onClick={() => onSpanClick?.(span.id)}\n className={cn(\n 'text-ui-smd flex items-center text-left gap-1.5 text-neutral6 w-full min-w-0 rounded-md h-full px-2 py-1 transition-colors',\n '[&>svg]:transition-all [&>svg]:shrink-0 [&>svg]:opacity-0 [&>svg]:w-[1em] [&>svg]:h-[1em] [&>svg]:ml-auto',\n 'hover:bg-surface4 [&:hover>svg]:opacity-60',\n 'focus:outline-none focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-accent1',\n )}\n >\n {spanUI?.color && (\n <span\n aria-hidden\n title={spanUI.label}\n className=\"inline-block w-2 h-2 shrink-0 rounded-full\"\n style={{ backgroundColor: spanUI.color }}\n />\n )}\n <span className=\"min-w-0 truncate\">{span.name}</span>\n </button>\n </div>\n );\n}\n","import { format } from 'date-fns/format';\nimport type { UISpan } from '../types';\nimport { DataKeysAndValues } from '@/ds/components/DataKeysAndValues';\nimport { HoverCard, HoverCardContent, HoverCardTrigger } from '@/ds/components/HoverCard';\nimport { cn } from '@/lib/utils';\n\ntype TimelineTimingColProps = {\n span: UISpan;\n selectedSpanId?: string;\n isFaded?: boolean;\n overallLatency?: number;\n overallStartTime?: string;\n color?: string;\n chartWidth?: 'wide' | 'default';\n};\n\nexport function TimelineTimingCol({\n span,\n selectedSpanId,\n isFaded,\n overallLatency,\n overallStartTime,\n color,\n chartWidth = 'default',\n}: TimelineTimingColProps) {\n const percentageSpanLatency = overallLatency ? Math.ceil((span.latency / overallLatency) * 100) : 0;\n const overallStartTimeDate = overallStartTime ? new Date(overallStartTime) : null;\n const spanStartTimeDate = span.startTime ? new Date(span.startTime) : null;\n const spanStartTimeShift =\n spanStartTimeDate && overallStartTimeDate ? spanStartTimeDate.getTime() - overallStartTimeDate.getTime() : 0;\n\n const percentageSpanStartTime = overallLatency && Math.floor((spanStartTimeShift / overallLatency) * 100);\n\n return (\n <HoverCard>\n <HoverCardTrigger\n className={cn(\n 'h-8 p-1 grid grid-cols-[1fr_auto] gap-2 items-center cursor-help pr-2 rounded-r-md',\n chartWidth === 'wide' ? 'min-w-72' : 'min-w-32',\n '[&:hover>div]:bg-surface5',\n {\n 'opacity-30 [&:hover]:opacity-60': isFaded,\n 'bg-surface4': selectedSpanId === span.id,\n },\n )}\n >\n <div className={cn('w-full p-1.5 rounded-md bg-surface4 transition-colors duration-1000')}>\n <div className=\"relative w-full h-1.5 rounded-sm overflow-hidden\">\n <div\n className={cn('bg-neutral1 absolute rounded-sm h-1.5 top-0')}\n style={{\n width: percentageSpanLatency ? `${percentageSpanLatency}%` : '2px',\n left: `${percentageSpanStartTime || 0}%`,\n backgroundColor: color,\n }}\n ></div>\n </div>\n </div>\n\n <div className={cn('flex justify-end text-neutral3 text-ui-xs')}>{(span.latency / 1000).toFixed(3)}&nbsp;s</div>\n </HoverCardTrigger>\n <HoverCardContent className=\"bg-surface4 pr-6\">\n <div className={cn('text-ui-sm flex items-center gap-2 mb-2 mt-1')}>Span Timing</div>\n <DataKeysAndValues>\n <DataKeysAndValues.Key>Latency</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{span.latency} ms</DataKeysAndValues.Value>\n <DataKeysAndValues.Key>Started at</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>\n {span.startTime ? format(new Date(span.startTime), 'hh:mm:ss:SSS a') : '-'}\n </DataKeysAndValues.Value>\n <DataKeysAndValues.Key>Ended at</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>\n {span.endTime ? format(new Date(span.endTime), 'hh:mm:ss:SSS a') : '-'}\n </DataKeysAndValues.Value>\n <DataKeysAndValues.Key>Start Shift</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{spanStartTimeShift}ms</DataKeysAndValues.Value>\n </DataKeysAndValues>\n </HoverCardContent>\n </HoverCard>\n );\n}\n","import { format } from 'date-fns';\nimport { DataKeysAndValues } from '@/ds/components/DataKeysAndValues';\n\nenum TraceStatus {\n SUCCESS = 'success',\n ERROR = 'error',\n RUNNING = 'running',\n}\n\nfunction computeTraceStatus(span: { error?: unknown; endedAt?: Date | string | null }): TraceStatus {\n if (span.error != null) return TraceStatus.ERROR;\n if (span.endedAt == null) return TraceStatus.RUNNING;\n return TraceStatus.SUCCESS;\n}\n\n/** Lightweight root-span fields available from `useTraceLightSpans`. */\ntype RootSpanSummary = {\n entityId?: string | null;\n entityName?: string | null;\n entityType?: string | null;\n startedAt: Date | string;\n endedAt?: Date | string | null;\n error?: unknown;\n};\n\nexport interface TraceKeysAndValuesProps {\n rootSpan: RootSpanSummary;\n numOfCol?: 1 | 2 | 3;\n className?: string;\n}\n\nexport function TraceKeysAndValues({ rootSpan, numOfCol = 2, className }: TraceKeysAndValuesProps) {\n const startedAt = rootSpan.startedAt ? new Date(rootSpan.startedAt) : null;\n const endedAt = rootSpan.endedAt ? new Date(rootSpan.endedAt) : null;\n const status = computeTraceStatus(rootSpan);\n const statusLabel = status === TraceStatus.ERROR ? 'ERROR' : status === TraceStatus.RUNNING ? 'RUNNING' : 'SUCCESS';\n\n return (\n <DataKeysAndValues numOfCol={numOfCol} className={className}>\n {rootSpan.entityId && (\n <>\n <DataKeysAndValues.Key>Entity Id</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{rootSpan.entityName || rootSpan.entityId}</DataKeysAndValues.Value>\n </>\n )}\n {rootSpan.entityType && (\n <>\n <DataKeysAndValues.Key>Entity Type</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{rootSpan.entityType}</DataKeysAndValues.Value>\n </>\n )}\n <DataKeysAndValues.Key>Status</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{statusLabel}</DataKeysAndValues.Value>\n {startedAt && endedAt && (\n <>\n <DataKeysAndValues.Key>Duration</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>\n {`${(endedAt.getTime() - startedAt.getTime()).toLocaleString()}ms`}\n </DataKeysAndValues.Value>\n </>\n )}\n {startedAt && (\n <>\n <DataKeysAndValues.Key>Started at</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{format(startedAt, 'MMM dd, h:mm:ss.SSS aaa')}</DataKeysAndValues.Value>\n </>\n )}\n {endedAt && (\n <>\n <DataKeysAndValues.Key>Ended at</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{format(endedAt, 'MMM dd, h:mm:ss.SSS aaa')}</DataKeysAndValues.Value>\n </>\n )}\n </DataKeysAndValues>\n );\n}\n","import type { UISpan } from '../types';\n\nexport function getSpanDescendantIds(span: UISpan): string[] {\n if (!span.spans || span.spans.length === 0) {\n return [];\n }\n\n const descendantIds: string[] = [];\n\n span.spans.forEach(childSpan => {\n descendantIds.push(childSpan.id);\n descendantIds.push(...getSpanDescendantIds(childSpan));\n });\n\n return descendantIds;\n}\n\nexport function getAllSpanIds(spans: UISpan[]): string[] {\n const ids: string[] = [];\n for (const span of spans) {\n ids.push(span.id);\n ids.push(...getSpanDescendantIds(span));\n }\n return ids;\n}\n","import { useEffect } from 'react';\nimport { getSpanDescendantIds } from '../hooks/get-all-span-ids';\nimport type { UISpan } from '../types';\nimport { getSpanTypeUi } from './shared';\nimport { TimelineExpandCol } from './timeline-expand-col';\nimport { TimelineNameCol } from './timeline-name-col';\nimport { TimelineTimingCol } from './timeline-timing-col';\n\ntype TraceTimelineSpanProps = {\n span: UISpan;\n siblings?: UISpan[];\n depth?: number;\n onSpanClick?: (id: string) => void;\n selectedSpanId?: string;\n isLastChild?: boolean;\n overallLatency?: number;\n overallStartTime?: string;\n fadedTypes?: string[];\n searchPhrase?: string;\n featuredSpanIds?: string[];\n expandedSpanIds?: string[];\n setExpandedSpanIds?: React.Dispatch<React.SetStateAction<string[]>>;\n chartWidth?: 'wide' | 'default';\n};\n\nexport function TraceTimelineSpan({\n span,\n siblings,\n depth = 0,\n onSpanClick,\n selectedSpanId,\n isLastChild,\n overallLatency,\n overallStartTime,\n fadedTypes,\n searchPhrase,\n featuredSpanIds,\n expandedSpanIds,\n setExpandedSpanIds,\n chartWidth,\n}: TraceTimelineSpanProps) {\n const hasChildren = span.spans && span.spans.length > 0;\n const numOfChildren = span.spans ? span.spans.length : 0;\n const allDescendantIds = getSpanDescendantIds(span);\n const totalDescendants = allDescendantIds.length;\n const isRootSpan = depth === 0;\n const spanUI = getSpanTypeUi(span?.type);\n const isExpanded = expandedSpanIds ? expandedSpanIds.includes(span.id) : false;\n const isFadedBySearch = featuredSpanIds && featuredSpanIds.length > 0 ? !featuredSpanIds.includes(span.id) : false;\n const isFadedByType = fadedTypes && fadedTypes.length > 0 ? fadedTypes.includes(spanUI?.typePrefix || '') : false;\n const isFaded = isFadedByType || isFadedBySearch;\n\n useEffect(() => {\n if (!featuredSpanIds || allDescendantIds.length === 0) return;\n if (isExpanded) return;\n const hasFeaturedDescendant = allDescendantIds.some(id => featuredSpanIds.includes(id));\n if (hasFeaturedDescendant && setExpandedSpanIds) {\n setExpandedSpanIds(prev => (!prev || prev.includes(span.id) ? (prev ?? [span.id]) : [...prev, span.id]));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [featuredSpanIds, allDescendantIds]);\n\n const toggleChildren = () => {\n if (!setExpandedSpanIds) return;\n setExpandedSpanIds(prev => {\n if (!prev) return prev;\n return isExpanded ? prev.filter(id => id !== span.id) : [...prev, span.id];\n });\n };\n\n const expandAllDescendants = () => {\n if (!setExpandedSpanIds) return;\n setExpandedSpanIds(prev => {\n if (!prev) return prev;\n return Array.from(new Set([...prev, span.id, ...allDescendantIds]));\n });\n };\n\n const collapseAllDescendants = () => {\n if (!setExpandedSpanIds) return;\n setExpandedSpanIds(prev => {\n if (!prev) return prev;\n const idsToRemove = new Set(allDescendantIds);\n return prev.filter(id => !idsToRemove.has(id));\n });\n };\n\n const collapseAll = () => {\n if (!setExpandedSpanIds) return;\n setExpandedSpanIds(prev => {\n if (!prev) return prev;\n const idsToRemove = new Set([span.id, ...allDescendantIds]);\n return prev.filter(id => !idsToRemove.has(id));\n });\n };\n\n const allDescendantsExpanded = allDescendantIds.every(id => expandedSpanIds?.includes(id));\n\n const siblingsWithChildren = (siblings ?? []).filter(s => s.spans && s.spans.length > 0);\n const siblingsWithChildrenCount = siblingsWithChildren.length;\n const siblingsAllExpanded =\n siblingsWithChildrenCount > 0 && siblingsWithChildren.every(s => expandedSpanIds?.includes(s.id));\n\n const toggleSiblings = () => {\n if (!setExpandedSpanIds || siblingsWithChildrenCount === 0) return;\n setExpandedSpanIds(prev => {\n if (!prev) return prev;\n if (siblingsAllExpanded) {\n const idsToRemove = new Set<string>();\n siblingsWithChildren.forEach(s => {\n idsToRemove.add(s.id);\n getSpanDescendantIds(s).forEach(id => idsToRemove.add(id));\n });\n return prev.filter(id => !idsToRemove.has(id));\n }\n return Array.from(new Set([...prev, ...siblingsWithChildren.map(s => s.id)]));\n });\n };\n\n return (\n <>\n <TimelineNameCol\n span={span}\n spanUI={spanUI}\n isFaded={isFaded}\n depth={depth}\n onSpanClick={onSpanClick}\n selectedSpanId={selectedSpanId}\n isLastChild={isLastChild}\n hasChildren={hasChildren}\n isRootSpan={isRootSpan}\n isExpanded={isExpanded}\n />\n\n <TimelineExpandCol\n isSelected={selectedSpanId === span.id}\n isFaded={isFaded}\n isExpanded={isExpanded}\n isRootSpan={isRootSpan}\n toggleChildren={toggleChildren}\n expandAllDescendants={expandAllDescendants}\n collapseAllDescendants={collapseAllDescendants}\n collapseAll={collapseAll}\n totalDescendants={totalDescendants}\n allDescendantsExpanded={allDescendantsExpanded}\n numOfChildren={numOfChildren}\n toggleSiblings={toggleSiblings}\n siblingsAllExpanded={siblingsAllExpanded}\n siblingsWithChildrenCount={siblingsWithChildrenCount}\n />\n\n <TimelineTimingCol\n span={span}\n selectedSpanId={selectedSpanId}\n isFaded={isFaded}\n overallLatency={overallLatency}\n overallStartTime={overallStartTime}\n color={spanUI?.color}\n chartWidth={chartWidth}\n />\n\n {hasChildren &&\n isExpanded &&\n span.spans?.map((childSpan: UISpan, idx: number, array: UISpan[]) => {\n const isLast = idx === array.length - 1;\n\n return (\n <TraceTimelineSpan\n key={childSpan.id}\n span={childSpan}\n siblings={array}\n depth={depth + 1}\n onSpanClick={onSpanClick}\n selectedSpanId={selectedSpanId}\n isLastChild={isLast}\n overallLatency={overallLatency}\n overallStartTime={overallStartTime}\n fadedTypes={fadedTypes}\n searchPhrase={searchPhrase}\n expandedSpanIds={expandedSpanIds}\n setExpandedSpanIds={setExpandedSpanIds}\n featuredSpanIds={featuredSpanIds}\n chartWidth={chartWidth}\n />\n );\n })}\n </>\n );\n}\n","import type { Dispatch, SetStateAction } from 'react';\nimport { useMemo } from 'react';\nimport type { UISpan } from '../types';\nimport { spanTypePrefixes, getSpanTypeUi } from './shared';\nimport { TraceTimelineSpan } from './trace-timeline-span';\nimport { Spinner } from '@/ds/components/Spinner';\nimport { cn } from '@/lib/utils';\n\ntype TraceTimelineProps = {\n hierarchicalSpans: UISpan[];\n onSpanClick: (id: string) => void;\n selectedSpanId?: string;\n isLoading?: boolean;\n fadedTypes?: string[];\n expandedSpanIds?: string[];\n setExpandedSpanIds?: Dispatch<SetStateAction<string[]>>;\n featuredSpanIds?: string[];\n chartWidth?: 'wide' | 'default';\n};\n\nexport function TraceTimeline({\n hierarchicalSpans = [],\n onSpanClick,\n selectedSpanId,\n isLoading,\n fadedTypes,\n expandedSpanIds,\n setExpandedSpanIds,\n featuredSpanIds,\n chartWidth = 'default',\n}: TraceTimelineProps) {\n const overallLatency = hierarchicalSpans?.[0]?.latency || 0;\n const overallStartTime = hierarchicalSpans?.[0]?.startTime || '';\n\n const usedSpanTypes = useMemo(() => {\n const collectTypes = (spans: UISpan[]): Set<string> => {\n const types = new Set<string>();\n for (const span of spans) {\n const prefix = span.type?.toLowerCase().split('_')[0];\n if (prefix) types.add(prefix);\n if (span.spans) {\n for (const t of collectTypes(span.spans)) types.add(t);\n }\n }\n return types;\n };\n const types = collectTypes(hierarchicalSpans);\n const hasOther = [...types].some(t => !spanTypePrefixes.includes(t));\n const known = spanTypePrefixes.filter(p => p !== 'other' && types.has(p));\n if (hasOther) known.push('other');\n return known;\n }, [hierarchicalSpans]);\n\n return (\n <>\n {isLoading ? (\n <div\n className={cn(\n 'flex items-center text-ui-sm gap-3 bg-surface3/50 rounded-md p-3 justify-center text-neutral3',\n '[&_svg]:w-[1.25em] [&_svg]:h-[1.25em] [&_svg]:opacity-50',\n )}\n >\n <Spinner /> Loading Trace Timeline ...\n </div>\n ) : (\n <>\n {usedSpanTypes.length > 0 && (\n <div className=\"flex flex-wrap gap-3 px-2 py-1.5 justify-end\">\n {usedSpanTypes.map(type => {\n const spanUI = getSpanTypeUi(type);\n return (\n <div key={type} className=\"flex items-center gap-1 text-ui-sm text-neutral3\">\n <span\n className=\"inline-block w-1.5 h-1.5 rounded-full shrink-0\"\n style={{ backgroundColor: spanUI?.color }}\n />\n {spanUI?.label || type}\n </div>\n );\n })}\n </div>\n )}\n <div className=\"grid grid-cols-[minmax(0,1fr)_auto_auto] items-start content-start gap-y-px overflow-hidden py-1\">\n {hierarchicalSpans?.map(span => (\n <TraceTimelineSpan\n key={span.id}\n span={span}\n siblings={hierarchicalSpans}\n onSpanClick={onSpanClick}\n selectedSpanId={selectedSpanId}\n overallLatency={overallLatency}\n overallStartTime={overallStartTime}\n fadedTypes={fadedTypes}\n featuredSpanIds={featuredSpanIds}\n expandedSpanIds={expandedSpanIds}\n setExpandedSpanIds={setExpandedSpanIds}\n chartWidth={chartWidth}\n />\n ))}\n </div>\n </>\n )}\n </>\n );\n}\n","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 onSave?: () => void;\n /** When provided, an extra \"Remove saved filters\" option is shown —\n * wire it up only when there is actually a saved set to remove. */\n onRemoveSaved?: () => 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 onSave,\n onRemoveSaved,\n isLoading,\n filterFields,\n filterTokens,\n onFilterTokensChange,\n autoFocusFilterFieldId,\n lockedFieldIds,\n lockedTooltipContent,\n}: TracesToolbarProps) {\n const hasActiveFilters = filterTokens.length > 0;\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 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] gap-3 items-start ')}>\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 onSave={onSave}\n onRemoveSaved={onRemoveSaved}\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","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 // getTrace returns the full payload (heavy input/output), unlike the light spans the panel renders.\n const task = client\n .getTrace(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","import type { LightSpanRecord } from '@mastra/core/storage';\nimport {\n CircleGaugeIcon,\n ChevronsDownUpIcon,\n ChevronsUpDownIcon,\n DownloadIcon,\n Link2Icon,\n Loader2Icon,\n SaveIcon,\n WrenchIcon,\n} from 'lucide-react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { getAllSpanIds } from '../hooks/get-all-span-ids';\nimport { useDownloadTraceJson } from '../hooks/use-download-trace-json';\nimport { formatHierarchicalSpans } from './format-hierarchical-spans';\nimport { TraceKeysAndValues } from './trace-keys-and-values';\nimport { TraceTimeline } from './trace-timeline';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport { Notice } from '@/ds/components/Notice';\nimport { Icon } from '@/ds/icons/Icon';\nimport type { LinkComponent } from '@/ds/types/link-component';\nimport { truncateString } from '@/lib/truncate-string';\n\nexport type TraceDataPanelPlacement = 'traces-list' | 'trace-page';\n\nexport interface TraceDataPanelViewProps {\n traceId: string;\n /** Lightweight spans for the trace. Caller fetches via useTraceLightSpans. */\n spans: LightSpanRecord[] | undefined;\n isLoading?: boolean;\n onClose: () => void;\n onSpanSelect?: (spanId: string | undefined) => void;\n onEvaluateTrace?: () => void;\n /** When set, a \"Save as Dataset Item\" button appears; the consumer owns the dialog. */\n onSaveAsDatasetItem?: (args: { traceId: string; rootSpanId: string | undefined }) => void;\n /** When set, an \"Add tool mocks to item\" button appears; the consumer owns the dialog. */\n onAddTraceMocksToItem?: (args: { traceId: string }) => void;\n initialSpanId?: string | null;\n onPrevious?: () => void;\n onNext?: () => void;\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n placement: TraceDataPanelPlacement;\n timelineChartWidth?: 'wide' | 'default';\n /** When both are provided, renders an \"Open trace page\" button. */\n LinkComponent?: LinkComponent;\n traceHref?: string;\n /**\n * Span treated as the displayed root of the timeline. Required for branch\n * subtrees from `getBranch` where the anchor has a real parent that's outside\n * `spans`. When omitted, the span with no parent is used (trace case).\n */\n anchorSpanId?: string;\n /**\n * Whether to render the \"Evaluating traces and saving them as dataset items is\n * available in Mastra Studio\" info notice when neither `onEvaluateTrace` nor\n * `onSaveAsDatasetItem` is provided. Defaults to `true`. Pass `false` when this\n * panel is rendered inside Studio in a context that intentionally omits those\n * handlers (e.g. inline below an experiment result).\n */\n showUnavailableFeaturesMsg?: boolean;\n}\n\nexport function TraceDataPanelView({\n traceId,\n spans,\n isLoading,\n onClose,\n onSpanSelect,\n onEvaluateTrace,\n onSaveAsDatasetItem,\n onAddTraceMocksToItem,\n initialSpanId,\n onPrevious,\n onNext,\n collapsed: controlledCollapsed,\n onCollapsedChange,\n placement,\n timelineChartWidth = 'default',\n LinkComponent,\n traceHref,\n anchorSpanId,\n showUnavailableFeaturesMsg = true,\n}: TraceDataPanelViewProps) {\n const isOnTracePage = placement === 'trace-page';\n const [internalCollapsed, setInternalCollapsed] = useState(false);\n const collapsed = controlledCollapsed ?? internalCollapsed;\n const setCollapsed = onCollapsedChange ?? setInternalCollapsed;\n\n const { download: downloadTraceJson, isPending: isDownloadingTrace } = useDownloadTraceJson();\n\n const contentRef = useRef<HTMLDivElement>(null);\n const [selectedSpanId, setSelectedSpanId] = useState<string | undefined>(initialSpanId ?? undefined);\n\n // Sync selected span when initialSpanId or trace data changes\n useEffect(() => {\n // No span requested: clear immediately.\n if (!initialSpanId) {\n setSelectedSpanId(undefined);\n onSpanSelect?.(undefined);\n return;\n }\n // Span requested: wait for trace data before deciding so an in-flight\n // fetch doesn't wipe a URL-provided selection.\n if (!spans) return;\n\n const found = spans.find(s => s.spanId === initialSpanId);\n if (found) {\n setSelectedSpanId(initialSpanId);\n onSpanSelect?.(initialSpanId);\n } else {\n setSelectedSpanId(undefined);\n onSpanSelect?.(undefined);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialSpanId, spans]);\n\n // Scroll the selected span into view within the timeline\n useEffect(() => {\n if (!selectedSpanId || !contentRef.current) return;\n const el = contentRef.current.querySelector(`[data-span-id=\"${selectedSpanId}\"]`);\n el?.scrollIntoView({ block: 'nearest' });\n }, [selectedSpanId]);\n\n const hierarchicalSpans = useMemo(() => formatHierarchicalSpans(spans ?? [], anchorSpanId), [spans, anchorSpanId]);\n\n const [expandedSpanIds, setExpandedSpanIds] = useState<string[]>([]);\n\n useEffect(() => {\n if (hierarchicalSpans.length > 0) {\n setExpandedSpanIds(getAllSpanIds(hierarchicalSpans));\n }\n }, [hierarchicalSpans]);\n\n const rootSpan = useMemo(\n () => (anchorSpanId ? spans?.find(s => s.spanId === anchorSpanId) : spans?.find(s => s.parentSpanId == null)),\n [spans, anchorSpanId],\n );\n\n const handleSpanClick = (id: string) => {\n const newId = selectedSpanId === id ? undefined : id;\n setSelectedSpanId(newId);\n onSpanSelect?.(newId);\n };\n\n const showOpenTracePageLink = !isOnTracePage && LinkComponent && traceHref;\n\n // Shared across both header layouts (list side panel and full trace page) so a trace can be\n // downloaded from wherever it's being inspected.\n const downloadTraceButton = (\n <Button\n size=\"md\"\n tooltip=\"Download trace JSON\"\n aria-label=\"Download trace JSON\"\n disabled={isDownloadingTrace}\n onClick={() => downloadTraceJson(traceId)}\n >\n {isDownloadingTrace ? <Loader2Icon className=\"animate-spin\" /> : <DownloadIcon />}\n </Button>\n );\n\n return (\n <DataPanel collapsed={collapsed}>\n <DataPanel.Header>\n {isOnTracePage ? (\n <>\n <DataPanel.Heading>Trace Timeline</DataPanel.Heading>\n <ButtonsGroup className=\"ml-auto shrink-0\">{downloadTraceButton}</ButtonsGroup>\n </>\n ) : (\n <>\n <DataPanel.Heading>\n Trace <b># {truncateString(traceId, 12)}</b>\n </DataPanel.Heading>\n <ButtonsGroup className=\"ml-auto shrink-0\">\n {onCollapsedChange && (\n <Button\n size=\"md\"\n tooltip={collapsed ? 'Expand panel' : 'Collapse panel'}\n onClick={() => setCollapsed(!collapsed)}\n >\n {collapsed ? <ChevronsUpDownIcon /> : <ChevronsDownUpIcon />}\n </Button>\n )}\n {(onPrevious || onNext) && (\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Previous trace\"\n nextLabel=\"Next trace\"\n />\n )}\n {showOpenTracePageLink && (\n <Button\n as={LinkComponent}\n href={traceHref}\n size=\"md\"\n tooltip=\"Open trace page\"\n aria-label=\"Open trace page\"\n >\n <Link2Icon />\n </Button>\n )}\n {downloadTraceButton}\n <DataPanel.CloseButton onClick={onClose} />\n </ButtonsGroup>\n </>\n )}\n </DataPanel.Header>\n\n {!collapsed &&\n (isLoading ? (\n <DataPanel.LoadingData>Loading trace...</DataPanel.LoadingData>\n ) : hierarchicalSpans.length === 0 ? (\n <DataPanel.NoData>No spans found for this trace.</DataPanel.NoData>\n ) : (\n <DataPanel.Content ref={contentRef}>\n {!isOnTracePage && rootSpan && <TraceKeysAndValues rootSpan={rootSpan} className=\"mb-6\" />}\n\n {!isOnTracePage && (onEvaluateTrace || onSaveAsDatasetItem || onAddTraceMocksToItem) && (\n <div className=\"mb-6 flex flex-wrap justify-between items-center gap-4\">\n {onEvaluateTrace && (\n <Button size=\"sm\" onClick={onEvaluateTrace}>\n <Icon>\n <CircleGaugeIcon />\n </Icon>\n Evaluate Trace\n </Button>\n )}\n {onSaveAsDatasetItem && (\n <Button size=\"sm\" onClick={() => onSaveAsDatasetItem({ traceId, rootSpanId: rootSpan?.spanId })}>\n <Icon>\n <SaveIcon />\n </Icon>\n Save as Dataset Item\n </Button>\n )}\n {onAddTraceMocksToItem && (\n <Button size=\"sm\" onClick={() => onAddTraceMocksToItem({ traceId })}>\n <Icon>\n <WrenchIcon />\n </Icon>\n Add tool mocks to item\n </Button>\n )}\n </div>\n )}\n\n {!isOnTracePage &&\n !onEvaluateTrace &&\n !onSaveAsDatasetItem &&\n !onAddTraceMocksToItem &&\n showUnavailableFeaturesMsg && (\n <Notice variant=\"info\" className=\"mb-6\">\n <Notice.Message>\n Evaluating traces and saving them as dataset items is available in Mastra Studio (local or\n deployed).\n </Notice.Message>\n </Notice>\n )}\n\n <TraceTimeline\n hierarchicalSpans={hierarchicalSpans}\n onSpanClick={handleSpanClick}\n selectedSpanId={selectedSpanId}\n expandedSpanIds={expandedSpanIds}\n setExpandedSpanIds={setExpandedSpanIds}\n chartWidth={timelineChartWidth}\n />\n </DataPanel.Content>\n ))}\n </DataPanel>\n );\n}\n","import type { SpanRecord } from '@mastra/core/storage';\n\ntype MessageLike = { role?: string; content?: unknown };\n\n/**\n * Extract a truncated text preview from a span's input field.\n * Agent traces store `input` as an array of message objects.\n * Returns the text content of all user messages joined, truncated to maxLength.\n */\nexport function getInputPreview(input: unknown, maxLength = 100): string {\n if (input == null) return '';\n\n // Unwrap legacy { messages: [...] } wrapper from agent_run spans\n const messageArray = Array.isArray(input)\n ? input\n : input && typeof input === 'object' && !Array.isArray(input) && Array.isArray((input as any).messages)\n ? (input as any).messages\n : null;\n\n if (messageArray) {\n const messages = messageArray as MessageLike[];\n const userMessages = messages\n .filter(m => m?.role === 'user')\n .map(m => {\n if (typeof m.content === 'string') return m.content;\n if (Array.isArray(m.content)) {\n return m.content\n .map((part: any) => {\n if (typeof part === 'string') return part;\n if (part?.type === 'text' && typeof part.text === 'string') return part.text;\n return '';\n })\n .filter(Boolean)\n .join(' ');\n }\n return '';\n })\n .filter(Boolean);\n\n const joined = userMessages.join(' | ');\n if (joined.length > maxLength) {\n return joined.slice(0, maxLength) + '…';\n }\n return joined;\n }\n\n if (typeof input === 'string') {\n if (input.length > maxLength) {\n return input.slice(0, maxLength) + '…';\n }\n return input;\n }\n\n const str = JSON.stringify(input);\n if (str.length > maxLength) {\n return str.slice(0, maxLength) + '…';\n }\n return str;\n}\n\ntype TokenUsage = {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n};\n\n/**\n * Check if a span indicates that the token limit was exceeded\n */\nexport function isTokenLimitExceeded(span?: SpanRecord): boolean {\n return span?.attributes?.finishReason === 'length';\n}\n\n/**\n * Get a human-readable message for token limit exceeded\n */\nexport function getTokenLimitMessage(span?: SpanRecord): string {\n const usage = span?.attributes?.usage as TokenUsage | undefined;\n\n if (!usage) {\n return `The model stopped generating because it reached the maximum token limit. The response was truncated and may be incomplete.`;\n }\n\n const inputTokens = usage.inputTokens ?? 0;\n const outputTokens = usage.outputTokens ?? 0;\n const totalTokens = usage.totalTokens ?? inputTokens + outputTokens;\n\n // Show breakdown if we have detailed info\n if (inputTokens > 0 || outputTokens > 0) {\n return `The model stopped generating because it reached the maximum token limit. The response was truncated and may be incomplete.\\n\\nToken usage: ${inputTokens} input + ${outputTokens} output = ${totalTokens} total`;\n }\n\n return `The model stopped generating because it reached the maximum token limit (${totalTokens} tokens). The response was truncated and may be incomplete.`;\n}\n","import type { SpanRecord } from '@mastra/core/storage';\nimport { format } from 'date-fns';\nimport { BracesIcon, FileInputIcon, FileOutputIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { getTokenLimitMessage, isTokenLimitExceeded } from '../utils/span-utils';\nimport { SpanTokenUsage } from './span-token-usage';\nimport type { TokenUsage } from './span-token-usage';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { DataKeysAndValues } from '@/ds/components/DataKeysAndValues';\nimport { DataPanel } from '@/ds/components/DataPanel';\nimport { Notice } from '@/ds/components/Notice';\nimport { Tab, TabContent, TabList, Tabs } from '@/ds/components/Tabs';\n\nfunction buildDialogTitle(sectionTitle: string, icon: ReactNode, span: { spanId: string; traceId: string }) {\n return (\n <>\n <span className=\"flex items-center gap-1.5 text-neutral2 uppercase tracking-widest [&>svg]:size-3.5\">\n {icon}\n {sectionTitle}\n </span>\n <span>\n › Span <b className=\"text-neutral3\">#{span.spanId}</b>\n </span>\n <span>\n › Trace <b className=\"text-neutral3\">#{span.traceId}</b>\n </span>\n </>\n );\n}\n\nexport interface SpanDataPanelViewProps {\n traceId: string;\n spanId: string;\n /** Full span record. Caller fetches via useSpanDetail. */\n span: SpanRecord | undefined;\n isLoading?: boolean;\n onClose: () => void;\n onPrevious?: () => void;\n onNext?: () => void;\n activeTab?: string;\n onTabChange?: (tab: string) => void;\n /**\n * When provided, a \"Scoring\" tab appears; the slot receives the loaded span and renders\n * whatever scoring UI the consumer wants. When undefined, only the \"Details\" tab renders.\n */\n scoringTabSlot?: (args: { span: SpanRecord; traceId: string; spanId: string }) => ReactNode;\n /** Optional count shown in the \"Scoring\" tab label (e.g. number of scores). */\n scoringTabBadge?: ReactNode;\n /**\n * When provided, a \"Feedback\" tab appears; the slot receives the loaded span and renders\n * whatever feedback UI the consumer wants.\n */\n feedbackTabSlot?: (args: { span: SpanRecord; traceId: string; spanId: string }) => ReactNode;\n /** Optional count shown in the \"Feedback\" tab label. */\n feedbackTabBadge?: ReactNode;\n /**\n * Whether this span is the displayed root of the current view (trace root or\n * branch anchor). Controls visibility of trace-level metadata fields. Defaults\n * to `span.parentSpanId == null` (trace case) when omitted.\n */\n isAnchor?: boolean;\n}\n\nexport function SpanDataPanelView({\n traceId,\n spanId,\n span,\n isLoading,\n onClose,\n onPrevious,\n onNext,\n activeTab,\n onTabChange,\n scoringTabSlot,\n scoringTabBadge,\n feedbackTabSlot,\n feedbackTabBadge,\n isAnchor,\n}: SpanDataPanelViewProps) {\n return (\n <DataPanel>\n <DataPanel.Header>\n <DataPanel.Heading>\n Span <b># {spanId}</b>\n </DataPanel.Heading>\n <ButtonsGroup className=\"ml-auto shrink-0\">\n <DataPanel.NextPrevNav\n onPrevious={onPrevious}\n onNext={onNext}\n previousLabel=\"Previous span\"\n nextLabel=\"Next span\"\n />\n <DataPanel.CloseButton onClick={onClose} />\n </ButtonsGroup>\n </DataPanel.Header>\n\n {isLoading ? (\n <DataPanel.LoadingData>Loading span details...</DataPanel.LoadingData>\n ) : !span ? (\n <DataPanel.NoData>Span not found.</DataPanel.NoData>\n ) : (\n <SpanDataPanelContent\n span={span}\n traceId={traceId}\n spanId={spanId}\n activeTab={activeTab}\n onTabChange={onTabChange}\n scoringTabSlot={scoringTabSlot}\n scoringTabBadge={scoringTabBadge}\n feedbackTabSlot={feedbackTabSlot}\n feedbackTabBadge={feedbackTabBadge}\n isAnchor={isAnchor}\n />\n )}\n </DataPanel>\n );\n}\n\nfunction SpanDataPanelContent({\n span,\n traceId,\n spanId,\n activeTab,\n onTabChange,\n scoringTabSlot,\n scoringTabBadge,\n feedbackTabSlot,\n feedbackTabBadge,\n isAnchor,\n}: {\n span: SpanRecord;\n traceId: string;\n spanId: string;\n activeTab?: string;\n onTabChange?: (tab: string) => void;\n scoringTabSlot?: (args: { span: SpanRecord; traceId: string; spanId: string }) => ReactNode;\n scoringTabBadge?: ReactNode;\n feedbackTabSlot?: (args: { span: SpanRecord; traceId: string; spanId: string }) => ReactNode;\n feedbackTabBadge?: ReactNode;\n isAnchor?: boolean;\n}) {\n const durationMs =\n span.startedAt && span.endedAt ? new Date(span.endedAt).getTime() - new Date(span.startedAt).getTime() : null;\n const usage = span.attributes?.usage as TokenUsage | undefined;\n\n const detailsBody = (\n <>\n {isTokenLimitExceeded(span) && (\n <div className=\"mb-3\">\n <Notice variant=\"warning\" title=\"Token Limit Exceeded\">\n <Notice.Message>{getTokenLimitMessage(span)}</Notice.Message>\n </Notice>\n </div>\n )}\n\n {usage && <SpanTokenUsage usage={usage} className=\"mb-3\" />}\n\n <DataKeysAndValues>\n {/* Anchor-only: rich trace-context fields. Live on the full SpanRecord, not on the\n * lightweight payload, so they only have values once the full span is loaded. */}\n {(isAnchor ?? span.parentSpanId == null) && (\n <>\n {span.traceId && (\n <>\n <DataKeysAndValues.Key>Trace Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn copyTooltip=\"Copy Trace Id to clipboard\" copyValue={span.traceId}>\n {span.traceId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n {span.tags && span.tags.length > 0 && (\n <>\n <DataKeysAndValues.Key>Tags</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{span.tags.join(', ')}</DataKeysAndValues.Value>\n </>\n )}\n {span.runId && (\n <>\n <DataKeysAndValues.Key>Run Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn copyTooltip=\"Copy Run Id to clipboard\" copyValue={span.runId}>\n {span.runId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n {span.threadId && (\n <>\n <DataKeysAndValues.Key>Thread Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn copyTooltip=\"Copy Thread Id to clipboard\" copyValue={span.threadId}>\n {span.threadId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n {span.sessionId && (\n <>\n <DataKeysAndValues.Key>Session Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn\n copyTooltip=\"Copy Session Id to clipboard\"\n copyValue={span.sessionId}\n >\n {span.sessionId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n {span.requestId && (\n <>\n <DataKeysAndValues.Key>Request Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn\n copyTooltip=\"Copy Request Id to clipboard\"\n copyValue={span.requestId}\n >\n {span.requestId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n {span.resourceId && (\n <>\n <DataKeysAndValues.Key>Resource Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn\n copyTooltip=\"Copy Resource Id to clipboard\"\n copyValue={span.resourceId}\n >\n {span.resourceId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n {span.userId && (\n <>\n <DataKeysAndValues.Key>User Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn copyTooltip=\"Copy User Id to clipboard\" copyValue={span.userId}>\n {span.userId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n {span.organizationId && (\n <>\n <DataKeysAndValues.Key>Organization Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn\n copyTooltip=\"Copy Organization Id to clipboard\"\n copyValue={span.organizationId}\n >\n {span.organizationId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n {span.experimentId && (\n <>\n <DataKeysAndValues.Key>Experiment Id</DataKeysAndValues.Key>\n <DataKeysAndValues.ValueWithCopyBtn\n copyTooltip=\"Copy Experiment Id to clipboard\"\n copyValue={span.experimentId}\n >\n {span.experimentId}\n </DataKeysAndValues.ValueWithCopyBtn>\n </>\n )}\n </>\n )}\n {span.name && (\n <>\n <DataKeysAndValues.Key>Name</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{span.name}</DataKeysAndValues.Value>\n </>\n )}\n {span.spanType && (\n <>\n <DataKeysAndValues.Key>Type</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{span.spanType}</DataKeysAndValues.Value>\n </>\n )}\n {span.startedAt && (\n <>\n <DataKeysAndValues.Key>Started</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>\n {format(new Date(span.startedAt), 'MMM dd, HH:mm:ss.SSS')}\n </DataKeysAndValues.Value>\n </>\n )}\n {span.endedAt && (\n <>\n <DataKeysAndValues.Key>Ended</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>{format(new Date(span.endedAt), 'MMM dd, HH:mm:ss.SSS')}</DataKeysAndValues.Value>\n </>\n )}\n {durationMs != null && (\n <>\n <DataKeysAndValues.Key>Duration</DataKeysAndValues.Key>\n <DataKeysAndValues.Value>\n {durationMs < 1000 ? `${durationMs}ms` : `${(durationMs / 1000).toFixed(2)}s`}\n </DataKeysAndValues.Value>\n </>\n )}\n </DataKeysAndValues>\n\n <div className=\"grid gap-3 mt-3\">\n <DataPanel.CodeSection\n title=\"Input\"\n dialogTitle={buildDialogTitle('Input', <FileInputIcon />, { spanId, traceId })}\n icon={<FileInputIcon />}\n codeStr={JSON.stringify(span.input ?? null, null, 2)}\n />\n <DataPanel.CodeSection\n title=\"Output\"\n dialogTitle={buildDialogTitle('Output', <FileOutputIcon />, { spanId, traceId })}\n icon={<FileOutputIcon />}\n codeStr={JSON.stringify(span.output ?? null, null, 2)}\n />\n <DataPanel.CodeSection\n title=\"Metadata\"\n dialogTitle={buildDialogTitle('Metadata', <BracesIcon />, { spanId, traceId })}\n icon={<BracesIcon />}\n codeStr={JSON.stringify(span.metadata ?? null, null, 2)}\n />\n <DataPanel.CodeSection\n title=\"Attributes\"\n dialogTitle={buildDialogTitle('Attributes', <BracesIcon />, { spanId, traceId })}\n icon={<BracesIcon />}\n codeStr={JSON.stringify(span.attributes ?? null, null, 2)}\n />\n </div>\n </>\n );\n\n // No extra tab slots → render details directly without the Tabs/TabList wrapper.\n if (!scoringTabSlot && !feedbackTabSlot) {\n return <DataPanel.Content>{detailsBody}</DataPanel.Content>;\n }\n\n return (\n <DataPanel.Content>\n <Tabs defaultTab=\"details\" value={activeTab} onValueChange={onTabChange}>\n <TabList>\n <Tab value=\"details\">Details</Tab>\n {scoringTabSlot && <Tab value=\"scoring\">Scoring {scoringTabBadge != null && <>({scoringTabBadge})</>}</Tab>}\n {feedbackTabSlot && (\n <Tab value=\"feedback\">Feedback {feedbackTabBadge != null && <>({feedbackTabBadge})</>}</Tab>\n )}\n </TabList>\n\n <TabContent value=\"details\">{detailsBody}</TabContent>\n {scoringTabSlot && <TabContent value=\"scoring\">{scoringTabSlot({ span, traceId, spanId })}</TabContent>}\n {feedbackTabSlot && <TabContent value=\"feedback\">{feedbackTabSlot({ span, traceId, spanId })}</TabContent>}\n </Tabs>\n </DataPanel.Content>\n );\n}\n","import type { SpanRecord } from '@mastra/core/storage';\nimport { format } from 'date-fns';\nimport { BracesIcon, FileInputIcon, FileOutputIcon } from 'lucide-react';\nimport { DataDetailsPanel } from '@/ds/components/DataDetailsPanel';\n\nconst KV = DataDetailsPanel.KeyValueList;\n\nexport interface SpanDetailsViewProps {\n spanId: string;\n /** Full span record. Caller fetches via useSpanDetail. */\n span: SpanRecord | undefined;\n isLoading?: boolean;\n onClose: () => void;\n}\n\n/**\n * Compact span panel using `DataDetailsPanel` (popover-style). Shows basic span metadata +\n * input/output/metadata/attributes code sections. Use this for inline span inspection; for the\n * full-width span view with scoring tab + prev/next nav, use `SpanDataPanelView`.\n */\nexport function SpanDetailsView({ spanId, span, isLoading, onClose }: SpanDetailsViewProps) {\n const durationMs =\n span?.startedAt && span?.endedAt ? new Date(span.endedAt).getTime() - new Date(span.startedAt).getTime() : null;\n\n return (\n <DataDetailsPanel>\n <DataDetailsPanel.Header>\n <DataDetailsPanel.Heading>\n Span <b># {spanId}</b>\n </DataDetailsPanel.Heading>\n <DataDetailsPanel.CloseButton onClick={onClose} />\n </DataDetailsPanel.Header>\n\n {isLoading ? (\n <DataDetailsPanel.LoadingData>Loading span...</DataDetailsPanel.LoadingData>\n ) : !span ? (\n <DataDetailsPanel.NoData>Span not found.</DataDetailsPanel.NoData>\n ) : (\n <DataDetailsPanel.Content>\n <KV>\n {span.spanType && (\n <>\n <KV.Key>Type</KV.Key>\n <KV.Value>{span.spanType}</KV.Value>\n </>\n )}\n {span.startedAt && (\n <>\n <KV.Key>Started</KV.Key>\n <KV.Value>{format(new Date(span.startedAt), 'MMM dd, HH:mm:ss.SSS')}</KV.Value>\n </>\n )}\n {span.endedAt && (\n <>\n <KV.Key>Ended</KV.Key>\n <KV.Value>{format(new Date(span.endedAt), 'MMM dd, HH:mm:ss.SSS')}</KV.Value>\n </>\n )}\n {durationMs != null && (\n <>\n <KV.Key>Duration</KV.Key>\n <KV.Value>{durationMs < 1000 ? `${durationMs}ms` : `${(durationMs / 1000).toFixed(2)}s`}</KV.Value>\n </>\n )}\n </KV>\n\n <br />\n\n <DataDetailsPanel.CodeSection\n title=\"Input\"\n icon={<FileInputIcon />}\n codeStr={JSON.stringify(span.input ?? null, null, 2)}\n />\n <DataDetailsPanel.CodeSection\n title=\"Output\"\n icon={<FileOutputIcon />}\n codeStr={JSON.stringify(span.output ?? null, null, 2)}\n />\n <DataDetailsPanel.CodeSection\n title=\"Metadata\"\n icon={<BracesIcon />}\n codeStr={JSON.stringify(span.metadata ?? null, null, 2)}\n />\n <DataDetailsPanel.CodeSection\n title=\"Attributes\"\n icon={<BracesIcon />}\n codeStr={JSON.stringify(span.attributes ?? null, null, 2)}\n />\n </DataDetailsPanel.Content>\n )}\n </DataDetailsPanel>\n );\n}\n","import type { LightSpanRecord } from '@mastra/core/storage';\nimport { useEffect, useMemo, useState } from 'react';\nimport { getAllSpanIds } from '../hooks/get-all-span-ids';\nimport { formatHierarchicalSpans } from './format-hierarchical-spans';\nimport { TraceTimeline } from './trace-timeline';\nimport { DataDetailsPanel } from '@/ds/components/DataDetailsPanel';\n\nexport interface TraceDetailsViewProps {\n traceId: string;\n /** Lightweight spans for the trace. Caller fetches via useTraceLightSpans. */\n spans: LightSpanRecord[] | undefined;\n isLoading?: boolean;\n onClose: () => void;\n /** Called when the user clicks a span in the timeline. Toggling a selected span off passes undefined. */\n onSpanSelect?: (spanId: string | undefined) => void;\n /** Fully controlled selection — the span to highlight. Pass whatever the parent's source of truth is. */\n selectedSpanId?: string | null;\n}\n\n/**\n * Compact trace panel using `DataDetailsPanel` (popover-style). Renders the timeline only —\n * no trace header KV, no evaluate/save actions. Use this for inline trace inspection from a\n * list page (e.g. the Logs page). For the full-width trace view, use `TraceDataPanelView`.\n */\nexport function TraceDetailsView({\n traceId,\n spans,\n isLoading,\n onClose,\n onSpanSelect,\n selectedSpanId,\n}: TraceDetailsViewProps) {\n const hierarchicalSpans = useMemo(() => formatHierarchicalSpans(spans ?? []), [spans]);\n\n const [expandedSpanIds, setExpandedSpanIds] = useState<string[]>([]);\n\n useEffect(() => {\n if (hierarchicalSpans.length > 0) {\n setExpandedSpanIds(getAllSpanIds(hierarchicalSpans));\n }\n }, [hierarchicalSpans]);\n\n const handleSpanClick = (id: string) => {\n onSpanSelect?.(selectedSpanId === id ? undefined : id);\n };\n\n return (\n <DataDetailsPanel>\n <DataDetailsPanel.Header>\n <DataDetailsPanel.Heading>\n Trace <b># {traceId}</b>\n </DataDetailsPanel.Heading>\n <DataDetailsPanel.CloseButton onClick={onClose} />\n </DataDetailsPanel.Header>\n\n {isLoading ? (\n <DataDetailsPanel.LoadingData>Loading trace...</DataDetailsPanel.LoadingData>\n ) : hierarchicalSpans.length === 0 ? (\n <DataDetailsPanel.NoData>No spans found for this trace.</DataDetailsPanel.NoData>\n ) : (\n <DataDetailsPanel.Content>\n <TraceTimeline\n hierarchicalSpans={hierarchicalSpans}\n onSpanClick={handleSpanClick}\n selectedSpanId={selectedSpanId ?? undefined}\n expandedSpanIds={expandedSpanIds}\n setExpandedSpanIds={setExpandedSpanIds}\n />\n </DataDetailsPanel.Content>\n )}\n </DataDetailsPanel>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface TracesLayoutProps {\n /** The trace list (left column). */\n listSlot: ReactNode;\n /** The trace data panel (right column, top). When null/undefined, the whole right column collapses. */\n tracePanelSlot?: ReactNode;\n /** The span data panel (right column, middle). Only rendered when truthy. */\n spanPanelSlot?: ReactNode;\n /** The score data panel (right column, bottom). Only rendered when truthy. */\n scorePanelSlot?: ReactNode;\n /** When the trace panel is collapsed, the right column's grid-rows squash the trace row to `auto`. */\n traceCollapsed?: boolean;\n}\n\n/**\n * Pure 2-column layout shell for the traces page. Owns no state and fetches no data — pass slots in.\n * Right-column row template adapts based on which panels are present.\n */\nexport function TracesLayout({\n listSlot,\n tracePanelSlot,\n spanPanelSlot,\n scorePanelSlot,\n traceCollapsed,\n}: TracesLayoutProps) {\n const hasSidePanel = !!tracePanelSlot;\n\n return (\n <div\n className={cn(\n 'grid max-h-full min-h-0 gap-4 items-start ',\n hasSidePanel ? 'grid-cols-[1fr_1fr]' : 'grid-cols-[1fr]',\n )}\n >\n {listSlot}\n\n {hasSidePanel && (\n <div\n className={cn(\n 'grid gap-4 max-h-full overflow-auto',\n scorePanelSlot\n ? traceCollapsed\n ? 'grid-rows-[auto_3fr_3fr]'\n : 'grid-rows-[2fr_3fr_3fr]'\n : spanPanelSlot\n ? traceCollapsed\n ? 'grid-rows-[auto_3fr]'\n : 'grid-rows-[2fr_3fr]'\n : traceCollapsed\n ? 'grid-rows-[auto]'\n : 'grid-rows-[1fr]',\n )}\n >\n {tracePanelSlot}\n {spanPanelSlot}\n {scorePanelSlot}\n </div>\n )}\n </div>\n );\n}\n","import { useVirtualizer } from '@tanstack/react-virtual';\nimport { useEffect, useRef } from 'react';\nimport { getInputPreview } from '../utils/span-utils';\nimport { DataListSkeleton, TracesDataList } from '@/ds/components/DataList';\nimport { cn } from '@/lib/utils';\n\n/** Span attributes fields the list view reads directly. Extra unknown keys are allowed so callers\n * can pass the full attributes record from @mastra/core/storage without mapping. */\nexport type TraceAttributes = {\n status?: string | null;\n agentId?: string | null;\n workflowId?: string | null;\n [key: string]: unknown;\n};\n\nexport type TracesListViewTrace = {\n traceId: string;\n /** Required for branch rows; absent on plain trace rows (which are root-rooted). */\n spanId?: string | null;\n /** `null`/missing → root span. Drives the Kind column's icon (top-level trace vs nested branch). */\n parentSpanId?: string | null;\n name: string;\n entityType?: string | null;\n entityId?: string | null;\n entityName?: string | null;\n attributes?: TraceAttributes | null;\n input?: unknown;\n startedAt?: Date | string | null;\n createdAt: Date | string;\n};\n\n// Fixed widths on non-flex columns prevent track shifts as the virtualizer swaps rows in/out.\nconst COLUMNS = '6rem 9rem 14rem minmax(8rem,1fr) 14rem 6rem';\n\nconst ROW_HEIGHT = 36;\nconst OVERSCAN = 8;\n\nexport type TracesListViewProps = {\n traces: TracesListViewTrace[];\n isLoading?: boolean;\n isFetchingNextPage?: boolean;\n hasNextPage?: boolean;\n setEndOfListElement?: (element: HTMLDivElement | null) => void;\n filtersApplied?: boolean;\n /** Currently featured/selected trace — its row gets the highlighted background. */\n featuredTraceId?: string | null;\n /**\n * Required in branches mode to disambiguate rows sharing a `traceId`. When set,\n * a row is featured only when both `traceId` and `spanId` match.\n */\n featuredSpanId?: string | null;\n /** Branches mode mixes root traces with subtraces — enables the Trace/Subtrace tooltip on the\n * level icon in the Name column, which is meaningless when every row is a root. */\n isBranchesMode?: boolean;\n /** Keys (`traceId:spanId`) of rows that just arrived via delta polling. Rows whose key is in\n * this set get a temporary tint to distinguish them from rows present since the last page-mode\n * fetch. Auto-expires upstream (in useTraces) after a short window. */\n recentlyAddedKeys?: Set<string>;\n /** Called when a row is clicked. The current selection logic (toggle on same id) is the consumer's call. */\n onTraceClick: (trace: TracesListViewTrace) => void;\n};\n\n/**\n * Virtualized presentational list. Renders only the visible window via TanStack Virtual, and\n * uses DataList primitives for layout (CSS Grid with subgrid rows).\n */\nexport function TracesListView({\n traces,\n isLoading,\n isFetchingNextPage,\n hasNextPage,\n setEndOfListElement,\n filtersApplied,\n featuredTraceId,\n featuredSpanId,\n isBranchesMode,\n recentlyAddedKeys,\n onTraceClick,\n}: TracesListViewProps) {\n const scrollRef = useRef<HTMLDivElement | null>(null);\n\n const virtualizer = useVirtualizer({\n count: traces.length,\n getScrollElement: () => scrollRef.current,\n estimateSize: () => ROW_HEIGHT,\n overscan: OVERSCAN,\n });\n\n // Reset scroll to top whenever a fresh query resolves (filter / date range change).\n // `isLoading` only flips on initial fetches — `fetchNextPage` keeps it `false`, so this\n // effect doesn't fire during pagination.\n //\n // Why the manual scroll event: when the skeleton-vs-list branch swaps in the new scroll\n // container, it mounts at `scrollTop = 0`. The virtualizer rebinds its listener but\n // doesn't re-read `scrollTop`, so it keeps the stale `scrollOffset` from the previous\n // element. `scrollToOffset(0)` no-ops because the new element is already at 0 (no scroll\n // event fires). Dispatching a synthetic `scroll` forces the virtualizer's handler to\n // read the fresh `scrollTop` and recompute `virtualItems` with `paddingTop = 0`.\n const wasLoadingRef = useRef(isLoading);\n useEffect(() => {\n if (wasLoadingRef.current && !isLoading) {\n scrollRef.current?.dispatchEvent(new Event('scroll'));\n }\n wasLoadingRef.current = isLoading;\n }, [isLoading]);\n\n if (isLoading) {\n return <DataListSkeleton columns={COLUMNS} />;\n }\n\n const virtualItems = virtualizer.getVirtualItems();\n const totalSize = virtualizer.getTotalSize();\n const paddingTop = virtualItems[0]?.start ?? 0;\n const paddingBottom =\n virtualItems.length > 0 ? Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0)) : 0;\n\n return (\n <TracesDataList columns={COLUMNS} variant=\"striped\" scrollRef={scrollRef} className=\"min-w-0\">\n <TracesDataList.Top>\n <TracesDataList.TopCell>Date</TracesDataList.TopCell>\n <TracesDataList.TopCell>Time</TracesDataList.TopCell>\n <TracesDataList.TopCell>Name</TracesDataList.TopCell>\n <TracesDataList.TopCell>Input</TracesDataList.TopCell>\n <TracesDataList.TopCell>Entity</TracesDataList.TopCell>\n <TracesDataList.TopCell>Status</TracesDataList.TopCell>\n </TracesDataList.Top>\n\n {traces.length === 0 ? (\n <TracesDataList.NoMatch\n message={filtersApplied ? 'No traces found for applied filters' : 'No traces found yet'}\n />\n ) : (\n <>\n <TracesDataList.Spacer height={paddingTop} />\n {virtualItems.map(vi => {\n const trace = traces[vi.index];\n if (!trace) return null;\n\n const isFeatured =\n trace.traceId === featuredTraceId && (featuredSpanId == null || trace.spanId === featuredSpanId);\n const rowKey = `${trace.traceId}:${trace.spanId ?? ''}`;\n const isRecentlyAdded = recentlyAddedKeys?.has(rowKey) ?? false;\n const displayDate = trace.startedAt ?? trace.createdAt;\n const entityName =\n trace.entityName || trace.entityId || trace.attributes?.agentId || trace.attributes?.workflowId;\n\n return (\n <TracesDataList.RowButton\n key={rowKey}\n ref={virtualizer.measureElement}\n data-index={vi.index}\n onClick={() => onTraceClick(trace)}\n featured={isFeatured}\n className={cn(isRecentlyAdded && 'animate-row-highlight')}\n >\n <TracesDataList.DateCell timestamp={displayDate} />\n <TracesDataList.TimeCell timestamp={displayDate} />\n <TracesDataList.NameCell\n name={trace.name}\n parentSpanId={trace.parentSpanId}\n showLevelTooltip={isBranchesMode}\n />\n <TracesDataList.InputCell input={getInputPreview(trace.input)} />\n <TracesDataList.EntityCell entityType={trace.entityType} entityName={entityName} />\n <TracesDataList.StatusCell status={trace.attributes?.status} />\n </TracesDataList.RowButton>\n );\n })}\n <TracesDataList.Spacer height={paddingBottom} />\n <TracesDataList.NextPageLoading\n isLoading={isFetchingNextPage}\n hasMore={hasNextPage}\n setEndOfListElement={setEndOfListElement}\n />\n </>\n )}\n </TracesDataList>\n );\n}\n","import { ChevronDownIcon } from 'lucide-react';\nimport type { TraceListMode } from '../trace-filters';\nimport { Button } from '@/ds/components/Button';\nimport { DropdownMenu } from '@/ds/components/DropdownMenu';\n\nconst TRACES_LIST_MODE_LABELS: Record<TraceListMode, string> = {\n traces: 'Top-level traces only',\n branches: 'All traces, nested too',\n};\n\nexport interface TracesListModeToggleProps {\n value: TraceListMode;\n onChange: (mode: TraceListMode) => void;\n disabled?: boolean;\n}\n\n/**\n * Dropdown switcher between the two list modes on the Observability traces page:\n * - `traces` — one row per top-level run (each trace's root anchor).\n * - `branches` — one row per anchor span, including ones nested inside other runs.\n */\nexport function TracesListModeToggle({ value, onChange, disabled }: TracesListModeToggleProps) {\n return (\n <DropdownMenu>\n <DropdownMenu.Trigger asChild>\n <Button size=\"md\" variant=\"default\" disabled={disabled}>\n {TRACES_LIST_MODE_LABELS[value]}\n <ChevronDownIcon />\n </Button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"start\">\n <DropdownMenu.RadioGroup value={value} onValueChange={v => onChange(v as TraceListMode)}>\n <DropdownMenu.RadioItem value=\"traces\">{TRACES_LIST_MODE_LABELS.traces}</DropdownMenu.RadioItem>\n <DropdownMenu.RadioItem value=\"branches\">{TRACES_LIST_MODE_LABELS.branches}</DropdownMenu.RadioItem>\n </DropdownMenu.RadioGroup>\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n}\n","import { ErrorState } from '@/ds/components/ErrorState';\nimport { PermissionDenied } from '@/ds/components/PermissionDenied';\nimport { SessionExpired } from '@/ds/components/SessionExpired';\nimport { parseError } from '@/lib/errors';\nimport { is401UnauthorizedError, is403ForbiddenError } from '@/lib/query-utils';\n\nexport interface TracesErrorContentProps {\n /** The error from a useTraces / useTraceLightSpans / etc. query. */\n error: unknown;\n /** Passed to PermissionDenied (e.g. 'traces' / 'trace'). */\n resource: string;\n /** Title shown on the generic ErrorState fallback. */\n errorTitle: string;\n}\n\n/**\n * Renders the appropriate fallback content for a traces-related query error:\n * `<SessionExpired />` for 401, `<PermissionDenied />` for 403, otherwise `<ErrorState />`.\n *\n * The consumer wraps it in whatever layout they want (NoDataPageLayout for the list page,\n * PageLayout.MainArea for the detail page, etc.) — this component only owns the 3-branch decision.\n */\nexport function TracesErrorContent({ error, resource, errorTitle }: TracesErrorContentProps) {\n if (is401UnauthorizedError(error)) return <SessionExpired />;\n if (is403ForbiddenError(error)) return <PermissionDenied resource={resource} />;\n const parsed = error instanceof Error ? parseError(error) : undefined;\n return <ErrorState title={errorTitle} message={parsed?.error ?? 'Unknown error'} />;\n}\n","import { format } from 'date-fns';\nimport { CircleSlashIcon, ExternalLinkIcon } from 'lucide-react';\nimport type { TraceDatePreset } from '../types';\nimport { Button } from '@/ds/components/Button';\nimport { EmptyState } from '@/ds/components/EmptyState';\n\nconst PRESET_LABELS: Record<Exclude<TraceDatePreset, 'all' | 'custom'>, string> = {\n 'last-24h': 'the last 24 hours',\n 'last-3d': 'the last 3 days',\n 'last-7d': 'the last 7 days',\n 'last-14d': 'the last 14 days',\n 'last-30d': 'the last 30 days',\n};\n\nexport interface NoTracesInfoProps {\n datePreset?: TraceDatePreset;\n dateFrom?: Date;\n dateTo?: Date;\n}\n\nconst DATE_FORMAT = 'MMM d, yyyy HH:mm';\n\nconst RANGE_TIP = 'Pick a wider time range — older traces may fall outside the current window.';\n\nfunction describeRange({ datePreset, dateFrom, dateTo }: NoTracesInfoProps): { title: string; description: string } {\n if (datePreset && datePreset !== 'all' && datePreset !== 'custom') {\n return {\n title: `No traces for ${PRESET_LABELS[datePreset]}`,\n description: RANGE_TIP,\n };\n }\n if (dateFrom && dateTo) {\n return {\n title: `No traces between ${format(dateFrom, DATE_FORMAT)} and ${format(dateTo, DATE_FORMAT)}`,\n description: RANGE_TIP,\n };\n }\n if (dateFrom) {\n return {\n title: `No traces since ${format(dateFrom, DATE_FORMAT)}`,\n description: RANGE_TIP,\n };\n }\n return {\n title: 'No traces yet',\n description: 'Traces will appear here once agents, workflows, or tools are executed.',\n };\n}\n\nexport const NoTracesInfo = ({ datePreset, dateFrom, dateTo }: NoTracesInfoProps = {}) => {\n const { title, description } = describeRange({ datePreset, dateFrom, dateTo });\n return (\n <div className=\"flex h-full items-center justify-center\">\n <EmptyState\n iconSlot={<CircleSlashIcon />}\n titleSlot={title}\n descriptionSlot={description}\n actionSlot={\n <Button\n variant=\"ghost\"\n as=\"a\"\n href=\"https://mastra.ai/en/docs/observability/tracing/overview\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Tracing Documentation <ExternalLinkIcon />\n </Button>\n }\n />\n </div>\n );\n};\n","import type { LightSpanRecord } from '@mastra/core/storage';\nimport { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport type { UseQueryResult } from '@tanstack/react-query';\n\nconst IMMUTABLE_CACHE_TIME = 1000 * 60 * 60 * 24 * 30; // 30 days, massive cache, span data is immutable\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: LightSpanRecord[] } | 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 enabled: !!traceId && !!spanId,\n staleTime: query => {\n const data = query.state.data;\n const isFinished = data?.spans.every(s => Boolean(s.endedAt));\n return isFinished ? IMMUTABLE_CACHE_TIME : 0;\n },\n });\n}\n","import type { LightSpanRecord } from '@mastra/core/storage';\nimport { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport type { UseQueryResult } from '@tanstack/react-query';\n\nconst IMMUTABLE_CACHE_TIME = 1000 * 60 * 60 * 24 * 30; // 30 days, massive cache, span data is immutable\n\nexport function useSpanDetail(\n traceId: string | null | undefined,\n spanId: string | null | undefined,\n): UseQueryResult<{ span: LightSpanRecord & { output?: unknown; result?: unknown } } | null> {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['span-detail', traceId, spanId],\n queryFn: async () => {\n if (!traceId || !spanId) {\n throw new Error('Trace ID and Span ID are required');\n }\n return client.getSpan(traceId, spanId);\n },\n enabled: !!traceId && !!spanId,\n staleTime: query => {\n const data = query.state.data;\n\n if (data?.span?.endedAt) {\n return IMMUTABLE_CACHE_TIME;\n }\n\n return 0;\n },\n });\n}\n","import type { LightSpanRecord } from '@mastra/core/storage';\nimport { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport type { UseQueryResult } from '@tanstack/react-query';\n\nconst IMMUTABLE_CACHE_TIME = 1000 * 60 * 60 * 24 * 30; // 30 days, massive cache, span data is immutable\n\nexport function useTraceLightSpans(\n traceId: string | null | undefined,\n): UseQueryResult<{ traceId: string; spans: LightSpanRecord[] } | null> {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['trace-light-spans', traceId],\n queryFn: async () => {\n if (!traceId) {\n throw new Error('Trace ID is required');\n }\n const res = await client.getTraceLight(traceId);\n return res;\n },\n enabled: !!traceId,\n staleTime: query => {\n const data = query.state.data;\n\n const isFinished = data?.spans.every(d => Boolean(d.endedAt));\n\n if (isFinished) {\n return IMMUTABLE_CACHE_TIME;\n }\n\n return 0;\n },\n });\n}\n","import type { LightSpanRecord } from '@mastra/core/storage';\nimport type { TraceListMode } from '../trace-filters';\nimport { useBranch } from './use-branch';\nimport { useTraceLightSpans } from './use-trace-light-spans';\n\nexport interface UseTraceOrBranchSpansArgs {\n traceId: string | null | undefined;\n /** Required when `listMode === 'branches'` — the anchor span identifying the displayed\n * subtree. The hook fetches `getBranch(traceId, anchorSpanId)`. Intra-panel span selection\n * is separate (the caller's `spanIdParam`); the anchor stays put while it changes. */\n anchorSpanId?: string | null;\n listMode: TraceListMode;\n depth?: number;\n}\n\nexport interface UseTraceOrBranchSpansResult {\n spans: LightSpanRecord[] | undefined;\n /** Set in branches mode; undefined in traces mode (which uses parentSpanId == null). */\n anchorSpanId: string | undefined;\n isLoading: boolean;\n isError: boolean;\n error: unknown;\n}\n\n/**\n * Unified data source for the trace/span detail panel. Returns trace spans (full tree from the\n * root) in traces mode, or branch spans (subtree rooted at `anchorSpanId`) in branches mode.\n * Only the active query fires; the inactive one is disabled via its `enabled` flag.\n */\nexport function useTraceOrBranchSpans({\n traceId,\n anchorSpanId,\n listMode,\n depth,\n}: UseTraceOrBranchSpansArgs): UseTraceOrBranchSpansResult {\n const isBranches = listMode === 'branches';\n\n const traceQuery = useTraceLightSpans(isBranches ? null : traceId);\n const branchQuery = useBranch({\n traceId: isBranches ? traceId : null,\n spanId: isBranches ? anchorSpanId : null,\n depth,\n });\n\n if (isBranches) {\n return {\n spans: branchQuery.data?.spans,\n anchorSpanId: anchorSpanId ?? undefined,\n isLoading: branchQuery.isLoading,\n isError: branchQuery.isError,\n error: branchQuery.error,\n };\n }\n\n return {\n spans: traceQuery.data?.spans,\n anchorSpanId: undefined,\n isLoading: traceQuery.isLoading,\n isError: traceQuery.isError,\n error: traceQuery.error,\n };\n}\n","import type { LightSpanRecord } from '@mastra/core/storage';\nimport { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport type { UseQueryResult } from '@tanstack/react-query';\n\nexport function useTraceSpans(\n traceId: string | null | undefined,\n): UseQueryResult<{ traceId: string; spans: LightSpanRecord[] } | null> {\n const client = useMastraClient();\n\n return useQuery({\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 });\n}\n","import type {\n LightSpanRecord,\n ListBranchesArgs,\n ListBranchesResponse,\n ListTracesArgs,\n ListTracesResponse,\n} from '@mastra/core/storage';\nimport { useMastraClient } from '@mastra/react';\nimport type { InfiniteData } from '@tanstack/react-query';\nimport { useInfiniteQuery, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { useEffect, useRef, useState } from 'react';\nimport type { TraceListMode } from '../trace-filters';\nimport { useInView } from '@/hooks/use-in-view';\nimport { is403ForbiddenError } from '@/lib/query-utils';\n\n/**\n * Per-MastraClient delta-polling support cache. Sticks once we observe a 501\n * or a page-0 response without `deltaCursor` (legacy server or store without\n * delta capability), so we don't re-probe on every mount.\n */\ntype DeltaSupport = 'unknown' | 'unsupported';\nconst deltaSupportByClient = new WeakMap<ReturnType<typeof useMastraClient>, DeltaSupport>();\n\n/** Tunables for live-tail polling. All fields optional — defaults below.\n * Platform consumers override individual fields to throttle traffic or\n * reshape the freshness/visibility trade-offs. */\nexport interface TracesPollingConfig {\n /** Interval between delta polls. Default 5_000ms. */\n deltaPollIntervalMs?: number;\n /** Refetch delay when the server signals `delta.hasMore` (chase remaining updates immediately). Default 100ms. */\n deltaChaseIntervalMs?: number;\n /** Max rows per delta poll. Server caps at 100. Default 100. */\n deltaLimit?: number;\n /** Page-mode refetch interval used when the configured store does not support delta polling. Default 10_000ms. */\n pageModeRefetchIntervalMs?: number;\n /** Periodic page-0 refetch interval while delta is active. Delta only delivers new rows, so this\n * is how we surface status flips (running → success/error) on rows already visible. Default 60_000ms. */\n page0StatusRefreshIntervalMs?: number;\n /** When the tab returns from being hidden and the last successful poll was older than this, the\n * cursor is treated as stale (ClickHouse delta tables TTL after 2 days; other stores may be more\n * aggressive). The infinite query is reset so page 0 refetches and delta resumes from a fresh\n * cursor. Default 900_000ms (15 min). */\n idleGuardThresholdMs?: number;\n /** Minimum visible duration for `isRefetching` after any query completes. On localhost a delta\n * poll can resolve in tens of ms — too brief for the spinner's 1s rotation to register visually,\n * and quick enough that React may batch the start/finish transitions. Pulsing for this duration\n * on completion (~144° of rotation at 400ms) makes each poll perceptible as a heartbeat.\n * Default 400ms. */\n minRefetchSpinMs?: number;\n /** Window during which a delta-arrived row's key stays in `recentlyAddedKeys` so the list view\n * can apply its `animate-row-highlight` class. Should match the CSS animation duration\n * (currently 1_000ms — see `index.css`). Default 1_000ms. */\n deltaHighlightMs?: number;\n}\n\nconst DEFAULT_POLLING_CONFIG: Required<TracesPollingConfig> = {\n deltaPollIntervalMs: 5_000,\n deltaChaseIntervalMs: 100,\n deltaLimit: 100,\n pageModeRefetchIntervalMs: 10_000,\n page0StatusRefreshIntervalMs: 60_000,\n idleGuardThresholdMs: 15 * 60_000,\n minRefetchSpinMs: 400,\n deltaHighlightMs: 1_000,\n};\n\n/** Returns true when the cursor should be considered stale and re-seeded.\n * Exported for testing — pure function of timestamps. */\nexport function shouldResetAfterIdle(lastSuccessAt: number, now: number, thresholdMs: number): boolean {\n if (lastSuccessAt === 0) return false;\n return now - lastSuccessAt > thresholdMs;\n}\n\nfunction isHttp501(error: unknown): boolean {\n return (error as { status?: number } | null)?.status === 501;\n}\n\ntype FetchTracesFnArgs = TracesFilters & {\n client: ReturnType<typeof useMastraClient>;\n mode?: 'page' | 'delta';\n page?: number;\n perPage?: number;\n after?: string;\n limit?: number;\n};\n\nconst fetchTracesFn = async ({\n client,\n mode,\n page,\n perPage,\n after,\n limit,\n filters,\n listMode = 'traces',\n}: FetchTracesFnArgs) => {\n const params =\n mode === 'delta'\n ? { mode: 'delta' as const, after, limit, filters }\n : { pagination: { page: page!, perPage: perPage! }, filters };\n\n if (listMode === 'branches') {\n return client.listBranches(params as ListBranchesArgs);\n }\n\n return client.listTraces(params as ListTracesArgs);\n};\n\nexport const TRACES_PER_PAGE = 25;\n\nexport interface TracesFilters {\n filters?: ListTracesArgs['filters'] | ListBranchesArgs['filters'];\n listMode?: TraceListMode;\n}\n\n/** Returns the next page number if the server indicates more pages are available. */\nexport function getTracesNextPageParam(\n lastPage: ListTracesResponse | ListBranchesResponse | undefined,\n _allPages: unknown,\n lastPageParam: number,\n) {\n if (lastPage?.pagination?.hasMore) {\n return lastPageParam + 1;\n }\n return undefined;\n}\n\ntype TracesPageResponse = ListTracesResponse | ListBranchesResponse;\n\nfunction getPageSpans(page: TracesPageResponse) {\n if ('branches' in page) return page.branches ?? [];\n return page.spans ?? [];\n}\n\n/** Deduplicates trace/branch rows by traceId + spanId across all loaded pages.\n * Also surfaces page 0's deltaCursor so the live-tail query can read it reactively. */\nexport function selectUniqueTraces(data: { pages: TracesPageResponse[] }): {\n spans: LightSpanRecord[];\n deltaCursor: string | undefined;\n} {\n const seen = new Set<string>();\n const spans = data.pages\n .flatMap(page => getPageSpans(page))\n .filter(span => {\n const key = `${span.traceId}:${span.spanId}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n\n return { spans, deltaCursor: data.pages[0]?.deltaCursor };\n}\n\n/** Replaces existing page-0 rows in place (keyed by traceId:spanId) with\n * refreshed copies from the server. Rows the server doesn't return are kept\n * as-is so delta-accumulated rows that have aged off the server's page 0\n * aren't dropped from the UI. New rows aren't added here — delta polling\n * delivers those. */\nexport function refreshPage0Rows(\n old: InfiniteData<TracesPageResponse> | undefined,\n refreshed: ListTracesResponse | ListBranchesResponse,\n listMode: TraceListMode,\n): InfiniteData<TracesPageResponse> | undefined {\n if (!old || old.pages.length === 0) return old;\n const [firstPage, ...rest] = old.pages;\n\n const refreshedRows =\n listMode === 'branches' && 'branches' in refreshed\n ? (refreshed.branches ?? [])\n : 'spans' in refreshed\n ? (refreshed.spans ?? [])\n : [];\n\n if (refreshedRows.length === 0) return old;\n\n const refreshedByKey = new Map<string, (typeof refreshedRows)[number]>();\n for (const row of refreshedRows) {\n refreshedByKey.set(`${row.traceId}:${row.spanId}`, row);\n }\n\n let updatedFirst: TracesPageResponse;\n if (listMode === 'branches' && 'branches' in firstPage) {\n const updated = (firstPage.branches ?? []).map(existing => {\n const fresh = refreshedByKey.get(`${existing.traceId}:${existing.spanId}`);\n return fresh ?? existing;\n });\n updatedFirst = { ...firstPage, branches: updated };\n } else if ('spans' in firstPage) {\n const updated = (firstPage.spans ?? []).map(existing => {\n const fresh = refreshedByKey.get(`${existing.traceId}:${existing.spanId}`);\n return fresh ?? existing;\n });\n updatedFirst = { ...firstPage, spans: updated };\n } else {\n return old;\n }\n\n return { ...old, pages: [updatedFirst, ...rest] };\n}\n\n/** Stable `startedAt DESC` sort matching the server's default page-mode\n * ordering for both list endpoints. Rows missing `startedAt` sink to the\n * bottom (compared as time 0). */\nfunction sortRowsByStartedAtDesc<T extends { startedAt?: unknown }>(rows: T[]): T[] {\n return [...rows].sort((a, b) => {\n const aTime = a.startedAt ? new Date(a.startedAt as string | number | Date).getTime() : 0;\n const bTime = b.startedAt ? new Date(b.startedAt as string | number | Date).getTime() : 0;\n return bTime - aTime;\n });\n}\n\n/** Prepends delta-mode rows into page 0 and advances its deltaCursor.\n * Delta responses come back in server cursor order (insertion order into\n * the per-store delta index), not the `startedAt DESC` order page-mode\n * uses — so we re-sort the merged page 0 to match what the user sees on\n * a fresh page-mode load. Cross-page duplication is handled later by\n * selectUniqueTraces. */\nexport function mergeDeltaIntoPage0(\n old: InfiniteData<TracesPageResponse> | undefined,\n delta: ListTracesResponse | ListBranchesResponse,\n listMode: TraceListMode,\n): InfiniteData<TracesPageResponse> | undefined {\n if (!old || old.pages.length === 0) return old;\n const [firstPage, ...rest] = old.pages;\n const nextCursor = delta.deltaCursor ?? firstPage.deltaCursor;\n\n let updatedFirst: TracesPageResponse;\n if (listMode === 'branches' && 'branches' in firstPage) {\n const newRows = (delta as ListBranchesResponse).branches ?? [];\n updatedFirst = {\n ...firstPage,\n branches: sortRowsByStartedAtDesc([...newRows, ...(firstPage.branches ?? [])]),\n deltaCursor: nextCursor,\n };\n } else if ('spans' in firstPage) {\n const newRows = (delta as ListTracesResponse).spans ?? [];\n updatedFirst = {\n ...firstPage,\n spans: sortRowsByStartedAtDesc([...newRows, ...(firstPage.spans ?? [])]),\n deltaCursor: nextCursor,\n };\n } else {\n return old;\n }\n\n return { ...old, pages: [updatedFirst, ...rest] };\n}\n\nexport interface UseTracesArgs extends TracesFilters {\n /** Optional overrides for the live-tail polling tunables. Any omitted fields fall back to the\n * built-in defaults; pass only what you want to change. */\n polling?: TracesPollingConfig;\n}\n\ninterface UseTracesReturn {\n data: { spans: LightSpanRecord[]; deltaCursor: string | undefined } | undefined;\n hasNextPage: boolean;\n isFetchingNextPage: boolean;\n fetchNextPage: () => void;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n setEndOfListElement: (node: HTMLDivElement | null) => void;\n isRefetching: boolean;\n autoRefetch: boolean;\n setAutoRefetch: (v: boolean) => void;\n recentlyAddedKeys: Set<string>;\n dataUpdatedAt: number;\n errorUpdatedAt: number;\n isFetching: boolean;\n isSuccess: boolean;\n fetchStatus: 'idle' | 'fetching' | 'paused';\n refetch: () => void;\n}\n\nexport const useTraces: (args: UseTracesArgs) => UseTracesReturn = ({\n filters,\n listMode = 'traces',\n polling = {},\n}: UseTracesArgs) => {\n const {\n deltaPollIntervalMs = DEFAULT_POLLING_CONFIG.deltaPollIntervalMs,\n deltaChaseIntervalMs = DEFAULT_POLLING_CONFIG.deltaChaseIntervalMs,\n deltaLimit = DEFAULT_POLLING_CONFIG.deltaLimit,\n pageModeRefetchIntervalMs = DEFAULT_POLLING_CONFIG.pageModeRefetchIntervalMs,\n page0StatusRefreshIntervalMs = DEFAULT_POLLING_CONFIG.page0StatusRefreshIntervalMs,\n idleGuardThresholdMs = DEFAULT_POLLING_CONFIG.idleGuardThresholdMs,\n minRefetchSpinMs = DEFAULT_POLLING_CONFIG.minRefetchSpinMs,\n deltaHighlightMs = DEFAULT_POLLING_CONFIG.deltaHighlightMs,\n } = polling;\n const client = useMastraClient();\n const queryClient = useQueryClient();\n const { inView: isEndOfListInView, setRef: setEndOfListElement } = useInView();\n\n const [deltaSupport, setDeltaSupport] = useState<DeltaSupport>(() => deltaSupportByClient.get(client) ?? 'unknown');\n const deltaUnsupported = deltaSupport === 'unsupported';\n\n // When false, all automatic polling stops: delta polls, status refresh,\n // idle-guard resets, and the page-mode fallback interval. Manual `resync`\n // still works. Session-scoped (no persistence across mounts).\n const [autoRefetch, setAutoRefetch] = useState(true);\n\n // Keys (`traceId:spanId`) of rows that arrived via the most recent delta\n // poll(s). The list view reads this to apply a temporary highlight class\n // for deltaHighlightMs, then they auto-expire. Resets on filter/listMode\n // change since a new query key spawns a fresh list.\n const [recentlyAddedKeys, setRecentlyAddedKeys] = useState<Set<string>>(() => new Set());\n useEffect(() => {\n setRecentlyAddedKeys(new Set());\n }, [listMode, filters]);\n\n const tracesQueryKey = ['traces', listMode, filters] as const;\n\n const query = useInfiniteQuery({\n queryKey: tracesQueryKey,\n queryFn: ({ pageParam }) =>\n fetchTracesFn({\n client,\n page: pageParam,\n perPage: TRACES_PER_PAGE,\n filters,\n listMode,\n }),\n initialPageParam: 0,\n getNextPageParam: getTracesNextPageParam,\n select: selectUniqueTraces,\n retry: false,\n // Disable polling on 403 to prevent flickering.\n // Fall back to page-mode polling only when delta isn't running.\n refetchInterval: q => {\n if (is403ForbiddenError(q.state.error)) return false;\n if (!autoRefetch) return false;\n return deltaUnsupported ? pageModeRefetchIntervalMs : false;\n },\n });\n\n const cursor = query.data?.deltaCursor;\n\n // If page 0 came back without a deltaCursor, the server/store doesn't\n // support delta polling. Pin the client to 'unsupported' so the infinite\n // query resumes page-mode polling and we stop probing.\n useEffect(() => {\n if (query.isSuccess && cursor === undefined && deltaSupport === 'unknown') {\n deltaSupportByClient.set(client, 'unsupported');\n setDeltaSupport('unsupported');\n }\n }, [query.isSuccess, cursor, deltaSupport, client]);\n\n const deltaQuery = useQuery({\n queryKey: ['traces-delta', listMode, filters] as const,\n queryFn: () => {\n const current = queryClient.getQueryData<InfiniteData<TracesPageResponse>>(tracesQueryKey)?.pages[0]?.deltaCursor;\n if (!current) return null;\n return fetchTracesFn({\n client,\n mode: 'delta',\n after: current,\n limit: deltaLimit,\n filters,\n listMode,\n });\n },\n enabled: !!cursor && !deltaUnsupported && autoRefetch,\n retry: false,\n refetchInterval: q => {\n if (q.state.error) return false;\n const data = q.state.data as ListTracesResponse | ListBranchesResponse | null | undefined;\n if (data?.delta?.hasMore) return deltaChaseIntervalMs;\n return deltaPollIntervalMs;\n },\n });\n\n // Merge new delta rows into the infinite-query cache. Also captures the\n // arrived keys into `recentlyAddedKeys` for deltaHighlightMs so the UI\n // can briefly distinguish them. The cleanup timer is intentionally NOT\n // tied to the effect lifecycle — if a newer delta arrives first, we still\n // want each prior batch to expire on its own schedule.\n useEffect(() => {\n const result = deltaQuery.data;\n if (!result) return;\n queryClient.setQueryData<InfiniteData<TracesPageResponse>>(tracesQueryKey, old =>\n mergeDeltaIntoPage0(old, result, listMode),\n );\n\n const newRows =\n listMode === 'branches' && 'branches' in result\n ? (result.branches ?? [])\n : 'spans' in result\n ? (result.spans ?? [])\n : [];\n if (newRows.length === 0) return;\n const keys = newRows.map(r => `${r.traceId}:${r.spanId ?? ''}`);\n setRecentlyAddedKeys(prev => {\n const next = new Set(prev);\n for (const k of keys) next.add(k);\n return next;\n });\n setTimeout(() => {\n setRecentlyAddedKeys(prev => {\n const next = new Set(prev);\n for (const k of keys) next.delete(k);\n return next;\n });\n }, deltaHighlightMs);\n // tracesQueryKey is a new array each render but its contents drive cache keying;\n // depending on its members (listMode/filters) is enough.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [deltaQuery.data, queryClient, listMode, filters, deltaHighlightMs]);\n\n // A 501 means the server is too old (or store doesn't support delta) — pin\n // 'unsupported' so the delta query disables and page-mode polling resumes.\n useEffect(() => {\n if (isHttp501(deltaQuery.error)) {\n deltaSupportByClient.set(client, 'unsupported');\n setDeltaSupport('unsupported');\n }\n }, [deltaQuery.error, client]);\n\n // Periodic page-0 refresh to surface status updates on visible rows\n // (running → success/error). Only runs while delta is the primary polling\n // mechanism; otherwise the infinite query's own refetchInterval covers it.\n const statusRefreshQuery = useQuery({\n queryKey: ['traces-status-refresh', listMode, filters] as const,\n queryFn: () =>\n fetchTracesFn({\n client,\n page: 0,\n perPage: TRACES_PER_PAGE,\n filters,\n listMode,\n }),\n enabled: !!cursor && !deltaUnsupported && autoRefetch,\n refetchInterval: page0StatusRefreshIntervalMs,\n refetchOnMount: false,\n retry: false,\n });\n\n useEffect(() => {\n const result = statusRefreshQuery.data;\n if (!result) return;\n queryClient.setQueryData<InfiniteData<TracesPageResponse>>(tracesQueryKey, old =>\n refreshPage0Rows(old, result, listMode),\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [statusRefreshQuery.data, queryClient, listMode, filters]);\n\n // Idle guard: when the tab returns from being hidden, check how long it's\n // been since the last successful poll. If past the threshold, reset the\n // infinite query so page 0 refetches and the cursor is re-seeded.\n const lastSuccessAtRef = useRef(0);\n useEffect(() => {\n const ts = Math.max(query.dataUpdatedAt, deltaQuery.dataUpdatedAt, statusRefreshQuery.dataUpdatedAt);\n if (ts > lastSuccessAtRef.current) {\n lastSuccessAtRef.current = ts;\n }\n }, [query.dataUpdatedAt, deltaQuery.dataUpdatedAt, statusRefreshQuery.dataUpdatedAt]);\n\n // Track autoRefetch in a ref so the visibility listener (attached once)\n // reads the current value without needing to re-attach.\n const autoRefetchRef = useRef(autoRefetch);\n useEffect(() => {\n autoRefetchRef.current = autoRefetch;\n }, [autoRefetch]);\n\n useEffect(() => {\n const handler = () => {\n if (document.visibilityState !== 'visible') return;\n if (!autoRefetchRef.current) return;\n if (!shouldResetAfterIdle(lastSuccessAtRef.current, Date.now(), idleGuardThresholdMs)) return;\n void queryClient.resetQueries({ queryKey: ['traces', listMode, filters] });\n };\n document.addEventListener('visibilitychange', handler);\n return () => document.removeEventListener('visibilitychange', handler);\n }, [queryClient, listMode, filters, idleGuardThresholdMs]);\n\n const { hasNextPage, isFetchingNextPage, fetchNextPage } = query;\n\n useEffect(() => {\n if (isEndOfListInView && hasNextPage && !isFetchingNextPage) {\n void fetchNextPage();\n }\n }, [isEndOfListInView, hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n // `isRefetching` aggregates every active fetch — page-mode (initial, next\n // page, manual resync, idle reset), the 60s page-0 status refresh, AND the\n // delta polls — so a spinner bound to it acts as a heartbeat indicator.\n //\n // Short polls (e.g. delta on localhost) can resolve in tens of ms — too\n // brief for `animate-spin` (1s/rotation) to register visually, and quick\n // enough that React may batch the start/finish transitions so we never\n // even observe `isFetching: true`. So we also watch every query's\n // data/errorUpdatedAt; any advance pulses `isRefetching` true for at least\n // minRefetchSpinMs, which is ~144° of rotation — clearly perceptible.\n const isFetchingAny = query.isFetching || statusRefreshQuery.isFetching || deltaQuery.isFetching;\n const lastActivityAt = Math.max(\n query.dataUpdatedAt,\n query.errorUpdatedAt,\n deltaQuery.dataUpdatedAt,\n deltaQuery.errorUpdatedAt,\n statusRefreshQuery.dataUpdatedAt,\n statusRefreshQuery.errorUpdatedAt,\n );\n const [pulse, setPulse] = useState(false);\n const prevActivityAtRef = useRef(lastActivityAt);\n useEffect(() => {\n if (lastActivityAt > prevActivityAtRef.current) {\n prevActivityAtRef.current = lastActivityAt;\n setPulse(true);\n const t = setTimeout(() => setPulse(false), minRefetchSpinMs);\n return () => clearTimeout(t);\n }\n }, [lastActivityAt, minRefetchSpinMs]);\n const isRefetching = isFetchingAny || pulse;\n\n return {\n ...query,\n setEndOfListElement,\n isRefetching,\n autoRefetch,\n setAutoRefetch,\n recentlyAddedKeys,\n };\n};\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\n\nexport const useTags = () => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['observability-tags'],\n queryFn: async () => {\n try {\n return await client.getTags();\n } catch {\n // Storage provider may not support tag discovery (e.g. LibSQL)\n return { tags: [] };\n }\n },\n select: data => data?.tags ?? [],\n retry: false,\n });\n};\n","import type { EntityType } from '@mastra/core/observability';\nimport { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\nimport { ROOT_ENTITY_TYPE_OPTIONS } from '@/domains/traces/trace-filters';\n\ntype UseEntityNamesOptions = {\n entityType?: EntityType;\n rootOnly?: boolean;\n};\n\nexport const useEntityNames = ({ entityType, rootOnly = false }: UseEntityNamesOptions = {}) => {\n const client = useMastraClient();\n\n // Mirror the queryFn branches so the cache key reflects what the server\n // actually returns. rootOnly only matters when entityType is not set; when\n // entityType is set, the query ignores rootOnly entirely.\n const queryKey = entityType\n ? ['observability-entity-names', 'by-type', entityType]\n : ['observability-entity-names', 'all', rootOnly ? 'root-only' : 'all-types'];\n\n return useQuery({\n queryKey,\n queryFn: async () => {\n try {\n if (entityType) {\n return await client.getEntityNames({ entityType });\n }\n\n if (!rootOnly) {\n return await client.getEntityNames();\n }\n\n const responses = await Promise.all(\n ROOT_ENTITY_TYPE_OPTIONS.map(option => client.getEntityNames({ entityType: option.entityType })),\n );\n\n return {\n names: Array.from(new Set(responses.flatMap(response => response?.names ?? []))).sort(),\n };\n } catch {\n return { names: [] };\n }\n },\n select: data => data?.names ?? [],\n retry: false,\n });\n};\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\n\nexport const useEnvironments = () => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['observability-environments'],\n queryFn: async () => {\n try {\n return await client.getEnvironments();\n } catch {\n return { environments: [] };\n }\n },\n select: data => data?.environments ?? [],\n retry: false,\n });\n};\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\n\nexport const useServiceNames = () => {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: ['observability-service-names'],\n queryFn: async () => {\n try {\n return await client.getServiceNames();\n } catch {\n return { serviceNames: [] };\n }\n },\n select: data => data?.serviceNames ?? [],\n retry: false,\n });\n};\n","import type { LightSpanRecord } from '@mastra/core/storage';\nimport { useMemo } from 'react';\nimport { formatHierarchicalSpans } from '../components/format-hierarchical-spans';\nimport { getAllSpanIds } from './get-all-span-ids';\n\n/**\n * Derives previous/next span navigation handlers from a trace's lightweight spans.\n * Returns undefined for handlers that are out of bounds so the consumer can render disabled UI.\n */\nexport function useTraceSpanNavigation(\n lightSpans: LightSpanRecord[] | undefined,\n featuredSpanId: string | null | undefined,\n onSpanChange: (spanId: string) => void,\n) {\n const timelineSpanIds = useMemo(() => getAllSpanIds(formatHierarchicalSpans(lightSpans ?? [])), [lightSpans]);\n\n const featuredSpanIdx = featuredSpanId ? timelineSpanIds.indexOf(featuredSpanId) : -1;\n\n const handlePreviousSpan = featuredSpanIdx > 0 ? () => onSpanChange(timelineSpanIds[featuredSpanIdx - 1]) : undefined;\n\n const handleNextSpan =\n featuredSpanIdx >= 0 && featuredSpanIdx < timelineSpanIds.length - 1\n ? () => onSpanChange(timelineSpanIds[featuredSpanIdx + 1])\n : undefined;\n\n return { handlePreviousSpan, handleNextSpan, timelineSpanIds };\n}\n","import { useMemo } from 'react';\n\n/**\n * Derives previous/next *trace* navigation handlers from the current traces list and the featured\n * row. Returns undefined for handlers that are out of bounds so the consumer can render\n * disabled UI. Mirrors the shape of `useTraceSpanNavigation`.\n *\n * In branches mode rows share a `traceId`, so the consumer can pass a `featuredSpanId` to\n * disambiguate the active row (and receive the new row's `spanId` on prev/next). In traces\n * mode `featuredSpanId` should be null/undefined; only the `traceId` is used.\n */\nexport function useTraceListNavigation<T extends { traceId: string; spanId?: string | null }>(\n traces: T[],\n featuredTraceId: string | undefined,\n featuredSpanId: string | null | undefined,\n onTraceChange: (traceId: string, spanId?: string) => void,\n): {\n featuredTraceIdx: number;\n handlePreviousTrace: (() => void) | undefined;\n handleNextTrace: (() => void) | undefined;\n} {\n const featuredTraceIdx = useMemo(\n () =>\n featuredTraceId\n ? traces.findIndex(\n t => t.traceId === featuredTraceId && (featuredSpanId == null || t.spanId === featuredSpanId),\n )\n : -1,\n [traces, featuredTraceId, featuredSpanId],\n );\n\n // Only forward a spanId on nav when the consumer indicated it's part of the row identity\n // (branches mode). In traces mode `featuredSpanId` is null, so prev/next just sets the new\n // `traceId` and the consumer's handler clears any stale spanId from the URL.\n const passSpanId = featuredSpanId != null;\n const navigateTo = (row: T) => onTraceChange(row.traceId, passSpanId ? (row.spanId ?? undefined) : undefined);\n\n const handlePreviousTrace = featuredTraceIdx > 0 ? () => navigateTo(traces[featuredTraceIdx - 1]) : undefined;\n\n const handleNextTrace =\n featuredTraceIdx >= 0 && featuredTraceIdx < traces.length - 1\n ? () => navigateTo(traces[featuredTraceIdx + 1])\n : undefined;\n\n return { featuredTraceIdx, handlePreviousTrace, handleNextTrace };\n}\n","import { useCallback, useMemo, useRef } from 'react';\nimport type { SpanTab, TraceDatePreset } from '../index';\nimport {\n ROOT_ENTITY_TYPE_OPTIONS,\n TRACE_ANCHOR_SPAN_ID_PARAM,\n TRACE_DATE_FROM_PARAM,\n TRACE_DATE_PRESET_PARAM,\n TRACE_DATE_PRESET_VALUES,\n TRACE_DATE_TO_PARAM,\n TRACE_PROPERTY_FILTER_FIELD_IDS,\n TRACE_LIST_MODE_PARAM,\n TRACE_LIST_MODE_VALUES,\n TRACE_PROPERTY_FILTER_PARAM_BY_FIELD,\n TRACE_ROOT_ENTITY_TYPE_PARAM,\n TRACE_STATUS_PARAM,\n TRACE_STATUS_VALUES,\n applyTracePropertyFilterTokens,\n getTracePropertyFilterTokens,\n} from '../trace-filters';\nimport type { EntityOptions, TraceListMode, TraceStatusFilter } from '../trace-filters';\nimport type { PropertyFilterToken } from '@/ds/components/PropertyFilter/types';\n\nconst TRACE_ID_PARAM = 'traceId';\nconst SPAN_ID_PARAM = 'spanId';\nconst TAB_PARAM = 'tab';\nconst SCORE_ID_PARAM = 'scoreId';\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\nconst PRESET_MS: Partial<Record<TraceDatePreset, number>> = {\n 'last-24h': DAY_MS,\n 'last-3d': 3 * DAY_MS,\n 'last-7d': 7 * DAY_MS,\n 'last-14d': 14 * DAY_MS,\n 'last-30d': 30 * DAY_MS,\n};\n\n/** Mutates `params` in place to drop the featured trace/span/tab/score selection.\n * Used whenever a filter changes — selection no longer makes sense in the new result set. */\nfunction clearSelectionParams(params: URLSearchParams) {\n params.delete(TRACE_ID_PARAM);\n params.delete(SPAN_ID_PARAM);\n params.delete(TRACE_ANCHOR_SPAN_ID_PARAM);\n params.delete(TAB_PARAM);\n params.delete(SCORE_ID_PARAM);\n}\n\n/** Minimal interface compatible with react-router's `setSearchParams`. */\nexport type SetURLSearchParamsLike = (\n next: URLSearchParams | ((prev: URLSearchParams) => URLSearchParams),\n options?: { replace?: boolean; preventScrollReset?: boolean; state?: unknown },\n) => void;\n\nexport interface UseTraceUrlStateOptions {\n /** Called after `handleRemoveAll` clears all filter URL params. Use this to reset page-local\n * UI state (e.g. a \"group by thread\" toggle) without wrapping the handler. */\n onRemoveAll?: () => void;\n}\n\nexport interface UseTraceUrlStateResult {\n // Raw search params passed through for convenience\n searchParams: URLSearchParams;\n setSearchParams: SetURLSearchParamsLike;\n\n // Date state (derived from URL)\n datePreset: TraceDatePreset;\n selectedDateFrom: Date | undefined;\n selectedDateTo: Date | undefined;\n /** Synchronously-updated ref of the latest preset. Used to ignore onDateChange callbacks\n * the date picker fires after a non-custom preset switch. */\n datePresetRef: React.MutableRefObject<TraceDatePreset>;\n\n // Selection state (derived from URL)\n traceIdParam: string | undefined;\n spanIdParam: string | undefined;\n /** Branch-mode only: the anchor span that defines the displayed subtree. Stable while the\n * user navigates between spans inside the panel (which only changes `spanIdParam`). */\n anchorSpanIdParam: string | undefined;\n spanTabParam: SpanTab | undefined;\n scoreIdParam: string | undefined;\n\n // Filter state (derived from URL)\n listMode: TraceListMode;\n selectedEntityOption: EntityOptions | undefined;\n selectedStatus: TraceStatusFilter | undefined;\n filterTokens: PropertyFilterToken[];\n\n // URL-modifying handlers\n /**\n * Selects a row. In traces mode pass just `traceId` (and optionally a `spanId` for an\n * initial span selection in the panel). In branches mode also pass `anchorSpanId` — the\n * branch identity, kept stable while the user navigates between spans inside the panel.\n * Branch rows are identified by (traceId, anchorSpanId); trace rows by traceId alone.\n */\n handleTraceClick: (traceId: string, spanId?: string, anchorSpanId?: string) => void;\n /** Convenience: clears the featured trace selection. Equivalent to `handleTraceClick('')`. */\n handleTraceClose: () => void;\n handleSpanChange: (spanId: string | null) => void;\n /** Convenience: clears the featured span selection. Equivalent to `handleSpanChange(null)`. */\n handleSpanClose: () => void;\n handleSpanTabChange: (tab: SpanTab) => void;\n /** Selects a span AND switches its panel tab in a single URL update. Use when both must change\n * from one interaction (e.g. \"Evaluate Trace\"). Calling `handleSpanChange` + `handleSpanTabChange`\n * separately races: each functional `setSearchParams` updater reads the same pre-update\n * `searchParams` snapshot, so the second navigation overwrites the first (last write wins) and one\n * of the two changes is lost on the first click. */\n handleSpanChangeWithTab: (spanId: string, tab: SpanTab) => void;\n handleScoreChange: (scoreId: string | null) => void;\n /** Switches the list view between traces and branches. Clears the current selection. */\n handleListModeChange: (mode: TraceListMode) => void;\n handleFilterTokensChange: (nextTokens: PropertyFilterToken[]) => void;\n handleDateChange: (value: Date | undefined, type: 'from' | 'to') => void;\n handleDatePresetChange: (preset: TraceDatePreset) => void;\n handleRemoveAll: () => void;\n\n /** Lower-level helper used by `handleClear`: writes a token set and clears the trace/span selection. */\n applyFilterTokens: (tokens: PropertyFilterToken[]) => void;\n}\n\n/**\n * Owns all URL-derived state and URL-modifying handlers for the traces page. Routing-agnostic —\n * pass `searchParams` and `setSearchParams` from whichever router the consumer uses.\n *\n * Stays focused on URL state: localStorage save/restore, filter discovery, and the error-view\n * short-circuit are intentionally NOT part of this hook so consumers can swap them independently.\n */\nexport function useTraceUrlState(\n searchParams: URLSearchParams,\n setSearchParams: SetURLSearchParamsLike,\n options?: UseTraceUrlStateOptions,\n): UseTraceUrlStateResult {\n const { onRemoveAll } = options ?? {};\n const datePreset = useMemo<TraceDatePreset>(() => {\n const value = searchParams.get(TRACE_DATE_PRESET_PARAM);\n return value && TRACE_DATE_PRESET_VALUES.has(value as TraceDatePreset) ? (value as TraceDatePreset) : 'last-24h';\n }, [searchParams]);\n\n const dateFromParamRaw = searchParams.get(TRACE_DATE_FROM_PARAM);\n const dateToParamRaw = searchParams.get(TRACE_DATE_TO_PARAM);\n\n const selectedDateFrom = useMemo(() => {\n if (datePreset === 'custom') {\n if (!dateFromParamRaw) return undefined;\n const parsed = new Date(dateFromParamRaw);\n return Number.isNaN(parsed.getTime()) ? undefined : parsed;\n }\n if (datePreset === 'all') return undefined;\n const ms = PRESET_MS[datePreset];\n return ms ? new Date(Date.now() - ms) : undefined;\n }, [datePreset, dateFromParamRaw]);\n\n const selectedDateTo = useMemo(() => {\n if (datePreset !== 'custom' || !dateToParamRaw) return undefined;\n const parsed = new Date(dateToParamRaw);\n return Number.isNaN(parsed.getTime()) ? undefined : parsed;\n }, [datePreset, dateToParamRaw]);\n\n // Track the latest preset synchronously so onDateChange callbacks that follow\n // a non-custom preset switch can be ignored (router setSearchParams captures\n // searchParams in its closure, so multiple synchronous calls would otherwise\n // clobber each other).\n const datePresetRef = useRef(datePreset);\n datePresetRef.current = datePreset;\n\n const traceIdParam = searchParams.get(TRACE_ID_PARAM) || undefined;\n const spanIdParam = searchParams.get(SPAN_ID_PARAM) || undefined;\n /** Branch-mode only: identifies which branch (anchor span) the panel is viewing. Stays put\n * while the user navigates between spans inside the panel (which only changes spanIdParam). */\n const anchorSpanIdParam = searchParams.get(TRACE_ANCHOR_SPAN_ID_PARAM) || undefined;\n const tabParam = searchParams.get(TAB_PARAM);\n const spanTabParam: SpanTab | undefined =\n tabParam === 'scoring'\n ? 'scoring'\n : tabParam === 'feedback'\n ? 'feedback'\n : tabParam === 'details'\n ? 'details'\n : undefined;\n const scoreIdParam = searchParams.get(SCORE_ID_PARAM) || undefined;\n\n const listMode = useMemo<TraceListMode>(() => {\n const value = searchParams.get(TRACE_LIST_MODE_PARAM);\n return value && TRACE_LIST_MODE_VALUES.has(value as TraceListMode) ? (value as TraceListMode) : 'traces';\n }, [searchParams]);\n const selectedEntityOption = useMemo(\n () => ROOT_ENTITY_TYPE_OPTIONS.find(option => option.entityType === searchParams.get(TRACE_ROOT_ENTITY_TYPE_PARAM)),\n [searchParams],\n );\n const selectedStatus = useMemo<TraceStatusFilter | undefined>(() => {\n const value = searchParams.get(TRACE_STATUS_PARAM);\n return value && TRACE_STATUS_VALUES.has(value as TraceStatusFilter) ? (value as TraceStatusFilter) : undefined;\n }, [searchParams]);\n const filterTokens = useMemo(() => getTracePropertyFilterTokens(searchParams), [searchParams]);\n\n const handleTraceClick = useCallback(\n (traceId: string, spanId?: string, anchorSpanId?: string) => {\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n if (traceId) {\n next.set(TRACE_ID_PARAM, traceId);\n } else {\n next.delete(TRACE_ID_PARAM);\n }\n if (spanId) {\n next.set(SPAN_ID_PARAM, spanId);\n } else {\n next.delete(SPAN_ID_PARAM);\n }\n if (anchorSpanId) {\n next.set(TRACE_ANCHOR_SPAN_ID_PARAM, anchorSpanId);\n } else {\n next.delete(TRACE_ANCHOR_SPAN_ID_PARAM);\n }\n next.delete(TAB_PARAM);\n next.delete(SCORE_ID_PARAM);\n return next;\n },\n { replace: true },\n );\n },\n [setSearchParams],\n );\n\n const handleTraceClose = useCallback(() => handleTraceClick(''), [handleTraceClick]);\n\n const handleSpanChange = useCallback(\n (spanId: string | null) => {\n const currentSpanId = searchParams.get(SPAN_ID_PARAM) || null;\n if (spanId === currentSpanId) return;\n\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n if (spanId) {\n next.set(SPAN_ID_PARAM, spanId);\n } else {\n next.delete(SPAN_ID_PARAM);\n }\n // Tab + score are per-span; they'd point at the previous span's context otherwise.\n next.delete(TAB_PARAM);\n next.delete(SCORE_ID_PARAM);\n return next;\n },\n { replace: true },\n );\n },\n [searchParams, setSearchParams],\n );\n\n const handleSpanClose = useCallback(() => handleSpanChange(null), [handleSpanChange]);\n\n const handleSpanTabChange = useCallback(\n (tab: SpanTab) => {\n const currentTab = searchParams.get(TAB_PARAM) || null;\n if (tab === currentTab) return;\n\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n if (tab && tab !== 'details') {\n next.set(TAB_PARAM, tab);\n } else {\n next.delete(TAB_PARAM);\n }\n next.delete(SCORE_ID_PARAM);\n return next;\n },\n { replace: true },\n );\n },\n [searchParams, setSearchParams],\n );\n\n const handleSpanChangeWithTab = useCallback(\n (spanId: string, tab: SpanTab) => {\n const nextTab = tab && tab !== 'details' ? tab : null;\n // No-op guard (same pattern as the sibling handlers): skip the navigation only when span,\n // tab AND score are already exactly what this call would produce.\n const isNoOp =\n spanId === (searchParams.get(SPAN_ID_PARAM) || null) &&\n nextTab === (searchParams.get(TAB_PARAM) || null) &&\n !searchParams.get(SCORE_ID_PARAM);\n if (isNoOp) return;\n\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n next.set(SPAN_ID_PARAM, spanId);\n if (nextTab) {\n next.set(TAB_PARAM, nextTab);\n } else {\n next.delete(TAB_PARAM);\n }\n next.delete(SCORE_ID_PARAM);\n return next;\n },\n { replace: true },\n );\n },\n [searchParams, setSearchParams],\n );\n\n const handleScoreChange = useCallback(\n (scoreId: string | null) => {\n const currentScoreId = searchParams.get(SCORE_ID_PARAM) || null;\n if (scoreId === currentScoreId) return;\n\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n if (scoreId) {\n next.set(SCORE_ID_PARAM, scoreId);\n } else {\n next.delete(SCORE_ID_PARAM);\n }\n return next;\n },\n { replace: true },\n );\n },\n [searchParams, setSearchParams],\n );\n\n const applyFilterTokens = useCallback(\n (tokens: PropertyFilterToken[]) => {\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n // applyTracePropertyFilterTokens wipes all filter params (including\n // rootEntityType / status) and re-adds them in `nextTokens` order so\n // URL insertion order == filter creation order.\n applyTracePropertyFilterTokens(next, tokens);\n clearSelectionParams(next);\n return next;\n },\n { replace: true },\n );\n },\n [setSearchParams],\n );\n\n const handleFilterTokensChange = applyFilterTokens;\n\n // Only relevant for 'custom' — the picker also fires onDateChange after a\n // non-custom preset switch, which we ignore to avoid racing URL updates.\n const handleDateChange = useCallback(\n (value: Date | undefined, type: 'from' | 'to') => {\n if (datePresetRef.current !== 'custom') return;\n const param = type === 'from' ? TRACE_DATE_FROM_PARAM : TRACE_DATE_TO_PARAM;\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n if (value) {\n next.set(param, value.toISOString());\n } else {\n next.delete(param);\n }\n clearSelectionParams(next);\n return next;\n },\n { replace: true },\n );\n },\n [setSearchParams],\n );\n\n const handleDatePresetChange = useCallback(\n (preset: TraceDatePreset) => {\n // Update ref synchronously so any onDateChange fired by the picker in the\n // same tick (for non-custom presets) sees the new value and skips.\n datePresetRef.current = preset;\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n if (preset === 'last-24h') {\n // Default — clear all date params.\n next.delete(TRACE_DATE_PRESET_PARAM);\n next.delete(TRACE_DATE_FROM_PARAM);\n next.delete(TRACE_DATE_TO_PARAM);\n } else if (preset === 'custom') {\n next.set(TRACE_DATE_PRESET_PARAM, 'custom');\n // Keep existing dateFrom/dateTo for the user to adjust.\n } else {\n // `last-*` or 'all' — only the preset is stored; dates are derived.\n next.set(TRACE_DATE_PRESET_PARAM, preset);\n next.delete(TRACE_DATE_FROM_PARAM);\n next.delete(TRACE_DATE_TO_PARAM);\n }\n clearSelectionParams(next);\n return next;\n },\n { replace: true },\n );\n },\n [setSearchParams],\n );\n\n const handleListModeChange = useCallback(\n (mode: TraceListMode) => {\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n if (mode === 'traces') {\n next.delete(TRACE_LIST_MODE_PARAM);\n } else {\n next.set(TRACE_LIST_MODE_PARAM, mode);\n }\n // Clear selection: rows from the previous mode don't map cleanly to the new mode.\n clearSelectionParams(next);\n return next;\n },\n { replace: true },\n );\n },\n [setSearchParams],\n );\n\n const handleRemoveAll = useCallback(() => {\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n next.delete(TRACE_LIST_MODE_PARAM);\n next.delete(TRACE_ROOT_ENTITY_TYPE_PARAM);\n next.delete(TRACE_STATUS_PARAM);\n for (const fieldId of TRACE_PROPERTY_FILTER_FIELD_IDS) {\n next.delete(TRACE_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId]);\n }\n clearSelectionParams(next);\n return next;\n },\n { replace: true },\n );\n onRemoveAll?.();\n }, [setSearchParams, onRemoveAll]);\n\n return {\n searchParams,\n setSearchParams,\n datePreset,\n selectedDateFrom,\n selectedDateTo,\n datePresetRef,\n traceIdParam,\n spanIdParam,\n anchorSpanIdParam,\n spanTabParam,\n scoreIdParam,\n listMode,\n selectedEntityOption,\n selectedStatus,\n filterTokens,\n handleTraceClick,\n handleTraceClose,\n handleSpanChange,\n handleSpanClose,\n handleSpanTabChange,\n handleSpanChangeWithTab,\n handleScoreChange,\n handleListModeChange,\n handleFilterTokensChange,\n handleDateChange,\n handleDatePresetChange,\n handleRemoveAll,\n applyFilterTokens,\n };\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n clearSavedTraceFilters,\n hasAnyTraceFilterParams,\n loadTraceFiltersFromStorage,\n saveTraceFiltersToStorage,\n} from '../trace-filters';\nimport type { SetURLSearchParamsLike } from './use-trace-url-state';\nimport { toast } from '@/lib/toast';\n\nconst DEFAULT_SAVED_MESSAGE = 'Trace filter settings saved.';\nconst DEFAULT_CLEARED_MESSAGE = 'Trace filter settings cleared.';\n\nexport interface TraceFilterPersistenceOptions {\n /** Override the localStorage key. Default: traces filters storage. */\n storageKey?: string;\n /** Toast text overrides; pass `false` to suppress the toast entirely. */\n messages?: {\n saved?: string | false;\n cleared?: string | false;\n };\n /** Skip the once-on-mount hydration from localStorage. Default: false (hydration runs). */\n skipHydration?: boolean;\n}\n\nexport interface UseTraceFilterPersistenceResult {\n /** True when localStorage has a previously saved filter set. */\n hasSavedFilters: boolean;\n /** Persist the current URL filter params to localStorage. */\n handleSave: () => void;\n /** Forget the saved filter set. */\n handleRemoveSaved: () => void;\n}\n\n/**\n * Owns the localStorage save/restore lifecycle for trace filters:\n * - tracks `hasSavedFilters`\n * - exposes `handleSave` / `handleRemoveSaved` (with toast feedback)\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 *\n * Pass `storageKey` to scope persistence (e.g. per-project). Pass `messages.{saved,cleared} = false`\n * to suppress the toast.\n */\nexport function useTraceFilterPersistence(\n searchParams: URLSearchParams,\n setSearchParams: SetURLSearchParamsLike,\n options?: TraceFilterPersistenceOptions,\n): UseTraceFilterPersistenceResult {\n const { storageKey, messages, skipHydration } = options ?? {};\n\n const [hasSavedFilters, setHasSavedFilters] = useState(() => loadTraceFiltersFromStorage(storageKey) !== null);\n\n const handleSave = useCallback(() => {\n saveTraceFiltersToStorage(searchParams, storageKey);\n setHasSavedFilters(true);\n const text = messages?.saved ?? DEFAULT_SAVED_MESSAGE;\n if (text !== false) toast.success(text);\n }, [searchParams, storageKey, messages?.saved]);\n\n const handleRemoveSaved = useCallback(() => {\n clearSavedTraceFilters(storageKey);\n setHasSavedFilters(false);\n const text = messages?.cleared ?? DEFAULT_CLEARED_MESSAGE;\n if (text !== false) toast.success(text);\n }, [storageKey, messages?.cleared]);\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 return { hasSavedFilters, handleSave, handleRemoveSaved };\n}\n","import type { EntityType } from '@mastra/core/observability';\nimport type { ReactNode } from 'react';\n\nexport type UISpan = {\n id: string;\n name: string;\n type: string;\n latency: number;\n startTime: string;\n endTime?: string;\n spans?: UISpan[];\n parentSpanId?: string | null;\n};\n\nexport type UISpanStyle = {\n icon?: ReactNode;\n color?: string;\n label?: string;\n typePrefix: string;\n};\n\n// -- Trace filtering types ----------------------------------------------------\n\nexport type EntityOptions =\n | { value: string; label: string; type: EntityType.AGENT }\n | { value: string; label: string; type: EntityType.WORKFLOW_RUN }\n | { value: string; label: string; type: 'all' };\n\nexport type TraceDatePreset = 'all' | 'last-24h' | 'last-3d' | 'last-7d' | 'last-14d' | 'last-30d' | 'custom';\n\n/** Canonical list of context field IDs used for trace filtering and value extraction */\nexport const CONTEXT_FIELD_IDS = [\n 'environment',\n 'serviceName',\n 'source',\n 'scope',\n 'userId',\n 'organizationId',\n 'resourceId',\n 'runId',\n 'sessionId',\n 'threadId',\n 'requestId',\n 'experimentId',\n 'spanType',\n 'entityName',\n 'parentEntityType',\n 'parentEntityId',\n 'parentEntityName',\n 'rootEntityType',\n 'rootEntityId',\n 'rootEntityName',\n] as const;\n","import { format } from 'date-fns';\nimport { ArrowDownIcon, ArrowRightIcon, ArrowUpIcon, ChevronsDownUpIcon, ChevronsUpDownIcon } from 'lucide-react';\nimport { Fragment, useState } from 'react';\nimport type { LogRecord } from '../types';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { DataDetailsPanel } from '@/ds/components/DataDetailsPanel';\nimport { cn } from '@/lib/utils';\n\nconst KV = DataDetailsPanel.KeyValueList;\n\nfunction toDate(value: Date | string): Date {\n return value instanceof Date ? value : new Date(value);\n}\n\nexport interface LogDetailsViewProps {\n log: LogRecord;\n onClose: () => void;\n onTraceClick?: (traceId: string) => void;\n onSpanClick?: (traceId: string, spanId: string) => void;\n onPrevious?: () => void;\n onNext?: () => void;\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n}\n\nexport function LogDetailsView({\n log,\n onClose,\n onTraceClick,\n onSpanClick,\n onPrevious,\n onNext,\n collapsed: controlledCollapsed,\n onCollapsedChange,\n}: LogDetailsViewProps) {\n const [internalCollapsed, setInternalCollapsed] = useState(false);\n const collapsed = controlledCollapsed ?? internalCollapsed;\n const setCollapsed = onCollapsedChange ?? setInternalCollapsed;\n const date = toDate(log.timestamp);\n\n return (\n <DataDetailsPanel collapsed={collapsed}>\n <DataDetailsPanel.Header>\n <DataDetailsPanel.Heading>\n Log <b>{format(date, 'MMM dd, HH:mm:ss.SSS')}</b>\n </DataDetailsPanel.Heading>\n <ButtonsGroup className=\"ml-auto shrink-0\">\n {onCollapsedChange && (\n <Button\n size=\"md\"\n tooltip={collapsed ? 'Expand panel' : 'Collapse panel'}\n onClick={() => setCollapsed(!collapsed)}\n >\n {collapsed ? <ChevronsUpDownIcon /> : <ChevronsDownUpIcon />}\n </Button>\n )}\n\n <ButtonsGroup spacing=\"close\">\n <Button size=\"md\" tooltip=\"Previous log\" onClick={onPrevious} disabled={!onPrevious}>\n <ArrowUpIcon />\n </Button>\n <Button size=\"md\" tooltip=\"Next log\" onClick={onNext} disabled={!onNext}>\n <ArrowDownIcon />\n </Button>\n </ButtonsGroup>\n\n <DataDetailsPanel.CloseButton onClick={onClose} />\n </ButtonsGroup>\n </DataDetailsPanel.Header>\n\n {!collapsed && (\n <DataDetailsPanel.Content>\n <p className=\"text-ui-md text-neutral4 font-mono wrap-break-word whitespace-pre-wrap\">{log.message}</p>\n\n {(log.traceId || log.spanId) && (\n <div className={cn('grid gap-2 my-8', '[&>button]:justify-between [&>button]:overflow-hidden')}>\n {log.traceId && (\n <ButtonsGroup spacing=\"close\" className=\"min-w-0 w-full\">\n <Button\n size=\"md\"\n className=\"min-w-0 flex-1 overflow-hidden\"\n onClick={() => onTraceClick?.(log.traceId!)}\n >\n <ArrowRightIcon />\n <span>Trace</span>\n <span className=\" ml-auto text-ui-sm text-neutral2 min-w-0 truncate\"># {log.traceId}</span>\n </Button>\n <CopyButton content={log.traceId!} size=\"md\" tooltip=\"Copy Trace ID to clipboard\" />\n </ButtonsGroup>\n )}\n {log.spanId && (\n <ButtonsGroup spacing=\"close\" className=\"min-w-0 w-full\">\n <Button\n size=\"md\"\n className=\"min-w-0 flex-1 overflow-hidden\"\n disabled={!log.traceId || !onSpanClick}\n onClick={() => log.traceId && onSpanClick?.(log.traceId, log.spanId!)}\n >\n <ArrowRightIcon />\n <span>Span</span>\n <span className=\" ml-auto text-ui-sm text-neutral2 min-w-0 truncate\"># {log.spanId}</span>\n </Button>\n <CopyButton content={log.spanId!} size=\"md\" tooltip=\"Copy Span ID to clipboard\" />\n </ButtonsGroup>\n )}\n </div>\n )}\n\n <KV className=\"mb-6\">\n {log.entityType && (\n <>\n <KV.Key>Entity Type</KV.Key>\n <KV.Value>{log.entityType}</KV.Value>\n </>\n )}\n {log.entityName && (\n <>\n <KV.Key>Entity Name</KV.Key>\n <KV.Value>{log.entityName}</KV.Value>\n </>\n )}\n {log.serviceName && (\n <>\n <KV.Key>Service</KV.Key>\n <KV.Value>{log.serviceName}</KV.Value>\n </>\n )}\n {log.environment && (\n <>\n <KV.Key>Environment</KV.Key>\n <KV.Value>{log.environment}</KV.Value>\n </>\n )}\n {log.source && (\n <>\n <KV.Key>Source</KV.Key>\n <KV.Value>{log.source}</KV.Value>\n </>\n )}\n {log.metadata && Object.keys(log.metadata).length > 0 && (\n <>\n {Object.entries(log.metadata).map(([key, value]) => (\n <Fragment key={key}>\n <KV.Key>{key}</KV.Key>\n <KV.Value>{String(value)}</KV.Value>\n </Fragment>\n ))}\n </>\n )}\n </KV>\n\n {log.data && Object.keys(log.data).length > 0 && (\n <DataDetailsPanel.CodeSection title=\"Data\" codeStr={JSON.stringify(log.data, null, 2)} className=\"mt-6\" />\n )}\n </DataDetailsPanel.Content>\n )}\n </DataDetailsPanel>\n );\n}\n","import { CircleSlashIcon } from 'lucide-react';\nimport { EmptyState } from '@/ds/components/EmptyState';\nimport { ErrorState } from '@/ds/components/ErrorState';\nimport { PermissionDenied } from '@/ds/components/PermissionDenied';\nimport { SessionExpired } from '@/ds/components/SessionExpired';\nimport {\n is401UnauthorizedError,\n is403ForbiddenError,\n isUnsupportedObservabilityOperationError,\n} from '@/lib/query-utils';\n\nexport interface LogsErrorContentProps {\n /** The error from a useLogs query. */\n error: unknown;\n /** Passed to PermissionDenied (usually 'logs'). */\n resource: string;\n /** Title shown on the generic ErrorState fallback. */\n errorTitle: string;\n}\n\n/**\n * Renders the appropriate fallback content for a logs-related query error:\n * `<SessionExpired />` for 401, `<PermissionDenied />` for 403, otherwise `<ErrorState />`.\n * Mirror of `TracesErrorContent` for the logs domain.\n */\nexport function LogsErrorContent({ error, resource, errorTitle }: LogsErrorContentProps) {\n if (is401UnauthorizedError(error)) return <SessionExpired />;\n if (is403ForbiddenError(error)) return <PermissionDenied resource={resource} />;\n if (isUnsupportedObservabilityOperationError(error, 'logs')) {\n return (\n <EmptyState\n iconSlot={<CircleSlashIcon />}\n titleSlot=\"Logs are not available with your current storage\"\n descriptionSlot=\"The configured observability storage provider does not support listing logs. Switch to a storage provider with logs support to view runtime logs in Studio.\"\n />\n );\n }\n const message = error instanceof Error ? error.message : undefined;\n return <ErrorState title={errorTitle} message={message ?? 'Unknown error'} />;\n}\n","import type { ReactNode } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface LogsLayoutProps {\n /** The logs list (left column). */\n listSlot: ReactNode;\n /** The log data panel (right column, top). When null/undefined, the whole right column collapses. */\n logPanelSlot?: ReactNode;\n /** The trace data panel (right column, middle). Only rendered when truthy. */\n tracePanelSlot?: ReactNode;\n /** The span data panel (right column, bottom). Only rendered when truthy. */\n spanPanelSlot?: ReactNode;\n /** When the log panel is collapsed, the right column's grid-rows squash the log row to `auto`. */\n logCollapsed?: boolean;\n}\n\n/**\n * Pure 2-column layout shell for the logs page. Owns no state and fetches no data — pass slots in.\n * Right-column row template adapts based on which panels are present and whether the log panel is\n * collapsed.\n */\nexport function LogsLayout({ listSlot, logPanelSlot, tracePanelSlot, spanPanelSlot, logCollapsed }: LogsLayoutProps) {\n const hasSidePanel = !!logPanelSlot;\n\n return (\n <div\n className={cn('grid h-full min-h-0 gap-4 items-start', hasSidePanel ? 'grid-cols-[1fr_1fr]' : 'grid-cols-[1fr]')}\n >\n {listSlot}\n\n {hasSidePanel && (\n <div\n className={cn(\n 'grid gap-4 h-full overflow-auto',\n tracePanelSlot && spanPanelSlot\n ? logCollapsed\n ? 'grid-rows-[auto_1fr_1fr]'\n : 'grid-rows-[1fr_1fr_1fr]'\n : tracePanelSlot\n ? logCollapsed\n ? 'grid-rows-[auto_1fr]'\n : 'grid-rows-[1fr_1fr]'\n : logCollapsed\n ? 'grid-rows-[auto]'\n : 'grid-rows-[1fr]',\n )}\n >\n {logPanelSlot}\n {tracePanelSlot}\n {spanPanelSlot}\n </div>\n )}\n </div>\n );\n}\n","import { useVirtualizer } from '@tanstack/react-virtual';\nimport { useEffect, useRef } from 'react';\nimport type { LogRecord } from '../types';\nimport { LogsDataList, LogsDataListSkeleton } from '@/ds/components/LogsDataList';\n\n// Fixed widths on non-flex columns prevent track shifts as the virtualizer swaps rows in/out.\nconst COLUMNS = '6rem 9rem 5rem 10rem minmax(8rem,1fr) minmax(8rem,1fr)';\n\nconst ROW_HEIGHT = 36;\nconst OVERSCAN = 8;\n\nexport interface LogsListViewProps {\n logs: LogRecord[];\n isLoading?: boolean;\n isFetchingNextPage?: boolean;\n hasNextPage?: boolean;\n setEndOfListElement?: (element: HTMLDivElement | null) => void;\n /** Stable per-render id for each log — used for React keys and for matching against `featuredLogId`.\n * Build with `useLogsListNavigation`. */\n logIdMap: Map<LogRecord, string>;\n /** Currently featured/selected log — its row gets the highlighted background. */\n featuredLogId?: string | null;\n /** Called when a row is clicked. The current toggle + trace-sync logic is the consumer's call. */\n onLogClick: (log: LogRecord) => void;\n}\n\n/**\n * Virtualized presentational list. Renders only the visible window of logs via\n * TanStack Virtual, sandwiched between top/bottom Spacers that preserve total\n * scroll height. Owns no state and fetches no data.\n */\nexport function LogsListView({\n logs,\n isLoading,\n isFetchingNextPage,\n hasNextPage,\n setEndOfListElement,\n logIdMap,\n featuredLogId,\n onLogClick,\n}: LogsListViewProps) {\n const scrollRef = useRef<HTMLDivElement | null>(null);\n\n const virtualizer = useVirtualizer({\n count: logs.length,\n getScrollElement: () => scrollRef.current,\n estimateSize: () => ROW_HEIGHT,\n overscan: OVERSCAN,\n });\n\n // Reset scroll to top whenever a fresh query resolves (filter / date range change).\n // `isLoading` only flips on initial fetches — `fetchNextPage` keeps it `false`, so this\n // effect doesn't fire during pagination.\n //\n // Why the manual scroll event: when the skeleton-vs-list branch swaps in the new scroll\n // container, it mounts at `scrollTop = 0`. The virtualizer rebinds its listener but\n // doesn't re-read `scrollTop`, so it keeps the stale `scrollOffset` from the previous\n // element. `scrollToOffset(0)` no-ops because the new element is already at 0 (no scroll\n // event fires). Dispatching a synthetic `scroll` forces the virtualizer's handler to\n // read the fresh `scrollTop` and recompute `virtualItems` with `paddingTop = 0`.\n const wasLoadingRef = useRef(isLoading);\n useEffect(() => {\n if (wasLoadingRef.current && !isLoading) {\n scrollRef.current?.dispatchEvent(new Event('scroll'));\n }\n wasLoadingRef.current = isLoading;\n }, [isLoading]);\n\n if (isLoading) {\n return <LogsDataListSkeleton columns={COLUMNS} />;\n }\n\n const virtualItems = virtualizer.getVirtualItems();\n const totalSize = virtualizer.getTotalSize();\n const paddingTop = virtualItems[0]?.start ?? 0;\n const paddingBottom =\n virtualItems.length > 0 ? Math.max(0, totalSize - (virtualItems[virtualItems.length - 1]?.end ?? 0)) : 0;\n\n return (\n <LogsDataList columns={COLUMNS} variant=\"striped\" scrollRef={scrollRef} className=\"min-w-0\">\n <LogsDataList.Top>\n <LogsDataList.TopCell>Date</LogsDataList.TopCell>\n <LogsDataList.TopCell>Time</LogsDataList.TopCell>\n <LogsDataList.TopCell>Level</LogsDataList.TopCell>\n <LogsDataList.TopCell>Entity</LogsDataList.TopCell>\n <LogsDataList.TopCell>Message</LogsDataList.TopCell>\n <LogsDataList.TopCell>Data</LogsDataList.TopCell>\n </LogsDataList.Top>\n\n {logs.length === 0 ? (\n <LogsDataList.NoMatch message=\"No logs match your search\" />\n ) : (\n <>\n <LogsDataList.Spacer height={paddingTop} />\n {virtualItems.map(vi => {\n const log = logs[vi.index];\n if (!log) return null;\n const id = logIdMap.get(log);\n // Defensive: consumer is expected to build `logIdMap` from the same `logs` list\n // (via `useLogsListNavigation`), but if they drift we'd rather drop the row than\n // ship a missing-key warning and broken selection highlighting.\n if (!id) return null;\n const isFeatured = id === featuredLogId;\n\n return (\n <LogsDataList.RowButton\n key={id}\n ref={virtualizer.measureElement}\n data-index={vi.index}\n onClick={() => onLogClick(log)}\n featured={isFeatured}\n variant={log.level === 'error' || log.level === 'fatal' ? 'error' : 'default'}\n >\n <LogsDataList.DateCell timestamp={log.timestamp} />\n <LogsDataList.TimeCell timestamp={log.timestamp} />\n <LogsDataList.LevelCell level={log.level} />\n <LogsDataList.EntityCell entityType={log.entityType} entityName={log.entityName} />\n <LogsDataList.MessageCell message={log.message} />\n <LogsDataList.DataCell data={log.data} />\n </LogsDataList.RowButton>\n );\n })}\n <LogsDataList.Spacer height={paddingBottom} />\n </>\n )}\n <LogsDataList.NextPageLoading\n isLoading={isFetchingNextPage}\n hasMore={hasNextPage}\n setEndOfListElement={setEndOfListElement}\n />\n </LogsDataList>\n );\n}\n","import { 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\nexport interface LogsToolbarProps {\n onClear?: () => void;\n onRemoveAll?: () => void;\n onSave?: () => void;\n onRemoveSaved?: () => void;\n isLoading?: boolean;\n filterFields: PropertyFilterField[];\n filterTokens: PropertyFilterToken[];\n onFilterTokensChange: (tokens: PropertyFilterToken[]) => void;\n autoFocusFilterFieldId?: string;\n}\n\nexport function LogsToolbar({\n onClear,\n onRemoveAll,\n onSave,\n onRemoveSaved,\n isLoading,\n filterFields,\n filterTokens,\n onFilterTokensChange,\n autoFocusFilterFieldId,\n}: LogsToolbarProps) {\n const hasActiveFilters = filterTokens.length > 0;\n const hasNonDefaultFilter = filterTokens.some(token => isNonDefaultFilter(token, filterFields));\n\n return (\n <div className={cn('grid grid-cols-[1fr_auto] gap-3 items-start')}>\n <PropertyFilterApplied\n fields={filterFields}\n tokens={filterTokens}\n onTokensChange={onFilterTokensChange}\n disabled={isLoading}\n autoFocusFieldId={autoFocusFilterFieldId}\n />\n\n {hasActiveFilters && (\n <PropertyFilterActions\n disabled={isLoading}\n onClear={hasNonDefaultFilter ? onClear : undefined}\n onRemoveAll={onRemoveAll}\n onSave={onSave}\n onRemoveSaved={onRemoveSaved}\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","import { format } from 'date-fns';\nimport { CircleSlashIcon, ExternalLinkIcon } from 'lucide-react';\nimport type { LogsDatePreset } from '../log-filters';\nimport { Button } from '@/ds/components/Button';\nimport { EmptyState } from '@/ds/components/EmptyState';\n\nconst PRESET_LABELS: Record<Exclude<LogsDatePreset, 'all' | 'custom'>, string> = {\n 'last-24h': 'the last 24 hours',\n 'last-3d': 'the last 3 days',\n 'last-7d': 'the last 7 days',\n 'last-14d': 'the last 14 days',\n 'last-30d': 'the last 30 days',\n};\n\nexport interface NoLogsInfoProps {\n datePreset?: LogsDatePreset;\n dateFrom?: Date;\n dateTo?: Date;\n}\n\nconst DATE_FORMAT = 'MMM d, yyyy HH:mm';\n\nconst LEVEL_TIP = 'Pick a wider range or lower the logging level — verbose entries (debug, info) may be filtered out.';\n\nfunction describeRange({ datePreset, dateFrom, dateTo }: NoLogsInfoProps): { title: string; description: string } {\n if (datePreset && datePreset !== 'all' && datePreset !== 'custom') {\n return {\n title: `No logs for ${PRESET_LABELS[datePreset]}`,\n description: LEVEL_TIP,\n };\n }\n if (dateFrom && dateTo) {\n return {\n title: `No logs between ${format(dateFrom, DATE_FORMAT)} and ${format(dateTo, DATE_FORMAT)}`,\n description: LEVEL_TIP,\n };\n }\n if (dateFrom) {\n return {\n title: `No logs since ${format(dateFrom, DATE_FORMAT)}`,\n description: LEVEL_TIP,\n };\n }\n return {\n title: 'No logs yet',\n description: 'Logs will appear here once agents, workflows, or tools are executed.',\n };\n}\n\nexport const NoLogsInfo = ({ datePreset, dateFrom, dateTo }: NoLogsInfoProps = {}) => {\n const { title, description } = describeRange({ datePreset, dateFrom, dateTo });\n return (\n <div className=\"flex h-full items-center justify-center\">\n <EmptyState\n iconSlot={<CircleSlashIcon />}\n titleSlot={title}\n descriptionSlot={description}\n actionSlot={\n <Button\n variant=\"ghost\"\n as=\"a\"\n href=\"https://mastra.ai/en/docs/observability/logging\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Logging Documentation <ExternalLinkIcon />\n </Button>\n }\n />\n </div>\n );\n};\n","import type { ListLogsArgs, ListLogsResponse } from '@mastra/core/storage';\nimport { useMastraClient } from '@mastra/react';\nimport { useInfiniteQuery } from '@tanstack/react-query';\nimport { useEffect } from 'react';\n\nimport type { LogRecord } from '../types';\nimport { useInView } from '@/hooks/use-in-view';\nimport { isUnsupportedObservabilityOperationError } from '@/lib/query-utils';\n\ninterface UseLogsReturn {\n data: LogRecord[] | undefined;\n hasNextPage: boolean;\n isFetchingNextPage: boolean;\n fetchNextPage: () => void;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n setEndOfListElement: (node: HTMLDivElement | null) => void;\n}\n\nconst LOGS_PER_PAGE = 20;\nconst LOGS_REFETCH_INTERVAL_MS = 10000;\n\nexport interface LogsFilters {\n filters?: ListLogsArgs['filters'];\n}\n\nfunction getNextPageParam(lastPage: ListLogsResponse | undefined, _allPages: unknown, lastPageParam: number) {\n if (lastPage?.pagination?.hasMore) {\n return lastPageParam + 1;\n }\n return undefined;\n}\n\n/** Deduplicates logs across loaded pages. Offset-based pagination duplicates rows at the page\n * boundary whenever new logs are inserted between sequential `fetchNextPage` calls — without\n * this filter the duplicates produce duplicate React keys and chaotic virtualizer offsets.\n * Falls back to the full serialized record when `logId` is absent so logs that happen to\n * share `(timestamp, message, data)` but differ in other fields aren't collapsed. */\nfunction selectLogs(data: { pages: ListLogsResponse[] }) {\n const seen = new Set<string>();\n const result = [];\n for (const page of data.pages) {\n for (const log of page.logs ?? []) {\n const key = log.logId ?? JSON.stringify(log);\n if (seen.has(key)) continue;\n seen.add(key);\n result.push(log);\n }\n }\n return result;\n}\n\nexport function getLogsRefetchInterval(query: { state: { error: unknown } }) {\n if (isUnsupportedObservabilityOperationError(query.state.error, 'logs')) {\n return false;\n }\n return LOGS_REFETCH_INTERVAL_MS;\n}\n\nexport const useLogs: (props?: LogsFilters) => UseLogsReturn = ({ filters }: LogsFilters = {}) => {\n const client = useMastraClient();\n const { inView: isEndOfListInView, setRef: setEndOfListElement } = useInView();\n\n const query = useInfiniteQuery<ListLogsResponse, Error, ReturnType<typeof selectLogs>, readonly unknown[], number>({\n queryKey: ['logs', filters],\n queryFn: ({ pageParam }) =>\n client.listLogsVNext({\n pagination: { page: pageParam, perPage: LOGS_PER_PAGE },\n filters,\n orderBy: { field: 'timestamp', direction: 'DESC' },\n }),\n initialPageParam: 0,\n getNextPageParam,\n select: selectLogs,\n retry: false,\n refetchInterval: getLogsRefetchInterval,\n });\n\n const { hasNextPage, isFetchingNextPage, fetchNextPage, data, isLoading, isError, error } = query;\n\n useEffect(() => {\n if (isEndOfListInView && hasNextPage && !isFetchingNextPage) {\n void fetchNextPage();\n }\n }, [isEndOfListInView, hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n return { data, hasNextPage, isFetchingNextPage, fetchNextPage, isLoading, isError, error, setEndOfListElement };\n};\n","import { useCallback, useMemo, useRef } from 'react';\nimport type { SetURLSearchParamsLike } from '../../traces/hooks/use-trace-url-state';\nimport {\n LOGS_DATE_FROM_PARAM,\n LOGS_DATE_PRESET_PARAM,\n LOGS_DATE_PRESET_VALUES,\n LOGS_DATE_TO_PARAM,\n LOGS_PROPERTY_FILTER_FIELD_IDS,\n LOGS_PROPERTY_FILTER_PARAM_BY_FIELD,\n LOGS_ROOT_ENTITY_TYPE_OPTIONS,\n LOGS_ROOT_ENTITY_TYPE_PARAM,\n applyLogsPropertyFilterTokens,\n getLogsPropertyFilterTokens,\n} from '../log-filters';\nimport type { LogsDatePreset, LogsEntityOptions } from '../log-filters';\nimport type { PropertyFilterToken } from '@/ds/components/PropertyFilter/types';\n\nconst LOG_PARAM = 'logId';\nconst TRACE_PARAM = 'traceId';\nconst SPAN_PARAM = 'spanId';\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\nconst PRESET_MS: Partial<Record<LogsDatePreset, number>> = {\n 'last-24h': DAY_MS,\n 'last-3d': 3 * DAY_MS,\n 'last-7d': 7 * DAY_MS,\n 'last-14d': 14 * DAY_MS,\n 'last-30d': 30 * DAY_MS,\n};\n\n/** Mutates `params` in place to drop the featured log/trace/span selection.\n * Used whenever a filter changes — selection no longer makes sense in the new result set. */\nfunction clearSelectionParams(params: URLSearchParams) {\n params.delete(LOG_PARAM);\n params.delete(TRACE_PARAM);\n params.delete(SPAN_PARAM);\n}\n\nexport interface LogsFeaturedIds {\n logId?: string | null;\n traceId?: string | null;\n spanId?: string | null;\n}\n\nexport interface UseLogsUrlStateOptions {\n /** Called after `handleRemoveAll` clears all filter URL params. */\n onRemoveAll?: () => void;\n}\n\nexport interface UseLogsUrlStateResult {\n searchParams: URLSearchParams;\n setSearchParams: SetURLSearchParamsLike;\n\n datePreset: LogsDatePreset;\n selectedDateFrom: Date | undefined;\n selectedDateTo: Date | undefined;\n datePresetRef: React.MutableRefObject<LogsDatePreset>;\n\n featuredLogId: string | null;\n featuredTraceId: string | null;\n featuredSpanId: string | null;\n\n selectedEntityOption: LogsEntityOptions | undefined;\n filterTokens: PropertyFilterToken[];\n\n /** Partial update of the featured log/trace/span selection. Omitted keys are left as-is. */\n handleFeaturedChange: (ids: LogsFeaturedIds) => void;\n handleFilterTokensChange: (nextTokens: PropertyFilterToken[]) => void;\n handleDateChange: (value: Date | undefined, type: 'from' | 'to') => void;\n handleDatePresetChange: (preset: LogsDatePreset) => void;\n handleRemoveAll: () => void;\n\n /** Lower-level helper used by `handleClear`: writes a token set and clears the log/trace/span selection. */\n applyFilterTokens: (tokens: PropertyFilterToken[]) => void;\n}\n\n/**\n * Owns all URL-derived state and URL-modifying handlers for the logs page. Routing-agnostic —\n * pass `searchParams` and `setSearchParams` from whichever router the consumer uses.\n */\nexport function useLogsUrlState(\n searchParams: URLSearchParams,\n setSearchParams: SetURLSearchParamsLike,\n options?: UseLogsUrlStateOptions,\n): UseLogsUrlStateResult {\n const { onRemoveAll } = options ?? {};\n\n const datePreset = useMemo<LogsDatePreset>(() => {\n const value = searchParams.get(LOGS_DATE_PRESET_PARAM);\n return value && LOGS_DATE_PRESET_VALUES.has(value as LogsDatePreset) ? (value as LogsDatePreset) : 'last-24h';\n }, [searchParams]);\n\n const dateFromParamRaw = searchParams.get(LOGS_DATE_FROM_PARAM);\n const dateToParamRaw = searchParams.get(LOGS_DATE_TO_PARAM);\n\n const selectedDateFrom = useMemo(() => {\n if (datePreset === 'custom') {\n if (!dateFromParamRaw) return undefined;\n const parsed = new Date(dateFromParamRaw);\n return Number.isNaN(parsed.getTime()) ? undefined : parsed;\n }\n if (datePreset === 'all') return undefined;\n const ms = PRESET_MS[datePreset];\n return ms ? new Date(Date.now() - ms) : undefined;\n }, [datePreset, dateFromParamRaw]);\n\n const selectedDateTo = useMemo(() => {\n if (datePreset !== 'custom' || !dateToParamRaw) return undefined;\n const parsed = new Date(dateToParamRaw);\n return Number.isNaN(parsed.getTime()) ? undefined : parsed;\n }, [datePreset, dateToParamRaw]);\n\n const datePresetRef = useRef(datePreset);\n datePresetRef.current = datePreset;\n\n const featuredLogId = searchParams.get(LOG_PARAM);\n const featuredTraceId = searchParams.get(TRACE_PARAM);\n const featuredSpanId = searchParams.get(SPAN_PARAM);\n\n const selectedEntityOption = useMemo(\n () =>\n LOGS_ROOT_ENTITY_TYPE_OPTIONS.find(option => option.entityType === searchParams.get(LOGS_ROOT_ENTITY_TYPE_PARAM)),\n [searchParams],\n );\n\n const filterTokens = useMemo(() => getLogsPropertyFilterTokens(searchParams), [searchParams]);\n\n const handleFeaturedChange = useCallback(\n (ids: LogsFeaturedIds) => {\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n for (const [field, value] of Object.entries(ids)) {\n const param = field === 'logId' ? LOG_PARAM : field === 'traceId' ? TRACE_PARAM : SPAN_PARAM;\n if (value) {\n next.set(param, value);\n } else {\n next.delete(param);\n }\n }\n return next;\n },\n { replace: true },\n );\n },\n [setSearchParams],\n );\n\n const applyFilterTokens = useCallback(\n (tokens: PropertyFilterToken[]) => {\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n applyLogsPropertyFilterTokens(next, tokens);\n clearSelectionParams(next);\n return next;\n },\n { replace: true },\n );\n },\n [setSearchParams],\n );\n\n const handleFilterTokensChange = applyFilterTokens;\n\n const handleDateChange = useCallback(\n (value: Date | undefined, type: 'from' | 'to') => {\n if (datePresetRef.current !== 'custom') return;\n const param = type === 'from' ? LOGS_DATE_FROM_PARAM : LOGS_DATE_TO_PARAM;\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n if (value) {\n next.set(param, value.toISOString());\n } else {\n next.delete(param);\n }\n clearSelectionParams(next);\n return next;\n },\n { replace: true },\n );\n },\n [setSearchParams],\n );\n\n const handleDatePresetChange = useCallback(\n (preset: LogsDatePreset) => {\n datePresetRef.current = preset;\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n if (preset === 'last-24h') {\n next.delete(LOGS_DATE_PRESET_PARAM);\n next.delete(LOGS_DATE_FROM_PARAM);\n next.delete(LOGS_DATE_TO_PARAM);\n } else if (preset === 'custom') {\n next.set(LOGS_DATE_PRESET_PARAM, 'custom');\n } else {\n next.set(LOGS_DATE_PRESET_PARAM, preset);\n next.delete(LOGS_DATE_FROM_PARAM);\n next.delete(LOGS_DATE_TO_PARAM);\n }\n clearSelectionParams(next);\n return next;\n },\n { replace: true },\n );\n },\n [setSearchParams],\n );\n\n const handleRemoveAll = useCallback(() => {\n setSearchParams(\n prev => {\n const next = new URLSearchParams(prev);\n next.delete(LOGS_ROOT_ENTITY_TYPE_PARAM);\n for (const fieldId of LOGS_PROPERTY_FILTER_FIELD_IDS) {\n next.delete(LOGS_PROPERTY_FILTER_PARAM_BY_FIELD[fieldId]);\n }\n next.delete(LOGS_DATE_PRESET_PARAM);\n next.delete(LOGS_DATE_FROM_PARAM);\n next.delete(LOGS_DATE_TO_PARAM);\n clearSelectionParams(next);\n return next;\n },\n { replace: true },\n );\n onRemoveAll?.();\n }, [setSearchParams, onRemoveAll]);\n\n return useMemo(\n () => ({\n searchParams,\n setSearchParams,\n datePreset,\n selectedDateFrom,\n selectedDateTo,\n datePresetRef,\n featuredLogId,\n featuredTraceId,\n featuredSpanId,\n selectedEntityOption,\n filterTokens,\n handleFeaturedChange,\n handleFilterTokensChange,\n handleDateChange,\n handleDatePresetChange,\n handleRemoveAll,\n applyFilterTokens,\n }),\n [\n searchParams,\n setSearchParams,\n datePreset,\n selectedDateFrom,\n selectedDateTo,\n datePresetRef,\n featuredLogId,\n featuredTraceId,\n featuredSpanId,\n selectedEntityOption,\n filterTokens,\n handleFeaturedChange,\n handleFilterTokensChange,\n handleDateChange,\n handleDatePresetChange,\n handleRemoveAll,\n applyFilterTokens,\n ],\n );\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { SetURLSearchParamsLike } from '../../traces/hooks/use-trace-url-state';\nimport {\n clearSavedLogsFilters,\n hasAnyLogsFilterParams,\n loadLogsFiltersFromStorage,\n saveLogsFiltersToStorage,\n} from '../log-filters';\nimport { toast } from '@/lib/toast';\n\nconst DEFAULT_SAVED_MESSAGE = 'Filters setting for Logs saved';\nconst DEFAULT_CLEARED_MESSAGE = 'Filters setting for Logs cleared up';\n\nexport interface LogsFilterPersistenceOptions {\n /** Override the localStorage key. Default: logs filters storage. */\n storageKey?: string;\n /** Toast text overrides; pass `false` to suppress the toast entirely. */\n messages?: {\n saved?: string | false;\n cleared?: string | false;\n };\n /** Skip the once-on-mount hydration from localStorage. Default: false. */\n skipHydration?: boolean;\n}\n\nexport interface UseLogsFilterPersistenceResult {\n hasSavedFilters: boolean;\n handleSave: () => void;\n handleRemoveSaved: () => void;\n}\n\n/**\n * Owns the localStorage save/restore lifecycle for logs filters. Mirrors\n * `useTraceFilterPersistence` — same pattern, different storage key default.\n */\nexport function useLogsFilterPersistence(\n searchParams: URLSearchParams,\n setSearchParams: SetURLSearchParamsLike,\n options?: LogsFilterPersistenceOptions,\n): UseLogsFilterPersistenceResult {\n const { storageKey, messages, skipHydration } = options ?? {};\n\n const [hasSavedFilters, setHasSavedFilters] = useState(() => loadLogsFiltersFromStorage(storageKey) !== null);\n\n const handleSave = useCallback(() => {\n saveLogsFiltersToStorage(searchParams, storageKey);\n setHasSavedFilters(true);\n const text = messages?.saved ?? DEFAULT_SAVED_MESSAGE;\n if (text !== false) toast.success(text);\n }, [searchParams, storageKey, messages?.saved]);\n\n const handleRemoveSaved = useCallback(() => {\n clearSavedLogsFilters(storageKey);\n setHasSavedFilters(false);\n const text = messages?.cleared ?? DEFAULT_CLEARED_MESSAGE;\n if (text !== false) toast.success(text);\n }, [storageKey, messages?.cleared]);\n\n const hydratedRef = useRef(false);\n useEffect(() => {\n if (skipHydration) return;\n if (hydratedRef.current) return;\n hydratedRef.current = true;\n if (hasAnyLogsFilterParams(searchParams)) return;\n const saved = loadLogsFiltersFromStorage(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 return { hasSavedFilters, handleSave, handleRemoveSaved };\n}\n","import { useCallback, useMemo } from 'react';\nimport type { LogRecord } from '../types';\nimport type { LogsFeaturedIds } from './use-logs-url-state';\n\nfunction hashCode(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) - hash + str.charCodeAt(i)) | 0;\n }\n return (hash >>> 0).toString(36);\n}\n\n/** Prefer the storage-assigned `logId`. When absent, derive an id from immutable content fields\n * (`timestamp + message + data`) so the same log lands on the same id across polls regardless\n * of list order or insertions. Two logs without `logId` that hash identically share an id —\n * acceptable because the URL-driven selection still resolves deterministically. */\nfunction buildLogIds(logs: LogRecord[]): Map<LogRecord, string> {\n const ids = new Map<LogRecord, string>();\n for (const log of logs) {\n if (log.logId) {\n ids.set(log, log.logId);\n continue;\n }\n const ts = log.timestamp instanceof Date ? log.timestamp.toISOString() : log.timestamp;\n ids.set(log, hashCode(`${ts}${log.message ?? ''}${log.data ? JSON.stringify(log.data) : ''}`));\n }\n return ids;\n}\n\nexport interface UseLogsListNavigationResult {\n /** Map each log in the list to its derived id. Pass to `<LogsListView logIdMap={...}>`. */\n logIdMap: Map<LogRecord, string>;\n /** Look up a log's id (undefined if not in the list). */\n getLogId: (log: LogRecord) => string | undefined;\n /** The currently featured log resolved from `featuredLogId`, or null. */\n featuredLog: LogRecord | null;\n /** Click handler that flips featured selection with toggle behavior, and — when a trace panel is\n * open — syncs the trace panel to the new log's trace. Pass to `<LogsListView onLogClick={...}>`. */\n handleLogClick: (log: LogRecord) => void;\n /** Undefined when at the start of the list (disable the prev button). */\n handlePreviousLog: (() => void) | undefined;\n /** Undefined when at the end of the list (disable the next button). */\n handleNextLog: (() => void) | undefined;\n}\n\n/**\n * Derives id mapping + featured log + prev/next/click handlers for a logs list. Stateless — only\n * reads from the inputs and calls `onFeaturedChange` on selection changes.\n */\nexport function useLogsListNavigation(\n logs: LogRecord[],\n featuredLogId: string | null,\n onFeaturedChange: (ids: LogsFeaturedIds) => void,\n featuredTraceId?: string | null,\n): UseLogsListNavigationResult {\n const logIdMap = useMemo(() => buildLogIds(logs), [logs]);\n\n const idToLog = useMemo(() => {\n const m = new Map<string, { log: LogRecord; idx: number }>();\n for (let i = 0; i < logs.length; i++) {\n const id = logIdMap.get(logs[i]);\n if (id) m.set(id, { log: logs[i], idx: i });\n }\n return m;\n }, [logs, logIdMap]);\n\n const entry = featuredLogId ? idToLog.get(featuredLogId) : undefined;\n const featuredLogIdx = entry?.idx ?? -1;\n const featuredLog = featuredLogIdx >= 0 ? logs[featuredLogIdx] : null;\n\n const getLogId = useCallback((log: LogRecord) => logIdMap.get(log), [logIdMap]);\n\n const handleLogClick = useCallback(\n (log: LogRecord) => {\n const id = logIdMap.get(log);\n if (!id) return;\n if (featuredLogId === id) {\n onFeaturedChange({ logId: null });\n return;\n }\n if (featuredTraceId) {\n onFeaturedChange({ logId: id, traceId: log.traceId ?? null, spanId: null });\n } else {\n onFeaturedChange({ logId: id });\n }\n },\n [logIdMap, featuredLogId, featuredTraceId, onFeaturedChange],\n );\n\n const handlePreviousLog =\n featuredLogIdx > 0\n ? () => {\n const prevLog = logs[featuredLogIdx - 1];\n const id = logIdMap.get(prevLog)!;\n if (featuredTraceId) {\n onFeaturedChange({ logId: id, traceId: prevLog.traceId ?? null, spanId: null });\n } else {\n onFeaturedChange({ logId: id });\n }\n }\n : undefined;\n\n const handleNextLog =\n featuredLogIdx >= 0 && featuredLogIdx < logs.length - 1\n ? () => {\n const nextLog = logs[featuredLogIdx + 1];\n const id = logIdMap.get(nextLog)!;\n if (featuredTraceId) {\n onFeaturedChange({ logId: id, traceId: nextLog.traceId ?? null, spanId: null });\n } else {\n onFeaturedChange({ logId: id });\n }\n }\n : undefined;\n\n return {\n logIdMap,\n getLogId,\n featuredLog,\n handleLogClick,\n handlePreviousLog,\n handleNextLog,\n };\n}\n","import { BrainIcon } from 'lucide-react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { Checkbox } from '../../../ds/components/Checkbox';\nimport { CodeDiff } from '../../../ds/components/CodeDiff';\nimport { EmptyState } from '../../../ds/components/EmptyState';\nimport { Skeleton } from '../../../ds/components/Skeleton';\nimport { cn } from '../../../lib/utils';\nimport type { OMHistoryRecord } from '../types';\n\ntype ParsedItem = {\n text: string;\n time: string | null;\n priority: 'high' | 'medium' | 'low' | 'complete' | null;\n children: ParsedItem[];\n};\n\ntype ParsedSection = {\n title: string;\n relativeTime: string | null;\n items: ParsedItem[];\n};\n\nfunction formatObservationTime(time: string | null) {\n if (!time) return null;\n const match = time.match(/^(\\d{1,2}):(\\d{2})$/);\n if (!match) return time;\n const [, hours, minutes] = match;\n const hour = Number(hours);\n const suffix = hour >= 12 ? 'PM' : 'AM';\n const normalizedHour = hour % 12 || 12;\n return `${normalizedHour}:${minutes} ${suffix}`;\n}\n\nfunction getPriorityFromEmoji(emoji?: string): ParsedItem['priority'] {\n if (emoji === '🔴') return 'high';\n if (emoji === '🟡') return 'medium';\n if (emoji === '🟢') return 'low';\n if (emoji === '✅') return 'complete';\n return null;\n}\n\nfunction priorityClasses(priority: ParsedItem['priority'], nested: boolean) {\n if (nested) {\n return {\n card: 'bg-transparent border-transparent',\n text: 'text-neutral3',\n time: 'text-icon3',\n };\n }\n switch (priority) {\n case 'high':\n return {\n card: 'border-purple-400/30 bg-purple-500/10',\n text: 'text-neutral6',\n time: 'text-purple-200/80',\n };\n case 'medium':\n return {\n card: 'border-blue-400/30 bg-blue-500/10',\n text: 'text-neutral6',\n time: 'text-blue-200/80',\n };\n case 'low':\n return {\n card: 'border-emerald-400/30 bg-emerald-500/10',\n text: 'text-neutral6',\n time: 'text-emerald-200/80',\n };\n case 'complete':\n return {\n card: 'border-green-400/30 bg-green-500/10',\n text: 'text-neutral6',\n time: 'text-green-200/80',\n };\n default:\n return {\n card: 'border-border1 bg-surface2',\n text: 'text-neutral6',\n time: 'text-icon3',\n };\n }\n}\n\nfunction parseItem(line: string): ParsedItem | null {\n const trimmed = line.trim();\n if (!trimmed) return null;\n if (trimmed.startsWith('* ->') || trimmed.startsWith('->')) {\n const text = trimmed.replace(/^\\*?\\s*->\\s*/, '').trim();\n return text ? { text, time: null, priority: null, children: [] } : null;\n }\n if (trimmed.startsWith('-')) {\n const text = trimmed.replace(/^-\\s*/, '').trim();\n return text ? { text, time: null, priority: null, children: [] } : null;\n }\n const match = trimmed.match(/^\\*\\s*(🔴|🟡|🟢|✅)?\\s*(?:\\((\\d{1,2}:\\d{2})\\))?\\s*(.+)$/);\n if (match) {\n const [, p, t, text] = match;\n return { text: text.trim(), time: t ?? null, priority: getPriorityFromEmoji(p), children: [] };\n }\n return { text: trimmed, time: null, priority: null, children: [] };\n}\n\nfunction parseObservations(raw: string): ParsedSection[] {\n const obsMatch = raw.match(/<observations>\\s*([\\s\\S]*?)\\s*<\\/observations>/);\n const content = (obsMatch ? obsMatch[1] : raw).trim();\n if (!content) return [];\n const lines = content.split('\\n');\n const sections: ParsedSection[] = [];\n let current: ParsedSection | null = null;\n let lastRoot: ParsedItem | null = null;\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n const dateMatch = trimmed.match(/^Date:\\s*(.+?)(?:\\s*\\(([^)]+)\\))?$/);\n if (dateMatch) {\n current = { title: dateMatch[1].trim(), relativeTime: dateMatch[2]?.trim() ?? null, items: [] };\n sections.push(current);\n lastRoot = null;\n continue;\n }\n if (!current) {\n current = { title: 'Recent', relativeTime: null, items: [] };\n sections.push(current);\n }\n const indent = line.match(/^(\\s*)/)?.[1].length ?? 0;\n const isNested = indent >= 2 && (trimmed.startsWith('* ->') || trimmed.startsWith('->') || trimmed.startsWith('-'));\n const item = parseItem(line);\n if (!item) continue;\n if (isNested && lastRoot) {\n lastRoot.children.push(item);\n continue;\n }\n current.items.push(item);\n lastRoot = item;\n }\n return sections;\n}\n\nfunction ObservationItems({ items, nested = false }: { items: ParsedItem[]; nested?: boolean }) {\n return (\n <div className={nested ? 'space-y-2 border-l border-border1 pl-4' : 'space-y-3'}>\n {items.map((item, i) => {\n const styles = priorityClasses(item.priority, nested);\n return (\n <div key={`${item.text.slice(0, 20)}-${i}`} className=\"space-y-2\">\n <div className=\"flex items-start gap-3\">\n <div className=\"w-12 shrink-0 pt-2 text-right\">\n {item.time && (\n <span className={`font-mono text-ui-xs ${styles.time}`}>{formatObservationTime(item.time)}</span>\n )}\n </div>\n <div className={cn('min-w-0 flex-1 rounded-md border px-3 py-2', styles.card)}>\n <p className={cn('whitespace-pre-wrap break-words text-sm leading-6', styles.text)}>{item.text}</p>\n {item.children.length > 0 && (\n <div className=\"mt-3\">\n <ObservationItems items={item.children} nested />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction ObservationContent({ observations }: { observations: string }) {\n const sections = useMemo(() => parseObservations(observations), [observations]);\n if (sections.length === 0) {\n return <p className=\"italic text-xs text-icon3\">Initialized</p>;\n }\n return (\n <div className=\"space-y-5\">\n {sections.map((section, i) => (\n <section key={`${section.title}-${i}`} className=\"space-y-3\">\n <div className=\"flex items-baseline justify-between gap-3 border-b border-border1 pb-2\">\n <div className=\"min-w-0\">\n <h3 className=\"text-xs font-medium text-neutral6\">{section.title}</h3>\n {section.relativeTime && <p className=\"text-ui-xs text-icon3\">{section.relativeTime}</p>}\n </div>\n </div>\n <ObservationItems items={section.items} />\n </section>\n ))}\n </div>\n );\n}\n\nfunction ObservationHistoryPanel({\n records,\n selectedRecordId,\n onSelectRecord,\n}: {\n records: OMHistoryRecord[];\n selectedRecordId: string | null;\n onSelectRecord: (id: string | null) => void;\n}) {\n if (records.length <= 1) return null;\n\n return (\n <div className=\"border-l border-border1 min-w-[180px] w-[200px] flex flex-col overflow-hidden\">\n <div className=\"border-b border-border1 px-4 py-2\">\n <p className=\"text-sm font-normal text-neutral6\">History</p>\n </div>\n <div className=\"flex-1 overflow-y-auto\">\n {records.map(record => {\n const isSelected = record.id === selectedRecordId;\n return (\n <button\n key={record.id}\n type=\"button\"\n className={cn(\n 'w-full cursor-pointer border-l-2 border-l-transparent px-3 py-2 text-left truncate text-xs text-icon3 transition-all hover:bg-surface3/50',\n isSelected && 'bg-surface3/50 border-l-accent1',\n )}\n onClick={() => onSelectRecord(record.id)}\n >\n {record.activeObservations || (\n <span className=\"italic text-icon3\">\n {record.isObserving || record.isReflecting ? 'Processing\\u2026' : 'Initialized'}\n </span>\n )}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport interface ObservationDetailViewProps {\n records: OMHistoryRecord[];\n selectedRecordId: string | null;\n onSelectRecord: (id: string | null) => void;\n isLoading?: boolean;\n}\n\nexport function ObservationDetailView({\n records,\n selectedRecordId,\n onSelectRecord,\n isLoading,\n}: ObservationDetailViewProps) {\n const [showDiff, setShowDiff] = useState(false);\n\n const sorted = useMemo(\n () => [...records].sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()),\n [records],\n );\n\n const selected = selectedRecordId ? sorted.find(r => r.id === selectedRecordId) : sorted[sorted.length - 1];\n const selectedIndex = selected ? sorted.findIndex(r => r.id === selected.id) : -1;\n const previousRecord = selectedIndex > 0 ? sorted[selectedIndex - 1] : null;\n\n useEffect(() => {\n if (!selectedRecordId && sorted.length > 0) {\n onSelectRecord(sorted[sorted.length - 1].id);\n }\n }, [selectedRecordId, sorted, onSelectRecord]);\n\n if (isLoading) {\n return (\n <div className=\"p-4 space-y-4\">\n <Skeleton className=\"h-6 w-40\" />\n <Skeleton className=\"h-32 w-full\" />\n <Skeleton className=\"h-32 w-full\" />\n </div>\n );\n }\n\n if (!selected) {\n return (\n <div className=\"flex h-full items-center justify-center\">\n <EmptyState\n iconSlot={<BrainIcon className=\"size-4\" />}\n titleSlot=\"No observations\"\n descriptionSlot=\"No observational memory snapshots available for this thread.\"\n />\n </div>\n );\n }\n\n const activeObservations = typeof selected.activeObservations === 'string' ? selected.activeObservations : '';\n\n return (\n <div className=\"flex h-full w-full overflow-hidden\">\n {/* Main observation content */}\n <div className=\"flex min-w-0 flex-1 flex-col overflow-hidden\">\n {previousRecord && (\n <div className=\"border-b border-border1 px-4 py-2\">\n <div className=\"flex items-start justify-end gap-3\">\n <label className=\"flex cursor-pointer items-center gap-1.5\">\n <Checkbox checked={showDiff} onCheckedChange={v => setShowDiff(v === true)} />\n <span className=\"text-xs text-icon3\">Show diff</span>\n </label>\n </div>\n </div>\n )}\n\n <div data-testid=\"observation-detail-body\" className=\"flex-1 overflow-y-auto p-4\">\n {showDiff && previousRecord ? (\n <CodeDiff\n codeA={typeof previousRecord.activeObservations === 'string' ? previousRecord.activeObservations : ''}\n codeB={activeObservations}\n />\n ) : activeObservations ? (\n <ObservationContent observations={activeObservations} />\n ) : (\n <p className=\"italic text-xs text-icon3\">\n {selected.isObserving || selected.isReflecting ? 'Processing…' : 'Initialized'}\n </p>\n )}\n </div>\n </div>\n\n {/* History sidebar */}\n <ObservationHistoryPanel records={sorted} selectedRecordId={selected.id} onSelectRecord={onSelectRecord} />\n </div>\n );\n}\n","export function formatCompactTokens(value: number): string {\n if (value === 0) return '0';\n const k = value / 1000;\n const decimals = k < 0.1 ? 2 : 1;\n const formatted = k.toFixed(decimals);\n return formatted.replace(/\\.0+$/, '').replace(/(\\.\\d*[1-9])0$/, '$1');\n}\n","import { formatCompactTokens } from './thread-context-progress-utils';\n\ninterface ThreadContextProgressProps {\n messageTokens?: number;\n messageThreshold?: number;\n memoryTokens?: number;\n memoryThreshold?: number;\n /** Label for the second (memory-toned) bar. Defaults to \"Memory\". */\n memoryLabel?: string;\n}\n\nfunction ProgressBar({\n label,\n value,\n max,\n tone,\n}: {\n label: string;\n value: number;\n max: number;\n tone: 'message' | 'memory';\n}) {\n const percent = Math.max(0, Math.min(100, (value / max) * 100));\n const toneClass = tone === 'message' ? 'bg-blue-500/80' : 'bg-violet-500/80';\n\n return (\n <div className=\"min-w-0 flex-1\">\n <div className=\"mb-1 flex items-center justify-between gap-2 font-mono text-ui-xs text-icon3\">\n <span className=\"uppercase tracking-wide text-icon6\">{label}</span>\n <span className=\"tabular-nums text-icon3\">\n {formatCompactTokens(value)}/{formatCompactTokens(max)}k\n </span>\n </div>\n <div className=\"h-1.5 overflow-hidden rounded-full bg-white/[0.08]\">\n <div className={`h-full rounded-full ${toneClass}`} style={{ width: `${percent}%` }} />\n </div>\n </div>\n );\n}\n\nexport function ThreadContextProgress({\n messageTokens,\n messageThreshold,\n memoryTokens,\n memoryThreshold,\n memoryLabel = 'Memory',\n}: ThreadContextProgressProps) {\n const showMessages = messageTokens != null && messageThreshold != null;\n const showMemory = memoryTokens != null && memoryThreshold != null;\n\n if (!showMessages && !showMemory) {\n return null;\n }\n\n return (\n <div className=\"border-b border-border1 px-3 py-2\">\n <div className=\"flex flex-col gap-2 sm:flex-row\">\n {showMessages ? (\n <ProgressBar label=\"Messages\" value={messageTokens} max={messageThreshold} tone=\"message\" />\n ) : null}\n {showMemory ? (\n <ProgressBar label={memoryLabel} value={memoryTokens} max={memoryThreshold} tone=\"memory\" />\n ) : null}\n </div>\n </div>\n );\n}\n","export interface TDomain {\n tMin: number;\n tMax: number;\n}\n\nexport function parseUTC(ts: string): number {\n if (/[Zz+-]\\d{0,4}$/.test(ts.trim())) return new Date(ts).getTime();\n return new Date(ts.trim().replace(' ', 'T') + 'Z').getTime();\n}\n\nexport function timestampsToTDomain(timestamps: string[]): TDomain {\n if (timestamps.length === 0) return { tMin: 0, tMax: 1 };\n\n let min = Infinity;\n let max = -Infinity;\n\n for (const ts of timestamps) {\n const t = parseUTC(ts);\n if (t < min) min = t;\n if (t > max) max = t;\n }\n\n if (min === max) return { tMin: min, tMax: min + 1 };\n\n return { tMin: min, tMax: max };\n}\n\nexport function toT(isoString: string, domain: TDomain): number {\n const t = parseUTC(isoString);\n return (t - domain.tMin) / (domain.tMax - domain.tMin);\n}\n\nexport function tToTimestamp(t: number, domain: TDomain): Date {\n return new Date(domain.tMin + t * (domain.tMax - domain.tMin));\n}\n\nexport function formatTimeDisplay(date: Date): string {\n const day = String(date.getUTCDate()).padStart(2, '0');\n const month = String(date.getUTCMonth() + 1).padStart(2, '0');\n const h = String(date.getUTCHours()).padStart(2, '0');\n const m = String(date.getUTCMinutes()).padStart(2, '0');\n const s = String(date.getUTCSeconds()).padStart(2, '0');\n return `${day}/${month} ${h}:${m}:${s}`;\n}\n","import type { OMHistoryRecord } from '../types';\nimport type { TDomain } from './timeline';\nimport { parseUTC, tToTimestamp } from './timeline';\n\n/** Converts a normalized timeline coordinate (0–1) into an epoch ms cursor. */\nexport function tToTimestampMs(t: number, domain: TDomain): number {\n return tToTimestamp(t, domain).getTime();\n}\n\nexport function getObservationTimestamp(record: OMHistoryRecord): string {\n const d = record.lastObservedAt ?? record.updatedAt;\n return typeof d === 'string' ? d : new Date(d).toISOString();\n}\n\n/** Epoch-ms timeline position of an OM record (lastObservedAt ?? updatedAt). */\nexport function getObservationTimestampMs(record: OMHistoryRecord): number {\n return parseUTC(getObservationTimestamp(record));\n}\n\n/**\n * Returns the id of the OM record whose observation time is at or just before\n * the replay cursor (ms epoch). Returns null when there is no such record.\n */\nexport function findRecordIdAtOrBefore(records: OMHistoryRecord[], cursorMs: number | null): string | null {\n if (cursorMs == null || records.length === 0) return null;\n\n const sorted = records\n .map(record => ({ id: record.id, t: parseUTC(getObservationTimestamp(record)) }))\n .toSorted((a, b) => a.t - b.t);\n\n let matchId: string | null = null;\n for (const entry of sorted) {\n if (entry.t <= cursorMs) {\n matchId = entry.id;\n } else {\n break;\n }\n }\n\n return matchId;\n}\n","import { RotateCcw } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Area,\n AreaChart,\n ComposedChart,\n ReferenceLine,\n ResponsiveContainer,\n Scatter,\n ScatterChart,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\n\nimport { Button } from '../../../ds/components/Button';\nimport type { ExtractedOmMarker } from '../lib/extract-markers';\nimport { tToTimestampMs } from '../lib/replay-selection';\nimport type { TDomain } from '../lib/timeline';\nimport { formatTimeDisplay, toT, tToTimestamp } from '../lib/timeline';\nimport type { MemoryMessage, OMHistoryRecord } from '../types';\n\nexport interface ZoomRange {\n left: number;\n right: number;\n}\n\ninterface FlameGraphProps {\n omRecords: OMHistoryRecord[];\n markers: ExtractedOmMarker[];\n messages: MemoryMessage[];\n tDomain: TDomain;\n observationThreshold?: number;\n reflectionThreshold?: number;\n onSelectTimestamp?: (timestamp: number | null) => void;\n /**\n * Controlled zoom range (epoch ms). When provided together with\n * `onZoomRangeChange`, the caller owns the range and the graph becomes a\n * controlled component; otherwise the range is managed internally.\n */\n zoomRange?: ZoomRange;\n onZoomRangeChange?: (range: ZoomRange) => void;\n}\n\ntype RechartsClickState = { activeLabel?: string | number } | null | undefined;\n\nconst MSG_COLOR = 'var(--color-green-500, #22c55e)';\nconst OBS_COLOR = '#f59e0b';\nconst REFLECT_COLOR = '#ec4899';\n\nfunction getObservationTimestamp(record: OMHistoryRecord): string {\n const d = record.lastObservedAt ?? record.updatedAt;\n return typeof d === 'string' ? d : new Date(d).toISOString();\n}\n\nfunction toContextData(records: OMHistoryRecord[], markers: ExtractedOmMarker[], domain: TDomain) {\n const fromRecords = records.map(r => ({\n ts: String(getObservationTimestamp(r)),\n pendingMessageTokens: r.pendingMessageTokens,\n }));\n const fromMarkers = markers\n .filter(m => m.pendingTokens != null)\n .map(m => ({\n ts: m.timestamp,\n pendingMessageTokens: m.pendingTokens!,\n }));\n return [...fromRecords, ...fromMarkers]\n .sort((a, b) => a.ts.localeCompare(b.ts))\n .map(d => ({ t: toT(d.ts, domain), pendingMessageTokens: d.pendingMessageTokens }));\n}\n\nfunction toActiveObservationData(records: OMHistoryRecord[], markers: ExtractedOmMarker[], domain: TDomain) {\n const points = [\n ...records.map(record => ({\n ts: String(getObservationTimestamp(record)),\n observationTokenCount: record.observationTokenCount,\n })),\n ...markers\n .filter(marker => marker.type === 'status' && marker.observationTokens != null)\n .map(marker => ({\n ts: marker.timestamp,\n observationTokenCount: marker.observationTokens!,\n })),\n ].sort((a, b) => a.ts.localeCompare(b.ts));\n\n let runningTotal = 0;\n return points.map(point => {\n runningTotal = Math.max(runningTotal, point.observationTokenCount);\n return { t: toT(point.ts, domain), observationTokenCount: runningTotal };\n });\n}\n\nfunction toBufferedObservationData(markers: ExtractedOmMarker[], domain: TDomain) {\n const points = markers\n .filter(\n marker => marker.observationTokens != null && (marker.type === 'buffering-end' || marker.type === 'activation'),\n )\n .map(marker => ({\n ts: marker.timestamp,\n bufferedObservationTokenCount:\n marker.type === 'activation' ? -marker.observationTokens! : marker.observationTokens!,\n }))\n .sort((a, b) => a.ts.localeCompare(b.ts));\n\n let runningTotal = 0;\n return points.map(point => {\n runningTotal = Math.max(0, runningTotal + point.bufferedObservationTokenCount);\n return { t: toT(point.ts, domain), bufferedObservationTokenCount: runningTotal };\n });\n}\n\nfunction toEventData(records: OMHistoryRecord[], domain: TDomain) {\n return [...records]\n .sort((a, b) => String(getObservationTimestamp(a)).localeCompare(String(getObservationTimestamp(b))))\n .map(r => ({ t: toT(String(getObservationTimestamp(r)), domain), event: 1 }));\n}\n\nfunction toMessageData(messages: MemoryMessage[], domain: TDomain) {\n return [...messages]\n .sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime())\n .map(m => ({\n t: toT(new Date(m.createdAt).toISOString(), domain),\n event: 1,\n role: m.role,\n }));\n}\n\nfunction TimeAxis({ domain }: { domain: TDomain }) {\n const ticks = [0, 0.25, 0.5, 0.75, 1];\n return (\n <div className=\"grid grid-cols-[6rem_1fr] items-center\">\n <p className=\"flex items-center self-stretch border-r border-border1/50 pl-3 text-ui-xs font-medium text-icon3\">\n Time\n </p>\n <div className=\"flex justify-between px-1 py-1.5 font-mono text-ui-xs text-icon3\">\n {ticks.map(t => (\n <span key={t}>{formatTimeDisplay(tToTimestamp(t, domain))}</span>\n ))}\n </div>\n </div>\n );\n}\n\nfunction FlameTooltip({\n active,\n payload,\n domain,\n showValue,\n}: {\n active?: boolean;\n payload?: Array<{ value: unknown; name: string; payload?: { t?: number } }>;\n domain?: TDomain;\n showValue?: boolean;\n}) {\n if (!active || !payload?.length) return null;\n const t = payload[0]?.payload?.t;\n const time = domain != null && t != null ? formatTimeDisplay(tToTimestamp(t, domain)) : null;\n const visibleEntries = payload.filter(entry => entry.name !== 't' && entry.name !== 'time' && entry.value != null);\n\n if (showValue) {\n return (\n <div className=\"flex flex-col gap-0.5 rounded border border-border1 bg-surface3 px-2 py-1.5 font-mono text-ui-xs shadow\">\n {time && (\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-icon3\">time</span>\n <span className=\"text-neutral6\">{time}</span>\n </div>\n )}\n {visibleEntries.map(entry => (\n <div key={entry.name} className=\"flex items-center justify-between gap-3\">\n <span className=\"text-icon3\">{entry.name}</span>\n <span className=\"text-neutral6\">\n {typeof entry.value === 'number' ? Math.round(entry.value).toLocaleString() : String(entry.value)}\n </span>\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div className=\"rounded border border-border1 bg-surface3 px-2 py-1 font-mono text-ui-xs shadow\">\n {time && <span className=\"text-neutral6\">{time}</span>}\n </div>\n );\n}\n\ninterface AreaRowProps {\n label: string;\n data: Array<{ t: number; [k: string]: unknown }>;\n dataKey: string;\n color: string;\n gradientId: string;\n domain: TDomain;\n zoomDomain: [number, number];\n threshold?: number;\n}\n\nfunction AreaRow({ label, data, dataKey, color, gradientId, domain, zoomDomain, threshold }: AreaRowProps) {\n const maxValue = Math.max(0, ...data.map(d => Number(d[dataKey]) || 0));\n const yMax = threshold != null ? Math.max(maxValue, threshold) : undefined;\n\n return (\n <div className=\"relative grid grid-cols-[6rem_1fr] items-center border-b border-border1/50 hover:z-10\">\n <p className=\"flex items-center self-stretch border-r border-border1/50 pl-3 text-ui-xs font-medium text-icon3\">\n {label}\n </p>\n <div>\n <ResponsiveContainer width=\"100%\" height={32}>\n <AreaChart data={data} margin={{ top: 0, right: 0, bottom: 0, left: 0 }}>\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity={0.35} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0.03} />\n </linearGradient>\n </defs>\n <XAxis dataKey=\"t\" type=\"number\" domain={zoomDomain} allowDataOverflow hide />\n <YAxis type=\"number\" domain={yMax != null ? [0, yMax] : undefined} hide />\n <Tooltip\n content={<FlameTooltip domain={domain} showValue />}\n cursor={{ stroke: 'rgba(255,255,255,0.08)' }}\n />\n <Area\n type=\"linear\"\n dataKey={dataKey}\n stroke={color}\n strokeWidth={1}\n strokeOpacity={0.6}\n fill={`url(#${gradientId})`}\n isAnimationActive={false}\n />\n {threshold != null && (\n <ReferenceLine y={threshold} stroke={color} strokeDasharray=\"4 3\" strokeOpacity={0.4} />\n )}\n </AreaChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\ninterface EventRowProps {\n label: string;\n data: Array<{ t: number; event: number; [k: string]: unknown }>;\n color: string;\n height?: number;\n domain: TDomain;\n zoomDomain: [number, number];\n}\n\nfunction EventRow({ label, data, color, height = 32, domain, zoomDomain }: EventRowProps) {\n return (\n <div className=\"relative grid grid-cols-[6rem_1fr] items-center border-b border-border1/50 hover:z-10\">\n <p className=\"flex items-center self-stretch border-r border-border1/50 pl-3 text-ui-xs font-medium text-icon3\">\n {label}\n </p>\n <div>\n <ResponsiveContainer width=\"100%\" height={height}>\n <ScatterChart margin={{ top: 0, right: 0, bottom: 0, left: 0 }}>\n <XAxis dataKey=\"t\" type=\"number\" domain={zoomDomain} allowDataOverflow hide />\n <YAxis dataKey=\"event\" type=\"number\" domain={[0, 2]} hide />\n <Tooltip content={<FlameTooltip domain={domain} />} cursor={false} />\n <Scatter\n data={data}\n fill={color}\n isAnimationActive={false}\n shape={(props: Record<string, unknown>) => {\n const cx = props.cx as number;\n return (\n <g>\n <rect x={cx - 6} y={0} width={12} height={height} fill=\"transparent\" />\n <rect x={cx - 1.5} y={0} width={3} height={height} fill={color} />\n </g>\n );\n }}\n />\n </ScatterChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\ninterface CombinedRowProps {\n label: string;\n areaData: Array<Record<string, number>>;\n areaDataKey: string;\n eventData: Array<{ t: number; event: number; [k: string]: unknown }>;\n color: string;\n gradientId: string;\n domain: TDomain;\n zoomDomain: [number, number];\n threshold?: number;\n height?: number;\n onSelectT?: (t: number) => void;\n}\n\nfunction CombinedRow({\n label,\n areaData,\n areaDataKey,\n eventData,\n color,\n gradientId,\n domain,\n zoomDomain,\n threshold,\n height = 44,\n onSelectT,\n}: CombinedRowProps) {\n const areaValueByTime = new Map(areaData.map(point => [point.t, Number(point[areaDataKey] ?? 0)]));\n const eventsByTime = eventData.reduce<Map<number, Array<(typeof eventData)[number]>>>((acc, event) => {\n const bucket = acc.get(event.t);\n if (bucket) {\n bucket.push(event);\n } else {\n acc.set(event.t, [event]);\n }\n return acc;\n }, new Map());\n const allTimes = Array.from(new Set([...areaValueByTime.keys(), ...eventsByTime.keys()])).sort((a, b) => a - b);\n\n let lastAreaValue = 0;\n const combinedData: Array<Record<string, unknown> & { t: number }> = [];\n for (const time of allTimes) {\n const nextAreaValue = areaValueByTime.get(time);\n if (nextAreaValue != null) {\n lastAreaValue = nextAreaValue;\n }\n\n const bucket = eventsByTime.get(time);\n if (bucket && bucket.length > 0) {\n for (const event of bucket) {\n combinedData.push({ ...event, t: time, [areaDataKey]: lastAreaValue });\n }\n } else {\n combinedData.push({ t: time, [areaDataKey]: lastAreaValue });\n }\n }\n\n return (\n <div className=\"relative grid grid-cols-[6rem_1fr] items-center border-b border-border1/50 hover:z-10\">\n <p className=\"flex items-center self-stretch border-r border-border1/50 pl-3 text-ui-xs font-medium text-icon3\">\n {label}\n </p>\n <div>\n <ResponsiveContainer width=\"100%\" height={height}>\n <ComposedChart\n margin={{ top: 0, right: 0, bottom: 0, left: 0 }}\n onClick={(state: RechartsClickState) => {\n const label = state?.activeLabel;\n if (label != null && onSelectT) onSelectT(Number(label));\n }}\n className={onSelectT ? 'cursor-pointer' : undefined}\n >\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity={0.35} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0.06} />\n </linearGradient>\n </defs>\n <XAxis dataKey=\"t\" type=\"number\" domain={zoomDomain} allowDataOverflow hide />\n <YAxis yAxisId=\"area\" dataKey={areaDataKey} type=\"number\" hide domain={[0, 'dataMax']} />\n <Tooltip content={<FlameTooltip domain={domain} showValue />} cursor={false} />\n <Area\n yAxisId=\"area\"\n data={combinedData}\n type=\"linear\"\n dataKey={areaDataKey}\n stroke={color}\n strokeWidth={1}\n strokeOpacity={0.6}\n fill={`url(#${gradientId})`}\n isAnimationActive={false}\n activeDot={{ r: 5, stroke: color, strokeWidth: 2, fill: '#0a0a0a' }}\n dot={(props: Record<string, unknown>) => {\n const dotPayload = props.payload as { event?: number } | undefined;\n if (!dotPayload?.event) return <></>;\n return <circle cx={props.cx as number} cy={props.cy as number} r={4} fill={color} />;\n }}\n />\n {threshold != null && (\n <ReferenceLine yAxisId=\"area\" y={threshold} stroke={color} strokeDasharray=\"4 3\" strokeOpacity={0.4} />\n )}\n </ComposedChart>\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\nfunction ZoomTrack({\n tDomain,\n zoomLeft,\n zoomRight,\n onZoomLeftChange,\n onZoomRightChange,\n onReset,\n}: {\n tDomain: TDomain;\n zoomLeft: number;\n zoomRight: number;\n onZoomLeftChange: (ts: number) => void;\n onZoomRightChange: (ts: number) => void;\n onReset: () => void;\n}) {\n const trackRef = useRef<HTMLDivElement>(null);\n const dragging = useRef<'left' | 'right' | null>(null);\n\n const range = tDomain.tMax - tDomain.tMin;\n const leftPercent = range > 0 ? ((zoomLeft - tDomain.tMin) / range) * 100 : 0;\n const rightPercent = range > 0 ? ((zoomRight - tDomain.tMin) / range) * 100 : 100;\n\n const toTimestamp = useCallback(\n (clientX: number) => {\n const track = trackRef.current;\n if (!track) return null;\n const rect = track.getBoundingClientRect();\n const frac = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n return tDomain.tMin + frac * (tDomain.tMax - tDomain.tMin);\n },\n [tDomain.tMin, tDomain.tMax],\n );\n\n useEffect(() => {\n const onMouseMove = (e: MouseEvent) => {\n if (!dragging.current) return;\n const ts = toTimestamp(e.clientX);\n if (ts == null) return;\n if (dragging.current === 'left') {\n onZoomLeftChange(Math.min(ts, zoomRight));\n } else {\n onZoomRightChange(Math.max(ts, zoomLeft));\n }\n };\n const onMouseUp = () => {\n dragging.current = null;\n };\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n return () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n };\n }, [toTimestamp, zoomLeft, zoomRight, onZoomLeftChange, onZoomRightChange]);\n\n return (\n <div className=\"grid grid-cols-[6rem_1fr] items-center border-b border-border1/50\">\n <div className=\"flex items-center gap-1 self-stretch border-r border-border1/50 pl-3\">\n <p className=\"text-ui-xs font-medium text-icon3\">Zoom</p>\n <Button variant=\"ghost\" size=\"icon-sm\" aria-label=\"Reset zoom\" onClick={onReset}>\n <RotateCcw className=\"size-3\" />\n </Button>\n </div>\n <div\n ref={trackRef}\n className=\"relative h-6 cursor-pointer select-none\"\n onMouseDown={e => {\n const ts = toTimestamp(e.clientX);\n if (ts == null) return;\n e.preventDefault();\n const distLeft = Math.abs(ts - zoomLeft);\n const distRight = Math.abs(ts - zoomRight);\n if (distLeft <= distRight) {\n onZoomLeftChange(Math.min(ts, zoomRight));\n dragging.current = 'left';\n } else {\n onZoomRightChange(Math.max(ts, zoomLeft));\n dragging.current = 'right';\n }\n }}\n >\n <div className=\"absolute inset-y-0 left-0 bg-surface2/60\" style={{ width: `${leftPercent}%` }} />\n <div\n className=\"absolute inset-y-0 border-y border-border1/30 bg-neutral6/5\"\n style={{ left: `${leftPercent}%`, right: `${100 - rightPercent}%` }}\n />\n <div className=\"absolute inset-y-0 right-0 bg-surface2/60\" style={{ width: `${100 - rightPercent}%` }} />\n <div\n className=\"absolute inset-y-0 w-1 cursor-col-resize bg-neutral6/50 hover:bg-neutral6\"\n style={{ left: `${leftPercent}%`, transform: 'translateX(-50%)' }}\n onMouseDown={e => {\n e.preventDefault();\n e.stopPropagation();\n dragging.current = 'left';\n }}\n />\n <div\n className=\"absolute inset-y-0 w-1 cursor-col-resize bg-neutral6/50 hover:bg-neutral6\"\n style={{ left: `${rightPercent}%`, transform: 'translateX(-50%)' }}\n onMouseDown={e => {\n e.preventDefault();\n e.stopPropagation();\n dragging.current = 'right';\n }}\n />\n </div>\n </div>\n );\n}\n\nconst FALLBACK_DOMAIN: TDomain = { tMin: 0, tMax: 1 };\n\nexport function FlameGraph({\n omRecords,\n markers,\n messages,\n tDomain: tDomainProp,\n observationThreshold,\n reflectionThreshold,\n onSelectTimestamp,\n zoomRange,\n onZoomRangeChange,\n}: FlameGraphProps) {\n const domain = tDomainProp ?? FALLBACK_DOMAIN;\n\n const handleSelectT = useCallback(\n (t: number) => {\n onSelectTimestamp?.(tToTimestampMs(t, domain));\n },\n [onSelectTimestamp, domain],\n );\n\n const isControlled = zoomRange != null && onZoomRangeChange != null;\n const [internalZoomLeft, setInternalZoomLeft] = useState<number>(domain.tMin);\n const [internalZoomRight, setInternalZoomRight] = useState<number>(domain.tMax);\n\n // Reset the internal (uncontrolled) range whenever the domain changes.\n // Controlled callers own resetting via `onZoomRangeChange`.\n useEffect(() => {\n if (isControlled) return;\n setInternalZoomLeft(domain.tMin);\n setInternalZoomRight(domain.tMax);\n }, [domain.tMin, domain.tMax, isControlled]);\n\n const zoomLeft = isControlled ? zoomRange.left : internalZoomLeft;\n const zoomRight = isControlled ? zoomRange.right : internalZoomRight;\n\n const setZoomLeft = useCallback(\n (ts: number) => {\n if (isControlled) onZoomRangeChange({ left: ts, right: zoomRight });\n else setInternalZoomLeft(ts);\n },\n [isControlled, onZoomRangeChange, zoomRight],\n );\n const setZoomRight = useCallback(\n (ts: number) => {\n if (isControlled) onZoomRangeChange({ left: zoomLeft, right: ts });\n else setInternalZoomRight(ts);\n },\n [isControlled, onZoomRangeChange, zoomLeft],\n );\n\n const resetZoom = useCallback(() => {\n if (isControlled) onZoomRangeChange({ left: domain.tMin, right: domain.tMax });\n else {\n setInternalZoomLeft(domain.tMin);\n setInternalZoomRight(domain.tMax);\n }\n }, [isControlled, onZoomRangeChange, domain.tMin, domain.tMax]);\n\n const range = domain.tMax - domain.tMin;\n const zoomTLeft = range > 0 ? (zoomLeft - domain.tMin) / range : 0;\n const zoomTRight = range > 0 ? (zoomRight - domain.tMin) / range : 1;\n const zoomDomain: [number, number] = [zoomTLeft, zoomTRight];\n\n const messageData = useMemo(() => toMessageData(messages, domain), [messages, domain]);\n const contextData = useMemo(() => toContextData(omRecords, markers, domain), [omRecords, markers, domain]);\n const activeObservationData = useMemo(\n () => toActiveObservationData(omRecords, markers, domain),\n [omRecords, markers, domain],\n );\n const bufferedObservationData = useMemo(() => toBufferedObservationData(markers, domain), [markers, domain]);\n const eventData = useMemo(() => toEventData(omRecords, domain), [omRecords, domain]);\n\n const hasData =\n messageData.length > 0 || contextData.length > 0 || activeObservationData.length > 0 || eventData.length > 0;\n\n if (!hasData) return null;\n\n return (\n <div className=\"flex flex-col pb-2 pr-2 [&_.recharts-surface]:outline-none\">\n <CombinedRow\n label=\"Messages\"\n areaData={contextData}\n areaDataKey=\"pendingMessageTokens\"\n eventData={messageData}\n color={MSG_COLOR}\n gradientId=\"grad-messages\"\n domain={domain}\n zoomDomain={zoomDomain}\n threshold={observationThreshold}\n onSelectT={onSelectTimestamp ? handleSelectT : undefined}\n />\n\n <CombinedRow\n label=\"Observations\"\n areaData={activeObservationData}\n areaDataKey=\"observationTokenCount\"\n eventData={eventData}\n color={OBS_COLOR}\n gradientId=\"grad-observations\"\n domain={domain}\n zoomDomain={zoomDomain}\n threshold={reflectionThreshold}\n onSelectT={onSelectTimestamp ? handleSelectT : undefined}\n />\n\n {bufferedObservationData.length > 0 && (\n <AreaRow\n label=\"Buffered obs\"\n data={bufferedObservationData}\n dataKey=\"bufferedObservationTokenCount\"\n color={REFLECT_COLOR}\n gradientId=\"grad-buffered-obs\"\n domain={domain}\n zoomDomain={zoomDomain}\n threshold={reflectionThreshold}\n />\n )}\n\n {eventData.length > 0 && (\n <EventRow label=\"Events\" data={eventData} color={REFLECT_COLOR} domain={domain} zoomDomain={zoomDomain} />\n )}\n\n <TimeAxis domain={domain} />\n\n <ZoomTrack\n tDomain={domain}\n zoomLeft={zoomLeft}\n zoomRight={zoomRight}\n onZoomLeftChange={setZoomLeft}\n onZoomRightChange={setZoomRight}\n onReset={resetZoom}\n />\n </div>\n );\n}\n","import type { DataOmPart } from '@mastra/memory/processors';\nimport type { MemoryMessage } from '../types';\n\nexport interface ExtractedOmMarker {\n type: 'status' | 'observation-start' | 'observation-end' | 'buffering-start' | 'buffering-end' | 'activation';\n timestamp: string;\n pendingTokens?: number;\n observationTokens?: number;\n observationThreshold?: number;\n reflectionThreshold?: number;\n generationCount?: number;\n}\n\ninterface MastraV2Content {\n format?: number;\n parts: Array<{ type: string; [key: string]: unknown }>;\n}\n\nfunction parseContent(content: unknown): unknown {\n let value = content;\n for (let i = 0; i < 3 && typeof value === 'string'; i++) {\n try {\n const parsed = JSON.parse(value);\n if (typeof parsed === 'object' && parsed !== null) return parsed;\n if (typeof parsed === 'string' && parsed !== value) {\n value = parsed;\n continue;\n }\n break;\n } catch {\n break;\n }\n }\n return value;\n}\n\nfunction isMastraV2(content: unknown): content is MastraV2Content {\n return (\n typeof content === 'object' &&\n content !== null &&\n 'parts' in content &&\n Array.isArray((content as { parts?: unknown }).parts)\n );\n}\n\ntype OmMarkerPart = Extract<\n DataOmPart,\n {\n type:\n | 'data-om-status'\n | 'data-om-observation-start'\n | 'data-om-observation-end'\n | 'data-om-buffering-start'\n | 'data-om-buffering-end'\n | 'data-om-activation';\n }\n>;\n\nfunction isOmMarkerPart(part: { type: string }): part is OmMarkerPart {\n const t = part.type;\n return (\n t === 'data-om-status' ||\n t === 'data-om-observation-start' ||\n t === 'data-om-observation-end' ||\n t === 'data-om-buffering-start' ||\n t === 'data-om-buffering-end' ||\n t === 'data-om-activation'\n );\n}\n\nfunction mapMarker(part: OmMarkerPart, messageCreatedAt: string): ExtractedOmMarker {\n switch (part.type) {\n case 'data-om-status':\n return {\n type: 'status',\n timestamp: messageCreatedAt,\n pendingTokens: part.data.windows?.active?.messages?.tokens,\n observationTokens: part.data.windows?.active?.observations?.tokens,\n observationThreshold: part.data.windows?.active?.messages?.threshold,\n reflectionThreshold: part.data.windows?.active?.observations?.threshold,\n };\n case 'data-om-observation-start':\n return {\n type: 'observation-start',\n timestamp: part.data.startedAt,\n pendingTokens: part.data.tokensToObserve,\n observationThreshold: part.data.config?.messageTokens,\n reflectionThreshold: part.data.config?.observationTokens,\n };\n case 'data-om-observation-end':\n return {\n type: 'observation-end',\n timestamp: part.data.completedAt,\n observationTokens: part.data.observationTokens,\n };\n case 'data-om-buffering-start':\n return {\n type: 'buffering-start',\n timestamp: part.data.startedAt,\n pendingTokens: part.data.tokensToBuffer,\n observationThreshold: part.data.config?.messageTokens,\n reflectionThreshold: part.data.config?.observationTokens,\n };\n case 'data-om-buffering-end':\n return {\n type: 'buffering-end',\n timestamp: part.data.completedAt,\n observationTokens: part.data.bufferedTokens,\n };\n case 'data-om-activation':\n return {\n type: 'activation',\n timestamp: part.data.activatedAt,\n pendingTokens: part.data.tokensActivated,\n observationTokens: part.data.observationTokens,\n observationThreshold: part.data.config?.messageTokens,\n reflectionThreshold: part.data.config?.observationTokens,\n generationCount: part.data.generationCount,\n };\n }\n}\n\nexport function extractOmMarkers(messages: MemoryMessage[]): ExtractedOmMarker[] {\n const markers: ExtractedOmMarker[] = [];\n\n for (const msg of messages) {\n const content = parseContent(msg.content);\n if (!isMastraV2(content)) continue;\n\n for (const part of content.parts) {\n if (isOmMarkerPart(part)) {\n markers.push(mapMarker(part, new Date(msg.createdAt).toISOString()));\n }\n }\n }\n\n markers.sort((a, b) => a.timestamp.localeCompare(b.timestamp));\n return markers;\n}\n","import type { OMHistoryRecord } from '../types';\nimport type { ExtractedOmMarker } from './extract-markers';\nimport { parseUTC } from './timeline';\n\nexport interface ThreadContextWindowState {\n messageTokens?: number;\n messageThreshold?: number;\n memoryTokens?: number;\n memoryThreshold?: number;\n}\n\nfunction getObservationTimestamp(record: OMHistoryRecord): string {\n const d = record.lastObservedAt ?? record.updatedAt;\n return typeof d === 'string' ? d : new Date(d).toISOString();\n}\n\nfunction sortObservationRecords(records: OMHistoryRecord[]) {\n return [...records].sort((a, b) => parseUTC(getObservationTimestamp(a)) - parseUTC(getObservationTimestamp(b)));\n}\n\nexport function getLatestThreadContextWindowState({\n markers,\n omRecords,\n observationThreshold,\n reflectionThreshold,\n}: {\n markers: ExtractedOmMarker[];\n omRecords: OMHistoryRecord[];\n observationThreshold?: number;\n reflectionThreshold?: number;\n}): ThreadContextWindowState {\n const latestStatusMarker = [...markers]\n .filter(marker => marker.type === 'status' && (marker.pendingTokens != null || marker.observationTokens != null))\n .sort((a, b) => a.timestamp.localeCompare(b.timestamp))\n .at(-1);\n\n const latestObservationRecord = sortObservationRecords(omRecords).at(-1);\n\n return {\n messageTokens: latestStatusMarker?.pendingTokens ?? latestObservationRecord?.pendingMessageTokens,\n messageThreshold: latestStatusMarker?.observationThreshold ?? observationThreshold,\n memoryTokens: latestStatusMarker?.observationTokens ?? latestObservationRecord?.observationTokenCount,\n memoryThreshold: latestStatusMarker?.reflectionThreshold ?? reflectionThreshold,\n };\n}\n","import { ArrowLeftIcon } from 'lucide-react';\nimport { useEffect, useMemo, useState } from 'react';\n\nimport { Button } from '../../../ds/components/Button';\nimport { Skeleton } from '../../../ds/components/Skeleton';\nimport { Txt } from '../../../ds/components/Txt';\nimport { MemoryIcon } from '../../../ds/icons/MemoryIcon';\nimport { extractOmMarkers } from '../lib/extract-markers';\nimport { findRecordIdAtOrBefore, getObservationTimestampMs } from '../lib/replay-selection';\nimport { getLatestThreadContextWindowState } from '../lib/thread-context-window-state';\nimport { timestampsToTDomain } from '../lib/timeline';\nimport type { MemoryMessage, OMHistoryRecord } from '../types';\nimport { FlameGraph } from './flame-graph';\nimport type { ZoomRange } from './flame-graph';\nimport { ObservationDetailView } from './observation-detail-view';\nimport { ThreadContextProgress } from './thread-context-progress';\n\nexport interface MemoryStudioPanelProps {\n messages: MemoryMessage[];\n omRecords: OMHistoryRecord[];\n isLoading?: boolean;\n onClose?: () => void;\n /** Replay cursor (ms epoch) driven by the timeline; selects the matching observation. */\n selectedTimestamp?: number | null;\n /** Fired when the flame graph timeline is clicked, surfacing the replay cursor. */\n onSelectTimestamp?: (timestamp: number | null) => void;\n /**\n * Authoritative context-window token counts/thresholds supplied by the caller\n * (e.g. derived from the OM record + live stream progress). When provided these\n * take precedence over the values re-derived from message markers, keeping this\n * panel aligned with the OM sidebar. Marker-derived values remain the fallback\n * for standalone usage.\n */\n contextWindow?: {\n messageTokens?: number;\n messageThreshold?: number;\n memoryTokens?: number;\n memoryThreshold?: number;\n };\n}\n\nexport function MemoryStudioPanel({\n messages,\n omRecords,\n isLoading = false,\n onClose,\n selectedTimestamp,\n onSelectTimestamp,\n contextWindow,\n}: MemoryStudioPanelProps) {\n const [manualOMRecordId, setManualOMRecordId] = useState<string | null>(null);\n\n const markers = useMemo(() => extractOmMarkers(messages), [messages]);\n const tDomain = useMemo(() => {\n if (messages.length === 0) return { tMin: 0, tMax: 1 };\n return timestampsToTDomain(messages.map(m => new Date(m.createdAt).toISOString()));\n }, [messages]);\n const windowState = useMemo(() => getLatestThreadContextWindowState({ markers, omRecords }), [markers, omRecords]);\n\n const memoryTokens = contextWindow?.memoryTokens ?? windowState?.memoryTokens;\n const memoryThreshold = contextWindow?.memoryThreshold ?? windowState?.memoryThreshold;\n\n // Zoom range (epoch ms) is owned here so it can both scope the FlameGraph\n // charts and filter the observation list. It resets to the full domain\n // whenever the domain changes (mirrors the FlameGraph's own reset behaviour).\n const [zoomRange, setZoomRange] = useState<ZoomRange>({ left: tDomain.tMin, right: tDomain.tMax });\n useEffect(() => {\n setZoomRange({ left: tDomain.tMin, right: tDomain.tMax });\n }, [tDomain.tMin, tDomain.tMax]);\n\n // The full-domain case is a strict pass-through so an untouched range never\n // hides records (e.g. observations outside the message-derived domain).\n const isFullRange = zoomRange.left <= tDomain.tMin && zoomRange.right >= tDomain.tMax;\n const visibleRecords = useMemo(() => {\n if (isFullRange) return omRecords;\n return omRecords.filter(record => {\n const t = getObservationTimestampMs(record);\n return t >= zoomRange.left && t <= zoomRange.right;\n });\n }, [omRecords, isFullRange, zoomRange.left, zoomRange.right]);\n\n // Replay cursor (controlled) overrides manual history selection. Resolve it\n // against the visible records so selection stays consistent with the list.\n const replayRecordId = useMemo(\n () => (selectedTimestamp != null ? findRecordIdAtOrBefore(visibleRecords, selectedTimestamp) : null),\n [visibleRecords, selectedTimestamp],\n );\n // Ignore a manual selection that the range has filtered out, so the detail\n // view falls back to a record that is actually visible instead of an empty state.\n const manualSelectionInRange =\n manualOMRecordId != null && visibleRecords.some(r => r.id === manualOMRecordId) ? manualOMRecordId : null;\n const selectedOMRecordId = replayRecordId ?? manualSelectionInRange;\n\n return (\n <div className=\"flex h-full w-full flex-col overflow-hidden\">\n <div className=\"flex shrink-0 items-center gap-2 border-b border-border1 px-3 py-2.5\">\n <Button type=\"button\" variant=\"ghost\" size=\"icon-sm\" tooltip=\"Back to memory\" onClick={() => onClose?.()}>\n <ArrowLeftIcon />\n </Button>\n <span className=\"flex min-w-0 items-center gap-1.5 text-neutral6\">\n <MemoryIcon className=\"h-4 w-4 shrink-0\" />\n <Txt as=\"span\" variant=\"ui-sm\" className=\"font-medium\">\n Observational memory\n </Txt>\n </span>\n </div>\n\n {isLoading ? (\n <div data-testid=\"memory-studio-loading\" className=\"flex flex-1 flex-col gap-3 p-4\">\n <Skeleton className=\"h-6 w-40\" />\n <Skeleton className=\"h-32 w-full\" />\n <Skeleton className=\"h-16 w-full\" />\n </div>\n ) : (\n <div className=\"grid min-h-0 flex-1 grid-rows-[1fr_auto] overflow-hidden\">\n <div className=\"min-h-0 flex flex-col overflow-hidden\">\n <ObservationDetailView\n records={visibleRecords}\n selectedRecordId={selectedOMRecordId}\n onSelectRecord={setManualOMRecordId}\n isLoading={isLoading}\n />\n </div>\n <div className=\"border-t border-border1\">\n <ThreadContextProgress\n messageTokens={contextWindow?.messageTokens ?? windowState?.messageTokens}\n messageThreshold={contextWindow?.messageThreshold ?? windowState?.messageThreshold}\n memoryTokens={memoryTokens}\n memoryThreshold={memoryThreshold}\n memoryLabel=\"Observations\"\n />\n <FlameGraph\n omRecords={omRecords}\n markers={markers}\n messages={messages}\n tDomain={tDomain}\n onSelectTimestamp={onSelectTimestamp}\n zoomRange={zoomRange}\n onZoomRangeChange={setZoomRange}\n />\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\n\nexport const memoryThreadMessagesQueryKey = (threadId: string, page?: number) =>\n ['memory', 'thread', threadId, 'messages', page ?? 0] as const;\n\nexport function useMemoryThreadMessages(threadId: string | undefined, opts?: { page?: number; perPage?: number }) {\n const client = useMastraClient();\n const page = opts?.page ?? 0;\n const perPage = opts?.perPage ?? 100;\n\n return useQuery({\n queryKey: memoryThreadMessagesQueryKey(threadId!, page),\n queryFn: () => client.getMemoryThread({ threadId: threadId! }).listMessages({ page, perPage }),\n enabled: !!threadId,\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\n\nexport const observationalMemoryQueryKey = (agentId: string, threadId: string) =>\n ['memory', 'observational-memory', agentId, threadId] as const;\n\nexport function useObservationalMemory(agentId: string | undefined, threadId: string | undefined, resourceId?: string) {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: observationalMemoryQueryKey(agentId!, threadId!),\n queryFn: () =>\n client.getObservationalMemory({\n agentId: agentId!,\n threadId: threadId!,\n resourceId,\n }),\n enabled: !!agentId && !!threadId,\n });\n}\n","import { useMastraClient } from '@mastra/react';\nimport { useQuery } from '@tanstack/react-query';\n\nexport const memoryStatusQueryKey = (agentId: string, threadId?: string) =>\n ['memory', 'status', agentId, threadId ?? ''] as const;\n\nexport function useMemoryStatus(agentId: string | undefined, threadId?: string) {\n const client = useMastraClient();\n\n return useQuery({\n queryKey: memoryStatusQueryKey(agentId!, threadId),\n queryFn: () =>\n client.getMemoryStatus(agentId!, undefined, {\n threadId,\n }),\n enabled: !!agentId,\n });\n}\n","import { Panel, Group } from 'react-resizable-panels';\nimport { CollapsiblePanel } from '@/lib/resize/collapsible-panel';\nimport { PanelSeparator } from '@/lib/resize/separator';\n\nexport interface TopicsLayoutProps {\n sidebar?: React.ReactNode;\n children?: React.ReactNode;\n tracePanel?: React.ReactNode;\n contentPadding?: boolean;\n}\n\nexport function TopicsLayout({ sidebar, children, tracePanel, contentPadding = true }: TopicsLayoutProps) {\n const hasContent = Boolean(children || tracePanel);\n\n return (\n <div className=\"flex h-full min-h-0 bg-surface2 text-neutral4\">\n {sidebar ? <aside className=\"min-h-0 w-[22rem] shrink-0 border-r border-border1\">{sidebar}</aside> : null}\n {hasContent ? (\n <main className={contentPadding ? 'min-w-0 flex-1 p-4' : 'min-w-0 flex-1'}>\n <Group className=\"h-full min-h-0 w-full min-w-0\" direction=\"horizontal\">\n {children ? (\n <Panel id=\"topic-main\" className=\"min-w-0 pr-2\" minSize={35}>\n {children}\n </Panel>\n ) : null}\n {tracePanel ? (\n <>\n {children ? <PanelSeparator /> : null}\n <CollapsiblePanel\n direction=\"right\"\n id=\"topic-trace-details\"\n minSize={300}\n maxSize=\"70%\"\n defaultSize={children ? '40%' : '100%'}\n collapsedSize={60}\n collapsible\n className=\"min-w-0 pl-2\"\n >\n {tracePanel}\n </CollapsiblePanel>\n </>\n ) : null}\n </Group>\n </main>\n ) : null}\n </div>\n );\n}\n","import type {\n Topic,\n TopicSubtopic,\n TopicSubtopicWithCounts,\n TopicTraceShare,\n TopicTraceSort,\n TopicTraceSummary,\n TopicWithCounts,\n} from './types';\n\nconst TOPIC_COLORS = ['#7C3AED', '#2563EB', '#0891B2', '#059669', '#CA8A04', '#EA580C', '#DC2626', '#DB2777'];\n\nfunction hashString(value: string): number {\n let hash = 0;\n for (let index = 0; index < value.length; index += 1) {\n hash = (hash << 5) - hash + value.charCodeAt(index);\n hash |= 0;\n }\n return Math.abs(hash);\n}\n\nexport function getTopicColor(id: string): string {\n return TOPIC_COLORS[hashString(id) % TOPIC_COLORS.length];\n}\n\nexport function getTraceCount(subtopic: Pick<TopicSubtopic, 'traceSummaries'>): number {\n return subtopic.traceSummaries.length;\n}\n\nexport function getTopicTraceCount(topic: Pick<Topic, 'subtopics'>): number {\n return topic.subtopics.reduce((total, subtopic) => total + getTraceCount(subtopic), 0);\n}\n\nexport function getTraceShare(count: number, total: number): TopicTraceShare {\n return {\n count,\n total,\n percentage: total > 0 ? Math.round((count / total) * 100) : 0,\n };\n}\n\nexport function aggregateTopics(topics: Topic[]): TopicWithCounts[] {\n const totalTraceCount = topics.reduce((total, topic) => total + getTopicTraceCount(topic), 0);\n\n return topics.map(topic => ({\n ...topic,\n color: topic.color ?? getTopicColor(topic.id),\n traceCount: getTopicTraceCount(topic),\n subtopics: topic.subtopics.map<TopicSubtopicWithCounts>(subtopic => {\n const traceCount = getTraceCount(subtopic);\n return {\n ...subtopic,\n color: subtopic.color ?? topic.color ?? getTopicColor(subtopic.id),\n traceCount,\n traceShare: getTraceShare(traceCount, totalTraceCount),\n };\n }),\n }));\n}\n\nfunction toTime(value: string | Date | undefined): number {\n if (!value) return 0;\n const time = value instanceof Date ? value.getTime() : new Date(value).getTime();\n return Number.isNaN(time) ? 0 : time;\n}\n\nexport function filterTraceSummaries(traces: TopicTraceSummary[], search: string): TopicTraceSummary[] {\n const normalizedSearch = search.trim().toLowerCase();\n if (!normalizedSearch) return traces;\n\n return traces.filter(trace =>\n [trace.id, trace.name, trace.entityName, trace.status].some(value =>\n value?.toLowerCase().includes(normalizedSearch),\n ),\n );\n}\n\nexport function sortTraceSummaries(traces: TopicTraceSummary[], sort: TopicTraceSort): TopicTraceSummary[] {\n return traces.toSorted((left, right) => {\n switch (sort) {\n case 'oldest':\n return toTime(left.startedAt) - toTime(right.startedAt);\n case 'duration-desc':\n return (right.durationMs ?? 0) - (left.durationMs ?? 0);\n case 'duration-asc':\n return (left.durationMs ?? 0) - (right.durationMs ?? 0);\n case 'newest':\n default:\n return toTime(right.startedAt) - toTime(left.startedAt);\n }\n });\n}\n\nexport function getVisibleTraceSummaries(\n traces: TopicTraceSummary[],\n options: { search: string; sort: TopicTraceSort; page: number; pageSize: number },\n): { traces: TopicTraceSummary[]; total: number; hasMore: boolean } {\n const filtered = filterTraceSummaries(traces, options.search);\n const sorted = sortTraceSummaries(filtered, options.sort);\n const end = options.page * options.pageSize;\n\n return {\n traces: sorted.slice(0, end),\n total: sorted.length,\n hasMore: end < sorted.length,\n };\n}\n","import { useMemo, useState } from 'react';\nimport type { TopicTraceSummary } from '../types';\nimport { getVisibleTraceSummaries } from '../utils';\nimport { Button } from '@/ds/components/Button';\nimport { DataList } from '@/ds/components/DataList/data-list';\nimport { Searchbar } from '@/ds/components/Searchbar';\n\nexport interface TopicTraceSummaryListProps {\n traces: TopicTraceSummary[];\n selectedTraceId?: string | null;\n onTraceSelect: (trace: TopicTraceSummary) => void;\n pageSize?: number;\n}\n\nexport function TopicTraceSummaryList({\n traces,\n selectedTraceId,\n onTraceSelect,\n pageSize = 25,\n}: TopicTraceSummaryListProps) {\n const [search, setSearch] = useState('');\n const [page, setPage] = useState(1);\n\n const visible = useMemo(\n () => getVisibleTraceSummaries(traces, { search, sort: 'newest', page, pageSize }),\n [page, pageSize, search, traces],\n );\n\n return (\n <section className=\"flex min-h-0 flex-1 flex-col gap-4\" aria-label=\"Topic trace summaries\">\n <Searchbar\n label=\"Search traces\"\n placeholder=\"Search traces\"\n onSearch={value => {\n setSearch(value);\n setPage(1);\n }}\n />\n\n <DataList columns=\"minmax(12rem,1fr)\" className=\"min-h-0 flex-1\">\n <DataList.Top>\n <DataList.TopCells>\n <DataList.TopCell>Trace summary</DataList.TopCell>\n </DataList.TopCells>\n </DataList.Top>\n\n {visible.traces.length === 0 ? (\n <DataList.NoMatch message=\"No traces match this subtopic.\" />\n ) : (\n visible.traces.map(trace => (\n <DataList.RowButton\n key={trace.id}\n featured={selectedTraceId === trace.id}\n onClick={() => onTraceSelect(trace)}\n aria-pressed={selectedTraceId === trace.id}\n >\n <DataList.TextCell>{trace.name ?? trace.id}</DataList.TextCell>\n </DataList.RowButton>\n ))\n )}\n </DataList>\n\n {visible.hasMore ? (\n <Button variant=\"outline\" size=\"sm\" onClick={() => setPage(currentPage => currentPage + 1)}>\n Load more traces ({visible.traces.length} of {visible.total})\n </Button>\n ) : null}\n </section>\n );\n}\n","import { SpanDataPanelView } from '@/domains/traces/components/span-data-panel-view';\nimport { TraceDetailsView } from '@/domains/traces/components/trace-details-view';\nimport { useSpanDetail } from '@/domains/traces/hooks/use-span-detail';\nimport { useTraceLightSpans } from '@/domains/traces/hooks/use-trace-light-spans';\nimport { useTraceSpanNavigation } from '@/domains/traces/hooks/use-trace-span-navigation';\nimport { cn } from '@/lib/utils';\n\nexport interface TopicTraceDetailsPanelProps {\n traceId: string | null;\n selectedSpanId?: string | null;\n onSpanSelect?: (spanId: string | undefined) => void;\n onClose: () => void;\n}\n\nexport function TopicTraceDetailsPanel({\n traceId,\n selectedSpanId,\n onSpanSelect,\n onClose,\n}: TopicTraceDetailsPanelProps) {\n const traceSpans = useTraceLightSpans(traceId);\n const spanDetail = useSpanDetail(traceId, selectedSpanId);\n const { handlePreviousSpan, handleNextSpan } = useTraceSpanNavigation(\n traceSpans.data?.spans,\n selectedSpanId,\n spanId => onSpanSelect?.(spanId),\n );\n\n if (!traceId) return null;\n\n return (\n <div\n className={cn(\n 'grid h-full min-h-0 overflow-auto',\n selectedSpanId ? 'grid-rows-[minmax(0,1fr)_minmax(0,1fr)] gap-4' : 'grid-rows-[minmax(0,1fr)]',\n )}\n >\n <TraceDetailsView\n traceId={traceId}\n spans={traceSpans.data?.spans}\n isLoading={traceSpans.isLoading}\n selectedSpanId={selectedSpanId}\n onSpanSelect={onSpanSelect}\n onClose={onClose}\n />\n {selectedSpanId ? (\n <SpanDataPanelView\n traceId={traceId}\n spanId={selectedSpanId}\n span={spanDetail.data?.span}\n isLoading={spanDetail.isLoading}\n onClose={() => onSpanSelect?.(undefined)}\n onPrevious={handlePreviousSpan}\n onNext={handleNextSpan}\n />\n ) : null}\n </div>\n );\n}\n","import { stringToColor } from '../../lib/colors';\nimport type { SignalCluster } from './types';\n\nconst SIGNAL_CHART_CLUSTERS = [\n { label: 'Fast paths', count: 27, duration: 120, spans: 5 },\n { label: 'Standard paths', count: 27, duration: 620, spans: 14 },\n { label: 'Complex paths', count: 26, duration: 1280, spans: 28 },\n];\n\nexport type SignalChartPoint = {\n id: string;\n name: string;\n cluster: string;\n duration: number;\n spans: number;\n color: string;\n};\n\nexport function getSignalChartData(clusters: SignalCluster[]): SignalChartPoint[] {\n return clusters.flatMap((cluster, clusterIndex) =>\n SIGNAL_CHART_CLUSTERS.flatMap(path =>\n Array.from({ length: path.count }, (_, index) => {\n const offset = index - (path.count - 1) / 2;\n const durationJitter = ((index * 37 + clusterIndex * 19) % 90) - 45;\n const durationScatter = Math.sin((index + 1 + clusterIndex) * 1.7) * 34 + Math.cos((index + 3) * 0.9) * 21;\n const spanJitter = ((index * 11 + clusterIndex * 3) % 7) - 3;\n\n return {\n id: `${cluster.id}-${path.label.toLowerCase().replaceAll(' ', '-')}-${index + 1}`,\n name: `${cluster.name} · ${path.label} ${index + 1}`,\n cluster: path.label,\n duration: Math.max(0, Math.round(path.duration + offset * 8 + durationJitter + durationScatter)),\n spans: Math.max(1, path.spans + spanJitter),\n color: stringToColor(`${cluster.name}-${path.label}`),\n };\n }),\n ),\n );\n}\n","import type { Signal } from './types';\n\nexport const signals: Signal[] = [\n {\n id: 'tasks',\n name: 'Tasks',\n description: 'Operational work patterns inferred from agent traces and user requests.',\n clusters: [\n {\n id: 'refunds',\n name: 'Refunds',\n description: 'Refund requests, policy checks, and payment reversals.',\n traceSummaries: [\n {\n id: 'trace-refund-1',\n name: 'Refund eligibility check',\n status: 'success',\n startedAt: '2026-06-15T10:00:00.000Z',\n durationMs: 1240,\n entityName: 'support-agent',\n spanCount: 8,\n },\n {\n id: 'trace-refund-2',\n name: 'Refund escalation',\n status: 'error',\n startedAt: '2026-06-15T09:40:00.000Z',\n durationMs: 3180,\n entityName: 'support-agent',\n spanCount: 12,\n },\n ],\n },\n {\n id: 'shipping',\n name: 'Shipping',\n description: 'Shipment lookup, carrier updates, and delivery exceptions.',\n traceSummaries: [\n {\n id: 'trace-shipping-1',\n name: 'Track delayed package',\n status: 'success',\n startedAt: '2026-06-15T08:30:00.000Z',\n durationMs: 980,\n entityName: 'support-agent',\n spanCount: 6,\n },\n ],\n },\n {\n id: 'account-updates',\n name: 'Account updates',\n description: 'Profile edits, plan changes, and account recovery requests.',\n traceSummaries: [\n {\n id: 'trace-account-1',\n name: 'Update billing contact',\n status: 'success',\n startedAt: '2026-06-15T07:45:00.000Z',\n durationMs: 1420,\n entityName: 'support-agent',\n spanCount: 7,\n },\n {\n id: 'trace-account-2',\n name: 'Recover locked account',\n status: 'success',\n startedAt: '2026-06-15T07:10:00.000Z',\n durationMs: 2640,\n entityName: 'support-agent',\n spanCount: 11,\n },\n ],\n },\n {\n id: 'subscription-changes',\n name: 'Subscription changes',\n description: 'Upgrade, downgrade, pause, and renewal intent across plans.',\n traceSummaries: [\n {\n id: 'trace-subscription-1',\n name: 'Downgrade plan request',\n status: 'success',\n startedAt: '2026-06-15T06:50:00.000Z',\n durationMs: 1880,\n entityName: 'support-agent',\n spanCount: 9,\n },\n ],\n },\n ],\n },\n {\n id: 'sentiment',\n name: 'Sentiment',\n description: 'Conversation tone and confidence shifts that affect user outcomes.',\n clusters: [\n {\n id: 'negative-feedback',\n name: 'Negative feedback',\n description: 'Escalations, frustration signals, and unresolved customer intent.',\n traceSummaries: [\n {\n id: 'trace-sentiment-1',\n name: 'De-escalate frustrated customer',\n status: 'success',\n startedAt: '2026-06-15T12:30:00.000Z',\n durationMs: 2150,\n entityName: 'support-agent',\n spanCount: 10,\n },\n ],\n },\n {\n id: 'positive-feedback',\n name: 'Positive feedback',\n description: 'Gratitude, satisfaction, and confirmation that the user outcome was met.',\n traceSummaries: [\n {\n id: 'trace-sentiment-2',\n name: 'Capture satisfied customer outcome',\n status: 'success',\n startedAt: '2026-06-15T12:05:00.000Z',\n durationMs: 1320,\n entityName: 'support-agent',\n spanCount: 5,\n },\n ],\n },\n {\n id: 'uncertain-feedback',\n name: 'Uncertain feedback',\n description: 'Ambiguous responses where sentiment or next best action needs clarification.',\n traceSummaries: [\n {\n id: 'trace-sentiment-3',\n name: 'Clarify ambiguous response',\n status: 'running',\n startedAt: '2026-06-15T11:35:00.000Z',\n durationMs: 1760,\n entityName: 'support-agent',\n spanCount: 8,\n },\n ],\n },\n ],\n },\n {\n id: 'issue',\n name: 'Issue',\n description: 'Recurring issue families found across support, research, and workflow traces.',\n clusters: [\n {\n id: 'revenue-analysis',\n name: 'Revenue analysis',\n description: 'Revenue-impacting requests, market scans, and financial summaries.',\n traceSummaries: [\n {\n id: 'trace-revenue-1',\n name: 'Summarize revenue movement',\n status: 'running',\n startedAt: '2026-06-15T11:05:00.000Z',\n durationMs: 4520,\n entityName: 'research-agent',\n spanCount: 15,\n },\n ],\n },\n ],\n },\n {\n id: 'severity',\n name: 'Severity',\n description: 'Risk and urgency bands inferred from trace paths and intervention needs.',\n clusters: [\n {\n id: 'urgent-escalations',\n name: 'Urgent escalations',\n description: 'High-priority paths that require faster handoff or deeper inspection.',\n traceSummaries: [\n {\n id: 'trace-severity-1',\n name: 'Escalate urgent account issue',\n status: 'error',\n startedAt: '2026-06-15T13:10:00.000Z',\n durationMs: 3880,\n entityName: 'support-agent',\n spanCount: 18,\n },\n ],\n },\n ],\n },\n];\n","import { useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { useTraces } from '../../../domains/traces/hooks';\nimport { ScatterPlotChart } from '../../../ds/components/ScatterPlotChart';\nimport { Tab, TabContent, TabList, Tabs } from '../../../ds/components/Tabs';\nimport { stringToColor } from '../../../lib/colors';\nimport { cn } from '../../../lib/utils';\nimport { TopicTraceDetailsPanel, TopicTraceSummaryList, TopicsLayout } from '../../topics';\nimport { getSignalChartData } from '../signals-chart-data';\nimport { signals } from '../signals-data';\nimport type { Signal, SignalCluster } from '../types';\n\nconst SignalTraceSummaryList = TopicTraceSummaryList;\nexport const SignalTraceDetailsPanel = TopicTraceDetailsPanel;\nconst SignalsLayout = TopicsLayout;\n\ntype SignalTab = 'trace-list' | 'chart';\n\nfunction findClusterByTraceId(signal: Signal | undefined, traceId: string | undefined) {\n if (!signal || !traceId) return undefined;\n return signal.clusters.find(cluster => cluster.traceSummaries.some(trace => trace.id === traceId));\n}\n\ninterface SignalClusterSidebarProps {\n signal: Signal;\n selectedClusterIds: string[];\n onClusterSelect: (clusterId: string) => void;\n multiple?: boolean;\n ariaLabel?: string;\n}\n\nexport function SignalClusterSidebar({\n signal,\n selectedClusterIds,\n onClusterSelect,\n multiple = false,\n ariaLabel = 'Signal clusters',\n}: SignalClusterSidebarProps) {\n return (\n <aside\n className=\"min-h-0 w-72 shrink-0 overflow-y-auto border-r border-border1/60 pr-4 py-4\"\n aria-label={ariaLabel}\n >\n <ul className=\"space-y-1\" role={multiple ? 'group' : undefined}>\n {signal.clusters.map(cluster => {\n const selected = selectedClusterIds.includes(cluster.id);\n return (\n <li key={cluster.id}>\n <button\n type=\"button\"\n role={multiple ? 'checkbox' : undefined}\n aria-checked={multiple ? selected : undefined}\n aria-pressed={multiple ? undefined : selected}\n className=\"group cursor-pointer w-full rounded-xl px-3 py-2 text-left transition-colors hover:bg-surface3 aria-pressed:bg-surface3 aria-checked:bg-surface3 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent1\"\n onClick={() => onClusterSelect(cluster.id)}\n >\n <span className=\"flex items-start gap-2\">\n <span\n className={cn('mt-1.5 h-2 w-2 shrink-0 rounded-full', multiple && !selected && 'invisible')}\n style={{ backgroundColor: stringToColor(cluster.name) }}\n />\n <span className=\"min-w-0 space-y-1\">\n <span\n className={cn(\n 'block text-sm font-medium',\n multiple && !selected ? 'text-neutral3' : 'text-neutral5',\n )}\n >\n {cluster.name}\n </span>\n <span\n className={cn(\n 'line-clamp-2 block text-sm',\n multiple && !selected ? 'text-neutral1' : 'text-neutral2',\n )}\n >\n {cluster.description}\n </span>\n </span>\n </span>\n </button>\n </li>\n );\n })}\n </ul>\n </aside>\n );\n}\n\nexport function SignalTraceListTab({\n cluster,\n selectedTraceId,\n onTraceSelect,\n}: {\n cluster: SignalCluster;\n selectedTraceId: string | null;\n onTraceSelect: () => void;\n}) {\n return (\n <SignalTraceSummaryList\n traces={cluster.traceSummaries}\n selectedTraceId={selectedTraceId}\n onTraceSelect={onTraceSelect}\n />\n );\n}\n\ninterface SignalChartTabProps {\n signal: Signal;\n selectedClusterIds: string[];\n onClusterToggle: (clusterId: string) => void;\n}\n\nexport function SignalChartTab({ signal, selectedClusterIds, onClusterToggle }: SignalChartTabProps) {\n const selectedClusters = useMemo(\n () => signal.clusters.filter(cluster => selectedClusterIds.includes(cluster.id)),\n [signal.clusters, selectedClusterIds],\n );\n const chartData = useMemo(() => getSignalChartData(selectedClusters), [selectedClusters]);\n\n return (\n <div className=\"flex h-full min-w-0 gap-6\">\n <SignalClusterSidebar\n signal={signal}\n selectedClusterIds={selectedClusterIds}\n onClusterSelect={onClusterToggle}\n multiple\n ariaLabel=\"Chart cluster filters\"\n />\n <div className=\"min-h-0 min-w-0 flex-1 py-4\">\n <ScatterPlotChart\n data={chartData}\n xKey=\"duration\"\n yKey=\"spans\"\n nameKey=\"name\"\n colorKey=\"color\"\n height=\"100%\"\n className=\"h-full\"\n xLabel=\"Duration\"\n yLabel=\"Spans\"\n formatX={value => `${value}ms`}\n formatY={value => `${value} spans`}\n />\n </div>\n </div>\n );\n}\n\ninterface SignalClusterTabsProps {\n signal: Signal;\n selectedCluster: SignalCluster;\n selectedTraceId: string | null;\n selectedChartClusterIds: string[];\n activeTab: SignalTab;\n onActiveTabChange: (tab: SignalTab) => void;\n onClusterSelect: (clusterId: string) => void;\n onChartClusterToggle: (clusterId: string) => void;\n onTraceSelect: () => void;\n}\n\nexport function SignalClusterTabs({\n signal,\n selectedCluster,\n selectedTraceId,\n selectedChartClusterIds,\n activeTab,\n onActiveTabChange,\n onClusterSelect,\n onChartClusterToggle,\n onTraceSelect,\n}: SignalClusterTabsProps) {\n return (\n <Tabs<SignalTab>\n defaultTab=\"trace-list\"\n value={activeTab}\n onValueChange={onActiveTabChange}\n className=\"flex h-full min-h-0 flex-col overflow-hidden\"\n >\n <TabList variant=\"line\">\n <Tab value=\"trace-list\">Trace list</Tab>\n <Tab value=\"chart\">Chart</Tab>\n </TabList>\n <TabContent value=\"trace-list\" className=\"min-h-0 flex-1 overflow-hidden py-0\">\n <div className=\"flex h-full min-w-0 gap-6\">\n <SignalClusterSidebar\n signal={signal}\n selectedClusterIds={[selectedCluster.id]}\n onClusterSelect={onClusterSelect}\n />\n <div className=\"min-w-0 flex-1 overflow-hidden py-4\">\n <SignalTraceListTab\n cluster={selectedCluster}\n selectedTraceId={selectedTraceId}\n onTraceSelect={onTraceSelect}\n />\n </div>\n </div>\n </TabContent>\n <TabContent value=\"chart\" className=\"min-h-0 flex-1 overflow-hidden py-0\">\n <SignalChartTab\n signal={signal}\n selectedClusterIds={selectedChartClusterIds}\n onClusterToggle={onChartClusterToggle}\n />\n </TabContent>\n </Tabs>\n );\n}\n\nexport interface SignalDetailsPageProps {\n signalId?: string;\n selectedTraceId: string | null;\n tracePanel?: ReactNode;\n onTraceSelect: (signalId: string, traceId: string) => void;\n}\n\nexport function SignalDetailsPage({ signalId, selectedTraceId, tracePanel, onTraceSelect }: SignalDetailsPageProps) {\n const selectedSignal = useMemo(() => signals.find(signal => signal.id === signalId), [signalId]);\n const initialCluster =\n findClusterByTraceId(selectedSignal, selectedTraceId ?? undefined) ?? selectedSignal?.clusters[0];\n const [selectedClusterId, setSelectedClusterId] = useState<string | null>(() => initialCluster?.id ?? null);\n const [selectedChartClusterIds, setSelectedChartClusterIds] = useState<string[]>(\n () => selectedSignal?.clusters.map(cluster => cluster.id) ?? [],\n );\n const [activeTab, setActiveTab] = useState<SignalTab>('trace-list');\n const selectedCluster = selectedSignal?.clusters.find(cluster => cluster.id === selectedClusterId) ?? initialCluster;\n const { data: tracesData } = useTraces({});\n const resolvedTraceId = tracesData?.spans[0]?.traceId ?? null;\n\n const handleTraceSelect = () => {\n if (!selectedSignal || !resolvedTraceId) return;\n\n onTraceSelect(selectedSignal.id, resolvedTraceId);\n };\n\n const handleChartClusterToggle = (clusterId: string) => {\n setSelectedChartClusterIds(current =>\n current.includes(clusterId) ? current.filter(id => id !== clusterId) : [...current, clusterId],\n );\n };\n\n if (!selectedSignal || !selectedCluster) {\n return <SignalsLayout sidebar={null}>Signal not found</SignalsLayout>;\n }\n\n return (\n <SignalsLayout sidebar={null} tracePanel={activeTab === 'trace-list' ? tracePanel : undefined}>\n <section className=\"flex h-full min-w-0 flex-col gap-4\">\n <header className=\"space-y-1\">\n <h1 className=\"text-icon-xl font-semibold text-neutral6\">{selectedSignal.name}</h1>\n <p className=\"text-ui-sm text-neutral3\">Explore trace patterns by cluster.</p>\n </header>\n <div className=\"min-h-0 flex-1 overflow-hidden\">\n <SignalClusterTabs\n signal={selectedSignal}\n selectedCluster={selectedCluster}\n selectedTraceId={selectedTraceId}\n selectedChartClusterIds={selectedChartClusterIds}\n activeTab={activeTab}\n onActiveTabChange={setActiveTab}\n onClusterSelect={setSelectedClusterId}\n onChartClusterToggle={handleChartClusterToggle}\n onTraceSelect={handleTraceSelect}\n />\n </div>\n </section>\n </SignalsLayout>\n );\n}\n","import { signals } from '../signals-data';\n\nexport function getSignalName(signalId: string) {\n return signals.find(signal => signal.id === signalId)?.name ?? signalId;\n}\n","import { ArrowUpRight } from 'lucide-react';\nimport { useMemo } from 'react';\nimport { Badge } from '../../../ds/components/Badge';\nimport { Button } from '../../../ds/components/Button';\nimport { stringToColor } from '../../../lib/colors';\nimport { TopicsLayout } from '../../topics';\nimport { signals } from '../signals-data';\nimport type { Signal, SignalCluster } from '../types';\n\ninterface SignalClusterCardProps {\n cluster: SignalCluster;\n totalTraceCount: number;\n}\n\nconst getTraceShare = (traceCount: number, totalTraceCount: number) => {\n if (totalTraceCount === 0) return 0;\n\n return Math.round((traceCount / totalTraceCount) * 100);\n};\n\nexport function SignalClusterCard({ cluster, totalTraceCount }: SignalClusterCardProps) {\n const traceCount = cluster.traceSummaries.length;\n const traceShare = getTraceShare(traceCount, totalTraceCount);\n const traceLabel = traceCount === 1 ? 'trace' : 'traces';\n const clusterColor = stringToColor(cluster.name);\n\n return (\n <article className=\"rounded-2xl border border-border1/70 bg-surface2 p-5 shadow-sm\">\n <div className=\"flex h-full min-w-0 flex-col\">\n <div className=\"flex min-w-0 items-start gap-2\">\n <span className=\"mt-2 h-2.5 w-2.5 shrink-0 rounded-full\" style={{ backgroundColor: clusterColor }} />\n\n <div>\n <h3 className=\"text-md font-semibold text-neutral6\">{cluster.name}</h3>\n <p className=\"line-clamp-2 text-sm text-neutral3\">{cluster.description}</p>\n </div>\n </div>\n\n <div className=\"space-y-1 pt-4 pl-4\">\n <div className=\"flex items-center justify-between\">\n <p className=\"font-mono text-xs uppercase text-neutral3\">Trace share</p>\n <p className=\"font-mono text-xs text-neutral3\">\n {traceCount} {traceLabel}\n </p>\n </div>\n\n <div className=\"grid grid-cols-[minmax(0,1fr)_4rem] items-center gap-4\">\n <div\n className=\"h-3 overflow-hidden rounded-full bg-surface4\"\n role=\"progressbar\"\n aria-label={`${cluster.name} trace share`}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={traceShare}\n >\n <div className=\"h-full rounded-full\" style={{ width: `${traceShare}%`, backgroundColor: clusterColor }} />\n </div>\n <p className=\"text-right text-ui-md font-semibold text-neutral6\">{traceShare}%</p>\n </div>\n </div>\n </div>\n </article>\n );\n}\n\ninterface SignalSectionProps {\n signal: Signal;\n onSeeDetails: (signal: Signal) => void;\n}\n\nexport function SignalSection({ signal, onSeeDetails }: SignalSectionProps) {\n const totalTraceCount = useMemo(\n () => signal.clusters.reduce((total, cluster) => total + cluster.traceSummaries.length, 0),\n [signal.clusters],\n );\n\n return (\n <section className=\"space-y-4\">\n <header className=\"flex items-start justify-between gap-6 px-1\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-3\">\n <h2 className=\"text-ui-2xl font-semibold text-neutral6\">{signal.name}</h2>\n <Badge variant=\"default\">\n {signal.clusters.length} {signal.clusters.length === 1 ? 'cluster' : 'clusters'}\n </Badge>\n </div>\n <p className=\"text-ui-lg text-neutral3\">{signal.description}</p>\n </div>\n\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"lg\"\n className=\"shrink-0 gap-2 rounded-xl px-5\"\n onClick={() => onSeeDetails(signal)}\n >\n See details\n <ArrowUpRight className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n </header>\n <div className=\"grid gap-6 md:grid-cols-2\">\n {signal.clusters.map(cluster => (\n <SignalClusterCard key={cluster.id} cluster={cluster} totalTraceCount={totalTraceCount} />\n ))}\n </div>\n </section>\n );\n}\n\nexport interface SignalsOverviewPageProps {\n onSignalSelect: (signal: Signal) => void;\n}\n\nexport function SignalsOverviewPage({ onSignalSelect }: SignalsOverviewPageProps) {\n return (\n <TopicsLayout sidebar={null} contentPadding={false}>\n <nav className=\"h-full min-w-0 overflow-y-auto p-6\" aria-label=\"Signals\">\n <div className=\"mx-auto flex max-w-6xl flex-col gap-12\">\n {signals.map(signal => (\n <SignalSection key={signal.id} signal={signal} onSeeDetails={onSignalSelect} />\n ))}\n </div>\n </nav>\n </TopicsLayout>\n );\n}\n"],"names":["jsxs","jsx","cn","useRef","useCallback","useState","useEffect","usePanelRef","Panel","Fragment","Icon","ChevronRight","ChevronLeft","Separator","ResizeHandleIndicator","Drawer","DrawerTrigger","DrawerPortal","DrawerBackdrop","DrawerViewport","DrawerPopup","DrawerTitle","create","persist","EntityType","createContext","useContext","format","useMemo","DateTimeRangePicker","Tooltip","TooltipTrigger","TooltipContent","Button","EyeIcon","LogsIcon","MetricsKpiCard","MetricsCard","MetricsLineChart","Tabs","TabList","Tab","TabContent","DataList","HorizontalBars","PRESET_MS","useMastraClient","useQuery","TOP_N","value","from","to","spans","AgentIcon","WorkflowIcon","BrainIcon","McpServerIcon","ToolsIcon","MemoryIcon","FolderIcon","GaugeIcon","DataKeysAndValues","ChevronUpIcon","ChevronDownIcon","ChevronsUpIcon","ChevronsDownIcon","FoldVerticalIcon","UnfoldVerticalIcon","ChevronsDownUpIcon","ChevronsUpDownIcon","tooltip","HoverCard","HoverCardTrigger","HoverCardContent","types","Spinner","isNonDefaultFilter","PropertyFilterApplied","PropertyFilterActions","downloadJson","toast","Loader2Icon","DownloadIcon","DataPanel","ButtonsGroup","truncateString","Link2Icon","CircleGaugeIcon","SaveIcon","WrenchIcon","Notice","FileInputIcon","FileOutputIcon","BracesIcon","KV","DataDetailsPanel","COLUMNS","ROW_HEIGHT","OVERSCAN","useVirtualizer","DataListSkeleton","TracesDataList","DropdownMenu","is401UnauthorizedError","SessionExpired","is403ForbiddenError","PermissionDenied","parseError","ErrorState","PRESET_LABELS","DATE_FORMAT","describeRange","EmptyState","CircleSlashIcon","ExternalLinkIcon","IMMUTABLE_CACHE_TIME","useQueryClient","useInView","useInfiniteQuery","DAY_MS","clearSelectionParams","DEFAULT_SAVED_MESSAGE","DEFAULT_CLEARED_MESSAGE","ArrowUpIcon","ArrowDownIcon","ArrowRightIcon","CopyButton","isUnsupportedObservabilityOperationError","LogsDataListSkeleton","LogsDataList","Skeleton","Checkbox","CodeDiff","getObservationTimestamp","ResponsiveContainer","AreaChart","XAxis","YAxis","Area","ReferenceLine","ScatterChart","Scatter","ComposedChart","label","RotateCcw","ArrowLeftIcon","Txt","Group","getTraceShare","Searchbar","stringToColor","ScatterPlotChart","Badge","ArrowUpRight"],"mappings":"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"}