@principal-ai/principal-view-core 0.5.17 → 0.6.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.
package/dist/index.d.ts CHANGED
@@ -13,6 +13,8 @@ export { PathBasedEventProcessor } from './PathBasedEventProcessor';
13
13
  export type { LogEntry } from './PathBasedEventProcessor';
14
14
  export { PathMatcher } from './utils/PathMatcher';
15
15
  export { GraphConverter } from './utils/GraphConverter';
16
+ export { ExecutionFileDiscovery } from './utils/ExecutionFileDiscovery';
17
+ export type { ExecutionFile, CanvasFile, PackageContext, ExecutionMetadata, ExecutionSpan, ExecutionArtifact, FileTreeEntry, DiscoveryOptions, } from './utils/ExecutionFileDiscovery';
16
18
  export * from './types/canvas';
17
19
  export { CanvasConverter } from './utils/CanvasConverter';
18
20
  export type { ReactFlowNode, ReactFlowEdge } from './utils/CanvasConverter';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,YAAY,EACV,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAGlF,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,YAAY,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAG1D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG5E,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAC3G,YAAY,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAGpE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG5G,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACjG,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAG7F,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACzE,YAAY,EACV,SAAS,EACT,WAAW,EACX,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EACV,aAAa,EACb,aAAa,EACb,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACV,eAAe,EACf,WAAW,EACX,WAAW,EACX,YAAY,EACZ,UAAU,EACV,eAAe,EACf,eAAe,EACf,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,0BAA0B,GAC3B,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AACtF,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGrF,YAAY,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAGjF,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -15,6 +15,8 @@ export { PathBasedEventProcessor } from './PathBasedEventProcessor';
15
15
  // Export path utilities
16
16
  export { PathMatcher } from './utils/PathMatcher';
17
17
  export { GraphConverter } from './utils/GraphConverter';
18
+ // Export execution file discovery
19
+ export { ExecutionFileDiscovery } from './utils/ExecutionFileDiscovery';
18
20
  // Export Canvas types and converter
19
21
  export * from './types/canvas';
20
22
  export { CanvasConverter } from './utils/CanvasConverter';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,mBAAmB;AACnB,cAAc,SAAS,CAAC;AAExB,sBAAsB;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAMlE,iBAAiB;AACjB,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAElF,iDAAiD;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAGpE,wBAAwB;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,oCAAoC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG1D,oCAAoC;AACpC,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAG3G,qCAAqC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,yBAAyB;AACzB,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGjG,oCAAoC;AACpC,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAQzE,qDAAqD;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAYlD,gCAAgC;AAChC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAqB9D,+DAA+D;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAGtF,mCAAmC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAK5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAEjF,sBAAsB;AACtB,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,mBAAmB;AACnB,cAAc,SAAS,CAAC;AAExB,sBAAsB;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAMlE,iBAAiB;AACjB,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAElF,iDAAiD;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAGpE,wBAAwB;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,kCAAkC;AAClC,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAYxE,oCAAoC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG1D,oCAAoC;AACpC,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAG3G,qCAAqC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,yBAAyB;AACzB,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGjG,oCAAoC;AACpC,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAQzE,qDAAqD;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAYlD,gCAAgC;AAChC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAqB9D,+DAA+D;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAGtF,mCAAmC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAK5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAEjF,sBAAsB;AACtB,cAAc,SAAS,CAAC"}
