@flowgram.ai/variable-layout 0.5.5 → 0.5.7

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.
package/dist/esm/index.js CHANGED
@@ -33,9 +33,15 @@ var FlowNodeVariableData = class extends EntityData {
33
33
  });
34
34
  this.toDispose.push(this._public);
35
35
  }
36
+ /**
37
+ * The private scope of the node.
38
+ */
36
39
  get private() {
37
40
  return this._private;
38
41
  }
42
+ /**
43
+ * The public scope of the node.
44
+ */
39
45
  get public() {
40
46
  return this._public;
41
47
  }
@@ -93,6 +99,9 @@ var FlowNodeVariableData = class extends EntityData {
93
99
  clearPrivateVar(key = "outputs") {
94
100
  return this.private?.ast.remove(key);
95
101
  }
102
+ /**
103
+ * An array containing all scopes (public and private) of the node.
104
+ */
96
105
  get allScopes() {
97
106
  const res = [];
98
107
  if (this._public) {
@@ -106,6 +115,11 @@ var FlowNodeVariableData = class extends EntityData {
106
115
  getDefaultData() {
107
116
  return {};
108
117
  }
118
+ /**
119
+ * Initializes and returns the private scope for the node.
120
+ * If the private scope already exists, it returns the existing one.
121
+ * @returns The private scope of the node.
122
+ */
109
123
  initPrivate() {
110
124
  if (!this._private) {
111
125
  this._private = this.variableEngine.createScope(`${this.entity.id}_private`, {
@@ -177,11 +191,17 @@ var ScopeChainTransformService = class {
177
191
  /**
178
192
  * register new transform function
179
193
  * @param transformerId used to identify transformer, prevent duplicated transformer
180
- * @param transformer
194
+ * @param transformer The transformer to register.
181
195
  */
182
196
  registerTransformer(transformerId, transformer) {
183
197
  this.transformerMap.set(transformerId, transformer);
184
198
  }
199
+ /**
200
+ * Transforms the dependency scopes.
201
+ * @param scopes The array of scopes to transform.
202
+ * @param param1 The context for the transformation.
203
+ * @returns The transformed array of scopes.
204
+ */
185
205
  transformDeps(scopes, { scope }) {
186
206
  return Array.from(this.transformerMap.values()).reduce((scopes2, transformer) => {
187
207
  if (!transformer.transformDeps) {
@@ -195,6 +215,12 @@ var ScopeChainTransformService = class {
195
215
  return scopes2;
196
216
  }, scopes);
197
217
  }
218
+ /**
219
+ * Transforms the cover scopes.
220
+ * @param scopes The array of scopes to transform.
221
+ * @param param1 The context for the transformation.
222
+ * @returns The transformed array of scopes.
223
+ */
198
224
  transformCovers(scopes, { scope }) {
199
225
  return Array.from(this.transformerMap.values()).reduce((scopes2, transformer) => {
200
226
  if (!transformer.transformCovers) {
@@ -225,6 +251,11 @@ ScopeChainTransformService = __decorateClass([
225
251
  import { injectable as injectable2 } from "inversify";
226
252
  import { Scope as Scope2, VariableEngine as VariableEngine2 } from "@flowgram.ai/variable-core";
227
253
  var GlobalScope = class extends Scope2 {
254
+ /**
255
+ * Check if the scope is Global Scope.
256
+ * @param scope
257
+ * @returns
258
+ */
228
259
  static is(scope) {
229
260
  return scope.id === GlobalScope.ID;
230
261
  }
@@ -251,24 +282,31 @@ var bindGlobalScope = (bind) => {
251
282
 
252
283
  // src/chains/free-layout-scope-chain.ts
253
284
  var FreeLayoutScopeChain = class extends ScopeChain {
285
+ /**
286
+ * The virtual tree of the flow document.
287
+ */
254
288
  get tree() {
255
289
  return this.flowDocument.originTree;
256
290
  }
257
291
  onInit() {
258
292
  this.toDispose.pushAll([
259
- // 线条发生变化时,会触发作用域链的更新
293
+ // When the line changes, the scope chain will be updated
260
294
  this.entityManager.onEntityDataChange(({ entityDataType }) => {
261
295
  if (entityDataType === WorkflowNodeLinesData.type) {
262
296
  this.refreshAllChange();
263
297
  }
264
298
  }),
265
- // 树变化时候刷新作用域
299
+ // Refresh the scope when the tree changes
266
300
  this.tree.onTreeChange(() => {
267
301
  this.refreshAllChange();
268
302
  })
269
303
  ]);
270
304
  }
271
- // 获取同一层级所有输入节点, 按照由近到远的顺序
305
+ /**
306
+ * Gets all input layer nodes for a given node in the same layer, sorted by distance.
307
+ * @param node The node to get input layer nodes for.
308
+ * @returns An array of input layer nodes.
309
+ */
272
310
  getAllInputLayerNodes(node) {
273
311
  const currParent = this.getNodeParent(node);
274
312
  const result = /* @__PURE__ */ new Set();
@@ -287,13 +325,22 @@ var FreeLayoutScopeChain = class extends ScopeChain {
287
325
  }
288
326
  return Array.from(result).reverse();
289
327
  }
290
- // 获取同一层级所有输出节点
328
+ /**
329
+ * Gets all output layer nodes for a given node in the same layer.
330
+ * @param curr The node to get output layer nodes for.
331
+ * @returns An array of output layer nodes.
332
+ */
291
333
  getAllOutputLayerNodes(curr) {
292
334
  const currParent = this.getNodeParent(curr);
293
335
  return (curr.lines?.allOutputNodes || []).filter(
294
336
  (_node) => this.getNodeParent(_node) === currParent
295
337
  );
296
338
  }
339
+ /**
340
+ * Gets the dependency scopes for a given scope.
341
+ * @param scope The scope to get dependencies for.
342
+ * @returns An array of dependency scopes.
343
+ */
297
344
  getDeps(scope) {
298
345
  const { node } = scope.meta || {};
299
346
  if (!node) {
@@ -323,6 +370,11 @@ var FreeLayoutScopeChain = class extends ScopeChain {
323
370
  const uniqDeps = Array.from(new Set(deps));
324
371
  return this.transformService.transformDeps(uniqDeps, { scope });
325
372
  }
373
+ /**
374
+ * Gets the covering scopes for a given scope.
375
+ * @param scope The scope to get covering scopes for.
376
+ * @returns An array of covering scopes.
377
+ */
326
378
  getCovers(scope) {
327
379
  if (GlobalScope.is(scope)) {
328
380
  const scopes2 = this.variableEngine.getAllScopes({ sort: true }).filter((_scope) => !GlobalScope.is(_scope));
@@ -364,6 +416,11 @@ var FreeLayoutScopeChain = class extends ScopeChain {
364
416
  const uniqScopes = Array.from(new Set(scopes));
365
417
  return this.transformService.transformCovers(uniqScopes, { scope });
366
418
  }
419
+ /**
420
+ * Gets the children of a node.
421
+ * @param node The node to get children for.
422
+ * @returns An array of child nodes.
423
+ */
367
424
  getNodeChildren(node) {
368
425
  if (this.configs?.getNodeChildren) {
369
426
  return this.configs.getNodeChildren?.(node);
@@ -393,6 +450,11 @@ var FreeLayoutScopeChain = class extends ScopeChain {
393
450
  ...this.getAllPublicChildScopes(_node)
394
451
  ]).flat();
395
452
  }
453
+ /**
454
+ * Gets the parent of a node.
455
+ * @param node The node to get the parent for.
456
+ * @returns The parent node or `undefined` if not found.
457
+ */
396
458
  getNodeParent(node) {
397
459
  if (this.configs?.getNodeParent) {
398
460
  return this.configs.getNodeParent(node);
@@ -411,7 +473,11 @@ var FreeLayoutScopeChain = class extends ScopeChain {
411
473
  }
412
474
  return parent;
413
475
  }
414
- // Child nodes can not be accessed
476
+ /**
477
+ * Checks if the children of a node are private and cannot be accessed by subsequent nodes.
478
+ * @param node The node to check.
479
+ * @returns `true` if the children are private, `false` otherwise.
480
+ */
415
481
  isNodeChildrenPrivate(node) {
416
482
  if (this.configs?.isNodeChildrenPrivate) {
417
483
  return node ? this.configs?.isNodeChildrenPrivate(node) : false;
@@ -419,6 +485,10 @@ var FreeLayoutScopeChain = class extends ScopeChain {
419
485
  const isSystemNode = node?.id.startsWith("$");
420
486
  return !isSystemNode && node?.flowNodeType !== FlowNodeBaseType.GROUP;
421
487
  }
488
+ /**
489
+ * Sorts all scopes in the scope chain.
490
+ * @returns An empty array, as this method is not implemented.
491
+ */
422
492
  sortAll() {
423
493
  console.warn("FreeLayoutScopeChain.sortAll is not implemented");
424
494
  return [];
@@ -452,17 +522,24 @@ var FixedLayoutScopeChain = class extends ScopeChain2 {
452
522
  this.configs = configs;
453
523
  this.bindTree(flowDocument.originTree);
454
524
  this.toDispose.push(
455
- // REFRACTOR: onTreeChange 触发时机精细化
525
+ // REFRACTOR: onTreeChange trigger timing needs to be refined
456
526
  flowDocument.originTree.onTreeChange(() => {
457
527
  this.refreshAllChange();
458
528
  })
459
529
  );
460
530
  }
461
- // 绑定树
531
+ /**
532
+ * Binds the scope chain to a `FlowVirtualTree`.
533
+ * @param tree The `FlowVirtualTree` to bind to.
534
+ */
462
535
  bindTree(tree) {
463
536
  this.tree = tree;
464
537
  }
465
- // 获取依赖作用域
538
+ /**
539
+ * Gets the dependency scopes for a given scope.
540
+ * @param scope The scope to get dependencies for.
541
+ * @returns An array of dependency scopes.
542
+ */
466
543
  getDeps(scope) {
467
544
  if (!this.tree) {
468
545
  return this.transformService.transformDeps([], { scope });
@@ -519,7 +596,11 @@ var FixedLayoutScopeChain = class extends ScopeChain2 {
519
596
  }
520
597
  return this.transformService.transformDeps(deps, { scope });
521
598
  }
522
- // 获取覆盖作用域
599
+ /**
600
+ * Gets the covering scopes for a given scope.
601
+ * @param scope The scope to get covering scopes for.
602
+ * @returns An array of covering scopes.
603
+ */
523
604
  getCovers(scope) {
524
605
  if (!this.tree) {
525
606
  return this.transformService.transformCovers([], { scope });
@@ -583,7 +664,10 @@ var FixedLayoutScopeChain = class extends ScopeChain2 {
583
664
  }
584
665
  return this.transformService.transformCovers(covers, { scope });
585
666
  }
586
- // 排序所有作用域
667
+ /**
668
+ * Sorts all scopes in the scope chain.
669
+ * @returns A sorted array of all scopes.
670
+ */
587
671
  sortAll() {
588
672
  const startNode = this.flowDocument.getAllNodes().find((_node) => _node.isStart);
589
673
  if (!startNode) {
@@ -597,7 +681,11 @@ var FixedLayoutScopeChain = class extends ScopeChain2 {
597
681
  );
598
682
  return [...deps, startPublicScope, ...covers];
599
683
  }
600
- // 获取变量 Data 数据
684
+ /**
685
+ * Gets the `FlowNodeVariableData` for a given `ScopeChainNode`.
686
+ * @param node The `ScopeChainNode` to get data for.
687
+ * @returns The `FlowNodeVariableData` or `undefined` if not found.
688
+ */
601
689
  getVariableData(node) {
602
690
  if (node.flowNodeType === "virtualNode") {
603
691
  return;
@@ -607,7 +695,11 @@ var FixedLayoutScopeChain = class extends ScopeChain2 {
607
695
  }
608
696
  return node.getData(FlowNodeVariableData);
609
697
  }
610
- // 子节点不可以被后续节点访问
698
+ /**
699
+ * Checks if the children of a node are private.
700
+ * @param node The node to check.
701
+ * @returns `true` if the children are private, `false` otherwise.
702
+ */
611
703
  isNodeChildrenPrivate(node) {
612
704
  if (this.configs?.isNodeChildrenPrivate) {
613
705
  return node ? this.configs?.isNodeChildrenPrivate(node) : false;
@@ -615,10 +707,20 @@ var FixedLayoutScopeChain = class extends ScopeChain2 {
615
707
  const isSystemNode = node?.id.startsWith("$");
616
708
  return !isSystemNode && this.hasChildren(node);
617
709
  }
710
+ /**
711
+ * Checks if a node has children.
712
+ * @param node The node to check.
713
+ * @returns `true` if the node has children, `false` otherwise.
714
+ */
618
715
  hasChildren(node) {
619
716
  return Boolean(this.tree && node && this.tree.getChildren(node).length > 0);
620
717
  }
621
- // 子节点按照顺序进行排序(含自身)
718
+ /**
719
+ * Gets all sorted child scopes of a node.
720
+ * @param node The node to get child scopes for.
721
+ * @param options Options for getting child scopes.
722
+ * @returns An array of sorted child scopes.
723
+ */
622
724
  getAllSortedChildScope(node, {
623
725
  ignoreNodeChildrenPrivate,
624
726
  addNodePrivateScope
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/flow-node-variable-data.ts","../../src/types.ts","../../src/chains/free-layout-scope-chain.ts","../../src/variable-chain-config.ts","../../src/services/scope-chain-transform-service.ts","../../src/scopes/global-scope.ts","../../src/chains/fixed-layout-scope-chain.ts","../../src/utils.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { BaseVariableField, VariableEngine } from '@flowgram.ai/variable-core';\nimport { type ASTNode, ASTNodeJSON } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\nimport { EntityData } from '@flowgram.ai/core';\n\nimport { FlowNodeScope, FlowNodeScopeMeta, FlowNodeScopeTypeEnum } from './types';\n\ninterface Options {\n variableEngine: VariableEngine;\n}\n\nexport class FlowNodeVariableData extends EntityData {\n static type: string = 'FlowNodeVariableData';\n\n declare entity: FlowNodeEntity;\n\n readonly variableEngine: VariableEngine;\n\n /**\n * Private variables can be accessed by public ones, but not the other way around.\n */\n protected _private?: FlowNodeScope;\n\n protected _public: FlowNodeScope;\n\n get private() {\n return this._private;\n }\n\n get public() {\n return this._public;\n }\n\n /**\n * Sets a variable in the public AST (Abstract Syntax Tree) with the given key and JSON value.\n *\n * @param key - The key under which the variable will be stored.\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(key: string, json: ASTNodeJSON): ASTNode;\n\n /**\n * Sets a variable in the public AST (Abstract Syntax Tree) with the default key 'outputs'.\n *\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(json: ASTNodeJSON): ASTNode;\n\n public setVar(arg1: string | ASTNodeJSON, arg2?: ASTNodeJSON): ASTNode {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.public.ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.public.ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the public AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The value of the variable, or undefined if not found.\n */\n public getVar(key: string = 'outputs') {\n return this.public.ast.get(key);\n }\n\n /**\n * Clears a variable from the public AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to clear. Defaults to 'outputs'.\n * @returns The updated AST node.\n */\n public clearVar(key: string = 'outputs') {\n return this.public.ast.remove(key);\n }\n\n /**\n * Sets a variable in the private AST (Abstract Syntax Tree) with the given key and JSON value.\n *\n * @param key - The key under which the variable will be stored.\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setPrivateVar(key: string, json: ASTNodeJSON): ASTNode;\n\n /**\n * Sets a variable in the private AST (Abstract Syntax Tree) with the default key 'outputs'.\n *\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setPrivateVar(json: ASTNodeJSON): ASTNode;\n\n public setPrivateVar(arg1: string | ASTNodeJSON, arg2?: ASTNodeJSON): ASTNode {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.initPrivate().ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.initPrivate().ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the private AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The value of the variable, or undefined if not found.\n */\n public getPrivateVar(key: string = 'outputs') {\n return this.private?.ast.get(key);\n }\n\n /**\n * Clears a variable from the private AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to clear. Defaults to 'outputs'.\n * @returns The updated AST node.\n */\n public clearPrivateVar(key: string = 'outputs') {\n return this.private?.ast.remove(key);\n }\n\n get allScopes(): FlowNodeScope[] {\n const res = [];\n\n if (this._public) {\n res.push(this._public);\n }\n if (this._private) {\n res.push(this._private);\n }\n\n return res;\n }\n\n getDefaultData() {\n return {};\n }\n\n constructor(entity: FlowNodeEntity, readonly opts: Options) {\n super(entity);\n\n const { variableEngine } = opts || {};\n this.variableEngine = variableEngine;\n this._public = this.variableEngine.createScope(this.entity.id, {\n node: this.entity,\n type: FlowNodeScopeTypeEnum.public,\n } as FlowNodeScopeMeta);\n this.toDispose.push(this._public);\n }\n\n initPrivate(): FlowNodeScope {\n if (!this._private) {\n this._private = this.variableEngine.createScope(`${this.entity.id}_private`, {\n node: this.entity,\n type: FlowNodeScopeTypeEnum.private,\n } as FlowNodeScopeMeta);\n\n this.variableEngine.chain.refreshAllChange();\n\n this.toDispose.push(this._private);\n }\n return this._private;\n }\n\n /**\n * Find a variable field by key path in the public scope by scope chain.\n * @param keyPath - The key path of the variable field.\n * @returns The variable field, or undefined if not found.\n */\n getByKeyPath(keyPath: string[]): BaseVariableField | undefined {\n return this.public.available.getByKeyPath(keyPath);\n }\n\n /**\n * Find a variable field by key path in the private scope by scope chain.\n * @param keyPath - The key path of the variable field.\n * @returns The variable field, or undefined if not found.\n */\n getByKeyPathInPrivate(keyPath: string[]): BaseVariableField | undefined {\n return this.private?.available.getByKeyPath(keyPath);\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Scope } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nexport enum FlowNodeScopeTypeEnum {\n public = 'public',\n private = 'private',\n}\n\nexport interface FlowNodeScopeMeta {\n node?: FlowNodeEntity;\n type?: FlowNodeScopeTypeEnum;\n}\n\nexport interface ScopeVirtualNode {\n id: string;\n flowNodeType: 'virtualNode';\n}\n\nexport type ScopeChainNode = FlowNodeEntity | ScopeVirtualNode;\n\n// 节点内部的作用域\nexport interface FlowNodeScope extends Scope<FlowNodeScopeMeta> {}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, optional, postConstruct } from 'inversify';\nimport { Scope, ScopeChain } from '@flowgram.ai/variable-core';\nimport { WorkflowNodeLinesData, WorkflowNodeMeta } from '@flowgram.ai/free-layout-core';\nimport {\n FlowNodeEntity,\n FlowDocument,\n FlowVirtualTree,\n FlowNodeBaseType,\n} from '@flowgram.ai/document';\nimport { EntityManager } from '@flowgram.ai/core';\n\nimport { VariableChainConfig } from '../variable-chain-config';\nimport { FlowNodeScope, FlowNodeScopeTypeEnum } from '../types';\nimport { ScopeChainTransformService } from '../services/scope-chain-transform-service';\nimport { GlobalScope } from '../scopes/global-scope';\nimport { FlowNodeVariableData } from '../flow-node-variable-data';\n\n/**\n * 自由布局作用域链实现\n */\nexport class FreeLayoutScopeChain extends ScopeChain {\n @inject(EntityManager) entityManager: EntityManager;\n\n @inject(FlowDocument)\n protected flowDocument: FlowDocument;\n\n @optional()\n @inject(VariableChainConfig)\n protected configs?: VariableChainConfig;\n\n @inject(ScopeChainTransformService)\n protected transformService: ScopeChainTransformService;\n\n get tree(): FlowVirtualTree<FlowNodeEntity> {\n return this.flowDocument.originTree;\n }\n\n @postConstruct()\n onInit() {\n this.toDispose.pushAll([\n // 线条发生变化时,会触发作用域链的更新\n this.entityManager.onEntityDataChange(({ entityDataType }) => {\n if (entityDataType === WorkflowNodeLinesData.type) {\n this.refreshAllChange();\n }\n }),\n // 树变化时候刷新作用域\n this.tree.onTreeChange(() => {\n this.refreshAllChange();\n }),\n ]);\n }\n\n // 获取同一层级所有输入节点, 按照由近到远的顺序\n protected getAllInputLayerNodes(node: FlowNodeEntity): FlowNodeEntity[] {\n const currParent = this.getNodeParent(node);\n\n const result = new Set<FlowNodeEntity>();\n\n // add by bfs\n const queue: FlowNodeEntity[] = [node];\n\n while (queue.length) {\n const curr = queue.shift()!;\n\n (curr.lines?.inputNodes || []).forEach((inputNode) => {\n if (this.getNodeParent(inputNode) === currParent) {\n if (result.has(inputNode)) {\n return;\n }\n queue.push(inputNode);\n result.add(inputNode);\n }\n });\n }\n\n return Array.from(result).reverse();\n }\n\n // 获取同一层级所有输出节点\n protected getAllOutputLayerNodes(curr: FlowNodeEntity): FlowNodeEntity[] {\n const currParent = this.getNodeParent(curr);\n\n return (curr.lines?.allOutputNodes || []).filter(\n (_node) => this.getNodeParent(_node) === currParent\n );\n }\n\n getDeps(scope: FlowNodeScope): FlowNodeScope[] {\n const { node } = scope.meta || {};\n if (!node) {\n return this.transformService.transformDeps([], { scope });\n }\n\n const deps: FlowNodeScope[] = [];\n\n // 1. find dep nodes\n let curr: FlowNodeEntity | undefined = node;\n\n while (curr) {\n // 2. private scope of parent node can be access\n const currVarData: FlowNodeVariableData = curr.getData(FlowNodeVariableData);\n if (currVarData?.private && scope !== currVarData.private) {\n deps.unshift(currVarData.private);\n }\n\n // 3. all public scopes of inputNodes\n const allInputNodes: FlowNodeEntity[] = this.getAllInputLayerNodes(curr);\n deps.unshift(\n ...allInputNodes\n .map((_node) => [\n _node.getData(FlowNodeVariableData).public,\n // 4. all public children of inputNodes\n ...this.getAllPublicChildScopes(_node),\n ])\n .flat()\n .filter(Boolean)\n );\n\n curr = this.getNodeParent(curr);\n }\n\n // If scope is GlobalScope, add globalScope to deps\n const globalScope = this.variableEngine.getScopeById(GlobalScope.ID);\n if (globalScope) {\n deps.unshift(globalScope);\n }\n\n const uniqDeps = Array.from(new Set(deps));\n return this.transformService.transformDeps(uniqDeps, { scope });\n }\n\n getCovers(scope: FlowNodeScope): FlowNodeScope[] {\n // If scope is GlobalScope, return all scopes except GlobalScope\n if (GlobalScope.is(scope)) {\n const scopes = this.variableEngine\n .getAllScopes({ sort: true })\n .filter((_scope) => !GlobalScope.is(_scope));\n\n return this.transformService.transformCovers(scopes, { scope });\n }\n\n const { node } = scope.meta || {};\n if (!node) {\n return this.transformService.transformCovers([], { scope });\n }\n\n const isPrivate = scope.meta.type === FlowNodeScopeTypeEnum.private;\n\n // 1. BFS 找到所有覆盖的节点\n const queue: FlowNodeEntity[] = [];\n\n if (isPrivate) {\n // private 只能覆盖其子节点\n queue.push(...this.getNodeChildren(node));\n } else {\n // 否则覆盖其所有输出线的节点\n queue.push(...(this.getAllOutputLayerNodes(node) || []));\n\n // get all parents\n let parent = this.getNodeParent(node);\n\n while (parent) {\n // if childNodes of parent is private to next nodes, break\n if (this.isNodeChildrenPrivate(parent)) {\n break;\n }\n\n queue.push(...this.getAllOutputLayerNodes(parent));\n\n parent = this.getNodeParent(parent);\n }\n }\n\n // 2. 获取所有覆盖节点的 public、private 作用域\n const scopes: FlowNodeScope[] = [];\n\n while (queue.length) {\n const _node = queue.shift()!;\n const variableData: FlowNodeVariableData = _node.getData(FlowNodeVariableData);\n scopes.push(...variableData.allScopes);\n const children = _node && this.getNodeChildren(_node);\n\n if (children?.length) {\n queue.push(...children);\n }\n }\n\n // 3. 如果当前 scope 是 private,则当前节点的 public 也可覆盖\n const currentVariableData: FlowNodeVariableData = node.getData(FlowNodeVariableData);\n if (isPrivate && currentVariableData.public) {\n scopes.push(currentVariableData.public);\n }\n\n const uniqScopes = Array.from(new Set(scopes));\n\n return this.transformService.transformCovers(uniqScopes, { scope });\n }\n\n getNodeChildren(node: FlowNodeEntity): FlowNodeEntity[] {\n if (this.configs?.getNodeChildren) {\n return this.configs.getNodeChildren?.(node);\n }\n const nodeMeta = node.getNodeMeta<WorkflowNodeMeta>();\n const subCanvas = nodeMeta.subCanvas?.(node);\n\n if (subCanvas) {\n // 子画布本身不存在 children\n if (subCanvas.isCanvas) {\n return [];\n } else {\n return subCanvas.canvasNode.collapsedChildren;\n }\n }\n\n // 部分场景通过连线来表达父子关系,因此需要上层配置\n return this.tree.getChildren(node);\n }\n\n /**\n * Get All children of nodes\n * @param node\n * @returns\n */\n getAllPublicChildScopes(node: FlowNodeEntity): Scope[] {\n if (this.isNodeChildrenPrivate(node)) {\n return [];\n }\n\n return this.getNodeChildren(node)\n .map((_node) => [\n _node.getData(FlowNodeVariableData).public,\n ...this.getAllPublicChildScopes(_node),\n ])\n .flat();\n }\n\n getNodeParent(node: FlowNodeEntity): FlowNodeEntity | undefined {\n // 部分场景通过连线来表达父子关系,因此需要上层配置\n if (this.configs?.getNodeParent) {\n return this.configs.getNodeParent(node);\n }\n let parent = node.document.originTree.getParent(node);\n\n // If currentParent is Group, get the parent of parent\n while (parent?.flowNodeType === FlowNodeBaseType.GROUP) {\n parent = parent.parent;\n }\n\n if (!parent) {\n return parent;\n }\n\n const nodeMeta = parent.getNodeMeta<WorkflowNodeMeta>();\n const subCanvas = nodeMeta.subCanvas?.(parent);\n if (subCanvas?.isCanvas) {\n // Get real parent node by subCanvas Configuration\n return subCanvas.parentNode;\n }\n\n return parent;\n }\n\n // Child nodes can not be accessed\n protected isNodeChildrenPrivate(node?: FlowNodeEntity): boolean {\n if (this.configs?.isNodeChildrenPrivate) {\n return node ? this.configs?.isNodeChildrenPrivate(node) : false;\n }\n\n const isSystemNode = node?.id.startsWith('$');\n\n // Except system node and group node, everything else is private\n return !isSystemNode && node?.flowNodeType !== FlowNodeBaseType.GROUP;\n }\n\n sortAll(): Scope[] {\n // 暂未实现\n console.warn('FreeLayoutScopeChain.sortAll is not implemented');\n return [];\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { type ScopeChainNode } from './types';\nimport { IScopeTransformer } from './services/scope-chain-transform-service';\n\nexport interface VariableChainConfig {\n /**\n * The output variables of a node's children cannot be accessed by subsequent nodes.\n *\n * @param node\n * @returns\n */\n isNodeChildrenPrivate?: (node: ScopeChainNode) => boolean;\n\n /**\n * For fixed layout scenarios: there are a large number of useless nodes between parent and child (such as inlineBlocks, etc., which need to be configured to be skipped)\n * For free canvas scenarios: in some scenarios, the parent-child relationship between nodes is expressed through connections or other interactive forms, which needs to be configurable\n */\n getNodeChildren?: (node: FlowNodeEntity) => FlowNodeEntity[];\n getNodeParent?: (node: FlowNodeEntity) => FlowNodeEntity | undefined;\n\n /**\n * Fine-tune the dependency scope\n */\n transformDeps?: IScopeTransformer;\n\n /**\n * 对依赖作用域进行微调\n */\n transformCovers?: IScopeTransformer;\n}\n\nexport const VariableChainConfig = Symbol('VariableChainConfig');\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, injectable, optional } from 'inversify';\nimport { Scope, VariableEngine } from '@flowgram.ai/variable-core';\nimport { FlowDocument } from '@flowgram.ai/document';\nimport { lazyInject } from '@flowgram.ai/core';\n\nimport { VariableChainConfig } from '../variable-chain-config';\nimport { FlowNodeScope } from '../types';\n\nexport interface TransformerContext {\n scope: FlowNodeScope;\n document: FlowDocument;\n variableEngine: VariableEngine;\n}\n\nexport type IScopeTransformer = (scopes: Scope[], ctx: TransformerContext) => Scope[];\n\nconst passthrough: IScopeTransformer = (scopes, ctx) => scopes;\n\n@injectable()\nexport class ScopeChainTransformService {\n protected transformerMap: Map<\n string,\n { transformDeps: IScopeTransformer; transformCovers: IScopeTransformer }\n > = new Map();\n\n @lazyInject(FlowDocument) document: FlowDocument;\n\n @lazyInject(VariableEngine) variableEngine: VariableEngine;\n\n constructor(\n @optional()\n @inject(VariableChainConfig)\n protected configs?: VariableChainConfig\n ) {\n if (this.configs?.transformDeps || this.configs?.transformCovers) {\n this.transformerMap.set('VARIABLE_LAYOUT_CONFIG', {\n transformDeps: this.configs.transformDeps || passthrough,\n transformCovers: this.configs.transformCovers || passthrough,\n });\n }\n }\n\n /**\n * check if transformer registered\n * @param transformerId used to identify transformer, prevent duplicated\n * @returns\n */\n hasTransformer(transformerId: string) {\n return this.transformerMap.has(transformerId);\n }\n\n /**\n * register new transform function\n * @param transformerId used to identify transformer, prevent duplicated transformer\n * @param transformer\n */\n registerTransformer(\n transformerId: string,\n transformer: {\n transformDeps: IScopeTransformer;\n transformCovers: IScopeTransformer;\n }\n ) {\n this.transformerMap.set(transformerId, transformer);\n }\n\n transformDeps(scopes: Scope[], { scope }: { scope: Scope }): Scope[] {\n return Array.from(this.transformerMap.values()).reduce((scopes, transformer) => {\n if (!transformer.transformDeps) {\n return scopes;\n }\n\n scopes = transformer.transformDeps(scopes, {\n scope,\n document: this.document,\n variableEngine: this.variableEngine,\n });\n return scopes;\n }, scopes);\n }\n\n transformCovers(scopes: Scope[], { scope }: { scope: Scope }): Scope[] {\n return Array.from(this.transformerMap.values()).reduce((scopes, transformer) => {\n if (!transformer.transformCovers) {\n return scopes;\n }\n\n scopes = transformer.transformCovers(scopes, {\n scope,\n document: this.document,\n variableEngine: this.variableEngine,\n });\n return scopes;\n }, scopes);\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable, interfaces } from 'inversify';\nimport { Scope, VariableEngine } from '@flowgram.ai/variable-core';\n\n@injectable()\nexport class GlobalScope extends Scope {\n static readonly ID = Symbol('GlobalScope');\n\n static is(scope: Scope) {\n return scope.id === GlobalScope.ID;\n }\n}\n\nexport const bindGlobalScope = (bind: interfaces.Bind) => {\n bind(GlobalScope).toDynamicValue((ctx) => {\n const variableEngine = ctx.container.get(VariableEngine);\n let scope = variableEngine.getScopeById(GlobalScope.ID) as GlobalScope;\n\n if (!scope) {\n scope = variableEngine.createScope(\n GlobalScope.ID,\n {},\n { ScopeConstructor: GlobalScope }\n ) as GlobalScope;\n variableEngine.chain.refreshAllChange();\n }\n\n return scope;\n });\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, optional } from 'inversify';\nimport { Scope, ScopeChain } from '@flowgram.ai/variable-core';\nimport { FlowDocument, type FlowVirtualTree } from '@flowgram.ai/document';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { VariableChainConfig } from '../variable-chain-config';\nimport { FlowNodeScope, FlowNodeScopeTypeEnum, ScopeChainNode } from '../types';\nimport { ScopeChainTransformService } from '../services/scope-chain-transform-service';\nimport { GlobalScope } from '../scopes/global-scope';\nimport { FlowNodeVariableData } from '../flow-node-variable-data';\n\n/**\n * 基于 FlowVirtualTree 的 ScopeOrder 实现\n */\nexport class FixedLayoutScopeChain extends ScopeChain {\n // 增加 { id: string } 使得可以灵活添加自定义虚拟节点\n tree: FlowVirtualTree<ScopeChainNode> | undefined;\n\n @inject(ScopeChainTransformService)\n protected transformService: ScopeChainTransformService;\n\n constructor(\n @inject(FlowDocument)\n protected flowDocument: FlowDocument,\n @optional()\n @inject(VariableChainConfig)\n protected configs?: VariableChainConfig\n ) {\n super();\n\n // 绑定 flowDocument 里面的树\n this.bindTree(flowDocument.originTree);\n\n // originTree 发生变化时,触发依赖关系的变化\n this.toDispose.push(\n // REFRACTOR: onTreeChange 触发时机精细化\n flowDocument.originTree.onTreeChange(() => {\n this.refreshAllChange();\n })\n );\n }\n\n // 绑定树\n bindTree(tree: FlowVirtualTree<ScopeChainNode>): void {\n this.tree = tree;\n }\n\n // 获取依赖作用域\n getDeps(scope: FlowNodeScope): FlowNodeScope[] {\n if (!this.tree) {\n return this.transformService.transformDeps([], { scope });\n }\n\n const node = scope.meta.node;\n if (!node) {\n return this.transformService.transformDeps([], { scope });\n }\n\n const deps: FlowNodeScope[] = [];\n\n let curr: ScopeChainNode | undefined = node;\n\n while (curr) {\n const { parent, pre } = this.tree.getInfo(curr);\n const currData = this.getVariableData(curr);\n\n // 包含子节点,且不是私有作用域\n\n if (curr === node) {\n // public 可以依赖 private\n if (scope.meta.type === FlowNodeScopeTypeEnum.public && currData?.private) {\n deps.unshift(currData.private);\n }\n } else if (this.hasChildren(curr) && !this.isNodeChildrenPrivate(curr)) {\n // 有子元素的节点,则将子元素纳入依赖作用域\n deps.unshift(\n ...this.getAllSortedChildScope(curr, {\n ignoreNodeChildrenPrivate: true,\n })\n );\n }\n\n // 节点的 public 都可以被访问\n if (currData && curr !== node) {\n deps.unshift(currData.public);\n }\n\n // 上个节点处理\n if (pre) {\n curr = pre;\n continue;\n }\n\n // 父节点处理\n if (parent) {\n let currParent: ScopeChainNode | undefined = parent;\n let currParentPre: ScopeChainNode | undefined = this.tree.getPre(currParent);\n\n while (currParent) {\n // 父节点的 private 和 public 都能被子节点访问\n const currParentData = this.getVariableData(currParent);\n if (currParentData) {\n deps.unshift(...currParentData.allScopes);\n }\n\n // 当前 parent 有 pre 节点,则停止向上查找\n if (currParentPre) {\n break;\n }\n\n currParent = this.tree.getParent(currParent);\n currParentPre = currParent ? this.tree.getPre(currParent) : undefined;\n }\n curr = currParentPre;\n continue;\n }\n\n // next 和 parent 都没有,直接结束循环\n curr = undefined;\n }\n\n // If scope is GlobalScope, add globalScope to deps\n const globalScope = this.variableEngine.getScopeById(GlobalScope.ID);\n if (globalScope) {\n deps.unshift(globalScope);\n }\n\n return this.transformService.transformDeps(deps, { scope });\n }\n\n // 获取覆盖作用域\n getCovers(scope: FlowNodeScope): FlowNodeScope[] {\n if (!this.tree) {\n return this.transformService.transformCovers([], { scope });\n }\n\n // If scope is GlobalScope, return all scopes except GlobalScope\n if (GlobalScope.is(scope)) {\n const scopes = this.variableEngine\n .getAllScopes({ sort: true })\n .filter((_scope) => !GlobalScope.is(_scope));\n\n return this.transformService.transformCovers(scopes, { scope });\n }\n\n const node = scope.meta.node;\n if (!node) {\n return this.transformService.transformCovers([], { scope });\n }\n\n const covers: FlowNodeScope[] = [];\n\n // 如果是 private 作用域,则只能子节点访问\n if (scope.meta.type === FlowNodeScopeTypeEnum.private) {\n covers.push(\n ...this.getAllSortedChildScope(node, {\n addNodePrivateScope: true,\n }).filter((_scope) => _scope !== scope)\n );\n return this.transformService.transformCovers(covers, { scope });\n }\n\n let curr: ScopeChainNode | undefined = node;\n\n while (curr) {\n const { next, parent } = this.tree.getInfo(curr);\n const currData = this.getVariableData(curr);\n\n // 有子元素的节点,则将子元素纳入覆盖作用域\n if (curr !== node) {\n if (this.hasChildren(curr)) {\n covers.push(\n ...this.getAllSortedChildScope(curr, {\n addNodePrivateScope: true,\n })\n );\n } else if (currData) {\n covers.push(...currData.allScopes);\n }\n }\n\n // 下个节点处理\n if (next) {\n curr = next;\n continue;\n }\n\n if (parent) {\n let currParent: ScopeChainNode | undefined = parent;\n let currParentNext: ScopeChainNode | undefined = this.tree.getNext(currParent);\n\n while (currParent) {\n // 私有作用域不能被后续节点访问\n if (this.isNodeChildrenPrivate(currParent)) {\n return this.transformService.transformCovers(covers, { scope });\n }\n\n // 当前 parent 有 next 节点,则停止向上查找\n if (currParentNext) {\n break;\n }\n\n currParent = this.tree.getParent(currParent);\n currParentNext = currParent ? this.tree.getNext(currParent) : undefined;\n }\n if (!currParentNext && currParent) {\n break;\n }\n\n curr = currParentNext;\n continue;\n }\n\n // next 和 parent 都没有,直接结束循环\n curr = undefined;\n }\n\n return this.transformService.transformCovers(covers, { scope });\n }\n\n // 排序所有作用域\n sortAll(): Scope[] {\n const startNode = this.flowDocument.getAllNodes().find((_node) => _node.isStart);\n if (!startNode) {\n return [];\n }\n\n const startVariableData = startNode.getData(FlowNodeVariableData);\n const startPublicScope = startVariableData.public;\n const deps = this.getDeps(startPublicScope);\n\n const covers = this.getCovers(startPublicScope).filter(\n (_scope) => !deps.includes(_scope) && _scope !== startPublicScope\n );\n\n return [...deps, startPublicScope, ...covers];\n }\n\n // 获取变量 Data 数据\n private getVariableData(node: ScopeChainNode): FlowNodeVariableData | undefined {\n if (node.flowNodeType === 'virtualNode') {\n return;\n }\n // TODO 包含 $ 的节点不注册 variableData\n if (node.id.startsWith('$')) {\n return;\n }\n\n return (node as FlowNodeEntity).getData(FlowNodeVariableData);\n }\n\n // 子节点不可以被后续节点访问\n private isNodeChildrenPrivate(node?: ScopeChainNode): boolean {\n if (this.configs?.isNodeChildrenPrivate) {\n return node ? this.configs?.isNodeChildrenPrivate(node) : false;\n }\n\n const isSystemNode = node?.id.startsWith('$');\n // 兜底:有子节点(节点 id 没有 $ 开头)的全部为私有作用域\n return !isSystemNode && this.hasChildren(node);\n }\n\n private hasChildren(node?: ScopeChainNode): boolean {\n return Boolean(this.tree && node && this.tree.getChildren(node).length > 0);\n }\n\n // 子节点按照顺序进行排序(含自身)\n private getAllSortedChildScope(\n node: ScopeChainNode,\n {\n ignoreNodeChildrenPrivate,\n addNodePrivateScope,\n }: { ignoreNodeChildrenPrivate?: boolean; addNodePrivateScope?: boolean } = {}\n ): FlowNodeScope[] {\n const scopes: FlowNodeScope[] = [];\n\n const variableData = this.getVariableData(node);\n\n if (variableData) {\n scopes.push(variableData.public);\n }\n\n // 私有作用域,子节点的变量不对外输出\n //(父节点如果存在 public 变量则对外输出)\n if (ignoreNodeChildrenPrivate && this.isNodeChildrenPrivate(node)) {\n return scopes;\n }\n\n if (addNodePrivateScope && variableData?.private) {\n scopes.push(variableData.private);\n }\n\n const children = this.tree?.getChildren(node) || [];\n scopes.push(\n ...children\n .map((child) =>\n this.getAllSortedChildScope(child, { ignoreNodeChildrenPrivate, addNodePrivateScope })\n )\n .flat()\n );\n\n return scopes;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { FlowNodeVariableData } from './flow-node-variable-data';\n\n/**\n * Use `node.scope` instead\n * @deprecated\n * @param node\n */\nexport function getNodeScope(node: FlowNodeEntity) {\n return node.getData(FlowNodeVariableData).public;\n}\n\n/**\n * Use `node.privateScope` instead\n * @deprecated\n * @param node\n */\nexport function getNodePrivateScope(node: FlowNodeEntity) {\n return node.getData(FlowNodeVariableData).initPrivate();\n}\n"],"mappings":"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","names":["FlowNodeScopeTypeEnum","inject","optional","FlowDocument","scopes","injectable","Scope","VariableEngine","Scope","injectable","VariableEngine","scopes","inject","FlowDocument","optional","inject","optional","ScopeChain","FlowDocument","ScopeChain","inject","FlowDocument","optional"]}
1
+ {"version":3,"sources":["../../src/flow-node-variable-data.ts","../../src/types.ts","../../src/chains/free-layout-scope-chain.ts","../../src/variable-chain-config.ts","../../src/services/scope-chain-transform-service.ts","../../src/scopes/global-scope.ts","../../src/chains/fixed-layout-scope-chain.ts","../../src/utils.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { BaseVariableField, VariableEngine } from '@flowgram.ai/variable-core';\nimport { type ASTNode, ASTNodeJSON } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\nimport { EntityData } from '@flowgram.ai/core';\n\nimport { FlowNodeScope, FlowNodeScopeMeta, FlowNodeScopeTypeEnum } from './types';\n\ninterface Options {\n variableEngine: VariableEngine;\n}\n\n/**\n * Manages variable data for a flow node, including public and private scopes.\n */\nexport class FlowNodeVariableData extends EntityData {\n static type: string = 'FlowNodeVariableData';\n\n declare entity: FlowNodeEntity;\n\n readonly variableEngine: VariableEngine;\n\n /**\n * Private variables can be accessed by public ones, but not the other way around.\n */\n protected _private?: FlowNodeScope;\n\n protected _public: FlowNodeScope;\n\n /**\n * The private scope of the node.\n */\n get private() {\n return this._private;\n }\n\n /**\n * The public scope of the node.\n */\n get public() {\n return this._public;\n }\n\n /**\n * Sets a variable in the public AST (Abstract Syntax Tree) with the given key and JSON value.\n *\n * @param key - The key under which the variable will be stored.\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(key: string, json: ASTNodeJSON): ASTNode;\n\n /**\n * Sets a variable in the public AST (Abstract Syntax Tree) with the default key 'outputs'.\n *\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setVar(json: ASTNodeJSON): ASTNode;\n\n public setVar(arg1: string | ASTNodeJSON, arg2?: ASTNodeJSON): ASTNode {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.public.ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.public.ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the public AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The value of the variable, or undefined if not found.\n */\n public getVar(key: string = 'outputs') {\n return this.public.ast.get(key);\n }\n\n /**\n * Clears a variable from the public AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to clear. Defaults to 'outputs'.\n * @returns The updated AST node.\n */\n public clearVar(key: string = 'outputs') {\n return this.public.ast.remove(key);\n }\n\n /**\n * Sets a variable in the private AST (Abstract Syntax Tree) with the given key and JSON value.\n *\n * @param key - The key under which the variable will be stored.\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setPrivateVar(key: string, json: ASTNodeJSON): ASTNode;\n\n /**\n * Sets a variable in the private AST (Abstract Syntax Tree) with the default key 'outputs'.\n *\n * @param json - The JSON value to store.\n * @returns The updated AST node.\n */\n public setPrivateVar(json: ASTNodeJSON): ASTNode;\n\n public setPrivateVar(arg1: string | ASTNodeJSON, arg2?: ASTNodeJSON): ASTNode {\n if (typeof arg1 === 'string' && arg2 !== undefined) {\n return this.initPrivate().ast.set(arg1, arg2);\n }\n\n if (typeof arg1 === 'object' && arg2 === undefined) {\n return this.initPrivate().ast.set('outputs', arg1);\n }\n\n throw new Error('Invalid arguments');\n }\n\n /**\n * Retrieves a variable from the private AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to retrieve. Defaults to 'outputs'.\n * @returns The value of the variable, or undefined if not found.\n */\n public getPrivateVar(key: string = 'outputs') {\n return this.private?.ast.get(key);\n }\n\n /**\n * Clears a variable from the private AST (Abstract Syntax Tree) by key.\n *\n * @param key - The key of the variable to clear. Defaults to 'outputs'.\n * @returns The updated AST node.\n */\n public clearPrivateVar(key: string = 'outputs') {\n return this.private?.ast.remove(key);\n }\n\n /**\n * An array containing all scopes (public and private) of the node.\n */\n get allScopes(): FlowNodeScope[] {\n const res = [];\n\n if (this._public) {\n res.push(this._public);\n }\n if (this._private) {\n res.push(this._private);\n }\n\n return res;\n }\n\n getDefaultData() {\n return {};\n }\n\n constructor(entity: FlowNodeEntity, readonly opts: Options) {\n super(entity);\n\n const { variableEngine } = opts || {};\n this.variableEngine = variableEngine;\n this._public = this.variableEngine.createScope(this.entity.id, {\n node: this.entity,\n type: FlowNodeScopeTypeEnum.public,\n } as FlowNodeScopeMeta);\n this.toDispose.push(this._public);\n }\n\n /**\n * Initializes and returns the private scope for the node.\n * If the private scope already exists, it returns the existing one.\n * @returns The private scope of the node.\n */\n initPrivate(): FlowNodeScope {\n if (!this._private) {\n this._private = this.variableEngine.createScope(`${this.entity.id}_private`, {\n node: this.entity,\n type: FlowNodeScopeTypeEnum.private,\n } as FlowNodeScopeMeta);\n\n this.variableEngine.chain.refreshAllChange();\n\n this.toDispose.push(this._private);\n }\n return this._private;\n }\n\n /**\n * Find a variable field by key path in the public scope by scope chain.\n * @param keyPath - The key path of the variable field.\n * @returns The variable field, or undefined if not found.\n */\n getByKeyPath(keyPath: string[]): BaseVariableField | undefined {\n return this.public.available.getByKeyPath(keyPath);\n }\n\n /**\n * Find a variable field by key path in the private scope by scope chain.\n * @param keyPath - The key path of the variable field.\n * @returns The variable field, or undefined if not found.\n */\n getByKeyPathInPrivate(keyPath: string[]): BaseVariableField | undefined {\n return this.private?.available.getByKeyPath(keyPath);\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Scope } from '@flowgram.ai/variable-core';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\n/**\n * Enum for flow node scope types.\n */\nexport enum FlowNodeScopeTypeEnum {\n /**\n * Public scope.\n */\n public = 'public',\n /**\n * Private scope.\n */\n private = 'private',\n}\n\n/**\n * Metadata for a flow node scope.\n */\nexport interface FlowNodeScopeMeta {\n /**\n * The flow node entity associated with the scope.\n */\n node?: FlowNodeEntity;\n /**\n * The type of the scope.\n */\n type?: FlowNodeScopeTypeEnum;\n}\n\n/**\n * Represents a virtual node in the scope chain.\n */\nexport interface ScopeVirtualNode {\n /**\n * The ID of the virtual node.\n */\n id: string;\n /**\n * The type of the flow node.\n */\n flowNodeType: 'virtualNode';\n}\n\n/**\n * Represents a node in the scope chain, which can be either a flow node entity or a virtual node.\n */\nexport type ScopeChainNode = FlowNodeEntity | ScopeVirtualNode;\n\n/**\n * Represents a scope associated with a flow node.\n */\nexport interface FlowNodeScope extends Scope<FlowNodeScopeMeta> {}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, optional, postConstruct } from 'inversify';\nimport { Scope, ScopeChain } from '@flowgram.ai/variable-core';\nimport { WorkflowNodeLinesData, WorkflowNodeMeta } from '@flowgram.ai/free-layout-core';\nimport {\n FlowNodeEntity,\n FlowDocument,\n FlowVirtualTree,\n FlowNodeBaseType,\n} from '@flowgram.ai/document';\nimport { EntityManager } from '@flowgram.ai/core';\n\nimport { VariableChainConfig } from '../variable-chain-config';\nimport { FlowNodeScope, FlowNodeScopeTypeEnum } from '../types';\nimport { ScopeChainTransformService } from '../services/scope-chain-transform-service';\nimport { GlobalScope } from '../scopes/global-scope';\nimport { FlowNodeVariableData } from '../flow-node-variable-data';\n\n/**\n * Scope chain implementation for free layout.\n */\nexport class FreeLayoutScopeChain extends ScopeChain {\n @inject(EntityManager) entityManager: EntityManager;\n\n @inject(FlowDocument)\n protected flowDocument: FlowDocument;\n\n @optional()\n @inject(VariableChainConfig)\n protected configs?: VariableChainConfig;\n\n @inject(ScopeChainTransformService)\n protected transformService: ScopeChainTransformService;\n\n /**\n * The virtual tree of the flow document.\n */\n get tree(): FlowVirtualTree<FlowNodeEntity> {\n return this.flowDocument.originTree;\n }\n\n @postConstruct()\n onInit() {\n this.toDispose.pushAll([\n // When the line changes, the scope chain will be updated\n this.entityManager.onEntityDataChange(({ entityDataType }) => {\n if (entityDataType === WorkflowNodeLinesData.type) {\n this.refreshAllChange();\n }\n }),\n // Refresh the scope when the tree changes\n this.tree.onTreeChange(() => {\n this.refreshAllChange();\n }),\n ]);\n }\n\n /**\n * Gets all input layer nodes for a given node in the same layer, sorted by distance.\n * @param node The node to get input layer nodes for.\n * @returns An array of input layer nodes.\n */\n protected getAllInputLayerNodes(node: FlowNodeEntity): FlowNodeEntity[] {\n const currParent = this.getNodeParent(node);\n\n const result = new Set<FlowNodeEntity>();\n\n // add by bfs\n const queue: FlowNodeEntity[] = [node];\n\n while (queue.length) {\n const curr = queue.shift()!;\n\n (curr.lines?.inputNodes || []).forEach((inputNode) => {\n if (this.getNodeParent(inputNode) === currParent) {\n if (result.has(inputNode)) {\n return;\n }\n queue.push(inputNode);\n result.add(inputNode);\n }\n });\n }\n\n return Array.from(result).reverse();\n }\n\n /**\n * Gets all output layer nodes for a given node in the same layer.\n * @param curr The node to get output layer nodes for.\n * @returns An array of output layer nodes.\n */\n protected getAllOutputLayerNodes(curr: FlowNodeEntity): FlowNodeEntity[] {\n const currParent = this.getNodeParent(curr);\n\n return (curr.lines?.allOutputNodes || []).filter(\n (_node) => this.getNodeParent(_node) === currParent\n );\n }\n\n /**\n * Gets the dependency scopes for a given scope.\n * @param scope The scope to get dependencies for.\n * @returns An array of dependency scopes.\n */\n getDeps(scope: FlowNodeScope): FlowNodeScope[] {\n const { node } = scope.meta || {};\n if (!node) {\n return this.transformService.transformDeps([], { scope });\n }\n\n const deps: FlowNodeScope[] = [];\n\n // 1. find dep nodes\n let curr: FlowNodeEntity | undefined = node;\n\n while (curr) {\n // 2. private scope of parent node can be access\n const currVarData: FlowNodeVariableData = curr.getData(FlowNodeVariableData);\n if (currVarData?.private && scope !== currVarData.private) {\n deps.unshift(currVarData.private);\n }\n\n // 3. all public scopes of inputNodes\n const allInputNodes: FlowNodeEntity[] = this.getAllInputLayerNodes(curr);\n deps.unshift(\n ...allInputNodes\n .map((_node) => [\n _node.getData(FlowNodeVariableData).public,\n // 4. all public children of inputNodes\n ...this.getAllPublicChildScopes(_node),\n ])\n .flat()\n .filter(Boolean)\n );\n\n curr = this.getNodeParent(curr);\n }\n\n // If scope is GlobalScope, add globalScope to deps\n const globalScope = this.variableEngine.getScopeById(GlobalScope.ID);\n if (globalScope) {\n deps.unshift(globalScope);\n }\n\n const uniqDeps = Array.from(new Set(deps));\n return this.transformService.transformDeps(uniqDeps, { scope });\n }\n\n /**\n * Gets the covering scopes for a given scope.\n * @param scope The scope to get covering scopes for.\n * @returns An array of covering scopes.\n */\n getCovers(scope: FlowNodeScope): FlowNodeScope[] {\n // If scope is GlobalScope, return all scopes except GlobalScope\n if (GlobalScope.is(scope)) {\n const scopes = this.variableEngine\n .getAllScopes({ sort: true })\n .filter((_scope) => !GlobalScope.is(_scope));\n\n return this.transformService.transformCovers(scopes, { scope });\n }\n\n const { node } = scope.meta || {};\n if (!node) {\n return this.transformService.transformCovers([], { scope });\n }\n\n const isPrivate = scope.meta.type === FlowNodeScopeTypeEnum.private;\n\n // 1. BFS to find all covered nodes\n const queue: FlowNodeEntity[] = [];\n\n if (isPrivate) {\n // private can only cover its child nodes\n queue.push(...this.getNodeChildren(node));\n } else {\n // Otherwise, cover all nodes of its output lines\n queue.push(...(this.getAllOutputLayerNodes(node) || []));\n\n // get all parents\n let parent = this.getNodeParent(node);\n\n while (parent) {\n // if childNodes of parent is private to next nodes, break\n if (this.isNodeChildrenPrivate(parent)) {\n break;\n }\n\n queue.push(...this.getAllOutputLayerNodes(parent));\n\n parent = this.getNodeParent(parent);\n }\n }\n\n // 2. Get the public and private scopes of all covered nodes\n const scopes: FlowNodeScope[] = [];\n\n while (queue.length) {\n const _node = queue.shift()!;\n const variableData: FlowNodeVariableData = _node.getData(FlowNodeVariableData);\n scopes.push(...variableData.allScopes);\n const children = _node && this.getNodeChildren(_node);\n\n if (children?.length) {\n queue.push(...children);\n }\n }\n\n // 3. If the current scope is private, the public scope of the current node can also be covered\n const currentVariableData: FlowNodeVariableData = node.getData(FlowNodeVariableData);\n if (isPrivate && currentVariableData.public) {\n scopes.push(currentVariableData.public);\n }\n\n const uniqScopes = Array.from(new Set(scopes));\n\n return this.transformService.transformCovers(uniqScopes, { scope });\n }\n\n /**\n * Gets the children of a node.\n * @param node The node to get children for.\n * @returns An array of child nodes.\n */\n getNodeChildren(node: FlowNodeEntity): FlowNodeEntity[] {\n if (this.configs?.getNodeChildren) {\n return this.configs.getNodeChildren?.(node);\n }\n const nodeMeta = node.getNodeMeta<WorkflowNodeMeta>();\n const subCanvas = nodeMeta.subCanvas?.(node);\n\n if (subCanvas) {\n // The sub-canvas itself does not have children\n if (subCanvas.isCanvas) {\n return [];\n } else {\n return subCanvas.canvasNode.collapsedChildren;\n }\n }\n\n // In some scenarios, the parent-child relationship is expressed through connections, so it needs to be configured at the upper level\n return this.tree.getChildren(node);\n }\n\n /**\n * Get All children of nodes\n * @param node\n * @returns\n */\n getAllPublicChildScopes(node: FlowNodeEntity): Scope[] {\n if (this.isNodeChildrenPrivate(node)) {\n return [];\n }\n\n return this.getNodeChildren(node)\n .map((_node) => [\n _node.getData(FlowNodeVariableData).public,\n ...this.getAllPublicChildScopes(_node),\n ])\n .flat();\n }\n\n /**\n * Gets the parent of a node.\n * @param node The node to get the parent for.\n * @returns The parent node or `undefined` if not found.\n */\n getNodeParent(node: FlowNodeEntity): FlowNodeEntity | undefined {\n // In some scenarios, the parent-child relationship is expressed through connections, so it needs to be configured at the upper level\n if (this.configs?.getNodeParent) {\n return this.configs.getNodeParent(node);\n }\n let parent = node.document.originTree.getParent(node);\n\n // If currentParent is Group, get the parent of parent\n while (parent?.flowNodeType === FlowNodeBaseType.GROUP) {\n parent = parent.parent;\n }\n\n if (!parent) {\n return parent;\n }\n\n const nodeMeta = parent.getNodeMeta<WorkflowNodeMeta>();\n const subCanvas = nodeMeta.subCanvas?.(parent);\n if (subCanvas?.isCanvas) {\n // Get real parent node by subCanvas Configuration\n return subCanvas.parentNode;\n }\n\n return parent;\n }\n\n /**\n * Checks if the children of a node are private and cannot be accessed by subsequent nodes.\n * @param node The node to check.\n * @returns `true` if the children are private, `false` otherwise.\n */\n protected isNodeChildrenPrivate(node?: FlowNodeEntity): boolean {\n if (this.configs?.isNodeChildrenPrivate) {\n return node ? this.configs?.isNodeChildrenPrivate(node) : false;\n }\n\n const isSystemNode = node?.id.startsWith('$');\n\n // Except system node and group node, everything else is private\n return !isSystemNode && node?.flowNodeType !== FlowNodeBaseType.GROUP;\n }\n\n /**\n * Sorts all scopes in the scope chain.\n * @returns An empty array, as this method is not implemented.\n */\n sortAll(): Scope[] {\n // Not implemented yet\n console.warn('FreeLayoutScopeChain.sortAll is not implemented');\n return [];\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { type ScopeChainNode } from './types';\nimport { IScopeTransformer } from './services/scope-chain-transform-service';\n\n/**\n * Configuration for the variable chain.\n */\nexport interface VariableChainConfig {\n /**\n * The output variables of a node's children cannot be accessed by subsequent nodes.\n *\n * @param node\n * @returns\n */\n isNodeChildrenPrivate?: (node: ScopeChainNode) => boolean;\n\n /**\n * For fixed layout scenarios: there are a large number of useless nodes between parent and child (such as inlineBlocks, etc., which need to be configured to be skipped)\n * For free canvas scenarios: in some scenarios, the parent-child relationship between nodes is expressed through connections or other interactive forms, which needs to be configurable\n */\n getNodeChildren?: (node: FlowNodeEntity) => FlowNodeEntity[];\n getNodeParent?: (node: FlowNodeEntity) => FlowNodeEntity | undefined;\n\n /**\n * Fine-tune the dependency scope.\n */\n transformDeps?: IScopeTransformer;\n\n /**\n * Fine-tune the cover scope.\n */\n transformCovers?: IScopeTransformer;\n}\n\nexport const VariableChainConfig = Symbol('VariableChainConfig');\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, injectable, optional } from 'inversify';\nimport { Scope, VariableEngine } from '@flowgram.ai/variable-core';\nimport { FlowDocument } from '@flowgram.ai/document';\nimport { lazyInject } from '@flowgram.ai/core';\n\nimport { VariableChainConfig } from '../variable-chain-config';\nimport { FlowNodeScope } from '../types';\n\n/**\n * Context for scope transformers.\n */\nexport interface TransformerContext {\n /**\n * The current scope\n */\n scope: FlowNodeScope;\n /**\n * The flow document.\n */\n document: FlowDocument;\n /**\n * The variable engine.\n */\n variableEngine: VariableEngine;\n}\n\n/**\n * A function that transforms an array of scopes.\n * @param scopes The array of scopes to transform.\n * @param ctx The transformer context.\n * @returns The transformed array of scopes.\n */\nexport type IScopeTransformer = (scopes: Scope[], ctx: TransformerContext) => Scope[];\n\nconst passthrough: IScopeTransformer = (scopes, ctx) => scopes;\n\n/**\n * A service for transforming scope chains.\n */\n@injectable()\nexport class ScopeChainTransformService {\n protected transformerMap: Map<\n string,\n { transformDeps: IScopeTransformer; transformCovers: IScopeTransformer }\n > = new Map();\n\n @lazyInject(FlowDocument) document: FlowDocument;\n\n @lazyInject(VariableEngine) variableEngine: VariableEngine;\n\n constructor(\n @optional()\n @inject(VariableChainConfig)\n protected configs?: VariableChainConfig\n ) {\n if (this.configs?.transformDeps || this.configs?.transformCovers) {\n this.transformerMap.set('VARIABLE_LAYOUT_CONFIG', {\n transformDeps: this.configs.transformDeps || passthrough,\n transformCovers: this.configs.transformCovers || passthrough,\n });\n }\n }\n\n /**\n * check if transformer registered\n * @param transformerId used to identify transformer, prevent duplicated\n * @returns\n */\n hasTransformer(transformerId: string) {\n return this.transformerMap.has(transformerId);\n }\n\n /**\n * register new transform function\n * @param transformerId used to identify transformer, prevent duplicated transformer\n * @param transformer The transformer to register.\n */\n registerTransformer(\n transformerId: string,\n transformer: {\n transformDeps: IScopeTransformer;\n transformCovers: IScopeTransformer;\n }\n ) {\n this.transformerMap.set(transformerId, transformer);\n }\n\n /**\n * Transforms the dependency scopes.\n * @param scopes The array of scopes to transform.\n * @param param1 The context for the transformation.\n * @returns The transformed array of scopes.\n */\n transformDeps(scopes: Scope[], { scope }: { scope: Scope }): Scope[] {\n return Array.from(this.transformerMap.values()).reduce((scopes, transformer) => {\n if (!transformer.transformDeps) {\n return scopes;\n }\n\n scopes = transformer.transformDeps(scopes, {\n scope,\n document: this.document,\n variableEngine: this.variableEngine,\n });\n return scopes;\n }, scopes);\n }\n\n /**\n * Transforms the cover scopes.\n * @param scopes The array of scopes to transform.\n * @param param1 The context for the transformation.\n * @returns The transformed array of scopes.\n */\n transformCovers(scopes: Scope[], { scope }: { scope: Scope }): Scope[] {\n return Array.from(this.transformerMap.values()).reduce((scopes, transformer) => {\n if (!transformer.transformCovers) {\n return scopes;\n }\n\n scopes = transformer.transformCovers(scopes, {\n scope,\n document: this.document,\n variableEngine: this.variableEngine,\n });\n return scopes;\n }, scopes);\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable, interfaces } from 'inversify';\nimport { Scope, VariableEngine } from '@flowgram.ai/variable-core';\n\n/**\n * Global Scope stores all variables that are not scoped to any node.\n *\n * - Variables in Global Scope can be accessed by any node.\n * - Any other scope's variables can not be accessed by Global Scope.\n */\n@injectable()\nexport class GlobalScope extends Scope {\n static readonly ID = Symbol('GlobalScope');\n\n /**\n * Check if the scope is Global Scope.\n * @param scope\n * @returns\n */\n static is(scope: Scope) {\n return scope.id === GlobalScope.ID;\n }\n}\n\nexport const bindGlobalScope = (bind: interfaces.Bind) => {\n bind(GlobalScope).toDynamicValue((ctx) => {\n const variableEngine = ctx.container.get(VariableEngine);\n let scope = variableEngine.getScopeById(GlobalScope.ID) as GlobalScope;\n\n if (!scope) {\n scope = variableEngine.createScope(\n GlobalScope.ID,\n {},\n { ScopeConstructor: GlobalScope }\n ) as GlobalScope;\n variableEngine.chain.refreshAllChange();\n }\n\n return scope;\n });\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { inject, optional } from 'inversify';\nimport { Scope, ScopeChain } from '@flowgram.ai/variable-core';\nimport { FlowDocument, type FlowVirtualTree } from '@flowgram.ai/document';\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { VariableChainConfig } from '../variable-chain-config';\nimport { FlowNodeScope, FlowNodeScopeTypeEnum, ScopeChainNode } from '../types';\nimport { ScopeChainTransformService } from '../services/scope-chain-transform-service';\nimport { GlobalScope } from '../scopes/global-scope';\nimport { FlowNodeVariableData } from '../flow-node-variable-data';\n\n/**\n * Scope chain implementation based on `FlowVirtualTree`.\n */\nexport class FixedLayoutScopeChain extends ScopeChain {\n // By adding { id: string }, custom virtual nodes can be flexibly added\n tree: FlowVirtualTree<ScopeChainNode> | undefined;\n\n @inject(ScopeChainTransformService)\n protected transformService: ScopeChainTransformService;\n\n constructor(\n @inject(FlowDocument)\n protected flowDocument: FlowDocument,\n @optional()\n @inject(VariableChainConfig)\n protected configs?: VariableChainConfig\n ) {\n super();\n\n // Bind the tree in flowDocument\n this.bindTree(flowDocument.originTree);\n\n // When originTree changes, trigger changes in dependencies\n this.toDispose.push(\n // REFRACTOR: onTreeChange trigger timing needs to be refined\n flowDocument.originTree.onTreeChange(() => {\n this.refreshAllChange();\n })\n );\n }\n\n /**\n * Binds the scope chain to a `FlowVirtualTree`.\n * @param tree The `FlowVirtualTree` to bind to.\n */\n bindTree(tree: FlowVirtualTree<ScopeChainNode>): void {\n this.tree = tree;\n }\n\n /**\n * Gets the dependency scopes for a given scope.\n * @param scope The scope to get dependencies for.\n * @returns An array of dependency scopes.\n */\n getDeps(scope: FlowNodeScope): FlowNodeScope[] {\n if (!this.tree) {\n return this.transformService.transformDeps([], { scope });\n }\n\n const node = scope.meta.node;\n if (!node) {\n return this.transformService.transformDeps([], { scope });\n }\n\n const deps: FlowNodeScope[] = [];\n\n let curr: ScopeChainNode | undefined = node;\n\n while (curr) {\n const { parent, pre } = this.tree.getInfo(curr);\n const currData = this.getVariableData(curr);\n\n // Contains child nodes and is not a private scope\n\n if (curr === node) {\n // public can depend on private\n if (scope.meta.type === FlowNodeScopeTypeEnum.public && currData?.private) {\n deps.unshift(currData.private);\n }\n } else if (this.hasChildren(curr) && !this.isNodeChildrenPrivate(curr)) {\n // For nodes with child elements, include the child elements in the dependency scope\n deps.unshift(\n ...this.getAllSortedChildScope(curr, {\n ignoreNodeChildrenPrivate: true,\n })\n );\n }\n\n // The public of the node can be accessed\n if (currData && curr !== node) {\n deps.unshift(currData.public);\n }\n\n // Process the previous node\n if (pre) {\n curr = pre;\n continue;\n }\n\n // Process the parent node\n if (parent) {\n let currParent: ScopeChainNode | undefined = parent;\n let currParentPre: ScopeChainNode | undefined = this.tree.getPre(currParent);\n\n while (currParent) {\n // Both private and public of the parent node can be accessed by child nodes\n const currParentData = this.getVariableData(currParent);\n if (currParentData) {\n deps.unshift(...currParentData.allScopes);\n }\n\n // If the current parent has a pre node, stop searching upwards\n if (currParentPre) {\n break;\n }\n\n currParent = this.tree.getParent(currParent);\n currParentPre = currParent ? this.tree.getPre(currParent) : undefined;\n }\n curr = currParentPre;\n continue;\n }\n\n // If there is no next and no parent, end the loop directly\n curr = undefined;\n }\n\n // If scope is GlobalScope, add globalScope to deps\n const globalScope = this.variableEngine.getScopeById(GlobalScope.ID);\n if (globalScope) {\n deps.unshift(globalScope);\n }\n\n return this.transformService.transformDeps(deps, { scope });\n }\n\n /**\n * Gets the covering scopes for a given scope.\n * @param scope The scope to get covering scopes for.\n * @returns An array of covering scopes.\n */\n getCovers(scope: FlowNodeScope): FlowNodeScope[] {\n if (!this.tree) {\n return this.transformService.transformCovers([], { scope });\n }\n\n // If scope is GlobalScope, return all scopes except GlobalScope\n if (GlobalScope.is(scope)) {\n const scopes = this.variableEngine\n .getAllScopes({ sort: true })\n .filter((_scope) => !GlobalScope.is(_scope));\n\n return this.transformService.transformCovers(scopes, { scope });\n }\n\n const node = scope.meta.node;\n if (!node) {\n return this.transformService.transformCovers([], { scope });\n }\n\n const covers: FlowNodeScope[] = [];\n\n // If it is a private scope, only child nodes can access it\n if (scope.meta.type === FlowNodeScopeTypeEnum.private) {\n covers.push(\n ...this.getAllSortedChildScope(node, {\n addNodePrivateScope: true,\n }).filter((_scope) => _scope !== scope)\n );\n return this.transformService.transformCovers(covers, { scope });\n }\n\n let curr: ScopeChainNode | undefined = node;\n\n while (curr) {\n const { next, parent } = this.tree.getInfo(curr);\n const currData = this.getVariableData(curr);\n\n // For nodes with child elements, include the child elements in the covering scope\n if (curr !== node) {\n if (this.hasChildren(curr)) {\n covers.push(\n ...this.getAllSortedChildScope(curr, {\n addNodePrivateScope: true,\n })\n );\n } else if (currData) {\n covers.push(...currData.allScopes);\n }\n }\n\n // Process the next node\n if (next) {\n curr = next;\n continue;\n }\n\n if (parent) {\n let currParent: ScopeChainNode | undefined = parent;\n let currParentNext: ScopeChainNode | undefined = this.tree.getNext(currParent);\n\n while (currParent) {\n // Private scopes cannot be accessed by subsequent nodes\n if (this.isNodeChildrenPrivate(currParent)) {\n return this.transformService.transformCovers(covers, { scope });\n }\n\n // If the current parent has a next node, stop searching upwards\n if (currParentNext) {\n break;\n }\n\n currParent = this.tree.getParent(currParent);\n currParentNext = currParent ? this.tree.getNext(currParent) : undefined;\n }\n if (!currParentNext && currParent) {\n break;\n }\n\n curr = currParentNext;\n continue;\n }\n\n // next 和 parent 都没有,直接结束循环\n curr = undefined;\n }\n\n return this.transformService.transformCovers(covers, { scope });\n }\n\n /**\n * Sorts all scopes in the scope chain.\n * @returns A sorted array of all scopes.\n */\n sortAll(): Scope[] {\n const startNode = this.flowDocument.getAllNodes().find((_node) => _node.isStart);\n if (!startNode) {\n return [];\n }\n\n const startVariableData = startNode.getData(FlowNodeVariableData);\n const startPublicScope = startVariableData.public;\n const deps = this.getDeps(startPublicScope);\n\n const covers = this.getCovers(startPublicScope).filter(\n (_scope) => !deps.includes(_scope) && _scope !== startPublicScope\n );\n\n return [...deps, startPublicScope, ...covers];\n }\n\n /**\n * Gets the `FlowNodeVariableData` for a given `ScopeChainNode`.\n * @param node The `ScopeChainNode` to get data for.\n * @returns The `FlowNodeVariableData` or `undefined` if not found.\n */\n private getVariableData(node: ScopeChainNode): FlowNodeVariableData | undefined {\n if (node.flowNodeType === 'virtualNode') {\n return;\n }\n // TODO Nodes containing $ do not register variableData\n if (node.id.startsWith('$')) {\n return;\n }\n\n return (node as FlowNodeEntity).getData(FlowNodeVariableData);\n }\n\n /**\n * Checks if the children of a node are private.\n * @param node The node to check.\n * @returns `true` if the children are private, `false` otherwise.\n */\n private isNodeChildrenPrivate(node?: ScopeChainNode): boolean {\n if (this.configs?.isNodeChildrenPrivate) {\n return node ? this.configs?.isNodeChildrenPrivate(node) : false;\n }\n\n const isSystemNode = node?.id.startsWith('$');\n // Fallback: all nodes with children (node id does not start with $) are private scopes\n return !isSystemNode && this.hasChildren(node);\n }\n\n /**\n * Checks if a node has children.\n * @param node The node to check.\n * @returns `true` if the node has children, `false` otherwise.\n */\n private hasChildren(node?: ScopeChainNode): boolean {\n return Boolean(this.tree && node && this.tree.getChildren(node).length > 0);\n }\n\n /**\n * Gets all sorted child scopes of a node.\n * @param node The node to get child scopes for.\n * @param options Options for getting child scopes.\n * @returns An array of sorted child scopes.\n */\n private getAllSortedChildScope(\n node: ScopeChainNode,\n {\n ignoreNodeChildrenPrivate,\n addNodePrivateScope,\n }: { ignoreNodeChildrenPrivate?: boolean; addNodePrivateScope?: boolean } = {}\n ): FlowNodeScope[] {\n const scopes: FlowNodeScope[] = [];\n\n const variableData = this.getVariableData(node);\n\n if (variableData) {\n scopes.push(variableData.public);\n }\n\n // For private scopes, the variables of child nodes are not exposed externally\n // (If the parent node has public variables, they are exposed externally)\n if (ignoreNodeChildrenPrivate && this.isNodeChildrenPrivate(node)) {\n return scopes;\n }\n\n if (addNodePrivateScope && variableData?.private) {\n scopes.push(variableData.private);\n }\n\n const children = this.tree?.getChildren(node) || [];\n scopes.push(\n ...children\n .map((child) =>\n this.getAllSortedChildScope(child, { ignoreNodeChildrenPrivate, addNodePrivateScope })\n )\n .flat()\n );\n\n return scopes;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { FlowNodeEntity } from '@flowgram.ai/document';\n\nimport { FlowNodeVariableData } from './flow-node-variable-data';\n\n/**\n * Use `node.scope` instead.\n * @deprecated\n * @param node The flow node entity.\n * @returns The public scope of the node.\n */\nexport function getNodeScope(node: FlowNodeEntity) {\n return node.getData(FlowNodeVariableData).public;\n}\n\n/**\n * Use `node.privateScope` instead.\n * @deprecated\n * @param node The flow node entity.\n * @returns The private scope of the node.\n */\nexport function getNodePrivateScope(node: FlowNodeEntity) {\n return node.getData(FlowNodeVariableData).initPrivate();\n}\n"],"mappings":"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","names":["FlowNodeScopeTypeEnum","inject","optional","FlowDocument","scopes","injectable","Scope","VariableEngine","Scope","injectable","VariableEngine","scopes","inject","FlowDocument","optional","inject","optional","ScopeChain","FlowDocument","ScopeChain","inject","FlowDocument","optional"]}