@sowonai/crewx-sdk 0.1.0-dev.3 → 0.1.0-dev.31

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 (84) hide show
  1. package/README.md +28 -0
  2. package/dist/config/yaml-loader.js +6 -2
  3. package/dist/config/yaml-loader.js.map +1 -1
  4. package/dist/conversation/conversation-history.interface.d.ts +6 -4
  5. package/dist/core/agent/agent-factory.d.ts +7 -7
  6. package/dist/core/agent/agent-factory.js +23 -0
  7. package/dist/core/agent/agent-factory.js.map +1 -1
  8. package/dist/core/agent/agent-runtime.d.ts +18 -2
  9. package/dist/core/agent/agent-runtime.js +128 -24
  10. package/dist/core/agent/agent-runtime.js.map +1 -1
  11. package/dist/core/agent/index.d.ts +1 -1
  12. package/dist/core/agent/index.js +2 -1
  13. package/dist/core/agent/index.js.map +1 -1
  14. package/dist/core/providers/ai-provider.interface.d.ts +1 -0
  15. package/dist/core/providers/ai-provider.interface.js.map +1 -1
  16. package/dist/core/providers/base-ai.provider.d.ts +7 -0
  17. package/dist/core/providers/base-ai.provider.js +8 -4
  18. package/dist/core/providers/base-ai.provider.js.map +1 -1
  19. package/dist/core/providers/dynamic-provider.factory.d.ts +64 -0
  20. package/dist/core/providers/dynamic-provider.factory.js +533 -0
  21. package/dist/core/providers/dynamic-provider.factory.js.map +1 -0
  22. package/dist/core/providers/index.d.ts +3 -0
  23. package/dist/core/providers/index.js +7 -1
  24. package/dist/core/providers/index.js.map +1 -1
  25. package/dist/core/providers/mock.provider.d.ts +13 -0
  26. package/dist/core/providers/mock.provider.js +55 -0
  27. package/dist/core/providers/mock.provider.js.map +1 -0
  28. package/dist/core/providers/provider-factory.d.ts +3 -0
  29. package/dist/core/providers/provider-factory.js +27 -0
  30. package/dist/core/providers/provider-factory.js.map +1 -0
  31. package/dist/index.d.ts +17 -4
  32. package/dist/index.js +31 -1
  33. package/dist/index.js.map +1 -1
  34. package/dist/schema/skills-parser.d.ts +8 -0
  35. package/dist/schema/skills-parser.js +421 -0
  36. package/dist/schema/skills-parser.js.map +1 -0
  37. package/dist/schema/skills.types.d.ts +144 -0
  38. package/dist/schema/skills.types.js +41 -0
  39. package/dist/schema/skills.types.js.map +1 -0
  40. package/dist/services/index.d.ts +2 -0
  41. package/dist/services/index.js +19 -0
  42. package/dist/services/index.js.map +1 -0
  43. package/dist/services/layout-loader.service.d.ts +18 -0
  44. package/dist/services/layout-loader.service.js +266 -0
  45. package/dist/services/layout-loader.service.js.map +1 -0
  46. package/dist/services/layout-renderer.service.d.ts +25 -0
  47. package/dist/services/layout-renderer.service.js +226 -0
  48. package/dist/services/layout-renderer.service.js.map +1 -0
  49. package/dist/services/props-validator.service.d.ts +29 -0
  50. package/dist/services/props-validator.service.js +332 -0
  51. package/dist/services/props-validator.service.js.map +1 -0
  52. package/dist/skills/adapter/claude-skill-adapter.d.ts +11 -0
  53. package/dist/skills/adapter/claude-skill-adapter.js +222 -0
  54. package/dist/skills/adapter/claude-skill-adapter.js.map +1 -0
  55. package/dist/skills/index.d.ts +6 -0
  56. package/dist/skills/index.js +31 -0
  57. package/dist/skills/index.js.map +1 -0
  58. package/dist/skills/runtime/progressive-loader.d.ts +27 -0
  59. package/dist/skills/runtime/progressive-loader.js +186 -0
  60. package/dist/skills/runtime/progressive-loader.js.map +1 -0
  61. package/dist/skills/runtime/runtime-requirements-validator.d.ts +23 -0
  62. package/dist/skills/runtime/runtime-requirements-validator.js +248 -0
  63. package/dist/skills/runtime/runtime-requirements-validator.js.map +1 -0
  64. package/dist/skills/runtime/skill-runtime.service.d.ts +42 -0
  65. package/dist/skills/runtime/skill-runtime.service.js +434 -0
  66. package/dist/skills/runtime/skill-runtime.service.js.map +1 -0
  67. package/dist/types/agent.types.d.ts +10 -2
  68. package/dist/types/agent.types.js.map +1 -1
  69. package/dist/types/index.d.ts +3 -0
  70. package/dist/types/index.js +3 -0
  71. package/dist/types/index.js.map +1 -1
  72. package/dist/types/layout.types.d.ts +113 -0
  73. package/dist/types/layout.types.js +22 -0
  74. package/dist/types/layout.types.js.map +1 -0
  75. package/dist/types/provider.types.d.ts +12 -0
  76. package/dist/types/provider.types.js +3 -0
  77. package/dist/types/provider.types.js.map +1 -0
  78. package/dist/types/skill-runtime.types.d.ts +244 -0
  79. package/dist/types/skill-runtime.types.js +44 -0
  80. package/dist/types/skill-runtime.types.js.map +1 -0
  81. package/dist/types/template.types.d.ts +38 -0
  82. package/dist/types/template.types.js +3 -0
  83. package/dist/types/template.types.js.map +1 -0
  84. package/package.json +14 -13
