@principal-ade/dynamic-file-tree 0.1.59 → 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
@@ -2021,19 +2021,34 @@ var buildTreeDataFromStoryboards = (storyboards, workflowCoverageMap, traceWorkf
2021
2021
  }
2022
2022
  };
2023
2023
  var buildTreeDataFromVersions = (versionSnapshots, workflowCoverageMap, filterMode, traceWorkflowsSet) => {
2024
+ console.log("[buildTreeDataFromVersions] Called with:", {
2025
+ snapshotCount: versionSnapshots.length,
2026
+ filterMode,
2027
+ traceWorkflowsSet
2028
+ });
2024
2029
  const result = [];
2025
2030
  for (const snapshot of versionSnapshots) {
2026
2031
  const versionKey = `${snapshot.repositoryUrl}@${snapshot.commitSha}`;
2032
+ console.log("[buildTreeDataFromVersions] Processing version:", versionKey);
2033
+ console.log("[buildTreeDataFromVersions] Storyboards in snapshot:", snapshot.storyboards.length);
2027
2034
  const versionHasTracedWorkflows = snapshot.storyboards.some((storyboard) => storyboard.workflows.some((workflow) => traceWorkflowsSet?.has(workflow.id) ?? false));
2028
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);
2029
2038
  if (filterMode === "with-traces" && !versionHasTracedWorkflows) {
2039
+ console.log("[buildTreeDataFromVersions] Skipping version (no traced workflows)");
2030
2040
  continue;
2031
2041
  }
2032
2042
  if (filterMode === "without-traces" && !versionHasUntracedWorkflows) {
2043
+ console.log("[buildTreeDataFromVersions] Skipping version (no untraced workflows)");
2033
2044
  continue;
2034
2045
  }
2046
+ console.log("[buildTreeDataFromVersions] Building storyboard children...");
2035
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);
2036
2050
  if (storyboardChildren.length === 0) {
2051
+ console.log("[buildTreeDataFromVersions] Skipping version (no children after filtering)");
2037
2052
  continue;
2038
2053
  }
2039
2054
  const repoName = snapshot.repositoryUrl.replace("https://github.com/", "");
@@ -2075,10 +2090,20 @@ var StoryboardWorkflowsTreeCore = ({
2075
2090
  return contentLineHeight + paddingValue * 2 + borderHeight;
2076
2091
  }, [verticalNodePadding]);
2077
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);
2078
2098
  if (versionSnapshots && versionSnapshots.length > 0) {
2079
- return buildTreeDataFromVersions(versionSnapshots, workflowCoverageMap, workflowFilterMode, traceWorkflowsSet);
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;
2080
2103
  } else {
2081
- return buildTreeDataFromStoryboards(storyboards, workflowCoverageMap, traceWorkflowsSet, workflowFilterMode);
2104
+ const result = buildTreeDataFromStoryboards(storyboards, workflowCoverageMap, traceWorkflowsSet, workflowFilterMode);
2105
+ console.log("[StoryboardWorkflowsTreeCore] buildTreeDataFromStoryboards result:", result);
2106
+ return result;
2082
2107
  }
2083
2108
  }, [storyboards, versionSnapshots, workflowCoverageMap, traceWorkflowsSet, workflowFilterMode]);
2084
2109
  const NodeRenderer = (props) => {
@@ -2178,10 +2203,239 @@ var StoryboardWorkflowsTreeCore = ({
2178
2203
  ...dndProps
2179
2204
  }, NodeRenderer));
2180
2205
  };
