@zenfg/inspector 0.1.0-beta.2 → 0.1.0-beta.3

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 (62) hide show
  1. package/README.md +63 -1
  2. package/dist/FrameGraphInspector.d.ts +2 -5
  3. package/dist/FrameGraphInspector.d.ts.map +1 -1
  4. package/dist/FrameGraphInspector.js +16 -38
  5. package/dist/FrameGraphInspector.js.map +1 -1
  6. package/dist/debugCaptureModel.d.ts +9 -4
  7. package/dist/debugCaptureModel.d.ts.map +1 -1
  8. package/dist/debugCaptureModel.js +36 -14
  9. package/dist/debugCaptureModel.js.map +1 -1
  10. package/dist/panelCytoscapeGraphRenderer.d.ts +3 -1
  11. package/dist/panelCytoscapeGraphRenderer.d.ts.map +1 -1
  12. package/dist/panelCytoscapeGraphRenderer.js +39 -19
  13. package/dist/panelCytoscapeGraphRenderer.js.map +1 -1
  14. package/dist/panelDiagnosticsView.js +2 -2
  15. package/dist/panelDiagnosticsView.js.map +1 -1
  16. package/dist/panelGraphLayout.d.ts.map +1 -1
  17. package/dist/panelGraphLayout.js +15 -1
  18. package/dist/panelGraphLayout.js.map +1 -1
  19. package/dist/panelGraphScene.d.ts +14 -26
  20. package/dist/panelGraphScene.d.ts.map +1 -1
  21. package/dist/panelGraphScene.js +141 -195
  22. package/dist/panelGraphScene.js.map +1 -1
  23. package/dist/panelGraphView.d.ts.map +1 -1
  24. package/dist/panelGraphView.js +31 -9
  25. package/dist/panelGraphView.js.map +1 -1
  26. package/dist/panelGraphVisuals.d.ts +7 -3
  27. package/dist/panelGraphVisuals.d.ts.map +1 -1
  28. package/dist/panelGraphVisuals.js +45 -80
  29. package/dist/panelGraphVisuals.js.map +1 -1
  30. package/dist/panelInspectorView.d.ts +5 -0
  31. package/dist/panelInspectorView.d.ts.map +1 -1
  32. package/dist/panelInspectorView.js +99 -13
  33. package/dist/panelInspectorView.js.map +1 -1
  34. package/dist/panelSelection.js +2 -2
  35. package/dist/panelSelection.js.map +1 -1
  36. package/dist/panelTypes.d.ts +8 -3
  37. package/dist/panelTypes.d.ts.map +1 -1
  38. package/dist/panelTypes.js.map +1 -1
  39. package/dist/panelVisualTheme.d.ts +21 -13
  40. package/dist/panelVisualTheme.d.ts.map +1 -1
  41. package/dist/panelVisualTheme.js +15 -7
  42. package/dist/panelVisualTheme.js.map +1 -1
  43. package/dist/panelWorkbenchHelpers.js +1 -1
  44. package/dist/panelWorkbenchHelpers.js.map +1 -1
  45. package/dist/styles.d.ts.map +1 -1
  46. package/dist/styles.js +16 -12
  47. package/dist/styles.js.map +1 -1
  48. package/package.json +2 -2
  49. package/src/FrameGraphInspector.ts +17 -39
  50. package/src/debugCaptureModel.ts +44 -19
  51. package/src/panelCytoscapeGraphRenderer.ts +38 -18
  52. package/src/panelDiagnosticsView.ts +3 -3
  53. package/src/panelGraphLayout.ts +15 -1
  54. package/src/panelGraphScene.ts +153 -279
  55. package/src/panelGraphView.ts +31 -9
  56. package/src/panelGraphVisuals.ts +46 -82
  57. package/src/panelInspectorView.ts +104 -16
  58. package/src/panelSelection.ts +2 -2
  59. package/src/panelTypes.ts +9 -3
  60. package/src/panelVisualTheme.ts +18 -7
  61. package/src/panelWorkbenchHelpers.ts +2 -2
  62. package/src/styles.ts +16 -12