@@ -0,0 +1,144 @@
1
+ export interface SkillMetadata {
2
+ name: string;
3
+ description: string;
4
+ version: string;
5
+ dependencies?: string[];
6
+ runtime?: {
7
+ python?: string;
8
+ node?: string;
9
+ [key: string]: string | undefined;
10
+ };
11
+ visibility?: 'public' | 'private' | 'internal';
12
+ [key: string]: unknown;
13
+ }
14
+ export interface SkillContent {
15
+ role?: string;
16
+ task?: string;
17
+ instructions?: string;
18
+ raw?: string;
19
+ }
20
+ export interface SkillDefinition {
21
+ metadata: SkillMetadata;
22
+ content?: SkillContent;
23
+ filePath?: string;
24
+ fullyLoaded?: boolean;
25
+ }
26
+ export interface SkillsConfig {
27
+ include?: string[];
28
+ exclude?: string[];
29
+ autoload?: boolean;
30
+ }
31
+ export interface CrewxProjectConfig {
32
+ skillsPaths?: string[];
33
+ skills?: SkillsConfig;
34
+ layouts?: Record<string, string>;
35
+ documents?: Record<string, string>;
36
+ settings?: {
37
+ slack?: {
38
+ log_conversations?: boolean;
39
+ [key: string]: unknown;
40
+ };
41
+ [key: string]: unknown;
42
+ };
43
+ agents?: AgentDefinition[];
44
+ [key: string]: unknown;
45
+ }
46
+ export interface AgentDefinition {
47
+ id: string;
48
+ name?: string;
49
+ role?: string;
50
+ team?: string;
51
+ provider: string | string[];
52
+ working_directory?: string;
53
+ description?: string;
54
+ specialties?: string[];
55
+ capabilities?: string[];
56
+ skills?: SkillsConfig;
57
+ inline?: {
58
+ type?: 'agent';
59
+ model?: string;
60
+ system_prompt?: string;
61
+ prompt?: string;
62
+ layout?: string | {
63
+ id: string;
64
+ props?: Record<string, unknown>;
65
+ };
66
+ version?: string;
67
+ dependencies?: string[];
68
+ documents?: Record<string, string>;
69
+ [key: string]: unknown;
70
+ };
71
+ options?: {
72
+ query?: string[] | Record<string, string[]>;
73
+ execute?: string[] | Record<string, string[]>;
74
+ };
75
+ remote?: {
76
+ type: string;
77
+ url: string;
78
+ apiKey?: string;
79
+ agentId?: string;
80
+ timeoutMs?: number;
81
+ [key: string]: unknown;
82
+ };
83
+ [key: string]: unknown;
84
+ }
85
+ export interface SkillResolutionResult {
86
+ name: string;
87
+ definition: SkillDefinition;
88
+ dependencies?: SkillResolutionResult[];
89
+ sourcePath: string;
90
+ }
91
+ export interface SkillParserOptions {
92
+ validationMode?: 'strict' | 'lenient';
93
+ loadContent?: boolean;
94
+ resolveDependencies?: boolean;
95
+ searchPaths?: string[];
96
+ cache?: boolean;
97
+ }
98
+ export interface SkillValidationError {
99
+ skillName: string;
100
+ field: string;
101
+ message: string;
102
+ expected?: string;
103
+ actual?: unknown;
104
+ }
105
+ export interface SkillValidationResult {
106
+ valid: boolean;
107
+ errors: SkillValidationError[];
108
+ warnings?: SkillValidationError[];
109
+ }
110
+ export declare class SkillLoadError extends Error {
111
+ readonly skillName?: string | undefined;
112
+ readonly cause?: Error | undefined;
113
+ constructor(message: string, skillName?: string | undefined, cause?: Error | undefined);
114
+ }
115
+ export declare class SkillNotFoundError extends Error {
116
+ readonly skillName: string;
117
+ readonly searchPaths: string[];
118
+ constructor(skillName: string, searchPaths: string[]);
119
+ }
120
+ export declare class SkillDependencyError extends Error {
121
+ readonly skillName: string;
122
+ readonly missingDependencies: string[];
123
+ constructor(skillName: string, missingDependencies: string[]);
124
+ }
125
+ export declare class SkillVersionMismatchError extends Error {
126
+ readonly skillName: string;
127
+ readonly requiredVersion: string;
128
+ readonly foundVersion: string;
129
+ constructor(skillName: string, requiredVersion: string, foundVersion: string);
130
+ }
131
+ export interface SkillManifest {
132
+ metadata: SkillMetadata;
133
+ files: {
134
+ main: string;
135
+ resources?: string[];
136
+ };
137
+ checksum?: string;
138
+ signature?: string;
139
+ build?: {
140
+ timestamp: string;
141
+ builder?: string;
142
+ [key: string]: unknown;
143
+ };
144
+ }
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SkillVersionMismatchError = exports.SkillDependencyError = exports.SkillNotFoundError = exports.SkillLoadError = void 0;
4
+ class SkillLoadError extends Error {
5
+ constructor(message, skillName, cause) {
6
+ super(message);
7
+ this.skillName = skillName;
8
+ this.cause = cause;
9
+ this.name = 'SkillLoadError';
10
+ }
11
+ }
12
+ exports.SkillLoadError = SkillLoadError;
13
+ class SkillNotFoundError extends Error {
14
+ constructor(skillName, searchPaths) {
15
+ super(`Skill "${skillName}" not found in paths: ${searchPaths.join(', ')}`);
16
+ this.skillName = skillName;
17
+ this.searchPaths = searchPaths;
18
+ this.name = 'SkillNotFoundError';
19
+ }
20
+ }
21
+ exports.SkillNotFoundError = SkillNotFoundError;
22
+ class SkillDependencyError extends Error {
23
+ constructor(skillName, missingDependencies) {
24
+ super(`Skill "${skillName}" missing dependencies: ${missingDependencies.join(', ')}`);
25
+ this.skillName = skillName;
26
+ this.missingDependencies = missingDependencies;
27
+ this.name = 'SkillDependencyError';
28
+ }
29
+ }
30
+ exports.SkillDependencyError = SkillDependencyError;
31
+ class SkillVersionMismatchError extends Error {
32
+ constructor(skillName, requiredVersion, foundVersion) {
33
+ super(`Skill "${skillName}" version mismatch. Required: ${requiredVersion}, Found: ${foundVersion}`);
34
+ this.skillName = skillName;
35
+ this.requiredVersion = requiredVersion;
36
+ this.foundVersion = foundVersion;
37
+ this.name = 'SkillVersionMismatchError';
38
+ }
39
+ }
40
+ exports.SkillVersionMismatchError = SkillVersionMismatchError;
41
+ //# sourceMappingURL=skills.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.types.js","sourceRoot":"","sources":["../../src/schema/skills.types.ts"],"names":[],"mappings":";;;AAyRA,MAAa,cAAe,SAAQ,KAAK;IACvC,YACE,OAAe,EACC,SAAkB,EAClB,KAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,cAAS,GAAT,SAAS,CAAS;QAClB,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AATD,wCASC;AAKD,MAAa,kBAAmB,SAAQ,KAAK;IAC3C,YACkB,SAAiB,EACjB,WAAqB;QAErC,KAAK,CAAC,UAAU,SAAS,yBAAyB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAH5D,cAAS,GAAT,SAAS,CAAQ;QACjB,gBAAW,GAAX,WAAW,CAAU;QAGrC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AARD,gDAQC;AAKD,MAAa,oBAAqB,SAAQ,KAAK;IAC7C,YACkB,SAAiB,EACjB,mBAA6B;QAE7C,KAAK,CACH,UAAU,SAAS,2BAA2B,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC/E,CAAC;QALc,cAAS,GAAT,SAAS,CAAQ;QACjB,wBAAmB,GAAnB,mBAAmB,CAAU;QAK7C,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAVD,oDAUC;AAKD,MAAa,yBAA0B,SAAQ,KAAK;IAClD,YACkB,SAAiB,EACjB,eAAuB,EACvB,YAAoB;QAEpC,KAAK,CACH,UAAU,SAAS,iCAAiC,eAAe,YAAY,YAAY,EAAE,CAC9F,CAAC;QANc,cAAS,GAAT,SAAS,CAAQ;QACjB,oBAAe,GAAf,eAAe,CAAQ;QACvB,iBAAY,GAAZ,YAAY,CAAQ;QAKpC,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF;AAXD,8DAWC"}
@@ -0,0 +1,2 @@
1
+ export * from './layout-renderer.service';
2
+ export * from './props-validator.service';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./layout-renderer.service"), exports);
18
+ __exportStar(require("./props-validator.service"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAMA,4DAA0C;AAC1C,4DAA0C"}
@@ -0,0 +1,18 @@
1
+ import { CustomLayoutDefinition, LayoutDefinition, LoaderOptions } from '../types/layout.types';
2
+ export declare class LayoutLoader {
3
+ private layouts;
4
+ private options;
5
+ constructor(options?: Partial<LoaderOptions>);
6
+ load(layoutId: string, propsOverride?: Record<string, any>): LayoutDefinition;
7
+ getLayoutIds(): string[];
8
+ hasLayout(layoutId: string): boolean;
9
+ reload(): void;
10
+ private loadAllLayouts;
11
+ private loadLayoutFile;
12
+ private parsePropsSchema;
13
+ private extractDefaultProps;
14
+ private normalizeLayoutId;
15
+ registerLayout(layoutId: string, layoutConfig: string | CustomLayoutDefinition): void;
16
+ registerLayouts(layoutsMap: Record<string, string | CustomLayoutDefinition>): void;
17
+ private resolveLayoutTemplate;
18
+ }
@@ -0,0 +1,266 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.LayoutLoader = void 0;
37
+ const fs_1 = require("fs");
38
+ const path = __importStar(require("path"));
39
+ const js_yaml_1 = require("js-yaml");
40
+ const layout_types_1 = require("../types/layout.types");
41
+ const DEFAULT_OPTIONS = {
42
+ templatesPath: path.join(__dirname, '../../../templates/agents'),
43
+ validationMode: 'lenient',
44
+ fallbackLayoutId: 'crewx/default',
45
+ };
46
+ class LayoutLoader {
47
+ constructor(options) {
48
+ this.layouts = new Map();
49
+ this.options = { ...DEFAULT_OPTIONS, ...options };
50
+ this.loadAllLayouts();
51
+ }
52
+ load(layoutId, propsOverride) {
53
+ let layout = this.layouts.get(layoutId);
54
+ if (!layout) {
55
+ const normalizedId = this.normalizeLayoutId(layoutId);
56
+ layout = this.layouts.get(normalizedId);
57
+ }
58
+ if (!layout) {
59
+ console.warn(`Layout not found: ${layoutId}, falling back to ${this.options.fallbackLayoutId}`);
60
+ layout = this.layouts.get(this.options.fallbackLayoutId);
61
+ if (!layout) {
62
+ throw new layout_types_1.LayoutLoadError(`Fallback layout not found: ${this.options.fallbackLayoutId}`, this.options.fallbackLayoutId);
63
+ }
64
+ }
65
+ if (propsOverride && Object.keys(propsOverride).length > 0) {
66
+ return {
67
+ ...layout,
68
+ defaultProps: { ...layout.defaultProps, ...propsOverride },
69
+ };
70
+ }
71
+ return layout;
72
+ }
73
+ getLayoutIds() {
74
+ return Array.from(this.layouts.keys());
75
+ }
76
+ hasLayout(layoutId) {
77
+ if (this.layouts.has(layoutId)) {
78
+ return true;
79
+ }
80
+ const normalizedId = this.normalizeLayoutId(layoutId);
81
+ return this.layouts.has(normalizedId);
82
+ }
83
+ reload() {
84
+ this.layouts.clear();
85
+ this.loadAllLayouts();
86
+ }
87
+ loadAllLayouts() {
88
+ const layoutsDir = this.options.templatesPath;
89
+ if (!(0, fs_1.existsSync)(layoutsDir)) {
90
+ throw new layout_types_1.LayoutLoadError(`Templates directory not found: ${layoutsDir}`, undefined, new Error(`Directory does not exist: ${layoutsDir}`));
91
+ }
92
+ try {
93
+ const files = (0, fs_1.readdirSync)(layoutsDir).filter(f => f.endsWith('.yaml') || f.endsWith('.yml'));
94
+ if (files.length === 0) {
95
+ console.warn(`No layout files found in ${layoutsDir}`);
96
+ }
97
+ for (const file of files) {
98
+ const layoutName = file.replace(/\.(yaml|yml)$/, '');
99
+ const layoutPath = path.join(layoutsDir, file);
100
+ try {
101
+ const layout = this.loadLayoutFile(layoutPath, layoutName);
102
+ const layoutId = `crewx/${layoutName}`;
103
+ this.layouts.set(layoutId, layout);
104
+ if (layoutId !== 'crewx/minimal') {
105
+ console.log(`Loaded layout: ${layoutId} from ${file}`);
106
+ }
107
+ }
108
+ catch (error) {
109
+ console.error(`Failed to load layout file ${file}:`, error);
110
+ }
111
+ }
112
+ console.log(`Loaded ${this.layouts.size} layouts from ${layoutsDir}`);
113
+ }
114
+ catch (error) {
115
+ throw new layout_types_1.LayoutLoadError(`Failed to read layouts directory: ${layoutsDir}`, undefined, error instanceof Error ? error : new Error(String(error)));
116
+ }
117
+ }
118
+ loadLayoutFile(filePath, layoutName) {
119
+ try {
120
+ const content = (0, fs_1.readFileSync)(filePath, 'utf-8');
121
+ if (!content || content.trim().length === 0) {
122
+ console.warn(`Empty YAML file: ${filePath}, will use fallback`);
123
+ throw new layout_types_1.LayoutLoadError(`Empty YAML file: ${filePath}`, layoutName, new Error('File content is empty'));
124
+ }
125
+ const parsed = (0, js_yaml_1.load)(content);
126
+ if (!parsed || typeof parsed !== 'object') {
127
+ console.warn(`Invalid YAML content in ${filePath} (parsed as ${typeof parsed}), will use fallback`);
128
+ throw new layout_types_1.LayoutLoadError(`Invalid or empty YAML in ${filePath}`, layoutName, new Error('YAML parsing returned null/undefined or non-object'));
129
+ }
130
+ if (parsed.layouts && typeof parsed.layouts === 'object') {
131
+ const layoutTemplate = this.resolveLayoutTemplate(parsed.layouts, layoutName);
132
+ if (!layoutTemplate || (typeof layoutTemplate === 'string' && layoutTemplate.trim().length === 0)) {
133
+ console.warn(`Empty or missing layout template in ${filePath} for ${layoutName}`);
134
+ throw new layout_types_1.LayoutLoadError(`Layout template not found or empty in layouts map: ${layoutName}`, layoutName);
135
+ }
136
+ return {
137
+ id: `crewx/${layoutName}`,
138
+ version: parsed.version || '1.0.0',
139
+ description: parsed.description || `CrewX ${layoutName} layout`,
140
+ template: layoutTemplate,
141
+ propsSchema: this.parsePropsSchema(parsed.propsSchema || {}),
142
+ defaultProps: this.extractDefaultProps(parsed.propsSchema || {}),
143
+ };
144
+ }
145
+ else {
146
+ if (!parsed.template || (typeof parsed.template === 'string' && parsed.template.trim().length === 0)) {
147
+ console.warn(`Empty or missing template field in ${filePath}`);
148
+ throw new layout_types_1.LayoutLoadError(`Layout template is missing or empty in ${filePath}`, layoutName);
149
+ }
150
+ return {
151
+ id: parsed.id || `crewx/${layoutName}`,
152
+ version: parsed.version || '1.0.0',
153
+ description: parsed.description || '',
154
+ template: parsed.template,
155
+ propsSchema: this.parsePropsSchema(parsed.propsSchema || {}),
156
+ defaultProps: this.extractDefaultProps(parsed.propsSchema || {}),
157
+ };
158
+ }
159
+ }
160
+ catch (error) {
161
+ throw new layout_types_1.LayoutLoadError(`Failed to load layout file: ${filePath}`, layoutName, error instanceof Error ? error : new Error(String(error)));
162
+ }
163
+ }
164
+ parsePropsSchema(raw) {
165
+ const schema = {};
166
+ for (const [key, value] of Object.entries(raw)) {
167
+ if (typeof value === 'object' && value !== null) {
168
+ schema[key] = value;
169
+ }
170
+ }
171
+ return schema;
172
+ }
173
+ extractDefaultProps(propsSchema) {
174
+ const defaults = {};
175
+ for (const [key, schema] of Object.entries(propsSchema)) {
176
+ if (schema && typeof schema === 'object' && 'defaultValue' in schema) {
177
+ defaults[key] = schema.defaultValue;
178
+ }
179
+ }
180
+ return defaults;
181
+ }
182
+ normalizeLayoutId(layoutId) {
183
+ if (!layoutId) {
184
+ return this.options.fallbackLayoutId;
185
+ }
186
+ if (layoutId.includes('/')) {
187
+ return layoutId;
188
+ }
189
+ return `crewx/${layoutId}`;
190
+ }
191
+ registerLayout(layoutId, layoutConfig) {
192
+ if (!layoutId || typeof layoutId !== 'string') {
193
+ throw new layout_types_1.LayoutLoadError('Layout ID must be a non-empty string', layoutId);
194
+ }
195
+ const config = typeof layoutConfig === 'string'
196
+ ? { template: layoutConfig }
197
+ : layoutConfig;
198
+ const template = typeof config.template === 'string' ? config.template : '';
199
+ if (!template || template.trim().length === 0) {
200
+ throw new layout_types_1.LayoutLoadError(`Custom layout template is empty for ${layoutId}`, layoutId);
201
+ }
202
+ const propsSchemaRaw = config.propsSchema || {};
203
+ const defaultPropsFromSchema = this.extractDefaultProps(propsSchemaRaw);
204
+ const explicitDefaults = config.defaultProps || {};
205
+ const layoutDefinition = {
206
+ id: layoutId,
207
+ version: config.version || '1.0.0',
208
+ description: config.description || `Custom layout ${layoutId}`,
209
+ template,
210
+ propsSchema: this.parsePropsSchema(propsSchemaRaw),
211
+ defaultProps: { ...defaultPropsFromSchema, ...explicitDefaults },
212
+ };
213
+ const existingLayout = this.layouts.get(layoutId);
214
+ const templatesEqual = existingLayout?.template === template &&
215
+ JSON.stringify(existingLayout?.defaultProps ?? {}) === JSON.stringify(layoutDefinition.defaultProps ?? {}) &&
216
+ JSON.stringify(existingLayout?.propsSchema ?? {}) === JSON.stringify(layoutDefinition.propsSchema ?? {});
217
+ this.layouts.set(layoutId, layoutDefinition);
218
+ if (!existingLayout) {
219
+ console.log(`Registered custom layout: ${layoutId}`);
220
+ }
221
+ else if (!templatesEqual) {
222
+ console.log(`Updated custom layout: ${layoutId}`);
223
+ }
224
+ }
225
+ registerLayouts(layoutsMap) {
226
+ for (const [id, config] of Object.entries(layoutsMap)) {
227
+ try {
228
+ this.registerLayout(id, config);
229
+ }
230
+ catch (error) {
231
+ console.warn(`Failed to register custom layout ${id}:`, error instanceof Error ? error.message : error);
232
+ }
233
+ }
234
+ }
235
+ resolveLayoutTemplate(layoutsMap, layoutName) {
236
+ const candidates = new Set();
237
+ if (layoutName) {
238
+ candidates.add(layoutName);
239
+ if (layoutName.includes('/')) {
240
+ const parts = layoutName.split('/');
241
+ const last = parts[parts.length - 1];
242
+ if (last) {
243
+ candidates.add(last);
244
+ }
245
+ }
246
+ else {
247
+ candidates.add(`crewx/${layoutName}`);
248
+ }
249
+ }
250
+ candidates.add('default');
251
+ for (const key of candidates) {
252
+ const value = layoutsMap[key];
253
+ if (typeof value === 'string' && value.trim().length > 0) {
254
+ return value;
255
+ }
256
+ }
257
+ for (const value of Object.values(layoutsMap)) {
258
+ if (typeof value === 'string' && value.trim().length > 0) {
259
+ return value;
260
+ }
261
+ }
262
+ return undefined;
263
+ }
264
+ }
265
+ exports.LayoutLoader = LayoutLoader;
266
+ //# sourceMappingURL=layout-loader.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-loader.service.js","sourceRoot":"","sources":["../../src/services/layout-loader.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { PropsValidator } from './props-validator.service';
2
+ import type { LayoutDefinition, RenderContext, PropSchema, ValidationResult } from '../types/layout.types';
3
+ export { PropsValidationError } from '../types/layout.types';
4
+ export type { LayoutDefinition, RenderContext, PropSchema, ValidationResult as PropsValidationResult, } from '../types/layout.types';
5
+ export interface RenderOptions {
6
+ validationMode?: 'strict' | 'lenient';
7
+ skipValidation?: boolean;
8
+ }
9
+ export declare class LayoutRenderer {
10
+ private readonly handlebars;
11
+ private readonly propsValidator;
12
+ constructor(propsValidator?: PropsValidator);
13
+ render(layout: LayoutDefinition, context: RenderContext, options?: RenderOptions): string;
14
+ validate(props: Record<string, any> | undefined, propsSchema: Record<string, PropSchema>, mode?: 'strict' | 'lenient'): ValidationResult;
15
+ resolveProps(layout: LayoutDefinition, props: Record<string, any> | undefined, mode?: 'strict' | 'lenient'): ValidationResult;
16
+ private prepareRenderContext;
17
+ private registerHelpers;
18
+ private validateSecurityConstraints;
19
+ private executeValidation;
20
+ private mergeProps;
21
+ private deepMerge;
22
+ private cloneDeep;
23
+ private isPlainObject;
24
+ private sanitizeVars;
25
+ }