harper 5.0.11 → 5.0.14
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/bin/copyDb.ts +5 -3
- package/config/configUtils.js +8 -2
- package/dist/bin/copyDb.js +6 -4
- package/dist/bin/copyDb.js.map +1 -1
- package/dist/config/configUtils.js +8 -2
- package/dist/config/configUtils.js.map +1 -1
- package/package.json +2 -2
- package/studio/web/assets/index-BjwD_EXc.js +74 -0
- package/studio/web/assets/index-BjwD_EXc.js.map +1 -0
- package/studio/web/assets/index-CUg8eaR8.css +1 -0
- package/studio/web/assets/{index.lazy-DRQKYKT0.js → index.lazy-BF7NsM3K.js} +4 -4
- package/studio/web/assets/{index.lazy-DRQKYKT0.js.map → index.lazy-BF7NsM3K.js.map} +1 -1
- package/studio/web/assets/{profile-wyN1K1z0.js → profile-WCta5cFe.js} +2 -2
- package/studio/web/assets/{profile-wyN1K1z0.js.map → profile-WCta5cFe.js.map} +1 -1
- package/studio/web/assets/status-7-bH4Dg3.js +2 -0
- package/studio/web/assets/{status-ChrCqVc7.js.map → status-7-bH4Dg3.js.map} +1 -1
- package/studio/web/assets/{vendor-react-D6IIT0sT.js → vendor-react-DyY32duL.js} +52 -52
- package/studio/web/assets/vendor-react-DyY32duL.js.map +1 -0
- package/studio/web/assets/{vendor-tanstack-zom2m6Nj.js → vendor-tanstack-D0jMvSWD.js} +2 -2
- package/studio/web/assets/{vendor-tanstack-zom2m6Nj.js.map → vendor-tanstack-D0jMvSWD.js.map} +1 -1
- package/studio/web/assets/{vendor-viz-BdK5B9uw.js → vendor-viz-Cs-GQIim.js} +2 -2
- package/studio/web/assets/{vendor-viz-BdK5B9uw.js.map → vendor-viz-Cs-GQIim.js.map} +1 -1
- package/studio/web/index.html +4 -4
- package/studio/web/assets/index-C_a0cXHU.css +0 -1
- package/studio/web/assets/index-Dk_TRrUg.js +0 -74
- package/studio/web/assets/index-Dk_TRrUg.js.map +0 -1
- package/studio/web/assets/status-ChrCqVc7.js +0 -2
- package/studio/web/assets/vendor-react-D6IIT0sT.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status-ChrCqVc7.js","names":[],"sources":["../../src/features/instance/status/crawlData.ts","../../src/features/instance/status/Status.tsx","../../src/features/instance/status/CloudStatus.tsx","../../src/lib/colorPalette.ts","../../src/features/instance/status/components/monitoring/MetricVisualization.tsx","../../src/hooks/useIsomorphicLayoutEffect.ts","../../src/hooks/useInterval.ts","../../src/features/instance/status/components/Monitoring.tsx","../../src/integrations/api/instance/status/getSystemInformation.ts","../../src/features/instance/status/LocalStatus.tsx","../../src/features/instance/status/index.tsx"],"sourcesContent":["import { excludeFalsy } from '@/lib/arrays/excludeFalsy';\nimport { humanFileSize } from '@/lib/humanFileSize';\nimport { translateSecondsToAgo } from '@/lib/translateSecondsToAgo';\n\nconst startOf2025 = new Date(2025, 0).getTime();\nconst oneDayInMs = 24 * 60 * 60 * 1000;\n\ninterface TitleItem {\n\ttitle: string;\n\tdepth: number;\n}\n\ninterface NameValuePairItem {\n\tname: string;\n\tvalue: string;\n\tdepth: number;\n}\n\ntype ItemForDisplay = TitleItem | NameValuePairItem;\n\nexport function crawlData(data: Record<string, unknown>): ItemForDisplay[] {\n\tconst sections: ItemForDisplay[] = [];\n\tfor (const key in data) {\n\t\tconst value = data[key];\n\t\tsections.push(...parseValue(key, value, 0));\n\t}\n\treturn sections;\n}\n\nexport function hasTitle(item: ItemForDisplay): item is TitleItem {\n\treturn !!(item as TitleItem).title;\n}\n\nfunction parseValue(name: string, value: unknown, depth: number, parentName?: string): ItemForDisplay[] {\n\tif (value && Array.isArray(value)) {\n\t\tconst array = value;\n\t\treturn [\n\t\t\tarray.length > 1 && { title: name, depth },\n\t\t\t...value.map((item, index) =>\n\t\t\t\tparseValue(\n\t\t\t\t\tarray.length > 1 ? String(index + 1) : name,\n\t\t\t\t\titem,\n\t\t\t\t\tdepth + 1,\n\t\t\t\t\tname,\n\t\t\t\t)\n\t\t\t).flat(1),\n\t\t].filter(excludeFalsy);\n\t}\n\tif (isObject(value)) {\n\t\tconst obj = value;\n\t\treturn [\n\t\t\t{ title: name, depth },\n\t\t\t...Object.keys(value).map(subKey =>\n\t\t\t\tparseValue(\n\t\t\t\t\tString(subKey),\n\t\t\t\t\tobj[subKey],\n\t\t\t\t\tdepth + 1,\n\t\t\t\t\tname,\n\t\t\t\t)\n\t\t\t).flat(1),\n\t\t];\n\t}\n\tif (name === '__updatedtime__' || name === '__createdtime__') {\n\t\tname = name.replace(/_/g, '').replace('time', '');\n\t}\n\tif (typeof value === 'number') {\n\t\tif (value > startOf2025 && value < Date.now() + oneDayInMs) {\n\t\t\tconst elapsed = Date.now() - value;\n\t\t\tvalue = translateSecondsToAgo(elapsed, value);\n\t\t} else if (parentName === 'memory') {\n\t\t\tvalue = humanFileSize(value);\n\t\t} else if (!name.startsWith('raw') && name.toLowerCase().includes('load')) {\n\t\t\tvalue = Math.round(value * 10) / 10 + '%';\n\t\t}\n\t} else if (typeof value === 'boolean') {\n\t\tvalue = value ? 'Yes' : 'No';\n\t}\n\treturn [\n\t\t{ name, value: String(value), depth },\n\t];\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n\treturn !!value && typeof value === 'object';\n}\n","import { crawlData, hasTitle } from '@/features/instance/status/crawlData';\nimport { cn } from '@/lib/cn';\nimport { useMemo } from 'react';\n\nexport function Status({ data }: { data: Record<string, unknown> }) {\n\tconst items = useMemo(() => crawlData(data), [data]);\n\treturn (\n\t\t<div className=\"max-w-96 grid mb-12\">\n\t\t\t{items.map((item, index) =>\n\t\t\t\thasTitle(item)\n\t\t\t\t\t? (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\tclassName={cn('font-semibold text-xl', index !== 0 && 'mt-4')}\n\t\t\t\t\t\t\tstyle={{ paddingLeft: item.depth * 12 + 'px' }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{item.title}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)\n\t\t\t\t\t: (\n\t\t\t\t\t\t<div key={index} style={{ paddingLeft: item.depth * 12 + 'px' }}>\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">{item.name}:</span>\n\t\t\t\t\t\t\t{item.value}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { TextLoadingSkeleton } from '@/components/TextLoadingSkeleton';\nimport type { InstanceClientIdConfig, InstanceTypeConfig } from '@/config/instanceClientConfig.ts';\nimport { Status } from '@/features/instance/status/Status';\nimport { getStatusQueryOptions } from '@/integrations/api/instance/status/getStatus';\nimport { useSuspenseQuery } from '@tanstack/react-query';\nimport { Suspense } from 'react';\n\ninterface CloudStatusParams {\n\tinstanceParams: InstanceClientIdConfig & InstanceTypeConfig;\n}\n\nexport function CloudStatus({ instanceParams }: CloudStatusParams) {\n\tconst { data } = useSuspenseQuery(getStatusQueryOptions(instanceParams));\n\n\treturn (\n\t\t<Suspense fallback={<TextLoadingSkeleton />}>\n\t\t\t<Status data={data} />\n\t\t</Suspense>\n\t);\n}\n","export const harperPalette = {\n\t'persistence-purple': '#403B8A',\n\t'b-tree-green': '#55C58F',\n\t'cyber-grape': '#7A3A87',\n\t'quantum-purple': '#312556',\n\t'cloud-white': '#F5F5F5',\n\t'acid-magenta': '#C63368',\n\t'edge-gray': '#383D40',\n};\n","import type { InstanceClientIdConfig, InstanceTypeConfig } from '@/config/instanceClientConfig.ts';\nimport {\n\tgetAnalyticsQueryOptions,\n\ttype Metric,\n\ttype MetricConfig,\n\ttype MetricDataKey,\n\ttype MetricUnits,\n} from '@/integrations/api/instance/status/getAnalytics.ts';\nimport { harperPalette } from '@/lib/colorPalette.ts';\nimport { determineUnits, scaleValueToUnits } from '@/lib/units';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMemo, useState } from 'react';\nimport { Legend, Line, LineChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts';\n\ntype MetricValue = string | number | boolean;\ntype NullableMetricValue = MetricValue | null;\ntype NullableMetric = { [key: string]: NullableMetricValue };\ntype NodeMetric = { [node: string]: number };\ntype CoalescedMetrics = { [id: string]: NodeMetric };\ntype FormattedMetric = { [node: string]: string };\n\ninterface MetricVisualizationParams {\n\tmetricConfig: MetricConfig;\n\tstartTime: number;\n\tendTime: number;\n\tinstanceParams: InstanceClientIdConfig & InstanceTypeConfig;\n}\n\nfunction resolveMetricDataKey(\n\tmetric: Metric,\n\tdataKey: MetricDataKey,\n\tbaseUnits: MetricUnits,\n\tconversionUnits?: string,\n) {\n\tlet baseValue;\n\tif (typeof dataKey === 'string') {\n\t\tbaseValue = metric[dataKey] as number ?? 0;\n\t} else {\n\t\tbaseValue = dataKey(metric);\n\t}\n\n\tif (conversionUnits) {\n\t\treturn scaleValueToUnits(baseValue, baseUnits, conversionUnits);\n\t}\n\n\treturn baseValue;\n}\n\nexport function MetricVisualization({ metricConfig, startTime, endTime, instanceParams }: MetricVisualizationParams) {\n\tconst { data } = useQuery(getAnalyticsQueryOptions({ instanceParams, metricConfig, startTime, endTime }));\n\tconst metrics = useMemo(() => {\n\t\treturn data?.reduce((ms: Metric[], m: NullableMetric) => {\n\t\t\tconst newMetric: Metric = { metric: '', node: '', id: 0, period: 0, count: 0, mean: 0 };\n\t\t\tfor (const k in m) {\n\t\t\t\tif (m[k] !== null) {\n\t\t\t\t\tnewMetric[k] = m[k];\n\t\t\t\t}\n\t\t\t}\n\t\t\tms.push(newMetric);\n\t\t\treturn ms;\n\t\t}, []);\n\t}, [data]);\n\n\tconst [yAxisUnits, setYAxisUnits] = useState<string>(metricConfig.units);\n\n\tconst nodeMetrics = useMemo(() => {\n\t\tconst coalescedMetrics: CoalescedMetrics = {};\n\t\tconst { dataKey, aggregator, units } = metricConfig;\n\t\tlet conversionUnits = units as string;\n\n\t\tif (metrics && metrics.length > 0) {\n\t\t\tconst maxDataValue = Math.max(...metrics.map((m) => resolveMetricDataKey(m, dataKey, units)));\n\t\t\tconversionUnits = determineUnits(units, maxDataValue);\n\t\t\t// We set the y-axis based on the max of the metrics, and we were careful to avoid a circular dependency.\n\t\t\t// So ignoring the set-state-in-render is safe, in this case.\n\t\t\t// eslint-disable-next-line react-hooks/set-state-in-render\n\t\t\tsetYAxisUnits(conversionUnits);\n\n\t\t\tfor (const metric of metrics) {\n\t\t\t\tconst coalescedTime = Math.floor(metric.id / metric.period) * metric.period;\n\t\t\t\tconst resolvedMetric = resolveMetricDataKey(metric, dataKey, units, conversionUnits);\n\n\t\t\t\tif (coalescedMetrics[coalescedTime]) {\n\t\t\t\t\tif (metric.node in coalescedMetrics[coalescedTime]) {\n\t\t\t\t\t\tcoalescedMetrics[coalescedTime][metric.node] = aggregator(\n\t\t\t\t\t\t\tcoalescedMetrics[coalescedTime][metric.node],\n\t\t\t\t\t\t\tresolvedMetric,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcoalescedMetrics[coalescedTime][metric.node] = resolvedMetric;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tcoalescedMetrics[coalescedTime] = { [metric.node]: resolvedMetric };\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn Object.keys(coalescedMetrics).map((id: string) => {\n\t\t\t\tconst numericalId = Number.parseInt(id);\n\t\t\t\tconst coalescedMetric = coalescedMetrics[id];\n\t\t\t\tconst formattedMetrics = Object.keys(coalescedMetrics[id]).reduce((metric, node) => {\n\t\t\t\t\tmetric[node] = coalescedMetric[node].toFixed(2);\n\t\t\t\t\treturn metric;\n\t\t\t\t}, {} as FormattedMetric);\n\t\t\t\treturn { id: numericalId, ...formattedMetrics };\n\t\t\t});\n\t\t}\n\t}, [metrics, metricConfig]);\n\n\tconst nodes = useMemo(() => {\n\t\treturn Array.from(new Set<string>(metrics?.map((m) => m.node)));\n\t}, [metrics]);\n\n\tconst formatTime = (ts: number) => {\n\t\tconst date = new Date(ts);\n\t\treturn date.toLocaleDateString(undefined, {\n\t\t\tmonth: '2-digit',\n\t\t\tday: '2-digit',\n\t\t\thour: '2-digit',\n\t\t\tminute: '2-digit',\n\t\t\thour12: false,\n\t\t});\n\t};\n\n\tif (nodeMetrics && nodeMetrics.length > 0) {\n\t\treturn (\n\t\t\t<ResponsiveContainer width=\"100%\" height={600} className=\"mt-8\">\n\t\t\t\t<LineChart width={600} height={300} data={nodeMetrics}>\n\t\t\t\t\t{nodes.map((node, i) => {\n\t\t\t\t\t\tlet metricDifferentiator = metricConfig.name;\n\t\t\t\t\t\tif (metricConfig.path) {\n\t\t\t\t\t\t\tmetricDifferentiator += '.' + metricConfig.path;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst key = metricDifferentiator + '.' + node;\n\t\t\t\t\t\treturn <Line key={key} name={node} dataKey={node} stroke={Object.values(harperPalette)[i]} />;\n\t\t\t\t\t})}\n\t\t\t\t\t<XAxis dataKey={(item) => formatTime(item.id)} />\n\t\t\t\t\t<YAxis unit={` ${yAxisUnits}`} width={100} />\n\t\t\t\t\t<Legend />\n\t\t\t\t\t<Tooltip />\n\t\t\t\t</LineChart>\n\t\t\t</ResponsiveContainer>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"mt-8 h-[600px]\">\n\t\t\t<p>No {metricConfig.name} data for this time period</p>\n\t\t</div>\n\t);\n}\n","import { useEffect, useLayoutEffect } from 'react';\n\nexport const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n","import { useIsomorphicLayoutEffect } from '@/hooks/useIsomorphicLayoutEffect';\nimport { useEffect, useRef } from 'react';\n\nexport function useInterval(callback: () => void, delay: number | null) {\n\tconst savedCallback = useRef(callback);\n\n\tuseIsomorphicLayoutEffect(() => {\n\t\tsavedCallback.current = callback;\n\t}, [callback]);\n\n\tuseEffect(() => {\n\t\tif (delay === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst id = setInterval(() => {\n\t\t\tsavedCallback.current();\n\t\t}, delay);\n\n\t\treturn () => {\n\t\t\tclearInterval(id);\n\t\t};\n\t}, [delay]);\n}\n","import { Label } from '@/components/ui/label.tsx';\nimport { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select.tsx';\nimport type { InstanceClientIdConfig, InstanceTypeConfig } from '@/config/instanceClientConfig.ts';\nimport { MetricVisualization } from '@/features/instance/status/components/monitoring/MetricVisualization.tsx';\nimport { useInterval } from '@/hooks/useInterval.ts';\nimport type { Metric, MetricConfig } from '@/integrations/api/instance/status/getAnalytics.ts';\nimport { useMemo, useState } from 'react';\n\nconst metrics: MetricConfig[] = [\n\t{\n\t\tid: 'db-read',\n\t\tname: 'db-read',\n\t\tdataKey: 'count',\n\t\taggregator: aggregateSum,\n\t\tunits: 'reads',\n\t},\n\t{\n\t\tid: 'db-read-bytes',\n\t\tlabel: 'db-read-bytes',\n\t\tname: 'db-read',\n\t\tdataKey: metricSum,\n\t\taggregator: aggregateSum,\n\t\tunits: 'bytes',\n\t},\n\t{\n\t\tid: 'db-write',\n\t\tname: 'db-write',\n\t\tdataKey: 'count',\n\t\taggregator: aggregateSum,\n\t\tunits: 'writes',\n\t},\n\t{\n\t\tid: 'db-write-bytes',\n\t\tlabel: 'db-write-bytes',\n\t\tname: 'db-write',\n\t\tdataKey: metricSum,\n\t\taggregator: aggregateSum,\n\t\tunits: 'bytes',\n\t},\n\t{\n\t\tid: 'db-message',\n\t\tname: 'db-message',\n\t\tdataKey: 'count',\n\t\taggregator: aggregateSum,\n\t\tunits: 'messages',\n\t},\n\t{\n\t\tid: 'db-message-bytes',\n\t\tlabel: 'db-message-bytes',\n\t\tname: 'db-message',\n\t\tdataKey: metricSum,\n\t\taggregator: aggregateSum,\n\t\tunits: 'bytes',\n\t},\n\t{\n\t\tid: 'cpu-usage-user',\n\t\tname: 'cpu-usage',\n\t\tpath: 'user',\n\t\tdataKey: metricSum,\n\t\taggregator: aggregateSum,\n\t\tunits: 'secs',\n\t},\n\t{\n\t\tid: 'cpu-usage-harper',\n\t\tname: 'cpu-usage',\n\t\tpath: 'harper',\n\t\tdataKey: metricSum,\n\t\taggregator: aggregateSum,\n\t\tunits: 'secs',\n\t},\n];\n\nfunction metricSum(metric: Metric) {\n\tif (metric.mean && metric.count) {\n\t\treturn metric.mean * metric.count;\n\t}\n\treturn 0;\n}\n\nfunction aggregateSum(accumulator: number, current: number) {\n\treturn accumulator + current;\n}\n\ninterface TimeSelectOption {\n\tlabel: string;\n\tvalue: number;\n\tdefault?: boolean;\n}\ntype TimeSelectOptions = TimeSelectOption[];\n\nconst windowOptions: TimeSelectOptions = [\n\t{ label: '10 mins', value: 10 * 60_000 },\n\t{ label: 'hour', value: 60 * 60_000, default: true },\n\t{ label: '6 hours', value: 6 * 60 * 60_000 },\n\t{ label: 'day', value: 24 * 60 * 60_000 },\n];\n\nconst intervalOptions: TimeSelectOptions = [\n\t{ label: '15 secs', value: 15_000 },\n\t{ label: '30 secs', value: 30_000 },\n\t{ label: 'minute', value: 60_000, default: true },\n\t{ label: '5 mins', value: 5 * 60_000 },\n\t{ label: '15 mins', value: 15 * 60_000 },\n];\n\ninterface MonitoringParams {\n\tinstanceParams: InstanceClientIdConfig & InstanceTypeConfig;\n}\n\nexport function Monitoring({ instanceParams }: MonitoringParams) {\n\tconst [selectedMetric, setSelectedMetric] = useState(metrics[0]);\n\n\tconst [updateInterval, setUpdateInterval] = useState(intervalOptions.find((o) => o.default)!);\n\tconst [endTime, setEndTime] = useState(Date.now);\n\n\tconst [timeWindow, setTimeWindow] = useState(windowOptions.find((o) => o.default)!);\n\n\tuseInterval(() => {\n\t\tsetEndTime(Date.now);\n\t}, updateInterval.value);\n\n\tconst startTime = useMemo(() => endTime - timeWindow.value, [endTime, timeWindow]);\n\n\treturn (\n\t\t<div>\n\t\t\t<div className=\"flex justify-between\">\n\t\t\t\t<div className=\"justify-items-end grid grid-cols-1 lg:grid-cols-3 gap-4\">\n\t\t\t\t\t<div className=\"flex flex-nowrap items-center\">\n\t\t\t\t\t\t<Label className=\"ml-8 mr-2\">Metric:</Label>\n\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\tdefaultValue={selectedMetric.id}\n\t\t\t\t\t\t\tonValueChange={(value) => {\n\t\t\t\t\t\t\t\tsetSelectedMetric(metrics.find((m) => m.id === value) || metrics[0]);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<SelectTrigger className=\"inline-flex align-middle w-auto h-auto\">\n\t\t\t\t\t\t\t\t<SelectValue />\n\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t<SelectGroup>\n\t\t\t\t\t\t\t\t\t{metrics.map((m) => {\n\t\t\t\t\t\t\t\t\t\tlet itemLabel = m.label ?? m.name;\n\t\t\t\t\t\t\t\t\t\tif (m.path) {\n\t\t\t\t\t\t\t\t\t\t\titemLabel += ` (${m.path})`;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn <SelectItem key={m.id} value={m.id}>{itemLabel}</SelectItem>;\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</SelectGroup>\n\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t</Select>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex flex-nowrap items-center\">\n\t\t\t\t\t\t<Label className=\"ml-8 mr-2\">Show last</Label>\n\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\tdefaultValue={timeWindow.value.toString()}\n\t\t\t\t\t\t\tonValueChange={(value) => {\n\t\t\t\t\t\t\t\tsetTimeWindow(windowOptions.find((o) => o.value === Number(value))!);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<SelectTrigger className=\"inline-flex align-middle w-auto h-auto\">\n\t\t\t\t\t\t\t\t<SelectValue />\n\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t<SelectGroup>\n\t\t\t\t\t\t\t\t\t{windowOptions.map((o) => {\n\t\t\t\t\t\t\t\t\t\treturn <SelectItem key={o.value} value={o.value.toString()}>{o.label}</SelectItem>;\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</SelectGroup>\n\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t</Select>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex flex-nowrap items-center\">\n\t\t\t\t\t\t<Label className=\"ml-8 mr-2\">Update every</Label>\n\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\tdefaultValue={updateInterval.value.toString()}\n\t\t\t\t\t\t\tonValueChange={(value) => {\n\t\t\t\t\t\t\t\tsetUpdateInterval(intervalOptions.find((o) => o.value === Number(value))!);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<SelectTrigger className=\"inline-flex align-middle w-auto h-auto\">\n\t\t\t\t\t\t\t\t<SelectValue />\n\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t<SelectGroup>\n\t\t\t\t\t\t\t\t\t{intervalOptions.map((o) => {\n\t\t\t\t\t\t\t\t\t\treturn <SelectItem key={o.value} value={o.value.toString()}>{o.label}</SelectItem>;\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</SelectGroup>\n\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t</Select>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<MetricVisualization\n\t\t\t\tmetricConfig={selectedMetric}\n\t\t\t\tstartTime={startTime}\n\t\t\t\tendTime={endTime}\n\t\t\t\tinstanceParams={instanceParams}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","import { InstanceClientIdConfig } from '@/config/instanceClientConfig';\nimport { queryOptions } from '@tanstack/react-query';\n\ninterface SystemInformationResponse {\n\tsystem: {\n\t\tplatform: 'darwin' | 'linux' | string;\n\t\tdistro: 'macOS' | 'Debian GNU/Linux' | string;\n\t\trelease: string;\n\t\tcodename: string;\n\t\tkernel: string;\n\t\tarch: 'arm64' | 'x64' | string;\n\t\thostname: string;\n\t\tfqdn: string;\n\t\tnode_version: string;\n\t\tnpm_version: string;\n\t};\n\tcpu: {\n\t\tmanufacturer: 'Apple' | 'AMD' | string;\n\t\tbrand: 'M4' | string;\n\t\tvendor: 'Apple' | 'AMD' | string;\n\t\tspeed: number;\n\t\tspeedMin: number;\n\t\tspeedMax: number;\n\t\tcores: number;\n\t\tphysicalCores: number;\n\t\tperformanceCores: number;\n\t\tefficiencyCores: number;\n\t\tprocessors: number;\n\t\tflags: string;\n\t\tvirtualization: boolean;\n\t\tcpu_speed: {\n\t\t\tmin: number;\n\t\t\tmax: number;\n\t\t\tavg: number;\n\t\t\tcores: number[];\n\t\t};\n\t\tcurrent_load: {\n\t\t\tavgLoad: number;\n\t\t\tcurrentLoad: number;\n\t\t\tcurrentLoadUser: number;\n\t\t\tcurrentLoadSystem: number;\n\t\t\tcurrentLoadNice: number;\n\t\t\tcurrentLoadIdle: number;\n\t\t\tcurrentLoadIrq: number;\n\t\t\tcurrentLoadSteal: number;\n\t\t\tcurrentLoadGuest: number;\n\t\t\trawCurrentLoad: number;\n\t\t\trawCurrentLoadUser: number;\n\t\t\trawCurrentLoadSystem: number;\n\t\t\trawCurrentLoadNice: number;\n\t\t\trawCurrentLoadIdle: number;\n\t\t\trawCurrentLoadIrq: number;\n\t\t\trawCurrentLoadSteal: number;\n\t\t\trawCurrentLoadGuest: number;\n\t\t\tcpus: Array<{\n\t\t\t\tload: number;\n\t\t\t\tloadUser: number;\n\t\t\t\tloadSystem: number;\n\t\t\t\tloadNice: number;\n\t\t\t\tloadIdle: number;\n\t\t\t\tloadIrq: number;\n\t\t\t\tloadSteal: number;\n\t\t\t\tloadGuest: number;\n\t\t\t\trawLoadSteal: number;\n\t\t\t\trawLoadGuest: number;\n\t\t\t}>;\n\t\t};\n\t};\n\tmemory: {\n\t\ttotal: number;\n\t\tfree: number;\n\t\tused: number;\n\t\tactive: number;\n\t\tavailable: number;\n\t\treclaimable: number;\n\t\tswaptotal: number;\n\t\tswapused: number;\n\t\tswapfree: number;\n\t\twriteback: unknown;\n\t\tdirty: unknown;\n\t\trss: number;\n\t\theapTotal: number;\n\t\theapUsed: number;\n\t\texternal: number;\n\t\tarrayBuffers: number;\n\t};\n\tdisk: Record<string, unknown>;\n\tnetwork: {\n\t\tdefault_interface: unknown;\n\t\tlatency: Record<string, unknown>;\n\t\tinterfaces: Array<Record<string, unknown>>;\n\t\tstats: Array<Record<string, unknown>>;\n\t\tconnections: Array<Record<string, unknown>>;\n\t};\n\n\t[key: string]: unknown;\n}\n\nexport function getSystemInformationQueryOptions({ entityId, instanceClient }: InstanceClientIdConfig) {\n\treturn queryOptions({\n\t\tqueryKey: [entityId, 'system_information'] as const,\n\t\tqueryFn: async () => {\n\t\t\tconst { data } = await instanceClient.post<SystemInformationResponse>('/', {\n\t\t\t\toperation: 'system_information',\n\t\t\t\tattributes: ['network', 'disk', 'cpu', 'memory', 'system'],\n\t\t\t});\n\t\t\treturn data;\n\t\t},\n\t});\n}\n","import { TextLoadingSkeleton } from '@/components/TextLoadingSkeleton';\nimport type { InstanceClientIdConfig, InstanceTypeConfig } from '@/config/instanceClientConfig';\nimport { Status } from '@/features/instance/status/Status';\nimport { getSystemInformationQueryOptions } from '@/integrations/api/instance/status/getSystemInformation';\nimport { useSuspenseQuery } from '@tanstack/react-query';\nimport { Suspense } from 'react';\n\ninterface LocalStatusParams {\n\tinstanceParams: InstanceClientIdConfig & InstanceTypeConfig;\n}\n\nexport function LocalStatus({ instanceParams }: LocalStatusParams) {\n\tconst { data } = useSuspenseQuery(getSystemInformationQueryOptions(instanceParams));\n\n\treturn (\n\t\t<Suspense fallback={<TextLoadingSkeleton />}>\n\t\t\t<Status data={data} />\n\t\t</Suspense>\n\t);\n}\n","import { isLocalStudio } from '@/config/constants';\nimport { useInstanceClientIdParams } from '@/config/useInstanceClient.tsx';\nimport { CloudStatus } from '@/features/instance/status/CloudStatus';\nimport { Monitoring } from '@/features/instance/status/components/Monitoring.tsx';\nimport { LocalStatus } from '@/features/instance/status/LocalStatus';\n\nexport function StatusIndex() {\n\tconst instanceParams = useInstanceClientIdParams();\n\n\treturn (\n\t\t<div className=\"px-4 py-2 flex flex-col\">\n\t\t\t<div className=\"mb-12\">\n\t\t\t\t<Monitoring instanceParams={instanceParams} />\n\t\t\t</div>\n\t\t\t{isLocalStudio\n\t\t\t\t? <LocalStatus instanceParams={instanceParams} />\n\t\t\t\t: <CloudStatus instanceParams={instanceParams} />}\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"status-7-bH4Dg3.js","names":[],"sources":["../../src/features/instance/status/crawlData.ts","../../src/features/instance/status/Status.tsx","../../src/features/instance/status/CloudStatus.tsx","../../src/lib/colorPalette.ts","../../src/features/instance/status/components/monitoring/MetricVisualization.tsx","../../src/hooks/useIsomorphicLayoutEffect.ts","../../src/hooks/useInterval.ts","../../src/features/instance/status/components/Monitoring.tsx","../../src/integrations/api/instance/status/getSystemInformation.ts","../../src/features/instance/status/LocalStatus.tsx","../../src/features/instance/status/index.tsx"],"sourcesContent":["import { excludeFalsy } from '@/lib/arrays/excludeFalsy';\nimport { humanFileSize } from '@/lib/humanFileSize';\nimport { translateSecondsToAgo } from '@/lib/translateSecondsToAgo';\n\nconst startOf2025 = new Date(2025, 0).getTime();\nconst oneDayInMs = 24 * 60 * 60 * 1000;\n\ninterface TitleItem {\n\ttitle: string;\n\tdepth: number;\n}\n\ninterface NameValuePairItem {\n\tname: string;\n\tvalue: string;\n\tdepth: number;\n}\n\ntype ItemForDisplay = TitleItem | NameValuePairItem;\n\nexport function crawlData(data: Record<string, unknown>): ItemForDisplay[] {\n\tconst sections: ItemForDisplay[] = [];\n\tfor (const key in data) {\n\t\tconst value = data[key];\n\t\tsections.push(...parseValue(key, value, 0));\n\t}\n\treturn sections;\n}\n\nexport function hasTitle(item: ItemForDisplay): item is TitleItem {\n\treturn !!(item as TitleItem).title;\n}\n\nfunction parseValue(name: string, value: unknown, depth: number, parentName?: string): ItemForDisplay[] {\n\tif (value && Array.isArray(value)) {\n\t\tconst array = value;\n\t\treturn [\n\t\t\tarray.length > 1 && { title: name, depth },\n\t\t\t...value.map((item, index) =>\n\t\t\t\tparseValue(\n\t\t\t\t\tarray.length > 1 ? String(index + 1) : name,\n\t\t\t\t\titem,\n\t\t\t\t\tdepth + 1,\n\t\t\t\t\tname,\n\t\t\t\t)\n\t\t\t).flat(1),\n\t\t].filter(excludeFalsy);\n\t}\n\tif (isObject(value)) {\n\t\tconst obj = value;\n\t\treturn [\n\t\t\t{ title: name, depth },\n\t\t\t...Object.keys(value).map(subKey =>\n\t\t\t\tparseValue(\n\t\t\t\t\tString(subKey),\n\t\t\t\t\tobj[subKey],\n\t\t\t\t\tdepth + 1,\n\t\t\t\t\tname,\n\t\t\t\t)\n\t\t\t).flat(1),\n\t\t];\n\t}\n\tif (name === '__updatedtime__' || name === '__createdtime__') {\n\t\tname = name.replace(/_/g, '').replace('time', '');\n\t}\n\tif (typeof value === 'number') {\n\t\tif (value > startOf2025 && value < Date.now() + oneDayInMs) {\n\t\t\tconst elapsed = Date.now() - value;\n\t\t\tvalue = translateSecondsToAgo(elapsed, value);\n\t\t} else if (parentName === 'memory') {\n\t\t\tvalue = humanFileSize(value);\n\t\t} else if (!name.startsWith('raw') && name.toLowerCase().includes('load')) {\n\t\t\tvalue = Math.round(value * 10) / 10 + '%';\n\t\t}\n\t} else if (typeof value === 'boolean') {\n\t\tvalue = value ? 'Yes' : 'No';\n\t}\n\treturn [\n\t\t{ name, value: String(value), depth },\n\t];\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n\treturn !!value && typeof value === 'object';\n}\n","import { crawlData, hasTitle } from '@/features/instance/status/crawlData';\nimport { cn } from '@/lib/cn';\nimport { useMemo } from 'react';\n\nexport function Status({ data }: { data: Record<string, unknown> }) {\n\tconst items = useMemo(() => crawlData(data), [data]);\n\treturn (\n\t\t<div className=\"max-w-96 grid mb-12\">\n\t\t\t{items.map((item, index) =>\n\t\t\t\thasTitle(item)\n\t\t\t\t\t? (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\tclassName={cn('font-semibold text-xl', index !== 0 && 'mt-4')}\n\t\t\t\t\t\t\tstyle={{ paddingLeft: item.depth * 12 + 'px' }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{item.title}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)\n\t\t\t\t\t: (\n\t\t\t\t\t\t<div key={index} style={{ paddingLeft: item.depth * 12 + 'px' }}>\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">{item.name}:</span>\n\t\t\t\t\t\t\t{item.value}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { TextLoadingSkeleton } from '@/components/TextLoadingSkeleton';\nimport type { InstanceClientIdConfig, InstanceTypeConfig } from '@/config/instanceClientConfig.ts';\nimport { Status } from '@/features/instance/status/Status';\nimport { getStatusQueryOptions } from '@/integrations/api/instance/status/getStatus';\nimport { useSuspenseQuery } from '@tanstack/react-query';\nimport { Suspense } from 'react';\n\ninterface CloudStatusParams {\n\tinstanceParams: InstanceClientIdConfig & InstanceTypeConfig;\n}\n\nexport function CloudStatus({ instanceParams }: CloudStatusParams) {\n\tconst { data } = useSuspenseQuery(getStatusQueryOptions(instanceParams));\n\n\treturn (\n\t\t<Suspense fallback={<TextLoadingSkeleton />}>\n\t\t\t<Status data={data} />\n\t\t</Suspense>\n\t);\n}\n","export const harperPalette = {\n\t'persistence-purple': '#403B8A',\n\t'b-tree-green': '#55C58F',\n\t'cyber-grape': '#7A3A87',\n\t'quantum-purple': '#312556',\n\t'cloud-white': '#F5F5F5',\n\t'acid-magenta': '#C63368',\n\t'edge-gray': '#383D40',\n};\n","import type { InstanceClientIdConfig, InstanceTypeConfig } from '@/config/instanceClientConfig.ts';\nimport {\n\tgetAnalyticsQueryOptions,\n\ttype Metric,\n\ttype MetricConfig,\n\ttype MetricDataKey,\n\ttype MetricUnits,\n} from '@/integrations/api/instance/status/getAnalytics.ts';\nimport { harperPalette } from '@/lib/colorPalette.ts';\nimport { determineUnits, scaleValueToUnits } from '@/lib/units';\nimport { useQuery } from '@tanstack/react-query';\nimport { useMemo, useState } from 'react';\nimport { Legend, Line, LineChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts';\n\ntype MetricValue = string | number | boolean;\ntype NullableMetricValue = MetricValue | null;\ntype NullableMetric = { [key: string]: NullableMetricValue };\ntype NodeMetric = { [node: string]: number };\ntype CoalescedMetrics = { [id: string]: NodeMetric };\ntype FormattedMetric = { [node: string]: string };\n\ninterface MetricVisualizationParams {\n\tmetricConfig: MetricConfig;\n\tstartTime: number;\n\tendTime: number;\n\tinstanceParams: InstanceClientIdConfig & InstanceTypeConfig;\n}\n\nfunction resolveMetricDataKey(\n\tmetric: Metric,\n\tdataKey: MetricDataKey,\n\tbaseUnits: MetricUnits,\n\tconversionUnits?: string,\n) {\n\tlet baseValue;\n\tif (typeof dataKey === 'string') {\n\t\tbaseValue = metric[dataKey] as number ?? 0;\n\t} else {\n\t\tbaseValue = dataKey(metric);\n\t}\n\n\tif (conversionUnits) {\n\t\treturn scaleValueToUnits(baseValue, baseUnits, conversionUnits);\n\t}\n\n\treturn baseValue;\n}\n\nexport function MetricVisualization({ metricConfig, startTime, endTime, instanceParams }: MetricVisualizationParams) {\n\tconst { data } = useQuery(getAnalyticsQueryOptions({ instanceParams, metricConfig, startTime, endTime }));\n\tconst metrics = useMemo(() => {\n\t\treturn data?.reduce((ms: Metric[], m: NullableMetric) => {\n\t\t\tconst newMetric: Metric = { metric: '', node: '', id: 0, period: 0, count: 0, mean: 0 };\n\t\t\tfor (const k in m) {\n\t\t\t\tif (m[k] !== null) {\n\t\t\t\t\tnewMetric[k] = m[k];\n\t\t\t\t}\n\t\t\t}\n\t\t\tms.push(newMetric);\n\t\t\treturn ms;\n\t\t}, []);\n\t}, [data]);\n\n\tconst [yAxisUnits, setYAxisUnits] = useState<string>(metricConfig.units);\n\n\tconst nodeMetrics = useMemo(() => {\n\t\tconst coalescedMetrics: CoalescedMetrics = {};\n\t\tconst { dataKey, aggregator, units } = metricConfig;\n\t\tlet conversionUnits = units as string;\n\n\t\tif (metrics && metrics.length > 0) {\n\t\t\tconst maxDataValue = Math.max(...metrics.map((m) => resolveMetricDataKey(m, dataKey, units)));\n\t\t\tconversionUnits = determineUnits(units, maxDataValue);\n\t\t\t// We set the y-axis based on the max of the metrics, and we were careful to avoid a circular dependency.\n\t\t\t// So ignoring the set-state-in-render is safe, in this case.\n\t\t\t// eslint-disable-next-line react-hooks/set-state-in-render\n\t\t\tsetYAxisUnits(conversionUnits);\n\n\t\t\tfor (const metric of metrics) {\n\t\t\t\tconst coalescedTime = Math.floor(metric.id / metric.period) * metric.period;\n\t\t\t\tconst resolvedMetric = resolveMetricDataKey(metric, dataKey, units, conversionUnits);\n\n\t\t\t\tif (coalescedMetrics[coalescedTime]) {\n\t\t\t\t\tif (metric.node in coalescedMetrics[coalescedTime]) {\n\t\t\t\t\t\tcoalescedMetrics[coalescedTime][metric.node] = aggregator(\n\t\t\t\t\t\t\tcoalescedMetrics[coalescedTime][metric.node],\n\t\t\t\t\t\t\tresolvedMetric,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcoalescedMetrics[coalescedTime][metric.node] = resolvedMetric;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tcoalescedMetrics[coalescedTime] = { [metric.node]: resolvedMetric };\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn Object.keys(coalescedMetrics).map((id: string) => {\n\t\t\t\tconst numericalId = Number.parseInt(id);\n\t\t\t\tconst coalescedMetric = coalescedMetrics[id];\n\t\t\t\tconst formattedMetrics = Object.keys(coalescedMetrics[id]).reduce((metric, node) => {\n\t\t\t\t\tmetric[node] = coalescedMetric[node].toFixed(2);\n\t\t\t\t\treturn metric;\n\t\t\t\t}, {} as FormattedMetric);\n\t\t\t\treturn { id: numericalId, ...formattedMetrics };\n\t\t\t});\n\t\t}\n\t}, [metrics, metricConfig]);\n\n\tconst nodes = useMemo(() => {\n\t\treturn Array.from(new Set<string>(metrics?.map((m) => m.node)));\n\t}, [metrics]);\n\n\tconst formatTime = (ts: number) => {\n\t\tconst date = new Date(ts);\n\t\treturn date.toLocaleDateString(undefined, {\n\t\t\tmonth: '2-digit',\n\t\t\tday: '2-digit',\n\t\t\thour: '2-digit',\n\t\t\tminute: '2-digit',\n\t\t\thour12: false,\n\t\t});\n\t};\n\n\tif (nodeMetrics && nodeMetrics.length > 0) {\n\t\treturn (\n\t\t\t<ResponsiveContainer width=\"100%\" height={600} className=\"mt-8\">\n\t\t\t\t<LineChart width={600} height={300} data={nodeMetrics}>\n\t\t\t\t\t{nodes.map((node, i) => {\n\t\t\t\t\t\tlet metricDifferentiator = metricConfig.name;\n\t\t\t\t\t\tif (metricConfig.path) {\n\t\t\t\t\t\t\tmetricDifferentiator += '.' + metricConfig.path;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst key = metricDifferentiator + '.' + node;\n\t\t\t\t\t\treturn <Line key={key} name={node} dataKey={node} stroke={Object.values(harperPalette)[i]} />;\n\t\t\t\t\t})}\n\t\t\t\t\t<XAxis dataKey={(item) => formatTime(item.id)} />\n\t\t\t\t\t<YAxis unit={` ${yAxisUnits}`} width={100} />\n\t\t\t\t\t<Legend />\n\t\t\t\t\t<Tooltip />\n\t\t\t\t</LineChart>\n\t\t\t</ResponsiveContainer>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"mt-8 h-[600px]\">\n\t\t\t<p>No {metricConfig.name} data for this time period</p>\n\t\t</div>\n\t);\n}\n","import { useEffect, useLayoutEffect } from 'react';\n\nexport const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n","import { useIsomorphicLayoutEffect } from '@/hooks/useIsomorphicLayoutEffect';\nimport { useEffect, useRef } from 'react';\n\nexport function useInterval(callback: () => void, delay: number | null) {\n\tconst savedCallback = useRef(callback);\n\n\tuseIsomorphicLayoutEffect(() => {\n\t\tsavedCallback.current = callback;\n\t}, [callback]);\n\n\tuseEffect(() => {\n\t\tif (delay === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst id = setInterval(() => {\n\t\t\tsavedCallback.current();\n\t\t}, delay);\n\n\t\treturn () => {\n\t\t\tclearInterval(id);\n\t\t};\n\t}, [delay]);\n}\n","import { Label } from '@/components/ui/label.tsx';\nimport { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select.tsx';\nimport type { InstanceClientIdConfig, InstanceTypeConfig } from '@/config/instanceClientConfig.ts';\nimport { MetricVisualization } from '@/features/instance/status/components/monitoring/MetricVisualization.tsx';\nimport { useInterval } from '@/hooks/useInterval.ts';\nimport type { Metric, MetricConfig } from '@/integrations/api/instance/status/getAnalytics.ts';\nimport { useMemo, useState } from 'react';\n\nconst metrics: MetricConfig[] = [\n\t{\n\t\tid: 'db-read',\n\t\tname: 'db-read',\n\t\tdataKey: 'count',\n\t\taggregator: aggregateSum,\n\t\tunits: 'reads',\n\t},\n\t{\n\t\tid: 'db-read-bytes',\n\t\tlabel: 'db-read-bytes',\n\t\tname: 'db-read',\n\t\tdataKey: metricSum,\n\t\taggregator: aggregateSum,\n\t\tunits: 'bytes',\n\t},\n\t{\n\t\tid: 'db-write',\n\t\tname: 'db-write',\n\t\tdataKey: 'count',\n\t\taggregator: aggregateSum,\n\t\tunits: 'writes',\n\t},\n\t{\n\t\tid: 'db-write-bytes',\n\t\tlabel: 'db-write-bytes',\n\t\tname: 'db-write',\n\t\tdataKey: metricSum,\n\t\taggregator: aggregateSum,\n\t\tunits: 'bytes',\n\t},\n\t{\n\t\tid: 'db-message',\n\t\tname: 'db-message',\n\t\tdataKey: 'count',\n\t\taggregator: aggregateSum,\n\t\tunits: 'messages',\n\t},\n\t{\n\t\tid: 'db-message-bytes',\n\t\tlabel: 'db-message-bytes',\n\t\tname: 'db-message',\n\t\tdataKey: metricSum,\n\t\taggregator: aggregateSum,\n\t\tunits: 'bytes',\n\t},\n\t{\n\t\tid: 'cpu-usage-user',\n\t\tname: 'cpu-usage',\n\t\tpath: 'user',\n\t\tdataKey: metricSum,\n\t\taggregator: aggregateSum,\n\t\tunits: 'secs',\n\t},\n\t{\n\t\tid: 'cpu-usage-harper',\n\t\tname: 'cpu-usage',\n\t\tpath: 'harper',\n\t\tdataKey: metricSum,\n\t\taggregator: aggregateSum,\n\t\tunits: 'secs',\n\t},\n];\n\nfunction metricSum(metric: Metric) {\n\tif (metric.mean && metric.count) {\n\t\treturn metric.mean * metric.count;\n\t}\n\treturn 0;\n}\n\nfunction aggregateSum(accumulator: number, current: number) {\n\treturn accumulator + current;\n}\n\ninterface TimeSelectOption {\n\tlabel: string;\n\tvalue: number;\n\tdefault?: boolean;\n}\ntype TimeSelectOptions = TimeSelectOption[];\n\nconst windowOptions: TimeSelectOptions = [\n\t{ label: '10 mins', value: 10 * 60_000 },\n\t{ label: 'hour', value: 60 * 60_000, default: true },\n\t{ label: '6 hours', value: 6 * 60 * 60_000 },\n\t{ label: 'day', value: 24 * 60 * 60_000 },\n];\n\nconst intervalOptions: TimeSelectOptions = [\n\t{ label: '15 secs', value: 15_000 },\n\t{ label: '30 secs', value: 30_000 },\n\t{ label: 'minute', value: 60_000, default: true },\n\t{ label: '5 mins', value: 5 * 60_000 },\n\t{ label: '15 mins', value: 15 * 60_000 },\n];\n\ninterface MonitoringParams {\n\tinstanceParams: InstanceClientIdConfig & InstanceTypeConfig;\n}\n\nexport function Monitoring({ instanceParams }: MonitoringParams) {\n\tconst [selectedMetric, setSelectedMetric] = useState(metrics[0]);\n\n\tconst [updateInterval, setUpdateInterval] = useState(intervalOptions.find((o) => o.default)!);\n\tconst [endTime, setEndTime] = useState(Date.now);\n\n\tconst [timeWindow, setTimeWindow] = useState(windowOptions.find((o) => o.default)!);\n\n\tuseInterval(() => {\n\t\tsetEndTime(Date.now);\n\t}, updateInterval.value);\n\n\tconst startTime = useMemo(() => endTime - timeWindow.value, [endTime, timeWindow]);\n\n\treturn (\n\t\t<div>\n\t\t\t<div className=\"flex justify-between\">\n\t\t\t\t<div className=\"justify-items-end grid grid-cols-1 lg:grid-cols-3 gap-4\">\n\t\t\t\t\t<div className=\"flex flex-nowrap items-center\">\n\t\t\t\t\t\t<Label className=\"ml-8 mr-2\">Metric:</Label>\n\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\tdefaultValue={selectedMetric.id}\n\t\t\t\t\t\t\tonValueChange={(value) => {\n\t\t\t\t\t\t\t\tsetSelectedMetric(metrics.find((m) => m.id === value) || metrics[0]);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<SelectTrigger className=\"inline-flex align-middle w-auto h-auto\">\n\t\t\t\t\t\t\t\t<SelectValue />\n\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t<SelectGroup>\n\t\t\t\t\t\t\t\t\t{metrics.map((m) => {\n\t\t\t\t\t\t\t\t\t\tlet itemLabel = m.label ?? m.name;\n\t\t\t\t\t\t\t\t\t\tif (m.path) {\n\t\t\t\t\t\t\t\t\t\t\titemLabel += ` (${m.path})`;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn <SelectItem key={m.id} value={m.id}>{itemLabel}</SelectItem>;\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</SelectGroup>\n\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t</Select>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex flex-nowrap items-center\">\n\t\t\t\t\t\t<Label className=\"ml-8 mr-2\">Show last</Label>\n\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\tdefaultValue={timeWindow.value.toString()}\n\t\t\t\t\t\t\tonValueChange={(value) => {\n\t\t\t\t\t\t\t\tsetTimeWindow(windowOptions.find((o) => o.value === Number(value))!);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<SelectTrigger className=\"inline-flex align-middle w-auto h-auto\">\n\t\t\t\t\t\t\t\t<SelectValue />\n\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t<SelectGroup>\n\t\t\t\t\t\t\t\t\t{windowOptions.map((o) => {\n\t\t\t\t\t\t\t\t\t\treturn <SelectItem key={o.value} value={o.value.toString()}>{o.label}</SelectItem>;\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</SelectGroup>\n\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t</Select>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex flex-nowrap items-center\">\n\t\t\t\t\t\t<Label className=\"ml-8 mr-2\">Update every</Label>\n\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\tdefaultValue={updateInterval.value.toString()}\n\t\t\t\t\t\t\tonValueChange={(value) => {\n\t\t\t\t\t\t\t\tsetUpdateInterval(intervalOptions.find((o) => o.value === Number(value))!);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<SelectTrigger className=\"inline-flex align-middle w-auto h-auto\">\n\t\t\t\t\t\t\t\t<SelectValue />\n\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t<SelectGroup>\n\t\t\t\t\t\t\t\t\t{intervalOptions.map((o) => {\n\t\t\t\t\t\t\t\t\t\treturn <SelectItem key={o.value} value={o.value.toString()}>{o.label}</SelectItem>;\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</SelectGroup>\n\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t</Select>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<MetricVisualization\n\t\t\t\tmetricConfig={selectedMetric}\n\t\t\t\tstartTime={startTime}\n\t\t\t\tendTime={endTime}\n\t\t\t\tinstanceParams={instanceParams}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","import { InstanceClientIdConfig } from '@/config/instanceClientConfig';\nimport { queryOptions } from '@tanstack/react-query';\n\ninterface SystemInformationResponse {\n\tsystem: {\n\t\tplatform: 'darwin' | 'linux' | string;\n\t\tdistro: 'macOS' | 'Debian GNU/Linux' | string;\n\t\trelease: string;\n\t\tcodename: string;\n\t\tkernel: string;\n\t\tarch: 'arm64' | 'x64' | string;\n\t\thostname: string;\n\t\tfqdn: string;\n\t\tnode_version: string;\n\t\tnpm_version: string;\n\t};\n\tcpu: {\n\t\tmanufacturer: 'Apple' | 'AMD' | string;\n\t\tbrand: 'M4' | string;\n\t\tvendor: 'Apple' | 'AMD' | string;\n\t\tspeed: number;\n\t\tspeedMin: number;\n\t\tspeedMax: number;\n\t\tcores: number;\n\t\tphysicalCores: number;\n\t\tperformanceCores: number;\n\t\tefficiencyCores: number;\n\t\tprocessors: number;\n\t\tflags: string;\n\t\tvirtualization: boolean;\n\t\tcpu_speed: {\n\t\t\tmin: number;\n\t\t\tmax: number;\n\t\t\tavg: number;\n\t\t\tcores: number[];\n\t\t};\n\t\tcurrent_load: {\n\t\t\tavgLoad: number;\n\t\t\tcurrentLoad: number;\n\t\t\tcurrentLoadUser: number;\n\t\t\tcurrentLoadSystem: number;\n\t\t\tcurrentLoadNice: number;\n\t\t\tcurrentLoadIdle: number;\n\t\t\tcurrentLoadIrq: number;\n\t\t\tcurrentLoadSteal: number;\n\t\t\tcurrentLoadGuest: number;\n\t\t\trawCurrentLoad: number;\n\t\t\trawCurrentLoadUser: number;\n\t\t\trawCurrentLoadSystem: number;\n\t\t\trawCurrentLoadNice: number;\n\t\t\trawCurrentLoadIdle: number;\n\t\t\trawCurrentLoadIrq: number;\n\t\t\trawCurrentLoadSteal: number;\n\t\t\trawCurrentLoadGuest: number;\n\t\t\tcpus: Array<{\n\t\t\t\tload: number;\n\t\t\t\tloadUser: number;\n\t\t\t\tloadSystem: number;\n\t\t\t\tloadNice: number;\n\t\t\t\tloadIdle: number;\n\t\t\t\tloadIrq: number;\n\t\t\t\tloadSteal: number;\n\t\t\t\tloadGuest: number;\n\t\t\t\trawLoadSteal: number;\n\t\t\t\trawLoadGuest: number;\n\t\t\t}>;\n\t\t};\n\t};\n\tmemory: {\n\t\ttotal: number;\n\t\tfree: number;\n\t\tused: number;\n\t\tactive: number;\n\t\tavailable: number;\n\t\treclaimable: number;\n\t\tswaptotal: number;\n\t\tswapused: number;\n\t\tswapfree: number;\n\t\twriteback: unknown;\n\t\tdirty: unknown;\n\t\trss: number;\n\t\theapTotal: number;\n\t\theapUsed: number;\n\t\texternal: number;\n\t\tarrayBuffers: number;\n\t};\n\tdisk: Record<string, unknown>;\n\tnetwork: {\n\t\tdefault_interface: unknown;\n\t\tlatency: Record<string, unknown>;\n\t\tinterfaces: Array<Record<string, unknown>>;\n\t\tstats: Array<Record<string, unknown>>;\n\t\tconnections: Array<Record<string, unknown>>;\n\t};\n\n\t[key: string]: unknown;\n}\n\nexport function getSystemInformationQueryOptions({ entityId, instanceClient }: InstanceClientIdConfig) {\n\treturn queryOptions({\n\t\tqueryKey: [entityId, 'system_information'] as const,\n\t\tqueryFn: async () => {\n\t\t\tconst { data } = await instanceClient.post<SystemInformationResponse>('/', {\n\t\t\t\toperation: 'system_information',\n\t\t\t\tattributes: ['network', 'disk', 'cpu', 'memory', 'system'],\n\t\t\t});\n\t\t\treturn data;\n\t\t},\n\t});\n}\n","import { TextLoadingSkeleton } from '@/components/TextLoadingSkeleton';\nimport type { InstanceClientIdConfig, InstanceTypeConfig } from '@/config/instanceClientConfig';\nimport { Status } from '@/features/instance/status/Status';\nimport { getSystemInformationQueryOptions } from '@/integrations/api/instance/status/getSystemInformation';\nimport { useSuspenseQuery } from '@tanstack/react-query';\nimport { Suspense } from 'react';\n\ninterface LocalStatusParams {\n\tinstanceParams: InstanceClientIdConfig & InstanceTypeConfig;\n}\n\nexport function LocalStatus({ instanceParams }: LocalStatusParams) {\n\tconst { data } = useSuspenseQuery(getSystemInformationQueryOptions(instanceParams));\n\n\treturn (\n\t\t<Suspense fallback={<TextLoadingSkeleton />}>\n\t\t\t<Status data={data} />\n\t\t</Suspense>\n\t);\n}\n","import { isLocalStudio } from '@/config/constants';\nimport { useInstanceClientIdParams } from '@/config/useInstanceClient.tsx';\nimport { CloudStatus } from '@/features/instance/status/CloudStatus';\nimport { Monitoring } from '@/features/instance/status/components/Monitoring.tsx';\nimport { LocalStatus } from '@/features/instance/status/LocalStatus';\n\nexport function StatusIndex() {\n\tconst instanceParams = useInstanceClientIdParams();\n\n\treturn (\n\t\t<div className=\"px-4 py-2 flex flex-col\">\n\t\t\t<div className=\"mb-12\">\n\t\t\t\t<Monitoring instanceParams={instanceParams} />\n\t\t\t</div>\n\t\t\t{isLocalStudio\n\t\t\t\t? <LocalStatus instanceParams={instanceParams} />\n\t\t\t\t: <CloudStatus instanceParams={instanceParams} />}\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
|