+ {[...attachments.entries()]
+ .sort(([a], [b]) => a.localeCompare(b))
+ .map(([key, v]) => {
+ const children = v.sort((a, b) => a.spec.id.localeCompare(b.spec.id));
+
+ return (
+
+
+
+ {children.map(node => (
+
+ ))}
+
+
+ );
+ })}
+
+ );
+}
+
+function ExtensionTooltip(props: { node: AppNode }) {
+ const parts = [];
+ let node = props.node;
+ parts.push(node.spec.id);
+ while (node.edges.attachedTo) {
+ const input = node.edges.attachedTo.input;
+ node = node.edges.attachedTo.node;
+ parts.push(`${node.spec.id} [${input}]`);
+ }
+ parts.reverse();
+
+ return (
+ <>
+ {parts.map(part => (
+