@principal-ai/principal-view-core 0.16.0 → 0.17.0

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.
@@ -2,7 +2,7 @@
2
2
  * Unified discovery system for canvas and execution files in a package-aware way
3
3
  */
4
4
  import type { FileTree } from '@principal-ai/repository-abstraction';
5
- import type { DiscoveredCanvas, DiscoveredExecution, CanvasDiscoveryResult, DiscoveryOptions } from './types';
5
+ import type { CanvasDiscoveryResult, DiscoveryOptions } from './types';
6
6
  /**
7
7
  * Unified discovery system for canvas and execution files in a package-aware way
8
8
  *
@@ -27,7 +27,6 @@ import type { DiscoveredCanvas, DiscoveredExecution, CanvasDiscoveryResult, Disc
27
27
  */
28
28
  export declare class CanvasDiscovery {
29
29
  private static readonly CANVAS_DIR;
30
- private static readonly EXECUTIONS_DIR;
31
30
  private static readonly WORKFLOW_EXTENSION;
32
31
  private packageModule;
33
32
  private packageCache;
@@ -40,22 +39,6 @@ export declare class CanvasDiscovery {
40
39
  * @returns Discovery result with canvases, executions, storyboards, and errors
41
40
  */
42
41
  discover(fileTree: FileTree, options?: DiscoveryOptions): Promise<CanvasDiscoveryResult>;
43
- /**
44
- * Find canvas file for a given execution
45
- *
46
- * @param execution - Discovered execution
47
- * @param canvases - Array of discovered canvases (from discover())
48
- * @returns Matching canvas or null
49
- */
50
- findCanvasForExecution(execution: DiscoveredExecution, canvases: DiscoveredCanvas[]): DiscoveredCanvas | null;
51
- /**
52
- * Find execution files for a given canvas
53
- *
54
- * @param canvas - Discovered canvas
55
- * @param executions - Array of discovered executions (from discover())
56
- * @returns Array of matching executions
57
- */
58
- findExecutionsForCanvas(canvas: DiscoveredCanvas, executions: DiscoveredExecution[]): DiscoveredExecution[];
59
42
  /**
60
43
  * Clear package cache (useful when file tree changes)
61
44
  */
@@ -68,6 +51,10 @@ export declare class CanvasDiscovery {
68
51
  * Discover workflows within a storyboard folder
69
52
  */
70
53
  private discoverWorkflowsInStoryboard;
54
+ /**
55
+ * Discover execution files co-located in a workflow directory
56
+ */
57
+ private discoverExecutionsInWorkflowDir;
71
58
  /**
72
59
  * Discover packages with caching by fileTree SHA
73
60
  */
@@ -83,24 +70,14 @@ export declare class CanvasDiscovery {
83
70
  /**
84
71
  * Discover execution files in the file tree
85
72
  */
86
- private discoverExecutionFiles;
87
73
  /**
88
- * Check if path is in .principal-views directory
74
+ * Check if path is in .principal-views directory (directly, not in subdirectories)
89
75
  */
90
76
  private isInCanvasDir;
91
77
  /**
92
78
  * Parse canvas file path to extract metadata
93
79
  */
94
80
  private parseCanvasPath;
95
- /**
96
- * Check if path is in __executions__ directory
97
- */
98
- private isInExecutionsDir;
99
- /**
100
- * Parse execution file path to extract metadata
101
- * Only .otel.json files are supported
102
- */
103
- private parseExecutionPath;
104
81
  /**
105
82
  * Find package for a given path using longest-path matching
106
83
  */
@@ -114,7 +91,7 @@ export declare class CanvasDiscovery {
114
91
  */
115
92
  private compareByPackageThenName;
116
93
  /**
117
- * Detect legacy flat structures and add deprecation errors
94
+ * Detect legacy flat canvas structures and add deprecation errors
118
95
  */
119
96
  private detectLegacyStructures;
120
97
  }
@@ -1 +1 @@
1
- {"version":3,"file":"CanvasDiscovery.d.ts","sourceRoot":"","sources":["../../src/discovery/CanvasDiscovery.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAErE,OAAO,KAAK,EACV,gBAAgB,EAEhB,mBAAmB,EAMnB,qBAAqB,EACrB,gBAAgB,EAGjB,MAAM,SAAS,CAAC;AAEjB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAsB;IACxD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAoB;IAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAoB;IAE9D,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,YAAY,CAA0C;;IAM9D;;;;;;OAMG;IACG,QAAQ,CACZ,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,qBAAqB,CAAC;IA8BjC;;;;;;OAMG;IACH,sBAAsB,CACpB,SAAS,EAAE,mBAAmB,EAC9B,QAAQ,EAAE,gBAAgB,EAAE,GAC3B,gBAAgB,GAAG,IAAI;IAS1B;;;;;;OAMG;IACH,uBAAuB,CACrB,MAAM,EAAE,gBAAgB,EACxB,UAAU,EAAE,mBAAmB,EAAE,GAChC,mBAAmB,EAAE;IASxB;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;YACW,mBAAmB;IAqFjC;;OAEG;YACW,6BAA6B;IA6E3C;;OAEG;YACW,yBAAyB;IAgBvC;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;YACW,mBAAmB;IAkEjC;;OAEG;YACW,sBAAsB;IA0DpC;;OAEG;IACH,OAAO,CAAC,aAAa;IAkBrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAczB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAsB1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAkBhC;;OAEG;IACH,OAAO,CAAC,sBAAsB;CAkD/B"}
1
+ {"version":3,"file":"CanvasDiscovery.d.ts","sourceRoot":"","sources":["../../src/discovery/CanvasDiscovery.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAErE,OAAO,KAAK,EASV,qBAAqB,EACrB,gBAAgB,EAGjB,MAAM,SAAS,CAAC;AAEjB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAsB;IACxD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAoB;IAE9D,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,YAAY,CAA0C;;IAM9D;;;;;;OAMG;IACG,QAAQ,CACZ,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,qBAAqB,CAAC;IAoCjC;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;YACW,mBAAmB;IAmFjC;;OAEG;YACW,6BAA6B;IA+E3C;;OAEG;YACW,+BAA+B;IAmE7C;;OAEG;YACW,yBAAyB;IAgBvC;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;YACW,mBAAmB;IAkEjC;;OAEG;IACH;;OAEG;IACH,OAAO,CAAC,aAAa;IAkBrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAkBhC;;OAEG;IACH,OAAO,CAAC,sBAAsB;CA0B/B"}
@@ -45,44 +45,24 @@ class CanvasDiscovery {
45
45
  const packageMap = this.buildPackageMap(packages);
46
46
  // 3. Discover canvas files
47
47
  const canvases = await this.discoverCanvasFiles(fileTree, packageMap, options, errors);
48
- // 4. Discover execution files
49
- const executions = await this.discoverExecutionFiles(fileTree, packageMap, options, errors);
50
- // 5. Discover storyboards (hierarchical organization)
51
- const storyboards = await this.discoverStoryboards(fileTree, packageMap, canvases, executions, options, errors);
52
- // 6. Detect legacy structures and add deprecation errors
53
- this.detectLegacyStructures(canvases, executions, storyboards, errors);
48
+ // 4. Discover storyboards (hierarchical organization)
49
+ // Note: Executions are discovered as part of workflows, not separately
50
+ const storyboards = await this.discoverStoryboards(fileTree, packageMap, canvases, options, errors);
51
+ // 5. Collect all executions from workflows for backward compatibility
52
+ const executions = [];
53
+ for (const storyboard of storyboards) {
54
+ for (const workflow of storyboard.workflows) {
55
+ executions.push(...workflow.executions);
56
+ }
57
+ }
58
+ // 6. Detect legacy flat canvas structures and add deprecation errors
59
+ this.detectLegacyStructures(canvases, storyboards, errors);
54
60
  // 7. Sort results
55
61
  canvases.sort(this.compareByPackageThenName);
56
62
  executions.sort(this.compareByPackageThenName);
57
63
  storyboards.sort(this.compareByPackageThenName);
58
64
  return { canvases, executions, storyboards, errors, warnings };
59
65
  }
60
- /**
61
- * Find canvas file for a given execution
62
- *
63
- * @param execution - Discovered execution
64
- * @param canvases - Array of discovered canvases (from discover())
65
- * @returns Matching canvas or null
66
- */
67
- findCanvasForExecution(execution, canvases) {
68
- // Find canvas with matching basename and scope
69
- return canvases.find(canvas => canvas.basename === execution.canvasBasename &&
70
- canvas.scope === execution.scope &&
71
- canvas.packageName === execution.packageName) || null;
72
- }
73
- /**
74
- * Find execution files for a given canvas
75
- *
76
- * @param canvas - Discovered canvas
77
- * @param executions - Array of discovered executions (from discover())
78
- * @returns Array of matching executions
79
- */
80
- findExecutionsForCanvas(canvas, executions) {
81
- // Find all executions with matching basename and scope
82
- return executions.filter(execution => execution.canvasBasename === canvas.basename &&
83
- execution.scope === canvas.scope &&
84
- execution.packageName === canvas.packageName);
85
- }
86
66
  /**
87
67
  * Clear package cache (useful when file tree changes)
88
68
  */
@@ -92,7 +72,7 @@ class CanvasDiscovery {
92
72
  /**
93
73
  * Discover storyboards (hierarchical organization of canvas + workflows + executions)
94
74
  */
95
- async discoverStoryboards(fileTree, packageMap, canvases, executions, options, errors) {
75
+ async discoverStoryboards(fileTree, packageMap, canvases, options, errors) {
96
76
  const storyboards = [];
97
77
  // Build a map of directories to check for storyboards
98
78
  const storyboardDirs = new Map();
@@ -115,8 +95,8 @@ class CanvasDiscovery {
115
95
  // For each potential storyboard directory, check if it has a canvas
116
96
  for (const [storyboardPath, storyboardNames] of storyboardDirs) {
117
97
  for (const storyboardName of storyboardNames) {
118
- // Skip __executions__ directory
119
- if (storyboardName === CanvasDiscovery.EXECUTIONS_DIR)
98
+ // Skip __executions__ directory (legacy pattern, should not exist)
99
+ if (storyboardName === '__executions__')
120
100
  continue;
121
101
  // Find canvas for this storyboard
122
102
  const storyboardCanvas = canvases.find(c => {
@@ -126,7 +106,7 @@ class CanvasDiscovery {
126
106
  if (!storyboardCanvas)
127
107
  continue;
128
108
  // This is a storyboard! Now discover workflows
129
- const workflows = await this.discoverWorkflowsInStoryboard(fileTree, storyboardPath, storyboardName, packageMap, executions, options, errors);
109
+ const workflows = await this.discoverWorkflowsInStoryboard(fileTree, storyboardPath, storyboardName, packageMap, options, errors);
130
110
  // Determine package context
131
111
  const packageInfo = this.findPackageForPath(storyboardPath, packageMap);
132
112
  // Generate unique ID
@@ -153,7 +133,7 @@ class CanvasDiscovery {
153
133
  /**
154
134
  * Discover workflows within a storyboard folder
155
135
  */
156
- async discoverWorkflowsInStoryboard(fileTree, storyboardPath, storyboardName, packageMap, executions, options, errors) {
136
+ async discoverWorkflowsInStoryboard(fileTree, storyboardPath, storyboardName, packageMap, options, errors) {
157
137
  const workflows = [];
158
138
  // Find all workflow files in this storyboard
159
139
  for (const file of fileTree.allFiles) {
@@ -176,11 +156,8 @@ class CanvasDiscovery {
176
156
  const id = packageInfo
177
157
  ? `${packageInfo.packageData.name}/${storyboardName}/${basename}`
178
158
  : `${storyboardName}/${basename}`;
179
- // Find executions for this workflow (in the same directory as workflow.json)
180
- const workflowExecutions = executions.filter(e => {
181
- const execDir = e.path.split('/').slice(0, -1).join('/');
182
- return execDir === workflowDir;
183
- });
159
+ // Discover executions co-located in the same directory as workflow.json
160
+ const workflowExecutions = await this.discoverExecutionsInWorkflowDir(fileTree, workflowDir, packageMap, options, errors);
184
161
  // Create discovered workflow
185
162
  let workflow = {
186
163
  id,
@@ -213,6 +190,62 @@ class CanvasDiscovery {
213
190
  }
214
191
  return workflows;
215
192
  }
193
+ /**
194
+ * Discover execution files co-located in a workflow directory
195
+ */
196
+ async discoverExecutionsInWorkflowDir(fileTree, workflowDir, packageMap, options, errors) {
197
+ const executions = [];
198
+ // Find all .otel.json files in the workflow directory
199
+ for (const file of fileTree.allFiles) {
200
+ const path = file.relativePath || file.path || '';
201
+ // Check if file is in this workflow directory
202
+ const fileDir = path.split('/').slice(0, -1).join('/');
203
+ if (fileDir !== workflowDir)
204
+ continue;
205
+ // Check if it's an execution file (.otel.json)
206
+ if (!path.endsWith('.otel.json'))
207
+ continue;
208
+ // Extract execution metadata
209
+ const filename = path.split('/').pop();
210
+ if (!filename)
211
+ continue;
212
+ const basename = filename.replace('.otel.json', '');
213
+ // Determine package context
214
+ const packageInfo = this.findPackageForPath(path, packageMap);
215
+ // Generate unique ID (workflow-scoped)
216
+ const workflowBasename = workflowDir.split('/').pop() || '';
217
+ const id = packageInfo
218
+ ? `${packageInfo.packageData.name}/${workflowBasename}/${basename}`
219
+ : `${workflowBasename}/${basename}`;
220
+ // Create discovered execution
221
+ let execution = {
222
+ id,
223
+ name: this.toDisplayName(basename),
224
+ path,
225
+ basename,
226
+ type: 'otel',
227
+ canvasBasename: basename,
228
+ packageName: packageInfo?.packageData.name,
229
+ packagePath: packageInfo?.packageData.path,
230
+ scope: packageInfo ? 'package' : 'root',
231
+ };
232
+ // Optionally load content
233
+ if (options.includeContent && options.fileReader) {
234
+ try {
235
+ const content = await options.fileReader(path);
236
+ execution = { ...execution, content: JSON.parse(content) };
237
+ }
238
+ catch (error) {
239
+ errors.push({
240
+ path,
241
+ error: `Failed to parse execution content: ${error.message}`,
242
+ });
243
+ }
244
+ }
245
+ executions.push(execution);
246
+ }
247
+ return executions;
248
+ }
216
249
  /**
217
250
  * Discover packages with caching by fileTree SHA
218
251
  */
@@ -295,54 +328,8 @@ class CanvasDiscovery {
295
328
  /**
296
329
  * Discover execution files in the file tree
297
330
  */
298
- async discoverExecutionFiles(fileTree, packageMap, options, errors) {
299
- const executions = [];
300
- for (const file of fileTree.allFiles) {
301
- const path = file.relativePath || file.path || '';
302
- // Check if in __executions__ directory
303
- if (!this.isInExecutionsDir(path))
304
- continue;
305
- // Extract execution metadata
306
- const metadata = this.parseExecutionPath(path);
307
- if (!metadata)
308
- continue;
309
- // Determine package context
310
- const packageInfo = this.findPackageForPath(path, packageMap);
311
- // Generate unique ID
312
- const id = packageInfo
313
- ? `${packageInfo.packageData.name}/${metadata.basename}`
314
- : metadata.basename;
315
- // Create discovered execution
316
- let execution = {
317
- id,
318
- name: this.toDisplayName(metadata.basename),
319
- path,
320
- basename: metadata.basename,
321
- type: metadata.type,
322
- canvasBasename: metadata.canvasBasename,
323
- packageName: packageInfo?.packageData.name,
324
- packagePath: packageInfo?.packageData.path,
325
- scope: packageInfo ? 'package' : 'root',
326
- };
327
- // Optionally load content
328
- if (options.includeContent && options.fileReader) {
329
- try {
330
- const content = await options.fileReader(path);
331
- execution = { ...execution, content: JSON.parse(content) };
332
- }
333
- catch (error) {
334
- errors.push({
335
- path,
336
- error: `Failed to parse execution content: ${error.message}`,
337
- });
338
- }
339
- }
340
- executions.push(execution);
341
- }
342
- return executions;
343
- }
344
331
  /**
345
- * Check if path is in .principal-views directory
332
+ * Check if path is in .principal-views directory (directly, not in subdirectories)
346
333
  */
347
334
  isInCanvasDir(path) {
348
335
  const parts = path.split('/');
@@ -353,8 +340,8 @@ class CanvasDiscovery {
353
340
  // Package: packages/core/.principal-views/file.canvas
354
341
  if (parts.includes(CanvasDiscovery.CANVAS_DIR)) {
355
342
  const idx = parts.indexOf(CanvasDiscovery.CANVAS_DIR);
356
- // Ensure it's not in __executions__ subdirectory
357
- return !parts.includes(CanvasDiscovery.EXECUTIONS_DIR, idx);
343
+ // Must be directly in .principal-views/, not in a subdirectory
344
+ return parts.length === idx + 2;
358
345
  }
359
346
  return false;
360
347
  }
@@ -381,40 +368,6 @@ class CanvasDiscovery {
381
368
  }
382
369
  return null;
383
370
  }
384
- /**
385
- * Check if path is in __executions__ directory
386
- */
387
- isInExecutionsDir(path) {
388
- const parts = path.split('/');
389
- // Must contain __executions__ directory
390
- if (!parts.includes(CanvasDiscovery.EXECUTIONS_DIR))
391
- return false;
392
- // Valid patterns:
393
- // 1. .principal-views/__executions__/file.otel.json
394
- // 2. packages/core/.principal-views/__executions__/file.otel.json
395
- // 3. __executions__/file.otel.json (root level)
396
- return true;
397
- }
398
- /**
399
- * Parse execution file path to extract metadata
400
- * Only .otel.json files are supported
401
- */
402
- parseExecutionPath(path) {
403
- const filename = path.split('/').pop();
404
- if (!filename)
405
- return null;
406
- // Pattern: name.otel.json
407
- const match = filename.match(/^(.+)\.otel\.json$/);
408
- if (match) {
409
- const basename = match[1];
410
- return {
411
- basename,
412
- type: 'otel',
413
- canvasBasename: basename, // Same as basename for linking
414
- };
415
- }
416
- return null;
417
- }
418
371
  /**
419
372
  * Find package for a given path using longest-path matching
420
373
  */
@@ -460,20 +413,11 @@ class CanvasDiscovery {
460
413
  return a.name.localeCompare(b.name);
461
414
  }
462
415
  /**
463
- * Detect legacy flat structures and add deprecation errors
416
+ * Detect legacy flat canvas structures and add deprecation errors
464
417
  */
465
- detectLegacyStructures(canvases, executions, storyboards, errors) {
418
+ detectLegacyStructures(canvases, storyboards, errors) {
466
419
  // Build a set of storyboard canvas IDs for quick lookup
467
420
  const storyboardCanvasIds = new Set(storyboards.map(s => s.canvas.id));
468
- // Build a set of execution IDs that are part of storyboards
469
- const storyboardExecutionIds = new Set();
470
- for (const storyboard of storyboards) {
471
- for (const workflow of storyboard.workflows) {
472
- for (const execution of workflow.executions) {
473
- storyboardExecutionIds.add(execution.id);
474
- }
475
- }
476
- }
477
421
  // Check for legacy flat canvases (not part of any storyboard)
478
422
  for (const canvas of canvases) {
479
423
  if (!storyboardCanvasIds.has(canvas.id)) {
@@ -490,22 +434,9 @@ class CanvasDiscovery {
490
434
  }
491
435
  }
492
436
  }
493
- // Check for legacy executions in __executions__/ directory
494
- for (const execution of executions) {
495
- if (!storyboardExecutionIds.has(execution.id)) {
496
- // Check if this execution is in __executions__/ directory
497
- if (execution.path.includes(`/${CanvasDiscovery.EXECUTIONS_DIR}/`)) {
498
- errors.push({
499
- path: execution.path,
500
- error: 'DEPRECATED: Legacy __executions__/ directory is no longer supported. Migrate executions to workflow folders within storyboards immediately. See migration guide at docs/MIGRATION_GUIDE.md for details.',
501
- });
502
- }
503
- }
504
- }
505
437
  }
506
438
  }
507
439
  CanvasDiscovery.CANVAS_DIR = '.principal-views';
508
- CanvasDiscovery.EXECUTIONS_DIR = '__executions__';
509
440
  CanvasDiscovery.WORKFLOW_EXTENSION = '.workflow.json';
510
441
  export { CanvasDiscovery };
511
442
  //# sourceMappingURL=CanvasDiscovery.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CanvasDiscovery.js","sourceRoot":"","sources":["../../src/discovery/CanvasDiscovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CanvasDiscovery.js","sourceRoot":"","sources":["../../src/discovery/CanvasDiscovery.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,kBAAkB,EAAqB,MAAM,oCAAoC,CAAC;AAgB3F;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAa,eAAe;IAO1B;QAFQ,iBAAY,GAAgC,IAAI,GAAG,EAAE,CAAC;QAG5D,IAAI,CAAC,aAAa,GAAG,IAAI,kBAAkB,EAAE,CAAC;IAChD,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,QAAQ,CACZ,QAAkB,EAClB,UAA4B,EAAE;QAE9B,MAAM,MAAM,GAA2C,EAAE,CAAC;QAC1D,MAAM,QAAQ,GAAkE,EAAE,CAAC;QAEnF,sDAAsD;QACtD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAEpF,0DAA0D;QAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAElD,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAEvF,sDAAsD;QACtD,uEAAuE;QACvE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAEpG,sEAAsE;QACtE,MAAM,UAAU,GAA6D,EAAE,CAAC;QAChF,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;YACpC,KAAK,MAAM,QAAQ,IAAI,UAAU,CAAC,SAAS,EAAE;gBAC3C,UAAU,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;aACzC;SACF;QAED,qEAAqE;QACrE,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QAE3D,kBAAkB;QAClB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC7C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC/C,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAEhD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACjE,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB,CAC/B,QAAkB,EAClB,UAAqC,EACrC,QAA4B,EAC5B,OAAyB,EACzB,MAA8C;QAE9C,MAAM,WAAW,GAA+D,EAAE,CAAC;QAEnF,sDAAsD;QACtD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAuB,CAAC;QAEtD,qEAAqE;QACrE,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,QAAQ,EAAE;YACpC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;YAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAE9B,0EAA0E;YAC1E,uEAAuE;YACvE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YAC1D,IAAI,OAAO,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO,GAAG,CAAC;gBAAE,SAAS;YAE3D,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YAC1C,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAE7D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE;gBACvC,cAAc,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;aAC/C;YACD,cAAc,CAAC,GAAG,CAAC,cAAc,CAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;SACzD;QAED,oEAAoE;QACpE,KAAK,MAAM,CAAC,cAAc,EAAE,eAAe,CAAC,IAAI,cAAc,EAAE;YAC9D,KAAK,MAAM,cAAc,IAAI,eAAe,EAAE;gBAC5C,mEAAmE;gBACnE,IAAI,cAAc,KAAK,gBAAgB;oBAAE,SAAS;gBAElD,kCAAkC;gBAClC,MAAM,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;oBACzC,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAC3D,OAAO,SAAS,KAAK,cAAc,IAAI,CAAC,CAAC,QAAQ,KAAK,cAAc,CAAC;gBACvE,CAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,gBAAgB;oBAAE,SAAS;gBAEhC,+CAA+C;gBAC/C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,6BAA6B,CACxD,QAAQ,EACR,cAAc,EACd,cAAc,EACd,UAAU,EACV,OAAO,EACP,MAAM,CACP,CAAC;gBAEF,4BAA4B;gBAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;gBAExE,qBAAqB;gBACrB,MAAM,EAAE,GAAG,WAAW;oBACpB,CAAC,CAAC,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,cAAc,EAAE;oBACrD,CAAC,CAAC,cAAc,CAAC;gBAEnB,+BAA+B;gBAC/B,MAAM,UAAU,GAA2D;oBACzE,EAAE;oBACF,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;oBACxC,IAAI,EAAE,cAAc;oBACpB,QAAQ,EAAE,cAAc;oBACxB,MAAM,EAAE,gBAAgB;oBACxB,SAAS;oBACT,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,IAAI;oBAC1C,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,IAAI;oBAC1C,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;iBACxC,CAAC;gBAEF,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;aAC9B;SACF;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,6BAA6B,CACzC,QAAkB,EAClB,cAAsB,EACtB,cAAsB,EACtB,UAAqC,EACrC,OAAyB,EACzB,MAA8C;QAE9C,MAAM,SAAS,GAA2D,EAAE,CAAC;QAE7E,6CAA6C;QAC7C,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,QAAQ,EAAE;YACpC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;YAElD,sCAAsC;YACtC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,GAAG,GAAG,CAAC;gBAAE,SAAS;YAErD,gCAAgC;YAChC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,kBAAkB,CAAC;gBAAE,SAAS;YAEjE,wBAAwB;YACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACvC,IAAI,CAAC,QAAQ;gBAAE,SAAS;YAExB,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;YAC1E,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAE3D,4BAA4B;YAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAE9D,qBAAqB;YACrB,MAAM,EAAE,GAAG,WAAW;gBACpB,CAAC,CAAC,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,cAAc,IAAI,QAAQ,EAAE;gBACjE,CAAC,CAAC,GAAG,cAAc,IAAI,QAAQ,EAAE,CAAC;YAEpC,wEAAwE;YACxE,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,+BAA+B,CACnE,QAAQ,EACR,WAAW,EACX,UAAU,EACV,OAAO,EACP,MAAM,CACP,CAAC;YAEF,6BAA6B;YAC7B,IAAI,QAAQ,GAAuD;gBACjE,EAAE;gBACF,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;gBAClC,IAAI;gBACJ,QAAQ;gBACR,YAAY,EAAE,WAAW;oBACvB,CAAC,CAAC,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,cAAc,EAAE;oBACrD,CAAC,CAAC,cAAc;gBAClB,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,IAAI;gBAC1C,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,IAAI;gBAC1C,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;gBACvC,UAAU,EAAE,kBAAkB;aAC/B,CAAC;YAEF,0BAA0B;YAC1B,IAAI,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,UAAU,EAAE;gBAChD,IAAI;oBACF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBAC/C,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAC1C,QAAQ,GAAG,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAmC,CAAC;iBACrF;gBAAC,OAAO,KAAK,EAAE;oBACd,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI;wBACJ,KAAK,EAAE,qCAAsC,KAAe,CAAC,OAAO,EAAE;qBACvE,CAAC,CAAC;iBACJ;aACF;YAED,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SAC1B;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,+BAA+B,CAC3C,QAAkB,EAClB,WAAmB,EACnB,UAAqC,EACrC,OAAyB,EACzB,MAA8C;QAE9C,MAAM,UAAU,GAA6D,EAAE,CAAC;QAEhF,sDAAsD;QACtD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,QAAQ,EAAE;YACpC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;YAElD,8CAA8C;YAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACvD,IAAI,OAAO,KAAK,WAAW;gBAAE,SAAS;YAEtC,+CAA+C;YAC/C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAAE,SAAS;YAE3C,6BAA6B;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACvC,IAAI,CAAC,QAAQ;gBAAE,SAAS;YAExB,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YAEpD,4BAA4B;YAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAE9D,uCAAuC;YACvC,MAAM,gBAAgB,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAC5D,MAAM,EAAE,GAAG,WAAW;gBACpB,CAAC,CAAC,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,gBAAgB,IAAI,QAAQ,EAAE;gBACnE,CAAC,CAAC,GAAG,gBAAgB,IAAI,QAAQ,EAAE,CAAC;YAEtC,8BAA8B;YAC9B,IAAI,SAAS,GAAyD;gBACpE,EAAE;gBACF,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;gBAClC,IAAI;gBACJ,QAAQ;gBACR,IAAI,EAAE,MAAM;gBACZ,cAAc,EAAE,QAAQ;gBACxB,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,IAAI;gBAC1C,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,IAAI;gBAC1C,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;aACxC,CAAC;YAEF,0BAA0B;YAC1B,IAAI,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,UAAU,EAAE;gBAChD,IAAI;oBACF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBAC/C,SAAS,GAAG,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAoC,CAAC;iBAC9F;gBAAC,OAAO,KAAK,EAAE;oBACd,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI;wBACJ,KAAK,EAAE,sCAAuC,KAAe,CAAC,OAAO,EAAE;qBACxE,CAAC,CAAC;iBACJ;aACF;YAED,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SAC5B;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,yBAAyB,CACrC,QAAkB,EAClB,UAA8C;QAE9C,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC;QAE9B,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YACnC,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;SACzC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACjF,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAE1C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,QAAwB;QAC9C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAwB,CAAC;QAE5C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;YAC1B,+EAA+E;YAC/E,MAAM,cAAc,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAChE,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;SAC9B;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB,CAC/B,QAAkB,EAClB,UAAqC,EACrC,OAAyB,EACzB,MAA8C;QAE9C,MAAM,QAAQ,GAAuB,EAAE,CAAC;QAExC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,QAAQ,EAAE;YACpC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;YAElD,yCAAyC;YACzC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;gBAAE,SAAS;YAExC,0BAA0B;YAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,CAAC,QAAQ;gBAAE,SAAS;YAExB,4BAA4B;YAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAE9D,qBAAqB;YACrB,MAAM,EAAE,GAAG,WAAW;gBACpB,CAAC,CAAC,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,QAAQ,CAAC,QAAQ,EAAE;gBACxD,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAEtB,2BAA2B;YAC3B,MAAM,MAAM,GAAqB;gBAC/B,EAAE;gBACF,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAC3C,IAAI;gBACJ,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,IAAI;gBAC1C,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,IAAI;gBAC1C,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;aACxC,CAAC;YAEF,0BAA0B;YAC1B,IAAI,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,UAAU,EAAE;gBAChD,IAAI;oBACF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBAC/C,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAE1C,0DAA0D;oBAC1D,MAAM,iBAAiB,GAAG,MAAqC,CAAC;oBAChE,iBAAiB,CAAC,OAAO,GAAG,aAAa,CAAC;oBAE1C,6DAA6D;oBAC7D,IAAI,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE;wBAC9B,MAAM,CAAC,YAAY,GAAG,aAAa,CAAC,EAAE,CAAC,QAAQ,CAAC;qBACjD;iBACF;gBAAC,OAAO,KAAK,EAAE;oBACd,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI;wBACJ,KAAK,EAAE,mCAAoC,KAAe,CAAC,OAAO,EAAE;qBACrE,CAAC,CAAC;iBACJ;aACF;YAED,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SACvB;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH;;OAEG;IACK,aAAa,CAAC,IAAY;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE9B,qCAAqC;QACrC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,eAAe,CAAC,UAAU,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;YACjE,OAAO,IAAI,CAAC;SACb;QAED,sDAAsD;QACtD,IAAI,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE;YAC9C,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YACtD,+DAA+D;YAC/D,OAAO,KAAK,CAAC,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC;SACjC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,IAAY;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACvC,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE3B,gEAAgE;QAChE,IAAI,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE;YACrC,OAAO;gBACL,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;gBACjD,IAAI,EAAE,MAAM;aACb,CAAC;SACH;QAED,2CAA2C;QAC3C,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;YAChC,OAAO;gBACL,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC3C,IAAI,EAAE,SAAS;aAChB,CAAC;SACH;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,kBAAkB,CACxB,IAAY,EACZ,UAAqC;QAErC,yCAAyC;QACzC,IAAI,SAAS,GAAwB,IAAI,CAAC;QAC1C,IAAI,eAAe,GAAG,CAAC,CAAC;QAExB,KAAK,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,UAAU,EAAE;YACvC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC,EAAE;gBAClC,IAAI,OAAO,CAAC,MAAM,GAAG,eAAe,EAAE;oBACpC,SAAS,GAAG,GAAG,CAAC;oBAChB,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;iBAClC;aACF;SACF;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,QAAgB;QACpC,OAAO,QAAQ;aACZ,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aACzD,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED;;OAEG;IACK,wBAAwB,CAC9B,CAAgE,EAChE,CAAgE;QAEhE,iCAAiC;QACjC,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,WAAW;YAAE,OAAO,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,WAAW;YAAE,OAAO,CAAC,CAAC;QAE9C,8CAA8C;QAC9C,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,WAAW,EAAE;YAClC,MAAM,UAAU,GAAG,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;YAC9D,IAAI,UAAU,KAAK,CAAC;gBAAE,OAAO,UAAU,CAAC;SACzC;QAED,yCAAyC;QACzC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACK,sBAAsB,CAC5B,QAA4B,EAC5B,WAAuE,EACvE,MAA8C;QAE9C,wDAAwD;QACxD,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAEvE,8DAA8D;QAC9D,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE;YAC7B,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;gBACvC,+BAA+B;gBAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAChE,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACnC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;gBAE1D,oEAAoE;gBACpE,IAAI,OAAO,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,GAAG,CAAC,EAAE;oBAClD,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,KAAK,EAAE,+KAA+K;qBACvL,CAAC,CAAC;iBACJ;aACF;SACF;IACH,CAAC;;AAxhBuB,0BAAU,GAAG,kBAAkB,AAArB,CAAsB;AAChC,kCAAkB,GAAG,gBAAgB,AAAnB,CAAoB;SAFnD,eAAe"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@principal-ai/principal-view-core",
3
- "version": "0.16.0",
3
+ "version": "0.17.0",
4
4
  "description": "Core logic and types for graph-based principal view framework",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -133,213 +133,6 @@ describe('CanvasDiscovery', () => {
133
133
  expect(result.errors.some(e => e.path === '.principal-views/bad.canvas' && e.error.includes('DEPRECATED'))).toBe(true);
134
134
  });
135
135
 
136
- test('ignores canvas files in __executions__ directory', async () => {
137
- const fileTree = createMockFileTree([
138
- '.principal-views/__executions__/should-ignore.canvas',
139
- '.principal-views/should-include.canvas',
140
- ]);
141
-
142
- const result = await discovery.discover(fileTree);
143
-
144
- expect(result.canvases).toHaveLength(1);
145
- expect(result.canvases[0].basename).toBe('should-include');
146
- });
147
- });
148
-
149
- describe('discover() - Execution Files', () => {
150
- test('discovers execution files in .principal-views/__executions__', async () => {
151
- const fileTree = createMockFileTree([
152
- '.principal-views/__executions__/test-run.otel.json',
153
- '.principal-views/__executions__/api-test.otel.json',
154
- ]);
155
-
156
- const result = await discovery.discover(fileTree);
157
-
158
- expect(result.executions).toHaveLength(2);
159
- expect(result.executions[0]).toMatchObject({
160
- id: 'api-test',
161
- type: 'otel',
162
- canvasBasename: 'api-test',
163
- scope: 'root',
164
- });
165
- expect(result.executions[1]).toMatchObject({
166
- id: 'test-run',
167
- type: 'otel',
168
- canvasBasename: 'test-run',
169
- scope: 'root',
170
- });
171
- });
172
-
173
- test('discovers execution files in packages with package prefix', async () => {
174
- const fileTree = createMockFileTree([
175
- 'packages/core/.principal-views/__executions__/auth.otel.json',
176
- 'packages/api/.principal-views/__executions__/request.otel.json',
177
- 'packages/core/package.json',
178
- 'packages/api/package.json',
179
- ]);
180
-
181
- const result = await discovery.discover(fileTree, {
182
- fileReader: async (path) => {
183
- if (path.includes('core/package.json')) {
184
- return JSON.stringify({ name: 'core' });
185
- }
186
- if (path.includes('api/package.json')) {
187
- return JSON.stringify({ name: 'api' });
188
- }
189
- return '';
190
- },
191
- });
192
-
193
- expect(result.executions).toHaveLength(2);
194
- expect(result.executions.map(e => e.id)).toEqual([
195
- 'api/request',
196
- 'core/auth',
197
- ]);
198
- });
199
-
200
- test('discovers execution files in root __executions__', async () => {
201
- const fileTree = createMockFileTree([
202
- '__executions__/integration-test.otel.json',
203
- ]);
204
-
205
- const result = await discovery.discover(fileTree);
206
-
207
- expect(result.executions).toHaveLength(1);
208
- expect(result.executions[0]).toMatchObject({
209
- id: 'integration-test',
210
- scope: 'root',
211
- });
212
- });
213
-
214
- test('only discovers .otel.json execution files', async () => {
215
- const fileTree = createMockFileTree([
216
- '__executions__/test.otel.json',
217
- '__executions__/test.execution.json',
218
- '__executions__/test.events.json',
219
- ]);
220
-
221
- const result = await discovery.discover(fileTree);
222
-
223
- // Only .otel.json files should be discovered
224
- expect(result.executions).toHaveLength(1);
225
- expect(result.executions[0]).toMatchObject({
226
- id: 'test',
227
- type: 'otel',
228
- canvasBasename: 'test',
229
- });
230
- });
231
- });
232
-
233
- describe('findCanvasForExecution()', () => {
234
- test('finds matching canvas in same scope', async () => {
235
- const fileTree = createMockFileTree([
236
- '.principal-views/test-flow.otel.canvas',
237
- '.principal-views/__executions__/test-flow.otel.json',
238
- ]);
239
-
240
- const result = await discovery.discover(fileTree);
241
- const execution = result.executions[0];
242
-
243
- const canvas = discovery.findCanvasForExecution(execution, result.canvases);
244
-
245
- expect(canvas).toBeTruthy();
246
- expect(canvas?.basename).toBe('test-flow');
247
- });
248
-
249
- test('finds matching canvas in same package', async () => {
250
- const fileTree = createMockFileTree([
251
- 'packages/core/.principal-views/auth.otel.canvas',
252
- 'packages/core/.principal-views/__executions__/auth.otel.json',
253
- 'packages/core/package.json',
254
- ]);
255
-
256
- const result = await discovery.discover(fileTree, {
257
- fileReader: async (path) => {
258
- if (path.endsWith('package.json')) {
259
- return JSON.stringify({ name: 'core' });
260
- }
261
- return '';
262
- },
263
- });
264
-
265
- const execution = result.executions[0];
266
- const canvas = discovery.findCanvasForExecution(execution, result.canvases);
267
-
268
- expect(canvas).toBeTruthy();
269
- expect(canvas?.packageName).toBe('core');
270
- });
271
-
272
- test('does not match canvas in different package', async () => {
273
- const fileTree = createMockFileTree([
274
- 'packages/core/.principal-views/auth.canvas',
275
- 'packages/api/.principal-views/__executions__/auth.otel.json',
276
- 'packages/core/package.json',
277
- 'packages/api/package.json',
278
- ]);
279
-
280
- const result = await discovery.discover(fileTree, {
281
- fileReader: async (path) => {
282
- if (path.includes('core/package.json')) {
283
- return JSON.stringify({ name: 'core' });
284
- }
285
- if (path.includes('api/package.json')) {
286
- return JSON.stringify({ name: 'api' });
287
- }
288
- return '';
289
- },
290
- });
291
-
292
- const execution = result.executions[0];
293
- const canvas = discovery.findCanvasForExecution(execution, result.canvases);
294
-
295
- // Should not find match (different packages)
296
- expect(canvas).toBeNull();
297
- });
298
- });
299
-
300
- describe('findExecutionsForCanvas()', () => {
301
- test('finds all executions for a canvas', async () => {
302
- const fileTree = createMockFileTree([
303
- '.principal-views/test-flow.otel.canvas',
304
- '.principal-views/__executions__/test-flow.otel.json',
305
- ]);
306
-
307
- const result = await discovery.discover(fileTree);
308
- const canvas = result.canvases[0];
309
-
310
- const executions = discovery.findExecutionsForCanvas(canvas, result.executions);
311
-
312
- expect(executions).toHaveLength(1);
313
- expect(executions[0].canvasBasename).toBe('test-flow');
314
- });
315
-
316
- test('only returns executions in same package', async () => {
317
- const fileTree = createMockFileTree([
318
- 'packages/core/.principal-views/auth.canvas',
319
- 'packages/core/.principal-views/__executions__/auth.otel.json',
320
- 'packages/api/.principal-views/__executions__/auth.otel.json',
321
- 'packages/core/package.json',
322
- 'packages/api/package.json',
323
- ]);
324
-
325
- const result = await discovery.discover(fileTree, {
326
- fileReader: async (path) => {
327
- if (path.includes('core/package.json')) {
328
- return JSON.stringify({ name: 'core' });
329
- }
330
- if (path.includes('api/package.json')) {
331
- return JSON.stringify({ name: 'api' });
332
- }
333
- return '';
334
- },
335
- });
336
-
337
- const canvas = result.canvases.find(c => c.packageName === 'core')!;
338
- const executions = discovery.findExecutionsForCanvas(canvas, result.executions);
339
-
340
- expect(executions).toHaveLength(1);
341
- expect(executions[0].packageName).toBe('core');
342
- });
343
136
  });
344
137
 
345
138
  describe('caching', () => {
@@ -43,7 +43,6 @@ import type {
43
43
  */
44
44
  export class CanvasDiscovery {
45
45
  private static readonly CANVAS_DIR = '.principal-views';
46
- private static readonly EXECUTIONS_DIR = '__executions__';
47
46
  private static readonly WORKFLOW_EXTENSION = '.workflow.json';
48
47
 
49
48
  private packageModule: PackageLayerModule;
@@ -76,14 +75,20 @@ export class CanvasDiscovery {
76
75
  // 3. Discover canvas files
77
76
  const canvases = await this.discoverCanvasFiles(fileTree, packageMap, options, errors);
78
77
 
79
- // 4. Discover execution files
80
- const executions = await this.discoverExecutionFiles(fileTree, packageMap, options, errors);
78
+ // 4. Discover storyboards (hierarchical organization)
79
+ // Note: Executions are discovered as part of workflows, not separately
80
+ const storyboards = await this.discoverStoryboards(fileTree, packageMap, canvases, options, errors);
81
81
 
82
- // 5. Discover storyboards (hierarchical organization)
83
- const storyboards = await this.discoverStoryboards(fileTree, packageMap, canvases, executions, options, errors);
82
+ // 5. Collect all executions from workflows for backward compatibility
83
+ const executions: (DiscoveredExecution | DiscoveredExecutionWithContent)[] = [];
84
+ for (const storyboard of storyboards) {
85
+ for (const workflow of storyboard.workflows) {
86
+ executions.push(...workflow.executions);
87
+ }
88
+ }
84
89
 
85
- // 6. Detect legacy structures and add deprecation errors
86
- this.detectLegacyStructures(canvases, executions, storyboards, errors);
90
+ // 6. Detect legacy flat canvas structures and add deprecation errors
91
+ this.detectLegacyStructures(canvases, storyboards, errors);
87
92
 
88
93
  // 7. Sort results
89
94
  canvases.sort(this.compareByPackageThenName);
@@ -93,44 +98,6 @@ export class CanvasDiscovery {
93
98
  return { canvases, executions, storyboards, errors, warnings };
94
99
  }
95
100
 
96
- /**
97
- * Find canvas file for a given execution
98
- *
99
- * @param execution - Discovered execution
100
- * @param canvases - Array of discovered canvases (from discover())
101
- * @returns Matching canvas or null
102
- */
103
- findCanvasForExecution(
104
- execution: DiscoveredExecution,
105
- canvases: DiscoveredCanvas[]
106
- ): DiscoveredCanvas | null {
107
- // Find canvas with matching basename and scope
108
- return canvases.find(canvas =>
109
- canvas.basename === execution.canvasBasename &&
110
- canvas.scope === execution.scope &&
111
- canvas.packageName === execution.packageName
112
- ) || null;
113
- }
114
-
115
- /**
116
- * Find execution files for a given canvas
117
- *
118
- * @param canvas - Discovered canvas
119
- * @param executions - Array of discovered executions (from discover())
120
- * @returns Array of matching executions
121
- */
122
- findExecutionsForCanvas(
123
- canvas: DiscoveredCanvas,
124
- executions: DiscoveredExecution[]
125
- ): DiscoveredExecution[] {
126
- // Find all executions with matching basename and scope
127
- return executions.filter(execution =>
128
- execution.canvasBasename === canvas.basename &&
129
- execution.scope === canvas.scope &&
130
- execution.packageName === canvas.packageName
131
- );
132
- }
133
-
134
101
  /**
135
102
  * Clear package cache (useful when file tree changes)
136
103
  */
@@ -145,7 +112,6 @@ export class CanvasDiscovery {
145
112
  fileTree: FileTree,
146
113
  packageMap: Map<string, PackageLayer>,
147
114
  canvases: DiscoveredCanvas[],
148
- executions: (DiscoveredExecution | DiscoveredExecutionWithContent)[],
149
115
  options: DiscoveryOptions,
150
116
  errors: Array<{ path: string; error: string }>
151
117
  ): Promise<(DiscoveredStoryboard | DiscoveredStoryboardWithContent)[]> {
@@ -176,8 +142,8 @@ export class CanvasDiscovery {
176
142
  // For each potential storyboard directory, check if it has a canvas
177
143
  for (const [storyboardPath, storyboardNames] of storyboardDirs) {
178
144
  for (const storyboardName of storyboardNames) {
179
- // Skip __executions__ directory
180
- if (storyboardName === CanvasDiscovery.EXECUTIONS_DIR) continue;
145
+ // Skip __executions__ directory (legacy pattern, should not exist)
146
+ if (storyboardName === '__executions__') continue;
181
147
 
182
148
  // Find canvas for this storyboard
183
149
  const storyboardCanvas = canvases.find(c => {
@@ -193,7 +159,6 @@ export class CanvasDiscovery {
193
159
  storyboardPath,
194
160
  storyboardName,
195
161
  packageMap,
196
- executions,
197
162
  options,
198
163
  errors
199
164
  );
@@ -234,7 +199,6 @@ export class CanvasDiscovery {
234
199
  storyboardPath: string,
235
200
  storyboardName: string,
236
201
  packageMap: Map<string, PackageLayer>,
237
- executions: (DiscoveredExecution | DiscoveredExecutionWithContent)[],
238
202
  options: DiscoveryOptions,
239
203
  errors: Array<{ path: string; error: string }>
240
204
  ): Promise<(DiscoveredWorkflow | DiscoveredWorkflowWithContent)[]> {
@@ -265,11 +229,14 @@ export class CanvasDiscovery {
265
229
  ? `${packageInfo.packageData.name}/${storyboardName}/${basename}`
266
230
  : `${storyboardName}/${basename}`;
267
231
 
268
- // Find executions for this workflow (in the same directory as workflow.json)
269
- const workflowExecutions = executions.filter(e => {
270
- const execDir = e.path.split('/').slice(0, -1).join('/');
271
- return execDir === workflowDir;
272
- });
232
+ // Discover executions co-located in the same directory as workflow.json
233
+ const workflowExecutions = await this.discoverExecutionsInWorkflowDir(
234
+ fileTree,
235
+ workflowDir,
236
+ packageMap,
237
+ options,
238
+ errors
239
+ );
273
240
 
274
241
  // Create discovered workflow
275
242
  let workflow: DiscoveredWorkflow | DiscoveredWorkflowWithContent = {
@@ -306,6 +273,76 @@ export class CanvasDiscovery {
306
273
  return workflows;
307
274
  }
308
275
 
276
+ /**
277
+ * Discover execution files co-located in a workflow directory
278
+ */
279
+ private async discoverExecutionsInWorkflowDir(
280
+ fileTree: FileTree,
281
+ workflowDir: string,
282
+ packageMap: Map<string, PackageLayer>,
283
+ options: DiscoveryOptions,
284
+ errors: Array<{ path: string; error: string }>
285
+ ): Promise<(DiscoveredExecution | DiscoveredExecutionWithContent)[]> {
286
+ const executions: (DiscoveredExecution | DiscoveredExecutionWithContent)[] = [];
287
+
288
+ // Find all .otel.json files in the workflow directory
289
+ for (const file of fileTree.allFiles) {
290
+ const path = file.relativePath || file.path || '';
291
+
292
+ // Check if file is in this workflow directory
293
+ const fileDir = path.split('/').slice(0, -1).join('/');
294
+ if (fileDir !== workflowDir) continue;
295
+
296
+ // Check if it's an execution file (.otel.json)
297
+ if (!path.endsWith('.otel.json')) continue;
298
+
299
+ // Extract execution metadata
300
+ const filename = path.split('/').pop();
301
+ if (!filename) continue;
302
+
303
+ const basename = filename.replace('.otel.json', '');
304
+
305
+ // Determine package context
306
+ const packageInfo = this.findPackageForPath(path, packageMap);
307
+
308
+ // Generate unique ID (workflow-scoped)
309
+ const workflowBasename = workflowDir.split('/').pop() || '';
310
+ const id = packageInfo
311
+ ? `${packageInfo.packageData.name}/${workflowBasename}/${basename}`
312
+ : `${workflowBasename}/${basename}`;
313
+
314
+ // Create discovered execution
315
+ let execution: DiscoveredExecution | DiscoveredExecutionWithContent = {
316
+ id,
317
+ name: this.toDisplayName(basename),
318
+ path,
319
+ basename,
320
+ type: 'otel',
321
+ canvasBasename: basename, // For backward compatibility
322
+ packageName: packageInfo?.packageData.name,
323
+ packagePath: packageInfo?.packageData.path,
324
+ scope: packageInfo ? 'package' : 'root',
325
+ };
326
+
327
+ // Optionally load content
328
+ if (options.includeContent && options.fileReader) {
329
+ try {
330
+ const content = await options.fileReader(path);
331
+ execution = { ...execution, content: JSON.parse(content) } as DiscoveredExecutionWithContent;
332
+ } catch (error) {
333
+ errors.push({
334
+ path,
335
+ error: `Failed to parse execution content: ${(error as Error).message}`,
336
+ });
337
+ }
338
+ }
339
+
340
+ executions.push(execution);
341
+ }
342
+
343
+ return executions;
344
+ }
345
+
309
346
  /**
310
347
  * Discover packages with caching by fileTree SHA
311
348
  */
@@ -412,66 +449,8 @@ export class CanvasDiscovery {
412
449
  /**
413
450
  * Discover execution files in the file tree
414
451
  */
415
- private async discoverExecutionFiles(
416
- fileTree: FileTree,
417
- packageMap: Map<string, PackageLayer>,
418
- options: DiscoveryOptions,
419
- errors: Array<{ path: string; error: string }>
420
- ): Promise<(DiscoveredExecution | DiscoveredExecutionWithContent)[]> {
421
- const executions: (DiscoveredExecution | DiscoveredExecutionWithContent)[] = [];
422
-
423
- for (const file of fileTree.allFiles) {
424
- const path = file.relativePath || file.path || '';
425
-
426
- // Check if in __executions__ directory
427
- if (!this.isInExecutionsDir(path)) continue;
428
-
429
- // Extract execution metadata
430
- const metadata = this.parseExecutionPath(path);
431
- if (!metadata) continue;
432
-
433
- // Determine package context
434
- const packageInfo = this.findPackageForPath(path, packageMap);
435
-
436
- // Generate unique ID
437
- const id = packageInfo
438
- ? `${packageInfo.packageData.name}/${metadata.basename}`
439
- : metadata.basename;
440
-
441
- // Create discovered execution
442
- let execution: DiscoveredExecution | DiscoveredExecutionWithContent = {
443
- id,
444
- name: this.toDisplayName(metadata.basename),
445
- path,
446
- basename: metadata.basename,
447
- type: metadata.type,
448
- canvasBasename: metadata.canvasBasename,
449
- packageName: packageInfo?.packageData.name,
450
- packagePath: packageInfo?.packageData.path,
451
- scope: packageInfo ? 'package' : 'root',
452
- };
453
-
454
- // Optionally load content
455
- if (options.includeContent && options.fileReader) {
456
- try {
457
- const content = await options.fileReader(path);
458
- execution = { ...execution, content: JSON.parse(content) } as DiscoveredExecutionWithContent;
459
- } catch (error) {
460
- errors.push({
461
- path,
462
- error: `Failed to parse execution content: ${(error as Error).message}`,
463
- });
464
- }
465
- }
466
-
467
- executions.push(execution);
468
- }
469
-
470
- return executions;
471
- }
472
-
473
452
  /**
474
- * Check if path is in .principal-views directory
453
+ * Check if path is in .principal-views directory (directly, not in subdirectories)
475
454
  */
476
455
  private isInCanvasDir(path: string): boolean {
477
456
  const parts = path.split('/');
@@ -484,8 +463,8 @@ export class CanvasDiscovery {
484
463
  // Package: packages/core/.principal-views/file.canvas
485
464
  if (parts.includes(CanvasDiscovery.CANVAS_DIR)) {
486
465
  const idx = parts.indexOf(CanvasDiscovery.CANVAS_DIR);
487
- // Ensure it's not in __executions__ subdirectory
488
- return !parts.includes(CanvasDiscovery.EXECUTIONS_DIR, idx);
466
+ // Must be directly in .principal-views/, not in a subdirectory
467
+ return parts.length === idx + 2;
489
468
  }
490
469
 
491
470
  return false;
@@ -517,49 +496,6 @@ export class CanvasDiscovery {
517
496
  return null;
518
497
  }
519
498
 
520
- /**
521
- * Check if path is in __executions__ directory
522
- */
523
- private isInExecutionsDir(path: string): boolean {
524
- const parts = path.split('/');
525
-
526
- // Must contain __executions__ directory
527
- if (!parts.includes(CanvasDiscovery.EXECUTIONS_DIR)) return false;
528
-
529
- // Valid patterns:
530
- // 1. .principal-views/__executions__/file.otel.json
531
- // 2. packages/core/.principal-views/__executions__/file.otel.json
532
- // 3. __executions__/file.otel.json (root level)
533
-
534
- return true;
535
- }
536
-
537
- /**
538
- * Parse execution file path to extract metadata
539
- * Only .otel.json files are supported
540
- */
541
- private parseExecutionPath(path: string): {
542
- basename: string;
543
- type: ExecutionType;
544
- canvasBasename: string;
545
- } | null {
546
- const filename = path.split('/').pop();
547
- if (!filename) return null;
548
-
549
- // Pattern: name.otel.json
550
- const match = filename.match(/^(.+)\.otel\.json$/);
551
- if (match) {
552
- const basename = match[1];
553
- return {
554
- basename,
555
- type: 'otel',
556
- canvasBasename: basename, // Same as basename for linking
557
- };
558
- }
559
-
560
- return null;
561
- }
562
-
563
499
  /**
564
500
  * Find package for a given path using longest-path matching
565
501
  */
@@ -615,27 +551,16 @@ export class CanvasDiscovery {
615
551
  }
616
552
 
617
553
  /**
618
- * Detect legacy flat structures and add deprecation errors
554
+ * Detect legacy flat canvas structures and add deprecation errors
619
555
  */
620
556
  private detectLegacyStructures(
621
557
  canvases: DiscoveredCanvas[],
622
- executions: (DiscoveredExecution | DiscoveredExecutionWithContent)[],
623
558
  storyboards: (DiscoveredStoryboard | DiscoveredStoryboardWithContent)[],
624
559
  errors: Array<{ path: string; error: string }>
625
560
  ): void {
626
561
  // Build a set of storyboard canvas IDs for quick lookup
627
562
  const storyboardCanvasIds = new Set(storyboards.map(s => s.canvas.id));
628
563
 
629
- // Build a set of execution IDs that are part of storyboards
630
- const storyboardExecutionIds = new Set<string>();
631
- for (const storyboard of storyboards) {
632
- for (const workflow of storyboard.workflows) {
633
- for (const execution of workflow.executions) {
634
- storyboardExecutionIds.add(execution.id);
635
- }
636
- }
637
- }
638
-
639
564
  // Check for legacy flat canvases (not part of any storyboard)
640
565
  for (const canvas of canvases) {
641
566
  if (!storyboardCanvasIds.has(canvas.id)) {
@@ -653,18 +578,5 @@ export class CanvasDiscovery {
653
578
  }
654
579
  }
655
580
  }
656
-
657
- // Check for legacy executions in __executions__/ directory
658
- for (const execution of executions) {
659
- if (!storyboardExecutionIds.has(execution.id)) {
660
- // Check if this execution is in __executions__/ directory
661
- if (execution.path.includes(`/${CanvasDiscovery.EXECUTIONS_DIR}/`)) {
662
- errors.push({
663
- path: execution.path,
664
- error: 'DEPRECATED: Legacy __executions__/ directory is no longer supported. Migrate executions to workflow folders within storyboards immediately. See migration guide at docs/MIGRATION_GUIDE.md for details.',
665
- });
666
- }
667
- }
668
- }
669
581
  }
670
582
  }