@mastra/playground-ui 56.0.0 → 57.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{EmptyState-CdRjFB06.cjs → EmptyState-0MgNiP40.cjs} +11 -5
- package/dist/EmptyState-0MgNiP40.cjs.map +1 -0
- package/dist/{EmptyState-UWXhBp5U.js → EmptyState-CiZVWvpH.js} +11 -5
- package/dist/EmptyState-CiZVWvpH.js.map +1 -0
- package/dist/ErrorState-C7-4A-rB.cjs +21 -0
- package/dist/ErrorState-C7-4A-rB.cjs.map +1 -0
- package/dist/ErrorState-l5gg5Nzw.js +19 -0
- package/dist/ErrorState-l5gg5Nzw.js.map +1 -0
- package/dist/Header-BVnFQlzE.js +31 -0
- package/dist/Header-BVnFQlzE.js.map +1 -0
- package/dist/Header-CGjhJ0nQ.cjs +36 -0
- package/dist/Header-CGjhJ0nQ.cjs.map +1 -0
- package/dist/{PermissionDenied-Dz5qXpQj.cjs → PermissionDenied-CwLIzjpC.cjs} +11 -6
- package/dist/PermissionDenied-CwLIzjpC.cjs.map +1 -0
- package/dist/{PermissionDenied-B6TSGolC.js → PermissionDenied-DPM04x0a.js} +11 -6
- package/dist/PermissionDenied-DPM04x0a.js.map +1 -0
- package/dist/{SessionExpired-CF0BGNo_.cjs → SessionExpired-07Lz91i3.cjs} +4 -5
- package/dist/SessionExpired-07Lz91i3.cjs.map +1 -0
- package/dist/{SessionExpired-Bq5LcsDu.js → SessionExpired-CnJ8zr5Y.js} +4 -5
- package/dist/SessionExpired-CnJ8zr5Y.js.map +1 -0
- package/dist/ask-user-B_O3GEjY.cjs +216 -0
- package/dist/ask-user-B_O3GEjY.cjs.map +1 -0
- package/dist/ask-user-gT9rODOe.js +206 -0
- package/dist/ask-user-gT9rODOe.js.map +1 -0
- package/dist/{combobox-BWM3VH-n.cjs → combobox-BTZyTiyL.cjs} +3 -4
- package/dist/{combobox-BWM3VH-n.cjs.map → combobox-BTZyTiyL.cjs.map} +1 -1
- package/dist/{combobox-D7xJFZuO.js → combobox-B_gv8nUN.js} +2 -3
- package/dist/{combobox-D7xJFZuO.js.map → combobox-B_gv8nUN.js.map} +1 -1
- package/dist/components/ActionRow.cjs.js +38 -0
- package/dist/components/ActionRow.cjs.js.map +1 -0
- package/dist/components/ActionRow.d.ts +2 -0
- package/dist/components/ActionRow.es.js +34 -0
- package/dist/components/ActionRow.es.js.map +1 -0
- package/dist/components/Combobox.cjs.js +1 -1
- package/dist/components/Combobox.es.js +1 -1
- package/dist/components/Comment.cjs.js +2 -3
- package/dist/components/Comment.cjs.js.map +1 -1
- package/dist/components/Comment.es.js +1 -2
- package/dist/components/Comment.es.js.map +1 -1
- package/dist/components/DataCodeSection.cjs.js +1 -1
- package/dist/components/DataCodeSection.es.js +1 -1
- package/dist/components/DataDetailsPanel.cjs.js +2 -2
- package/dist/components/DataDetailsPanel.cjs.js.map +1 -1
- package/dist/components/DataDetailsPanel.es.js +2 -2
- package/dist/components/DataDetailsPanel.es.js.map +1 -1
- package/dist/components/DataPanel.cjs.js +1 -1
- package/dist/components/DataPanel.es.js +1 -1
- package/dist/components/DateTimePicker.cjs.js +1 -1
- package/dist/components/DateTimePicker.es.js +1 -1
- package/dist/components/DateTimeRangePicker.cjs.js +1 -1
- package/dist/components/DateTimeRangePicker.es.js +1 -1
- package/dist/components/EmptyState.cjs.js +1 -1
- package/dist/components/EmptyState.es.js +1 -1
- package/dist/components/EnvironmentVariablesEditor.cjs.js +7 -8
- package/dist/components/EnvironmentVariablesEditor.cjs.js.map +1 -1
- package/dist/components/EnvironmentVariablesEditor.es.js +1 -2
- package/dist/components/EnvironmentVariablesEditor.es.js.map +1 -1
- package/dist/components/ErrorState.cjs.js +1 -1
- package/dist/components/ErrorState.es.js +1 -1
- package/dist/components/FilterBar.cjs.js +490 -38
- package/dist/components/FilterBar.cjs.js.map +1 -1
- package/dist/components/FilterBar.es.js +490 -42
- package/dist/components/FilterBar.es.js.map +1 -1
- package/dist/components/FormFieldBlocks.cjs.js +11 -12
- package/dist/components/FormFieldBlocks.cjs.js.map +1 -1
- package/dist/components/FormFieldBlocks.es.js +4 -5
- package/dist/components/FormFieldBlocks.es.js.map +1 -1
- package/dist/components/Header.cjs.js +6 -31
- package/dist/components/Header.cjs.js.map +1 -1
- package/dist/components/Header.es.js +1 -30
- package/dist/components/Header.es.js.map +1 -1
- package/dist/components/IntegrationDialog.cjs.js +1 -1
- package/dist/components/IntegrationDialog.es.js +1 -1
- package/dist/components/JSONSchemaForm.cjs.js +2 -2
- package/dist/components/JSONSchemaForm.es.js +2 -2
- package/dist/components/ListSearch.cjs.js +1 -1
- package/dist/components/ListSearch.es.js +1 -1
- package/dist/components/LogsDataList.cjs.js +2 -0
- package/dist/components/LogsDataList.cjs.js.map +1 -1
- package/dist/components/LogsDataList.es.js +2 -0
- package/dist/components/LogsDataList.es.js.map +1 -1
- package/dist/components/Message.cjs.js +1 -1
- package/dist/components/Message.es.js +2 -2
- package/dist/components/MetricsCard.cjs.js +1 -1
- package/dist/components/MetricsCard.es.js +1 -1
- package/dist/components/MetricsKpiCard.cjs.js +1 -1
- package/dist/components/MetricsKpiCard.es.js +1 -1
- package/dist/components/PageLayout.cjs.js +30 -8
- package/dist/components/PageLayout.cjs.js.map +1 -1
- package/dist/components/PageLayout.es.js +32 -3
- package/dist/components/PageLayout.es.js.map +1 -1
- package/dist/components/PermissionDenied.cjs.js +1 -1
- package/dist/components/PermissionDenied.es.js +1 -1
- package/dist/components/PropertyFilter.cjs.js +2 -2
- package/dist/components/PropertyFilter.es.js +3 -3
- package/dist/components/RadioGroup.cjs.js +3 -56
- package/dist/components/RadioGroup.cjs.js.map +1 -1
- package/dist/components/RadioGroup.es.js +1 -39
- package/dist/components/RadioGroup.es.js.map +1 -1
- package/dist/components/SessionExpired.cjs.js +1 -1
- package/dist/components/SessionExpired.es.js +1 -1
- package/dist/components/SideDialog.cjs.js +10 -2
- package/dist/components/SideDialog.cjs.js.map +1 -1
- package/dist/components/SideDialog.es.js +10 -2
- package/dist/components/SideDialog.es.js.map +1 -1
- package/dist/components/Spinner.cjs.js +1 -1
- package/dist/components/Spinner.es.js +1 -1
- package/dist/components/Steps.cjs.js +1 -1
- package/dist/components/Steps.es.js +1 -1
- package/dist/components/Workflow.cjs.js +6 -6
- package/dist/components/Workflow.cjs.js.map +1 -1
- package/dist/components/Workflow.es.js +6 -6
- package/dist/components/Workflow.es.js.map +1 -1
- package/dist/components/ai/ask-user.cjs.js +4 -3
- package/dist/components/ai/ask-user.cjs.js.map +1 -1
- package/dist/components/ai/ask-user.es.js +1 -1
- package/dist/components/ai/tool-call.cjs.js +1 -1
- package/dist/components/ai/tool-call.es.js +2 -2
- package/dist/{data-code-section-qujvEc6j.cjs → data-code-section-Dpd2hzmU.cjs} +4 -4
- package/dist/{data-code-section-qujvEc6j.cjs.map → data-code-section-Dpd2hzmU.cjs.map} +1 -1
- package/dist/{data-code-section-DKz9Okaz.js → data-code-section-O-DRRO6N.js} +4 -4
- package/dist/{data-code-section-DKz9Okaz.js.map → data-code-section-O-DRRO6N.js.map} +1 -1
- package/dist/{data-panel-CWjgS1Gh.js → data-panel-CDJMMCvz.js} +3 -3
- package/dist/{data-panel-CWjgS1Gh.js.map → data-panel-CDJMMCvz.js.map} +1 -1
- package/dist/{data-panel-CWZJKBeW.cjs → data-panel-DNPcL38C.cjs} +3 -3
- package/dist/{data-panel-CWZJKBeW.cjs.map → data-panel-DNPcL38C.cjs.map} +1 -1
- package/dist/{date-time-range-picker-BcjLbkGu.js → date-time-range-picker-B-C-PPI4.js} +2 -3
- package/dist/{date-time-range-picker-BcjLbkGu.js.map → date-time-range-picker-B-C-PPI4.js.map} +1 -1
- package/dist/{date-time-range-picker-C6hjZswK.cjs → date-time-range-picker-D_mHYCx_.cjs} +3 -4
- package/dist/{date-time-range-picker-C6hjZswK.cjs.map → date-time-range-picker-D_mHYCx_.cjs.map} +1 -1
- package/dist/domains/chat/components/badge-wrapper.cjs.js +1 -1
- package/dist/domains/chat/components/badge-wrapper.es.js +1 -1
- package/dist/domains/chat/components/loading-badge.cjs.js +1 -1
- package/dist/domains/chat/components/loading-badge.es.js +1 -1
- package/dist/domains/chat/messages/reasoning.cjs.js +1 -1
- package/dist/domains/chat/messages/reasoning.cjs.js.map +1 -1
- package/dist/domains/chat/messages/reasoning.es.js +1 -1
- package/dist/domains/chat/messages/reasoning.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/ask-user-badge.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/ask-user-badge.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/ask-user-badge.es.js +2 -2
- package/dist/domains/chat/tools/badges/ask-user-badge.es.js.map +1 -1
- package/dist/domains/logs/components/logs-error-content.cjs.js +4 -7
- package/dist/domains/logs/components/logs-error-content.cjs.js.map +1 -1
- package/dist/domains/logs/components/logs-error-content.es.js +4 -7
- package/dist/domains/logs/components/logs-error-content.es.js.map +1 -1
- package/dist/domains/logs/components/logs-toolbar.cjs.js +1 -1
- package/dist/domains/logs/components/logs-toolbar.cjs.js.map +1 -1
- package/dist/domains/logs/components/logs-toolbar.es.js +1 -1
- package/dist/domains/logs/components/logs-toolbar.es.js.map +1 -1
- package/dist/domains/logs/components/no-logs-info.cjs.js +5 -5
- package/dist/domains/logs/components/no-logs-info.cjs.js.map +1 -1
- package/dist/domains/logs/components/no-logs-info.es.js +6 -6
- package/dist/domains/logs/components/no-logs-info.es.js.map +1 -1
- package/dist/domains/memory/components/flame-graph.cjs.js +6 -6
- package/dist/domains/memory/components/flame-graph.cjs.js.map +1 -1
- package/dist/domains/memory/components/flame-graph.es.js +6 -6
- package/dist/domains/memory/components/flame-graph.es.js.map +1 -1
- package/dist/domains/memory/components/observation-detail-view.cjs.js +10 -11
- package/dist/domains/memory/components/observation-detail-view.cjs.js.map +1 -1
- package/dist/domains/memory/components/observation-detail-view.es.js +10 -11
- package/dist/domains/memory/components/observation-detail-view.es.js.map +1 -1
- package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
- package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
- package/dist/domains/metrics/components/kpi-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/kpi-card-view.es.js +1 -1
- package/dist/domains/metrics/components/latency-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/latency-card-view.es.js +1 -1
- package/dist/domains/metrics/components/memory-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/memory-card-view.es.js +1 -1
- package/dist/domains/metrics/components/model-usage-cost-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/model-usage-cost-card-view.es.js +1 -1
- package/dist/domains/metrics/components/scores-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/scores-card-view.es.js +1 -1
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js +1 -1
- package/dist/domains/metrics/components/token-usage-timeline-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/token-usage-timeline-card-view.es.js +1 -1
- package/dist/domains/metrics/components/traces-volume-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/traces-volume-card-view.es.js +1 -1
- package/dist/domains/traces/components/no-traces-info.cjs.js +2 -3
- package/dist/domains/traces/components/no-traces-info.cjs.js.map +1 -1
- package/dist/domains/traces/components/no-traces-info.es.js +2 -3
- package/dist/domains/traces/components/no-traces-info.es.js.map +1 -1
- package/dist/domains/traces/components/span-data-panel-view.cjs.js +1 -1
- package/dist/domains/traces/components/span-data-panel-view.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +2 -2
- package/dist/domains/traces/components/span-summary-description.cjs.js +1 -1
- package/dist/domains/traces/components/span-summary-description.es.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-details.cjs.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-details.es.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-messages.cjs.js +1 -1
- package/dist/domains/traces/components/thread-trace/thread-trace-messages.es.js +1 -1
- package/dist/domains/traces/components/trace-columns-menu.cjs.js +4 -4
- package/dist/domains/traces/components/trace-columns-menu.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-columns-menu.es.js +2 -2
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js +2 -2
- package/dist/domains/traces/components/trace-data-panel-view.es.js +2 -2
- package/dist/domains/traces/components/trace-id-button.cjs.js +1 -1
- package/dist/domains/traces/components/trace-id-button.es.js +1 -1
- package/dist/domains/traces/components/trace-summary-description.cjs.js +1 -1
- package/dist/domains/traces/components/trace-summary-description.es.js +1 -1
- package/dist/domains/traces/components/trace-time-range-chip.cjs.js +2 -2
- package/dist/domains/traces/components/trace-time-range-chip.es.js +2 -2
- package/dist/domains/traces/components/traces-error-content.cjs.js +3 -3
- package/dist/domains/traces/components/traces-error-content.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-error-content.es.js +3 -3
- package/dist/domains/traces/components/traces-error-content.es.js.map +1 -1
- package/dist/domains/traces/components/traces-page-skeleton.cjs.js +2 -0
- package/dist/domains/traces/components/traces-page-skeleton.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-page-skeleton.es.js +2 -0
- package/dist/domains/traces/components/traces-page-skeleton.es.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-url-state.cjs.js +4 -2
- package/dist/domains/traces/hooks/use-trace-url-state.cjs.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-url-state.es.js +5 -3
- package/dist/domains/traces/hooks/use-trace-url-state.es.js.map +1 -1
- package/dist/domains/traces/trace-filters.cjs.js +92 -11
- package/dist/domains/traces/trace-filters.cjs.js.map +1 -1
- package/dist/domains/traces/trace-filters.es.js +87 -13
- package/dist/domains/traces/trace-filters.es.js.map +1 -1
- package/dist/domains/traces/trace-query-filters.cjs.js +76 -45
- package/dist/domains/traces/trace-query-filters.cjs.js.map +1 -1
- package/dist/domains/traces/trace-query-filters.es.js +76 -46
- package/dist/domains/traces/trace-query-filters.es.js.map +1 -1
- package/dist/domains/traces.cjs.js +7 -0
- package/dist/domains/traces.cjs.js.map +1 -1
- package/dist/domains/traces.es.js +2 -2
- package/dist/ee/signals/components/entity-index-list.cjs.js +2 -0
- package/dist/ee/signals/components/entity-index-list.cjs.js.map +1 -1
- package/dist/ee/signals/components/entity-index-list.es.js +2 -0
- package/dist/ee/signals/components/entity-index-list.es.js.map +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-detail.cjs.js +5 -7
- package/dist/ee/signals/components/trace-intelligence-entity-detail.cjs.js.map +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-detail.es.js +5 -7
- package/dist/ee/signals/components/trace-intelligence-entity-detail.es.js.map +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js +11 -13
- package/dist/ee/signals/components/trace-intelligence-entity-index.cjs.js.map +1 -1
- package/dist/ee/signals/components/trace-intelligence-entity-index.es.js +12 -14
- package/dist/ee/signals/components/trace-intelligence-entity-index.es.js.map +1 -1
- package/dist/ee/signals/sankey-signals.cjs.js +2 -2
- package/dist/ee/signals/sankey-signals.cjs.js.map +1 -1
- package/dist/ee/signals/sankey-signals.es.js +2 -2
- package/dist/ee/signals/sankey-signals.es.js.map +1 -1
- package/dist/ee/signals/settings/signal-definition-form-dialog.cjs.js +10 -11
- package/dist/ee/signals/settings/signal-definition-form-dialog.cjs.js.map +1 -1
- package/dist/ee/signals/settings/signal-definition-form-dialog.es.js +3 -4
- package/dist/ee/signals/settings/signal-definition-form-dialog.es.js.map +1 -1
- package/dist/ee/topics/components/topics-layout.cjs.js +1 -1
- package/dist/ee/topics/components/topics-layout.cjs.js.map +1 -1
- package/dist/ee/topics/components/topics-layout.es.js +1 -1
- package/dist/ee/topics/components/topics-layout.es.js.map +1 -1
- package/dist/{field-block-DWkbNcsV.js → field-error-id-BLxISyNV.js} +4 -2
- package/dist/field-error-id-BLxISyNV.js.map +1 -0
- package/dist/{field-block-Dy1IaWbv.cjs → field-error-id-CXi0XkjZ.cjs} +4 -1
- package/dist/field-error-id-CXi0XkjZ.cjs.map +1 -0
- package/dist/{filter-bar-chip-BxI0NgEz.cjs → filter-bar-chip-D-IRgccJ.cjs} +296 -65
- package/dist/filter-bar-chip-D-IRgccJ.cjs.map +1 -0
- package/dist/{filter-bar-chip-C-JxWUU8.js → filter-bar-chip-luoMVy8-.js} +293 -67
- package/dist/filter-bar-chip-luoMVy8-.js.map +1 -0
- package/dist/filter-bar-chip.css +33 -1
- package/dist/layout/tabbed-container.cjs.js +2 -2
- package/dist/layout/tabbed-container.es.js +2 -2
- package/dist/{list-search-vyxsZMAK.cjs → list-search-BEDvqI5f.cjs} +2 -2
- package/dist/{list-search-vyxsZMAK.cjs.map → list-search-BEDvqI5f.cjs.map} +1 -1
- package/dist/{list-search-BTW0Neuc.js → list-search-BcOawrgy.js} +2 -2
- package/dist/{list-search-BTW0Neuc.js.map → list-search-BcOawrgy.js.map} +1 -1
- package/dist/{message-BrwbcLPi.js → message-Cs8NW-MR.js} +2 -2
- package/dist/{message-BrwbcLPi.js.map → message-Cs8NW-MR.js.map} +1 -1
- package/dist/{message-CszposMZ.cjs → message-D9b33Pf_.cjs} +2 -2
- package/dist/{message-CszposMZ.cjs.map → message-D9b33Pf_.cjs.map} +1 -1
- package/dist/{metrics-card-BUJxiwec.cjs → metrics-card-D-VjFkUM.cjs} +3 -3
- package/dist/{metrics-card-BUJxiwec.cjs.map → metrics-card-D-VjFkUM.cjs.map} +1 -1
- package/dist/{metrics-card-BlBt1WHw.js → metrics-card-jjLRvic4.js} +3 -3
- package/dist/{metrics-card-BlBt1WHw.js.map → metrics-card-jjLRvic4.js.map} +1 -1
- package/dist/{metrics-kpi-card-CBSNmtc5.js → metrics-kpi-card-CY6F7nTX.js} +2 -2
- package/dist/{metrics-kpi-card-CBSNmtc5.js.map → metrics-kpi-card-CY6F7nTX.js.map} +1 -1
- package/dist/{metrics-kpi-card-CgqmNcEC.cjs → metrics-kpi-card-krK6uG7U.cjs} +2 -2
- package/dist/{metrics-kpi-card-CgqmNcEC.cjs.map → metrics-kpi-card-krK6uG7U.cjs.map} +1 -1
- package/dist/new/layout/app-shell.cjs.js +23 -28
- package/dist/new/layout/app-shell.cjs.js.map +1 -1
- package/dist/new/layout/app-shell.es.js +23 -28
- package/dist/new/layout/app-shell.es.js.map +1 -1
- package/dist/{property-filter-applied-BmxCPe2d.cjs → property-filter-applied-CAiO4FBw.cjs} +2 -2
- package/dist/{property-filter-applied-BmxCPe2d.cjs.map → property-filter-applied-CAiO4FBw.cjs.map} +1 -1
- package/dist/{property-filter-applied-BBiUbtr0.js → property-filter-applied-MIKU9okW.js} +2 -2
- package/dist/{property-filter-applied-BBiUbtr0.js.map → property-filter-applied-MIKU9okW.js.map} +1 -1
- package/dist/radio-group-BdEPWGzi.cjs +62 -0
- package/dist/radio-group-BdEPWGzi.cjs.map +1 -0
- package/dist/radio-group-CFZXUXZ5.js +40 -0
- package/dist/radio-group-CFZXUXZ5.js.map +1 -0
- package/dist/{search-field-block-D0PUUCAE.cjs → search-field-block-DAdvPs1N.cjs} +8 -9
- package/dist/{search-field-block-D0PUUCAE.cjs.map → search-field-block-DAdvPs1N.cjs.map} +1 -1
- package/dist/{search-field-block-B5vUVTpl.js → search-field-block-DjN9AgLw.js} +2 -3
- package/dist/{search-field-block-B5vUVTpl.js.map → search-field-block-DjN9AgLw.js.map} +1 -1
- package/dist/{select-field-block-W2u2WmN3.cjs → select-field-block-7EHxArfT.cjs} +8 -9
- package/dist/{select-field-block-W2u2WmN3.cjs.map → select-field-block-7EHxArfT.cjs.map} +1 -1
- package/dist/{select-field-block-Bu7UXI2H.js → select-field-block-CBte2DyW.js} +2 -3
- package/dist/{select-field-block-Bu7UXI2H.js.map → select-field-block-CBte2DyW.js.map} +1 -1
- package/dist/{span-payload-primitives-DnRsP93D.cjs → span-payload-primitives-BLKf0qn0.cjs} +2 -2
- package/dist/{span-payload-primitives-DnRsP93D.cjs.map → span-payload-primitives-BLKf0qn0.cjs.map} +1 -1
- package/dist/{span-payload-primitives-sbxk4CHC.js → span-payload-primitives-CDLOoJfp.js} +2 -2
- package/dist/{span-payload-primitives-sbxk4CHC.js.map → span-payload-primitives-CDLOoJfp.js.map} +1 -1
- package/dist/{spinner-CqP-NaB2.cjs → spinner-BCpN7LL9.cjs} +9 -3
- package/dist/spinner-BCpN7LL9.cjs.map +1 -0
- package/dist/{spinner-D2C2DYw8.js → spinner-ylbE0TJA.js} +9 -3
- package/dist/spinner-ylbE0TJA.js.map +1 -0
- package/dist/src/domains/traces/components/traces-error-content.d.ts +2 -2
- package/dist/src/domains/traces/hooks/use-trace-url-state.d.ts +5 -3
- package/dist/src/domains/traces/trace-filters.d.ts +19 -4
- package/dist/src/domains/traces/trace-query-filters.d.ts +13 -1
- package/dist/src/ds/components/ActionRow/action-row.d.ts +9 -0
- package/dist/src/ds/components/ActionRow/action-row.stories.d.ts +8 -0
- package/dist/src/ds/components/ActionRow/index.d.ts +5 -0
- package/dist/src/ds/components/ButtonsGroup/buttons-group.stories.d.ts +7 -5
- package/dist/src/ds/components/EmptyState/EmptyState.d.ts +8 -2
- package/dist/src/ds/components/EmptyState/empty-state.stories.d.ts +1 -0
- package/dist/src/ds/components/ErrorState/ErrorState.d.ts +3 -1
- package/dist/src/ds/components/ErrorState/error-state.stories.d.ts +1 -0
- package/dist/src/ds/components/FilterBar/filter-bar-advanced-chip.d.ts +10 -0
- package/dist/src/ds/components/FilterBar/filter-bar-context.d.ts +46 -9
- package/dist/src/ds/components/FilterBar/filter-bar-group-editor.d.ts +25 -0
- package/dist/src/ds/components/FilterBar/filter-bar-input.d.ts +8 -1
- package/dist/src/ds/components/FilterBar/filter-bar-option-list.d.ts +5 -0
- package/dist/src/ds/components/FilterBar/filter-bar-tree.d.ts +36 -0
- package/dist/src/ds/components/FilterBar/filter-bar.d.ts +28 -7
- package/dist/src/ds/components/FilterBar/filter-bar.stories.d.ts +3 -0
- package/dist/src/ds/components/FilterBar/index.d.ts +6 -1
- package/dist/src/ds/components/FilterBar/types.d.ts +36 -0
- package/dist/src/ds/components/FilterBar/use-settle-on-leave.d.ts +2 -0
- package/dist/src/ds/components/PageLayout/index.d.ts +1 -2
- package/dist/src/ds/components/PageLayout/page-layout.d.ts +13 -11
- package/dist/src/ds/components/PageLayout/page-layout.stories.d.ts +1 -2
- package/dist/src/ds/components/PermissionDenied/PermissionDenied.d.ts +3 -1
- package/dist/src/ds/components/PermissionDenied/permission-denied.stories.d.ts +1 -0
- package/dist/src/ds/components/SessionExpired/SessionExpired.d.ts +3 -1
- package/dist/src/ds/components/SessionExpired/session-expired.stories.d.ts +1 -0
- package/dist/src/ds/components/Spinner/spinner.d.ts +6 -3
- package/dist/src/ds/components/Spinner/spinner.stories.d.ts +1 -0
- package/dist/src/ds/components/ai/ask-user/ask-user.d.ts +13 -8
- package/dist/src/ds/new/layout/app-shell/app-shell.d.ts +2 -8
- package/dist/src/ds/new/layout/app-shell/app-shell.stories.d.ts +0 -1
- package/dist/style.css +42 -92
- package/dist/{text-field-block--EUJKlY_.js → text-field-block-DBesvdaa.js} +2 -3
- package/dist/{text-field-block--EUJKlY_.js.map → text-field-block-DBesvdaa.js.map} +1 -1
- package/dist/{text-field-block-BLpLWmu8.cjs → text-field-block-DUMc8MTJ.cjs} +8 -9
- package/dist/{text-field-block-BLpLWmu8.cjs.map → text-field-block-DUMc8MTJ.cjs.map} +1 -1
- package/dist/{tool-call-K147tCug.js → tool-call-Du8XIzfo.js} +2 -2
- package/dist/{tool-call-K147tCug.js.map → tool-call-Du8XIzfo.js.map} +1 -1
- package/dist/{tool-call-CMRvRE-v.cjs → tool-call-ZKSbU3LR.cjs} +2 -2
- package/dist/{tool-call-CMRvRE-v.cjs.map → tool-call-ZKSbU3LR.cjs.map} +1 -1
- package/dist/types-CIPrYAzY.js +9 -0
- package/dist/types-CIPrYAzY.js.map +1 -0
- package/dist/types-Ns4ZNp-g.cjs +12 -0
- package/dist/types-Ns4ZNp-g.cjs.map +1 -0
- package/package.json +6 -6
- package/dist/EmptyState-CdRjFB06.cjs.map +0 -1
- package/dist/EmptyState-UWXhBp5U.js.map +0 -1
- package/dist/ErrorState-B3uTRAEd.cjs +0 -16
- package/dist/ErrorState-B3uTRAEd.cjs.map +0 -1
- package/dist/ErrorState-DqRx8Dw_.js +0 -14
- package/dist/ErrorState-DqRx8Dw_.js.map +0 -1
- package/dist/PermissionDenied-B6TSGolC.js.map +0 -1
- package/dist/PermissionDenied-Dz5qXpQj.cjs.map +0 -1
- package/dist/SessionExpired-Bq5LcsDu.js.map +0 -1
- package/dist/SessionExpired-CF0BGNo_.cjs.map +0 -1
- package/dist/ask-user-CS2e6Re4.cjs +0 -147
- package/dist/ask-user-CS2e6Re4.cjs.map +0 -1
- package/dist/ask-user-gS3Y1bCc.js +0 -138
- package/dist/ask-user-gS3Y1bCc.js.map +0 -1
- package/dist/components/MainContent.cjs.js +0 -81
- package/dist/components/MainContent.cjs.js.map +0 -1
- package/dist/components/MainContent.d.ts +0 -2
- package/dist/components/MainContent.es.js +0 -75
- package/dist/components/MainContent.es.js.map +0 -1
- package/dist/field-block-DWkbNcsV.js.map +0 -1
- package/dist/field-block-Dy1IaWbv.cjs.map +0 -1
- package/dist/field-error-id-B3Z2Zu5y.cjs +0 -6
- package/dist/field-error-id-B3Z2Zu5y.cjs.map +0 -1
- package/dist/field-error-id-D3yg1nBh.js +0 -4
- package/dist/field-error-id-D3yg1nBh.js.map +0 -1
- package/dist/filter-bar-chip-BxI0NgEz.cjs.map +0 -1
- package/dist/filter-bar-chip-C-JxWUU8.js.map +0 -1
- package/dist/new/layout/page-shell.cjs.js +0 -34
- package/dist/new/layout/page-shell.cjs.js.map +0 -1
- package/dist/new/layout/page-shell.d.ts +0 -2
- package/dist/new/layout/page-shell.es.js +0 -30
- package/dist/new/layout/page-shell.es.js.map +0 -1
- package/dist/no-data-page-layout-DcVPjj-J.js +0 -9
- package/dist/no-data-page-layout-DcVPjj-J.js.map +0 -1
- package/dist/no-data-page-layout-Drzbg_w8.cjs +0 -11
- package/dist/no-data-page-layout-Drzbg_w8.cjs.map +0 -1
- package/dist/page-heading-context-D3yjYoJE.js +0 -9
- package/dist/page-heading-context-D3yjYoJE.js.map +0 -1
- package/dist/page-heading-context-Du-CpxAx.cjs +0 -12
- package/dist/page-heading-context-Du-CpxAx.cjs.map +0 -1
- package/dist/page-layout-C9ifD9Q8.cjs +0 -99
- package/dist/page-layout-C9ifD9Q8.cjs.map +0 -1
- package/dist/page-layout-xcM8IR-B.js +0 -97
- package/dist/page-layout-xcM8IR-B.js.map +0 -1
- package/dist/spinner-CqP-NaB2.cjs.map +0 -1
- package/dist/spinner-D2C2DYw8.js.map +0 -1
- package/dist/src/ds/components/MainContent/index.d.ts +0 -1
- package/dist/src/ds/components/MainContent/main-content.d.ts +0 -21
- package/dist/src/ds/components/MainContent/main-content.stories.d.ts +0 -10
- package/dist/src/ds/components/PageLayout/no-data-page-layout.d.ts +0 -6
- package/dist/src/ds/components/PageLayout/page-heading-context.d.ts +0 -2
- package/dist/src/ds/components/PageLayout/page-layout-column.d.ts +0 -5
- package/dist/src/ds/components/PageLayout/page-layout-main-area.d.ts +0 -7
- package/dist/src/ds/components/PageLayout/page-layout-root.d.ts +0 -7
- package/dist/src/ds/components/PageLayout/page-layout-row.d.ts +0 -11
- package/dist/src/ds/components/PageLayout/page-layout-top-area.d.ts +0 -5
- package/dist/src/ds/new/layout/page-shell/index.d.ts +0 -1
- package/dist/src/ds/new/layout/page-shell/page-shell.d.ts +0 -24
- package/dist/src/ds/new/layout/page-shell/page-shell.stories.d.ts +0 -63
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flame-graph.es.js","sources":["../../../../src/domains/memory/components/flame-graph.tsx"],"sourcesContent":["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 { overlaySurfaceStyle } from '../../../ds/primitives/raised-surface';\nimport type { ExtractedOmMarker } from '../lib/extract-markers';\nimport { tToTimestampMs } from '../lib/replay-selection';\nimport type { TDomain } from '../lib/timeline';\nimport { formatTimeDisplay, tToTimestamp } from '../lib/timeline';\nimport type { MemoryMessage, OMHistoryRecord } from '../types';\nimport {\n getAreaRowYMax,\n isEventPoint,\n toActiveObservationData,\n toBufferedObservationData,\n toCombinedRowData,\n toContextData,\n toEventData,\n toMessageData,\n toSelectedT,\n} from './flame-graph-data';\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 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=\"text-muted-foreground border-border/50 text-meta flex items-center self-stretch border-r pl-3\">\n Time\n </p>\n <div className=\"text-muted-foreground text-meta flex justify-between px-1 py-1.5 font-mono\">\n {ticks.map(t => (\n <span key={t}>{formatTimeDisplay(tToTimestamp(t, domain))}</span>\n ))}\n </div>\n </div>\n );\n}\n\nexport function 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={`${overlaySurfaceStyle} text-meta flex flex-col gap-0.5 rounded px-2 py-1.5 font-mono`}>\n {time && (\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-muted-foreground\">time</span>\n <span className=\"text-foreground\">{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-muted-foreground\">{entry.name}</span>\n <span className=\"text-foreground\">\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={`${overlaySurfaceStyle} text-meta rounded px-2 py-1 font-mono`}>\n {time && <span className=\"text-foreground\">{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 yMax = getAreaRowYMax(data, dataKey, threshold);\n\n return (\n <div className=\"border-border/50 relative grid grid-cols-[6rem_1fr] items-center border-b hover:z-10\">\n <p className=\"text-muted-foreground border-border/50 text-meta flex items-center self-stretch border-r pl-3\">\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=\"border-border/50 relative grid grid-cols-[6rem_1fr] items-center border-b hover:z-10\">\n <p className=\"text-muted-foreground border-border/50 text-meta flex items-center self-stretch border-r pl-3\">\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 combinedData = toCombinedRowData(areaData, areaDataKey, eventData);\n\n return (\n <div className=\"border-border/50 relative grid grid-cols-[6rem_1fr] items-center border-b hover:z-10\">\n <p className=\"text-muted-foreground border-border/50 text-meta flex items-center self-stretch border-r pl-3\">\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 t = toSelectedT(state?.activeLabel);\n if (t != null && onSelectT) onSelectT(t);\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 isEventPoint(props.payload) ? (\n <circle cx={props.cx as number} cy={props.cy as number} r={4} fill={color} />\n ) : (\n <></>\n )\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=\"border-border/50 grid grid-cols-[6rem_1fr] items-center border-b\">\n <div className=\"border-border/50 flex items-center gap-1 self-stretch border-r pl-3\">\n <p className=\"text-muted-foreground text-meta\">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 data-zoom-track=\"\"\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\n data-zoom-part=\"before\"\n className=\"bg-background/60 absolute inset-y-0 left-0\"\n style={{ width: `${leftPercent}%` }}\n />\n <div\n data-zoom-part=\"band\"\n className=\"border-border/30 bg-fill-subtle absolute inset-y-0 border-y\"\n style={{ left: `${leftPercent}%`, right: `${100 - rightPercent}%` }}\n />\n <div\n data-zoom-part=\"after\"\n className=\"bg-background/60 absolute inset-y-0 right-0\"\n style={{ width: `${100 - rightPercent}%` }}\n />\n <div\n data-zoom-handle=\"left\"\n className=\"bg-foreground/50 hover:bg-foreground absolute inset-y-0 w-1 cursor-col-resize\"\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 data-zoom-handle=\"right\"\n className=\"bg-foreground/50 hover:bg-foreground absolute inset-y-0 w-1 cursor-col-resize\"\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 pr-2 pb-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"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"flame-graph.es.js","sources":["../../../../src/domains/memory/components/flame-graph.tsx"],"sourcesContent":["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 { overlaySurfaceStyle } from '../../../ds/primitives/raised-surface';\nimport type { ExtractedOmMarker } from '../lib/extract-markers';\nimport { tToTimestampMs } from '../lib/replay-selection';\nimport type { TDomain } from '../lib/timeline';\nimport { formatTimeDisplay, tToTimestamp } from '../lib/timeline';\nimport type { MemoryMessage, OMHistoryRecord } from '../types';\nimport {\n getAreaRowYMax,\n isEventPoint,\n toActiveObservationData,\n toBufferedObservationData,\n toCombinedRowData,\n toContextData,\n toEventData,\n toMessageData,\n toSelectedT,\n} from './flame-graph-data';\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 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=\"border-border/50 text-meta text-muted-foreground flex items-center self-stretch border-r pl-3\">\n Time\n </p>\n <div className=\"text-meta text-muted-foreground flex justify-between px-1 py-1.5 font-mono\">\n {ticks.map(t => (\n <span key={t}>{formatTimeDisplay(tToTimestamp(t, domain))}</span>\n ))}\n </div>\n </div>\n );\n}\n\nexport function 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={`${overlaySurfaceStyle} text-meta flex flex-col gap-0.5 rounded px-2 py-1.5 font-mono`}>\n {time && (\n <div className=\"flex items-center justify-between gap-3\">\n <span className=\"text-muted-foreground\">time</span>\n <span className=\"text-foreground\">{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-muted-foreground\">{entry.name}</span>\n <span className=\"text-foreground\">\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={`${overlaySurfaceStyle} text-meta rounded px-2 py-1 font-mono`}>\n {time && <span className=\"text-foreground\">{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 yMax = getAreaRowYMax(data, dataKey, threshold);\n\n return (\n <div className=\"border-border/50 relative grid grid-cols-[6rem_1fr] items-center border-b hover:z-10\">\n <p className=\"border-border/50 text-meta text-muted-foreground flex items-center self-stretch border-r pl-3\">\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=\"border-border/50 relative grid grid-cols-[6rem_1fr] items-center border-b hover:z-10\">\n <p className=\"border-border/50 text-meta text-muted-foreground flex items-center self-stretch border-r pl-3\">\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 combinedData = toCombinedRowData(areaData, areaDataKey, eventData);\n\n return (\n <div className=\"border-border/50 relative grid grid-cols-[6rem_1fr] items-center border-b hover:z-10\">\n <p className=\"border-border/50 text-meta text-muted-foreground flex items-center self-stretch border-r pl-3\">\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 t = toSelectedT(state?.activeLabel);\n if (t != null && onSelectT) onSelectT(t);\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 isEventPoint(props.payload) ? (\n <circle cx={props.cx as number} cy={props.cy as number} r={4} fill={color} />\n ) : (\n <></>\n )\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=\"border-border/50 grid grid-cols-[6rem_1fr] items-center border-b\">\n <div className=\"border-border/50 flex items-center gap-1 self-stretch border-r pl-3\">\n <p className=\"text-meta text-muted-foreground\">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 data-zoom-track=\"\"\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\n data-zoom-part=\"before\"\n className=\"bg-background/60 absolute inset-y-0 left-0\"\n style={{ width: `${leftPercent}%` }}\n />\n <div\n data-zoom-part=\"band\"\n className=\"border-border/30 bg-fill-subtle absolute inset-y-0 border-y\"\n style={{ left: `${leftPercent}%`, right: `${100 - rightPercent}%` }}\n />\n <div\n data-zoom-part=\"after\"\n className=\"bg-background/60 absolute inset-y-0 right-0\"\n style={{ width: `${100 - rightPercent}%` }}\n />\n <div\n data-zoom-handle=\"left\"\n className=\"bg-foreground/50 hover:bg-foreground absolute inset-y-0 w-1 cursor-col-resize\"\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 data-zoom-handle=\"right\"\n className=\"bg-foreground/50 hover:bg-foreground absolute inset-y-0 w-1 cursor-col-resize\"\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 pr-2 pb-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"],"names":[],"mappings":"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"}
|
|
@@ -3,11 +3,10 @@
|
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
4
|
|
|
5
5
|
const jsxRuntime = require('react/jsx-runtime');
|
|
6
|
-
const lucideReact = require('lucide-react');
|
|
7
6
|
const React = require('react');
|
|
8
7
|
const checkbox = require('../../../checkbox-CI8JtZKS.cjs');
|
|
9
8
|
const codeDiff = require('../../../code-diff-DBtbPe9D.cjs');
|
|
10
|
-
const EmptyState = require('../../../EmptyState-
|
|
9
|
+
const EmptyState = require('../../../EmptyState-0MgNiP40.cjs');
|
|
11
10
|
const skeleton = require('../../../skeleton-cXUjPrq9.cjs');
|
|
12
11
|
const utils_cn = require('../../../cn-DG0X1KEP.cjs');
|
|
13
12
|
|
|
@@ -168,12 +167,12 @@ function ObservationItems({ items, nested = false }) {
|
|
|
168
167
|
function ObservationContent({ observations }) {
|
|
169
168
|
const sections = React.useMemo(() => parseObservations(observations), [observations]);
|
|
170
169
|
if (sections.length === 0) {
|
|
171
|
-
return /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground
|
|
170
|
+
return /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-caption text-muted-foreground italic", children: "Initialized" });
|
|
172
171
|
}
|
|
173
172
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-5", children: sections.map((section, i) => /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "space-y-3", children: [
|
|
174
173
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-border flex items-baseline justify-between gap-3 border-b pb-2", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
|
|
175
174
|
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-column text-foreground", children: section.title }),
|
|
176
|
-
section.relativeTime && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground
|
|
175
|
+
section.relativeTime && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-meta text-muted-foreground", children: section.relativeTime })
|
|
177
176
|
] }) }),
|
|
178
177
|
/* @__PURE__ */ jsxRuntime.jsx(ObservationItems, { items: section.items })
|
|
179
178
|
] }, `${section.title}-${i}`)) });
|
|
@@ -193,7 +192,7 @@ function ObservationHistoryPanel({
|
|
|
193
192
|
{
|
|
194
193
|
type: "button",
|
|
195
194
|
className: utils_cn.cn(
|
|
196
|
-
"
|
|
195
|
+
"w-full cursor-pointer truncate border-l-2 border-l-transparent px-3 py-2 text-left text-caption text-muted-foreground hover:bg-fill-subtle",
|
|
197
196
|
isSelected && "border-l-accent1 bg-fill-hover"
|
|
198
197
|
),
|
|
199
198
|
onClick: () => onSelectRecord(record.id),
|
|
@@ -232,21 +231,21 @@ function ObservationDetailView({
|
|
|
232
231
|
] });
|
|
233
232
|
}
|
|
234
233
|
if (!selected) {
|
|
235
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
234
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
236
235
|
EmptyState.EmptyState,
|
|
237
236
|
{
|
|
238
|
-
iconSlot: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CircleSlashIcon, { className: "size-4" }),
|
|
239
237
|
titleSlot: "No observations",
|
|
240
|
-
descriptionSlot: "No observational memory snapshots available for this thread."
|
|
238
|
+
descriptionSlot: "No observational memory snapshots available for this thread.",
|
|
239
|
+
variant: "fill"
|
|
241
240
|
}
|
|
242
|
-
)
|
|
241
|
+
);
|
|
243
242
|
}
|
|
244
243
|
const activeObservations = typeof selected.activeObservations === "string" ? selected.activeObservations : "";
|
|
245
244
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex size-full overflow-hidden", children: [
|
|
246
245
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-1 flex-col overflow-hidden", children: [
|
|
247
246
|
previousRecord && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-border border-b px-4 py-2", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-start justify-end gap-3", children: /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "text-caption flex cursor-pointer items-center gap-1.5", children: [
|
|
248
247
|
/* @__PURE__ */ jsxRuntime.jsx(checkbox.Checkbox, { checked: showDiff, onCheckedChange: (v) => setShowDiff(v === true) }),
|
|
249
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground
|
|
248
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-caption text-muted-foreground", children: "Show diff" })
|
|
250
249
|
] }) }) }),
|
|
251
250
|
/* @__PURE__ */ jsxRuntime.jsx("div", { "data-testid": "observation-detail-body", className: "flex-1 overflow-y-auto p-4", children: showDiff && previousRecord ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
252
251
|
codeDiff.CodeDiff,
|
|
@@ -254,7 +253,7 @@ function ObservationDetailView({
|
|
|
254
253
|
codeA: typeof previousRecord.activeObservations === "string" ? previousRecord.activeObservations : "",
|
|
255
254
|
codeB: activeObservations
|
|
256
255
|
}
|
|
257
|
-
) : activeObservations ? /* @__PURE__ */ jsxRuntime.jsx(ObservationContent, { observations: activeObservations }) : /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground
|
|
256
|
+
) : activeObservations ? /* @__PURE__ */ jsxRuntime.jsx(ObservationContent, { observations: activeObservations }) : /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-caption text-muted-foreground italic", children: selected.isObserving || selected.isReflecting ? "Processing…" : "Initialized" }) })
|
|
258
257
|
] }),
|
|
259
258
|
/* @__PURE__ */ jsxRuntime.jsx(ObservationHistoryPanel, { records: sorted, selectedRecordId: selected.id, onSelectRecord })
|
|
260
259
|
] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observation-detail-view.cjs.js","sources":["../../../../src/domains/memory/components/observation-detail-view.tsx"],"sourcesContent":["import { CircleSlashIcon } 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-muted-foreground',\n time: 'text-muted-foreground',\n };\n }\n switch (priority) {\n case 'high':\n return {\n card: 'border-purple-400/30 bg-purple-500/10',\n text: 'text-foreground',\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-foreground',\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-foreground',\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-foreground',\n time: 'text-green-200/80',\n };\n default:\n return {\n card: 'border-border bg-background',\n text: 'text-foreground',\n time: 'text-muted-foreground',\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 // Extracts a root observation line of the form `* 🔴 (11:55) some text`,\n // where the priority emoji and `(HH:MM)` timestamp are both optional:\n // → { priority: high, time: '11:55', text: 'some text' }.\n // Parsed incrementally instead of with a single regex: adjacent `\\s*` runs\n // around optional groups backtrack polynomially on adversarial input\n // (CodeQL js/polynomial-redos).\n if (trimmed.startsWith('*')) {\n let rest = trimmed.slice(1).trimStart();\n let priority: ParsedItem['priority'] = null;\n for (const emoji of ['🔴', '🟡', '🟢', '✅']) {\n if (rest.startsWith(emoji)) {\n priority = getPriorityFromEmoji(emoji);\n rest = rest.slice(emoji.length).trimStart();\n break;\n }\n }\n let time: string | null = null;\n const timeMatch = rest.match(/^\\((\\d{1,2}:\\d{2})\\)/);\n if (timeMatch) {\n const [matchedText, matchedTime] = timeMatch;\n if (matchedText !== undefined && matchedTime !== undefined) {\n time = matchedTime;\n rest = rest.slice(matchedText.length).trimStart();\n }\n }\n if (rest) {\n return { text: rest, time, priority, children: [] };\n }\n }\n return { text: trimmed, time: null, priority: null, children: [] };\n}\n\nfunction parseObservations(raw: string): ParsedSection[] {\n // Extracts the text between `<observations>` and `</observations>` (falls\n // back to the whole string when the tags are absent). indexOf instead of a\n // lazy regex to avoid polynomial backtracking on adversarial input\n // (CodeQL js/polynomial-redos).\n const openTag = '<observations>';\n const openIdx = raw.indexOf(openTag);\n const closeIdx = openIdx === -1 ? -1 : raw.indexOf('</observations>', openIdx + openTag.length);\n const content = (closeIdx === -1 ? raw : raw.slice(openIdx + openTag.length, closeIdx)).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 // Extracts a section header of the form `Date: Jul 2, 2026 (today)`,\n // where the parenthesized relative time is optional:\n // → { title: 'Jul 2, 2026', relativeTime: 'today' }.\n // Parsed with string ops instead of a lazy regex with an optional trailing\n // group, which backtracks polynomially (CodeQL js/polynomial-redos).\n if (trimmed.startsWith('Date:')) {\n let title = trimmed.slice('Date:'.length).trim();\n let relativeTime: string | null = null;\n if (title.endsWith(')')) {\n const openParen = title.lastIndexOf('(');\n const inner = openParen === -1 ? '' : title.slice(openParen + 1, -1);\n // `inner` must not contain ')' — mirrors the original `\\(([^)]+)\\)$` semantics\n if (openParen > 0 && inner && !inner.includes(')')) {\n relativeTime = inner.trim();\n title = title.slice(0, openParen).trim();\n }\n }\n if (title) {\n current = { title, relativeTime, items: [] };\n sections.push(current);\n lastRoot = null;\n continue;\n }\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 ? 'border-border space-y-2 border-l 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={`text-meta font-mono ${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('text-body break-words whitespace-pre-wrap', 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=\"text-muted-foreground text-caption italic\">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=\"border-border flex items-baseline justify-between gap-3 border-b pb-2\">\n <div className=\"min-w-0\">\n <h3 className=\"text-column text-foreground\">{section.title}</h3>\n {section.relativeTime && <p className=\"text-muted-foreground text-meta\">{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-border flex w-50 min-w-45 flex-col overflow-hidden border-l\">\n <div className=\"border-border border-b px-4 py-2\">\n <p className=\"text-body text-foreground\">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 'text-muted-foreground w-full cursor-pointer truncate border-l-2 border-l-transparent px-3 py-2 text-left text-caption hover:bg-fill-subtle',\n isSelected && 'border-l-accent1 bg-fill-hover',\n )}\n onClick={() => onSelectRecord(record.id)}\n >\n {record.activeObservations || (\n <span className=\"text-muted-foreground italic\">\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 const last = sorted.at(-1);\n if (!selectedRecordId && last) {\n onSelectRecord(last.id);\n }\n }, [selectedRecordId, sorted, onSelectRecord]);\n\n if (isLoading) {\n return (\n <div className=\"space-y-4 p-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={<CircleSlashIcon 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 size-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-border border-b px-4 py-2\">\n <div className=\"flex items-start justify-end gap-3\">\n <label className=\"text-caption flex cursor-pointer items-center gap-1.5\">\n <Checkbox checked={showDiff} onCheckedChange={v => setShowDiff(v === true)} />\n <span className=\"text-muted-foreground text-caption\">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=\"text-muted-foreground text-caption italic\">\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"],"names":["jsx","jsxs","cn","useMemo","useState","useEffect","Skeleton","EmptyState","CircleSlashIcon","Checkbox","CodeDiff"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"observation-detail-view.cjs.js","sources":["../../../../src/domains/memory/components/observation-detail-view.tsx"],"sourcesContent":["import { 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-muted-foreground',\n time: 'text-muted-foreground',\n };\n }\n switch (priority) {\n case 'high':\n return {\n card: 'border-purple-400/30 bg-purple-500/10',\n text: 'text-foreground',\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-foreground',\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-foreground',\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-foreground',\n time: 'text-green-200/80',\n };\n default:\n return {\n card: 'border-border bg-background',\n text: 'text-foreground',\n time: 'text-muted-foreground',\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 // Extracts a root observation line of the form `* 🔴 (11:55) some text`,\n // where the priority emoji and `(HH:MM)` timestamp are both optional:\n // → { priority: high, time: '11:55', text: 'some text' }.\n // Parsed incrementally instead of with a single regex: adjacent `\\s*` runs\n // around optional groups backtrack polynomially on adversarial input\n // (CodeQL js/polynomial-redos).\n if (trimmed.startsWith('*')) {\n let rest = trimmed.slice(1).trimStart();\n let priority: ParsedItem['priority'] = null;\n for (const emoji of ['🔴', '🟡', '🟢', '✅']) {\n if (rest.startsWith(emoji)) {\n priority = getPriorityFromEmoji(emoji);\n rest = rest.slice(emoji.length).trimStart();\n break;\n }\n }\n let time: string | null = null;\n const timeMatch = rest.match(/^\\((\\d{1,2}:\\d{2})\\)/);\n if (timeMatch) {\n const [matchedText, matchedTime] = timeMatch;\n if (matchedText !== undefined && matchedTime !== undefined) {\n time = matchedTime;\n rest = rest.slice(matchedText.length).trimStart();\n }\n }\n if (rest) {\n return { text: rest, time, priority, children: [] };\n }\n }\n return { text: trimmed, time: null, priority: null, children: [] };\n}\n\nfunction parseObservations(raw: string): ParsedSection[] {\n // Extracts the text between `<observations>` and `</observations>` (falls\n // back to the whole string when the tags are absent). indexOf instead of a\n // lazy regex to avoid polynomial backtracking on adversarial input\n // (CodeQL js/polynomial-redos).\n const openTag = '<observations>';\n const openIdx = raw.indexOf(openTag);\n const closeIdx = openIdx === -1 ? -1 : raw.indexOf('</observations>', openIdx + openTag.length);\n const content = (closeIdx === -1 ? raw : raw.slice(openIdx + openTag.length, closeIdx)).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 // Extracts a section header of the form `Date: Jul 2, 2026 (today)`,\n // where the parenthesized relative time is optional:\n // → { title: 'Jul 2, 2026', relativeTime: 'today' }.\n // Parsed with string ops instead of a lazy regex with an optional trailing\n // group, which backtracks polynomially (CodeQL js/polynomial-redos).\n if (trimmed.startsWith('Date:')) {\n let title = trimmed.slice('Date:'.length).trim();\n let relativeTime: string | null = null;\n if (title.endsWith(')')) {\n const openParen = title.lastIndexOf('(');\n const inner = openParen === -1 ? '' : title.slice(openParen + 1, -1);\n // `inner` must not contain ')' — mirrors the original `\\(([^)]+)\\)$` semantics\n if (openParen > 0 && inner && !inner.includes(')')) {\n relativeTime = inner.trim();\n title = title.slice(0, openParen).trim();\n }\n }\n if (title) {\n current = { title, relativeTime, items: [] };\n sections.push(current);\n lastRoot = null;\n continue;\n }\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 ? 'border-border space-y-2 border-l 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={`text-meta font-mono ${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('text-body break-words whitespace-pre-wrap', 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=\"text-caption text-muted-foreground italic\">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=\"border-border flex items-baseline justify-between gap-3 border-b pb-2\">\n <div className=\"min-w-0\">\n <h3 className=\"text-column text-foreground\">{section.title}</h3>\n {section.relativeTime && <p className=\"text-meta text-muted-foreground\">{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-border flex w-50 min-w-45 flex-col overflow-hidden border-l\">\n <div className=\"border-border border-b px-4 py-2\">\n <p className=\"text-body text-foreground\">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 truncate border-l-2 border-l-transparent px-3 py-2 text-left text-caption text-muted-foreground hover:bg-fill-subtle',\n isSelected && 'border-l-accent1 bg-fill-hover',\n )}\n onClick={() => onSelectRecord(record.id)}\n >\n {record.activeObservations || (\n <span className=\"text-muted-foreground italic\">\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 const last = sorted.at(-1);\n if (!selectedRecordId && last) {\n onSelectRecord(last.id);\n }\n }, [selectedRecordId, sorted, onSelectRecord]);\n\n if (isLoading) {\n return (\n <div className=\"space-y-4 p-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 <EmptyState\n titleSlot=\"No observations\"\n descriptionSlot=\"No observational memory snapshots available for this thread.\"\n variant=\"fill\"\n />\n );\n }\n\n const activeObservations = typeof selected.activeObservations === 'string' ? selected.activeObservations : '';\n\n return (\n <div className=\"flex size-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-border border-b px-4 py-2\">\n <div className=\"flex items-start justify-end gap-3\">\n <label className=\"text-caption flex cursor-pointer items-center gap-1.5\">\n <Checkbox checked={showDiff} onCheckedChange={v => setShowDiff(v === true)} />\n <span className=\"text-caption text-muted-foreground\">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=\"text-caption text-muted-foreground italic\">\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"],"names":["jsx","jsxs","cn","useMemo","useState","useEffect","Skeleton","EmptyState","Checkbox","CodeDiff"],"mappings":"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"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { CircleSlashIcon } from 'lucide-react';
|
|
3
2
|
import { useState, useMemo, useEffect } from 'react';
|
|
4
3
|
import { C as Checkbox } from '../../../checkbox-CQedzgsi.js';
|
|
5
4
|
import { C as CodeDiff } from '../../../code-diff-C5uY-3Hz.js';
|
|
6
|
-
import { E as EmptyState } from '../../../EmptyState-
|
|
5
|
+
import { E as EmptyState } from '../../../EmptyState-CiZVWvpH.js';
|
|
7
6
|
import { S as Skeleton } from '../../../skeleton-BsRAXyh5.js';
|
|
8
7
|
import { c as cn } from '../../../cn-65Adrsfj.js';
|
|
9
8
|
|
|
@@ -164,12 +163,12 @@ function ObservationItems({ items, nested = false }) {
|
|
|
164
163
|
function ObservationContent({ observations }) {
|
|
165
164
|
const sections = useMemo(() => parseObservations(observations), [observations]);
|
|
166
165
|
if (sections.length === 0) {
|
|
167
|
-
return /* @__PURE__ */ jsx("p", { className: "text-muted-foreground
|
|
166
|
+
return /* @__PURE__ */ jsx("p", { className: "text-caption text-muted-foreground italic", children: "Initialized" });
|
|
168
167
|
}
|
|
169
168
|
return /* @__PURE__ */ jsx("div", { className: "space-y-5", children: sections.map((section, i) => /* @__PURE__ */ jsxs("section", { className: "space-y-3", children: [
|
|
170
169
|
/* @__PURE__ */ jsx("div", { className: "border-border flex items-baseline justify-between gap-3 border-b pb-2", children: /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
171
170
|
/* @__PURE__ */ jsx("h3", { className: "text-column text-foreground", children: section.title }),
|
|
172
|
-
section.relativeTime && /* @__PURE__ */ jsx("p", { className: "text-muted-foreground
|
|
171
|
+
section.relativeTime && /* @__PURE__ */ jsx("p", { className: "text-meta text-muted-foreground", children: section.relativeTime })
|
|
173
172
|
] }) }),
|
|
174
173
|
/* @__PURE__ */ jsx(ObservationItems, { items: section.items })
|
|
175
174
|
] }, `${section.title}-${i}`)) });
|
|
@@ -189,7 +188,7 @@ function ObservationHistoryPanel({
|
|
|
189
188
|
{
|
|
190
189
|
type: "button",
|
|
191
190
|
className: cn(
|
|
192
|
-
"
|
|
191
|
+
"w-full cursor-pointer truncate border-l-2 border-l-transparent px-3 py-2 text-left text-caption text-muted-foreground hover:bg-fill-subtle",
|
|
193
192
|
isSelected && "border-l-accent1 bg-fill-hover"
|
|
194
193
|
),
|
|
195
194
|
onClick: () => onSelectRecord(record.id),
|
|
@@ -228,21 +227,21 @@ function ObservationDetailView({
|
|
|
228
227
|
] });
|
|
229
228
|
}
|
|
230
229
|
if (!selected) {
|
|
231
|
-
return /* @__PURE__ */ jsx(
|
|
230
|
+
return /* @__PURE__ */ jsx(
|
|
232
231
|
EmptyState,
|
|
233
232
|
{
|
|
234
|
-
iconSlot: /* @__PURE__ */ jsx(CircleSlashIcon, { className: "size-4" }),
|
|
235
233
|
titleSlot: "No observations",
|
|
236
|
-
descriptionSlot: "No observational memory snapshots available for this thread."
|
|
234
|
+
descriptionSlot: "No observational memory snapshots available for this thread.",
|
|
235
|
+
variant: "fill"
|
|
237
236
|
}
|
|
238
|
-
)
|
|
237
|
+
);
|
|
239
238
|
}
|
|
240
239
|
const activeObservations = typeof selected.activeObservations === "string" ? selected.activeObservations : "";
|
|
241
240
|
return /* @__PURE__ */ jsxs("div", { className: "flex size-full overflow-hidden", children: [
|
|
242
241
|
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col overflow-hidden", children: [
|
|
243
242
|
previousRecord && /* @__PURE__ */ jsx("div", { className: "border-border border-b px-4 py-2", children: /* @__PURE__ */ jsx("div", { className: "flex items-start justify-end gap-3", children: /* @__PURE__ */ jsxs("label", { className: "text-caption flex cursor-pointer items-center gap-1.5", children: [
|
|
244
243
|
/* @__PURE__ */ jsx(Checkbox, { checked: showDiff, onCheckedChange: (v) => setShowDiff(v === true) }),
|
|
245
|
-
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground
|
|
244
|
+
/* @__PURE__ */ jsx("span", { className: "text-caption text-muted-foreground", children: "Show diff" })
|
|
246
245
|
] }) }) }),
|
|
247
246
|
/* @__PURE__ */ jsx("div", { "data-testid": "observation-detail-body", className: "flex-1 overflow-y-auto p-4", children: showDiff && previousRecord ? /* @__PURE__ */ jsx(
|
|
248
247
|
CodeDiff,
|
|
@@ -250,7 +249,7 @@ function ObservationDetailView({
|
|
|
250
249
|
codeA: typeof previousRecord.activeObservations === "string" ? previousRecord.activeObservations : "",
|
|
251
250
|
codeB: activeObservations
|
|
252
251
|
}
|
|
253
|
-
) : activeObservations ? /* @__PURE__ */ jsx(ObservationContent, { observations: activeObservations }) : /* @__PURE__ */ jsx("p", { className: "text-muted-foreground
|
|
252
|
+
) : activeObservations ? /* @__PURE__ */ jsx(ObservationContent, { observations: activeObservations }) : /* @__PURE__ */ jsx("p", { className: "text-caption text-muted-foreground italic", children: selected.isObserving || selected.isReflecting ? "Processing…" : "Initialized" }) })
|
|
254
253
|
] }),
|
|
255
254
|
/* @__PURE__ */ jsx(ObservationHistoryPanel, { records: sorted, selectedRecordId: selected.id, onSelectRecord })
|
|
256
255
|
] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observation-detail-view.es.js","sources":["../../../../src/domains/memory/components/observation-detail-view.tsx"],"sourcesContent":["import { CircleSlashIcon } 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-muted-foreground',\n time: 'text-muted-foreground',\n };\n }\n switch (priority) {\n case 'high':\n return {\n card: 'border-purple-400/30 bg-purple-500/10',\n text: 'text-foreground',\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-foreground',\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-foreground',\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-foreground',\n time: 'text-green-200/80',\n };\n default:\n return {\n card: 'border-border bg-background',\n text: 'text-foreground',\n time: 'text-muted-foreground',\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 // Extracts a root observation line of the form `* 🔴 (11:55) some text`,\n // where the priority emoji and `(HH:MM)` timestamp are both optional:\n // → { priority: high, time: '11:55', text: 'some text' }.\n // Parsed incrementally instead of with a single regex: adjacent `\\s*` runs\n // around optional groups backtrack polynomially on adversarial input\n // (CodeQL js/polynomial-redos).\n if (trimmed.startsWith('*')) {\n let rest = trimmed.slice(1).trimStart();\n let priority: ParsedItem['priority'] = null;\n for (const emoji of ['🔴', '🟡', '🟢', '✅']) {\n if (rest.startsWith(emoji)) {\n priority = getPriorityFromEmoji(emoji);\n rest = rest.slice(emoji.length).trimStart();\n break;\n }\n }\n let time: string | null = null;\n const timeMatch = rest.match(/^\\((\\d{1,2}:\\d{2})\\)/);\n if (timeMatch) {\n const [matchedText, matchedTime] = timeMatch;\n if (matchedText !== undefined && matchedTime !== undefined) {\n time = matchedTime;\n rest = rest.slice(matchedText.length).trimStart();\n }\n }\n if (rest) {\n return { text: rest, time, priority, children: [] };\n }\n }\n return { text: trimmed, time: null, priority: null, children: [] };\n}\n\nfunction parseObservations(raw: string): ParsedSection[] {\n // Extracts the text between `<observations>` and `</observations>` (falls\n // back to the whole string when the tags are absent). indexOf instead of a\n // lazy regex to avoid polynomial backtracking on adversarial input\n // (CodeQL js/polynomial-redos).\n const openTag = '<observations>';\n const openIdx = raw.indexOf(openTag);\n const closeIdx = openIdx === -1 ? -1 : raw.indexOf('</observations>', openIdx + openTag.length);\n const content = (closeIdx === -1 ? raw : raw.slice(openIdx + openTag.length, closeIdx)).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 // Extracts a section header of the form `Date: Jul 2, 2026 (today)`,\n // where the parenthesized relative time is optional:\n // → { title: 'Jul 2, 2026', relativeTime: 'today' }.\n // Parsed with string ops instead of a lazy regex with an optional trailing\n // group, which backtracks polynomially (CodeQL js/polynomial-redos).\n if (trimmed.startsWith('Date:')) {\n let title = trimmed.slice('Date:'.length).trim();\n let relativeTime: string | null = null;\n if (title.endsWith(')')) {\n const openParen = title.lastIndexOf('(');\n const inner = openParen === -1 ? '' : title.slice(openParen + 1, -1);\n // `inner` must not contain ')' — mirrors the original `\\(([^)]+)\\)$` semantics\n if (openParen > 0 && inner && !inner.includes(')')) {\n relativeTime = inner.trim();\n title = title.slice(0, openParen).trim();\n }\n }\n if (title) {\n current = { title, relativeTime, items: [] };\n sections.push(current);\n lastRoot = null;\n continue;\n }\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 ? 'border-border space-y-2 border-l 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={`text-meta font-mono ${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('text-body break-words whitespace-pre-wrap', 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=\"text-muted-foreground text-caption italic\">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=\"border-border flex items-baseline justify-between gap-3 border-b pb-2\">\n <div className=\"min-w-0\">\n <h3 className=\"text-column text-foreground\">{section.title}</h3>\n {section.relativeTime && <p className=\"text-muted-foreground text-meta\">{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-border flex w-50 min-w-45 flex-col overflow-hidden border-l\">\n <div className=\"border-border border-b px-4 py-2\">\n <p className=\"text-body text-foreground\">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 'text-muted-foreground w-full cursor-pointer truncate border-l-2 border-l-transparent px-3 py-2 text-left text-caption hover:bg-fill-subtle',\n isSelected && 'border-l-accent1 bg-fill-hover',\n )}\n onClick={() => onSelectRecord(record.id)}\n >\n {record.activeObservations || (\n <span className=\"text-muted-foreground italic\">\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 const last = sorted.at(-1);\n if (!selectedRecordId && last) {\n onSelectRecord(last.id);\n }\n }, [selectedRecordId, sorted, onSelectRecord]);\n\n if (isLoading) {\n return (\n <div className=\"space-y-4 p-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={<CircleSlashIcon 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 size-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-border border-b px-4 py-2\">\n <div className=\"flex items-start justify-end gap-3\">\n <label className=\"text-caption flex cursor-pointer items-center gap-1.5\">\n <Checkbox checked={showDiff} onCheckedChange={v => setShowDiff(v === true)} />\n <span className=\"text-muted-foreground text-caption\">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=\"text-muted-foreground text-caption italic\">\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"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"observation-detail-view.es.js","sources":["../../../../src/domains/memory/components/observation-detail-view.tsx"],"sourcesContent":["import { 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-muted-foreground',\n time: 'text-muted-foreground',\n };\n }\n switch (priority) {\n case 'high':\n return {\n card: 'border-purple-400/30 bg-purple-500/10',\n text: 'text-foreground',\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-foreground',\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-foreground',\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-foreground',\n time: 'text-green-200/80',\n };\n default:\n return {\n card: 'border-border bg-background',\n text: 'text-foreground',\n time: 'text-muted-foreground',\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 // Extracts a root observation line of the form `* 🔴 (11:55) some text`,\n // where the priority emoji and `(HH:MM)` timestamp are both optional:\n // → { priority: high, time: '11:55', text: 'some text' }.\n // Parsed incrementally instead of with a single regex: adjacent `\\s*` runs\n // around optional groups backtrack polynomially on adversarial input\n // (CodeQL js/polynomial-redos).\n if (trimmed.startsWith('*')) {\n let rest = trimmed.slice(1).trimStart();\n let priority: ParsedItem['priority'] = null;\n for (const emoji of ['🔴', '🟡', '🟢', '✅']) {\n if (rest.startsWith(emoji)) {\n priority = getPriorityFromEmoji(emoji);\n rest = rest.slice(emoji.length).trimStart();\n break;\n }\n }\n let time: string | null = null;\n const timeMatch = rest.match(/^\\((\\d{1,2}:\\d{2})\\)/);\n if (timeMatch) {\n const [matchedText, matchedTime] = timeMatch;\n if (matchedText !== undefined && matchedTime !== undefined) {\n time = matchedTime;\n rest = rest.slice(matchedText.length).trimStart();\n }\n }\n if (rest) {\n return { text: rest, time, priority, children: [] };\n }\n }\n return { text: trimmed, time: null, priority: null, children: [] };\n}\n\nfunction parseObservations(raw: string): ParsedSection[] {\n // Extracts the text between `<observations>` and `</observations>` (falls\n // back to the whole string when the tags are absent). indexOf instead of a\n // lazy regex to avoid polynomial backtracking on adversarial input\n // (CodeQL js/polynomial-redos).\n const openTag = '<observations>';\n const openIdx = raw.indexOf(openTag);\n const closeIdx = openIdx === -1 ? -1 : raw.indexOf('</observations>', openIdx + openTag.length);\n const content = (closeIdx === -1 ? raw : raw.slice(openIdx + openTag.length, closeIdx)).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 // Extracts a section header of the form `Date: Jul 2, 2026 (today)`,\n // where the parenthesized relative time is optional:\n // → { title: 'Jul 2, 2026', relativeTime: 'today' }.\n // Parsed with string ops instead of a lazy regex with an optional trailing\n // group, which backtracks polynomially (CodeQL js/polynomial-redos).\n if (trimmed.startsWith('Date:')) {\n let title = trimmed.slice('Date:'.length).trim();\n let relativeTime: string | null = null;\n if (title.endsWith(')')) {\n const openParen = title.lastIndexOf('(');\n const inner = openParen === -1 ? '' : title.slice(openParen + 1, -1);\n // `inner` must not contain ')' — mirrors the original `\\(([^)]+)\\)$` semantics\n if (openParen > 0 && inner && !inner.includes(')')) {\n relativeTime = inner.trim();\n title = title.slice(0, openParen).trim();\n }\n }\n if (title) {\n current = { title, relativeTime, items: [] };\n sections.push(current);\n lastRoot = null;\n continue;\n }\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 ? 'border-border space-y-2 border-l 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={`text-meta font-mono ${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('text-body break-words whitespace-pre-wrap', 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=\"text-caption text-muted-foreground italic\">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=\"border-border flex items-baseline justify-between gap-3 border-b pb-2\">\n <div className=\"min-w-0\">\n <h3 className=\"text-column text-foreground\">{section.title}</h3>\n {section.relativeTime && <p className=\"text-meta text-muted-foreground\">{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-border flex w-50 min-w-45 flex-col overflow-hidden border-l\">\n <div className=\"border-border border-b px-4 py-2\">\n <p className=\"text-body text-foreground\">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 truncate border-l-2 border-l-transparent px-3 py-2 text-left text-caption text-muted-foreground hover:bg-fill-subtle',\n isSelected && 'border-l-accent1 bg-fill-hover',\n )}\n onClick={() => onSelectRecord(record.id)}\n >\n {record.activeObservations || (\n <span className=\"text-muted-foreground italic\">\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 const last = sorted.at(-1);\n if (!selectedRecordId && last) {\n onSelectRecord(last.id);\n }\n }, [selectedRecordId, sorted, onSelectRecord]);\n\n if (isLoading) {\n return (\n <div className=\"space-y-4 p-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 <EmptyState\n titleSlot=\"No observations\"\n descriptionSlot=\"No observational memory snapshots available for this thread.\"\n variant=\"fill\"\n />\n );\n }\n\n const activeObservations = typeof selected.activeObservations === 'string' ? selected.activeObservations : '';\n\n return (\n <div className=\"flex size-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-border border-b px-4 py-2\">\n <div className=\"flex items-start justify-end gap-3\">\n <label className=\"text-caption flex cursor-pointer items-center gap-1.5\">\n <Checkbox checked={showDiff} onCheckedChange={v => setShowDiff(v === true)} />\n <span className=\"text-caption text-muted-foreground\">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=\"text-caption text-muted-foreground italic\">\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"],"names":[],"mappings":";;;;;;;;AAqBA,SAAS,sBAAsB,IAAA,EAAqB;AAClD,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,qBAAqB,CAAA;AAC9C,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAM,GAAG,KAAA,EAAO,OAAO,CAAA,GAAI,KAAA;AAC3B,EAAA,MAAM,IAAA,GAAO,OAAO,KAAK,CAAA;AACzB,EAAA,MAAM,MAAA,GAAS,IAAA,IAAQ,EAAA,GAAK,IAAA,GAAO,IAAA;AACnC,EAAA,MAAM,cAAA,GAAiB,OAAO,EAAA,IAAM,EAAA;AACpC,EAAA,OAAO,CAAA,EAAG,cAAc,CAAA,CAAA,EAAI,OAAO,IAAI,MAAM,CAAA,CAAA;AAC/C;AAEA,SAAS,qBAAqB,KAAA,EAAwC;AACpE,EAAA,IAAI,KAAA,KAAU,MAAM,OAAO,MAAA;AAC3B,EAAA,IAAI,KAAA,KAAU,MAAM,OAAO,QAAA;AAC3B,EAAA,IAAI,KAAA,KAAU,MAAM,OAAO,KAAA;AAC3B,EAAA,IAAI,KAAA,KAAU,KAAK,OAAO,UAAA;AAC1B,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,eAAA,CAAgB,UAAkC,MAAA,EAAiB;AAC1E,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,mCAAA;AAAA,MACN,IAAA,EAAM,uBAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AACA,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,MAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,uCAAA;AAAA,QACN,IAAA,EAAM,iBAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,IACF,KAAK,QAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,mCAAA;AAAA,QACN,IAAA,EAAM,iBAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,IACF,KAAK,KAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,yCAAA;AAAA,QACN,IAAA,EAAM,iBAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,IACF,KAAK,UAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,qCAAA;AAAA,QACN,IAAA,EAAM,iBAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,IACF;AACE,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,6BAAA;AAAA,QACN,IAAA,EAAM,iBAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA;AAEN;AAEA,SAAS,UAAU,IAAA,EAAiC;AAClD,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,IAAI,QAAQ,UAAA,CAAW,MAAM,KAAK,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AAC1D,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA,CAAQ,cAAA,EAAgB,EAAE,EAAE,IAAA,EAAK;AACtD,IAAA,OAAO,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAU,IAAA,EAAM,QAAA,EAAU,EAAC,EAAE,GAAI,IAAA;AAAA,EACrE;AACA,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC3B,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA,CAAQ,OAAA,EAAS,EAAE,EAAE,IAAA,EAAK;AAC/C,IAAA,OAAO,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAU,IAAA,EAAM,QAAA,EAAU,EAAC,EAAE,GAAI,IAAA;AAAA,EACrE;AAOA,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC3B,IAAA,IAAI,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,EAAE,SAAA,EAAU;AACtC,IAAA,IAAI,QAAA,GAAmC,IAAA;AACvC,IAAA,KAAA,MAAW,SAAS,CAAC,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,GAAG,CAAA,EAAG;AAC3C,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA,EAAG;AAC1B,QAAA,QAAA,GAAW,qBAAqB,KAAK,CAAA;AACrC,QAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,MAAM,EAAE,SAAA,EAAU;AAC1C,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,IAAA,GAAsB,IAAA;AAC1B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,sBAAsB,CAAA;AACnD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,CAAC,WAAA,EAAa,WAAW,CAAA,GAAI,SAAA;AACnC,MAAA,IAAI,WAAA,KAAgB,MAAA,IAAa,WAAA,KAAgB,MAAA,EAAW;AAC1D,QAAA,IAAA,GAAO,WAAA;AACP,QAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,MAAM,EAAE,SAAA,EAAU;AAAA,MAClD;AAAA,IACF;AACA,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,MAAM,QAAA,EAAU,QAAA,EAAU,EAAC,EAAE;AAAA,IACpD;AAAA,EACF;AACA,EAAA,OAAO,EAAE,MAAM,OAAA,EAAS,IAAA,EAAM,MAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,EAAC,EAAE;AACnE;AAEA,SAAS,kBAAkB,GAAA,EAA8B;AAKvD,EAAA,MAAM,OAAA,GAAU,gBAAA;AAChB,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAA,CAAQ,OAAO,CAAA;AACnC,EAAA,MAAM,QAAA,GAAW,YAAY,EAAA,GAAK,EAAA,GAAK,IAAI,OAAA,CAAQ,iBAAA,EAAmB,OAAA,GAAU,OAAA,CAAQ,MAAM,CAAA;AAC9F,EAAA,MAAM,OAAA,GAAA,CAAW,QAAA,KAAa,EAAA,GAAK,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,EAAQ,QAAQ,CAAA,EAAG,IAAA,EAAK;AAC7F,EAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAC;AACtB,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAChC,EAAA,MAAM,WAA4B,EAAC;AACnC,EAAA,IAAI,OAAA,GAAgC,IAAA;AACpC,EAAA,IAAI,QAAA,GAA8B,IAAA;AAClC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,CAAC,OAAA,EAAS;AAMd,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,EAAG;AAC/B,MAAA,IAAI,QAAQ,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,MAAM,EAAE,IAAA,EAAK;AAC/C,MAAA,IAAI,YAAA,GAA8B,IAAA;AAClC,MAAA,IAAI,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AACvB,QAAA,MAAM,SAAA,GAAY,KAAA,CAAM,WAAA,CAAY,GAAG,CAAA;AACvC,QAAA,MAAM,KAAA,GAAQ,cAAc,EAAA,GAAK,EAAA,GAAK,MAAM,KAAA,CAAM,SAAA,GAAY,GAAG,EAAE,CAAA;AAEnE,QAAA,IAAI,YAAY,CAAA,IAAK,KAAA,IAAS,CAAC,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AAClD,UAAA,YAAA,GAAe,MAAM,IAAA,EAAK;AAC1B,UAAA,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,SAAS,EAAE,IAAA,EAAK;AAAA,QACzC;AAAA,MACF;AACA,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAA,GAAU,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,EAAC,EAAE;AAC3C,QAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AACrB,QAAA,QAAA,GAAW,IAAA;AACX,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,GAAU,EAAE,KAAA,EAAO,QAAA,EAAU,cAAc,IAAA,EAAM,KAAA,EAAO,EAAC,EAAE;AAC3D,MAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,IACvB;AACA,IAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,GAAI,CAAC,GAAG,MAAA,IAAU,CAAA;AACpD,IAAA,MAAM,QAAA,GAAW,MAAA,IAAU,CAAA,KAAM,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA,IAAK,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,IAAK,OAAA,CAAQ,WAAW,GAAG,CAAA,CAAA;AACjH,IAAA,MAAM,IAAA,GAAO,UAAU,IAAI,CAAA;AAC3B,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,YAAY,QAAA,EAAU;AACxB,MAAA,QAAA,CAAS,QAAA,CAAS,KAAK,IAAI,CAAA;AAC3B,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,KAAA,CAAM,KAAK,IAAI,CAAA;AACvB,IAAA,QAAA,GAAW,IAAA;AAAA,EACb;AACA,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,gBAAA,CAAiB,EAAE,KAAA,EAAO,MAAA,GAAS,OAAM,EAA8C;AAC9F,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,GAAS,uCAAA,GAA0C,aAChE,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,KAAM;AACtB,IAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,IAAA,CAAK,QAAA,EAAU,MAAM,CAAA;AACpD,IAAA,2BACG,KAAA,EAAA,EAA2C,SAAA,EAAU,aACpD,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wBAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,SAAI,SAAA,EAAU,+BAAA,EACZ,QAAA,EAAA,IAAA,CAAK,IAAA,wBACH,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,oBAAA,EAAuB,MAAA,CAAO,IAAI,CAAA,CAAA,EAAK,QAAA,EAAA,qBAAA,CAAsB,IAAA,CAAK,IAAI,GAAE,CAAA,EAE7F,CAAA;AAAA,2BACC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,4CAAA,EAA8C,MAAA,CAAO,IAAI,CAAA,EAC1E,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,WAAW,EAAA,CAAG,2CAAA,EAA6C,OAAO,IAAI,CAAA,EAAI,eAAK,IAAA,EAAK,CAAA;AAAA,QACtF,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,wBACrB,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,QAAA,kBAAA,GAAA,CAAC,oBAAiB,KAAA,EAAO,IAAA,CAAK,QAAA,EAAU,MAAA,EAAM,MAAC,CAAA,EACjD;AAAA,OAAA,EAEJ;AAAA,KAAA,EACF,CAAA,EAAA,EAfQ,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAgBxC,CAAA;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;AAEA,SAAS,kBAAA,CAAmB,EAAE,YAAA,EAAa,EAA6B;AACtE,EAAA,MAAM,QAAA,GAAW,QAAQ,MAAM,iBAAA,CAAkB,YAAY,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAC9E,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,uBAAO,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2CAAA,EAA4C,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,EAC7E;AACA,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,EAAS,CAAA,qBACtB,IAAA,CAAC,SAAA,EAAA,EAAsC,SAAA,EAAU,WAAA,EAC/C,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,SAAI,SAAA,EAAU,uEAAA,EACb,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,SAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6BAAA,EAA+B,QAAA,EAAA,OAAA,CAAQ,KAAA,EAAM,CAAA;AAAA,MAC1D,QAAQ,YAAA,oBAAgB,GAAA,CAAC,OAAE,SAAA,EAAU,iCAAA,EAAmC,kBAAQ,YAAA,EAAa;AAAA,KAAA,EAChG,CAAA,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,gBAAA,EAAA,EAAiB,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO;AAAA,GAAA,EAAA,EAP5B,GAAG,OAAA,CAAQ,KAAK,IAAI,CAAC,CAAA,CAQnC,CACD,CAAA,EACH,CAAA;AAEJ;AAEA,SAAS,uBAAA,CAAwB;AAAA,EAC/B,OAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,IAAI,OAAA,CAAQ,MAAA,IAAU,CAAA,EAAG,OAAO,IAAA;AAEhC,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oEAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kCAAA,EACb,QAAA,kBAAA,GAAA,CAAC,OAAE,SAAA,EAAU,2BAAA,EAA4B,qBAAO,CAAA,EAClD,CAAA;AAAA,wBACC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA,OAAA,CAAQ,IAAI,CAAA,MAAA,KAAU;AACrB,MAAA,MAAM,UAAA,GAAa,OAAO,EAAA,KAAO,gBAAA;AACjC,MAAA,uBACE,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAW,EAAA;AAAA,YACT,4IAAA;AAAA,YACA,UAAA,IAAc;AAAA,WAChB;AAAA,UACA,OAAA,EAAS,MAAM,cAAA,CAAe,MAAA,CAAO,EAAE,CAAA;AAAA,UAEtC,QAAA,EAAA,MAAA,CAAO,kBAAA,oBACN,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,YAAA,GAAe,aAAA,GAAqB,aAAA,EACpE;AAAA,SAAA;AAAA,QAXG,MAAA,CAAO;AAAA,OAad;AAAA,IAEJ,CAAC,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AASO,SAAS,qBAAA,CAAsB;AAAA,EACpC,OAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,EAA+B;AAC7B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA;AAE9C,EAAA,MAAM,MAAA,GAAS,OAAA;AAAA,IACb,MAAM,CAAC,GAAG,OAAO,EAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,IAAA,CAAK,EAAE,SAAS,CAAA,CAAE,SAAQ,GAAI,IAAI,KAAK,CAAA,CAAE,SAAS,CAAA,CAAE,OAAA,EAAS,CAAA;AAAA,IACnG,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,QAAA,GAAW,gBAAA,GAAmB,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,EAAA,KAAO,gBAAgB,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AAC1G,EAAA,MAAM,aAAA,GAAgB,WAAW,MAAA,CAAO,SAAA,CAAU,OAAK,CAAA,CAAE,EAAA,KAAO,QAAA,CAAS,EAAE,CAAA,GAAI,EAAA;AAC/E,EAAA,MAAM,iBAAiB,aAAA,GAAgB,CAAA,GAAI,MAAA,CAAO,aAAA,GAAgB,CAAC,CAAA,GAAI,IAAA;AAEvE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,EAAA,CAAG,EAAE,CAAA;AACzB,IAAA,IAAI,CAAC,oBAAoB,IAAA,EAAM;AAC7B,MAAA,cAAA,CAAe,KAAK,EAAE,CAAA;AAAA,IACxB;AAAA,EACF,CAAA,EAAG,CAAC,gBAAA,EAAkB,MAAA,EAAQ,cAAc,CAAC,CAAA;AAE7C,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,WAAU,UAAA,EAAW,CAAA;AAAA,sBAC/B,GAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,sBAClC,GAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,aAAA,EAAc;AAAA,KAAA,EACpC,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,uBACE,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,iBAAA;AAAA,QACV,eAAA,EAAgB,8DAAA;AAAA,QAChB,OAAA,EAAQ;AAAA;AAAA,KACV;AAAA,EAEJ;AAEA,EAAA,MAAM,qBAAqB,OAAO,QAAA,CAAS,kBAAA,KAAuB,QAAA,GAAW,SAAS,kBAAA,GAAqB,EAAA;AAE3G,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EAEb,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8CAAA,EACZ,QAAA,EAAA;AAAA,MAAA,cAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EACb,QAAA,kBAAA,IAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,uDAAA,EACf,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,SAAS,QAAA,EAAU,eAAA,EAAiB,OAAK,WAAA,CAAY,CAAA,KAAM,IAAI,CAAA,EAAG,CAAA;AAAA,wBAC5E,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAA,EAAqC,QAAA,EAAA,WAAA,EAAS;AAAA,OAAA,EAChE,GACF,CAAA,EACF,CAAA;AAAA,0BAGD,KAAA,EAAA,EAAI,aAAA,EAAY,2BAA0B,SAAA,EAAU,4BAAA,EAClD,sBAAY,cAAA,mBACX,GAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAO,OAAO,cAAA,CAAe,kBAAA,KAAuB,QAAA,GAAW,eAAe,kBAAA,GAAqB,EAAA;AAAA,UACnG,KAAA,EAAO;AAAA;AAAA,UAEP,kBAAA,mBACF,GAAA,CAAC,kBAAA,EAAA,EAAmB,YAAA,EAAc,oBAAoB,CAAA,mBAEtD,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6CACV,QAAA,EAAA,QAAA,CAAS,WAAA,IAAe,SAAS,YAAA,GAAe,aAAA,GAAgB,eACnE,CAAA,EAEJ;AAAA,KAAA,EACF,CAAA;AAAA,wBAGC,uBAAA,EAAA,EAAwB,OAAA,EAAS,QAAQ,gBAAA,EAAkB,QAAA,CAAS,IAAI,cAAA,EAAgC;AAAA,GAAA,EAC3G,CAAA;AAEJ;;;;"}
|
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
4
4
|
|
|
5
5
|
const jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
const React = require('react');
|
|
7
|
-
const dateTimeRangePicker = require('../../../date-time-range-picker-
|
|
7
|
+
const dateTimeRangePicker = require('../../../date-time-range-picker-D_mHYCx_.cjs');
|
|
8
8
|
const domains_metrics_hooks_useMetrics = require('../hooks/use-metrics.cjs.js');
|
|
9
9
|
|
|
10
10
|
const METRICS_PRESETS = [
|