@anvia/studio 1.0.13 → 1.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/dist/ui/assets/graphs-page-D2jzO23K.js +2 -0
- package/dist/ui/assets/graphs-page-D2jzO23K.js.map +1 -0
- package/dist/ui/assets/{index-DWBW14h1.js → index-C0DKDUvj.js} +3 -3
- package/dist/ui/assets/{index-DWBW14h1.js.map → index-C0DKDUvj.js.map} +1 -1
- package/dist/ui/assets/{knowledge-page-1WgvGV4f.js → knowledge-page-BSI_VDOp.js} +2 -2
- package/dist/ui/assets/{knowledge-page-1WgvGV4f.js.map → knowledge-page-BSI_VDOp.js.map} +1 -1
- package/dist/ui/assets/{mcps-page-BV96jSfG.js → mcps-page-BL1FLksQ.js} +2 -2
- package/dist/ui/assets/{mcps-page-BV96jSfG.js.map → mcps-page-BL1FLksQ.js.map} +1 -1
- package/dist/ui/assets/{memory-page-DxClkjRl.js → memory-page-C20w55ut.js} +2 -2
- package/dist/ui/assets/{memory-page-DxClkjRl.js.map → memory-page-C20w55ut.js.map} +1 -1
- package/dist/ui/assets/{pipelines-page-ClO_uXn1.js → pipelines-page-BPCS5mwc.js} +2 -2
- package/dist/ui/assets/{pipelines-page-ClO_uXn1.js.map → pipelines-page-BPCS5mwc.js.map} +1 -1
- package/dist/ui/assets/{renderers-Cf55u6J4.js → renderers-CfrpUrJr.js} +2 -2
- package/dist/ui/assets/{renderers-Cf55u6J4.js.map → renderers-CfrpUrJr.js.map} +1 -1
- package/dist/ui/assets/{status-page-Ys5dQyMG.js → status-page-B-57_iOR.js} +2 -2
- package/dist/ui/assets/{status-page-Ys5dQyMG.js.map → status-page-B-57_iOR.js.map} +1 -1
- package/dist/ui/assets/{tool-runner-Cwfc3yY8.js → tool-runner-DcuNII62.js} +2 -2
- package/dist/ui/assets/{tool-runner-Cwfc3yY8.js.map → tool-runner-DcuNII62.js.map} +1 -1
- package/dist/ui/assets/{tools-page-BSgFqVi2.js → tools-page-D4wQGPOl.js} +2 -2
- package/dist/ui/assets/{tools-page-BSgFqVi2.js.map → tools-page-D4wQGPOl.js.map} +1 -1
- package/dist/ui/assets/{transcript-item-ChVGempt.js → transcript-item-B6OLwa1p.js} +2 -2
- package/dist/ui/assets/{transcript-item-ChVGempt.js.map → transcript-item-B6OLwa1p.js.map} +1 -1
- package/dist/ui/index.html +1 -1
- package/package.json +5 -5
- package/dist/ui/assets/graphs-page-ne3dJIrx.js +0 -2
- package/dist/ui/assets/graphs-page-ne3dJIrx.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"graphs-page-ne3dJIrx.js","names":["t"],"sources":["../../../../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/defs/Plus.es.js","../../../../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.8_react@19.2.8__react@19.2.8/node_modules/@phosphor-icons/react/dist/csr/Plus.es.js","../../../src/ui/app/modules/graphs/graph-flow.tsx","../../../src/ui/app/modules/graphs/graphs-page.tsx"],"sourcesContent":["import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n [\n \"bold\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M228,128a12,12,0,0,1-12,12H140v76a12,12,0,0,1-24,0V140H40a12,12,0,0,1,0-24h76V40a12,12,0,0,1,24,0v76h76A12,12,0,0,1,228,128Z\" }))\n ],\n [\n \"duotone\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n \"path\",\n {\n d: \"M216,56V200a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40H200A16,16,0,0,1,216,56Z\",\n opacity: \"0.2\"\n }\n ), /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,128a8,8,0,0,1-8,8H136v80a8,8,0,0,1-16,0V136H40a8,8,0,0,1,0-16h80V40a8,8,0,0,1,16,0v80h80A8,8,0,0,1,224,128Z\" }))\n ],\n [\n \"fill\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM184,136H136v48a8,8,0,0,1-16,0V136H72a8,8,0,0,1,0-16h48V72a8,8,0,0,1,16,0v48h48a8,8,0,0,1,0,16Z\" }))\n ],\n [\n \"light\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M222,128a6,6,0,0,1-6,6H134v82a6,6,0,0,1-12,0V134H40a6,6,0,0,1,0-12h82V40a6,6,0,0,1,12,0v82h82A6,6,0,0,1,222,128Z\" }))\n ],\n [\n \"regular\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,128a8,8,0,0,1-8,8H136v80a8,8,0,0,1-16,0V136H40a8,8,0,0,1,0-16h80V40a8,8,0,0,1,16,0v80h80A8,8,0,0,1,224,128Z\" }))\n ],\n [\n \"thin\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M220,128a4,4,0,0,1-4,4H132v84a4,4,0,0,1-8,0V132H40a4,4,0,0,1,0-8h84V40a4,4,0,0,1,8,0v84h84A4,4,0,0,1,220,128Z\" }))\n ]\n]);\nexport {\n a as default\n};\n","import * as o from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport a from \"../defs/Plus.es.js\";\nconst e = o.forwardRef((r, s) => /* @__PURE__ */ o.createElement(t, { ref: s, ...r, weights: a }));\ne.displayName = \"PlusIcon\";\nconst n = e;\nexport {\n n as Plus,\n e as PlusIcon\n};\n","import { Handle, MarkerType, type Node, type NodeProps, Position } from \"@xyflow/react\";\nimport type { GraphExploreNode, GraphExploreRelationship, GraphExploreResult } from \"@anvia/graph\";\n\nexport type ExplorerNodeData = {\n label: string;\n type: string;\n color: string;\n};\n\nexport type ExplorerFlowNode = Node<ExplorerNodeData, \"graphEntity\">;\n\nexport const explorerNodeTypes = {\n graphEntity: GraphEntityNode,\n};\n\nexport function toExplorerFlow(result: GraphExploreResult, query: string) {\n const normalizedQuery = query.trim().toLocaleLowerCase();\n const visibleNodes = result.nodes.filter((node) => graphNodeMatches(node, normalizedQuery));\n const visibleIds = new Set(visibleNodes.map((node) => node.id));\n const nodes = positionNodes(visibleNodes);\n const edges = result.relationships\n .filter((relationship) => visibleIds.has(relationship.from) && visibleIds.has(relationship.to))\n .map((relationship) => relationshipEdge(relationship));\n return { nodes, edges };\n}\n\nexport function graphNodeLabel(node: GraphExploreNode): string {\n for (const key of [\"name\", \"title\", \"label\"] as const) {\n const value = node.properties[key];\n if (typeof value === \"string\" && value.trim().length > 0) return value;\n }\n if (node.key !== undefined) return node.key;\n return `${node.type} ${node.id}`;\n}\n\nfunction GraphEntityNode(props: NodeProps<ExplorerFlowNode>) {\n return (\n <article\n className={[\n \"relative w-[180px] rounded-xl border bg-card px-3 py-2.5 text-left shadow-sm transition\",\n props.selected ? \"border-foreground shadow-md\" : \"border-border/80\",\n ].join(\" \")}\n >\n <Handle\n type=\"target\"\n position={Position.Top}\n className=\"!size-1.5 !border-0 !bg-muted-foreground/50\"\n />\n <div className=\"flex min-w-0 items-center gap-2.5\">\n <span className={[\"size-2.5 shrink-0 rounded-full\", props.data.color].join(\" \")} />\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-semibold text-foreground\">{props.data.label}</div>\n <div className=\"mt-0.5 truncate text-[10px] font-semibold uppercase tracking-[0.14em] text-muted-foreground\">\n {props.data.type}\n </div>\n </div>\n </div>\n <Handle\n type=\"source\"\n position={Position.Bottom}\n className=\"!size-1.5 !border-0 !bg-muted-foreground/50\"\n />\n </article>\n );\n}\n\nfunction positionNodes(nodes: readonly GraphExploreNode[]): ExplorerFlowNode[] {\n return nodes.map((node, index) => {\n const angle = index * 2.399963;\n const radius = 180 * Math.sqrt(index);\n return {\n id: node.id,\n type: \"graphEntity\",\n position: {\n x: Math.cos(angle) * radius,\n y: Math.sin(angle) * radius,\n },\n data: {\n label: graphNodeLabel(node),\n type: node.type,\n color: nodeTypeColor(node.type),\n },\n };\n });\n}\n\nfunction relationshipEdge(relationship: GraphExploreRelationship) {\n return {\n id: relationship.id,\n source: relationship.from,\n target: relationship.to,\n label: relationship.type,\n type: \"smoothstep\",\n markerEnd: { type: MarkerType.ArrowClosed, width: 14, height: 14 },\n labelStyle: { fontSize: 10, fontWeight: 600 },\n style: { strokeWidth: 1.5 },\n };\n}\n\nfunction graphNodeMatches(node: GraphExploreNode, query: string): boolean {\n if (query.length === 0) return true;\n const searchable = [node.type, node.key, ...Object.values(node.identity), ...propertyText(node)];\n return searchable.some((value) =>\n String(value ?? \"\")\n .toLocaleLowerCase()\n .includes(query),\n );\n}\n\nfunction propertyText(node: GraphExploreNode): string[] {\n const text: string[] = [];\n for (const [key, value] of Object.entries(node.properties)) {\n text.push(key, Array.isArray(value) ? value.join(\" \") : String(value));\n }\n return text;\n}\n\nfunction nodeTypeColor(type: string): string {\n const colors = [\n \"bg-emerald-500\",\n \"bg-sky-500\",\n \"bg-violet-500\",\n \"bg-amber-500\",\n \"bg-rose-500\",\n \"bg-cyan-500\",\n \"bg-fuchsia-500\",\n ];\n let hash = 0;\n for (const character of type) hash = (hash * 31 + character.charCodeAt(0)) >>> 0;\n return colors[hash % colors.length] ?? \"bg-muted-foreground\";\n}\n","import { Background, BackgroundVariant, Controls, ReactFlow } from \"@xyflow/react\";\nimport \"@xyflow/react/dist/style.css\";\nimport { ArrowClockwise, MagnifyingGlass, Plus } from \"@phosphor-icons/react\";\nimport type { GraphExploreNode, GraphExploreResult } from \"@anvia/graph\";\nimport { type CSSProperties, useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { StudioConfig, StudioGraphExploreRequest } from \"../../../../types\";\nimport { Button } from \"../../components/ui/button\";\nimport { Input } from \"../../components/ui/input\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../components/ui/select\";\nimport {\n StudioEmptyState,\n StudioPageShell,\n StudioStatusBadge,\n StudioSurface,\n} from \"../../components/ui/studio\";\nimport { errorMessage } from \"../shared/format\";\nimport { JsonSyntax } from \"../shared/renderers\";\nimport { requestJson } from \"../shared/request\";\nimport { explorerNodeTypes, graphNodeLabel, toExplorerFlow } from \"./graph-flow\";\n\nconst emptyResult: GraphExploreResult = {\n nodes: [],\n relationships: [],\n truncated: { nodes: false, relationships: false },\n};\n\nexport function GraphsPage(props: {\n graphs: StudioConfig[\"graphs\"];\n enabled: boolean;\n theme: \"light\" | \"dark\";\n onError: (message: string) => void;\n onStatus: (message: string) => void;\n}) {\n const { onError, onStatus } = props;\n const [selectedGraphId, setSelectedGraphId] = useState(props.graphs[0]?.id ?? \"\");\n const [selectedNodeTypes, setSelectedNodeTypes] = useState<string[]>([]);\n const [selectedRelationships, setSelectedRelationships] = useState<string[]>([]);\n const [result, setResult] = useState<GraphExploreResult>(emptyResult);\n const [selectedNodeId, setSelectedNodeId] = useState<string>();\n const [query, setQuery] = useState(\"\");\n const [loading, setLoading] = useState(false);\n const graph = props.graphs.find((item) => item.id === selectedGraphId) ?? props.graphs[0];\n const selectedNode = result.nodes.find((node) => node.id === selectedNodeId);\n const flow = useMemo(() => toExplorerFlow(result, query), [result, query]);\n\n const explore = useCallback(\n async (request: StudioGraphExploreRequest, merge: boolean, signal?: AbortSignal) => {\n if (graph === undefined) return;\n setLoading(true);\n onStatus(\"Loading graph\");\n try {\n const next = await requestJson<GraphExploreResult>(\n `/graphs/${encodeURIComponent(graph.id)}/explore`,\n \"Graph explorer\",\n signal,\n \"no-store\",\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(request),\n },\n );\n setResult((current) => (merge ? mergeResults(current, next) : next));\n setSelectedNodeId((current) => {\n if (merge && current !== undefined) return current;\n return next.nodes[0]?.id;\n });\n onStatus(\"Connected\");\n } catch (loadError) {\n if (signal?.aborted === true) return;\n const message = errorMessage(loadError);\n onError(message);\n onStatus(\"Graph error\");\n } finally {\n if (signal?.aborted !== true) setLoading(false);\n }\n },\n [graph, onError, onStatus],\n );\n\n useEffect(() => {\n if (graph === undefined) return;\n const nodeTypes = graph.nodeTypes.map((item) => item.name);\n const relationships = graph.relationshipTypes.map((item) => item.name);\n setSelectedGraphId(graph.id);\n setSelectedNodeTypes(nodeTypes);\n setSelectedRelationships(relationships);\n setResult(emptyResult);\n setSelectedNodeId(undefined);\n const controller = new AbortController();\n void explore({ mode: \"overview\", nodeTypes, relationships }, false, controller.signal);\n return () => controller.abort();\n }, [explore, graph]);\n\n if (!props.enabled || props.graphs.length === 0) {\n return (\n <StudioPageShell aria-label=\"Graphs\">\n <StudioEmptyState\n title={props.enabled ? \"No graphs\" : \"Graph explorer unavailable\"}\n text={\n props.enabled\n ? \"Register a graph in Studio to inspect its nodes and relationships.\"\n : \"This Studio runtime does not expose a graph explorer.\"\n }\n />\n </StudioPageShell>\n );\n }\n\n function reloadOverview() {\n void explore(\n {\n mode: \"overview\",\n nodeTypes: selectedNodeTypes,\n relationships: selectedRelationships,\n },\n false,\n );\n }\n\n function expandSelected() {\n if (selectedNode === undefined) return;\n void explore(\n {\n mode: \"expand\",\n nodeIds: [selectedNode.id],\n nodeTypes: selectedNodeTypes,\n relationships: selectedRelationships,\n direction: \"both\",\n maxDepth: 1,\n },\n true,\n );\n }\n\n return (\n <StudioPageShell aria-label=\"Graphs\">\n <div className=\"grid min-h-0 min-w-0 pb-6 pr-6\">\n <StudioSurface className=\"grid grid-cols-[minmax(0,2fr)_340px] max-lg:grid-cols-1\">\n <div className=\"relative min-h-0 min-w-0 overflow-hidden border-r border-border/80 bg-card/25 max-lg:min-h-96 max-lg:border-b max-lg:border-r-0\">\n <div className=\"absolute left-4 top-4 z-10 flex max-w-[calc(100%-2rem)] items-center gap-2 rounded-xl border border-border/80 bg-background/90 p-2 shadow-sm backdrop-blur\">\n <div className=\"relative min-w-0 flex-1\">\n <MagnifyingGlass className=\"pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n aria-label=\"Search loaded nodes\"\n className=\"w-64 pl-8\"\n placeholder=\"Search loaded nodes\"\n value={query}\n onChange={(event) => setQuery(event.currentTarget.value)}\n />\n </div>\n <StudioStatusBadge>{flow.nodes.length} nodes</StudioStatusBadge>\n <StudioStatusBadge>{flow.edges.length} relations</StudioStatusBadge>\n </div>\n {loading && result.nodes.length === 0 ? (\n <div className=\"grid h-full min-h-96 place-items-center text-sm text-muted-foreground\">\n Loading graph…\n </div>\n ) : null}\n {!loading && result.nodes.length === 0 ? (\n <StudioEmptyState\n className=\"h-full border-0\"\n title=\"No nodes found\"\n text=\"Try another graph or broaden the selected node and relationship types.\"\n />\n ) : null}\n {result.nodes.length > 0 ? (\n <ReactFlow\n key={`${graph?.id}:${result.nodes.length}:${result.relationships.length}`}\n nodes={flow.nodes}\n edges={flow.edges}\n className=\"graph-explorer-flow\"\n colorMode={props.theme}\n nodeTypes={explorerNodeTypes}\n fitView\n fitViewOptions={{ padding: 0.2, maxZoom: 1 }}\n minZoom={0.2}\n maxZoom={1.7}\n proOptions={{ hideAttribution: true }}\n defaultEdgeOptions={{ focusable: true }}\n style={\n {\n \"--xy-edge-stroke\": \"var(--muted-foreground)\",\n \"--xy-edge-stroke-width\": \"1.4\",\n \"--xy-edge-stroke-selected\": \"var(--foreground)\",\n } as CSSProperties\n }\n onNodeClick={(_, node) => setSelectedNodeId(node.id)}\n >\n <Background\n variant={BackgroundVariant.Dots}\n gap={16}\n size={1.5}\n color=\"var(--muted-foreground)\"\n className=\"opacity-30\"\n />\n <Controls showInteractive={false} />\n </ReactFlow>\n ) : null}\n </div>\n <GraphInspector\n graph={graph}\n graphs={props.graphs}\n loading={loading}\n result={result}\n selectedGraphId={selectedGraphId}\n selectedNode={selectedNode}\n selectedNodeTypes={selectedNodeTypes}\n selectedRelationships={selectedRelationships}\n onExpand={expandSelected}\n onReload={reloadOverview}\n onSelectGraph={setSelectedGraphId}\n onToggleNodeType={(type) => setSelectedNodeTypes((types) => toggled(types, type))}\n onToggleRelationship={(type) =>\n setSelectedRelationships((types) => toggled(types, type))\n }\n />\n </StudioSurface>\n </div>\n </StudioPageShell>\n );\n}\n\nfunction GraphInspector(props: {\n graph: StudioConfig[\"graphs\"][number] | undefined;\n graphs: StudioConfig[\"graphs\"];\n loading: boolean;\n result: GraphExploreResult;\n selectedGraphId: string;\n selectedNode: GraphExploreNode | undefined;\n selectedNodeTypes: string[];\n selectedRelationships: string[];\n onExpand: () => void;\n onReload: () => void;\n onSelectGraph: (id: string) => void;\n onToggleNodeType: (type: string) => void;\n onToggleRelationship: (type: string) => void;\n}) {\n const truncated = props.result.truncated.nodes || props.result.truncated.relationships;\n return (\n <aside className=\"grid min-h-0 grid-rows-[auto_minmax(0,1fr)] overflow-hidden bg-background/70\">\n <header className=\"grid gap-3 border-b border-border/80 bg-card/35 p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <h1 className=\"truncate text-base font-semibold\">\n {props.graph?.name ?? \"Graph explorer\"}\n </h1>\n <p className=\"mt-1 line-clamp-2 text-xs leading-5 text-muted-foreground\">\n {props.graph?.description ?? \"Explore a bounded view of nodes and relationships.\"}\n </p>\n </div>\n {truncated ? (\n <StudioStatusBadge title=\"The configured result limit was reached\">\n Limited\n </StudioStatusBadge>\n ) : null}\n </div>\n <Select value={props.selectedGraphId} onValueChange={props.onSelectGraph}>\n <SelectTrigger className=\"h-8 w-full text-xs\">\n <SelectValue placeholder=\"Select graph\" />\n </SelectTrigger>\n <SelectContent>\n {props.graphs.map((graph) => (\n <SelectItem key={graph.id} value={graph.id}>\n {graph.name ?? graph.id}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <div className=\"flex gap-2\">\n <Button\n className=\"flex-1\"\n variant=\"secondary\"\n disabled={props.loading || props.selectedNodeTypes.length === 0}\n onClick={props.onReload}\n >\n <ArrowClockwise /> Refresh\n </Button>\n <Button\n className=\"flex-1\"\n disabled={props.loading || props.selectedNode === undefined}\n onClick={props.onExpand}\n >\n <Plus /> Expand\n </Button>\n </div>\n </header>\n <div className=\"min-h-0 overflow-y-auto p-4\">\n <FilterGroup\n label=\"Node types\"\n items={props.graph?.nodeTypes.map((item) => item.name) ?? []}\n selected={props.selectedNodeTypes}\n onToggle={props.onToggleNodeType}\n />\n <FilterGroup\n label=\"Relationships\"\n items={props.graph?.relationshipTypes.map((item) => item.name) ?? []}\n selected={props.selectedRelationships}\n onToggle={props.onToggleRelationship}\n />\n <div className=\"mt-5 border-t border-border/80 pt-4\">\n {props.selectedNode === undefined ? (\n <p className=\"text-sm text-muted-foreground\">\n Select a node to inspect its properties.\n </p>\n ) : (\n <NodeInspector node={props.selectedNode} />\n )}\n </div>\n </div>\n </aside>\n );\n}\n\nfunction FilterGroup(props: {\n label: string;\n items: string[];\n selected: string[];\n onToggle: (value: string) => void;\n}) {\n return (\n <section className=\"mb-4\">\n <h2 className=\"mb-2 text-[10px] font-semibold uppercase tracking-[0.16em] text-muted-foreground\">\n {props.label}\n </h2>\n <div className=\"flex flex-wrap gap-1.5\">\n {props.items.map((item) => {\n const active = props.selected.includes(item);\n return (\n <button\n key={item}\n type=\"button\"\n aria-pressed={active}\n className={[\n \"rounded-full border px-2 py-1 text-xs transition-colors\",\n active\n ? \"border-foreground/30 bg-foreground text-background\"\n : \"border-border bg-card text-muted-foreground hover:text-foreground\",\n ].join(\" \")}\n onClick={() => props.onToggle(item)}\n >\n {item}\n </button>\n );\n })}\n </div>\n </section>\n );\n}\n\nfunction NodeInspector(props: { node: GraphExploreNode }) {\n const json = JSON.stringify(\n { identity: props.node.identity, properties: props.node.properties },\n null,\n 2,\n );\n return (\n <section>\n <StudioStatusBadge>{props.node.type}</StudioStatusBadge>\n <h2 className=\"mt-2 break-words text-base font-semibold\">{graphNodeLabel(props.node)}</h2>\n <p className=\"mt-1 break-all text-xs text-muted-foreground\">ID {props.node.id}</p>\n <pre className=\"mt-4 overflow-x-auto rounded-xl border border-border/80 bg-card p-3 text-xs leading-5\">\n <code>\n <JsonSyntax text={json} />\n </code>\n </pre>\n </section>\n );\n}\n\nfunction toggled(values: string[], value: string): string[] {\n if (values.includes(value)) return values.filter((item) => item !== value);\n return [...values, value];\n}\n\nfunction mergeResults(current: GraphExploreResult, next: GraphExploreResult): GraphExploreResult {\n const nodes = new Map(current.nodes.map((node) => [node.id, node]));\n const relationships = new Map(\n current.relationships.map((relationship) => [relationship.id, relationship]),\n );\n for (const node of next.nodes) nodes.set(node.id, node);\n for (const relationship of next.relationships) relationships.set(relationship.id, relationship);\n return {\n nodes: [...nodes.values()],\n relationships: [...relationships.values()],\n truncated: {\n nodes: current.truncated.nodes || next.truncated.nodes,\n relationships: current.truncated.relationships || next.truncated.relationships,\n },\n };\n}\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
|