@principal-ai/principal-view-core 0.5.14 → 0.5.16

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.
Files changed (51) hide show
  1. package/dist/cli/codegen.d.ts +41 -0
  2. package/dist/cli/codegen.d.ts.map +1 -0
  3. package/dist/cli/codegen.js +247 -0
  4. package/dist/cli/codegen.js.map +1 -0
  5. package/dist/codegen/type-generator.d.ts +112 -0
  6. package/dist/codegen/type-generator.d.ts.map +1 -0
  7. package/dist/codegen/type-generator.js +302 -0
  8. package/dist/codegen/type-generator.js.map +1 -0
  9. package/dist/codegen/usage-example.d.ts +103 -0
  10. package/dist/codegen/usage-example.d.ts.map +1 -0
  11. package/dist/codegen/usage-example.js +226 -0
  12. package/dist/codegen/usage-example.js.map +1 -0
  13. package/dist/generated/graph-converter-execution.types.d.ts +177 -0
  14. package/dist/generated/graph-converter-execution.types.d.ts.map +1 -0
  15. package/dist/generated/graph-converter-execution.types.js +11 -0
  16. package/dist/generated/graph-converter-execution.types.js.map +1 -0
  17. package/dist/index.d.ts +6 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +6 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/rules/engine.d.ts.map +1 -1
  22. package/dist/rules/engine.js +153 -37
  23. package/dist/rules/engine.js.map +1 -1
  24. package/dist/telemetry/event-validator.d.ts +72 -0
  25. package/dist/telemetry/event-validator.d.ts.map +1 -0
  26. package/dist/telemetry/event-validator.js +153 -0
  27. package/dist/telemetry/event-validator.js.map +1 -0
  28. package/dist/types/audit.d.ts.map +1 -1
  29. package/dist/types/audit.js.map +1 -1
  30. package/dist/types/canvas.d.ts +47 -0
  31. package/dist/types/canvas.d.ts.map +1 -1
  32. package/dist/types/canvas.js.map +1 -1
  33. package/dist/utils/TraceToCanvas.d.ts +83 -0
  34. package/dist/utils/TraceToCanvas.d.ts.map +1 -0
  35. package/dist/utils/TraceToCanvas.js +335 -0
  36. package/dist/utils/TraceToCanvas.js.map +1 -0
  37. package/package.json +6 -1
  38. package/src/ValidationEngine.test.ts +347 -196
  39. package/src/cli/codegen.ts +284 -0
  40. package/src/codegen/type-generator.test.ts +224 -0
  41. package/src/codegen/type-generator.ts +414 -0
  42. package/src/codegen/usage-example.ts +356 -0
  43. package/src/generated/graph-converter-execution.types.ts +193 -0
  44. package/src/index.ts +17 -0
  45. package/src/rules/engine.ts +171 -42
  46. package/src/telemetry/event-validator.ts +195 -0
  47. package/src/types/audit.ts +1 -5
  48. package/src/types/canvas.ts +51 -0
  49. package/src/utils/GraphConverter.test.ts +248 -88
  50. package/src/utils/TraceToCanvas.test.ts +308 -0
  51. package/src/utils/TraceToCanvas.ts +514 -0
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Code Generation CLI
4
+ *
5
+ * Generate types from canvas files.
6
+ *
7
+ * Usage:
8
+ * npx @principal-ai/principal-view-core codegen my-flow.canvas
9
+ * npx @principal-ai/principal-view-core codegen --lang typescript --output types/ my-flow.canvas
10
+ *
11
+ * Similar to:
12
+ * - graphql-codegen (GraphQL)
13
+ * - openapi-generator (OpenAPI)
14
+ * - protoc (Protobuf)
15
+ */
16
+ interface CliOptions {
17
+ language: 'typescript' | 'python' | 'go' | 'rust';
18
+ output?: string;
19
+ readonly?: boolean;
20
+ strictNullChecks?: boolean;
21
+ includeDocComments?: boolean;
22
+ namespace?: string;
23
+ watch?: boolean;
24
+ }
25
+ /**
26
+ * Parse command line arguments
27
+ */
28
+ declare function parseArgs(args: string[]): {
29
+ options: CliOptions;
30
+ canvasFiles: string[];
31
+ };
32
+ /**
33
+ * Generate types for a canvas file
34
+ */
35
+ declare function generateTypesForFile(canvasPath: string, options: CliOptions): string;
36
+ /**
37
+ * Main entry point
38
+ */
39
+ declare function main(): void;
40
+ export { main, parseArgs, generateTypesForFile };
41
+ //# sourceMappingURL=codegen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../../src/cli/codegen.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;GAaG;AAQH,UAAU,UAAU;IAClB,QAAQ,EAAE,YAAY,GAAG,QAAQ,GAAG,IAAI,GAAG,MAAM,CAAC;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,iBAAS,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAAE,OAAO,EAAE,UAAU,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,CAqDjF;AAED;;GAEG;AACH,iBAAS,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,UA2DpE;AAkED;;GAEG;AACH,iBAAS,IAAI,SAuDZ;AAOD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,247 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Code Generation CLI
4
+ *
5
+ * Generate types from canvas files.
6
+ *
7
+ * Usage:
8
+ * npx @principal-ai/principal-view-core codegen my-flow.canvas
9
+ * npx @principal-ai/principal-view-core codegen --lang typescript --output types/ my-flow.canvas
10
+ *
11
+ * Similar to:
12
+ * - graphql-codegen (GraphQL)
13
+ * - openapi-generator (OpenAPI)
14
+ * - protoc (Protobuf)
15
+ */
16
+ import fs from 'fs';
17
+ import path from 'path';
18
+ import { generateTypes, generatorRegistry } from '../codegen/type-generator';
19
+ /**
20
+ * Parse command line arguments
21
+ */
22
+ function parseArgs(args) {
23
+ const options = {
24
+ language: 'typescript',
25
+ includeDocComments: true,
26
+ strictNullChecks: true,
27
+ };
28
+ const canvasFiles = [];
29
+ for (let i = 0; i < args.length; i++) {
30
+ const arg = args[i];
31
+ switch (arg) {
32
+ case '--lang':
33
+ case '-l':
34
+ options.language = args[++i];
35
+ break;
36
+ case '--output':
37
+ case '-o':
38
+ options.output = args[++i];
39
+ break;
40
+ case '--readonly':
41
+ options.readonly = true;
42
+ break;
43
+ case '--no-strict-null-checks':
44
+ options.strictNullChecks = false;
45
+ break;
46
+ case '--no-doc-comments':
47
+ options.includeDocComments = false;
48
+ break;
49
+ case '--namespace':
50
+ case '-n':
51
+ options.namespace = args[++i];
52
+ break;
53
+ case '--watch':
54
+ case '-w':
55
+ options.watch = true;
56
+ break;
57
+ case '--help':
58
+ case '-h':
59
+ printHelp();
60
+ process.exit(0);
61
+ case '--list-generators':
62
+ listGenerators();
63
+ process.exit(0);
64
+ default:
65
+ if (!arg.startsWith('--')) {
66
+ canvasFiles.push(arg);
67
+ }
68
+ }
69
+ }
70
+ return { options, canvasFiles };
71
+ }
72
+ /**
73
+ * Generate types for a canvas file
74
+ */
75
+ function generateTypesForFile(canvasPath, options) {
76
+ console.log(`📝 Generating types from ${canvasPath}...`);
77
+ // Read canvas file
78
+ const canvas = JSON.parse(fs.readFileSync(canvasPath, 'utf-8'));
79
+ // Generate types
80
+ const codegenOptions = {
81
+ language: options.language,
82
+ style: {
83
+ readonly: options.readonly,
84
+ strictNullChecks: options.strictNullChecks,
85
+ includeDocComments: options.includeDocComments,
86
+ },
87
+ namespace: options.namespace,
88
+ };
89
+ const result = generateTypes(canvas, codegenOptions);
90
+ // Determine output path
91
+ let outputPath;
92
+ if (options.output) {
93
+ // If output is a directory, use generated filename
94
+ if (fs.existsSync(options.output) && fs.statSync(options.output).isDirectory()) {
95
+ outputPath = path.join(options.output, result.filename);
96
+ }
97
+ else {
98
+ outputPath = options.output;
99
+ }
100
+ }
101
+ else {
102
+ // Default: packages/core/src/generated/ for .principal-views canvases
103
+ // This keeps canvas files in .principal-views/ but generates types to idiomatic locations
104
+ const canvasDir = path.dirname(canvasPath);
105
+ const canvasAbsPath = path.resolve(canvasPath);
106
+ if (canvasAbsPath.includes('.principal-views')) {
107
+ // Canvas is in .principal-views/, output to packages/core/src/generated/
108
+ const repoRoot = canvasAbsPath.split('.principal-views')[0];
109
+ const generatedDir = path.join(repoRoot, 'packages', 'core', 'src', 'generated');
110
+ outputPath = path.join(generatedDir, result.filename);
111
+ }
112
+ else {
113
+ // Canvas is elsewhere, use same directory
114
+ outputPath = path.join(canvasDir, result.filename);
115
+ }
116
+ }
117
+ // Ensure output directory exists
118
+ const outputDir = path.dirname(outputPath);
119
+ if (!fs.existsSync(outputDir)) {
120
+ fs.mkdirSync(outputDir, { recursive: true });
121
+ }
122
+ // Write types file
123
+ fs.writeFileSync(outputPath, result.code);
124
+ console.log(`✅ Generated ${outputPath}`);
125
+ console.log(` Language: ${options.language}`);
126
+ console.log(` Size: ${result.code.length} bytes`);
127
+ return outputPath;
128
+ }
129
+ /**
130
+ * Print help message
131
+ */
132
+ function printHelp() {
133
+ console.log(`
134
+ Code Generation CLI - Generate types from canvas files
135
+
136
+ USAGE:
137
+ npx @principal-ai/principal-view-core codegen [OPTIONS] <canvas-files...>
138
+
139
+ OPTIONS:
140
+ -l, --lang <language> Target language (typescript|python|go|rust) [default: typescript]
141
+ -o, --output <path> Output file or directory [default: same as canvas]
142
+ -n, --namespace <name> Wrap types in a namespace
143
+ --readonly Use readonly modifiers (TypeScript)
144
+ --no-strict-null-checks Disable strict null checks
145
+ --no-doc-comments Omit JSDoc comments
146
+ -w, --watch Watch for changes and regenerate
147
+ --list-generators List available code generators
148
+ -h, --help Show this help message
149
+
150
+ EXAMPLES:
151
+ # Generate TypeScript types
152
+ npx @principal-ai/principal-view-core codegen my-flow.canvas
153
+
154
+ # Generate with namespace
155
+ npx @principal-ai/principal-view-core codegen --namespace Events my-flow.canvas
156
+
157
+ # Generate to specific output directory
158
+ npx @principal-ai/principal-view-core codegen --output src/types/ my-flow.canvas
159
+
160
+ # Generate multiple files
161
+ npx @principal-ai/principal-view-core codegen *.canvas
162
+
163
+ # Watch mode (future)
164
+ npx @principal-ai/principal-view-core codegen --watch my-flow.canvas
165
+
166
+ PRECEDENTS:
167
+ This tool follows patterns from:
168
+ - GraphQL Code Generator (graphql-code-generator.com)
169
+ - OpenAPI Generator (openapi-generator.tech)
170
+ - Protobuf Compiler (protoc)
171
+
172
+ Like these tools, it generates type-safe code from declarative schemas.
173
+ `);
174
+ }
175
+ /**
176
+ * List available generators
177
+ */
178
+ function listGenerators() {
179
+ console.log('\nAvailable Code Generators:\n');
180
+ const languages = generatorRegistry.list();
181
+ for (const lang of languages) {
182
+ const generator = generatorRegistry.get(lang);
183
+ console.log(` • ${lang.padEnd(15)} ${generator ? '✓' : '✗'}`);
184
+ }
185
+ console.log('\nTo add support for more languages, implement the CodeGenerator interface.');
186
+ console.log('See: packages/core/src/codegen/type-generator.ts\n');
187
+ }
188
+ /**
189
+ * Main entry point
190
+ */
191
+ function main() {
192
+ const { options, canvasFiles } = parseArgs(process.argv.slice(2));
193
+ if (canvasFiles.length === 0) {
194
+ console.error('❌ Error: No canvas files specified\n');
195
+ printHelp();
196
+ process.exit(1);
197
+ }
198
+ // Validate language
199
+ const availableLanguages = generatorRegistry.list();
200
+ if (!availableLanguages.includes(options.language)) {
201
+ console.error(`❌ Error: Unsupported language '${options.language}'`);
202
+ console.error(` Available: ${availableLanguages.join(', ')}\n`);
203
+ listGenerators();
204
+ process.exit(1);
205
+ }
206
+ // Generate types for each file
207
+ const outputFiles = [];
208
+ for (const canvasFile of canvasFiles) {
209
+ try {
210
+ // Check if file exists
211
+ if (!fs.existsSync(canvasFile)) {
212
+ console.error(`❌ Error: File not found: ${canvasFile}`);
213
+ continue;
214
+ }
215
+ const outputPath = generateTypesForFile(canvasFile, options);
216
+ outputFiles.push(outputPath);
217
+ }
218
+ catch (error) {
219
+ console.error(`❌ Error processing ${canvasFile}:`, error);
220
+ process.exit(1);
221
+ }
222
+ }
223
+ console.log(`\n✨ Successfully generated ${outputFiles.length} type file(s)\n`);
224
+ // Watch mode
225
+ if (options.watch) {
226
+ console.log('👀 Watching for changes...');
227
+ for (const canvasFile of canvasFiles) {
228
+ fs.watch(canvasFile, (eventType) => {
229
+ if (eventType === 'change') {
230
+ console.log(`\n🔄 ${canvasFile} changed, regenerating...`);
231
+ try {
232
+ generateTypesForFile(canvasFile, options);
233
+ }
234
+ catch (error) {
235
+ console.error('❌ Error:', error);
236
+ }
237
+ }
238
+ });
239
+ }
240
+ }
241
+ }
242
+ // Run CLI if executed directly
243
+ if (require.main === module) {
244
+ main();
245
+ }
246
+ export { main, parseArgs, generateTypesForFile };
247
+ //# sourceMappingURL=codegen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen.js","sourceRoot":"","sources":["../../src/cli/codegen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Type Generator
3
+ *
4
+ * Generates TypeScript types from canvas event schemas.
5
+ * Similar to how GraphQL Code Generator works for GraphQL schemas,
6
+ * or how OpenAPI generators work for API specs.
7
+ *
8
+ * Precedents:
9
+ * - GraphQL Code Generator: graphql-code-generator.com
10
+ * - OpenAPI Generator: openapi-generator.tech
11
+ * - Protobuf: generates code from .proto files
12
+ * - Zod: runtime validation with TypeScript inference
13
+ */
14
+ import type { ExtendedCanvas } from '../types/canvas';
15
+ /**
16
+ * Code generation options
17
+ */
18
+ export interface CodegenOptions {
19
+ /** Output language (extensible for future languages) */
20
+ language: 'typescript' | 'python' | 'go' | 'rust';
21
+ /** Style preferences */
22
+ style?: {
23
+ /** Use readonly for immutable types */
24
+ readonly?: boolean;
25
+ /** Use strict null checks */
26
+ strictNullChecks?: boolean;
27
+ /** Generate JSDoc comments */
28
+ includeDocComments?: boolean;
29
+ };
30
+ /** Namespace/module name */
31
+ namespace?: string;
32
+ }
33
+ /**
34
+ * Generated code result
35
+ */
36
+ export interface CodegenResult {
37
+ /** Generated code content */
38
+ code: string;
39
+ /** File extension for the language */
40
+ extension: string;
41
+ /** Suggested filename */
42
+ filename: string;
43
+ }
44
+ /**
45
+ * Abstract code generator interface
46
+ *
47
+ * This allows us to implement generators for different languages
48
+ * following the same pattern as OpenAPI generators.
49
+ */
50
+ export interface CodeGenerator {
51
+ /** Target language */
52
+ language: string;
53
+ /** Generate code from canvas */
54
+ generate(canvas: ExtendedCanvas, options?: CodegenOptions): CodegenResult;
55
+ }
56
+ /**
57
+ * TypeScript Type Generator
58
+ *
59
+ * Generates TypeScript types from canvas event schemas.
60
+ * Similar to GraphQL Code Generator but for canvas schemas.
61
+ */
62
+ export declare class TypeScriptGenerator implements CodeGenerator {
63
+ language: string;
64
+ generate(canvas: ExtendedCanvas, options?: CodegenOptions): CodegenResult;
65
+ private generateNodeTypes;
66
+ private generateEventInterface;
67
+ private generateEventNameUnion;
68
+ private generateEmitterTypes;
69
+ private nodeIdToTypeName;
70
+ private eventNameToTypeName;
71
+ private fieldTypeToTsType;
72
+ private generateFilename;
73
+ }
74
+ /**
75
+ * Generate types from canvas
76
+ *
77
+ * @example
78
+ * ```typescript
79
+ * import fs from 'fs';
80
+ * import { generateTypes } from '@principal-ai/principal-view-core';
81
+ *
82
+ * const canvas = JSON.parse(fs.readFileSync('my-flow.canvas', 'utf-8'));
83
+ * const result = generateTypes(canvas, { language: 'typescript' });
84
+ *
85
+ * fs.writeFileSync(result.filename, result.code);
86
+ * ```
87
+ */
88
+ export declare function generateTypes(canvas: ExtendedCanvas, options?: CodegenOptions): CodegenResult;
89
+ /**
90
+ * Registry of available generators
91
+ *
92
+ * This allows external packages to register custom generators:
93
+ *
94
+ * @example
95
+ * ```typescript
96
+ * import { generatorRegistry } from '@principal-ai/principal-view-core';
97
+ *
98
+ * class PythonGenerator implements CodeGenerator {
99
+ * language = 'python';
100
+ * generate(canvas, options) { ... }
101
+ * }
102
+ *
103
+ * generatorRegistry.register(new PythonGenerator());
104
+ * ```
105
+ */
106
+ export declare const generatorRegistry: {
107
+ generators: Map<string, CodeGenerator>;
108
+ register(generator: CodeGenerator): void;
109
+ get(language: string): CodeGenerator | undefined;
110
+ list(): string[];
111
+ };
112
+ //# sourceMappingURL=type-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-generator.d.ts","sourceRoot":"","sources":["../../src/codegen/type-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAqC,MAAM,iBAAiB,CAAC;AAEzF;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,QAAQ,EAAE,YAAY,GAAG,QAAQ,GAAG,IAAI,GAAG,MAAM,CAAC;IAClD,wBAAwB;IACxB,KAAK,CAAC,EAAE;QACN,uCAAuC;QACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,6BAA6B;QAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,8BAA8B;QAC9B,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,CAAC;IACF,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,sBAAsB;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa,CAAC;CAC3E;AAED;;;;;GAKG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IACvD,QAAQ,SAAgB;IAExB,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa;IA2DzE,OAAO,CAAC,iBAAiB;IA2CzB,OAAO,CAAC,sBAAsB;IAwC9B,OAAO,CAAC,sBAAsB;IA8B9B,OAAO,CAAC,oBAAoB;IAoD5B,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,iBAAiB;IAiBzB,OAAO,CAAC,gBAAgB;CASzB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE,cAA2C,GACnD,aAAa,CAGf;AAuBD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,iBAAiB;;wBAKR,aAAa;kBAInB,MAAM,GAAG,aAAa,GAAG,SAAS;YAIxC,MAAM,EAAE;CAGjB,CAAC"}