@principal-ade/dynamic-file-tree 0.1.58 → 0.1.60

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/index.d.ts CHANGED
@@ -20,6 +20,8 @@ export { MultiFileTree, MultiFileTreeCore } from './src/components/MultiFileTree
20
20
  export type { MultiFileTreeProps, MultiFileTreeCoreProps } from './src/components/MultiFileTree';
21
21
  export { StoryboardWorkflowsTreeCore } from './src/components/StoryboardWorkflowsTree/StoryboardWorkflowsTreeCore';
22
22
  export type { StoryboardWorkflowsTreeProps, StoryboardWorkflowNodeData, StoryboardWorkflowNodeType, DiscoveredStoryboard, DiscoveredWorkflow, } from './src/components/StoryboardWorkflowsTree/types';
23
+ export { WorkflowScenarioTreeCore } from './src/components/WorkflowScenarioTree';
24
+ export type { WorkflowScenarioTreeProps, WorkflowScenarioNodeData, WorkflowScenarioNodeType, WorkflowWithScenarios, WorkflowFilterMode, } from './src/components/WorkflowScenarioTree';
23
25
  export { CanvasListTreeCore } from './src/components/CanvasListTree/CanvasListTreeCore';
24
26
  export type { CanvasListTreeProps, CanvasListNodeData, CanvasListNodeType, DiscoveredCanvas, } from './src/components/CanvasListTree/types';
25
27
  export { TelemetryCoverageFileTree, calculateTelemetryCoverageStats, } from './src/components/TelemetryCoverageFileTree';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,YAAY,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAGxG,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG7E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,YAAY,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAG7E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,YAAY,EAAE,oBAAoB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAGhG,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,YAAY,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAGnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,YAAY,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAGjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,YAAY,EACV,sBAAsB,EACtB,aAAa,EACb,SAAS,EACV,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AACzF,YAAY,EAAE,+BAA+B,EAAE,MAAM,6CAA6C,CAAC;AAGnG,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAClF,YAAY,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAGjG,OAAO,EAAE,2BAA2B,EAAE,MAAM,sEAAsE,CAAC;AACnH,YAAY,EACV,4BAA4B,EAC5B,0BAA0B,EAC1B,0BAA0B,EAC1B,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,gDAAgD,CAAC;AAGxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AACxF,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,uCAAuC,CAAC;AAG/C,OAAO,EACL,yBAAyB,EACzB,+BAA+B,GAChC,MAAM,4CAA4C,CAAC;AACpD,YAAY,EACV,8BAA8B,EAC9B,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EAAE,kCAAkC,EAAE,MAAM,qDAAqD,CAAC;AACzG,YAAY,EAAE,uCAAuC,EAAE,MAAM,qDAAqD,CAAC;AAGnH,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,YAAY,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAGxG,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG7E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,YAAY,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAG7E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,YAAY,EAAE,oBAAoB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAGhG,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,YAAY,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAGnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,YAAY,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAGjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,YAAY,EACV,sBAAsB,EACtB,aAAa,EACb,SAAS,EACV,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AACzF,YAAY,EAAE,+BAA+B,EAAE,MAAM,6CAA6C,CAAC;AAGnG,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAClF,YAAY,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAGjG,OAAO,EAAE,2BAA2B,EAAE,MAAM,sEAAsE,CAAC;AACnH,YAAY,EACV,4BAA4B,EAC5B,0BAA0B,EAC1B,0BAA0B,EAC1B,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,gDAAgD,CAAC;AAGxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,YAAY,EACV,yBAAyB,EACzB,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,uCAAuC,CAAC;AAG/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AACxF,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,uCAAuC,CAAC;AAG/C,OAAO,EACL,yBAAyB,EACzB,+BAA+B,GAChC,MAAM,4CAA4C,CAAC;AACpD,YAAY,EACV,8BAA8B,EAC9B,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EAAE,kCAAkC,EAAE,MAAM,qDAAqD,CAAC;AACzG,YAAY,EAAE,uCAAuC,EAAE,MAAM,qDAAqD,CAAC;AAGnH,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC"}
package/dist/index.mjs CHANGED
@@ -1889,10 +1889,10 @@ var MultiFileTree = ({
1889
1889
  }, "Selected: ", selectedFile.source.name, " / ", selectedFile.path));
1890
1890
  };
1891
1891
  // src/components/StoryboardWorkflowsTree/StoryboardWorkflowsTreeCore.tsx
1892
- import { Package, FolderKanban, LayoutDashboard, Workflow, BookOpen, FolderOpen, CheckCircle2 } from "lucide-react";
1892
+ import { Package, FolderKanban, LayoutDashboard, Workflow, BookOpen, FolderOpen, CheckCircle2, GitCommit, CircleDot, Circle } from "lucide-react";
1893
1893
  import React11, { useMemo as useMemo9, useRef as useRef5 } from "react";
1894
1894
  import { Tree as Tree3 } from "react-arborist";
