@dxos/app-graph 0.7.4 → 0.7.5-labs.35b4b42

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.
@@ -567,29 +567,33 @@ var Graph = class _Graph {
567
567
  };
568
568
 
569
569
  // packages/sdk/app-graph/src/graph-builder.ts
570
- import { effect as effect2, signal } from "@preact/signals-core";
570
+ import { effect as effect2, signal, untracked as untracked2 } from "@preact/signals-core";
571
571
  import { Trigger as Trigger2 } from "@dxos/async";
572
572
  import { invariant as invariant2 } from "@dxos/invariant";
573
573
  import { create as create2 } from "@dxos/live-object";
574
574
  import { log as log2 } from "@dxos/log";
575
- import { isNode, nonNullable as nonNullable2 } from "@dxos/util";
575
+ import { byPosition, isNode, nonNullable as nonNullable2 } from "@dxos/util";
576
576
  var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/sdk/app-graph/src/graph-builder.ts";
577
+ var NODE_RESOLVER_TIMEOUT = 1e3;
577
578
  var createExtension = (extension) => {
578
- const { id, resolver, connector, actions, actionGroups, ...rest } = extension;
579
+ const { id, position = "static", resolver, connector, actions, actionGroups, ...rest } = extension;
579
580
  const getId = (key) => `${id}/${key}`;
580
581
  return [
581
582
  resolver ? {
582
583
  id: getId("resolver"),
584
+ position,
583
585
  resolver
584
586
  } : void 0,
585
587
  connector ? {
586
588
  ...rest,
587
589
  id: getId("connector"),
590
+ position,
588
591
  connector
589
592
  } : void 0,
590
593
  actionGroups ? {
591
594
  ...rest,
592
595
  id: getId("actionGroups"),
596
+ position,
593
597
  type: ACTION_GROUP_TYPE,
594
598
  relation: "outbound",
595
599
  connector: ({ node }) => actionGroups({
@@ -603,6 +607,7 @@ var createExtension = (extension) => {
603
607
  actions ? {
604
608
  ...rest,
605
609
  id: getId("actions"),
610
+ position,
606
611
  type: ACTION_TYPE,
607
612
  relation: "outbound",
608
613
  connector: ({ node }) => actions({
@@ -627,7 +632,7 @@ var memoize = (fn, key = "result") => {
627
632
  const dispatcher = BuilderInternal.currentDispatcher;
628
633
  invariant2(dispatcher?.currentExtension, "memoize must be called within an extension", {
629
634
  F: __dxlog_file2,
630
- L: 129,
635
+ L: 135,
631
636
  S: void 0,
632
637
  A: [
633
638
  "dispatcher?.currentExtension",
@@ -651,7 +656,7 @@ var cleanup = (fn) => {
651
656
  const dispatcher = BuilderInternal.currentDispatcher;
652
657
  invariant2(dispatcher, "cleanup must be called within an extension", {
653
658
  F: __dxlog_file2,
654
- L: 144,
659
+ L: 150,
655
660
  S: void 0,
656
661
  A: [
657
662
  "dispatcher",
@@ -673,6 +678,19 @@ var toSignal = (subscribe, get, key) => {
673
678
  });
674
679
  return thisSignal.value;
675
680
  };
681
+ var flattenExtensions = (extension, acc = []) => {
682
+ if (Array.isArray(extension)) {
683
+ return [
684
+ ...acc,
685
+ ...extension.flatMap((ext) => flattenExtensions(ext, acc))
686
+ ];
687
+ } else {
688
+ return [
689
+ ...acc,
690
+ extension
691
+ ];
692
+ }
693
+ };
676
694
  var GraphBuilder = class _GraphBuilder {
677
695
  constructor(params = {}) {
678
696
  this._dispatcher = new Dispatcher();
@@ -706,28 +724,55 @@ var GraphBuilder = class _GraphBuilder {
706
724
  async initialize() {
707
725
  Object.keys(this._graph._nodes).filter((id) => id !== ROOT_ID).forEach((id) => this._initialized[id] = new Trigger2());
708
726
  Object.keys(this._graph._nodes).forEach((id) => this._onInitialNode(id));
709
- await Promise.all(Object.values(this._initialized).map((trigger) => trigger.wait()));
727
+ await Promise.all(Object.entries(this._initialized).map(async ([id, trigger]) => {
728
+ try {
729
+ await trigger.wait({
730
+ timeout: NODE_RESOLVER_TIMEOUT
731
+ });
732
+ } catch {
733
+ log2.error("node resolver timeout", {
734
+ id
735
+ }, {
736
+ F: __dxlog_file2,
737
+ L: 244,
738
+ S: this,
739
+ C: (f, a) => f(...a)
740
+ });
741
+ this.graph._removeNodes([
742
+ id
743
+ ]);
744
+ }
745
+ }));
710
746
  }
711
747
  get graph() {
712
748
  return this._graph;
713
749
  }
714
750
  /**
751
+ * @reactive
752
+ */
753
+ get extensions() {
754
+ return Object.values(this._extensions);
755
+ }
756
+ /**
715
757
  * Register a node builder which will be called in order to construct the graph.
716
758
  */
717
759
  addExtension(extension) {
718
- if (Array.isArray(extension)) {
719
- extension.forEach((ext) => this.addExtension(ext));
720
- return this;
721
- }
722
- this._dispatcher.state[extension.id] = [];
723
- this._extensions[extension.id] = extension;
760
+ const extensions = flattenExtensions(extension);
761
+ untracked2(() => {
762
+ extensions.forEach((extension2) => {
763
+ this._dispatcher.state[extension2.id] = [];
764
+ this._extensions[extension2.id] = extension2;
765
+ });
766
+ });
724
767
  return this;
725
768
  }
726
769
  /**
727
770
  * Remove a node builder from the graph builder.
728
771
  */
729
772
  removeExtension(id) {
730
- delete this._extensions[id];
773
+ untracked2(() => {
774
+ delete this._extensions[id];
775
+ });
731
776
  return this;
732
777
  }
733
778
  destroy() {
@@ -783,7 +828,8 @@ var GraphBuilder = class _GraphBuilder {
783
828
  _onInitialNode(nodeId) {
784
829
  this._nodeChanged[nodeId] = this._nodeChanged[nodeId] ?? signal({});
785
830
  this._resolverSubscriptions.set(nodeId, effect2(() => {
786
- for (const { id, resolver } of Object.values(this._extensions)) {
831
+ const extensions = Object.values(this._extensions).toSorted(byPosition);
832
+ for (const { id, resolver } of extensions) {
787
833
  if (!resolver) {
788
834
  continue;
789
835
  }
@@ -800,13 +846,13 @@ var GraphBuilder = class _GraphBuilder {
800
846
  extension: id
801
847
  }, {
802
848
  F: __dxlog_file2,
803
- L: 325,
849
+ L: 359,
804
850
  S: this,
805
851
  C: (f, a) => f(...a)
806
852
  });
807
853
  log2.error(`Previous error occurred in extension: ${id}`, void 0, {
808
854
  F: __dxlog_file2,
809
- L: 326,
855
+ L: 360,
810
856
  S: this,
811
857
  C: (f, a) => f(...a)
812
858
  });
@@ -845,7 +891,8 @@ var GraphBuilder = class _GraphBuilder {
845
891
  Object.keys(this._extensions);
846
892
  this._nodeChanged[node.id].value;
847
893
  const nodes = [];
848
- for (const { id, connector, filter, type, relation = "outbound" } of Object.values(this._extensions)) {
894
+ const extensions = Object.values(this._extensions).toSorted(byPosition);
895
+ for (const { id, connector, filter, type, relation = "outbound" } of extensions) {
849
896
  if (!connector || relation !== nodesRelation || nodesType && type !== nodesType || filter && !filter(node)) {
850
897
  continue;
851
898
  }
@@ -861,13 +908,13 @@ var GraphBuilder = class _GraphBuilder {
861
908
  extension: id
862
909
  }, {
863
910
  F: __dxlog_file2,
864
- L: 386,
911
+ L: 421,
865
912
  S: this,
866
913
  C: (f, a) => f(...a)
867
914
  });
868
915
  log2.error(`Previous error occurred in extension: ${id}`, void 0, {
869
916
  F: __dxlog_file2,
870
- L: 387,
917
+ L: 422,
871
918
  S: this,
872
919
  C: (f, a) => f(...a)
873
920
  });
@@ -915,6 +962,7 @@ export {
915
962
  actionGroupSymbol,
916
963
  cleanup,
917
964
  createExtension,
965
+ flattenExtensions,
918
966
  getGraph,
919
967
  isAction,
920
968
  isActionGroup,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/graph.ts", "../../../src/node.ts", "../../../src/graph-builder.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { batch, effect, untracked } from '@preact/signals-core';\n\nimport { asyncTimeout, Trigger } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport { type ReactiveObject, create } from '@dxos/live-object';\nimport { log } from '@dxos/log';\nimport { type MakeOptional, nonNullable, pick } from '@dxos/util';\n\nimport { type Node, type NodeArg, type NodeFilter, type Relation, actionGroupSymbol, isActionLike } from './node';\n\nconst graphSymbol = Symbol('graph');\ntype DeepWriteable<T> = { -readonly [K in keyof T]: DeepWriteable<T[K]> };\ntype NodeInternal = DeepWriteable<Node> & { [graphSymbol]: Graph };\n\nexport const getGraph = (node: Node): Graph => {\n const graph = (node as NodeInternal)[graphSymbol];\n invariant(graph, 'Node is not associated with a graph.');\n return graph;\n};\n\nexport const ROOT_ID = 'root';\nexport const ROOT_TYPE = 'dxos.org/type/GraphRoot';\nexport const ACTION_TYPE = 'dxos.org/type/GraphAction';\nexport const ACTION_GROUP_TYPE = 'dxos.org/type/GraphActionGroup';\n\nexport type NodesOptions<T = any, U extends Record<string, any> = Record<string, any>> = {\n relation?: Relation;\n filter?: NodeFilter<T, U>;\n expansion?: boolean;\n type?: string;\n};\n\n// TODO(wittjosiah): Consider having default be undefined. This is current default for backwards compatibility.\nconst DEFAULT_FILTER = (node: Node) => untracked(() => !isActionLike(node));\n\nexport type GraphTraversalOptions = {\n /**\n * A callback which is called for each node visited during traversal.\n *\n * If the callback returns `false`, traversal is stops recursing.\n */\n visitor: (node: Node, path: string[]) => boolean | void;\n\n /**\n * The node to start traversing from.\n *\n * @default root\n */\n node?: Node;\n\n /**\n * The relation to traverse graph edges.\n *\n * @default 'outbound'\n */\n relation?: Relation;\n\n /**\n * Allow traversal to trigger expansion of the graph via `onInitialNodes`.\n */\n expansion?: boolean;\n};\n\nexport type GraphParams = {\n nodes?: MakeOptional<Node, 'data' | 'cacheable'>[];\n edges?: Record<string, string[]>;\n onInitialNode?: Graph['_onInitialNode'];\n onInitialNodes?: Graph['_onInitialNodes'];\n onRemoveNode?: Graph['_onRemoveNode'];\n};\n\n/**\n * The Graph represents the structure of the application constructed via plugins.\n */\nexport class Graph {\n private readonly _onInitialNode?: (id: string) => Promise<void>;\n private readonly _onInitialNodes?: (node: Node, relation: Relation, type?: string) => Promise<void>;\n private readonly _onRemoveNode?: (id: string) => Promise<void>;\n\n private readonly _waitingForNodes: Record<string, Trigger<Node>> = {};\n private readonly _initialized: Record<string, boolean> = {};\n\n /**\n * @internal\n */\n readonly _nodes: Record<string, ReactiveObject<NodeInternal>> = {};\n\n /**\n * @internal\n */\n readonly _edges: Record<string, ReactiveObject<{ inbound: string[]; outbound: string[] }>> = {};\n\n constructor({ nodes, edges, onInitialNode, onInitialNodes, onRemoveNode }: GraphParams = {}) {\n this._onInitialNode = onInitialNode;\n this._onInitialNodes = onInitialNodes;\n this._onRemoveNode = onRemoveNode;\n\n this._nodes[ROOT_ID] = this._constructNode({\n id: ROOT_ID,\n type: ROOT_TYPE,\n cacheable: [],\n properties: {},\n data: null,\n });\n if (nodes) {\n nodes.forEach((node) => {\n const cacheable = Object.keys(node.properties ?? {});\n if (node.type === ACTION_TYPE) {\n this._addNode({ cacheable, data: () => log.warn('Pickled action invocation'), ...node });\n } else if (node.type === ACTION_GROUP_TYPE) {\n this._addNode({ cacheable, data: actionGroupSymbol, ...node });\n } else {\n this._addNode({ cacheable, ...node });\n }\n });\n }\n\n this._edges[ROOT_ID] = create({ inbound: [], outbound: [] });\n if (edges) {\n Object.entries(edges).forEach(([source, edges]) => {\n edges.forEach((target) => {\n this._addEdge({ source, target });\n });\n this._sortEdges(source, 'outbound', edges);\n });\n }\n }\n\n static from(pickle: string, options: Omit<GraphParams, 'nodes' | 'edges'> = {}) {\n const { nodes, edges } = JSON.parse(pickle);\n return new Graph({ nodes, edges, ...options });\n }\n\n /**\n * Alias for `findNode('root')`.\n */\n get root() {\n return this.findNode(ROOT_ID)!;\n }\n\n /**\n * Convert the graph to a JSON object.\n */\n toJSON({ id = ROOT_ID, maxLength = 32 }: { id?: string; maxLength?: number } = {}) {\n const toJSON = (node: Node, seen: string[] = []): any => {\n const nodes = this.nodes(node);\n const obj: Record<string, any> = {\n id: node.id.length > maxLength ? `${node.id.slice(0, maxLength - 3)}...` : node.id,\n type: node.type,\n };\n if (node.properties.label) {\n obj.label = node.properties.label;\n }\n if (nodes.length) {\n obj.nodes = nodes\n .map((n) => {\n // Break cycles.\n const nextSeen = [...seen, node.id];\n return nextSeen.includes(n.id) ? undefined : toJSON(n, nextSeen);\n })\n .filter(nonNullable);\n }\n return obj;\n };\n\n const root = this.findNode(id);\n invariant(root, `Node not found: ${id}`);\n return toJSON(root);\n }\n\n pickle() {\n const nodes = Object.values(this._nodes)\n .filter((node) => !!node.cacheable)\n .map((node) => {\n return {\n id: node.id,\n type: node.type,\n properties: pick(node.properties, node.cacheable!),\n };\n });\n\n const cacheable = new Set(nodes.map((node) => node.id));\n\n const edges = Object.fromEntries(\n Object.entries(this._edges)\n .filter(([id]) => cacheable.has(id))\n .map(([id, { outbound }]): [string, string[]] => [id, outbound.filter((nodeId) => cacheable.has(nodeId))])\n // TODO(wittjosiah): Why sort?\n .toSorted(([a], [b]) => a.localeCompare(b)),\n );\n\n return JSON.stringify({ nodes, edges });\n }\n\n /**\n * Find the node with the given id in the graph.\n *\n * If a node is not found within the graph and an `onInitialNode` callback is provided,\n * it is called with the id and type of the node, potentially initializing the node.\n */\n findNode(id: string, expansion = true): Node | undefined {\n const existingNode = this._nodes[id];\n if (!existingNode && expansion) {\n void this._onInitialNode?.(id);\n }\n\n return existingNode;\n }\n\n /**\n * Wait for a node to be added to the graph.\n *\n * If the node is already present in the graph, the promise resolves immediately.\n *\n * @param id The id of the node to wait for.\n * @param timeout The time in milliseconds to wait for the node to be added.\n */\n async waitForNode(id: string, timeout?: number): Promise<Node> {\n const trigger = this._waitingForNodes[id] ?? (this._waitingForNodes[id] = new Trigger<Node>());\n const node = this.findNode(id);\n if (node) {\n delete this._waitingForNodes[id];\n return node;\n }\n\n if (timeout === undefined) {\n return trigger.wait();\n } else {\n return asyncTimeout(trigger.wait(), timeout, `Node not found: ${id}`);\n }\n }\n\n /**\n * Nodes that this node is connected to in default order.\n */\n nodes<T = any, U extends Record<string, any> = Record<string, any>>(node: Node, options: NodesOptions<T, U> = {}) {\n const { relation, expansion, filter = DEFAULT_FILTER, type } = options;\n const nodes = this._getNodes({ node, relation, expansion, type });\n return nodes.filter((n) => filter(n, node));\n }\n\n /**\n * Edges that this node is connected to in default order.\n */\n edges(node: Node, { relation = 'outbound' }: { relation?: Relation } = {}) {\n return this._edges[node.id]?.[relation] ?? [];\n }\n\n /**\n * Actions or action groups that this node is connected to in default order.\n */\n actions(node: Node, { expansion }: { expansion?: boolean } = {}) {\n return [\n ...this._getNodes({ node, expansion, type: ACTION_GROUP_TYPE }),\n ...this._getNodes({ node, expansion, type: ACTION_TYPE }),\n ];\n }\n\n async expand(node: Node, relation: Relation = 'outbound', type?: string) {\n const key = this._key(node, relation, type);\n const initialized = this._initialized[key];\n if (!initialized && this._onInitialNodes) {\n await this._onInitialNodes(node, relation, type);\n this._initialized[key] = true;\n }\n }\n\n private _key(node: Node, relation: Relation, type?: string) {\n return `${node.id}-${relation}-${type}`;\n }\n\n /**\n * Recursive depth-first traversal of the graph.\n *\n * @param options.node The node to start traversing from.\n * @param options.relation The relation to traverse graph edges.\n * @param options.visitor A callback which is called for each node visited during traversal.\n */\n traverse(\n { visitor, node = this.root, relation = 'outbound', expansion }: GraphTraversalOptions,\n path: string[] = [],\n ): void {\n // Break cycles.\n if (path.includes(node.id)) {\n return;\n }\n\n const shouldContinue = visitor(node, [...path, node.id]);\n if (shouldContinue === false) {\n return;\n }\n\n Object.values(this._getNodes({ node, relation, expansion })).forEach((child) =>\n this.traverse({ node: child, relation, visitor, expansion }, [...path, node.id]),\n );\n }\n\n /**\n * Recursive depth-first traversal of the graph wrapping each visitor call in an effect.\n *\n * @param options.node The node to start traversing from.\n * @param options.relation The relation to traverse graph edges.\n * @param options.visitor A callback which is called for each node visited during traversal.\n */\n subscribeTraverse(\n { visitor, node = this.root, relation = 'outbound', expansion }: GraphTraversalOptions,\n currentPath: string[] = [],\n ) {\n return effect(() => {\n const path = [...currentPath, node.id];\n const result = visitor(node, path);\n if (result === false) {\n return;\n }\n\n const nodes = this._getNodes({ node, relation, expansion });\n const nodeSubscriptions = nodes.map((n) => this.subscribeTraverse({ node: n, visitor, expansion }, path));\n\n return () => {\n nodeSubscriptions.forEach((unsubscribe) => unsubscribe());\n };\n });\n }\n\n /**\n * Get the path between two nodes in the graph.\n */\n getPath({ source = 'root', target }: { source?: string; target: string }): string[] | undefined {\n const start = this.findNode(source);\n if (!start) {\n return undefined;\n }\n\n let found: string[] | undefined;\n this.traverse({\n node: start,\n visitor: (node, path) => {\n if (found) {\n return false;\n }\n\n if (node.id === target) {\n found = path;\n }\n },\n });\n\n return found;\n }\n\n /**\n * Wait for the path between two nodes in the graph to be established.\n */\n async waitForPath(\n params: { source?: string; target: string },\n { timeout = 5_000, interval = 500 }: { timeout?: number; interval?: number } = {},\n ) {\n const path = this.getPath(params);\n if (path) {\n return path;\n }\n\n const trigger = new Trigger<string[]>();\n const i = setInterval(() => {\n const path = this.getPath(params);\n if (path) {\n trigger.wake(path);\n }\n }, interval);\n\n return trigger.wait({ timeout }).finally(() => clearInterval(i));\n }\n\n /**\n * Add nodes to the graph.\n *\n * @internal\n */\n _addNodes<TData = null, TProperties extends Record<string, any> = Record<string, any>>(\n nodes: NodeArg<TData, TProperties>[],\n ): Node<TData, TProperties>[] {\n return batch(() => nodes.map((node) => this._addNode(node)));\n }\n\n private _addNode<TData, TProperties extends Record<string, any> = Record<string, any>>({\n nodes,\n edges,\n ..._node\n }: NodeArg<TData, TProperties>): Node<TData, TProperties> {\n return untracked(() => {\n const existingNode = this._nodes[_node.id];\n const node = existingNode ?? this._constructNode({ data: null, properties: {}, ..._node });\n if (existingNode) {\n const { data, properties, type } = _node;\n if (data && data !== node.data) {\n node.data = data;\n }\n\n if (type !== node.type) {\n node.type = type;\n }\n\n for (const key in properties) {\n if (properties[key] !== node.properties[key]) {\n node.properties[key] = properties[key];\n }\n }\n } else {\n this._nodes[node.id] = node;\n this._edges[node.id] = create({ inbound: [], outbound: [] });\n }\n\n const trigger = this._waitingForNodes[node.id];\n if (trigger) {\n trigger.wake(node);\n delete this._waitingForNodes[node.id];\n }\n\n if (nodes) {\n nodes.forEach((subNode) => {\n this._addNode(subNode);\n this._addEdge({ source: node.id, target: subNode.id });\n });\n }\n\n if (edges) {\n edges.forEach(([id, relation]) =>\n relation === 'outbound'\n ? this._addEdge({ source: node.id, target: id })\n : this._addEdge({ source: id, target: node.id }),\n );\n }\n\n return node as unknown as Node<TData, TProperties>;\n });\n }\n\n /**\n * Remove nodes from the graph.\n *\n * @param ids The id of the node to remove.\n * @param edges Whether to remove edges connected to the node from the graph as well.\n * @internal\n */\n _removeNodes(ids: string[], edges = false) {\n batch(() => ids.forEach((id) => this._removeNode(id, edges)));\n }\n\n private _removeNode(id: string, edges = false) {\n untracked(() => {\n const node = this.findNode(id, false);\n if (!node) {\n return;\n }\n\n if (edges) {\n // Remove edges from connected nodes.\n this._getNodes({ node }).forEach((node) => {\n this._removeEdge({ source: id, target: node.id });\n });\n this._getNodes({ node, relation: 'inbound' }).forEach((node) => {\n this._removeEdge({ source: node.id, target: id });\n });\n\n // Remove edges from node.\n delete this._edges[id];\n }\n\n // Remove node.\n delete this._nodes[id];\n Object.keys(this._initialized)\n .filter((key) => key.startsWith(id))\n .forEach((key) => {\n delete this._initialized[key];\n });\n void this._onRemoveNode?.(id);\n });\n }\n\n /**\n * Add edges to the graph.\n *\n * @internal\n */\n _addEdges(edges: { source: string; target: string }[]) {\n batch(() => edges.forEach((edge) => this._addEdge(edge)));\n }\n\n private _addEdge({ source, target }: { source: string; target: string }) {\n untracked(() => {\n if (!this._edges[source]) {\n this._edges[source] = create({ inbound: [], outbound: [] });\n }\n if (!this._edges[target]) {\n this._edges[target] = create({ inbound: [], outbound: [] });\n }\n\n const sourceEdges = this._edges[source];\n if (!sourceEdges.outbound.includes(target)) {\n sourceEdges.outbound.push(target);\n }\n\n const targetEdges = this._edges[target];\n if (!targetEdges.inbound.includes(source)) {\n targetEdges.inbound.push(source);\n }\n });\n }\n\n /**\n * Remove edges from the graph.\n * @internal\n */\n _removeEdges(edges: { source: string; target: string }[], removeOrphans = false) {\n batch(() => edges.forEach((edge) => this._removeEdge(edge, removeOrphans)));\n }\n\n private _removeEdge({ source, target }: { source: string; target: string }, removeOrphans = false) {\n untracked(() => {\n batch(() => {\n const outboundIndex = this._edges[source]?.outbound.findIndex((id) => id === target);\n if (outboundIndex !== undefined && outboundIndex !== -1) {\n this._edges[source].outbound.splice(outboundIndex, 1);\n }\n\n const inboundIndex = this._edges[target]?.inbound.findIndex((id) => id === source);\n if (inboundIndex !== undefined && inboundIndex !== -1) {\n this._edges[target].inbound.splice(inboundIndex, 1);\n }\n\n if (removeOrphans) {\n if (\n this._edges[source]?.outbound.length === 0 &&\n this._edges[source]?.inbound.length === 0 &&\n source !== ROOT_ID\n ) {\n this._removeNode(source, true);\n }\n if (\n this._edges[target]?.outbound.length === 0 &&\n this._edges[target]?.inbound.length === 0 &&\n target !== ROOT_ID\n ) {\n this._removeNode(target, true);\n }\n }\n });\n });\n }\n\n /**\n * Sort edges for a node.\n *\n * Edges not included in the sorted list are appended to the end of the list.\n *\n * @param nodeId The id of the node to sort edges for.\n * @param relation The relation of the edges from the node to sort.\n * @param edges The ordered list of edges.\n * @ignore\n */\n _sortEdges(nodeId: string, relation: Relation, edges: string[]) {\n untracked(() => {\n batch(() => {\n const current = this._edges[nodeId];\n if (current) {\n const unsorted = current[relation].filter((id) => !edges.includes(id)) ?? [];\n const sorted = edges.filter((id) => current[relation].includes(id)) ?? [];\n current[relation].splice(0, current[relation].length, ...[...sorted, ...unsorted]);\n }\n });\n });\n }\n\n private _constructNode = (node: Omit<Node, typeof graphSymbol>) => {\n return create<NodeInternal>({ ...node, [graphSymbol]: this });\n };\n\n private _getNodes({\n node,\n relation = 'outbound',\n type,\n expansion,\n }: {\n node: Node;\n relation?: Relation;\n type?: string;\n expansion?: boolean;\n }): Node[] {\n if (expansion) {\n void this.expand(node, relation, type);\n }\n\n const edges = this._edges[node.id];\n if (!edges) {\n return [];\n } else {\n return edges[relation]\n .map((id) => this._nodes[id])\n .filter(nonNullable)\n .filter((n) => !type || n.type === type);\n }\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type MaybePromise, type MakeOptional } from '@dxos/util';\n\n/**\n * Represents a node in the graph.\n */\n// TODO(wittjosiah): Use Effect Schema.\n// TODO(burdon): Rename GraphNode. Node is already in the global namespace.\nexport type Node<TData = any, TProperties extends Record<string, any> = Record<string, any>> = Readonly<{\n /**\n * Globally unique ID.\n */\n id: string;\n\n /**\n * Typename of the data the node represents.\n */\n type: string;\n\n /**\n * Keys in of the properties which should be cached.\n * If defined, the node will be included in the cache.\n * If undefined, the node will not be included in the cache.\n */\n cacheable?: string[];\n\n /**\n * Properties of the node relevant to displaying the node.\n */\n properties: Readonly<TProperties>;\n\n /**\n * Data the node represents.\n */\n // TODO(burdon): Type system (e.g., minimally provide identifier string vs. TypedObject vs. Graph mixin type system)?\n // type field would prevent convoluted sniffing of object properties. And allow direct pass-through for ECHO TypedObjects.\n data: TData;\n}>;\n\nexport type NodeFilter<T = any, U extends Record<string, any> = Record<string, any>> = (\n node: Node<unknown, Record<string, any>>,\n connectedNode: Node,\n) => node is Node<T, U>;\n\nexport type Relation = 'outbound' | 'inbound';\n\nexport const isGraphNode = (data: unknown): data is Node =>\n data && typeof data === 'object' && 'id' in data && 'properties' in data && data.properties\n ? typeof data.properties === 'object' && 'data' in data\n : false;\n\nexport type NodeArg<TData, TProperties extends Record<string, any> = Record<string, any>> = MakeOptional<\n Node<TData, TProperties>,\n 'data' | 'properties' | 'cacheable'\n> & {\n /** Will automatically add nodes with an edge from this node to each. */\n nodes?: NodeArg<unknown>[];\n\n /** Will automatically add specified edges. */\n edges?: [string, Relation][];\n};\n\n//\n// Actions\n//\n\nexport type InvokeParams = {\n /** Node the invoked action is connected to. */\n node: Node;\n\n caller?: string;\n};\n\nexport type ActionData = (params: InvokeParams) => MaybePromise<void>;\n\nexport type Action<TProperties extends Record<string, any> = Record<string, any>> = Readonly<\n Omit<Node<ActionData, TProperties>, 'properties'> & {\n properties: Readonly<TProperties>;\n }\n>;\n\nexport const isAction = (data: unknown): data is Action =>\n isGraphNode(data) ? typeof data.data === 'function' : false;\n\nexport const actionGroupSymbol = Symbol('ActionGroup');\n\nexport type ActionGroup = Readonly<\n Omit<Node<typeof actionGroupSymbol, Record<string, any>>, 'properties'> & {\n properties: Readonly<Record<string, any>>;\n }\n>;\n\nexport const isActionGroup = (data: unknown): data is ActionGroup =>\n isGraphNode(data) ? data.data === actionGroupSymbol : false;\n\nexport type ActionLike = Action | ActionGroup;\n\nexport const isActionLike = (data: unknown): data is Action | ActionGroup => isAction(data) || isActionGroup(data);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { effect, type Signal, signal } from '@preact/signals-core';\n\nimport { Trigger, type UnsubscribeCallback } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport { create } from '@dxos/live-object';\nimport { log } from '@dxos/log';\nimport { isNode, type MaybePromise, nonNullable } from '@dxos/util';\n\nimport { ACTION_GROUP_TYPE, ACTION_TYPE, Graph, ROOT_ID, type GraphParams } from './graph';\nimport { type ActionData, actionGroupSymbol, type Node, type NodeArg, type Relation } from './node';\n\n/**\n * Graph builder extension for adding nodes to the graph based on just the node id.\n * This is useful for creating the first node in a graph or for hydrating cached nodes with data.\n *\n * @param params.id The id of the node to resolve.\n */\nexport type ResolverExtension = (params: { id: string }) => NodeArg<any> | false | undefined;\n\n/**\n * Graph builder extension for adding nodes to the graph based on a connection to an existing node.\n *\n * @param params.node The existing node the returned nodes will be connected to.\n */\nexport type ConnectorExtension<T = any> = (params: { node: Node<T> }) => NodeArg<any>[] | undefined;\n\n/**\n * Constrained case of the connector extension for more easily adding actions to the graph.\n */\nexport type ActionsExtension<T = any> = (params: {\n node: Node<T>;\n}) => Omit<NodeArg<ActionData>, 'type' | 'nodes' | 'edges'>[] | undefined;\n\n/**\n * Constrained case of the connector extension for more easily adding action groups to the graph.\n */\nexport type ActionGroupsExtension<T = any> = (params: {\n node: Node<T>;\n}) => Omit<NodeArg<typeof actionGroupSymbol>, 'type' | 'data' | 'nodes' | 'edges'>[] | undefined;\n\ntype GuardedNodeType<T> = T extends (value: any) => value is infer N ? (N extends Node<infer D> ? D : unknown) : never;\n\n/**\n * A graph builder extension is used to add nodes to the graph.\n *\n * @param params.id The unique id of the extension.\n * @param params.relation The relation the graph is being expanded from the existing node.\n * @param params.type If provided, all nodes returned are expected to have this type.\n * @param params.filter A filter function to determine if an extension should act on a node.\n * @param params.resolver A function to add nodes to the graph based on just the node id.\n * @param params.connector A function to add nodes to the graph based on a connection to an existing node.\n * @param params.actions A function to add actions to the graph based on a connection to an existing node.\n * @param params.actionGroups A function to add action groups to the graph based on a connection to an existing node.\n */\nexport type CreateExtensionOptions<T = any> = {\n id: string;\n relation?: Relation;\n type?: string;\n filter?: (node: Node) => node is Node<T>;\n resolver?: ResolverExtension;\n connector?: ConnectorExtension<GuardedNodeType<CreateExtensionOptions<T>['filter']>>;\n actions?: ActionsExtension<GuardedNodeType<CreateExtensionOptions<T>['filter']>>;\n actionGroups?: ActionGroupsExtension<GuardedNodeType<CreateExtensionOptions<T>['filter']>>;\n};\n\n/**\n * Create a graph builder extension.\n */\nexport const createExtension = <T = any>(extension: CreateExtensionOptions<T>): BuilderExtension[] => {\n const { id, resolver, connector, actions, actionGroups, ...rest } = extension;\n const getId = (key: string) => `${id}/${key}`;\n return [\n resolver ? { id: getId('resolver'), resolver } : undefined,\n connector ? { ...rest, id: getId('connector'), connector } : undefined,\n actionGroups\n ? ({\n ...rest,\n id: getId('actionGroups'),\n type: ACTION_GROUP_TYPE,\n relation: 'outbound',\n connector: ({ node }) =>\n actionGroups({ node })?.map((arg) => ({ ...arg, data: actionGroupSymbol, type: ACTION_GROUP_TYPE })),\n } satisfies BuilderExtension)\n : undefined,\n actions\n ? ({\n ...rest,\n id: getId('actions'),\n type: ACTION_TYPE,\n relation: 'outbound',\n connector: ({ node }) => actions({ node })?.map((arg) => ({ ...arg, type: ACTION_TYPE })),\n } satisfies BuilderExtension)\n : undefined,\n ].filter(nonNullable);\n};\n\nexport type GraphBuilderTraverseOptions = {\n visitor: (node: Node, path: string[]) => MaybePromise<boolean | void>;\n node?: Node;\n relation?: Relation;\n};\n\n/**\n * The dispatcher is used to keep track of the current extension and state when memoizing functions.\n */\nclass Dispatcher {\n currentExtension?: string;\n stateIndex = 0;\n state: Record<string, any[]> = {};\n cleanup: (() => void)[] = [];\n}\n\nclass BuilderInternal {\n // This must be static to avoid passing the dispatcher instance to every memoized function.\n // If the dispatcher is not set that means that the memoized function is being called outside of the graph builder.\n static currentDispatcher?: Dispatcher;\n}\n\n/**\n * Allows code to be memoized within the context of a graph builder extension.\n * This is useful for creating instances which should be subscribed to rather than recreated.\n */\nexport const memoize = <T>(fn: () => T, key = 'result'): T => {\n const dispatcher = BuilderInternal.currentDispatcher;\n invariant(dispatcher?.currentExtension, 'memoize must be called within an extension');\n const all = dispatcher.state[dispatcher.currentExtension][dispatcher.stateIndex] ?? {};\n const current = all[key];\n const result = current ? current.result : fn();\n dispatcher.state[dispatcher.currentExtension][dispatcher.stateIndex] = { ...all, [key]: { result } };\n dispatcher.stateIndex++;\n return result;\n};\n\n/**\n * Register a cleanup function to be called when the graph builder is destroyed.\n */\nexport const cleanup = (fn: () => void): void => {\n memoize(() => {\n const dispatcher = BuilderInternal.currentDispatcher;\n invariant(dispatcher, 'cleanup must be called within an extension');\n dispatcher.cleanup.push(fn);\n });\n};\n\n/**\n * Convert a subscribe/get pair into a signal.\n */\nexport const toSignal = <T>(\n subscribe: (onChange: () => void) => () => void,\n get: () => T | undefined,\n key?: string,\n) => {\n const thisSignal = memoize(() => {\n return signal(get());\n }, key);\n const unsubscribe = memoize(() => {\n return subscribe(() => (thisSignal.value = get()));\n }, key);\n cleanup(() => {\n unsubscribe();\n });\n return thisSignal.value;\n};\n\nexport type BuilderExtension = {\n id: string;\n resolver?: ResolverExtension;\n connector?: ConnectorExtension;\n // Only for connector.\n relation?: Relation;\n type?: string;\n filter?: (node: Node) => boolean;\n};\n\ntype ExtensionArg = BuilderExtension | BuilderExtension[] | ExtensionArg[];\n\n/**\n * The builder provides an extensible way to compose the construction of the graph.\n */\n// TODO(wittjosiah): Add api for setting subscription set and/or radius.\n// Should unsubscribe from nodes that are not in the set/radius.\n// Should track LRU nodes that are not in the set/radius and remove them beyond a certain threshold.\nexport class GraphBuilder {\n private readonly _dispatcher = new Dispatcher();\n private readonly _extensions = create<Record<string, BuilderExtension>>({});\n private readonly _resolverSubscriptions = new Map<string, UnsubscribeCallback>();\n private readonly _connectorSubscriptions = new Map<string, UnsubscribeCallback>();\n private readonly _nodeChanged: Record<string, Signal<{}>> = {};\n private readonly _initialized: Record<string, Trigger> = {};\n private _graph: Graph;\n\n constructor(params: Pick<GraphParams, 'nodes' | 'edges'> = {}) {\n this._graph = new Graph({\n ...params,\n onInitialNode: async (id) => this._onInitialNode(id),\n onInitialNodes: async (node, relation, type) => this._onInitialNodes(node, relation, type),\n onRemoveNode: (id) => this._onRemoveNode(id),\n });\n }\n\n static from(pickle?: string) {\n if (!pickle) {\n return new GraphBuilder();\n }\n\n const { nodes, edges } = JSON.parse(pickle);\n return new GraphBuilder({ nodes, edges });\n }\n\n /**\n * If graph is being restored from a pickle, the data will be null.\n * Initialize the data of each node by calling resolvers.\n * Wait until all of the initial nodes have resolved.\n */\n async initialize() {\n Object.keys(this._graph._nodes)\n .filter((id) => id !== ROOT_ID)\n .forEach((id) => (this._initialized[id] = new Trigger()));\n Object.keys(this._graph._nodes).forEach((id) => this._onInitialNode(id));\n await Promise.all(Object.values(this._initialized).map((trigger) => trigger.wait()));\n }\n\n get graph() {\n return this._graph;\n }\n\n /**\n * Register a node builder which will be called in order to construct the graph.\n */\n addExtension(extension: ExtensionArg): GraphBuilder {\n if (Array.isArray(extension)) {\n extension.forEach((ext) => this.addExtension(ext));\n return this;\n }\n\n this._dispatcher.state[extension.id] = [];\n this._extensions[extension.id] = extension;\n return this;\n }\n\n /**\n * Remove a node builder from the graph builder.\n */\n removeExtension(id: string): GraphBuilder {\n delete this._extensions[id];\n return this;\n }\n\n destroy() {\n this._dispatcher.cleanup.forEach((fn) => fn());\n this._resolverSubscriptions.forEach((unsubscribe) => unsubscribe());\n this._connectorSubscriptions.forEach((unsubscribe) => unsubscribe());\n this._resolverSubscriptions.clear();\n this._connectorSubscriptions.clear();\n }\n\n /**\n * A graph traversal using just the connector extensions, without subscribing to any signals or persisting any nodes.\n */\n async explore(\n { node = this._graph.root, relation = 'outbound', visitor }: GraphBuilderTraverseOptions,\n path: string[] = [],\n ) {\n // Break cycles.\n if (path.includes(node.id)) {\n return;\n }\n\n // TODO(wittjosiah): This is a workaround for esm not working in the test runner.\n // Switching to vitest is blocked by having node esm versions of echo-schema & echo-signals.\n if (!isNode()) {\n const { yieldOrContinue } = await import('main-thread-scheduling');\n await yieldOrContinue('idle');\n }\n const shouldContinue = await visitor(node, [...path, node.id]);\n if (shouldContinue === false) {\n return;\n }\n\n const nodes = Object.values(this._extensions)\n .filter((extension) => relation === (extension.relation ?? 'outbound'))\n .filter((extension) => !extension.filter || extension.filter(node))\n .flatMap((extension) => {\n this._dispatcher.currentExtension = extension.id;\n this._dispatcher.stateIndex = 0;\n BuilderInternal.currentDispatcher = this._dispatcher;\n const result = extension.connector?.({ node }) ?? [];\n BuilderInternal.currentDispatcher = undefined;\n return result;\n })\n .map(\n (arg): Node => ({\n id: arg.id,\n type: arg.type,\n cacheable: arg.cacheable,\n data: arg.data ?? null,\n properties: arg.properties ?? {},\n }),\n );\n\n await Promise.all(nodes.map((n) => this.explore({ node: n, relation, visitor }, [...path, node.id])));\n }\n\n private _onInitialNode(nodeId: string) {\n this._nodeChanged[nodeId] = this._nodeChanged[nodeId] ?? signal({});\n this._resolverSubscriptions.set(\n nodeId,\n effect(() => {\n for (const { id, resolver } of Object.values(this._extensions)) {\n if (!resolver) {\n continue;\n }\n\n this._dispatcher.currentExtension = id;\n this._dispatcher.stateIndex = 0;\n BuilderInternal.currentDispatcher = this._dispatcher;\n let node: NodeArg<any> | false | undefined;\n try {\n node = resolver({ id: nodeId });\n } catch (err) {\n log.catch(err, { extension: id });\n log.error(`Previous error occurred in extension: ${id}`);\n } finally {\n BuilderInternal.currentDispatcher = undefined;\n }\n\n const trigger = this._initialized[nodeId];\n if (node) {\n this.graph._addNodes([node]);\n trigger?.wake();\n if (this._nodeChanged[node.id]) {\n this._nodeChanged[node.id].value = {};\n }\n break;\n } else if (node === false) {\n this.graph._removeNodes([nodeId]);\n trigger?.wake();\n break;\n }\n }\n }),\n );\n }\n\n private _onInitialNodes(node: Node, nodesRelation: Relation, nodesType?: string) {\n this._nodeChanged[node.id] = this._nodeChanged[node.id] ?? signal({});\n let first = true;\n let previous: string[] = [];\n this._connectorSubscriptions.set(\n node.id,\n effect(() => {\n // TODO(wittjosiah): This is a workaround for a race between the node removal and the effect re-running.\n // To cause this case to happen, remove a collection and then undo the removal.\n if (!first && !this._connectorSubscriptions.has(node.id)) {\n return;\n }\n first = false;\n\n // Subscribe to extensions being added.\n Object.keys(this._extensions);\n // Subscribe to connected node changes.\n this._nodeChanged[node.id].value;\n\n // TODO(wittjosiah): Consider allowing extensions to collaborate on the same node by merging their results.\n const nodes: NodeArg<any>[] = [];\n for (const { id, connector, filter, type, relation = 'outbound' } of Object.values(this._extensions)) {\n if (\n !connector ||\n relation !== nodesRelation ||\n (nodesType && type !== nodesType) ||\n (filter && !filter(node))\n ) {\n continue;\n }\n\n this._dispatcher.currentExtension = id;\n this._dispatcher.stateIndex = 0;\n BuilderInternal.currentDispatcher = this._dispatcher;\n try {\n nodes.push(...(connector({ node }) ?? []));\n } catch (err) {\n log.catch(err, { extension: id });\n log.error(`Previous error occurred in extension: ${id}`);\n } finally {\n BuilderInternal.currentDispatcher = undefined;\n }\n }\n\n const ids = nodes.map((n) => n.id);\n const removed = previous.filter((id) => !ids.includes(id));\n previous = ids;\n\n // Remove edges and only remove nodes that are orphaned.\n this.graph._removeEdges(\n removed.map((target) => ({ source: node.id, target })),\n true,\n );\n this.graph._addNodes(nodes);\n this.graph._addEdges(\n nodes.map(({ id }) =>\n nodesRelation === 'outbound' ? { source: node.id, target: id } : { source: id, target: node.id },\n ),\n );\n this.graph._sortEdges(\n node.id,\n nodesRelation,\n nodes.map(({ id }) => id),\n );\n nodes.forEach((n) => {\n if (this._nodeChanged[n.id]) {\n this._nodeChanged[n.id].value = {};\n }\n });\n }),\n );\n }\n\n private async _onRemoveNode(nodeId: string) {\n this._resolverSubscriptions.get(nodeId)?.();\n this._connectorSubscriptions.get(nodeId)?.();\n this._resolverSubscriptions.delete(nodeId);\n this._connectorSubscriptions.delete(nodeId);\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["batch", "effect", "untracked", "asyncTimeout", "Trigger", "invariant", "create", "log", "nonNullable", "pick", "isGraphNode", "data", "properties", "isAction", "actionGroupSymbol", "Symbol", "isActionGroup", "isActionLike", "graphSymbol", "Symbol", "getGraph", "node", "graph", "invariant", "ROOT_ID", "ROOT_TYPE", "ACTION_TYPE", "ACTION_GROUP_TYPE", "DEFAULT_FILTER", "untracked", "isActionLike", "Graph", "constructor", "nodes", "edges", "onInitialNode", "onInitialNodes", "onRemoveNode", "_waitingForNodes", "_initialized", "_nodes", "_edges", "_constructNode", "create", "_onInitialNode", "_onInitialNodes", "_onRemoveNode", "id", "type", "cacheable", "properties", "data", "forEach", "Object", "keys", "_addNode", "log", "warn", "actionGroupSymbol", "inbound", "outbound", "entries", "source", "target", "_addEdge", "_sortEdges", "from", "pickle", "options", "JSON", "parse", "root", "findNode", "toJSON", "maxLength", "seen", "obj", "length", "slice", "label", "map", "n", "nextSeen", "includes", "undefined", "filter", "nonNullable", "values", "pick", "Set", "fromEntries", "has", "nodeId", "toSorted", "a", "b", "localeCompare", "stringify", "expansion", "existingNode", "waitForNode", "timeout", "trigger", "Trigger", "wait", "asyncTimeout", "relation", "_getNodes", "actions", "expand", "key", "_key", "initialized", "traverse", "visitor", "path", "shouldContinue", "child", "subscribeTraverse", "currentPath", "effect", "result", "nodeSubscriptions", "unsubscribe", "getPath", "start", "found", "waitForPath", "params", "interval", "i", "setInterval", "wake", "finally", "clearInterval", "_addNodes", "batch", "_node", "subNode", "_removeNodes", "ids", "_removeNode", "_removeEdge", "startsWith", "_addEdges", "edge", "sourceEdges", "push", "targetEdges", "_removeEdges", "removeOrphans", "outboundIndex", "findIndex", "splice", "inboundIndex", "current", "unsorted", "sorted", "effect", "signal", "Trigger", "invariant", "create", "log", "isNode", "nonNullable", "createExtension", "extension", "id", "resolver", "connector", "actions", "actionGroups", "rest", "getId", "key", "undefined", "type", "ACTION_GROUP_TYPE", "relation", "node", "map", "arg", "data", "actionGroupSymbol", "ACTION_TYPE", "filter", "nonNullable", "Dispatcher", "stateIndex", "state", "cleanup", "BuilderInternal", "memoize", "fn", "dispatcher", "currentDispatcher", "invariant", "currentExtension", "all", "current", "result", "push", "toSignal", "subscribe", "get", "thisSignal", "signal", "unsubscribe", "value", "GraphBuilder", "constructor", "params", "_dispatcher", "_extensions", "create", "_resolverSubscriptions", "Map", "_connectorSubscriptions", "_nodeChanged", "_initialized", "_graph", "Graph", "onInitialNode", "_onInitialNode", "onInitialNodes", "_onInitialNodes", "onRemoveNode", "_onRemoveNode", "from", "pickle", "nodes", "edges", "JSON", "parse", "initialize", "Object", "keys", "_nodes", "ROOT_ID", "forEach", "Trigger", "Promise", "values", "trigger", "wait", "graph", "addExtension", "Array", "isArray", "ext", "removeExtension", "destroy", "clear", "explore", "root", "visitor", "path", "includes", "isNode", "yieldOrContinue", "shouldContinue", "flatMap", "cacheable", "properties", "n", "nodeId", "set", "effect", "err", "log", "catch", "error", "_addNodes", "wake", "_removeNodes", "nodesRelation", "nodesType", "first", "previous", "has", "ids", "removed", "_removeEdges", "target", "source", "_addEdges", "_sortEdges", "delete"]
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { batch, effect, untracked } from '@preact/signals-core';\n\nimport { asyncTimeout, Trigger } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport { type ReactiveObject, create } from '@dxos/live-object';\nimport { log } from '@dxos/log';\nimport { type MakeOptional, nonNullable, pick } from '@dxos/util';\n\nimport { type Node, type NodeArg, type NodeFilter, type Relation, actionGroupSymbol, isActionLike } from './node';\n\nconst graphSymbol = Symbol('graph');\ntype DeepWriteable<T> = { -readonly [K in keyof T]: T[K] extends object ? DeepWriteable<T[K]> : T[K] };\ntype NodeInternal = DeepWriteable<Node> & { [graphSymbol]: Graph };\n\nexport const getGraph = (node: Node): Graph => {\n const graph = (node as NodeInternal)[graphSymbol];\n invariant(graph, 'Node is not associated with a graph.');\n return graph;\n};\n\nexport const ROOT_ID = 'root';\nexport const ROOT_TYPE = 'dxos.org/type/GraphRoot';\nexport const ACTION_TYPE = 'dxos.org/type/GraphAction';\nexport const ACTION_GROUP_TYPE = 'dxos.org/type/GraphActionGroup';\n\nexport type NodesOptions<T = any, U extends Record<string, any> = Record<string, any>> = {\n relation?: Relation;\n filter?: NodeFilter<T, U>;\n expansion?: boolean;\n type?: string;\n};\n\n// TODO(wittjosiah): Consider having default be undefined. This is current default for backwards compatibility.\nconst DEFAULT_FILTER = (node: Node) => untracked(() => !isActionLike(node));\n\nexport type GraphTraversalOptions = {\n /**\n * A callback which is called for each node visited during traversal.\n *\n * If the callback returns `false`, traversal is stops recursing.\n */\n visitor: (node: Node, path: string[]) => boolean | void;\n\n /**\n * The node to start traversing from.\n *\n * @default root\n */\n node?: Node;\n\n /**\n * The relation to traverse graph edges.\n *\n * @default 'outbound'\n */\n relation?: Relation;\n\n /**\n * Allow traversal to trigger expansion of the graph via `onInitialNodes`.\n */\n expansion?: boolean;\n};\n\nexport type GraphParams = {\n nodes?: MakeOptional<Node, 'data' | 'cacheable'>[];\n edges?: Record<string, string[]>;\n onInitialNode?: Graph['_onInitialNode'];\n onInitialNodes?: Graph['_onInitialNodes'];\n onRemoveNode?: Graph['_onRemoveNode'];\n};\n\n/**\n * The Graph represents the structure of the application constructed via plugins.\n */\nexport class Graph {\n private readonly _onInitialNode?: (id: string) => Promise<void>;\n private readonly _onInitialNodes?: (node: Node, relation: Relation, type?: string) => Promise<void>;\n private readonly _onRemoveNode?: (id: string) => Promise<void>;\n\n private readonly _waitingForNodes: Record<string, Trigger<Node>> = {};\n private readonly _initialized: Record<string, boolean> = {};\n\n /**\n * @internal\n */\n readonly _nodes: Record<string, ReactiveObject<NodeInternal>> = {};\n\n /**\n * @internal\n */\n readonly _edges: Record<string, ReactiveObject<{ inbound: string[]; outbound: string[] }>> = {};\n\n constructor({ nodes, edges, onInitialNode, onInitialNodes, onRemoveNode }: GraphParams = {}) {\n this._onInitialNode = onInitialNode;\n this._onInitialNodes = onInitialNodes;\n this._onRemoveNode = onRemoveNode;\n\n this._nodes[ROOT_ID] = this._constructNode({\n id: ROOT_ID,\n type: ROOT_TYPE,\n cacheable: [],\n properties: {},\n data: null,\n });\n if (nodes) {\n nodes.forEach((node) => {\n const cacheable = Object.keys(node.properties ?? {});\n if (node.type === ACTION_TYPE) {\n this._addNode({ cacheable, data: () => log.warn('Pickled action invocation'), ...node });\n } else if (node.type === ACTION_GROUP_TYPE) {\n this._addNode({ cacheable, data: actionGroupSymbol, ...node });\n } else {\n this._addNode({ cacheable, ...node });\n }\n });\n }\n\n this._edges[ROOT_ID] = create({ inbound: [], outbound: [] });\n if (edges) {\n Object.entries(edges).forEach(([source, edges]) => {\n edges.forEach((target) => {\n this._addEdge({ source, target });\n });\n this._sortEdges(source, 'outbound', edges);\n });\n }\n }\n\n static from(pickle: string, options: Omit<GraphParams, 'nodes' | 'edges'> = {}) {\n const { nodes, edges } = JSON.parse(pickle);\n return new Graph({ nodes, edges, ...options });\n }\n\n /**\n * Alias for `findNode('root')`.\n */\n get root() {\n return this.findNode(ROOT_ID)!;\n }\n\n /**\n * Convert the graph to a JSON object.\n */\n toJSON({ id = ROOT_ID, maxLength = 32 }: { id?: string; maxLength?: number } = {}) {\n const toJSON = (node: Node, seen: string[] = []): any => {\n const nodes = this.nodes(node);\n const obj: Record<string, any> = {\n id: node.id.length > maxLength ? `${node.id.slice(0, maxLength - 3)}...` : node.id,\n type: node.type,\n };\n if (node.properties.label) {\n obj.label = node.properties.label;\n }\n if (nodes.length) {\n obj.nodes = nodes\n .map((n) => {\n // Break cycles.\n const nextSeen = [...seen, node.id];\n return nextSeen.includes(n.id) ? undefined : toJSON(n, nextSeen);\n })\n .filter(nonNullable);\n }\n return obj;\n };\n\n const root = this.findNode(id);\n invariant(root, `Node not found: ${id}`);\n return toJSON(root);\n }\n\n pickle() {\n const nodes = Object.values(this._nodes)\n .filter((node) => !!node.cacheable)\n .map((node) => {\n return {\n id: node.id,\n type: node.type,\n properties: pick(node.properties, node.cacheable!),\n };\n });\n\n const cacheable = new Set(nodes.map((node) => node.id));\n\n const edges = Object.fromEntries(\n Object.entries(this._edges)\n .filter(([id]) => cacheable.has(id))\n .map(([id, { outbound }]): [string, string[]] => [id, outbound.filter((nodeId) => cacheable.has(nodeId))])\n // TODO(wittjosiah): Why sort?\n .toSorted(([a], [b]) => a.localeCompare(b)),\n );\n\n return JSON.stringify({ nodes, edges });\n }\n\n /**\n * Find the node with the given id in the graph.\n *\n * If a node is not found within the graph and an `onInitialNode` callback is provided,\n * it is called with the id and type of the node, potentially initializing the node.\n */\n findNode(id: string, expansion = true): Node | undefined {\n const existingNode = this._nodes[id];\n if (!existingNode && expansion) {\n void this._onInitialNode?.(id);\n }\n\n return existingNode;\n }\n\n /**\n * Wait for a node to be added to the graph.\n *\n * If the node is already present in the graph, the promise resolves immediately.\n *\n * @param id The id of the node to wait for.\n * @param timeout The time in milliseconds to wait for the node to be added.\n */\n async waitForNode(id: string, timeout?: number): Promise<Node> {\n const trigger = this._waitingForNodes[id] ?? (this._waitingForNodes[id] = new Trigger<Node>());\n const node = this.findNode(id);\n if (node) {\n delete this._waitingForNodes[id];\n return node;\n }\n\n if (timeout === undefined) {\n return trigger.wait();\n } else {\n return asyncTimeout(trigger.wait(), timeout, `Node not found: ${id}`);\n }\n }\n\n /**\n * Nodes that this node is connected to in default order.\n */\n nodes<T = any, U extends Record<string, any> = Record<string, any>>(node: Node, options: NodesOptions<T, U> = {}) {\n const { relation, expansion, filter = DEFAULT_FILTER, type } = options;\n const nodes = this._getNodes({ node, relation, expansion, type });\n return nodes.filter((n) => filter(n, node));\n }\n\n /**\n * Edges that this node is connected to in default order.\n */\n edges(node: Node, { relation = 'outbound' }: { relation?: Relation } = {}) {\n return this._edges[node.id]?.[relation] ?? [];\n }\n\n /**\n * Actions or action groups that this node is connected to in default order.\n */\n actions(node: Node, { expansion }: { expansion?: boolean } = {}) {\n return [\n ...this._getNodes({ node, expansion, type: ACTION_GROUP_TYPE }),\n ...this._getNodes({ node, expansion, type: ACTION_TYPE }),\n ];\n }\n\n async expand(node: Node, relation: Relation = 'outbound', type?: string) {\n const key = this._key(node, relation, type);\n const initialized = this._initialized[key];\n if (!initialized && this._onInitialNodes) {\n await this._onInitialNodes(node, relation, type);\n this._initialized[key] = true;\n }\n }\n\n private _key(node: Node, relation: Relation, type?: string) {\n return `${node.id}-${relation}-${type}`;\n }\n\n /**\n * Recursive depth-first traversal of the graph.\n *\n * @param options.node The node to start traversing from.\n * @param options.relation The relation to traverse graph edges.\n * @param options.visitor A callback which is called for each node visited during traversal.\n */\n traverse(\n { visitor, node = this.root, relation = 'outbound', expansion }: GraphTraversalOptions,\n path: string[] = [],\n ): void {\n // Break cycles.\n if (path.includes(node.id)) {\n return;\n }\n\n const shouldContinue = visitor(node, [...path, node.id]);\n if (shouldContinue === false) {\n return;\n }\n\n Object.values(this._getNodes({ node, relation, expansion })).forEach((child) =>\n this.traverse({ node: child, relation, visitor, expansion }, [...path, node.id]),\n );\n }\n\n /**\n * Recursive depth-first traversal of the graph wrapping each visitor call in an effect.\n *\n * @param options.node The node to start traversing from.\n * @param options.relation The relation to traverse graph edges.\n * @param options.visitor A callback which is called for each node visited during traversal.\n */\n subscribeTraverse(\n { visitor, node = this.root, relation = 'outbound', expansion }: GraphTraversalOptions,\n currentPath: string[] = [],\n ) {\n return effect(() => {\n const path = [...currentPath, node.id];\n const result = visitor(node, path);\n if (result === false) {\n return;\n }\n\n const nodes = this._getNodes({ node, relation, expansion });\n const nodeSubscriptions = nodes.map((n) => this.subscribeTraverse({ node: n, visitor, expansion }, path));\n return () => {\n nodeSubscriptions.forEach((unsubscribe) => unsubscribe());\n };\n });\n }\n\n /**\n * Get the path between two nodes in the graph.\n */\n getPath({ source = 'root', target }: { source?: string; target: string }): string[] | undefined {\n const start = this.findNode(source);\n if (!start) {\n return undefined;\n }\n\n let found: string[] | undefined;\n this.traverse({\n node: start,\n visitor: (node, path) => {\n if (found) {\n return false;\n }\n\n if (node.id === target) {\n found = path;\n }\n },\n });\n\n return found;\n }\n\n /**\n * Wait for the path between two nodes in the graph to be established.\n */\n async waitForPath(\n params: { source?: string; target: string },\n { timeout = 5_000, interval = 500 }: { timeout?: number; interval?: number } = {},\n ) {\n const path = this.getPath(params);\n if (path) {\n return path;\n }\n\n const trigger = new Trigger<string[]>();\n const i = setInterval(() => {\n const path = this.getPath(params);\n if (path) {\n trigger.wake(path);\n }\n }, interval);\n\n return trigger.wait({ timeout }).finally(() => clearInterval(i));\n }\n\n /**\n * Add nodes to the graph.\n *\n * @internal\n */\n _addNodes<TData = null, TProperties extends Record<string, any> = Record<string, any>>(\n nodes: NodeArg<TData, TProperties>[],\n ): Node<TData, TProperties>[] {\n return batch(() => nodes.map((node) => this._addNode(node)));\n }\n\n private _addNode<TData, TProperties extends Record<string, any> = Record<string, any>>({\n nodes,\n edges,\n ..._node\n }: NodeArg<TData, TProperties>): Node<TData, TProperties> {\n return untracked(() => {\n const existingNode = this._nodes[_node.id];\n const node = existingNode ?? this._constructNode({ data: null, properties: {}, ..._node });\n if (existingNode) {\n const { data, properties, type } = _node;\n if (data && data !== node.data) {\n node.data = data;\n }\n\n if (type !== node.type) {\n node.type = type;\n }\n\n for (const key in properties) {\n if (properties[key] !== node.properties[key]) {\n node.properties[key] = properties[key];\n }\n }\n } else {\n this._nodes[node.id] = node;\n this._edges[node.id] = create({ inbound: [], outbound: [] });\n }\n\n const trigger = this._waitingForNodes[node.id];\n if (trigger) {\n trigger.wake(node);\n delete this._waitingForNodes[node.id];\n }\n\n if (nodes) {\n nodes.forEach((subNode) => {\n this._addNode(subNode);\n this._addEdge({ source: node.id, target: subNode.id });\n });\n }\n\n if (edges) {\n edges.forEach(([id, relation]) =>\n relation === 'outbound'\n ? this._addEdge({ source: node.id, target: id })\n : this._addEdge({ source: id, target: node.id }),\n );\n }\n\n return node as unknown as Node<TData, TProperties>;\n });\n }\n\n /**\n * Remove nodes from the graph.\n *\n * @param ids The id of the node to remove.\n * @param edges Whether to remove edges connected to the node from the graph as well.\n * @internal\n */\n _removeNodes(ids: string[], edges = false) {\n batch(() => ids.forEach((id) => this._removeNode(id, edges)));\n }\n\n private _removeNode(id: string, edges = false) {\n untracked(() => {\n const node = this.findNode(id, false);\n if (!node) {\n return;\n }\n\n if (edges) {\n // Remove edges from connected nodes.\n this._getNodes({ node }).forEach((node) => {\n this._removeEdge({ source: id, target: node.id });\n });\n this._getNodes({ node, relation: 'inbound' }).forEach((node) => {\n this._removeEdge({ source: node.id, target: id });\n });\n\n // Remove edges from node.\n delete this._edges[id];\n }\n\n // Remove node.\n delete this._nodes[id];\n Object.keys(this._initialized)\n .filter((key) => key.startsWith(id))\n .forEach((key) => {\n delete this._initialized[key];\n });\n void this._onRemoveNode?.(id);\n });\n }\n\n /**\n * Add edges to the graph.\n *\n * @internal\n */\n _addEdges(edges: { source: string; target: string }[]) {\n batch(() => edges.forEach((edge) => this._addEdge(edge)));\n }\n\n private _addEdge({ source, target }: { source: string; target: string }) {\n untracked(() => {\n if (!this._edges[source]) {\n this._edges[source] = create({ inbound: [], outbound: [] });\n }\n if (!this._edges[target]) {\n this._edges[target] = create({ inbound: [], outbound: [] });\n }\n\n const sourceEdges = this._edges[source];\n if (!sourceEdges.outbound.includes(target)) {\n sourceEdges.outbound.push(target);\n }\n\n const targetEdges = this._edges[target];\n if (!targetEdges.inbound.includes(source)) {\n targetEdges.inbound.push(source);\n }\n });\n }\n\n /**\n * Remove edges from the graph.\n * @internal\n */\n _removeEdges(edges: { source: string; target: string }[], removeOrphans = false) {\n batch(() => edges.forEach((edge) => this._removeEdge(edge, removeOrphans)));\n }\n\n private _removeEdge({ source, target }: { source: string; target: string }, removeOrphans = false) {\n untracked(() => {\n batch(() => {\n const outboundIndex = this._edges[source]?.outbound.findIndex((id) => id === target);\n if (outboundIndex !== undefined && outboundIndex !== -1) {\n this._edges[source].outbound.splice(outboundIndex, 1);\n }\n\n const inboundIndex = this._edges[target]?.inbound.findIndex((id) => id === source);\n if (inboundIndex !== undefined && inboundIndex !== -1) {\n this._edges[target].inbound.splice(inboundIndex, 1);\n }\n\n if (removeOrphans) {\n if (\n this._edges[source]?.outbound.length === 0 &&\n this._edges[source]?.inbound.length === 0 &&\n source !== ROOT_ID\n ) {\n this._removeNode(source, true);\n }\n if (\n this._edges[target]?.outbound.length === 0 &&\n this._edges[target]?.inbound.length === 0 &&\n target !== ROOT_ID\n ) {\n this._removeNode(target, true);\n }\n }\n });\n });\n }\n\n /**\n * Sort edges for a node.\n *\n * Edges not included in the sorted list are appended to the end of the list.\n *\n * @param nodeId The id of the node to sort edges for.\n * @param relation The relation of the edges from the node to sort.\n * @param edges The ordered list of edges.\n * @ignore\n */\n _sortEdges(nodeId: string, relation: Relation, edges: string[]) {\n untracked(() => {\n batch(() => {\n const current = this._edges[nodeId];\n if (current) {\n const unsorted = current[relation].filter((id) => !edges.includes(id)) ?? [];\n const sorted = edges.filter((id) => current[relation].includes(id)) ?? [];\n current[relation].splice(0, current[relation].length, ...[...sorted, ...unsorted]);\n }\n });\n });\n }\n\n private _constructNode = (node: Omit<Node, typeof graphSymbol>) => {\n return create<NodeInternal>({ ...node, [graphSymbol]: this });\n };\n\n private _getNodes({\n node,\n relation = 'outbound',\n type,\n expansion,\n }: {\n node: Node;\n relation?: Relation;\n type?: string;\n expansion?: boolean;\n }): Node[] {\n if (expansion) {\n void this.expand(node, relation, type);\n }\n\n const edges = this._edges[node.id];\n if (!edges) {\n return [];\n } else {\n return edges[relation]\n .map((id) => this._nodes[id])\n .filter(nonNullable)\n .filter((n) => !type || n.type === type);\n }\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type MaybePromise, type MakeOptional } from '@dxos/util';\n\n/**\n * Represents a node in the graph.\n */\n// TODO(wittjosiah): Use Effect Schema.\n// TODO(burdon): Rename GraphNode. Node is already in the global namespace.\nexport type Node<TData = any, TProperties extends Record<string, any> = Record<string, any>> = Readonly<{\n /**\n * Globally unique ID.\n */\n id: string;\n\n /**\n * Typename of the data the node represents.\n */\n type: string;\n\n /**\n * Keys in of the properties which should be cached.\n * If defined, the node will be included in the cache.\n * If undefined, the node will not be included in the cache.\n */\n cacheable?: string[];\n\n /**\n * Properties of the node relevant to displaying the node.\n */\n properties: Readonly<TProperties>;\n\n /**\n * Data the node represents.\n */\n // TODO(burdon): Type system (e.g., minimally provide identifier string vs. TypedObject vs. Graph mixin type system)?\n // type field would prevent convoluted sniffing of object properties. And allow direct pass-through for ECHO TypedObjects.\n data: TData;\n}>;\n\nexport type NodeFilter<T = any, U extends Record<string, any> = Record<string, any>> = (\n node: Node<unknown, Record<string, any>>,\n connectedNode: Node,\n) => node is Node<T, U>;\n\nexport type Relation = 'outbound' | 'inbound';\n\nexport const isGraphNode = (data: unknown): data is Node =>\n data && typeof data === 'object' && 'id' in data && 'properties' in data && data.properties\n ? typeof data.properties === 'object' && 'data' in data\n : false;\n\nexport type NodeArg<TData, TProperties extends Record<string, any> = Record<string, any>> = MakeOptional<\n Node<TData, TProperties>,\n 'data' | 'properties' | 'cacheable'\n> & {\n /** Will automatically add nodes with an edge from this node to each. */\n nodes?: NodeArg<unknown>[];\n\n /** Will automatically add specified edges. */\n edges?: [string, Relation][];\n};\n\n//\n// Actions\n//\n\nexport type InvokeParams = {\n /** Node the invoked action is connected to. */\n node: Node;\n\n caller?: string;\n};\n\nexport type ActionData = (params: InvokeParams) => MaybePromise<void>;\n\nexport type Action<TProperties extends Record<string, any> = Record<string, any>> = Readonly<\n Omit<Node<ActionData, TProperties>, 'properties'> & {\n properties: Readonly<TProperties>;\n }\n>;\n\nexport const isAction = (data: unknown): data is Action =>\n isGraphNode(data) ? typeof data.data === 'function' : false;\n\nexport const actionGroupSymbol = Symbol('ActionGroup');\n\nexport type ActionGroup<TProperties extends Record<string, any> = Record<string, any>> = Readonly<\n Omit<Node<typeof actionGroupSymbol, TProperties>, 'properties'> & {\n properties: Readonly<TProperties>;\n }\n>;\n\nexport const isActionGroup = (data: unknown): data is ActionGroup =>\n isGraphNode(data) ? data.data === actionGroupSymbol : false;\n\nexport type ActionLike = Action | ActionGroup;\n\nexport const isActionLike = (data: unknown): data is Action | ActionGroup => isAction(data) || isActionGroup(data);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { effect, type Signal, signal, untracked } from '@preact/signals-core';\n\nimport { Trigger, type UnsubscribeCallback } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport { create } from '@dxos/live-object';\nimport { log } from '@dxos/log';\nimport { byPosition, type Position, isNode, type MaybePromise, nonNullable } from '@dxos/util';\n\nimport { ACTION_GROUP_TYPE, ACTION_TYPE, Graph, ROOT_ID, type GraphParams } from './graph';\nimport { type ActionData, actionGroupSymbol, type Node, type NodeArg, type Relation } from './node';\n\nconst NODE_RESOLVER_TIMEOUT = 1_000;\n\n/**\n * Graph builder extension for adding nodes to the graph based on just the node id.\n * This is useful for creating the first node in a graph or for hydrating cached nodes with data.\n *\n * @param params.id The id of the node to resolve.\n */\nexport type ResolverExtension = (params: { id: string }) => NodeArg<any> | false | undefined;\n\n/**\n * Graph builder extension for adding nodes to the graph based on a connection to an existing node.\n *\n * @param params.node The existing node the returned nodes will be connected to.\n */\nexport type ConnectorExtension<T = any> = (params: { node: Node<T> }) => NodeArg<any>[] | undefined;\n\n/**\n * Constrained case of the connector extension for more easily adding actions to the graph.\n */\nexport type ActionsExtension<T = any> = (params: {\n node: Node<T>;\n}) => Omit<NodeArg<ActionData>, 'type' | 'nodes' | 'edges'>[] | undefined;\n\n/**\n * Constrained case of the connector extension for more easily adding action groups to the graph.\n */\nexport type ActionGroupsExtension<T = any> = (params: {\n node: Node<T>;\n}) => Omit<NodeArg<typeof actionGroupSymbol>, 'type' | 'data' | 'nodes' | 'edges'>[] | undefined;\n\ntype GuardedNodeType<T> = T extends (value: any) => value is infer N ? (N extends Node<infer D> ? D : unknown) : never;\n\n/**\n * A graph builder extension is used to add nodes to the graph.\n *\n * @param params.id The unique id of the extension.\n * @param params.relation The relation the graph is being expanded from the existing node.\n * @param params.type If provided, all nodes returned are expected to have this type.\n * @param params.disposition Affects the order the extensions are processed in.\n * @param params.filter A filter function to determine if an extension should act on a node.\n * @param params.resolver A function to add nodes to the graph based on just the node id.\n * @param params.connector A function to add nodes to the graph based on a connection to an existing node.\n * @param params.actions A function to add actions to the graph based on a connection to an existing node.\n * @param params.actionGroups A function to add action groups to the graph based on a connection to an existing node.\n */\nexport type CreateExtensionOptions<T = any> = {\n id: string;\n relation?: Relation;\n type?: string;\n position?: Position;\n filter?: (node: Node) => node is Node<T>;\n resolver?: ResolverExtension;\n connector?: ConnectorExtension<GuardedNodeType<CreateExtensionOptions<T>['filter']>>;\n actions?: ActionsExtension<GuardedNodeType<CreateExtensionOptions<T>['filter']>>;\n actionGroups?: ActionGroupsExtension<GuardedNodeType<CreateExtensionOptions<T>['filter']>>;\n};\n\n/**\n * Create a graph builder extension.\n */\nexport const createExtension = <T = any>(extension: CreateExtensionOptions<T>): BuilderExtension[] => {\n const { id, position = 'static', resolver, connector, actions, actionGroups, ...rest } = extension;\n const getId = (key: string) => `${id}/${key}`;\n return [\n resolver ? { id: getId('resolver'), position, resolver } : undefined,\n connector ? { ...rest, id: getId('connector'), position, connector } : undefined,\n actionGroups\n ? ({\n ...rest,\n id: getId('actionGroups'),\n position,\n type: ACTION_GROUP_TYPE,\n relation: 'outbound',\n connector: ({ node }) =>\n actionGroups({ node })?.map((arg) => ({ ...arg, data: actionGroupSymbol, type: ACTION_GROUP_TYPE })),\n } satisfies BuilderExtension)\n : undefined,\n actions\n ? ({\n ...rest,\n id: getId('actions'),\n position,\n type: ACTION_TYPE,\n relation: 'outbound',\n connector: ({ node }) => actions({ node })?.map((arg) => ({ ...arg, type: ACTION_TYPE })),\n } satisfies BuilderExtension)\n : undefined,\n ].filter(nonNullable);\n};\n\nexport type GraphBuilderTraverseOptions = {\n visitor: (node: Node, path: string[]) => MaybePromise<boolean | void>;\n node?: Node;\n relation?: Relation;\n};\n\n/**\n * The dispatcher is used to keep track of the current extension and state when memoizing functions.\n */\nclass Dispatcher {\n currentExtension?: string;\n stateIndex = 0;\n state: Record<string, any[]> = {};\n cleanup: (() => void)[] = [];\n}\n\nclass BuilderInternal {\n // This must be static to avoid passing the dispatcher instance to every memoized function.\n // If the dispatcher is not set that means that the memoized function is being called outside of the graph builder.\n static currentDispatcher?: Dispatcher;\n}\n\n/**\n * Allows code to be memoized within the context of a graph builder extension.\n * This is useful for creating instances which should be subscribed to rather than recreated.\n */\nexport const memoize = <T>(fn: () => T, key = 'result'): T => {\n const dispatcher = BuilderInternal.currentDispatcher;\n invariant(dispatcher?.currentExtension, 'memoize must be called within an extension');\n const all = dispatcher.state[dispatcher.currentExtension][dispatcher.stateIndex] ?? {};\n const current = all[key];\n const result = current ? current.result : fn();\n dispatcher.state[dispatcher.currentExtension][dispatcher.stateIndex] = { ...all, [key]: { result } };\n dispatcher.stateIndex++;\n return result;\n};\n\n/**\n * Register a cleanup function to be called when the graph builder is destroyed.\n */\nexport const cleanup = (fn: () => void): void => {\n memoize(() => {\n const dispatcher = BuilderInternal.currentDispatcher;\n invariant(dispatcher, 'cleanup must be called within an extension');\n dispatcher.cleanup.push(fn);\n });\n};\n\n/**\n * Convert a subscribe/get pair into a signal.\n */\nexport const toSignal = <T>(\n subscribe: (onChange: () => void) => () => void,\n get: () => T | undefined,\n key?: string,\n) => {\n const thisSignal = memoize(() => {\n return signal(get());\n }, key);\n const unsubscribe = memoize(() => {\n return subscribe(() => (thisSignal.value = get()));\n }, key);\n cleanup(() => {\n unsubscribe();\n });\n return thisSignal.value;\n};\n\nexport type BuilderExtension = Readonly<{\n id: string;\n position: Position;\n resolver?: ResolverExtension;\n connector?: ConnectorExtension;\n // Only for connector.\n relation?: Relation;\n type?: string;\n filter?: (node: Node) => boolean;\n}>;\n\ntype ExtensionArg = BuilderExtension | BuilderExtension[] | ExtensionArg[];\n\nexport const flattenExtensions = (extension: ExtensionArg, acc: BuilderExtension[] = []): BuilderExtension[] => {\n if (Array.isArray(extension)) {\n return [...acc, ...extension.flatMap((ext) => flattenExtensions(ext, acc))];\n } else {\n return [...acc, extension];\n }\n};\n\n/**\n * The builder provides an extensible way to compose the construction of the graph.\n */\n// TODO(wittjosiah): Add api for setting subscription set and/or radius.\n// Should unsubscribe from nodes that are not in the set/radius.\n// Should track LRU nodes that are not in the set/radius and remove them beyond a certain threshold.\nexport class GraphBuilder {\n private readonly _dispatcher = new Dispatcher();\n private readonly _extensions = create<Record<string, BuilderExtension>>({});\n private readonly _resolverSubscriptions = new Map<string, UnsubscribeCallback>();\n private readonly _connectorSubscriptions = new Map<string, UnsubscribeCallback>();\n private readonly _nodeChanged: Record<string, Signal<{}>> = {};\n private readonly _initialized: Record<string, Trigger> = {};\n private _graph: Graph;\n\n constructor(params: Pick<GraphParams, 'nodes' | 'edges'> = {}) {\n this._graph = new Graph({\n ...params,\n onInitialNode: async (id) => this._onInitialNode(id),\n onInitialNodes: async (node, relation, type) => this._onInitialNodes(node, relation, type),\n onRemoveNode: (id) => this._onRemoveNode(id),\n });\n }\n\n static from(pickle?: string) {\n if (!pickle) {\n return new GraphBuilder();\n }\n\n const { nodes, edges } = JSON.parse(pickle);\n return new GraphBuilder({ nodes, edges });\n }\n\n /**\n * If graph is being restored from a pickle, the data will be null.\n * Initialize the data of each node by calling resolvers.\n * Wait until all of the initial nodes have resolved.\n */\n async initialize() {\n Object.keys(this._graph._nodes)\n .filter((id) => id !== ROOT_ID)\n .forEach((id) => (this._initialized[id] = new Trigger()));\n Object.keys(this._graph._nodes).forEach((id) => this._onInitialNode(id));\n await Promise.all(\n Object.entries(this._initialized).map(async ([id, trigger]) => {\n try {\n await trigger.wait({ timeout: NODE_RESOLVER_TIMEOUT });\n } catch {\n log.error('node resolver timeout', { id });\n this.graph._removeNodes([id]);\n }\n }),\n );\n }\n\n get graph() {\n return this._graph;\n }\n\n /**\n * @reactive\n */\n get extensions() {\n return Object.values(this._extensions);\n }\n\n /**\n * Register a node builder which will be called in order to construct the graph.\n */\n addExtension(extension: ExtensionArg): GraphBuilder {\n const extensions = flattenExtensions(extension);\n untracked(() => {\n extensions.forEach((extension) => {\n this._dispatcher.state[extension.id] = [];\n this._extensions[extension.id] = extension;\n });\n });\n return this;\n }\n\n /**\n * Remove a node builder from the graph builder.\n */\n removeExtension(id: string): GraphBuilder {\n untracked(() => {\n delete this._extensions[id];\n });\n return this;\n }\n\n destroy() {\n this._dispatcher.cleanup.forEach((fn) => fn());\n this._resolverSubscriptions.forEach((unsubscribe) => unsubscribe());\n this._connectorSubscriptions.forEach((unsubscribe) => unsubscribe());\n this._resolverSubscriptions.clear();\n this._connectorSubscriptions.clear();\n }\n\n /**\n * A graph traversal using just the connector extensions, without subscribing to any signals or persisting any nodes.\n */\n async explore(\n { node = this._graph.root, relation = 'outbound', visitor }: GraphBuilderTraverseOptions,\n path: string[] = [],\n ) {\n // Break cycles.\n if (path.includes(node.id)) {\n return;\n }\n\n // TODO(wittjosiah): This is a workaround for esm not working in the test runner.\n // Switching to vitest is blocked by having node esm versions of echo-schema & echo-signals.\n if (!isNode()) {\n const { yieldOrContinue } = await import('main-thread-scheduling');\n await yieldOrContinue('idle');\n }\n const shouldContinue = await visitor(node, [...path, node.id]);\n if (shouldContinue === false) {\n return;\n }\n\n const nodes = Object.values(this._extensions)\n .filter((extension) => relation === (extension.relation ?? 'outbound'))\n .filter((extension) => !extension.filter || extension.filter(node))\n .flatMap((extension) => {\n this._dispatcher.currentExtension = extension.id;\n this._dispatcher.stateIndex = 0;\n BuilderInternal.currentDispatcher = this._dispatcher;\n const result = extension.connector?.({ node }) ?? [];\n BuilderInternal.currentDispatcher = undefined;\n return result;\n })\n .map(\n (arg): Node => ({\n id: arg.id,\n type: arg.type,\n cacheable: arg.cacheable,\n data: arg.data ?? null,\n properties: arg.properties ?? {},\n }),\n );\n\n await Promise.all(nodes.map((n) => this.explore({ node: n, relation, visitor }, [...path, node.id])));\n }\n\n private _onInitialNode(nodeId: string) {\n this._nodeChanged[nodeId] = this._nodeChanged[nodeId] ?? signal({});\n this._resolverSubscriptions.set(\n nodeId,\n effect(() => {\n const extensions = Object.values(this._extensions).toSorted(byPosition);\n for (const { id, resolver } of extensions) {\n if (!resolver) {\n continue;\n }\n\n this._dispatcher.currentExtension = id;\n this._dispatcher.stateIndex = 0;\n BuilderInternal.currentDispatcher = this._dispatcher;\n let node: NodeArg<any> | false | undefined;\n try {\n node = resolver({ id: nodeId });\n } catch (err) {\n log.catch(err, { extension: id });\n log.error(`Previous error occurred in extension: ${id}`);\n } finally {\n BuilderInternal.currentDispatcher = undefined;\n }\n\n const trigger = this._initialized[nodeId];\n if (node) {\n this.graph._addNodes([node]);\n trigger?.wake();\n if (this._nodeChanged[node.id]) {\n this._nodeChanged[node.id].value = {};\n }\n break;\n } else if (node === false) {\n this.graph._removeNodes([nodeId]);\n trigger?.wake();\n break;\n }\n }\n }),\n );\n }\n\n private _onInitialNodes(node: Node, nodesRelation: Relation, nodesType?: string) {\n this._nodeChanged[node.id] = this._nodeChanged[node.id] ?? signal({});\n let first = true;\n let previous: string[] = [];\n this._connectorSubscriptions.set(\n node.id,\n effect(() => {\n // TODO(wittjosiah): This is a workaround for a race between the node removal and the effect re-running.\n // To cause this case to happen, remove a collection and then undo the removal.\n if (!first && !this._connectorSubscriptions.has(node.id)) {\n return;\n }\n first = false;\n\n // Subscribe to extensions being added.\n Object.keys(this._extensions);\n // Subscribe to connected node changes.\n this._nodeChanged[node.id].value;\n\n // TODO(wittjosiah): Consider allowing extensions to collaborate on the same node by merging their results.\n const nodes: NodeArg<any>[] = [];\n const extensions = Object.values(this._extensions).toSorted(byPosition);\n for (const { id, connector, filter, type, relation = 'outbound' } of extensions) {\n if (\n !connector ||\n relation !== nodesRelation ||\n (nodesType && type !== nodesType) ||\n (filter && !filter(node))\n ) {\n continue;\n }\n\n this._dispatcher.currentExtension = id;\n this._dispatcher.stateIndex = 0;\n BuilderInternal.currentDispatcher = this._dispatcher;\n try {\n nodes.push(...(connector({ node }) ?? []));\n } catch (err) {\n log.catch(err, { extension: id });\n log.error(`Previous error occurred in extension: ${id}`);\n } finally {\n BuilderInternal.currentDispatcher = undefined;\n }\n }\n\n const ids = nodes.map((n) => n.id);\n const removed = previous.filter((id) => !ids.includes(id));\n previous = ids;\n\n // Remove edges and only remove nodes that are orphaned.\n this.graph._removeEdges(\n removed.map((target) => ({ source: node.id, target })),\n true,\n );\n this.graph._addNodes(nodes);\n this.graph._addEdges(\n nodes.map(({ id }) =>\n nodesRelation === 'outbound' ? { source: node.id, target: id } : { source: id, target: node.id },\n ),\n );\n this.graph._sortEdges(\n node.id,\n nodesRelation,\n nodes.map(({ id }) => id),\n );\n nodes.forEach((n) => {\n if (this._nodeChanged[n.id]) {\n this._nodeChanged[n.id].value = {};\n }\n });\n }),\n );\n }\n\n private async _onRemoveNode(nodeId: string) {\n this._resolverSubscriptions.get(nodeId)?.();\n this._connectorSubscriptions.get(nodeId)?.();\n this._resolverSubscriptions.delete(nodeId);\n this._connectorSubscriptions.delete(nodeId);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["batch", "effect", "untracked", "asyncTimeout", "Trigger", "invariant", "create", "log", "nonNullable", "pick", "isGraphNode", "data", "properties", "isAction", "actionGroupSymbol", "Symbol", "isActionGroup", "isActionLike", "graphSymbol", "Symbol", "getGraph", "node", "graph", "invariant", "ROOT_ID", "ROOT_TYPE", "ACTION_TYPE", "ACTION_GROUP_TYPE", "DEFAULT_FILTER", "untracked", "isActionLike", "Graph", "constructor", "nodes", "edges", "onInitialNode", "onInitialNodes", "onRemoveNode", "_waitingForNodes", "_initialized", "_nodes", "_edges", "_constructNode", "create", "_onInitialNode", "_onInitialNodes", "_onRemoveNode", "id", "type", "cacheable", "properties", "data", "forEach", "Object", "keys", "_addNode", "log", "warn", "actionGroupSymbol", "inbound", "outbound", "entries", "source", "target", "_addEdge", "_sortEdges", "from", "pickle", "options", "JSON", "parse", "root", "findNode", "toJSON", "maxLength", "seen", "obj", "length", "slice", "label", "map", "n", "nextSeen", "includes", "undefined", "filter", "nonNullable", "values", "pick", "Set", "fromEntries", "has", "nodeId", "toSorted", "a", "b", "localeCompare", "stringify", "expansion", "existingNode", "waitForNode", "timeout", "trigger", "Trigger", "wait", "asyncTimeout", "relation", "_getNodes", "actions", "expand", "key", "_key", "initialized", "traverse", "visitor", "path", "shouldContinue", "child", "subscribeTraverse", "currentPath", "effect", "result", "nodeSubscriptions", "unsubscribe", "getPath", "start", "found", "waitForPath", "params", "interval", "i", "setInterval", "wake", "finally", "clearInterval", "_addNodes", "batch", "_node", "subNode", "_removeNodes", "ids", "_removeNode", "_removeEdge", "startsWith", "_addEdges", "edge", "sourceEdges", "push", "targetEdges", "_removeEdges", "removeOrphans", "outboundIndex", "findIndex", "splice", "inboundIndex", "current", "unsorted", "sorted", "effect", "signal", "untracked", "Trigger", "invariant", "create", "log", "byPosition", "isNode", "nonNullable", "NODE_RESOLVER_TIMEOUT", "createExtension", "extension", "id", "position", "resolver", "connector", "actions", "actionGroups", "rest", "getId", "key", "undefined", "type", "ACTION_GROUP_TYPE", "relation", "node", "map", "arg", "data", "actionGroupSymbol", "ACTION_TYPE", "filter", "nonNullable", "Dispatcher", "stateIndex", "state", "cleanup", "BuilderInternal", "memoize", "fn", "dispatcher", "currentDispatcher", "invariant", "currentExtension", "all", "current", "result", "push", "toSignal", "subscribe", "get", "thisSignal", "signal", "unsubscribe", "value", "flattenExtensions", "acc", "Array", "isArray", "flatMap", "ext", "GraphBuilder", "constructor", "params", "_dispatcher", "_extensions", "create", "_resolverSubscriptions", "Map", "_connectorSubscriptions", "_nodeChanged", "_initialized", "_graph", "Graph", "onInitialNode", "_onInitialNode", "onInitialNodes", "_onInitialNodes", "onRemoveNode", "_onRemoveNode", "from", "pickle", "nodes", "edges", "JSON", "parse", "initialize", "Object", "keys", "_nodes", "ROOT_ID", "forEach", "Trigger", "Promise", "entries", "trigger", "wait", "timeout", "log", "error", "graph", "_removeNodes", "extensions", "values", "addExtension", "untracked", "removeExtension", "destroy", "clear", "explore", "root", "visitor", "path", "includes", "isNode", "yieldOrContinue", "shouldContinue", "cacheable", "properties", "n", "nodeId", "set", "effect", "toSorted", "byPosition", "err", "catch", "_addNodes", "wake", "nodesRelation", "nodesType", "first", "previous", "has", "ids", "removed", "_removeEdges", "target", "source", "_addEdges", "_sortEdges", "delete"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"packages/sdk/app-graph/src/node.ts":{"bytes":5675,"imports":[],"format":"esm"},"packages/sdk/app-graph/src/graph.ts":{"bytes":63106,"imports":[{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/sdk/app-graph/src/node.ts","kind":"import-statement","original":"./node"}],"format":"esm"},"packages/sdk/app-graph/src/graph-builder.ts":{"bytes":48518,"imports":[{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/sdk/app-graph/src/graph.ts","kind":"import-statement","original":"./graph"},{"path":"packages/sdk/app-graph/src/node.ts","kind":"import-statement","original":"./node"},{"path":"main-thread-scheduling","kind":"dynamic-import","external":true}],"format":"esm"},"packages/sdk/app-graph/src/index.ts":{"bytes":672,"imports":[{"path":"packages/sdk/app-graph/src/graph.ts","kind":"import-statement","original":"./graph"},{"path":"packages/sdk/app-graph/src/graph-builder.ts","kind":"import-statement","original":"./graph-builder"},{"path":"packages/sdk/app-graph/src/node.ts","kind":"import-statement","original":"./node"}],"format":"esm"}},"outputs":{"packages/sdk/app-graph/dist/lib/node-esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":59121},"packages/sdk/app-graph/dist/lib/node-esm/index.mjs":{"imports":[{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"main-thread-scheduling","kind":"dynamic-import","external":true}],"exports":["ACTION_GROUP_TYPE","ACTION_TYPE","Graph","GraphBuilder","ROOT_ID","ROOT_TYPE","actionGroupSymbol","cleanup","createExtension","getGraph","isAction","isActionGroup","isActionLike","isGraphNode","memoize","toSignal"],"entryPoint":"packages/sdk/app-graph/src/index.ts","inputs":{"packages/sdk/app-graph/src/graph.ts":{"bytesInOutput":15394},"packages/sdk/app-graph/src/node.ts":{"bytesInOutput":477},"packages/sdk/app-graph/src/index.ts":{"bytesInOutput":0},"packages/sdk/app-graph/src/graph-builder.ts":{"bytesInOutput":10299}},"bytes":26706}}}
1
+ {"inputs":{"packages/sdk/app-graph/src/node.ts":{"bytes":5735,"imports":[],"format":"esm"},"packages/sdk/app-graph/src/graph.ts":{"bytes":63142,"imports":[{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/sdk/app-graph/src/node.ts","kind":"import-statement","original":"./node"}],"format":"esm"},"packages/sdk/app-graph/src/graph-builder.ts":{"bytes":52358,"imports":[{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/sdk/app-graph/src/graph.ts","kind":"import-statement","original":"./graph"},{"path":"packages/sdk/app-graph/src/node.ts","kind":"import-statement","original":"./node"},{"path":"main-thread-scheduling","kind":"dynamic-import","external":true}],"format":"esm"},"packages/sdk/app-graph/src/index.ts":{"bytes":672,"imports":[{"path":"packages/sdk/app-graph/src/graph.ts","kind":"import-statement","original":"./graph"},{"path":"packages/sdk/app-graph/src/graph-builder.ts","kind":"import-statement","original":"./graph-builder"},{"path":"packages/sdk/app-graph/src/node.ts","kind":"import-statement","original":"./node"}],"format":"esm"}},"outputs":{"packages/sdk/app-graph/dist/lib/node-esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":61108},"packages/sdk/app-graph/dist/lib/node-esm/index.mjs":{"imports":[{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"main-thread-scheduling","kind":"dynamic-import","external":true}],"exports":["ACTION_GROUP_TYPE","ACTION_TYPE","Graph","GraphBuilder","ROOT_ID","ROOT_TYPE","actionGroupSymbol","cleanup","createExtension","flattenExtensions","getGraph","isAction","isActionGroup","isActionLike","isGraphNode","memoize","toSignal"],"entryPoint":"packages/sdk/app-graph/src/index.ts","inputs":{"packages/sdk/app-graph/src/graph.ts":{"bytesInOutput":15394},"packages/sdk/app-graph/src/node.ts":{"bytesInOutput":477},"packages/sdk/app-graph/src/index.ts":{"bytesInOutput":0},"packages/sdk/app-graph/src/graph-builder.ts":{"bytesInOutput":11341}},"bytes":27769}}}
@@ -1,4 +1,4 @@
1
- import { type MaybePromise } from '@dxos/util';
1
+ import { type Position, type MaybePromise } from '@dxos/util';
2
2
  import { Graph, type GraphParams } from './graph';
3
3
  import { type ActionData, actionGroupSymbol, type Node, type NodeArg, type Relation } from './node';
4
4
  /**
@@ -37,6 +37,7 @@ type GuardedNodeType<T> = T extends (value: any) => value is infer N ? (N extend
37
37
  * @param params.id The unique id of the extension.
38
38
  * @param params.relation The relation the graph is being expanded from the existing node.
39
39
  * @param params.type If provided, all nodes returned are expected to have this type.
40
+ * @param params.disposition Affects the order the extensions are processed in.
40
41
  * @param params.filter A filter function to determine if an extension should act on a node.
41
42
  * @param params.resolver A function to add nodes to the graph based on just the node id.
42
43
  * @param params.connector A function to add nodes to the graph based on a connection to an existing node.
@@ -47,6 +48,7 @@ export type CreateExtensionOptions<T = any> = {
47
48
  id: string;
48
49
  relation?: Relation;
49
50
  type?: string;
51
+ position?: Position;
50
52
  filter?: (node: Node) => node is Node<T>;
51
53
  resolver?: ResolverExtension;
52
54
  connector?: ConnectorExtension<GuardedNodeType<CreateExtensionOptions<T>['filter']>>;
@@ -75,15 +77,17 @@ export declare const cleanup: (fn: () => void) => void;
75
77
  * Convert a subscribe/get pair into a signal.
76
78
  */
77
79
  export declare const toSignal: <T>(subscribe: (onChange: () => void) => () => void, get: () => T | undefined, key?: string) => T | undefined;
78
- export type BuilderExtension = {
80
+ export type BuilderExtension = Readonly<{
79
81
  id: string;
82
+ position: Position;
80
83
  resolver?: ResolverExtension;
81
84
  connector?: ConnectorExtension;
82
85
  relation?: Relation;
83
86
  type?: string;
84
87
  filter?: (node: Node) => boolean;
85
- };
88
+ }>;
86
89
  type ExtensionArg = BuilderExtension | BuilderExtension[] | ExtensionArg[];
90
+ export declare const flattenExtensions: (extension: ExtensionArg, acc?: BuilderExtension[]) => BuilderExtension[];
87
91
  /**
88
92
  * The builder provides an extensible way to compose the construction of the graph.
89
93
  */
@@ -104,6 +108,18 @@ export declare class GraphBuilder {
104
108
  */
105
109
  initialize(): Promise<void>;
106
110
  get graph(): Graph;
111
+ /**
112
+ * @reactive
113
+ */
114
+ get extensions(): Readonly<{
115
+ id: string;
116
+ position: Position;
117
+ resolver?: ResolverExtension;
118
+ connector?: ConnectorExtension;
119
+ relation?: Relation;
120
+ type?: string;
121
+ filter?: (node: Node) => boolean;
122
+ }>[];
107
123
  /**
108
124
  * Register a node builder which will be called in order to construct the graph.
109
125
  */
@@ -1 +1 @@
1
- {"version":3,"file":"graph-builder.d.ts","sourceRoot":"","sources":["../../../src/graph-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"graph-builder.d.ts","sourceRoot":"","sources":["../../../src/graph-builder.ts"],"names":[],"mappings":"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"}