2181
- // src/components/CanvasListTree/CanvasListTreeCore.tsx
2182
- import { Package as Package2, Folder, LayoutDashboard as LayoutDashboard2, FileText } from "lucide-react";
2183
- 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";
2184
2209
  import { Tree as Tree4 } from "react-arborist";
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";
2185
2439
  var buildTreeData = (canvases) => {
2186
2440
  const packagesMap = new Map;
2187
2441
  const rootCanvases = [];
@@ -2274,28 +2528,28 @@ var CanvasListTreeCore = ({
2274
2528
  enableDragAndDrop = false
2275
2529
  }) => {
2276
2530
  const dndProps = getDndProps(enableDragAndDrop);
2277
- const rowHeight = useMemo10(() => {
2531
+ const rowHeight = useMemo11(() => {
2278
2532
  const paddingValue = parseFloat(verticalNodePadding);
2279
2533
  const contentLineHeight = 20;
2280
2534
  const borderHeight = 2;
2281
2535
  return contentLineHeight + paddingValue * 2 + borderHeight;
2282
2536
  }, [verticalNodePadding]);
2283
- const treeData = useMemo10(() => buildTreeData(canvases), [canvases]);
2537
+ const treeData = useMemo11(() => buildTreeData(canvases), [canvases]);
2284
2538
  const NodeRenderer = (props) => {
2285
2539
  const { node } = props;
2286
2540
  const data = node.data;
2287
- const icon = data.type === "package" ? /* @__PURE__ */ React12.createElement(Package2, {
2541
+ const icon = data.type === "package" ? /* @__PURE__ */ React13.createElement(Package3, {
2288
2542
  size: 16
2289
- }) : data.type === "canvas-folder" ? /* @__PURE__ */ React12.createElement(Folder, {
2543
+ }) : data.type === "canvas-folder" ? /* @__PURE__ */ React13.createElement(Folder, {
2290
2544
  size: 16
2291
- }) : data.type === "overview" ? /* @__PURE__ */ React12.createElement(FileText, {
2545
+ }) : data.type === "overview" ? /* @__PURE__ */ React13.createElement(FileText, {
2292
2546
  size: 16
2293
- }) : /* @__PURE__ */ React12.createElement(LayoutDashboard2, {
2547
+ }) : /* @__PURE__ */ React13.createElement(LayoutDashboard2, {
2294
2548
  size: 16
2295
2549
  });
2296
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";
2297
2551
  const nodeHorizontalPadding = data.type === "overview" || data.type === "canvas" ? `calc(${horizontalNodePadding} + 12px)` : horizontalNodePadding;
2298
- return /* @__PURE__ */ React12.createElement(TreeNode, {
2552
+ return /* @__PURE__ */ React13.createElement(TreeNode, {
2299
2553
  ...props,
2300
2554
  theme,
2301
2555
  nameColor,
@@ -2322,7 +2576,7 @@ var CanvasListTreeCore = ({
2322
2576
  };
2323
2577
  const initialHeight = 600;
2324
2578
  const [containerRef, containerHeight] = useContainerHeight(initialHeight);
2325
- return /* @__PURE__ */ React12.createElement("div", {
2579
+ return /* @__PURE__ */ React13.createElement("div", {
2326
2580
  ref: containerRef,
2327
2581
  style: {
2328
2582
  backgroundColor: theme.colors.background,
@@ -2331,7 +2585,7 @@ var CanvasListTreeCore = ({
2331
2585
  height: "100%",
2332
2586
  ...verticalPadding ? { paddingTop: verticalPadding, paddingBottom: verticalPadding } : {}
2333
2587
  }
2334
- }, /* @__PURE__ */ React12.createElement(Tree4, {
2588
+ }, /* @__PURE__ */ React13.createElement(Tree5, {
2335
2589
  initialData: treeData,
2336
2590
  onSelect: handleSelect,
2337
2591
  openByDefault: defaultOpen,
@@ -2350,9 +2604,9 @@ import {
2350
2604
  Circle as Circle2,
2351
2605
  TestTube
2352
2606
  } from "lucide-react";
2353
- import React13, { useMemo as useMemo11, useRef as useRef7 } from "react";
2354
- import { Tree as Tree5 } from "react-arborist";
2355
- 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);
2356
2610
  var DEFAULT_TEST_PATTERNS = [
2357
2611
  /\.test\.[jt]sx?$/,
2358
2612
  /\.spec\.[jt]sx?$/,
@@ -2369,7 +2623,7 @@ var getCoverageStatusDisplay = (coverage, _theme) => {
2369
2623
  switch (status) {
2370
2624
  case "covered":
2371
2625
  return {
2372
- icon: /* @__PURE__ */ React13.createElement(Activity, {
2626
+ icon: /* @__PURE__ */ React14.createElement(Activity, {
2373
2627
  size: 14
2374
2628
  }),
2375
2629
  color: "#22c55e",
@@ -2378,7 +2632,7 @@ var getCoverageStatusDisplay = (coverage, _theme) => {
2378
2632
  };
2379
2633
  case "partial":
2380
2634
  return {
2381
- icon: /* @__PURE__ */ React13.createElement(CircleDot2, {
2635
+ icon: /* @__PURE__ */ React14.createElement(CircleDot2, {
2382
2636
  size: 14
2383
2637
  }),
2384
2638
  color: "#eab308",
@@ -2387,7 +2641,7 @@ var getCoverageStatusDisplay = (coverage, _theme) => {
2387
2641
  };
2388
2642
  case "none":
2389
2643
  return {
2390
- icon: /* @__PURE__ */ React13.createElement(Circle2, {
2644
+ icon: /* @__PURE__ */ React14.createElement(Circle2, {
2391
2645
  size: 14
2392
2646
  }),
2393
2647
  color: "#6b7280",
@@ -2489,7 +2743,7 @@ var TelemetryCoverageFileTree = ({
2489
2743
  enableDragAndDrop = false
2490
2744
  }) => {
2491
2745
  const dndProps = getDndProps(enableDragAndDrop);
2492
- const coverageMap = useMemo11(() => {
2746
+ const coverageMap = useMemo12(() => {
2493
2747
  const map = new Map;
2494
2748
  coverageData.forEach((item) => {
2495
2749
  map.set(item.filePath, item);
@@ -2498,7 +2752,7 @@ var TelemetryCoverageFileTree = ({
2498
2752
  }, [coverageData]);
2499
2753
  const NodeRenderer = (props) => {
2500
2754
  const { node } = props;
2501
- const ctx = React13.useContext(TelemetryCoverageContext);
2755
+ const ctx = React14.useContext(TelemetryCoverageContext);
2502
2756
  const coverage = ctx?.coverageMap.get(node.data.id);
2503
2757
  const hasTracedChildren = ctx?.hasTracedChildrenMap.get(node.data.id);
2504
2758
  const coverageDisplay = coverage ? getCoverageStatusDisplay(coverage, theme) : null;
@@ -2510,11 +2764,11 @@ var TelemetryCoverageFileTree = ({
2510
2764
  } else if (node.data.isTestFile) {
2511
2765
  nameColor = "#6b728080";
2512
2766
  }
2513
- const leftIcon = node.data.isTestFile && !coverage ? /* @__PURE__ */ React13.createElement(TestTube, {
2767
+ const leftIcon = node.data.isTestFile && !coverage ? /* @__PURE__ */ React14.createElement(TestTube, {
2514
2768
  size: 14,
2515
2769
  style: { marginRight: 4, color: "#6b7280" }
2516
2770
  }) : null;
2517
- const rightContent = coverageDisplay ? /* @__PURE__ */ React13.createElement("div", {
2771
+ const rightContent = coverageDisplay ? /* @__PURE__ */ React14.createElement("div", {
2518
2772
  style: {
2519
2773
  display: "flex",
2520
2774
  alignItems: "center",
@@ -2522,14 +2776,14 @@ var TelemetryCoverageFileTree = ({
2522
2776
  marginRight: "8px"
2523
2777
  },
2524
2778
  title: coverageDisplay.label
2525
- }, coverageDisplay.icon, /* @__PURE__ */ React13.createElement("span", {
2779
+ }, coverageDisplay.icon, /* @__PURE__ */ React14.createElement("span", {
2526
2780
  style: {
2527
2781
  marginLeft: "4px",
2528
2782
  fontSize: theme.fontSizes[0],
2529
2783
  fontWeight: "bold",
2530
2784
  fontFamily: "monospace"
2531
2785
  }
2532
- }, coverageDisplay.badge)) : node.data.isTestFile ? /* @__PURE__ */ React13.createElement("div", {
2786
+ }, coverageDisplay.badge)) : node.data.isTestFile ? /* @__PURE__ */ React14.createElement("div", {
2533
2787
  style: {
2534
2788
  display: "flex",
2535
2789
  alignItems: "center",
@@ -2538,10 +2792,10 @@ var TelemetryCoverageFileTree = ({
2538
2792
  opacity: 0.5
2539
2793
  },
2540
2794
  title: "No telemetry instrumentation"
2541
- }, /* @__PURE__ */ React13.createElement(Circle2, {
2795
+ }, /* @__PURE__ */ React14.createElement(Circle2, {
2542
2796
  size: 14
2543
2797
  })) : null;
2544
- return /* @__PURE__ */ React13.createElement(TreeNode, {
2798
+ return /* @__PURE__ */ React14.createElement(TreeNode, {
2545
2799
  ...props,
2546
2800
  theme,
2547
2801
  rightContent,
@@ -2556,16 +2810,16 @@ var TelemetryCoverageFileTree = ({
2556
2810
  }
2557
2811
  });
2558
2812
  };
2559
- const treeStructure = useMemo11(() => {
2813
+ const treeStructure = useMemo12(() => {
2560
2814
  return transformTreeStructure2(fileTree, showOnlyTestFiles, testFilePatterns);
2561
2815
  }, [fileTree, showOnlyTestFiles, testFilePatterns]);
2562
- const treeData = useMemo11(() => {
2816
+ const treeData = useMemo12(() => {
2563
2817
  if (showUncoveredFiles) {
2564
2818
  return treeStructure;
2565
2819
  }
2566
2820
  return filterCoveredNodes(treeStructure, coverageMap);
2567
2821
  }, [treeStructure, showUncoveredFiles, coverageMap]);
2568
- const hasTracedChildrenMap = useMemo11(() => {
2822
+ const hasTracedChildrenMap = useMemo12(() => {
2569
2823
  const map = new Map;
2570
2824
  const markTracedParents = (nodes) => {
2571
2825
  let hasTraced = false;
@@ -2606,7 +2860,7 @@ var TelemetryCoverageFileTree = ({
2606
2860
  onDirectorySelect(selectedDirs);
2607
2861
  }
2608
2862
  };
2609
- const calculatedHeight = useMemo11(() => {
2863
+ const calculatedHeight = useMemo12(() => {
2610
2864
  if (autoHeight) {
2611
2865
  const visibleNodeCount = countVisibleNodes3(treeData, openByDefault);
2612
2866
  return visibleNodeCount * 28;
@@ -2614,7 +2868,7 @@ var TelemetryCoverageFileTree = ({
2614
2868
  return initialHeight;
2615
2869
  }, [autoHeight, treeData, openByDefault, initialHeight]);
2616
2870
  const [containerRef, containerHeight] = useContainerHeight(calculatedHeight);
2617
- return /* @__PURE__ */ React13.createElement("div", {
2871
+ return /* @__PURE__ */ React14.createElement("div", {
2618
2872
  ref: containerRef,
2619
2873
  style: {
2620
2874
  backgroundColor: transparentBackground ? "transparent" : theme.colors.background,
@@ -2623,9 +2877,9 @@ var TelemetryCoverageFileTree = ({
2623
2877
  ...autoHeight ? {} : { height: "100%" },
2624
2878
  ...verticalPadding ? { paddingTop: verticalPadding, paddingBottom: verticalPadding } : {}
2625
2879
  }
2626
- }, /* @__PURE__ */ React13.createElement(TelemetryCoverageContext.Provider, {
2880
+ }, /* @__PURE__ */ React14.createElement(TelemetryCoverageContext.Provider, {
2627
2881
  value: { coverageMap, hasTracedChildrenMap }
2628
- }, /* @__PURE__ */ React13.createElement(Tree5, {
2882
+ }, /* @__PURE__ */ React14.createElement(Tree6, {
2629
2883
  data: treeData,
2630
2884
  onSelect: handleSelect,
2631
2885
  ...selectedFile !== undefined && { selection: selectedFile },
@@ -2654,7 +2908,7 @@ var calculateTelemetryCoverageStats = (coverageData) => {
2654
2908
  };
2655
2909
  // src/components/TelemetryCoverageFileTreeContainer.tsx
2656
2910
  import { RefreshCw as RefreshCw2, Eye as Eye2, EyeOff as EyeOff2, AlertCircle as AlertCircle4, Activity as Activity2 } from "lucide-react";
2657
- import React14, { useState as useState7, useMemo as useMemo12 } from "react";
2911
+ import React15, { useState as useState7, useMemo as useMemo13 } from "react";
2658
2912
  var TelemetryCoverageFileTreeContainer = ({
2659
2913
  fileTree,
2660
2914
  theme,
@@ -2676,10 +2930,10 @@ var TelemetryCoverageFileTreeContainer = ({
2676
2930
  }) => {
2677
2931
  const [filters, setFilters] = useState7([]);
2678
2932
  const [showUncoveredFiles, setShowUncoveredFiles] = useState7(true);
2679
- const selectedDirectories = useMemo12(() => {
2933
+ const selectedDirectories = useMemo13(() => {
2680
2934
  return filters.filter((f) => f.mode === "include").map((f) => f.path);
2681
2935
  }, [filters]);
2682
- const stats = useMemo12(() => calculateTelemetryCoverageStats(coverageData), [coverageData]);
2936
+ const stats = useMemo13(() => calculateTelemetryCoverageStats(coverageData), [coverageData]);
2683
2937
  const handleRefresh = () => {
2684
2938
  onRefresh?.();
2685
2939
  };
@@ -2687,34 +2941,34 @@ var TelemetryCoverageFileTreeContainer = ({
2687
2941
  setShowUncoveredFiles(!showUncoveredFiles);
2688
2942
  };
2689
2943
  const percentageColor = stats.percentage >= 80 ? "#22c55e" : stats.percentage >= 50 ? "#eab308" : stats.percentage > 0 ? "#f97316" : "#6b7280";
2690
- return /* @__PURE__ */ React14.createElement("div", {
2944
+ return /* @__PURE__ */ React15.createElement("div", {
2691
2945
  style: { display: "flex", flexDirection: "column", height: "100%" }
2692
- }, showControls && /* @__PURE__ */ React14.createElement("div", {
2946
+ }, showControls && /* @__PURE__ */ React15.createElement("div", {
2693
2947
  style: {
2694
2948
  padding: "12px",
2695
2949
  borderBottom: `1px solid ${theme.colors.border || "#e0e0e0"}`,
2696
2950
  backgroundColor: theme.colors.backgroundSecondary || theme.colors.background
2697
2951
  }
2698
- }, /* @__PURE__ */ React14.createElement("div", {
2952
+ }, /* @__PURE__ */ React15.createElement("div", {
2699
2953
  style: {
2700
2954
  display: "flex",
2701
2955
  alignItems: "center",
2702
2956
  justifyContent: "space-between",
2703
2957
  marginBottom: "8px"
2704
2958
  }
2705
- }, /* @__PURE__ */ React14.createElement("div", {
2959
+ }, /* @__PURE__ */ React15.createElement("div", {
2706
2960
  style: { display: "flex", alignItems: "center", gap: "8px" }
2707
- }, /* @__PURE__ */ React14.createElement(Activity2, {
2961
+ }, /* @__PURE__ */ React15.createElement(Activity2, {
2708
2962
  size: 16,
2709
2963
  color: theme.colors.primary
2710
- }), /* @__PURE__ */ React14.createElement("h3", {
2964
+ }), /* @__PURE__ */ React15.createElement("h3", {
2711
2965
  style: {
2712
2966
  margin: 0,
2713
2967
  fontSize: theme.fontSizes[1],
2714
2968
  fontWeight: "bold",
2715
2969
  color: theme.colors.text
2716
2970
  }
2717
- }, title), stats.testFiles > 0 && /* @__PURE__ */ React14.createElement("span", {
2971
+ }, title), stats.testFiles > 0 && /* @__PURE__ */ React15.createElement("span", {
2718
2972
  style: {
2719
2973
  backgroundColor: percentageColor,
2720
2974
  color: "#ffffff",
@@ -2724,14 +2978,14 @@ var TelemetryCoverageFileTreeContainer = ({
2724
2978
  fontWeight: "bold",
2725
2979
  fontFamily: "monospace"
2726
2980
  }
2727
- }, stats.percentage, "%"), isLoading && /* @__PURE__ */ React14.createElement(RefreshCw2, {
2981
+ }, stats.percentage, "%"), isLoading && /* @__PURE__ */ React15.createElement(RefreshCw2, {
2728
2982
  size: 16,
2729
2983
  color: theme.colors.text,
2730
2984
  className: "telemetry-coverage-spinner",
2731
2985
  style: { animation: "spin 1s linear infinite" }
2732
- })), /* @__PURE__ */ React14.createElement("div", {
2986
+ })), /* @__PURE__ */ React15.createElement("div", {
2733
2987
  style: { display: "flex", gap: "8px" }
2734
- }, /* @__PURE__ */ React14.createElement("button", {
2988
+ }, /* @__PURE__ */ React15.createElement("button", {
2735
2989
  onClick: toggleShowUncoveredFiles,
2736
2990
  style: {
2737
2991
  background: "none",
@@ -2746,11 +3000,11 @@ var TelemetryCoverageFileTreeContainer = ({
2746
3000
  color: theme.colors.text
2747
3001
  },
2748
3002
  title: showUncoveredFiles ? "Show only covered files" : "Show all test files"
2749
- }, showUncoveredFiles ? /* @__PURE__ */ React14.createElement(EyeOff2, {
3003
+ }, showUncoveredFiles ? /* @__PURE__ */ React15.createElement(EyeOff2, {
2750
3004
  size: 14
2751
- }) : /* @__PURE__ */ React14.createElement(Eye2, {
3005
+ }) : /* @__PURE__ */ React15.createElement(Eye2, {
2752
3006
  size: 14
2753
- }), showUncoveredFiles ? "Hide uncovered" : "Show all"), onRefresh && /* @__PURE__ */ React14.createElement("button", {
3007
+ }), showUncoveredFiles ? "Hide uncovered" : "Show all"), onRefresh && /* @__PURE__ */ React15.createElement("button", {
2754
3008
  onClick: handleRefresh,
2755
3009
  disabled: isLoading,
2756
3010
  style: {
@@ -2767,9 +3021,9 @@ var TelemetryCoverageFileTreeContainer = ({
2767
3021
  opacity: isLoading ? 0.6 : 1
2768
3022
  },
2769
3023
  title: "Refresh coverage data"
2770
- }, /* @__PURE__ */ React14.createElement(RefreshCw2, {
3024
+ }, /* @__PURE__ */ React15.createElement(RefreshCw2, {
2771
3025
  size: 14
2772
- }), "Refresh"))), error && /* @__PURE__ */ React14.createElement("div", {
3026
+ }), "Refresh"))), error && /* @__PURE__ */ React15.createElement("div", {
2773
3027
  style: {
2774
3028
  display: "flex",
2775
3029
  alignItems: "center",
@@ -2782,36 +3036,36 @@ var TelemetryCoverageFileTreeContainer = ({
2782
3036
  color: "#856404",
2783
3037
  marginBottom: "8px"
2784
3038
  }
2785
- }, /* @__PURE__ */ React14.createElement(AlertCircle4, {
3039
+ }, /* @__PURE__ */ React15.createElement(AlertCircle4, {
2786
3040
  size: 14
2787
- }), error), !error && stats.testFiles > 0 && /* @__PURE__ */ React14.createElement("div", {
3041
+ }), error), !error && stats.testFiles > 0 && /* @__PURE__ */ React15.createElement("div", {
2788
3042
  style: {
2789
3043
  display: "flex",
2790
3044
  gap: "16px",
2791
3045
  fontSize: theme.fontSizes[0],
2792
3046
  color: theme.colors.textSecondary || "#666"
2793
3047
  }
2794
- }, /* @__PURE__ */ React14.createElement("span", null, /* @__PURE__ */ React14.createElement("strong", {
3048
+ }, /* @__PURE__ */ React15.createElement("span", null, /* @__PURE__ */ React15.createElement("strong", {
2795
3049
  style: { color: "#22c55e" }
2796
- }, 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", {
2797
3051
  style: { color: "#eab308" }
2798
- }, 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", {
2799
3053
  style: { color: "#6b7280" }
2800
- }, stats.uncoveredFiles), " uncovered"), /* @__PURE__ */ React14.createElement("span", {
3054
+ }, stats.uncoveredFiles), " uncovered"), /* @__PURE__ */ React15.createElement("span", {
2801
3055
  style: { marginLeft: "auto" }
2802
- }, 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", {
2803
3057
  style: {
2804
3058
  fontSize: theme.fontSizes[0],
2805
3059
  color: theme.colors.textSecondary || "#666"
2806
3060
  }
2807
- }, "No test files with coverage data found")), /* @__PURE__ */ React14.createElement(DirectoryFilterInput, {
3061
+ }, "No test files with coverage data found")), /* @__PURE__ */ React15.createElement(DirectoryFilterInput, {
2808
3062
  fileTree,
2809
3063
  theme,
2810
3064
  filters,
2811
3065
  onFiltersChange: setFilters
2812
- }), /* @__PURE__ */ React14.createElement("div", {
3066
+ }), /* @__PURE__ */ React15.createElement("div", {
2813
3067
  style: { flex: 1, marginTop: "1rem", overflow: "hidden" }
2814
- }, /* @__PURE__ */ React14.createElement(TelemetryCoverageFileTree, {
3068
+ }, /* @__PURE__ */ React15.createElement(TelemetryCoverageFileTree, {
2815
3069
  fileTree,
2816
3070
  theme,
2817
3071
  coverageData,
@@ -2837,6 +3091,7 @@ export {
2837
3091
  extractNameFromPath,
2838
3092
  combineRepositoryTrees,
2839
3093
  calculateTelemetryCoverageStats,
3094
+ WorkflowScenarioTreeCore,
2840
3095
  TreeNode,
2841
3096
  TelemetryCoverageFileTreeContainer,
2842
3097
  TelemetryCoverageFileTree,
@@ -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,EAK7B,MAAM,SAAS,CAAC;AAyPjB,eAAO,MAAM,2BAA2B,EAAE,KAAK,CAAC,EAAE,CAAC,4BAA4B,CAsM9E,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"}
@@ -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.59",
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",