1895
- var buildTreeData = (storyboards, workflowCoverageMap) => {
1895
+ var buildTreeDataFromStoryboards = (storyboards, workflowCoverageMap, traceWorkflowsSet, filterMode, versionPrefix) => {
1896
1896
  const packagesMap = new Map;
1897
1897
  const rootStoryboards = [];
1898
1898
  for (const storyboard of storyboards) {
@@ -1906,16 +1906,18 @@ var buildTreeData = (storyboards, workflowCoverageMap) => {
1906
1906
  }
1907
1907
  const buildStoryboardNode = (storyboard) => {
1908
1908
  const children = [];
1909
+ const canvasId = versionPrefix ? `canvas:${versionPrefix}:${storyboard.id}` : `canvas:${storyboard.id}`;
1909
1910
  children.push({
1910
- id: `canvas:${storyboard.id}`,
1911
+ id: canvasId,
1911
1912
  name: "Storyboard",
1912
1913
  type: "canvas",
1913
1914
  canvas: storyboard.canvas,
1914
1915
  storyboard
1915
1916
  });
1916
1917
  if (storyboard.canvas.markdownPath) {
1918
+ const overviewId = versionPrefix ? `overview:${versionPrefix}:${storyboard.id}` : `overview:${storyboard.id}`;
1917
1919
  children.push({
1918
- id: `overview:${storyboard.id}`,
1920
+ id: overviewId,
1919
1921
  name: "Overview",
1920
1922
  type: "overview",
1921
1923
  storyboard,
@@ -1923,28 +1925,51 @@ var buildTreeData = (storyboards, workflowCoverageMap) => {
1923
1925
  });
1924
1926
  }
1925
1927
  if (storyboard.workflows.length > 0) {
1926
- const workflowNodes = storyboard.workflows.map((workflow) => ({
1927
- id: `workflow:${workflow.id}`,
1928
- name: workflow.name,
1929
- type: "workflow",
1930
- workflow,
1931
- storyboard,
1932
- isFullyCovered: workflowCoverageMap?.[workflow.id] ?? false
1933
- })).sort((a, b) => a.name.localeCompare(b.name));
1934
- children.push({
1935
- id: `workflows:${storyboard.id}`,
1936
- name: "Workflows",
1937
- type: "workflows",
1938
- storyboard,
1939
- children: workflowNodes
1940
- });
1928
+ let workflowNodes = storyboard.workflows.map((workflow) => {
1929
+ const workflowHasTraces = traceWorkflowsSet?.has(workflow.id) ?? false;
1930
+ const workflowNodeId = versionPrefix ? `workflow:${versionPrefix}:${workflow.id}` : `workflow:${workflow.id}`;
1931
+ return {
1932
+ id: workflowNodeId,
1933
+ name: workflow.name,
1934
+ type: "workflow",
1935
+ workflow,
1936
+ storyboard,
1937
+ isFullyCovered: workflowCoverageMap?.[workflow.id] ?? false,
1938
+ hasTraces: workflowHasTraces
1939
+ };
1940
+ }).sort((a, b) => a.name.localeCompare(b.name));
1941
+ if (filterMode === "with-traces") {
1942
+ workflowNodes = workflowNodes.filter((node) => node.hasTraces);
1943
+ } else if (filterMode === "without-traces") {
1944
+ workflowNodes = workflowNodes.filter((node) => !node.hasTraces);
1945
+ }
1946
+ if (workflowNodes.length > 0) {
1947
+ const workflowsId = versionPrefix ? `workflows:${versionPrefix}:${storyboard.id}` : `workflows:${storyboard.id}`;
1948
+ children.push({
1949
+ id: workflowsId,
1950
+ name: "Workflows",
1951
+ type: "workflows",
1952
+ storyboard,
1953
+ children: workflowNodes
1954
+ });
1955
+ }
1941
1956
  }
1957
+ const storyboardHasTracedWorkflows = storyboard.workflows.some((workflow) => traceWorkflowsSet?.has(workflow.id) ?? false);
1958
+ const storyboardHasUntracedWorkflows = storyboard.workflows.some((workflow) => !(traceWorkflowsSet?.has(workflow.id) ?? false));
1959
+ if (filterMode === "with-traces" && !storyboardHasTracedWorkflows) {
1960
+ return null;
1961
+ }
1962
+ if (filterMode === "without-traces" && !storyboardHasUntracedWorkflows) {
1963
+ return null;
1964
+ }
1965
+ const storyboardId = versionPrefix ? `storyboard:${versionPrefix}:${storyboard.id}` : `storyboard:${storyboard.id}`;
1942
1966
  return {
1943
- id: `storyboard:${storyboard.id}`,
1967
+ id: storyboardId,
1944
1968
  name: storyboard.name,
1945
1969
  type: "storyboard",
1946
1970
  storyboard,
1947
- children
1971
+ children,
1972
+ hasTraces: storyboardHasTracedWorkflows
1948
1973
  };
1949
1974
  };
1950
1975
  const hasMultiplePackages = packagesMap.size > 1;
@@ -1953,26 +1978,32 @@ var buildTreeData = (storyboards, workflowCoverageMap) => {
1953
1978
  if (shouldShowPackageLevel) {
1954
1979
  const result = [];
1955
1980
  for (const [packageName, packageStoryboards] of packagesMap) {
1956
- const storyboardNodes = packageStoryboards.map(buildStoryboardNode).sort((a, b) => a.name.localeCompare(b.name));
1957
- result.push({
1958
- id: `package:${packageName}`,
1959
- name: packageName,
1960
- type: "package",
1961
- packageName,
1962
- scope: "package",
1963
- children: storyboardNodes
1964
- });
1981
+ const storyboardNodes = packageStoryboards.map(buildStoryboardNode).filter((node) => node !== null).sort((a, b) => a.name.localeCompare(b.name));
1982
+ if (storyboardNodes.length > 0) {
1983
+ const packageId = versionPrefix ? `package:${versionPrefix}:${packageName}` : `package:${packageName}`;
1984
+ result.push({
1985
+ id: packageId,
1986
+ name: packageName,
1987
+ type: "package",
1988
+ packageName,
1989
+ scope: "package",
1990
+ children: storyboardNodes
1991
+ });
1992
+ }
1965
1993
  }
1966
1994
  if (rootStoryboards.length > 0) {
1967
- const rootStoryboardNodes = rootStoryboards.map(buildStoryboardNode).sort((a, b) => a.name.localeCompare(b.name));
1968
- result.push({
1969
- id: "package:root",
1970
- name: "Root",
1971
- type: "package",
1972
- packageName: "root",
1973
- scope: "root",
1974
- children: rootStoryboardNodes
1975
- });
1995
+ const rootStoryboardNodes = rootStoryboards.map(buildStoryboardNode).filter((node) => node !== null).sort((a, b) => a.name.localeCompare(b.name));
1996
+ if (rootStoryboardNodes.length > 0) {
1997
+ const rootPackageId = versionPrefix ? `package:${versionPrefix}:root` : "package:root";
1998
+ result.push({
1999
+ id: rootPackageId,
2000
+ name: "Root",
2001
+ type: "package",
2002
+ packageName: "root",
2003
+ scope: "root",
2004
+ children: rootStoryboardNodes
2005
+ });
2006
+ }
1976
2007
  }
1977
2008
  return result.sort((a, b) => {
1978
2009
  if (a.packageName === "root")
@@ -1986,9 +2017,55 @@ var buildTreeData = (storyboards, workflowCoverageMap) => {
1986
2017
  for (const packageStoryboards of packagesMap.values()) {
1987
2018
  allStoryboards.push(...packageStoryboards);
1988
2019
  }
1989
- return allStoryboards.map(buildStoryboardNode).sort((a, b) => a.name.localeCompare(b.name));
2020
+ return allStoryboards.map(buildStoryboardNode).filter((node) => node !== null).sort((a, b) => a.name.localeCompare(b.name));
1990
2021
  }
1991
2022
  };
2023
+ var buildTreeDataFromVersions = (versionSnapshots, workflowCoverageMap, filterMode, traceWorkflowsSet) => {
2024
+ console.log("[buildTreeDataFromVersions] Called with:", {
2025
+ snapshotCount: versionSnapshots.length,
2026
+ filterMode,
2027
+ traceWorkflowsSet
2028
+ });
2029
+ const result = [];
2030
+ for (const snapshot of versionSnapshots) {
2031
+ const versionKey = `${snapshot.repositoryUrl}@${snapshot.commitSha}`;
2032
+ console.log("[buildTreeDataFromVersions] Processing version:", versionKey);
2033
+ console.log("[buildTreeDataFromVersions] Storyboards in snapshot:", snapshot.storyboards.length);
2034
+ const versionHasTracedWorkflows = snapshot.storyboards.some((storyboard) => storyboard.workflows.some((workflow) => traceWorkflowsSet?.has(workflow.id) ?? false));
2035
+ const versionHasUntracedWorkflows = snapshot.storyboards.some((storyboard) => storyboard.workflows.some((workflow) => !(traceWorkflowsSet?.has(workflow.id) ?? false)));
2036
+ console.log("[buildTreeDataFromVersions] Version has traced workflows:", versionHasTracedWorkflows);
2037
+ console.log("[buildTreeDataFromVersions] Version has untraced workflows:", versionHasUntracedWorkflows);
2038
+ if (filterMode === "with-traces" && !versionHasTracedWorkflows) {
2039
+ console.log("[buildTreeDataFromVersions] Skipping version (no traced workflows)");
2040
+ continue;
2041
+ }
2042
+ if (filterMode === "without-traces" && !versionHasUntracedWorkflows) {
2043
+ console.log("[buildTreeDataFromVersions] Skipping version (no untraced workflows)");
2044
+ continue;
2045
+ }
2046
+ console.log("[buildTreeDataFromVersions] Building storyboard children...");
2047
+ const storyboardChildren = buildTreeDataFromStoryboards(snapshot.storyboards, workflowCoverageMap, traceWorkflowsSet, filterMode, versionKey);
2048
+ console.log("[buildTreeDataFromVersions] Storyboard children:", storyboardChildren);
2049
+ console.log("[buildTreeDataFromVersions] Storyboard children length:", storyboardChildren.length);
2050
+ if (storyboardChildren.length === 0) {
2051
+ console.log("[buildTreeDataFromVersions] Skipping version (no children after filtering)");
2052
+ continue;
2053
+ }
2054
+ const repoName = snapshot.repositoryUrl.replace("https://github.com/", "");
2055
+ const shortSha = snapshot.commitSha.substring(0, 8);
2056
+ result.push({
2057
+ id: `version:${versionKey}`,
2058
+ name: `${repoName}@${shortSha}`,
2059
+ type: "version",
2060
+ versionSnapshot: snapshot,
2061
+ repositoryUrl: snapshot.repositoryUrl,
2062
+ commitSha: snapshot.commitSha,
2063
+ hasTraces: versionHasTracedWorkflows,
2064
+ children: storyboardChildren
2065
+ });
2066
+ }
2067
+ return result;
2068
+ };
1992
2069
  var StoryboardWorkflowsTreeCore = ({
1993
2070
  storyboards,
1994
2071
  theme,
@@ -2000,7 +2077,10 @@ var StoryboardWorkflowsTreeCore = ({
2000
2077
  verticalNodePadding = "6px",
2001
2078
  verticalPadding = "20px",
2002
2079
  enableDragAndDrop = false,
2003
- workflowCoverageMap
2080
+ workflowCoverageMap,
2081
+ versionSnapshots,
2082
+ workflowFilterMode = "all",
2083
+ traceWorkflowsSet
2004
2084
  }) => {
2005
2085
  const dndProps = getDndProps(enableDragAndDrop);
2006
2086
  const rowHeight = useMemo9(() => {
@@ -2009,11 +2089,29 @@ var StoryboardWorkflowsTreeCore = ({
2009
2089
  const borderHeight = 2;
2010
2090
  return contentLineHeight + paddingValue * 2 + borderHeight;
2011
2091
  }, [verticalNodePadding]);
2012
- const treeData = useMemo9(() => buildTreeData(storyboards, workflowCoverageMap), [storyboards, workflowCoverageMap]);
2092
+ const treeData = useMemo9(() => {
2093
+ console.log("[StoryboardWorkflowsTreeCore] Building tree data...");
2094
+ console.log("[StoryboardWorkflowsTreeCore] versionSnapshots:", versionSnapshots);
2095
+ console.log("[StoryboardWorkflowsTreeCore] versionSnapshots.length:", versionSnapshots?.length);
2096
+ console.log("[StoryboardWorkflowsTreeCore] workflowFilterMode:", workflowFilterMode);
2097
+ console.log("[StoryboardWorkflowsTreeCore] traceWorkflowsSet:", traceWorkflowsSet);
2098
+ if (versionSnapshots && versionSnapshots.length > 0) {
2099
+ const result = buildTreeDataFromVersions(versionSnapshots, workflowCoverageMap, workflowFilterMode, traceWorkflowsSet);
2100
+ console.log("[StoryboardWorkflowsTreeCore] buildTreeDataFromVersions result:", result);
2101
+ console.log("[StoryboardWorkflowsTreeCore] result.length:", result.length);
2102
+ return result;
2103
+ } else {
2104
+ const result = buildTreeDataFromStoryboards(storyboards, workflowCoverageMap, traceWorkflowsSet, workflowFilterMode);
2105
+ console.log("[StoryboardWorkflowsTreeCore] buildTreeDataFromStoryboards result:", result);
2106
+ return result;
2107
+ }
2108
+ }, [storyboards, versionSnapshots, workflowCoverageMap, traceWorkflowsSet, workflowFilterMode]);
2013
2109
  const NodeRenderer = (props) => {
2014
2110
  const { node } = props;
2015
2111
  const data = node.data;
2016
- const icon = data.type === "package" ? /* @__PURE__ */ React11.createElement(Package, {
2112
+ const icon = data.type === "version" ? /* @__PURE__ */ React11.createElement(GitCommit, {
2113
+ size: 16
2114
+ }) : data.type === "package" ? /* @__PURE__ */ React11.createElement(Package, {
2017
2115
  size: 16
2018
2116
  }) : data.type === "storyboard" ? /* @__PURE__ */ React11.createElement(FolderKanban, {
2019
2117
  size: 16
@@ -2026,12 +2124,36 @@ var StoryboardWorkflowsTreeCore = ({
2026
2124
  }) : /* @__PURE__ */ React11.createElement(Workflow, {
2027
2125
  size: 16
2028
2126
  });
2029
- const nameColor = data.type === "package" ? theme.colors.primary : data.type === "storyboard" ? theme.colors.success : data.type === "overview" ? theme.colors.info || "#3b82f6" : data.type === "canvas" ? theme.colors.warning || "#f59e0b" : data.type === "workflows" ? theme.colors.text : theme.colors.textSecondary;
2127
+ const nameColor = data.type === "version" ? data.hasTraces ? "#a855f7" : theme.colors.textMuted : data.type === "package" ? theme.colors.primary : data.type === "storyboard" ? data.hasTraces ? theme.colors.success : theme.colors.textSecondary : data.type === "overview" ? theme.colors.info || "#3b82f6" : data.type === "canvas" ? theme.colors.warning || "#f59e0b" : data.type === "workflows" ? theme.colors.text : data.type === "workflow" ? data.hasTraces ? theme.colors.textSecondary : theme.colors.textMuted : theme.colors.textSecondary;
2030
2128
  const nodeHorizontalPadding = data.type === "overview" || data.type === "canvas" || data.type === "workflows" || data.type === "workflow" ? `calc(${horizontalNodePadding} + 12px)` : horizontalNodePadding;
2031
- const rightContent = data.type === "workflow" && data.isFullyCovered ? /* @__PURE__ */ React11.createElement(CheckCircle2, {
2032
- size: 14,
2033
- style: { color: "#10b981", marginLeft: "6px" }
2034
- }) : undefined;
2129
+ const rightContent = (() => {
2130
+ if (data.type === "workflow") {
2131
+ if (data.isFullyCovered) {
2132
+ return /* @__PURE__ */ React11.createElement(CheckCircle2, {
2133
+ size: 14,
2134
+ style: { color: "#10b981", marginLeft: "6px" }
2135
+ });
2136
+ } else if (data.hasTraces !== undefined) {
2137
+ return data.hasTraces ? /* @__PURE__ */ React11.createElement(CircleDot, {
2138
+ size: 14,
2139
+ style: { color: "#10b981", marginLeft: "6px" }
2140
+ }) : /* @__PURE__ */ React11.createElement(Circle, {
2141
+ size: 14,
2142
+ style: { color: theme.colors.textMuted, marginLeft: "6px" }
2143
+ });
2144
+ }
2145
+ }
2146
+ if ((data.type === "version" || data.type === "storyboard") && data.hasTraces !== undefined) {
2147
+ return data.hasTraces ? /* @__PURE__ */ React11.createElement(CircleDot, {
2148
+ size: 14,
2149
+ style: { color: "#10b981", marginLeft: "6px" }
2150
+ }) : /* @__PURE__ */ React11.createElement(Circle, {
2151
+ size: 14,
2152
+ style: { color: theme.colors.textMuted, marginLeft: "6px" }
2153
+ });
2154
+ }
2155
+ return;
2156
+ })();
2035
2157
  return /* @__PURE__ */ React11.createElement(TreeNode, {
2036
2158
  ...props,
2037
2159
  theme,
@@ -2070,7 +2192,7 @@ var StoryboardWorkflowsTreeCore = ({
2070
2192
  ...verticalPadding ? { paddingTop: verticalPadding, paddingBottom: verticalPadding } : {}
2071
2193
  }
2072
2194
  }, /* @__PURE__ */ React11.createElement(Tree3, {
2073
- initialData: treeData,
2195
+ data: treeData,
2074
2196
  onSelect: handleSelect,
2075
2197
  openByDefault: defaultOpen,
2076
2198
  ...initialOpenState !== undefined && { initialOpenState },
@@ -2081,11 +2203,240 @@ var StoryboardWorkflowsTreeCore = ({
2081
2203
  ...dndProps
2082
2204
  }, NodeRenderer));
2083
2205
  };
2084
- // src/components/CanvasListTree/CanvasListTreeCore.tsx
2085
- import { Package as Package2, Folder, LayoutDashboard as LayoutDashboard2, FileText } from "lucide-react";
2086
- import React12, { useMemo as useMemo10, useRef as useRef6 } from "react";
2206
+ // src/components/WorkflowScenarioTree/WorkflowScenarioTreeCore.tsx
2207
+ import { Package as Package2, Workflow as Workflow2, GitCommit as GitCommit2, ListChecks, List } from "lucide-react";
2208
+ import React12, { useMemo as useMemo10 } from "react";
2087
2209
  import { Tree as Tree4 } from "react-arborist";
2088
- var buildTreeData2 = (canvases) => {
2210
+ var buildTreeDataFromWorkflows = (workflows, workflowTraceCounts, scenarioTraceCounts, filterMode, minTraceCount) => {
2211
+ const packagesMap = new Map;
2212
+ const rootWorkflows = [];
2213
+ for (const workflow of workflows) {
2214
+ if (workflow.scope === "package" && workflow.packageName) {
2215
+ const existing = packagesMap.get(workflow.packageName) || [];
2216
+ existing.push(workflow);
2217
+ packagesMap.set(workflow.packageName, existing);
2218
+ } else {
2219
+ rootWorkflows.push(workflow);
2220
+ }
2221
+ }
2222
+ const buildWorkflowNode = (workflow) => {
2223
+ const workflowTraceCount = workflowTraceCounts?.[workflow.id] ?? 0;
2224
+ const hasTraces = workflowTraceCount > 0;
2225
+ if (filterMode === "with-traces" && !hasTraces) {
2226
+ return null;
2227
+ }
2228
+ if (filterMode === "without-traces" && hasTraces) {
2229
+ return null;
2230
+ }
2231
+ if (filterMode === "minimum-traces" && workflowTraceCount < (minTraceCount ?? 1)) {
2232
+ return null;
2233
+ }
2234
+ const scenarioNodes = workflow.scenarios.map((scenario) => {
2235
+ const scenarioKey = `${workflow.id}/${scenario.id}`;
2236
+ const scenarioTraceCount = scenarioTraceCounts?.[scenarioKey] ?? 0;
2237
+ return {
2238
+ id: `scenario:${workflow.id}:${scenario.id}`,
2239
+ name: scenario.description,
2240
+ type: "scenario",
2241
+ scenario,
2242
+ workflow,
2243
+ traceCount: scenarioTraceCount,
2244
+ hasTraces: scenarioTraceCount > 0
2245
+ };
2246
+ }).sort((a, b) => (b.traceCount ?? 0) - (a.traceCount ?? 0));
2247
+ const displayName = `${workflow.storyboard.name}: ${workflow.name}`;
2248
+ return {
2249
+ id: `workflow:${workflow.id}`,
2250
+ name: displayName,
2251
+ type: "workflow",
2252
+ workflow,
2253
+ storyboard: workflow.storyboard,
2254
+ traceCount: workflowTraceCount,
2255
+ hasTraces,
2256
+ children: scenarioNodes.length > 0 ? scenarioNodes : undefined
2257
+ };
2258
+ };
2259
+ const hasMultiplePackages = packagesMap.size > 1;
2260
+ const hasRootAndPackages = packagesMap.size > 0 && rootWorkflows.length > 0;
2261
+ const shouldShowPackageLevel = hasMultiplePackages || hasRootAndPackages;
2262
+ if (shouldShowPackageLevel) {
2263
+ const result = [];
2264
+ for (const [packageName, packageWorkflows] of packagesMap) {
2265
+ const workflowNodes = packageWorkflows.map(buildWorkflowNode).filter((node) => node !== null).sort((a, b) => (b.traceCount ?? 0) - (a.traceCount ?? 0));
2266
+ if (workflowNodes.length > 0) {
2267
+ result.push({
2268
+ id: `package:${packageName}`,
2269
+ name: packageName,
2270
+ type: "package",
2271
+ packageName,
2272
+ scope: "package",
2273
+ children: workflowNodes
2274
+ });
2275
+ }
2276
+ }
2277
+ if (rootWorkflows.length > 0) {
2278
+ const rootWorkflowNodes = rootWorkflows.map(buildWorkflowNode).filter((node) => node !== null).sort((a, b) => (b.traceCount ?? 0) - (a.traceCount ?? 0));
2279
+ if (rootWorkflowNodes.length > 0) {
2280
+ result.push({
2281
+ id: "package:root",
2282
+ name: "Root",
2283
+ type: "package",
2284
+ packageName: "root",
2285
+ scope: "root",
2286
+ children: rootWorkflowNodes
2287
+ });
2288
+ }
2289
+ }
2290
+ return result.sort((a, b) => {
2291
+ if (a.packageName === "root")
2292
+ return 1;
2293
+ if (b.packageName === "root")
2294
+ return -1;
2295
+ return a.name.localeCompare(b.name);
2296
+ });
2297
+ } else {
2298
+ const allWorkflows = [...rootWorkflows];
2299
+ for (const packageWorkflows of packagesMap.values()) {
2300
+ allWorkflows.push(...packageWorkflows);
2301
+ }
2302
+ return allWorkflows.map(buildWorkflowNode).filter((node) => node !== null).sort((a, b) => (b.traceCount ?? 0) - (a.traceCount ?? 0));
2303
+ }
2304
+ };
2305
+ var buildTreeDataFromVersions2 = (versionSnapshots, workflowsByVersion, workflowTraceCounts, scenarioTraceCounts, filterMode, minTraceCount) => {
2306
+ const result = [];
2307
+ for (const snapshot of versionSnapshots) {
2308
+ const versionKey = `${snapshot.repositoryUrl}@${snapshot.commitSha}`;
2309
+ const versionWorkflows = workflowsByVersion.get(versionKey) || [];
2310
+ const workflowChildren = buildTreeDataFromWorkflows(versionWorkflows, workflowTraceCounts, scenarioTraceCounts, filterMode, minTraceCount);
2311
+ if (workflowChildren.length === 0) {
2312
+ continue;
2313
+ }
2314
+ const versionTraceCount = versionWorkflows.reduce((sum, workflow) => {
2315
+ return sum + (workflowTraceCounts?.[workflow.id] ?? 0);
2316
+ }, 0);
2317
+ const repoName = snapshot.repositoryUrl.replace("https://github.com/", "");
2318
+ const shortSha = snapshot.commitSha.substring(0, 8);
2319
+ result.push({
2320
+ id: `version:${versionKey}`,
2321
+ name: `${repoName}@${shortSha}`,
2322
+ type: "version",
2323
+ versionSnapshot: snapshot,
2324
+ repositoryUrl: snapshot.repositoryUrl,
2325
+ commitSha: snapshot.commitSha,
2326
+ traceCount: versionTraceCount,
2327
+ hasTraces: versionTraceCount > 0,
2328
+ children: workflowChildren
2329
+ });
2330
+ }
2331
+ return result.sort((a, b) => (b.traceCount ?? 0) - (a.traceCount ?? 0));
2332
+ };
2333
+ var WorkflowScenarioTreeCore = ({
2334
+ workflows,
2335
+ theme,
2336
+ onClick,
2337
+ selectedNodeId,
2338
+ defaultOpen = false,
2339
+ initialOpenState,
2340
+ horizontalNodePadding = "16px",
2341
+ verticalNodePadding = "6px",
2342
+ verticalPadding = "20px",
2343
+ versionSnapshots,
2344
+ workflowTraceCounts,
2345
+ scenarioTraceCounts,
2346
+ workflowFilterMode = "all",
2347
+ minTraceCount = 1
2348
+ }) => {
2349
+ const rowHeight = useMemo10(() => {
2350
+ const paddingValue = parseFloat(verticalNodePadding);
2351
+ const contentLineHeight = 20;
2352
+ const borderHeight = 2;
2353
+ return contentLineHeight + paddingValue * 2 + borderHeight;
2354
+ }, [verticalNodePadding]);
2355
+ const treeData = useMemo10(() => {
2356
+ if (versionSnapshots && versionSnapshots.length > 0) {
2357
+ const workflowsByVersion = new Map;
2358
+ for (const snapshot of versionSnapshots) {
2359
+ const versionKey = `${snapshot.repositoryUrl}@${snapshot.commitSha}`;
2360
+ const versionWorkflows = workflows.filter((workflow) => {
2361
+ return snapshot.storyboards.some((sb) => sb.id === workflow.storyboardId);
2362
+ });
2363
+ workflowsByVersion.set(versionKey, versionWorkflows);
2364
+ }
2365
+ return buildTreeDataFromVersions2(versionSnapshots, workflowsByVersion, workflowTraceCounts, scenarioTraceCounts, workflowFilterMode, minTraceCount);
2366
+ } else {
2367
+ return buildTreeDataFromWorkflows(workflows, workflowTraceCounts, scenarioTraceCounts, workflowFilterMode, minTraceCount);
2368
+ }
2369
+ }, [workflows, versionSnapshots, workflowTraceCounts, scenarioTraceCounts, workflowFilterMode, minTraceCount]);
2370
+ const NodeRenderer = (props) => {
2371
+ const { node } = props;
2372
+ const data = node.data;
2373
+ const icon = data.type === "version" ? /* @__PURE__ */ React12.createElement(GitCommit2, {
2374
+ size: 16
2375
+ }) : data.type === "package" ? /* @__PURE__ */ React12.createElement(Package2, {
2376
+ size: 16
2377
+ }) : data.type === "workflow" ? /* @__PURE__ */ React12.createElement(Workflow2, {
2378
+ size: 16
2379
+ }) : data.type === "scenario" ? data.hasTraces ? /* @__PURE__ */ React12.createElement(ListChecks, {
2380
+ size: 16
2381
+ }) : /* @__PURE__ */ React12.createElement(List, {
2382
+ size: 16
2383
+ }) : null;
2384
+ const nameColor = data.type === "version" ? data.hasTraces ? "#a855f7" : theme.colors.textMuted : data.type === "package" ? theme.colors.primary : data.type === "workflow" ? data.hasTraces ? theme.colors.success : theme.colors.textSecondary : data.hasTraces ? theme.colors.secondary : theme.colors.textMuted;
2385
+ const nodeHorizontalPadding = data.type === "workflow" || data.type === "scenario" ? `calc(${horizontalNodePadding} + 12px)` : horizontalNodePadding;
2386
+ const rightContent = data.traceCount !== undefined ? /* @__PURE__ */ React12.createElement("span", {
2387
+ style: {
2388
+ marginLeft: "8px",
2389
+ fontSize: "12px",
2390
+ color: data.hasTraces ? data.type === "scenario" ? theme.colors.secondary : theme.colors.success : theme.colors.textMuted,
2391
+ fontWeight: 500
2392
+ }
2393
+ }, data.traceCount) : undefined;
2394
+ return /* @__PURE__ */ React12.createElement(TreeNode, {
2395
+ ...props,
2396
+ theme,
2397
+ nameColor,
2398
+ leftIcon: icon,
2399
+ rightContent,
2400
+ horizontalNodePadding: nodeHorizontalPadding,
2401
+ verticalNodePadding
2402
+ });
2403
+ };
2404
+ const handleSelect = (selectedNodes) => {
2405
+ if (selectedNodes.length === 0)
2406
+ return;
2407
+ const node = selectedNodes[0];
2408
+ const nodeData = node.data;
2409
+ if (nodeData.type === "workflow" || nodeData.type === "scenario") {
2410
+ onClick(nodeData);
2411
+ }
2412
+ };
2413
+ const initialHeight = 600;
2414
+ const [containerRef, containerHeight] = useContainerHeight(initialHeight);
2415
+ return /* @__PURE__ */ React12.createElement("div", {
2416
+ ref: containerRef,
2417
+ style: {
2418
+ backgroundColor: theme.colors.background,
2419
+ color: theme.colors.text,
2420
+ fontFamily: theme.fonts.body,
2421
+ height: "100%",
2422
+ ...verticalPadding ? { paddingTop: verticalPadding, paddingBottom: verticalPadding } : {}
2423
+ }
2424
+ }, /* @__PURE__ */ React12.createElement(Tree4, {
2425
+ data: treeData,
2426
+ onSelect: handleSelect,
2427
+ openByDefault: defaultOpen,
2428
+ ...initialOpenState !== undefined && { initialOpenState },
2429
+ ...selectedNodeId !== undefined && { selection: selectedNodeId },
2430
+ width: "100%",
2431
+ height: containerHeight,
2432
+ rowHeight
2433
+ }, NodeRenderer));
2434
+ };
2435
+ // src/components/CanvasListTree/CanvasListTreeCore.tsx
2436
+ import { Package as Package3, Folder, LayoutDashboard as LayoutDashboard2, FileText } from "lucide-react";
2437
+ import React13, { useMemo as useMemo11, useRef as useRef6 } from "react";
2438
+ import { Tree as Tree5 } from "react-arborist";
2439
+ var buildTreeData = (canvases) => {
2089
2440
  const packagesMap = new Map;
2090
2441
  const rootCanvases = [];
2091
2442
  for (const canvas of canvases) {
@@ -2177,28 +2528,28 @@ var CanvasListTreeCore = ({
2177
2528
  enableDragAndDrop = false
2178
2529
  }) => {
2179
2530
  const dndProps = getDndProps(enableDragAndDrop);
2180
- const rowHeight = useMemo10(() => {
2531
+ const rowHeight = useMemo11(() => {
2181
2532
  const paddingValue = parseFloat(verticalNodePadding);
2182
2533
  const contentLineHeight = 20;
2183
2534
  const borderHeight = 2;
2184
2535
  return contentLineHeight + paddingValue * 2 + borderHeight;
2185
2536
  }, [verticalNodePadding]);
2186
- const treeData = useMemo10(() => buildTreeData2(canvases), [canvases]);
2537
+ const treeData = useMemo11(() => buildTreeData(canvases), [canvases]);
2187
2538
  const NodeRenderer = (props) => {
2188
2539
  const { node } = props;
2189
2540
  const data = node.data;
2190
- const icon = data.type === "package" ? /* @__PURE__ */ React12.createElement(Package2, {
2541
+ const icon = data.type === "package" ? /* @__PURE__ */ React13.createElement(Package3, {
2191
2542
  size: 16
2192
- }) : data.type === "canvas-folder" ? /* @__PURE__ */ React12.createElement(Folder, {
2543
+ }) : data.type === "canvas-folder" ? /* @__PURE__ */ React13.createElement(Folder, {
2193
2544
  size: 16
2194
- }) : data.type === "overview" ? /* @__PURE__ */ React12.createElement(FileText, {
2545
+ }) : data.type === "overview" ? /* @__PURE__ */ React13.createElement(FileText, {
2195
2546
  size: 16
2196
- }) : /* @__PURE__ */ React12.createElement(LayoutDashboard2, {
2547
+ }) : /* @__PURE__ */ React13.createElement(LayoutDashboard2, {
2197
2548
  size: 16
2198
2549
  });
2199
2550
  const nameColor = data.type === "package" ? theme.colors.primary : data.type === "canvas-folder" ? theme.colors.textSecondary : data.type === "overview" ? theme.colors.info || "#3b82f6" : theme.colors.warning || "#f59e0b";
2200
2551
  const nodeHorizontalPadding = data.type === "overview" || data.type === "canvas" ? `calc(${horizontalNodePadding} + 12px)` : horizontalNodePadding;
2201
- return /* @__PURE__ */ React12.createElement(TreeNode, {
2552
+ return /* @__PURE__ */ React13.createElement(TreeNode, {
2202
2553
  ...props,
2203
2554
  theme,
2204
2555
  nameColor,
@@ -2225,7 +2576,7 @@ var CanvasListTreeCore = ({
2225
2576
  };
2226
2577
  const initialHeight = 600;
2227
2578
  const [containerRef, containerHeight] = useContainerHeight(initialHeight);
2228
- return /* @__PURE__ */ React12.createElement("div", {
2579
+ return /* @__PURE__ */ React13.createElement("div", {
2229
2580
  ref: containerRef,
2230
2581
  style: {
2231
2582
  backgroundColor: theme.colors.background,
@@ -2234,7 +2585,7 @@ var CanvasListTreeCore = ({
2234
2585
  height: "100%",
2235
2586
  ...verticalPadding ? { paddingTop: verticalPadding, paddingBottom: verticalPadding } : {}
2236
2587
  }
2237
- }, /* @__PURE__ */ React12.createElement(Tree4, {
2588
+ }, /* @__PURE__ */ React13.createElement(Tree5, {
2238
2589
  initialData: treeData,
2239
2590
  onSelect: handleSelect,
2240
2591
  openByDefault: defaultOpen,
@@ -2249,13 +2600,13 @@ var CanvasListTreeCore = ({
2249
2600
  // src/components/TelemetryCoverageFileTree.tsx
2250
2601
  import {
2251
2602
  Activity,
2252
- CircleDot,
2253
- Circle,
2603
+ CircleDot as CircleDot2,
2604
+ Circle as Circle2,
2254
2605
  TestTube
2255
2606
  } from "lucide-react";
2256
- import React13, { useMemo as useMemo11, useRef as useRef7 } from "react";
2257
- import { Tree as Tree5 } from "react-arborist";
2258
- var TelemetryCoverageContext = React13.createContext(null);
2607
+ import React14, { useMemo as useMemo12, useRef as useRef7 } from "react";
2608
+ import { Tree as Tree6 } from "react-arborist";
2609
+ var TelemetryCoverageContext = React14.createContext(null);
2259
2610
  var DEFAULT_TEST_PATTERNS = [
2260
2611
  /\.test\.[jt]sx?$/,
2261
2612
  /\.spec\.[jt]sx?$/,
@@ -2272,7 +2623,7 @@ var getCoverageStatusDisplay = (coverage, _theme) => {
2272
2623
  switch (status) {
2273
2624
  case "covered":
2274
2625
  return {
2275
- icon: /* @__PURE__ */ React13.createElement(Activity, {
2626
+ icon: /* @__PURE__ */ React14.createElement(Activity, {
2276
2627
  size: 14
2277
2628
  }),
2278
2629
  color: "#22c55e",
@@ -2281,7 +2632,7 @@ var getCoverageStatusDisplay = (coverage, _theme) => {
2281
2632
  };
2282
2633
  case "partial":
2283
2634
  return {
2284
- icon: /* @__PURE__ */ React13.createElement(CircleDot, {
2635
+ icon: /* @__PURE__ */ React14.createElement(CircleDot2, {
2285
2636
  size: 14
2286
2637
  }),
2287
2638
  color: "#eab308",
@@ -2290,7 +2641,7 @@ var getCoverageStatusDisplay = (coverage, _theme) => {
2290
2641
  };
2291
2642
  case "none":
2292
2643
  return {
2293
- icon: /* @__PURE__ */ React13.createElement(Circle, {
2644
+ icon: /* @__PURE__ */ React14.createElement(Circle2, {
2294
2645
  size: 14
2295
2646
  }),
2296
2647
  color: "#6b7280",
@@ -2392,7 +2743,7 @@ var TelemetryCoverageFileTree = ({
2392
2743
  enableDragAndDrop = false
2393
2744
  }) => {
2394
2745
  const dndProps = getDndProps(enableDragAndDrop);
2395
- const coverageMap = useMemo11(() => {
2746
+ const coverageMap = useMemo12(() => {
2396
2747
  const map = new Map;
2397
2748
  coverageData.forEach((item) => {
2398
2749
  map.set(item.filePath, item);
@@ -2401,7 +2752,7 @@ var TelemetryCoverageFileTree = ({
2401
2752
  }, [coverageData]);
2402
2753
  const NodeRenderer = (props) => {
2403
2754
  const { node } = props;
2404
- const ctx = React13.useContext(TelemetryCoverageContext);
2755
+ const ctx = React14.useContext(TelemetryCoverageContext);
2405
2756
  const coverage = ctx?.coverageMap.get(node.data.id);
2406
2757
  const hasTracedChildren = ctx?.hasTracedChildrenMap.get(node.data.id);
2407
2758
  const coverageDisplay = coverage ? getCoverageStatusDisplay(coverage, theme) : null;
@@ -2413,11 +2764,11 @@ var TelemetryCoverageFileTree = ({
2413
2764
  } else if (node.data.isTestFile) {
2414
2765
  nameColor = "#6b728080";
2415
2766
  }
2416
- const leftIcon = node.data.isTestFile && !coverage ? /* @__PURE__ */ React13.createElement(TestTube, {
2767
+ const leftIcon = node.data.isTestFile && !coverage ? /* @__PURE__ */ React14.createElement(TestTube, {
2417
2768
  size: 14,
2418
2769
  style: { marginRight: 4, color: "#6b7280" }
2419
2770
  }) : null;
2420
- const rightContent = coverageDisplay ? /* @__PURE__ */ React13.createElement("div", {
2771
+ const rightContent = coverageDisplay ? /* @__PURE__ */ React14.createElement("div", {
2421
2772
  style: {
2422
2773
  display: "flex",
2423
2774
  alignItems: "center",
@@ -2425,14 +2776,14 @@ var TelemetryCoverageFileTree = ({
2425
2776
  marginRight: "8px"
2426
2777
  },
2427
2778
  title: coverageDisplay.label
2428
- }, coverageDisplay.icon, /* @__PURE__ */ React13.createElement("span", {
2779
+ }, coverageDisplay.icon, /* @__PURE__ */ React14.createElement("span", {
2429
2780
  style: {
2430
2781
  marginLeft: "4px",
2431
2782
  fontSize: theme.fontSizes[0],
2432
2783
  fontWeight: "bold",
2433
2784
  fontFamily: "monospace"
2434
2785
  }
2435
- }, coverageDisplay.badge)) : node.data.isTestFile ? /* @__PURE__ */ React13.createElement("div", {
2786
+ }, coverageDisplay.badge)) : node.data.isTestFile ? /* @__PURE__ */ React14.createElement("div", {
2436
2787
  style: {
2437
2788
  display: "flex",
2438
2789
  alignItems: "center",
@@ -2441,10 +2792,10 @@ var TelemetryCoverageFileTree = ({
2441
2792
  opacity: 0.5
2442
2793
  },
2443
2794
  title: "No telemetry instrumentation"
2444
- }, /* @__PURE__ */ React13.createElement(Circle, {
2795
+ }, /* @__PURE__ */ React14.createElement(Circle2, {
2445
2796
  size: 14
2446
2797
  })) : null;
2447
- return /* @__PURE__ */ React13.createElement(TreeNode, {
2798
+ return /* @__PURE__ */ React14.createElement(TreeNode, {
2448
2799
  ...props,
2449
2800
  theme,
2450
2801
  rightContent,
@@ -2459,16 +2810,16 @@ var TelemetryCoverageFileTree = ({
2459
2810
  }
2460
2811
  });
2461
2812
  };
2462
- const treeStructure = useMemo11(() => {
2813
+ const treeStructure = useMemo12(() => {
2463
2814
  return transformTreeStructure2(fileTree, showOnlyTestFiles, testFilePatterns);
2464
2815
  }, [fileTree, showOnlyTestFiles, testFilePatterns]);
2465
- const treeData = useMemo11(() => {
2816
+ const treeData = useMemo12(() => {
2466
2817
  if (showUncoveredFiles) {
2467
2818
  return treeStructure;
2468
2819
  }
2469
2820
  return filterCoveredNodes(treeStructure, coverageMap);
2470
2821
  }, [treeStructure, showUncoveredFiles, coverageMap]);
2471
- const hasTracedChildrenMap = useMemo11(() => {
2822
+ const hasTracedChildrenMap = useMemo12(() => {
2472
2823
  const map = new Map;
2473
2824
  const markTracedParents = (nodes) => {
2474
2825
  let hasTraced = false;
@@ -2509,7 +2860,7 @@ var TelemetryCoverageFileTree = ({
2509
2860
  onDirectorySelect(selectedDirs);
2510
2861
  }
2511
2862
  };
2512
- const calculatedHeight = useMemo11(() => {
2863
+ const calculatedHeight = useMemo12(() => {
2513
2864
  if (autoHeight) {
2514
2865
  const visibleNodeCount = countVisibleNodes3(treeData, openByDefault);
2515
2866
  return visibleNodeCount * 28;
@@ -2517,7 +2868,7 @@ var TelemetryCoverageFileTree = ({
2517
2868
  return initialHeight;
2518
2869
  }, [autoHeight, treeData, openByDefault, initialHeight]);
2519
2870
  const [containerRef, containerHeight] = useContainerHeight(calculatedHeight);
2520
- return /* @__PURE__ */ React13.createElement("div", {
2871
+ return /* @__PURE__ */ React14.createElement("div", {
2521
2872
  ref: containerRef,
2522
2873
  style: {
2523
2874
  backgroundColor: transparentBackground ? "transparent" : theme.colors.background,
@@ -2526,9 +2877,9 @@ var TelemetryCoverageFileTree = ({
2526
2877
  ...autoHeight ? {} : { height: "100%" },
2527
2878
  ...verticalPadding ? { paddingTop: verticalPadding, paddingBottom: verticalPadding } : {}
2528
2879
  }
2529
- }, /* @__PURE__ */ React13.createElement(TelemetryCoverageContext.Provider, {
2880
+ }, /* @__PURE__ */ React14.createElement(TelemetryCoverageContext.Provider, {
2530
2881
  value: { coverageMap, hasTracedChildrenMap }
2531
- }, /* @__PURE__ */ React13.createElement(Tree5, {
2882
+ }, /* @__PURE__ */ React14.createElement(Tree6, {
2532
2883
  data: treeData,
2533
2884
  onSelect: handleSelect,
2534
2885
  ...selectedFile !== undefined && { selection: selectedFile },
@@ -2557,7 +2908,7 @@ var calculateTelemetryCoverageStats = (coverageData) => {
2557
2908
  };
2558
2909
  // src/components/TelemetryCoverageFileTreeContainer.tsx
2559
2910
  import { RefreshCw as RefreshCw2, Eye as Eye2, EyeOff as EyeOff2, AlertCircle as AlertCircle4, Activity as Activity2 } from "lucide-react";
2560
- import React14, { useState as useState7, useMemo as useMemo12 } from "react";
2911
+ import React15, { useState as useState7, useMemo as useMemo13 } from "react";
2561
2912
  var TelemetryCoverageFileTreeContainer = ({
2562
2913
  fileTree,
2563
2914
  theme,
@@ -2579,10 +2930,10 @@ var TelemetryCoverageFileTreeContainer = ({
2579
2930
  }) => {
2580
2931
  const [filters, setFilters] = useState7([]);
2581
2932
  const [showUncoveredFiles, setShowUncoveredFiles] = useState7(true);
2582
- const selectedDirectories = useMemo12(() => {
2933
+ const selectedDirectories = useMemo13(() => {
2583
2934
  return filters.filter((f) => f.mode === "include").map((f) => f.path);
2584
2935
  }, [filters]);
2585
- const stats = useMemo12(() => calculateTelemetryCoverageStats(coverageData), [coverageData]);
2936
+ const stats = useMemo13(() => calculateTelemetryCoverageStats(coverageData), [coverageData]);
2586
2937
  const handleRefresh = () => {
2587
2938
  onRefresh?.();
2588
2939
  };
@@ -2590,34 +2941,34 @@ var TelemetryCoverageFileTreeContainer = ({
2590
2941
  setShowUncoveredFiles(!showUncoveredFiles);
2591
2942
  };
2592
2943
  const percentageColor = stats.percentage >= 80 ? "#22c55e" : stats.percentage >= 50 ? "#eab308" : stats.percentage > 0 ? "#f97316" : "#6b7280";
2593
- return /* @__PURE__ */ React14.createElement("div", {
2944
+ return /* @__PURE__ */ React15.createElement("div", {
2594
2945
  style: { display: "flex", flexDirection: "column", height: "100%" }
2595
- }, showControls && /* @__PURE__ */ React14.createElement("div", {
2946
+ }, showControls && /* @__PURE__ */ React15.createElement("div", {
2596
2947
  style: {
2597
2948
  padding: "12px",
2598
2949
  borderBottom: `1px solid ${theme.colors.border || "#e0e0e0"}`,
2599
2950
  backgroundColor: theme.colors.backgroundSecondary || theme.colors.background
2600
2951
  }
2601
- }, /* @__PURE__ */ React14.createElement("div", {
2952
+ }, /* @__PURE__ */ React15.createElement("div", {
2602
2953
  style: {
2603
2954
  display: "flex",
2604
2955
  alignItems: "center",
2605
2956
  justifyContent: "space-between",
2606
2957
  marginBottom: "8px"
2607
2958
  }
2608
- }, /* @__PURE__ */ React14.createElement("div", {
2959
+ }, /* @__PURE__ */ React15.createElement("div", {
2609
2960
  style: { display: "flex", alignItems: "center", gap: "8px" }
2610
- }, /* @__PURE__ */ React14.createElement(Activity2, {
2961
+ }, /* @__PURE__ */ React15.createElement(Activity2, {
2611
2962
  size: 16,
2612
2963
  color: theme.colors.primary
2613
- }), /* @__PURE__ */ React14.createElement("h3", {
2964
+ }), /* @__PURE__ */ React15.createElement("h3", {
2614
2965
  style: {
2615
2966
  margin: 0,
2616
2967
  fontSize: theme.fontSizes[1],
2617
2968
  fontWeight: "bold",
2618
2969
  color: theme.colors.text
2619
2970
  }
2620
- }, title), stats.testFiles > 0 && /* @__PURE__ */ React14.createElement("span", {
2971
+ }, title), stats.testFiles > 0 && /* @__PURE__ */ React15.createElement("span", {
2621
2972
  style: {
2622
2973
  backgroundColor: percentageColor,
2623
2974
  color: "#ffffff",
@@ -2627,14 +2978,14 @@ var TelemetryCoverageFileTreeContainer = ({
2627
2978
  fontWeight: "bold",
2628
2979
  fontFamily: "monospace"
2629
2980
  }
2630
- }, stats.percentage, "%"), isLoading && /* @__PURE__ */ React14.createElement(RefreshCw2, {
2981
+ }, stats.percentage, "%"), isLoading && /* @__PURE__ */ React15.createElement(RefreshCw2, {
2631
2982
  size: 16,
2632
2983
  color: theme.colors.text,
2633
2984
  className: "telemetry-coverage-spinner",
2634
2985
  style: { animation: "spin 1s linear infinite" }
2635
- })), /* @__PURE__ */ React14.createElement("div", {
2986
+ })), /* @__PURE__ */ React15.createElement("div", {
2636
2987
  style: { display: "flex", gap: "8px" }
2637
- }, /* @__PURE__ */ React14.createElement("button", {
2988
+ }, /* @__PURE__ */ React15.createElement("button", {
2638
2989
  onClick: toggleShowUncoveredFiles,
2639
2990
  style: {
2640
2991
  background: "none",
@@ -2649,11 +3000,11 @@ var TelemetryCoverageFileTreeContainer = ({
2649
3000
  color: theme.colors.text
2650
3001
  },
2651
3002
  title: showUncoveredFiles ? "Show only covered files" : "Show all test files"
2652
- }, showUncoveredFiles ? /* @__PURE__ */ React14.createElement(EyeOff2, {
3003
+ }, showUncoveredFiles ? /* @__PURE__ */ React15.createElement(EyeOff2, {
2653
3004
  size: 14
2654
- }) : /* @__PURE__ */ React14.createElement(Eye2, {
3005
+ }) : /* @__PURE__ */ React15.createElement(Eye2, {
2655
3006
  size: 14
2656
- }), showUncoveredFiles ? "Hide uncovered" : "Show all"), onRefresh && /* @__PURE__ */ React14.createElement("button", {
3007
+ }), showUncoveredFiles ? "Hide uncovered" : "Show all"), onRefresh && /* @__PURE__ */ React15.createElement("button", {
2657
3008
  onClick: handleRefresh,
2658
3009
  disabled: isLoading,
2659
3010
  style: {
@@ -2670,9 +3021,9 @@ var TelemetryCoverageFileTreeContainer = ({
2670
3021
  opacity: isLoading ? 0.6 : 1
2671
3022
  },
2672
3023
  title: "Refresh coverage data"
2673
- }, /* @__PURE__ */ React14.createElement(RefreshCw2, {
3024
+ }, /* @__PURE__ */ React15.createElement(RefreshCw2, {
2674
3025
  size: 14
2675
- }), "Refresh"))), error && /* @__PURE__ */ React14.createElement("div", {
3026
+ }), "Refresh"))), error && /* @__PURE__ */ React15.createElement("div", {
2676
3027
  style: {
2677
3028
  display: "flex",
2678
3029
  alignItems: "center",
@@ -2685,36 +3036,36 @@ var TelemetryCoverageFileTreeContainer = ({
2685
3036
  color: "#856404",
2686
3037
  marginBottom: "8px"
2687
3038
  }
2688
- }, /* @__PURE__ */ React14.createElement(AlertCircle4, {
3039
+ }, /* @__PURE__ */ React15.createElement(AlertCircle4, {
2689
3040
  size: 14
2690
- }), error), !error && stats.testFiles > 0 && /* @__PURE__ */ React14.createElement("div", {
3041
+ }), error), !error && stats.testFiles > 0 && /* @__PURE__ */ React15.createElement("div", {
2691
3042
  style: {
2692
3043
  display: "flex",
2693
3044
  gap: "16px",
2694
3045
  fontSize: theme.fontSizes[0],
2695
3046
  color: theme.colors.textSecondary || "#666"
2696
3047
  }
2697
- }, /* @__PURE__ */ React14.createElement("span", null, /* @__PURE__ */ React14.createElement("strong", {
3048
+ }, /* @__PURE__ */ React15.createElement("span", null, /* @__PURE__ */ React15.createElement("strong", {
2698
3049
  style: { color: "#22c55e" }
2699
- }, stats.coveredFiles), " covered"), stats.partialFiles > 0 && /* @__PURE__ */ React14.createElement("span", null, /* @__PURE__ */ React14.createElement("strong", {
3050
+ }, stats.coveredFiles), " covered"), stats.partialFiles > 0 && /* @__PURE__ */ React15.createElement("span", null, /* @__PURE__ */ React15.createElement("strong", {
2700
3051
  style: { color: "#eab308" }
2701
- }, stats.partialFiles), " partial"), /* @__PURE__ */ React14.createElement("span", null, /* @__PURE__ */ React14.createElement("strong", {
3052
+ }, stats.partialFiles), " partial"), /* @__PURE__ */ React15.createElement("span", null, /* @__PURE__ */ React15.createElement("strong", {
2702
3053
  style: { color: "#6b7280" }
2703
- }, stats.uncoveredFiles), " uncovered"), /* @__PURE__ */ React14.createElement("span", {
3054
+ }, stats.uncoveredFiles), " uncovered"), /* @__PURE__ */ React15.createElement("span", {
2704
3055
  style: { marginLeft: "auto" }
2705
- }, stats.totalTraced, "/", stats.totalTests, " tests traced")), !error && stats.testFiles === 0 && /* @__PURE__ */ React14.createElement("div", {
3056
+ }, stats.totalTraced, "/", stats.totalTests, " tests traced")), !error && stats.testFiles === 0 && /* @__PURE__ */ React15.createElement("div", {
2706
3057
  style: {
2707
3058
  fontSize: theme.fontSizes[0],
2708
3059
  color: theme.colors.textSecondary || "#666"
2709
3060
  }
2710
- }, "No test files with coverage data found")), /* @__PURE__ */ React14.createElement(DirectoryFilterInput, {
3061
+ }, "No test files with coverage data found")), /* @__PURE__ */ React15.createElement(DirectoryFilterInput, {
2711
3062
  fileTree,
2712
3063
  theme,
2713
3064
  filters,
2714
3065
  onFiltersChange: setFilters
2715
- }), /* @__PURE__ */ React14.createElement("div", {
3066
+ }), /* @__PURE__ */ React15.createElement("div", {
2716
3067
  style: { flex: 1, marginTop: "1rem", overflow: "hidden" }
2717
- }, /* @__PURE__ */ React14.createElement(TelemetryCoverageFileTree, {
3068
+ }, /* @__PURE__ */ React15.createElement(TelemetryCoverageFileTree, {
2718
3069
  fileTree,
2719
3070
  theme,
2720
3071
  coverageData,
@@ -2740,6 +3091,7 @@ export {
2740
3091
  extractNameFromPath,
2741
3092
  combineRepositoryTrees,
2742
3093
  calculateTelemetryCoverageStats,
3094
+ WorkflowScenarioTreeCore,
2743
3095
  TreeNode,
2744
3096
  TelemetryCoverageFileTreeContainer,
2745
3097
  TelemetryCoverageFileTree,
@@ -20,4 +20,10 @@ export declare const ThemeComparison: Story;
20
20
  export declare const CustomPadding: Story;
21
21
  export declare const WithOverviewNodes: Story;
22
22
  export declare const WithoutOverviewNodes: Story;
23
+ export declare const VersionGrouping: Story;
24
+ export declare const VersionGroupingWithTraces: Story;
25
+ export declare const VersionGroupingWithFilter: Story;
26
+ export declare const VersionEvolution: Story;
27
+ export declare const MultiServiceVersionGrouping: Story;
28
+ export declare const VersionGroupingWithCoverage: Story;
23
29
  //# sourceMappingURL=StoryboardWorkflowsTree.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"StoryboardWorkflowsTree.stories.d.ts","sourceRoot":"","sources":["../../../../src/components/StoryboardWorkflowsTree/StoryboardWorkflowsTree.stories.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAyP5E,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,2BAA2B,CAOlD,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAE1D,eAAO,MAAM,OAAO,EAAE,KAOrB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAO3B,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAOhC,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAOhC,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAQ3B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAOxB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAO3B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAOhC,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAOxB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAuE7B,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,KAkEpC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAgE7B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAU3B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAwB/B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAiBlC,CAAC"}
1
+ {"version":3,"file":"StoryboardWorkflowsTree.stories.d.ts","sourceRoot":"","sources":["../../../../src/components/StoryboardWorkflowsTree/StoryboardWorkflowsTree.stories.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAyP5E,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,2BAA2B,CAOlD,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAE1D,eAAO,MAAM,OAAO,EAAE,KAOrB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAO3B,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAOhC,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAOhC,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAQ3B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAOxB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAO3B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAOhC,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAOxB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAuE7B,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,KAkEpC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAgE7B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAU3B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAwB/B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAiBlC,CAAC;AA4CF,eAAO,MAAM,eAAe,EAAE,KAe7B,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KAqEvC,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KAyFvC,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAiH9B,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,KA2GzC,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,KAyEzC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"StoryboardWorkflowsTreeCore.d.ts","sourceRoot":"","sources":["../../../../src/components/StoryboardWorkflowsTree/StoryboardWorkflowsTreeCore.tsx"],"names":[],"mappings":"AACA,OAAO,KAA0B,MAAM,OAAO,CAAC;AAO/C,OAAO,KAAK,EAEV,4BAA4B,EAG7B,MAAM,SAAS,CAAC;AAyIjB,eAAO,MAAM,2BAA2B,EAAE,KAAK,CAAC,EAAE,CAAC,4BAA4B,CAsJ9E,CAAC"}
1
+ {"version":3,"file":"StoryboardWorkflowsTreeCore.d.ts","sourceRoot":"","sources":["../../../../src/components/StoryboardWorkflowsTree/StoryboardWorkflowsTreeCore.tsx"],"names":[],"mappings":"AACA,OAAO,KAA0B,MAAM,OAAO,CAAC;AAO/C,OAAO,KAAK,EAEV,4BAA4B,EAK7B,MAAM,SAAS,CAAC;AA2QjB,eAAO,MAAM,2BAA2B,EAAE,KAAK,CAAC,EAAE,CAAC,4BAA4B,CAiN9E,CAAC"}
@@ -1,11 +1,19 @@
1
1
  import type { Theme } from '@principal-ade/industry-theme';
2
- import type { DiscoveredStoryboard, DiscoveredCanvas, DiscoveredWorkflow, WorkflowTemplate } from '@principal-ai/principal-view-core';
2
+ import type { DiscoveredStoryboard, DiscoveredCanvas, DiscoveredWorkflow, WorkflowTemplate, VersionSnapshot } from '@principal-ai/principal-view-core';
3
3
  import type { TreeNodeData } from '../TreeNode';
4
- export type { DiscoveredStoryboard, DiscoveredCanvas, DiscoveredWorkflow, WorkflowTemplate };
5
- export type StoryboardWorkflowNodeType = 'package' | 'storyboard' | 'overview' | 'canvas' | 'workflows' | 'workflow';
4
+ export type { DiscoveredStoryboard, DiscoveredCanvas, DiscoveredWorkflow, WorkflowTemplate, VersionSnapshot };
5
+ export type StoryboardWorkflowNodeType = 'version' | 'package' | 'storyboard' | 'overview' | 'canvas' | 'workflows' | 'workflow';
6
+ /**
7
+ * Workflow filter mode
8
+ * - 'all': Show all workflows (default)
9
+ * - 'with-traces': Show only workflows that have traces
10
+ * - 'without-traces': Show only workflows that don't have traces
11
+ */
12
+ export type WorkflowFilterMode = 'all' | 'with-traces' | 'without-traces';
6
13
  export interface StoryboardWorkflowNodeData extends TreeNodeData {
7
14
  type: StoryboardWorkflowNodeType;
8
15
  children?: StoryboardWorkflowNodeData[];
16
+ versionSnapshot?: VersionSnapshot;
9
17
  storyboard?: DiscoveredStoryboard;
10
18
  canvas?: DiscoveredCanvas;
11
19
  workflow?: DiscoveredWorkflow;
@@ -14,6 +22,9 @@ export interface StoryboardWorkflowNodeData extends TreeNodeData {
14
22
  scope?: 'package' | 'root';
15
23
  markdownPath?: string;
16
24
  isFullyCovered?: boolean;
25
+ hasTraces?: boolean;
26
+ repositoryUrl?: string;
27
+ commitSha?: string;
17
28
  }
18
29
  export interface StoryboardWorkflowsTreeProps {
19
30
  storyboards: DiscoveredStoryboard[];
@@ -27,5 +38,8 @@ export interface StoryboardWorkflowsTreeProps {
27
38
  verticalPadding?: string;
28
39
  enableDragAndDrop?: boolean;
29
40
  workflowCoverageMap?: Record<string, boolean>;
41
+ versionSnapshots?: VersionSnapshot[];
42
+ workflowFilterMode?: WorkflowFilterMode;
43
+ traceWorkflowsSet?: Set<string>;
30
44
  }
31
45
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/components/StoryboardWorkflowsTree/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAEtI,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,YAAY,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,CAAC;AAE7F,MAAM,MAAM,0BAA0B,GAAG,SAAS,GAAG,YAAY,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAC;AAErH,MAAM,WAAW,0BAA2B,SAAQ,YAAY;IAC9D,IAAI,EAAE,0BAA0B,CAAC;IACjC,QAAQ,CAAC,EAAE,0BAA0B,EAAE,CAAC;IAGxC,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,oBAAoB,EAAE,CAAC;IACpC,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,CAAC,IAAI,EAAE,0BAA0B,KAAK,IAAI,CAAC;IACpD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/C"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/components/StoryboardWorkflowsTree/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEvJ,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,YAAY,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC;AAE9G,MAAM,MAAM,0BAA0B,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAC;AAEjI;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,aAAa,GAAG,gBAAgB,CAAC;AAE1E,MAAM,WAAW,0BAA2B,SAAQ,YAAY;IAC9D,IAAI,EAAE,0BAA0B,CAAC;IACjC,QAAQ,CAAC,EAAE,0BAA0B,EAAE,CAAC;IAGxC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,oBAAoB,EAAE,CAAC;IACpC,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,CAAC,IAAI,EAAE,0BAA0B,KAAK,IAAI,CAAC;IACpD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAG9C,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACjC"}
@@ -0,0 +1,9 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { WorkflowScenarioTreeCore } from './WorkflowScenarioTreeCore';
3
+ declare const meta: Meta<typeof WorkflowScenarioTreeCore>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof WorkflowScenarioTreeCore>;
6
+ export declare const Default: Story;
7
+ export declare const WithFilterMode: Story;
8
+ export declare const WithVersions: Story;
9
+ //# sourceMappingURL=WorkflowScenarioTree.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkflowScenarioTree.stories.d.ts","sourceRoot":"","sources":["../../../../src/components/WorkflowScenarioTree/WorkflowScenarioTree.stories.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AA8MtE,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,wBAAwB,CAI/C,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEvD,eAAO,MAAM,OAAO,EAAE,KASrB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAuG5B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAwC1B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import type { WorkflowScenarioTreeProps } from './types';
3
+ export declare const WorkflowScenarioTreeCore: React.FC<WorkflowScenarioTreeProps>;
4
+ //# sourceMappingURL=WorkflowScenarioTreeCore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkflowScenarioTreeCore.d.ts","sourceRoot":"","sources":["../../../../src/components/WorkflowScenarioTree/WorkflowScenarioTreeCore.tsx"],"names":[],"mappings":"AACA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAMvC,OAAO,KAAK,EAEV,yBAAyB,EAI1B,MAAM,SAAS,CAAC;AAwMjB,eAAO,MAAM,wBAAwB,EAAE,KAAK,CAAC,EAAE,CAAC,yBAAyB,CAgKxE,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { WorkflowScenarioTreeCore } from './WorkflowScenarioTreeCore';
2
+ export type { WorkflowScenarioTreeProps, WorkflowScenarioNodeData, WorkflowScenarioNodeType, WorkflowWithScenarios, WorkflowFilterMode, } from './types';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/WorkflowScenarioTree/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,YAAY,EACV,yBAAyB,EACzB,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,SAAS,CAAC"}
@@ -0,0 +1,76 @@
1
+ import type { Theme } from '@principal-ade/industry-theme';
2
+ import type { DiscoveredStoryboard, DiscoveredWorkflow, WorkflowScenario, VersionSnapshot } from '@principal-ai/principal-view-core';
3
+ import type { TreeNodeData } from '../TreeNode';
4
+ export type { DiscoveredStoryboard, DiscoveredWorkflow, WorkflowScenario, VersionSnapshot };
5
+ /**
6
+ * Workflow filter mode
7
+ * - 'all': Show all workflows
8
+ * - 'with-traces': Show only workflows that have traces
9
+ * - 'without-traces': Show only workflows that don't have traces
10
+ * - 'minimum-traces': Show workflows with at least N traces (use minTraceCount)
11
+ */
12
+ export type WorkflowFilterMode = 'all' | 'with-traces' | 'without-traces' | 'minimum-traces';
13
+ /**
14
+ * Node types in the workflow-scenario tree
15
+ */
16
+ export type WorkflowScenarioNodeType = 'version' | 'package' | 'workflow' | 'scenario';
17
+ /**
18
+ * Extended workflow with scenarios and parent storyboard info
19
+ */
20
+ export interface WorkflowWithScenarios extends DiscoveredWorkflow {
21
+ /** Parent storyboard for context */
22
+ storyboard: DiscoveredStoryboard;
23
+ /** Workflow scenarios (from WorkflowTemplate.scenarios) */
24
+ scenarios: WorkflowScenario[];
25
+ }
26
+ /**
27
+ * Node data for workflow-scenario tree
28
+ */
29
+ export interface WorkflowScenarioNodeData extends TreeNodeData {
30
+ type: WorkflowScenarioNodeType;
31
+ children?: WorkflowScenarioNodeData[];
32
+ versionSnapshot?: VersionSnapshot;
33
+ repositoryUrl?: string;
34
+ commitSha?: string;
35
+ packageName?: string;
36
+ scope?: 'package' | 'root';
37
+ workflow?: WorkflowWithScenarios;
38
+ scenario?: WorkflowScenario;
39
+ storyboard?: DiscoveredStoryboard;
40
+ traceCount?: number;
41
+ hasTraces?: boolean;
42
+ }
43
+ /**
44
+ * Props for WorkflowScenarioTree component
45
+ */
46
+ export interface WorkflowScenarioTreeProps {
47
+ /** Workflows with scenarios and storyboard context */
48
+ workflows: WorkflowWithScenarios[];
49
+ /** Theme for styling */
50
+ theme: Theme;
51
+ /** Click handler */
52
+ onClick: (node: WorkflowScenarioNodeData) => void;
53
+ /** Selected node ID */
54
+ selectedNodeId?: string;
55
+ /** Default open state */
56
+ defaultOpen?: boolean;
57
+ /** Initial open state for specific nodes */
58
+ initialOpenState?: Record<string, boolean>;
59
+ /** Horizontal padding for nodes */
60
+ horizontalNodePadding?: string;
61
+ /** Vertical padding for nodes */
62
+ verticalNodePadding?: string;
63
+ /** Vertical padding for container */
64
+ verticalPadding?: string;
65
+ /** Optional version snapshots for grouping workflows by version */
66
+ versionSnapshots?: VersionSnapshot[];
67
+ /** Map of workflow ID to trace count */
68
+ workflowTraceCounts?: Record<string, number>;
69
+ /** Map of scenario ID to trace count (format: "workflowId/scenarioId") */
70
+ scenarioTraceCounts?: Record<string, number>;
71
+ /** Filter mode for workflows/scenarios */
72
+ workflowFilterMode?: WorkflowFilterMode;
73
+ /** Minimum trace count (when workflowFilterMode is 'minimum-traces') */
74
+ minTraceCount?: number;
75
+ }
76
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/components/WorkflowScenarioTree/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAErI,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,YAAY,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC;AAE5F;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,aAAa,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;AAE7F;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAEvF;;GAEG;AACH,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB;IAC/D,oCAAoC;IACpC,UAAU,EAAE,oBAAoB,CAAC;IACjC,2DAA2D;IAC3D,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,YAAY;IAC5D,IAAI,EAAE,wBAAwB,CAAC;IAC/B,QAAQ,CAAC,EAAE,wBAAwB,EAAE,CAAC;IAGtC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAGlC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,sDAAsD;IACtD,SAAS,EAAE,qBAAqB,EAAE,CAAC;IACnC,wBAAwB;IACxB,KAAK,EAAE,KAAK,CAAC;IACb,oBAAoB;IACpB,OAAO,EAAE,CAAC,IAAI,EAAE,wBAAwB,KAAK,IAAI,CAAC;IAClD,uBAAuB;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yBAAyB;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,mCAAmC;IACnC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,iCAAiC;IACjC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,qCAAqC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,mEAAmE;IACnE,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IAGrC,wCAAwC;IACxC,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,0EAA0E;IAC1E,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAG7C,0CAA0C;IAC1C,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@principal-ade/dynamic-file-tree",
3
- "version": "0.1.58",
3
+ "version": "0.1.60",
4
4
  "description": "React component for selective directory filtering and file tree visualization",
5
5
  "type": "module",
6
6
  "main": "dist/index.mjs",
@@ -48,7 +48,7 @@
48
48
  },
49
49
  "peerDependencies": {
50
50
  "@principal-ade/industry-theme": ">=0.1.0",
51
- "@principal-ai/principal-view-core": "^0.21.0",
51
+ "@principal-ai/principal-view-core": "^0.22.1",
52
52
  "@principal-ai/repository-abstraction": "^0.5.2",
53
53
  "lucide-react": ">=0.263.0",
54
54
  "react": ">=19.0.0",
@@ -69,10 +69,10 @@
69
69
  }
70
70
  },
71
71
  "devDependencies": {
72
+ "@eslint/js": "^9.32.0",
72
73
  "@principal-ade/industry-theme": "^0.1.0",
73
- "@principal-ai/principal-view-core": "^0.21.0",
74
+ "@principal-ai/principal-view-core": "^0.22.1",
74
75
  "@principal-ai/repository-abstraction": "^0.5.2",
75
- "@eslint/js": "^9.32.0",
76
76
  "@storybook/addon-docs": "^9.1.3",
77
77
  "@storybook/addon-onboarding": "^9.1.3",
78
78
  "@storybook/addon-webpack5-compiler-swc": "^3.0.0",