@dxos/app-graph 0.8.2-main.fbd8ed0 → 0.8.2-staging.42af850

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.
@@ -203,6 +203,7 @@ var Graph = class {
203
203
  const dataChanged = node2.data !== data;
204
204
  const propertiesChanged = Object.keys(properties).some((key) => node2.properties[key] !== properties[key]);
205
205
  log("existing node", {
206
+ id,
206
207
  typeChanged,
207
208
  dataChanged,
208
209
  propertiesChanged
@@ -482,36 +483,82 @@ var isActionLike = (data) => isAction(data) || isActionGroup(data);
482
483
  // packages/sdk/app-graph/src/graph-builder.ts
483
484
  var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/sdk/app-graph/src/graph-builder.ts";
484
485
  var createExtension = (extension) => {
485
- const { id, position = "static", relation = "outbound", connector, actions: _actions, actionGroups: _actionGroups } = extension;
486
+ const { id, position = "static", relation = "outbound", connector: _connector, actions: _actions, actionGroups: _actionGroups } = extension;
486
487
  const getId = (key) => `${id}/${key}`;
487
- const actionGroups = _actionGroups && Rx2.family((node) => _actionGroups(node).pipe(Rx2.withLabel(`graph-builder:actionGroups:${id}`)));
488
- const actions = _actions && Rx2.family((node) => _actions(node).pipe(Rx2.withLabel(`graph-builder:actions:${id}`)));
488
+ const connector = _connector && Rx2.family((node) => _connector(node).pipe(Rx2.withLabel(`graph-builder:_connector:${id}`)));
489
+ const actionGroups = _actionGroups && Rx2.family((node) => _actionGroups(node).pipe(Rx2.withLabel(`graph-builder:_actionGroups:${id}`)));
490
+ const actions = _actions && Rx2.family((node) => _actions(node).pipe(Rx2.withLabel(`graph-builder:_actions:${id}`)));
489
491
  return [
490
492
  // resolver ? { id: getId('resolver'), position, resolver } : undefined,
491
493
  connector ? {
492
494
  id: getId("connector"),
493
495
  position,
494
496
  relation,
495
- connector: Rx2.family((key) => connector(key).pipe(Rx2.withLabel(`graph-builder:connector:${id}`)))
497
+ connector: Rx2.family((node) => Rx2.make((get) => {
498
+ try {
499
+ return get(connector(node));
500
+ } catch {
501
+ log2.warn("Error in connector", {
502
+ id: getId("connector"),
503
+ node
504
+ }, {
505
+ F: __dxlog_file2,
506
+ L: 101,
507
+ S: void 0,
508
+ C: (f, a) => f(...a)
509
+ });
510
+ return [];
511
+ }
512
+ }).pipe(Rx2.withLabel(`graph-builder:connector:${id}`)))
496
513
  } : void 0,
497
514
  actionGroups ? {
498
515
  id: getId("actionGroups"),
499
516
  position,
500
517
  relation: "outbound",
501
- connector: Rx2.family((node) => Rx2.make((get) => get(actionGroups(node)).map((arg) => ({
502
- ...arg,
503
- data: actionGroupSymbol,
504
- type: ACTION_GROUP_TYPE
505
- }))).pipe(Rx2.withLabel(`graph-builder:connector:actionGroups:${id}`)))
518
+ connector: Rx2.family((node) => Rx2.make((get) => {
519
+ try {
520
+ return get(actionGroups(node)).map((arg) => ({
521
+ ...arg,
522
+ data: actionGroupSymbol,
523
+ type: ACTION_GROUP_TYPE
524
+ }));
525
+ } catch {
526
+ log2.warn("Error in actionGroups", {
527
+ id: getId("actionGroups"),
528
+ node
529
+ }, {
530
+ F: __dxlog_file2,
531
+ L: 122,
532
+ S: void 0,
533
+ C: (f, a) => f(...a)
534
+ });
535
+ return [];
536
+ }
537
+ }).pipe(Rx2.withLabel(`graph-builder:connector:actionGroups:${id}`)))
506
538
  } : void 0,
507
539
  actions ? {
508
540
  id: getId("actions"),
509
541
  position,
510
542
  relation: "outbound",
511
- connector: Rx2.family((node) => Rx2.make((get) => get(actions(node)).map((arg) => ({
512
- ...arg,
513
- type: ACTION_TYPE
514
- }))).pipe(Rx2.withLabel(`graph-builder:connector:actions:${id}`)))
543
+ connector: Rx2.family((node) => Rx2.make((get) => {
544
+ try {
545
+ return get(actions(node)).map((arg) => ({
546
+ ...arg,
547
+ type: ACTION_TYPE
548
+ }));
549
+ } catch {
550
+ log2.warn("Error in actions", {
551
+ id: getId("actions"),
552
+ node
553
+ }, {
554
+ F: __dxlog_file2,
555
+ L: 139,
556
+ S: void 0,
557
+ C: (f, a) => f(...a)
558
+ });
559
+ return [];
560
+ }
561
+ }).pipe(Rx2.withLabel(`graph-builder:connector:actions:${id}`)))
515
562
  } : void 0
516
563
  ].filter(isNonNullable2);
517
564
  };
@@ -634,7 +681,7 @@ var GraphBuilder = class _GraphBuilder {
634
681
  registry: getDebugName(this._registry)
635
682
  }, {
636
683
  F: __dxlog_file2,
637
- L: 276,
684
+ L: 301,
638
685
  S: this,
639
686
  C: (f, a) => f(...a)
640
687
  });
@@ -651,7 +698,7 @@ var GraphBuilder = class _GraphBuilder {
651
698
  removed
652
699
  }, {
653
700
  F: __dxlog_file2,
654
- L: 287,
701
+ L: 312,
655
702
  S: this,
656
703
  C: (f, a) => f(...a)
657
704
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/graph.ts", "../../../src/graph-builder.ts", "../../../src/node.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Registry, Rx } from '@effect-rx/rx-react';\nimport { Option, pipe, Record } from 'effect';\n\nimport { Event, Trigger } from '@dxos/async';\nimport { todo } from '@dxos/debug';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { isNonNullable, type MakeOptional } from '@dxos/util';\n\nimport { type NodeArg, type Node, type Relation, type Action, type ActionGroup } 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\n/**\n * Get the Graph a Node is currently associated with.\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 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_ID\n */\n source?: string;\n\n /**\n * The relation to traverse graph edges.\n *\n * @default 'outbound'\n */\n relation?: Relation;\n};\n\nexport type GraphParams = {\n registry?: Registry.Registry;\n nodes?: MakeOptional<Node, 'data' | 'cacheable'>[];\n edges?: Record<string, Edges>;\n onExpand?: Graph['_onExpand'];\n // TODO(wittjosiah): On initialize to restore state from cache.\n // onInitialize?: Graph['_onInitialize'];\n onRemoveNode?: Graph['_onRemoveNode'];\n};\n\nexport type Edge = { source: string; target: string };\nexport type Edges = { inbound: string[]; outbound: string[] };\n\nexport interface ReadableGraph {\n /**\n * Event emitted when a node is changed.\n */\n onNodeChanged: Event<{ id: string; node: Option.Option<Node> }>;\n\n /**\n * Convert the graph to a JSON object.\n */\n toJSON(id?: string): object;\n\n json(id?: string): Rx.Rx<any>;\n\n /**\n * Get the rx key for the node with the given id.\n */\n node(id: string): Rx.Rx<Option.Option<Node>>;\n\n /**\n * Get the rx key for the node with the given id.\n */\n nodeOrThrow(id: string): Rx.Rx<Node>;\n\n /**\n * Get the rx key for the connections of the node with the given id.\n */\n connections(id: string, relation?: Relation): Rx.Rx<Node[]>;\n\n /**\n * Get the rx key for the actions of the node with the given id.\n */\n actions(id: string): Rx.Rx<(Action | ActionGroup)[]>;\n\n /**\n * Get the rx key for the edges of the node with the given id.\n */\n edges(id: string): Rx.Rx<Edges>;\n\n /**\n * Alias for `getNodeOrThrow(ROOT_ID)`.\n */\n get root(): Node;\n\n /**\n * Get the node with the given id from the graph's registry.\n */\n getNode(id: string): Option.Option<Node>;\n\n /**\n * Get the node with the given id from the graph's registry.\n *\n * @throws If the node is Option.none().\n */\n getNodeOrThrow(id: string): Node;\n\n /**\n * Get all nodes connected to the node with the given id by the given relation from the graph's registry.\n */\n getConnections(id: string, relation?: Relation): Node[];\n\n /**\n * Get all actions connected to the node with the given id from the graph's registry.\n */\n getActions(id: string): Node[];\n\n /**\n * Get the edges from the node with the given id from the graph's registry.\n */\n getEdges(id: string): Edges;\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(options: GraphTraversalOptions, path?: string[]): void;\n\n /**\n * Get the path between two nodes in the graph.\n */\n getPath(params: { source?: string; target: string }): Option.Option<string[]>;\n\n /**\n * Wait for the path between two nodes in the graph to be established.\n */\n waitForPath(\n params: { source?: string; target: string },\n options?: { timeout?: number; interval?: number },\n ): Promise<string[]>;\n}\n\nexport interface ExpandableGraph extends ReadableGraph {\n /**\n * Initialize a node in the graph.\n *\n * Fires the `onInitialize` callback to provide initial data for a node.\n */\n // initialize(id: string): Promise<void>;\n\n /**\n * Expand a node in the graph.\n *\n * Fires the `onExpand` callback to add connections to the node.\n */\n expand(id: string, relation?: Relation): void;\n\n /**\n * Sort the edges of the node with the given id.\n */\n sortEdges(id: string, relation: Relation, order: string[]): void;\n}\n\nexport interface WritableGraph extends ExpandableGraph {\n /**\n * Add nodes to the graph.\n */\n addNodes(nodes: NodeArg<any, Record<string, any>>[]): void;\n\n /**\n * Add a node to the graph.\n */\n addNode(node: NodeArg<any, Record<string, any>>): void;\n\n /**\n * Remove nodes from the graph.\n */\n removeNodes(ids: string[], edges?: boolean): void;\n\n /**\n * Remove a node from the graph.\n */\n removeNode(id: string, edges?: boolean): void;\n\n /**\n * Add edges to the graph.\n */\n addEdges(edges: Edge[]): void;\n\n /**\n * Add an edge to the graph.\n */\n addEdge(edge: Edge): void;\n\n /**\n * Remove edges from the graph.\n */\n removeEdges(edges: Edge[], removeOrphans?: boolean): void;\n\n /**\n * Remove an edge from the graph.\n */\n removeEdge(edge: Edge, removeOrphans?: boolean): void;\n}\n\n/**\n * The Graph represents the user interface information architecture of the application constructed via plugins.\n */\nexport class Graph implements WritableGraph {\n readonly onNodeChanged = new Event<{ id: string; node: Option.Option<Node> }>();\n\n private readonly _onExpand?: (id: string, relation: Relation) => void;\n // private readonly _onInitialize?: (id: string) => Promise<void>;\n private readonly _onRemoveNode?: (id: string) => void;\n\n private readonly _registry: Registry.Registry;\n private readonly _expanded = Record.empty<string, boolean>();\n private readonly _initialized = Record.empty<string, boolean>();\n private readonly _initialEdges = Record.empty<string, Edges>();\n private readonly _initialNodes = Record.fromEntries([\n [ROOT_ID, this._constructNode({ id: ROOT_ID, type: ROOT_TYPE, data: null, properties: {} })],\n ]);\n\n /** @internal */\n readonly _node = Rx.family<string, Rx.Writable<Option.Option<Node>>>((id) => {\n const initial = Option.flatten(Record.get(this._initialNodes, id));\n return Rx.make<Option.Option<Node>>(initial).pipe(Rx.keepAlive, Rx.withLabel(`graph:node:${id}`));\n });\n\n private readonly _nodeOrThrow = Rx.family<string, Rx.Rx<Node>>((id) => {\n return Rx.make((get) => {\n const node = get(this._node(id));\n invariant(Option.isSome(node), `Node not available: ${id}`);\n return node.value;\n });\n });\n\n private readonly _edges = Rx.family<string, Rx.Writable<Edges>>((id) => {\n const initial = Record.get(this._initialEdges, id).pipe(Option.getOrElse(() => ({ inbound: [], outbound: [] })));\n return Rx.make<Edges>(initial).pipe(Rx.keepAlive, Rx.withLabel(`graph:edges:${id}`));\n });\n\n // NOTE: Currently the argument to the family needs to be referentially stable for the rx to be referentially stable.\n // TODO(wittjosiah): Rx feature request, support for something akin to `ComplexMap` to allow for complex arguments.\n private readonly _connections = Rx.family<string, Rx.Rx<Node[]>>((key) => {\n return Rx.make((get) => {\n const [id, relation] = key.split('$');\n const edges = get(this._edges(id));\n return edges[relation as Relation]\n .map((id) => get(this._node(id)))\n .filter(Option.isSome)\n .map((o) => o.value);\n }).pipe(Rx.withLabel(`graph:connections:${key}`));\n });\n\n private readonly _actions = Rx.family<string, Rx.Rx<(Action | ActionGroup)[]>>((id) => {\n return Rx.make((get) => {\n return get(this._connections(`${id}$outbound`)).filter(\n (node) => node.type === ACTION_TYPE || node.type === ACTION_GROUP_TYPE,\n );\n }).pipe(Rx.withLabel(`graph:actions:${id}`));\n });\n\n private readonly _json = Rx.family<string, Rx.Rx<any>>((id) => {\n return Rx.make((get) => {\n const toJSON = (node: Node, seen: string[] = []): any => {\n const nodes = get(this.connections(node.id));\n const obj: Record<string, any> = {\n id: node.id.length > 32 ? `${node.id.slice(0, 32)}...` : 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(isNonNullable);\n }\n return obj;\n };\n\n const root = get(this.nodeOrThrow(id));\n return toJSON(root);\n }).pipe(Rx.withLabel(`graph:json:${id}`));\n });\n\n constructor({ registry, nodes, edges, onExpand, onRemoveNode }: GraphParams = {}) {\n this._registry = registry ?? Registry.make();\n this._onExpand = onExpand;\n this._onRemoveNode = onRemoveNode;\n\n if (nodes) {\n nodes.forEach((node) => {\n Record.set(this._initialNodes, node.id, this._constructNode(node));\n });\n }\n\n if (edges) {\n Object.entries(edges).forEach(([source, edges]) => {\n Record.set(this._initialEdges, source, edges);\n });\n }\n }\n\n toJSON(id = ROOT_ID) {\n return this._registry.get(this._json(id));\n }\n\n json(id = ROOT_ID) {\n return this._json(id);\n }\n\n node(id: string): Rx.Rx<Option.Option<Node>> {\n return this._node(id);\n }\n\n nodeOrThrow(id: string): Rx.Rx<Node> {\n return this._nodeOrThrow(id);\n }\n\n connections(id: string, relation: Relation = 'outbound'): Rx.Rx<Node[]> {\n return this._connections(`${id}$${relation}`);\n }\n\n actions(id: string) {\n return this._actions(id);\n }\n\n edges(id: string): Rx.Rx<Edges> {\n return this._edges(id);\n }\n\n get root() {\n return this.getNodeOrThrow(ROOT_ID);\n }\n\n getNode(id: string): Option.Option<Node> {\n return this._registry.get(this.node(id));\n }\n\n getNodeOrThrow(id: string): Node {\n return this._registry.get(this.nodeOrThrow(id));\n }\n\n getConnections(id: string, relation: Relation = 'outbound'): Node[] {\n return this._registry.get(this.connections(id, relation));\n }\n\n getActions(id: string): Node[] {\n return this._registry.get(this.actions(id));\n }\n\n getEdges(id: string): Edges {\n return this._registry.get(this.edges(id));\n }\n\n // TODO(wittjosiah): On initialize to restore state from cache.\n // async initialize(id: string) {\n // const initialized = Record.get(this._initialized, id).pipe(Option.getOrElse(() => false));\n // log('initialize', { id, initialized });\n // if (!initialized) {\n // await this._onInitialize?.(id);\n // Record.set(this._initialized, id, true);\n // }\n // }\n\n expand(id: string, relation: Relation = 'outbound') {\n const key = `${id}$${relation}`;\n const expanded = Record.get(this._expanded, key).pipe(Option.getOrElse(() => false));\n log('expand', { key, expanded });\n if (!expanded) {\n this._onExpand?.(id, relation);\n Record.set(this._expanded, key, true);\n }\n }\n\n addNodes(nodes: NodeArg<any, Record<string, any>>[]) {\n Rx.batch(() => {\n nodes.map((node) => this.addNode(node));\n });\n }\n\n addNode({ nodes, edges, ...nodeArg }: NodeArg<any, Record<string, any>>) {\n const { id, type, data = null, properties = {} } = nodeArg;\n const nodeRx = this._node(id);\n const node = this._registry.get(nodeRx);\n Option.match(node, {\n onSome: (node) => {\n const typeChanged = node.type !== type;\n const dataChanged = node.data !== data;\n const propertiesChanged = Object.keys(properties).some((key) => node.properties[key] !== properties[key]);\n log('existing node', { typeChanged, dataChanged, propertiesChanged });\n if (typeChanged || dataChanged || propertiesChanged) {\n log('updating node', { id, type, data, properties });\n const newNode = Option.some({ ...node, type, data, properties: { ...node.properties, ...properties } });\n this._registry.set(nodeRx, newNode);\n this.onNodeChanged.emit({ id, node: newNode });\n }\n },\n onNone: () => {\n log('new node', { id, type, data, properties });\n const newNode = this._constructNode({ id, type, data, properties });\n this._registry.set(nodeRx, newNode);\n this.onNodeChanged.emit({ id, node: newNode });\n },\n });\n\n if (nodes) {\n // Rx.batch(() => {\n this.addNodes(nodes);\n const _edges = nodes.map((node) => ({ source: id, target: node.id }));\n this.addEdges(_edges);\n // });\n }\n\n if (edges) {\n todo();\n }\n }\n\n removeNodes(ids: string[], edges = false) {\n Rx.batch(() => {\n ids.map((id) => this.removeNode(id, edges));\n });\n }\n\n removeNode(id: string, edges = false) {\n const nodeRx = this._node(id);\n // TODO(wittjosiah): Is there a way to mark these rx values for garbage collection?\n this._registry.set(nodeRx, Option.none());\n this.onNodeChanged.emit({ id, node: Option.none() });\n // TODO(wittjosiah): Reset expanded and initialized flags?\n\n if (edges) {\n const { inbound, outbound } = this._registry.get(this._edges(id));\n const edges = [\n ...inbound.map((source) => ({ source, target: id })),\n ...outbound.map((target) => ({ source: id, target })),\n ];\n this.removeEdges(edges);\n }\n\n this._onRemoveNode?.(id);\n }\n\n addEdges(edges: Edge[]) {\n Rx.batch(() => {\n edges.map((edge) => this.addEdge(edge));\n });\n }\n\n addEdge(edgeArg: Edge) {\n const sourceRx = this._edges(edgeArg.source);\n const source = this._registry.get(sourceRx);\n if (!source.outbound.includes(edgeArg.target)) {\n log('add outbound edge', { source: edgeArg.source, target: edgeArg.target });\n this._registry.set(sourceRx, { inbound: source.inbound, outbound: [...source.outbound, edgeArg.target] });\n }\n\n const targetRx = this._edges(edgeArg.target);\n const target = this._registry.get(targetRx);\n if (!target.inbound.includes(edgeArg.source)) {\n log('add inbound edge', { source: edgeArg.source, target: edgeArg.target });\n this._registry.set(targetRx, { inbound: [...target.inbound, edgeArg.source], outbound: target.outbound });\n }\n }\n\n removeEdges(edges: Edge[], removeOrphans = false) {\n Rx.batch(() => {\n edges.map((edge) => this.removeEdge(edge, removeOrphans));\n });\n }\n\n removeEdge(edgeArg: Edge, removeOrphans = false) {\n const sourceRx = this._edges(edgeArg.source);\n const source = this._registry.get(sourceRx);\n if (source.outbound.includes(edgeArg.target)) {\n this._registry.set(sourceRx, {\n inbound: source.inbound,\n outbound: source.outbound.filter((id) => id !== edgeArg.target),\n });\n }\n\n const targetRx = this._edges(edgeArg.target);\n const target = this._registry.get(targetRx);\n if (target.inbound.includes(edgeArg.source)) {\n this._registry.set(targetRx, {\n inbound: target.inbound.filter((id) => id !== edgeArg.source),\n outbound: target.outbound,\n });\n }\n\n if (removeOrphans) {\n const source = this._registry.get(sourceRx);\n const target = this._registry.get(targetRx);\n if (source.outbound.length === 0 && source.inbound.length === 0 && edgeArg.source !== ROOT_ID) {\n this.removeNodes([edgeArg.source]);\n }\n if (target.outbound.length === 0 && target.inbound.length === 0 && edgeArg.target !== ROOT_ID) {\n this.removeNodes([edgeArg.target]);\n }\n }\n }\n\n sortEdges(id: string, relation: Relation, order: string[]) {\n const edgesRx = this._edges(id);\n const edges = this._registry.get(edgesRx);\n const unsorted = edges[relation].filter((id) => !order.includes(id)) ?? [];\n const sorted = order.filter((id) => edges[relation].includes(id)) ?? [];\n edges[relation].splice(0, edges[relation].length, ...[...sorted, ...unsorted]);\n this._registry.set(edgesRx, edges);\n }\n\n traverse({ visitor, source = ROOT_ID, relation = 'outbound' }: GraphTraversalOptions, path: string[] = []): void {\n // Break cycles.\n if (path.includes(source)) {\n return;\n }\n\n const node = this.getNodeOrThrow(source);\n const shouldContinue = visitor(node, [...path, source]);\n if (shouldContinue === false) {\n return;\n }\n\n Object.values(this.getConnections(source, relation)).forEach((child) =>\n this.traverse({ source: child.id, relation, visitor }, [...path, source]),\n );\n }\n\n getPath({ source = 'root', target }: { source?: string; target: string }): Option.Option<string[]> {\n return pipe(\n this.getNode(source),\n Option.flatMap((node) => {\n let found: Option.Option<string[]> = Option.none();\n this.traverse({\n source: node.id,\n visitor: (node, path) => {\n if (Option.isSome(found)) {\n return false;\n }\n\n if (node.id === target) {\n found = Option.some(path);\n }\n },\n });\n\n return found;\n }),\n );\n }\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 (Option.isSome(path)) {\n return path.value;\n }\n\n const trigger = new Trigger<string[]>();\n const i = setInterval(() => {\n const path = this.getPath(params);\n if (Option.isSome(path)) {\n trigger.wake(path.value);\n }\n }, interval);\n\n return trigger.wait({ timeout }).finally(() => clearInterval(i));\n }\n\n /** @internal */\n _constructNode(node: NodeArg<any>): Option.Option<Node> {\n return Option.some({ [graphSymbol]: this, data: null, properties: {}, ...node });\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Registry, Rx } from '@effect-rx/rx-react';\nimport { effect } from '@preact/signals-core';\nimport { Array, type Option, pipe, Record } from 'effect';\n\nimport { type MulticastObservable, type CleanupFn } from '@dxos/async';\nimport { log } from '@dxos/log';\nimport { byPosition, getDebugName, isNode, isNonNullable, type MaybePromise, type Position } from '@dxos/util';\n\nimport { ACTION_GROUP_TYPE, ACTION_TYPE, Graph, ROOT_ID, type GraphParams, type ExpandableGraph } from './graph';\nimport { actionGroupSymbol, type ActionData, type Node, type NodeArg, type Relation } from './node';\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 = (node: Rx.Rx<Option.Option<Node>>) => Rx.Rx<NodeArg<any>[]>;\n\n/**\n * Constrained case of the connector extension for more easily adding actions to the graph.\n */\nexport type ActionsExtension = (\n node: Rx.Rx<Option.Option<Node>>,\n) => Rx.Rx<Omit<NodeArg<ActionData>, 'type' | 'nodes' | 'edges'>[]>;\n\n/**\n * Constrained case of the connector extension for more easily adding action groups to the graph.\n */\nexport type ActionGroupsExtension = (\n node: Rx.Rx<Option.Option<Node>>,\n) => Rx.Rx<Omit<NodeArg<typeof actionGroupSymbol>, 'type' | 'data' | 'nodes' | 'edges'>[]>;\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.position Affects the order the extensions are processed in.\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 = {\n id: string;\n relation?: Relation;\n position?: Position;\n // TODO(wittjosiah): On initialize to restore state from cache.\n // resolver?: ResolverExtension;\n connector?: ConnectorExtension;\n actions?: ActionsExtension;\n actionGroups?: ActionGroupsExtension;\n};\n\n/**\n * Create a graph builder extension.\n */\nexport const createExtension = (extension: CreateExtensionOptions): BuilderExtension[] => {\n const {\n id,\n position = 'static',\n relation = 'outbound',\n connector,\n actions: _actions,\n actionGroups: _actionGroups,\n } = extension;\n const getId = (key: string) => `${id}/${key}`;\n\n const actionGroups =\n _actionGroups &&\n Rx.family((node: Rx.Rx<Option.Option<Node>>) =>\n _actionGroups(node).pipe(Rx.withLabel(`graph-builder:actionGroups:${id}`)),\n );\n\n const actions =\n _actions &&\n Rx.family((node: Rx.Rx<Option.Option<Node>>) => _actions(node).pipe(Rx.withLabel(`graph-builder:actions:${id}`)));\n\n return [\n // resolver ? { id: getId('resolver'), position, resolver } : undefined,\n connector\n ? ({\n id: getId('connector'),\n position,\n relation,\n connector: Rx.family((key) => connector(key).pipe(Rx.withLabel(`graph-builder:connector:${id}`))),\n } satisfies BuilderExtension)\n : undefined,\n actionGroups\n ? ({\n id: getId('actionGroups'),\n position,\n relation: 'outbound',\n connector: Rx.family((node) =>\n Rx.make((get) =>\n get(actionGroups(node)).map((arg) => ({\n ...arg,\n data: actionGroupSymbol,\n type: ACTION_GROUP_TYPE,\n })),\n ).pipe(Rx.withLabel(`graph-builder:connector:actionGroups:${id}`)),\n ),\n } satisfies BuilderExtension)\n : undefined,\n actions\n ? ({\n id: getId('actions'),\n position,\n relation: 'outbound',\n connector: Rx.family((node) =>\n Rx.make((get) => get(actions(node)).map((arg) => ({ ...arg, type: ACTION_TYPE }))).pipe(\n Rx.withLabel(`graph-builder:connector:actions:${id}`),\n ),\n ),\n } satisfies BuilderExtension)\n : undefined,\n ].filter(isNonNullable);\n};\n\nexport type GraphBuilderTraverseOptions = {\n visitor: (node: Node, path: string[]) => MaybePromise<boolean | void>;\n registry?: Registry.Registry;\n source?: string;\n relation?: Relation;\n};\n\nexport type BuilderExtension = Readonly<{\n id: string;\n position: Position;\n relation?: Relation; // Only for connector.\n // resolver?: ResolverExtension;\n connector?: (node: Rx.Rx<Option.Option<Node>>) => Rx.Rx<NodeArg<any>[]>;\n}>;\n\nexport type BuilderExtensions = BuilderExtension | BuilderExtension[] | BuilderExtensions[];\n\nexport const flattenExtensions = (extension: BuilderExtensions, 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 // TODO(wittjosiah): Use Context.\n private readonly _connectorSubscriptions = new Map<string, CleanupFn>();\n private readonly _extensions = Rx.make(Record.empty<string, BuilderExtension>()).pipe(\n Rx.keepAlive,\n Rx.withLabel('graph-builder:extensions'),\n );\n\n private readonly _registry: Registry.Registry;\n private readonly _graph: Graph;\n\n constructor({ registry, ...params }: Pick<GraphParams, 'registry' | 'nodes' | 'edges'> = {}) {\n this._registry = registry ?? Registry.make();\n this._graph = new Graph({\n ...params,\n registry: this._registry,\n onExpand: (id, relation) => this._onExpand(id, relation),\n // onInitialize: (id) => this._onInitialize(id),\n onRemoveNode: (id) => this._onRemoveNode(id),\n });\n }\n\n static from(pickle?: string, registry?: Registry.Registry) {\n if (!pickle) {\n return new GraphBuilder({ registry });\n }\n\n const { nodes, edges } = JSON.parse(pickle);\n return new GraphBuilder({ nodes, edges, registry });\n }\n\n get graph(): ExpandableGraph {\n return this._graph;\n }\n\n get extensions() {\n return this._extensions;\n }\n\n addExtension(extensions: BuilderExtensions): GraphBuilder {\n flattenExtensions(extensions).forEach((extension) => {\n const extensions = this._registry.get(this._extensions);\n this._registry.set(this._extensions, Record.set(extensions, extension.id, extension));\n });\n return this;\n }\n\n removeExtension(id: string): GraphBuilder {\n const extensions = this._registry.get(this._extensions);\n this._registry.set(this._extensions, Record.remove(extensions, id));\n return this;\n }\n\n async explore(\n // TODO(wittjosiah): Currently defaulting to new registry.\n // Currently unsure about how to handle nodes which are expanded in the background.\n // This seems like a good place to start.\n { registry = Registry.make(), source = ROOT_ID, relation = 'outbound', visitor }: GraphBuilderTraverseOptions,\n path: string[] = [],\n ) {\n // Break cycles.\n if (path.includes(source)) {\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\n const node = registry.get(this._graph.nodeOrThrow(source));\n const shouldContinue = await visitor(node, [...path, node.id]);\n if (shouldContinue === false) {\n return;\n }\n\n const nodes = Object.values(this._registry.get(this._extensions))\n .filter((extension) => relation === (extension.relation ?? 'outbound'))\n .map((extension) => extension.connector)\n .filter(isNonNullable)\n .flatMap((connector) => registry.get(connector(this._graph.node(source))));\n\n await Promise.all(\n nodes.map((nodeArg) => {\n registry.set(this._graph._node(nodeArg.id), this._graph._constructNode(nodeArg));\n return this.explore({ registry, source: nodeArg.id, relation, visitor }, [...path, node.id]);\n }),\n );\n\n if (registry !== this._registry) {\n registry.reset();\n registry.dispose();\n }\n }\n\n destroy() {\n this._connectorSubscriptions.forEach((unsubscribe) => unsubscribe());\n this._connectorSubscriptions.clear();\n }\n\n private readonly _connectors = Rx.family<string, Rx.Rx<NodeArg<any>[]>>((key) => {\n return Rx.make((get) => {\n const [id, relation] = key.split('+');\n const node = this._graph.node(id);\n\n return pipe(\n get(this._extensions),\n Record.values,\n // TODO(wittjosiah): Sort on write rather than read.\n Array.sortBy(byPosition),\n Array.filter(({ relation: _relation = 'outbound' }) => _relation === relation),\n Array.map(({ connector }) => connector?.(node)),\n Array.filter(isNonNullable),\n Array.flatMap((result) => get(result)),\n );\n }).pipe(Rx.withLabel(`graph-builder:connectors:${key}`));\n });\n\n private _onExpand(id: string, relation: Relation) {\n log('onExpand', { id, relation, registry: getDebugName(this._registry) });\n const connectors = this._connectors(`${id}+${relation}`);\n\n let previous: string[] = [];\n const cancel = this._registry.subscribe(\n connectors,\n (nodes) => {\n const ids = nodes.map((n) => n.id);\n const removed = previous.filter((id) => !ids.includes(id));\n previous = ids;\n\n log('update', { id, relation, ids, removed });\n Rx.batch(() => {\n this._graph.removeEdges(\n removed.map((target) => ({ source: id, target })),\n true,\n );\n this._graph.addNodes(nodes);\n this._graph.addEdges(\n nodes.map((node) =>\n relation === 'outbound' ? { source: id, target: node.id } : { source: node.id, target: id },\n ),\n );\n this._graph.sortEdges(\n id,\n relation,\n nodes.map(({ id }) => id),\n );\n });\n },\n { immediate: true },\n );\n\n this._connectorSubscriptions.set(id, cancel);\n }\n\n // TODO(wittjosiah): On initialize to restore state from cache.\n // private async _onInitialize(id: string) {\n // log('onInitialize', { id });\n // }\n\n private _onRemoveNode(id: string) {\n this._connectorSubscriptions.get(id)?.();\n this._connectorSubscriptions.delete(id);\n }\n}\n\n/**\n * Creates an Rx.Rx<T> from a callback which accesses signals.\n * Will return a new rx instance each time.\n */\nexport const rxFromSignal = <T>(cb: () => T): Rx.Rx<T> => {\n return Rx.make((get) => {\n const dispose = effect(() => {\n get.setSelf(cb());\n });\n\n get.addFinalizer(() => dispose());\n\n return cb();\n });\n};\n\nconst observableFamily = Rx.family((observable: MulticastObservable<any>) => {\n return Rx.make((get) => {\n const subscription = observable.subscribe((value) => get.setSelf(value));\n\n get.addFinalizer(() => subscription.unsubscribe());\n\n return observable.get();\n });\n});\n\n/**\n * Creates an Rx.Rx<T> from a MulticastObservable<T>\n * Will return the same rx instance for the same observable.\n */\nexport const rxFromObservable = <T>(observable: MulticastObservable<T>): Rx.Rx<T> => {\n return observableFamily(observable) as Rx.Rx<T>;\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 // TODO(burdon): Allow string array, which is concatenated.\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<TData = any, TProperties extends Record<string, any> = Record<string, any>> = (\n node: Node<unknown, Record<string, any>>,\n connectedNode: Node,\n) => node is Node<TData, TProperties>;\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 parent?: 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"],
5
- "mappings": "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",
6
- "names": ["Registry", "Rx", "Option", "pipe", "Record", "Event", "Trigger", "todo", "invariant", "log", "isNonNullable", "graphSymbol", "Symbol", "getGraph", "node", "graph", "ROOT_ID", "ROOT_TYPE", "ACTION_TYPE", "ACTION_GROUP_TYPE", "Graph", "constructor", "registry", "nodes", "edges", "onExpand", "onRemoveNode", "onNodeChanged", "_expanded", "empty", "_initialized", "_initialEdges", "_initialNodes", "fromEntries", "_constructNode", "id", "type", "data", "properties", "_node", "family", "initial", "flatten", "get", "make", "keepAlive", "withLabel", "_nodeOrThrow", "isSome", "value", "_edges", "getOrElse", "inbound", "outbound", "_connections", "key", "relation", "split", "map", "filter", "o", "_actions", "_json", "toJSON", "seen", "connections", "obj", "length", "slice", "label", "n", "nextSeen", "includes", "undefined", "root", "nodeOrThrow", "_registry", "_onExpand", "_onRemoveNode", "forEach", "set", "Object", "entries", "source", "json", "actions", "getNodeOrThrow", "getNode", "getConnections", "getActions", "getEdges", "expand", "expanded", "addNodes", "batch", "addNode", "nodeArg", "nodeRx", "match", "onSome", "typeChanged", "dataChanged", "propertiesChanged", "keys", "some", "newNode", "emit", "onNone", "target", "addEdges", "removeNodes", "ids", "removeNode", "none", "removeEdges", "edge", "addEdge", "edgeArg", "sourceRx", "targetRx", "removeOrphans", "removeEdge", "sortEdges", "order", "edgesRx", "unsorted", "sorted", "splice", "traverse", "visitor", "path", "shouldContinue", "values", "child", "getPath", "flatMap", "found", "waitForPath", "params", "timeout", "interval", "trigger", "i", "setInterval", "wake", "wait", "finally", "clearInterval", "Registry", "Rx", "effect", "Array", "pipe", "Record", "log", "byPosition", "getDebugName", "isNode", "isNonNullable", "isGraphNode", "data", "properties", "isAction", "actionGroupSymbol", "Symbol", "isActionGroup", "isActionLike", "createExtension", "extension", "id", "position", "relation", "connector", "actions", "_actions", "actionGroups", "_actionGroups", "getId", "key", "Rx", "family", "node", "pipe", "withLabel", "undefined", "make", "get", "map", "arg", "data", "actionGroupSymbol", "type", "ACTION_GROUP_TYPE", "ACTION_TYPE", "filter", "isNonNullable", "flattenExtensions", "acc", "Array", "isArray", "flatMap", "ext", "GraphBuilder", "constructor", "registry", "params", "_connectorSubscriptions", "Map", "_extensions", "Record", "empty", "keepAlive", "_connectors", "split", "_graph", "values", "sortBy", "byPosition", "_relation", "result", "_registry", "Registry", "Graph", "onExpand", "_onExpand", "onRemoveNode", "_onRemoveNode", "from", "pickle", "nodes", "edges", "JSON", "parse", "graph", "extensions", "addExtension", "forEach", "set", "removeExtension", "remove", "explore", "source", "ROOT_ID", "visitor", "path", "includes", "isNode", "yieldOrContinue", "nodeOrThrow", "shouldContinue", "Object", "Promise", "all", "nodeArg", "_node", "_constructNode", "reset", "dispose", "destroy", "unsubscribe", "clear", "log", "getDebugName", "connectors", "previous", "cancel", "subscribe", "ids", "n", "removed", "batch", "removeEdges", "target", "addNodes", "addEdges", "sortEdges", "immediate", "delete", "rxFromSignal", "cb", "effect", "setSelf", "addFinalizer", "observableFamily", "observable", "subscription", "value", "rxFromObservable"]
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Registry, Rx } from '@effect-rx/rx-react';\nimport { Option, pipe, Record } from 'effect';\n\nimport { Event, Trigger } from '@dxos/async';\nimport { todo } from '@dxos/debug';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { isNonNullable, type MakeOptional } from '@dxos/util';\n\nimport { type NodeArg, type Node, type Relation, type Action, type ActionGroup } 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\n/**\n * Get the Graph a Node is currently associated with.\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 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_ID\n */\n source?: string;\n\n /**\n * The relation to traverse graph edges.\n *\n * @default 'outbound'\n */\n relation?: Relation;\n};\n\nexport type GraphParams = {\n registry?: Registry.Registry;\n nodes?: MakeOptional<Node, 'data' | 'cacheable'>[];\n edges?: Record<string, Edges>;\n onExpand?: Graph['_onExpand'];\n // TODO(wittjosiah): On initialize to restore state from cache.\n // onInitialize?: Graph['_onInitialize'];\n onRemoveNode?: Graph['_onRemoveNode'];\n};\n\nexport type Edge = { source: string; target: string };\nexport type Edges = { inbound: string[]; outbound: string[] };\n\nexport interface ReadableGraph {\n /**\n * Event emitted when a node is changed.\n */\n onNodeChanged: Event<{ id: string; node: Option.Option<Node> }>;\n\n /**\n * Convert the graph to a JSON object.\n */\n toJSON(id?: string): object;\n\n json(id?: string): Rx.Rx<any>;\n\n /**\n * Get the rx key for the node with the given id.\n */\n node(id: string): Rx.Rx<Option.Option<Node>>;\n\n /**\n * Get the rx key for the node with the given id.\n */\n nodeOrThrow(id: string): Rx.Rx<Node>;\n\n /**\n * Get the rx key for the connections of the node with the given id.\n */\n connections(id: string, relation?: Relation): Rx.Rx<Node[]>;\n\n /**\n * Get the rx key for the actions of the node with the given id.\n */\n actions(id: string): Rx.Rx<(Action | ActionGroup)[]>;\n\n /**\n * Get the rx key for the edges of the node with the given id.\n */\n edges(id: string): Rx.Rx<Edges>;\n\n /**\n * Alias for `getNodeOrThrow(ROOT_ID)`.\n */\n get root(): Node;\n\n /**\n * Get the node with the given id from the graph's registry.\n */\n getNode(id: string): Option.Option<Node>;\n\n /**\n * Get the node with the given id from the graph's registry.\n *\n * @throws If the node is Option.none().\n */\n getNodeOrThrow(id: string): Node;\n\n /**\n * Get all nodes connected to the node with the given id by the given relation from the graph's registry.\n */\n getConnections(id: string, relation?: Relation): Node[];\n\n /**\n * Get all actions connected to the node with the given id from the graph's registry.\n */\n getActions(id: string): Node[];\n\n /**\n * Get the edges from the node with the given id from the graph's registry.\n */\n getEdges(id: string): Edges;\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(options: GraphTraversalOptions, path?: string[]): void;\n\n /**\n * Get the path between two nodes in the graph.\n */\n getPath(params: { source?: string; target: string }): Option.Option<string[]>;\n\n /**\n * Wait for the path between two nodes in the graph to be established.\n */\n waitForPath(\n params: { source?: string; target: string },\n options?: { timeout?: number; interval?: number },\n ): Promise<string[]>;\n}\n\nexport interface ExpandableGraph extends ReadableGraph {\n /**\n * Initialize a node in the graph.\n *\n * Fires the `onInitialize` callback to provide initial data for a node.\n */\n // initialize(id: string): Promise<void>;\n\n /**\n * Expand a node in the graph.\n *\n * Fires the `onExpand` callback to add connections to the node.\n */\n expand(id: string, relation?: Relation): void;\n\n /**\n * Sort the edges of the node with the given id.\n */\n sortEdges(id: string, relation: Relation, order: string[]): void;\n}\n\nexport interface WritableGraph extends ExpandableGraph {\n /**\n * Add nodes to the graph.\n */\n addNodes(nodes: NodeArg<any, Record<string, any>>[]): void;\n\n /**\n * Add a node to the graph.\n */\n addNode(node: NodeArg<any, Record<string, any>>): void;\n\n /**\n * Remove nodes from the graph.\n */\n removeNodes(ids: string[], edges?: boolean): void;\n\n /**\n * Remove a node from the graph.\n */\n removeNode(id: string, edges?: boolean): void;\n\n /**\n * Add edges to the graph.\n */\n addEdges(edges: Edge[]): void;\n\n /**\n * Add an edge to the graph.\n */\n addEdge(edge: Edge): void;\n\n /**\n * Remove edges from the graph.\n */\n removeEdges(edges: Edge[], removeOrphans?: boolean): void;\n\n /**\n * Remove an edge from the graph.\n */\n removeEdge(edge: Edge, removeOrphans?: boolean): void;\n}\n\n/**\n * The Graph represents the user interface information architecture of the application constructed via plugins.\n */\nexport class Graph implements WritableGraph {\n readonly onNodeChanged = new Event<{ id: string; node: Option.Option<Node> }>();\n\n private readonly _onExpand?: (id: string, relation: Relation) => void;\n // private readonly _onInitialize?: (id: string) => Promise<void>;\n private readonly _onRemoveNode?: (id: string) => void;\n\n private readonly _registry: Registry.Registry;\n private readonly _expanded = Record.empty<string, boolean>();\n private readonly _initialized = Record.empty<string, boolean>();\n private readonly _initialEdges = Record.empty<string, Edges>();\n private readonly _initialNodes = Record.fromEntries([\n [ROOT_ID, this._constructNode({ id: ROOT_ID, type: ROOT_TYPE, data: null, properties: {} })],\n ]);\n\n /** @internal */\n readonly _node = Rx.family<string, Rx.Writable<Option.Option<Node>>>((id) => {\n const initial = Option.flatten(Record.get(this._initialNodes, id));\n return Rx.make<Option.Option<Node>>(initial).pipe(Rx.keepAlive, Rx.withLabel(`graph:node:${id}`));\n });\n\n private readonly _nodeOrThrow = Rx.family<string, Rx.Rx<Node>>((id) => {\n return Rx.make((get) => {\n const node = get(this._node(id));\n invariant(Option.isSome(node), `Node not available: ${id}`);\n return node.value;\n });\n });\n\n private readonly _edges = Rx.family<string, Rx.Writable<Edges>>((id) => {\n const initial = Record.get(this._initialEdges, id).pipe(Option.getOrElse(() => ({ inbound: [], outbound: [] })));\n return Rx.make<Edges>(initial).pipe(Rx.keepAlive, Rx.withLabel(`graph:edges:${id}`));\n });\n\n // NOTE: Currently the argument to the family needs to be referentially stable for the rx to be referentially stable.\n // TODO(wittjosiah): Rx feature request, support for something akin to `ComplexMap` to allow for complex arguments.\n private readonly _connections = Rx.family<string, Rx.Rx<Node[]>>((key) => {\n return Rx.make((get) => {\n const [id, relation] = key.split('$');\n const edges = get(this._edges(id));\n return edges[relation as Relation]\n .map((id) => get(this._node(id)))\n .filter(Option.isSome)\n .map((o) => o.value);\n }).pipe(Rx.withLabel(`graph:connections:${key}`));\n });\n\n private readonly _actions = Rx.family<string, Rx.Rx<(Action | ActionGroup)[]>>((id) => {\n return Rx.make((get) => {\n return get(this._connections(`${id}$outbound`)).filter(\n (node) => node.type === ACTION_TYPE || node.type === ACTION_GROUP_TYPE,\n );\n }).pipe(Rx.withLabel(`graph:actions:${id}`));\n });\n\n private readonly _json = Rx.family<string, Rx.Rx<any>>((id) => {\n return Rx.make((get) => {\n const toJSON = (node: Node, seen: string[] = []): any => {\n const nodes = get(this.connections(node.id));\n const obj: Record<string, any> = {\n id: node.id.length > 32 ? `${node.id.slice(0, 32)}...` : 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(isNonNullable);\n }\n return obj;\n };\n\n const root = get(this.nodeOrThrow(id));\n return toJSON(root);\n }).pipe(Rx.withLabel(`graph:json:${id}`));\n });\n\n constructor({ registry, nodes, edges, onExpand, onRemoveNode }: GraphParams = {}) {\n this._registry = registry ?? Registry.make();\n this._onExpand = onExpand;\n this._onRemoveNode = onRemoveNode;\n\n if (nodes) {\n nodes.forEach((node) => {\n Record.set(this._initialNodes, node.id, this._constructNode(node));\n });\n }\n\n if (edges) {\n Object.entries(edges).forEach(([source, edges]) => {\n Record.set(this._initialEdges, source, edges);\n });\n }\n }\n\n toJSON(id = ROOT_ID) {\n return this._registry.get(this._json(id));\n }\n\n json(id = ROOT_ID) {\n return this._json(id);\n }\n\n node(id: string): Rx.Rx<Option.Option<Node>> {\n return this._node(id);\n }\n\n nodeOrThrow(id: string): Rx.Rx<Node> {\n return this._nodeOrThrow(id);\n }\n\n connections(id: string, relation: Relation = 'outbound'): Rx.Rx<Node[]> {\n return this._connections(`${id}$${relation}`);\n }\n\n actions(id: string) {\n return this._actions(id);\n }\n\n edges(id: string): Rx.Rx<Edges> {\n return this._edges(id);\n }\n\n get root() {\n return this.getNodeOrThrow(ROOT_ID);\n }\n\n getNode(id: string): Option.Option<Node> {\n return this._registry.get(this.node(id));\n }\n\n getNodeOrThrow(id: string): Node {\n return this._registry.get(this.nodeOrThrow(id));\n }\n\n getConnections(id: string, relation: Relation = 'outbound'): Node[] {\n return this._registry.get(this.connections(id, relation));\n }\n\n getActions(id: string): Node[] {\n return this._registry.get(this.actions(id));\n }\n\n getEdges(id: string): Edges {\n return this._registry.get(this.edges(id));\n }\n\n // TODO(wittjosiah): On initialize to restore state from cache.\n // async initialize(id: string) {\n // const initialized = Record.get(this._initialized, id).pipe(Option.getOrElse(() => false));\n // log('initialize', { id, initialized });\n // if (!initialized) {\n // await this._onInitialize?.(id);\n // Record.set(this._initialized, id, true);\n // }\n // }\n\n expand(id: string, relation: Relation = 'outbound'): void {\n const key = `${id}$${relation}`;\n const expanded = Record.get(this._expanded, key).pipe(Option.getOrElse(() => false));\n log('expand', { key, expanded });\n if (!expanded) {\n this._onExpand?.(id, relation);\n Record.set(this._expanded, key, true);\n }\n }\n\n addNodes(nodes: NodeArg<any, Record<string, any>>[]): void {\n Rx.batch(() => {\n nodes.map((node) => this.addNode(node));\n });\n }\n\n addNode({ nodes, edges, ...nodeArg }: NodeArg<any, Record<string, any>>): void {\n const { id, type, data = null, properties = {} } = nodeArg;\n const nodeRx = this._node(id);\n const node = this._registry.get(nodeRx);\n Option.match(node, {\n onSome: (node) => {\n const typeChanged = node.type !== type;\n const dataChanged = node.data !== data;\n const propertiesChanged = Object.keys(properties).some((key) => node.properties[key] !== properties[key]);\n log('existing node', { id, typeChanged, dataChanged, propertiesChanged });\n if (typeChanged || dataChanged || propertiesChanged) {\n log('updating node', { id, type, data, properties });\n const newNode = Option.some({ ...node, type, data, properties: { ...node.properties, ...properties } });\n this._registry.set(nodeRx, newNode);\n this.onNodeChanged.emit({ id, node: newNode });\n }\n },\n onNone: () => {\n log('new node', { id, type, data, properties });\n const newNode = this._constructNode({ id, type, data, properties });\n this._registry.set(nodeRx, newNode);\n this.onNodeChanged.emit({ id, node: newNode });\n },\n });\n\n if (nodes) {\n // Rx.batch(() => {\n this.addNodes(nodes);\n const _edges = nodes.map((node) => ({ source: id, target: node.id }));\n this.addEdges(_edges);\n // });\n }\n\n if (edges) {\n todo();\n }\n }\n\n removeNodes(ids: string[], edges = false): void {\n Rx.batch(() => {\n ids.map((id) => this.removeNode(id, edges));\n });\n }\n\n removeNode(id: string, edges = false): void {\n const nodeRx = this._node(id);\n // TODO(wittjosiah): Is there a way to mark these rx values for garbage collection?\n this._registry.set(nodeRx, Option.none());\n this.onNodeChanged.emit({ id, node: Option.none() });\n // TODO(wittjosiah): Reset expanded and initialized flags?\n\n if (edges) {\n const { inbound, outbound } = this._registry.get(this._edges(id));\n const edges = [\n ...inbound.map((source) => ({ source, target: id })),\n ...outbound.map((target) => ({ source: id, target })),\n ];\n this.removeEdges(edges);\n }\n\n this._onRemoveNode?.(id);\n }\n\n addEdges(edges: Edge[]): void {\n Rx.batch(() => {\n edges.map((edge) => this.addEdge(edge));\n });\n }\n\n addEdge(edgeArg: Edge): void {\n const sourceRx = this._edges(edgeArg.source);\n const source = this._registry.get(sourceRx);\n if (!source.outbound.includes(edgeArg.target)) {\n log('add outbound edge', { source: edgeArg.source, target: edgeArg.target });\n this._registry.set(sourceRx, { inbound: source.inbound, outbound: [...source.outbound, edgeArg.target] });\n }\n\n const targetRx = this._edges(edgeArg.target);\n const target = this._registry.get(targetRx);\n if (!target.inbound.includes(edgeArg.source)) {\n log('add inbound edge', { source: edgeArg.source, target: edgeArg.target });\n this._registry.set(targetRx, { inbound: [...target.inbound, edgeArg.source], outbound: target.outbound });\n }\n }\n\n removeEdges(edges: Edge[], removeOrphans = false): void {\n Rx.batch(() => {\n edges.map((edge) => this.removeEdge(edge, removeOrphans));\n });\n }\n\n removeEdge(edgeArg: Edge, removeOrphans = false): void {\n const sourceRx = this._edges(edgeArg.source);\n const source = this._registry.get(sourceRx);\n if (source.outbound.includes(edgeArg.target)) {\n this._registry.set(sourceRx, {\n inbound: source.inbound,\n outbound: source.outbound.filter((id) => id !== edgeArg.target),\n });\n }\n\n const targetRx = this._edges(edgeArg.target);\n const target = this._registry.get(targetRx);\n if (target.inbound.includes(edgeArg.source)) {\n this._registry.set(targetRx, {\n inbound: target.inbound.filter((id) => id !== edgeArg.source),\n outbound: target.outbound,\n });\n }\n\n if (removeOrphans) {\n const source = this._registry.get(sourceRx);\n const target = this._registry.get(targetRx);\n if (source.outbound.length === 0 && source.inbound.length === 0 && edgeArg.source !== ROOT_ID) {\n this.removeNodes([edgeArg.source]);\n }\n if (target.outbound.length === 0 && target.inbound.length === 0 && edgeArg.target !== ROOT_ID) {\n this.removeNodes([edgeArg.target]);\n }\n }\n }\n\n sortEdges(id: string, relation: Relation, order: string[]): void {\n const edgesRx = this._edges(id);\n const edges = this._registry.get(edgesRx);\n const unsorted = edges[relation].filter((id) => !order.includes(id)) ?? [];\n const sorted = order.filter((id) => edges[relation].includes(id)) ?? [];\n edges[relation].splice(0, edges[relation].length, ...[...sorted, ...unsorted]);\n this._registry.set(edgesRx, edges);\n }\n\n traverse({ visitor, source = ROOT_ID, relation = 'outbound' }: GraphTraversalOptions, path: string[] = []): void {\n // Break cycles.\n if (path.includes(source)) {\n return;\n }\n\n const node = this.getNodeOrThrow(source);\n const shouldContinue = visitor(node, [...path, source]);\n if (shouldContinue === false) {\n return;\n }\n\n Object.values(this.getConnections(source, relation)).forEach((child) =>\n this.traverse({ source: child.id, relation, visitor }, [...path, source]),\n );\n }\n\n getPath({ source = 'root', target }: { source?: string; target: string }): Option.Option<string[]> {\n return pipe(\n this.getNode(source),\n Option.flatMap((node) => {\n let found: Option.Option<string[]> = Option.none();\n this.traverse({\n source: node.id,\n visitor: (node, path) => {\n if (Option.isSome(found)) {\n return false;\n }\n\n if (node.id === target) {\n found = Option.some(path);\n }\n },\n });\n\n return found;\n }),\n );\n }\n\n async waitForPath(\n params: { source?: string; target: string },\n { timeout = 5_000, interval = 500 }: { timeout?: number; interval?: number } = {},\n ): Promise<string[]> {\n const path = this.getPath(params);\n if (Option.isSome(path)) {\n return path.value;\n }\n\n const trigger = new Trigger<string[]>();\n const i = setInterval(() => {\n const path = this.getPath(params);\n if (Option.isSome(path)) {\n trigger.wake(path.value);\n }\n }, interval);\n\n return trigger.wait({ timeout }).finally(() => clearInterval(i));\n }\n\n /** @internal */\n _constructNode(node: NodeArg<any>): Option.Option<Node> {\n return Option.some({ [graphSymbol]: this, data: null, properties: {}, ...node });\n }\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Registry, Rx } from '@effect-rx/rx-react';\nimport { effect } from '@preact/signals-core';\nimport { Array, type Option, pipe, Record } from 'effect';\n\nimport { type MulticastObservable, type CleanupFn } from '@dxos/async';\nimport { log } from '@dxos/log';\nimport { byPosition, getDebugName, isNode, isNonNullable, type MaybePromise, type Position } from '@dxos/util';\n\nimport { ACTION_GROUP_TYPE, ACTION_TYPE, Graph, ROOT_ID, type GraphParams, type ExpandableGraph } from './graph';\nimport { actionGroupSymbol, type ActionData, type Node, type NodeArg, type Relation } from './node';\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 = (node: Rx.Rx<Option.Option<Node>>) => Rx.Rx<NodeArg<any>[]>;\n\n/**\n * Constrained case of the connector extension for more easily adding actions to the graph.\n */\nexport type ActionsExtension = (\n node: Rx.Rx<Option.Option<Node>>,\n) => Rx.Rx<Omit<NodeArg<ActionData>, 'type' | 'nodes' | 'edges'>[]>;\n\n/**\n * Constrained case of the connector extension for more easily adding action groups to the graph.\n */\nexport type ActionGroupsExtension = (\n node: Rx.Rx<Option.Option<Node>>,\n) => Rx.Rx<Omit<NodeArg<typeof actionGroupSymbol>, 'type' | 'data' | 'nodes' | 'edges'>[]>;\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.position Affects the order the extensions are processed in.\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 = {\n id: string;\n relation?: Relation;\n position?: Position;\n // TODO(wittjosiah): On initialize to restore state from cache.\n // resolver?: ResolverExtension;\n connector?: ConnectorExtension;\n actions?: ActionsExtension;\n actionGroups?: ActionGroupsExtension;\n};\n\n/**\n * Create a graph builder extension.\n */\nexport const createExtension = (extension: CreateExtensionOptions): BuilderExtension[] => {\n const {\n id,\n position = 'static',\n relation = 'outbound',\n connector: _connector,\n actions: _actions,\n actionGroups: _actionGroups,\n } = extension;\n const getId = (key: string) => `${id}/${key}`;\n\n const connector =\n _connector &&\n Rx.family((node: Rx.Rx<Option.Option<Node>>) =>\n _connector(node).pipe(Rx.withLabel(`graph-builder:_connector:${id}`)),\n );\n\n const actionGroups =\n _actionGroups &&\n Rx.family((node: Rx.Rx<Option.Option<Node>>) =>\n _actionGroups(node).pipe(Rx.withLabel(`graph-builder:_actionGroups:${id}`)),\n );\n\n const actions =\n _actions &&\n Rx.family((node: Rx.Rx<Option.Option<Node>>) => _actions(node).pipe(Rx.withLabel(`graph-builder:_actions:${id}`)));\n\n return [\n // resolver ? { id: getId('resolver'), position, resolver } : undefined,\n connector\n ? ({\n id: getId('connector'),\n position,\n relation,\n connector: Rx.family((node) =>\n Rx.make((get) => {\n try {\n return get(connector(node));\n } catch {\n log.warn('Error in connector', { id: getId('connector'), node });\n return [];\n }\n }).pipe(Rx.withLabel(`graph-builder:connector:${id}`)),\n ),\n } satisfies BuilderExtension)\n : undefined,\n actionGroups\n ? ({\n id: getId('actionGroups'),\n position,\n relation: 'outbound',\n connector: Rx.family((node) =>\n Rx.make((get) => {\n try {\n return get(actionGroups(node)).map((arg) => ({\n ...arg,\n data: actionGroupSymbol,\n type: ACTION_GROUP_TYPE,\n }));\n } catch {\n log.warn('Error in actionGroups', { id: getId('actionGroups'), node });\n return [];\n }\n }).pipe(Rx.withLabel(`graph-builder:connector:actionGroups:${id}`)),\n ),\n } satisfies BuilderExtension)\n : undefined,\n actions\n ? ({\n id: getId('actions'),\n position,\n relation: 'outbound',\n connector: Rx.family((node) =>\n Rx.make((get) => {\n try {\n return get(actions(node)).map((arg) => ({ ...arg, type: ACTION_TYPE }));\n } catch {\n log.warn('Error in actions', { id: getId('actions'), node });\n return [];\n }\n }).pipe(Rx.withLabel(`graph-builder:connector:actions:${id}`)),\n ),\n } satisfies BuilderExtension)\n : undefined,\n ].filter(isNonNullable);\n};\n\nexport type GraphBuilderTraverseOptions = {\n visitor: (node: Node, path: string[]) => MaybePromise<boolean | void>;\n registry?: Registry.Registry;\n source?: string;\n relation?: Relation;\n};\n\nexport type BuilderExtension = Readonly<{\n id: string;\n position: Position;\n relation?: Relation; // Only for connector.\n // resolver?: ResolverExtension;\n connector?: (node: Rx.Rx<Option.Option<Node>>) => Rx.Rx<NodeArg<any>[]>;\n}>;\n\nexport type BuilderExtensions = BuilderExtension | BuilderExtension[] | BuilderExtensions[];\n\nexport const flattenExtensions = (extension: BuilderExtensions, 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 // TODO(wittjosiah): Use Context.\n private readonly _connectorSubscriptions = new Map<string, CleanupFn>();\n private readonly _extensions = Rx.make(Record.empty<string, BuilderExtension>()).pipe(\n Rx.keepAlive,\n Rx.withLabel('graph-builder:extensions'),\n );\n\n private readonly _registry: Registry.Registry;\n private readonly _graph: Graph;\n\n constructor({ registry, ...params }: Pick<GraphParams, 'registry' | 'nodes' | 'edges'> = {}) {\n this._registry = registry ?? Registry.make();\n this._graph = new Graph({\n ...params,\n registry: this._registry,\n onExpand: (id, relation) => this._onExpand(id, relation),\n // onInitialize: (id) => this._onInitialize(id),\n onRemoveNode: (id) => this._onRemoveNode(id),\n });\n }\n\n static from(pickle?: string, registry?: Registry.Registry): GraphBuilder {\n if (!pickle) {\n return new GraphBuilder({ registry });\n }\n\n const { nodes, edges } = JSON.parse(pickle);\n return new GraphBuilder({ nodes, edges, registry });\n }\n\n get graph(): ExpandableGraph {\n return this._graph;\n }\n\n get extensions() {\n return this._extensions;\n }\n\n addExtension(extensions: BuilderExtensions): GraphBuilder {\n flattenExtensions(extensions).forEach((extension) => {\n const extensions = this._registry.get(this._extensions);\n this._registry.set(this._extensions, Record.set(extensions, extension.id, extension));\n });\n return this;\n }\n\n removeExtension(id: string): GraphBuilder {\n const extensions = this._registry.get(this._extensions);\n this._registry.set(this._extensions, Record.remove(extensions, id));\n return this;\n }\n\n async explore(\n // TODO(wittjosiah): Currently defaulting to new registry.\n // Currently unsure about how to handle nodes which are expanded in the background.\n // This seems like a good place to start.\n { registry = Registry.make(), source = ROOT_ID, relation = 'outbound', visitor }: GraphBuilderTraverseOptions,\n path: string[] = [],\n ): Promise<void> {\n // Break cycles.\n if (path.includes(source)) {\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\n const node = registry.get(this._graph.nodeOrThrow(source));\n const shouldContinue = await visitor(node, [...path, node.id]);\n if (shouldContinue === false) {\n return;\n }\n\n const nodes = Object.values(this._registry.get(this._extensions))\n .filter((extension) => relation === (extension.relation ?? 'outbound'))\n .map((extension) => extension.connector)\n .filter(isNonNullable)\n .flatMap((connector) => registry.get(connector(this._graph.node(source))));\n\n await Promise.all(\n nodes.map((nodeArg) => {\n registry.set(this._graph._node(nodeArg.id), this._graph._constructNode(nodeArg));\n return this.explore({ registry, source: nodeArg.id, relation, visitor }, [...path, node.id]);\n }),\n );\n\n if (registry !== this._registry) {\n registry.reset();\n registry.dispose();\n }\n }\n\n destroy(): void {\n this._connectorSubscriptions.forEach((unsubscribe) => unsubscribe());\n this._connectorSubscriptions.clear();\n }\n\n private readonly _connectors = Rx.family<string, Rx.Rx<NodeArg<any>[]>>((key) => {\n return Rx.make((get) => {\n const [id, relation] = key.split('+');\n const node = this._graph.node(id);\n\n return pipe(\n get(this._extensions),\n Record.values,\n // TODO(wittjosiah): Sort on write rather than read.\n Array.sortBy(byPosition),\n Array.filter(({ relation: _relation = 'outbound' }) => _relation === relation),\n Array.map(({ connector }) => connector?.(node)),\n Array.filter(isNonNullable),\n Array.flatMap((result) => get(result)),\n );\n }).pipe(Rx.withLabel(`graph-builder:connectors:${key}`));\n });\n\n private _onExpand(id: string, relation: Relation): void {\n log('onExpand', { id, relation, registry: getDebugName(this._registry) });\n const connectors = this._connectors(`${id}+${relation}`);\n\n let previous: string[] = [];\n const cancel = this._registry.subscribe(\n connectors,\n (nodes) => {\n const ids = nodes.map((n) => n.id);\n const removed = previous.filter((id) => !ids.includes(id));\n previous = ids;\n\n log('update', { id, relation, ids, removed });\n Rx.batch(() => {\n this._graph.removeEdges(\n removed.map((target) => ({ source: id, target })),\n true,\n );\n this._graph.addNodes(nodes);\n this._graph.addEdges(\n nodes.map((node) =>\n relation === 'outbound' ? { source: id, target: node.id } : { source: node.id, target: id },\n ),\n );\n this._graph.sortEdges(\n id,\n relation,\n nodes.map(({ id }) => id),\n );\n });\n },\n { immediate: true },\n );\n\n this._connectorSubscriptions.set(id, cancel);\n }\n\n // TODO(wittjosiah): On initialize to restore state from cache.\n // private async _onInitialize(id: string) {\n // log('onInitialize', { id });\n // }\n\n private _onRemoveNode(id: string): void {\n this._connectorSubscriptions.get(id)?.();\n this._connectorSubscriptions.delete(id);\n }\n}\n\n/**\n * Creates an Rx.Rx<T> from a callback which accesses signals.\n * Will return a new rx instance each time.\n */\nexport const rxFromSignal = <T>(cb: () => T): Rx.Rx<T> => {\n return Rx.make((get) => {\n const dispose = effect(() => {\n get.setSelf(cb());\n });\n\n get.addFinalizer(() => dispose());\n\n return cb();\n });\n};\n\nconst observableFamily = Rx.family((observable: MulticastObservable<any>) => {\n return Rx.make((get) => {\n const subscription = observable.subscribe((value) => get.setSelf(value));\n\n get.addFinalizer(() => subscription.unsubscribe());\n\n return observable.get();\n });\n});\n\n/**\n * Creates an Rx.Rx<T> from a MulticastObservable<T>\n * Will return the same rx instance for the same observable.\n */\nexport const rxFromObservable = <T>(observable: MulticastObservable<T>): Rx.Rx<T> => {\n return observableFamily(observable) as Rx.Rx<T>;\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 // TODO(burdon): Allow string array, which is concatenated.\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<TData = any, TProperties extends Record<string, any> = Record<string, any>> = (\n node: Node<unknown, Record<string, any>>,\n connectedNode: Node,\n) => node is Node<TData, TProperties>;\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 parent?: 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"],
5
+ "mappings": "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",
6
+ "names": ["Registry", "Rx", "Option", "pipe", "Record", "Event", "Trigger", "todo", "invariant", "log", "isNonNullable", "graphSymbol", "Symbol", "getGraph", "node", "graph", "ROOT_ID", "ROOT_TYPE", "ACTION_TYPE", "ACTION_GROUP_TYPE", "Graph", "registry", "nodes", "edges", "onExpand", "onRemoveNode", "onNodeChanged", "_expanded", "empty", "_initialized", "_initialEdges", "_initialNodes", "fromEntries", "_constructNode", "id", "type", "data", "properties", "_node", "family", "initial", "flatten", "get", "make", "keepAlive", "withLabel", "_nodeOrThrow", "isSome", "value", "_edges", "getOrElse", "inbound", "outbound", "_connections", "key", "relation", "split", "map", "filter", "o", "_actions", "_json", "toJSON", "seen", "connections", "obj", "length", "slice", "label", "n", "nextSeen", "includes", "undefined", "root", "nodeOrThrow", "_registry", "_onExpand", "_onRemoveNode", "forEach", "set", "Object", "entries", "source", "json", "actions", "getNodeOrThrow", "getNode", "getConnections", "getActions", "getEdges", "expand", "expanded", "addNodes", "batch", "addNode", "nodeArg", "nodeRx", "match", "onSome", "typeChanged", "dataChanged", "propertiesChanged", "keys", "some", "newNode", "emit", "onNone", "target", "addEdges", "removeNodes", "ids", "removeNode", "none", "removeEdges", "edge", "addEdge", "edgeArg", "sourceRx", "targetRx", "removeOrphans", "removeEdge", "sortEdges", "order", "edgesRx", "unsorted", "sorted", "splice", "traverse", "visitor", "path", "shouldContinue", "values", "child", "getPath", "flatMap", "found", "waitForPath", "params", "timeout", "interval", "trigger", "i", "setInterval", "wake", "wait", "finally", "clearInterval", "Registry", "Rx", "effect", "Array", "pipe", "Record", "log", "byPosition", "getDebugName", "isNode", "isNonNullable", "isGraphNode", "data", "properties", "isAction", "actionGroupSymbol", "Symbol", "isActionGroup", "isActionLike", "createExtension", "extension", "id", "position", "relation", "connector", "_connector", "actions", "_actions", "actionGroups", "_actionGroups", "getId", "key", "Rx", "family", "node", "pipe", "withLabel", "make", "get", "log", "warn", "undefined", "map", "arg", "data", "actionGroupSymbol", "type", "ACTION_GROUP_TYPE", "ACTION_TYPE", "filter", "isNonNullable", "flattenExtensions", "acc", "Array", "isArray", "flatMap", "ext", "GraphBuilder", "registry", "params", "_connectorSubscriptions", "Map", "_extensions", "Record", "empty", "keepAlive", "_connectors", "split", "_graph", "values", "sortBy", "byPosition", "_relation", "result", "_registry", "Registry", "Graph", "onExpand", "_onExpand", "onRemoveNode", "_onRemoveNode", "from", "pickle", "nodes", "edges", "JSON", "parse", "graph", "extensions", "addExtension", "forEach", "set", "removeExtension", "remove", "explore", "source", "ROOT_ID", "visitor", "path", "includes", "isNode", "yieldOrContinue", "nodeOrThrow", "shouldContinue", "Object", "Promise", "all", "nodeArg", "_node", "_constructNode", "reset", "dispose", "destroy", "unsubscribe", "clear", "getDebugName", "connectors", "previous", "cancel", "subscribe", "ids", "n", "removed", "batch", "removeEdges", "target", "addNodes", "addEdges", "sortEdges", "immediate", "delete", "rxFromSignal", "cb", "effect", "setSelf", "addFinalizer", "observableFamily", "observable", "subscription", "value", "rxFromObservable"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"packages/sdk/app-graph/src/graph.ts":{"bytes":60445,"imports":[{"path":"@effect-rx/rx-react","kind":"import-statement","external":true},{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-graph/src/node.ts":{"bytes":5863,"imports":[],"format":"esm"},"packages/sdk/app-graph/src/graph-builder.ts":{"bytes":37311,"imports":[{"path":"@effect-rx/rx-react","kind":"import-statement","external":true},{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"effect","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/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":54354},"packages/sdk/app-graph/dist/lib/browser/index.mjs":{"imports":[{"path":"@effect-rx/rx-react","kind":"import-statement","external":true},{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@effect-rx/rx-react","kind":"import-statement","external":true},{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"effect","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","createExtension","flattenExtensions","getGraph","isAction","isActionGroup","isActionLike","isGraphNode","rxFromObservable","rxFromSignal"],"entryPoint":"packages/sdk/app-graph/src/index.ts","inputs":{"packages/sdk/app-graph/src/graph.ts":{"bytesInOutput":13422},"packages/sdk/app-graph/src/index.ts":{"bytesInOutput":0},"packages/sdk/app-graph/src/graph-builder.ts":{"bytesInOutput":7612},"packages/sdk/app-graph/src/node.ts":{"bytesInOutput":477}},"bytes":21985}}}
1
+ {"inputs":{"packages/sdk/app-graph/src/graph.ts":{"bytes":59825,"imports":[{"path":"@effect-rx/rx-react","kind":"import-statement","external":true},{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"packages/sdk/app-graph/src/node.ts":{"bytes":5827,"imports":[],"format":"esm"},"packages/sdk/app-graph/src/graph-builder.ts":{"bytes":40618,"imports":[{"path":"@effect-rx/rx-react","kind":"import-statement","external":true},{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"effect","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":636,"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/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":55893},"packages/sdk/app-graph/dist/lib/browser/index.mjs":{"imports":[{"path":"@effect-rx/rx-react","kind":"import-statement","external":true},{"path":"effect","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@effect-rx/rx-react","kind":"import-statement","external":true},{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"effect","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","createExtension","flattenExtensions","getGraph","isAction","isActionGroup","isActionLike","isGraphNode","rxFromObservable","rxFromSignal"],"entryPoint":"packages/sdk/app-graph/src/index.ts","inputs":{"packages/sdk/app-graph/src/graph.ts":{"bytesInOutput":13436},"packages/sdk/app-graph/src/index.ts":{"bytesInOutput":0},"packages/sdk/app-graph/src/graph-builder.ts":{"bytesInOutput":8779},"packages/sdk/app-graph/src/node.ts":{"bytesInOutput":477}},"bytes":23166}}}
@@ -252,6 +252,7 @@ var Graph = class {
252
252
  const dataChanged = node2.data !== data;
253
253
  const propertiesChanged = Object.keys(properties).some((key) => node2.properties[key] !== properties[key]);
254
254
  (0, import_log.log)("existing node", {
255
+ id,
255
256
  typeChanged,
256
257
  dataChanged,
257
258
  propertiesChanged
@@ -520,36 +521,82 @@ var isActionGroup = (data) => isGraphNode(data) ? data.data === actionGroupSymbo
520
521
  var isActionLike = (data) => isAction(data) || isActionGroup(data);
521
522
  var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/sdk/app-graph/src/graph-builder.ts";
522
523
  var createExtension = (extension) => {
523
- const { id, position = "static", relation = "outbound", connector, actions: _actions, actionGroups: _actionGroups } = extension;
524
+ const { id, position = "static", relation = "outbound", connector: _connector, actions: _actions, actionGroups: _actionGroups } = extension;
524
525
  const getId = (key) => `${id}/${key}`;
525
- const actionGroups = _actionGroups && import_rx_react2.Rx.family((node) => _actionGroups(node).pipe(import_rx_react2.Rx.withLabel(`graph-builder:actionGroups:${id}`)));
526
- const actions = _actions && import_rx_react2.Rx.family((node) => _actions(node).pipe(import_rx_react2.Rx.withLabel(`graph-builder:actions:${id}`)));
526
+ const connector = _connector && import_rx_react2.Rx.family((node) => _connector(node).pipe(import_rx_react2.Rx.withLabel(`graph-builder:_connector:${id}`)));
527
+ const actionGroups = _actionGroups && import_rx_react2.Rx.family((node) => _actionGroups(node).pipe(import_rx_react2.Rx.withLabel(`graph-builder:_actionGroups:${id}`)));
528
+ const actions = _actions && import_rx_react2.Rx.family((node) => _actions(node).pipe(import_rx_react2.Rx.withLabel(`graph-builder:_actions:${id}`)));
527
529
  return [
528
530
  // resolver ? { id: getId('resolver'), position, resolver } : undefined,
529
531
  connector ? {
530
532
  id: getId("connector"),
531
533
  position,
532
534
  relation,
533
- connector: import_rx_react2.Rx.family((key) => connector(key).pipe(import_rx_react2.Rx.withLabel(`graph-builder:connector:${id}`)))
535
+ connector: import_rx_react2.Rx.family((node) => import_rx_react2.Rx.make((get) => {
536
+ try {
537
+ return get(connector(node));
538
+ } catch {
539
+ import_log2.log.warn("Error in connector", {
540
+ id: getId("connector"),
541
+ node
542
+ }, {
543
+ F: __dxlog_file2,
544
+ L: 101,
545
+ S: void 0,
546
+ C: (f, a) => f(...a)
547
+ });
548
+ return [];
549
+ }
550
+ }).pipe(import_rx_react2.Rx.withLabel(`graph-builder:connector:${id}`)))
534
551
  } : void 0,
535
552
  actionGroups ? {
536
553
  id: getId("actionGroups"),
537
554
  position,
538
555
  relation: "outbound",
539
- connector: import_rx_react2.Rx.family((node) => import_rx_react2.Rx.make((get) => get(actionGroups(node)).map((arg) => ({
540
- ...arg,
541
- data: actionGroupSymbol,
542
- type: ACTION_GROUP_TYPE
543
- }))).pipe(import_rx_react2.Rx.withLabel(`graph-builder:connector:actionGroups:${id}`)))
556
+ connector: import_rx_react2.Rx.family((node) => import_rx_react2.Rx.make((get) => {
557
+ try {
558
+ return get(actionGroups(node)).map((arg) => ({
559
+ ...arg,
560
+ data: actionGroupSymbol,
561
+ type: ACTION_GROUP_TYPE
562
+ }));
563
+ } catch {
564
+ import_log2.log.warn("Error in actionGroups", {
565
+ id: getId("actionGroups"),
566
+ node
567
+ }, {
568
+ F: __dxlog_file2,
569
+ L: 122,
570
+ S: void 0,
571
+ C: (f, a) => f(...a)
572
+ });
573
+ return [];
574
+ }
575
+ }).pipe(import_rx_react2.Rx.withLabel(`graph-builder:connector:actionGroups:${id}`)))
544
576
  } : void 0,
545
577
  actions ? {
546
578
  id: getId("actions"),
547
579
  position,
548
580
  relation: "outbound",
549
- connector: import_rx_react2.Rx.family((node) => import_rx_react2.Rx.make((get) => get(actions(node)).map((arg) => ({
550
- ...arg,
551
- type: ACTION_TYPE
552
- }))).pipe(import_rx_react2.Rx.withLabel(`graph-builder:connector:actions:${id}`)))
581
+ connector: import_rx_react2.Rx.family((node) => import_rx_react2.Rx.make((get) => {
582
+ try {
583
+ return get(actions(node)).map((arg) => ({
584
+ ...arg,
585
+ type: ACTION_TYPE
586
+ }));
587
+ } catch {
588
+ import_log2.log.warn("Error in actions", {
589
+ id: getId("actions"),
590
+ node
591
+ }, {
592
+ F: __dxlog_file2,
593
+ L: 139,
594
+ S: void 0,
595
+ C: (f, a) => f(...a)
596
+ });
597
+ return [];
598
+ }
599
+ }).pipe(import_rx_react2.Rx.withLabel(`graph-builder:connector:actions:${id}`)))
553
600
  } : void 0
554
601
  ].filter(import_util2.isNonNullable);
555
602
  };
@@ -671,7 +718,7 @@ var GraphBuilder = class _GraphBuilder {
671
718
  registry: (0, import_util2.getDebugName)(this._registry)
672
719
  }, {
673
720
  F: __dxlog_file2,
674
- L: 276,
721
+ L: 301,
675
722
  S: this,
676
723
  C: (f, a) => f(...a)
677
724
  });
@@ -688,7 +735,7 @@ var GraphBuilder = class _GraphBuilder {
688
735
  removed
689
736
  }, {
690
737
  F: __dxlog_file2,
691
- L: 287,
738
+ L: 312,
692
739
  S: this,
693
740
  C: (f, a) => f(...a)
694
741
  });