@@ -0,0 +1,205 @@
1
+ /**
2
+ * Execution File Discovery
3
+ *
4
+ * Discovers execution artifacts and canvas files in a repository with monorepo awareness.
5
+ * Uses codebase-composition to intelligently detect package boundaries and workspace patterns.
6
+ */
7
+ /**
8
+ * Represents a discovered execution artifact file
9
+ */
10
+ export interface ExecutionFile {
11
+ /** Unique identifier for this execution */
12
+ id: string;
13
+ /** Display name for this execution */
14
+ name: string;
15
+ /** Full file path (relative to repository root) */
16
+ path: string;
17
+ /** Canvas basename (without extension) that this execution is linked to */
18
+ canvasBasename: string;
19
+ /** Package context if this execution belongs to a specific package */
20
+ packageContext?: PackageContext;
21
+ }
22
+ /**
23
+ * Represents a discovered canvas file
24
+ */
25
+ export interface CanvasFile {
26
+ /** Unique identifier for this canvas */
27
+ id: string;
28
+ /** Display name for this canvas */
29
+ name: string;
30
+ /** Full file path (relative to repository root) */
31
+ path: string;
32
+ /** Canvas basename (without .otel.canvas or .canvas extension) */
33
+ basename: string;
34
+ /** Package context if this canvas belongs to a specific package */
35
+ packageContext?: PackageContext;
36
+ }
37
+ /**
38
+ * Package context for execution/canvas files
39
+ */
40
+ export interface PackageContext {
41
+ /** Package name (from package.json, Cargo.toml, etc.) */
42
+ name: string;
43
+ /** Package directory path (relative to repository root) */
44
+ packagePath: string;
45
+ /** Package type (npm, cargo, go, etc.) */
46
+ packageType?: string;
47
+ }
48
+ /**
49
+ * Execution artifact metadata
50
+ */
51
+ export interface ExecutionMetadata {
52
+ name: string;
53
+ canvasName?: string;
54
+ exportedAt?: string;
55
+ source?: string;
56
+ framework?: string;
57
+ status?: 'success' | 'error' | 'OK';
58
+ spanCount: number;
59
+ eventCount: number;
60
+ }
61
+ /**
62
+ * Execution span structure
63
+ */
64
+ export interface ExecutionSpan {
65
+ id: string;
66
+ name: string;
67
+ startTime: number;
68
+ endTime?: number;
69
+ duration?: number;
70
+ status?: string;
71
+ attributes?: Record<string, any>;
72
+ events: Array<{
73
+ time: number;
74
+ name: string;
75
+ attributes?: Record<string, any>;
76
+ }>;
77
+ }
78
+ /**
79
+ * Execution artifact file structure
80
+ */
81
+ export interface ExecutionArtifact {
82
+ metadata?: {
83
+ canvasName?: string;
84
+ exportedAt?: string;
85
+ source?: string;
86
+ framework?: string;
87
+ status?: 'success' | 'error';
88
+ };
89
+ spans: ExecutionSpan[];
90
+ }
91
+ /**
92
+ * File tree entry for discovery
93
+ */
94
+ export interface FileTreeEntry {
95
+ path?: string;
96
+ relativePath?: string;
97
+ name?: string;
98
+ }
99
+ /**
100
+ * Options for execution file discovery
101
+ */
102
+ export interface DiscoveryOptions {
103
+ /** Whether to include package-level .principal-views folders */
104
+ includePackagePrincipalViews?: boolean;
105
+ /** Custom execution folder names (defaults to ['__executions__']) */
106
+ executionFolders?: string[];
107
+ /** Custom canvas extensions (defaults to ['.otel.canvas']) */
108
+ canvasExtensions?: string[];
109
+ }
110
+ /**
111
+ * Execution File Discovery Engine
112
+ *
113
+ * Discovers execution artifacts and canvas files using monorepo-aware logic.
114
+ */
115
+ export declare class ExecutionFileDiscovery {
116
+ private packageLayerModule;
117
+ private options;
118
+ constructor(options?: DiscoveryOptions);
119
+ /**
120
+ * Find all execution artifact files in the repository
121
+ */
122
+ findExecutionFiles(files: FileTreeEntry[]): Promise<ExecutionFile[]>;
123
+ /**
124
+ * Find all canvas files in the repository
125
+ */
126
+ findCanvasFiles(files: FileTreeEntry[]): Promise<CanvasFile[]>;
127
+ /**
128
+ * Find execution artifact for a given canvas
129
+ * Now package-aware - can disambiguate between packages
130
+ */
131
+ findExecutionForCanvas(canvas: CanvasFile, executionFiles: ExecutionFile[]): ExecutionFile | null;
132
+ /**
133
+ * Find canvas file for a given execution
134
+ */
135
+ findCanvasForExecution(execution: ExecutionFile, canvasFiles: CanvasFile[]): CanvasFile | null;
136
+ /**
137
+ * Parse execution artifact JSON
138
+ */
139
+ static parseExecutionArtifact(content: string): ExecutionArtifact;
140
+ /**
141
+ * Get spans from an artifact
142
+ */
143
+ static getSpans(artifact: ExecutionArtifact): ExecutionSpan[];
144
+ /**
145
+ * Extract metadata from an execution artifact
146
+ */
147
+ static getExecutionMetadata(artifact: ExecutionArtifact): ExecutionMetadata;
148
+ /**
149
+ * Detect packages using codebase-composition
150
+ */
151
+ private detectPackages;
152
+ /**
153
+ * Convert file entries to file tree format for codebase-composition
154
+ */
155
+ private convertToFileTree;
156
+ /**
157
+ * Find executions in a specific package
158
+ */
159
+ private findExecutionsInPackage;
160
+ /**
161
+ * Find executions in root-level locations
162
+ */
163
+ private findExecutionsInRoot;
164
+ /**
165
+ * Find canvas files in a specific directory
166
+ */
167
+ private findCanvasesInDirectory;
168
+ /**
169
+ * Create package context from PackageLayer
170
+ */
171
+ private createPackageContext;
172
+ /**
173
+ * Check if filename is an execution file
174
+ */
175
+ private isExecutionFile;
176
+ /**
177
+ * Check if filename is a canvas file
178
+ */
179
+ private isCanvasFile;
180
+ /**
181
+ * Extract basename from execution filename
182
+ */
183
+ private extractExecutionBasename;
184
+ /**
185
+ * Extract basename from canvas filename
186
+ */
187
+ private extractCanvasBasename;
188
+ /**
189
+ * Format display name from basename (kebab-case to Title Case)
190
+ */
191
+ private formatDisplayName;
192
+ /**
193
+ * Generate unique ID for execution file
194
+ */
195
+ private generateExecutionId;
196
+ /**
197
+ * Generate unique ID for canvas file
198
+ */
199
+ private generateCanvasId;
200
+ /**
201
+ * Sort execution files by package name, then by basename
202
+ */
203
+ private sortExecutionFiles;
204
+ }
205
+ //# sourceMappingURL=ExecutionFileDiscovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecutionFileDiscovery.d.ts","sourceRoot":"","sources":["../../src/utils/ExecutionFileDiscovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,2CAA2C;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,cAAc,EAAE,MAAM,CAAC;IACvB,sEAAsE;IACtE,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,IAAI,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,MAAM,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAClC,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE;QACT,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;KAC9B,CAAC;IACF,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gEAAgE;IAChE,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,qEAAqE;IACrE,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,8DAA8D;IAC9D,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED;;;;GAIG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,OAAO,CAA6B;gBAEhC,OAAO,GAAE,gBAAqB;IAS1C;;OAEG;IACG,kBAAkB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAoB1E;;OAEG;IACG,eAAe,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IA0BpE;;;OAGG;IACH,sBAAsB,CACpB,MAAM,EAAE,UAAU,EAClB,cAAc,EAAE,aAAa,EAAE,GAC9B,aAAa,GAAG,IAAI;IAevB;;OAEG;IACH,sBAAsB,CACpB,SAAS,EAAE,aAAa,EACxB,WAAW,EAAE,UAAU,EAAE,GACxB,UAAU,GAAG,IAAI;IAepB;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB;IASjE;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,GAAG,aAAa,EAAE;IAI7D;;OAEG;IACH,MAAM,CAAC,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,iBAAiB;IAkC3E;;OAEG;YACW,cAAc;IAa5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA+B/B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAyC5B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA0B/B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAQ5B;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAIhC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAS7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAOzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAO3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAgB3B"}
@@ -0,0 +1,339 @@
1
+ /**
2
+ * Execution File Discovery
3
+ *
4
+ * Discovers execution artifacts and canvas files in a repository with monorepo awareness.
5
+ * Uses codebase-composition to intelligently detect package boundaries and workspace patterns.
6
+ */
7
+ import { PackageLayerModule } from '@principal-ai/codebase-composition';
8
+ /**
9
+ * Execution File Discovery Engine
10
+ *
11
+ * Discovers execution artifacts and canvas files using monorepo-aware logic.
12
+ */
13
+ export class ExecutionFileDiscovery {
14
+ constructor(options = {}) {
15
+ this.packageLayerModule = new PackageLayerModule();
16
+ this.options = {
17
+ includePackagePrincipalViews: options.includePackagePrincipalViews ?? true,
18
+ executionFolders: options.executionFolders ?? ['__executions__'],
19
+ canvasExtensions: options.canvasExtensions ?? ['.otel.canvas'],
20
+ };
21
+ }
22
+ /**
23
+ * Find all execution artifact files in the repository
24
+ */
25
+ async findExecutionFiles(files) {
26
+ const executionFiles = [];
27
+ // Detect packages in the repository
28
+ const packages = await this.detectPackages(files);
29
+ // Search for execution files in each package
30
+ for (const pkg of packages) {
31
+ const pkgExecutions = this.findExecutionsInPackage(pkg, files);
32
+ executionFiles.push(...pkgExecutions);
33
+ }
34
+ // Search in root-level locations
35
+ const rootExecutions = this.findExecutionsInRoot(files);
36
+ executionFiles.push(...rootExecutions);
37
+ // Sort by package name, then by basename
38
+ return this.sortExecutionFiles(executionFiles);
39
+ }
40
+ /**
41
+ * Find all canvas files in the repository
42
+ */
43
+ async findCanvasFiles(files) {
44
+ const canvasFiles = [];
45
+ // Detect packages in the repository
46
+ const packages = await this.detectPackages(files);
47
+ // Search for canvas files in root .principal-views/
48
+ const rootCanvases = this.findCanvasesInDirectory('.principal-views', files);
49
+ canvasFiles.push(...rootCanvases);
50
+ // Search for canvas files in package-level .principal-views/ if enabled
51
+ if (this.options.includePackagePrincipalViews) {
52
+ for (const pkg of packages) {
53
+ const pkgCanvases = this.findCanvasesInDirectory(`${pkg.packageData.path}/.principal-views`, files, this.createPackageContext(pkg));
54
+ canvasFiles.push(...pkgCanvases);
55
+ }
56
+ }
57
+ // Sort by name
58
+ return canvasFiles.sort((a, b) => a.name.localeCompare(b.name));
59
+ }
60
+ /**
61
+ * Find execution artifact for a given canvas
62
+ * Now package-aware - can disambiguate between packages
63
+ */
64
+ findExecutionForCanvas(canvas, executionFiles) {
65
+ // First, try exact package match if canvas has package context
66
+ if (canvas.packageContext) {
67
+ const exactMatch = executionFiles.find(exec => exec.canvasBasename === canvas.basename &&
68
+ exec.packageContext?.name === canvas.packageContext?.name);
69
+ if (exactMatch)
70
+ return exactMatch;
71
+ }
72
+ // Fallback to basename-only match (for root-level canvases)
73
+ return executionFiles.find(exec => exec.canvasBasename === canvas.basename) || null;
74
+ }
75
+ /**
76
+ * Find canvas file for a given execution
77
+ */
78
+ findCanvasForExecution(execution, canvasFiles) {
79
+ // First, try exact package match if execution has package context
80
+ if (execution.packageContext) {
81
+ const exactMatch = canvasFiles.find(canvas => canvas.basename === execution.canvasBasename &&
82
+ canvas.packageContext?.name === execution.packageContext?.name);
83
+ if (exactMatch)
84
+ return exactMatch;
85
+ }
86
+ // Fallback to basename-only match (for root-level executions)
87
+ return canvasFiles.find(canvas => canvas.basename === execution.canvasBasename) || null;
88
+ }
89
+ /**
90
+ * Parse execution artifact JSON
91
+ */
92
+ static parseExecutionArtifact(content) {
93
+ try {
94
+ const parsed = JSON.parse(content);
95
+ return parsed;
96
+ }
97
+ catch (error) {
98
+ throw new Error(`Failed to parse execution artifact JSON: ${error.message}`);
99
+ }
100
+ }
101
+ /**
102
+ * Get spans from an artifact
103
+ */
104
+ static getSpans(artifact) {
105
+ return artifact.spans || [];
106
+ }
107
+ /**
108
+ * Extract metadata from an execution artifact
109
+ */
110
+ static getExecutionMetadata(artifact) {
111
+ const spans = ExecutionFileDiscovery.getSpans(artifact);
112
+ const spanCount = spans.length;
113
+ const eventCount = spans.reduce((total, span) => {
114
+ return total + (span.events?.length || 0);
115
+ }, 0);
116
+ const metadata = artifact.metadata;
117
+ let status = 'success';
118
+ if (metadata?.status) {
119
+ status = metadata.status;
120
+ }
121
+ else if (spans.length > 0) {
122
+ const hasError = spans.some(s => s.status === 'ERROR' || s.status === 'error' || s.status === 'FAILED');
123
+ status = hasError ? 'error' : 'OK';
124
+ }
125
+ return {
126
+ name: metadata?.canvasName || 'Untitled Execution',
127
+ canvasName: metadata?.canvasName,
128
+ exportedAt: metadata?.exportedAt,
129
+ source: metadata?.source,
130
+ framework: metadata?.framework,
131
+ status,
132
+ spanCount,
133
+ eventCount,
134
+ };
135
+ }
136
+ // Private helper methods
137
+ /**
138
+ * Detect packages using codebase-composition
139
+ */
140
+ async detectPackages(files) {
141
+ try {
142
+ // Convert files to the format expected by codebase-composition
143
+ const fileTree = this.convertToFileTree(files);
144
+ const packages = await this.packageLayerModule.discoverPackages(fileTree);
145
+ return packages || [];
146
+ }
147
+ catch (error) {
148
+ // If package detection fails, continue with fallback patterns
149
+ console.warn('Package detection failed, using fallback patterns:', error);
150
+ return [];
151
+ }
152
+ }
153
+ /**
154
+ * Convert file entries to file tree format for codebase-composition
155
+ */
156
+ convertToFileTree(files) {
157
+ // This is a simplified conversion - codebase-composition expects a specific format
158
+ // In practice, the caller should provide a proper FileTree from repository-abstraction
159
+ return {
160
+ files: files.map(f => ({
161
+ path: f.relativePath || f.path || '',
162
+ name: f.name || (f.relativePath || f.path || '').split('/').pop() || '',
163
+ })),
164
+ };
165
+ }
166
+ /**
167
+ * Find executions in a specific package
168
+ */
169
+ findExecutionsInPackage(pkg, files) {
170
+ const executions = [];
171
+ const pkgPath = pkg.packageData.path || '';
172
+ const packageContext = this.createPackageContext(pkg);
173
+ for (const execFolder of this.options.executionFolders) {
174
+ const execPath = pkgPath ? `${pkgPath}/${execFolder}` : execFolder;
175
+ for (const file of files) {
176
+ const filePath = file.relativePath || file.path || '';
177
+ const fileName = file.name || filePath.split('/').pop() || '';
178
+ if (filePath.startsWith(execPath + '/') && this.isExecutionFile(fileName)) {
179
+ const basename = this.extractExecutionBasename(fileName);
180
+ executions.push({
181
+ id: this.generateExecutionId(basename, packageContext),
182
+ name: this.formatDisplayName(basename),
183
+ path: filePath,
184
+ canvasBasename: basename,
185
+ packageContext,
186
+ });
187
+ }
188
+ }
189
+ }
190
+ return executions;
191
+ }
192
+ /**
193
+ * Find executions in root-level locations
194
+ */
195
+ findExecutionsInRoot(files) {
196
+ const executions = [];
197
+ // Root __executions__/
198
+ for (const execFolder of this.options.executionFolders) {
199
+ for (const file of files) {
200
+ const filePath = file.relativePath || file.path || '';
201
+ const fileName = file.name || filePath.split('/').pop() || '';
202
+ if (filePath.startsWith(`${execFolder}/`) && this.isExecutionFile(fileName)) {
203
+ const basename = this.extractExecutionBasename(fileName);
204
+ executions.push({
205
+ id: `root-${basename}`,
206
+ name: this.formatDisplayName(basename),
207
+ path: filePath,
208
+ canvasBasename: basename,
209
+ });
210
+ }
211
+ }
212
+ }
213
+ // .principal-views/__executions__/
214
+ const pvExecPath = '.principal-views/__executions__';
215
+ for (const file of files) {
216
+ const filePath = file.relativePath || file.path || '';
217
+ const fileName = file.name || filePath.split('/').pop() || '';
218
+ if (filePath.startsWith(pvExecPath + '/') && this.isExecutionFile(fileName)) {
219
+ const basename = this.extractExecutionBasename(fileName);
220
+ executions.push({
221
+ id: `pv-${basename}`,
222
+ name: this.formatDisplayName(basename),
223
+ path: filePath,
224
+ canvasBasename: basename,
225
+ });
226
+ }
227
+ }
228
+ return executions;
229
+ }
230
+ /**
231
+ * Find canvas files in a specific directory
232
+ */
233
+ findCanvasesInDirectory(directory, files, packageContext) {
234
+ const canvases = [];
235
+ for (const file of files) {
236
+ const filePath = file.relativePath || file.path || '';
237
+ const fileName = file.name || filePath.split('/').pop() || '';
238
+ if (filePath.startsWith(directory + '/') && this.isCanvasFile(fileName)) {
239
+ const basename = this.extractCanvasBasename(fileName);
240
+ canvases.push({
241
+ id: this.generateCanvasId(basename, packageContext),
242
+ name: this.formatDisplayName(basename),
243
+ path: filePath,
244
+ basename,
245
+ packageContext,
246
+ });
247
+ }
248
+ }
249
+ return canvases;
250
+ }
251
+ /**
252
+ * Create package context from PackageLayer
253
+ */
254
+ createPackageContext(pkg) {
255
+ return {
256
+ name: pkg.packageData.name || 'unknown',
257
+ packagePath: pkg.packageData.path || '',
258
+ packageType: pkg.type,
259
+ };
260
+ }
261
+ /**
262
+ * Check if filename is an execution file
263
+ */
264
+ isExecutionFile(filename) {
265
+ return /\.(spans|execution|events)\.json$/.test(filename);
266
+ }
267
+ /**
268
+ * Check if filename is a canvas file
269
+ */
270
+ isCanvasFile(filename) {
271
+ return this.options.canvasExtensions.some(ext => filename.endsWith(ext));
272
+ }
273
+ /**
274
+ * Extract basename from execution filename
275
+ */
276
+ extractExecutionBasename(filename) {
277
+ return filename.replace(/\.(spans|execution|events)\.json$/, '');
278
+ }
279
+ /**
280
+ * Extract basename from canvas filename
281
+ */
282
+ extractCanvasBasename(filename) {
283
+ for (const ext of this.options.canvasExtensions) {
284
+ if (filename.endsWith(ext)) {
285
+ return filename.slice(0, -ext.length);
286
+ }
287
+ }
288
+ return filename;
289
+ }
290
+ /**
291
+ * Format display name from basename (kebab-case to Title Case)
292
+ */
293
+ formatDisplayName(basename) {
294
+ return basename
295
+ .split('-')
296
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1))
297
+ .join(' ');
298
+ }
299
+ /**
300
+ * Generate unique ID for execution file
301
+ */
302
+ generateExecutionId(basename, packageContext) {
303
+ if (packageContext) {
304
+ return `${packageContext.name}-${basename}`;
305
+ }
306
+ return basename;
307
+ }
308
+ /**
309
+ * Generate unique ID for canvas file
310
+ */
311
+ generateCanvasId(basename, packageContext) {
312
+ if (packageContext) {
313
+ return `${packageContext.name}-${basename}`;
314
+ }
315
+ return basename;
316
+ }
317
+ /**
318
+ * Sort execution files by package name, then by basename
319
+ */
320
+ sortExecutionFiles(files) {
321
+ return files.sort((a, b) => {
322
+ // Sort by package name first
323
+ if (a.packageContext && b.packageContext) {
324
+ const pkgCompare = a.packageContext.name.localeCompare(b.packageContext.name);
325
+ if (pkgCompare !== 0)
326
+ return pkgCompare;
327
+ }
328
+ else if (a.packageContext) {
329
+ return -1;
330
+ }
331
+ else if (b.packageContext) {
332
+ return 1;
333
+ }
334
+ // Then by basename
335
+ return a.canvasBasename.localeCompare(b.canvasBasename);
336
+ });
337
+ }
338
+ }
339
+ //# sourceMappingURL=ExecutionFileDiscovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecutionFileDiscovery.js","sourceRoot":"","sources":["../../src/utils/ExecutionFileDiscovery.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@principal-ai/principal-view-core",
3
- "version": "0.5.17",
3
+ "version": "0.6.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",
@@ -28,6 +28,7 @@
28
28
  "zod": "^3.22.0",
