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.
Files changed (28) hide show
  1. package/bin/copyDb.ts +5 -3
  2. package/config/configUtils.js +8 -2
  3. package/dist/bin/copyDb.js +6 -4
  4. package/dist/bin/copyDb.js.map +1 -1
  5. package/dist/config/configUtils.js +8 -2
  6. package/dist/config/configUtils.js.map +1 -1
  7. package/package.json +2 -2
  8. package/studio/web/assets/index-BjwD_EXc.js +74 -0
  9. package/studio/web/assets/index-BjwD_EXc.js.map +1 -0
  10. package/studio/web/assets/index-CUg8eaR8.css +1 -0
  11. package/studio/web/assets/{index.lazy-DRQKYKT0.js → index.lazy-BF7NsM3K.js} +4 -4
  12. package/studio/web/assets/{index.lazy-DRQKYKT0.js.map → index.lazy-BF7NsM3K.js.map} +1 -1
  13. package/studio/web/assets/{profile-wyN1K1z0.js → profile-WCta5cFe.js} +2 -2
  14. package/studio/web/assets/{profile-wyN1K1z0.js.map → profile-WCta5cFe.js.map} +1 -1
  15. package/studio/web/assets/status-7-bH4Dg3.js +2 -0
  16. package/studio/web/assets/{status-ChrCqVc7.js.map → status-7-bH4Dg3.js.map} +1 -1
  17. package/studio/web/assets/{vendor-react-D6IIT0sT.js → vendor-react-DyY32duL.js} +52 -52
  18. package/studio/web/assets/vendor-react-DyY32duL.js.map +1 -0
  19. package/studio/web/assets/{vendor-tanstack-zom2m6Nj.js → vendor-tanstack-D0jMvSWD.js} +2 -2
  20. package/studio/web/assets/{vendor-tanstack-zom2m6Nj.js.map → vendor-tanstack-D0jMvSWD.js.map} +1 -1
  21. package/studio/web/assets/{vendor-viz-BdK5B9uw.js → vendor-viz-Cs-GQIim.js} +2 -2
  22. package/studio/web/assets/{vendor-viz-BdK5B9uw.js.map → vendor-viz-Cs-GQIim.js.map} +1 -1
  23. package/studio/web/index.html +4 -4
  24. package/studio/web/assets/index-C_a0cXHU.css +0 -1
  25. package/studio/web/assets/index-Dk_TRrUg.js +0 -74
  26. package/studio/web/assets/index-Dk_TRrUg.js.map +0 -1
  27. package/studio/web/assets/status-ChrCqVc7.js +0 -2
  28. 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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"}