@dxos/app-graph 0.6.3-main.fe243fc → 0.6.3-next.1b3691b

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.
@@ -69,7 +69,6 @@ var ROOT_ID = "root";
69
69
  var ROOT_TYPE = "dxos.org/type/GraphRoot";
70
70
  var ACTION_TYPE = "dxos.org/type/GraphAction";
71
71
  var ACTION_GROUP_TYPE = "dxos.org/type/GraphActionGroup";
72
- var NODE_TIMEOUT = 5e3;
73
72
  var Graph = class {
74
73
  constructor({ onInitialNode, onInitialNodes, onRemoveNode } = {}) {
75
74
  this._waitingForNodes = {};
@@ -105,11 +104,9 @@ var Graph = class {
105
104
  /**
106
105
  * Convert the graph to a JSON object.
107
106
  */
108
- toJSON({ id = ROOT_ID, maxLength = 32, onlyLoaded = true } = {}) {
107
+ toJSON({ id = ROOT_ID, maxLength = 32 } = {}) {
109
108
  const toJSON = (node, seen = []) => {
110
- const nodes = this.nodes(node, {
111
- onlyLoaded
112
- });
109
+ const nodes = this.nodes(node);
113
110
  const obj = {
114
111
  id: node.id.length > maxLength ? `${node.id.slice(0, maxLength - 3)}...` : node.id,
115
112
  type: node.type
@@ -131,7 +128,7 @@ var Graph = class {
131
128
  const root = this.findNode(id);
132
129
  (0, import_invariant.invariant)(root, `Node not found: ${id}`, {
133
130
  F: __dxlog_file,
134
- L: 140,
131
+ L: 134,
135
132
  S: this,
136
133
  A: [
137
134
  "root",
@@ -146,10 +143,12 @@ var Graph = class {
146
143
  * If a node is not found within the graph and an `onInitialNode` callback is provided,
147
144
  * it is called with the id and type of the node, potentially initializing the node.
148
145
  */
149
- findNode(id, type) {
146
+ findNode(id) {
150
147
  const existingNode = this._nodes[id];
151
- const nodeArg = !existingNode && this._onInitialNode?.(id, type);
152
- return existingNode ?? (nodeArg ? this._addNode(nodeArg) : void 0);
148
+ if (!existingNode) {
149
+ void this._onInitialNode?.(id);
150
+ }
151
+ return existingNode;
153
152
  }
154
153
  /**
155
154
  * Wait for a node to be added to the graph.
@@ -159,24 +158,29 @@ var Graph = class {
159
158
  * @param id The id of the node to wait for.
160
159
  * @param timeout The time in milliseconds to wait for the node to be added.
161
160
  */
162
- async waitForNode(id, timeout = NODE_TIMEOUT) {
161
+ async waitForNode(id, timeout) {
162
+ const trigger = this._waitingForNodes[id] ?? (this._waitingForNodes[id] = new import_async.Trigger());
163
163
  const node = this.findNode(id);
164
164
  if (node) {
165
+ delete this._waitingForNodes[id];
165
166
  return node;
166
167
  }
167
- const trigger = this._waitingForNodes[id] ?? (this._waitingForNodes[id] = new import_async.Trigger());
168
- return (0, import_async.asyncTimeout)(trigger.wait(), timeout, `Node not found: ${id}`);
168
+ if (timeout === void 0) {
169
+ return trigger.wait();
170
+ } else {
171
+ return (0, import_async.asyncTimeout)(trigger.wait(), timeout, `Node not found: ${id}`);
172
+ }
169
173
  }
170
174
  /**
171
175
  * Nodes that this node is connected to in default order.
172
176
  */
173
177
  nodes(node, options = {}) {
174
- const { onlyLoaded, relation, filter, type } = options;
178
+ const { relation, expansion, filter, type } = options;
175
179
  const nodes = this._getNodes({
176
180
  node,
177
181
  relation,
178
- type,
179
- onlyLoaded
182
+ expansion,
183
+ type
180
184
  });
181
185
  return nodes.filter((n) => (0, import_signals_core.untracked)(() => !isActionLike(n))).filter((n) => filter?.(n, node) ?? true);
182
186
  }
@@ -189,20 +193,28 @@ var Graph = class {
189
193
  /**
190
194
  * Actions or action groups that this node is connected to in default order.
191
195
  */
192
- actions(node, { onlyLoaded } = {}) {
196
+ actions(node, { expansion } = {}) {
193
197
  return [
194
198
  ...this._getNodes({
195
199
  node,
196
- type: ACTION_GROUP_TYPE,
197
- onlyLoaded
200
+ expansion,
201
+ type: ACTION_GROUP_TYPE
198
202
  }),
199
203
  ...this._getNodes({
200
204
  node,
201
- type: ACTION_TYPE,
202
- onlyLoaded
205
+ expansion,
206
+ type: ACTION_TYPE
203
207
  })
204
208
  ];
205
209
  }
210
+ async expand(node, relation = "outbound", type) {
211
+ const key = `${node.id}-${relation}-${type}`;
212
+ const initialized = this._initialized[key];
213
+ if (!initialized && this._onInitialNodes) {
214
+ await this._onInitialNodes(node, relation, type);
215
+ this._initialized[key] = true;
216
+ }
217
+ }
206
218
  /**
207
219
  * Recursive depth-first traversal of the graph.
208
220
  *
@@ -210,7 +222,7 @@ var Graph = class {
210
222
  * @param options.relation The relation to traverse graph edges.
211
223
  * @param options.visitor A callback which is called for each node visited during traversal.
212
224
  */
213
- traverse({ visitor, node = this.root, relation = "outbound", onlyLoaded }, path = []) {
225
+ traverse({ visitor, node = this.root, relation = "outbound", expansion }, path = []) {
214
226
  if (path.includes(node.id)) {
215
227
  return;
216
228
  }
@@ -224,12 +236,12 @@ var Graph = class {
224
236
  Object.values(this._getNodes({
225
237
  node,
226
238
  relation,
227
- onlyLoaded
239
+ expansion
228
240
  })).forEach((child) => this.traverse({
229
241
  node: child,
230
242
  relation,
231
243
  visitor,
232
- onlyLoaded
244
+ expansion
233
245
  }, [
234
246
  ...path,
235
247
  node.id
@@ -242,7 +254,7 @@ var Graph = class {
242
254
  * @param options.relation The relation to traverse graph edges.
243
255
  * @param options.visitor A callback which is called for each node visited during traversal.
244
256
  */
245
- subscribeTraverse({ visitor, node = this.root, relation = "outbound", onlyLoaded }, currentPath = []) {
257
+ subscribeTraverse({ visitor, node = this.root, relation = "outbound", expansion }, currentPath = []) {
246
258
  return (0, import_signals_core.effect)(() => {
247
259
  const path = [
248
260
  ...currentPath,
@@ -255,12 +267,12 @@ var Graph = class {
255
267
  const nodes = this._getNodes({
256
268
  node,
257
269
  relation,
258
- onlyLoaded
270
+ expansion
259
271
  });
260
272
  const nodeSubscriptions = nodes.map((n) => this.subscribeTraverse({
261
273
  node: n,
262
274
  visitor,
263
- onlyLoaded
275
+ expansion
264
276
  }, path));
265
277
  return () => {
266
278
  nodeSubscriptions.forEach((unsubscribe) => unsubscribe());
@@ -277,7 +289,6 @@ var Graph = class {
277
289
  }
278
290
  let found;
279
291
  this.traverse({
280
- onlyLoaded: true,
281
292
  node: start,
282
293
  visitor: (node, path) => {
283
294
  if (found) {
@@ -370,8 +381,7 @@ var Graph = class {
370
381
  }
371
382
  if (edges) {
372
383
  this._getNodes({
373
- node,
374
- onlyLoaded: true
384
+ node
375
385
  }).forEach((node2) => {
376
386
  this._removeEdge({
377
387
  source: id,
@@ -380,8 +390,7 @@ var Graph = class {
380
390
  });
381
391
  this._getNodes({
382
392
  node,
383
- relation: "inbound",
384
- onlyLoaded: true
393
+ relation: "inbound"
385
394
  }).forEach((node2) => {
386
395
  this._removeEdge({
387
396
  source: node2.id,
@@ -391,7 +400,7 @@ var Graph = class {
391
400
  delete this._edges[id];
392
401
  }
393
402
  delete this._nodes[id];
394
- this._onRemoveNode?.(id);
403
+ void this._onRemoveNode?.(id);
395
404
  });
396
405
  }
397
406
  /**
@@ -472,22 +481,9 @@ var Graph = class {
472
481
  });
473
482
  });
474
483
  }
475
- _getNodes({ node, relation = "outbound", type, onlyLoaded }) {
476
- const key = `${node.id}-${relation}-${type}`;
477
- const initialized = this._initialized[key];
478
- if (!initialized && !onlyLoaded && this._onInitialNodes) {
479
- const args = this._onInitialNodes(node, relation, type)?.filter((n) => !type || n.type === type);
480
- this._initialized[key] = true;
481
- if (args && args.length > 0) {
482
- const nodes = this._addNodes(args);
483
- this._addEdges(nodes.map(({ id }) => relation === "outbound" ? {
484
- source: node.id,
485
- target: id
486
- } : {
487
- source: id,
488
- target: node.id
489
- }));
490
- }
484
+ _getNodes({ node, relation = "outbound", type, expansion }) {
485
+ if (expansion) {
486
+ void this.expand(node, relation, type);
491
487
  }
492
488
  const edges = this._edges[node.id];
493
489
  if (!edges) {
@@ -605,7 +601,7 @@ var GraphBuilder = class {
605
601
  this._connectorSubscriptions = /* @__PURE__ */ new Map();
606
602
  this._nodeChanged = {};
607
603
  this._graph = new Graph({
608
- onInitialNode: (id, type) => this._onInitialNode(id, type),
604
+ onInitialNode: (id) => this._onInitialNode(id),
609
605
  onInitialNodes: (node, relation, type) => this._onInitialNodes(node, relation, type),
610
606
  onRemoveNode: (id) => this._onRemoveNode(id)
611
607
  });
@@ -668,11 +664,11 @@ var GraphBuilder = class {
668
664
  node.id
669
665
  ])));
670
666
  }
671
- _onInitialNode(nodeId, nodeType) {
667
+ async _onInitialNode(nodeId) {
672
668
  this._nodeChanged[nodeId] = this._nodeChanged[nodeId] ?? (0, import_signals_core2.signal)({});
673
- let initialized;
674
- for (const { id, type, resolver } of Object.values(this._extensions)) {
675
- if (!resolver || nodeType && type !== nodeType) {
669
+ let resolved = false;
670
+ for (const { id, resolver } of Object.values(this._extensions)) {
671
+ if (resolved || !resolver) {
676
672
  continue;
677
673
  }
678
674
  const unsubscribe = (0, import_signals_core2.effect)(() => {
@@ -683,29 +679,27 @@ var GraphBuilder = class {
683
679
  id: nodeId
684
680
  });
685
681
  BuilderInternal.currentDispatcher = void 0;
686
- if (node && initialized) {
682
+ if (node) {
683
+ resolved = true;
687
684
  this.graph._addNodes([
688
685
  node
689
686
  ]);
690
- if (this._nodeChanged[initialized.id]) {
691
- this._nodeChanged[initialized.id].value = {};
687
+ if (this._nodeChanged[node.id]) {
688
+ this._nodeChanged[node.id].value = {};
692
689
  }
693
- } else if (node) {
694
- initialized = node;
695
690
  }
696
691
  });
697
- if (initialized) {
692
+ if (resolved) {
693
+ this._resolverSubscriptions.get(nodeId)?.();
698
694
  this._resolverSubscriptions.set(nodeId, unsubscribe);
699
695
  break;
700
696
  } else {
701
697
  unsubscribe();
702
698
  }
703
699
  }
704
- return initialized;
705
700
  }
706
- _onInitialNodes(node, nodesRelation, nodesType) {
701
+ async _onInitialNodes(node, nodesRelation, nodesType) {
707
702
  this._nodeChanged[node.id] = this._nodeChanged[node.id] ?? (0, import_signals_core2.signal)({});
708
- let initialized;
709
703
  let previous = [];
710
704
  this._connectorSubscriptions.set(node.id, (0, import_signals_core2.effect)(() => {
711
705
  Object.keys(this._extensions);
@@ -726,26 +720,24 @@ var GraphBuilder = class {
726
720
  const ids = nodes.map((n) => n.id);
727
721
  const removed = previous.filter((id) => !ids.includes(id));
728
722
  previous = ids;
729
- if (initialized) {
730
- this.graph._removeNodes(removed, true);
731
- this.graph._addNodes(nodes);
732
- this.graph._addEdges(nodes.map(({ id }) => ({
733
- source: node.id,
734
- target: id
735
- })));
736
- this.graph._sortEdges(node.id, "outbound", nodes.map(({ id }) => id));
737
- nodes.forEach((n) => {
738
- if (this._nodeChanged[n.id]) {
739
- this._nodeChanged[n.id].value = {};
740
- }
741
- });
742
- } else {
743
- initialized = nodes;
744
- }
723
+ this.graph._removeNodes(removed, true);
724
+ this.graph._addNodes(nodes);
725
+ this.graph._addEdges(nodes.map(({ id }) => nodesRelation === "outbound" ? {
726
+ source: node.id,
727
+ target: id
728
+ } : {
729
+ source: id,
730
+ target: node.id
731
+ }));
732
+ this.graph._sortEdges(node.id, nodesRelation, nodes.map(({ id }) => id));
733
+ nodes.forEach((n) => {
734
+ if (this._nodeChanged[n.id]) {
735
+ this._nodeChanged[n.id].value = {};
736
+ }
737
+ });
745
738
  }));
746
- return initialized;
747
739
  }
748
- _onRemoveNode(nodeId) {
740
+ async _onRemoveNode(nodeId) {
749
741
  this._resolverSubscriptions.get(nodeId)?.();
750
742
  this._connectorSubscriptions.get(nodeId)?.();
751
743
  this._resolverSubscriptions.delete(nodeId);
@@ -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 { type ReactiveObject, create } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { nonNullable } from '@dxos/util';\n\nimport { type Relation, type Node, type NodeArg, type NodeFilter, 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\nconst NODE_TIMEOUT = 5_000;\n\nexport type NodesOptions<T = any, U extends Record<string, any> = Record<string, any>> = {\n relation?: Relation;\n filter?: NodeFilter<T, U>;\n onlyLoaded?: boolean;\n type?: string;\n};\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 * Only traverse nodes that are already loaded.\n */\n onlyLoaded?: boolean;\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, type?: string) => NodeArg<any> | undefined;\n private readonly _onInitialNodes?: (node: Node, relation: Relation, type?: string) => NodeArg<any>[] | undefined;\n private readonly _onRemoveNode?: (id: string) => 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({\n onInitialNode,\n onInitialNodes,\n onRemoveNode,\n }: {\n onInitialNode?: Graph['_onInitialNode'];\n onInitialNodes?: Graph['_onInitialNodes'];\n onRemoveNode?: Graph['_onRemoveNode'];\n } = {}) {\n this._onInitialNode = onInitialNode;\n this._onInitialNodes = onInitialNodes;\n this._onRemoveNode = onRemoveNode;\n this._nodes[ROOT_ID] = this._constructNode({ id: ROOT_ID, type: ROOT_TYPE, properties: {}, data: null });\n this._edges[ROOT_ID] = create({ inbound: [], outbound: [] });\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({\n id = ROOT_ID,\n maxLength = 32,\n onlyLoaded = true,\n }: { id?: string; maxLength?: number; onlyLoaded?: boolean } = {}) {\n const toJSON = (node: Node, seen: string[] = []): any => {\n const nodes = this.nodes(node, { onlyLoaded });\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 /**\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, type?: string): Node | undefined {\n const existingNode = this._nodes[id];\n const nodeArg = !existingNode && this._onInitialNode?.(id, type);\n return existingNode ?? (nodeArg ? this._addNode(nodeArg) : undefined);\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 = NODE_TIMEOUT): Promise<Node> {\n const node = this.findNode(id);\n if (node) {\n return node;\n }\n\n const trigger = this._waitingForNodes[id] ?? (this._waitingForNodes[id] = new Trigger<Node>());\n return asyncTimeout(trigger.wait(), timeout, `Node not found: ${id}`);\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 { onlyLoaded, relation, filter, type } = options;\n const nodes = this._getNodes({ node, relation, type, onlyLoaded });\n return nodes.filter((n) => untracked(() => !isActionLike(n))).filter((n) => filter?.(n, node) ?? true);\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, { onlyLoaded }: { onlyLoaded?: boolean } = {}) {\n return [\n ...this._getNodes({ node, type: ACTION_GROUP_TYPE, onlyLoaded }),\n ...this._getNodes({ node, type: ACTION_TYPE, onlyLoaded }),\n ];\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', onlyLoaded }: 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, onlyLoaded })).forEach((child) =>\n this.traverse({ node: child, relation, visitor, onlyLoaded }, [...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', onlyLoaded }: 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, onlyLoaded });\n const nodeSubscriptions = nodes.map((n) => this.subscribeTraverse({ node: n, visitor, onlyLoaded }, 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 onlyLoaded: true,\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 * 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);\n if (!node) {\n return;\n }\n\n if (edges) {\n // Remove edges from connected nodes.\n this._getNodes({ node, onlyLoaded: true }).forEach((node) => {\n this._removeEdge({ source: id, target: node.id });\n });\n this._getNodes({ node, relation: 'inbound', onlyLoaded: true }).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 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 }[]) {\n batch(() => edges.forEach((edge) => this._removeEdge(edge)));\n }\n\n private _removeEdge({ source, target }: { source: string; target: string }) {\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 });\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 onlyLoaded,\n }: {\n node: Node;\n relation?: Relation;\n type?: string;\n onlyLoaded?: boolean;\n }): Node[] {\n // TODO(wittjosiah): Factor out helper.\n const key = `${node.id}-${relation}-${type}`;\n const initialized = this._initialized[key];\n if (!initialized && !onlyLoaded && this._onInitialNodes) {\n const args = this._onInitialNodes(node, relation, type)?.filter((n) => !type || n.type === type);\n this._initialized[key] = true;\n if (args && args.length > 0) {\n const nodes = this._addNodes(args);\n this._addEdges(\n nodes.map(({ id }) =>\n relation === 'outbound' ? { source: node.id, target: id } : { source: id, target: node.id },\n ),\n );\n }\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.\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 * 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'\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 { type Signal, effect, signal } from '@preact/signals-core';\n// import { yieldOrContinue } from 'main-thread-scheduling';\n\nimport { type UnsubscribeCallback } from '@dxos/async';\nimport { create } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { nonNullable } from '@dxos/util';\n\nimport { ACTION_GROUP_TYPE, ACTION_TYPE, Graph } from './graph';\nimport { type Relation, type NodeArg, type Node, type ActionData, actionGroupSymbol } 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> | 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 node: Node;\n relation?: Relation;\n visitor: (node: Node, path: string[]) => void;\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 _graph: Graph;\n\n constructor() {\n this._graph = new Graph({\n onInitialNode: (id, type) => this._onInitialNode(id, type),\n onInitialNodes: (node, relation, type) => this._onInitialNodes(node, relation, type),\n onRemoveNode: (id) => this._onRemoveNode(id),\n });\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 * Traverse a graph using just the connector extensions, without subscribing to any signals or persisting any nodes.\n */\n // TODO(wittjosiah): Rename? This is not traversing the graph proper.\n async traverse({ node, relation = 'outbound', visitor }: GraphBuilderTraverseOptions, path: string[] = []) {\n // Break cycles.\n if (path.includes(node.id)) {\n return;\n }\n\n // TODO(wittjosiah): Failed in test environment. ESM only?\n // await yieldOrContinue('idle');\n visitor(node, [...path, node.id]);\n\n const nodes = Object.values(this._extensions)\n .filter((extension) => relation === (extension.relation ?? 'outbound'))\n .flatMap((extension) => extension.connector?.({ node }) ?? [])\n .map(\n (arg): Node => ({\n id: arg.id,\n type: arg.type,\n data: arg.data ?? null,\n properties: arg.properties ?? {},\n }),\n );\n\n await Promise.all(nodes.map((n) => this.traverse({ node: n, relation, visitor }, [...path, node.id])));\n }\n\n private _onInitialNode(nodeId: string, nodeType?: string) {\n this._nodeChanged[nodeId] = this._nodeChanged[nodeId] ?? signal({});\n let initialized: NodeArg<any> | undefined;\n for (const { id, type, resolver } of Object.values(this._extensions)) {\n if (!resolver || (nodeType && type !== nodeType)) {\n continue;\n }\n\n const unsubscribe = effect(() => {\n this._dispatcher.currentExtension = id;\n this._dispatcher.stateIndex = 0;\n BuilderInternal.currentDispatcher = this._dispatcher;\n const node = resolver({ id: nodeId });\n BuilderInternal.currentDispatcher = undefined;\n if (node && initialized) {\n this.graph._addNodes([node]);\n if (this._nodeChanged[initialized.id]) {\n this._nodeChanged[initialized.id].value = {};\n }\n } else if (node) {\n initialized = node;\n }\n });\n\n if (initialized) {\n this._resolverSubscriptions.set(nodeId, unsubscribe);\n break;\n } else {\n unsubscribe();\n }\n }\n\n return initialized;\n }\n\n private _onInitialNodes(node: Node, nodesRelation: Relation, nodesType?: string) {\n this._nodeChanged[node.id] = this._nodeChanged[node.id] ?? signal({});\n let initialized: NodeArg<any>[] | undefined;\n let previous: string[] = [];\n this._connectorSubscriptions.set(\n node.id,\n effect(() => {\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 nodes.push(...(connector({ node }) ?? []));\n BuilderInternal.currentDispatcher = undefined;\n }\n const ids = nodes.map((n) => n.id);\n const removed = previous.filter((id) => !ids.includes(id));\n previous = ids;\n\n if (initialized) {\n this.graph._removeNodes(removed, true);\n this.graph._addNodes(nodes);\n this.graph._addEdges(nodes.map(({ id }) => ({ source: node.id, target: id })));\n this.graph._sortEdges(\n node.id,\n 'outbound',\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 } else {\n initialized = nodes;\n }\n }),\n );\n\n return initialized;\n }\n\n private _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": ["import_signals_core", "import_echo_schema", "import_invariant", "import_util", "isGraphNode", "data", "properties", "isAction", "actionGroupSymbol", "Symbol", "isActionGroup", "isActionLike", "graphSymbol", "getGraph", "node", "graph", "invariant", "ROOT_ID", "ROOT_TYPE", "ACTION_TYPE", "ACTION_GROUP_TYPE", "NODE_TIMEOUT", "Graph", "constructor", "onInitialNode", "onInitialNodes", "onRemoveNode", "_waitingForNodes", "_initialized", "_constructNode", "create", "_onInitialNode", "_onInitialNodes", "_onRemoveNode", "_nodes", "id", "type", "_edges", "inbound", "outbound", "root", "findNode", "toJSON", "maxLength", "onlyLoaded", "seen", "nodes", "obj", "length", "slice", "label", "map", "n", "nextSeen", "includes", "undefined", "filter", "nonNullable", "existingNode", "nodeArg", "_addNode", "waitForNode", "timeout", "trigger", "Trigger", "asyncTimeout", "wait", "options", "relation", "_getNodes", "untracked", "edges", "actions", "traverse", "visitor", "path", "shouldContinue", "Object", "values", "forEach", "child", "subscribeTraverse", "currentPath", "effect", "result", "nodeSubscriptions", "unsubscribe", "getPath", "source", "target", "start", "found", "_addNodes", "batch", "_node", "key", "wake", "subNode", "_addEdge", "_removeNodes", "ids", "_removeNode", "_removeEdge", "_addEdges", "edge", "sourceEdges", "push", "targetEdges", "_removeEdges", "outboundIndex", "findIndex", "splice", "inboundIndex", "_sortEdges", "nodeId", "current", "unsorted", "sorted", "initialized", "args", "createExtension", "extension", "resolver", "connector", "actionGroups", "rest", "getId", "arg", "Dispatcher", "stateIndex", "state", "cleanup", "BuilderInternal", "memoize", "fn", "dispatcher", "currentDispatcher", "currentExtension", "all", "toSignal", "subscribe", "get", "thisSignal", "signal", "value", "GraphBuilder", "_dispatcher", "_extensions", "_resolverSubscriptions", "Map", "_connectorSubscriptions", "_nodeChanged", "_graph", "addExtension", "Array", "isArray", "ext", "removeExtension", "destroy", "clear", "flatMap", "Promise", "nodeType", "set", "nodesRelation", "nodesType", "previous", "keys", "removed", "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 { type ReactiveObject, create } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { nonNullable } from '@dxos/util';\n\nimport { type Relation, type Node, type NodeArg, type NodeFilter, 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\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\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({\n onInitialNode,\n onInitialNodes,\n onRemoveNode,\n }: {\n onInitialNode?: Graph['_onInitialNode'];\n onInitialNodes?: Graph['_onInitialNodes'];\n onRemoveNode?: Graph['_onRemoveNode'];\n } = {}) {\n this._onInitialNode = onInitialNode;\n this._onInitialNodes = onInitialNodes;\n this._onRemoveNode = onRemoveNode;\n this._nodes[ROOT_ID] = this._constructNode({ id: ROOT_ID, type: ROOT_TYPE, properties: {}, data: null });\n this._edges[ROOT_ID] = create({ inbound: [], outbound: [] });\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 /**\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): Node | undefined {\n const existingNode = this._nodes[id];\n if (!existingNode) {\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, type } = options;\n const nodes = this._getNodes({ node, relation, expansion, type });\n return nodes.filter((n) => untracked(() => !isActionLike(n))).filter((n) => filter?.(n, node) ?? true);\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 // TODO(wittjosiah): Factor out helper.\n const key = `${node.id}-${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 /**\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 * 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);\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 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 }[]) {\n batch(() => edges.forEach((edge) => this._removeEdge(edge)));\n }\n\n private _removeEdge({ source, target }: { source: string; target: string }) {\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 });\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.\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 * 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'\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 { type Signal, effect, signal } from '@preact/signals-core';\n// import { yieldOrContinue } from 'main-thread-scheduling';\n\nimport { type UnsubscribeCallback } from '@dxos/async';\nimport { create } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { nonNullable } from '@dxos/util';\n\nimport { ACTION_GROUP_TYPE, ACTION_TYPE, Graph } from './graph';\nimport { type Relation, type NodeArg, type Node, type ActionData, actionGroupSymbol } 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> | 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 node: Node;\n relation?: Relation;\n visitor: (node: Node, path: string[]) => void;\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 _graph: Graph;\n\n constructor() {\n this._graph = new Graph({\n onInitialNode: (id) => this._onInitialNode(id),\n onInitialNodes: (node, relation, type) => this._onInitialNodes(node, relation, type),\n onRemoveNode: (id) => this._onRemoveNode(id),\n });\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 * Traverse a graph using just the connector extensions, without subscribing to any signals or persisting any nodes.\n */\n // TODO(wittjosiah): Rename? This is not traversing the graph proper.\n async traverse({ node, relation = 'outbound', visitor }: GraphBuilderTraverseOptions, path: string[] = []) {\n // Break cycles.\n if (path.includes(node.id)) {\n return;\n }\n\n // TODO(wittjosiah): Failed in test environment. ESM only?\n // await yieldOrContinue('idle');\n visitor(node, [...path, node.id]);\n\n const nodes = Object.values(this._extensions)\n .filter((extension) => relation === (extension.relation ?? 'outbound'))\n .flatMap((extension) => extension.connector?.({ node }) ?? [])\n .map(\n (arg): Node => ({\n id: arg.id,\n type: arg.type,\n data: arg.data ?? null,\n properties: arg.properties ?? {},\n }),\n );\n\n await Promise.all(nodes.map((n) => this.traverse({ node: n, relation, visitor }, [...path, node.id])));\n }\n\n private async _onInitialNode(nodeId: string) {\n this._nodeChanged[nodeId] = this._nodeChanged[nodeId] ?? signal({});\n let resolved = false;\n for (const { id, resolver } of Object.values(this._extensions)) {\n if (resolved || !resolver) {\n continue;\n }\n\n const unsubscribe = effect(() => {\n this._dispatcher.currentExtension = id;\n this._dispatcher.stateIndex = 0;\n BuilderInternal.currentDispatcher = this._dispatcher;\n const node = resolver({ id: nodeId });\n BuilderInternal.currentDispatcher = undefined;\n if (node) {\n resolved = true;\n this.graph._addNodes([node]);\n if (this._nodeChanged[node.id]) {\n this._nodeChanged[node.id].value = {};\n }\n }\n });\n\n if (resolved) {\n this._resolverSubscriptions.get(nodeId)?.();\n this._resolverSubscriptions.set(nodeId, unsubscribe);\n break;\n } else {\n unsubscribe();\n }\n }\n }\n\n private async _onInitialNodes(node: Node, nodesRelation: Relation, nodesType?: string) {\n this._nodeChanged[node.id] = this._nodeChanged[node.id] ?? signal({});\n let previous: string[] = [];\n this._connectorSubscriptions.set(\n node.id,\n effect(() => {\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 nodes.push(...(connector({ node }) ?? []));\n BuilderInternal.currentDispatcher = undefined;\n }\n const ids = nodes.map((n) => n.id);\n const removed = previous.filter((id) => !ids.includes(id));\n previous = ids;\n\n this.graph._removeNodes(removed, true);\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": ["import_signals_core", "import_echo_schema", "import_invariant", "import_util", "isGraphNode", "data", "properties", "isAction", "actionGroupSymbol", "Symbol", "isActionGroup", "isActionLike", "graphSymbol", "getGraph", "node", "graph", "invariant", "ROOT_ID", "ROOT_TYPE", "ACTION_TYPE", "ACTION_GROUP_TYPE", "Graph", "constructor", "onInitialNode", "onInitialNodes", "onRemoveNode", "_waitingForNodes", "_initialized", "_constructNode", "create", "_onInitialNode", "_onInitialNodes", "_onRemoveNode", "_nodes", "id", "type", "_edges", "inbound", "outbound", "root", "findNode", "toJSON", "maxLength", "seen", "nodes", "obj", "length", "slice", "label", "map", "n", "nextSeen", "includes", "undefined", "filter", "nonNullable", "existingNode", "waitForNode", "timeout", "trigger", "Trigger", "wait", "asyncTimeout", "options", "relation", "expansion", "_getNodes", "untracked", "edges", "actions", "expand", "key", "initialized", "traverse", "visitor", "path", "shouldContinue", "Object", "values", "forEach", "child", "subscribeTraverse", "currentPath", "effect", "result", "nodeSubscriptions", "unsubscribe", "getPath", "source", "target", "start", "found", "_addNodes", "batch", "_addNode", "_node", "wake", "subNode", "_addEdge", "_removeNodes", "ids", "_removeNode", "_removeEdge", "_addEdges", "edge", "sourceEdges", "push", "targetEdges", "_removeEdges", "outboundIndex", "findIndex", "splice", "inboundIndex", "_sortEdges", "nodeId", "current", "unsorted", "sorted", "createExtension", "extension", "resolver", "connector", "actionGroups", "rest", "getId", "arg", "Dispatcher", "stateIndex", "state", "cleanup", "BuilderInternal", "memoize", "fn", "dispatcher", "currentDispatcher", "currentExtension", "all", "toSignal", "subscribe", "get", "thisSignal", "signal", "value", "GraphBuilder", "_dispatcher", "_extensions", "_resolverSubscriptions", "Map", "_connectorSubscriptions", "_nodeChanged", "_graph", "addExtension", "Array", "isArray", "ext", "removeExtension", "destroy", "clear", "flatMap", "Promise", "resolved", "set", "nodesRelation", "nodesType", "previous", "keys", "removed", "delete"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"packages/sdk/app-graph/src/node.ts":{"bytes":5259,"imports":[],"format":"esm"},"packages/sdk/app-graph/src/graph.ts":{"bytes":51417,"imports":[{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","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":39173,"imports":[{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","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"}],"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/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":48708},"packages/sdk/app-graph/dist/lib/node/index.cjs":{"imports":[{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","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":12593},"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":7864}},"bytes":21377}}}
1
+ {"inputs":{"packages/sdk/app-graph/src/node.ts":{"bytes":5259,"imports":[],"format":"esm"},"packages/sdk/app-graph/src/graph.ts":{"bytes":50171,"imports":[{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","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":38696,"imports":[{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","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"}],"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/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":47906},"packages/sdk/app-graph/dist/lib/node/index.cjs":{"imports":[{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","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":12265},"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":7747}},"bytes":20932}}}
@@ -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":"AAYA,OAAO,EAAkC,KAAK,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,UAAU,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAEpG;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;AAErF;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;CAAE,KAAK,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC;AAEpG;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;IAC/C,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;CACf,KAAK,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC;AAE1E;;GAEG;AACH,MAAM,MAAM,qBAAqB,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;IACpD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;CACf,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC;AAEjG,KAAK,eAAe,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,KAAK,KAAK,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,KAAK,CAAC;AAEvH;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,sBAAsB,CAAC,CAAC,GAAG,GAAG,IAAI;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,SAAS,CAAC,EAAE,kBAAkB,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrF,OAAO,CAAC,EAAE,gBAAgB,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACjF,YAAY,CAAC,EAAE,qBAAqB,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;CAC5F,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,uBAAwB,uBAAuB,CAAC,CAAC,KAAG,gBAAgB,EA0B/F,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CAC/C,CAAC;AAkBF;;;GAGG;AACH,eAAO,MAAM,OAAO,UAAW,MAAM,CAAC,mBAAmB,CASxD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,OAAQ,MAAM,IAAI,KAAG,IAMxC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,QAAQ,iBACR,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,OAC1C,MAAM,CAAC,GAAG,SAAS,QAClB,MAAM,kBAYb,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAE/B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;CAClC,CAAC;AAEF,KAAK,YAAY,GAAG,gBAAgB,GAAG,gBAAgB,EAAE,GAAG,YAAY,EAAE,CAAC;AAE3E;;GAEG;AAIH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgD;IAC5E,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAA0C;IACjF,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA0C;IAClF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAC/D,OAAO,CAAC,MAAM,CAAQ;;IAUtB,IAAI,KAAK,UAER;IAED;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,YAAY,GAAG,YAAY;IAWnD;;OAEG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY;IAKzC,OAAO;IAQP;;OAEG;IAEG,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAqB,EAAE,OAAO,EAAE,EAAE,2BAA2B,EAAE,IAAI,GAAE,MAAM,EAAO;YAyB3F,cAAc;YAiCd,eAAe;YAsDf,aAAa;CAM5B"}