29
29
  "date-fns": "^3.0.0",
30
30
  "@principal-ai/repository-abstraction": "^0.2.5",
31
+ "@principal-ai/codebase-composition": "^0.2.31",
31
32
  "js-yaml": "^4.1.0"
32
33
  },
33
34
  "devDependencies": {
package/src/index.ts CHANGED
@@ -29,6 +29,19 @@ export type { LogEntry } from './PathBasedEventProcessor';
29
29
  export { PathMatcher } from './utils/PathMatcher';
30
30
  export { GraphConverter } from './utils/GraphConverter';
31
31
 
32
+ // Export execution file discovery
33
+ export { ExecutionFileDiscovery } from './utils/ExecutionFileDiscovery';
34
+ export type {
35
+ ExecutionFile,
36
+ CanvasFile,
37
+ PackageContext,
38
+ ExecutionMetadata,
39
+ ExecutionSpan,
40
+ ExecutionArtifact,
41
+ FileTreeEntry,
42
+ DiscoveryOptions,
43
+ } from './utils/ExecutionFileDiscovery';
44
+
32
45
  // Export Canvas types and converter
33
46
  export * from './types/canvas';
34
47
  export { CanvasConverter } from './utils/CanvasConverter';
@@ -0,0 +1,521 @@
1
+ /**
2
+ * Execution File Discovery
3
+ *
4
+ * Discovers execution artifacts and canvas files in a repository with monorepo awareness.
5
+ * Uses codebase-composition to intelligently detect package boundaries and workspace patterns.
6
+ */
7
+
8
+ import { PackageLayerModule } from '@principal-ai/codebase-composition';
9
+ import type { PackageLayer } from '@principal-ai/codebase-composition';
10
+
11
+ /**
12
+ * Represents a discovered execution artifact file
13
+ */
14
+ export interface ExecutionFile {
15
+ /** Unique identifier for this execution */
16
+ id: string;
17
+ /** Display name for this execution */
18
+ name: string;
19
+ /** Full file path (relative to repository root) */
20
+ path: string;
21
+ /** Canvas basename (without extension) that this execution is linked to */
22
+ canvasBasename: string;
23
+ /** Package context if this execution belongs to a specific package */
24
+ packageContext?: PackageContext;
25
+ }
26
+
27
+ /**
28
+ * Represents a discovered canvas file
29
+ */
30
+ export interface CanvasFile {
31
+ /** Unique identifier for this canvas */
32
+ id: string;
33
+ /** Display name for this canvas */
34
+ name: string;
35
+ /** Full file path (relative to repository root) */
36
+ path: string;
37
+ /** Canvas basename (without .otel.canvas or .canvas extension) */
38
+ basename: string;
39
+ /** Package context if this canvas belongs to a specific package */
40
+ packageContext?: PackageContext;
41
+ }
42
+
43
+ /**
44
+ * Package context for execution/canvas files
45
+ */
46
+ export interface PackageContext {
47
+ /** Package name (from package.json, Cargo.toml, etc.) */
48
+ name: string;
49
+ /** Package directory path (relative to repository root) */
50
+ packagePath: string;
51
+ /** Package type (npm, cargo, go, etc.) */
52
+ packageType?: string;
53
+ }
54
+
55
+ /**
56
+ * Execution artifact metadata
57
+ */
58
+ export interface ExecutionMetadata {
59
+ name: string;
60
+ canvasName?: string;
61
+ exportedAt?: string;
62
+ source?: string;
63
+ framework?: string;
64
+ status?: 'success' | 'error' | 'OK';
65
+ spanCount: number;
66
+ eventCount: number;
67
+ }
68
+
69
+ /**
70
+ * Execution span structure
71
+ */
72
+ export interface ExecutionSpan {
73
+ id: string;
74
+ name: string;
75
+ startTime: number;
76
+ endTime?: number;
77
+ duration?: number;
78
+ status?: string;
79
+ attributes?: Record<string, any>;
80
+ events: Array<{
81
+ time: number;
82
+ name: string;
83
+ attributes?: Record<string, any>;
84
+ }>;
85
+ }
86
+
87
+ /**
88
+ * Execution artifact file structure
89
+ */
90
+ export interface ExecutionArtifact {
91
+ metadata?: {
92
+ canvasName?: string;
93
+ exportedAt?: string;
94
+ source?: string;
95
+ framework?: string;
96
+ status?: 'success' | 'error';
97
+ };
98
+ spans: ExecutionSpan[];
99
+ }
100
+
101
+ /**
102
+ * File tree entry for discovery
103
+ */
104
+ export interface FileTreeEntry {
105
+ path?: string;
106
+ relativePath?: string;
107
+ name?: string;
108
+ }
109
+
110
+ /**
111
+ * Options for execution file discovery
112
+ */
113
+ export interface DiscoveryOptions {
114
+ /** Whether to include package-level .principal-views folders */
115
+ includePackagePrincipalViews?: boolean;
116
+ /** Custom execution folder names (defaults to ['__executions__']) */
117
+ executionFolders?: string[];
118
+ /** Custom canvas extensions (defaults to ['.otel.canvas']) */
119
+ canvasExtensions?: string[];
120
+ }
121
+
122
+ /**
123
+ * Execution File Discovery Engine
124
+ *
125
+ * Discovers execution artifacts and canvas files using monorepo-aware logic.
126
+ */
127
+ export class ExecutionFileDiscovery {
128
+ private packageLayerModule: PackageLayerModule;
129
+ private options: Required<DiscoveryOptions>;
130
+
131
+ constructor(options: DiscoveryOptions = {}) {
132
+ this.packageLayerModule = new PackageLayerModule();
133
+ this.options = {
134
+ includePackagePrincipalViews: options.includePackagePrincipalViews ?? true,
135
+ executionFolders: options.executionFolders ?? ['__executions__'],
136
+ canvasExtensions: options.canvasExtensions ?? ['.otel.canvas'],
137
+ };
138
+ }
139
+
140
+ /**
141
+ * Find all execution artifact files in the repository
142
+ */
143
+ async findExecutionFiles(files: FileTreeEntry[]): Promise<ExecutionFile[]> {
144
+ const executionFiles: ExecutionFile[] = [];
145
+
146
+ // Detect packages in the repository
147
+ const packages = await this.detectPackages(files);
148
+
149
+ // Search for execution files in each package
150
+ for (const pkg of packages) {
151
+ const pkgExecutions = this.findExecutionsInPackage(pkg, files);
152
+ executionFiles.push(...pkgExecutions);
153
+ }
154
+
155
+ // Search in root-level locations
156
+ const rootExecutions = this.findExecutionsInRoot(files);
157
+ executionFiles.push(...rootExecutions);
158
+
159
+ // Sort by package name, then by basename
160
+ return this.sortExecutionFiles(executionFiles);
161
+ }
162
+
163
+ /**
164
+ * Find all canvas files in the repository
165
+ */
166
+ async findCanvasFiles(files: FileTreeEntry[]): Promise<CanvasFile[]> {
167
+ const canvasFiles: CanvasFile[] = [];
168
+
169
+ // Detect packages in the repository
170
+ const packages = await this.detectPackages(files);
171
+
172
+ // Search for canvas files in root .principal-views/
173
+ const rootCanvases = this.findCanvasesInDirectory('.principal-views', files);
174
+ canvasFiles.push(...rootCanvases);
175
+
176
+ // Search for canvas files in package-level .principal-views/ if enabled
177
+ if (this.options.includePackagePrincipalViews) {
178
+ for (const pkg of packages) {
179
+ const pkgCanvases = this.findCanvasesInDirectory(
180
+ `${pkg.packageData.path}/.principal-views`,
181
+ files,
182
+ this.createPackageContext(pkg)
183
+ );
184
+ canvasFiles.push(...pkgCanvases);
185
+ }
186
+ }
187
+
188
+ // Sort by name
189
+ return canvasFiles.sort((a, b) => a.name.localeCompare(b.name));
190
+ }
191
+
192
+ /**
193
+ * Find execution artifact for a given canvas
194
+ * Now package-aware - can disambiguate between packages
195
+ */
196
+ findExecutionForCanvas(
197
+ canvas: CanvasFile,
198
+ executionFiles: ExecutionFile[]
199
+ ): ExecutionFile | null {
200
+ // First, try exact package match if canvas has package context
201
+ if (canvas.packageContext) {
202
+ const exactMatch = executionFiles.find(
203
+ exec =>
204
+ exec.canvasBasename === canvas.basename &&
205
+ exec.packageContext?.name === canvas.packageContext?.name
206
+ );
207
+ if (exactMatch) return exactMatch;
208
+ }
209
+
210
+ // Fallback to basename-only match (for root-level canvases)
211
+ return executionFiles.find(exec => exec.canvasBasename === canvas.basename) || null;
212
+ }
213
+
214
+ /**
215
+ * Find canvas file for a given execution
216
+ */
217
+ findCanvasForExecution(
218
+ execution: ExecutionFile,
219
+ canvasFiles: CanvasFile[]
220
+ ): CanvasFile | null {
221
+ // First, try exact package match if execution has package context
222
+ if (execution.packageContext) {
223
+ const exactMatch = canvasFiles.find(
224
+ canvas =>
225
+ canvas.basename === execution.canvasBasename &&
226
+ canvas.packageContext?.name === execution.packageContext?.name
227
+ );
228
+ if (exactMatch) return exactMatch;
229
+ }
230
+
231
+ // Fallback to basename-only match (for root-level executions)
232
+ return canvasFiles.find(canvas => canvas.basename === execution.canvasBasename) || null;
233
+ }
234
+
235
+ /**
236
+ * Parse execution artifact JSON
237
+ */
238
+ static parseExecutionArtifact(content: string): ExecutionArtifact {
239
+ try {
240
+ const parsed = JSON.parse(content);
241
+ return parsed as ExecutionArtifact;
242
+ } catch (error) {
243
+ throw new Error(`Failed to parse execution artifact JSON: ${(error as Error).message}`);
244
+ }
245
+ }
246
+
247
+ /**
248
+ * Get spans from an artifact
249
+ */
250
+ static getSpans(artifact: ExecutionArtifact): ExecutionSpan[] {
251
+ return artifact.spans || [];
252
+ }
253
+
254
+ /**
255
+ * Extract metadata from an execution artifact
256
+ */
257
+ static getExecutionMetadata(artifact: ExecutionArtifact): ExecutionMetadata {
258
+ const spans = ExecutionFileDiscovery.getSpans(artifact);
259
+ const spanCount = spans.length;
260
+
261
+ const eventCount = spans.reduce((total, span) => {
262
+ return total + (span.events?.length || 0);
263
+ }, 0);
264
+
265
+ const metadata = artifact.metadata;
266
+
267
+ let status: 'success' | 'error' | 'OK' = 'success';
268
+ if (metadata?.status) {
269
+ status = metadata.status;
270
+ } else if (spans.length > 0) {
271
+ const hasError = spans.some(
272
+ s => s.status === 'ERROR' || s.status === 'error' || s.status === 'FAILED'
273
+ );
274
+ status = hasError ? 'error' : 'OK';
275
+ }
276
+
277
+ return {
278
+ name: metadata?.canvasName || 'Untitled Execution',
279
+ canvasName: metadata?.canvasName,
280
+ exportedAt: metadata?.exportedAt,
281
+ source: metadata?.source,
282
+ framework: metadata?.framework,
283
+ status,
284
+ spanCount,
285
+ eventCount,
286
+ };
287
+ }
288
+
289
+ // Private helper methods
290
+
291
+ /**
292
+ * Detect packages using codebase-composition
293
+ */
294
+ private async detectPackages(files: FileTreeEntry[]): Promise<PackageLayer[]> {
295
+ try {
296
+ // Convert files to the format expected by codebase-composition
297
+ const fileTree = this.convertToFileTree(files);
298
+ const packages = await this.packageLayerModule.discoverPackages(fileTree);
299
+ return packages || [];
300
+ } catch (error) {
301
+ // If package detection fails, continue with fallback patterns
302
+ console.warn('Package detection failed, using fallback patterns:', error);
303
+ return [];
304
+ }
305
+ }
306
+
307
+ /**
308
+ * Convert file entries to file tree format for codebase-composition
309
+ */
310
+ private convertToFileTree(files: FileTreeEntry[]): any {
311
+ // This is a simplified conversion - codebase-composition expects a specific format
312
+ // In practice, the caller should provide a proper FileTree from repository-abstraction
313
+ return {
314
+ files: files.map(f => ({
315
+ path: f.relativePath || f.path || '',
316
+ name: f.name || (f.relativePath || f.path || '').split('/').pop() || '',
317
+ })),
318
+ };
319
+ }
320
+
321
+ /**
322
+ * Find executions in a specific package
323
+ */
324
+ private findExecutionsInPackage(
325
+ pkg: PackageLayer,
326
+ files: FileTreeEntry[]
327
+ ): ExecutionFile[] {
328
+ const executions: ExecutionFile[] = [];
329
+ const pkgPath = pkg.packageData.path || '';
330
+ const packageContext = this.createPackageContext(pkg);
331
+
332
+ for (const execFolder of this.options.executionFolders) {
333
+ const execPath = pkgPath ? `${pkgPath}/${execFolder}` : execFolder;
334
+
335
+ for (const file of files) {
336
+ const filePath = file.relativePath || file.path || '';
337
+ const fileName = file.name || filePath.split('/').pop() || '';
338
+
339
+ if (filePath.startsWith(execPath + '/') && this.isExecutionFile(fileName)) {
340
+ const basename = this.extractExecutionBasename(fileName);
341
+ executions.push({
342
+ id: this.generateExecutionId(basename, packageContext),
343
+ name: this.formatDisplayName(basename),
344
+ path: filePath,
345
+ canvasBasename: basename,
346
+ packageContext,
347
+ });
348
+ }
349
+ }
350
+ }
351
+
352
+ return executions;
353
+ }
354
+
355
+ /**
356
+ * Find executions in root-level locations
357
+ */
358
+ private findExecutionsInRoot(files: FileTreeEntry[]): ExecutionFile[] {
359
+ const executions: ExecutionFile[] = [];
360
+
361
+ // Root __executions__/
362
+ for (const execFolder of this.options.executionFolders) {
363
+ for (const file of files) {
364
+ const filePath = file.relativePath || file.path || '';
365
+ const fileName = file.name || filePath.split('/').pop() || '';
366
+
367
+ if (filePath.startsWith(`${execFolder}/`) && this.isExecutionFile(fileName)) {
368
+ const basename = this.extractExecutionBasename(fileName);
369
+ executions.push({
370
+ id: `root-${basename}`,
371
+ name: this.formatDisplayName(basename),
372
+ path: filePath,
373
+ canvasBasename: basename,
374
+ });
375
+ }
376
+ }
377
+ }
378
+
379
+ // .principal-views/__executions__/
380
+ const pvExecPath = '.principal-views/__executions__';
381
+ for (const file of files) {
382
+ const filePath = file.relativePath || file.path || '';
383
+ const fileName = file.name || filePath.split('/').pop() || '';
384
+
385
+ if (filePath.startsWith(pvExecPath + '/') && this.isExecutionFile(fileName)) {
386
+ const basename = this.extractExecutionBasename(fileName);
387
+ executions.push({
388
+ id: `pv-${basename}`,
389
+ name: this.formatDisplayName(basename),
390
+ path: filePath,
391
+ canvasBasename: basename,
392
+ });
393
+ }
394
+ }
395
+
396
+ return executions;
397
+ }
398
+
399
+ /**
400
+ * Find canvas files in a specific directory
401
+ */
402
+ private findCanvasesInDirectory(
403
+ directory: string,
404
+ files: FileTreeEntry[],
405
+ packageContext?: PackageContext
406
+ ): CanvasFile[] {
407
+ const canvases: CanvasFile[] = [];
408
+
409
+ for (const file of files) {
410
+ const filePath = file.relativePath || file.path || '';
411
+ const fileName = file.name || filePath.split('/').pop() || '';
412
+
413
+ if (filePath.startsWith(directory + '/') && this.isCanvasFile(fileName)) {
414
+ const basename = this.extractCanvasBasename(fileName);
415
+ canvases.push({
416
+ id: this.generateCanvasId(basename, packageContext),
417
+ name: this.formatDisplayName(basename),
418
+ path: filePath,
419
+ basename,
420
+ packageContext,
421
+ });
422
+ }
423
+ }
424
+
425
+ return canvases;
426
+ }
427
+
428
+ /**
429
+ * Create package context from PackageLayer
430
+ */
431
+ private createPackageContext(pkg: PackageLayer): PackageContext {
432
+ return {
433
+ name: pkg.packageData.name || 'unknown',
434
+ packagePath: pkg.packageData.path || '',
435
+ packageType: pkg.type,
436
+ };
437
+ }
438
+
439
+ /**
440
+ * Check if filename is an execution file
441
+ */
442
+ private isExecutionFile(filename: string): boolean {
443
+ return /\.(spans|execution|events)\.json$/.test(filename);
444
+ }
445
+
446
+ /**
447
+ * Check if filename is a canvas file
448
+ */
449
+ private isCanvasFile(filename: string): boolean {
450
+ return this.options.canvasExtensions.some(ext => filename.endsWith(ext));
451
+ }
452
+
453
+ /**
454
+ * Extract basename from execution filename
455
+ */
456
+ private extractExecutionBasename(filename: string): string {
457
+ return filename.replace(/\.(spans|execution|events)\.json$/, '');
458
+ }
459
+
460
+ /**
461
+ * Extract basename from canvas filename
462
+ */
463
+ private extractCanvasBasename(filename: string): string {
464
+ for (const ext of this.options.canvasExtensions) {
465
+ if (filename.endsWith(ext)) {
466
+ return filename.slice(0, -ext.length);
467
+ }
468
+ }
469
+ return filename;
470
+ }
471
+
472
+ /**
473
+ * Format display name from basename (kebab-case to Title Case)
474
+ */
475
+ private formatDisplayName(basename: string): string {
476
+ return basename
477
+ .split('-')
478
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1))
479
+ .join(' ');
480
+ }
481
+
482
+ /**
483
+ * Generate unique ID for execution file
484
+ */
485
+ private generateExecutionId(basename: string, packageContext?: PackageContext): string {
486
+ if (packageContext) {
487
+ return `${packageContext.name}-${basename}`;
488
+ }
489
+ return basename;
490
+ }
491
+
492
+ /**
493
+ * Generate unique ID for canvas file
494
+ */
495
+ private generateCanvasId(basename: string, packageContext?: PackageContext): string {
496
+ if (packageContext) {
497
+ return `${packageContext.name}-${basename}`;
498
+ }
499
+ return basename;
500
+ }
501
+
502
+ /**
503
+ * Sort execution files by package name, then by basename
504
+ */
505
+ private sortExecutionFiles(files: ExecutionFile[]): ExecutionFile[] {
506
+ return files.sort((a, b) => {
507
+ // Sort by package name first
508
+ if (a.packageContext && b.packageContext) {
509
+ const pkgCompare = a.packageContext.name.localeCompare(b.packageContext.name);
510
+ if (pkgCompare !== 0) return pkgCompare;
511
+ } else if (a.packageContext) {
512
+ return -1;
513
+ } else if (b.packageContext) {
514
+ return 1;
515
+ }
516
+
517
+ // Then by basename
518
+ return a.canvasBasename.localeCompare(b.canvasBasename);
519
+ });
520
+ }
521
+ }