@flanksource/clicky-ui 0.2.13 → 0.2.15
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/chat.cjs +20 -0
- package/dist/chat.cjs.map +1 -0
- package/dist/chat.d.ts +2 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +20 -0
- package/dist/chat.js.map +1 -0
- package/dist/components/Combobox.cjs +5 -3
- package/dist/components/Combobox.cjs.map +1 -1
- package/dist/components/Combobox.d.ts +2 -0
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +5 -3
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/DateTimePicker.cjs +3 -1
- package/dist/components/DateTimePicker.cjs.map +1 -1
- package/dist/components/DateTimePicker.d.ts +5 -1
- package/dist/components/DateTimePicker.d.ts.map +1 -1
- package/dist/components/DateTimePicker.js +3 -1
- package/dist/components/DateTimePicker.js.map +1 -1
- package/dist/components/FilterBar.cjs +8 -41
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts +0 -2
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +3 -36
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/FormatOptionsDropdown.cjs +2 -18
- package/dist/components/FormatOptionsDropdown.cjs.map +1 -1
- package/dist/components/FormatOptionsDropdown.d.ts +1 -17
- package/dist/components/FormatOptionsDropdown.d.ts.map +1 -1
- package/dist/components/FormatOptionsDropdown.js +1 -17
- package/dist/components/FormatOptionsDropdown.js.map +1 -1
- package/dist/components/JsonSchemaForm.cjs +128 -12
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.d.ts +1 -1
- package/dist/components/JsonSchemaForm.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm.js +131 -15
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/SecretKeySelector.cjs +1 -2
- package/dist/components/SecretKeySelector.cjs.map +1 -1
- package/dist/components/SecretKeySelector.d.ts +5 -3
- package/dist/components/SecretKeySelector.d.ts.map +1 -1
- package/dist/components/SecretKeySelector.js +2 -3
- package/dist/components/SecretKeySelector.js.map +1 -1
- package/dist/components/TreePickerField.cjs +137 -0
- package/dist/components/TreePickerField.cjs.map +1 -0
- package/dist/components/TreePickerField.d.ts +30 -0
- package/dist/components/TreePickerField.d.ts.map +1 -0
- package/dist/components/TreePickerField.js +137 -0
- package/dist/components/TreePickerField.js.map +1 -0
- package/dist/components/WorkloadPicker.cjs +6 -81
- package/dist/components/WorkloadPicker.cjs.map +1 -1
- package/dist/components/WorkloadPicker.d.ts +1 -20
- package/dist/components/WorkloadPicker.d.ts.map +1 -1
- package/dist/components/WorkloadPicker.js +3 -78
- package/dist/components/WorkloadPicker.js.map +1 -1
- package/dist/components/button-variants.cjs +30 -0
- package/dist/components/button-variants.cjs.map +1 -0
- package/dist/components/button-variants.d.ts +5 -0
- package/dist/components/button-variants.d.ts.map +1 -0
- package/dist/components/button-variants.js +30 -0
- package/dist/components/button-variants.js.map +1 -0
- package/dist/components/button.cjs +11 -82
- package/dist/components/button.cjs.map +1 -1
- package/dist/components/button.d.ts +1 -5
- package/dist/components/button.d.ts.map +1 -1
- package/dist/components/button.js +5 -76
- package/dist/components/button.js.map +1 -1
- package/dist/components/filter-bar-utils.cjs +37 -0
- package/dist/components/filter-bar-utils.cjs.map +1 -0
- package/dist/components/filter-bar-utils.d.ts +4 -0
- package/dist/components/filter-bar-utils.d.ts.map +1 -0
- package/dist/components/filter-bar-utils.js +37 -0
- package/dist/components/filter-bar-utils.js.map +1 -0
- package/dist/components/format-options.cjs +20 -0
- package/dist/components/format-options.cjs.map +1 -0
- package/dist/components/format-options.d.ts +18 -0
- package/dist/components/format-options.d.ts.map +1 -0
- package/dist/components/format-options.js +20 -0
- package/dist/components/format-options.js.map +1 -0
- package/dist/components/json-schema-form-array.cjs +13 -17
- package/dist/components/json-schema-form-array.cjs.map +1 -1
- package/dist/components/json-schema-form-array.d.ts +1 -2
- package/dist/components/json-schema-form-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-array.js +3 -7
- package/dist/components/json-schema-form-array.js.map +1 -1
- package/dist/components/json-schema-form-fields.cjs +90 -232
- package/dist/components/json-schema-form-fields.cjs.map +1 -1
- package/dist/components/json-schema-form-fields.d.ts +51 -6
- package/dist/components/json-schema-form-fields.d.ts.map +1 -1
- package/dist/components/json-schema-form-fields.js +82 -224
- package/dist/components/json-schema-form-fields.js.map +1 -1
- package/dist/components/json-schema-form-object.cjs +149 -0
- package/dist/components/json-schema-form-object.cjs.map +1 -0
- package/dist/components/json-schema-form-object.d.ts +10 -0
- package/dist/components/json-schema-form-object.d.ts.map +1 -0
- package/dist/components/json-schema-form-object.js +149 -0
- package/dist/components/json-schema-form-object.js.map +1 -0
- package/dist/components/json-schema-form-preferences.cjs +41 -0
- package/dist/components/json-schema-form-preferences.cjs.map +1 -0
- package/dist/components/json-schema-form-preferences.d.ts +10 -0
- package/dist/components/json-schema-form-preferences.d.ts.map +1 -0
- package/dist/components/json-schema-form-preferences.js +41 -0
- package/dist/components/json-schema-form-preferences.js.map +1 -0
- package/dist/components/json-schema-form-render.cjs +43 -72
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts +5 -33
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +41 -70
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +9 -1
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
- package/dist/components/json-schema-form-resolve.js +9 -1
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +58 -1
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.cjs +96 -0
- package/dist/components/json-schema-form-utils.cjs.map +1 -0
- package/dist/components/json-schema-form-utils.d.ts +17 -0
- package/dist/components/json-schema-form-utils.d.ts.map +1 -0
- package/dist/components/json-schema-form-utils.js +96 -0
- package/dist/components/json-schema-form-utils.js.map +1 -0
- package/dist/components/loading.cjs +109 -0
- package/dist/components/loading.cjs.map +1 -0
- package/dist/components/loading.d.ts +27 -0
- package/dist/components/loading.d.ts.map +1 -0
- package/dist/components/loading.js +109 -0
- package/dist/components/loading.js.map +1 -0
- package/dist/components/workload-picker-utils.cjs +88 -0
- package/dist/components/workload-picker-utils.cjs.map +1 -0
- package/dist/components/workload-picker-utils.d.ts +34 -0
- package/dist/components/workload-picker-utils.d.ts.map +1 -0
- package/dist/components/workload-picker-utils.js +88 -0
- package/dist/components/workload-picker-utils.js.map +1 -0
- package/dist/components.cjs +18 -6
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +10 -3
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +16 -4
- package/dist/components.js.map +1 -1
- package/dist/data/Badge.cjs +11 -91
- package/dist/data/Badge.cjs.map +1 -1
- package/dist/data/Badge.d.ts +1 -5
- package/dist/data/Badge.d.ts.map +1 -1
- package/dist/data/Badge.js +11 -91
- package/dist/data/Badge.js.map +1 -1
- package/dist/data/Clicky.cjs +4 -3
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.d.ts.map +1 -1
- package/dist/data/Clicky.js +4 -3
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/DataTable.cjs +161 -156
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +25 -4
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +140 -135
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/FilterPill.cjs +3 -0
- package/dist/data/FilterPill.cjs.map +1 -1
- package/dist/data/FilterPill.d.ts.map +1 -1
- package/dist/data/FilterPill.js +3 -0
- package/dist/data/FilterPill.js.map +1 -1
- package/dist/data/Icon.cjs +7 -7
- package/dist/data/Icon.cjs.map +1 -1
- package/dist/data/Icon.js +7 -7
- package/dist/data/Icon.js.map +1 -1
- package/dist/data/LogDetails.cjs +5 -14
- package/dist/data/LogDetails.cjs.map +1 -1
- package/dist/data/LogDetails.d.ts +8 -4
- package/dist/data/LogDetails.d.ts.map +1 -1
- package/dist/data/LogDetails.js +4 -13
- package/dist/data/LogDetails.js.map +1 -1
- package/dist/data/LogsTable.cjs +6 -165
- package/dist/data/LogsTable.cjs.map +1 -1
- package/dist/data/LogsTable.d.ts +2 -15
- package/dist/data/LogsTable.d.ts.map +1 -1
- package/dist/data/LogsTable.js +6 -165
- package/dist/data/LogsTable.js.map +1 -1
- package/dist/data/TimeseriesCoreBars.cjs +8 -1
- package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
- package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
- package/dist/data/TimeseriesCoreBars.js +8 -1
- package/dist/data/TimeseriesCoreBars.js.map +1 -1
- package/dist/data/TimeseriesPanel.axes.cjs.map +1 -1
- package/dist/data/TimeseriesPanel.axes.js.map +1 -1
- package/dist/data/TreeNode.cjs +13 -7
- package/dist/data/TreeNode.cjs.map +1 -1
- package/dist/data/TreeNode.d.ts.map +1 -1
- package/dist/data/TreeNode.js +13 -7
- package/dist/data/TreeNode.js.map +1 -1
- package/dist/data/badge-variants.cjs +85 -0
- package/dist/data/badge-variants.cjs.map +1 -0
- package/dist/data/badge-variants.d.ts +6 -0
- package/dist/data/badge-variants.d.ts.map +1 -0
- package/dist/data/badge-variants.js +85 -0
- package/dist/data/badge-variants.js.map +1 -0
- package/dist/data/cache-browser/CacheBrowser.cjs +59 -0
- package/dist/data/cache-browser/CacheBrowser.cjs.map +1 -0
- package/dist/data/cache-browser/CacheBrowser.d.ts +26 -0
- package/dist/data/cache-browser/CacheBrowser.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheBrowser.js +59 -0
- package/dist/data/cache-browser/CacheBrowser.js.map +1 -0
- package/dist/data/cache-browser/CacheDetailPanel.cjs +193 -0
- package/dist/data/cache-browser/CacheDetailPanel.cjs.map +1 -0
- package/dist/data/cache-browser/CacheDetailPanel.d.ts +20 -0
- package/dist/data/cache-browser/CacheDetailPanel.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheDetailPanel.js +193 -0
- package/dist/data/cache-browser/CacheDetailPanel.js.map +1 -0
- package/dist/data/cache-browser/CacheStatsOverview.cjs +126 -0
- package/dist/data/cache-browser/CacheStatsOverview.cjs.map +1 -0
- package/dist/data/cache-browser/CacheStatsOverview.d.ts +17 -0
- package/dist/data/cache-browser/CacheStatsOverview.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheStatsOverview.js +126 -0
- package/dist/data/cache-browser/CacheStatsOverview.js.map +1 -0
- package/dist/data/cache-browser/CacheTree.cjs +189 -0
- package/dist/data/cache-browser/CacheTree.cjs.map +1 -0
- package/dist/data/cache-browser/CacheTree.d.ts +27 -0
- package/dist/data/cache-browser/CacheTree.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheTree.js +189 -0
- package/dist/data/cache-browser/CacheTree.js.map +1 -0
- package/dist/data/cache-browser/CacheValue.cjs +86 -0
- package/dist/data/cache-browser/CacheValue.cjs.map +1 -0
- package/dist/data/cache-browser/CacheValue.d.ts +11 -0
- package/dist/data/cache-browser/CacheValue.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheValue.js +86 -0
- package/dist/data/cache-browser/CacheValue.js.map +1 -0
- package/dist/data/cache-browser/adapter.cjs +52 -0
- package/dist/data/cache-browser/adapter.cjs.map +1 -0
- package/dist/data/cache-browser/adapter.d.ts +48 -0
- package/dist/data/cache-browser/adapter.d.ts.map +1 -0
- package/dist/data/cache-browser/adapter.js +52 -0
- package/dist/data/cache-browser/adapter.js.map +1 -0
- package/dist/data/cache-browser/api.cjs +42 -0
- package/dist/data/cache-browser/api.cjs.map +1 -0
- package/dist/data/cache-browser/api.d.ts +33 -0
- package/dist/data/cache-browser/api.d.ts.map +1 -0
- package/dist/data/cache-browser/api.js +42 -0
- package/dist/data/cache-browser/api.js.map +1 -0
- package/dist/data/cache-browser/index.d.ts +9 -0
- package/dist/data/cache-browser/index.d.ts.map +1 -0
- package/dist/data/cache-browser/types.cjs +7 -0
- package/dist/data/cache-browser/types.cjs.map +1 -0
- package/dist/data/cache-browser/types.d.ts +78 -0
- package/dist/data/cache-browser/types.d.ts.map +1 -0
- package/dist/data/cache-browser/types.js +7 -0
- package/dist/data/cache-browser/types.js.map +1 -0
- package/dist/data/cells/TagList.cjs +4 -101
- package/dist/data/cells/TagList.cjs.map +1 -1
- package/dist/data/cells/TagList.d.ts +1 -49
- package/dist/data/cells/TagList.d.ts.map +1 -1
- package/dist/data/cells/TagList.js +3 -100
- package/dist/data/cells/TagList.js.map +1 -1
- package/dist/data/cells/Timestamp.cjs +3 -192
- package/dist/data/cells/Timestamp.cjs.map +1 -1
- package/dist/data/cells/Timestamp.d.ts +1 -50
- package/dist/data/cells/Timestamp.d.ts.map +1 -1
- package/dist/data/cells/Timestamp.js +2 -191
- package/dist/data/cells/Timestamp.js.map +1 -1
- package/dist/data/cells/tag-utils.cjs +103 -0
- package/dist/data/cells/tag-utils.cjs.map +1 -0
- package/dist/data/cells/tag-utils.d.ts +51 -0
- package/dist/data/cells/tag-utils.d.ts.map +1 -0
- package/dist/data/cells/tag-utils.js +103 -0
- package/dist/data/cells/tag-utils.js.map +1 -0
- package/dist/data/cells/timestamp-format.cjs +193 -0
- package/dist/data/cells/timestamp-format.cjs.map +1 -0
- package/dist/data/cells/timestamp-format.d.ts +51 -0
- package/dist/data/cells/timestamp-format.d.ts.map +1 -0
- package/dist/data/cells/timestamp-format.js +193 -0
- package/dist/data/cells/timestamp-format.js.map +1 -0
- package/dist/data/chat/Chat.cjs +48 -0
- package/dist/data/chat/Chat.cjs.map +1 -0
- package/dist/data/chat/Chat.d.ts +26 -0
- package/dist/data/chat/Chat.d.ts.map +1 -0
- package/dist/data/chat/Chat.fixtures.d.ts +6 -0
- package/dist/data/chat/Chat.fixtures.d.ts.map +1 -0
- package/dist/data/chat/Chat.js +48 -0
- package/dist/data/chat/Chat.js.map +1 -0
- package/dist/data/chat/Conversation.cjs +34 -0
- package/dist/data/chat/Conversation.cjs.map +1 -0
- package/dist/data/chat/Conversation.d.ts +11 -0
- package/dist/data/chat/Conversation.d.ts.map +1 -0
- package/dist/data/chat/Conversation.js +34 -0
- package/dist/data/chat/Conversation.js.map +1 -0
- package/dist/data/chat/Message.cjs +44 -0
- package/dist/data/chat/Message.cjs.map +1 -0
- package/dist/data/chat/Message.d.ts +10 -0
- package/dist/data/chat/Message.d.ts.map +1 -0
- package/dist/data/chat/Message.js +44 -0
- package/dist/data/chat/Message.js.map +1 -0
- package/dist/data/chat/PromptInput.cjs +61 -0
- package/dist/data/chat/PromptInput.cjs.map +1 -0
- package/dist/data/chat/PromptInput.d.ts +16 -0
- package/dist/data/chat/PromptInput.d.ts.map +1 -0
- package/dist/data/chat/PromptInput.js +61 -0
- package/dist/data/chat/PromptInput.js.map +1 -0
- package/dist/data/chat/ToolCall.cjs +92 -0
- package/dist/data/chat/ToolCall.cjs.map +1 -0
- package/dist/data/chat/ToolCall.d.ts +14 -0
- package/dist/data/chat/ToolCall.d.ts.map +1 -0
- package/dist/data/chat/ToolCall.js +92 -0
- package/dist/data/chat/ToolCall.js.map +1 -0
- package/dist/data/chat/clickyOperationsToTools.cjs +73 -0
- package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -0
- package/dist/data/chat/clickyOperationsToTools.d.ts +10 -0
- package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -0
- package/dist/data/chat/clickyOperationsToTools.js +73 -0
- package/dist/data/chat/clickyOperationsToTools.js.map +1 -0
- package/dist/data/chat/index.d.ts +8 -0
- package/dist/data/chat/index.d.ts.map +1 -0
- package/dist/data/chat/types.cjs +18 -0
- package/dist/data/chat/types.cjs.map +1 -0
- package/dist/data/chat/types.d.ts +41 -0
- package/dist/data/chat/types.d.ts.map +1 -0
- package/dist/data/chat/types.js +18 -0
- package/dist/data/chat/types.js.map +1 -0
- package/dist/data/data-table-utils.cjs +55 -0
- package/dist/data/data-table-utils.cjs.map +1 -0
- package/dist/data/data-table-utils.d.ts +24 -0
- package/dist/data/data-table-utils.d.ts.map +1 -0
- package/dist/data/data-table-utils.js +55 -0
- package/dist/data/data-table-utils.js.map +1 -0
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +2 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js +3 -2
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
- package/dist/data/diagnostics/GoroutineCard.cjs +3 -22
- package/dist/data/diagnostics/GoroutineCard.cjs.map +1 -1
- package/dist/data/diagnostics/GoroutineCard.d.ts +0 -2
- package/dist/data/diagnostics/GoroutineCard.d.ts.map +1 -1
- package/dist/data/diagnostics/GoroutineCard.js +2 -21
- package/dist/data/diagnostics/GoroutineCard.js.map +1 -1
- package/dist/data/diagnostics/ThreadCard.cjs +3 -38
- package/dist/data/diagnostics/ThreadCard.cjs.map +1 -1
- package/dist/data/diagnostics/ThreadCard.d.ts +0 -2
- package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -1
- package/dist/data/diagnostics/ThreadCard.js +2 -37
- package/dist/data/diagnostics/ThreadCard.js.map +1 -1
- package/dist/data/diagnostics/state-styles.cjs +59 -0
- package/dist/data/diagnostics/state-styles.cjs.map +1 -0
- package/dist/data/diagnostics/state-styles.d.ts +5 -0
- package/dist/data/diagnostics/state-styles.d.ts.map +1 -0
- package/dist/data/diagnostics/state-styles.js +59 -0
- package/dist/data/diagnostics/state-styles.js.map +1 -0
- package/dist/data/logs-normalize.cjs +166 -0
- package/dist/data/logs-normalize.cjs.map +1 -0
- package/dist/data/logs-normalize.d.ts +16 -0
- package/dist/data/logs-normalize.d.ts.map +1 -0
- package/dist/data/logs-normalize.js +166 -0
- package/dist/data/logs-normalize.js.map +1 -0
- package/dist/data/task-status.cjs +19 -19
- package/dist/data/task-status.cjs.map +1 -1
- package/dist/data/task-status.js +19 -19
- package/dist/data/task-status.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +43 -18
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +11 -5
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +30 -5
- package/dist/data.js.map +1 -1
- package/dist/hooks/density-provider.cjs +38 -0
- package/dist/hooks/density-provider.cjs.map +1 -0
- package/dist/hooks/density-provider.d.ts +20 -0
- package/dist/hooks/density-provider.d.ts.map +1 -0
- package/dist/hooks/density-provider.js +38 -0
- package/dist/hooks/density-provider.js.map +1 -0
- package/dist/hooks/theme-provider.cjs +43 -0
- package/dist/hooks/theme-provider.cjs.map +1 -0
- package/dist/hooks/theme-provider.d.ts +9 -0
- package/dist/hooks/theme-provider.d.ts.map +1 -0
- package/dist/hooks/theme-provider.js +43 -0
- package/dist/hooks/theme-provider.js.map +1 -0
- package/dist/hooks/use-density.cjs +8 -37
- package/dist/hooks/use-density.cjs.map +1 -1
- package/dist/hooks/use-density.d.ts +5 -20
- package/dist/hooks/use-density.d.ts.map +1 -1
- package/dist/hooks/use-density.js +9 -38
- package/dist/hooks/use-density.js.map +1 -1
- package/dist/hooks/use-theme.cjs +10 -43
- package/dist/hooks/use-theme.cjs.map +1 -1
- package/dist/hooks/use-theme.d.ts +6 -9
- package/dist/hooks/use-theme.d.ts.map +1 -1
- package/dist/hooks/use-theme.js +11 -44
- package/dist/hooks/use-theme.js.map +1 -1
- package/dist/hooks.cjs +5 -2
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.d.ts +4 -2
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +5 -2
- package/dist/hooks.js.map +1 -1
- package/dist/icons/changeIconAliases.cjs +13 -13
- package/dist/icons/changeIconAliases.cjs.map +1 -1
- package/dist/icons/changeIconAliases.d.ts.map +1 -1
- package/dist/icons/changeIconAliases.js +13 -13
- package/dist/icons/changeIconAliases.js.map +1 -1
- package/dist/index.cjs +71 -30
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +53 -12
- package/dist/index.js.map +1 -1
- package/dist/overlay/DropdownMenu.cjs +2 -0
- package/dist/overlay/DropdownMenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenu.d.ts +3 -1
- package/dist/overlay/DropdownMenu.d.ts.map +1 -1
- package/dist/overlay/DropdownMenu.js +2 -0
- package/dist/overlay/DropdownMenu.js.map +1 -1
- package/dist/overlay/Modal.cjs +11 -4
- package/dist/overlay/Modal.cjs.map +1 -1
- package/dist/overlay/Modal.d.ts +1 -1
- package/dist/overlay/Modal.d.ts.map +1 -1
- package/dist/overlay/Modal.js +11 -4
- package/dist/overlay/Modal.js.map +1 -1
- package/dist/overlay/modalStack.cjs +35 -0
- package/dist/overlay/modalStack.cjs.map +1 -0
- package/dist/overlay/modalStack.d.ts +13 -0
- package/dist/overlay/modalStack.d.ts.map +1 -0
- package/dist/overlay/modalStack.js +35 -0
- package/dist/overlay/modalStack.js.map +1 -0
- package/dist/rpc/AcceptPicker.cjs +2 -18
- package/dist/rpc/AcceptPicker.cjs.map +1 -1
- package/dist/rpc/AcceptPicker.d.ts +1 -41
- package/dist/rpc/AcceptPicker.d.ts.map +1 -1
- package/dist/rpc/AcceptPicker.js +2 -18
- package/dist/rpc/AcceptPicker.js.map +1 -1
- package/dist/rpc/CommandOutput.cjs +1 -1
- package/dist/rpc/CommandOutput.cjs.map +1 -1
- package/dist/rpc/CommandOutput.js +1 -1
- package/dist/rpc/CommandOutput.js.map +1 -1
- package/dist/rpc/EndpointList.cjs +1 -1
- package/dist/rpc/EndpointList.cjs.map +1 -1
- package/dist/rpc/EndpointList.js +1 -1
- package/dist/rpc/EndpointList.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +23 -41
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +24 -42
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/OperationCommandPage.cjs.map +1 -1
- package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
- package/dist/rpc/OperationCommandPage.js.map +1 -1
- package/dist/rpc/accept-options.cjs +20 -0
- package/dist/rpc/accept-options.cjs.map +1 -0
- package/dist/rpc/accept-options.d.ts +42 -0
- package/dist/rpc/accept-options.d.ts.map +1 -0
- package/dist/rpc/accept-options.js +20 -0
- package/dist/rpc/accept-options.js.map +1 -0
- package/dist/rpc/classify.cjs +15 -4
- package/dist/rpc/classify.cjs.map +1 -1
- package/dist/rpc/classify.d.ts.map +1 -1
- package/dist/rpc/classify.js +15 -4
- package/dist/rpc/classify.js.map +1 -1
- package/dist/rpc/clickyMetadata.cjs +13 -3
- package/dist/rpc/clickyMetadata.cjs.map +1 -1
- package/dist/rpc/clickyMetadata.d.ts +2 -0
- package/dist/rpc/clickyMetadata.d.ts.map +1 -1
- package/dist/rpc/clickyMetadata.js +14 -4
- package/dist/rpc/clickyMetadata.js.map +1 -1
- package/dist/rpc.cjs +3 -2
- package/dist/rpc.cjs.map +1 -1
- package/dist/rpc.d.ts +2 -1
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +2 -1
- package/dist/rpc.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +16 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiagnosticsDetailPanel.cjs","sources":["../../../src/data/diagnostics/DiagnosticsDetailPanel.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { Icon } from \"../Icon\";\nimport type { GaugeTone } from \"../Gauge\";\nimport { UiDebug, UiDebugSmall, UiRefresh, UiSearch, UiServerProcess, UiLoader } from \"../../icons\";\nimport type { ProcessNode, RunMeta } from \"./types\";\nimport { formatBytes, processLabel, processStateColor, processStateIcon } from \"./utils\";\nimport { countStackByState, parseStackDump, type ParsedStack } from \"./stacktrace\";\nimport { GoroutineCard, goroutineStateDot } from \"./GoroutineCard\";\nimport { ThreadCard, threadStateDot } from \"./ThreadCard\";\nimport type { JvmFrameSourceResolver } from \"./JvmStackTrace\";\n\nconst STACK_MIN_LINES = 10;\nconst STACK_LINE_HEIGHT_REM = 1;\nconst STACK_MIN_HEIGHT = `${STACK_MIN_LINES * STACK_LINE_HEIGHT_REM}rem`;\n\nfunction cpuTone(pct: number): GaugeTone {\n if (pct >= 90) return \"danger\";\n if (pct >= 60) return \"warning\";\n if (pct > 0) return \"success\";\n return \"neutral\";\n}\n\nfunction memoryTone(rss: number | undefined, vms: number | undefined): GaugeTone {\n if (!rss || !vms) return \"neutral\";\n const ratio = rss / vms;\n if (ratio >= 0.9) return \"danger\";\n if (ratio >= 0.6) return \"warning\";\n return \"info\";\n}\n\nexport type DiagnosticsDetailPanelProps = {\n /** Selected process; null renders the empty selection state. */\n process: ProcessNode | null;\n /** Shows loading state while stack capture is being collected. */\n collectBusy?: boolean;\n /** Called when the user requests a fresh stack capture. */\n onCollectStack?: (pid: number) => void | Promise<void>;\n /** Optional run metadata rendered above diagnostics. */\n runMeta?: RunMeta;\n /**\n * Optional resolver that supplies inline source under each JVM stack frame,\n * so the rendered thread dump can be augmented in place (e.g. with decompiled\n * source). A missing class must resolve to undefined, never throw.\n */\n resolveSource?: JvmFrameSourceResolver;\n /**\n * Caller-supplied action buttons rendered right-aligned in the header row,\n * next to the title and Refresh. Use for download/decompile-style actions.\n */\n headerActions?: ReactNode;\n /**\n * The capture holds a single, already-selected item (e.g. one thread the\n * caller picked from its own list). Suppresses the redundant per-item filter\n * UI (search box, state chips, hide-runtime, count) and lifts Refresh into\n * the header row so the detail view shows just that item's frames.\n */\n singleItem?: boolean;\n};\n\nexport function DiagnosticsDetailPanel({\n process,\n collectBusy,\n onCollectStack,\n runMeta,\n resolveSource,\n headerActions,\n singleItem,\n}: DiagnosticsDetailPanelProps) {\n const [search, setSearch] = useState(\"\");\n const [selectedStates, setSelectedStates] = useState<Set<string>>(new Set());\n const [hideRuntimeOnly, setHideRuntimeOnly] = useState(true);\n const stack = process?.stack_capture;\n const parsed = useMemo<ParsedStack>(() => parseStackDump(stack?.text || \"\"), [stack?.text]);\n const stateCounts = useMemo(() => countStackByState(parsed), [parsed]);\n const filtered = useMemo(() => {\n const needle = search.trim().toLowerCase();\n const items: Array<{\n state: string;\n userFrameCount: number;\n searchText: string;\n }> = parsed.format === \"jvm\" ? parsed.threads : parsed.format === \"go\" ? parsed.goroutines : [];\n if (singleItem) return items;\n return items.filter((item) => {\n if (selectedStates.size > 0 && !selectedStates.has(item.state)) return false;\n if (hideRuntimeOnly && item.userFrameCount === 0) return false;\n if (needle && !item.searchText.includes(needle)) return false;\n return true;\n });\n }, [parsed, search, selectedStates, hideRuntimeOnly, singleItem]);\n\n useEffect(() => {\n setSearch(\"\");\n setSelectedStates(new Set());\n setHideRuntimeOnly(true);\n }, [stack?.text, process?.pid]);\n\n if (!process) {\n return (\n <div className=\"flex items-center justify-center h-full text-muted-foreground text-sm\">\n <div className=\"text-center\">\n <Icon icon={UiServerProcess} className=\"text-4xl mb-density-2\" />\n <div>Select a process to view diagnostics</div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"h-full min-h-0 flex flex-col gap-density-3 p-density-4\">\n <Header\n process={process}\n actions={\n <div className=\"flex items-center gap-density-2\">\n {singleItem && onCollectStack && (\n <CollectButton pid={process.pid} busy={collectBusy ?? false} onClick={onCollectStack} />\n )}\n {headerActions}\n </div>\n }\n />\n {runMeta && <RunSection runMeta={runMeta} />}\n {process.command && (\n <PanelSection title=\"Command\">\n <pre className=\"text-xs text-foreground whitespace-pre-wrap font-mono bg-blue-50 dark:bg-blue-500/10 rounded p-2 break-all\">\n {process.command}\n </pre>\n </PanelSection>\n )}\n\n <PanelSection title=\"Metrics\">\n <ProcessMetrics process={process} />\n </PanelSection>\n\n <PanelSection title=\"Stack\" grow>\n <StackBlock\n process={process}\n parsed={parsed}\n stateCounts={stateCounts}\n filtered={filtered}\n search={search}\n setSearch={setSearch}\n selectedStates={selectedStates}\n setSelectedStates={setSelectedStates}\n hideRuntimeOnly={hideRuntimeOnly}\n setHideRuntimeOnly={setHideRuntimeOnly}\n collectBusy={collectBusy ?? false}\n singleItem={singleItem ?? false}\n {...(onCollectStack ? { onCollectStack } : {})}\n {...(resolveSource ? { resolveSource } : {})}\n />\n </PanelSection>\n </div>\n );\n}\n\nfunction Header({ process, actions }: { process: ProcessNode; actions?: ReactNode }) {\n return (\n <div className=\"flex items-start justify-between gap-density-3\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-density-2 flex-wrap\">\n <Icon\n icon={process.is_root ? UiServerProcess : UiDebug}\n className=\"text-2xl text-blue-600\"\n />\n <h2 className=\"text-lg font-bold text-foreground break-words\">{processLabel(process)}</h2>\n {process.status ? (\n <span\n className={`inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs ${processStateColor(\n process.status,\n )}`}\n >\n <Icon icon={processStateIcon(process.status)} />\n {process.status}\n </span>\n ) : null}\n </div>\n <div className=\"mt-1 flex items-center gap-density-2 flex-wrap text-xs text-muted-foreground\">\n <span className=\"font-mono\">pid {process.pid}</span>\n {process.ppid ? <span className=\"font-mono\">ppid {process.ppid}</span> : null}\n </div>\n </div>\n {actions ? <div className=\"shrink-0\">{actions}</div> : null}\n </div>\n );\n}\n\nfunction RunSection({ runMeta }: { runMeta: RunMeta }) {\n return (\n <PanelSection title=\"Run\">\n <div className=\"grid grid-cols-2 gap-density-2 text-sm\">\n <InfoTile\n label={runMeta.kind === \"rerun\" ? `Rerun #${runMeta.sequence}` : \"Initial run\"}\n value={runMeta.started ? new Date(runMeta.started).toLocaleString() : \"Unavailable\"}\n />\n <InfoTile\n label=\"Finished\"\n value={runMeta.ended ? new Date(runMeta.ended).toLocaleString() : \"In progress\"}\n />\n </div>\n </PanelSection>\n );\n}\n\ntype StackFilterItem = {\n state: string;\n userFrameCount: number;\n searchText: string;\n};\n\ntype StackBlockProps = {\n process: ProcessNode;\n parsed: ParsedStack;\n stateCounts: Map<string, number>;\n filtered: StackFilterItem[];\n search: string;\n setSearch: (v: string) => void;\n selectedStates: Set<string>;\n setSelectedStates: (updater: (prev: Set<string>) => Set<string>) => void;\n hideRuntimeOnly: boolean;\n setHideRuntimeOnly: (v: boolean) => void;\n collectBusy?: boolean;\n onCollectStack?: (pid: number) => void | Promise<void>;\n resolveSource?: JvmFrameSourceResolver;\n singleItem?: boolean;\n};\n\nfunction stackItemCount(parsed: ParsedStack): number {\n if (parsed.format === \"jvm\") return parsed.threads.length;\n if (parsed.format === \"go\") return parsed.goroutines.length;\n return 0;\n}\n\nfunction stackItemLabel(parsed: ParsedStack): string {\n if (parsed.format === \"jvm\") return \"threads\";\n if (parsed.format === \"go\") return \"goroutines\";\n return \"frames\";\n}\n\nfunction stackStateDot(parsed: ParsedStack, state: string): string {\n return parsed.format === \"jvm\" ? threadStateDot(state) : goroutineStateDot(state);\n}\n\nfunction StackBlock(props: StackBlockProps) {\n const {\n process,\n parsed,\n stateCounts,\n filtered,\n search,\n setSearch,\n selectedStates,\n setSelectedStates,\n hideRuntimeOnly,\n setHideRuntimeOnly,\n collectBusy,\n onCollectStack,\n resolveSource,\n singleItem,\n } = props;\n const stack = process.stack_capture;\n\n if (!stack?.text) {\n return (\n <div className=\"h-full min-h-[14rem] flex flex-col justify-center gap-density-3 p-density-3\">\n <div className=\"space-y-1.5\">\n <div\n className={`h-3 w-40 rounded ${collectBusy ? \"animate-pulse bg-muted\" : \"bg-muted/70\"}`}\n />\n <div\n className={`h-3 w-full rounded ${collectBusy ? \"animate-pulse bg-muted\" : \"bg-muted/70\"}`}\n />\n <div\n className={`h-3 w-5/6 rounded ${collectBusy ? \"animate-pulse bg-muted\" : \"bg-muted/70\"}`}\n />\n </div>\n <div className=\"flex items-center justify-between gap-density-3\">\n <div className=\"text-sm text-muted-foreground\">\n {stack?.error\n ? stack.error\n : collectBusy\n ? \"Collecting stack trace...\"\n : \"No stack trace collected yet.\"}\n </div>\n {onCollectStack && (\n <CollectButton\n pid={process.pid}\n busy={collectBusy ?? false}\n onClick={onCollectStack}\n primary\n />\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"h-full min-h-0 flex flex-col\">\n {!singleItem && (\n <div className=\"px-1 py-1.5 space-y-density-2\">\n <div className=\"flex items-center justify-between gap-density-2 text-[11px] text-muted-foreground flex-wrap\">\n <div className=\"flex items-center gap-density-2 flex-wrap\">\n <StackStatusBadge status={stack.status} />\n {stack.collected_at && <span>{new Date(stack.collected_at).toLocaleString()}</span>}\n {stackItemCount(parsed) > 0 && (\n <span>\n {filtered.length} / {stackItemCount(parsed)} {stackItemLabel(parsed)}\n </span>\n )}\n </div>\n {onCollectStack && (\n <CollectButton pid={process.pid} busy={collectBusy ?? false} onClick={onCollectStack} />\n )}\n </div>\n {stackItemCount(parsed) > 0 && (\n <>\n <div className=\"flex items-center gap-1.5 flex-wrap\">\n <div className=\"relative min-w-[14rem] flex-1\">\n <Icon\n icon={UiSearch}\n className=\"absolute left-2 top-1/2 -translate-y-1/2 text-muted-foreground text-xs\"\n />\n <input\n className=\"w-full rounded-md border border-border bg-muted/50 py-1 pl-7 pr-2 text-xs outline-none focus:border-primary focus:bg-background\"\n placeholder={\n parsed.format === \"jvm\"\n ? \"Filter by thread name, function, or file\"\n : \"Filter by goroutine id, function, or file\"\n }\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n <label className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-muted/50 px-2 py-1 text-[11px] text-muted-foreground\">\n <input\n type=\"checkbox\"\n checked={hideRuntimeOnly}\n onChange={(e) => setHideRuntimeOnly(e.target.checked)}\n />\n Hide runtime-only\n </label>\n {(search || selectedStates.size > 0 || !hideRuntimeOnly) && (\n <button\n className=\"text-[11px] text-muted-foreground hover:text-foreground\"\n onClick={() => {\n setSearch(\"\");\n setSelectedStates(() => new Set());\n setHideRuntimeOnly(true);\n }}\n >\n Clear\n </button>\n )}\n </div>\n <div className=\"flex items-center gap-1 flex-wrap\">\n {Array.from(stateCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([state, count]) => {\n const active = selectedStates.has(state);\n return (\n <button\n key={state}\n className={`inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-[11px] transition-colors ${\n active\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-border bg-muted/50 text-muted-foreground hover:bg-background\"\n }`}\n onClick={() => {\n setSelectedStates((prev) => {\n const next = new Set(prev);\n if (next.has(state)) next.delete(state);\n else next.add(state);\n return next;\n });\n }}\n >\n <span className={`h-2 w-2 rounded-full ${stackStateDot(parsed, state)}`} />\n {state}\n <span className=\"text-[10px] opacity-70\">{count}</span>\n </button>\n );\n })}\n </div>\n </>\n )}\n </div>\n )}\n {stack.error && (\n <div className=\"mt-density-2 text-xs text-red-600 whitespace-pre-wrap\">{stack.error}</div>\n )}\n {stackItemCount(parsed) === 0 ? (\n <pre\n className=\"flex-1 min-h-0 overflow-auto py-1 text-[11px] text-foreground whitespace-pre-wrap font-mono leading-4\"\n style={{ minHeight: STACK_MIN_HEIGHT }}\n >\n {stack.text}\n </pre>\n ) : (\n <div\n className=\"flex-1 min-h-0 overflow-auto py-1 space-y-1\"\n style={{ minHeight: STACK_MIN_HEIGHT }}\n >\n {filtered.length === 0 && (\n <div className=\"py-density-3 text-center text-xs text-muted-foreground\">\n No {stackItemLabel(parsed)} match the current filters.\n </div>\n )}\n {parsed.format === \"jvm\" &&\n parsed.threads\n .filter((t) => filtered.includes(t))\n .map((t) => (\n <ThreadCard\n key={t.id}\n thread={t}\n search={search}\n hideRuntimeOnly={hideRuntimeOnly}\n {...(resolveSource ? { resolveSource } : {})}\n />\n ))}\n {parsed.format === \"go\" &&\n parsed.goroutines\n .filter((g) => filtered.includes(g))\n .map((goroutine) => (\n <GoroutineCard\n key={goroutine.id}\n goroutine={goroutine}\n search={search}\n hideRuntimeOnly={hideRuntimeOnly}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction StackStatusBadge({ status }: { status: string }) {\n const cls =\n status === \"ready\"\n ? \"bg-green-100 text-green-700 dark:bg-green-500/20 dark:text-green-300\"\n : status === \"unsupported\"\n ? \"bg-yellow-100 text-yellow-700 dark:bg-yellow-500/20 dark:text-yellow-300\"\n : \"bg-red-100 text-red-700 dark:bg-red-500/20 dark:text-red-300\";\n return <span className={`px-2 py-0.5 rounded-full ${cls}`}>{status}</span>;\n}\n\nfunction CollectButton({\n pid,\n busy,\n onClick,\n primary,\n}: {\n pid: number;\n busy?: boolean;\n onClick: (pid: number) => void | Promise<void>;\n primary?: boolean;\n}) {\n const base =\n \"shrink-0 text-[11px] px-2 py-1 rounded disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-1\";\n const style = primary\n ? \"bg-primary text-primary-foreground hover:bg-primary/90\"\n : \"border border-border text-muted-foreground hover:bg-accent\";\n return (\n <button\n className={`${base} ${style}`}\n onClick={() => onClick(pid)}\n disabled={busy}\n title={primary ? \"Collect the latest stack trace\" : \"Refresh stack trace\"}\n >\n <Icon icon={busy ? UiLoader : primary ? UiDebugSmall : UiRefresh} />\n {busy ? \"Collecting...\" : primary ? \"Collect stack trace\" : \"Refresh\"}\n </button>\n );\n}\n\nfunction PanelSection({\n title,\n grow,\n children,\n}: {\n title: string;\n grow?: boolean;\n children: ReactNode;\n}) {\n return (\n <section className={grow ? \"flex min-h-0 flex-1 flex-col\" : \"\"}>\n <div className=\"text-[11px] font-semibold uppercase tracking-wide text-muted-foreground mb-1.5\">\n {title}\n </div>\n {grow ? <div className=\"flex-1 min-h-0 overflow-hidden\">{children}</div> : children}\n </section>\n );\n}\n\nfunction InfoTile({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"border border-border rounded-lg bg-muted/50 px-2.5 py-density-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">{label}</div>\n <div className=\"text-xs font-medium text-foreground mt-0.5\">{value}</div>\n </div>\n );\n}\n\nfunction ProcessMetrics({ process }: { process: ProcessNode }) {\n const cpu = process.cpu_percent || 0;\n const rss = process.rss;\n const vms = process.vms;\n const memRatioPct = rss && vms && vms > 0 ? Math.min(100, Math.round((rss / vms) * 100)) : 0;\n return (\n <div className=\"grid grid-cols-4 gap-density-1\">\n <MetricTile\n label=\"CPU\"\n value={`${cpu.toFixed(1)}%`}\n barPct={Math.min(100, cpu)}\n tone={cpuTone(cpu)}\n />\n <MetricTile\n label=\"RSS\"\n value={rss !== undefined ? formatBytes(rss) : \"n/a\"}\n barPct={memRatioPct}\n tone={memoryTone(rss, vms)}\n />\n <MetricTile label=\"VMS\" value={vms !== undefined ? formatBytes(vms) : \"n/a\"} tone=\"neutral\" />\n <MetricTile\n label=\"Files\"\n value={process.open_files !== undefined ? String(process.open_files) : \"n/a\"}\n barPct={process.open_files ? Math.min(100, (process.open_files / 1024) * 100) : 0}\n tone=\"info\"\n />\n </div>\n );\n}\n\nfunction MetricTile({\n label,\n value,\n barPct,\n tone = \"neutral\",\n}: {\n label: string;\n value: string;\n barPct?: number;\n tone?: GaugeTone;\n}) {\n const toneBar: Record<GaugeTone, string> = {\n neutral: \"bg-muted-foreground/40\",\n success: \"bg-green-500\",\n warning: \"bg-yellow-500\",\n danger: \"bg-red-500\",\n info: \"bg-blue-500\",\n };\n const toneText: Record<GaugeTone, string> = {\n neutral: \"text-foreground\",\n success: \"text-green-600 dark:text-green-400\",\n warning: \"text-yellow-600 dark:text-yellow-400\",\n danger: \"text-red-600 dark:text-red-400\",\n info: \"text-blue-600 dark:text-blue-400\",\n };\n return (\n <div className=\"flex flex-col gap-0.5 rounded-md border border-border bg-background px-density-2 py-1 min-w-0\">\n <span className=\"text-[9px] uppercase tracking-wide text-muted-foreground leading-none\">\n {label}\n </span>\n <span className={`text-xs font-semibold tabular-nums truncate ${toneText[tone]}`}>\n {value}\n </span>\n {barPct !== undefined && (\n <div className=\"h-0.5 w-full rounded-full bg-muted overflow-hidden\">\n <div\n className={`h-full ${toneBar[tone]} transition-all duration-300`}\n style={{ width: `${barPct}%` }}\n />\n </div>\n )}\n </div>\n );\n}\n"],"names":["useState","useMemo","parseStackDump","countStackByState","useEffect","jsxs","jsx","Icon","UiServerProcess","UiDebug","processLabel","processStateColor","processStateIcon","threadStateDot","goroutineStateDot","Fragment","UiSearch","ThreadCard","GoroutineCard","UiLoader","UiDebugSmall","UiRefresh","formatBytes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DiagnosticsDetailPanel.cjs","sources":["../../../src/data/diagnostics/DiagnosticsDetailPanel.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { Icon } from \"../Icon\";\nimport type { GaugeTone } from \"../Gauge\";\nimport { UiDebug, UiDebugSmall, UiRefresh, UiSearch, UiServerProcess, UiLoader } from \"../../icons\";\nimport type { ProcessNode, RunMeta } from \"./types\";\nimport { formatBytes, processLabel, processStateColor, processStateIcon } from \"./utils\";\nimport { countStackByState, parseStackDump, type ParsedStack } from \"./stacktrace\";\nimport { GoroutineCard } from \"./GoroutineCard\";\nimport { ThreadCard } from \"./ThreadCard\";\nimport { goroutineStateDot, threadStateDot } from \"./state-styles\";\nimport type { JvmFrameSourceResolver } from \"./JvmStackTrace\";\n\nconst STACK_MIN_LINES = 10;\nconst STACK_LINE_HEIGHT_REM = 1;\nconst STACK_MIN_HEIGHT = `${STACK_MIN_LINES * STACK_LINE_HEIGHT_REM}rem`;\n\nfunction cpuTone(pct: number): GaugeTone {\n if (pct >= 90) return \"danger\";\n if (pct >= 60) return \"warning\";\n if (pct > 0) return \"success\";\n return \"neutral\";\n}\n\nfunction memoryTone(rss: number | undefined, vms: number | undefined): GaugeTone {\n if (!rss || !vms) return \"neutral\";\n const ratio = rss / vms;\n if (ratio >= 0.9) return \"danger\";\n if (ratio >= 0.6) return \"warning\";\n return \"info\";\n}\n\nexport type DiagnosticsDetailPanelProps = {\n /** Selected process; null renders the empty selection state. */\n process: ProcessNode | null;\n /** Shows loading state while stack capture is being collected. */\n collectBusy?: boolean;\n /** Called when the user requests a fresh stack capture. */\n onCollectStack?: (pid: number) => void | Promise<void>;\n /** Optional run metadata rendered above diagnostics. */\n runMeta?: RunMeta;\n /**\n * Optional resolver that supplies inline source under each JVM stack frame,\n * so the rendered thread dump can be augmented in place (e.g. with decompiled\n * source). A missing class must resolve to undefined, never throw.\n */\n resolveSource?: JvmFrameSourceResolver;\n /**\n * Caller-supplied action buttons rendered right-aligned in the header row,\n * next to the title and Refresh. Use for download/decompile-style actions.\n */\n headerActions?: ReactNode;\n /**\n * The capture holds a single, already-selected item (e.g. one thread the\n * caller picked from its own list). Suppresses the redundant per-item filter\n * UI (search box, state chips, hide-runtime, count) and lifts Refresh into\n * the header row so the detail view shows just that item's frames.\n */\n singleItem?: boolean;\n};\n\nexport function DiagnosticsDetailPanel({\n process,\n collectBusy,\n onCollectStack,\n runMeta,\n resolveSource,\n headerActions,\n singleItem,\n}: DiagnosticsDetailPanelProps) {\n const [search, setSearch] = useState(\"\");\n const [selectedStates, setSelectedStates] = useState<Set<string>>(new Set());\n const [hideRuntimeOnly, setHideRuntimeOnly] = useState(true);\n const stack = process?.stack_capture;\n const parsed = useMemo<ParsedStack>(() => parseStackDump(stack?.text || \"\"), [stack?.text]);\n const stateCounts = useMemo(() => countStackByState(parsed), [parsed]);\n const filtered = useMemo(() => {\n const needle = search.trim().toLowerCase();\n const items: Array<{\n state: string;\n userFrameCount: number;\n searchText: string;\n }> = parsed.format === \"jvm\" ? parsed.threads : parsed.format === \"go\" ? parsed.goroutines : [];\n if (singleItem) return items;\n return items.filter((item) => {\n if (selectedStates.size > 0 && !selectedStates.has(item.state)) return false;\n if (hideRuntimeOnly && item.userFrameCount === 0) return false;\n if (needle && !item.searchText.includes(needle)) return false;\n return true;\n });\n }, [parsed, search, selectedStates, hideRuntimeOnly, singleItem]);\n\n useEffect(() => {\n setSearch(\"\");\n setSelectedStates(new Set());\n setHideRuntimeOnly(true);\n }, [stack?.text, process?.pid]);\n\n if (!process) {\n return (\n <div className=\"flex items-center justify-center h-full text-muted-foreground text-sm\">\n <div className=\"text-center\">\n <Icon icon={UiServerProcess} className=\"text-4xl mb-density-2\" />\n <div>Select a process to view diagnostics</div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"h-full min-h-0 flex flex-col gap-density-3 p-density-4\">\n <Header\n process={process}\n actions={\n <div className=\"flex items-center gap-density-2\">\n {singleItem && onCollectStack && (\n <CollectButton pid={process.pid} busy={collectBusy ?? false} onClick={onCollectStack} />\n )}\n {headerActions}\n </div>\n }\n />\n {runMeta && <RunSection runMeta={runMeta} />}\n {process.command && (\n <PanelSection title=\"Command\">\n <pre className=\"text-xs text-foreground whitespace-pre-wrap font-mono bg-blue-50 dark:bg-blue-500/10 rounded p-2 break-all\">\n {process.command}\n </pre>\n </PanelSection>\n )}\n\n <PanelSection title=\"Metrics\">\n <ProcessMetrics process={process} />\n </PanelSection>\n\n <PanelSection title=\"Stack\" grow>\n <StackBlock\n process={process}\n parsed={parsed}\n stateCounts={stateCounts}\n filtered={filtered}\n search={search}\n setSearch={setSearch}\n selectedStates={selectedStates}\n setSelectedStates={setSelectedStates}\n hideRuntimeOnly={hideRuntimeOnly}\n setHideRuntimeOnly={setHideRuntimeOnly}\n collectBusy={collectBusy ?? false}\n singleItem={singleItem ?? false}\n {...(onCollectStack ? { onCollectStack } : {})}\n {...(resolveSource ? { resolveSource } : {})}\n />\n </PanelSection>\n </div>\n );\n}\n\nfunction Header({ process, actions }: { process: ProcessNode; actions?: ReactNode }) {\n return (\n <div className=\"flex items-start justify-between gap-density-3\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-density-2 flex-wrap\">\n <Icon\n icon={process.is_root ? UiServerProcess : UiDebug}\n className=\"text-2xl text-blue-600\"\n />\n <h2 className=\"text-lg font-bold text-foreground break-words\">{processLabel(process)}</h2>\n {process.status ? (\n <span\n className={`inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs ${processStateColor(\n process.status,\n )}`}\n >\n <Icon icon={processStateIcon(process.status)} />\n {process.status}\n </span>\n ) : null}\n </div>\n <div className=\"mt-1 flex items-center gap-density-2 flex-wrap text-xs text-muted-foreground\">\n <span className=\"font-mono\">pid {process.pid}</span>\n {process.ppid ? <span className=\"font-mono\">ppid {process.ppid}</span> : null}\n </div>\n </div>\n {actions ? <div className=\"shrink-0\">{actions}</div> : null}\n </div>\n );\n}\n\nfunction RunSection({ runMeta }: { runMeta: RunMeta }) {\n return (\n <PanelSection title=\"Run\">\n <div className=\"grid grid-cols-2 gap-density-2 text-sm\">\n <InfoTile\n label={runMeta.kind === \"rerun\" ? `Rerun #${runMeta.sequence}` : \"Initial run\"}\n value={runMeta.started ? new Date(runMeta.started).toLocaleString() : \"Unavailable\"}\n />\n <InfoTile\n label=\"Finished\"\n value={runMeta.ended ? new Date(runMeta.ended).toLocaleString() : \"In progress\"}\n />\n </div>\n </PanelSection>\n );\n}\n\ntype StackFilterItem = {\n state: string;\n userFrameCount: number;\n searchText: string;\n};\n\ntype StackBlockProps = {\n process: ProcessNode;\n parsed: ParsedStack;\n stateCounts: Map<string, number>;\n filtered: StackFilterItem[];\n search: string;\n setSearch: (v: string) => void;\n selectedStates: Set<string>;\n setSelectedStates: (updater: (prev: Set<string>) => Set<string>) => void;\n hideRuntimeOnly: boolean;\n setHideRuntimeOnly: (v: boolean) => void;\n collectBusy?: boolean;\n onCollectStack?: (pid: number) => void | Promise<void>;\n resolveSource?: JvmFrameSourceResolver;\n singleItem?: boolean;\n};\n\nfunction stackItemCount(parsed: ParsedStack): number {\n if (parsed.format === \"jvm\") return parsed.threads.length;\n if (parsed.format === \"go\") return parsed.goroutines.length;\n return 0;\n}\n\nfunction stackItemLabel(parsed: ParsedStack): string {\n if (parsed.format === \"jvm\") return \"threads\";\n if (parsed.format === \"go\") return \"goroutines\";\n return \"frames\";\n}\n\nfunction stackStateDot(parsed: ParsedStack, state: string): string {\n return parsed.format === \"jvm\" ? threadStateDot(state) : goroutineStateDot(state);\n}\n\nfunction StackBlock(props: StackBlockProps) {\n const {\n process,\n parsed,\n stateCounts,\n filtered,\n search,\n setSearch,\n selectedStates,\n setSelectedStates,\n hideRuntimeOnly,\n setHideRuntimeOnly,\n collectBusy,\n onCollectStack,\n resolveSource,\n singleItem,\n } = props;\n const stack = process.stack_capture;\n\n if (!stack?.text) {\n return (\n <div className=\"h-full min-h-[14rem] flex flex-col justify-center gap-density-3 p-density-3\">\n <div className=\"space-y-1.5\">\n <div\n className={`h-3 w-40 rounded ${collectBusy ? \"animate-pulse bg-muted\" : \"bg-muted/70\"}`}\n />\n <div\n className={`h-3 w-full rounded ${collectBusy ? \"animate-pulse bg-muted\" : \"bg-muted/70\"}`}\n />\n <div\n className={`h-3 w-5/6 rounded ${collectBusy ? \"animate-pulse bg-muted\" : \"bg-muted/70\"}`}\n />\n </div>\n <div className=\"flex items-center justify-between gap-density-3\">\n <div className=\"text-sm text-muted-foreground\">\n {stack?.error\n ? stack.error\n : collectBusy\n ? \"Collecting stack trace...\"\n : \"No stack trace collected yet.\"}\n </div>\n {onCollectStack && (\n <CollectButton\n pid={process.pid}\n busy={collectBusy ?? false}\n onClick={onCollectStack}\n primary\n />\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"h-full min-h-0 flex flex-col\">\n {!singleItem && (\n <div className=\"px-1 py-1.5 space-y-density-2\">\n <div className=\"flex items-center justify-between gap-density-2 text-[11px] text-muted-foreground flex-wrap\">\n <div className=\"flex items-center gap-density-2 flex-wrap\">\n <StackStatusBadge status={stack.status} />\n {stack.collected_at && <span>{new Date(stack.collected_at).toLocaleString()}</span>}\n {stackItemCount(parsed) > 0 && (\n <span>\n {filtered.length} / {stackItemCount(parsed)} {stackItemLabel(parsed)}\n </span>\n )}\n </div>\n {onCollectStack && (\n <CollectButton pid={process.pid} busy={collectBusy ?? false} onClick={onCollectStack} />\n )}\n </div>\n {stackItemCount(parsed) > 0 && (\n <>\n <div className=\"flex items-center gap-1.5 flex-wrap\">\n <div className=\"relative min-w-[14rem] flex-1\">\n <Icon\n icon={UiSearch}\n className=\"absolute left-2 top-1/2 -translate-y-1/2 text-muted-foreground text-xs\"\n />\n <input\n className=\"w-full rounded-md border border-border bg-muted/50 py-1 pl-7 pr-2 text-xs outline-none focus:border-primary focus:bg-background\"\n placeholder={\n parsed.format === \"jvm\"\n ? \"Filter by thread name, function, or file\"\n : \"Filter by goroutine id, function, or file\"\n }\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n <label className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-muted/50 px-2 py-1 text-[11px] text-muted-foreground\">\n <input\n type=\"checkbox\"\n checked={hideRuntimeOnly}\n onChange={(e) => setHideRuntimeOnly(e.target.checked)}\n />\n Hide runtime-only\n </label>\n {(search || selectedStates.size > 0 || !hideRuntimeOnly) && (\n <button\n className=\"text-[11px] text-muted-foreground hover:text-foreground\"\n onClick={() => {\n setSearch(\"\");\n setSelectedStates(() => new Set());\n setHideRuntimeOnly(true);\n }}\n >\n Clear\n </button>\n )}\n </div>\n <div className=\"flex items-center gap-1 flex-wrap\">\n {Array.from(stateCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([state, count]) => {\n const active = selectedStates.has(state);\n return (\n <button\n key={state}\n className={`inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-[11px] transition-colors ${\n active\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-border bg-muted/50 text-muted-foreground hover:bg-background\"\n }`}\n onClick={() => {\n setSelectedStates((prev) => {\n const next = new Set(prev);\n if (next.has(state)) next.delete(state);\n else next.add(state);\n return next;\n });\n }}\n >\n <span className={`h-2 w-2 rounded-full ${stackStateDot(parsed, state)}`} />\n {state}\n <span className=\"text-[10px] opacity-70\">{count}</span>\n </button>\n );\n })}\n </div>\n </>\n )}\n </div>\n )}\n {stack.error && (\n <div className=\"mt-density-2 text-xs text-red-600 whitespace-pre-wrap\">{stack.error}</div>\n )}\n {stackItemCount(parsed) === 0 ? (\n <pre\n className=\"flex-1 min-h-0 overflow-auto py-1 text-[11px] text-foreground whitespace-pre-wrap font-mono leading-4\"\n style={{ minHeight: STACK_MIN_HEIGHT }}\n >\n {stack.text}\n </pre>\n ) : (\n <div\n className=\"flex-1 min-h-0 overflow-auto py-1 space-y-1\"\n style={{ minHeight: STACK_MIN_HEIGHT }}\n >\n {filtered.length === 0 && (\n <div className=\"py-density-3 text-center text-xs text-muted-foreground\">\n No {stackItemLabel(parsed)} match the current filters.\n </div>\n )}\n {parsed.format === \"jvm\" &&\n parsed.threads\n .filter((t) => filtered.includes(t))\n .map((t) => (\n <ThreadCard\n key={t.id}\n thread={t}\n search={search}\n hideRuntimeOnly={hideRuntimeOnly}\n {...(resolveSource ? { resolveSource } : {})}\n />\n ))}\n {parsed.format === \"go\" &&\n parsed.goroutines\n .filter((g) => filtered.includes(g))\n .map((goroutine) => (\n <GoroutineCard\n key={goroutine.id}\n goroutine={goroutine}\n search={search}\n hideRuntimeOnly={hideRuntimeOnly}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction StackStatusBadge({ status }: { status: string }) {\n const cls =\n status === \"ready\"\n ? \"bg-green-100 text-green-700 dark:bg-green-500/20 dark:text-green-300\"\n : status === \"unsupported\"\n ? \"bg-yellow-100 text-yellow-700 dark:bg-yellow-500/20 dark:text-yellow-300\"\n : \"bg-red-100 text-red-700 dark:bg-red-500/20 dark:text-red-300\";\n return <span className={`px-2 py-0.5 rounded-full ${cls}`}>{status}</span>;\n}\n\nfunction CollectButton({\n pid,\n busy,\n onClick,\n primary,\n}: {\n pid: number;\n busy?: boolean;\n onClick: (pid: number) => void | Promise<void>;\n primary?: boolean;\n}) {\n const base =\n \"shrink-0 text-[11px] px-2 py-1 rounded disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-1\";\n const style = primary\n ? \"bg-primary text-primary-foreground hover:bg-primary/90\"\n : \"border border-border text-muted-foreground hover:bg-accent\";\n return (\n <button\n className={`${base} ${style}`}\n onClick={() => onClick(pid)}\n disabled={busy}\n title={primary ? \"Collect the latest stack trace\" : \"Refresh stack trace\"}\n >\n <Icon icon={busy ? UiLoader : primary ? UiDebugSmall : UiRefresh} />\n {busy ? \"Collecting...\" : primary ? \"Collect stack trace\" : \"Refresh\"}\n </button>\n );\n}\n\nfunction PanelSection({\n title,\n grow,\n children,\n}: {\n title: string;\n grow?: boolean;\n children: ReactNode;\n}) {\n return (\n <section className={grow ? \"flex min-h-0 flex-1 flex-col\" : \"\"}>\n <div className=\"text-[11px] font-semibold uppercase tracking-wide text-muted-foreground mb-1.5\">\n {title}\n </div>\n {grow ? <div className=\"flex-1 min-h-0 overflow-hidden\">{children}</div> : children}\n </section>\n );\n}\n\nfunction InfoTile({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"border border-border rounded-lg bg-muted/50 px-2.5 py-density-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">{label}</div>\n <div className=\"text-xs font-medium text-foreground mt-0.5\">{value}</div>\n </div>\n );\n}\n\nfunction ProcessMetrics({ process }: { process: ProcessNode }) {\n const cpu = process.cpu_percent || 0;\n const rss = process.rss;\n const vms = process.vms;\n const memRatioPct = rss && vms && vms > 0 ? Math.min(100, Math.round((rss / vms) * 100)) : 0;\n return (\n <div className=\"grid grid-cols-4 gap-density-1\">\n <MetricTile\n label=\"CPU\"\n value={`${cpu.toFixed(1)}%`}\n barPct={Math.min(100, cpu)}\n tone={cpuTone(cpu)}\n />\n <MetricTile\n label=\"RSS\"\n value={rss !== undefined ? formatBytes(rss) : \"n/a\"}\n barPct={memRatioPct}\n tone={memoryTone(rss, vms)}\n />\n <MetricTile label=\"VMS\" value={vms !== undefined ? formatBytes(vms) : \"n/a\"} tone=\"neutral\" />\n <MetricTile\n label=\"Files\"\n value={process.open_files !== undefined ? String(process.open_files) : \"n/a\"}\n barPct={process.open_files ? Math.min(100, (process.open_files / 1024) * 100) : 0}\n tone=\"info\"\n />\n </div>\n );\n}\n\nfunction MetricTile({\n label,\n value,\n barPct,\n tone = \"neutral\",\n}: {\n label: string;\n value: string;\n barPct?: number;\n tone?: GaugeTone;\n}) {\n const toneBar: Record<GaugeTone, string> = {\n neutral: \"bg-muted-foreground/40\",\n success: \"bg-green-500\",\n warning: \"bg-yellow-500\",\n danger: \"bg-red-500\",\n info: \"bg-blue-500\",\n };\n const toneText: Record<GaugeTone, string> = {\n neutral: \"text-foreground\",\n success: \"text-green-600 dark:text-green-400\",\n warning: \"text-yellow-600 dark:text-yellow-400\",\n danger: \"text-red-600 dark:text-red-400\",\n info: \"text-blue-600 dark:text-blue-400\",\n };\n return (\n <div className=\"flex flex-col gap-0.5 rounded-md border border-border bg-background px-density-2 py-1 min-w-0\">\n <span className=\"text-[9px] uppercase tracking-wide text-muted-foreground leading-none\">\n {label}\n </span>\n <span className={`text-xs font-semibold tabular-nums truncate ${toneText[tone]}`}>\n {value}\n </span>\n {barPct !== undefined && (\n <div className=\"h-0.5 w-full rounded-full bg-muted overflow-hidden\">\n <div\n className={`h-full ${toneBar[tone]} transition-all duration-300`}\n style={{ width: `${barPct}%` }}\n />\n </div>\n )}\n </div>\n );\n}\n"],"names":["useState","useMemo","parseStackDump","countStackByState","useEffect","jsxs","jsx","Icon","UiServerProcess","UiDebug","processLabel","processStateColor","processStateIcon","threadStateDot","goroutineStateDot","Fragment","UiSearch","ThreadCard","GoroutineCard","UiLoader","UiDebugSmall","UiRefresh","formatBytes"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiagnosticsDetailPanel.d.ts","sourceRoot":"","sources":["../../../src/data/diagnostics/DiagnosticsDetailPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAIrE,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"DiagnosticsDetailPanel.d.ts","sourceRoot":"","sources":["../../../src/data/diagnostics/DiagnosticsDetailPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAIrE,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAMpD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAqB9D,MAAM,MAAM,2BAA2B,GAAG;IACxC,gEAAgE;IAChE,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,kEAAkE;IAClE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2DAA2D;IAC3D,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC;;;OAGG;IACH,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,EACrC,OAAO,EACP,WAAW,EACX,cAAc,EACd,OAAO,EACP,aAAa,EACb,aAAa,EACb,UAAU,GACX,EAAE,2BAA2B,2CAsF7B"}
|
|
@@ -3,8 +3,9 @@ import { useState, useMemo, useEffect } from "react";
|
|
|
3
3
|
import { Icon } from "../Icon.js";
|
|
4
4
|
import { processLabel, processStateIcon, processStateColor } from "./utils.js";
|
|
5
5
|
import { parseStackDump, countStackByState } from "./stacktrace.js";
|
|
6
|
-
import { GoroutineCard
|
|
7
|
-
import { ThreadCard
|
|
6
|
+
import { GoroutineCard } from "./GoroutineCard.js";
|
|
7
|
+
import { ThreadCard } from "./ThreadCard.js";
|
|
8
|
+
import { threadStateDot, goroutineStateDot } from "./state-styles.js";
|
|
8
9
|
import { UiServerProcess } from "../../icons/components/UiServerProcess.js";
|
|
9
10
|
import { UiDebug } from "../../icons/components/UiDebug.js";
|
|
10
11
|
import { UiLoader } from "../../icons/components/UiLoader.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiagnosticsDetailPanel.js","sources":["../../../src/data/diagnostics/DiagnosticsDetailPanel.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { Icon } from \"../Icon\";\nimport type { GaugeTone } from \"../Gauge\";\nimport { UiDebug, UiDebugSmall, UiRefresh, UiSearch, UiServerProcess, UiLoader } from \"../../icons\";\nimport type { ProcessNode, RunMeta } from \"./types\";\nimport { formatBytes, processLabel, processStateColor, processStateIcon } from \"./utils\";\nimport { countStackByState, parseStackDump, type ParsedStack } from \"./stacktrace\";\nimport { GoroutineCard, goroutineStateDot } from \"./GoroutineCard\";\nimport { ThreadCard, threadStateDot } from \"./ThreadCard\";\nimport type { JvmFrameSourceResolver } from \"./JvmStackTrace\";\n\nconst STACK_MIN_LINES = 10;\nconst STACK_LINE_HEIGHT_REM = 1;\nconst STACK_MIN_HEIGHT = `${STACK_MIN_LINES * STACK_LINE_HEIGHT_REM}rem`;\n\nfunction cpuTone(pct: number): GaugeTone {\n if (pct >= 90) return \"danger\";\n if (pct >= 60) return \"warning\";\n if (pct > 0) return \"success\";\n return \"neutral\";\n}\n\nfunction memoryTone(rss: number | undefined, vms: number | undefined): GaugeTone {\n if (!rss || !vms) return \"neutral\";\n const ratio = rss / vms;\n if (ratio >= 0.9) return \"danger\";\n if (ratio >= 0.6) return \"warning\";\n return \"info\";\n}\n\nexport type DiagnosticsDetailPanelProps = {\n /** Selected process; null renders the empty selection state. */\n process: ProcessNode | null;\n /** Shows loading state while stack capture is being collected. */\n collectBusy?: boolean;\n /** Called when the user requests a fresh stack capture. */\n onCollectStack?: (pid: number) => void | Promise<void>;\n /** Optional run metadata rendered above diagnostics. */\n runMeta?: RunMeta;\n /**\n * Optional resolver that supplies inline source under each JVM stack frame,\n * so the rendered thread dump can be augmented in place (e.g. with decompiled\n * source). A missing class must resolve to undefined, never throw.\n */\n resolveSource?: JvmFrameSourceResolver;\n /**\n * Caller-supplied action buttons rendered right-aligned in the header row,\n * next to the title and Refresh. Use for download/decompile-style actions.\n */\n headerActions?: ReactNode;\n /**\n * The capture holds a single, already-selected item (e.g. one thread the\n * caller picked from its own list). Suppresses the redundant per-item filter\n * UI (search box, state chips, hide-runtime, count) and lifts Refresh into\n * the header row so the detail view shows just that item's frames.\n */\n singleItem?: boolean;\n};\n\nexport function DiagnosticsDetailPanel({\n process,\n collectBusy,\n onCollectStack,\n runMeta,\n resolveSource,\n headerActions,\n singleItem,\n}: DiagnosticsDetailPanelProps) {\n const [search, setSearch] = useState(\"\");\n const [selectedStates, setSelectedStates] = useState<Set<string>>(new Set());\n const [hideRuntimeOnly, setHideRuntimeOnly] = useState(true);\n const stack = process?.stack_capture;\n const parsed = useMemo<ParsedStack>(() => parseStackDump(stack?.text || \"\"), [stack?.text]);\n const stateCounts = useMemo(() => countStackByState(parsed), [parsed]);\n const filtered = useMemo(() => {\n const needle = search.trim().toLowerCase();\n const items: Array<{\n state: string;\n userFrameCount: number;\n searchText: string;\n }> = parsed.format === \"jvm\" ? parsed.threads : parsed.format === \"go\" ? parsed.goroutines : [];\n if (singleItem) return items;\n return items.filter((item) => {\n if (selectedStates.size > 0 && !selectedStates.has(item.state)) return false;\n if (hideRuntimeOnly && item.userFrameCount === 0) return false;\n if (needle && !item.searchText.includes(needle)) return false;\n return true;\n });\n }, [parsed, search, selectedStates, hideRuntimeOnly, singleItem]);\n\n useEffect(() => {\n setSearch(\"\");\n setSelectedStates(new Set());\n setHideRuntimeOnly(true);\n }, [stack?.text, process?.pid]);\n\n if (!process) {\n return (\n <div className=\"flex items-center justify-center h-full text-muted-foreground text-sm\">\n <div className=\"text-center\">\n <Icon icon={UiServerProcess} className=\"text-4xl mb-density-2\" />\n <div>Select a process to view diagnostics</div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"h-full min-h-0 flex flex-col gap-density-3 p-density-4\">\n <Header\n process={process}\n actions={\n <div className=\"flex items-center gap-density-2\">\n {singleItem && onCollectStack && (\n <CollectButton pid={process.pid} busy={collectBusy ?? false} onClick={onCollectStack} />\n )}\n {headerActions}\n </div>\n }\n />\n {runMeta && <RunSection runMeta={runMeta} />}\n {process.command && (\n <PanelSection title=\"Command\">\n <pre className=\"text-xs text-foreground whitespace-pre-wrap font-mono bg-blue-50 dark:bg-blue-500/10 rounded p-2 break-all\">\n {process.command}\n </pre>\n </PanelSection>\n )}\n\n <PanelSection title=\"Metrics\">\n <ProcessMetrics process={process} />\n </PanelSection>\n\n <PanelSection title=\"Stack\" grow>\n <StackBlock\n process={process}\n parsed={parsed}\n stateCounts={stateCounts}\n filtered={filtered}\n search={search}\n setSearch={setSearch}\n selectedStates={selectedStates}\n setSelectedStates={setSelectedStates}\n hideRuntimeOnly={hideRuntimeOnly}\n setHideRuntimeOnly={setHideRuntimeOnly}\n collectBusy={collectBusy ?? false}\n singleItem={singleItem ?? false}\n {...(onCollectStack ? { onCollectStack } : {})}\n {...(resolveSource ? { resolveSource } : {})}\n />\n </PanelSection>\n </div>\n );\n}\n\nfunction Header({ process, actions }: { process: ProcessNode; actions?: ReactNode }) {\n return (\n <div className=\"flex items-start justify-between gap-density-3\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-density-2 flex-wrap\">\n <Icon\n icon={process.is_root ? UiServerProcess : UiDebug}\n className=\"text-2xl text-blue-600\"\n />\n <h2 className=\"text-lg font-bold text-foreground break-words\">{processLabel(process)}</h2>\n {process.status ? (\n <span\n className={`inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs ${processStateColor(\n process.status,\n )}`}\n >\n <Icon icon={processStateIcon(process.status)} />\n {process.status}\n </span>\n ) : null}\n </div>\n <div className=\"mt-1 flex items-center gap-density-2 flex-wrap text-xs text-muted-foreground\">\n <span className=\"font-mono\">pid {process.pid}</span>\n {process.ppid ? <span className=\"font-mono\">ppid {process.ppid}</span> : null}\n </div>\n </div>\n {actions ? <div className=\"shrink-0\">{actions}</div> : null}\n </div>\n );\n}\n\nfunction RunSection({ runMeta }: { runMeta: RunMeta }) {\n return (\n <PanelSection title=\"Run\">\n <div className=\"grid grid-cols-2 gap-density-2 text-sm\">\n <InfoTile\n label={runMeta.kind === \"rerun\" ? `Rerun #${runMeta.sequence}` : \"Initial run\"}\n value={runMeta.started ? new Date(runMeta.started).toLocaleString() : \"Unavailable\"}\n />\n <InfoTile\n label=\"Finished\"\n value={runMeta.ended ? new Date(runMeta.ended).toLocaleString() : \"In progress\"}\n />\n </div>\n </PanelSection>\n );\n}\n\ntype StackFilterItem = {\n state: string;\n userFrameCount: number;\n searchText: string;\n};\n\ntype StackBlockProps = {\n process: ProcessNode;\n parsed: ParsedStack;\n stateCounts: Map<string, number>;\n filtered: StackFilterItem[];\n search: string;\n setSearch: (v: string) => void;\n selectedStates: Set<string>;\n setSelectedStates: (updater: (prev: Set<string>) => Set<string>) => void;\n hideRuntimeOnly: boolean;\n setHideRuntimeOnly: (v: boolean) => void;\n collectBusy?: boolean;\n onCollectStack?: (pid: number) => void | Promise<void>;\n resolveSource?: JvmFrameSourceResolver;\n singleItem?: boolean;\n};\n\nfunction stackItemCount(parsed: ParsedStack): number {\n if (parsed.format === \"jvm\") return parsed.threads.length;\n if (parsed.format === \"go\") return parsed.goroutines.length;\n return 0;\n}\n\nfunction stackItemLabel(parsed: ParsedStack): string {\n if (parsed.format === \"jvm\") return \"threads\";\n if (parsed.format === \"go\") return \"goroutines\";\n return \"frames\";\n}\n\nfunction stackStateDot(parsed: ParsedStack, state: string): string {\n return parsed.format === \"jvm\" ? threadStateDot(state) : goroutineStateDot(state);\n}\n\nfunction StackBlock(props: StackBlockProps) {\n const {\n process,\n parsed,\n stateCounts,\n filtered,\n search,\n setSearch,\n selectedStates,\n setSelectedStates,\n hideRuntimeOnly,\n setHideRuntimeOnly,\n collectBusy,\n onCollectStack,\n resolveSource,\n singleItem,\n } = props;\n const stack = process.stack_capture;\n\n if (!stack?.text) {\n return (\n <div className=\"h-full min-h-[14rem] flex flex-col justify-center gap-density-3 p-density-3\">\n <div className=\"space-y-1.5\">\n <div\n className={`h-3 w-40 rounded ${collectBusy ? \"animate-pulse bg-muted\" : \"bg-muted/70\"}`}\n />\n <div\n className={`h-3 w-full rounded ${collectBusy ? \"animate-pulse bg-muted\" : \"bg-muted/70\"}`}\n />\n <div\n className={`h-3 w-5/6 rounded ${collectBusy ? \"animate-pulse bg-muted\" : \"bg-muted/70\"}`}\n />\n </div>\n <div className=\"flex items-center justify-between gap-density-3\">\n <div className=\"text-sm text-muted-foreground\">\n {stack?.error\n ? stack.error\n : collectBusy\n ? \"Collecting stack trace...\"\n : \"No stack trace collected yet.\"}\n </div>\n {onCollectStack && (\n <CollectButton\n pid={process.pid}\n busy={collectBusy ?? false}\n onClick={onCollectStack}\n primary\n />\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"h-full min-h-0 flex flex-col\">\n {!singleItem && (\n <div className=\"px-1 py-1.5 space-y-density-2\">\n <div className=\"flex items-center justify-between gap-density-2 text-[11px] text-muted-foreground flex-wrap\">\n <div className=\"flex items-center gap-density-2 flex-wrap\">\n <StackStatusBadge status={stack.status} />\n {stack.collected_at && <span>{new Date(stack.collected_at).toLocaleString()}</span>}\n {stackItemCount(parsed) > 0 && (\n <span>\n {filtered.length} / {stackItemCount(parsed)} {stackItemLabel(parsed)}\n </span>\n )}\n </div>\n {onCollectStack && (\n <CollectButton pid={process.pid} busy={collectBusy ?? false} onClick={onCollectStack} />\n )}\n </div>\n {stackItemCount(parsed) > 0 && (\n <>\n <div className=\"flex items-center gap-1.5 flex-wrap\">\n <div className=\"relative min-w-[14rem] flex-1\">\n <Icon\n icon={UiSearch}\n className=\"absolute left-2 top-1/2 -translate-y-1/2 text-muted-foreground text-xs\"\n />\n <input\n className=\"w-full rounded-md border border-border bg-muted/50 py-1 pl-7 pr-2 text-xs outline-none focus:border-primary focus:bg-background\"\n placeholder={\n parsed.format === \"jvm\"\n ? \"Filter by thread name, function, or file\"\n : \"Filter by goroutine id, function, or file\"\n }\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n <label className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-muted/50 px-2 py-1 text-[11px] text-muted-foreground\">\n <input\n type=\"checkbox\"\n checked={hideRuntimeOnly}\n onChange={(e) => setHideRuntimeOnly(e.target.checked)}\n />\n Hide runtime-only\n </label>\n {(search || selectedStates.size > 0 || !hideRuntimeOnly) && (\n <button\n className=\"text-[11px] text-muted-foreground hover:text-foreground\"\n onClick={() => {\n setSearch(\"\");\n setSelectedStates(() => new Set());\n setHideRuntimeOnly(true);\n }}\n >\n Clear\n </button>\n )}\n </div>\n <div className=\"flex items-center gap-1 flex-wrap\">\n {Array.from(stateCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([state, count]) => {\n const active = selectedStates.has(state);\n return (\n <button\n key={state}\n className={`inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-[11px] transition-colors ${\n active\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-border bg-muted/50 text-muted-foreground hover:bg-background\"\n }`}\n onClick={() => {\n setSelectedStates((prev) => {\n const next = new Set(prev);\n if (next.has(state)) next.delete(state);\n else next.add(state);\n return next;\n });\n }}\n >\n <span className={`h-2 w-2 rounded-full ${stackStateDot(parsed, state)}`} />\n {state}\n <span className=\"text-[10px] opacity-70\">{count}</span>\n </button>\n );\n })}\n </div>\n </>\n )}\n </div>\n )}\n {stack.error && (\n <div className=\"mt-density-2 text-xs text-red-600 whitespace-pre-wrap\">{stack.error}</div>\n )}\n {stackItemCount(parsed) === 0 ? (\n <pre\n className=\"flex-1 min-h-0 overflow-auto py-1 text-[11px] text-foreground whitespace-pre-wrap font-mono leading-4\"\n style={{ minHeight: STACK_MIN_HEIGHT }}\n >\n {stack.text}\n </pre>\n ) : (\n <div\n className=\"flex-1 min-h-0 overflow-auto py-1 space-y-1\"\n style={{ minHeight: STACK_MIN_HEIGHT }}\n >\n {filtered.length === 0 && (\n <div className=\"py-density-3 text-center text-xs text-muted-foreground\">\n No {stackItemLabel(parsed)} match the current filters.\n </div>\n )}\n {parsed.format === \"jvm\" &&\n parsed.threads\n .filter((t) => filtered.includes(t))\n .map((t) => (\n <ThreadCard\n key={t.id}\n thread={t}\n search={search}\n hideRuntimeOnly={hideRuntimeOnly}\n {...(resolveSource ? { resolveSource } : {})}\n />\n ))}\n {parsed.format === \"go\" &&\n parsed.goroutines\n .filter((g) => filtered.includes(g))\n .map((goroutine) => (\n <GoroutineCard\n key={goroutine.id}\n goroutine={goroutine}\n search={search}\n hideRuntimeOnly={hideRuntimeOnly}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction StackStatusBadge({ status }: { status: string }) {\n const cls =\n status === \"ready\"\n ? \"bg-green-100 text-green-700 dark:bg-green-500/20 dark:text-green-300\"\n : status === \"unsupported\"\n ? \"bg-yellow-100 text-yellow-700 dark:bg-yellow-500/20 dark:text-yellow-300\"\n : \"bg-red-100 text-red-700 dark:bg-red-500/20 dark:text-red-300\";\n return <span className={`px-2 py-0.5 rounded-full ${cls}`}>{status}</span>;\n}\n\nfunction CollectButton({\n pid,\n busy,\n onClick,\n primary,\n}: {\n pid: number;\n busy?: boolean;\n onClick: (pid: number) => void | Promise<void>;\n primary?: boolean;\n}) {\n const base =\n \"shrink-0 text-[11px] px-2 py-1 rounded disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-1\";\n const style = primary\n ? \"bg-primary text-primary-foreground hover:bg-primary/90\"\n : \"border border-border text-muted-foreground hover:bg-accent\";\n return (\n <button\n className={`${base} ${style}`}\n onClick={() => onClick(pid)}\n disabled={busy}\n title={primary ? \"Collect the latest stack trace\" : \"Refresh stack trace\"}\n >\n <Icon icon={busy ? UiLoader : primary ? UiDebugSmall : UiRefresh} />\n {busy ? \"Collecting...\" : primary ? \"Collect stack trace\" : \"Refresh\"}\n </button>\n );\n}\n\nfunction PanelSection({\n title,\n grow,\n children,\n}: {\n title: string;\n grow?: boolean;\n children: ReactNode;\n}) {\n return (\n <section className={grow ? \"flex min-h-0 flex-1 flex-col\" : \"\"}>\n <div className=\"text-[11px] font-semibold uppercase tracking-wide text-muted-foreground mb-1.5\">\n {title}\n </div>\n {grow ? <div className=\"flex-1 min-h-0 overflow-hidden\">{children}</div> : children}\n </section>\n );\n}\n\nfunction InfoTile({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"border border-border rounded-lg bg-muted/50 px-2.5 py-density-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">{label}</div>\n <div className=\"text-xs font-medium text-foreground mt-0.5\">{value}</div>\n </div>\n );\n}\n\nfunction ProcessMetrics({ process }: { process: ProcessNode }) {\n const cpu = process.cpu_percent || 0;\n const rss = process.rss;\n const vms = process.vms;\n const memRatioPct = rss && vms && vms > 0 ? Math.min(100, Math.round((rss / vms) * 100)) : 0;\n return (\n <div className=\"grid grid-cols-4 gap-density-1\">\n <MetricTile\n label=\"CPU\"\n value={`${cpu.toFixed(1)}%`}\n barPct={Math.min(100, cpu)}\n tone={cpuTone(cpu)}\n />\n <MetricTile\n label=\"RSS\"\n value={rss !== undefined ? formatBytes(rss) : \"n/a\"}\n barPct={memRatioPct}\n tone={memoryTone(rss, vms)}\n />\n <MetricTile label=\"VMS\" value={vms !== undefined ? formatBytes(vms) : \"n/a\"} tone=\"neutral\" />\n <MetricTile\n label=\"Files\"\n value={process.open_files !== undefined ? String(process.open_files) : \"n/a\"}\n barPct={process.open_files ? Math.min(100, (process.open_files / 1024) * 100) : 0}\n tone=\"info\"\n />\n </div>\n );\n}\n\nfunction MetricTile({\n label,\n value,\n barPct,\n tone = \"neutral\",\n}: {\n label: string;\n value: string;\n barPct?: number;\n tone?: GaugeTone;\n}) {\n const toneBar: Record<GaugeTone, string> = {\n neutral: \"bg-muted-foreground/40\",\n success: \"bg-green-500\",\n warning: \"bg-yellow-500\",\n danger: \"bg-red-500\",\n info: \"bg-blue-500\",\n };\n const toneText: Record<GaugeTone, string> = {\n neutral: \"text-foreground\",\n success: \"text-green-600 dark:text-green-400\",\n warning: \"text-yellow-600 dark:text-yellow-400\",\n danger: \"text-red-600 dark:text-red-400\",\n info: \"text-blue-600 dark:text-blue-400\",\n };\n return (\n <div className=\"flex flex-col gap-0.5 rounded-md border border-border bg-background px-density-2 py-1 min-w-0\">\n <span className=\"text-[9px] uppercase tracking-wide text-muted-foreground leading-none\">\n {label}\n </span>\n <span className={`text-xs font-semibold tabular-nums truncate ${toneText[tone]}`}>\n {value}\n </span>\n {barPct !== undefined && (\n <div className=\"h-0.5 w-full rounded-full bg-muted overflow-hidden\">\n <div\n className={`h-full ${toneBar[tone]} transition-all duration-300`}\n style={{ width: `${barPct}%` }}\n />\n </div>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DiagnosticsDetailPanel.js","sources":["../../../src/data/diagnostics/DiagnosticsDetailPanel.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { Icon } from \"../Icon\";\nimport type { GaugeTone } from \"../Gauge\";\nimport { UiDebug, UiDebugSmall, UiRefresh, UiSearch, UiServerProcess, UiLoader } from \"../../icons\";\nimport type { ProcessNode, RunMeta } from \"./types\";\nimport { formatBytes, processLabel, processStateColor, processStateIcon } from \"./utils\";\nimport { countStackByState, parseStackDump, type ParsedStack } from \"./stacktrace\";\nimport { GoroutineCard } from \"./GoroutineCard\";\nimport { ThreadCard } from \"./ThreadCard\";\nimport { goroutineStateDot, threadStateDot } from \"./state-styles\";\nimport type { JvmFrameSourceResolver } from \"./JvmStackTrace\";\n\nconst STACK_MIN_LINES = 10;\nconst STACK_LINE_HEIGHT_REM = 1;\nconst STACK_MIN_HEIGHT = `${STACK_MIN_LINES * STACK_LINE_HEIGHT_REM}rem`;\n\nfunction cpuTone(pct: number): GaugeTone {\n if (pct >= 90) return \"danger\";\n if (pct >= 60) return \"warning\";\n if (pct > 0) return \"success\";\n return \"neutral\";\n}\n\nfunction memoryTone(rss: number | undefined, vms: number | undefined): GaugeTone {\n if (!rss || !vms) return \"neutral\";\n const ratio = rss / vms;\n if (ratio >= 0.9) return \"danger\";\n if (ratio >= 0.6) return \"warning\";\n return \"info\";\n}\n\nexport type DiagnosticsDetailPanelProps = {\n /** Selected process; null renders the empty selection state. */\n process: ProcessNode | null;\n /** Shows loading state while stack capture is being collected. */\n collectBusy?: boolean;\n /** Called when the user requests a fresh stack capture. */\n onCollectStack?: (pid: number) => void | Promise<void>;\n /** Optional run metadata rendered above diagnostics. */\n runMeta?: RunMeta;\n /**\n * Optional resolver that supplies inline source under each JVM stack frame,\n * so the rendered thread dump can be augmented in place (e.g. with decompiled\n * source). A missing class must resolve to undefined, never throw.\n */\n resolveSource?: JvmFrameSourceResolver;\n /**\n * Caller-supplied action buttons rendered right-aligned in the header row,\n * next to the title and Refresh. Use for download/decompile-style actions.\n */\n headerActions?: ReactNode;\n /**\n * The capture holds a single, already-selected item (e.g. one thread the\n * caller picked from its own list). Suppresses the redundant per-item filter\n * UI (search box, state chips, hide-runtime, count) and lifts Refresh into\n * the header row so the detail view shows just that item's frames.\n */\n singleItem?: boolean;\n};\n\nexport function DiagnosticsDetailPanel({\n process,\n collectBusy,\n onCollectStack,\n runMeta,\n resolveSource,\n headerActions,\n singleItem,\n}: DiagnosticsDetailPanelProps) {\n const [search, setSearch] = useState(\"\");\n const [selectedStates, setSelectedStates] = useState<Set<string>>(new Set());\n const [hideRuntimeOnly, setHideRuntimeOnly] = useState(true);\n const stack = process?.stack_capture;\n const parsed = useMemo<ParsedStack>(() => parseStackDump(stack?.text || \"\"), [stack?.text]);\n const stateCounts = useMemo(() => countStackByState(parsed), [parsed]);\n const filtered = useMemo(() => {\n const needle = search.trim().toLowerCase();\n const items: Array<{\n state: string;\n userFrameCount: number;\n searchText: string;\n }> = parsed.format === \"jvm\" ? parsed.threads : parsed.format === \"go\" ? parsed.goroutines : [];\n if (singleItem) return items;\n return items.filter((item) => {\n if (selectedStates.size > 0 && !selectedStates.has(item.state)) return false;\n if (hideRuntimeOnly && item.userFrameCount === 0) return false;\n if (needle && !item.searchText.includes(needle)) return false;\n return true;\n });\n }, [parsed, search, selectedStates, hideRuntimeOnly, singleItem]);\n\n useEffect(() => {\n setSearch(\"\");\n setSelectedStates(new Set());\n setHideRuntimeOnly(true);\n }, [stack?.text, process?.pid]);\n\n if (!process) {\n return (\n <div className=\"flex items-center justify-center h-full text-muted-foreground text-sm\">\n <div className=\"text-center\">\n <Icon icon={UiServerProcess} className=\"text-4xl mb-density-2\" />\n <div>Select a process to view diagnostics</div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"h-full min-h-0 flex flex-col gap-density-3 p-density-4\">\n <Header\n process={process}\n actions={\n <div className=\"flex items-center gap-density-2\">\n {singleItem && onCollectStack && (\n <CollectButton pid={process.pid} busy={collectBusy ?? false} onClick={onCollectStack} />\n )}\n {headerActions}\n </div>\n }\n />\n {runMeta && <RunSection runMeta={runMeta} />}\n {process.command && (\n <PanelSection title=\"Command\">\n <pre className=\"text-xs text-foreground whitespace-pre-wrap font-mono bg-blue-50 dark:bg-blue-500/10 rounded p-2 break-all\">\n {process.command}\n </pre>\n </PanelSection>\n )}\n\n <PanelSection title=\"Metrics\">\n <ProcessMetrics process={process} />\n </PanelSection>\n\n <PanelSection title=\"Stack\" grow>\n <StackBlock\n process={process}\n parsed={parsed}\n stateCounts={stateCounts}\n filtered={filtered}\n search={search}\n setSearch={setSearch}\n selectedStates={selectedStates}\n setSelectedStates={setSelectedStates}\n hideRuntimeOnly={hideRuntimeOnly}\n setHideRuntimeOnly={setHideRuntimeOnly}\n collectBusy={collectBusy ?? false}\n singleItem={singleItem ?? false}\n {...(onCollectStack ? { onCollectStack } : {})}\n {...(resolveSource ? { resolveSource } : {})}\n />\n </PanelSection>\n </div>\n );\n}\n\nfunction Header({ process, actions }: { process: ProcessNode; actions?: ReactNode }) {\n return (\n <div className=\"flex items-start justify-between gap-density-3\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-density-2 flex-wrap\">\n <Icon\n icon={process.is_root ? UiServerProcess : UiDebug}\n className=\"text-2xl text-blue-600\"\n />\n <h2 className=\"text-lg font-bold text-foreground break-words\">{processLabel(process)}</h2>\n {process.status ? (\n <span\n className={`inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs ${processStateColor(\n process.status,\n )}`}\n >\n <Icon icon={processStateIcon(process.status)} />\n {process.status}\n </span>\n ) : null}\n </div>\n <div className=\"mt-1 flex items-center gap-density-2 flex-wrap text-xs text-muted-foreground\">\n <span className=\"font-mono\">pid {process.pid}</span>\n {process.ppid ? <span className=\"font-mono\">ppid {process.ppid}</span> : null}\n </div>\n </div>\n {actions ? <div className=\"shrink-0\">{actions}</div> : null}\n </div>\n );\n}\n\nfunction RunSection({ runMeta }: { runMeta: RunMeta }) {\n return (\n <PanelSection title=\"Run\">\n <div className=\"grid grid-cols-2 gap-density-2 text-sm\">\n <InfoTile\n label={runMeta.kind === \"rerun\" ? `Rerun #${runMeta.sequence}` : \"Initial run\"}\n value={runMeta.started ? new Date(runMeta.started).toLocaleString() : \"Unavailable\"}\n />\n <InfoTile\n label=\"Finished\"\n value={runMeta.ended ? new Date(runMeta.ended).toLocaleString() : \"In progress\"}\n />\n </div>\n </PanelSection>\n );\n}\n\ntype StackFilterItem = {\n state: string;\n userFrameCount: number;\n searchText: string;\n};\n\ntype StackBlockProps = {\n process: ProcessNode;\n parsed: ParsedStack;\n stateCounts: Map<string, number>;\n filtered: StackFilterItem[];\n search: string;\n setSearch: (v: string) => void;\n selectedStates: Set<string>;\n setSelectedStates: (updater: (prev: Set<string>) => Set<string>) => void;\n hideRuntimeOnly: boolean;\n setHideRuntimeOnly: (v: boolean) => void;\n collectBusy?: boolean;\n onCollectStack?: (pid: number) => void | Promise<void>;\n resolveSource?: JvmFrameSourceResolver;\n singleItem?: boolean;\n};\n\nfunction stackItemCount(parsed: ParsedStack): number {\n if (parsed.format === \"jvm\") return parsed.threads.length;\n if (parsed.format === \"go\") return parsed.goroutines.length;\n return 0;\n}\n\nfunction stackItemLabel(parsed: ParsedStack): string {\n if (parsed.format === \"jvm\") return \"threads\";\n if (parsed.format === \"go\") return \"goroutines\";\n return \"frames\";\n}\n\nfunction stackStateDot(parsed: ParsedStack, state: string): string {\n return parsed.format === \"jvm\" ? threadStateDot(state) : goroutineStateDot(state);\n}\n\nfunction StackBlock(props: StackBlockProps) {\n const {\n process,\n parsed,\n stateCounts,\n filtered,\n search,\n setSearch,\n selectedStates,\n setSelectedStates,\n hideRuntimeOnly,\n setHideRuntimeOnly,\n collectBusy,\n onCollectStack,\n resolveSource,\n singleItem,\n } = props;\n const stack = process.stack_capture;\n\n if (!stack?.text) {\n return (\n <div className=\"h-full min-h-[14rem] flex flex-col justify-center gap-density-3 p-density-3\">\n <div className=\"space-y-1.5\">\n <div\n className={`h-3 w-40 rounded ${collectBusy ? \"animate-pulse bg-muted\" : \"bg-muted/70\"}`}\n />\n <div\n className={`h-3 w-full rounded ${collectBusy ? \"animate-pulse bg-muted\" : \"bg-muted/70\"}`}\n />\n <div\n className={`h-3 w-5/6 rounded ${collectBusy ? \"animate-pulse bg-muted\" : \"bg-muted/70\"}`}\n />\n </div>\n <div className=\"flex items-center justify-between gap-density-3\">\n <div className=\"text-sm text-muted-foreground\">\n {stack?.error\n ? stack.error\n : collectBusy\n ? \"Collecting stack trace...\"\n : \"No stack trace collected yet.\"}\n </div>\n {onCollectStack && (\n <CollectButton\n pid={process.pid}\n busy={collectBusy ?? false}\n onClick={onCollectStack}\n primary\n />\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"h-full min-h-0 flex flex-col\">\n {!singleItem && (\n <div className=\"px-1 py-1.5 space-y-density-2\">\n <div className=\"flex items-center justify-between gap-density-2 text-[11px] text-muted-foreground flex-wrap\">\n <div className=\"flex items-center gap-density-2 flex-wrap\">\n <StackStatusBadge status={stack.status} />\n {stack.collected_at && <span>{new Date(stack.collected_at).toLocaleString()}</span>}\n {stackItemCount(parsed) > 0 && (\n <span>\n {filtered.length} / {stackItemCount(parsed)} {stackItemLabel(parsed)}\n </span>\n )}\n </div>\n {onCollectStack && (\n <CollectButton pid={process.pid} busy={collectBusy ?? false} onClick={onCollectStack} />\n )}\n </div>\n {stackItemCount(parsed) > 0 && (\n <>\n <div className=\"flex items-center gap-1.5 flex-wrap\">\n <div className=\"relative min-w-[14rem] flex-1\">\n <Icon\n icon={UiSearch}\n className=\"absolute left-2 top-1/2 -translate-y-1/2 text-muted-foreground text-xs\"\n />\n <input\n className=\"w-full rounded-md border border-border bg-muted/50 py-1 pl-7 pr-2 text-xs outline-none focus:border-primary focus:bg-background\"\n placeholder={\n parsed.format === \"jvm\"\n ? \"Filter by thread name, function, or file\"\n : \"Filter by goroutine id, function, or file\"\n }\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n <label className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-muted/50 px-2 py-1 text-[11px] text-muted-foreground\">\n <input\n type=\"checkbox\"\n checked={hideRuntimeOnly}\n onChange={(e) => setHideRuntimeOnly(e.target.checked)}\n />\n Hide runtime-only\n </label>\n {(search || selectedStates.size > 0 || !hideRuntimeOnly) && (\n <button\n className=\"text-[11px] text-muted-foreground hover:text-foreground\"\n onClick={() => {\n setSearch(\"\");\n setSelectedStates(() => new Set());\n setHideRuntimeOnly(true);\n }}\n >\n Clear\n </button>\n )}\n </div>\n <div className=\"flex items-center gap-1 flex-wrap\">\n {Array.from(stateCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([state, count]) => {\n const active = selectedStates.has(state);\n return (\n <button\n key={state}\n className={`inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-[11px] transition-colors ${\n active\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-border bg-muted/50 text-muted-foreground hover:bg-background\"\n }`}\n onClick={() => {\n setSelectedStates((prev) => {\n const next = new Set(prev);\n if (next.has(state)) next.delete(state);\n else next.add(state);\n return next;\n });\n }}\n >\n <span className={`h-2 w-2 rounded-full ${stackStateDot(parsed, state)}`} />\n {state}\n <span className=\"text-[10px] opacity-70\">{count}</span>\n </button>\n );\n })}\n </div>\n </>\n )}\n </div>\n )}\n {stack.error && (\n <div className=\"mt-density-2 text-xs text-red-600 whitespace-pre-wrap\">{stack.error}</div>\n )}\n {stackItemCount(parsed) === 0 ? (\n <pre\n className=\"flex-1 min-h-0 overflow-auto py-1 text-[11px] text-foreground whitespace-pre-wrap font-mono leading-4\"\n style={{ minHeight: STACK_MIN_HEIGHT }}\n >\n {stack.text}\n </pre>\n ) : (\n <div\n className=\"flex-1 min-h-0 overflow-auto py-1 space-y-1\"\n style={{ minHeight: STACK_MIN_HEIGHT }}\n >\n {filtered.length === 0 && (\n <div className=\"py-density-3 text-center text-xs text-muted-foreground\">\n No {stackItemLabel(parsed)} match the current filters.\n </div>\n )}\n {parsed.format === \"jvm\" &&\n parsed.threads\n .filter((t) => filtered.includes(t))\n .map((t) => (\n <ThreadCard\n key={t.id}\n thread={t}\n search={search}\n hideRuntimeOnly={hideRuntimeOnly}\n {...(resolveSource ? { resolveSource } : {})}\n />\n ))}\n {parsed.format === \"go\" &&\n parsed.goroutines\n .filter((g) => filtered.includes(g))\n .map((goroutine) => (\n <GoroutineCard\n key={goroutine.id}\n goroutine={goroutine}\n search={search}\n hideRuntimeOnly={hideRuntimeOnly}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction StackStatusBadge({ status }: { status: string }) {\n const cls =\n status === \"ready\"\n ? \"bg-green-100 text-green-700 dark:bg-green-500/20 dark:text-green-300\"\n : status === \"unsupported\"\n ? \"bg-yellow-100 text-yellow-700 dark:bg-yellow-500/20 dark:text-yellow-300\"\n : \"bg-red-100 text-red-700 dark:bg-red-500/20 dark:text-red-300\";\n return <span className={`px-2 py-0.5 rounded-full ${cls}`}>{status}</span>;\n}\n\nfunction CollectButton({\n pid,\n busy,\n onClick,\n primary,\n}: {\n pid: number;\n busy?: boolean;\n onClick: (pid: number) => void | Promise<void>;\n primary?: boolean;\n}) {\n const base =\n \"shrink-0 text-[11px] px-2 py-1 rounded disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-1\";\n const style = primary\n ? \"bg-primary text-primary-foreground hover:bg-primary/90\"\n : \"border border-border text-muted-foreground hover:bg-accent\";\n return (\n <button\n className={`${base} ${style}`}\n onClick={() => onClick(pid)}\n disabled={busy}\n title={primary ? \"Collect the latest stack trace\" : \"Refresh stack trace\"}\n >\n <Icon icon={busy ? UiLoader : primary ? UiDebugSmall : UiRefresh} />\n {busy ? \"Collecting...\" : primary ? \"Collect stack trace\" : \"Refresh\"}\n </button>\n );\n}\n\nfunction PanelSection({\n title,\n grow,\n children,\n}: {\n title: string;\n grow?: boolean;\n children: ReactNode;\n}) {\n return (\n <section className={grow ? \"flex min-h-0 flex-1 flex-col\" : \"\"}>\n <div className=\"text-[11px] font-semibold uppercase tracking-wide text-muted-foreground mb-1.5\">\n {title}\n </div>\n {grow ? <div className=\"flex-1 min-h-0 overflow-hidden\">{children}</div> : children}\n </section>\n );\n}\n\nfunction InfoTile({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"border border-border rounded-lg bg-muted/50 px-2.5 py-density-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">{label}</div>\n <div className=\"text-xs font-medium text-foreground mt-0.5\">{value}</div>\n </div>\n );\n}\n\nfunction ProcessMetrics({ process }: { process: ProcessNode }) {\n const cpu = process.cpu_percent || 0;\n const rss = process.rss;\n const vms = process.vms;\n const memRatioPct = rss && vms && vms > 0 ? Math.min(100, Math.round((rss / vms) * 100)) : 0;\n return (\n <div className=\"grid grid-cols-4 gap-density-1\">\n <MetricTile\n label=\"CPU\"\n value={`${cpu.toFixed(1)}%`}\n barPct={Math.min(100, cpu)}\n tone={cpuTone(cpu)}\n />\n <MetricTile\n label=\"RSS\"\n value={rss !== undefined ? formatBytes(rss) : \"n/a\"}\n barPct={memRatioPct}\n tone={memoryTone(rss, vms)}\n />\n <MetricTile label=\"VMS\" value={vms !== undefined ? formatBytes(vms) : \"n/a\"} tone=\"neutral\" />\n <MetricTile\n label=\"Files\"\n value={process.open_files !== undefined ? String(process.open_files) : \"n/a\"}\n barPct={process.open_files ? Math.min(100, (process.open_files / 1024) * 100) : 0}\n tone=\"info\"\n />\n </div>\n );\n}\n\nfunction MetricTile({\n label,\n value,\n barPct,\n tone = \"neutral\",\n}: {\n label: string;\n value: string;\n barPct?: number;\n tone?: GaugeTone;\n}) {\n const toneBar: Record<GaugeTone, string> = {\n neutral: \"bg-muted-foreground/40\",\n success: \"bg-green-500\",\n warning: \"bg-yellow-500\",\n danger: \"bg-red-500\",\n info: \"bg-blue-500\",\n };\n const toneText: Record<GaugeTone, string> = {\n neutral: \"text-foreground\",\n success: \"text-green-600 dark:text-green-400\",\n warning: \"text-yellow-600 dark:text-yellow-400\",\n danger: \"text-red-600 dark:text-red-400\",\n info: \"text-blue-600 dark:text-blue-400\",\n };\n return (\n <div className=\"flex flex-col gap-0.5 rounded-md border border-border bg-background px-density-2 py-1 min-w-0\">\n <span className=\"text-[9px] uppercase tracking-wide text-muted-foreground leading-none\">\n {label}\n </span>\n <span className={`text-xs font-semibold tabular-nums truncate ${toneText[tone]}`}>\n {value}\n </span>\n {barPct !== undefined && (\n <div className=\"h-0.5 w-full rounded-full bg-muted overflow-hidden\">\n <div\n className={`h-full ${toneBar[tone]} transition-all duration-300`}\n style={{ width: `${barPct}%` }}\n />\n </div>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -2,27 +2,10 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
4
|
const Icon = require("../Icon.cjs");
|
|
5
|
+
const stateStyles = require("./state-styles.cjs");
|
|
5
6
|
const UiRestart = require("../../icons/components/UiRestart.cjs");
|
|
6
7
|
const UiDebugStepOver = require("../../icons/components/UiDebugStepOver.cjs");
|
|
7
8
|
const UiMethod = require("../../icons/components/UiMethod.cjs");
|
|
8
|
-
function goroutineStateBadge(state) {
|
|
9
|
-
if (state.includes("running"))
|
|
10
|
-
return "bg-green-50 text-green-700 dark:bg-green-500/20 dark:text-green-300";
|
|
11
|
-
if (state.includes("chan") || state.includes("wait"))
|
|
12
|
-
return "bg-blue-50 text-blue-700 dark:bg-blue-500/20 dark:text-blue-300";
|
|
13
|
-
if (state.includes("sleep"))
|
|
14
|
-
return "bg-amber-50 text-amber-700 dark:bg-amber-500/20 dark:text-amber-300";
|
|
15
|
-
if (state.includes("select"))
|
|
16
|
-
return "bg-violet-50 text-violet-700 dark:bg-violet-500/20 dark:text-violet-300";
|
|
17
|
-
return "bg-muted text-muted-foreground";
|
|
18
|
-
}
|
|
19
|
-
function goroutineStateDot(state) {
|
|
20
|
-
if (state.includes("running")) return "bg-green-500";
|
|
21
|
-
if (state.includes("chan") || state.includes("wait")) return "bg-blue-500";
|
|
22
|
-
if (state.includes("sleep")) return "bg-amber-500";
|
|
23
|
-
if (state.includes("select")) return "bg-violet-500";
|
|
24
|
-
return "bg-muted-foreground/40";
|
|
25
|
-
}
|
|
26
9
|
function GoroutineCard({ goroutine, search, hideRuntimeOnly }) {
|
|
27
10
|
const frames = hideRuntimeOnly ? goroutine.frames.filter((frame) => !frame.runtime || frame.kind === "created_by") : goroutine.frames;
|
|
28
11
|
const defaultOpen = goroutine.state === "running" || !!search;
|
|
@@ -35,11 +18,11 @@ function GoroutineCard({ goroutine, search, hideRuntimeOnly }) {
|
|
|
35
18
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
36
19
|
"span",
|
|
37
20
|
{
|
|
38
|
-
className: `inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] ${goroutineStateBadge(
|
|
21
|
+
className: `inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] ${stateStyles.goroutineStateBadge(
|
|
39
22
|
goroutine.state
|
|
40
23
|
)}`,
|
|
41
24
|
children: [
|
|
42
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: `h-2 w-2 rounded-full ${goroutineStateDot(goroutine.state)}` }),
|
|
25
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: `h-2 w-2 rounded-full ${stateStyles.goroutineStateDot(goroutine.state)}` }),
|
|
43
26
|
goroutine.rawState
|
|
44
27
|
]
|
|
45
28
|
}
|
|
@@ -73,6 +56,4 @@ function FrameRow({ frame }) {
|
|
|
73
56
|
] }) });
|
|
74
57
|
}
|
|
75
58
|
exports.GoroutineCard = GoroutineCard;
|
|
76
|
-
exports.goroutineStateBadge = goroutineStateBadge;
|
|
77
|
-
exports.goroutineStateDot = goroutineStateDot;
|
|
78
59
|
//# sourceMappingURL=GoroutineCard.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GoroutineCard.cjs","sources":["../../../src/data/diagnostics/GoroutineCard.tsx"],"sourcesContent":["import { Icon } from \"../Icon\";\nimport { UiRestart, UiDebugStepOver, UiMethod } from \"../../icons\";\nimport type { ParsedGoroutine, ParsedGoroutineFrame } from \"./stacktrace\";\
|
|
1
|
+
{"version":3,"file":"GoroutineCard.cjs","sources":["../../../src/data/diagnostics/GoroutineCard.tsx"],"sourcesContent":["import { Icon } from \"../Icon\";\nimport { UiRestart, UiDebugStepOver, UiMethod } from \"../../icons\";\nimport type { ParsedGoroutine, ParsedGoroutineFrame } from \"./stacktrace\";\nimport { goroutineStateBadge, goroutineStateDot } from \"./state-styles\";\n\nexport type GoroutineCardProps = {\n goroutine: ParsedGoroutine;\n search: string;\n hideRuntimeOnly: boolean;\n};\n\nexport function GoroutineCard({ goroutine, search, hideRuntimeOnly }: GoroutineCardProps) {\n const frames = hideRuntimeOnly\n ? goroutine.frames.filter((frame) => !frame.runtime || frame.kind === \"created_by\")\n : goroutine.frames;\n const defaultOpen = goroutine.state === \"running\" || !!search;\n\n return (\n <details className=\"border-0 bg-transparent\" open={defaultOpen}>\n <summary className=\"cursor-pointer list-none px-0 py-1\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"font-mono text-xs font-semibold text-foreground\">g{goroutine.id}</span>\n <span\n className={`inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] ${goroutineStateBadge(\n goroutine.state,\n )}`}\n >\n <span className={`h-2 w-2 rounded-full ${goroutineStateDot(goroutine.state)}`} />\n {goroutine.rawState}\n </span>\n <span className=\"text-[11px] text-muted-foreground\">{frames.length}f</span>\n {goroutine.userFrameCount > 0 && (\n <span className=\"text-[11px] text-muted-foreground\">{goroutine.userFrameCount}u</span>\n )}\n {goroutine.topFunction && (\n <span className=\"truncate text-[11px] text-muted-foreground\">\n {goroutine.topFunction}\n </span>\n )}\n </div>\n </summary>\n <div className=\"pl-3 py-1 space-y-0.5\">\n {frames.map((frame, index) => (\n <FrameRow key={`${goroutine.id}-${index}`} frame={frame} />\n ))}\n </div>\n </details>\n );\n}\n\nfunction FrameRow({ frame }: { frame: ParsedGoroutineFrame }) {\n return (\n <div className={frame.runtime ? \"text-muted-foreground\" : \"text-foreground\"}>\n <div className=\"flex items-start gap-1.5\">\n <Icon\n icon={\n frame.kind === \"created_by\" ? UiRestart : frame.runtime ? UiDebugStepOver : UiMethod\n }\n className=\"shrink-0 mt-0.5 text-[11px]\"\n />\n <div className=\"min-w-0\">\n <div className=\"break-all font-mono text-[11px] font-semibold leading-4\">\n {frame.displayName}\n {frame.location && (\n <span className=\"ml-2 text-[10px] font-normal opacity-80\">{frame.location}</span>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"names":["jsxs","jsx","goroutineStateBadge","goroutineStateDot","Icon","UiRestart","UiDebugStepOver","UiMethod"],"mappings":";;;;;;;;AAWO,SAAS,cAAc,EAAE,WAAW,QAAQ,mBAAuC;AACxF,QAAM,SAAS,kBACX,UAAU,OAAO,OAAO,CAAC,UAAU,CAAC,MAAM,WAAW,MAAM,SAAS,YAAY,IAChF,UAAU;AACd,QAAM,cAAc,UAAU,UAAU,aAAa,CAAC,CAAC;AAEvD,SACEA,2BAAAA,KAAC,WAAA,EAAQ,WAAU,2BAA0B,MAAM,aACjD,UAAA;AAAA,IAAAC,2BAAAA,IAAC,aAAQ,WAAU,sCACjB,UAAAD,2BAAAA,KAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,MAAAA,2BAAAA,KAAC,QAAA,EAAK,WAAU,mDAAkD,UAAA;AAAA,QAAA;AAAA,QAAE,UAAU;AAAA,MAAA,GAAG;AAAA,MACjFA,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW,uEAAuEE,YAAAA;AAAAA,YAChF,UAAU;AAAA,UAAA,CACX;AAAA,UAED,UAAA;AAAA,YAAAD,+BAAC,UAAK,WAAW,wBAAwBE,YAAAA,kBAAkB,UAAU,KAAK,CAAC,IAAI;AAAA,YAC9E,UAAU;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAEbH,2BAAAA,KAAC,QAAA,EAAK,WAAU,qCAAqC,UAAA;AAAA,QAAA,OAAO;AAAA,QAAO;AAAA,MAAA,GAAC;AAAA,MACnE,UAAU,iBAAiB,KAC1BA,2BAAAA,KAAC,QAAA,EAAK,WAAU,qCAAqC,UAAA;AAAA,QAAA,UAAU;AAAA,QAAe;AAAA,MAAA,GAAC;AAAA,MAEhF,UAAU,eACTC,2BAAAA,IAAC,UAAK,WAAU,8CACb,oBAAU,YAAA,CACb;AAAA,IAAA,EAAA,CAEJ,EAAA,CACF;AAAA,mCACC,OAAA,EAAI,WAAU,yBACZ,UAAA,OAAO,IAAI,CAAC,OAAO,yCACjB,UAAA,EAA0C,MAAA,GAA5B,GAAG,UAAU,EAAE,IAAI,KAAK,EAAkB,CAC1D,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;AAEA,SAAS,SAAS,EAAE,SAA0C;AAC5D,SACEA,2BAAAA,IAAC,OAAA,EAAI,WAAW,MAAM,UAAU,0BAA0B,mBACxD,UAAAD,2BAAAA,KAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,IAAAC,2BAAAA;AAAAA,MAACG,KAAAA;AAAAA,MAAA;AAAA,QACC,MACE,MAAM,SAAS,eAAeC,UAAAA,YAAY,MAAM,UAAUC,gBAAAA,kBAAkBC,SAAAA;AAAAA,QAE9E,WAAU;AAAA,MAAA;AAAA,IAAA;AAAA,mCAEX,OAAA,EAAI,WAAU,WACb,UAAAP,2BAAAA,KAAC,OAAA,EAAI,WAAU,2DACZ,UAAA;AAAA,MAAA,MAAM;AAAA,MACN,MAAM,YACLC,2BAAAA,IAAC,UAAK,WAAU,2CAA2C,gBAAM,SAAA,CAAS;AAAA,IAAA,EAAA,CAE9E,EAAA,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;;"}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import { ParsedGoroutine } from './stacktrace';
|
|
2
|
-
export declare function goroutineStateBadge(state: string): string;
|
|
3
|
-
export declare function goroutineStateDot(state: string): string;
|
|
4
2
|
export type GoroutineCardProps = {
|
|
5
3
|
goroutine: ParsedGoroutine;
|
|
6
4
|
search: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GoroutineCard.d.ts","sourceRoot":"","sources":["../../../src/data/diagnostics/GoroutineCard.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAwB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"GoroutineCard.d.ts","sourceRoot":"","sources":["../../../src/data/diagnostics/GoroutineCard.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAwB,MAAM,cAAc,CAAC;AAG1E,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,eAAe,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,wBAAgB,aAAa,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,EAAE,kBAAkB,2CAqCvF"}
|
|
@@ -1,26 +1,9 @@
|
|
|
1
1
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
2
|
import { Icon } from "../Icon.js";
|
|
3
|
+
import { goroutineStateDot, goroutineStateBadge } from "./state-styles.js";
|
|
3
4
|
import { UiRestart } from "../../icons/components/UiRestart.js";
|
|
4
5
|
import { UiDebugStepOver } from "../../icons/components/UiDebugStepOver.js";
|
|
5
6
|
import { UiMethod } from "../../icons/components/UiMethod.js";
|
|
6
|
-
function goroutineStateBadge(state) {
|
|
7
|
-
if (state.includes("running"))
|
|
8
|
-
return "bg-green-50 text-green-700 dark:bg-green-500/20 dark:text-green-300";
|
|
9
|
-
if (state.includes("chan") || state.includes("wait"))
|
|
10
|
-
return "bg-blue-50 text-blue-700 dark:bg-blue-500/20 dark:text-blue-300";
|
|
11
|
-
if (state.includes("sleep"))
|
|
12
|
-
return "bg-amber-50 text-amber-700 dark:bg-amber-500/20 dark:text-amber-300";
|
|
13
|
-
if (state.includes("select"))
|
|
14
|
-
return "bg-violet-50 text-violet-700 dark:bg-violet-500/20 dark:text-violet-300";
|
|
15
|
-
return "bg-muted text-muted-foreground";
|
|
16
|
-
}
|
|
17
|
-
function goroutineStateDot(state) {
|
|
18
|
-
if (state.includes("running")) return "bg-green-500";
|
|
19
|
-
if (state.includes("chan") || state.includes("wait")) return "bg-blue-500";
|
|
20
|
-
if (state.includes("sleep")) return "bg-amber-500";
|
|
21
|
-
if (state.includes("select")) return "bg-violet-500";
|
|
22
|
-
return "bg-muted-foreground/40";
|
|
23
|
-
}
|
|
24
7
|
function GoroutineCard({ goroutine, search, hideRuntimeOnly }) {
|
|
25
8
|
const frames = hideRuntimeOnly ? goroutine.frames.filter((frame) => !frame.runtime || frame.kind === "created_by") : goroutine.frames;
|
|
26
9
|
const defaultOpen = goroutine.state === "running" || !!search;
|
|
@@ -71,8 +54,6 @@ function FrameRow({ frame }) {
|
|
|
71
54
|
] }) });
|
|
72
55
|
}
|
|
73
56
|
export {
|
|
74
|
-
GoroutineCard
|
|
75
|
-
goroutineStateBadge,
|
|
76
|
-
goroutineStateDot
|
|
57
|
+
GoroutineCard
|
|
77
58
|
};
|
|
78
59
|
//# sourceMappingURL=GoroutineCard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GoroutineCard.js","sources":["../../../src/data/diagnostics/GoroutineCard.tsx"],"sourcesContent":["import { Icon } from \"../Icon\";\nimport { UiRestart, UiDebugStepOver, UiMethod } from \"../../icons\";\nimport type { ParsedGoroutine, ParsedGoroutineFrame } from \"./stacktrace\";\
|
|
1
|
+
{"version":3,"file":"GoroutineCard.js","sources":["../../../src/data/diagnostics/GoroutineCard.tsx"],"sourcesContent":["import { Icon } from \"../Icon\";\nimport { UiRestart, UiDebugStepOver, UiMethod } from \"../../icons\";\nimport type { ParsedGoroutine, ParsedGoroutineFrame } from \"./stacktrace\";\nimport { goroutineStateBadge, goroutineStateDot } from \"./state-styles\";\n\nexport type GoroutineCardProps = {\n goroutine: ParsedGoroutine;\n search: string;\n hideRuntimeOnly: boolean;\n};\n\nexport function GoroutineCard({ goroutine, search, hideRuntimeOnly }: GoroutineCardProps) {\n const frames = hideRuntimeOnly\n ? goroutine.frames.filter((frame) => !frame.runtime || frame.kind === \"created_by\")\n : goroutine.frames;\n const defaultOpen = goroutine.state === \"running\" || !!search;\n\n return (\n <details className=\"border-0 bg-transparent\" open={defaultOpen}>\n <summary className=\"cursor-pointer list-none px-0 py-1\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"font-mono text-xs font-semibold text-foreground\">g{goroutine.id}</span>\n <span\n className={`inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] ${goroutineStateBadge(\n goroutine.state,\n )}`}\n >\n <span className={`h-2 w-2 rounded-full ${goroutineStateDot(goroutine.state)}`} />\n {goroutine.rawState}\n </span>\n <span className=\"text-[11px] text-muted-foreground\">{frames.length}f</span>\n {goroutine.userFrameCount > 0 && (\n <span className=\"text-[11px] text-muted-foreground\">{goroutine.userFrameCount}u</span>\n )}\n {goroutine.topFunction && (\n <span className=\"truncate text-[11px] text-muted-foreground\">\n {goroutine.topFunction}\n </span>\n )}\n </div>\n </summary>\n <div className=\"pl-3 py-1 space-y-0.5\">\n {frames.map((frame, index) => (\n <FrameRow key={`${goroutine.id}-${index}`} frame={frame} />\n ))}\n </div>\n </details>\n );\n}\n\nfunction FrameRow({ frame }: { frame: ParsedGoroutineFrame }) {\n return (\n <div className={frame.runtime ? \"text-muted-foreground\" : \"text-foreground\"}>\n <div className=\"flex items-start gap-1.5\">\n <Icon\n icon={\n frame.kind === \"created_by\" ? UiRestart : frame.runtime ? UiDebugStepOver : UiMethod\n }\n className=\"shrink-0 mt-0.5 text-[11px]\"\n />\n <div className=\"min-w-0\">\n <div className=\"break-all font-mono text-[11px] font-semibold leading-4\">\n {frame.displayName}\n {frame.location && (\n <span className=\"ml-2 text-[10px] font-normal opacity-80\">{frame.location}</span>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;AAWO,SAAS,cAAc,EAAE,WAAW,QAAQ,mBAAuC;AACxF,QAAM,SAAS,kBACX,UAAU,OAAO,OAAO,CAAC,UAAU,CAAC,MAAM,WAAW,MAAM,SAAS,YAAY,IAChF,UAAU;AACd,QAAM,cAAc,UAAU,UAAU,aAAa,CAAC,CAAC;AAEvD,SACE,qBAAC,WAAA,EAAQ,WAAU,2BAA0B,MAAM,aACjD,UAAA;AAAA,IAAA,oBAAC,aAAQ,WAAU,sCACjB,UAAA,qBAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,MAAA,qBAAC,QAAA,EAAK,WAAU,mDAAkD,UAAA;AAAA,QAAA;AAAA,QAAE,UAAU;AAAA,MAAA,GAAG;AAAA,MACjF;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW,uEAAuE;AAAA,YAChF,UAAU;AAAA,UAAA,CACX;AAAA,UAED,UAAA;AAAA,YAAA,oBAAC,UAAK,WAAW,wBAAwB,kBAAkB,UAAU,KAAK,CAAC,IAAI;AAAA,YAC9E,UAAU;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAEb,qBAAC,QAAA,EAAK,WAAU,qCAAqC,UAAA;AAAA,QAAA,OAAO;AAAA,QAAO;AAAA,MAAA,GAAC;AAAA,MACnE,UAAU,iBAAiB,KAC1B,qBAAC,QAAA,EAAK,WAAU,qCAAqC,UAAA;AAAA,QAAA,UAAU;AAAA,QAAe;AAAA,MAAA,GAAC;AAAA,MAEhF,UAAU,eACT,oBAAC,UAAK,WAAU,8CACb,oBAAU,YAAA,CACb;AAAA,IAAA,EAAA,CAEJ,EAAA,CACF;AAAA,wBACC,OAAA,EAAI,WAAU,yBACZ,UAAA,OAAO,IAAI,CAAC,OAAO,8BACjB,UAAA,EAA0C,MAAA,GAA5B,GAAG,UAAU,EAAE,IAAI,KAAK,EAAkB,CAC1D,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;AAEA,SAAS,SAAS,EAAE,SAA0C;AAC5D,SACE,oBAAC,OAAA,EAAI,WAAW,MAAM,UAAU,0BAA0B,mBACxD,UAAA,qBAAC,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MACE,MAAM,SAAS,eAAe,YAAY,MAAM,UAAU,kBAAkB;AAAA,QAE9E,WAAU;AAAA,MAAA;AAAA,IAAA;AAAA,wBAEX,OAAA,EAAI,WAAU,WACb,UAAA,qBAAC,OAAA,EAAI,WAAU,2DACZ,UAAA;AAAA,MAAA,MAAM;AAAA,MACN,MAAM,YACL,oBAAC,UAAK,WAAU,2CAA2C,gBAAM,SAAA,CAAS;AAAA,IAAA,EAAA,CAE9E,EAAA,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;"}
|
|
@@ -2,40 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
4
|
const JvmStackTrace = require("./JvmStackTrace.cjs");
|
|
5
|
-
|
|
6
|
-
switch (state) {
|
|
7
|
-
case "runnable":
|
|
8
|
-
return "bg-green-50 text-green-700 dark:bg-green-500/20 dark:text-green-300";
|
|
9
|
-
case "blocked":
|
|
10
|
-
return "bg-red-50 text-red-700 dark:bg-red-500/20 dark:text-red-300";
|
|
11
|
-
case "waiting":
|
|
12
|
-
case "timed_waiting":
|
|
13
|
-
return "bg-blue-50 text-blue-700 dark:bg-blue-500/20 dark:text-blue-300";
|
|
14
|
-
case "new":
|
|
15
|
-
return "bg-amber-50 text-amber-700 dark:bg-amber-500/20 dark:text-amber-300";
|
|
16
|
-
case "terminated":
|
|
17
|
-
return "bg-muted text-muted-foreground";
|
|
18
|
-
default:
|
|
19
|
-
return "bg-muted text-muted-foreground";
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
function threadStateDot(state) {
|
|
23
|
-
switch (state) {
|
|
24
|
-
case "runnable":
|
|
25
|
-
return "bg-green-500";
|
|
26
|
-
case "blocked":
|
|
27
|
-
return "bg-red-500";
|
|
28
|
-
case "waiting":
|
|
29
|
-
case "timed_waiting":
|
|
30
|
-
return "bg-blue-500";
|
|
31
|
-
case "new":
|
|
32
|
-
return "bg-amber-500";
|
|
33
|
-
case "terminated":
|
|
34
|
-
return "bg-muted-foreground/40";
|
|
35
|
-
default:
|
|
36
|
-
return "bg-muted-foreground/40";
|
|
37
|
-
}
|
|
38
|
-
}
|
|
5
|
+
const stateStyles = require("./state-styles.cjs");
|
|
39
6
|
function ThreadCard({ thread, search, hideRuntimeOnly, resolveSource }) {
|
|
40
7
|
const frames = hideRuntimeOnly ? thread.frames.filter((f) => f.kind !== "frame" || !f.runtime) : thread.frames;
|
|
41
8
|
const defaultOpen = thread.state === "runnable" || thread.state === "blocked" || !!search;
|
|
@@ -49,11 +16,11 @@ function ThreadCard({ thread, search, hideRuntimeOnly, resolveSource }) {
|
|
|
49
16
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
50
17
|
"span",
|
|
51
18
|
{
|
|
52
|
-
className: `inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] ${threadStateBadge(
|
|
19
|
+
className: `inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] ${stateStyles.threadStateBadge(
|
|
53
20
|
thread.state
|
|
54
21
|
)}`,
|
|
55
22
|
children: [
|
|
56
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: `h-2 w-2 rounded-full ${threadStateDot(thread.state)}` }),
|
|
23
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: `h-2 w-2 rounded-full ${stateStyles.threadStateDot(thread.state)}` }),
|
|
57
24
|
thread.rawState || thread.state
|
|
58
25
|
]
|
|
59
26
|
}
|
|
@@ -80,6 +47,4 @@ function ThreadCard({ thread, search, hideRuntimeOnly, resolveSource }) {
|
|
|
80
47
|
] });
|
|
81
48
|
}
|
|
82
49
|
exports.ThreadCard = ThreadCard;
|
|
83
|
-
exports.threadStateBadge = threadStateBadge;
|
|
84
|
-
exports.threadStateDot = threadStateDot;
|
|
85
50
|
//# sourceMappingURL=ThreadCard.cjs.map
|