@@ -1 +1 @@
1
- {"version":3,"file":"panelGraphScene.js","sourceRoot":"","sources":["../src/panelGraphScene.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n FrameGraphDebugAccessEdge,\n FrameGraphDebugEdge,\n FrameGraphDebugGroup,\n FrameGraphDebugNode,\n FrameGraphDebugResource,\n FrameGraphDebugResourceRef,\n FrameGraphDebugViewModel,\n} from './debugCaptureModel.ts';\nimport { formatGpuDuration, labelNode, labelResource } from './panelDomHelpers.ts';\nimport type { GraphViewMode, Selection } from './panelTypes.ts';\n\nexport type GraphSceneElementId = string;\n\ntype GraphSceneNodeBase = {\n readonly id: GraphSceneElementId;\n readonly label: string;\n readonly overviewLabel: string;\n readonly title: string;\n readonly parentId?: GraphSceneElementId;\n};\n\nexport type PassSceneNode = GraphSceneNodeBase & {\n readonly kind: 'pass';\n readonly nodeId: string;\n readonly passKind: FrameGraphDebugNode['kind'];\n readonly executionSegmentIndex?: number;\n readonly gpuDurationMicros?: number;\n};\n\nexport type CulledPassSceneNode = GraphSceneNodeBase & {\n readonly kind: 'culled-pass';\n readonly culledIndex: number;\n readonly nodeId: string;\n readonly passKind: FrameGraphDebugNode['kind'];\n readonly reason: string;\n};\n\nexport type GroupSceneNode = GraphSceneNodeBase & {\n readonly kind: 'group';\n readonly groupId: string;\n readonly groupPathKey: string;\n readonly collapsed: boolean;\n readonly depthBand: 0 | 1;\n readonly childNodeIds: readonly GraphSceneElementId[];\n readonly representedNodeIds: readonly string[];\n readonly retainedNodeCount: number;\n readonly culledNodeCount: number;\n readonly gpuWorkDurationMicros: number;\n readonly timedNodeCount: number;\n readonly timingEligibleNodeCount: number;\n};\n\nexport type ResourceSceneNode = GraphSceneNodeBase & {\n readonly kind: 'resource';\n readonly resourceId: string;\n readonly resourceKind: FrameGraphDebugResource['kind'];\n};\n\nexport type GraphSceneNode = PassSceneNode | CulledPassSceneNode | GroupSceneNode | ResourceSceneNode;\n\ntype GraphSceneEdgeBase = {\n readonly id: GraphSceneElementId;\n readonly from: GraphSceneElementId;\n readonly to: GraphSceneElementId;\n readonly label?: string;\n readonly title: string;\n readonly resourceId: string;\n};\n\nexport type DependencySceneEdge = GraphSceneEdgeBase & {\n readonly kind: 'dependency';\n readonly dependencyKind: FrameGraphDebugEdge['kind'];\n readonly underlyingDependencies: readonly FrameGraphDebugEdge[];\n readonly underlyingDependencyCount: number;\n};\n\nexport type AccessSceneEdge = GraphSceneEdgeBase & {\n readonly kind: 'access';\n readonly accessId: string;\n readonly accessMode: FrameGraphDebugAccessEdge['mode'];\n readonly access: FrameGraphDebugAccessEdge['access'];\n readonly dashed: boolean;\n};\n\nexport type GraphSceneEdge = DependencySceneEdge | AccessSceneEdge;\n\nexport type GraphSemanticReferences = {\n readonly nodeIds: readonly string[];\n readonly groupPathKeys: readonly string[];\n readonly resourceIds: readonly string[];\n readonly accessIds: readonly string[];\n readonly dependencies: readonly FrameGraphDebugEdge[];\n};\n\nexport type GraphSceneInteractionIndex = {\n readonly selectionByElementId: ReadonlyMap<GraphSceneElementId, Selection>;\n readonly primaryElementIdsBySelection: ReadonlyMap<string, readonly GraphSceneElementId[]>;\n readonly relatedElementIdsBySelection: ReadonlyMap<string, readonly GraphSceneElementId[]>;\n readonly semanticReferencesByElementId: ReadonlyMap<GraphSceneElementId, GraphSemanticReferences>;\n};\n\nexport type GraphScene = {\n readonly mode: GraphViewMode;\n readonly nodes: readonly GraphSceneNode[];\n readonly edges: readonly GraphSceneEdge[];\n readonly topologyKey: string;\n readonly contentKey: string;\n readonly interaction: GraphSceneInteractionIndex;\n};\n\nexport type CreateGraphSceneOptions = {\n readonly mode: GraphViewMode;\n readonly groupsEnabled: boolean;\n readonly expandedGroupPaths: ReadonlySet<string>;\n};\n\ntype MutableInteractionIndex = {\n readonly selectionByElementId: Map<GraphSceneElementId, Selection>;\n readonly primaryElementIdsBySelection: Map<string, GraphSceneElementId[]>;\n readonly relatedElementIdsBySelection: Map<string, GraphSceneElementId[]>;\n readonly semanticReferencesByElementId: Map<GraphSceneElementId, GraphSemanticReferences>;\n};\n\nexport function createGraphScene(\n snapshot: FrameGraphDebugViewModel,\n options: CreateGraphSceneOptions,\n): GraphScene {\n return options.mode === 'resources'\n ? createResourceGraphScene(snapshot)\n : createPassGraphScene(snapshot, options.groupsEnabled, options.expandedGroupPaths);\n}\n\nexport function graphGroupElementId(pathKey: string): GraphSceneElementId {\n return `group:${pathKey}`;\n}\n\nexport function selectionKey(selection: Selection): string {\n switch (selection.kind) {\n case 'node':\n return `node:${selection.id}`;\n case 'group':\n return `group:${selection.pathKey}`;\n case 'resource':\n return `resource:${selection.id}`;\n case 'allocation':\n return `allocation:${selection.id}`;\n case 'root':\n return `root:${selection.index}`;\n case 'culled':\n return `culled:${selection.index}`;\n case 'segment':\n return `segment:${selection.index}`;\n }\n}\n\nfunction createPassGraphScene(\n snapshot: FrameGraphDebugViewModel,\n groupsEnabled: boolean,\n expandedGroupPaths: ReadonlySet<string>,\n): GraphScene {\n const interaction = createMutableInteractionIndex();\n const segmentByNodeId = executionSegmentByNodeId(snapshot);\n const groupsById = new Map(snapshot.debugGroups.map((group) => [group.id, group]));\n const useGroups = groupsEnabled && snapshot.debugGroups.length > 0;\n const isExpanded = (group: FrameGraphDebugGroup) => expandedGroupPaths.has(group.pathKey);\n const hasVisibleAncestors = (group: FrameGraphDebugGroup) => group.ancestorIds\n .slice(0, -1)\n .every((id) => isExpanded(groupsById.get(id)!));\n const includedGroups = useGroups\n ? snapshot.debugGroups.filter((group) => group.summary.retainedNodeCount > 0 && hasVisibleAncestors(group))\n : [];\n const includedGroupIds = new Set(includedGroups.map((group) => group.id));\n const representedNodeIdsByGroupId = new Map<string, string[]>();\n for (const node of snapshot.nodes) {\n const group = node.debugGroupId === undefined ? undefined : groupsById.get(node.debugGroupId);\n for (const groupId of group?.ancestorIds ?? []) {\n const represented = representedNodeIdsByGroupId.get(groupId) ?? [];\n represented.push(node.id);\n representedNodeIdsByGroupId.set(groupId, represented);\n }\n }\n const visiblePasses = snapshot.nodes.filter((node) => {\n if (!useGroups || node.debugGroupId === undefined) return true;\n return groupsById.get(node.debugGroupId)!.ancestorIds.every((id) => isExpanded(groupsById.get(id)!));\n });\n const visiblePassIds = new Set(visiblePasses.map((node) => node.id));\n const includedGroupsByParentId = indexByOptionalId(includedGroups, (group) => group.parentId);\n const visiblePassesByGroupId = indexByOptionalId(visiblePasses, (node) => node.debugGroupId);\n\n const groupNodes: GroupSceneNode[] = includedGroups.map((group) => {\n const id = graphGroupElementId(group.pathKey);\n const collapsed = !isExpanded(group);\n const representedNodeIds = representedNodeIdsByGroupId.get(group.id) ?? [];\n const childNodeIds = collapsed ? [] : [\n ...(includedGroupsByParentId.get(group.id) ?? [])\n .map((child) => graphGroupElementId(child.pathKey)),\n ...(visiblePassesByGroupId.get(group.id) ?? [])\n .map((node) => passElementId(node.id)),\n ];\n const node: GroupSceneNode = {\n id,\n kind: 'group',\n groupId: group.id,\n groupPathKey: group.pathKey,\n label: createGroupLabel(group, collapsed),\n overviewLabel: `${collapsed ? '▸' : '▾'} ${group.label}`,\n title: createGroupTitle(group),\n parentId: group.parentId !== undefined && includedGroupIds.has(group.parentId)\n ? graphGroupElementId(groupsById.get(group.parentId)!.pathKey)\n : undefined,\n collapsed,\n depthBand: group.ancestorIds.length % 2 as 0 | 1,\n childNodeIds,\n representedNodeIds,\n retainedNodeCount: group.summary.retainedNodeCount,\n culledNodeCount: group.summary.culledNodeCount,\n gpuWorkDurationMicros: group.summary.gpuWorkDurationMicros,\n timedNodeCount: group.summary.timedNodeCount,\n timingEligibleNodeCount: group.summary.timingEligibleNodeCount,\n };\n const selection: Selection = { kind: 'group', pathKey: group.pathKey };\n registerElement(interaction, node.id, selection, {\n nodeIds: representedNodeIds,\n groupPathKeys: [group.pathKey],\n resourceIds: [\n ...group.summary.inputResources.map((resource) => resource.id),\n ...group.summary.outputResources.map((resource) => resource.id),\n ],\n accessIds: [],\n dependencies: [],\n });\n return node;\n });\n\n const passNodes: PassSceneNode[] = visiblePasses.map((node) => {\n const segment = segmentByNodeId.get(node.id);\n const sceneNode: PassSceneNode = {\n id: passElementId(node.id),\n kind: 'pass',\n nodeId: node.id,\n passKind: node.kind,\n executionSegmentIndex: segment?.index,\n gpuDurationMicros: node.gpuDurationMicros,\n label: formatGraphNodeLabel(`${segmentLabel(segment)} ${labelNode(node)}`),\n overviewLabel: shortGraphLabel(labelNode(node)),\n title: createNodeTitle(node, segment, snapshot),\n parentId: useGroups && node.debugGroupId !== undefined\n ? graphGroupElementId(groupsById.get(node.debugGroupId)!.pathKey)\n : undefined,\n };\n const selection: Selection = { kind: 'node', id: node.id };\n registerElement(interaction, sceneNode.id, selection, emptyReferences({ nodeIds: [node.id] }));\n return sceneNode;\n });\n\n const representativeByNodeId = new Map<string, GraphSceneElementId>();\n for (const node of snapshot.nodes) {\n if (visiblePassIds.has(node.id)) {\n representativeByNodeId.set(node.id, passElementId(node.id));\n continue;\n }\n const group = groupsById.get(node.debugGroupId!)!;\n const collapsedAncestorId = group.ancestorIds.find((id) => !isExpanded(groupsById.get(id)!));\n representativeByNodeId.set(node.id, graphGroupElementId(groupsById.get(collapsedAncestorId!)!.pathKey));\n }\n\n for (const node of snapshot.nodes) {\n const representative = representativeByNodeId.get(node.id)!;\n setSelectionElements(interaction, { kind: 'node', id: node.id }, [representative], [representative]);\n }\n if (useGroups) {\n for (const group of snapshot.debugGroups) {\n if (includedGroupIds.has(group.id)) continue;\n const collapsedAncestorId = group.ancestorIds.find((id) => !isExpanded(groupsById.get(id)!));\n if (collapsedAncestorId !== undefined) {\n const representative = graphGroupElementId(groupsById.get(collapsedAncestorId)!.pathKey);\n setSelectionElements(interaction, { kind: 'group', pathKey: group.pathKey }, [representative], [representative]);\n }\n }\n }\n\n const dependencyEdges = useGroups\n ? createFoldedDependencyEdges(snapshot.edges, representativeByNodeId)\n : snapshot.edges.map((edge, index) => createDependencySceneEdge(\n edge,\n passElementId(edge.fromNodeId),\n passElementId(edge.toNodeId),\n [edge],\n index,\n ));\n for (const edge of dependencyEdges) {\n const selection: Selection = { kind: 'resource', id: edge.resourceId };\n interaction.selectionByElementId.set(edge.id, selection);\n appendSelectionElement(interaction.primaryElementIdsBySelection, selection, edge.id);\n appendSelectionElement(interaction.relatedElementIdsBySelection, selection, edge.id);\n interaction.semanticReferencesByElementId.set(edge.id, {\n nodeIds: unique(edge.underlyingDependencies.flatMap((dependency) => [dependency.fromNodeId, dependency.toNodeId])),\n groupPathKeys: [],\n resourceIds: [edge.resourceId],\n accessIds: [],\n dependencies: edge.underlyingDependencies,\n });\n }\n\n return finalizeScene('passes', [...groupNodes, ...passNodes], dependencyEdges, interaction);\n}\n\nfunction createResourceGraphScene(snapshot: FrameGraphDebugViewModel): GraphScene {\n const interaction = createMutableInteractionIndex();\n const segmentByNodeId = executionSegmentByNodeId(snapshot);\n const accessesByResourceId = indexAccessesByResourceId(snapshot.accessEdges);\n const passNodes: PassSceneNode[] = snapshot.nodes.map((node) => {\n const segment = segmentByNodeId.get(node.id);\n const sceneNode: PassSceneNode = {\n id: passElementId(node.id),\n kind: 'pass',\n nodeId: node.id,\n passKind: node.kind,\n executionSegmentIndex: segment?.index,\n gpuDurationMicros: node.gpuDurationMicros,\n label: formatGraphNodeLabel(`${segmentLabel(segment)} ${labelNode(node)}`),\n overviewLabel: shortGraphLabel(labelNode(node)),\n title: createNodeTitle(node, segment, snapshot),\n };\n registerElement(\n interaction,\n sceneNode.id,\n { kind: 'node', id: node.id },\n emptyReferences({ nodeIds: [node.id] }),\n );\n return sceneNode;\n });\n const culledNodes: CulledPassSceneNode[] = snapshot.culledNodes.map((culled, index) => {\n const sceneNode: CulledPassSceneNode = {\n id: culledPassElementId(index, culled.node.id),\n kind: 'culled-pass',\n culledIndex: index,\n nodeId: culled.node.id,\n passKind: culled.node.kind,\n reason: culled.reason,\n label: `${formatGraphNodeLabel(labelNode(culled.node))}\\n(culled)`,\n overviewLabel: `${shortGraphLabel(labelNode(culled.node))} (culled)`,\n title: createCulledNodeTitle(culled),\n };\n registerElement(\n interaction,\n sceneNode.id,\n { kind: 'culled', index },\n emptyReferences({ nodeIds: [culled.node.id] }),\n );\n return sceneNode;\n });\n const resourceNodes: ResourceSceneNode[] = snapshot.resources.map((resource) => {\n const sceneNode: ResourceSceneNode = {\n id: resourceElementId(resource.id),\n kind: 'resource',\n resourceId: resource.id,\n resourceKind: resource.kind,\n label: formatGraphResourceLabel(labelResource(resource)),\n overviewLabel: shortGraphLabel(labelResource(resource)),\n title: createResourceTitle(resource, snapshot, accessesByResourceId.get(resource.id) ?? []),\n };\n registerElement(\n interaction,\n sceneNode.id,\n { kind: 'resource', id: resource.id },\n emptyReferences({ resourceIds: [resource.id] }),\n );\n return sceneNode;\n });\n const culledNodeIds = new Map(snapshot.culledNodes.map((culled, index) => [\n culled.node.id,\n culledPassElementId(index, culled.node.id),\n ]));\n const accessEdges: AccessSceneEdge[] = snapshot.accessEdges.map((access) => {\n const passId = culledNodeIds.get(access.nodeId) ?? passElementId(access.nodeId);\n const resourceId = resourceElementId(access.resource.id);\n const edge: AccessSceneEdge = {\n id: accessElementId(access.accessId, access.resource.id),\n kind: 'access',\n from: access.mode === 'write' ? passId : resourceId,\n to: access.mode === 'write' ? resourceId : passId,\n label: access.access,\n title: createAccessTitle(access),\n resourceId: access.resource.id,\n accessId: access.accessId,\n accessMode: access.mode,\n access: access.access,\n dashed: culledNodeIds.has(access.nodeId),\n };\n const selection: Selection = { kind: 'resource', id: access.resource.id };\n interaction.selectionByElementId.set(edge.id, selection);\n appendSelectionElement(interaction.relatedElementIdsBySelection, selection, edge.id);\n interaction.semanticReferencesByElementId.set(edge.id, {\n nodeIds: [access.nodeId],\n groupPathKeys: [],\n resourceIds: [access.resource.id],\n accessIds: [access.accessId],\n dependencies: [],\n });\n return edge;\n });\n\n return finalizeScene('resources', [...passNodes, ...culledNodes, ...resourceNodes], accessEdges, interaction);\n}\n\nexport function indexAccessesByResourceId(\n accesses: readonly FrameGraphDebugAccessEdge[],\n): ReadonlyMap<string, readonly FrameGraphDebugAccessEdge[]> {\n const result = new Map<string, FrameGraphDebugAccessEdge[]>();\n for (const access of accesses) {\n const resourceAccesses = result.get(access.resource.id);\n if (resourceAccesses) {\n resourceAccesses.push(access);\n } else {\n result.set(access.resource.id, [access]);\n }\n }\n return result;\n}\n\nfunction createFoldedDependencyEdges(\n dependencies: readonly FrameGraphDebugEdge[],\n representativeByNodeId: ReadonlyMap<string, GraphSceneElementId>,\n): DependencySceneEdge[] {\n const dependenciesByKey = new Map<string, {\n readonly from: GraphSceneElementId;\n readonly to: GraphSceneElementId;\n readonly resource: FrameGraphDebugResourceRef;\n readonly dependencies: FrameGraphDebugEdge[];\n }>();\n for (const dependency of dependencies) {\n const from = representativeByNodeId.get(dependency.fromNodeId)!;\n const to = representativeByNodeId.get(dependency.toNodeId)!;\n if (from === to) continue;\n const key = JSON.stringify([from, to, dependency.resource.id]);\n const existing = dependenciesByKey.get(key);\n if (existing) {\n existing.dependencies.push(dependency);\n } else {\n dependenciesByKey.set(key, { from, to, resource: dependency.resource, dependencies: [dependency] });\n }\n }\n return [...dependenciesByKey.values()].map((entry, index) => createDependencySceneEdge(\n entry.dependencies.find((dependency) => dependency.kind === 'value') ?? entry.dependencies[0]!,\n entry.from,\n entry.to,\n entry.dependencies,\n index,\n ));\n}\n\nfunction createDependencySceneEdge(\n dependency: FrameGraphDebugEdge,\n from: GraphSceneElementId,\n to: GraphSceneElementId,\n underlyingDependencies: readonly FrameGraphDebugEdge[],\n occurrence: number,\n): DependencySceneEdge {\n const dependencyKind = underlyingDependencies.some((edge) => edge.kind === 'value') ? 'value' : 'ordering';\n return {\n id: `dependency:${JSON.stringify([from, to, dependency.resource.id, occurrence])}`,\n kind: 'dependency',\n from,\n to,\n title: `${labelResource(dependency.resource)}${underlyingDependencies.length > 1\n ? `\\n${underlyingDependencies.length} folded dependencies`\n : ''}`,\n resourceId: dependency.resource.id,\n dependencyKind,\n underlyingDependencies,\n underlyingDependencyCount: underlyingDependencies.length,\n };\n}\n\nfunction finalizeScene(\n mode: GraphViewMode,\n nodes: readonly GraphSceneNode[],\n edges: readonly GraphSceneEdge[],\n interaction: MutableInteractionIndex,\n): GraphScene {\n const topologyKey = JSON.stringify({\n mode,\n nodes: nodes.map((node) => [node.id, node.kind, node.parentId, node.kind === 'group' ? node.collapsed : undefined]),\n edges: edges.map((edge) => [edge.id, edge.kind, edge.from, edge.to]),\n });\n const contentKey = JSON.stringify({\n mode,\n nodes: nodes.map((node) => [\n node.id,\n node.kind,\n node.parentId,\n node.label,\n node.overviewLabel,\n node.title,\n node.kind === 'pass' || node.kind === 'culled-pass' ? node.passKind : undefined,\n node.kind === 'resource' ? node.resourceKind : undefined,\n node.kind === 'group' ? node.collapsed : undefined,\n node.kind === 'group' ? node.depthBand : undefined,\n node.kind === 'group' ? node.culledNodeCount > 0 : undefined,\n ]),\n edges: edges.map((edge) => [\n edge.id,\n edge.kind,\n edge.from,\n edge.to,\n edge.label,\n edge.title,\n edge.kind === 'dependency' ? edge.dependencyKind : undefined,\n edge.kind === 'access' ? edge.accessMode : undefined,\n edge.kind === 'access' ? edge.dashed : undefined,\n ]),\n });\n return {\n mode,\n nodes,\n edges,\n topologyKey,\n contentKey,\n interaction,\n };\n}\n\nfunction createMutableInteractionIndex(): MutableInteractionIndex {\n return {\n selectionByElementId: new Map(),\n primaryElementIdsBySelection: new Map(),\n relatedElementIdsBySelection: new Map(),\n semanticReferencesByElementId: new Map(),\n };\n}\n\nfunction registerElement(\n interaction: MutableInteractionIndex,\n elementId: GraphSceneElementId,\n selection: Selection,\n references: GraphSemanticReferences,\n): void {\n interaction.selectionByElementId.set(elementId, selection);\n setSelectionElements(interaction, selection, [elementId], [elementId]);\n interaction.semanticReferencesByElementId.set(elementId, references);\n}\n\nfunction setSelectionElements(\n interaction: MutableInteractionIndex,\n selection: Selection,\n primary: readonly GraphSceneElementId[],\n related: readonly GraphSceneElementId[],\n): void {\n interaction.primaryElementIdsBySelection.set(selectionKey(selection), [...primary]);\n interaction.relatedElementIdsBySelection.set(selectionKey(selection), [...related]);\n}\n\nfunction appendSelectionElement(\n map: Map<string, GraphSceneElementId[]>,\n selection: Selection,\n elementId: GraphSceneElementId,\n): void {\n const key = selectionKey(selection);\n const elementIds = map.get(key) ?? [];\n if (!elementIds.includes(elementId)) elementIds.push(elementId);\n map.set(key, elementIds);\n}\n\nfunction emptyReferences(overrides: Partial<GraphSemanticReferences>): GraphSemanticReferences {\n return {\n nodeIds: [],\n groupPathKeys: [],\n resourceIds: [],\n accessIds: [],\n dependencies: [],\n ...overrides,\n };\n}\n\nfunction passElementId(nodeId: string): GraphSceneElementId {\n return `pass:${nodeId}`;\n}\n\nfunction culledPassElementId(index: number, nodeId: string): GraphSceneElementId {\n return `culled-pass:${index}:${nodeId}`;\n}\n\nfunction resourceElementId(resourceId: string): GraphSceneElementId {\n return `resource:${resourceId}`;\n}\n\nfunction accessElementId(accessId: string, resourceId: string): GraphSceneElementId {\n return `access:${accessId}:${resourceId}`;\n}\n\nfunction formatGraphNodeLabel(label: string): string {\n return formatGraphLabel(label, 20, 3);\n}\n\nfunction formatGraphResourceLabel(label: string): string {\n return formatGraphLabel(label, 18, 3);\n}\n\nfunction formatGraphLabel(label: string, maxLineLength: number, maxLines: number): string {\n if (label.length <= maxLineLength) return label;\n const chunks = label.match(/[^.]+\\.?/g) ?? [label];\n const lines: string[] = [];\n let current = '';\n let truncated = false;\n for (const chunk of chunks) {\n const next = current ? `${current}${chunk}` : chunk;\n if (current && next.length > maxLineLength) {\n lines.push(current);\n current = chunk;\n if (lines.length === maxLines) {\n truncated = true;\n break;\n }\n continue;\n }\n if (!current && chunk.length > maxLineLength) {\n const wrapped = splitLongGraphLabelChunk(chunk, maxLineLength);\n for (const line of wrapped) {\n if (lines.length === maxLines) {\n truncated = true;\n break;\n }\n lines.push(line);\n }\n current = '';\n if (truncated) break;\n continue;\n }\n current = next;\n }\n if (current && lines.length < maxLines) lines.push(current);\n else if (current) truncated = true;\n if (lines.length > maxLines) {\n lines.length = maxLines;\n truncated = true;\n }\n if (truncated && lines.length > 0) {\n const line = lines[lines.length - 1]!;\n lines[lines.length - 1] = line.length < maxLineLength\n ? `${line}…`\n : `${line.slice(0, Math.max(1, maxLineLength - 1))}…`;\n }\n return lines.join('\\n');\n}\n\nfunction splitLongGraphLabelChunk(label: string, maxLineLength: number): string[] {\n const chunks = label.match(/[^\\s_\\-/]+[\\s_\\-/]*/g) ?? [label];\n const lines: string[] = [];\n let current = '';\n for (const chunk of chunks) {\n const next = current ? `${current}${chunk}` : chunk;\n if (current && next.length > maxLineLength) {\n lines.push(current);\n current = chunk;\n } else if (!current && chunk.length > maxLineLength) {\n for (let index = 0; index < chunk.length; index += maxLineLength) {\n lines.push(chunk.slice(index, index + maxLineLength));\n }\n } else {\n current = next;\n }\n }\n if (current) lines.push(current);\n return lines;\n}\n\nfunction shortGraphLabel(label: string): string {\n const parts = label.split(/[./]/).filter(Boolean);\n const last = parts[parts.length - 1] ?? label;\n const short = parts.length > 1 && (/^\\d+$/.test(last) || /^view#\\d+$/.test(last))\n ? `${parts[parts.length - 2]}.${last}`\n : last;\n return short.length <= 18 ? short : `${short.slice(0, 17)}…`;\n}\n\nfunction createGroupLabel(group: FrameGraphDebugGroup, collapsed: boolean): string {\n const summary = group.summary;\n const gpu = summary.timingEligibleNodeCount === 0\n ? 'no timed passes'\n : `Σ ${(summary.gpuWorkDurationMicros / 1000).toFixed(3)} ms ${summary.timedNodeCount}/${summary.timingEligibleNodeCount}`;\n return `${collapsed ? '▸' : '▾'} ${group.label} · ${summary.retainedNodeCount} retained · ${summary.culledNodeCount} culled · ${gpu}`;\n}\n\nfunction createNodeTitle(\n node: FrameGraphDebugNode,\n segment: FrameGraphDebugViewModel['executionSegments'][number] | undefined,\n snapshot: FrameGraphDebugViewModel,\n): string {\n return [\n labelNode(node),\n `kind: ${node.kind}`,\n `group: ${debugGroupPathForId(node.debugGroupId, snapshot)}`,\n `segment: ${segment ? `${segment.index}:${segment.kind}` : '-'}`,\n `gpu: ${node.kind === 'external-submission' ? 'opaque' : `${formatGpuDuration(node)} ms`}`,\n `reads: ${node.reads.map((access) => labelResource(access.resource)).join(', ') || '-'}`,\n `writes: ${node.writes.map((access) => labelResource(access.resource)).join(', ') || '-'}`,\n ].join('\\n');\n}\n\nfunction createGroupTitle(group: FrameGraphDebugGroup): string {\n const summary = group.summary;\n return [\n group.path.join(' / '),\n `retained: ${summary.retainedNodeCount}`,\n `culled: ${summary.culledNodeCount}`,\n `inputs: ${summary.inputResources.map(labelResource).join(', ') || '-'}`,\n `outputs: ${summary.outputResources.map(labelResource).join(', ') || '-'}`,\n `transient registered/accessed: ${summary.registeredTransientResourceCount}/${summary.accessedTransientResourceCount}`,\n `physical allocations: ${summary.physicalAllocationCount}`,\n `segments: ${summary.executionSegmentCount}`,\n `opaque: ${summary.externalSubmissionCount}`,\n `Σ GPU work: ${(summary.gpuWorkDurationMicros / 1000).toFixed(3)} ms (${summary.timedNodeCount}/${summary.timingEligibleNodeCount})`,\n ].join('\\n');\n}\n\nfunction createCulledNodeTitle(culled: FrameGraphDebugViewModel['culledNodes'][number]): string {\n return [\n `${labelNode(culled.node)} (culled)`,\n `kind: ${culled.node.kind}`,\n `reason: ${culled.reason}`,\n `reads: ${culled.node.reads.map((access) => labelResource(access.resource)).join(', ') || '-'}`,\n `writes: ${culled.node.writes.map((access) => labelResource(access.resource)).join(', ') || '-'}`,\n ].join('\\n');\n}\n\nfunction createResourceTitle(\n resource: FrameGraphDebugResource,\n snapshot: FrameGraphDebugViewModel,\n accesses: readonly FrameGraphDebugAccessEdge[],\n): string {\n return [\n labelResource(resource),\n `kind: ${resource.kind}`,\n `origin: ${resource.origin}`,\n `registered in: ${debugGroupPathForId(resource.debugGroupId, snapshot)}`,\n `lifetime: ${resource.lifetime ? `${resource.lifetime.firstUse}-${resource.lifetime.lastUse}` : '-'}`,\n `physical: ${resource.physicalResourceId ?? '-'}`,\n `reads: ${accesses.filter((access) => access.mode === 'read').length}`,\n `writes: ${accesses.filter((access) => access.mode === 'write').length}`,\n ].join('\\n');\n}\n\nfunction createAccessTitle(access: FrameGraphDebugAccessEdge): string {\n return [\n `#${access.accessId} ${access.mode}`,\n labelResource(access.resource),\n `access: ${access.access}`,\n access.mode === 'write' ? `contents: ${access.contents}` : undefined,\n access.mode === 'write' ? `result: ${access.producesValue ? 'produced' : 'discarded'}` : undefined,\n access.textureViewId === undefined ? undefined : `texture view: #${access.textureViewId}`,\n access.textureRegion ? `texture: mip ${access.textureRegion.baseMipLevel}+${access.textureRegion.mipLevelCount}, layer ${access.textureRegion.baseArrayLayer ?? 0}+${access.textureRegion.arrayLayerCount ?? 1}, depth ${access.textureRegion.baseDepthSlice ?? 0}+${access.textureRegion.depthSliceCount ?? 1}, ${access.textureRegion.aspect}` : undefined,\n access.bufferRange ? `buffer: ${access.bufferRange.offset}+${access.bufferRange.size ?? 'end'}` : undefined,\n ].filter(Boolean).join('\\n');\n}\n\nfunction debugGroupPathForId(groupId: string | undefined, snapshot: FrameGraphDebugViewModel): string {\n if (groupId === undefined) return '-';\n return snapshot.debugGroups.find((group) => group.id === groupId)?.path.join(' / ') ?? `#${groupId}`;\n}\n\nfunction executionSegmentByNodeId(snapshot: FrameGraphDebugViewModel) {\n return new Map(snapshot.executionSegments.flatMap((segment) => segment.nodeIds.map((nodeId) => [nodeId, segment] as const)));\n}\n\nfunction segmentLabel(segment: FrameGraphDebugViewModel['executionSegments'][number] | undefined): string {\n return segment ? `[S${segment.index}]` : '[S-]';\n}\n\nfunction unique<T>(values: readonly T[]): T[] {\n return [...new Set(values)];\n}\n\nfunction indexByOptionalId<T>(\n values: readonly T[],\n getId: (value: T) => string | undefined,\n): ReadonlyMap<string | undefined, readonly T[]> {\n const result = new Map<string | undefined, T[]>();\n for (const value of values) {\n const id = getId(value);\n const indexed = result.get(id) ?? [];\n indexed.push(value);\n result.set(id, indexed);\n }\n return result;\n}\n"]}
1
+ {"version":3,"file":"panelGraphScene.js","sourceRoot":"","sources":["../src/panelGraphScene.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n FrameGraphDebugAccessEdge,\n FrameGraphDebugEdge,\n FrameGraphDebugGroup,\n FrameGraphDebugNode,\n FrameGraphDebugResource,\n FrameGraphDebugViewModel,\n} from './debugCaptureModel.ts';\nimport { formatGpuDuration, labelNode, labelResource } from './panelDomHelpers.ts';\nimport { declarationEntrances } from './debugCaptureModel.ts';\nimport type { GraphFlowRelation, Selection } from './panelTypes.ts';\n\nexport type GraphSceneElementId = string;\n\ntype GraphSceneNodeBase = {\n readonly id: GraphSceneElementId;\n readonly label: string;\n readonly overviewLabel: string;\n readonly title: string;\n readonly parentId?: GraphSceneElementId;\n};\n\nexport type PassSceneNode = GraphSceneNodeBase & {\n readonly kind: 'pass';\n readonly nodeId: string;\n readonly passKind: FrameGraphDebugNode['kind'];\n readonly executionSegmentIndex?: number;\n readonly gpuDurationMicros?: number;\n};\n\nexport type GroupSceneNode = GraphSceneNodeBase & {\n readonly kind: 'group';\n readonly groupId: string;\n readonly groupPathKey: string;\n readonly collapsed: boolean;\n readonly depthBand: 0 | 1;\n readonly childNodeIds: readonly GraphSceneElementId[];\n readonly representedNodeIds: readonly string[];\n readonly retainedNodeCount: number;\n readonly culledNodeCount: number;\n readonly gpuWorkDurationMicros: number;\n readonly timedNodeCount: number;\n readonly timingEligibleNodeCount: number;\n};\n\nexport type ResourceSceneNode = GraphSceneNodeBase & {\n readonly kind: 'resource';\n readonly resourceId: string;\n readonly resourceKind: FrameGraphDebugResource['kind'];\n};\n\nexport type RootSceneNode = GraphSceneNodeBase & {\n readonly kind: 'root';\n readonly rootKey: string;\n readonly resourceId: string;\n readonly resourceKind: FrameGraphDebugResource['kind'];\n};\nexport type GraphSceneNode = PassSceneNode | GroupSceneNode | ResourceSceneNode | RootSceneNode;\n\ntype GraphSceneEdgeBase = {\n readonly id: GraphSceneElementId;\n readonly from: GraphSceneElementId;\n readonly to: GraphSceneElementId;\n readonly title: string;\n readonly resourceId: string;\n};\n\nexport type GraphSceneEdge = GraphSceneEdgeBase & {\n readonly kind: 'flow' | 'ordering';\n readonly relations: readonly GraphFlowRelation[];\n readonly underlyingDependencies: readonly FrameGraphDebugEdge[];\n readonly underlyingDependencyCount: number;\n};\n\nexport type GraphSemanticReferences = {\n readonly nodeIds: readonly string[];\n readonly groupPathKeys: readonly string[];\n readonly resourceIds: readonly string[];\n readonly accessIds: readonly string[];\n readonly dependencies: readonly FrameGraphDebugEdge[];\n};\n\nexport type GraphSceneInteractionIndex = {\n readonly selectionByElementId: ReadonlyMap<GraphSceneElementId, Selection>;\n readonly primaryElementIdsBySelection: ReadonlyMap<string, readonly GraphSceneElementId[]>;\n readonly hoverElementIdsBySelection: ReadonlyMap<string, readonly GraphSceneElementId[]>;\n readonly resourceElementIdsByResourceId: ReadonlyMap<string, readonly GraphSceneElementId[]>;\n readonly semanticReferencesByElementId: ReadonlyMap<GraphSceneElementId, GraphSemanticReferences>;\n};\n\nexport type GraphScene = {\n readonly nodes: readonly GraphSceneNode[];\n readonly edges: readonly GraphSceneEdge[];\n readonly topologyKey: string;\n readonly contentKey: string;\n readonly interaction: GraphSceneInteractionIndex;\n};\n\nexport type CreateGraphSceneOptions = {\n readonly groupsEnabled: boolean;\n readonly expandedGroupPaths: ReadonlySet<string>;\n};\n\ntype MutableInteractionIndex = {\n readonly selectionByElementId: Map<GraphSceneElementId, Selection>;\n readonly primaryElementIdsBySelection: Map<string, GraphSceneElementId[]>;\n readonly hoverElementIdsBySelection: Map<string, GraphSceneElementId[]>;\n readonly resourceElementIdsByResourceId: Map<string, GraphSceneElementId[]>;\n readonly semanticReferencesByElementId: Map<GraphSceneElementId, GraphSemanticReferences>;\n};\n\nexport function createGraphScene(\n snapshot: FrameGraphDebugViewModel,\n options: CreateGraphSceneOptions,\n): GraphScene {\n return createFrameFlowScene(snapshot, options.groupsEnabled, options.expandedGroupPaths);\n}\n\nexport function graphGroupElementId(pathKey: string): GraphSceneElementId {\n return `group:${pathKey}`;\n}\n\nexport function selectionKey(selection: Selection): string {\n switch (selection.kind) {\n case 'node':\n return `node:${selection.id}`;\n case 'group':\n return `group:${selection.pathKey}`;\n case 'resource':\n return `resource:${selection.id}`;\n case 'allocation':\n return `allocation:${selection.id}`;\n case 'root':\n return `root:${selection.key}`;\n case 'culled':\n return `culled:${selection.index}`;\n case 'segment':\n return `segment:${selection.index}`;\n }\n}\n\nfunction createFrameFlowScene(\n snapshot: FrameGraphDebugViewModel,\n groupsEnabled: boolean,\n expandedGroupPaths: ReadonlySet<string>,\n): GraphScene {\n const interaction = createMutableInteractionIndex();\n const segmentByNodeId = executionSegmentByNodeId(snapshot);\n const groupsById = new Map(snapshot.debugGroups.map((group) => [group.id, group]));\n const useGroups = groupsEnabled && snapshot.debugGroups.length > 0;\n const isExpanded = (group: FrameGraphDebugGroup) => expandedGroupPaths.has(group.pathKey);\n const hasVisibleAncestors = (group: FrameGraphDebugGroup) => group.ancestorIds\n .slice(0, -1)\n .every((id) => isExpanded(groupsById.get(id)!));\n const retainedIds = new Set(snapshot.nodes.map((node) => node.id));\n const usedResourceIds = new Set([\n ...snapshot.accessEdges.filter((access) => retainedIds.has(access.nodeId)).map((access) => access.resource.id),\n ...snapshot.roots.flatMap((root) => root.resource ? [root.resource.id] : []),\n ]);\n const resources = snapshot.resources.filter((resource) => usedResourceIds.has(resource.id));\n const populatedGroupIds = new Set<string>();\n for (const item of [...snapshot.nodes, ...resources]) {\n for (const id of groupsById.get(item.debugGroupId ?? '')?.ancestorIds ?? []) populatedGroupIds.add(id);\n }\n const visibleResources = resources.filter((resource) => !useGroups || resource.debugGroupId === undefined\n || groupsById.get(resource.debugGroupId)!.ancestorIds.every((id) => isExpanded(groupsById.get(id)!)));\n const includedGroups = useGroups\n ? snapshot.debugGroups.filter((group) => populatedGroupIds.has(group.id) && hasVisibleAncestors(group))\n : [];\n const includedGroupIds = new Set(includedGroups.map((group) => group.id));\n const representedNodeIdsByGroupId = new Map<string, string[]>();\n for (const node of snapshot.nodes) {\n const group = node.debugGroupId === undefined ? undefined : groupsById.get(node.debugGroupId);\n for (const groupId of group?.ancestorIds ?? []) {\n const represented = representedNodeIdsByGroupId.get(groupId) ?? [];\n represented.push(node.id);\n representedNodeIdsByGroupId.set(groupId, represented);\n }\n }\n const visiblePasses = snapshot.nodes.filter((node) => {\n if (!useGroups || node.debugGroupId === undefined) return true;\n return groupsById.get(node.debugGroupId)!.ancestorIds.every((id) => isExpanded(groupsById.get(id)!));\n });\n const visiblePassIds = new Set(visiblePasses.map((node) => node.id));\n const includedGroupsByParentId = indexByOptionalId(includedGroups, (group) => group.parentId);\n const visiblePassesByGroupId = indexByOptionalId(visiblePasses, (node) => node.debugGroupId);\n\n const groupNodes: GroupSceneNode[] = includedGroups.map((group) => {\n const id = graphGroupElementId(group.pathKey);\n const collapsed = !isExpanded(group);\n const representedNodeIds = representedNodeIdsByGroupId.get(group.id) ?? [];\n const childNodeIds = collapsed ? [] : [\n ...(includedGroupsByParentId.get(group.id) ?? [])\n .map((child) => graphGroupElementId(child.pathKey)),\n ...(visiblePassesByGroupId.get(group.id) ?? [])\n .map((node) => passElementId(node.id)),\n ...visibleResources.filter((resource) => resource.debugGroupId === group.id).map((resource) => resourceElementId(resource.id)),\n ];\n const node: GroupSceneNode = {\n id,\n kind: 'group',\n groupId: group.id,\n groupPathKey: group.pathKey,\n label: createGroupLabel(group, collapsed),\n overviewLabel: `${collapsed ? '▸' : '▾'} ${group.label}`,\n title: createGroupTitle(group),\n parentId: group.parentId !== undefined && includedGroupIds.has(group.parentId)\n ? graphGroupElementId(groupsById.get(group.parentId)!.pathKey)\n : undefined,\n collapsed,\n depthBand: group.ancestorIds.length % 2 as 0 | 1,\n childNodeIds,\n representedNodeIds,\n retainedNodeCount: group.summary.retainedNodeCount,\n culledNodeCount: group.summary.culledNodeCount,\n gpuWorkDurationMicros: group.summary.gpuWorkDurationMicros,\n timedNodeCount: group.summary.timedNodeCount,\n timingEligibleNodeCount: group.summary.timingEligibleNodeCount,\n };\n const selection: Selection = { kind: 'group', pathKey: group.pathKey };\n registerElement(interaction, node.id, selection, {\n nodeIds: representedNodeIds,\n groupPathKeys: [group.pathKey],\n resourceIds: [\n ...group.summary.inputResources.map((resource) => resource.id),\n ...group.summary.outputResources.map((resource) => resource.id),\n ],\n accessIds: [],\n dependencies: [],\n });\n return node;\n });\n\n const passNodes: PassSceneNode[] = visiblePasses.map((node) => {\n const segment = segmentByNodeId.get(node.id);\n const sceneNode: PassSceneNode = {\n id: passElementId(node.id),\n kind: 'pass',\n nodeId: node.id,\n passKind: node.kind,\n executionSegmentIndex: segment?.index,\n gpuDurationMicros: node.gpuDurationMicros,\n label: formatGraphNodeLabel(`${segmentLabel(segment)} ${labelNode(node)}`),\n overviewLabel: shortGraphLabel(labelNode(node)),\n title: createNodeTitle(node, segment, snapshot),\n parentId: useGroups && node.debugGroupId !== undefined\n ? graphGroupElementId(groupsById.get(node.debugGroupId)!.pathKey)\n : undefined,\n };\n const selection: Selection = { kind: 'node', id: node.id };\n registerElement(interaction, sceneNode.id, selection, emptyReferences({ nodeIds: [node.id] }));\n return sceneNode;\n });\n\n const representativeByNodeId = new Map<string, GraphSceneElementId>();\n for (const node of snapshot.nodes) {\n if (visiblePassIds.has(node.id)) {\n representativeByNodeId.set(node.id, passElementId(node.id));\n continue;\n }\n const group = groupsById.get(node.debugGroupId!)!;\n const collapsedAncestorId = group.ancestorIds.find((id) => !isExpanded(groupsById.get(id)!));\n representativeByNodeId.set(node.id, graphGroupElementId(groupsById.get(collapsedAncestorId!)!.pathKey));\n }\n\n for (const node of snapshot.nodes) {\n const representative = representativeByNodeId.get(node.id)!;\n setSelectionElements(interaction, { kind: 'node', id: node.id }, [representative]);\n }\n if (useGroups) {\n for (const group of snapshot.debugGroups) {\n if (includedGroupIds.has(group.id)) continue;\n const collapsedAncestorId = group.ancestorIds.find((id) => !isExpanded(groupsById.get(id)!));\n if (collapsedAncestorId !== undefined) {\n const representative = graphGroupElementId(groupsById.get(collapsedAncestorId)!.pathKey);\n setSelectionElements(interaction, { kind: 'group', pathKey: group.pathKey }, [representative]);\n }\n }\n }\n\n const representativeByResourceId = new Map<string, string>();\n for (const resource of resources) {\n const collapsed = useGroups ? groupsById.get(resource.debugGroupId ?? '')?.ancestorIds.find((id) => !isExpanded(groupsById.get(id)!)) : undefined;\n const representative = collapsed ? graphGroupElementId(groupsById.get(collapsed)!.pathKey) : resourceElementId(resource.id);\n representativeByResourceId.set(resource.id, representative);\n }\n const resourceNodes: ResourceSceneNode[] = visibleResources.map((resource) => {\n const origin = resource.origin === 'transient' ? 'Created' : resource.origin === 'imported' ? 'Imported' : 'Surface';\n const node: ResourceSceneNode = {\n id: resourceElementId(resource.id), kind: 'resource', resourceId: resource.id, resourceKind: resource.kind,\n label: origin + ' · ' + (resource.kind === 'buffer' ? 'Buffer' : 'Texture') + '\\n' + formatGraphResourceLabel(labelResource(resource)),\n overviewLabel: origin + '\\n' + formatGraphResourceLabel(shortGraphLabel(labelResource(resource))),\n title: createResourceTitle(resource, snapshot, snapshot.accessesByResourceId.get(resource.id) ?? [])\n + '\\nDeclaration entrance, not a complete initial-content provenance graph.',\n parentId: useGroups && resource.debugGroupId ? graphGroupElementId(groupsById.get(resource.debugGroupId)!.pathKey) : undefined,\n };\n registerElement(interaction, node.id, { kind: 'resource', id: resource.id }, emptyReferences({ resourceIds: [resource.id] }));\n interaction.resourceElementIdsByResourceId.set(resource.id, [node.id]);\n return node;\n });\n const rootNodes: RootSceneNode[] = [];\n const aggregates = new Map<string, { from: string; to: string; resourceId: string; relations: GraphFlowRelation[] }>();\n const addRelation = (from: string, to: string, resourceId: string, relation: GraphFlowRelation) => {\n if (from === to) return;\n const key = JSON.stringify([from, to, resourceId]);\n const entry = aggregates.get(key) ?? { from, to, resourceId, relations: [] };\n entry.relations.push(relation);\n aggregates.set(key, entry);\n };\n for (const dependency of snapshot.edges) {\n addRelation(representativeByNodeId.get(dependency.fromNodeId)!, representativeByNodeId.get(dependency.toNodeId)!, dependency.resource.id,\n { role: dependency.kind, nodeIds: [dependency.fromNodeId, dependency.toNodeId], dependency });\n }\n for (const access of declarationEntrances(snapshot.nodes, snapshot.accessEdges, snapshot.edges)) {\n addRelation(representativeByResourceId.get(access.resource.id)!, representativeByNodeId.get(access.nodeId)!, access.resource.id,\n { role: 'declaration', nodeIds: [access.nodeId] });\n }\n const rootOccurrences = new Map<string, number>();\n const rangesByRootFamily = new Map<string, Set<string>>();\n for (const root of snapshot.roots) {\n if (!root.resource) continue;\n const family = JSON.stringify([root.resource.id, root.reason]);\n const ranges = rangesByRootFamily.get(family) ?? new Set<string>();\n ranges.add(root.key);\n rangesByRootFamily.set(family, ranges);\n }\n for (const root of snapshot.roots) {\n if (!root.resource) {\n if (root.nodeId) {\n const representative = representativeByNodeId.get(root.nodeId)!;\n setSelectionElements(interaction, { kind: 'root', key: root.key }, [representative]);\n }\n continue;\n }\n const occurrence = rootOccurrences.get(root.key) ?? 0;\n rootOccurrences.set(root.key, occurrence + 1);\n const id = 'root:' + root.key + (occurrence ? ':' + occurrence : '');\n const resource = snapshot.resourceById.get(root.resource.id)!;\n const rangeLabel = root.range?.kind === 'buffer' ? `bytes ${root.range.offset}–${root.range.offset + root.range.size}`\n : root.range ? root.range.regions.map((r) => `mip ${r.baseMipLevel}+${r.mipLevelCount} · ${r.baseDepthSlice !== undefined ? 'D' + r.baseDepthSlice + '+' + r.depthSliceCount : 'L' + r.baseArrayLayer + '+' + r.arrayLayerCount} · ${r.aspect}`).join('; ') : 'Range unavailable';\n const rangeSummary = root.range?.kind === 'texture'\n ? root.range.regions.map((r) => `m${r.baseMipLevel}+${r.mipLevelCount} ${r.baseDepthSlice !== undefined ? 'D' + r.baseDepthSlice + '+' + r.depthSliceCount : 'L' + r.baseArrayLayer + '+' + r.arrayLayerCount} ${r.aspect === 'depth-only' ? 'depth' : r.aspect === 'stencil-only' ? 'stencil' : 'all'}`).join('; ')\n : rangeLabel;\n const reasonLabel = root.reason.split('-').map((word) => word[0]!.toUpperCase() + word.slice(1)).join(' ');\n const disambiguate = rangesByRootFamily.get(JSON.stringify([resource.id, root.reason]))!.size > 1;\n rootNodes.push({\n id, kind: 'root', rootKey: root.key, resourceId: resource.id, resourceKind: resource.kind,\n label: reasonLabel + '\\n' + formatGraphResourceLabel(labelResource(resource))\n + (disambiguate ? '\\n' + formatGraphResourceLabel(rangeSummary) : ''),\n overviewLabel: reasonLabel + '\\n' + formatGraphResourceLabel(shortGraphLabel(labelResource(resource))),\n title: labelResource(resource) + '\\n' + root.reason + '\\n' + rangeLabel\n + (root.resolution ? '\\nProducers: ' + (root.resolution.producerNodeIds.join(', ') || 'none') + '\\nInitial contents: ' + root.resolution.usesInitialContents : '\\nOutput sources unavailable in Legacy capture.'),\n });\n registerElement(interaction, id, { kind: 'root', key: root.key },\n emptyReferences({ resourceIds: [resource.id], nodeIds: root.resolution?.producerNodeIds ?? [] }));\n for (const nodeId of root.resolution?.producerNodeIds ?? []) {\n addRelation(representativeByNodeId.get(nodeId)!, id, resource.id, { role: 'output-producer', nodeIds: [nodeId], rootKey: root.key });\n }\n if (root.resolution?.usesInitialContents) addRelation(representativeByResourceId.get(resource.id)!, id, resource.id,\n { role: 'output-initial', nodeIds: [], rootKey: root.key });\n }\n const edges: GraphSceneEdge[] = [...aggregates.entries()].map(([key, entry]) => {\n const underlyingDependencies = entry.relations.flatMap((relation) => relation.dependency ? [relation.dependency] : []);\n const edge: GraphSceneEdge = {\n id: 'flow:' + key, ...entry,\n kind: entry.relations.every((relation) => relation.role === 'ordering') ? 'ordering' : 'flow',\n title: labelResource(snapshot.resourceById.get(entry.resourceId)!) + '\\n'\n + unique(entry.relations.map((relation) => relation.role)).join(' · '),\n underlyingDependencies, underlyingDependencyCount: underlyingDependencies.length,\n };\n const selection: Selection = { kind: 'resource', id: entry.resourceId };\n registerElement(interaction, edge.id, selection, emptyReferences({\n nodeIds: unique(entry.relations.flatMap((relation) => relation.nodeIds)), resourceIds: [entry.resourceId], dependencies: underlyingDependencies,\n }));\n const resourceElements = interaction.resourceElementIdsByResourceId.get(entry.resourceId) ?? [];\n resourceElements.push(edge.id);\n interaction.resourceElementIdsByResourceId.set(entry.resourceId, resourceElements);\n return edge;\n });\n for (const [resourceId, elements] of interaction.resourceElementIdsByResourceId) {\n const selection: Selection = { kind: 'resource', id: resourceId };\n setSelectionElements(interaction, selection, elements);\n interaction.hoverElementIdsBySelection.set(selectionKey(selection), [...elements]);\n }\n return finalizeScene([...groupNodes, ...passNodes, ...resourceNodes, ...rootNodes], edges, interaction);\n}\n\nfunction finalizeScene(\n nodes: readonly GraphSceneNode[],\n edges: readonly GraphSceneEdge[],\n interaction: MutableInteractionIndex,\n): GraphScene {\n const topologyKey = JSON.stringify({\n nodes: nodes.map((node) => [node.id, node.kind, node.parentId, node.kind === 'group' ? node.collapsed : undefined]),\n edges: edges.map((edge) => [edge.id, edge.kind, edge.from, edge.to]),\n });\n const contentKey = JSON.stringify({\n nodes: nodes.map((node) => [\n node.id,\n node.kind,\n node.parentId,\n node.label,\n node.overviewLabel,\n node.title,\n node.kind === 'pass' ? node.passKind : undefined,\n (node.kind === 'resource' || node.kind === 'root') ? node.resourceKind : undefined,\n node.kind === 'group' ? node.collapsed : undefined,\n node.kind === 'group' ? node.depthBand : undefined,\n node.kind === 'group' ? node.culledNodeCount > 0 : undefined,\n ]),\n edges: edges.map((edge) => [\n edge.id,\n edge.kind,\n edge.from,\n edge.to,\n edge.title,\n edge.relations,\n ]),\n });\n return {\n nodes,\n edges,\n topologyKey,\n contentKey,\n interaction,\n };\n}\n\nfunction createMutableInteractionIndex(): MutableInteractionIndex {\n return {\n selectionByElementId: new Map(),\n primaryElementIdsBySelection: new Map(),\n hoverElementIdsBySelection: new Map(),\n resourceElementIdsByResourceId: new Map(),\n semanticReferencesByElementId: new Map(),\n };\n}\n\nfunction registerElement(\n interaction: MutableInteractionIndex,\n elementId: GraphSceneElementId,\n selection: Selection,\n references: GraphSemanticReferences,\n): void {\n interaction.selectionByElementId.set(elementId, selection);\n setSelectionElements(interaction, selection, [elementId]);\n interaction.hoverElementIdsBySelection.set(selectionKey(selection), [elementId]);\n interaction.semanticReferencesByElementId.set(elementId, references);\n}\n\nfunction setSelectionElements(\n interaction: MutableInteractionIndex,\n selection: Selection,\n primary: readonly GraphSceneElementId[],\n): void {\n interaction.primaryElementIdsBySelection.set(selectionKey(selection), [...primary]);\n}\n\nfunction emptyReferences(overrides: Partial<GraphSemanticReferences>): GraphSemanticReferences {\n return {\n nodeIds: [],\n groupPathKeys: [],\n resourceIds: [],\n accessIds: [],\n dependencies: [],\n ...overrides,\n };\n}\n\nfunction passElementId(nodeId: string): GraphSceneElementId {\n return `pass:${nodeId}`;\n}\n\nfunction resourceElementId(resourceId: string): GraphSceneElementId {\n return `resource:${resourceId}`;\n}\n\nfunction formatGraphNodeLabel(label: string): string {\n return formatGraphLabel(label, 20, 3);\n}\n\nfunction formatGraphResourceLabel(label: string): string {\n const singleLine = label.replace(/\\s+/g, ' ').trim();\n // Reserve conservative monospace cells for CJK/emoji fallback glyphs as well.\n const glyphs = [...singleLine];\n const cells = (glyph: string) => /\\p{Mark}/u.test(glyph) ? 0 : glyph.codePointAt(0)! > 255 ? 2 : 1;\n if (glyphs.reduce((sum, glyph) => sum + cells(glyph), 0) <= 18) return singleLine;\n let result = '';\n let width = 0;\n for (const glyph of glyphs) {\n if (width + cells(glyph) > 17) break;\n result += glyph;\n width += cells(glyph);\n }\n return result + '…';\n}\n\nfunction formatGraphLabel(label: string, maxLineLength: number, maxLines: number): string {\n if (label.length <= maxLineLength) return label;\n const chunks = label.match(/[^.]+\\.?/g) ?? [label];\n const lines: string[] = [];\n let current = '';\n let truncated = false;\n for (const chunk of chunks) {\n const next = current ? `${current}${chunk}` : chunk;\n if (current && next.length > maxLineLength) {\n lines.push(current);\n current = chunk;\n if (lines.length === maxLines) {\n truncated = true;\n break;\n }\n continue;\n }\n if (!current && chunk.length > maxLineLength) {\n const wrapped = splitLongGraphLabelChunk(chunk, maxLineLength);\n for (const line of wrapped) {\n if (lines.length === maxLines) {\n truncated = true;\n break;\n }\n lines.push(line);\n }\n current = '';\n if (truncated) break;\n continue;\n }\n current = next;\n }\n if (current && lines.length < maxLines) lines.push(current);\n else if (current) truncated = true;\n if (lines.length > maxLines) {\n lines.length = maxLines;\n truncated = true;\n }\n if (truncated && lines.length > 0) {\n const line = lines[lines.length - 1]!;\n lines[lines.length - 1] = line.length < maxLineLength\n ? `${line}…`\n : `${line.slice(0, Math.max(1, maxLineLength - 1))}…`;\n }\n return lines.join('\\n');\n}\n\nfunction splitLongGraphLabelChunk(label: string, maxLineLength: number): string[] {\n const chunks = label.match(/[^\\s_\\-/]+[\\s_\\-/]*/g) ?? [label];\n const lines: string[] = [];\n let current = '';\n for (const chunk of chunks) {\n const next = current ? `${current}${chunk}` : chunk;\n if (current && next.length > maxLineLength) {\n lines.push(current);\n current = chunk;\n } else if (!current && chunk.length > maxLineLength) {\n for (let index = 0; index < chunk.length; index += maxLineLength) {\n lines.push(chunk.slice(index, index + maxLineLength));\n }\n } else {\n current = next;\n }\n }\n if (current) lines.push(current);\n return lines;\n}\n\nfunction shortGraphLabel(label: string): string {\n const parts = label.split(/[./]/).filter(Boolean);\n const last = parts[parts.length - 1] ?? label;\n const short = parts.length > 1 && (/^\\d+$/.test(last) || /^view#\\d+$/.test(last))\n ? `${parts[parts.length - 2]}.${last}`\n : last;\n return short.length <= 18 ? short : `${short.slice(0, 17)}…`;\n}\n\nfunction createGroupLabel(group: FrameGraphDebugGroup, collapsed: boolean): string {\n const summary = group.summary;\n const gpu = summary.timingEligibleNodeCount === 0\n ? 'no timed passes'\n : `Σ ${(summary.gpuWorkDurationMicros / 1000).toFixed(3)} ms ${summary.timedNodeCount}/${summary.timingEligibleNodeCount}`;\n return `${collapsed ? '▸' : '▾'} ${group.label} · ${summary.retainedNodeCount} retained · ${summary.culledNodeCount} culled · ${gpu}`;\n}\n\nfunction createNodeTitle(\n node: FrameGraphDebugNode,\n segment: FrameGraphDebugViewModel['executionSegments'][number] | undefined,\n snapshot: FrameGraphDebugViewModel,\n): string {\n return [\n labelNode(node),\n `kind: ${node.kind}`,\n `group: ${debugGroupPathForId(node.debugGroupId, snapshot)}`,\n `segment: ${segment ? `${segment.index}:${segment.kind}` : '-'}`,\n `gpu: ${node.kind === 'external-submission' ? 'opaque' : `${formatGpuDuration(node)} ms`}`,\n `reads: ${node.reads.map((access) => labelResource(access.resource)).join(', ') || '-'}`,\n `writes: ${node.writes.map((access) => labelResource(access.resource)).join(', ') || '-'}`,\n ].join('\\n');\n}\n\nfunction createGroupTitle(group: FrameGraphDebugGroup): string {\n const summary = group.summary;\n return [\n group.path.join(' / '),\n `retained: ${summary.retainedNodeCount}`,\n `culled: ${summary.culledNodeCount}`,\n `inputs: ${summary.inputResources.map(labelResource).join(', ') || '-'}`,\n `outputs: ${summary.outputResources.map(labelResource).join(', ') || '-'}`,\n `transient registered/accessed: ${summary.registeredTransientResourceCount}/${summary.accessedTransientResourceCount}`,\n `physical allocations: ${summary.physicalAllocationCount}`,\n `segments: ${summary.executionSegmentCount}`,\n `opaque: ${summary.externalSubmissionCount}`,\n `Σ GPU work: ${(summary.gpuWorkDurationMicros / 1000).toFixed(3)} ms (${summary.timedNodeCount}/${summary.timingEligibleNodeCount})`,\n ].join('\\n');\n}\n\nfunction createResourceTitle(\n resource: FrameGraphDebugResource,\n snapshot: FrameGraphDebugViewModel,\n accesses: readonly FrameGraphDebugAccessEdge[],\n): string {\n return [\n labelResource(resource),\n `kind: ${resource.kind}`,\n `origin: ${resource.origin}`,\n `registered in: ${debugGroupPathForId(resource.debugGroupId, snapshot)}`,\n `lifetime: ${resource.lifetime ? `${resource.lifetime.firstUse}-${resource.lifetime.lastUse}` : '-'}`,\n `physical: ${resource.physicalResourceId ?? '-'}`,\n `reads: ${accesses.filter((access) => access.mode === 'read').length}`,\n `writes: ${accesses.filter((access) => access.mode === 'write').length}`,\n ].join('\\n');\n}\n\nfunction debugGroupPathForId(groupId: string | undefined, snapshot: FrameGraphDebugViewModel): string {\n if (groupId === undefined) return '-';\n return snapshot.debugGroups.find((group) => group.id === groupId)?.path.join(' / ') ?? `#${groupId}`;\n}\n\nfunction executionSegmentByNodeId(snapshot: FrameGraphDebugViewModel) {\n return new Map(snapshot.executionSegments.flatMap((segment) => segment.nodeIds.map((nodeId) => [nodeId, segment] as const)));\n}\n\nfunction segmentLabel(segment: FrameGraphDebugViewModel['executionSegments'][number] | undefined): string {\n return segment ? `[S${segment.index}]` : '[S-]';\n}\n\nfunction unique<T>(values: readonly T[]): T[] {\n return [...new Set(values)];\n}\n\nfunction indexByOptionalId<T>(\n values: readonly T[],\n getId: (value: T) => string | undefined,\n): ReadonlyMap<string | undefined, readonly T[]> {\n const result = new Map<string | undefined, T[]>();\n for (const value of values) {\n const id = getId(value);\n const indexed = result.get(id) ?? [];\n indexed.push(value);\n result.set(id, indexed);\n }\n return result;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"panelGraphView.d.ts","sourceRoot":"","sources":["../src/panelGraphView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAEvE,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEzE,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAUjE,wBAAgB,eAAe,CAC3B,SAAS,EAAE,cAAc,EACzB,QAAQ,EAAE,wBAAwB,EAClC,QAAQ,EAAE,SAAS,GAAG,SAAS,EAC/B,OAAO,EAAE,SAAS,GAAG,SAAS,EAC9B,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,EACxC,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,KAAK,IAAI,EACnD,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACzC,IAAI,CA6BN;AAED,wBAAgB,iBAAiB,CAC7B,SAAS,EAAE,cAAc,EACzB,QAAQ,EAAE,wBAAwB,GACnC,UAAU,CAeZ;AAED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAExD;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAE3D;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAI5D"}
1
+ {"version":3,"file":"panelGraphView.d.ts","sourceRoot":"","sources":["../src/panelGraphView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAEvE,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEzE,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAUjE,wBAAgB,eAAe,CAC3B,SAAS,EAAE,cAAc,EACzB,QAAQ,EAAE,wBAAwB,EAClC,QAAQ,EAAE,SAAS,GAAG,SAAS,EAC/B,OAAO,EAAE,SAAS,GAAG,SAAS,EAC9B,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,EACxC,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,KAAK,IAAI,EACnD,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACzC,IAAI,CA6BN;AAED,wBAAgB,iBAAiB,CAC7B,SAAS,EAAE,cAAc,EACzB,QAAQ,EAAE,wBAAwB,GACnC,UAAU,CAaZ;AAED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAExD;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAE3D;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAI5D"}
@@ -4,7 +4,7 @@ import { createGraphLegend } from "./panelGraphVisuals.js";
4
4
  const graphSceneCache = new WeakMap();
5
5
  export function renderGraphView(graphView, snapshot, selected, hovered, onSelect, onHover, onToggleGroup) {
6
6
  const scene = resolveGraphScene(graphView, snapshot);
7
- renderGraphLegend(graphView.legend, scene);
7
+ renderGraphLegend(graphView.legend, snapshot);
8
8
  const elementCount = scene.nodes.length + scene.edges.length;
9
9
  const layoutElementBudget = graphView.layoutElementBudget ?? Number.MAX_SAFE_INTEGER;
10
10
  if (elementCount > layoutElementBudget) {
@@ -34,7 +34,6 @@ export function renderGraphView(graphView, snapshot, selected, hovered, onSelect
34
34
  }
35
35
  export function resolveGraphScene(graphView, snapshot) {
36
36
  const optionsKey = JSON.stringify([
37
- graphView.graphMode,
38
37
  graphView.groupsEnabled,
39
38
  [...graphView.expandedGroupPaths].sort(),
40
39
  ]);
@@ -42,7 +41,6 @@ export function resolveGraphScene(graphView, snapshot) {
42
41
  if (cached?.snapshot === snapshot && cached.optionsKey === optionsKey)
43
42
  return cached.scene;
44
43
  const scene = createGraphScene(snapshot, {
45
- mode: graphView.graphMode,
46
44
  groupsEnabled: graphView.groupsEnabled,
47
45
  expandedGroupPaths: graphView.expandedGroupPaths,
48
46
  });
@@ -60,15 +58,28 @@ export function destroyGraph(graphView) {
60
58
  graphView.renderer = undefined;
61
59
  graphSceneCache.delete(graphView);
62
60
  }
63
- function renderGraphLegend(host, scene) {
61
+ function renderGraphLegend(host, snapshot) {
64
62
  if (!host)
65
63
  return;
66
- const entries = createGraphLegend(scene);
67
- const key = entries.map((entry) => entry.key).join('|');
64
+ const entries = createGraphLegend(snapshot);
65
+ const key = JSON.stringify(entries);
68
66
  if (host.dataset.legendKey === key)
69
67
  return;
70
68
  host.dataset.legendKey = key;
71
- host.replaceChildren(...entries.map((entry) => {
69
+ host.replaceChildren();
70
+ let group;
71
+ for (const entry of entries) {
72
+ if (group?.getAttribute('aria-label') !== entry.group) {
73
+ group = document.createElement('span');
74
+ group.className = 'zenfg-inspector-legend-group';
75
+ group.setAttribute('role', 'group');
76
+ group.setAttribute('aria-label', entry.group);
77
+ const heading = document.createElement('span');
78
+ heading.className = 'zenfg-inspector-legend-heading';
79
+ heading.textContent = entry.group;
80
+ group.appendChild(heading);
81
+ host.appendChild(group);
82
+ }
72
83
  const item = document.createElement('span');
73
84
  item.className = 'zenfg-inspector-legend-item';
74
85
  const swatch = document.createElement('span');
@@ -79,10 +90,21 @@ function renderGraphLegend(host, scene) {
79
90
  if (entry.hollowArrow)
80
91
  swatch.dataset.hollowArrow = 'true';
81
92
  swatch.style.setProperty('--zenfg-inspector-legend-color', entry.color);
93
+ if (entry.shape === 'cut-rectangle' || entry.shape === 'tag') {
94
+ const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
95
+ svg.setAttribute('viewBox', '0 0 20 14');
96
+ svg.setAttribute('aria-hidden', 'true');
97
+ const polygon = document.createElementNS('http://www.w3.org/2000/svg', 'polygon');
98
+ polygon.setAttribute('points', entry.shape === 'tag'
99
+ ? '1,1 12,1 19,7 12,13 1,13'
100
+ : '4,1 16,1 19,4 19,10 16,13 4,13 1,10 1,4');
101
+ svg.appendChild(polygon);
102
+ swatch.appendChild(svg);
103
+ }
82
104
  const label = document.createElement('span');
83
105
  label.textContent = entry.label;
84
106
  item.append(swatch, label);
85
- return item;
86
- }));
107
+ group.appendChild(item);
108
+ }
87
109
  }
88
110
  //# sourceMappingURL=panelGraphView.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"panelGraphView.js","sourceRoot":"","sources":["../src/panelGraphView.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FrameGraphDebugViewModel } from './debugCaptureModel.ts';\nimport { CytoscapeGraphRenderer } from './panelCytoscapeGraphRenderer.ts';\nimport { createGraphScene, type GraphScene } from './panelGraphScene.ts';\nimport { createGraphLegend } from './panelGraphVisuals.ts';\nimport type { GraphViewState, Selection } from './panelTypes.ts';\n\ntype GraphSceneCacheEntry = {\n readonly snapshot: FrameGraphDebugViewModel;\n readonly optionsKey: string;\n readonly scene: GraphScene;\n};\n\nconst graphSceneCache = new WeakMap<GraphViewState, GraphSceneCacheEntry>();\n\nexport function renderGraphView(\n graphView: GraphViewState,\n snapshot: FrameGraphDebugViewModel,\n selected: Selection | undefined,\n hovered: Selection | undefined,\n onSelect: (selection: Selection) => void,\n onHover: (selection: Selection | undefined) => void,\n onToggleGroup: (pathKey: string) => void,\n): void {\n const scene = resolveGraphScene(graphView, snapshot);\n renderGraphLegend(graphView.legend, scene);\n\tconst elementCount = scene.nodes.length + scene.edges.length;\n\tconst layoutElementBudget = graphView.layoutElementBudget ?? Number.MAX_SAFE_INTEGER;\n\tif (elementCount > layoutElementBudget) {\n\t\tgraphView.renderer?.destroy();\n\t\tgraphView.renderer = undefined;\n\t\tconst notice = document.createElement('div');\n\t\tnotice.className = 'zenfg-inspector-graph-status';\n\t\tnotice.dataset.state = 'empty';\n\t\tnotice.setAttribute('role', 'status');\n\t\tnotice.textContent = `Automatic layout disabled: ${elementCount} graph elements exceed the ${layoutElementBudget} element budget. Passes, Resources, Memory, Diagnostics, and raw data remain available.`;\n\t\tgraphView.host.replaceChildren(notice);\n\t\treturn;\n\t}\n\tgraphView.renderer ??= new CytoscapeGraphRenderer(graphView.host);\n graphView.renderer.render({\n scene,\n selected,\n hovered,\n fit: graphView.fitOnNextRender,\n anchorElementId: graphView.anchorElementIdOnNextRender,\n onSelect,\n onHover,\n onToggleGroup,\n });\n graphView.fitOnNextRender = false;\n graphView.anchorElementIdOnNextRender = undefined;\n}\n\nexport function resolveGraphScene(\n graphView: GraphViewState,\n snapshot: FrameGraphDebugViewModel,\n): GraphScene {\n const optionsKey = JSON.stringify([\n graphView.graphMode,\n graphView.groupsEnabled,\n [...graphView.expandedGroupPaths].sort(),\n ]);\n const cached = graphSceneCache.get(graphView);\n if (cached?.snapshot === snapshot && cached.optionsKey === optionsKey) return cached.scene;\n const scene = createGraphScene(snapshot, {\n mode: graphView.graphMode,\n groupsEnabled: graphView.groupsEnabled,\n expandedGroupPaths: graphView.expandedGroupPaths,\n });\n graphSceneCache.set(graphView, { snapshot, optionsKey, scene });\n return scene;\n}\n\nexport function fitGraph(graphView: GraphViewState): void {\n graphView.renderer?.fit();\n}\n\nexport function resizeGraph(graphView: GraphViewState): void {\n graphView.renderer?.resize();\n}\n\nexport function destroyGraph(graphView: GraphViewState): void {\n graphView.renderer?.destroy();\n graphView.renderer = undefined;\n graphSceneCache.delete(graphView);\n}\n\nfunction renderGraphLegend(host: HTMLElement | undefined, scene: GraphScene): void {\n if (!host) return;\n const entries = createGraphLegend(scene);\n const key = entries.map((entry) => entry.key).join('|');\n if (host.dataset.legendKey === key) return;\n host.dataset.legendKey = key;\n host.replaceChildren(...entries.map((entry) => {\n const item = document.createElement('span');\n item.className = 'zenfg-inspector-legend-item';\n const swatch = document.createElement('span');\n swatch.className = 'zenfg-inspector-legend-swatch';\n swatch.dataset.shape = entry.shape;\n if (entry.lineStyle) swatch.dataset.lineStyle = entry.lineStyle;\n if (entry.hollowArrow) swatch.dataset.hollowArrow = 'true';\n swatch.style.setProperty('--zenfg-inspector-legend-color', entry.color);\n const label = document.createElement('span');\n label.textContent = entry.label;\n item.append(swatch, label);\n return item;\n }));\n}\n"]}
1
+ {"version":3,"file":"panelGraphView.js","sourceRoot":"","sources":["../src/panelGraphView.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FrameGraphDebugViewModel } from './debugCaptureModel.ts';\nimport { CytoscapeGraphRenderer } from './panelCytoscapeGraphRenderer.ts';\nimport { createGraphScene, type GraphScene } from './panelGraphScene.ts';\nimport { createGraphLegend } from './panelGraphVisuals.ts';\nimport type { GraphViewState, Selection } from './panelTypes.ts';\n\ntype GraphSceneCacheEntry = {\n readonly snapshot: FrameGraphDebugViewModel;\n readonly optionsKey: string;\n readonly scene: GraphScene;\n};\n\nconst graphSceneCache = new WeakMap<GraphViewState, GraphSceneCacheEntry>();\n\nexport function renderGraphView(\n graphView: GraphViewState,\n snapshot: FrameGraphDebugViewModel,\n selected: Selection | undefined,\n hovered: Selection | undefined,\n onSelect: (selection: Selection) => void,\n onHover: (selection: Selection | undefined) => void,\n onToggleGroup: (pathKey: string) => void,\n): void {\n const scene = resolveGraphScene(graphView, snapshot);\n renderGraphLegend(graphView.legend, snapshot);\n\tconst elementCount = scene.nodes.length + scene.edges.length;\n\tconst layoutElementBudget = graphView.layoutElementBudget ?? Number.MAX_SAFE_INTEGER;\n\tif (elementCount > layoutElementBudget) {\n\t\tgraphView.renderer?.destroy();\n\t\tgraphView.renderer = undefined;\n\t\tconst notice = document.createElement('div');\n\t\tnotice.className = 'zenfg-inspector-graph-status';\n\t\tnotice.dataset.state = 'empty';\n\t\tnotice.setAttribute('role', 'status');\n\t\tnotice.textContent = `Automatic layout disabled: ${elementCount} graph elements exceed the ${layoutElementBudget} element budget. Passes, Resources, Memory, Diagnostics, and raw data remain available.`;\n\t\tgraphView.host.replaceChildren(notice);\n\t\treturn;\n\t}\n\tgraphView.renderer ??= new CytoscapeGraphRenderer(graphView.host);\n graphView.renderer.render({\n scene,\n selected,\n hovered,\n fit: graphView.fitOnNextRender,\n anchorElementId: graphView.anchorElementIdOnNextRender,\n onSelect,\n onHover,\n onToggleGroup,\n });\n graphView.fitOnNextRender = false;\n graphView.anchorElementIdOnNextRender = undefined;\n}\n\nexport function resolveGraphScene(\n graphView: GraphViewState,\n snapshot: FrameGraphDebugViewModel,\n): GraphScene {\n const optionsKey = JSON.stringify([\n graphView.groupsEnabled,\n [...graphView.expandedGroupPaths].sort(),\n ]);\n const cached = graphSceneCache.get(graphView);\n if (cached?.snapshot === snapshot && cached.optionsKey === optionsKey) return cached.scene;\n const scene = createGraphScene(snapshot, {\n groupsEnabled: graphView.groupsEnabled,\n expandedGroupPaths: graphView.expandedGroupPaths,\n });\n graphSceneCache.set(graphView, { snapshot, optionsKey, scene });\n return scene;\n}\n\nexport function fitGraph(graphView: GraphViewState): void {\n graphView.renderer?.fit();\n}\n\nexport function resizeGraph(graphView: GraphViewState): void {\n graphView.renderer?.resize();\n}\n\nexport function destroyGraph(graphView: GraphViewState): void {\n graphView.renderer?.destroy();\n graphView.renderer = undefined;\n graphSceneCache.delete(graphView);\n}\n\nfunction renderGraphLegend(host: HTMLElement | undefined, snapshot: FrameGraphDebugViewModel): void {\n if (!host) return;\n const entries = createGraphLegend(snapshot);\n const key = JSON.stringify(entries);\n if (host.dataset.legendKey === key) return;\n host.dataset.legendKey = key;\n host.replaceChildren();\n let group: HTMLElement | undefined;\n for (const entry of entries) {\n if (group?.getAttribute('aria-label') !== entry.group) {\n group = document.createElement('span');\n group.className = 'zenfg-inspector-legend-group';\n group.setAttribute('role', 'group');\n group.setAttribute('aria-label', entry.group);\n const heading = document.createElement('span');\n heading.className = 'zenfg-inspector-legend-heading';\n heading.textContent = entry.group;\n group.appendChild(heading);\n host.appendChild(group);\n }\n const item = document.createElement('span');\n item.className = 'zenfg-inspector-legend-item';\n const swatch = document.createElement('span');\n swatch.className = 'zenfg-inspector-legend-swatch';\n swatch.dataset.shape = entry.shape;\n if (entry.lineStyle) swatch.dataset.lineStyle = entry.lineStyle;\n if (entry.hollowArrow) swatch.dataset.hollowArrow = 'true';\n swatch.style.setProperty('--zenfg-inspector-legend-color', entry.color);\n if (entry.shape === 'cut-rectangle' || entry.shape === 'tag') {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('viewBox', '0 0 20 14');\n svg.setAttribute('aria-hidden', 'true');\n const polygon = document.createElementNS('http://www.w3.org/2000/svg', 'polygon');\n polygon.setAttribute('points', entry.shape === 'tag'\n ? '1,1 12,1 19,7 12,13 1,13'\n : '4,1 16,1 19,4 19,10 16,13 4,13 1,10 1,4');\n svg.appendChild(polygon);\n swatch.appendChild(svg);\n }\n const label = document.createElement('span');\n label.textContent = entry.label;\n item.append(swatch, label);\n group!.appendChild(item);\n }\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import type cytoscape from 'cytoscape';
2
2
  import type { GraphScene, GraphSceneEdge, GraphSceneNode } from './panelGraphScene.ts';
3
+ import { type FrameGraphDebugViewModel } from './debugCaptureModel.ts';
3
4
  export { GRAPH_VISUAL_THEME } from './panelVisualTheme.ts';
4
5
  export declare const GRAPH_GEOMETRY: {
5
6
  readonly fitPadding: 28;
@@ -16,23 +17,26 @@ export declare const GRAPH_GEOMETRY: {
16
17
  readonly left: 24;
17
18
  };
18
19
  readonly edgeCornerRadius: 6;
20
+ readonly outputWidth: 256;
21
+ readonly outputLabelWidth: 144;
19
22
  };
20
23
  export type GraphLegendEntry = {
24
+ readonly group: 'Execution' | 'Resources' | 'Relationships';
21
25
  readonly key: string;
22
26
  readonly label: string;
23
27
  readonly color: string;
24
- readonly shape: 'box' | 'ellipse' | 'group' | 'line';
28
+ readonly shape: 'box' | 'cut-rectangle' | 'tag' | 'ellipse' | 'group' | 'line';
25
29
  readonly lineStyle?: 'solid' | 'dotted' | 'dashed';
26
30
  readonly hollowArrow?: boolean;
27
31
  };
28
- export declare function createGraphLegend(scene: GraphScene): readonly GraphLegendEntry[];
32
+ export declare function createGraphLegend(snapshot: FrameGraphDebugViewModel): readonly GraphLegendEntry[];
29
33
  export declare function createGraphStyles(): cytoscape.StylesheetJson;
30
34
  export declare function nodeDimensions(node: GraphSceneNode): {
31
35
  readonly width: number;
32
36
  readonly height: number;
33
37
  };
34
38
  export declare function graphLayoutGeometryKey(scene: GraphScene): string;
35
- export declare function graphEdgeDisplayLabel(edge: GraphSceneEdge): string;
39
+ export declare function graphEdgeDisplayLabel(_edge: GraphSceneEdge): string;
36
40
  export declare function expandedGroupLabelMaxWidth(outerWidth: number): number;
37
41
  export declare function isOverviewGraphScale(zoom: number): boolean;
38
42
  //# sourceMappingURL=panelGraphVisuals.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"panelGraphVisuals.d.ts","sourceRoot":"","sources":["../src/panelGraphVisuals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,WAAW,CAAC;AAEvC,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAG3D,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;CAUjB,CAAC;AAKX,MAAM,MAAM,gBAAgB,GAAG;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IACrD,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACnD,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;CAClC,CAAC;AAWF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,gBAAgB,EAAE,CA0ChF;AAED,wBAAgB,iBAAiB,IAAI,SAAS,CAAC,cAAc,CAsM5D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAWxG;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAQhE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAElE;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAErE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D"}
1
+ {"version":3,"file":"panelGraphVisuals.d.ts","sourceRoot":"","sources":["../src/panelGraphVisuals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,WAAW,CAAC;AAEvC,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEvF,OAAO,EAAwB,KAAK,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAE7F,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAG3D,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;CAYjB,CAAC;AAKX,MAAM,MAAM,gBAAgB,GAAG;IAC3B,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,eAAe,CAAC;IAC5D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,eAAe,GAAG,KAAK,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IAC/E,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACnD,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;CAClC,CAAC;AAWF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,wBAAwB,GAAG,SAAS,gBAAgB,EAAE,CA6BjG;AAED,wBAAgB,iBAAiB,IAAI,SAAS,CAAC,cAAc,CA2K5D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAWxG;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAQhE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAEnE;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAErE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D"}